From ce9d9afd3127680e6f4c799484f8fcc10ad4a8c0 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Fri, 4 Oct 2019 16:40:42 +0300 Subject: [PATCH] Move part of game code to Game namespace --- spec/queue_spec.cr | 2 +- spec/world_spec.cr | 8 +- src/expansion.cr | 8 +- src/game/command.cr | 248 ++++++++++++++++++++++---------------------- src/game/queue.cr | 4 +- src/game/world.cr | 5 +- 6 files changed, 138 insertions(+), 137 deletions(-) diff --git a/spec/queue_spec.cr b/spec/queue_spec.cr index 55519cc..80191e0 100644 --- a/spec/queue_spec.cr +++ b/spec/queue_spec.cr @@ -4,7 +4,7 @@ require "./../src/game/command" macro define_dummy_classes(count) {% for i in (1...count) %} - class Test::DummyCommand{{ i }} < Command + class Test::DummyCommand{{ i }} < Game::Command def start(world) : Int32 end diff --git a/spec/world_spec.cr b/spec/world_spec.cr index 8dc7c77..b509e50 100644 --- a/spec/world_spec.cr +++ b/spec/world_spec.cr @@ -3,18 +3,18 @@ require "../src/game/world" describe "World" do it "should build crystal harvester" do - world = World.new + world = Game::World.new point = Point.new(2, 3) - cmd = BuildCrystalHarvesterCommand.new(point) + cmd = Game::BuildCrystalHarvesterCommand.new(point) world.push(cmd) world.run(100) world.map.get(point).has_role(TileRole::CrystalHarvester) end it "should fail when not enought resources" do - world = World.new + world = Game::World.new point = Point.new(2, 3) - cmd = BuildCrystalRestorerCommand.new(point) + cmd = Game::BuildCrystalRestorerCommand.new(point) expect_raises(NotEnoughtResources) do world.push(cmd) end diff --git a/src/expansion.cr b/src/expansion.cr index 4de9a93..69d4d6c 100644 --- a/src/expansion.cr +++ b/src/expansion.cr @@ -5,7 +5,7 @@ require "./game/resources" require "./game/world" require "./cli/command_router" -world = World.new +world = Game::World.new router = CLI::CommandRouter.new @@ -29,20 +29,20 @@ end router.add "harv {x} {y}" do |p| x = p["x"].to_i32 y = p["y"].to_i32 - world.push(BuildCrystalHarvesterCommand.new(Point.new(x, y))) + world.push(Game::BuildCrystalHarvesterCommand.new(Point.new(x, y))) printf "Build harvester at %d %d\n", x, y end router.add "rest {x} {y}" do |p| x = p["x"].to_i32 y = p["y"].to_i32 - world.push(BuildCrystalRestorerCommand.new(Point.new(x, y))) + world.push(Game::BuildCrystalRestorerCommand.new(Point.new(x, y))) end router.add "terr {x} {y}" do |p| x = p["x"].to_i32 y = p["y"].to_i32 - world.push(BuildTerraformerCommand.new(Point.new(x, y))) + world.push(Game::BuildTerraformerCommand.new(Point.new(x, y))) end def normalize_command(cmd) diff --git a/src/game/command.cr b/src/game/command.cr index 2867542..06ba305 100644 --- a/src/game/command.cr +++ b/src/game/command.cr @@ -1,149 +1,151 @@ require "./tile" -abstract class Command - abstract def start(world : World) : Int32 - abstract def finish(world : World) -end - -class BuildCrystalHarvesterCommand < Command - BUILD_TIME = 30 - - def initialize(@point : Point) +module Game + abstract class Command + abstract def start(world : World) : Int32 + abstract def finish(world : World) end - def start(world : World) : Int32 - BUILD_TIME - end + class BuildCrystalHarvesterCommand < Command + BUILD_TIME = 30 - def finish(world : World) - world.map.set(CrystalHarvesterTile.new(@point)) - world.push(HarvestCrystalCommand.new(@point)) - end -end + def initialize(@point : Point) + end -class HarvestCrystalCommand < Command - HARVEST_VALUE = 80 - HARVEST_TIME = 10 - REST_TIME = 5 + def start(world : World) : Int32 + BUILD_TIME + end - def initialize(@point : Point) - @value = 0 - end - - def start(world : World) : Int32 - deposit_tile = nearest_deposit(world) - stock_tile = nearest_stock(world) - if deposit_tile && stock_tile - wood_dist = @point.distance(deposit_tile.point) - stock_dist = @point.distance(stock_tile.point) - @value = deposit_tile.withdraw(HARVEST_VALUE) - HARVEST_TIME + 2 * wood_dist + 2 * stock_dist - else - REST_TIME + def finish(world : World) + world.map.set(CrystalHarvesterTile.new(@point)) + world.push(HarvestCrystalCommand.new(@point)) end end - def finish(world : World) - world.resources.inc(ResourceType::Crystal, @value) - world.push(HarvestCrystalCommand.new(@point)) - end + class HarvestCrystalCommand < Command + HARVEST_VALUE = 80 + HARVEST_TIME = 10 + REST_TIME = 5 - private def nearest_deposit(world : World) - world.map.nearest_tile @point do |tile| - tile.has_role(TileRole::CrystalDeposits) && tile.cur > 0 + def initialize(@point : Point) + @value = 0 + end + + def start(world : World) : Int32 + deposit_tile = nearest_deposit(world) + stock_tile = nearest_stock(world) + if deposit_tile && stock_tile + wood_dist = @point.distance(deposit_tile.point) + stock_dist = @point.distance(stock_tile.point) + @value = deposit_tile.withdraw(HARVEST_VALUE) + HARVEST_TIME + 2 * wood_dist + 2 * stock_dist + else + REST_TIME + end + end + + def finish(world : World) + world.resources.inc(ResourceType::Crystal, @value) + world.push(HarvestCrystalCommand.new(@point)) + end + + private def nearest_deposit(world : World) + world.map.nearest_tile @point do |tile| + tile.has_role(TileRole::CrystalDeposits) && tile.cur > 0 + end + end + + private def nearest_stock(world : World) + world.map.nearest_tile @point do |tile| + tile.has_role(TileRole::Warehouse) + end end end - private def nearest_stock(world : World) - world.map.nearest_tile @point do |tile| - tile.has_role(TileRole::Warehouse) + class BuildCrystalRestorerCommand < Command + CRYSTALS_COST = 100 + BUILD_TIME = 50 + + def initialize(@point : Point) end - end -end -class BuildCrystalRestorerCommand < Command - CRYSTALS_COST = 100 - BUILD_TIME = 50 + def start(world : World) : Int32 + world.resources.dec(ResourceType::Crystal, CRYSTALS_COST) + BUILD_TIME + end - def initialize(@point : Point) - end - - def start(world : World) : Int32 - world.resources.dec(ResourceType::Crystal, CRYSTALS_COST) - BUILD_TIME - end - - def finish(world : World) - world.map.set(CrystalRestorerTile.new(@point)) - world.push(RestoreCrystalCommand.new(@point)) - end -end - -class RestoreCrystalCommand < Command - RESTORE_TIME = 15 - RESTORE_VALUE = 30 - REST_TIME = 5 - - @target_tile : Tile | Nil = nil - - def initialize(@point : Point) - end - - def start(world : World) : Int32 - @target_tile = nearest_deposit(world) - if @target_tile - dist = @point.distance(@target_tile.as(Tile).point) - RESTORE_TIME + 2 * dist - else - REST_TIME + def finish(world : World) + world.map.set(CrystalRestorerTile.new(@point)) + world.push(RestoreCrystalCommand.new(@point)) end end - def finish(world : World) - if @target_tile - @target_tile.as(Tile).charge(RESTORE_VALUE) + class RestoreCrystalCommand < Command + RESTORE_TIME = 15 + RESTORE_VALUE = 30 + REST_TIME = 5 + + @target_tile : Tile | Nil = nil + + def initialize(@point : Point) + end + + def start(world : World) : Int32 + @target_tile = nearest_deposit(world) + if @target_tile + dist = @point.distance(@target_tile.as(Tile).point) + RESTORE_TIME + 2 * dist + else + REST_TIME + end + end + + def finish(world : World) + if @target_tile + @target_tile.as(Tile).charge(RESTORE_VALUE) + end + world.push(RestoreCrystalCommand.new(@point)) + end + + private def nearest_deposit(world : World) + world.map.nearest_tile @point do |tile| + tile.has_role(TileRole::CrystalDeposits) && tile.cur < tile.cap + end end - world.push(RestoreCrystalCommand.new(@point)) end - private def nearest_deposit(world : World) - world.map.nearest_tile @point do |tile| - tile.has_role(TileRole::CrystalDeposits) && tile.cur < tile.cap + class BuildTerraformerCommand < Command + CRYSTALS_COST = 100 + BUILD_TIME = 120 + + def initialize(@point : Point) + end + + def start(world : World) : Int32 + world.resources.dec(ResourceType::Crystal, CRYSTALS_COST) + BUILD_TIME + end + + def finish(world : World) + world.map.set(TerraformerTile.new(@point)) + world.push(TerraformCommand.new(@point)) + end + end + + class TerraformCommand < Command + PRODUCTION_TIME = 60 + PRODUCTION_VALUE = 5 + + def initialize(@point : Point) + end + + def start(world : World) : Int32 + PRODUCTION_TIME + end + + def finish(world : World) + world.resources.inc(ResourceType::Terraformation, PRODUCTION_VALUE) + world.push(TerraformCommand.new(@point)) end end end - -class BuildTerraformerCommand < Command - CRYSTALS_COST = 100 - BUILD_TIME = 120 - - def initialize(@point : Point) - end - - def start(world : World) : Int32 - world.resources.dec(ResourceType::Crystal, CRYSTALS_COST) - BUILD_TIME - end - - def finish(world : World) - world.map.set(TerraformerTile.new(@point)) - world.push(TerraformCommand.new(@point)) - end -end - -class TerraformCommand < Command - PRODUCTION_TIME = 60 - PRODUCTION_VALUE = 5 - - def initialize(@point : Point) - end - - def start(world : World) : Int32 - PRODUCTION_TIME - end - - def finish(world : World) - world.resources.inc(ResourceType::Terraformation, PRODUCTION_VALUE) - world.push(TerraformCommand.new(@point)) - end -end diff --git a/src/game/queue.cr b/src/game/queue.cr index 262b939..38d5734 100644 --- a/src/game/queue.cr +++ b/src/game/queue.cr @@ -1,6 +1,6 @@ class App::Queue struct Item - def initialize(@ts : Int32, @command : Command) + def initialize(@ts : Int32, @command : Game::Command) end getter ts @@ -11,7 +11,7 @@ class App::Queue @data = [] of Item end - def push(ts : Int32, value : Command) + def push(ts : Int32, value : Game::Command) # very unoptimal algo @data.push(Item.new(ts, value)) @data.sort! do |a, b| diff --git a/src/game/world.cr b/src/game/world.cr index 79e84bd..c4e8247 100644 --- a/src/game/world.cr +++ b/src/game/world.cr @@ -1,10 +1,9 @@ require "./resources" -class World +class Game::World property ts : Int32 - def initialize - @ts = 0 + def initialize(@ts = 0) @map = Map.new @resources = Resources.new @tasks = App::Queue.new