[common] added PlayerState
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user