From 9eb21fae7d7426e3d10dbe217f0ed82c983db536 Mon Sep 17 00:00:00 2001 From: shmyga Date: Sun, 28 Jan 2018 19:04:39 +0300 Subject: [PATCH] [common] added Dota game type --- package.json | 2 +- project.xml | 38 ++--- src/client/haxe/layout/frames/start.json | 4 +- src/client/haxe/ru/m/tankz/Client.hx | 2 + .../haxe/ru/m/tankz/render/RenderItem.hx | 8 ++ .../haxe/ru/m/tankz/view/frames/StartFrame.hx | 30 +++- src/client/resources/dota/config.yaml | 134 ++++++++++++++++++ src/client/resources/dota/levels/level000.txt | 30 ++++ .../haxe/ru/m/tankz/config/ConfigBundle.hx | 23 ++- src/common/haxe/ru/m/tankz/game/DotaGame.hx | 56 ++++++++ src/common/haxe/ru/m/tankz/game/Game.hx | 7 +- src/common/haxe/ru/m/tankz/map/LevelMap.hx | 2 +- 12 files changed, 291 insertions(+), 45 deletions(-) create mode 100644 src/client/resources/dota/config.yaml create mode 100644 src/client/resources/dota/levels/level000.txt create mode 100644 src/common/haxe/ru/m/tankz/game/DotaGame.hx diff --git a/package.json b/package.json index 92c56a9..0d2d477 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tankz", - "version": "0.0.7", + "version": "0.1.0", "private": true, "devDependencies": { "ansi-colors": "^1.0.1", diff --git a/project.xml b/project.xml index c75e7da..66938b0 100755 --- a/project.xml +++ b/project.xml @@ -1,22 +1,22 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/client/haxe/layout/frames/start.json b/src/client/haxe/layout/frames/start.json index 6378242..9315e93 100644 --- a/src/client/haxe/layout/frames/start.json +++ b/src/client/haxe/layout/frames/start.json @@ -19,9 +19,9 @@ "@style": "button" }, { - "id": "start_lan", + "id": "dota", "@type": "haxework.gui.ButtonView", - "text": "Multiplayer", + "text": "DotA", "@style": "button" } ] diff --git a/src/client/haxe/ru/m/tankz/Client.hx b/src/client/haxe/ru/m/tankz/Client.hx index cb26644..4cdb55b 100755 --- a/src/client/haxe/ru/m/tankz/Client.hx +++ b/src/client/haxe/ru/m/tankz/Client.hx @@ -1,6 +1,7 @@ package ru.m.tankz; import ru.m.tankz.game.ClassicGame; +import ru.m.tankz.game.DotaGame; import ru.m.tankz.game.Game; import flash.ui.Keyboard; import flash.events.KeyboardEvent; @@ -76,6 +77,7 @@ class Client implements IConnectionHandler { }); Provider.setFactory(Game, ClassicGame, ClassicGame.TYPE); + Provider.setFactory(Game, DotaGame, DotaGame.TYPE); } public function onPress(view:ButtonView):Void { diff --git a/src/client/haxe/ru/m/tankz/render/RenderItem.hx b/src/client/haxe/ru/m/tankz/render/RenderItem.hx index c61271c..c51892b 100644 --- a/src/client/haxe/ru/m/tankz/render/RenderItem.hx +++ b/src/client/haxe/ru/m/tankz/render/RenderItem.hx @@ -113,6 +113,14 @@ class TankItem extends RenderItem { var group = value.config.group; var index = value.playerId.index; if (group == 'human') group = 'player'; + if (group == 'radiant') { + group = 'player'; + index = 0; + } + if (group == 'dire') { + group = 'player'; + index = 1; + } if (group == 'bot') index = 0; return 'resources/images/tank/${group}/tank_${group.charAt(0)}${value.config.type}_${index}-0.png'; } diff --git a/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx b/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx index ba0ef4d..67f0223 100644 --- a/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/frames/StartFrame.hx @@ -1,7 +1,9 @@ package ru.m.tankz.view.frames; +import ru.m.tankz.game.Game; import ru.m.tankz.game.GameState; import ru.m.tankz.game.ClassicGame; +import ru.m.tankz.game.DotaGame; import haxework.gui.frame.IFrameSwitcher; import haxework.provider.Provider; import haxework.gui.ButtonView; @@ -9,27 +11,43 @@ import haxework.gui.ViewBuilder; import haxework.gui.VGroupView; +interface StartFrameLayout { + var start_1p(default, null):ButtonView; + var start_2p(default, null):ButtonView; + var dota(default, null):ButtonView; +} + + @:template("layout/frames/start.json", "layout/styles.json") -class StartFrame extends VGroupView implements ViewBuilder { +class StartFrame extends VGroupView implements ViewBuilder implements StartFrameLayout { public static inline var ID = "start"; public function init() { start_1p.onPress = this; start_2p.onPress = this; + dota.onPress = this; } public function onPress(view:ButtonView):Void { switch (view.id) { case 'start_1p': - startGame(1); + startGame(ClassicGame.TYPE, 1); case 'start_2p': - startGame(2); + startGame(ClassicGame.TYPE, 2); + case 'dota': + startGame(DotaGame.TYPE, 2); } } - private function startGame(humans:Int):Void { - Provider.set(GameState, ClassicGame.buildState(0, humans)); - Provider.get(IFrameSwitcher).change(LevelFrame.ID); + private function startGame(type:GameType, humans:Int):Void { + switch (type) { + case ClassicGame.TYPE: + Provider.set(GameState, ClassicGame.buildState(0, humans)); + Provider.get(IFrameSwitcher).change(LevelFrame.ID); + case DotaGame.TYPE: + Provider.set(GameState, DotaGame.buildState(0, humans)); + Provider.get(IFrameSwitcher).change(GameFrame.ID); + } } } diff --git a/src/client/resources/dota/config.yaml b/src/client/resources/dota/config.yaml new file mode 100644 index 0000000..5d8c19a --- /dev/null +++ b/src/client/resources/dota/config.yaml @@ -0,0 +1,134 @@ +levels: 36 + +map: + cellWidth: 22 + cellHeight: 22 + gridWidth: 40 + gridHeight: 30 + +bricks: + # border + - type: -1 + layer: 2 + armor: -1 + # none + - type: 0 + layer: 0 + armor: 0 + # ace + - type: 1 + layer: 0 + armor: 0 + # bush + - type: 2 + layer: 3 + armor: 0 + # water + - type: 3 + layer: 1 + armor: 0 + # armor + - type: 4 + layer: 2 + armor: 2 + # brick + - type: 5 + layer: 2 + armor: 1 + +teams: + - id: radiant + spawnInterval: 0 + points: + - type: eagle + index: -1 + x: 0 + y: 28 + direction: right + - type: tank + index: 0 + x: 0 + y: 0 + direction: top + - type: tank + index: 1 + x: 6 + y: 10 + direction: top + - type: tank + index: 2 + x: 6 + y: 16 + direction: top + - type: tank + index: 3 + x: 6 + y: 22 + direction: top + - type: tank + index: 4 + x: 10 + y: 28 + direction: top + - id: dire + spawnInterval: 0 + points: + - type: eagle + index: -1 + x: 38 + y: 0 + direction: right + - type: tank + index: 0 + x: 38 + y: 28 + direction: bottom + - type: tank + index: 1 + x: 32 + y: 18 + direction: bottom + - type: tank + index: 2 + x: 32 + y: 12 + direction: bottom + - type: tank + index: 3 + x: 32 + y: 6 + direction: bottom + - type: tank + index: 4 + x: 28 + y: 0 + direction: bottom + + +bullet: &bullet + width: 12 + height: 12 + speed: 0 + piercing: 1 + +tanks: + radiant: &tanks + - type: 0 + width: 36 + height: 36 + speed: 2.5 + bullet: + <<: *bullet + speed: 8.0 + bullets: 1 + + - type: 1 + width: 40 + height: 36 + speed: 3.0 + bullet: + <<: *bullet + speed: 8.5 + bullets: 1 + dire: + - <<: *tanks diff --git a/src/client/resources/dota/levels/level000.txt b/src/client/resources/dota/levels/level000.txt new file mode 100644 index 0000000..65ec086 --- /dev/null +++ b/src/client/resources/dota/levels/level000.txt @@ -0,0 +1,30 @@ +0000000000000000000000000000000000005500 +0000000000000000000000000000000000005500 +0000000000000000000000000000000000005555 +0000000000000000000000000000000000005555 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +0000000000000000000000000000000000000000 +5555000000000000000000000000000000000000 +5555000000000000000000000000000000000000 +0055000000000000000000000000000000000000 +0055000000000000000000000000000000000000 diff --git a/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx b/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx index 0163002..e37fba7 100644 --- a/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx +++ b/src/common/haxe/ru/m/tankz/config/ConfigBundle.hx @@ -22,20 +22,15 @@ class ConfigBundle { } public static function get(type:String):Config { - switch (type) { - case ClassicGame.TYPE: - var source:ConfigSource = convert(Yaml.parse(Assets.getText('resources/${type}/config.yaml'), Parser.options().useObjects())); - var tanks:Array = []; - for (group in Reflect.fields(source.tanks)) { - var data:Array = Reflect.field(source.tanks, group); - for (item in data) { - item.group = group; - tanks.push(item); - } - } - return new Config(type, source.levels, source.map, source.bricks, source.teams, tanks); - case _: - return null; + var source:ConfigSource = convert(Yaml.parse(Assets.getText('resources/${type}/config.yaml'), Parser.options().useObjects())); + var tanks:Array = []; + for (group in Reflect.fields(source.tanks)) { + var data:Array = Reflect.field(source.tanks, group); + for (item in data) { + item.group = group; + tanks.push(item); + } } + return new Config(type, source.levels, source.map, source.bricks, source.teams, tanks); } } diff --git a/src/common/haxe/ru/m/tankz/game/DotaGame.hx b/src/common/haxe/ru/m/tankz/game/DotaGame.hx new file mode 100644 index 0000000..c4ed959 --- /dev/null +++ b/src/common/haxe/ru/m/tankz/game/DotaGame.hx @@ -0,0 +1,56 @@ +package ru.m.tankz.game; + +import ru.m.tankz.game.Game; +import ru.m.tankz.game.GameState; + + +class DotaGame extends Game { + + public static var TYPE(default, never):GameType = 'dota'; + + public static var RADIANT(default, never):TeamId = 'radiant'; + public static var DIRE(default, never):TeamId = 'dire'; + + private static var TEAM_SIZE(default, never):Int = 5; + + public function new() { + super(TYPE); + } + + public static function buildState(level:Int, humans:Int):GameState { + var state = new GameState(); + state.type = TYPE; + state.level = level; + state.players[RADIANT] = new Map(); + state.players[DIRE] = new Map(); + for (i in 0...TEAM_SIZE) { + state.players[RADIANT][i] = { + index:i, + tank:{ + group: RADIANT, + type: '1' + }, + control:{ + type: 'bot', + index: i + }, + life:-1, + }; + } + for (i in 0...TEAM_SIZE) { + state.players[DIRE][i] = { + index:i, + tank:{ + group: DIRE, + type: '1' + }, + control:{ + type: 'bot', + index: i + }, + life:-1, + }; + } + return state; + } +} diff --git a/src/common/haxe/ru/m/tankz/game/Game.hx b/src/common/haxe/ru/m/tankz/game/Game.hx index dfc3dbe..26eb49a 100644 --- a/src/common/haxe/ru/m/tankz/game/Game.hx +++ b/src/common/haxe/ru/m/tankz/game/Game.hx @@ -74,10 +74,13 @@ class Game implements EngineListener { var control = switch (playerState.control.type) { case HumanControl.TYPE: new HumanControl(playerState.control.index); case BotControl.TYPE: new BotControl(playerState.control.index); + case 'none': null; case _: throw 'Unsupported control type: "${playerState.control.type}"'; } - player.control = control; - player.control.bind(engine); + if (control != null) { + player.control = control; + player.control.bind(engine); + } } } spawners.set(team.id, new Spawner(team.config, spawn)); diff --git a/src/common/haxe/ru/m/tankz/map/LevelMap.hx b/src/common/haxe/ru/m/tankz/map/LevelMap.hx index ec59d39..b91d7fe 100755 --- a/src/common/haxe/ru/m/tankz/map/LevelMap.hx +++ b/src/common/haxe/ru/m/tankz/map/LevelMap.hx @@ -41,7 +41,7 @@ class LevelMap { bricksMap = new HashMap(); bricks = Lambda.array(Lambda.mapi(data, function(i:Int, brickConfig:BrickConfig):Brick { var cellX = Std.int(i % gridWidth); - var cellY = Std.int(Math.floor(i / gridHeight)); + var cellY = Std.int(Math.floor(i / gridWidth)); var cells:HashMap = new HashMap(); var point:Point = new Point(cellX * 2, cellY * 2); if (brickConfig.layer > 0 || brickConfig.armor > 0) {