Building units now uses orders 😃

This commit is contained in:
2021-01-01 14:25:44 -06:00
parent 74458dbfd0
commit 5f301337b4
35 changed files with 171 additions and 100 deletions

18
lib/orders/build_unit.rb Normal file
View File

@@ -0,0 +1,18 @@
IMICRTS::Order.define_handler(IMICRTS::Order::BUILD_UNIT, arguments: [:player_id, :entity_id, :unit_type]) do |order, director|
director.player(order.player_id).entity(order.entity_id).component(:build_queue)&.add(order.unit_type)
end
IMICRTS::Order.define_serializer(IMICRTS::Order::BUILD_UNIT) do |order, director|
# Order ID | Player ID | Entity ID | Unit Type
# char | char | integer | string
[IMICRTS::Order::BUILD_UNIT, order.player_id, order.entity_id, order.unit_type.to_s].pack("CCNA*")
end
IMICRTS::Order.define_deserializer(IMICRTS::Order::BUILD_UNIT) do |string, director|
# String fed into deserializer has Order ID removed
# Player ID |
# char | integer | string
data = string.unpack("CNA*")
[data[0], data[1], data[2].to_sym]
end

View File

@@ -0,0 +1,25 @@
IMICRTS::Order.define_handler(IMICRTS::Order::BUILD_UNIT_COMPLETE, arguments: [:player_id, :entity_id]) do |order, director|
entity = director.player(order.player_id).entity(order.entity_id)
item = entity.component(:build_queue).queue.shift
spawn_point = entity.position.clone
spawn_point.y += 96 # TODO: Use entity defined spawnpoint
ent = entity.director.spawn_entity(player_id: entity.player.id, name: item.entity.name, position: spawn_point)
ent.target = entity.component(:waypoint).waypoint if entity.component(:waypoint)
end
IMICRTS::Order.define_serializer(IMICRTS::Order::BUILD_UNIT_COMPLETE) do |order, director|
# Order ID | Player ID
# char | char
[IMICRTS::Order::BUILD_UNIT_COMPLETE, order.player_id, order.entity_id].pack("CCN")
end
IMICRTS::Order.define_deserializer(IMICRTS::Order::BUILD_UNIT_COMPLETE) do |string, director|
# String fed into deserializer has Order ID removed
# Player ID | Entity ID
# char | integer
data = string.unpack("CN")
[data[0], data[1]]
end

View File

@@ -1,4 +1,4 @@
IMICRTS::Order.define_handler(IMICRTS::Order::BUILD_ORDER, arguments: [:player_id, :vector, :building]) do |order, director|
IMICRTS::Order.define_handler(IMICRTS::Order::CONSTRUCT, arguments: [:player_id, :vector, :building]) do |order, director|
tile = director.map.tile_at(order.vector.x, order.vector.y)
position = tile.position + director.map.tile_size / 2
@@ -20,14 +20,14 @@ IMICRTS::Order.define_handler(IMICRTS::Order::BUILD_ORDER, arguments: [:player_i
end
end
IMICRTS::Order.define_serializer(IMICRTS::Order::BUILD_ORDER) do |order, director|
IMICRTS::Order.define_serializer(IMICRTS::Order::CONSTRUCT) 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*")
[IMICRTS::Order::CONSTRUCT, 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|
IMICRTS::Order.define_deserializer(IMICRTS::Order::CONSTRUCT) do |string, director|
# String fed into deserializer has Order ID removed
# Player ID | Vector X | Vector Y | Entity Name
# char | integer | integer | string