From c0b4b2a4c16e42aaedf32058a871a14a3ff0392c Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 4 Apr 2019 17:12:00 +0300 Subject: [PATCH] [common] add GameProgress --- src/client/haxe/ru/m/skin/ButtonSVGSkin.hx | 6 +-- src/client/haxe/ru/m/tankz/Init.hx | 5 ++ src/client/haxe/ru/m/tankz/Style.hx | 5 ++ .../haxe/ru/m/tankz/storage/GameStorage.hx | 12 ++--- src/client/haxe/ru/m/tankz/view/LevelFrame.hx | 35 ++++++++++---- .../haxe/ru/m/tankz/view/LevelFrame.yaml | 38 ++++++++------- .../haxe/ru/m/tankz/view/SettingsFrame.hx | 6 +-- .../haxe/ru/m/tankz/view/SettingsFrame.yaml | 5 +- .../haxe/ru/m/tankz/view/common/GameFrame.hx | 9 +++- .../haxe/ru/m/tankz/view/common/LevelView.hx | 46 ------------------- .../ru/m/tankz/view/common/LevelView.yaml | 22 --------- .../haxe/ru/m/tankz/view/popup/FontPopup.hx | 4 +- .../haxe/ru/m/tankz/view/popup/LevelPopup.hx | 20 ++++++++ .../ru/m/tankz/view/popup/LevelPopup.yaml | 23 ++++++++++ .../haxe/ru/m/tankz/game/GameProgress.hx | 22 +++++++++ 15 files changed, 145 insertions(+), 113 deletions(-) delete mode 100644 src/client/haxe/ru/m/tankz/view/common/LevelView.hx delete mode 100644 src/client/haxe/ru/m/tankz/view/common/LevelView.yaml create mode 100644 src/client/haxe/ru/m/tankz/view/popup/LevelPopup.hx create mode 100644 src/client/haxe/ru/m/tankz/view/popup/LevelPopup.yaml create mode 100644 src/common/haxe/ru/m/tankz/game/GameProgress.hx diff --git a/src/client/haxe/ru/m/skin/ButtonSVGSkin.hx b/src/client/haxe/ru/m/skin/ButtonSVGSkin.hx index 1862c3d..bb225ab 100644 --- a/src/client/haxe/ru/m/skin/ButtonSVGSkin.hx +++ b/src/client/haxe/ru/m/skin/ButtonSVGSkin.hx @@ -1,9 +1,9 @@ package ru.m.skin; -import haxework.color.ColorUtil; -import haxework.color.Color; -import haxework.view.ButtonView; import format.SVG; +import haxework.color.Color; +import haxework.color.ColorUtil; +import haxework.view.ButtonView; import haxework.view.skin.ISkin; class ButtonSVGSkin implements ISkin { diff --git a/src/client/haxe/ru/m/tankz/Init.hx b/src/client/haxe/ru/m/tankz/Init.hx index 280947c..a521519 100644 --- a/src/client/haxe/ru/m/tankz/Init.hx +++ b/src/client/haxe/ru/m/tankz/Init.hx @@ -1,5 +1,7 @@ package ru.m.tankz; +import haxework.animate.FadeAnimate; +import haxework.animate.UnFadeAnimate; import haxework.resources.IResources; import haxework.resources.Resources; import haxework.view.popup.PopupManager; @@ -64,6 +66,9 @@ class Init { controlFactory = new ClientControlFactory(); popupManager = new PopupManager(); + popupManager.showAnimateFactory = function(v) return new UnFadeAnimate(v, 100); + popupManager.closeAnimateFactory = function(v) return new FadeAnimate(v, 100); + var host:String = getHost(); L.d('Init', 'host: ${host}'); #if flash diff --git a/src/client/haxe/ru/m/tankz/Style.hx b/src/client/haxe/ru/m/tankz/Style.hx index b09fda2..3657306 100644 --- a/src/client/haxe/ru/m/tankz/Style.hx +++ b/src/client/haxe/ru/m/tankz/Style.hx @@ -112,6 +112,11 @@ class Style { Skin.layout(new Layout().setAlign(NONE, MIDDLE)), Skin.color(lightColor), ]); + resources.skin.put("window", [ + Skin.color(darkColor), + Skin.border(ColorUtil.multiply(lightColor, 1.5), 1, 2), + Skin.geometry(new Geometry().setPadding(2)), + ]); resources.skin.put("button.settings", [ Skin.size(64, 64), diff --git a/src/client/haxe/ru/m/tankz/storage/GameStorage.hx b/src/client/haxe/ru/m/tankz/storage/GameStorage.hx index ec671ac..b24b888 100644 --- a/src/client/haxe/ru/m/tankz/storage/GameStorage.hx +++ b/src/client/haxe/ru/m/tankz/storage/GameStorage.hx @@ -1,8 +1,8 @@ package ru.m.tankz.storage; -import ru.m.tankz.game.GameState; -import ru.m.tankz.Type.GameType; import haxework.storage.SharedObjectStorage; +import ru.m.tankz.game.GameProgress; +import ru.m.tankz.Type.GameType; class GameStorage extends SharedObjectStorage { @@ -10,11 +10,11 @@ class GameStorage extends SharedObjectStorage { super("game"); } - public function get(type:GameType, level:Int):GameState { - return read('${type}:${level}'); + public function get(type:GameType):GameProgress { + return exists(type) ? read(type) : new GameProgress(type); } - public function set(state:GameState):Void { - write('${state.type}:${state.level}', state); + public function set(progress:GameProgress):Void { + write(progress.type, progress); } } diff --git a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx index 1bf9201..5aaa9cf 100644 --- a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx @@ -1,6 +1,7 @@ package ru.m.tankz.view; import haxework.resources.IResources; +import haxework.view.ButtonView; import haxework.view.DataView; import haxework.view.frame.FrameSwitcher; import haxework.view.LabelView; @@ -11,31 +12,34 @@ import ru.m.tankz.game.GameState; 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.view.classic.ClassicGameFrame; -import ru.m.tankz.view.common.LevelView; import ru.m.tankz.view.death.DeathGameFrame; import ru.m.tankz.view.dota.DotaGameFrame; +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; + @:view var levels:DataView; @:provide var state:GameState; @:provide var resources:IResources; - @:provide var swicther:FrameSwitcher; + @: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) levelBundle.get(state.type, state.config, i)]; - for (view in levels.dataViews) view.onStart.connect(start); + levels.data = [for (i in 0...state.config.game.levels) i]; } private function start(level:LevelConfig):Void { state.level = level.index; - swicther.change(switch state.type { + switcher.change(switch state.type { case ClassicGame.TYPE: ClassicGameFrame.ID; case DotaGame.TYPE: DotaGameFrame.ID; case DeathGame.TYPE: DeathGameFrame.ID; @@ -43,9 +47,22 @@ import ru.m.tankz.view.dota.DotaGameFrame; }); } - private function onLevelSelect(index:Int, level:LevelConfig, view:LevelView):Void { - for (v in levels.views) { - cast(v, LevelView).selected = v == view; + private function levelViewFactory(index:Int, level:Int):ButtonView { + var result = new ButtonView(); + result.skinId = "button.level"; + result.text = '${level}'; + result.disabled = !storage.get(state.type).isLevelAvailable(level); + return result; + } + + private function onLevelSelect(index:Int, level:Int, view:ButtonView):Void { + if (!storage.get(state.type).isLevelAvailable(level)) { + return; } + if (levelPopup == null) { + levelPopup = new LevelPopup(); + } + levelPopup.level = levelBundle.get(state.type, state.config, level); + levelPopup.show().then(start).catchError(function(_) {}); } } diff --git a/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml b/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml index 44dc165..afa1fd2 100644 --- a/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml @@ -1,18 +1,24 @@ --- -skinId: container -layout: - $type: haxework.view.layout.VerticalLayout views: - - id: header - $type: haxework.view.LabelView - skinId: text.header - - id: levels - $type: haxework.view.DataView - geometry.size.width: 100% - layout: - $type: haxework.view.layout.TailLayout - rowSize: 10 - margin: 5 - factory: $code:ru.m.tankz.view.common.LevelView.factory - +onItemSelect: $this:onLevelSelect - geometry.padding: 10 + - $type: haxework.view.VGroupView + skinId: container + views: + - id: header + $type: haxework.view.LabelView + skinId: text.header + - id: levels + $type: haxework.view.DataView + geometry.size.width: 100% + layout: + $type: haxework.view.layout.TailLayout + rowSize: 10 + margin: 5 + factory: $this:levelViewFactory + +onItemSelect: $this:onLevelSelect + geometry.padding: 10 + - $type: haxework.view.HGroupView + skinId: panel + views: + - $type: haxework.view.ButtonView + skinId: button.close + +onPress: $code:switcher.change('start') diff --git a/src/client/haxe/ru/m/tankz/view/SettingsFrame.hx b/src/client/haxe/ru/m/tankz/view/SettingsFrame.hx index 64dfbd9..fd45dca 100644 --- a/src/client/haxe/ru/m/tankz/view/SettingsFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/SettingsFrame.hx @@ -7,9 +7,5 @@ import haxework.view.VGroupView; public static var ID(default, never):String = "settings"; - @:provide var frameSwitcher:FrameSwitcher; - - public function close():Void { - frameSwitcher.change(StartFrame.ID); - } + @:provide var switcher:FrameSwitcher; } diff --git a/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml b/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml index 63bf3c8..ffb1c58 100644 --- a/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml @@ -16,7 +16,6 @@ views: - $type: haxework.view.HGroupView skinId: panel views: - - id: close - $type: haxework.view.ButtonView + - $type: haxework.view.ButtonView skinId: button.close - +onPress: $code:close() + +onPress: $code:switcher.change('start') diff --git a/src/client/haxe/ru/m/tankz/view/common/GameFrame.hx b/src/client/haxe/ru/m/tankz/view/common/GameFrame.hx index 59637ab..938e3a7 100644 --- a/src/client/haxe/ru/m/tankz/view/common/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/common/GameFrame.hx @@ -1,5 +1,6 @@ package ru.m.tankz.view.common; +import ru.m.tankz.storage.GameStorage; import flash.events.Event; import haxe.ds.Option; import haxe.Timer; @@ -24,6 +25,7 @@ class GameFrame extends GroupView { @:provide var state:GameState; @:provide("result") var result:GameState; @:provide var switcher:FrameSwitcher; + @:provide var storage:GameStorage; private var game:Game; private var timer:Timer; @@ -76,7 +78,12 @@ class GameFrame extends GroupView { public function onGameComplete(state:GameState):Void { result = state; this.state = switch game.next() { - case Some(s): s; + case Some(s): + // ToDo: + var progress = storage.get(game.type); + progress.completeLevel(result.level); + storage.set(progress); + s; case None: null; } stop(); diff --git a/src/client/haxe/ru/m/tankz/view/common/LevelView.hx b/src/client/haxe/ru/m/tankz/view/common/LevelView.hx deleted file mode 100644 index 825f6d5..0000000 --- a/src/client/haxe/ru/m/tankz/view/common/LevelView.hx +++ /dev/null @@ -1,46 +0,0 @@ -package ru.m.tankz.view.common; - -import haxework.signal.Signal; -import haxework.view.core.Geometry; -import haxework.view.GroupView; -import haxework.view.LabelView; -import haxework.view.VGroupView; -import ru.m.tankz.config.Config; - -@:template class LevelView extends VGroupView { - - public var level(default, set):LevelConfig; - public var selected(default, set):Bool = false; - public var onStart:Signal = new Signal(); - - @:view("index") var indexView:LabelView; - @:view("name") var nameView:LabelView; - @:view("info") var infoView:GroupView; - - private function set_level(value:LevelConfig):LevelConfig { - if (level != value) { - level = value; - nameView.text = '${level.index}. ${level.name != null ? level.name : "#"}'; - indexView.text = '${level.index}'; - } - return level; - } - - private function set_selected(value:Bool):Bool { - if (selected != value) { - selected = value; - infoView.visible = selected; - infoView.geometry.position = selected ? Position.LAYOUT : Position.ABSOLUTE; - indexView.visible = !selected; - indexView.geometry.position = selected ? Position.ABSOLUTE : Position.LAYOUT; - toUpdateParent(); - } - return selected; - } - - public static function factory(index:Int, level:LevelConfig):LevelView { - var view = new LevelView(); - view.level = level; - return view; - } -} diff --git a/src/client/haxe/ru/m/tankz/view/common/LevelView.yaml b/src/client/haxe/ru/m/tankz/view/common/LevelView.yaml deleted file mode 100644 index 25c866a..0000000 --- a/src/client/haxe/ru/m/tankz/view/common/LevelView.yaml +++ /dev/null @@ -1,22 +0,0 @@ ---- -skinId: light -views: - - id: index - $type: haxework.view.LabelView - skinId: text - geometry.padding: [20, 15] - - id: info - geometry.padding: [20, 15] - geometry.position: absolute - layout.margin: 10 - visible: false - $type: haxework.view.VGroupView - views: - - id: name - $type: haxework.view.LabelView - skinId: text - - $type: haxework.view.HGroupView - views: - - $type: haxework.view.ButtonView - skinId: button.start - +onPress: $code:onStart.emit(level) diff --git a/src/client/haxe/ru/m/tankz/view/popup/FontPopup.hx b/src/client/haxe/ru/m/tankz/view/popup/FontPopup.hx index 8c11814..bd54fe4 100644 --- a/src/client/haxe/ru/m/tankz/view/popup/FontPopup.hx +++ b/src/client/haxe/ru/m/tankz/view/popup/FontPopup.hx @@ -29,8 +29,8 @@ class FontLabelView extends LabelListItem { var values = Font.enumerateFonts(true); values.sort(function(a:Font, b:Font) { return switch [a.fontType, b.fontType] { - case [FontType.DEVICE, _]: 1; - case [_, FontType.DEVICE]: -1; + case [DEVICE, _]: 1; + case [_, DEVICE]: -1; case _: 0; } }); diff --git a/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.hx b/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.hx new file mode 100644 index 0000000..60497bb --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.hx @@ -0,0 +1,20 @@ +package ru.m.tankz.view.popup; + +import haxework.view.LabelView; +import haxework.view.popup.PopupView; +import ru.m.tankz.config.Config; + +@:template class LevelPopup extends PopupView { + + public var level(default, set):LevelConfig; + + @:view var name:LabelView; + + private function set_level(value:LevelConfig):LevelConfig { + if (level != value) { + level = value; + name.text = '${level.index}. ${level.name != null ? level.name : "#"}'; + } + return level; + } +} diff --git a/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.yaml b/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.yaml new file mode 100644 index 0000000..64c0f14 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.yaml @@ -0,0 +1,23 @@ +--- +layout.hAlign: center +layout.vAlign: middle +view: + $type: haxework.view.VGroupView + layout.hAlign: center + geometry.size.width: 400 + geometry.size.height: 400 + skinId: window + views: + - id: name + $type: haxework.view.LabelView + skinId: text + geometry.padding: [20, 15] + - $type: haxework.view.SpriteView + geometry.size.height: 100% + - $type: haxework.view.HGroupView + layout.hAlign: center + skinId: panel + views: + - $type: haxework.view.ButtonView + skinId: button.start + +onPress: $code:close(level) diff --git a/src/common/haxe/ru/m/tankz/game/GameProgress.hx b/src/common/haxe/ru/m/tankz/game/GameProgress.hx new file mode 100644 index 0000000..9f96b12 --- /dev/null +++ b/src/common/haxe/ru/m/tankz/game/GameProgress.hx @@ -0,0 +1,22 @@ +package ru.m.tankz.game; + +import ru.m.tankz.Type.GameType; + +class GameProgress { + + public var type(default, null):GameType; + private var completed(default, null):Map; + + public function new(type:GameType) { + this.type = type; + this.completed = new Map(); + } + + public function isLevelAvailable(level:Int):Bool { + return level == 0 || completed.get(level - 1); + } + + public function completeLevel(level:Int):Void { + completed.set(level, true); + } +}