From 2b1ff35a344b21a975e4c9b1b55853beb3b6a141 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Fri, 22 Nov 2019 17:18:44 -0600 Subject: [PATCH] now save player name from SoloLobby, made Director know able game so that construction workers can set active tool for Game (todo: implement tools :D), drafted 'structure' document --- lib/components/sidebar_actions.rb | 22 +++++++++++++++++----- lib/director.rb | 7 ++++--- lib/entities/units/construction_worker.rb | 2 +- lib/entity.rb | 4 ++-- lib/states/game.rb | 8 ++++++-- lib/states/menus/multiplayer_menu.rb | 8 ++++---- lib/states/menus/solo_lobby_menu.rb | 11 +++++++++-- structure.md | 13 +++++++++++++ 8 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 structure.md 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.