[common] saveState param in PlayerConfig

This commit is contained in:
2019-08-28 17:54:41 +03:00
parent 0f3392aa0c
commit d9cce32bb8
15 changed files with 69 additions and 73 deletions

View File

@@ -61,7 +61,7 @@ class NetworkManager {
updateState(OFFLINE); updateState(OFFLINE);
connection.handler.connect(onConnectionEvent); connection.handler.connect(onConnectionEvent);
connection.receiveHandler.connect(onResponse); connection.receiveHandler.connect(onResponse);
connect(); //connect(); // ToDo: disable network
} }
private function updateState(value:ConnectionState):Void { private function updateState(value:ConnectionState):Void {

View File

@@ -29,6 +29,7 @@ views:
style: line style: line
geometry.width: 250 geometry.width: 250
geometry.margin: [0, 10] geometry.margin: [0, 10]
visible: false
- $type: haxework.view.form.ButtonView - $type: haxework.view.form.ButtonView
style: button.menu style: button.menu
+onPress: ~switcher.change('record') +onPress: ~switcher.change('record')
@@ -39,6 +40,7 @@ views:
style: button.menu style: button.menu
+onPress: ~startNetwork() +onPress: ~startNetwork()
text: Network text: Network
visible: false
- $type: haxework.view.form.LabelView - $type: haxework.view.form.LabelView
geometry.hAlign: right geometry.hAlign: right
geometry.vAlign: top geometry.vAlign: top

View File

@@ -47,7 +47,8 @@ using ru.m.tankz.view.ViewUtil;
} }
private function restart():Void { 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 { private function next():Void {
@@ -56,7 +57,8 @@ using ru.m.tankz.view.ViewUtil;
var level = pack.data[result.level.id + 1]; var level = pack.data[result.level.id + 1];
var progress = gameStorage.get(pack.id); var progress = gameStorage.get(pack.id);
if (progress.isPresetAvailable(level.id, result.state.presetId)) { 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}));
} }
} }
} }

View File

@@ -1,8 +1,8 @@
package ru.m.tankz.view.common; package ru.m.tankz.view.common;
import haxework.view.ImageView; import haxework.view.ImageView;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.render.RenderUtil; import ru.m.tankz.render.RenderUtil;
import ru.m.tankz.Type.TankInfo;
class TankView extends ImageView { class TankView extends ImageView {

View File

@@ -2,7 +2,6 @@ package ru.m.tankz.view.game;
import haxework.view.form.LabelView; import haxework.view.form.LabelView;
import haxework.view.group.VGroupView; import haxework.view.group.VGroupView;
import ru.m.tankz.game.GameEvent.TankInfo;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.Type; import ru.m.tankz.Type;
import ru.m.tankz.view.common.TankView; import ru.m.tankz.view.common.TankView;

View File

@@ -21,7 +21,8 @@ import ru.m.tankz.view.common.TankView;
private function set_data(value:PlayerState):PlayerState { private function set_data(value:PlayerState):PlayerState {
data = value; data = value;
titleView.text = data.name != null ? '${data.id.format()} * ${data.name}' : data.id.format(); 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; tankView.color = value.color;
fragsView.data = data.frags; fragsView.data = data.frags;
tankView.tank = value.tank; tankView.tank = value.tank;

View File

@@ -1,5 +1,7 @@
package ru.m.tankz; package ru.m.tankz;
import haxework.color.Color;
typedef GameType = String; typedef GameType = String;
typedef TeamId = String; typedef TeamId = String;
@@ -12,6 +14,15 @@ typedef TankType = String;
typedef BonusType = 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<Dynamic>) { abstract PlayerId(Array<Dynamic>) {
public var team(get, never):TeamId; public var team(get, never):TeamId;
public var index(get, never):Int; public var index(get, never):Int;

View File

@@ -91,6 +91,7 @@ typedef PlayerConfig = {
@:optional var life:Int; @:optional var life:Int;
@:optional var color:Null<Int>; @:optional var color:Null<Int>;
@:optional var control:String; @:optional var control:String;
@:optional var saveState:Bool;
} }
typedef EagleConfig = { typedef EagleConfig = {

View File

@@ -44,15 +44,14 @@ class EntityBuilder {
return eagle; return eagle;
} }
public function buildTank(point:EntityPoint, playerId:PlayerId, type:TankType, color:Null<Color>, name:String, bonusOff:Bool = false):Tank { public function buildTank(point:EntityPoint, playerId:PlayerId, info:TankInfo):Tank {
var playerConfig = config.getPlayer(playerId); 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); var tank = new Tank(++entityId, buildRect(point, tankConfig.width, tankConfig.height), playerId, tankConfig);
tank.color = color == null || color.zero ? config.getColor(playerId) : color; tank.color = info.color;
tank.name = name; tank.hits = info.hits;
if (!bonusOff) { tank.name = info.name;
tank.bonus = Math.random() < playerConfig.bonus; tank.bonus = info.bonus;
}
return tank; return tank;
} }

View File

@@ -1,6 +1,5 @@
package ru.m.tankz.game; package ru.m.tankz.game;
import haxework.color.Color;
import ru.m.geom.Position; import ru.m.geom.Position;
import ru.m.geom.Rectangle; import ru.m.geom.Rectangle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
@@ -18,15 +17,6 @@ typedef Result = {
var winner:TeamId; 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 = { typedef BrickInfo = {
var id:Int; var id:Int;
var x:Int; var x:Int;

View File

@@ -64,6 +64,21 @@ class GameRunner extends Game implements EngineListener {
engine.dispose(); 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 { override private function onStart(start:Start):Void {
super.onStart(start); super.onStart(start);
var mapData = level.data.map(function(index:BrickIndex) return config.getBrickByIndex(index)); 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; team.spawner.runner = spawn;
for (player in team.players.iterator()) { for (player in team.players.iterator()) {
if (team.tryRespawn(player.id)) { 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) { if (team.config.eagle != null) {
@@ -91,7 +106,7 @@ class GameRunner extends Game implements EngineListener {
private function spawn(task:SpawnTask):Void { private function spawn(task:SpawnTask):Void {
var player = getPlayer(task.playerId); 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) { if (getTeam(player.id.team).freezing) {
tank.freezing = true; tank.freezing = true;
} }
@@ -295,6 +310,9 @@ class GameRunner extends Game implements EngineListener {
bullet.weapon.use(); bullet.weapon.use();
case CHANGE(BRICK(id, type)): case CHANGE(BRICK(id, type)):
engine.map.bricksById[id].config = config.getBrick(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)): case DESTROY(EAGLE(id, shot)):
var eagle:Eagle = engine.getEntity(id); var eagle:Eagle = engine.getEntity(id);
eagle.death = true; eagle.death = true;
@@ -322,7 +340,7 @@ class GameRunner extends Game implements EngineListener {
} }
var respawn:Bool = team.tryRespawn(player.id); var respawn:Bool = team.tryRespawn(player.id);
if (respawn) { if (respawn) {
team.spawner.push(engine.ticker, player.id); team.spawner.push(engine.ticker, player.id, newPlayerTank(player.id));
} }
if (!team.isAlive) { if (!team.isAlive) {
checkComplete(); checkComplete();

View File

@@ -5,7 +5,6 @@ import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.control.Controller; import ru.m.tankz.control.Controller;
import ru.m.tankz.control.PlayerControl; import ru.m.tankz.control.PlayerControl;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.Type; import ru.m.tankz.Type;
enum FragTarget { enum FragTarget {
@@ -20,45 +19,21 @@ typedef Frag = {
var score:Score; var score:Score;
} }
class State { class PlayerState {
public var score:Int;
public var frags:Array<Frag>;
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 {
public var id:PlayerId; public var id:PlayerId;
public var tank:TankInfo; public var tank:TankInfo;
public var color:Color; public var color:Color;
public var name:String; public var name:String;
public var life:Int; public var life:Int;
public var total:State; public var score:Int;
public var frags:Array<Frag>;
public function new(id:PlayerId) { public function new(id:PlayerId) {
super();
this.id = id; this.id = id;
this.tank = null; this.tank = null;
this.life = 0; this.life = 0;
this.total = new State(); this.score = 0;
} this.frags = [];
override public function reset() {
total.add(this);
super.reset();
} }
} }
@@ -99,6 +74,7 @@ class GameState {
for (player in team.players) { for (player in team.players) {
var playerId = new PlayerId(team.id, player.index); var playerId = new PlayerId(team.id, player.index);
var playerState = new PlayerState(playerId); var playerState = new PlayerState(playerId);
playerState.life = config.getPlayer(playerId).life;
players[playerId] = playerState; players[playerId] = playerState;
teamState.players[player.index] = playerState; teamState.players[player.index] = playerState;
} }
@@ -169,7 +145,14 @@ class GameState {
return (playerState == null || playerState.color.zero) ? config.getColor(id) : playerState.color; return (playerState == null || playerState.color.zero) ? config.getColor(id) : playerState.color;
} }
public function clean():GameState { public function clean():Void {
return new GameState(type, presetId, null, controls); for (p in players) {
p.frags = [];
var playerConfig = config.getPlayer(p.id);
if (!playerConfig.saveState) {
p.tank = null;
p.life = playerConfig.life;
}
}
} }
} }

View File

@@ -15,8 +15,6 @@ class Player {
this.config = config; this.config = config;
this.id = new PlayerId(teamId, config.index); this.id = new PlayerId(teamId, config.index);
this.state = state == null ? new PlayerState(id) : state; this.state = state == null ? new PlayerState(id) : state;
this.state.reset();
this.state.life = Math.isNaN(config.life) ? 0 : config.life;
this.tankId = -1; this.tankId = -1;
} }

View File

@@ -1,13 +1,13 @@
package ru.m.tankz.game; package ru.m.tankz.game;
import ru.m.tankz.engine.ITicker;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.engine.ITicker;
import ru.m.tankz.Type; import ru.m.tankz.Type;
typedef SpawnTask = { typedef SpawnTask = {
var point:SpawnPoint; var point:SpawnPoint;
var playerId:PlayerId; var playerId:PlayerId;
var tankType:TankType; var tank:TankInfo;
} }
class Spawner { class Spawner {
@@ -51,16 +51,7 @@ class Spawner {
return null; return null;
} }
private function getPlayerTank(playerId:PlayerId):TankType { public function push(ticker:ITicker, playerId:PlayerId, tank:TankInfo):Void {
for (player in config.players) if (player.index == playerId.index) {
var spawns:Array<TankSpawn> = 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 {
var point:SpawnPoint = null; var point:SpawnPoint = null;
if (indexedPoints.exists(playerId.index)) { if (indexedPoints.exists(playerId.index)) {
point = indexedPoints.get(playerId.index); point = indexedPoints.get(playerId.index);
@@ -69,7 +60,7 @@ class Spawner {
if (index >= anyPoints.length) index = 0; if (index >= anyPoints.length) index = 0;
} }
if (point != null) { if (point != null) {
queue.push({playerId:playerId, point:point, tankType:getPlayerTank(playerId)}); queue.push({playerId:playerId, point:point, tank:tank});
if (config.spawnInterval == null) { if (config.spawnInterval == null) {
ticker.emit(spawn, 500); ticker.emit(spawn, 500);
} else { } else {

View File

@@ -25,6 +25,7 @@ player:
protect: 5 protect: 5
tanks: tanks:
- {type: human0, rate: 1} - {type: human0, rate: 1}
saveState: true
bot: &bot bot: &bot
color: 0xFFFFFF color: 0xFFFFFF
bonus: 0.25 bonus: 0.25