71 lines
2.4 KiB
Haxe
71 lines
2.4 KiB
Haxe
package ru.m.tankz.view;
|
|
|
|
import haxework.view.ButtonView;
|
|
import haxework.view.DataView;
|
|
import haxework.view.frame.FrameSwitcher;
|
|
import haxework.view.LabelView;
|
|
import haxework.view.VGroupView;
|
|
import ru.m.tankz.bundle.ILevelBundle;
|
|
import ru.m.tankz.config.Config;
|
|
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>;
|
|
|
|
@:provide var state:GameState;
|
|
@:provide var game:IGame;
|
|
@:provide var switcher:FrameSwitcher;
|
|
@:provide var levelBundle:ILevelBundle;
|
|
@:provide var storage:GameStorage;
|
|
|
|
private var levelPopup:LevelPopup;
|
|
|
|
public function onShow():Void {
|
|
header.text = state.type;
|
|
levels.data = [for (i in 0...state.config.game.levels) i];
|
|
}
|
|
|
|
private function start(level:LevelConfig, preset:GamePreset, control:ControlPreset):Void {
|
|
state.levelId = level.id;
|
|
state.presetId = preset.id;
|
|
state.controls = control.values;
|
|
game = new LocalGame(state);
|
|
switcher.change(GameFrame.ID);
|
|
}
|
|
|
|
private function levelViewFactory(index:Int, levelId:LevelId):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);
|
|
return result;
|
|
}
|
|
|
|
private function onLevelSelect(index:Int, levelId:LevelId, view:ButtonView):Void {
|
|
if (!storage.get(state.type).isLevelAvailable(levelId)) {
|
|
return;
|
|
}
|
|
if (levelPopup == null) {
|
|
levelPopup = new LevelPopup();
|
|
}
|
|
var level = levelBundle.get(state.type, state.config, levelId);
|
|
levelPopup.setData(
|
|
level,
|
|
state.config.presets,
|
|
state.config.controls,
|
|
storage.get(state.type)
|
|
);
|
|
levelPopup.show().then(function(result) result != null ? start(level, result.preset, result.control) : {});
|
|
}
|
|
}
|