[proto] added GameRequest and GameResponse

This commit is contained in:
2018-05-17 17:45:02 +03:00
parent 33b0693a4e
commit 007621c48c
8 changed files with 60 additions and 15 deletions

View File

@@ -1,5 +1,7 @@
package ru.m.tankz.frame; package ru.m.tankz.frame;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.network.NetworkGame;
import flash.events.Event; import flash.events.Event;
import haxe.ds.Option; import haxe.ds.Option;
import haxe.Timer; import haxe.Timer;
@@ -24,6 +26,7 @@ class GameFrame extends VGroupView {
@:view var state(default, null):LabelView; @:view var state(default, null):LabelView;
@:view var render(default, null):Render; @:view var render(default, null):Render;
@:provide var network:NetworkManager;
private var game:Game; private var game:Game;
private var timer:Timer; private var timer:Timer;
@@ -35,17 +38,20 @@ class GameFrame extends VGroupView {
} }
private function start(save:GameSave):Void { private function start(save:GameSave):Void {
game = new Game(save.state.type); switch (save.server) {
if (game == null) { case GameServer.LOCAL:
throw 'Unsupported game type "${save.state.type}"'; 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(render);
game.engine.connect(Provider.get(SoundManager)); game.engine.connect(Provider.get(SoundManager));
game.start(save).then(onGameStateChange).endThen(onGameComplete);
content.addEventListener(Event.ENTER_FRAME, redraw); content.addEventListener(Event.ENTER_FRAME, redraw);
render.draw(game.engine); render.draw(game.engine);
timer = new Timer(10);
timer.run = updateEngine;
state.text = stateString(game); state.text = stateString(game);
Provider.get(SoundManager).play('start'); Provider.get(SoundManager).play('start');
} }

View File

@@ -80,7 +80,7 @@ class NetworkFrame extends VGroupView {
userList.data = game.players; userList.data = game.players;
frameSwitcher.change(gameFrame.id); frameSwitcher.change(gameFrame.id);
if (game.state == GameStateProto.STARTED) { 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); mainFrameSwitcher.change(GameFrame.ID);
} }
} else { } else {

View File

@@ -1,5 +1,7 @@
package ru.m.tankz.network; 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.pack.StartGameRequest;
import ru.m.tankz.proto.game.GameChangeProto; import ru.m.tankz.proto.game.GameChangeProto;
import ru.m.tankz.proto.game.GameActionTypeProto; import ru.m.tankz.proto.game.GameActionTypeProto;
@@ -28,6 +30,7 @@ class NetworkManager {
public var gameSignal:Signal<GameInfoProto>; public var gameSignal:Signal<GameInfoProto>;
public var gameUpdateSignal:Signal<Array<GameChangeProto>>; public var gameUpdateSignal:Signal<Array<GameChangeProto>>;
public var user(default, null):User; public var user(default, null):User;
public var game(default, set):NetworkGame;
@:provide private var connection:ClientConnection; @:provide private var connection:ClientConnection;
@:provide private var storage:UserStorage; @:provide private var storage:UserStorage;
@@ -113,7 +116,7 @@ class NetworkManager {
L.d('Network', '$event'); L.d('Network', '$event');
'offline'; 'offline';
case ConnectionEvent.ERROR(error): case ConnectionEvent.ERROR(error):
L.e('Network', '$error'); L.e('Network', '$error', error);
'error'; 'error';
}); });
} }
@@ -141,6 +144,14 @@ class NetworkManager {
gameSignal.emit(packet.startGame.game); gameSignal.emit(packet.startGame.game);
} else if (packet.hasUpdateGame()) { } else if (packet.hasUpdateGame()) {
gameUpdateSignal.emit(packet.updateGame.changes); 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;
}
} }

View File

@@ -12,18 +12,25 @@ typedef PlayerSave = {
var state:PlayerState; var state:PlayerState;
} }
enum GameServer {
LOCAL;
NETWORK;
}
class GameSave { class GameSave {
public var state:GameState; public var state:GameState;
public var players:Array<PlayerSave>; public var players:Array<PlayerSave>;
public var server:GameServer;
public function new(state:GameState, ?players:Array<PlayerSave>) { public function new(state:GameState, ?players:Array<PlayerSave>, ?server:GameServer) {
this.state = { this.state = {
type: state.type, type: state.type,
presetId: state.presetId, presetId: state.presetId,
level: state.level, level: state.level,
}; };
this.players = players != null ? players : []; this.players = players != null ? players : [];
this.server = server != null ? server : GameServer.LOCAL;
} }
public function addPlayerState(id:PlayerId, state:PlayerState):Void { public function addPlayerState(id:PlayerId, state:PlayerState):Void {

View File

@@ -8,11 +8,14 @@ import ru.m.tankz.game.Game;
class NetworkGame extends Game { class NetworkGame extends Game {
private static var TAG(default, never):String = 'NetworkGame';
public function new(type:GameType) { public function new(type:GameType) {
super(type); super(type);
} }
public function load(proto:GameProto):Void { public function load(proto:GameProto):Void {
L.w(TAG, 'load: ${proto}');
// ToDo: // ToDo:
} }
@@ -21,6 +24,6 @@ class NetworkGame extends Game {
} }
public function export():GameProto { public function export():GameProto {
return null; return new GameProto();
} }
} }

View File

@@ -65,6 +65,13 @@ message StartGameResponse {
ru.m.tankz.proto.core.GameInfoProto game = 1; ru.m.tankz.proto.core.GameInfoProto game = 1;
} }
// Game
message GameRequest {}
message GameResponse {
ru.m.tankz.proto.core.GameProto game = 1;
}
// Game Update // Game Update
message GameUpdateRequest { message GameUpdateRequest {
ru.m.tankz.proto.game.GameActionTypeProto type = 1; ru.m.tankz.proto.game.GameActionTypeProto type = 1;
@@ -86,7 +93,8 @@ message Request {
JoinGameRequest joinGame = 5; JoinGameRequest joinGame = 5;
LeaveGameRequest leaveGame = 6; LeaveGameRequest leaveGame = 6;
StartGameRequest startGame = 7; StartGameRequest startGame = 7;
GameUpdateRequest updateGame = 8; GameRequest game = 8;
GameUpdateRequest updateGame = 9;
} }
} }
@@ -100,6 +108,7 @@ message Response {
JoinGameResponse joinGame = 5; JoinGameResponse joinGame = 5;
LeaveGameResponse leaveGame = 6; LeaveGameResponse leaveGame = 6;
StartGameResponse startGame = 7; StartGameResponse startGame = 7;
GameUpdateResponse updateGame = 8; GameResponse game = 8;
GameUpdateResponse updateGame = 9;
} }
} }

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.server.game; package ru.m.tankz.server.game;
import ru.m.tankz.network.NetworkGame;
import ru.m.tankz.preset.ClassicGame; import ru.m.tankz.preset.ClassicGame;
import ru.m.tankz.game.GameSave; import ru.m.tankz.game.GameSave;
import ru.m.tankz.proto.pack.StartGameResponse; 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.ListGameResponse;
import ru.m.tankz.proto.pack.CreateGameResponse; import ru.m.tankz.proto.pack.CreateGameResponse;
import ru.m.tankz.proto.pack.Response; 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.GameStateProto;
import ru.m.tankz.proto.core.GameInfoProto; import ru.m.tankz.proto.core.GameInfoProto;
import ru.m.tankz.proto.core.UserProto; import ru.m.tankz.proto.core.UserProto;
@@ -58,7 +58,7 @@ class GameManager {
private static var idCounter:Int = 0; private static var idCounter:Int = 0;
public var gameInfo(default, null):GameInfoProto; public var gameInfo(default, null):GameInfoProto;
public var game(default, null):Game; public var game(default, null):NetworkGame;
private var timer:NekoTimer; private var timer:NekoTimer;
@@ -115,7 +115,7 @@ class GameManager {
public function start() { public function start() {
gameInfo.setState(GameStateProto.STARTED); 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})); game.start(new GameSave({type: ClassicGame.TYPE, presetId: ClassicGame.PLAYER1, level: 0}));
timer = new NekoTimer(30); timer = new NekoTimer(30);
timer.run = update; timer.run = update;

View File

@@ -1,5 +1,7 @@
package ru.m.tankz.server.session; 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.extra.UUID;
import com.hurlant.crypto.prng.Random; import com.hurlant.crypto.prng.Random;
import haxe.io.Bytes; import haxe.io.Bytes;
@@ -99,6 +101,8 @@ class Session {
send(new Response().setLeaveGame(leaveGame(request.leaveGame))); send(new Response().setLeaveGame(leaveGame(request.leaveGame)));
} else if (request.hasStartGame()) { } else if (request.hasStartGame()) {
send(new Response().setStartGame(startGame(request.startGame))); 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(); gameManager.start();
return new StartGameResponse().setGame(gameManager.gameInfo); 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());
}
} }