diff --git a/protohx.json b/protohx.json index 4990425..b2f6db9 100755 --- a/protohx.json +++ b/protohx.json @@ -2,8 +2,6 @@ "protoPath": "src/common/proto", "protoFiles": [ "src/common/proto/core.proto", - "src/common/proto/game.proto", - "src/common/proto/room.proto", "src/common/proto/pack.proto" ], "cleanOut": true, diff --git a/src/app/haxe/ru/m/puzzlez/net/Network.hx b/src/app/haxe/ru/m/puzzlez/net/Network.hx index 00a2410..d3602b6 100644 --- a/src/app/haxe/ru/m/puzzlez/net/Network.hx +++ b/src/app/haxe/ru/m/puzzlez/net/Network.hx @@ -1,11 +1,14 @@ package ru.m.puzzlez.net; +import haxe.Unserializer; import com.hurlant.crypto.extra.UUID; import com.hurlant.crypto.prng.Random; import hw.connect.ConnectionFactory; import hw.connect.IConnection; import hw.signal.Signal; import hw.storage.SharedObjectStorage; +import ru.m.puzzlez.core.GameEvent; +import ru.m.puzzlez.proto.core.GameProto; import ru.m.puzzlez.proto.core.UserProto; import ru.m.puzzlez.proto.pack.LoginRequest; import ru.m.puzzlez.proto.pack.Request; @@ -15,12 +18,21 @@ import ru.m.puzzlez.proto.pack.Response; public var user(default, null):UserProto; public var userSignal(default, null):Signal = new Signal(); + public var gameList(default, null):Array; + public var gameListSignal(default, null):Signal> = new Signal(); + + public var game(default, null):GameProto; + public var gameSignal(default, null):Signal = new Signal(); + + public var gameEventSignal(default, null):Signal = new Signal(); + private var connection:IConnection; private var storage:SharedObjectStorage; private static var USER_KEY = "user"; public function new() { + gameList = []; storage = new SharedObjectStorage("netwok"); if (storage.exists(USER_KEY)) { user = storage.read(USER_KEY); @@ -35,7 +47,7 @@ import ru.m.puzzlez.proto.pack.Response; } public function login():Void { - connection.send(new Request().setLogin(new LoginRequest().setName(user.name).setUuid(user.uuid))); + connection.send(new Request().setLogin(new LoginRequest().setUser(user))); } private function onConnectionChange(event:ConnectionEvent):Void { @@ -55,6 +67,19 @@ import ru.m.puzzlez.proto.pack.Response; user = packet.login.user; storage.write(USER_KEY, user); userSignal.emit(user); + } else if (packet.hasLogout()) { + user = null; + userSignal.emit(user); + } else if (packet.hasGameList()) { + gameList = packet.gameList.games; + gameListSignal.emit(gameList); + } else if (packet.hasGame()) { + game = packet.game.game; + gameSignal.emit(game); + } else if (packet.hasGameEvent()) { + for (event in packet.gameEvent.events) { + gameEventSignal.emit(Unserializer.run(event.event)); + } } } } diff --git a/src/common/proto/core.proto b/src/common/proto/core.proto index 72da300..f92a5a1 100644 --- a/src/common/proto/core.proto +++ b/src/common/proto/core.proto @@ -9,4 +9,12 @@ message UserProto { message GameProto { int32 id = 1; + string imageId = 2; + string status = 3; + repeated UserProto users = 4; +} + +message GameEventProto { + int32 time = 1; + string event = 2; } diff --git a/src/common/proto/game.proto b/src/common/proto/game.proto deleted file mode 100644 index b1910a0..0000000 --- a/src/common/proto/game.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; - -package ru.m.puzzlez.proto.game; - -message GameEventProto { - int32 time = 1; - string event = 2; -} diff --git a/src/common/proto/pack.proto b/src/common/proto/pack.proto index a738456..ef5613d 100644 --- a/src/common/proto/pack.proto +++ b/src/common/proto/pack.proto @@ -1,8 +1,6 @@ syntax = "proto3"; import "core.proto"; -import "game.proto"; -import "room.proto"; package ru.m.puzzlez.proto.pack; @@ -12,8 +10,7 @@ message ErrorResponse { } message LoginRequest { - string uuid = 1; - string name = 2; + ru.m.puzzlez.proto.core.UserProto user = 1; } message LoginResponse { @@ -24,21 +21,48 @@ message LogoutRequest {} message LogoutResponse {} +message GameCreateRequest { + string imageId = 1; +} + +message GameJoinRequest { + int32 gameId = 1; +} + +message GameLeaveRequest {} + +message GameResponse { + ru.m.puzzlez.proto.core.GameProto game = 1; +} + +message GameListRequest { + bool subscribe = 1; +} + +message GameListResponse { + repeated ru.m.puzzlez.proto.core.GameProto games = 1; +} + message GameEventRequest { - ru.m.puzzlez.proto.game.GameEventProto event = 1; + repeated ru.m.puzzlez.proto.core.GameEventProto events = 1; } message GameEventResponse { - ru.m.puzzlez.proto.game.GameEventProto event = 1; + repeated ru.m.puzzlez.proto.core.GameEventProto events = 1; } message Request { oneof content { LoginRequest login = 1; LogoutRequest logout = 2; - ru.m.puzzlez.proto.room.RoomRequest room = 3; - ru.m.puzzlez.proto.room.RoomListRequest roomList = 4; - GameEventRequest gameEvent = 6; + + GameCreateRequest gameCreate = 10; + GameLeaveRequest gameJoin = 11; + GameLeaveRequest gameLeave = 12; + + GameListRequest gameList = 20; + + GameEventRequest gameEvent = 100; } } @@ -46,9 +70,12 @@ message Response { oneof content { LoginResponse login = 1; LogoutResponse logout = 2; - ru.m.puzzlez.proto.room.RoomResponse room = 3; - ru.m.puzzlez.proto.room.RoomListResponse roomList = 4; - GameEventResponse gameEvent = 6; + + GameResponse game = 10; + + GameListResponse gameList = 20; + + GameEventResponse gameEvent = 100; ErrorResponse error = 999; } diff --git a/src/common/proto/room.proto b/src/common/proto/room.proto deleted file mode 100644 index 8bf45e3..0000000 --- a/src/common/proto/room.proto +++ /dev/null @@ -1,64 +0,0 @@ -syntax = "proto3"; - -import "core.proto"; - -package ru.m.puzzlez.proto.room; - -message SlotProto { - string team = 3; - int32 index = 4; -} - -message RoomSlotProto { - SlotProto slot = 1; - ru.m.puzzlez.proto.core.UserProto user = 2; -} - -message RoomProto { - ru.m.puzzlez.proto.core.GameProto game = 1; - ru.m.puzzlez.proto.core.UserProto creator = 2; - repeated ru.m.puzzlez.proto.core.UserProto users = 3; - repeated RoomSlotProto slots = 4; -} - -message CreateRequest { - string type = 2; - int32 level = 3; -} - -message JoinRequest { - int32 gameId = 1; - bool restore = 2; -} - -message LeaveRequest { -} - -message SlotRequest { - SlotProto slot = 3; -} - -message StartRequest { -} - -message RoomRequest { - oneof content { - CreateRequest create = 1; - JoinRequest join = 2; - LeaveRequest leave = 3; - SlotRequest slot = 4; - StartRequest start = 5; - } -} - -message RoomResponse { - RoomProto room = 1; -} - -message RoomListRequest { - bool subscribe = 1; -} - -message RoomListResponse { - repeated RoomProto rooms = 1; -} diff --git a/src/server/haxe/ru/m/puzzlez/GameSession.hx b/src/server/haxe/ru/m/puzzlez/GameSession.hx index 362ca8b..6fa902c 100644 --- a/src/server/haxe/ru/m/puzzlez/GameSession.hx +++ b/src/server/haxe/ru/m/puzzlez/GameSession.hx @@ -9,16 +9,16 @@ import hw.log.BaseLogger.LoggerUtil; import ru.m.puzzlez.core.GameEvent; import ru.m.puzzlez.game.IGameManager; import ru.m.puzzlez.game.ServerGame; +import ru.m.puzzlez.proto.core.GameEventProto; import ru.m.puzzlez.proto.core.UserProto; -import ru.m.puzzlez.proto.game.GameEventProto; import ru.m.puzzlez.proto.pack.ErrorResponse; import ru.m.puzzlez.proto.pack.GameEventResponse; +import ru.m.puzzlez.proto.pack.GameListResponse; +import ru.m.puzzlez.proto.pack.GameResponse; import ru.m.puzzlez.proto.pack.LoginResponse; import ru.m.puzzlez.proto.pack.LogoutResponse; import ru.m.puzzlez.proto.pack.Request; import ru.m.puzzlez.proto.pack.Response; -import ru.m.puzzlez.proto.room.RoomListResponse; -import ru.m.puzzlez.proto.room.RoomResponse; import sys.net.Socket; class GameSession extends ProtoSession implements GameManagerListener { @@ -45,9 +45,9 @@ class GameSession extends ProtoSession implements GameManager send(new Response().setError(new ErrorResponse().setCode(code).setMessage(message))); } - private function listGame():RoomListResponse { + private function listGame():GameListResponse { var games = gameManager.games; - return new RoomListResponse().setRooms([for (game in games) game.room]); + return new GameListResponse().setGames([for (game in games) game.proto]); } override public function send(packet:Response):Void { @@ -139,7 +139,7 @@ class GameSession extends ProtoSession implements GameManager public function onCreate(game:ServerGame):Void { if (subscribed) { - send(new Response().setRoomList(listGame())); + send(new Response().setGameList(listGame())); } } @@ -149,31 +149,33 @@ class GameSession extends ProtoSession implements GameManager case LEAVE(user): if (user.uuid == this.user.uuid) { gameId = -1; - send(new Response().setRoom(new RoomResponse())); + send(new Response().setGame(new GameResponse())); return; } case _: } - send(new Response().setRoom(new RoomResponse().setRoom(game.room))); + send(new Response().setGame(new GameResponse().setGame(game.proto))); } if (subscribed) { - send(new Response().setRoomList(listGame())); + send(new Response().setGameList(listGame())); } } public function onDelete(game:ServerGame):Void { if (gameId == game.id) { gameId = -1; - send(new Response().setRoom(new RoomResponse())); + send(new Response().setGame(new GameResponse())); } if (subscribed) { - send(new Response().setRoomList(listGame())); + send(new Response().setGameList(listGame())); } } public function onEvent(game:ServerGame, event:GameEvent):Void { if (gameId == game.id) { - send(new Response().setGameEvent(new GameEventResponse().setEvent(new GameEventProto().setTime(0).setEvent(Serializer.run(event))))); + send(new Response().setGameEvent(new GameEventResponse().setEvents([ + new GameEventProto().setTime(0).setEvent(Serializer.run(event)) + ]))); } } } diff --git a/src/server/haxe/ru/m/puzzlez/game/GameManager.hx b/src/server/haxe/ru/m/puzzlez/game/GameManager.hx index 5d57d9a..b7b1134 100644 --- a/src/server/haxe/ru/m/puzzlez/game/GameManager.hx +++ b/src/server/haxe/ru/m/puzzlez/game/GameManager.hx @@ -1,11 +1,9 @@ package ru.m.puzzlez.game; +import ru.m.puzzlez.core.Id; import ru.m.puzzlez.core.GameEvent; import ru.m.puzzlez.game.IGameManager; -import ru.m.puzzlez.proto.room.SlotProto; -import ru.m.puzzlez.proto.room.RoomSlotProto; import ru.m.puzzlez.proto.core.GameProto; -import ru.m.puzzlez.proto.room.RoomProto; import ru.m.puzzlez.proto.core.UserProto; class _GameListener implements GameListener { @@ -37,7 +35,6 @@ class _GameListener implements GameListener { @:dispatcher(GameManagerListener) class GameManager implements IGameManager { public var games(default, null):Array; public var gamesById(default, null):Map; - public var gamesByCreator(default, null):Map; public var gamesByUser(default, null):Map; private var counter:Int; @@ -46,26 +43,18 @@ class _GameListener implements GameListener { counter = 0; games = []; gamesById = new Map(); - gamesByCreator = new Map(); gamesByUser = new Map(); } - public function create(user:UserProto):ServerGame { + public function create(user:UserProto, imageId:ImageId):ServerGame { if (gamesByCreator.exists(user.uuid)) { delete(gamesByCreator[user.uuid].id); } - var room = new RoomProto() - .setGame( - new GameProto() - .setId(++counter) - ) - .setCreator(user); - var game = new ServerGame(room); - var slots:Array = []; - game.room.setSlots(slots); + var gameProto = new GameProto().setId(++counter).setImageId(imageId); + gameProto.users.push(user); + var game = new ServerGame(gameProto); games.push(game); gamesById[game.id] = game; - gamesByCreator[game.room.creator.uuid] = game; createSignal.emit(game); join(game.id, user); return game; @@ -85,15 +74,12 @@ class _GameListener implements GameListener { var game = gamesById[gameId]; games.remove(game); gamesById.remove(game.id); - gamesByCreator.remove(game.room.creator.uuid); deleteSignal.emit(game); } } public function leave(user:UserProto):Void { - /*if (gamesByCreator.exists(user.uuid)) { - delete(gamesByCreator[user.uuid].proto.id); - } else*/ if (gamesByUser.exists(user.uuid)) { + if (gamesByUser.exists(user.uuid)) { var game = gamesByUser[user.uuid]; gamesByUser.remove(user.uuid); game.leave(user); @@ -101,14 +87,6 @@ class _GameListener implements GameListener { } } - public function slot(user:UserProto, slot:SlotProto):Void { - if (gamesByUser.exists(user.uuid)) { - var game = gamesByUser[user.uuid]; - game.slot(user, slot); - changeSignal.emit(game, SLOT(user, slot)); - } - } - public function start(gameId:Int):Void { if (gamesById.exists(gameId)) { var game:ServerGame = gamesById[gameId]; diff --git a/src/server/haxe/ru/m/puzzlez/game/IGameManager.hx b/src/server/haxe/ru/m/puzzlez/game/IGameManager.hx index a8bb529..17481b1 100644 --- a/src/server/haxe/ru/m/puzzlez/game/IGameManager.hx +++ b/src/server/haxe/ru/m/puzzlez/game/IGameManager.hx @@ -1,14 +1,13 @@ package ru.m.puzzlez.game; +import ru.m.puzzlez.core.Id; import hw.signal.Signal; import ru.m.puzzlez.core.GameEvent; import ru.m.puzzlez.proto.core.UserProto; -import ru.m.puzzlez.proto.room.SlotProto; enum GameChange { JOIN(user:UserProto); LEAVE(user:UserProto); - SLOT(user:UserProto, slot:SlotProto); START(); } @@ -35,10 +34,9 @@ interface GameManagerListener { public function connect(listener:GameManagerListener):Void; public function disconnect(listener:GameManagerListener):Void; - public function create(user:UserProto):ServerGame; + public function create(user:UserProto, imageId:ImageId):ServerGame; public function delete(gameId:Int):Void; public function join(gameId:Int, user:UserProto):Void; - public function slot(user:UserProto, slot:SlotProto):Void; public function leave(user:UserProto):Void; public function start(gameId:Int):Void; } diff --git a/src/server/haxe/ru/m/puzzlez/game/ServerGame.hx b/src/server/haxe/ru/m/puzzlez/game/ServerGame.hx index 985c75c..4ef6a64 100644 --- a/src/server/haxe/ru/m/puzzlez/game/ServerGame.hx +++ b/src/server/haxe/ru/m/puzzlez/game/ServerGame.hx @@ -1,29 +1,28 @@ package ru.m.puzzlez.game; import haxe.Timer; -import ru.m.puzzlez.core.GameEvent; +import ru.m.puzzlez.core.Game; +import ru.m.puzzlez.proto.core.GameProto; import ru.m.puzzlez.proto.core.UserProto; -import ru.m.puzzlez.proto.room.RoomProto; -import ru.m.puzzlez.proto.room.SlotProto; -@:dispatcher(GameListener) class ServerGame { +@:dispatcher(GameListener) class ServerGame extends Game { - public var room(default, null):RoomProto; public var id(get, null):Int; + public var proto(default, default):GameProto; private var timer:Timer; - public function new(room:RoomProto) { - this.room = room; + public function new(proto:GameProto) { + this.proto = proto; } private inline function get_id():Int { - return room.game.id; + return proto.id; } public function contains(user:UserProto):Bool { - for (slot in room.slots) { - if (slot.hasUser() && slot.user.uuid == user.uuid) { + for (user in proto.users) { + if (user.uuid == user.uuid) { return true; } } @@ -32,41 +31,11 @@ import ru.m.puzzlez.proto.room.SlotProto; public function join(user:UserProto):Void { if (!contains(user)) { - room.users.push(user); - } - } - - public function slot(user:UserProto, slot:SlotProto):Void { - join(user); - for (s in room.slots) { - if (s.hasUser() && s.user.uuid == user.uuid) { - s.clearUser(); - break; - } - } - for (s in room.slots) { - if (s.slot.team == slot.team && s.slot.index == slot.index) { - s.setUser(user); - break; - } + proto.users.push(user); } } public function leave(user:UserProto):Void { - for (slot in room.slots) { - if (slot.user != null && slot.user.uuid == user.uuid) { - slot.clearUser(); - break; - } - } - room.setUsers(room.users.filter(function(u:UserProto) return u.uuid != user.uuid)); - } - - public function start():Void { - - } - - public function restore():Array { - return []; + proto.setUsers(proto.users.filter(function(u:UserProto) return u.uuid != user.uuid)); } }