[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

@@ -137,4 +137,5 @@ module.exports.default = gulp.series(
//module.exports['server:neko:build'], //module.exports['server:neko:build'],
module.exports['client:flash:html'], module.exports['client:flash:html'],
module.exports['client:linux:deb'], module.exports['client:linux:deb'],
module.exports['editor:flash:html'],
); );

View File

@@ -37,10 +37,10 @@ import ru.m.tankz.preset.DotaGame;
} }
public function onShow() { public function onShow() {
resultView.data = resultState.players.filter(function(player) return switch player.controller { resultView.data = Lambda.array(Lambda.filter(resultState.players, function(player:PlayerState):Bool return switch player.controller {
case HUMAN(_): true; case HUMAN(_): true;
case _: false; case _: false;
}); }));
levelLabel.text = 'Level ${resultState.level}'; levelLabel.text = 'Level ${resultState.level}';
nextButton.visible = state != null; nextButton.visible = state != null;
} }

View File

@@ -1,11 +1,10 @@
package ru.m.tankz.view.common; package ru.m.tankz.view.common;
import haxework.resources.IResources;
import haxework.view.ButtonView; import haxework.view.ButtonView;
import haxework.view.GroupView; import haxework.view.GroupView;
import haxework.resources.IResources;
import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.bundle.IConfigBundle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.control.Control.Controller;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.Type; import ru.m.tankz.Type;
@@ -33,13 +32,6 @@ class LevelFrame extends GroupView {
if (preset != value || true) { // ToDo: if (preset != value || true) { // ToDo:
preset = value; preset = value;
state = new GameState(gameType, preset.id); state = new GameState(gameType, preset.id);
for (team in value.teams) {
for (player in team.players) {
var playerId = new PlayerId(team.id, player.index);
var controller = player.human ? HUMAN(player.index) : NONE;
state.players.push(new PlayerState(playerId, controller, player.life));
}
}
} }
return preset; return preset;
} }

View File

@@ -15,7 +15,7 @@ import ru.m.tankz.view.common.LifeView;
public function onGameStart(state:GameState):Void { public function onGameStart(state:GameState):Void {
level.text = 'Level ${state.level}'; level.text = 'Level ${state.level}';
players.data = state.players; players.data = Lambda.array(state.players);
} }
public function onGameChange(state:GameState):Void { public function onGameChange(state:GameState):Void {

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.view.death; package ru.m.tankz.view.death;
import Lambda;
import haxework.view.ButtonView; import haxework.view.ButtonView;
import haxework.view.DataView; import haxework.view.DataView;
import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameSwitcher;
@@ -19,7 +20,7 @@ import ru.m.tankz.view.common.PlayerView;
private function onShow():Void { private function onShow():Void {
gameType = DeathGame.TYPE; gameType = DeathGame.TYPE;
levels.data = [for (i in 0...config.game.levels) i]; levels.data = [for (i in 0...config.game.levels) i];
players.data = [for (i in 0...2) state.players]; players.data = [for (i in 0...2) Lambda.array(state.players)];
} }
private function playerViewFactory(index:Int, data:Array<PlayerState>):PlayerView { private function playerViewFactory(index:Int, data:Array<PlayerState>):PlayerView {

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.view.dota; package ru.m.tankz.view.dota;
import Lambda;
import haxework.view.ButtonView; import haxework.view.ButtonView;
import haxework.view.DataView; import haxework.view.DataView;
import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameSwitcher;
@@ -19,7 +20,7 @@ import ru.m.tankz.preset.DotaGame;
private function onShow():Void { private function onShow():Void {
gameType = DotaGame.TYPE; gameType = DotaGame.TYPE;
levels.data = [for (i in 0...config.game.levels) i]; levels.data = [for (i in 0...config.game.levels) i];
players.data = [for (i in 0...2) state.players]; players.data = [for (i in 0...2) Lambda.array(state.players)];
} }
private function playerViewFactory(index:Int, data:Array<PlayerState>):PlayerView { private function playerViewFactory(index:Int, data:Array<PlayerState>):PlayerView {

View File

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

View File

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

View File

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

View File

@@ -52,7 +52,6 @@ class Editor {
new Editor(); new Editor();
} }
private var view:EditorView;
@:provide private var resources:IResources; @:provide private var resources:IResources;
public function new() { public function new() {
@@ -64,7 +63,7 @@ class Editor {
Provider.setFactory(IConfigBundle, ConfigBundle); Provider.setFactory(IConfigBundle, ConfigBundle);
Provider.setFactory(ILevelBundle, LevelBundle); Provider.setFactory(ILevelBundle, LevelBundle);
view = new EditorView(); var view = new EditorView();
Root.bind(view); Root.bind(view);
view.switcher.change(LevelFrame.ID); view.switcher.change(LevelFrame.ID);

View File

@@ -122,13 +122,13 @@ class MapEditView extends SpriteView {
} }
private function onMouseDown(event:MouseEvent):Void { private function onMouseDown(event:MouseEvent):Void {
content.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); content.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
content.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); content.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
onMouseMove(event); onMouseMove(event);
} }
private function onMouseUp(event:MouseEvent):Void { private function onMouseUp(event:MouseEvent):Void {
content.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); content.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
content.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); content.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
} }