[common] update level config, spawns points

This commit is contained in:
2018-02-06 17:41:45 +03:00
parent db5b805276
commit 1f6e4fbc3d
15 changed files with 319 additions and 222 deletions

View File

@@ -7,6 +7,7 @@ typedef GameConfig = {
}
typedef SpawnPoint = {
var team:String;
var type:String;
var index:Int;
var x:Int;
@@ -59,7 +60,12 @@ typedef TeamConfig = {
var size:Int;
var spawnInterval:Int;
var tanks:Array<TankSpawn>;
var points:Array<SpawnPoint>;
}
typedef LevelConfig = {
var data:Array<BrickConfig>;
@:optional var points:Array<SpawnPoint>;
}
@@ -70,17 +76,27 @@ class Config {
public var bricks(default, null):Array<BrickConfig>;
public var tanks(default, null):Array<TankConfig>;
public var teams(default, null):Array<TeamConfig>;
public var points(default, null):Array<SpawnPoint>;
private var brickMap:Map<Int, BrickConfig>;
private var tankMap:Map<String, Map<String, TankConfig>>;
private var teamMap:Map<String, TeamConfig>;
public function new(type:String, game:GameConfig, 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>,
points:Array<SpawnPoint>,
tanks:Array<TankConfig>
) {
this.type = type;
this.game = game;
this.map = map;
this.bricks = bricks;
this.teams = teams;
this.points = points;
this.tanks = tanks;
init();
}

View File

@@ -11,6 +11,7 @@ typedef ConfigSource = {
var map: MapConfig;
var bricks: Array<BrickConfig>;
var teams: Array<TeamConfig>;
var points: Array<SpawnPoint>;
var tanks: Dynamic<Array<TankConfig>>;
}
@@ -30,6 +31,6 @@ class ConfigBundle {
tanks.push(item);
}
}
return new Config(type, source.game, source.map, source.bricks, source.teams, tanks);
return new Config(type, source.game, source.map, source.bricks, source.teams, source.points, tanks);
}
}

View File

@@ -1,10 +1,19 @@
package ru.m.tankz.config;
import yaml.Renderer;
import yaml.Parser;
import yaml.Yaml;
import openfl.Assets;
import ru.m.tankz.game.Game;
import ru.m.tankz.config.Config;
typedef LevelSource = {
var data:String;
@:optional var points:Array<SpawnPoint>;
}
class LevelBundle {
private static function formatLevel(level:Int):String {
@@ -13,27 +22,48 @@ class LevelBundle {
return result;
}
public static function loads(config:Config, data:String):Array<BrickConfig> {
public static function loadsOld(config:Config, data:String):LevelConfig {
var bricks:Array<BrickConfig> = [];
for (line in ~/\s+/g.split(data)) {
for (c in line.split('')) {
if (c.length > 0) {
bricks.push(config.bricks[Std.parseInt(c) + 1]);
bricks.push(config.getBrick(Std.parseInt(c)));
}
}
}
return bricks;
return {
data: bricks
}
}
public static function dumps(config:Config, bricks:Array<BrickConfig>):String {
return bricks.map(function(brick:BrickConfig) return brick.type).join('');
public static function loads(config:Config, data:String):LevelConfig {
try {
var obj:LevelSource = Yaml.parse(data, Parser.options().useObjects());
return {
data: obj.data.split('').map(function(c) return config.getBrick(Std.parseInt(c))),
points: obj.points,
}
} catch (error:Dynamic) {
L.w('LevelBundle', '${error}');
return loadsOld(config, data);
}
}
public static function empty(config:Config):Array<BrickConfig> {
return [for (i in 0...config.map.gridWidth*config.map.gridHeight) config.bricks[1]];
public static function dumps(config:Config, level:LevelConfig):String {
var bricksStr = level.data.map(function(brick:BrickConfig) return brick.type).join('');
return Yaml.render({
data: bricksStr,
points: level.points,
}, Renderer.options().setFlowLevel(1));
}
public static function get(type:GameType, config:Config, level:Int):Array<BrickConfig> {
public static function empty(config:Config):LevelConfig {
return {
data: [for (i in 0...config.map.gridWidth * config.map.gridHeight) config.bricks[1]]
}
}
public static function get(type:GameType, config:Config, level:Int):LevelConfig {
var data:String = Assets.getText('resources/${type}/levels/level${formatLevel(level)}.txt');
return loads(config, data);
}

View File

@@ -44,6 +44,7 @@ class Game implements EngineListener {
public var config(default, null):Config;
public var engine(default, null):Engine;
private var points:Array<SpawnPoint>;
private var spawners:Map<TeamId, Spawner>;
private var deferred:Deferred<GameState>;
private var stream:Stream<GameState>;
@@ -76,8 +77,9 @@ class Game implements EngineListener {
public function start(state:GameState):Stream<GameState> {
this.deferred = new Deferred();
this.state = state;
var bricks = LevelBundle.get(type, config, state.level);
engine.map.setData(bricks);
var level = LevelBundle.get(type, config, state.level);
points = level.points != null ? level.points : config.points;
engine.map.setData(level.data);
teams = new Map<TeamId, Team>();
spawners = new Map<TeamId, Spawner>();
var humanControlIndex = 0;
@@ -101,7 +103,8 @@ class Game implements EngineListener {
}
}
}
spawners[team.id] = new Spawner(team.config, spawn);
var teamPoints = points.filter(function(p:SpawnPoint) return p.team == team.id);
spawners[team.id] = new Spawner(team.config, teamPoints, spawn);
}
for (team in teams) {

View File

@@ -17,6 +17,7 @@ class Spawner {
public var active(get, never):Bool;
private var config:TeamConfig;
private var points:Array<SpawnPoint>;
private var runner:SpawnTask -> Void;
private var queue:Array<SpawnTask>;
private var timer:Timer;
@@ -25,13 +26,14 @@ class Spawner {
private var anyPoints:Array<SpawnPoint>;
private var index:Int;
public function new(config:TeamConfig, runner:SpawnTask -> Void) {
public function new(config:TeamConfig, points:Array<SpawnPoint>, runner:SpawnTask -> Void) {
this.config = config;
this.points = points;
this.runner = runner;
queue = [];
indexedPoints = new Map();
anyPoints = [];
for (point in config.points) {
for (point in points) {
if (point.type == 'tank') {
if (point.index > -1) {
indexedPoints.set(point.index, point);
@@ -43,7 +45,7 @@ class Spawner {
}
public function getPoint(type:String, index:Int=-1):Null<SpawnPoint> {
for (point in config.points) {
for (point in points) {
if (point.type == type && point.index == index) {
return point;
}