[client] add universal LevelFrame
This commit is contained in:
@@ -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>;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user