diff --git a/lib/director.rb b/lib/director.rb index a34ec47..1ceabcb 100644 --- a/lib/director.rb +++ b/lib/director.rb @@ -105,6 +105,24 @@ class IMICRTS end end + def each_tile(vector, entity, &block) + if tile = @map.tile_at(vector.x, vector.y) + ent = Entity.get(entity) + origin = (tile.grid_position - 2) + + ent.tiles.each_with_index do |array, y| + array.each_with_index do |space_required, x| + next unless space_required + + other_tile = @map.tile_at(origin.x + x, origin.y + y) + if other_tile + block.call(other_tile, space_required, origin.x + x, origin.y + y) + end + end + end + end + end + def spawn_entity(player_id:, name:, position:) _player = player(player_id) ent = Entity.new( diff --git a/lib/entity.rb b/lib/entity.rb index 21caec3..3c21d90 100644 --- a/lib/entity.rb +++ b/lib/entity.rb @@ -66,6 +66,14 @@ class IMICRTS def deserialize end + def clear_orders + @orders.clear + end + + def add_order(order) + @orders.push(order) + end + def has(symbol) component = Component.get(symbol) diff --git a/lib/orders/build_order.rb b/lib/orders/build_order.rb new file mode 100644 index 0000000..6e14f0e --- /dev/null +++ b/lib/orders/build_order.rb @@ -0,0 +1,37 @@ +IMICRTS::Order.define_handler(IMICRTS::Order::BUILD_ORDER, arguments: [:player_id, :vector, :building]) do |order, director| + tile = director.map.tile_at(order.vector.x, order.vector.y) + p order.vector + position = tile.position + director.map.tile_size / 2 + + ent = director.spawn_entity( + player_id: order.player_id, name: order.building, + position: CyberarmEngine::Vector.new(position.x, position.y, IMICRTS::ZOrder::BUILDING) + ) + + director.each_tile(order.vector, order.building) do |tile, space_required| + if space_required == true + tile.entity = ent + else + tile.reserved = ent + end + end + + director.player(order.player_id).selected_entities.each do |entity| + entity.target = position + end +end + +IMICRTS::Order.define_serializer(IMICRTS::Order::BUILD_ORDER) do |order, director| + # Order ID | Player ID | Vector X | Vector Y | Entity Name + # char | char | integer | integer | string + + [IMICRTS::Order::BUILD_ORDER, order.player_id, order.vector.x, order.vector.y, order.building.to_s].pack("CCNNA*") +end + +IMICRTS::Order.define_deserializer(IMICRTS::Order::BUILD_ORDER) do |string, director| + # String fed into deserializer has Order ID removed + # Player ID | Vector X | Vector Y | Entity Name + # char | integer | integer | string + data = string.unpack("CNNA*") + [data[0], CyberarmEngine::Vector.new(data[1], data[2], IMICRTS::ZOrder::BUILDING), data[3].to_sym] +end diff --git a/lib/tools/place_entity.rb b/lib/tools/place_entity.rb index cb3ef3a..eb2799a 100644 --- a/lib/tools/place_entity.rb +++ b/lib/tools/place_entity.rb @@ -10,7 +10,7 @@ class IMICRTS end def draw - each_tile(vector_to_grid(@game.window.mouse)) do |tile, _data, x, y| + @director.each_tile(vector_to_grid(@game.window.mouse), @entity) do |tile, _data, x, y| if tile.entity || tile.reserved || tile.type != :ground || @director.map.ore_at(x, y) # tile unavailable Gosu.draw_rect( tile.position.x + 2, tile.position.y + 2, @@ -49,21 +49,24 @@ class IMICRTS return if @game.sidebar.hit?(@game.window.mouse_x, @game.window.mouse_y) tile = @director.map.tile_at(vector.x, vector.y) + pp vector return unless tile position = tile.position + @director.map.tile_size / 2 - ent = @director.spawn_entity( - player_id: @player.id, name: @entity, - position: CyberarmEngine::Vector.new(position.x, position.y, ZOrder::BUILDING) - ) + # ent = @director.spawn_entity( + # player_id: @player.id, name: @entity, + # position: CyberarmEngine::Vector.new(position.x, position.y, ZOrder::BUILDING) + # ) - each_tile(vector) do |tile, space_required| - if space_required == true - tile.entity = ent - else - tile.reserved = ent - end - end + @director.schedule_order(Order::BUILD_ORDER, @player.id, vector, @entity) + + # each_tile(vector) do |tile, space_required| + # if space_required == true + # tile.entity = ent + # else + # tile.reserved = ent + # end + # end cancel_tool end @@ -77,7 +80,7 @@ class IMICRTS ent = Entity.get(@entity) origin = (tile.grid_position - 2) - each_tile(vector) do |tile, _data, x, y| + @director.each_tile(vector, @entity) do |tile, _data, x, y| if tile.entity || tile.reserved || tile.type != :ground || @director.map.ore_at(x, y) useable = false break @@ -90,24 +93,6 @@ class IMICRTS end end - def each_tile(vector, &block) - if tile = @director.map.tile_at(vector.x, vector.y) - ent = Entity.get(@entity) - origin = (tile.grid_position - 2) - - ent.tiles.each_with_index do |array, y| - array.each_with_index do |space_required, x| - next unless space_required - - other_tile = @director.map.tile_at(origin.x + x, origin.y + y) - if other_tile - block.call(other_tile, space_required, origin.x + x, origin.y + y) - end - end - end - end - end - def button_down(id) case id when Gosu::MsRight