[client] add death game panel

This commit is contained in:
2019-03-26 17:37:33 +03:00
parent e609dafedc
commit fd0e2382d0
11 changed files with 51 additions and 58 deletions

View File

@@ -128,20 +128,18 @@ class Game extends GameDispatcher {
engine.map.setData(level.data);
teams = new Map<TeamId, Team>();
var controlFactory:IControlFactory = Provider.build(IControlFactory);
var players = state.players.slice(0);
for (teamConfig in state.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, state.teams[teamConfig.id]);
teams[team.id] = team;
for (player in team.players.iterator()) {
var controller:Controller = Controller.BOT("hard");
var nextPlayer:PlayerState = Lambda.find(players, function(p) return p.id == player.id);
if (nextPlayer != null) {
player.state = nextPlayer;
players.remove(nextPlayer);
switch (nextPlayer.controller) {
var playerState = state.players[player.id];
if (playerState != null) {
player.state = playerState;
switch (playerState.controller) {
case HUMAN(_):
controller = nextPlayer.controller;
controller = playerState.controller;
case _:
}
}
@@ -154,8 +152,6 @@ class Game extends GameDispatcher {
}
team.spawner.runner = spawn;
}
// ToDo:
state.teams = [for (team in teams.iterator()) team.state];
for (team in teams.iterator()) {
for (player in team.players.iterator()) {

View File

@@ -31,11 +31,13 @@ class PlayerState {
class TeamState {
public var id:TeamId;
public var players:Array<PlayerState>;
public var life:Int;
public function new(id:TeamId, life:Int = 0) {
this.id = id;
this.life = life;
this.players = [];
}
}
@@ -44,8 +46,8 @@ class GameState {
public var type:GameType;
public var presetId:PresetId;
public var level:Int;
public var players:Array<PlayerState>;
public var teams:Array<TeamState>;
public var players:Map<String, PlayerState>;
public var teams:Map<TeamId, TeamState>;
public var preset(get, null):GamePreset;
public var config(get, null):Config;
@@ -55,8 +57,24 @@ class GameState {
this.type = type;
this.presetId = presetId;
this.level = level;
this.players = state == null ? [] : state.players;
this.teams = state == null ? [] : state.teams;
if (state == null) {
this.teams = new Map();
this.players = new Map();
for (team in preset.teams) {
var teamState = new TeamState(team.id, team.life);
for (player in team.players) {
var playerId = new PlayerId(team.id, player.index);
var controller = player.human ? HUMAN(player.index) : NONE;
var playerState = new PlayerState(playerId, controller, player.life);
players[playerId] = playerState;
teamState.players.push(playerState);
}
teams[team.id] = teamState;
}
} else {
this.teams = state.teams;
this.players = state.players;
}
}
private function get_preset():GamePreset {
@@ -70,44 +88,29 @@ class GameState {
}
public function getTeamLife(id:TeamId):Int {
var result = 0;
for (team in teams) {
if (team.id == id) {
result += team.life;
}
if (teams.exists(id)) {
return teams[id].life + Lambda.fold(teams[id].players, function(p, c) return c + p.life, 0);
}
for (player in players) {
if (player.id.team == id) {
result += player.life;
}
}
return result;
return 0;
}
public function getTeamScore(id:TeamId):Int {
var result = 0;
for (player in players) {
if (player.id.team == id) {
result += player.score;
}
if (teams.exists(id)) {
return Lambda.fold(teams[id].players, function(p, c) return c + p.score, 0);
}
return result;
return 0;
}
public function getPlayerLife(id:PlayerId):Int {
for (player in players) {
if (player.id == id) {
return player.life;
}
if (players.exists(id)) {
return players[id].life;
}
return 0;
}
public function getPlayerScore(id:PlayerId):Int {
for (player in players) {
if (player.id == id) {
return player.score;
}
if (players.exists(id)) {
return players[id].score;
}
return 0;
}

View File

@@ -21,7 +21,7 @@ bricks:
player:
default: &player
life: 10
protect: 2
protect: 1.5
tanks:
- {type: default, rate: 1}