From d0ebf05f1cba3c93e9d740316512071fd9d434e9 Mon Sep 17 00:00:00 2001 From: shmyga Date: Mon, 24 Jun 2019 18:04:01 +0300 Subject: [PATCH] [client] add GameInit --- WORK.md | 2 -- src/client/haxe/ru/m/tankz/game/GameInit.hx | 11 ++++++++ src/client/haxe/ru/m/tankz/local/LocalGame.hx | 23 ++-------------- .../haxe/ru/m/tankz/network/NetworkGame.hx | 9 +++---- src/client/haxe/ru/m/tankz/render/Render.hx | 6 ++--- src/client/haxe/ru/m/tankz/view/GameFrame.hx | 27 ++++++++++++------- src/client/haxe/ru/m/tankz/view/LevelFrame.hx | 27 +++++++++++++------ .../haxe/ru/m/tankz/view/RecordFrame.hx | 1 - .../haxe/ru/m/tankz/view/ResultFrame.hx | 9 +++---- src/client/haxe/ru/m/tankz/view/StartFrame.hx | 7 ++--- .../haxe/ru/m/tankz/view/common/RecordView.hx | 7 +++-- .../ru/m/tankz/view/game/ClassicGamePanel.hx | 6 ++--- .../ru/m/tankz/view/game/DeathGamePanel.hx | 6 ++--- .../ru/m/tankz/view/game/DotaGamePanel.hx | 6 ++--- .../haxe/ru/m/tankz/view/network/RoomFrame.hx | 9 +++---- src/common/haxe/ru/m/tankz/game/Game.hx | 24 +++++++++-------- src/common/haxe/ru/m/tankz/game/GameEvent.hx | 16 ++++++++--- src/common/haxe/ru/m/tankz/game/GameRunner.hx | 21 +++++++++------ src/common/haxe/ru/m/tankz/game/GameState.hx | 1 - .../haxe/ru/m/tankz/game/record/GamePlayer.hx | 4 +-- .../ru/m/tankz/server/game/GameManager.hx | 2 +- .../haxe/ru/m/tankz/server/game/ServerGame.hx | 7 +++-- 22 files changed, 127 insertions(+), 104 deletions(-) create mode 100644 src/client/haxe/ru/m/tankz/game/GameInit.hx diff --git a/WORK.md b/WORK.md index 94a965b..b6a0260 100644 --- a/WORK.md +++ b/WORK.md @@ -6,7 +6,5 @@ * map packs (create in editor, import in game, save imported in local storage) * update bots * improve bonuses system -* gamepad support * screen gamepad on mobiles * resize render on mobiles -* [bug] game progress broken diff --git a/src/client/haxe/ru/m/tankz/game/GameInit.hx b/src/client/haxe/ru/m/tankz/game/GameInit.hx new file mode 100644 index 0000000..4cbe34b --- /dev/null +++ b/src/client/haxe/ru/m/tankz/game/GameInit.hx @@ -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); +} diff --git a/src/client/haxe/ru/m/tankz/local/LocalGame.hx b/src/client/haxe/ru/m/tankz/local/LocalGame.hx index dbf8742..7ed5669 100644 --- a/src/client/haxe/ru/m/tankz/local/LocalGame.hx +++ b/src/client/haxe/ru/m/tankz/local/LocalGame.hx @@ -1,32 +1,13 @@ package ru.m.tankz.local; -import ru.m.tankz.config.Config; import ru.m.tankz.game.GameEvent; 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.storage.RecordStorage; class LocalGame extends GameRunner { - @:provide var recordStorage:RecordStorage; - private var recorder:GameRecorder; - public function new(state:GameState, level:LevelConfig) { - super(state, level); + public function new(start:Start) { + super(start); 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 _: - } } } diff --git a/src/client/haxe/ru/m/tankz/network/NetworkGame.hx b/src/client/haxe/ru/m/tankz/network/NetworkGame.hx index a99f515..82d93d5 100644 --- a/src/client/haxe/ru/m/tankz/network/NetworkGame.hx +++ b/src/client/haxe/ru/m/tankz/network/NetworkGame.hx @@ -3,7 +3,6 @@ package ru.m.tankz.network; import haxe.Unserializer; import ru.m.tankz.game.Game; import ru.m.tankz.game.GameEvent; -import ru.m.tankz.game.GameState; import ru.m.tankz.network.NetworkControlFactory; import ru.m.tankz.network.NetworkManager; import ru.m.tankz.proto.pack.GameEventResponse; @@ -14,7 +13,7 @@ class NetworkGame extends Game { private var 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.controlFactory = new NetworkControlFactory(); 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); 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 { diff --git a/src/client/haxe/ru/m/tankz/render/Render.hx b/src/client/haxe/ru/m/tankz/render/Render.hx index dcf0d56..c507c6f 100755 --- a/src/client/haxe/ru/m/tankz/render/Render.hx +++ b/src/client/haxe/ru/m/tankz/render/Render.hx @@ -115,10 +115,10 @@ class Render extends SpriteView implements IRender { public function onGameEvent(event:GameEvent):Void { switch event { - case START(_, level): - gridSize = level.size; + case START(start): + gridSize = start.level.size; content.addEventListener(Event.ENTER_FRAME, onEnterFrame); - case COMPLETE(_, _): + case COMPLETE(_): content.removeEventListener(Event.ENTER_FRAME, onEnterFrame); case SPAWN(BRICK(bricks)): drawBackground(); diff --git a/src/client/haxe/ru/m/tankz/view/GameFrame.hx b/src/client/haxe/ru/m/tankz/view/GameFrame.hx index 44aedea..77710b6 100644 --- a/src/client/haxe/ru/m/tankz/view/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/GameFrame.hx @@ -5,10 +5,12 @@ import haxework.view.VGroupView; import ru.m.control.DeviceType; import ru.m.control.IControlBus; 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.record.GamePlayer; 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.storage.GameStorage; 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 private var gamepad(default, null):GamepadView; - @:provide var network:NetworkManager; @:provide var soundManager:SoundManager; - @:provide var state:GameState; - @:provide var record:GameRecord; @:provide var switcher:FrameSwitcher; @:provide static var gameStorage:GameStorage; @:provide static var settings:SettingsStorage; - @:provide var game:IGame; + @:provide var gameInit:GameInit; + //@:provide var result:Result; @:provide static var bus:IControlBus; + private var game:IGame; + private var recorder:GameRecord; + public function init():Void { 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; soundManager.config = game.config; gameView.render.config = game.config; @@ -74,9 +83,9 @@ import ru.m.tankz.view.GamepadView; public function onGameEvent(event:GameEvent):Void { switch event { - case COMPLETE(state, winner): - this.state = state; - updateProgress(game, winner); + case COMPLETE(result): + //this.result = result; + updateProgress(game, result.winner); stop(); switcher.change(ResultFrame.ID); case _: diff --git a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx index b6bb3c8..492e63d 100644 --- a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx @@ -7,9 +7,8 @@ import haxework.view.LabelView; import haxework.view.VGroupView; import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.config.Config; +import ru.m.tankz.game.GameInit; 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.Type; import ru.m.tankz.view.popup.LevelPopup; @@ -20,8 +19,7 @@ import ru.m.tankz.view.popup.LevelPopup; @:view var header:LabelView; @:view var levels:DataView; - @:provide var state:GameState; - @:provide var game:IGame; + @:provide var gameInit:GameInit; @:provide var switcher:FrameSwitcher; @:provide var levelBundle:ILevelBundle; @:provide var storage:GameStorage; @@ -30,15 +28,27 @@ import ru.m.tankz.view.popup.LevelPopup; private var levelPopup:LevelPopup; public function onShow():Void { + var state = getState(); header.text = state.type; pack = levelBundle.get(new PackId(state.type)); 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 { - state.presetId = preset.id; - state.controls = control.values; - game = new LocalGame(state, level); + switch gameInit { + case LOCAL(start): + start.state.presetId = preset.id; + start.state.controls = control.values; + start.level = level; + case _: + } switcher.change(GameFrame.ID); } @@ -46,7 +56,7 @@ import ru.m.tankz.view.popup.LevelPopup; var progress = storage.get(pack.id); var result = new ButtonView(); 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.disabled = !progress.isLevelAvailable(level.id); return result; @@ -59,6 +69,7 @@ import ru.m.tankz.view.popup.LevelPopup; if (levelPopup == null) { levelPopup = new LevelPopup(); } + var state = getState(); levelPopup.setData( level, state.config.presets, diff --git a/src/client/haxe/ru/m/tankz/view/RecordFrame.hx b/src/client/haxe/ru/m/tankz/view/RecordFrame.hx index 1bb919c..ee673a6 100644 --- a/src/client/haxe/ru/m/tankz/view/RecordFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/RecordFrame.hx @@ -14,7 +14,6 @@ import ru.m.tankz.storage.RecordStorage; @:provide var recordStorage:RecordStorage; @:provide var switcher:FrameSwitcher; - @:provide var record:GameRecord; public function onShow():Void { var data = Lambda.array(recordStorage); diff --git a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx index 8b49415..93ea5b6 100644 --- a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx @@ -4,7 +4,6 @@ import haxework.view.DataView; import haxework.view.frame.FrameSwitcher; import haxework.view.LabelView; import haxework.view.VGroupView; -import ru.m.tankz.game.GameRunner; import ru.m.tankz.game.GameState; import ru.m.tankz.game.IGame; import ru.m.tankz.view.common.LifeView; @@ -16,23 +15,23 @@ import ru.m.tankz.view.common.LifeView; @:view("level") var levelLabel:LabelView; @:provide var frames:FrameSwitcher; - @:provide var state:GameState; @:provide var game:IGame; private function playerViewFactory(index:Int, player:PlayerState) { 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 tankConfig = state.config.getTank(tankType); view.tank = tankConfig == null ? 'ba' : tankConfig.skin; view.color = state.getPlayerColor(player.id); view.life = player.frags; - view.score = player.score; + view.score = player.score;*/ return view; } public function onShow() { - resultView.data = Lambda.array(state.players); + //resultView.data = Lambda.array(state.players); //levelLabel.text = 'Level ${state.levelId}'; // ToDo: level? } diff --git a/src/client/haxe/ru/m/tankz/view/StartFrame.hx b/src/client/haxe/ru/m/tankz/view/StartFrame.hx index 1a43649..27d7cf6 100644 --- a/src/client/haxe/ru/m/tankz/view/StartFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/StartFrame.hx @@ -2,11 +2,12 @@ package ru.m.tankz.view; import haxework.view.frame.FrameSwitcher; import haxework.view.VGroupView; +import ru.m.tankz.game.GameInit; import ru.m.tankz.game.GameState; import ru.m.tankz.network.NetworkManager; 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.RoomListFrame; import ru.m.tankz.view.popup.FontPopup; 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"; - @:provide var state:GameState; + @:provide var gameInit:GameInit; @:provide var switcher:FrameSwitcher; @:provide var network:NetworkManager; private var fontPopup:FontPopup; private function startGame(type:GameType):Void { - state = new GameState(type); + gameInit = LOCAL({state: new GameState(type), level: null}); switcher.change(LevelFrame.ID); } diff --git a/src/client/haxe/ru/m/tankz/view/common/RecordView.hx b/src/client/haxe/ru/m/tankz/view/common/RecordView.hx index 457bcad..1bc6988 100644 --- a/src/client/haxe/ru/m/tankz/view/common/RecordView.hx +++ b/src/client/haxe/ru/m/tankz/view/common/RecordView.hx @@ -1,11 +1,10 @@ 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.HGroupView; import haxework.view.LabelView; import haxework.view.list.ListView; +import ru.m.tankz.game.GameInit; import ru.m.tankz.game.record.GameRecord; import ru.m.tankz.storage.RecordStorage; @@ -20,7 +19,7 @@ import ru.m.tankz.storage.RecordStorage; @:provide var recordStorage:RecordStorage; @:provide var switcher:FrameSwitcher; - @:provide var game:IGame; + @:provide var gameInit:GameInit; private function set_data(value:GameRecordInfo):GameRecordInfo { if (data != value) { @@ -35,7 +34,7 @@ import ru.m.tankz.storage.RecordStorage; private function play():Void { var record = recordStorage.read(data.id); - game = new GamePlayer(record); + gameInit = RECORD(record); switcher.change(GameFrame.ID); } diff --git a/src/client/haxe/ru/m/tankz/view/game/ClassicGamePanel.hx b/src/client/haxe/ru/m/tankz/view/game/ClassicGamePanel.hx index 594e05f..54843c6 100644 --- a/src/client/haxe/ru/m/tankz/view/game/ClassicGamePanel.hx +++ b/src/client/haxe/ru/m/tankz/view/game/ClassicGamePanel.hx @@ -35,9 +35,9 @@ import ru.m.tankz.view.common.LifeView; public function onGameEvent(event:GameEvent):Void { switch event { - case START(state, level): - this.level.text = 'Level ${level.id}'; - refresh(state); + case START(start): + this.level.text = 'Level ${start.level.id}'; + refresh(start.state); case CHANGE(TEAM_LIFE(teamId, life)): if (teamId == ClassicGame.BOT) { bot.life = life; diff --git a/src/client/haxe/ru/m/tankz/view/game/DeathGamePanel.hx b/src/client/haxe/ru/m/tankz/view/game/DeathGamePanel.hx index 9935b16..8859e7c 100644 --- a/src/client/haxe/ru/m/tankz/view/game/DeathGamePanel.hx +++ b/src/client/haxe/ru/m/tankz/view/game/DeathGamePanel.hx @@ -16,9 +16,9 @@ import ru.m.tankz.view.common.LifeView; public function onGameEvent(event:GameEvent):Void { switch event { - case START(state, level): - this.level.text = 'Level ${level.id}'; - players.data = Lambda.array(state.players); + case START(start): + this.level.text = 'Level ${start.level.id}'; + players.data = Lambda.array(start.state.players); case _: for (view in players.views) { view.toUpdate(); diff --git a/src/client/haxe/ru/m/tankz/view/game/DotaGamePanel.hx b/src/client/haxe/ru/m/tankz/view/game/DotaGamePanel.hx index 8f06dc3..e016e76 100644 --- a/src/client/haxe/ru/m/tankz/view/game/DotaGamePanel.hx +++ b/src/client/haxe/ru/m/tankz/view/game/DotaGamePanel.hx @@ -33,9 +33,9 @@ import ru.m.tankz.view.common.LifeView; public function onGameEvent(event:GameEvent):Void { switch event { - case START(state, level): - this.level.text = 'Level ${level.id}'; - refresh(state); + case START(start): + this.level.text = 'Level ${start.level.id}'; + refresh(start.state); case CHANGE(TEAM_LIFE(teamId, life)): getLifeView(teamId).life = life; case CHANGE(TEAM_SCORE(teamId, score)): diff --git a/src/client/haxe/ru/m/tankz/view/network/RoomFrame.hx b/src/client/haxe/ru/m/tankz/view/network/RoomFrame.hx index 0ffce24..e2aff67 100644 --- a/src/client/haxe/ru/m/tankz/view/network/RoomFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/network/RoomFrame.hx @@ -5,8 +5,7 @@ import haxework.view.frame.FrameSwitcher; import haxework.view.list.VListView; import haxework.view.TextView; import haxework.view.VGroupView; -import ru.m.tankz.game.IGame; -import ru.m.tankz.network.NetworkGame; +import ru.m.tankz.game.GameInit; import ru.m.tankz.network.NetworkManager; import ru.m.tankz.proto.room.RoomProto; import ru.m.tankz.proto.room.RoomSlotProto; @@ -21,7 +20,7 @@ import ru.m.tankz.proto.room.RoomSlotProto; @:provide var switcher:FrameSwitcher; @:provide var network:NetworkManager; - @:provide var game:IGame; + @:provide var gameInit:GameInit; private function refresh(room:RoomProto):Void { if (room != null) { @@ -29,9 +28,7 @@ import ru.m.tankz.proto.room.RoomSlotProto; info.text = '${room.game.type} #${room.game.level}'; slots.data = room.slots; if (room.game.started) { - if (this.game == null) { - this.game = new NetworkGame(network); - } + gameInit = NETWORK(network); switcher.change(GameFrame.ID); } } else { diff --git a/src/common/haxe/ru/m/tankz/game/Game.hx b/src/common/haxe/ru/m/tankz/game/Game.hx index fd47d5b..f9a2850 100644 --- a/src/common/haxe/ru/m/tankz/game/Game.hx +++ b/src/common/haxe/ru/m/tankz/game/Game.hx @@ -33,10 +33,8 @@ import ru.m.tankz.Type; @:provide var configBundle:IConfigBundle; - public function new(state:GameState, level:LevelConfig) { - this.type = state.type; - this.state = state; - this.level = level; + public function new(type:GameType) { + this.type = type; this.teams = new Map(); this.config = configBundle.get(type); this.controlFactory = new NoneControlFactory(); @@ -72,12 +70,11 @@ import ru.m.tankz.Type; public function onGameEvent(event:GameEvent):Void { switch event { - case START(state, level): - this.state = state; - this.level = level; - case COMPLETE(state, winnerId): - this.state = state; - this.winner = winnerId; + case START(start): + onStart(start); + case COMPLETE(result): + this.state = result.state; + this.winner = result.winner; case SPAWN(EAGLE(id, rect, teamId)): var team = getTeam(teamId); 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? var points:Array = level != null && level.points != null ? level.points : config.points; for (teamConfig in state.preset.teams) { @@ -135,6 +134,9 @@ import ru.m.tankz.Type; } } + public function start():Void { + } + public function dispose():Void { for (control in controls) { control.dispose(); diff --git a/src/common/haxe/ru/m/tankz/game/GameEvent.hx b/src/common/haxe/ru/m/tankz/game/GameEvent.hx index f43cd0b..9b3f5eb 100644 --- a/src/common/haxe/ru/m/tankz/game/GameEvent.hx +++ b/src/common/haxe/ru/m/tankz/game/GameEvent.hx @@ -1,12 +1,22 @@ package ru.m.tankz.game; -import ru.m.tankz.config.Config.LevelConfig; import haxework.color.Color; import ru.m.geom.Position; import ru.m.geom.Rectangle; +import ru.m.tankz.config.Config; import ru.m.tankz.control.Control; import ru.m.tankz.Type; +typedef Start = { + var state:GameState; + var level:LevelConfig; +} + +typedef Result = { + var state:GameState; + var winner:TeamId; +} + typedef TankInfo = { var type:TankType; var hits:Int; @@ -74,13 +84,13 @@ enum ChangeEvent { } enum GameEvent { - START(state:GameState, level:LevelConfig); + START(start:Start); SPAWN(event:SpawnEvent); MOVE(event:MoveEvent); STOP(event:StopEvent); HIT(event:HitEvent); DESTROY(event:DestroyEvent); CHANGE(event:ChangeEvent); - COMPLETE(state:GameState, winnerId:TeamId); + COMPLETE(result:Result); ACTION(tankId:Int, action:TankAction); } diff --git a/src/common/haxe/ru/m/tankz/game/GameRunner.hx b/src/common/haxe/ru/m/tankz/game/GameRunner.hx index 8569821..a40f636 100644 --- a/src/common/haxe/ru/m/tankz/game/GameRunner.hx +++ b/src/common/haxe/ru/m/tankz/game/GameRunner.hx @@ -1,6 +1,5 @@ package ru.m.tankz.game; -import ru.m.tankz.config.Config.LevelConfig; import ru.m.geom.Line; import ru.m.geom.Point; import ru.m.tankz.control.Control; @@ -20,8 +19,10 @@ class GameRunner extends Game implements EngineListener { private var timer:Timer; private var builder:EntityBuilder; - public function new(state:GameState, level:LevelConfig) { - super(state, level); + public function new(start:Start) { + super(start.state.type); + this.level = start.level; + this.state = start.state; this.builder = new EntityBuilder(config); this.engine = new Engine(config, level.size); this.engine.connect(this); @@ -41,6 +42,11 @@ class GameRunner extends Game implements EngineListener { engine.update(); } + override public function start():Void { + super.start(); + gameEventSignal.emit(START({level:level, state:state})); + } + override public function dispose():Void { super.dispose(); if (timer != null) { @@ -50,8 +56,8 @@ class GameRunner extends Game implements EngineListener { engine.dispose(); } - override public function start():Void { - super.start(); + override private function onStart(start:Start):Void { + super.onStart(start); var mapData = level.data.map(function(index:BrickIndex) return config.getBrickByIndex(index)); engine.map.setData(mapData); for (team in teams.iterator()) { @@ -69,7 +75,6 @@ class GameRunner extends Game implements EngineListener { } } gameEventSignal.emit(EventUtil.buildBricksSpawn(engine.map)); - gameEventSignal.emit(START(state, level)); //for (i in 0...10) spawnBonus(); } @@ -155,7 +160,7 @@ class GameRunner extends Game implements EngineListener { private function complete(winner:TeamId):Void { Timer.delay(function() { - gameEventSignal.emit(COMPLETE(state, winner)); + gameEventSignal.emit(COMPLETE({state: state, winner: winner})); }, 3000); } @@ -355,7 +360,7 @@ class GameRunner extends Game implements EngineListener { engine.ticker.start(); timer = new Timer(30); timer.run = update; - case COMPLETE(_, _): + case COMPLETE(_): engine.ticker.stop(); if (timer != null) { timer.stop(); diff --git a/src/common/haxe/ru/m/tankz/game/GameState.hx b/src/common/haxe/ru/m/tankz/game/GameState.hx index 06a44e1..1bff71a 100644 --- a/src/common/haxe/ru/m/tankz/game/GameState.hx +++ b/src/common/haxe/ru/m/tankz/game/GameState.hx @@ -82,7 +82,6 @@ class GameState { public function new(type:GameType, presetId:PresetId = 0, state:GameState = null, controls:Array = null) { this.type = type; this.presetId = presetId; - //this.controls = controls == null ? config.controls[0].values : controls; this.controls = controls == null ? [] : controls; if (state == null) { this.teams = new Map(); diff --git a/src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx b/src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx index 686df35..31fb51c 100644 --- a/src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx +++ b/src/common/haxe/ru/m/tankz/game/record/GamePlayer.hx @@ -12,7 +12,7 @@ class GamePlayer extends Game { private var ticker:Ticker; public function new(record:GameRecord) { - super(record.state, null); + super(record.state.type); this.record = record; this.data = null; this.ticker = new Ticker(); @@ -38,7 +38,7 @@ class GamePlayer extends Game { events++; gameEventSignal.emit(event.event); switch event.event { - case GameEvent.COMPLETE(_, _): + case GameEvent.COMPLETE(_): stop(); case _: } diff --git a/src/server/haxe/ru/m/tankz/server/game/GameManager.hx b/src/server/haxe/ru/m/tankz/server/game/GameManager.hx index 989cea5..14e933e 100644 --- a/src/server/haxe/ru/m/tankz/server/game/GameManager.hx +++ b/src/server/haxe/ru/m/tankz/server/game/GameManager.hx @@ -22,7 +22,7 @@ class _GameListener implements GameListener { public function onGameEvent(event:GameEvent):Void { dispatcher.dispatchEvent(game, event); switch event { - case COMPLETE(_, _): + case COMPLETE(_): dispatcher.delete(game.id); dispose(); case _: diff --git a/src/server/haxe/ru/m/tankz/server/game/ServerGame.hx b/src/server/haxe/ru/m/tankz/server/game/ServerGame.hx index 2118854..a426b55 100644 --- a/src/server/haxe/ru/m/tankz/server/game/ServerGame.hx +++ b/src/server/haxe/ru/m/tankz/server/game/ServerGame.hx @@ -23,7 +23,10 @@ class ServerGame extends GameRunner { @:provide static var levelBundle:ILevelBundle; 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.room = room; } @@ -88,7 +91,7 @@ class ServerGame extends GameRunner { var result = []; result.push(EventUtil.buildBricksSpawn(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) { switch EntityTypeResolver.of(entity) { case EAGLE(eagle): result.push(EventUtil.buildEagleSpawn(eagle));