Calc paths when restore

This commit is contained in:
Anton Vakhrushev 2019-10-15 15:04:27 +03:00
parent ea5e7950de
commit 189f6dd96b
2 changed files with 18 additions and 4 deletions

View File

@ -94,8 +94,10 @@ module Game::TestCommand
world = World.new create_map_with_resource world = World.new create_map_with_resource
world.resources.inc(Resource::Type::Crystals, 20) world.resources.inc(Resource::Type::Crystals, 20)
command = RestoreCommand.new Point.new(0, 1), once: true command = RestoreCommand.new Point.new(0, 1), once: true
world.push command time_point = (20 + 2 * 2 + 1 * 2).to_i64
world.run 20 done_at = world.push command
done_at.should eq time_point
world.run time_point
# Check world resources # Check world resources
world.resources[Resource::Type::Crystals].should eq 15 world.resources[Resource::Type::Crystals].should eq 15
# Check tile deposit # Check tile deposit

View File

@ -118,12 +118,17 @@ module Game
end end
resource = restoration.resource resource = restoration.resource
@deposit_tile = nearest_deposit(world, resource.type) @deposit_tile = nearest_deposit(world, resource.type)
if @deposit_tile stock_tile = nearest_stock(world)
if @deposit_tile && stock_tile
world.resources.dec restoration.input world.resources.dec restoration.input
@holded = resource @holded = resource
end restoration.ts +
2 * tile.point.distance(stock_tile.point) +
2 * tile.point.distance(@deposit_tile.as(DepositTile).point)
else
restoration.ts restoration.ts
end end
end
def finish(world : World) def finish(world : World)
if @deposit_tile && @holded if @deposit_tile && @holded
@ -140,6 +145,13 @@ module Game
end end
tile.as?(DepositTile) tile.as?(DepositTile)
end end
private def nearest_stock(world : World) : BuildingTile?
tile = world.map.nearest_tile @point do |t|
t.is_a?(BuildingTile) && t.building.has_role Building::Role::Storehouse
end
tile.as?(BuildingTile)
end
end end
# class BuildCrystalHarvesterCommand < Command # class BuildCrystalHarvesterCommand < Command