[common] saveState param in PlayerConfig
This commit is contained in:
@@ -61,7 +61,7 @@ class NetworkManager {
|
|||||||
updateState(OFFLINE);
|
updateState(OFFLINE);
|
||||||
connection.handler.connect(onConnectionEvent);
|
connection.handler.connect(onConnectionEvent);
|
||||||
connection.receiveHandler.connect(onResponse);
|
connection.receiveHandler.connect(onResponse);
|
||||||
connect();
|
//connect(); // ToDo: disable network
|
||||||
}
|
}
|
||||||
|
|
||||||
private function updateState(value:ConnectionState):Void {
|
private function updateState(value:ConnectionState):Void {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ views:
|
|||||||
style: line
|
style: line
|
||||||
geometry.width: 250
|
geometry.width: 250
|
||||||
geometry.margin: [0, 10]
|
geometry.margin: [0, 10]
|
||||||
|
visible: false
|
||||||
- $type: haxework.view.form.ButtonView
|
- $type: haxework.view.form.ButtonView
|
||||||
style: button.menu
|
style: button.menu
|
||||||
+onPress: ~switcher.change('record')
|
+onPress: ~switcher.change('record')
|
||||||
@@ -39,6 +40,7 @@ views:
|
|||||||
style: button.menu
|
style: button.menu
|
||||||
+onPress: ~startNetwork()
|
+onPress: ~startNetwork()
|
||||||
text: Network
|
text: Network
|
||||||
|
visible: false
|
||||||
- $type: haxework.view.form.LabelView
|
- $type: haxework.view.form.LabelView
|
||||||
geometry.hAlign: right
|
geometry.hAlign: right
|
||||||
geometry.vAlign: top
|
geometry.vAlign: top
|
||||||
|
|||||||
@@ -47,7 +47,8 @@ using ru.m.tankz.view.ViewUtil;
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function restart():Void {
|
private function restart():Void {
|
||||||
frames.change(GameFrame.ID, LOCAL({state: result.state.clean(), level: result.level}));
|
result.state.clean();
|
||||||
|
frames.change(GameFrame.ID, LOCAL({state: result.state, level: result.level}));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function next():Void {
|
private function next():Void {
|
||||||
@@ -56,7 +57,8 @@ using ru.m.tankz.view.ViewUtil;
|
|||||||
var level = pack.data[result.level.id + 1];
|
var level = pack.data[result.level.id + 1];
|
||||||
var progress = gameStorage.get(pack.id);
|
var progress = gameStorage.get(pack.id);
|
||||||
if (progress.isPresetAvailable(level.id, result.state.presetId)) {
|
if (progress.isPresetAvailable(level.id, result.state.presetId)) {
|
||||||
frames.change(GameFrame.ID, LOCAL({state: result.state.clean(), level: level}));
|
result.state.clean();
|
||||||
|
frames.change(GameFrame.ID, LOCAL({state: result.state, level: level}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package ru.m.tankz.view.common;
|
package ru.m.tankz.view.common;
|
||||||
|
|
||||||
import haxework.view.ImageView;
|
import haxework.view.ImageView;
|
||||||
import ru.m.tankz.game.GameEvent;
|
|
||||||
import ru.m.tankz.render.RenderUtil;
|
import ru.m.tankz.render.RenderUtil;
|
||||||
|
import ru.m.tankz.Type.TankInfo;
|
||||||
|
|
||||||
class TankView extends ImageView {
|
class TankView extends ImageView {
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package ru.m.tankz.view.game;
|
|||||||
|
|
||||||
import haxework.view.form.LabelView;
|
import haxework.view.form.LabelView;
|
||||||
import haxework.view.group.VGroupView;
|
import haxework.view.group.VGroupView;
|
||||||
import ru.m.tankz.game.GameEvent.TankInfo;
|
|
||||||
import ru.m.tankz.game.GameState;
|
import ru.m.tankz.game.GameState;
|
||||||
import ru.m.tankz.Type;
|
import ru.m.tankz.Type;
|
||||||
import ru.m.tankz.view.common.TankView;
|
import ru.m.tankz.view.common.TankView;
|
||||||
|
|||||||
@@ -21,7 +21,8 @@ import ru.m.tankz.view.common.TankView;
|
|||||||
private function set_data(value:PlayerState):PlayerState {
|
private function set_data(value:PlayerState):PlayerState {
|
||||||
data = value;
|
data = value;
|
||||||
titleView.text = data.name != null ? '${data.id.format()} * ${data.name}' : data.id.format();
|
titleView.text = data.name != null ? '${data.id.format()} * ${data.name}' : data.id.format();
|
||||||
scoreView.text = '${data.score}$';
|
var additionalScore = Lambda.fold(data.frags, function(frag:Frag, score:Int) return score + frag.score, 0);
|
||||||
|
scoreView.text = '${data.score}$ (+${additionalScore}$)';
|
||||||
tankView.color = value.color;
|
tankView.color = value.color;
|
||||||
fragsView.data = data.frags;
|
fragsView.data = data.frags;
|
||||||
tankView.tank = value.tank;
|
tankView.tank = value.tank;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package ru.m.tankz;
|
package ru.m.tankz;
|
||||||
|
|
||||||
|
import haxework.color.Color;
|
||||||
|
|
||||||
typedef GameType = String;
|
typedef GameType = String;
|
||||||
|
|
||||||
typedef TeamId = String;
|
typedef TeamId = String;
|
||||||
@@ -12,6 +14,15 @@ typedef TankType = String;
|
|||||||
|
|
||||||
typedef BonusType = 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>) {
|
abstract PlayerId(Array<Dynamic>) {
|
||||||
public var team(get, never):TeamId;
|
public var team(get, never):TeamId;
|
||||||
public var index(get, never):Int;
|
public var index(get, never):Int;
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ typedef PlayerConfig = {
|
|||||||
@:optional var life:Int;
|
@:optional var life:Int;
|
||||||
@:optional var color:Null<Int>;
|
@:optional var color:Null<Int>;
|
||||||
@:optional var control:String;
|
@:optional var control:String;
|
||||||
|
@:optional var saveState:Bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef EagleConfig = {
|
typedef EagleConfig = {
|
||||||
|
|||||||
@@ -44,15 +44,14 @@ class EntityBuilder {
|
|||||||
return eagle;
|
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 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);
|
var tank = new Tank(++entityId, buildRect(point, tankConfig.width, tankConfig.height), playerId, tankConfig);
|
||||||
tank.color = color == null || color.zero ? config.getColor(playerId) : color;
|
tank.color = info.color;
|
||||||
tank.name = name;
|
tank.hits = info.hits;
|
||||||
if (!bonusOff) {
|
tank.name = info.name;
|
||||||
tank.bonus = Math.random() < playerConfig.bonus;
|
tank.bonus = info.bonus;
|
||||||
}
|
|
||||||
return tank;
|
return tank;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package ru.m.tankz.game;
|
package ru.m.tankz.game;
|
||||||
|
|
||||||
import haxework.color.Color;
|
|
||||||
import ru.m.geom.Position;
|
import ru.m.geom.Position;
|
||||||
import ru.m.geom.Rectangle;
|
import ru.m.geom.Rectangle;
|
||||||
import ru.m.tankz.config.Config;
|
import ru.m.tankz.config.Config;
|
||||||
@@ -18,15 +17,6 @@ typedef Result = {
|
|||||||
var winner:TeamId;
|
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 = {
|
typedef BrickInfo = {
|
||||||
var id:Int;
|
var id:Int;
|
||||||
var x:Int;
|
var x:Int;
|
||||||
|
|||||||
@@ -64,6 +64,21 @@ class GameRunner extends Game implements EngineListener {
|
|||||||
engine.dispose();
|
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 {
|
override private function onStart(start:Start):Void {
|
||||||
super.onStart(start);
|
super.onStart(start);
|
||||||
var mapData = level.data.map(function(index:BrickIndex) return config.getBrickByIndex(index));
|
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;
|
team.spawner.runner = spawn;
|
||||||
for (player in team.players.iterator()) {
|
for (player in team.players.iterator()) {
|
||||||
if (team.tryRespawn(player.id)) {
|
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) {
|
if (team.config.eagle != null) {
|
||||||
@@ -91,7 +106,7 @@ class GameRunner extends Game implements EngineListener {
|
|||||||
|
|
||||||
private function spawn(task:SpawnTask):Void {
|
private function spawn(task:SpawnTask):Void {
|
||||||
var player = getPlayer(task.playerId);
|
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) {
|
if (getTeam(player.id.team).freezing) {
|
||||||
tank.freezing = true;
|
tank.freezing = true;
|
||||||
}
|
}
|
||||||
@@ -295,6 +310,9 @@ class GameRunner extends Game implements EngineListener {
|
|||||||
bullet.weapon.use();
|
bullet.weapon.use();
|
||||||
case CHANGE(BRICK(id, type)):
|
case CHANGE(BRICK(id, type)):
|
||||||
engine.map.bricksById[id].config = config.getBrick(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)):
|
case DESTROY(EAGLE(id, shot)):
|
||||||
var eagle:Eagle = engine.getEntity(id);
|
var eagle:Eagle = engine.getEntity(id);
|
||||||
eagle.death = true;
|
eagle.death = true;
|
||||||
@@ -322,7 +340,7 @@ class GameRunner extends Game implements EngineListener {
|
|||||||
}
|
}
|
||||||
var respawn:Bool = team.tryRespawn(player.id);
|
var respawn:Bool = team.tryRespawn(player.id);
|
||||||
if (respawn) {
|
if (respawn) {
|
||||||
team.spawner.push(engine.ticker, player.id);
|
team.spawner.push(engine.ticker, player.id, newPlayerTank(player.id));
|
||||||
}
|
}
|
||||||
if (!team.isAlive) {
|
if (!team.isAlive) {
|
||||||
checkComplete();
|
checkComplete();
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import ru.m.tankz.bundle.IConfigBundle;
|
|||||||
import ru.m.tankz.config.Config;
|
import ru.m.tankz.config.Config;
|
||||||
import ru.m.tankz.control.Controller;
|
import ru.m.tankz.control.Controller;
|
||||||
import ru.m.tankz.control.PlayerControl;
|
import ru.m.tankz.control.PlayerControl;
|
||||||
import ru.m.tankz.game.GameEvent;
|
|
||||||
import ru.m.tankz.Type;
|
import ru.m.tankz.Type;
|
||||||
|
|
||||||
enum FragTarget {
|
enum FragTarget {
|
||||||
@@ -20,45 +19,21 @@ typedef Frag = {
|
|||||||
var score:Score;
|
var score:Score;
|
||||||
}
|
}
|
||||||
|
|
||||||
class State {
|
class PlayerState {
|
||||||
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 {
|
|
||||||
public var id:PlayerId;
|
public var id:PlayerId;
|
||||||
public var tank:TankInfo;
|
public var tank:TankInfo;
|
||||||
public var color:Color;
|
public var color:Color;
|
||||||
public var name:String;
|
public var name:String;
|
||||||
public var life:Int;
|
public var life:Int;
|
||||||
public var total:State;
|
public var score:Int;
|
||||||
|
public var frags:Array<Frag>;
|
||||||
|
|
||||||
public function new(id:PlayerId) {
|
public function new(id:PlayerId) {
|
||||||
super();
|
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.tank = null;
|
this.tank = null;
|
||||||
this.life = 0;
|
this.life = 0;
|
||||||
this.total = new State();
|
this.score = 0;
|
||||||
}
|
this.frags = [];
|
||||||
|
|
||||||
override public function reset() {
|
|
||||||
total.add(this);
|
|
||||||
super.reset();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,6 +74,7 @@ class GameState {
|
|||||||
for (player in team.players) {
|
for (player in team.players) {
|
||||||
var playerId = new PlayerId(team.id, player.index);
|
var playerId = new PlayerId(team.id, player.index);
|
||||||
var playerState = new PlayerState(playerId);
|
var playerState = new PlayerState(playerId);
|
||||||
|
playerState.life = config.getPlayer(playerId).life;
|
||||||
players[playerId] = playerState;
|
players[playerId] = playerState;
|
||||||
teamState.players[player.index] = playerState;
|
teamState.players[player.index] = playerState;
|
||||||
}
|
}
|
||||||
@@ -169,7 +145,14 @@ class GameState {
|
|||||||
return (playerState == null || playerState.color.zero) ? config.getColor(id) : playerState.color;
|
return (playerState == null || playerState.color.zero) ? config.getColor(id) : playerState.color;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function clean():GameState {
|
public function clean():Void {
|
||||||
return new GameState(type, presetId, null, controls);
|
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.config = config;
|
||||||
this.id = new PlayerId(teamId, config.index);
|
this.id = new PlayerId(teamId, config.index);
|
||||||
this.state = state == null ? new PlayerState(id) : state;
|
this.state = state == null ? new PlayerState(id) : state;
|
||||||
this.state.reset();
|
|
||||||
this.state.life = Math.isNaN(config.life) ? 0 : config.life;
|
|
||||||
this.tankId = -1;
|
this.tankId = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package ru.m.tankz.game;
|
package ru.m.tankz.game;
|
||||||
|
|
||||||
import ru.m.tankz.engine.ITicker;
|
|
||||||
import ru.m.tankz.config.Config;
|
import ru.m.tankz.config.Config;
|
||||||
|
import ru.m.tankz.engine.ITicker;
|
||||||
import ru.m.tankz.Type;
|
import ru.m.tankz.Type;
|
||||||
|
|
||||||
typedef SpawnTask = {
|
typedef SpawnTask = {
|
||||||
var point:SpawnPoint;
|
var point:SpawnPoint;
|
||||||
var playerId:PlayerId;
|
var playerId:PlayerId;
|
||||||
var tankType:TankType;
|
var tank:TankInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
class Spawner {
|
class Spawner {
|
||||||
@@ -51,16 +51,7 @@ class Spawner {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getPlayerTank(playerId:PlayerId):TankType {
|
public function push(ticker:ITicker, playerId:PlayerId, tank:TankInfo):Void {
|
||||||
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 {
|
|
||||||
var point:SpawnPoint = null;
|
var point:SpawnPoint = null;
|
||||||
if (indexedPoints.exists(playerId.index)) {
|
if (indexedPoints.exists(playerId.index)) {
|
||||||
point = indexedPoints.get(playerId.index);
|
point = indexedPoints.get(playerId.index);
|
||||||
@@ -69,7 +60,7 @@ class Spawner {
|
|||||||
if (index >= anyPoints.length) index = 0;
|
if (index >= anyPoints.length) index = 0;
|
||||||
}
|
}
|
||||||
if (point != null) {
|
if (point != null) {
|
||||||
queue.push({playerId:playerId, point:point, tankType:getPlayerTank(playerId)});
|
queue.push({playerId:playerId, point:point, tank:tank});
|
||||||
if (config.spawnInterval == null) {
|
if (config.spawnInterval == null) {
|
||||||
ticker.emit(spawn, 500);
|
ticker.emit(spawn, 500);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ player:
|
|||||||
protect: 5
|
protect: 5
|
||||||
tanks:
|
tanks:
|
||||||
- {type: human0, rate: 1}
|
- {type: human0, rate: 1}
|
||||||
|
saveState: true
|
||||||
bot: &bot
|
bot: &bot
|
||||||
color: 0xFFFFFF
|
color: 0xFFFFFF
|
||||||
bonus: 0.25
|
bonus: 0.25
|
||||||
|
|||||||
Reference in New Issue
Block a user