about summary refs log tree commit diff stats
path: root/data/maps/the_ancient/rooms/Ending.txtpb
blob: eea1228d77c6e36b1b33da59c573649374b1c1a2 (plain) (blame)
1
2
3
4
5
6
class PuzzlesController < ApplicationController
  before_action :prepare_session

  def about
    @normal_puzzle = Puzzle.normal.order(created_at: :desc).first
    if session[:puzzles]["normal"]["id"] == @normal_puzzle.id
      @normal_started = session[:puzzles]["normal"]["started"]
      @normal_solved = session[:puzzles]["normal"]["solved"]
    else
      @normal_started = false
      @normal_solved = false
    end

    @hard_puzzle = Puzzle.hard.order(created_at: :desc).first
    if session[:puzzles]["hard"]["id"] == @hard_puzzle.id
      @hard_started = session[:puzzles]["hard"]["started"]
      @hard_solved = session[:puzzles]["hard"]["solved"]
    else
      @hard_started = false
      @hard_solved = false
    end

    @expert_puzzle = Puzzle.expert.order(created_at: :desc).first
    if session[:puzzles]["expert"]["id"] == @expert_puzzle.id
      @expert_started = session[:puzzles]["expert"]["started"]
      @expert_solved = session[:puzzles]["expert"]["solved"]
    else
      @expert_started = false
      @expert_solved = false
    end
  end

  def index
    @puzzles = Puzzle.select(:id, :created_at, :category).order(created_at: :asc).all.chunk { |puzzle| puzzle.created_at.localtime.to_date }.to_h.transform_values { |by_date| by_date.sort_by(&:category).chunk { |puzzle| puzzle.category }.to_h }
  end

  def show
    @puzzle = Puzzle.find(params["id"])

    if @puzzle.latest?
      if session[:puzzles][@puzzle.category]["id"] == @puzzle.id
        @playable = !(session[:puzzles][@puzzle.category]["solved"])
        @already_started = session[:puzzles][@puzzle.category]["started"]

        unless @playable
          @solution = session[:puzzles][@puzzle.category]["path"]
        end
      else
        @playable = true
        @already_started = false
      end
    else
      @playable = false
      @already_started = false
      @solution = @puzzle.solved_data
    end
  end

  def start
    @puzzle = Puzzle.find(params["id"])

    if session[:puzzles][@puzzle.category]["id"] != @puzzle.id
      session[:puzzles][@puzzle.category] = { "id" => @puzzle.id }
    end

    session[:puzzles][@puzzle.category]["started"] = true
  end

  def solve
    @puzzle = Puzzle.find(params["id"])

    raise ActiveRecord::RecordNotFound unless @puzzle.latest?

    if @puzzle.solved_data.nil?
      @puzzle.solved_data = params["solved"]
      @puzzle.save!
    end

    @time = (params.include? :time) ? params[:time] : nil

    if session[:puzzles][@puzzle.category]["id"] != @puzzle.id
      session[:puzzles][@puzzle.category] = { "id" => @puzzle.id }
    end

    session[:puzzles][@puzzle.category]["solved"] = true
    session[:puzzles][@puzzle.category]["path"] = params["solved"]
  end

  def submit
    @puzzle = Puzzle.find(params["id"])

    raise ActiveRecord::RecordNotFound unless @puzzle.latest?

    @puzzle.scores.create(name: params[:name], ip: request.ip, seconds_taken: (params.include? :time) ? params[:time] : nil)

    redirect_to @puzzle
  end

  private

    def prepare_session
      session[:puzzles] ||= {
        "normal" => { "id" => 0 },
        "hard" => { "id" => 0 },
        "expert" => { "id" => 0 },
      }
    end

end