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) {