[common] clock bonus freeze team instead tanks

This commit is contained in:
2019-06-14 12:47:20 +03:00
parent 7fa5a4e048
commit 4c3f1ca0fc
4 changed files with 45 additions and 9 deletions

View File

@@ -74,6 +74,9 @@ class GameRunner extends Game implements EngineListener {
private function spawn(task:SpawnTask):Void {
var player = getPlayer(task.playerId);
var tank = builder.buildTank(task.point, task.playerId, task.tankType, player.state.color, player.state.name);
if (getTeam(player.id.team).freezing) {
tank.freezing = true;
}
engine.spawn(tank);
gameEventSignal.emit(EventUtil.buildTankSpawn(tank));
if (player.config.protect > 0) {
@@ -101,6 +104,8 @@ class GameRunner extends Game implements EngineListener {
private function freezeTank(tank:Tank, duration:Float):Void {
tank.freezing = true;
tank.stop();
gameEventSignal.emit(STOP(TANK(tank.id)));
gameEventSignal.emit(CHANGE(TANK_FREEZE(tank.id, tank.freezing)));
engine.ticker.emit(function() {
tank.freezing = false;
@@ -108,6 +113,23 @@ class GameRunner extends Game implements EngineListener {
}, Std.int(duration * 1000));
}
private function freezeTeam(teamId:TeamId, duration:Float):Void {
getTeam(teamId).freezing = true;
for (tank in engine.iterTanks(teamTank(teamId))) {
tank.freezing = true;
tank.stop();
gameEventSignal.emit(STOP(TANK(tank.id)));
gameEventSignal.emit(CHANGE(TANK_FREEZE(tank.id, tank.freezing)));
}
engine.ticker.emit(function() {
getTeam(teamId).freezing = false;
for (tank in engine.iterTanks(teamTank(teamId))) {
tank.freezing = false;
gameEventSignal.emit(CHANGE(TANK_FREEZE(tank.id, tank.freezing)));
}
}, Std.int(duration * 1000));
}
private function checkComplete():Void {
var actives:Array<TeamId> = [];
for (team in teams.iterator()) {
@@ -121,12 +143,17 @@ class GameRunner extends Game implements EngineListener {
}
}
}
if (actives.length == 1) {
switch actives {
case [winner]: complete(winner);
case []: complete(null);
case _:
}
/*if (actives.length == 1) {
complete(actives[0]);
}
if (actives.length == 0) {
complete(null);
}
}*/
}
private function complete(winner:TeamId):Void {
@@ -244,6 +271,10 @@ class GameRunner extends Game implements EngineListener {
gameEventSignal.emit(EventUtil.buildBonusSpawn(bonus));
}
private inline function teamTank(team:TeamId):Tank->Bool {
return function(tank:Tank):Bool return team == tank.playerId.team;
}
private inline function alienTank(team:TeamId):Tank->Bool {
return function(tank:Tank):Bool return team != tank.playerId.team;
}
@@ -261,11 +292,14 @@ class GameRunner extends Game implements EngineListener {
case "helmet":
protectTank(tank, bonus.config.duration);
case "clock":
for (t in engine.iterTanks(alienTank(tank.playerId.team))) {
freezeTank(t, bonus.config.duration);
t.stop();
gameEventSignal.emit(STOP(TANK(t.id)));
for (team in teams) {
if (team.id != tank.playerId.team) {
freezeTeam(team.id, bonus.config.duration);
}
}
/*for (t in engine.iterTanks(alienTank(tank.playerId.team))) {
freezeTank(t, bonus.config.duration);
}*/
case "shovel":
// ToDo: protect eagle/area
var team:Team = teams[tank.playerId.team];

View File

@@ -1,8 +1,8 @@
package ru.m.tankz.game;
import ru.m.tankz.game.GameState.TeamState;
import ru.m.tankz.Type;
import ru.m.tankz.config.Config;
import ru.m.tankz.game.GameState;
import ru.m.tankz.Type;
class Team {
@@ -15,6 +15,7 @@ class Team {
public var eagleId(default, default):Int;
private var active(default, default):Int;
public var state(default, default):TeamState;
public var freezing(default, default):Bool;
public function new(config:TeamConfig, points:Array<SpawnPoint>, state:TeamState = null) {
this.id = config.id;