[common] tanks spawn types
This commit is contained in:
@@ -26,17 +26,28 @@ class Animate extends Bitmap {
|
||||
}
|
||||
}
|
||||
|
||||
private static var a = new BitmapData(1, 1);
|
||||
|
||||
public var playing(default, set):Bool;
|
||||
private var frames:Array<BitmapData>;
|
||||
public var frames(default, set):Array<BitmapData>;
|
||||
private var index:Int;
|
||||
|
||||
public function new(frames:Array<BitmapData>) {
|
||||
super(frames[0], PixelSnapping.AUTO, true);
|
||||
this.frames = frames;
|
||||
public function new(?frames:Array<BitmapData>) {
|
||||
super(null, PixelSnapping.AUTO, true);
|
||||
this.frames = frames == null ? [] : frames;
|
||||
init();
|
||||
instances.push(this);
|
||||
}
|
||||
|
||||
public function set_frames(value:Array<BitmapData>):Array<BitmapData> {
|
||||
if (value != null) {
|
||||
frames = value;
|
||||
bitmapData = frames[0];
|
||||
index = 0;
|
||||
}
|
||||
return frames;
|
||||
}
|
||||
|
||||
public function set_playing(value:Bool):Bool {
|
||||
if (playing != value) {
|
||||
playing = value;
|
||||
|
||||
@@ -117,25 +117,34 @@ class BrickItem extends RenderItem<Brick, Shape> {
|
||||
class TankItem extends RenderItem<Tank, Animate> {
|
||||
|
||||
private var type:String;
|
||||
private var hits:Int;
|
||||
|
||||
public function new(value:Tank) {
|
||||
super(value);
|
||||
this.view = new Animate(getFrames().map(function(s) return Assets.getBitmapData(s)));
|
||||
view = new Animate();
|
||||
redraw();
|
||||
}
|
||||
|
||||
override public function redraw():Void {
|
||||
view.frames = getFrames().map(function(s) return Assets.getBitmapData(s));
|
||||
}
|
||||
|
||||
private function getFrames():Array<String> {
|
||||
var team = value.playerId.team;
|
||||
var group = value.config.group;
|
||||
var index = value.playerId.index;
|
||||
if (group == 'human') group = 'player';
|
||||
if (group == 'radiant') {
|
||||
group = 'player';
|
||||
if (team == 'radiant') {
|
||||
index = 0;
|
||||
}
|
||||
if (group == 'dire') {
|
||||
group = 'player';
|
||||
if (team == 'dire') {
|
||||
index = 1;
|
||||
}
|
||||
if (group == 'bot') index = 0;
|
||||
if (team == 'human' || team == 'radiant' || team == 'dire') {
|
||||
group = 'player';
|
||||
}
|
||||
if (team == 'bot') {
|
||||
index = value.hits;
|
||||
}
|
||||
return [
|
||||
'resources/images/tank/${group}/tank_${group.charAt(0)}${value.config.type}_${index}-0.png',
|
||||
'resources/images/tank/${group}/tank_${group.charAt(0)}${value.config.type}_${index}-1.png',
|
||||
@@ -145,8 +154,10 @@ class TankItem extends RenderItem<Tank, Animate> {
|
||||
override public function update():Void {
|
||||
super.update();
|
||||
var t = value.config.type;
|
||||
if (t != this.type) {
|
||||
var h = value.hits;
|
||||
if (t != this.type || h != this.hits) {
|
||||
this.type = t;
|
||||
this.hits = h;
|
||||
redraw();
|
||||
}
|
||||
view.playing = (value.mx !=0 || value.my != 0);
|
||||
|
||||
@@ -24,7 +24,7 @@ class LevelFrame extends VGroupView implements ViewBuilder implements LevelFrame
|
||||
|
||||
public function onShow():Void {
|
||||
var state = Provider.get(GameState);
|
||||
var c = ConfigBundle.get(state.type).levels;
|
||||
var c = ConfigBundle.get(state.type).game.levels;
|
||||
levels.data = [for (i in 0...c) i];
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
levels: 36
|
||||
game:
|
||||
levels: 36
|
||||
friendlyFire: false
|
||||
|
||||
map:
|
||||
cellWidth: 22
|
||||
@@ -39,6 +41,10 @@ bricks:
|
||||
teams:
|
||||
- id: human
|
||||
spawnInterval: 0
|
||||
tanks:
|
||||
- group: human
|
||||
type: 0
|
||||
rate: 1
|
||||
points:
|
||||
- type: eagle
|
||||
index: -1
|
||||
@@ -57,6 +63,19 @@ teams:
|
||||
direction: top
|
||||
- id: bot
|
||||
spawnInterval: 3000
|
||||
tanks:
|
||||
- group: bot
|
||||
type: 0
|
||||
rate: 0.5
|
||||
- group: bot
|
||||
type: 1
|
||||
rate: 0.5
|
||||
- group: bot
|
||||
type: 2
|
||||
rate: 0.5
|
||||
- group: bot
|
||||
type: 3
|
||||
rate: 0.5
|
||||
points:
|
||||
- type: tank
|
||||
index: -1
|
||||
@@ -107,7 +126,7 @@ tanks:
|
||||
bullet:
|
||||
<<: *bullet
|
||||
speed: 9.0
|
||||
bullets: 3
|
||||
bullets: 2
|
||||
|
||||
- type: 3
|
||||
width: 42
|
||||
@@ -159,4 +178,4 @@ tanks:
|
||||
speed: 8.0
|
||||
bullets: 1
|
||||
score: 400
|
||||
hits: 4
|
||||
hits: 3
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
levels: 36
|
||||
game:
|
||||
levels: 2
|
||||
friendlyFire: true
|
||||
|
||||
map:
|
||||
cellWidth: 22
|
||||
@@ -36,8 +38,24 @@ bricks:
|
||||
layer: 2
|
||||
armor: 1
|
||||
|
||||
team_tanks: &team_tanks
|
||||
tanks:
|
||||
- group: any
|
||||
type: 0
|
||||
rate: 0.25
|
||||
- group: any
|
||||
type: 1
|
||||
rate: 0.25
|
||||
- group: any
|
||||
type: 2
|
||||
rate: 0.25
|
||||
# - group: any
|
||||
# type: 3
|
||||
# rate: 0.25
|
||||
|
||||
teams:
|
||||
- id: radiant
|
||||
- <<: *team_tanks
|
||||
id: radiant
|
||||
spawnInterval: 0
|
||||
points:
|
||||
- type: eagle
|
||||
@@ -49,28 +67,29 @@ teams:
|
||||
index: 0
|
||||
x: 0
|
||||
y: 0
|
||||
direction: top
|
||||
direction: right
|
||||
- type: tank
|
||||
index: 1
|
||||
x: 6
|
||||
y: 10
|
||||
direction: top
|
||||
direction: right
|
||||
- type: tank
|
||||
index: 2
|
||||
x: 6
|
||||
y: 16
|
||||
direction: top
|
||||
direction: right
|
||||
- type: tank
|
||||
index: 3
|
||||
x: 6
|
||||
y: 22
|
||||
direction: top
|
||||
direction: right
|
||||
- type: tank
|
||||
index: 4
|
||||
x: 10
|
||||
y: 28
|
||||
direction: top
|
||||
- id: dire
|
||||
direction: right
|
||||
- <<: *team_tanks
|
||||
id: dire
|
||||
spawnInterval: 0
|
||||
points:
|
||||
- type: eagle
|
||||
@@ -82,27 +101,27 @@ teams:
|
||||
index: 0
|
||||
x: 38
|
||||
y: 28
|
||||
direction: bottom
|
||||
direction: left
|
||||
- type: tank
|
||||
index: 1
|
||||
x: 32
|
||||
y: 18
|
||||
direction: bottom
|
||||
direction: left
|
||||
- type: tank
|
||||
index: 2
|
||||
x: 32
|
||||
y: 12
|
||||
direction: bottom
|
||||
direction: left
|
||||
- type: tank
|
||||
index: 3
|
||||
x: 32
|
||||
y: 6
|
||||
direction: bottom
|
||||
direction: left
|
||||
- type: tank
|
||||
index: 4
|
||||
x: 28
|
||||
y: 0
|
||||
direction: bottom
|
||||
direction: left
|
||||
|
||||
|
||||
bullet: &bullet
|
||||
@@ -112,7 +131,7 @@ bullet: &bullet
|
||||
piercing: 1
|
||||
|
||||
tanks:
|
||||
radiant: &tanks
|
||||
any:
|
||||
- type: 0
|
||||
width: 36
|
||||
height: 36
|
||||
@@ -130,5 +149,22 @@ tanks:
|
||||
<<: *bullet
|
||||
speed: 8.5
|
||||
bullets: 1
|
||||
dire:
|
||||
- <<: *tanks
|
||||
|
||||
- type: 2
|
||||
width: 40
|
||||
height: 36
|
||||
speed: 3.0
|
||||
bullet:
|
||||
<<: *bullet
|
||||
speed: 9.0
|
||||
bullets: 2
|
||||
|
||||
- type: 3
|
||||
width: 42
|
||||
height: 38
|
||||
speed: 2.9
|
||||
bullet:
|
||||
<<: *bullet
|
||||
speed: 9.0
|
||||
piercing: 3
|
||||
bullets: 2
|
||||
30
src/client/resources/dota/levels/level001.txt
Normal file
30
src/client/resources/dota/levels/level001.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
0000000000000000000000000000000000004400
|
||||
0000000000000000000000000000000000004400
|
||||
0000000000000000000000000000000000004444
|
||||
0000000000000000000000000000000000004444
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000
|
||||
4444000000000000000000000000000000000000
|
||||
4444000000000000000000000000000000000000
|
||||
0044000000000000000000000000000000000000
|
||||
0044000000000000000000000000000000000000
|
||||
@@ -11,6 +11,7 @@ class BotControl extends Control {
|
||||
|
||||
private var shotTimer:Timer;
|
||||
private var turnTimer:Timer;
|
||||
private var turnDelayTimer:Timer;
|
||||
|
||||
public function new(index:Int) {
|
||||
super({type:TYPE, index:index});
|
||||
@@ -18,22 +19,22 @@ class BotControl extends Control {
|
||||
|
||||
override public function onCollision(with:EntityType):Void {
|
||||
switch (with) {
|
||||
case EntityType.TANK(_): turn();
|
||||
case EntityType.CELL(_): turn();
|
||||
case EntityType.TANK(_): turnAfter(300);
|
||||
case EntityType.CELL(_): turnAfter(300);
|
||||
case _:
|
||||
}
|
||||
}
|
||||
|
||||
override public function start():Void {
|
||||
//var tank = handler.entities.get(tankId);
|
||||
//action(TankAction.MOVE(tank.rect.direction));
|
||||
action(TankAction.MOVE(Direction.BOTTOM)); // ToDo: hardcode bot start direction
|
||||
if (handler == null) return;
|
||||
var tank = handler.entities.get(tankId);
|
||||
action(TankAction.MOVE(tank.rect.direction));
|
||||
if (shotTimer == null) {
|
||||
shotTimer = new Timer(1000);
|
||||
shotTimer.run = shot;
|
||||
}
|
||||
if (turnTimer == null) {
|
||||
turnTimer = new Timer(3000);
|
||||
turnTimer = new Timer(2000);
|
||||
turnTimer.run = turn;
|
||||
}
|
||||
}
|
||||
@@ -53,6 +54,17 @@ class BotControl extends Control {
|
||||
action(TankAction.SHOT);
|
||||
}
|
||||
|
||||
public function turnAfter(delay:Int):Void {
|
||||
if (turnDelayTimer == null) {
|
||||
turnDelayTimer = new Timer(delay);
|
||||
turnDelayTimer.run = function() {
|
||||
turnDelayTimer.stop();
|
||||
turnDelayTimer = null;
|
||||
turn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function turn():Void {
|
||||
action(TankAction.MOVE(randomDirection()));
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
package ru.m.tankz.config;
|
||||
|
||||
|
||||
typedef GameConfig = {
|
||||
var levels: Int;
|
||||
var friendlyFire:Bool;
|
||||
}
|
||||
|
||||
typedef SpawnPoint = {
|
||||
var type:String;
|
||||
var index:Int;
|
||||
@@ -41,6 +46,11 @@ typedef TankConfig = { > TankType,
|
||||
var speed:Float;
|
||||
var bullet:BulletConfig;
|
||||
var bullets:Int;
|
||||
var hits:Int;
|
||||
}
|
||||
|
||||
typedef TankSpawn = { > TankType,
|
||||
var rate: Float;
|
||||
}
|
||||
|
||||
|
||||
@@ -48,13 +58,14 @@ typedef TeamConfig = {
|
||||
var id:String;
|
||||
var size:Int;
|
||||
var spawnInterval:Int;
|
||||
var tanks:Array<TankSpawn>;
|
||||
var points:Array<SpawnPoint>;
|
||||
}
|
||||
|
||||
|
||||
class Config {
|
||||
public var type(default, null):String;
|
||||
public var levels(default, null):Int;
|
||||
public var game(default, null):GameConfig;
|
||||
public var map(default, null):MapConfig;
|
||||
public var bricks(default, null):Array<BrickConfig>;
|
||||
public var tanks(default, null):Array<TankConfig>;
|
||||
@@ -64,9 +75,9 @@ class Config {
|
||||
private var tankMap:Map<String, Map<String, TankConfig>>;
|
||||
private var teamMap:Map<String, TeamConfig>;
|
||||
|
||||
public function new(type:String, levels:Int, map:MapConfig, bricks:Array<BrickConfig>, teams:Array<TeamConfig>, tanks:Array<TankConfig>) {
|
||||
public function new(type:String, game:GameConfig, map:MapConfig, bricks:Array<BrickConfig>, teams:Array<TeamConfig>, tanks:Array<TankConfig>) {
|
||||
this.type = type;
|
||||
this.levels = levels;
|
||||
this.game = game;
|
||||
this.map = map;
|
||||
this.bricks = bricks;
|
||||
this.teams = teams;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package ru.m.tankz.config;
|
||||
|
||||
import ru.m.tankz.game.ClassicGame;
|
||||
import yaml.Parser;
|
||||
import openfl.Assets;
|
||||
import yaml.Yaml;
|
||||
@@ -8,7 +7,7 @@ import ru.m.tankz.config.Config;
|
||||
|
||||
|
||||
typedef ConfigSource = {
|
||||
var levels:Int;
|
||||
var game:GameConfig;
|
||||
var map: MapConfig;
|
||||
var bricks: Array<BrickConfig>;
|
||||
var teams: Array<TeamConfig>;
|
||||
@@ -31,6 +30,6 @@ class ConfigBundle {
|
||||
tanks.push(item);
|
||||
}
|
||||
}
|
||||
return new Config(type, source.levels, source.map, source.bricks, source.teams, tanks);
|
||||
return new Config(type, source.game, source.map, source.bricks, source.teams, tanks);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import ru.m.geom.Direction;
|
||||
class Tank extends MobileEntity {
|
||||
public var playerId(default, null):PlayerId;
|
||||
public var config(default, set):TankConfig;
|
||||
public var hits(default, default):Int;
|
||||
|
||||
private var bulletsCounter:Int = 0;
|
||||
|
||||
@@ -18,6 +19,7 @@ class Tank extends MobileEntity {
|
||||
super(new Rectangle(0, 0, config.width, config.height), config.speed, Direction.RIGHT);
|
||||
this.playerId = playerId;
|
||||
this.config = config;
|
||||
this.hits = config.hits;
|
||||
this.layer = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,16 @@ class CollisionProcessor implements EngineListener {
|
||||
public function onSpawn(entity:EntityType):Void {}
|
||||
|
||||
private function checkTankBullet(tank:Tank, bullet:Bullet):Bool {
|
||||
return tank.playerId.team != bullet.playerId.team;
|
||||
if (bullet.tankId == tank.id) return false;
|
||||
return engine.config.game.friendlyFire || tank.playerId.team != bullet.playerId.team;
|
||||
}
|
||||
|
||||
private function hitTank(tank:Tank):Void {
|
||||
if (tank.hits > 0) {
|
||||
tank.hits--;
|
||||
} else {
|
||||
engine.destroy(tank);
|
||||
}
|
||||
}
|
||||
|
||||
public function onCollision(entity:EntityType, with:EntityType):Void {
|
||||
@@ -42,7 +51,7 @@ class CollisionProcessor implements EngineListener {
|
||||
tank1.rect.lean(tank2.rect);
|
||||
case EntityType.BULLET(bullet2):
|
||||
if (checkTankBullet(tank1, bullet2)) {
|
||||
engine.destroy(tank1);
|
||||
hitTank(tank1);
|
||||
engine.destroy(bullet2);
|
||||
}
|
||||
case EntityType.EAGLE(eagle):
|
||||
@@ -55,7 +64,7 @@ class CollisionProcessor implements EngineListener {
|
||||
case EntityType.TANK(tank2):
|
||||
if (checkTankBullet(tank2, bullet1)) {
|
||||
engine.destroy(bullet1);
|
||||
engine.destroy(tank2);
|
||||
hitTank(tank2);
|
||||
}
|
||||
case EntityType.BULLET(bullet2):
|
||||
engine.destroy(bullet1);
|
||||
|
||||
@@ -59,7 +59,7 @@ class ClassicGame extends Game {
|
||||
override public function next():Option<GameState> {
|
||||
if (!state.teams[HUMAN].lose) {
|
||||
state.level++;
|
||||
if (state.level >= config.levels) state.level = 0;
|
||||
if (state.level >= config.game.levels) state.level = 0;
|
||||
state.teams[BOT].lose = false;
|
||||
state.teams[BOT].life = BOT_LIFE;
|
||||
for (ps in state.teams[HUMAN].players) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package ru.m.tankz.game;
|
||||
|
||||
import haxe.ds.Option;
|
||||
import ru.m.tankz.game.Game;
|
||||
import ru.m.tankz.game.GameState;
|
||||
|
||||
@@ -53,4 +54,10 @@ class DotaGame extends Game {
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
override public function next():Option<GameState> {
|
||||
state.level++;
|
||||
if (state.level >= config.game.levels) state.level = 0;
|
||||
return Option.Some(buildState(state.level, 0));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,8 +54,11 @@ class Game implements EngineListener {
|
||||
return teams.get(playerId.team).players[playerId.index];
|
||||
}
|
||||
|
||||
private function buildTank(playerId:PlayerId, config:TankConfig, point:SpawnPoint):Tank {
|
||||
var tank = new Tank(playerId, config);
|
||||
private function buildTank(playerId:PlayerId, point:SpawnPoint):Tank {
|
||||
var types:Array<TankSpawn> = teams[playerId.team].config.tanks;
|
||||
var type:TankSpawn = types[Math.floor(Math.random() * types.length)];
|
||||
var tankConfig:TankConfig = config.getTank(type.group, type.type);
|
||||
var tank = new Tank(playerId, tankConfig);
|
||||
applyPoint(tank, point);
|
||||
return tank;
|
||||
}
|
||||
@@ -114,7 +117,7 @@ class Game implements EngineListener {
|
||||
private function spawn(task:SpawnTask):Void {
|
||||
getPlayer(task.playerId).tankId = 0;
|
||||
if (trySpawn(task.playerId, true)) {
|
||||
var tank = buildTank(task.playerId, config.getTank(task.playerId.team, '0'), task.point);
|
||||
var tank = buildTank(task.playerId, task.point);
|
||||
var player:Player = getPlayer(task.playerId);
|
||||
engine.spawn(tank);
|
||||
player.tankId = tank.id;
|
||||
|
||||
Reference in New Issue
Block a user