From c05199c7d85ed75987cd7a6d1bbf80e45bc3fdcd Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Tue, 15 Oct 2019 16:28:04 +0300 Subject: [PATCH] Rewrite map rendering --- spec/building_spec.cr | 2 +- spec/command_spec.cr | 3 +- src/app.cr | 51 ++++++++++++++--- src/game/building.cr | 6 +- src/game/building_factory.cr | 14 ++++- src/game/command.cr | 4 +- src/game/map.cr | 6 +- src/game/tile.cr | 106 ----------------------------------- 8 files changed, 67 insertions(+), 125 deletions(-) diff --git a/spec/building_spec.cr b/spec/building_spec.cr index c1f5f8f..d7e6ccf 100644 --- a/spec/building_spec.cr +++ b/spec/building_spec.cr @@ -3,7 +3,7 @@ require "./spec_helper" module Game::TestBuilding describe Building do it "should create storehouse" do - bg = Building.new Building::Type::Storehouse, storage: 100 + bg = Building.new Building::Type::StartPoint, storage: 100 bg.storage.should eq 100 end diff --git a/spec/command_spec.cr b/spec/command_spec.cr index f7c9a5e..91a203a 100644 --- a/spec/command_spec.cr +++ b/spec/command_spec.cr @@ -13,7 +13,8 @@ module Game::TestCommand Point.new(0, 0), Building.new( Building::Type::StartPoint, - storage: 200, roles: [Building::Role::Storehouse] + storage: 200, + roles: [Building::Role::Storehouse] ) ) map.set DepositTile.new( diff --git a/src/app.cr b/src/app.cr index 2543753..e195ce5 100644 --- a/src/app.cr +++ b/src/app.cr @@ -14,7 +14,7 @@ class App @buildings.items.each do |i| b = i[:b] - route = sprintf "%s {x} {y}", b.name.downcase + route = sprintf "%s {x} {y}", b.shortcut desc = sprintf "Build %s at x,y", b.name @router.add route, desc do |p| x = p["x"].to_i32 @@ -54,7 +54,7 @@ class App printf "|" (0...cols).each do |y| tile = world.map.get(x, y) - printf "%s %d%d|", tile.letter.colorize(:green), x, y + printf "%s %d%d\|", render_tile_letter(tile), x, y end print "\n" printf "|" @@ -65,11 +65,7 @@ class App printf "|" (0...cols).each do |y| tile = world.map.get(x, y) - if tile.letter == 'v' - printf "%6d|", world.map.get(x, y).cur - else - printf " |", world.map.get(x, y).cur - end + printf "%6s|", render_tile_number(tile).to_s end print "\n" printf "+" @@ -80,6 +76,43 @@ class App end end + def render_tile_letter(tile : Game::Tile) + case tile + when Game::ConstructionSiteTile then '_'.colorize(:red) + when Game::DepositTile then render_deposit_resource tile.dep.type + when Game::BuildingTile then render_building_letter tile.building.type + else + ' ' + end + end + + def render_building_letter(building_type : Game::Building::Type) + case building_type + when Game::Building::Type::StartPoint then 'S'.colorize(:yellow) + when Game::Building::Type::CrystalMiner then 'M'.colorize(:yellow) + when Game::Building::Type::CrystalRestorer then 'R'.colorize(:yellow) + when Game::Building::Type::Terraformer then 'T'.colorize(:yellow) + else + ' ' + end + end + + def render_deposit_resource(res_type : Game::Resource::Type) + case res_type + when Game::Resource::Type::Crystals then 'v'.colorize(:blue) + else + ' ' + end + end + + def render_tile_number(tile : Game::Tile) + case tile + when Game::DepositTile then tile.dep.cur + else + ' ' + end + end + def render_commands(world) items = world.queue.top(5) if items.size != 0 @@ -99,8 +132,8 @@ class App def render_resources(world) printf "Resources:\n Crystals: %5d\n Terraformation: %5d\n", - world.resources[Game::Resources::Type::Crystals], - world.resources[Game::Resources::Type::Terraformation] + world.resources[Game::Resource::Type::Crystals], + world.resources[Game::Resource::Type::Terraformation] end def render_world(world) diff --git a/src/game/building.cr b/src/game/building.cr index dd57414..66f9902 100644 --- a/src/game/building.cr +++ b/src/game/building.cr @@ -45,7 +45,6 @@ module Game enum Type StartPoint - Storehouse CrystalMiner CrystalRestorer Terraformer @@ -60,7 +59,8 @@ module Game production : Production | Nil = nil, mining : Mining | Nil = nil, restoration : Mining | Nil = nil, - storage : Capacity | Nil = nil + storage : Capacity | Nil = nil, + shortcut : String = "" ) @name = name != "" ? name : @type.to_s @roles = roles.nil? ? Array(Role).new : roles.as(Array(Role)) @@ -69,6 +69,7 @@ module Game @mining = mining @restoration = restoration @storage = storage.nil? ? 0 : storage + @shortcut = shortcut end getter type @@ -79,6 +80,7 @@ module Game getter mining getter restoration getter storage + getter shortcut def has_role(role : Role) : Bool @roles.includes? role diff --git a/src/game/building_factory.cr b/src/game/building_factory.cr index dc19081..a951d25 100644 --- a/src/game/building_factory.cr +++ b/src/game/building_factory.cr @@ -4,11 +4,21 @@ module Game @items = [] of NamedTuple(t: Building::Type, b: Building) add( - Building.new Building::Type::StartPoint, storage: 100 + Building.new Building::Type::StartPoint, **{ + shortcut: "sp", + storage: 100, + roles: [Building::Role::Storehouse], + } ) add( Building.new Building::Type::CrystalMiner, **{ + shortcut: "miner", + construction: Construction.new( + ts: 10, + cost: ResourceBag.new, + requirements: [] of Game::Building::Type + ), mining: Mining.new( ts: 20, resource: Resource.new(Resource::Type::Crystals, 40), @@ -19,6 +29,7 @@ module Game add( Building.new Building::Type::CrystalRestorer, **{ + shortcut: "rest", construction: Construction.new( ts: 30, cost: ResourceBag.new({ @@ -36,6 +47,7 @@ module Game add( Building.new Building::Type::Terraformer, **{ + shortcut: "terr", construction: Construction.new( ts: 120, cost: ResourceBag.new({ diff --git a/src/game/command.cr b/src/game/command.cr index 558c4f1..645fce2 100644 --- a/src/game/command.cr +++ b/src/game/command.cr @@ -56,7 +56,7 @@ module Game def desc : String if @holded - sprintf "Mine %s from %d,%d", @holded.type, @point.x, @point.y + sprintf "Mine %s from %d,%d", @holded.as(Resource).type, @point.x, @point.y else sprintf "Wait for resources at %d,%d", @point.x, @point.y end @@ -107,7 +107,7 @@ module Game def desc : String if @holded - sprintf "Restore %s from %d,%d", @holded.type, @point.x, @point.y + sprintf "Restore %s from %d,%d", @holded.as(Resource).type, @point.x, @point.y else sprintf "Wait for resources at %d,%d", @point.x, @point.y end diff --git a/src/game/map.cr b/src/game/map.cr index 1d45865..85f1b3d 100644 --- a/src/game/map.cr +++ b/src/game/map.cr @@ -66,11 +66,11 @@ module Game rnd = Random.new map = Map.new(rows, cols) 5.times do - pnt = Point.new(rnd.rand(0...rows), rnd.rand(0...cols)) + point = Point.new(rnd.rand(0...rows), rnd.rand(0...cols)) cap = rnd.rand(2...6) - map.set(CrystalTile.new(pnt, cap * 50)) + deposit = Deposit.new(Resource::Type::Crystals, cap * 50) + map.set DepositTile.new(point, deposit) end - map.set(MainBaseTile.new(Point.new(0, 0))) map end end diff --git a/src/game/tile.cr b/src/game/tile.cr index 05d3e01..1fc6d13 100644 --- a/src/game/tile.cr +++ b/src/game/tile.cr @@ -1,127 +1,21 @@ module Game abstract class Tile - property cap : Int32 = 0 - property cur : Int32 = 0 - def initialize(@point : Point) end getter point - getter cap - getter cur - - def has_role(role : TileRole) : Bool - false - end - - def letter : Char - ' ' - end - - def withdraw(value) - if value >= @cur - wd = @cur - @cur = 0 - wd - else - @cur -= value - value - end - end - - def charge(value) - charged = @cur + value - @cur = charged <= @cap ? charged : @cap - end - - def can_build? - has_role(TileRole::Plateau) - end end class PlateauTile < Tile - def letter : Char - ' ' - end - - def has_role(role : TileRole) : Bool - role == TileRole::Plateau - end end class ConstructionSiteTile < Tile - def letter : Char - '_' - end - - def has_role(role : TileRole) : Bool - role == TileRole::ConstructionSite - end - end - - class MainBaseTile < Tile - def letter : Char - 'W' - end - - def has_role(role : TileRole) : Bool - role == TileRole::Warehouse - end - end - - class CrystalTile < Tile - def initialize(@point : Point, cap : Int32) - @cap = cap - @cur = cap - end - - def letter : Char - 'v' - end - - def has_role(role : TileRole) : Bool - role == TileRole::CrystalDeposits - end - end - - class CrystalHarvesterTile < Tile - def letter : Char - 'H' - end - - def has_role(role : TileRole) : Bool - role == TileRole::CrystalHarvester - end - end - - class CrystalRestorerTile < Tile - def letter : Char - 'R' - end - - def has_role(role : TileRole) : Bool - role == TileRole::CrystalRestorer - end - end - - class TerraformerTile < Tile - def letter : Char - 'T' - end - - def has_role(role : TileRole) : Bool - role == TileRole::Terraformer - end end class BuildingTile < Tile def initialize(@point : Point, @building : Building) end - def has_role(role : TileRole) : Bool - role == TileRole::Building - end - getter building end