mirror of
https://github.com/cyberarm/i-mic-rts.git
synced 2025-12-13 06:52:33 +00:00
Made building construction into a proper order (more refinements needed)
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
37
lib/orders/build_order.rb
Normal file
37
lib/orders/build_order.rb
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user