From 007621c48cbf57d20b3b8b801166d4ef1cb31c38 Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 17 May 2018 17:45:02 +0300 Subject: [PATCH] [proto] added GameRequest and GameResponse --- src/client/haxe/ru/m/tankz/frame/GameFrame.hx | 18 ++++++++++++------ .../haxe/ru/m/tankz/frame/NetworkFrame.hx | 2 +- .../haxe/ru/m/tankz/network/NetworkManager.hx | 13 ++++++++++++- src/common/haxe/ru/m/tankz/game/GameSave.hx | 9 ++++++++- .../haxe/ru/m/tankz/network/NetworkGame.hx | 5 ++++- src/common/proto/pack.proto | 13 +++++++++++-- .../haxe/ru/m/tankz/server/game/GameManager.hx | 6 +++--- .../haxe/ru/m/tankz/server/session/Session.hx | 9 +++++++++ 8 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx b/src/client/haxe/ru/m/tankz/frame/GameFrame.hx index 085a4e8..43e345c 100755 --- a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/GameFrame.hx @@ -1,5 +1,7 @@ package ru.m.tankz.frame; +import ru.m.tankz.network.NetworkManager; +import ru.m.tankz.network.NetworkGame; import flash.events.Event; import haxe.ds.Option; import haxe.Timer; @@ -24,6 +26,7 @@ class GameFrame extends VGroupView { @:view var state(default, null):LabelView; @:view var render(default, null):Render; + @:provide var network:NetworkManager; private var game:Game; private var timer:Timer; @@ -35,17 +38,20 @@ class GameFrame extends VGroupView { } private function start(save:GameSave):Void { - game = new Game(save.state.type); - if (game == null) { - throw 'Unsupported game type "${save.state.type}"'; + switch (save.server) { + case GameServer.LOCAL: + game = new Game(save.state.type); + game.start(save).then(onGameStateChange).endThen(onGameComplete); + timer = new Timer(10); + timer.run = updateEngine; + case GameServer.NETWORK: + game = new NetworkGame(save.state.type); + network.game = cast game; } game.engine.connect(render); game.engine.connect(Provider.get(SoundManager)); - game.start(save).then(onGameStateChange).endThen(onGameComplete); content.addEventListener(Event.ENTER_FRAME, redraw); render.draw(game.engine); - timer = new Timer(10); - timer.run = updateEngine; state.text = stateString(game); Provider.get(SoundManager).play('start'); } diff --git a/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx b/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx index 096aeb7..19366f0 100644 --- a/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx @@ -80,7 +80,7 @@ class NetworkFrame extends VGroupView { userList.data = game.players; frameSwitcher.change(gameFrame.id); if (game.state == GameStateProto.STARTED) { - Provider.set(GameSave, new GameSave({type: ClassicGame.TYPE, presetId: ClassicGame.PLAYER1})); + Provider.set(GameSave, new GameSave({type: ClassicGame.TYPE, presetId: ClassicGame.PLAYER1}, null, GameServer.NETWORK)); mainFrameSwitcher.change(GameFrame.ID); } } else { diff --git a/src/client/haxe/ru/m/tankz/network/NetworkManager.hx b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx index 7a5e9de..b603de7 100644 --- a/src/client/haxe/ru/m/tankz/network/NetworkManager.hx +++ b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx @@ -1,5 +1,7 @@ package ru.m.tankz.network; +import ru.m.tankz.proto.pack.GameRequest; +import ru.m.tankz.proto.core.GameProto; import ru.m.tankz.proto.pack.StartGameRequest; import ru.m.tankz.proto.game.GameChangeProto; import ru.m.tankz.proto.game.GameActionTypeProto; @@ -28,6 +30,7 @@ class NetworkManager { public var gameSignal:Signal; public var gameUpdateSignal:Signal>; public var user(default, null):User; + public var game(default, set):NetworkGame; @:provide private var connection:ClientConnection; @:provide private var storage:UserStorage; @@ -113,7 +116,7 @@ class NetworkManager { L.d('Network', '$event'); 'offline'; case ConnectionEvent.ERROR(error): - L.e('Network', '$error'); + L.e('Network', '$error', error); 'error'; }); } @@ -141,6 +144,14 @@ class NetworkManager { gameSignal.emit(packet.startGame.game); } else if (packet.hasUpdateGame()) { gameUpdateSignal.emit(packet.updateGame.changes); + } else if (packet.hasGame()) { + game.load(packet.game.game); } } + + private function set_game(value:NetworkGame):NetworkGame { + this.game = value; + connection.send(new Request().setGame(new GameRequest())); + return this.game; + } } diff --git a/src/common/haxe/ru/m/tankz/game/GameSave.hx b/src/common/haxe/ru/m/tankz/game/GameSave.hx index 9e5a3ad..166db53 100644 --- a/src/common/haxe/ru/m/tankz/game/GameSave.hx +++ b/src/common/haxe/ru/m/tankz/game/GameSave.hx @@ -12,18 +12,25 @@ typedef PlayerSave = { var state:PlayerState; } +enum GameServer { + LOCAL; + NETWORK; +} + class GameSave { public var state:GameState; public var players:Array; + public var server:GameServer; - public function new(state:GameState, ?players:Array) { + public function new(state:GameState, ?players:Array, ?server:GameServer) { this.state = { type: state.type, presetId: state.presetId, level: state.level, }; this.players = players != null ? players : []; + this.server = server != null ? server : GameServer.LOCAL; } public function addPlayerState(id:PlayerId, state:PlayerState):Void { diff --git a/src/common/haxe/ru/m/tankz/network/NetworkGame.hx b/src/common/haxe/ru/m/tankz/network/NetworkGame.hx index 2d5de75..e1a1bc0 100644 --- a/src/common/haxe/ru/m/tankz/network/NetworkGame.hx +++ b/src/common/haxe/ru/m/tankz/network/NetworkGame.hx @@ -8,11 +8,14 @@ import ru.m.tankz.game.Game; class NetworkGame extends Game { + private static var TAG(default, never):String = 'NetworkGame'; + public function new(type:GameType) { super(type); } public function load(proto:GameProto):Void { + L.w(TAG, 'load: ${proto}'); // ToDo: } @@ -21,6 +24,6 @@ class NetworkGame extends Game { } public function export():GameProto { - return null; + return new GameProto(); } } diff --git a/src/common/proto/pack.proto b/src/common/proto/pack.proto index 496fde1..5a2a21e 100644 --- a/src/common/proto/pack.proto +++ b/src/common/proto/pack.proto @@ -65,6 +65,13 @@ message StartGameResponse { ru.m.tankz.proto.core.GameInfoProto game = 1; } +// Game +message GameRequest {} + +message GameResponse { + ru.m.tankz.proto.core.GameProto game = 1; +} + // Game Update message GameUpdateRequest { ru.m.tankz.proto.game.GameActionTypeProto type = 1; @@ -86,7 +93,8 @@ message Request { JoinGameRequest joinGame = 5; LeaveGameRequest leaveGame = 6; StartGameRequest startGame = 7; - GameUpdateRequest updateGame = 8; + GameRequest game = 8; + GameUpdateRequest updateGame = 9; } } @@ -100,6 +108,7 @@ message Response { JoinGameResponse joinGame = 5; LeaveGameResponse leaveGame = 6; StartGameResponse startGame = 7; - GameUpdateResponse updateGame = 8; + GameResponse game = 8; + GameUpdateResponse updateGame = 9; } } 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 f64fbab..cd49670 100644 --- a/src/server/haxe/ru/m/tankz/server/game/GameManager.hx +++ b/src/server/haxe/ru/m/tankz/server/game/GameManager.hx @@ -1,5 +1,6 @@ package ru.m.tankz.server.game; +import ru.m.tankz.network.NetworkGame; import ru.m.tankz.preset.ClassicGame; import ru.m.tankz.game.GameSave; import ru.m.tankz.proto.pack.StartGameResponse; @@ -8,7 +9,6 @@ import ru.m.tankz.proto.pack.JoinGameResponse; import ru.m.tankz.proto.pack.ListGameResponse; import ru.m.tankz.proto.pack.CreateGameResponse; import ru.m.tankz.proto.pack.Response; -import ru.m.tankz.game.Game; import ru.m.tankz.proto.core.GameStateProto; import ru.m.tankz.proto.core.GameInfoProto; import ru.m.tankz.proto.core.UserProto; @@ -58,7 +58,7 @@ class GameManager { private static var idCounter:Int = 0; public var gameInfo(default, null):GameInfoProto; - public var game(default, null):Game; + public var game(default, null):NetworkGame; private var timer:NekoTimer; @@ -115,7 +115,7 @@ class GameManager { public function start() { gameInfo.setState(GameStateProto.STARTED); - game = new Game(ClassicGame.TYPE); + game = new NetworkGame(ClassicGame.TYPE); game.start(new GameSave({type: ClassicGame.TYPE, presetId: ClassicGame.PLAYER1, level: 0})); timer = new NekoTimer(30); timer.run = update; diff --git a/src/server/haxe/ru/m/tankz/server/session/Session.hx b/src/server/haxe/ru/m/tankz/server/session/Session.hx index 73edaa8..7556aa0 100755 --- a/src/server/haxe/ru/m/tankz/server/session/Session.hx +++ b/src/server/haxe/ru/m/tankz/server/session/Session.hx @@ -1,5 +1,7 @@ package ru.m.tankz.server.session; +import ru.m.tankz.proto.pack.GameResponse; +import ru.m.tankz.proto.pack.GameRequest; import com.hurlant.crypto.extra.UUID; import com.hurlant.crypto.prng.Random; import haxe.io.Bytes; @@ -99,6 +101,8 @@ class Session { send(new Response().setLeaveGame(leaveGame(request.leaveGame))); } else if (request.hasStartGame()) { send(new Response().setStartGame(startGame(request.startGame))); + }else if (request.hasGame()) { + send(new Response().setGame(game(request.game))); } } @@ -143,4 +147,9 @@ class Session { gameManager.start(); return new StartGameResponse().setGame(gameManager.gameInfo); } + + private function game(request:GameRequest):GameResponse { + var gameManager:GameManager = GameManager.byPersonId.get(user.uuid); + return new GameResponse().setGame(gameManager.game.export()); + } } \ No newline at end of file