[common] update level config, spawns points
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user