[common] saveState param in PlayerConfig
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
package ru.m.tankz;
|
||||
|
||||
import haxework.color.Color;
|
||||
|
||||
typedef GameType = String;
|
||||
|
||||
typedef TeamId = String;
|
||||
@@ -12,6 +14,15 @@ typedef TankType = String;
|
||||
|
||||
typedef BonusType = String;
|
||||
|
||||
typedef TankInfo = {
|
||||
var type:TankType;
|
||||
var skin:String;
|
||||
var hits:Int;
|
||||
var bonus:Bool;
|
||||
var color:Color;
|
||||
@:optional var name:String;
|
||||
}
|
||||
|
||||
abstract PlayerId(Array<Dynamic>) {
|
||||
public var team(get, never):TeamId;
|
||||
public var index(get, never):Int;
|
||||
|
||||
@@ -91,6 +91,7 @@ typedef PlayerConfig = {
|
||||
@:optional var life:Int;
|
||||
@:optional var color:Null<Int>;
|
||||
@:optional var control:String;
|
||||
@:optional var saveState:Bool;
|
||||
}
|
||||
|
||||
typedef EagleConfig = {
|
||||
|
||||
@@ -44,15 +44,14 @@ class EntityBuilder {
|
||||
return eagle;
|
||||
}
|
||||
|
||||
public function buildTank(point:EntityPoint, playerId:PlayerId, type:TankType, color:Null<Color>, name:String, bonusOff:Bool = false):Tank {
|
||||
public function buildTank(point:EntityPoint, playerId:PlayerId, info:TankInfo):Tank {
|
||||
var playerConfig = config.getPlayer(playerId);
|
||||
var tankConfig = config.getTank(type);
|
||||
var tankConfig = config.getTank(info.type);
|
||||
var tank = new Tank(++entityId, buildRect(point, tankConfig.width, tankConfig.height), playerId, tankConfig);
|
||||
tank.color = color == null || color.zero ? config.getColor(playerId) : color;
|
||||
tank.name = name;
|
||||
if (!bonusOff) {
|
||||
tank.bonus = Math.random() < playerConfig.bonus;
|
||||
}
|
||||
tank.color = info.color;
|
||||
tank.hits = info.hits;
|
||||
tank.name = info.name;
|
||||
tank.bonus = info.bonus;
|
||||
return tank;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package ru.m.tankz.game;
|
||||
|
||||
import haxework.color.Color;
|
||||
import ru.m.geom.Position;
|
||||
import ru.m.geom.Rectangle;
|
||||
import ru.m.tankz.config.Config;
|
||||
@@ -18,15 +17,6 @@ typedef Result = {
|
||||
var winner:TeamId;
|
||||
}
|
||||
|
||||
typedef TankInfo = {
|
||||
var type:TankType;
|
||||
var skin:String;
|
||||
var hits:Int;
|
||||
var bonus:Bool;
|
||||
var color:Color;
|
||||
@:optional var name:String;
|
||||
}
|
||||
|
||||
typedef BrickInfo = {
|
||||
var id:Int;
|
||||
var x:Int;
|
||||
|
||||
@@ -64,6 +64,21 @@ class GameRunner extends Game implements EngineListener {
|
||||
engine.dispose();
|
||||
}
|
||||
|
||||
public function newPlayerTank(playerId:PlayerId):TankInfo {
|
||||
var player = getPlayer(playerId);
|
||||
var spawn = player.config.tanks[Math.floor(Math.random() * player.config.tanks.length)];
|
||||
var tank = config.getTank(spawn.type);
|
||||
var bonus = Math.random() < player.config.bonus;
|
||||
return {
|
||||
type:tank.type,
|
||||
skin:tank.skin,
|
||||
hits:tank.hits,
|
||||
bonus:bonus,
|
||||
color:player.state.color,
|
||||
name:player.state.name,
|
||||
}
|
||||
}
|
||||
|
||||
override private function onStart(start:Start):Void {
|
||||
super.onStart(start);
|
||||
var mapData = level.data.map(function(index:BrickIndex) return config.getBrickByIndex(index));
|
||||
@@ -72,7 +87,7 @@ class GameRunner extends Game implements EngineListener {
|
||||
team.spawner.runner = spawn;
|
||||
for (player in team.players.iterator()) {
|
||||
if (team.tryRespawn(player.id)) {
|
||||
team.spawner.push(engine.ticker, player.id);
|
||||
team.spawner.push(engine.ticker, player.id, player.state.tank != null ? player.state.tank : newPlayerTank(player.id));
|
||||
}
|
||||
}
|
||||
if (team.config.eagle != null) {
|
||||
@@ -91,7 +106,7 @@ 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);
|
||||
var tank = builder.buildTank(task.point, task.playerId, task.tank);
|
||||
if (getTeam(player.id.team).freezing) {
|
||||
tank.freezing = true;
|
||||
}
|
||||
@@ -295,6 +310,9 @@ class GameRunner extends Game implements EngineListener {
|
||||
bullet.weapon.use();
|
||||
case CHANGE(BRICK(id, type)):
|
||||
engine.map.bricksById[id].config = config.getBrick(type);
|
||||
case CHANGE(TANK(id, type, hits, bonus)):
|
||||
var tank:Tank = engine.getEntity(id);
|
||||
getPlayer(tank.playerId).state.tank = tank.info;
|
||||
case DESTROY(EAGLE(id, shot)):
|
||||
var eagle:Eagle = engine.getEntity(id);
|
||||
eagle.death = true;
|
||||
@@ -322,7 +340,7 @@ class GameRunner extends Game implements EngineListener {
|
||||
}
|
||||
var respawn:Bool = team.tryRespawn(player.id);
|
||||
if (respawn) {
|
||||
team.spawner.push(engine.ticker, player.id);
|
||||
team.spawner.push(engine.ticker, player.id, newPlayerTank(player.id));
|
||||
}
|
||||
if (!team.isAlive) {
|
||||
checkComplete();
|
||||
|
||||
@@ -5,7 +5,6 @@ import ru.m.tankz.bundle.IConfigBundle;
|
||||
import ru.m.tankz.config.Config;
|
||||
import ru.m.tankz.control.Controller;
|
||||
import ru.m.tankz.control.PlayerControl;
|
||||
import ru.m.tankz.game.GameEvent;
|
||||
import ru.m.tankz.Type;
|
||||
|
||||
enum FragTarget {
|
||||
@@ -20,45 +19,21 @@ typedef Frag = {
|
||||
var score:Score;
|
||||
}
|
||||
|
||||
class State {
|
||||
public var score:Int;
|
||||
public var frags:Array<Frag>;
|
||||
|
||||
public function new() {
|
||||
score = 0;
|
||||
frags = [];
|
||||
}
|
||||
|
||||
public function add(state:State) {
|
||||
score += state.score;
|
||||
frags = frags.concat(state.frags);
|
||||
}
|
||||
|
||||
public function reset() {
|
||||
score = 0;
|
||||
frags = [];
|
||||
}
|
||||
}
|
||||
|
||||
class PlayerState extends State {
|
||||
class PlayerState {
|
||||
public var id:PlayerId;
|
||||
public var tank:TankInfo;
|
||||
public var color:Color;
|
||||
public var name:String;
|
||||
public var life:Int;
|
||||
public var total:State;
|
||||
public var score:Int;
|
||||
public var frags:Array<Frag>;
|
||||
|
||||
public function new(id:PlayerId) {
|
||||
super();
|
||||
this.id = id;
|
||||
this.tank = null;
|
||||
this.life = 0;
|
||||
this.total = new State();
|
||||
}
|
||||
|
||||
override public function reset() {
|
||||
total.add(this);
|
||||
super.reset();
|
||||
this.score = 0;
|
||||
this.frags = [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,6 +74,7 @@ class GameState {
|
||||
for (player in team.players) {
|
||||
var playerId = new PlayerId(team.id, player.index);
|
||||
var playerState = new PlayerState(playerId);
|
||||
playerState.life = config.getPlayer(playerId).life;
|
||||
players[playerId] = playerState;
|
||||
teamState.players[player.index] = playerState;
|
||||
}
|
||||
@@ -169,7 +145,14 @@ class GameState {
|
||||
return (playerState == null || playerState.color.zero) ? config.getColor(id) : playerState.color;
|
||||
}
|
||||
|
||||
public function clean():GameState {
|
||||
return new GameState(type, presetId, null, controls);
|
||||
public function clean():Void {
|
||||
for (p in players) {
|
||||
p.frags = [];
|
||||
var playerConfig = config.getPlayer(p.id);
|
||||
if (!playerConfig.saveState) {
|
||||
p.tank = null;
|
||||
p.life = playerConfig.life;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,6 @@ class Player {
|
||||
this.config = config;
|
||||
this.id = new PlayerId(teamId, config.index);
|
||||
this.state = state == null ? new PlayerState(id) : state;
|
||||
this.state.reset();
|
||||
this.state.life = Math.isNaN(config.life) ? 0 : config.life;
|
||||
this.tankId = -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package ru.m.tankz.game;
|
||||
|
||||
import ru.m.tankz.engine.ITicker;
|
||||
import ru.m.tankz.config.Config;
|
||||
import ru.m.tankz.engine.ITicker;
|
||||
import ru.m.tankz.Type;
|
||||
|
||||
typedef SpawnTask = {
|
||||
var point:SpawnPoint;
|
||||
var playerId:PlayerId;
|
||||
var tankType:TankType;
|
||||
var tank:TankInfo;
|
||||
}
|
||||
|
||||
class Spawner {
|
||||
@@ -51,16 +51,7 @@ class Spawner {
|
||||
return null;
|
||||
}
|
||||
|
||||
private function getPlayerTank(playerId:PlayerId):TankType {
|
||||
for (player in config.players) if (player.index == playerId.index) {
|
||||
var spawns:Array<TankSpawn> = player.tanks;
|
||||
var spawn:TankSpawn = spawns[Math.floor(Math.random() * spawns.length)];
|
||||
return spawn.type;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function push(ticker:ITicker, playerId:PlayerId):Void {
|
||||
public function push(ticker:ITicker, playerId:PlayerId, tank:TankInfo):Void {
|
||||
var point:SpawnPoint = null;
|
||||
if (indexedPoints.exists(playerId.index)) {
|
||||
point = indexedPoints.get(playerId.index);
|
||||
@@ -69,7 +60,7 @@ class Spawner {
|
||||
if (index >= anyPoints.length) index = 0;
|
||||
}
|
||||
if (point != null) {
|
||||
queue.push({playerId:playerId, point:point, tankType:getPlayerTank(playerId)});
|
||||
queue.push({playerId:playerId, point:point, tank:tank});
|
||||
if (config.spawnInterval == null) {
|
||||
ticker.emit(spawn, 500);
|
||||
} else {
|
||||
|
||||
@@ -25,6 +25,7 @@ player:
|
||||
protect: 5
|
||||
tanks:
|
||||
- {type: human0, rate: 1}
|
||||
saveState: true
|
||||
bot: &bot
|
||||
color: 0xFFFFFF
|
||||
bonus: 0.25
|
||||
|
||||
Reference in New Issue
Block a user