[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

@@ -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<Dynamic>) {
public var team(get, never):TeamId;
public var index(get, never):Int;

View File

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

View File

@@ -44,15 +44,14 @@ class EntityBuilder {
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 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;
}

View File

@@ -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;

View File

@@ -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();

View File

@@ -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<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 {
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<Frag>;
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;
}
}
}
}

View File

@@ -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;
}

View File

@@ -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<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 {
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 {

View File

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