[common] added PlayerState

This commit is contained in:
2018-02-20 17:23:53 +03:00
parent 5b04242aab
commit 2e856c1256
16 changed files with 135 additions and 126 deletions

View File

@@ -49,6 +49,7 @@ typedef TankConfig = {
var hits:Int;
var skin:String;
@:optinal var upgrade:TankType;
@:optinal var downgrade:TankType;
}
typedef BonusConfig = {
@@ -59,14 +60,14 @@ typedef BonusConfig = {
typedef TankSpawn = {
var type:TankType;
var rate:Float;
@:optional var bonus:Float;
@:optional var protect:Float;
}
typedef PlayerConfig = {
var index:Int;
var control:ControlType;
var tanks:Array<TankSpawn>;
@:optional var bonus:Float;
@:optional var protect:Float;
@:optional var life:Int;
@:optional var color:Color;
}

View File

@@ -26,7 +26,6 @@ class Tank extends MobileEntity {
this.freezing = new Modificator();
this.playerId = playerId;
this.config = config;
this.hits = config.hits;
this.layer = 1;
}
@@ -36,6 +35,7 @@ class Tank extends MobileEntity {
rect.direction = d;
speed = value.speed;
config = value;
hits = config.hits;
return value;
}

View File

@@ -51,7 +51,9 @@ class CollisionProcessor implements EngineListener {
// Nothing
} else {
if (!tank.protect.active) {
if (tank.hits > 0) {
if (tank.config.downgrade != null) {
tank.config = engine.config.getTank(tank.config.downgrade);
} else if (tank.hits > 0) {
tank.hits--;
engine.change(tank, EntityChange.HIT);
} else {

View File

@@ -55,17 +55,22 @@ class Game implements EngineListener {
return teams[playerId.team].players[playerId.index];
}
private function buildTank(playerId:PlayerId, point:SpawnPoint):Tank {
var player = getPlayer(playerId);
var spawns:Array<TankSpawn> = player.config.tanks;
var spawn:TankSpawn = spawns[Math.floor(Math.random() * spawns.length)];
var tankConfig:TankConfig = config.getTank(spawn.type);
var tank = new Tank(playerId, tankConfig);
tank.color = player.config.color.zero ? teams[playerId.team].config.color : player.config.color;
tank.bonus = Math.random() < spawn.bonus;
applyPoint(tank, point);
if (spawn.protect > 0) {
tank.protect.on(spawn.protect);
private function buildTank(task:SpawnTask):Tank {
var player = getPlayer(task.playerId);
var tankType:TankType = if (task.tankType != null) {
task.tankType;
} else {
var spawns:Array<TankSpawn> = player.config.tanks;
var spawn:TankSpawn = spawns[Math.floor(Math.random() * spawns.length)];
spawn.type;
}
var tankConfig:TankConfig = config.getTank(tankType);
var tank = new Tank(task.playerId, tankConfig);
tank.color = player.config.color.zero ? teams[task.playerId.team].config.color : player.config.color;
tank.bonus = Math.random() < player.config.bonus;
applyPoint(tank, task.point);
if (player.config.protect > 0) {
tank.protect.on(player.config.protect);
}
return tank;
}
@@ -86,19 +91,9 @@ class Game implements EngineListener {
var humanControlIndex = 0;
for (teamConfig in preset.teams) {
var teamPoints = points.filter(function(p:SpawnPoint) return p.team == teamConfig.id);
var team:Team = new Team(teamConfig, teamPoints);
var team:Team = new Team(teamConfig, teamPoints, save);
teams[team.id] = team;
for (player in team.players.iterator()) {
var playerSave:PlayerSave = save.getPlayer(player.id);
if (playerSave != null) {
player.life = playerSave.life;
if (playerSave.tank != null) {
player.config.tanks = [{
type: playerSave.tank,
rate: 1,
}];
}
}
if (player.config.control != null) {
var control = switch (player.config.control) {
case Control.HUMAN: new HumanControl(player.id, humanControlIndex++);
@@ -119,7 +114,7 @@ class Game implements EngineListener {
for (team in teams.iterator()) {
for (player in team.players.iterator()) {
if (team.trySpawn(player.id)) {
team.spawner.push(player.id);
team.spawner.push(player.id, player.state.tank);
}
}
var eaglePoint = team.spawner.getPoint('eagle');
@@ -140,8 +135,9 @@ class Game implements EngineListener {
var player = getPlayer(task.playerId);
player.tankId = 0;
if (getTeam(task.playerId.team).trySpawn(task.playerId, true)) {
var tank = buildTank(task.playerId, task.point);
var tank = buildTank(task);
player.tankId = tank.id;
player.state.tank = tank.config.type;
engine.spawn(tank);
} else if (!team.isAlive) {
lose(team.id);
@@ -257,7 +253,7 @@ class Game implements EngineListener {
private function applyBonus(tank:Tank, bonus:Bonus):Void {
switch (bonus.config.type) {
case 'life':
getPlayer(tank.playerId).life++;
getPlayer(tank.playerId).state.life++;
case 'star':
if (tank.config.upgrade != null) {
tank.config = config.getTank(tank.config.upgrade);
@@ -291,23 +287,14 @@ class Game implements EngineListener {
}
public function save():GameSave {
var players:Array<PlayerSave> = [];
var save:GameSave = new GameSave(state);
for (team in teams) {
for (player in team.players) {
if (player.config.control == Control.HUMAN) {
var tank:Tank = EntityTypeResolver.as(engine.entities[player.tankId], Tank);
players.push({
id: player.id,
life: player.life + (player.tankId > 0 ? 1 : 0),
tank: tank != null ? tank.config.type : null
});
save.addPlayerState(player.id, player.state);
}
}
}
return new GameSave({
type: state.type,
presetId: state.presetId,
level: state.level
}, players);
return save;
}
}

View File

@@ -1,42 +1,46 @@
package ru.m.tankz.game;
import ru.m.tankz.game.Player;
import ru.m.tankz.Type;
import yaml.Parser;
import yaml.Renderer;
import yaml.Yaml;
import ru.m.tankz.Type;
typedef PlayerSave = {
var id:PlayerId;
var tank:TankType;
var life:Int;
var state:PlayerState;
}
class GameSave {
public var state:GameState;
public var players:Array<PlayerSave>;
public function new(state:GameState, ?players:Array<PlayerSave>) {
this.state = state;
this.state = {
type: state.type,
presetId: state.presetId,
level: state.level,
};
this.players = players != null ? players : [];
}
public function getPlayer(id:PlayerId):PlayerSave {
public function addPlayerState(id:PlayerId, state:PlayerState):Void {
players.push({id: id, state: state});
}
public function getPlayerState(id:PlayerId):PlayerState {
for (player in players) {
if (player.id.team == id.team && player.id.index == id.index) {
return player;
return player.state;
}
}
return null;
}
public function toYaml():String {
return Yaml.render({
state: state,
players: players,
}, Renderer.options().setFlowLevel(0));
return Yaml.render({state: state, players: players}, Renderer.options().setFlowLevel(0));
}
public static function fromYaml(value:String):GameSave {

View File

@@ -5,20 +5,29 @@ import ru.m.tankz.control.Control;
import ru.m.tankz.Type;
class Player {
typedef PlayerState = {
var tank:TankType;
var life:Int;
var score:Int;
}
class Player {
public var config(default, null):PlayerConfig;
public var id(default, null):PlayerId;
public var tankId(default, set):Int;
public var control(default, set):Control;
public var life(default, default):Int;
public var isAlive(get, null):Bool;
public var state(default, default):PlayerState;
public function new(teamId:TeamId, config:PlayerConfig) {
this.config = config;
this.id = {team:teamId, index:config.index};
this.control = null;
this.life = config.life;
this.state = {
life: config.life,
tank: null,
score: 0,
}
}
private function set_tankId(value:Int):Int {
@@ -39,6 +48,6 @@ class Player {
}
private function get_isAlive():Bool {
return tankId > 0 || life > 0;
return tankId > 0 || state.life > 0;
}
}

View File

@@ -8,6 +8,7 @@ import ru.m.tankz.Type;
typedef SpawnTask = {
var point:SpawnPoint;
var playerId:PlayerId;
var tankType:TankType;
}
class Spawner {
@@ -51,7 +52,7 @@ class Spawner {
return null;
}
public function push(playerId:PlayerId):Void {
public function push(playerId:PlayerId, ?tankType:TankType):Void {
var point:SpawnPoint = null;
if (indexedPoints.exists(playerId.index)) {
point = indexedPoints.get(playerId.index);
@@ -60,7 +61,7 @@ class Spawner {
if (index >= anyPoints.length) index = 0;
}
if (point != null) {
queue.push({playerId:playerId, point:point});
queue.push({playerId:playerId, point:point, tankType:tankType});
run();
}
}

View File

@@ -14,12 +14,15 @@ class Team {
public var isAlive(get, null):Bool;
public var eagleId(default, default):Int;
public function new(config:TeamConfig, points:Array<SpawnPoint>) {
public function new(config:TeamConfig, points:Array<SpawnPoint>, ?save:GameSave) {
this.id = config.id;
this.config = config;
this.players = new Map();
for (playerConfig in config.players) {
this.players[playerConfig.index] = new Player(id, playerConfig);
var player:Player = new Player(id, playerConfig);
var state = save.getPlayerState(player.id);
if (state != null) player.state = state;
this.players[playerConfig.index] = player;
}
this.life = config.life;
this.spawner = new Spawner(config, points);
@@ -28,16 +31,12 @@ class Team {
public function trySpawn(playerId:PlayerId, spawn:Bool = false):Bool {
var player:Player = players[playerId.index];
var result = false;
if (player.life > -1) {
if (player.life > 0) {
if (spawn) player.life--;
result = true;
}
} else if (life > -1) {
if (life > 0) {
if (spawn) life--;
result = true;
}
if (player.state.life > 0) {
if (spawn) player.state.life--;
result = true;
} else if (life > 0) {
if (spawn) life--;
result = true;
}
return result;
}