[client] add GameInit

This commit is contained in:
2019-06-24 18:04:01 +03:00
parent 91dd84a437
commit d0ebf05f1c
22 changed files with 127 additions and 104 deletions

View File

@@ -6,7 +6,5 @@
* map packs (create in editor, import in game, save imported in local storage) * map packs (create in editor, import in game, save imported in local storage)
* update bots * update bots
* improve bonuses system * improve bonuses system
* gamepad support
* screen gamepad on mobiles * screen gamepad on mobiles
* resize render on mobiles * resize render on mobiles
* [bug] game progress broken

View File

@@ -0,0 +1,11 @@
package ru.m.tankz.game;
import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.record.GameRecord;
import ru.m.tankz.network.NetworkManager;
enum GameInit {
LOCAL(start:Start);
NETWORK(network:NetworkManager);
RECORD(record:GameRecord);
}

View File

@@ -1,32 +1,13 @@
package ru.m.tankz.local; package ru.m.tankz.local;
import ru.m.tankz.config.Config;
import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameRunner; import ru.m.tankz.game.GameRunner;
import ru.m.tankz.game.GameState;
import ru.m.tankz.game.record.GameRecorder;
import ru.m.tankz.local.LocalControlFactory; import ru.m.tankz.local.LocalControlFactory;
import ru.m.tankz.storage.RecordStorage;
class LocalGame extends GameRunner { class LocalGame extends GameRunner {
@:provide var recordStorage:RecordStorage;
private var recorder:GameRecorder;
public function new(state:GameState, level:LevelConfig) { public function new(start:Start) {
super(state, level); super(start);
controlFactory = new LocalControlFactory(); controlFactory = new LocalControlFactory();
recorder = new GameRecorder();
connect(recorder);
}
override public function onGameEvent(event:GameEvent):Void {
super.onGameEvent(event);
switch event {
case GameEvent.COMPLETE(_, _):
disconnect(recorder);
recorder.onGameEvent(event); //ToDo:
recordStorage.save(recorder.record);
case _:
}
} }
} }

View File

@@ -3,7 +3,6 @@ package ru.m.tankz.network;
import haxe.Unserializer; import haxe.Unserializer;
import ru.m.tankz.game.Game; import ru.m.tankz.game.Game;
import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkControlFactory; import ru.m.tankz.network.NetworkControlFactory;
import ru.m.tankz.network.NetworkManager; import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.pack.GameEventResponse; import ru.m.tankz.proto.pack.GameEventResponse;
@@ -14,7 +13,7 @@ class NetworkGame extends Game {
private var network:NetworkManager; private var network:NetworkManager;
public function new(network:NetworkManager) { public function new(network:NetworkManager) {
super(new GameState(network.room.game.type, 0), null); super(network.room.game.type);
this.network = network; this.network = network;
this.controlFactory = new NetworkControlFactory(); this.controlFactory = new NetworkControlFactory();
network.gameEventSignal.connect(onGameEventProto); network.gameEventSignal.connect(onGameEventProto);
@@ -38,12 +37,12 @@ class NetworkGame extends Game {
} }
} }
override public function start():Void { override private function onStart(start:Start):Void {
var slot:RoomSlotProto = Lambda.find(network.room.slots, function(slot:RoomSlotProto) return slot.hasUser() && slot.user.uuid == network.user.uuid); var slot:RoomSlotProto = Lambda.find(network.room.slots, function(slot:RoomSlotProto) return slot.hasUser() && slot.user.uuid == network.user.uuid);
if (slot != null) { if (slot != null) {
state.controls.push({playerId: [slot.slot.team, slot.slot.index], control: "human-0"}); start.state.controls.push({playerId: [slot.slot.team, slot.slot.index], control: "human-0"});
} }
super.start(); super.onStart(start);
} }
override public function dispose():Void { override public function dispose():Void {

View File

@@ -115,10 +115,10 @@ class Render extends SpriteView implements IRender {
public function onGameEvent(event:GameEvent):Void { public function onGameEvent(event:GameEvent):Void {
switch event { switch event {
case START(_, level): case START(start):
gridSize = level.size; gridSize = start.level.size;
content.addEventListener(Event.ENTER_FRAME, onEnterFrame); content.addEventListener(Event.ENTER_FRAME, onEnterFrame);
case COMPLETE(_, _): case COMPLETE(_):
content.removeEventListener(Event.ENTER_FRAME, onEnterFrame); content.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
case SPAWN(BRICK(bricks)): case SPAWN(BRICK(bricks)):
drawBackground(); drawBackground();

View File

@@ -5,10 +5,12 @@ import haxework.view.VGroupView;
import ru.m.control.DeviceType; import ru.m.control.DeviceType;
import ru.m.control.IControlBus; import ru.m.control.IControlBus;
import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.IGame; import ru.m.tankz.game.IGame;
import ru.m.tankz.game.record.GamePlayer;
import ru.m.tankz.game.record.GameRecord; import ru.m.tankz.game.record.GameRecord;
import ru.m.tankz.network.NetworkManager; import ru.m.tankz.local.LocalGame;
import ru.m.tankz.network.NetworkGame;
import ru.m.tankz.sound.SoundManager; import ru.m.tankz.sound.SoundManager;
import ru.m.tankz.storage.GameStorage; import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.storage.SettingsStorage; import ru.m.tankz.storage.SettingsStorage;
@@ -24,17 +26,18 @@ import ru.m.tankz.view.GamepadView;
@:view("game") private var gameView(default, null):GameView; @:view("game") private var gameView(default, null):GameView;
@:view private var gamepad(default, null):GamepadView; @:view private var gamepad(default, null):GamepadView;
@:provide var network:NetworkManager;
@:provide var soundManager:SoundManager; @:provide var soundManager:SoundManager;
@:provide var state:GameState;
@:provide var record:GameRecord;
@:provide var switcher:FrameSwitcher; @:provide var switcher:FrameSwitcher;
@:provide static var gameStorage:GameStorage; @:provide static var gameStorage:GameStorage;
@:provide static var settings:SettingsStorage; @:provide static var settings:SettingsStorage;
@:provide var game:IGame; @:provide var gameInit:GameInit;
//@:provide var result:Result;
@:provide static var bus:IControlBus; @:provide static var bus:IControlBus;
private var game:IGame;
private var recorder:GameRecord;
public function init():Void { public function init():Void {
bus.connect(gamepad); bus.connect(gamepad);
} }
@@ -52,6 +55,12 @@ import ru.m.tankz.view.GamepadView;
} }
} }
} }
game = switch gameInit {
case LOCAL(start): new LocalGame(start);
case NETWORK(network): new NetworkGame(network);
case RECORD(record): new GamePlayer(record);
case _: null;
}
gameView.type = game.type; gameView.type = game.type;
soundManager.config = game.config; soundManager.config = game.config;
gameView.render.config = game.config; gameView.render.config = game.config;
@@ -74,9 +83,9 @@ import ru.m.tankz.view.GamepadView;
public function onGameEvent(event:GameEvent):Void { public function onGameEvent(event:GameEvent):Void {
switch event { switch event {
case COMPLETE(state, winner): case COMPLETE(result):
this.state = state; //this.result = result;
updateProgress(game, winner); updateProgress(game, result.winner);
stop(); stop();
switcher.change(ResultFrame.ID); switcher.change(ResultFrame.ID);
case _: case _:

View File

@@ -7,9 +7,8 @@ import haxework.view.LabelView;
import haxework.view.VGroupView; import haxework.view.VGroupView;
import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.bundle.ILevelBundle;
import ru.m.tankz.config.Config; import ru.m.tankz.config.Config;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.game.IGame;
import ru.m.tankz.local.LocalGame;
import ru.m.tankz.storage.GameStorage; import ru.m.tankz.storage.GameStorage;
import ru.m.tankz.Type; import ru.m.tankz.Type;
import ru.m.tankz.view.popup.LevelPopup; import ru.m.tankz.view.popup.LevelPopup;
@@ -20,8 +19,7 @@ import ru.m.tankz.view.popup.LevelPopup;
@:view var header:LabelView; @:view var header:LabelView;
@:view var levels:DataView<LevelConfig, ButtonView>; @:view var levels:DataView<LevelConfig, ButtonView>;
@:provide var state:GameState; @:provide var gameInit:GameInit;
@:provide var game:IGame;
@:provide var switcher:FrameSwitcher; @:provide var switcher:FrameSwitcher;
@:provide var levelBundle:ILevelBundle; @:provide var levelBundle:ILevelBundle;
@:provide var storage:GameStorage; @:provide var storage:GameStorage;
@@ -30,15 +28,27 @@ import ru.m.tankz.view.popup.LevelPopup;
private var levelPopup:LevelPopup; private var levelPopup:LevelPopup;
public function onShow():Void { public function onShow():Void {
var state = getState();
header.text = state.type; header.text = state.type;
pack = levelBundle.get(new PackId(state.type)); pack = levelBundle.get(new PackId(state.type));
levels.data = pack.data; levels.data = pack.data;
} }
private function getState():GameState {
return switch gameInit {
case LOCAL(start): start.state;
case _: null;
}
}
private function start(level:LevelConfig, preset:GamePreset, control:ControlPreset):Void { private function start(level:LevelConfig, preset:GamePreset, control:ControlPreset):Void {
state.presetId = preset.id; switch gameInit {
state.controls = control.values; case LOCAL(start):
game = new LocalGame(state, level); start.state.presetId = preset.id;
start.state.controls = control.values;
start.level = level;
case _:
}
switcher.change(GameFrame.ID); switcher.change(GameFrame.ID);
} }
@@ -46,7 +56,7 @@ import ru.m.tankz.view.popup.LevelPopup;
var progress = storage.get(pack.id); var progress = storage.get(pack.id);
var result = new ButtonView(); var result = new ButtonView();
result.skinId = "button.level"; result.skinId = "button.level";
var presetsLine = [for (p in state.config.presets) progress.isPresetCompleted(level.id, p.id) ? '*' : '_'].join(''); var presetsLine = [for (p in getState().config.presets) progress.isPresetCompleted(level.id, p.id) ? '*' : '_'].join('');
result.text = '${level.id}\n${presetsLine}'; result.text = '${level.id}\n${presetsLine}';
result.disabled = !progress.isLevelAvailable(level.id); result.disabled = !progress.isLevelAvailable(level.id);
return result; return result;
@@ -59,6 +69,7 @@ import ru.m.tankz.view.popup.LevelPopup;
if (levelPopup == null) { if (levelPopup == null) {
levelPopup = new LevelPopup(); levelPopup = new LevelPopup();
} }
var state = getState();
levelPopup.setData( levelPopup.setData(
level, level,
state.config.presets, state.config.presets,

View File

@@ -14,7 +14,6 @@ import ru.m.tankz.storage.RecordStorage;
@:provide var recordStorage:RecordStorage; @:provide var recordStorage:RecordStorage;
@:provide var switcher:FrameSwitcher; @:provide var switcher:FrameSwitcher;
@:provide var record:GameRecord;
public function onShow():Void { public function onShow():Void {
var data = Lambda.array(recordStorage); var data = Lambda.array(recordStorage);

View File

@@ -4,7 +4,6 @@ import haxework.view.DataView;
import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameSwitcher;
import haxework.view.LabelView; import haxework.view.LabelView;
import haxework.view.VGroupView; import haxework.view.VGroupView;
import ru.m.tankz.game.GameRunner;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.game.IGame; import ru.m.tankz.game.IGame;
import ru.m.tankz.view.common.LifeView; import ru.m.tankz.view.common.LifeView;
@@ -16,23 +15,23 @@ import ru.m.tankz.view.common.LifeView;
@:view("level") var levelLabel:LabelView; @:view("level") var levelLabel:LabelView;
@:provide var frames:FrameSwitcher; @:provide var frames:FrameSwitcher;
@:provide var state:GameState;
@:provide var game:IGame; @:provide var game:IGame;
private function playerViewFactory(index:Int, player:PlayerState) { private function playerViewFactory(index:Int, player:PlayerState) {
var view = new LifeView(); var view = new LifeView();
var playerConfig = state.config.getPlayer(player.id); // ToDo:
/*var playerConfig = state.config.getPlayer(player.id);
var tankType = playerConfig.tanks[0].type; var tankType = playerConfig.tanks[0].type;
var tankConfig = state.config.getTank(tankType); var tankConfig = state.config.getTank(tankType);
view.tank = tankConfig == null ? 'ba' : tankConfig.skin; view.tank = tankConfig == null ? 'ba' : tankConfig.skin;
view.color = state.getPlayerColor(player.id); view.color = state.getPlayerColor(player.id);
view.life = player.frags; view.life = player.frags;
view.score = player.score; view.score = player.score;*/
return view; return view;
} }
public function onShow() { public function onShow() {
resultView.data = Lambda.array(state.players); //resultView.data = Lambda.array(state.players);
//levelLabel.text = 'Level ${state.levelId}'; // ToDo: level? //levelLabel.text = 'Level ${state.levelId}'; // ToDo: level?
} }

View File

@@ -2,11 +2,12 @@ package ru.m.tankz.view;
import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameSwitcher;
import haxework.view.VGroupView; import haxework.view.VGroupView;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.GameState; import ru.m.tankz.game.GameState;
import ru.m.tankz.network.NetworkManager; import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.Type.GameType; import ru.m.tankz.Type.GameType;
import ru.m.tankz.view.network.RoomListFrame;
import ru.m.tankz.view.network.RoomFrame; import ru.m.tankz.view.network.RoomFrame;
import ru.m.tankz.view.network.RoomListFrame;
import ru.m.tankz.view.popup.FontPopup; import ru.m.tankz.view.popup.FontPopup;
import ru.m.tankz.view.popup.LoginPopup; import ru.m.tankz.view.popup.LoginPopup;
@@ -14,14 +15,14 @@ import ru.m.tankz.view.popup.LoginPopup;
public static var ID(default, never):String = "start"; public static var ID(default, never):String = "start";
@:provide var state:GameState; @:provide var gameInit:GameInit;
@:provide var switcher:FrameSwitcher; @:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager; @:provide var network:NetworkManager;
private var fontPopup:FontPopup; private var fontPopup:FontPopup;
private function startGame(type:GameType):Void { private function startGame(type:GameType):Void {
state = new GameState(type); gameInit = LOCAL({state: new GameState(type), level: null});
switcher.change(LevelFrame.ID); switcher.change(LevelFrame.ID);
} }

View File

@@ -1,11 +1,10 @@
package ru.m.tankz.view.common; package ru.m.tankz.view.common;
import ru.m.tankz.game.record.GamePlayer;
import ru.m.tankz.game.IGame;
import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameSwitcher;
import haxework.view.HGroupView; import haxework.view.HGroupView;
import haxework.view.LabelView; import haxework.view.LabelView;
import haxework.view.list.ListView; import haxework.view.list.ListView;
import ru.m.tankz.game.GameInit;
import ru.m.tankz.game.record.GameRecord; import ru.m.tankz.game.record.GameRecord;
import ru.m.tankz.storage.RecordStorage; import ru.m.tankz.storage.RecordStorage;
@@ -20,7 +19,7 @@ import ru.m.tankz.storage.RecordStorage;
@:provide var recordStorage:RecordStorage; @:provide var recordStorage:RecordStorage;
@:provide var switcher:FrameSwitcher; @:provide var switcher:FrameSwitcher;
@:provide var game:IGame; @:provide var gameInit:GameInit;
private function set_data(value:GameRecordInfo):GameRecordInfo { private function set_data(value:GameRecordInfo):GameRecordInfo {
if (data != value) { if (data != value) {
@@ -35,7 +34,7 @@ import ru.m.tankz.storage.RecordStorage;
private function play():Void { private function play():Void {
var record = recordStorage.read(data.id); var record = recordStorage.read(data.id);
game = new GamePlayer(record); gameInit = RECORD(record);
switcher.change(GameFrame.ID); switcher.change(GameFrame.ID);
} }

View File

@@ -35,9 +35,9 @@ import ru.m.tankz.view.common.LifeView;
public function onGameEvent(event:GameEvent):Void { public function onGameEvent(event:GameEvent):Void {
switch event { switch event {
case START(state, level): case START(start):
this.level.text = 'Level ${level.id}'; this.level.text = 'Level ${start.level.id}';
refresh(state); refresh(start.state);
case CHANGE(TEAM_LIFE(teamId, life)): case CHANGE(TEAM_LIFE(teamId, life)):
if (teamId == ClassicGame.BOT) { if (teamId == ClassicGame.BOT) {
bot.life = life; bot.life = life;

View File

@@ -16,9 +16,9 @@ import ru.m.tankz.view.common.LifeView;
public function onGameEvent(event:GameEvent):Void { public function onGameEvent(event:GameEvent):Void {
switch event { switch event {
case START(state, level): case START(start):
this.level.text = 'Level ${level.id}'; this.level.text = 'Level ${start.level.id}';
players.data = Lambda.array(state.players); players.data = Lambda.array(start.state.players);
case _: case _:
for (view in players.views) { for (view in players.views) {
view.toUpdate(); view.toUpdate();

View File

@@ -33,9 +33,9 @@ import ru.m.tankz.view.common.LifeView;
public function onGameEvent(event:GameEvent):Void { public function onGameEvent(event:GameEvent):Void {
switch event { switch event {
case START(state, level): case START(start):
this.level.text = 'Level ${level.id}'; this.level.text = 'Level ${start.level.id}';
refresh(state); refresh(start.state);
case CHANGE(TEAM_LIFE(teamId, life)): case CHANGE(TEAM_LIFE(teamId, life)):
getLifeView(teamId).life = life; getLifeView(teamId).life = life;
case CHANGE(TEAM_SCORE(teamId, score)): case CHANGE(TEAM_SCORE(teamId, score)):

View File

@@ -5,8 +5,7 @@ import haxework.view.frame.FrameSwitcher;
import haxework.view.list.VListView; import haxework.view.list.VListView;
import haxework.view.TextView; import haxework.view.TextView;
import haxework.view.VGroupView; import haxework.view.VGroupView;
import ru.m.tankz.game.IGame; import ru.m.tankz.game.GameInit;
import ru.m.tankz.network.NetworkGame;
import ru.m.tankz.network.NetworkManager; import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.room.RoomProto; import ru.m.tankz.proto.room.RoomProto;
import ru.m.tankz.proto.room.RoomSlotProto; import ru.m.tankz.proto.room.RoomSlotProto;
@@ -21,7 +20,7 @@ import ru.m.tankz.proto.room.RoomSlotProto;
@:provide var switcher:FrameSwitcher; @:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager; @:provide var network:NetworkManager;
@:provide var game:IGame; @:provide var gameInit:GameInit;
private function refresh(room:RoomProto):Void { private function refresh(room:RoomProto):Void {
if (room != null) { if (room != null) {
@@ -29,9 +28,7 @@ import ru.m.tankz.proto.room.RoomSlotProto;
info.text = '${room.game.type} #${room.game.level}'; info.text = '${room.game.type} #${room.game.level}';
slots.data = room.slots; slots.data = room.slots;
if (room.game.started) { if (room.game.started) {
if (this.game == null) { gameInit = NETWORK(network);
this.game = new NetworkGame(network);
}
switcher.change(GameFrame.ID); switcher.change(GameFrame.ID);
} }
} else { } else {

View File

@@ -33,10 +33,8 @@ import ru.m.tankz.Type;
@:provide var configBundle:IConfigBundle; @:provide var configBundle:IConfigBundle;
public function new(state:GameState, level:LevelConfig) { public function new(type:GameType) {
this.type = state.type; this.type = type;
this.state = state;
this.level = level;
this.teams = new Map(); this.teams = new Map();
this.config = configBundle.get(type); this.config = configBundle.get(type);
this.controlFactory = new NoneControlFactory(); this.controlFactory = new NoneControlFactory();
@@ -72,12 +70,11 @@ import ru.m.tankz.Type;
public function onGameEvent(event:GameEvent):Void { public function onGameEvent(event:GameEvent):Void {
switch event { switch event {
case START(state, level): case START(start):
this.state = state; onStart(start);
this.level = level; case COMPLETE(result):
case COMPLETE(state, winnerId): this.state = result.state;
this.state = state; this.winner = result.winner;
this.winner = winnerId;
case SPAWN(EAGLE(id, rect, teamId)): case SPAWN(EAGLE(id, rect, teamId)):
var team = getTeam(teamId); var team = getTeam(teamId);
team.eagleId = id; team.eagleId = id;
@@ -99,7 +96,9 @@ import ru.m.tankz.Type;
} }
} }
public function start():Void { private function onStart(start:Start):Void {
this.state = start.state;
this.level = start.level;
// ToDo: Spawner not in Team? // ToDo: Spawner not in Team?
var points:Array<SpawnPoint> = level != null && level.points != null ? level.points : config.points; var points:Array<SpawnPoint> = level != null && level.points != null ? level.points : config.points;
for (teamConfig in state.preset.teams) { for (teamConfig in state.preset.teams) {
@@ -135,6 +134,9 @@ import ru.m.tankz.Type;
} }
} }
public function start():Void {
}
public function dispose():Void { public function dispose():Void {
for (control in controls) { for (control in controls) {
control.dispose(); control.dispose();

View File

@@ -1,12 +1,22 @@
package ru.m.tankz.game; package ru.m.tankz.game;
import ru.m.tankz.config.Config.LevelConfig;
import haxework.color.Color; 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.control.Control; import ru.m.tankz.control.Control;
import ru.m.tankz.Type; import ru.m.tankz.Type;
typedef Start = {
var state:GameState;
var level:LevelConfig;
}
typedef Result = {
var state:GameState;
var winner:TeamId;
}
typedef TankInfo = { typedef TankInfo = {
var type:TankType; var type:TankType;
var hits:Int; var hits:Int;
@@ -74,13 +84,13 @@ enum ChangeEvent {
} }
enum GameEvent { enum GameEvent {
START(state:GameState, level:LevelConfig); START(start:Start);
SPAWN(event:SpawnEvent); SPAWN(event:SpawnEvent);
MOVE(event:MoveEvent); MOVE(event:MoveEvent);
STOP(event:StopEvent); STOP(event:StopEvent);
HIT(event:HitEvent); HIT(event:HitEvent);
DESTROY(event:DestroyEvent); DESTROY(event:DestroyEvent);
CHANGE(event:ChangeEvent); CHANGE(event:ChangeEvent);
COMPLETE(state:GameState, winnerId:TeamId); COMPLETE(result:Result);
ACTION(tankId:Int, action:TankAction); ACTION(tankId:Int, action:TankAction);
} }

View File

@@ -1,6 +1,5 @@
package ru.m.tankz.game; package ru.m.tankz.game;
import ru.m.tankz.config.Config.LevelConfig;
import ru.m.geom.Line; import ru.m.geom.Line;
import ru.m.geom.Point; import ru.m.geom.Point;
import ru.m.tankz.control.Control; import ru.m.tankz.control.Control;
@@ -20,8 +19,10 @@ class GameRunner extends Game implements EngineListener {
private var timer:Timer; private var timer:Timer;
private var builder:EntityBuilder; private var builder:EntityBuilder;
public function new(state:GameState, level:LevelConfig) { public function new(start:Start) {
super(state, level); super(start.state.type);
this.level = start.level;
this.state = start.state;
this.builder = new EntityBuilder(config); this.builder = new EntityBuilder(config);
this.engine = new Engine(config, level.size); this.engine = new Engine(config, level.size);
this.engine.connect(this); this.engine.connect(this);
@@ -41,6 +42,11 @@ class GameRunner extends Game implements EngineListener {
engine.update(); engine.update();
} }
override public function start():Void {
super.start();
gameEventSignal.emit(START({level:level, state:state}));
}
override public function dispose():Void { override public function dispose():Void {
super.dispose(); super.dispose();
if (timer != null) { if (timer != null) {
@@ -50,8 +56,8 @@ class GameRunner extends Game implements EngineListener {
engine.dispose(); engine.dispose();
} }
override public function start():Void { override private function onStart(start:Start):Void {
super.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));
engine.map.setData(mapData); engine.map.setData(mapData);
for (team in teams.iterator()) { for (team in teams.iterator()) {
@@ -69,7 +75,6 @@ class GameRunner extends Game implements EngineListener {
} }
} }
gameEventSignal.emit(EventUtil.buildBricksSpawn(engine.map)); gameEventSignal.emit(EventUtil.buildBricksSpawn(engine.map));
gameEventSignal.emit(START(state, level));
//for (i in 0...10) spawnBonus(); //for (i in 0...10) spawnBonus();
} }
@@ -155,7 +160,7 @@ class GameRunner extends Game implements EngineListener {
private function complete(winner:TeamId):Void { private function complete(winner:TeamId):Void {
Timer.delay(function() { Timer.delay(function() {
gameEventSignal.emit(COMPLETE(state, winner)); gameEventSignal.emit(COMPLETE({state: state, winner: winner}));
}, 3000); }, 3000);
} }
@@ -355,7 +360,7 @@ class GameRunner extends Game implements EngineListener {
engine.ticker.start(); engine.ticker.start();
timer = new Timer(30); timer = new Timer(30);
timer.run = update; timer.run = update;
case COMPLETE(_, _): case COMPLETE(_):
engine.ticker.stop(); engine.ticker.stop();
if (timer != null) { if (timer != null) {
timer.stop(); timer.stop();

View File

@@ -82,7 +82,6 @@ class GameState {
public function new(type:GameType, presetId:PresetId = 0, state:GameState = null, controls:Array<PlayerControl> = null) { public function new(type:GameType, presetId:PresetId = 0, state:GameState = null, controls:Array<PlayerControl> = null) {
this.type = type; this.type = type;
this.presetId = presetId; this.presetId = presetId;
//this.controls = controls == null ? config.controls[0].values : controls;
this.controls = controls == null ? [] : controls; this.controls = controls == null ? [] : controls;
if (state == null) { if (state == null) {
this.teams = new Map(); this.teams = new Map();

View File

@@ -12,7 +12,7 @@ class GamePlayer extends Game {
private var ticker:Ticker; private var ticker:Ticker;
public function new(record:GameRecord) { public function new(record:GameRecord) {
super(record.state, null); super(record.state.type);
this.record = record; this.record = record;
this.data = null; this.data = null;
this.ticker = new Ticker(); this.ticker = new Ticker();
@@ -38,7 +38,7 @@ class GamePlayer extends Game {
events++; events++;
gameEventSignal.emit(event.event); gameEventSignal.emit(event.event);
switch event.event { switch event.event {
case GameEvent.COMPLETE(_, _): case GameEvent.COMPLETE(_):
stop(); stop();
case _: case _:
} }

View File

@@ -22,7 +22,7 @@ class _GameListener implements GameListener {
public function onGameEvent(event:GameEvent):Void { public function onGameEvent(event:GameEvent):Void {
dispatcher.dispatchEvent(game, event); dispatcher.dispatchEvent(game, event);
switch event { switch event {
case COMPLETE(_, _): case COMPLETE(_):
dispatcher.delete(game.id); dispatcher.delete(game.id);
dispose(); dispose();
case _: case _:

View File

@@ -23,7 +23,10 @@ class ServerGame extends GameRunner {
@:provide static var levelBundle:ILevelBundle; @:provide static var levelBundle:ILevelBundle;
public function new(room:RoomProto) { public function new(room:RoomProto) {
super(new GameState(room.game.type, 0), levelBundle.get(new PackId(room.game.type)).data[room.game.level]); super({
state: new GameState(room.game.type, 0),
level: levelBundle.get(new PackId(room.game.type)).data[room.game.level],
});
this.controlFactory = new ServerControlFactory(); this.controlFactory = new ServerControlFactory();
this.room = room; this.room = room;
} }
@@ -88,7 +91,7 @@ class ServerGame extends GameRunner {
var result = []; var result = [];
result.push(EventUtil.buildBricksSpawn(engine.map)); result.push(EventUtil.buildBricksSpawn(engine.map));
result = result.concat(EventUtil.buildCellsDestroyed(engine.map)); result = result.concat(EventUtil.buildCellsDestroyed(engine.map));
result.push(START(state, level)); result.push(START({state: state, level: level}));
for (entity in engine.entities) { for (entity in engine.entities) {
switch EntityTypeResolver.of(entity) { switch EntityTypeResolver.of(entity) {
case EAGLE(eagle): result.push(EventUtil.buildEagleSpawn(eagle)); case EAGLE(eagle): result.push(EventUtil.buildEagleSpawn(eagle));