44 lines
1.1 KiB
Ruby
44 lines
1.1 KiB
Ruby
require "yaml"
|
|
require "active_support/core_ext/module/delegation"
|
|
|
|
module MetalAdventures
|
|
# A scene contains a dsl_instance (kind of the blueprint that describe the scene)
|
|
# and the state associated to one specific use of it, so it can remember which
|
|
# round it is, etc.
|
|
class Scene
|
|
def initialize(dsl_instance)
|
|
@dsl_instance = dsl_instance
|
|
@action_id = 0
|
|
end
|
|
|
|
delegate :name, to: :@dsl_instance
|
|
|
|
def current_action
|
|
@dsl_instance.actions.values[@action_id]
|
|
end
|
|
|
|
def next!
|
|
@action_id = (@action_id + 1) % @dsl_instance.actions.size
|
|
end
|
|
|
|
def self.load!(name)
|
|
filename = "#{name}.yaml".underscore.tr(" ", "_")
|
|
data = YAML.load_file("scenes/#{filename}")
|
|
|
|
dsl_instance = DSL::Scene.new data["name"] do
|
|
data["actions"].each do |action_name, action_data|
|
|
action action_name do
|
|
action_data["options"].each do |option_data|
|
|
option option_data["name"], duration: option_data["duration"], skill: option_data["skill"]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
new dsl_instance
|
|
end
|
|
end
|
|
end
|
|
|
|
require_relative "./scene/dsl"
|