[common] added Dota game type

This commit is contained in:
2018-01-28 19:04:39 +03:00
parent 9ebed21c5f
commit 9eb21fae7d
12 changed files with 291 additions and 45 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "tankz",
"version": "0.0.7",
"version": "0.1.0",
"private": true,
"devDependencies": {
"ansi-colors": "^1.0.1",

View File

@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<project>
<meta title="Tank'z" package="ru.m.tankz" version="0.0.0" company="MegaLoMania"/>
<app main="ru.m.tankz.Client" path="target" file="tankz"/>
<source path="src/common/haxe"/>
<source path="src/client/haxe"/>
<source path="src-gen/haxe"/>
<assets path="src/client/resources" rename="resources" include="*"/>
<haxelib name="lime" version="6.0.1"/>
<haxelib name="openfl" version="7.0.0"/>
<haxelib name="promhx" version="1.1.0"/>
<haxelib name="protohx" version="0.4.6"/>
<haxelib name="haxework" version="git"/>
<haxelib name="yaml" version="1.3.0"/>
<!--<window width="760" height="600"/>-->
<haxeflag name="-D" value="swf-gpu"/>
<haxeflag name="-D" value="native-trace"/>
<!--<haxeflag name="-D" value="proto_debug"/>-->
<haxeflag name="-dce" value="no"/>
<!--<template path="src/client/webapp/index_template.html" rename="index.html"/>-->
<meta title="Tank'z" package="ru.m.tankz" version="0.0.0" company="MegaLoMania"/>
<app main="ru.m.tankz.Client" path="target" file="tankz"/>
<source path="src/common/haxe"/>
<source path="src/client/haxe"/>
<source path="src-gen/haxe"/>
<assets path="src/client/resources" rename="resources" include="*"/>
<haxelib name="lime" version="6.0.1"/>
<haxelib name="openfl" version="7.0.0"/>
<haxelib name="promhx" version="1.1.0"/>
<haxelib name="protohx" version="0.4.6"/>
<haxelib name="haxework" version="git"/>
<haxelib name="yaml" version="1.3.0"/>
<window width="1024" height="768" unless="html5"/>
<haxeflag name="-D" value="swf-gpu"/>
<haxeflag name="-D" value="native-trace"/>
<!--<haxeflag name="-D" value="proto_debug"/>-->
<haxeflag name="-dce" value="no"/>
<haxeflag name="-D" value="dom"/>
<!--<template path="src/client/webapp/index_template.html" rename="index.html"/>-->
</project>

View File

@@ -19,9 +19,9 @@
"@style": "button"
},
{
"id": "start_lan",
"id": "dota",
"@type": "haxework.gui.ButtonView",
"text": "Multiplayer",
"text": "DotA",
"@style": "button"
}
]

View File

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

View File

@@ -113,6 +113,14 @@ class TankItem extends RenderItem<Tank> {
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';
}

View File

@@ -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);
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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<TankConfig> = [];
for (group in Reflect.fields(source.tanks)) {
var data:Array<TankConfig> = 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<TankConfig> = [];
for (group in Reflect.fields(source.tanks)) {
var data:Array<TankConfig> = 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);
}
}

View File

@@ -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;
}
}

View File

@@ -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));

View File

@@ -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<Point, GridCell> = new HashMap();
var point:Point = new Point(cellX * 2, cellY * 2);
if (brickConfig.layer > 0 || brickConfig.armor > 0) {