[client] add universal LevelFrame

This commit is contained in:
2019-04-03 17:23:15 +03:00
parent c58735ea43
commit 9dc0a4ce06
31 changed files with 268 additions and 366 deletions

View File

@@ -75,7 +75,7 @@ typedef PlayerConfig = {
@:optional var protect:Float;
@:optional var life:Int;
@:optional var color:Color;
@:optional var human:Bool;
@:optional var human:Int;
}
typedef EagleConfig = {
@@ -97,6 +97,7 @@ typedef GamePreset = {
}
typedef LevelConfig = {
@:optional var index:Int;
var data:Array<BrickConfig>;
@:optional var name:String;
@:optional var points:Array<SpawnPoint>;

View File

@@ -55,7 +55,7 @@ class Game extends GameDispatcher {
public var teams(default, null):Map<TeamId, Team>;
public var config(default, null):Config;
public var engine(default, null):Engine;
public var loser(default, null):Null<TeamId>;
public var winner(default, null):Null<TeamId>;
public var state(default, null):GameState;
@@ -108,7 +108,7 @@ class Game extends GameDispatcher {
public function start(state:GameState):Void {
this.state = state;
this.loser = null;
this.winner = null;
var level:LevelConfig = levelBundle.get(type, config, state.level);
points = level.points != null ? level.points : config.points;
engine.map.setData(level.data);
@@ -162,6 +162,27 @@ class Game extends GameDispatcher {
onGameChange.emit(state);
}
private function checkComplete() {
var actives:Array<TeamId> = [];
for (team in teams.iterator()) {
if (team.isAlive) {
if (team.eagleId > 0) {
if (!cast(engine.entities[team.eagleId], Eagle).death) {
actives.push(team.id);
}
} else {
actives.push(team.id);
}
}
}
if (actives.length == 1) {
win(actives[0]);
}
if (actives.length == 0) {
win(null);
}
}
private function complete():Void {
for (team in teams.iterator()) {
for (player in team.players) {
@@ -190,7 +211,7 @@ class Game extends GameDispatcher {
case [EAGLE(eagle), DEATH(playerId)]:
if (eagle.death) {
getPlayer(playerId).state.score += eagle.score * (eagle.team == playerId.team ? 0 : 1);
lose(eagle.team);
checkComplete();
onGameChange.emit(state);
}
case [TANK(tank), HIT]:
@@ -233,7 +254,7 @@ class Game extends GameDispatcher {
team.spawner.push(player.id);
}
if (!team.isAlive) {
lose(team.id);
checkComplete();
}
if (tank.bonus) {
spawnBonus();
@@ -252,8 +273,8 @@ class Game extends GameDispatcher {
}
}
private function lose(teamId:TeamId):Void {
loser = teamId;
private function win(teamId:TeamId):Void {
winner = teamId;
complete();
}
@@ -263,7 +284,7 @@ class Game extends GameDispatcher {
public function next():Option<GameState> {
for (rule in config.game.complete) {
if (rule.team != null && rule.team == loser) {
if (rule.team != null && rule.team != winner) {
return Option.None;
}
}

View File

@@ -78,9 +78,9 @@ class GameState {
@:provide private var configBundle:IConfigBundle;
public function new(type:GameType, presetId:PresetId, level:Int = 0, state:GameState = null) {
public function new(type:GameType, presetId:PresetId = null, level:Int = 0, state:GameState = null) {
this.type = type;
this.presetId = presetId;
this.presetId = presetId != null ? presetId : config.presets[0].id;
this.level = level;
if (state == null) {
this.teams = new Map();
@@ -89,7 +89,7 @@ class GameState {
var teamState = new TeamState(team.id);
for (player in team.players) {
var playerId = new PlayerId(team.id, player.index);
var controller = player.human ? HUMAN(player.index) : NONE;
var controller = player.human > 0 ? HUMAN(player.human - 1) : NONE;
var playerState = new PlayerState(playerId, controller);
players[playerId] = playerState;
teamState.players[player.index] = playerState;