diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml index aa5bb64..fddd9be 100644 --- a/ansible/group_vars/all.yml +++ b/ansible/group_vars/all.yml @@ -5,11 +5,11 @@ project_user: holop deploy_user: "{{ project_user }}" deploy_project: "{{ project_name }}" deploy_repo_url: "git@bitbucket.org:infernalgames/{{ project_name }}.git" -deploy_repo_version: ansible +deploy_repo_version: network deploy_npm: yes service_name: "{{ project_name }}" -service_work_dir: "{{ deploy_current_dir }}/target" -service_command: "/usr/bin/neko {{ deploy_current_dir }}/target/{{ project_name }}.n {{ service_host }}" +service_work_dir: "{{ deploy_current_dir }}/target/server/neko" +service_command: "/usr/bin/neko {{ service_work_dir }}/{{ project_name }}.n {{ service_host }}" service_user: www-data service_control_user: "{{ project_user }}" diff --git a/gulpfile.js b/gulpfile.js index 4cb2945..7987cc3 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -16,7 +16,11 @@ exports.clean = function clean() { }; exports.generate = function generate() { - return new Haxe().haxelib(['run', 'protohx', 'generate', 'protohx.json']); + return new Haxe().haxelib(['run', 'protohx', 'generate', 'protohx.json']).then(({stdout}) => { + if (stdout.indexOf('FAIL') > -1) { + throw stdout; + } + }); }; /** @@ -40,10 +44,11 @@ const config = new Project.Config({ 'src-gen/haxe', ], assets: [ - 'src/client/resources' + 'src/common/resources' ], macros: [ - `CompilationOption.set('build','${dateformat(new Date(), 'yyyy-mm-dd HH:MM:ss')}')` + 'yield.parser.Parser.auto()', // ToDo: bug with extraParams.hxml in yield library + `CompilationOption.set('build','${dateformat(new Date(), 'yyyy-mm-dd HH:MM:ss')}')`, ] }); @@ -62,9 +67,10 @@ const client = new Project( name: 'client', sources: ['src/client/haxe'], main: 'ru.m.tankz.Client', + assets: ['src/client/resources'], }), module.exports.generate -).bind(module); +).bind(module, gulp); /** * editor @@ -76,9 +82,10 @@ const editor = new Project( name: 'editor', sources: ['src/client/haxe', 'src/editor/haxe'], main: 'ru.m.tankz.editor.Editor', + assets: ['src/client/resources'], meta: {filename: 'editor'} }) -).bind(module); +).bind(module, gulp); /** * server @@ -91,7 +98,7 @@ const server = new Project( sources: ['src/server/haxe'], main: 'ru.m.tankz.server.Server', }) -).bind(module); +).bind(module, gulp); /** * default diff --git a/src/client/haxe/ru/m/tankz/Init.hx b/src/client/haxe/ru/m/tankz/Init.hx index 9ca9d83..137773f 100644 --- a/src/client/haxe/ru/m/tankz/Init.hx +++ b/src/client/haxe/ru/m/tankz/Init.hx @@ -10,9 +10,6 @@ import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.bundle.LevelBundle; import ru.m.tankz.control.ClientControlFactory; import ru.m.tankz.control.IControlFactory; -import ru.m.tankz.game.ClassicGame; -import ru.m.tankz.game.DotaGame; -import ru.m.tankz.game.Game; import ru.m.tankz.network.NetworkManager; import ru.m.tankz.proto.pack.Request; import ru.m.tankz.proto.pack.Response; @@ -53,8 +50,6 @@ class Init { Provider.setFactory(SoundManager, SoundManager); Provider.setFactory(NetworkManager, NetworkManager); Provider.setFactory(IControlFactory, ClientControlFactory); - Provider.setFactory(Game, ClassicGame, ClassicGame.TYPE); - Provider.setFactory(Game, DotaGame, DotaGame.TYPE); var host:String = getHost(); L.d('Init', 'host: ${host}'); diff --git a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx b/src/client/haxe/ru/m/tankz/frame/GameFrame.hx index f4cfe84..085a4e8 100755 --- a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/GameFrame.hx @@ -35,7 +35,7 @@ class GameFrame extends VGroupView { } private function start(save:GameSave):Void { - game = Provider.build(Game, save.state.type); + game = new Game(save.state.type); if (game == null) { throw 'Unsupported game type "${save.state.type}"'; } diff --git a/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx b/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx index a18e6ba..096aeb7 100644 --- a/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/NetworkFrame.hx @@ -1,9 +1,5 @@ package ru.m.tankz.frame; -import ru.m.tankz.game.ClassicGame; -import ru.m.tankz.game.GameSave; -import haxework.provider.Provider; -import ru.m.tankz.proto.core.GameState; import haxework.gui.ButtonView; import haxework.gui.frame.IFrameSwitcher; import haxework.gui.IGroupView; @@ -11,9 +7,13 @@ import haxework.gui.InputView; import haxework.gui.LabelView; import haxework.gui.list.ListView; import haxework.gui.VGroupView; +import haxework.provider.Provider; +import ru.m.tankz.game.GameSave; import ru.m.tankz.network.NetworkManager; -import ru.m.tankz.proto.core.Game; -import ru.m.tankz.proto.core.User; +import ru.m.tankz.preset.ClassicGame; +import ru.m.tankz.proto.core.GameInfoProto; +import ru.m.tankz.proto.core.GameStateProto; +import ru.m.tankz.proto.core.UserProto; @:template("ru/m/tankz/frame/NetworkFrame.yaml", "ru/m/tankz/Style.yaml") @@ -29,12 +29,12 @@ class NetworkFrame extends VGroupView { @:view var gameListFrame(default, null):IGroupView; @:view var createGameButton(default, null):ButtonView; - @:view var gameList(default, null):ListView; + @:view var gameList(default, null):ListView; @:view var gameFrame(default, null):IGroupView; @:view var leaveGameButton(default, null):ButtonView; @:view var startGameButton(default, null):ButtonView; - @:view var userList(default, null):ListView; + @:view var userList(default, null):ListView; @:provide var network:NetworkManager; @:provide var mainFrameSwitcher:IFrameSwitcher; @@ -45,7 +45,7 @@ class NetworkFrame extends VGroupView { leaveGameButton.onPress = this; startGameButton.onPress = this; gameList.dispatcher.addListener({ - onListItemClick: function(item:IListItemView):Void { + onListItemClick: function(item:IListItemView):Void { network.joinGame(item.data.id); } }); @@ -71,15 +71,15 @@ class NetworkFrame extends VGroupView { } } - private function onListGame(games:Array):Void { + private function onListGame(games:Array):Void { gameList.data = games; } - private function onGame(game:Game):Void { + private function onGame(game:GameInfoProto):Void { if (game != null) { userList.data = game.players; frameSwitcher.change(gameFrame.id); - if (game.state == GameState.STARTED) { + if (game.state == GameStateProto.STARTED) { Provider.set(GameSave, new GameSave({type: ClassicGame.TYPE, presetId: ClassicGame.PLAYER1})); mainFrameSwitcher.change(GameFrame.ID); } diff --git a/src/client/haxe/ru/m/tankz/frame/NetworkFrame.yaml b/src/client/haxe/ru/m/tankz/frame/NetworkFrame.yaml index 8512115..9713d8f 100644 --- a/src/client/haxe/ru/m/tankz/frame/NetworkFrame.yaml +++ b/src/client/haxe/ru/m/tankz/frame/NetworkFrame.yaml @@ -43,7 +43,7 @@ views: $style: button text: Create - id: gameList - $type: haxework.gui.list.VListView + $type: haxework.gui.list.VListView factory: "@class:ru.m.tankz.frame.network.GameItemView" pWidth: 100 pHeight: 100 @@ -73,7 +73,7 @@ views: $style: button text: Leave - id: userList - $type: haxework.gui.list.VListView + $type: haxework.gui.list.VListView factory: "@class:ru.m.tankz.frame.network.UserItemView" pWidth: 100 pHeight: 100 diff --git a/src/client/haxe/ru/m/tankz/frame/StartFrame.hx b/src/client/haxe/ru/m/tankz/frame/StartFrame.hx index 9ef3247..be27444 100644 --- a/src/client/haxe/ru/m/tankz/frame/StartFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/StartFrame.hx @@ -4,8 +4,8 @@ import haxework.gui.ButtonView; import haxework.gui.frame.IFrameSwitcher; import haxework.gui.VGroupView; import haxework.provider.Provider; -import ru.m.tankz.game.ClassicGame; -import ru.m.tankz.game.DotaGame; +import ru.m.tankz.preset.ClassicGame; +import ru.m.tankz.preset.DotaGame; import ru.m.tankz.game.GameSave; import ru.m.tankz.storage.SaveStorage; import ru.m.tankz.Type; diff --git a/src/client/haxe/ru/m/tankz/frame/network/GameItemView.hx b/src/client/haxe/ru/m/tankz/frame/network/GameItemView.hx index 0eac70b..6d2bed4 100755 --- a/src/client/haxe/ru/m/tankz/frame/network/GameItemView.hx +++ b/src/client/haxe/ru/m/tankz/frame/network/GameItemView.hx @@ -3,18 +3,18 @@ package ru.m.tankz.frame.network; import haxework.gui.HGroupView; import haxework.gui.LabelView; import haxework.gui.list.ListView; -import ru.m.tankz.proto.core.Game; +import ru.m.tankz.proto.core.GameInfoProto; @:template("ru/m/tankz/frame/network/GameItemView.yaml", "ru/m/tankz/Style.yaml") -class GameItemView extends HGroupView implements IListItemView { +class GameItemView extends HGroupView implements IListItemView { public var item_index(default, default):Int; - public var data(default, set):Game; + public var data(default, set):GameInfoProto; @:view var label(default, null):LabelView; - private function set_data(value:Game):Game { + private function set_data(value:GameInfoProto):GameInfoProto { data = value; label.text = '${data.type}'; return data; diff --git a/src/client/haxe/ru/m/tankz/frame/network/UserItemView.hx b/src/client/haxe/ru/m/tankz/frame/network/UserItemView.hx index 9588612..befada3 100755 --- a/src/client/haxe/ru/m/tankz/frame/network/UserItemView.hx +++ b/src/client/haxe/ru/m/tankz/frame/network/UserItemView.hx @@ -3,18 +3,18 @@ package ru.m.tankz.frame.network; import haxework.gui.HGroupView; import haxework.gui.LabelView; import haxework.gui.list.ListView; -import ru.m.tankz.proto.core.User; +import ru.m.tankz.proto.core.UserProto; @:template("ru/m/tankz/frame/network/UserItemView.yaml", "ru/m/tankz/Style.yaml") -class UserItemView extends HGroupView implements IListItemView { +class UserItemView extends HGroupView implements IListItemView { public var item_index(default, default):Int; - public var data(default, set):User; + public var data(default, set):UserProto; @:view var label(default, null):LabelView; - private function set_data(value:User):User { + private function set_data(value:UserProto):UserProto { data = value; label.text = '${data.uuid} -- ${data.name}'; return data; diff --git a/src/client/haxe/ru/m/tankz/network/NetworkManager.hx b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx index a1733fd..7a5e9de 100644 --- a/src/client/haxe/ru/m/tankz/network/NetworkManager.hx +++ b/src/client/haxe/ru/m/tankz/network/NetworkManager.hx @@ -1,8 +1,8 @@ package ru.m.tankz.network; import ru.m.tankz.proto.pack.StartGameRequest; -import ru.m.tankz.proto.game.GameChange; -import ru.m.tankz.proto.game.GameActionType; +import ru.m.tankz.proto.game.GameChangeProto; +import ru.m.tankz.proto.game.GameActionTypeProto; import ru.m.tankz.proto.pack.GameUpdateRequest; import ru.m.tankz.control.Control; import ru.m.tankz.proto.pack.JoinGameRequest; @@ -10,7 +10,7 @@ import ru.m.tankz.proto.pack.LeaveGameRequest; import ru.m.tankz.proto.pack.CreateGameRequest; import ru.m.connect.IConnection; import ru.m.signal.Signal; -import ru.m.tankz.proto.core.Game; +import ru.m.tankz.proto.core.GameInfoProto; import ru.m.tankz.proto.pack.ListGameRequest; import ru.m.tankz.proto.pack.LoginRequest; import ru.m.tankz.proto.pack.Request; @@ -24,9 +24,9 @@ class NetworkManager { public var state(default, null):String; public var stateSignal:Signal; - public var listGameSignal:Signal>; - public var gameSignal:Signal; - public var gameUpdateSignal:Signal>; + public var listGameSignal:Signal>; + public var gameSignal:Signal; + public var gameUpdateSignal:Signal>; public var user(default, null):User; @:provide private var connection:ClientConnection; @@ -34,9 +34,9 @@ class NetworkManager { public function new() { stateSignal = new Signal(); - listGameSignal = new Signal>(); - gameSignal = new Signal(); - gameUpdateSignal = new Signal>(); + listGameSignal = new Signal>(); + gameSignal = new Signal(); + gameUpdateSignal = new Signal>(); updateState('offline'); connection.handler.connect(onConnectionEvent); connection.receiveHandler.connect(onResponse); @@ -58,8 +58,8 @@ class NetworkManager { updateState('login...'); c.send(new Request().setLogin( new LoginRequest() - .setUuid(user.uuid) - .setName(user.name) + .setUuid(user.uuid) + .setName(user.name) )); }).catchError(function(_) {}); } @@ -86,9 +86,17 @@ class NetworkManager { public function action(action:TankAction):Void { var update:GameUpdateRequest = switch action { - case TankAction.MOVE(direction): new GameUpdateRequest().setType(GameActionType.MOVE).setDirectionX(direction.x).setDirectionY(direction.y); - case TankAction.STOP: new GameUpdateRequest().setType(GameActionType.STOP); - case TankAction.SHOT: new GameUpdateRequest().setType(GameActionType.SHOT); + case TankAction.MOVE(direction): + new GameUpdateRequest() + .setType(GameActionTypeProto.MOVE) + .setDirectionX(direction.x) + .setDirectionY(direction.y); + case TankAction.STOP: + new GameUpdateRequest() + .setType(GameActionTypeProto.STOP); + case TankAction.SHOT: + new GameUpdateRequest() + .setType(GameActionTypeProto.SHOT); case _: null; } if (update != null) { diff --git a/src/client/haxe/ru/m/tankz/sound/SoundManager.hx b/src/client/haxe/ru/m/tankz/sound/SoundManager.hx index 6513622..9520f83 100644 --- a/src/client/haxe/ru/m/tankz/sound/SoundManager.hx +++ b/src/client/haxe/ru/m/tankz/sound/SoundManager.hx @@ -19,7 +19,7 @@ class SoundManager { public function new() {} public function play(id:String):Void { - L.d(TAG, 'play: ${id}'); + //L.d(TAG, 'play: ${id}'); var sound:Sound = Assets.getSound('resources/sounds/${id}.${type}'); if (sound != null) { sound.play(); diff --git a/src/common/haxe/ru/m/tankz/config/Config.hx b/src/common/haxe/ru/m/tankz/config/Config.hx index 010ac20..73058b0 100644 --- a/src/common/haxe/ru/m/tankz/config/Config.hx +++ b/src/common/haxe/ru/m/tankz/config/Config.hx @@ -4,9 +4,14 @@ import ru.m.draw.Color; import ru.m.tankz.Type; +typedef CompleteRule = { + @:optional var team:TeamId; +} + typedef GameConfig = { var levels: Int; var friendlyFire:Bool; + var complete:Array; } typedef SpawnPoint = { diff --git a/src/common/haxe/ru/m/tankz/core/Entity.hx b/src/common/haxe/ru/m/tankz/core/Entity.hx index e91850f..232ec26 100755 --- a/src/common/haxe/ru/m/tankz/core/Entity.hx +++ b/src/common/haxe/ru/m/tankz/core/Entity.hx @@ -14,11 +14,15 @@ class Entity implements IKey { public function new(rect:Rectangle) { this.id = ++idCounter; - this.type = Type.getClassName(Type.getClass(this)).split('.').pop(); + this.type = Type.getClassName(Type.getClass(this)).split('.').pop().toLowerCase(); this.rect = rect; } private function get_key():String { return '$type:$id'; } + + public function toString():String { + return key; + } } diff --git a/src/common/haxe/ru/m/tankz/game/Game.hx b/src/common/haxe/ru/m/tankz/game/Game.hx index 8ee63d8..68bc9eb 100644 --- a/src/common/haxe/ru/m/tankz/game/Game.hx +++ b/src/common/haxe/ru/m/tankz/game/Game.hx @@ -1,7 +1,5 @@ package ru.m.tankz.game; -import ru.m.tankz.control.IControlFactory; -import ru.m.tankz.game.GameSave.PlayerSave; import haxe.ds.Option; import haxe.Timer; import haxework.provider.Provider; @@ -13,6 +11,7 @@ import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.config.Config; import ru.m.tankz.control.Control; +import ru.m.tankz.control.IControlFactory; import ru.m.tankz.core.Bonus; import ru.m.tankz.core.Eagle; import ru.m.tankz.core.Entity; @@ -232,6 +231,11 @@ class Game { } public function next():Option { + for (rule in config.game.complete) { + if (rule.team != null && rule.team == state.loser) { + return Option.None; + } + } state.level++; if (state.level >= config.game.levels) state.level = 0; return Option.Some({type: state.type, presetId: preset.id, level: state.level}); diff --git a/src/common/haxe/ru/m/tankz/network/NetworkGame.hx b/src/common/haxe/ru/m/tankz/network/NetworkGame.hx new file mode 100644 index 0000000..2d5de75 --- /dev/null +++ b/src/common/haxe/ru/m/tankz/network/NetworkGame.hx @@ -0,0 +1,26 @@ +package ru.m.tankz.network; + +import ru.m.tankz.proto.game.GameChangeProto; +import ru.m.tankz.proto.core.GameProto; +import ru.m.tankz.Type; +import ru.m.tankz.game.Game; + + +class NetworkGame extends Game { + + public function new(type:GameType) { + super(type); + } + + public function load(proto:GameProto):Void { + // ToDo: + } + + public function update(changes:Array):Void { + + } + + public function export():GameProto { + return null; + } +} diff --git a/src/common/haxe/ru/m/tankz/game/ClassicGame.hx b/src/common/haxe/ru/m/tankz/preset/ClassicGame.hx similarity index 53% rename from src/common/haxe/ru/m/tankz/game/ClassicGame.hx rename to src/common/haxe/ru/m/tankz/preset/ClassicGame.hx index 2e30c13..7f4b7e8 100644 --- a/src/common/haxe/ru/m/tankz/game/ClassicGame.hx +++ b/src/common/haxe/ru/m/tankz/preset/ClassicGame.hx @@ -1,12 +1,9 @@ -package ru.m.tankz.game; +package ru.m.tankz.preset; -import haxe.ds.Option; -import ru.m.tankz.game.Game; -import ru.m.tankz.game.GameState; import ru.m.tankz.Type; -class ClassicGame extends Game { +class ClassicGame extends GamePreset { public static var TYPE(default, never):GameType = 'classic'; @@ -17,13 +14,6 @@ class ClassicGame extends Game { public static var PLAYER2(default, never):PresetId = 'player2'; public function new() { - super(TYPE); - } - - override public function next():Option { - if (state.loser == HUMAN) { - return Option.None; - } - return super.next(); + super(TYPE, [HUMAN, BOT], [PLAYER1, PLAYER2]); } } diff --git a/src/common/haxe/ru/m/tankz/game/DotaGame.hx b/src/common/haxe/ru/m/tankz/preset/DotaGame.hx similarity index 77% rename from src/common/haxe/ru/m/tankz/game/DotaGame.hx rename to src/common/haxe/ru/m/tankz/preset/DotaGame.hx index 6789b43..49d7de2 100644 --- a/src/common/haxe/ru/m/tankz/game/DotaGame.hx +++ b/src/common/haxe/ru/m/tankz/preset/DotaGame.hx @@ -1,10 +1,9 @@ -package ru.m.tankz.game; +package ru.m.tankz.preset; -import ru.m.tankz.game.Game; import ru.m.tankz.Type; -class DotaGame extends Game { +class DotaGame extends GamePreset { public static var TYPE(default, never):GameType = 'dota'; @@ -16,6 +15,6 @@ class DotaGame extends Game { public static var PLAYER2_VS(default, never):PresetId = 'player2_vs'; public function new() { - super(TYPE); + super(TYPE, [RADIANT, DIRE], [PLAYER1, PLAYER2_COOP, PLAYER2_VS]); } } diff --git a/src/common/haxe/ru/m/tankz/preset/GamePreset.hx b/src/common/haxe/ru/m/tankz/preset/GamePreset.hx new file mode 100644 index 0000000..f933a51 --- /dev/null +++ b/src/common/haxe/ru/m/tankz/preset/GamePreset.hx @@ -0,0 +1,17 @@ +package ru.m.tankz.preset; + +import ru.m.tankz.Type; + + +class GamePreset { + + public var type(default, null):GameType; + public var teams(default, null):Array; + public var presets(default, null):Array; + + public function new(type:GameType, teams:Array, presets:Array) { + this.type = type; + this.teams = teams; + this.presets = presets; + } +} \ No newline at end of file diff --git a/src/common/proto/core.proto b/src/common/proto/core.proto index f300957..839d9a9 100644 --- a/src/common/proto/core.proto +++ b/src/common/proto/core.proto @@ -3,21 +3,35 @@ syntax = "proto3"; package ru.m.tankz.proto.core; -message User { +message UserProto { string uuid = 1; string name = 2; } -enum GameState { +enum GameStateProto { READY = 0; STARTED = 1; ENDED = 2; } -message Game { +message BrickProto { + string type = 1; +} + +message EntityProto { + string type = 1; +} + +message GameInfoProto { int32 id = 1; string type = 2; - User creator = 3; - repeated User players = 4; - GameState state = 5; + UserProto creator = 3; + repeated UserProto players = 4; + GameStateProto state = 5; +} + +message GameProto { + GameInfoProto info = 1; + repeated BrickProto map = 2; + repeated EntityProto entities = 3; } \ No newline at end of file diff --git a/src/common/proto/game.proto b/src/common/proto/game.proto index d4ed140..f290470 100644 --- a/src/common/proto/game.proto +++ b/src/common/proto/game.proto @@ -3,18 +3,13 @@ syntax = "proto3"; package ru.m.tankz.proto.game; -enum GameActionType { +enum GameActionTypeProto { MOVE = 0; SHOT = 1; STOP = 2; } -enum GameObjectType { - TANK = 0; - BULLET = 1; -} - -enum GameChangeType { +enum GameChangeTypeProto { MOVED = 0; DESTROED = 1; MODIFIED = 2; @@ -22,12 +17,12 @@ enum GameChangeType { DIRECTION = 4; } -message GameChange { - GameChangeType type = 1; - GameObjectType objectType = 2; - int32 objectId = 3; +message GameChangeProto { + GameChangeTypeProto type = 1; + string entityType = 2; + int32 entityId = 3; float x = 4; float y = 5; int32 directionX = 6; int32 directionY = 7; -} +} \ No newline at end of file diff --git a/src/common/proto/pack.proto b/src/common/proto/pack.proto index ae55cb7..496fde1 100644 --- a/src/common/proto/pack.proto +++ b/src/common/proto/pack.proto @@ -18,7 +18,7 @@ message LoginRequest { } message LoginResponse { - ru.m.tankz.proto.core.User user = 1; + ru.m.tankz.proto.core.UserProto user = 1; } // Logout @@ -30,7 +30,7 @@ message LogoutResponse {} message ListGameRequest {} message ListGameResponse { - repeated ru.m.tankz.proto.core.Game games = 1; + repeated ru.m.tankz.proto.core.GameInfoProto games = 1; } // Create Game @@ -39,7 +39,7 @@ message CreateGameRequest { } message CreateGameResponse { - ru.m.tankz.proto.core.Game game = 1; + ru.m.tankz.proto.core.GameInfoProto game = 1; } // Join Game @@ -48,32 +48,32 @@ message JoinGameRequest { } message JoinGameResponse { - ru.m.tankz.proto.core.Game game = 1; + ru.m.tankz.proto.core.GameInfoProto game = 1; } // Leave Game message LeaveGameRequest {} message LeaveGameResponse { - ru.m.tankz.proto.core.Game game = 1; + ru.m.tankz.proto.core.GameInfoProto game = 1; } // Start Game message StartGameRequest {} message StartGameResponse { - ru.m.tankz.proto.core.Game game = 1; + ru.m.tankz.proto.core.GameInfoProto game = 1; } // Game Update message GameUpdateRequest { - ru.m.tankz.proto.game.GameActionType type = 1; + ru.m.tankz.proto.game.GameActionTypeProto type = 1; int32 directionX = 2; int32 directionY = 3; } message GameUpdateResponse { - repeated ru.m.tankz.proto.game.GameChange changes = 1; + repeated ru.m.tankz.proto.game.GameChangeProto changes = 1; } // Request diff --git a/src/client/resources/classic/config.yaml b/src/common/resources/classic/config.yaml similarity index 99% rename from src/client/resources/classic/config.yaml rename to src/common/resources/classic/config.yaml index 4595e70..810883d 100644 --- a/src/client/resources/classic/config.yaml +++ b/src/common/resources/classic/config.yaml @@ -1,6 +1,8 @@ game: levels: 36 friendlyFire: false + complete: + - team: human map: cellWidth: 22 @@ -180,3 +182,4 @@ bonuses: - {score: 500, type: life} - {score: 500, type: shovel, duration: 10} - {score: 500, type: star} + diff --git a/src/client/resources/classic/levels/level000.txt b/src/common/resources/classic/levels/level000.txt similarity index 100% rename from src/client/resources/classic/levels/level000.txt rename to src/common/resources/classic/levels/level000.txt diff --git a/src/client/resources/classic/levels/level001.txt b/src/common/resources/classic/levels/level001.txt similarity index 100% rename from src/client/resources/classic/levels/level001.txt rename to src/common/resources/classic/levels/level001.txt diff --git a/src/client/resources/classic/levels/level002.txt b/src/common/resources/classic/levels/level002.txt similarity index 100% rename from src/client/resources/classic/levels/level002.txt rename to src/common/resources/classic/levels/level002.txt diff --git a/src/client/resources/classic/levels/level003.txt b/src/common/resources/classic/levels/level003.txt similarity index 100% rename from src/client/resources/classic/levels/level003.txt rename to src/common/resources/classic/levels/level003.txt diff --git a/src/client/resources/classic/levels/level004.txt b/src/common/resources/classic/levels/level004.txt similarity index 100% rename from src/client/resources/classic/levels/level004.txt rename to src/common/resources/classic/levels/level004.txt diff --git a/src/client/resources/classic/levels/level005.txt b/src/common/resources/classic/levels/level005.txt similarity index 100% rename from src/client/resources/classic/levels/level005.txt rename to src/common/resources/classic/levels/level005.txt diff --git a/src/client/resources/classic/levels/level006.txt b/src/common/resources/classic/levels/level006.txt similarity index 100% rename from src/client/resources/classic/levels/level006.txt rename to src/common/resources/classic/levels/level006.txt diff --git a/src/client/resources/classic/levels/level007.txt b/src/common/resources/classic/levels/level007.txt similarity index 100% rename from src/client/resources/classic/levels/level007.txt rename to src/common/resources/classic/levels/level007.txt diff --git a/src/client/resources/classic/levels/level008.txt b/src/common/resources/classic/levels/level008.txt similarity index 100% rename from src/client/resources/classic/levels/level008.txt rename to src/common/resources/classic/levels/level008.txt diff --git a/src/client/resources/classic/levels/level009.txt b/src/common/resources/classic/levels/level009.txt similarity index 100% rename from src/client/resources/classic/levels/level009.txt rename to src/common/resources/classic/levels/level009.txt diff --git a/src/client/resources/classic/levels/level010.txt b/src/common/resources/classic/levels/level010.txt similarity index 100% rename from src/client/resources/classic/levels/level010.txt rename to src/common/resources/classic/levels/level010.txt diff --git a/src/client/resources/classic/levels/level011.txt b/src/common/resources/classic/levels/level011.txt similarity index 100% rename from src/client/resources/classic/levels/level011.txt rename to src/common/resources/classic/levels/level011.txt diff --git a/src/client/resources/classic/levels/level012.txt b/src/common/resources/classic/levels/level012.txt similarity index 100% rename from src/client/resources/classic/levels/level012.txt rename to src/common/resources/classic/levels/level012.txt diff --git a/src/client/resources/classic/levels/level013.txt b/src/common/resources/classic/levels/level013.txt similarity index 100% rename from src/client/resources/classic/levels/level013.txt rename to src/common/resources/classic/levels/level013.txt diff --git a/src/client/resources/classic/levels/level014.txt b/src/common/resources/classic/levels/level014.txt similarity index 100% rename from src/client/resources/classic/levels/level014.txt rename to src/common/resources/classic/levels/level014.txt diff --git a/src/client/resources/classic/levels/level015.txt b/src/common/resources/classic/levels/level015.txt similarity index 100% rename from src/client/resources/classic/levels/level015.txt rename to src/common/resources/classic/levels/level015.txt diff --git a/src/client/resources/classic/levels/level016.txt b/src/common/resources/classic/levels/level016.txt similarity index 100% rename from src/client/resources/classic/levels/level016.txt rename to src/common/resources/classic/levels/level016.txt diff --git a/src/client/resources/classic/levels/level017.txt b/src/common/resources/classic/levels/level017.txt similarity index 100% rename from src/client/resources/classic/levels/level017.txt rename to src/common/resources/classic/levels/level017.txt diff --git a/src/client/resources/classic/levels/level018.txt b/src/common/resources/classic/levels/level018.txt similarity index 100% rename from src/client/resources/classic/levels/level018.txt rename to src/common/resources/classic/levels/level018.txt diff --git a/src/client/resources/classic/levels/level019.txt b/src/common/resources/classic/levels/level019.txt similarity index 100% rename from src/client/resources/classic/levels/level019.txt rename to src/common/resources/classic/levels/level019.txt diff --git a/src/client/resources/classic/levels/level020.txt b/src/common/resources/classic/levels/level020.txt similarity index 100% rename from src/client/resources/classic/levels/level020.txt rename to src/common/resources/classic/levels/level020.txt diff --git a/src/client/resources/classic/levels/level021.txt b/src/common/resources/classic/levels/level021.txt similarity index 100% rename from src/client/resources/classic/levels/level021.txt rename to src/common/resources/classic/levels/level021.txt diff --git a/src/client/resources/classic/levels/level022.txt b/src/common/resources/classic/levels/level022.txt similarity index 100% rename from src/client/resources/classic/levels/level022.txt rename to src/common/resources/classic/levels/level022.txt diff --git a/src/client/resources/classic/levels/level023.txt b/src/common/resources/classic/levels/level023.txt similarity index 100% rename from src/client/resources/classic/levels/level023.txt rename to src/common/resources/classic/levels/level023.txt diff --git a/src/client/resources/classic/levels/level024.txt b/src/common/resources/classic/levels/level024.txt similarity index 100% rename from src/client/resources/classic/levels/level024.txt rename to src/common/resources/classic/levels/level024.txt diff --git a/src/client/resources/classic/levels/level025.txt b/src/common/resources/classic/levels/level025.txt similarity index 100% rename from src/client/resources/classic/levels/level025.txt rename to src/common/resources/classic/levels/level025.txt diff --git a/src/client/resources/classic/levels/level026.txt b/src/common/resources/classic/levels/level026.txt similarity index 100% rename from src/client/resources/classic/levels/level026.txt rename to src/common/resources/classic/levels/level026.txt diff --git a/src/client/resources/classic/levels/level027.txt b/src/common/resources/classic/levels/level027.txt similarity index 100% rename from src/client/resources/classic/levels/level027.txt rename to src/common/resources/classic/levels/level027.txt diff --git a/src/client/resources/classic/levels/level028.txt b/src/common/resources/classic/levels/level028.txt similarity index 100% rename from src/client/resources/classic/levels/level028.txt rename to src/common/resources/classic/levels/level028.txt diff --git a/src/client/resources/classic/levels/level029.txt b/src/common/resources/classic/levels/level029.txt similarity index 100% rename from src/client/resources/classic/levels/level029.txt rename to src/common/resources/classic/levels/level029.txt diff --git a/src/client/resources/classic/levels/level030.txt b/src/common/resources/classic/levels/level030.txt similarity index 100% rename from src/client/resources/classic/levels/level030.txt rename to src/common/resources/classic/levels/level030.txt diff --git a/src/client/resources/classic/levels/level031.txt b/src/common/resources/classic/levels/level031.txt similarity index 100% rename from src/client/resources/classic/levels/level031.txt rename to src/common/resources/classic/levels/level031.txt diff --git a/src/client/resources/classic/levels/level032.txt b/src/common/resources/classic/levels/level032.txt similarity index 100% rename from src/client/resources/classic/levels/level032.txt rename to src/common/resources/classic/levels/level032.txt diff --git a/src/client/resources/classic/levels/level033.txt b/src/common/resources/classic/levels/level033.txt similarity index 100% rename from src/client/resources/classic/levels/level033.txt rename to src/common/resources/classic/levels/level033.txt diff --git a/src/client/resources/classic/levels/level034.txt b/src/common/resources/classic/levels/level034.txt similarity index 100% rename from src/client/resources/classic/levels/level034.txt rename to src/common/resources/classic/levels/level034.txt diff --git a/src/client/resources/classic/levels/level035.txt b/src/common/resources/classic/levels/level035.txt similarity index 100% rename from src/client/resources/classic/levels/level035.txt rename to src/common/resources/classic/levels/level035.txt diff --git a/src/client/resources/dota/config.yaml b/src/common/resources/dota/config.yaml similarity index 99% rename from src/client/resources/dota/config.yaml rename to src/common/resources/dota/config.yaml index 47acc12..93f4b7a 100644 --- a/src/client/resources/dota/config.yaml +++ b/src/common/resources/dota/config.yaml @@ -1,6 +1,7 @@ game: levels: 8 friendlyFire: true + complete: [] map: cellWidth: 22 diff --git a/src/client/resources/dota/levels/level000.txt b/src/common/resources/dota/levels/level000.txt similarity index 100% rename from src/client/resources/dota/levels/level000.txt rename to src/common/resources/dota/levels/level000.txt diff --git a/src/client/resources/dota/levels/level001.txt b/src/common/resources/dota/levels/level001.txt similarity index 100% rename from src/client/resources/dota/levels/level001.txt rename to src/common/resources/dota/levels/level001.txt diff --git a/src/client/resources/dota/levels/level002.txt b/src/common/resources/dota/levels/level002.txt similarity index 100% rename from src/client/resources/dota/levels/level002.txt rename to src/common/resources/dota/levels/level002.txt diff --git a/src/client/resources/dota/levels/level003.txt b/src/common/resources/dota/levels/level003.txt similarity index 100% rename from src/client/resources/dota/levels/level003.txt rename to src/common/resources/dota/levels/level003.txt diff --git a/src/client/resources/dota/levels/level004.txt b/src/common/resources/dota/levels/level004.txt similarity index 100% rename from src/client/resources/dota/levels/level004.txt rename to src/common/resources/dota/levels/level004.txt diff --git a/src/client/resources/dota/levels/level005.txt b/src/common/resources/dota/levels/level005.txt similarity index 100% rename from src/client/resources/dota/levels/level005.txt rename to src/common/resources/dota/levels/level005.txt diff --git a/src/client/resources/dota/levels/level006.txt b/src/common/resources/dota/levels/level006.txt similarity index 100% rename from src/client/resources/dota/levels/level006.txt rename to src/common/resources/dota/levels/level006.txt diff --git a/src/client/resources/dota/levels/level007.txt b/src/common/resources/dota/levels/level007.txt similarity index 100% rename from src/client/resources/dota/levels/level007.txt rename to src/common/resources/dota/levels/level007.txt 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 cb1d5ac..f64fbab 100644 --- a/src/server/haxe/ru/m/tankz/server/game/GameManager.hx +++ b/src/server/haxe/ru/m/tankz/server/game/GameManager.hx @@ -1,17 +1,17 @@ package ru.m.tankz.server.game; +import ru.m.tankz.preset.ClassicGame; import ru.m.tankz.game.GameSave; import ru.m.tankz.proto.pack.StartGameResponse; -import ru.m.tankz.game.ClassicGame; import ru.m.tankz.proto.pack.LeaveGameResponse; 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 as RunGame; -import ru.m.tankz.proto.core.GameState; -import ru.m.tankz.proto.core.Game; -import ru.m.tankz.proto.core.User; +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; import ru.m.tankz.server.session.Thread; import ru.m.tankz.server.session.Session; @@ -57,27 +57,27 @@ class GameManager { private static var idCounter:Int = 0; + public var gameInfo(default, null):GameInfoProto; public var game(default, null):Game; - public var runGame(default, null):RunGame; private var timer:NekoTimer; //private var changes:Array = new Array(); - public function new(creator:User) { - game = new Game() - .setId(idCounter++) - .setState(GameState.READY) - .setCreator(creator); - game.addPlayers(creator); - byGameId.set(game.id, this); + public function new(creator:UserProto) { + gameInfo = new GameInfoProto() + .setId(idCounter++) + .setState(GameStateProto.READY) + .setCreator(creator); + gameInfo.addPlayers(creator); + byGameId.set(gameInfo.id, this); byPersonId.set(creator.uuid, this); - broadcast(new Response().setCreateGame(new CreateGameResponse().setGame(game))); + broadcast(new Response().setCreateGame(new CreateGameResponse().setGame(gameInfo))); broadcastGames(); } - public static function getReadyGames():Array { - return Lambda.array(Lambda.filter(Lambda.map(GameManager.byGameId, function(gm) return gm.game), function(game) return game.state == GameState.READY)); + public static function getReadyGames():Array { + return Lambda.array(Lambda.filter(Lambda.map(GameManager.byGameId, function(gm) return gm.gameInfo), function(game) return game.state == GameStateProto.READY)); } public function broadcastGames() { @@ -89,24 +89,24 @@ class GameManager { } public function broadcast(packet:Response) { - for (player in game.players) { + for (player in gameInfo.players) { var session:Session = Session.sessions.get(player.uuid); session.send(packet); } } - public function join(user:User) { - game.addPlayers(user); + public function join(user:UserProto) { + gameInfo.addPlayers(user); byPersonId.set(user.uuid, this); - broadcast(new Response().setJoinGame(new JoinGameResponse().setGame(game))); + broadcast(new Response().setJoinGame(new JoinGameResponse().setGame(gameInfo))); } - public function leave(user:User) { - game.setPlayers(game.players.filter(function(p) return p.uuid != user.uuid)); + public function leave(user:UserProto) { + gameInfo.setPlayers(gameInfo.players.filter(function(p:UserProto) return p.uuid != user.uuid)); byPersonId.remove(user.uuid); - var packet = new Response().setLeaveGame(new LeaveGameResponse().setGame(game)); + var packet = new Response().setLeaveGame(new LeaveGameResponse().setGame(gameInfo)); Session.sessions.get(user.uuid).send(packet); - if (game.players.length == 0/* || person.id == game.creator.id*/) { + if (gameInfo.players.length == 0/* || person.id == game.creator.id*/) { stop(); } else { broadcast(packet); @@ -114,29 +114,29 @@ class GameManager { } public function start() { - game.setState(GameState.STARTED); - runGame = new ClassicGame(); - runGame.start(new GameSave({type: ClassicGame.TYPE, presetId: ClassicGame.PLAYER1, level: 0})); + gameInfo.setState(GameStateProto.STARTED); + game = new Game(ClassicGame.TYPE); + game.start(new GameSave({type: ClassicGame.TYPE, presetId: ClassicGame.PLAYER1, level: 0})); timer = new NekoTimer(30); timer.run = update; - broadcast(new Response().setStartGame(new StartGameResponse().setGame(game))); + broadcast(new Response().setStartGame(new StartGameResponse().setGame(gameInfo))); } public function stop() { - game.setState(GameState.ENDED); - game.setPlayers([]); - byGameId.remove(game.id); - for (p in game.players) byPersonId.remove(p.uuid); + gameInfo.setState(GameStateProto.ENDED); + gameInfo.setPlayers([]); + byGameId.remove(gameInfo.id); + for (p in gameInfo.players) byPersonId.remove(p.uuid); if (timer != null) { timer.stop(); timer = null; } - broadcast(new Response().setLeaveGame(new LeaveGameResponse().setGame(game))); + broadcast(new Response().setLeaveGame(new LeaveGameResponse().setGame(gameInfo))); broadcastGames(); } private function update() { - runGame.engine.update(); + game.engine.update(); /*var changes = engine.update(); changes = this.changes.concat(changes); this.changes = []; 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 707ba74..73edaa8 100755 --- a/src/server/haxe/ru/m/tankz/server/session/Session.hx +++ b/src/server/haxe/ru/m/tankz/server/session/Session.hx @@ -6,7 +6,7 @@ import haxe.io.Bytes; import ru.m.connect.IConnection; import ru.m.connect.neko.NekoConnection; import ru.m.connect.neko.NekoWebConnection; -import ru.m.tankz.proto.core.User; +import ru.m.tankz.proto.core.UserProto; import ru.m.tankz.proto.pack.CreateGameRequest; import ru.m.tankz.proto.pack.CreateGameResponse; import ru.m.tankz.proto.pack.JoinGameRequest; @@ -43,7 +43,7 @@ class Session { public static var sessions:Map = new Map(); - public var user(default, null):User; + public var user(default, null):UserProto; public var gameId(default, null):Int = -1; public var connection(default, null):ServerConnection; @@ -103,9 +103,9 @@ class Session { } private function login(request:LoginRequest):LoginResponse { - user = new User() - .setUuid(request.uuid != null ? request.uuid : UUID.generateRandom(new Random()).toString()) - .setName(request.name); + user = new UserProto() + .setUuid(request.uuid != null ? request.uuid : UUID.generateRandom(new Random()).toString()) + .setName(request.name); sessions.set(user.uuid, this); GameManager.subscribers.set(user.uuid, true); return new LoginResponse().setUser(user); @@ -123,24 +123,24 @@ class Session { private function createGame(request:CreateGameRequest):CreateGameResponse { var gameManager:GameManager = new GameManager(user); - return new CreateGameResponse().setGame(gameManager.game); + return new CreateGameResponse().setGame(gameManager.gameInfo); } private function joinGame(request:JoinGameRequest):JoinGameResponse { var gameManager:GameManager = GameManager.byGameId.get(request.gameId); gameManager.join(user); - return new JoinGameResponse().setGame(gameManager.game); + return new JoinGameResponse().setGame(gameManager.gameInfo); } private function leaveGame(request:LeaveGameRequest):LeaveGameResponse { var gameManager:GameManager = GameManager.byPersonId.get(user.uuid); gameManager.leave(user); - return new LeaveGameResponse().setGame(gameManager.game); + return new LeaveGameResponse().setGame(gameManager.gameInfo); } private function startGame(request:StartGameRequest):StartGameResponse { var gameManager:GameManager = GameManager.byPersonId.get(user.uuid); gameManager.start(); - return new StartGameResponse().setGame(gameManager.game); + return new StartGameResponse().setGame(gameManager.gameInfo); } } \ No newline at end of file