# A scene represents a discreet state of gameplay. Things like the main menu,
# game over screen, and gameplay.
#
# Define a new scene by adding one to `app/scenes/` and defining a
# `Scene.tick_SCENE_NAME` class method.
#
# The main `#tick` of the game handles delegating to the current scene based on
# the `args.state.scene` value, which is a symbol of the current scene, ex:
# `:gameplay`
module Scene
  class << self
    # Change the current scene, and optionally reset the scene that's begin
    # changed to so any data is cleared out
    # ex:
    #   Scene.switch(args, :gameplay)
    def switch(args, scene, reset: false, return_to: nil)
      args.state.scene_to_return_to = return_to if return_to
      args.state.scene_switch_tick = args.tick_count

      if scene == :back && args.state.scene_to_return_to
        scene = args.state.scene_to_return_to
        args.state.scene_to_return_to = nil
      end

      if reset
        args.state.send(scene)&.current_option_i = nil
        args.state.send(scene)&.hold_delay = nil

        # you can also add custom reset logic as-needed for specific scenes
        # here
      end

      args.state.scene = scene
      raise FinishTick.new
    end
  end
end
