[common] diffilicity presets support
This commit is contained in:
@@ -28,6 +28,7 @@ class ButtonSVGSkin implements ISkin<ButtonView> {
|
||||
svgs.set(ButtonState.UP, buildSVG(color));
|
||||
svgs.set(ButtonState.DOWN, buildSVG(ColorUtil.diff(color, -24)));
|
||||
svgs.set(ButtonState.OVER, buildSVG(ColorUtil.diff(color, 24)));
|
||||
svgs.set(ButtonState.DISABLED, buildSVG(ColorUtil.grey(color)));
|
||||
}
|
||||
|
||||
public function draw(view:ButtonView):Void {
|
||||
|
||||
@@ -134,5 +134,38 @@ class Style {
|
||||
Skin.size(64, 64),
|
||||
new ButtonSVGSkin(Assets.getText("resources/image/icon/play-circle-solid.svg"), lightColor),
|
||||
]);
|
||||
|
||||
resources.skin.put("preset.easy", [
|
||||
Skin.size(64, 64),
|
||||
new ButtonSVGSkin(Assets.getText("resources/image/icon/smile-solid.svg"), lightColor),
|
||||
]);
|
||||
resources.skin.put("preset.normal", [
|
||||
Skin.size(64, 64),
|
||||
new ButtonSVGSkin(Assets.getText("resources/image/icon/frown-open-solid.svg"), lightColor),
|
||||
]);
|
||||
resources.skin.put("preset.hard", [
|
||||
Skin.size(64, 64),
|
||||
new ButtonSVGSkin(Assets.getText("resources/image/icon/sad-cry-solid.svg"), lightColor),
|
||||
]);
|
||||
resources.skin.put("preset.default", [
|
||||
Skin.size(64, 64),
|
||||
new ButtonSVGSkin(Assets.getText("resources/image/icon/play-circle-solid.svg"), lightColor),
|
||||
]);
|
||||
resources.skin.put("preset.easy.complete", [
|
||||
Skin.size(64, 64),
|
||||
new ButtonSVGSkin(Assets.getText("resources/image/icon/smile-solid.svg"), 0x337733),
|
||||
]);
|
||||
resources.skin.put("preset.normal.complete", [
|
||||
Skin.size(64, 64),
|
||||
new ButtonSVGSkin(Assets.getText("resources/image/icon/frown-open-solid.svg"), 0x337733),
|
||||
]);
|
||||
resources.skin.put("preset.hard.complete", [
|
||||
Skin.size(64, 64),
|
||||
new ButtonSVGSkin(Assets.getText("resources/image/icon/sad-cry-solid.svg"), 0x337733),
|
||||
]);
|
||||
resources.skin.put("preset.default.complete", [
|
||||
Skin.size(64, 64),
|
||||
new ButtonSVGSkin(Assets.getText("resources/image/icon/play-circle-solid.svg"), 0x337733),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,12 +11,12 @@ class LevelBundle implements ILevelBundle {
|
||||
|
||||
public function new() {}
|
||||
|
||||
public function get(type:GameType, config:Config, level:Int):LevelConfig {
|
||||
var key = '${type}:${level}';
|
||||
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(level)}.txt');
|
||||
var data:String = Assets.getText('resources/${type}/levels/level${LevelUtil.formatLevel(levelId)}.txt');
|
||||
cache[key] = LevelUtil.loads(config, data);
|
||||
cache[key].index = level;
|
||||
cache[key].id = levelId;
|
||||
}
|
||||
return cache[key];
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package ru.m.tankz.control;
|
||||
|
||||
import ru.m.tankz.bot.StupidBotControl;
|
||||
import ru.m.tankz.bot.HardBotControl;
|
||||
import ru.m.tankz.control.Control.Controller;
|
||||
import ru.m.tankz.Type;
|
||||
|
||||
class ClientControlFactory implements IControlFactory {
|
||||
|
||||
@@ -6,8 +6,10 @@ import ru.m.tankz.Type.GameType;
|
||||
|
||||
class GameStorage extends SharedObjectStorage {
|
||||
|
||||
private static inline var VERSION = 1;
|
||||
|
||||
public function new() {
|
||||
super("game");
|
||||
super('game_${VERSION}');
|
||||
}
|
||||
|
||||
public function get(type:GameType):GameProgress {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import haxework.resources.IResources;
|
||||
import haxework.view.ButtonView;
|
||||
import haxework.view.DataView;
|
||||
import haxework.view.frame.FrameSwitcher;
|
||||
@@ -13,6 +12,7 @@ import ru.m.tankz.preset.ClassicGame;
|
||||
import ru.m.tankz.preset.DeathGame;
|
||||
import ru.m.tankz.preset.DotaGame;
|
||||
import ru.m.tankz.storage.GameStorage;
|
||||
import ru.m.tankz.Type;
|
||||
import ru.m.tankz.view.classic.ClassicGameFrame;
|
||||
import ru.m.tankz.view.death.DeathGameFrame;
|
||||
import ru.m.tankz.view.dota.DotaGameFrame;
|
||||
@@ -22,10 +22,9 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
public static inline var ID = "level";
|
||||
|
||||
@:view var header:LabelView;
|
||||
@:view var levels:DataView<Int, ButtonView>;
|
||||
@:view var levels:DataView<LevelId, ButtonView>;
|
||||
|
||||
@:provide var state:GameState;
|
||||
@:provide var resources:IResources;
|
||||
@:provide var switcher:FrameSwitcher;
|
||||
@:provide var levelBundle:ILevelBundle;
|
||||
@:provide var storage:GameStorage;
|
||||
@@ -37,8 +36,9 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
levels.data = [for (i in 0...state.config.game.levels) i];
|
||||
}
|
||||
|
||||
private function start(level:LevelConfig):Void {
|
||||
state.level = level.index;
|
||||
private function start(level:LevelConfig, preset:GamePreset):Void {
|
||||
state.levelId = level.id;
|
||||
state.presetId = preset.id;
|
||||
switcher.change(switch state.type {
|
||||
case ClassicGame.TYPE: ClassicGameFrame.ID;
|
||||
case DotaGame.TYPE: DotaGameFrame.ID;
|
||||
@@ -47,22 +47,29 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
});
|
||||
}
|
||||
|
||||
private function levelViewFactory(index:Int, level:Int):ButtonView {
|
||||
private function levelViewFactory(index:Int, levelId:LevelId):ButtonView {
|
||||
var progress = storage.get(state.type);
|
||||
var result = new ButtonView();
|
||||
result.skinId = "button.level";
|
||||
result.text = '${level}';
|
||||
result.disabled = !storage.get(state.type).isLevelAvailable(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, level:Int, view:ButtonView):Void {
|
||||
if (!storage.get(state.type).isLevelAvailable(level)) {
|
||||
private function onLevelSelect(index:Int, levelId:LevelId, view:ButtonView):Void {
|
||||
if (!storage.get(state.type).isLevelAvailable(levelId)) {
|
||||
return;
|
||||
}
|
||||
if (levelPopup == null) {
|
||||
levelPopup = new LevelPopup();
|
||||
}
|
||||
levelPopup.level = levelBundle.get(state.type, state.config, level);
|
||||
levelPopup.show().then(start).catchError(function(_) {});
|
||||
var level = levelBundle.get(state.type, state.config, levelId);
|
||||
levelPopup.setData(
|
||||
level,
|
||||
state.config.presets,
|
||||
storage.get(state.type)
|
||||
);
|
||||
levelPopup.show().then(function(preset) start(level, preset)).catchError(function(_) {});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
package ru.m.tankz.view;
|
||||
|
||||
import haxework.view.LabelView;
|
||||
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.control.Control;
|
||||
import ru.m.tankz.view.classic.ClassicGameFrame;
|
||||
import ru.m.tankz.view.common.LifeView;
|
||||
import ru.m.tankz.view.dota.DotaGameFrame;
|
||||
import ru.m.tankz.game.GameState;
|
||||
import ru.m.tankz.preset.ClassicGame;
|
||||
import ru.m.tankz.preset.DotaGame;
|
||||
import ru.m.tankz.view.classic.ClassicGameFrame;
|
||||
import ru.m.tankz.view.common.LifeView;
|
||||
import ru.m.tankz.view.dota.DotaGameFrame;
|
||||
|
||||
@:template class ResultFrame extends VGroupView {
|
||||
public static var ID(default, never):String = "result";
|
||||
@@ -37,11 +36,8 @@ import ru.m.tankz.preset.DotaGame;
|
||||
}
|
||||
|
||||
public function onShow() {
|
||||
resultView.data = Lambda.array(Lambda.filter(resultState.players, function(player:PlayerState):Bool return switch player.controller {
|
||||
case HUMAN(_): true;
|
||||
case _: false;
|
||||
}));
|
||||
levelLabel.text = 'Level ${resultState.level}';
|
||||
resultView.data = Lambda.array(resultState.players);
|
||||
levelLabel.text = 'Level ${resultState.levelId}';
|
||||
nextButton.visible = state != null;
|
||||
}
|
||||
|
||||
@@ -54,6 +50,6 @@ import ru.m.tankz.preset.DotaGame;
|
||||
}
|
||||
|
||||
private function close() {
|
||||
frames.change(StartFrame.ID);
|
||||
frames.change(LevelFrame.ID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ import ru.m.tankz.view.common.LifeView;
|
||||
private var player2Id:PlayerId = new PlayerId(ClassicGame.HUMAN, 1);
|
||||
|
||||
public function onGameStart(state:GameState):Void {
|
||||
level.text = 'Level ${state.level}';
|
||||
level.text = 'Level ${state.levelId}';
|
||||
}
|
||||
|
||||
public function onGameChange(state:GameState):Void {
|
||||
|
||||
@@ -81,7 +81,7 @@ class GameFrame extends GroupView {
|
||||
case Some(s):
|
||||
// ToDo:
|
||||
var progress = storage.get(game.type);
|
||||
progress.completeLevel(result.level);
|
||||
progress.completeLevel(result.levelId, result.presetId);
|
||||
storage.set(progress);
|
||||
s;
|
||||
case None: null;
|
||||
|
||||
@@ -14,7 +14,7 @@ import ru.m.tankz.view.common.LifeView;
|
||||
@:view var players:DataView<PlayerState, LifeView>;
|
||||
|
||||
public function onGameStart(state:GameState):Void {
|
||||
level.text = 'Level ${state.level}';
|
||||
level.text = 'Level ${state.levelId}';
|
||||
players.data = Lambda.array(state.players);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import ru.m.tankz.view.common.LifeView;
|
||||
@:view var level:LabelView;
|
||||
|
||||
public function onGameStart(state:GameState):Void {
|
||||
level.text = 'Level ${state.level}';
|
||||
level.text = 'Level ${state.levelId}';
|
||||
}
|
||||
|
||||
public function onGameChange(state:GameState):Void {
|
||||
|
||||
@@ -1,20 +1,37 @@
|
||||
package ru.m.tankz.view.popup;
|
||||
|
||||
import haxework.view.ButtonView;
|
||||
import haxework.view.DataView;
|
||||
import haxework.view.LabelView;
|
||||
import haxework.view.popup.PopupView;
|
||||
import ru.m.tankz.config.Config;
|
||||
import ru.m.tankz.game.GameProgress;
|
||||
|
||||
@:template class LevelPopup extends PopupView<LevelConfig> {
|
||||
@:template class LevelPopup extends PopupView<GamePreset> {
|
||||
|
||||
public var level(default, set):LevelConfig;
|
||||
private var level:LevelConfig;
|
||||
private var progress:GameProgress;
|
||||
|
||||
@:view var name:LabelView;
|
||||
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
|
||||
|
||||
private function set_level(value:LevelConfig):LevelConfig {
|
||||
if (level != value) {
|
||||
level = value;
|
||||
name.text = '${level.index}. ${level.name != null ? level.name : "#"}';
|
||||
public function setData(level:LevelConfig, presets:Array<GamePreset>, progress:GameProgress):Void {
|
||||
this.level = level;
|
||||
this.progress = progress;
|
||||
name.text = '${level.id}. ${level.name != null ? level.name : "#"}';
|
||||
presetsView.data = presets;
|
||||
}
|
||||
|
||||
private function presetViewFactory(index:Int, value:GamePreset):ButtonView {
|
||||
var result = new ButtonView();
|
||||
result.skinId = 'preset.${value.name}${progress.isPresetCompleted(level.id, value.id) ? '.complete' : ''}';
|
||||
result.disabled = !progress.isPresetAvailable(level.id, value.id);
|
||||
return result;
|
||||
}
|
||||
|
||||
private function onPresetSelect(value:GamePreset):Void {
|
||||
if (progress.isPresetAvailable(level.id, value.id)) {
|
||||
close(value);
|
||||
}
|
||||
return level;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,10 +14,12 @@ view:
|
||||
geometry.padding: [20, 15]
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.size.height: 100%
|
||||
- $type: haxework.view.HGroupView
|
||||
layout.hAlign: center
|
||||
- id: presets
|
||||
$type: haxework.view.DataView
|
||||
factory: $this:presetViewFactory
|
||||
+onDataSelect: $this:onPresetSelect
|
||||
layout:
|
||||
$type: haxework.view.layout.HorizontalLayout
|
||||
hAlign: center
|
||||
margin: 5
|
||||
skinId: panel
|
||||
views:
|
||||
- $type: haxework.view.ButtonView
|
||||
skinId: button.start
|
||||
+onPress: $code:close(level)
|
||||
|
||||
Reference in New Issue
Block a user