[common] game next function
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package ru.m.tankz.game;
|
||||
|
||||
import haxe.ds.Option;
|
||||
import ru.m.tankz.game.GameState.PlayerState;
|
||||
import ru.m.tankz.game.Game;
|
||||
|
||||
@@ -11,6 +12,9 @@ class ClassicGame extends Game {
|
||||
public static var HUMAN(default, never):TeamId = 'human';
|
||||
public static var BOT(default, never):TeamId = 'bot';
|
||||
|
||||
private static var HUMAN_LIFE(default, never):Int = 3;
|
||||
private static var BOT_LIFE(default, never):Int = 20;
|
||||
|
||||
public function new() {
|
||||
super(TYPE);
|
||||
}
|
||||
@@ -20,7 +24,7 @@ class ClassicGame extends Game {
|
||||
state.type = TYPE;
|
||||
state.level = level;
|
||||
state.teams[HUMAN] = {life: -1, players: new Map(), lose: false};
|
||||
state.teams[BOT] = {life: 20, players: new Map(), lose: false};
|
||||
state.teams[BOT] = {life: BOT_LIFE, players: new Map(), lose: false};
|
||||
for (i in 0...humans) {
|
||||
state.teams[HUMAN].players[i] = {
|
||||
index:i,
|
||||
@@ -32,7 +36,7 @@ class ClassicGame extends Game {
|
||||
type: 'human',
|
||||
index: i
|
||||
},
|
||||
life:3,
|
||||
life:HUMAN_LIFE,
|
||||
};
|
||||
}
|
||||
for (i in 0...humans*2+2) {
|
||||
@@ -51,4 +55,18 @@ class ClassicGame extends Game {
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
override public function next():Option<GameState> {
|
||||
if (!state.teams[HUMAN].lose) {
|
||||
state.level++;
|
||||
if (state.level >= config.levels) state.level = 0;
|
||||
state.teams[BOT].lose = false;
|
||||
state.teams[BOT].life = BOT_LIFE;
|
||||
for (ps in state.teams[HUMAN].players) {
|
||||
if (ps.life > 0) ps.life++;
|
||||
}
|
||||
return Option.Some(state);
|
||||
}
|
||||
return Option.None;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package ru.m.tankz.game;
|
||||
|
||||
import haxe.ds.Option;
|
||||
import haxe.Timer;
|
||||
import promhx.Deferred;
|
||||
import promhx.Stream;
|
||||
@@ -95,7 +96,9 @@ class Game implements EngineListener {
|
||||
|
||||
for (team in teams) {
|
||||
for (player in team.players) {
|
||||
spawners.get(team.id).push(player.id);
|
||||
if (trySpawn(player.id)) {
|
||||
spawners.get(team.id).push(player.id);
|
||||
}
|
||||
}
|
||||
var eaglePoint = spawners.get(team.id).getPoint('eagle');
|
||||
if (eaglePoint != null) {
|
||||
@@ -109,15 +112,23 @@ class Game implements EngineListener {
|
||||
}
|
||||
|
||||
private function spawn(task:SpawnTask):Void {
|
||||
var tank = buildTank(task.playerId, config.getTank(task.playerId.team, '0'), task.point);
|
||||
var player:Player = teams.get(task.playerId.team).players[task.playerId.index];
|
||||
engine.spawn(tank);
|
||||
player.tankId = tank.id;
|
||||
getPlayer(task.playerId).tankId = 0;
|
||||
if (trySpawn(task.playerId, true)) {
|
||||
var tank = buildTank(task.playerId, config.getTank(task.playerId.team, '0'), task.point);
|
||||
var player:Player = getPlayer(task.playerId);
|
||||
engine.spawn(tank);
|
||||
player.tankId = tank.id;
|
||||
} else if (!isTeamAlive(task.playerId.team)) {
|
||||
state.teams[task.playerId.team].lose = true;
|
||||
complete();
|
||||
}
|
||||
deferred.resolve(state);
|
||||
}
|
||||
|
||||
private function complete():Void {
|
||||
for (team in teams.iterator()) {
|
||||
for (player in team.players) {
|
||||
player.control.action(TankAction.STOP);
|
||||
player.control.dispose();
|
||||
}
|
||||
}
|
||||
@@ -157,28 +168,51 @@ class Game implements EngineListener {
|
||||
}
|
||||
}
|
||||
|
||||
private function calcTeamLife(ts:TeamState):Int {
|
||||
return Lambda.fold(ts.players, function(ps, t) return t + ps.life, ts.life);
|
||||
private function isTeamAlive(team:TeamId):Bool {
|
||||
var ts:TeamState = state.teams[team];
|
||||
var life:Int = Lambda.fold(ts.players, function(ps, t) return t + ps.life, ts.life);
|
||||
if (life > 0) {
|
||||
return true;
|
||||
} else {
|
||||
for (player in teams[team].players) {
|
||||
if (player.tankId > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (spawners[team].active) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private function trySpawn(player:PlayerId, spawn:Bool = false):Bool {
|
||||
var ts:TeamState = state.teams[player.team];
|
||||
var ps:PlayerState = ts.players[player.index];
|
||||
var result = false;
|
||||
if (ps.life > -1) {
|
||||
if (ps.life > 0) {
|
||||
if (spawn) ps.life--;
|
||||
result = true;
|
||||
}
|
||||
} else if (ts.life > -1) {
|
||||
if (ts.life > 0) {
|
||||
if (spawn) ts.life--;
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public function onDestroy(entity:EntityType):Void {
|
||||
switch (entity) {
|
||||
case EntityType.TANK(tank):
|
||||
var respawn:Bool = false;
|
||||
var teamState:TeamState = state.teams[tank.playerId.team];
|
||||
if (teamState.life > 0) {
|
||||
teamState.life--;
|
||||
respawn = true;
|
||||
} else {
|
||||
var playerState:PlayerState = teamState.players[tank.playerId.index];
|
||||
if (playerState.life > 0) {
|
||||
playerState.life--;
|
||||
respawn = true;
|
||||
}
|
||||
}
|
||||
getPlayer(tank.playerId).tankId = 0;
|
||||
var respawn:Bool = trySpawn(tank.playerId);
|
||||
if (respawn) {
|
||||
spawners.get(tank.playerId.team).push(tank.playerId);
|
||||
} else if (calcTeamLife(teamState) < 1) {
|
||||
}
|
||||
if (!isTeamAlive(tank.playerId.team)) {
|
||||
state.teams[tank.playerId.team].lose = true;
|
||||
complete();
|
||||
}
|
||||
@@ -197,6 +231,11 @@ class Game implements EngineListener {
|
||||
}
|
||||
|
||||
|
||||
public function next():Option<GameState> {
|
||||
return Option.None;
|
||||
}
|
||||
|
||||
|
||||
public function dispose():Void {
|
||||
engine.dispose();
|
||||
}
|
||||
|
||||
@@ -14,6 +14,8 @@ typedef SpawnTask = {
|
||||
|
||||
class Spawner {
|
||||
|
||||
public var active(get, never):Bool;
|
||||
|
||||
private var config:TeamConfig;
|
||||
private var runner:SpawnTask -> Void;
|
||||
private var queue:Array<SpawnTask>;
|
||||
@@ -80,4 +82,8 @@ class Spawner {
|
||||
runner(queue.shift());
|
||||
}
|
||||
}
|
||||
|
||||
private function get_active():Bool {
|
||||
return queue.length > 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user