[common] added LevelPack
This commit is contained in:
@@ -15,7 +15,7 @@ class ConfigBundle implements IConfigBundle {
|
||||
|
||||
public function get(type:GameType):Config {
|
||||
if (!_cache.exists(type)) {
|
||||
var source:ConfigSource = Yaml.parse(Assets.getText('resources/${type}/config.yaml'), Parser.options().useObjects());
|
||||
var source:ConfigSource = Yaml.parse(Assets.getText('resources/config/${type}.yaml'), Parser.options().useObjects());
|
||||
_cache.set(type, Config.fromSource(type, source));
|
||||
}
|
||||
return _cache.get(type);
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
package ru.m.tankz.bundle;
|
||||
|
||||
import haxe.io.BytesInput;
|
||||
import haxe.zip.Entry;
|
||||
import haxe.zip.Reader;
|
||||
import lime.utils.Bytes;
|
||||
import lime.utils.CompressionAlgorithm;
|
||||
import openfl.Assets;
|
||||
import ru.m.tankz.config.Config;
|
||||
import ru.m.tankz.Type;
|
||||
@@ -7,17 +12,27 @@ import ru.m.tankz.util.LevelUtil;
|
||||
|
||||
class LevelBundle implements ILevelBundle {
|
||||
|
||||
private var cache:Map<String, LevelConfig> = new Map();
|
||||
|
||||
public function new() {}
|
||||
|
||||
public function get(type:GameType, config:Config, levelId:LevelId):LevelConfig {
|
||||
var key = '${type}:${levelId}';
|
||||
if (!cache.exists(key)) {
|
||||
var data:String = Assets.getText('resources/${type}/levels/level${LevelUtil.formatLevel(levelId)}.txt');
|
||||
cache[key] = LevelUtil.loads(config, data);
|
||||
cache[key].id = levelId;
|
||||
private function extract(entry:Entry):LevelConfig {
|
||||
var bytes:Bytes = entry.data;
|
||||
if (entry.compressed) {
|
||||
bytes = bytes.decompress(CompressionAlgorithm.DEFLATE);
|
||||
}
|
||||
return cache[key];
|
||||
var level = LevelUtil.loads(bytes.toString());
|
||||
if (level.id == null) {
|
||||
level.id = Std.parseInt(entry.fileName.split("level").pop());
|
||||
}
|
||||
return level;
|
||||
}
|
||||
|
||||
public function get(type:GameType, name:String):LevelPack {
|
||||
var data = Assets.getBytes('levels/${type}_${name}.zip');
|
||||
var files = Reader.readZip(new BytesInput(data));
|
||||
return {
|
||||
type: type,
|
||||
name: name,
|
||||
data: Lambda.array(files.map(extract)),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ class NetworkGame extends Game {
|
||||
private var network:NetworkManager;
|
||||
|
||||
public function new(network:NetworkManager) {
|
||||
super(new GameState(network.room.game.type, 0, network.room.game.level));
|
||||
super(new GameState(network.room.game.type, 0));
|
||||
this.network = network;
|
||||
this.controlFactory = new NetworkControlFactory();
|
||||
network.gameEventSignal.connect(onGameEventProto);
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import haxe.ds.Option;
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
import haxework.view.VGroupView;
|
||||
import ru.m.tankz.game.GameEvent;
|
||||
@@ -10,7 +9,6 @@ import ru.m.tankz.game.record.GameRecord;
|
||||
import ru.m.tankz.network.NetworkManager;
|
||||
import ru.m.tankz.sound.SoundManager;
|
||||
import ru.m.tankz.storage.GameStorage;
|
||||
import ru.m.tankz.Type;
|
||||
import ru.m.tankz.view.game.GameView;
|
||||
|
||||
@:template class GameFrame extends VGroupView implements GameListener {
|
||||
@@ -24,7 +22,6 @@ import ru.m.tankz.view.game.GameView;
|
||||
@:provide var soundManager:SoundManager;
|
||||
@:provide var state:GameState;
|
||||
@:provide var record:GameRecord;
|
||||
@:provide("next") var nextState:GameState;
|
||||
@:provide var switcher:FrameSwitcher;
|
||||
@:provide var gameStorage:GameStorage;
|
||||
|
||||
@@ -56,34 +53,12 @@ import ru.m.tankz.view.game.GameView;
|
||||
switch event {
|
||||
case GameEvent.COMPLETE(state, winner):
|
||||
this.state = state;
|
||||
nextState = switch next(winner) {
|
||||
case Some(s):
|
||||
// ToDo:
|
||||
var progress = gameStorage.get(game.type);
|
||||
progress.completeLevel(state.levelId, state.presetId);
|
||||
gameStorage.set(progress);
|
||||
s;
|
||||
case None:
|
||||
null;
|
||||
}
|
||||
stop();
|
||||
switcher.change(ResultFrame.ID);
|
||||
case _:
|
||||
}
|
||||
}
|
||||
|
||||
// ToDo:
|
||||
private function next(winner:TeamId):Option<GameState> {
|
||||
for (rule in game.config.game.complete) {
|
||||
if (rule.team != null && rule.team != winner) {
|
||||
return Option.None;
|
||||
}
|
||||
}
|
||||
var level = state.levelId + 1;
|
||||
if (level >= game.config.game.levels) level = 0;
|
||||
return Option.Some(new GameState(game.type, state.presetId, level, state));
|
||||
}
|
||||
|
||||
public function onHide():Void {
|
||||
stop();
|
||||
soundManager.stopAll();
|
||||
|
||||
@@ -11,14 +11,13 @@ import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.game.IGame;
|
||||
import ru.m.tankz.local.LocalGame;
|
||||
import ru.m.tankz.storage.GameStorage;
|
||||
import ru.m.tankz.Type;
|
||||
import ru.m.tankz.view.popup.LevelPopup;
|
||||
|
||||
@:template class LevelFrame extends VGroupView {
|
||||
public static inline var ID = "level";
|
||||
|
||||
@:view var header:LabelView;
|
||||
@:view var levels:DataView<LevelId, ButtonView>;
|
||||
@:view var levels:DataView<LevelConfig, ButtonView>;
|
||||
|
||||
@:provide var state:GameState;
|
||||
@:provide var game:IGame;
|
||||
@@ -30,35 +29,35 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
|
||||
public function onShow():Void {
|
||||
header.text = state.type;
|
||||
levels.data = [for (i in 0...state.config.game.levels) i];
|
||||
var pack = levelBundle.get(state.type, "standard");
|
||||
levels.data = pack.data;
|
||||
}
|
||||
|
||||
private function start(level:LevelConfig, preset:GamePreset, control:ControlPreset):Void {
|
||||
state.levelId = level.id;
|
||||
state.level = level;
|
||||
state.presetId = preset.id;
|
||||
state.controls = control.values;
|
||||
game = new LocalGame(state);
|
||||
switcher.change(GameFrame.ID);
|
||||
}
|
||||
|
||||
private function levelViewFactory(index:Int, levelId:LevelId):ButtonView {
|
||||
private function levelViewFactory(index:Int, level:LevelConfig):ButtonView {
|
||||
var progress = storage.get(state.type);
|
||||
var result = new ButtonView();
|
||||
result.skinId = "button.level";
|
||||
var presetsLine = [for (p in state.config.presets) progress.isPresetCompleted(levelId, p.id) ? '*' : '_'].join('');
|
||||
result.text = '${levelId}\n${presetsLine}';
|
||||
result.disabled = !progress.isLevelAvailable(levelId);
|
||||
var presetsLine = [for (p in state.config.presets) progress.isPresetCompleted(level.id, p.id) ? '*' : '_'].join('');
|
||||
result.text = '${level.id}\n${presetsLine}';
|
||||
result.disabled = !progress.isLevelAvailable(level.id);
|
||||
return result;
|
||||
}
|
||||
|
||||
private function onLevelSelect(index:Int, levelId:LevelId, view:ButtonView):Void {
|
||||
if (!storage.get(state.type).isLevelAvailable(levelId)) {
|
||||
private function onLevelSelect(index:Int, level:LevelConfig, view:ButtonView):Void {
|
||||
if (!storage.get(state.type).isLevelAvailable(level.id)) {
|
||||
return;
|
||||
}
|
||||
if (levelPopup == null) {
|
||||
levelPopup = new LevelPopup();
|
||||
}
|
||||
var level = levelBundle.get(state.type, state.config, levelId);
|
||||
levelPopup.setData(
|
||||
level,
|
||||
state.config.presets,
|
||||
|
||||
Reference in New Issue
Block a user