diff --git a/lib/components/sidebar_actions.rb b/lib/components/sidebar_actions.rb index a3f58d4..de71bae 100644 --- a/lib/components/sidebar_actions.rb +++ b/lib/components/sidebar_actions.rb @@ -9,19 +9,31 @@ class IMICRTS @actions = [] end - def add(action, *args) - case action + def add(type, *args) + action = Action.new + + case type when :add_to_build_queue - action = Action.new ent = IMICRTS::Entity.get(args.first) + raise "Failed to find entity: #{args.first.inspect}" unless ent + action.label = ent.name.to_s.split("_").map{ |s| s.capitalize }.join(" ") action.description = "Cost: #{ent.cost}\n#{ent.description}" action.block = proc { @parent.component(:build_queue).add(args.first) } - @actions << action + when :set_build_tool + ent = IMICRTS::Entity.get(args[1]) + raise "Failed to find entity: #{args[1].inspect}" unless ent + + action.label = ent.name.to_s.split("_").map { |s| s.capitalize }.join(" ") + action.description = "Cost: #{ent.cost}\n#{ent.description}" + action.block = proc { @parent.director.game.set_tool(:building, ent) } + else raise "Unhandled sidebar action: #{action.inspect}" end + + @actions << action end end -end \ No newline at end of file +end diff --git a/lib/director.rb b/lib/director.rb index 5c1d048..8a4bdcc 100644 --- a/lib/director.rb +++ b/lib/director.rb @@ -1,7 +1,8 @@ class IMICRTS class Director - attr_reader :current_tick, :map - def initialize(map:, players:, networking_mode:, tick_rate: 10) + attr_reader :current_tick, :map, :game + def initialize(game:, map:, players:, networking_mode:, tick_rate: 10) + @game = game @map = map @players = players @connection = IMICRTS::Connection.new(director: self, mode: networking_mode) @@ -121,4 +122,4 @@ class IMICRTS @connection.finalize end end -end \ No newline at end of file +end diff --git a/lib/entities/units/construction_worker.rb b/lib/entities/units/construction_worker.rb index cdfa77a..c2e506a 100644 --- a/lib/entities/units/construction_worker.rb +++ b/lib/entities/units/construction_worker.rb @@ -3,7 +3,7 @@ IMICRTS::Entity.define_entity(:construction_worker, :unit, 1000, "Constructs bui entity.has(:build_queue) entity.has(:sidebar_actions) [:power_plant, :refinery, :barracks, :war_factory, :helipad, :construction_yard].each do |ent| - entity.component(:sidebar_actions).add(:add_to_build_queue, ent) + entity.component(:sidebar_actions).add(:set_build_tool, :place_building, ent) end entity.radius = 14 diff --git a/lib/entity.rb b/lib/entity.rb index a2d52e8..1652934 100644 --- a/lib/entity.rb +++ b/lib/entity.rb @@ -15,7 +15,7 @@ class IMICRTS end end - attr_reader :player, :id, :name, :type, :speed + attr_reader :director, :player, :id, :name, :type, :speed attr_accessor :position, :angle, :radius, :target, :state, :movement, :health, :max_health, :turret, :center, :particle_emitters @@ -188,4 +188,4 @@ end Dir.glob("#{IMICRTS::GAME_ROOT_PATH}/lib/entities/**/*.rb").each do |entity| require_relative entity -end \ No newline at end of file +end diff --git a/lib/states/game.rb b/lib/states/game.rb index 8099093..2969539 100644 --- a/lib/states/game.rb +++ b/lib/states/game.rb @@ -8,7 +8,7 @@ class IMICRTS @options[:networking_mode] ||= :host @player = Player.new(id: 0) - @director = Director.new(map: Map.new(map_file: "maps/test_map.tmx"), networking_mode: @options[:networking_mode], players: [@player]) + @director = Director.new(game: self, map: Map.new(map_file: "maps/test_map.tmx"), networking_mode: @options[:networking_mode], players: [@player]) @entity_controller = EntityController.new(game: self, director: @director, player: @player) @overlays = [] @@ -172,8 +172,12 @@ class IMICRTS @player.camera.button_up(id) end + def set_tool(tool, *args) + pp tool, args + end + def finalize @director.finalize end end -end \ No newline at end of file +end diff --git a/lib/states/menus/multiplayer_menu.rb b/lib/states/menus/multiplayer_menu.rb index d668200..c26e02c 100644 --- a/lib/states/menus/multiplayer_menu.rb +++ b/lib/states/menus/multiplayer_menu.rb @@ -12,7 +12,7 @@ class IMICRTS end flow do button("Refresh") do - # refresh_games + refresh_games end button("Host Game") button("Join Game") @@ -25,9 +25,9 @@ class IMICRTS end def refresh_games - @games_list.clear do - label "No games found..." + @games_list.clear do |stack| + stack.label "No games found..." end end end -end \ No newline at end of file +end diff --git a/lib/states/menus/solo_lobby_menu.rb b/lib/states/menus/solo_lobby_menu.rb index e28f09f..862a7ae 100644 --- a/lib/states/menus/solo_lobby_menu.rb +++ b/lib/states/menus/solo_lobby_menu.rb @@ -35,15 +35,22 @@ class IMICRTS flow(width: 1.0) do button("Accept", width: 0.5) do - Setting.set(:player_name, @player_name.value) + save_playerdata push_state(Game, networking_mode: :virtual) end button("Back", align: :right) do + save_playerdata push_state(MainMenu) end end end end + + def save_playerdata + Setting.set(:player_name, @player_name.value) + + Setting.save! + end end -end \ No newline at end of file +end diff --git a/structure.md b/structure.md new file mode 100644 index 0000000..b74429d --- /dev/null +++ b/structure.md @@ -0,0 +1,13 @@ +# I-MIC RTS - Structure +* Dependancy Trees + * Entity + * Director + * Player +* Networking + +## Dependancy Trees +### Entity +An entity requires access to Director + +### Director +The Director requires access to most everything as its purpose is to: sync commands to and from other players (local and remote), to execute said commands on the correct tick, and to be the primary for entities to gain access to required features and functions outside of the Director.