From d9cce32bb8dcb3823cb35eb5579ab3a9d83211d7 Mon Sep 17 00:00:00 2001 From: shmyga Date: Wed, 28 Aug 2019 17:54:41 +0300 Subject: [PATCH] [common] saveState param in PlayerConfig --- .../haxe/ru/m/tankz/network/NetworkManager.hx | 2 +- .../haxe/ru/m/tankz/view/MenuFrame.yaml | 2 + .../haxe/ru/m/tankz/view/ResultFrame.hx | 6 ++- .../haxe/ru/m/tankz/view/common/TankView.hx | 2 +- .../haxe/ru/m/tankz/view/game/PlayerView.hx | 1 - .../m/tankz/view/result/ResultPlayerView.hx | 3 +- src/common/haxe/ru/m/tankz/Type.hx | 11 +++++ src/common/haxe/ru/m/tankz/config/Config.hx | 1 + .../haxe/ru/m/tankz/game/EntityBuilder.hx | 13 +++-- src/common/haxe/ru/m/tankz/game/GameEvent.hx | 10 ---- src/common/haxe/ru/m/tankz/game/GameRunner.hx | 24 ++++++++-- src/common/haxe/ru/m/tankz/game/GameState.hx | 47 ++++++------------- src/common/haxe/ru/m/tankz/game/Player.hx | 2 - src/common/haxe/ru/m/tankz/game/Spawner.hx | 17 ++----- src/common/resources/config/classic.yaml | 1 + 15 files changed, 69 insertions(+), 73 deletions(-) diff --git a/src/client/haxe/ru/m/tankz/network/NetworkManager.hx b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx index 8d945de..426ec95 100644 --- a/src/client/haxe/ru/m/tankz/network/NetworkManager.hx +++ b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx @@ -61,7 +61,7 @@ class NetworkManager { updateState(OFFLINE); connection.handler.connect(onConnectionEvent); connection.receiveHandler.connect(onResponse); - connect(); + //connect(); // ToDo: disable network } private function updateState(value:ConnectionState):Void { diff --git a/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml b/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml index d9a975d..1c3dfc3 100644 --- a/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml @@ -29,6 +29,7 @@ views: style: line geometry.width: 250 geometry.margin: [0, 10] + visible: false - $type: haxework.view.form.ButtonView style: button.menu +onPress: ~switcher.change('record') @@ -39,6 +40,7 @@ views: style: button.menu +onPress: ~startNetwork() text: Network + visible: false - $type: haxework.view.form.LabelView geometry.hAlign: right geometry.vAlign: top diff --git a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx index 5f86693..3b8e078 100644 --- a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx @@ -47,7 +47,8 @@ using ru.m.tankz.view.ViewUtil; } private function restart():Void { - frames.change(GameFrame.ID, LOCAL({state: result.state.clean(), level: result.level})); + result.state.clean(); + frames.change(GameFrame.ID, LOCAL({state: result.state, level: result.level})); } private function next():Void { @@ -56,7 +57,8 @@ using ru.m.tankz.view.ViewUtil; var level = pack.data[result.level.id + 1]; var progress = gameStorage.get(pack.id); if (progress.isPresetAvailable(level.id, result.state.presetId)) { - frames.change(GameFrame.ID, LOCAL({state: result.state.clean(), level: level})); + result.state.clean(); + frames.change(GameFrame.ID, LOCAL({state: result.state, level: level})); } } } diff --git a/src/client/haxe/ru/m/tankz/view/common/TankView.hx b/src/client/haxe/ru/m/tankz/view/common/TankView.hx index b9d3497..9315041 100644 --- a/src/client/haxe/ru/m/tankz/view/common/TankView.hx +++ b/src/client/haxe/ru/m/tankz/view/common/TankView.hx @@ -1,8 +1,8 @@ package ru.m.tankz.view.common; import haxework.view.ImageView; -import ru.m.tankz.game.GameEvent; import ru.m.tankz.render.RenderUtil; +import ru.m.tankz.Type.TankInfo; class TankView extends ImageView { diff --git a/src/client/haxe/ru/m/tankz/view/game/PlayerView.hx b/src/client/haxe/ru/m/tankz/view/game/PlayerView.hx index bd0ee61..31a5d2b 100644 --- a/src/client/haxe/ru/m/tankz/view/game/PlayerView.hx +++ b/src/client/haxe/ru/m/tankz/view/game/PlayerView.hx @@ -2,7 +2,6 @@ package ru.m.tankz.view.game; import haxework.view.form.LabelView; import haxework.view.group.VGroupView; -import ru.m.tankz.game.GameEvent.TankInfo; import ru.m.tankz.game.GameState; import ru.m.tankz.Type; import ru.m.tankz.view.common.TankView; diff --git a/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.hx b/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.hx index 9b547a5..037ec72 100644 --- a/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.hx +++ b/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.hx @@ -21,7 +21,8 @@ import ru.m.tankz.view.common.TankView; private function set_data(value:PlayerState):PlayerState { data = value; titleView.text = data.name != null ? '${data.id.format()} * ${data.name}' : data.id.format(); - scoreView.text = '${data.score}$'; + var additionalScore = Lambda.fold(data.frags, function(frag:Frag, score:Int) return score + frag.score, 0); + scoreView.text = '${data.score}$ (+${additionalScore}$)'; tankView.color = value.color; fragsView.data = data.frags; tankView.tank = value.tank; diff --git a/src/common/haxe/ru/m/tankz/Type.hx b/src/common/haxe/ru/m/tankz/Type.hx index bba01c0..3e4693e 100644 --- a/src/common/haxe/ru/m/tankz/Type.hx +++ b/src/common/haxe/ru/m/tankz/Type.hx @@ -1,5 +1,7 @@ package ru.m.tankz; +import haxework.color.Color; + typedef GameType = String; typedef TeamId = String; @@ -12,6 +14,15 @@ typedef TankType = String; typedef BonusType = String; +typedef TankInfo = { + var type:TankType; + var skin:String; + var hits:Int; + var bonus:Bool; + var color:Color; + @:optional var name:String; +} + abstract PlayerId(Array) { public var team(get, never):TeamId; public var index(get, never):Int; diff --git a/src/common/haxe/ru/m/tankz/config/Config.hx b/src/common/haxe/ru/m/tankz/config/Config.hx index b8c034d..cfbc6d5 100644 --- a/src/common/haxe/ru/m/tankz/config/Config.hx +++ b/src/common/haxe/ru/m/tankz/config/Config.hx @@ -91,6 +91,7 @@ typedef PlayerConfig = { @:optional var life:Int; @:optional var color:Null; @:optional var control:String; + @:optional var saveState:Bool; } typedef EagleConfig = { diff --git a/src/common/haxe/ru/m/tankz/game/EntityBuilder.hx b/src/common/haxe/ru/m/tankz/game/EntityBuilder.hx index f9f6795..d83f21e 100644 --- a/src/common/haxe/ru/m/tankz/game/EntityBuilder.hx +++ b/src/common/haxe/ru/m/tankz/game/EntityBuilder.hx @@ -44,15 +44,14 @@ class EntityBuilder { return eagle; } - public function buildTank(point:EntityPoint, playerId:PlayerId, type:TankType, color:Null, name:String, bonusOff:Bool = false):Tank { + public function buildTank(point:EntityPoint, playerId:PlayerId, info:TankInfo):Tank { var playerConfig = config.getPlayer(playerId); - var tankConfig = config.getTank(type); + var tankConfig = config.getTank(info.type); var tank = new Tank(++entityId, buildRect(point, tankConfig.width, tankConfig.height), playerId, tankConfig); - tank.color = color == null || color.zero ? config.getColor(playerId) : color; - tank.name = name; - if (!bonusOff) { - tank.bonus = Math.random() < playerConfig.bonus; - } + tank.color = info.color; + tank.hits = info.hits; + tank.name = info.name; + tank.bonus = info.bonus; return tank; } diff --git a/src/common/haxe/ru/m/tankz/game/GameEvent.hx b/src/common/haxe/ru/m/tankz/game/GameEvent.hx index f1ec4cd..da2a7ad 100644 --- a/src/common/haxe/ru/m/tankz/game/GameEvent.hx +++ b/src/common/haxe/ru/m/tankz/game/GameEvent.hx @@ -1,6 +1,5 @@ package ru.m.tankz.game; -import haxework.color.Color; import ru.m.geom.Position; import ru.m.geom.Rectangle; import ru.m.tankz.config.Config; @@ -18,15 +17,6 @@ typedef Result = { var winner:TeamId; } -typedef TankInfo = { - var type:TankType; - var skin:String; - var hits:Int; - var bonus:Bool; - var color:Color; - @:optional var name:String; -} - typedef BrickInfo = { var id:Int; var x:Int; diff --git a/src/common/haxe/ru/m/tankz/game/GameRunner.hx b/src/common/haxe/ru/m/tankz/game/GameRunner.hx index f231777..df5769c 100644 --- a/src/common/haxe/ru/m/tankz/game/GameRunner.hx +++ b/src/common/haxe/ru/m/tankz/game/GameRunner.hx @@ -64,6 +64,21 @@ class GameRunner extends Game implements EngineListener { engine.dispose(); } + public function newPlayerTank(playerId:PlayerId):TankInfo { + var player = getPlayer(playerId); + var spawn = player.config.tanks[Math.floor(Math.random() * player.config.tanks.length)]; + var tank = config.getTank(spawn.type); + var bonus = Math.random() < player.config.bonus; + return { + type:tank.type, + skin:tank.skin, + hits:tank.hits, + bonus:bonus, + color:player.state.color, + name:player.state.name, + } + } + override private function onStart(start:Start):Void { super.onStart(start); var mapData = level.data.map(function(index:BrickIndex) return config.getBrickByIndex(index)); @@ -72,7 +87,7 @@ class GameRunner extends Game implements EngineListener { team.spawner.runner = spawn; for (player in team.players.iterator()) { if (team.tryRespawn(player.id)) { - team.spawner.push(engine.ticker, player.id); + team.spawner.push(engine.ticker, player.id, player.state.tank != null ? player.state.tank : newPlayerTank(player.id)); } } if (team.config.eagle != null) { @@ -91,7 +106,7 @@ class GameRunner extends Game implements EngineListener { private function spawn(task:SpawnTask):Void { var player = getPlayer(task.playerId); - var tank = builder.buildTank(task.point, task.playerId, task.tankType, player.state.color, player.state.name); + var tank = builder.buildTank(task.point, task.playerId, task.tank); if (getTeam(player.id.team).freezing) { tank.freezing = true; } @@ -295,6 +310,9 @@ class GameRunner extends Game implements EngineListener { bullet.weapon.use(); case CHANGE(BRICK(id, type)): engine.map.bricksById[id].config = config.getBrick(type); + case CHANGE(TANK(id, type, hits, bonus)): + var tank:Tank = engine.getEntity(id); + getPlayer(tank.playerId).state.tank = tank.info; case DESTROY(EAGLE(id, shot)): var eagle:Eagle = engine.getEntity(id); eagle.death = true; @@ -322,7 +340,7 @@ class GameRunner extends Game implements EngineListener { } var respawn:Bool = team.tryRespawn(player.id); if (respawn) { - team.spawner.push(engine.ticker, player.id); + team.spawner.push(engine.ticker, player.id, newPlayerTank(player.id)); } if (!team.isAlive) { checkComplete(); diff --git a/src/common/haxe/ru/m/tankz/game/GameState.hx b/src/common/haxe/ru/m/tankz/game/GameState.hx index 273f671..dadcad2 100644 --- a/src/common/haxe/ru/m/tankz/game/GameState.hx +++ b/src/common/haxe/ru/m/tankz/game/GameState.hx @@ -5,7 +5,6 @@ import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.config.Config; import ru.m.tankz.control.Controller; import ru.m.tankz.control.PlayerControl; -import ru.m.tankz.game.GameEvent; import ru.m.tankz.Type; enum FragTarget { @@ -20,45 +19,21 @@ typedef Frag = { var score:Score; } -class State { - public var score:Int; - public var frags:Array; - - public function new() { - score = 0; - frags = []; - } - - public function add(state:State) { - score += state.score; - frags = frags.concat(state.frags); - } - - public function reset() { - score = 0; - frags = []; - } -} - -class PlayerState extends State { +class PlayerState { public var id:PlayerId; public var tank:TankInfo; public var color:Color; public var name:String; public var life:Int; - public var total:State; + public var score:Int; + public var frags:Array; public function new(id:PlayerId) { - super(); this.id = id; this.tank = null; this.life = 0; - this.total = new State(); - } - - override public function reset() { - total.add(this); - super.reset(); + this.score = 0; + this.frags = []; } } @@ -99,6 +74,7 @@ class GameState { for (player in team.players) { var playerId = new PlayerId(team.id, player.index); var playerState = new PlayerState(playerId); + playerState.life = config.getPlayer(playerId).life; players[playerId] = playerState; teamState.players[player.index] = playerState; } @@ -169,7 +145,14 @@ class GameState { return (playerState == null || playerState.color.zero) ? config.getColor(id) : playerState.color; } - public function clean():GameState { - return new GameState(type, presetId, null, controls); + public function clean():Void { + for (p in players) { + p.frags = []; + var playerConfig = config.getPlayer(p.id); + if (!playerConfig.saveState) { + p.tank = null; + p.life = playerConfig.life; + } + } } } diff --git a/src/common/haxe/ru/m/tankz/game/Player.hx b/src/common/haxe/ru/m/tankz/game/Player.hx index 8b7e4ef..3bfb8b5 100644 --- a/src/common/haxe/ru/m/tankz/game/Player.hx +++ b/src/common/haxe/ru/m/tankz/game/Player.hx @@ -15,8 +15,6 @@ class Player { this.config = config; this.id = new PlayerId(teamId, config.index); this.state = state == null ? new PlayerState(id) : state; - this.state.reset(); - this.state.life = Math.isNaN(config.life) ? 0 : config.life; this.tankId = -1; } diff --git a/src/common/haxe/ru/m/tankz/game/Spawner.hx b/src/common/haxe/ru/m/tankz/game/Spawner.hx index b8092e9..cb41128 100644 --- a/src/common/haxe/ru/m/tankz/game/Spawner.hx +++ b/src/common/haxe/ru/m/tankz/game/Spawner.hx @@ -1,13 +1,13 @@ package ru.m.tankz.game; -import ru.m.tankz.engine.ITicker; import ru.m.tankz.config.Config; +import ru.m.tankz.engine.ITicker; import ru.m.tankz.Type; typedef SpawnTask = { var point:SpawnPoint; var playerId:PlayerId; - var tankType:TankType; + var tank:TankInfo; } class Spawner { @@ -51,16 +51,7 @@ class Spawner { return null; } - private function getPlayerTank(playerId:PlayerId):TankType { - for (player in config.players) if (player.index == playerId.index) { - var spawns:Array = player.tanks; - var spawn:TankSpawn = spawns[Math.floor(Math.random() * spawns.length)]; - return spawn.type; - } - return null; - } - - public function push(ticker:ITicker, playerId:PlayerId):Void { + public function push(ticker:ITicker, playerId:PlayerId, tank:TankInfo):Void { var point:SpawnPoint = null; if (indexedPoints.exists(playerId.index)) { point = indexedPoints.get(playerId.index); @@ -69,7 +60,7 @@ class Spawner { if (index >= anyPoints.length) index = 0; } if (point != null) { - queue.push({playerId:playerId, point:point, tankType:getPlayerTank(playerId)}); + queue.push({playerId:playerId, point:point, tank:tank}); if (config.spawnInterval == null) { ticker.emit(spawn, 500); } else { diff --git a/src/common/resources/config/classic.yaml b/src/common/resources/config/classic.yaml index 3b9ab7c..116ded1 100644 --- a/src/common/resources/config/classic.yaml +++ b/src/common/resources/config/classic.yaml @@ -25,6 +25,7 @@ player: protect: 5 tanks: - {type: human0, rate: 1} + saveState: true bot: &bot color: 0xFFFFFF bonus: 0.25