From fbc9238d2fc081e973c77c088877124ac3491bf7 Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 27 Jun 2019 11:59:28 +0300 Subject: [PATCH] [client] update frames --- WORK.md | 1 + .../haxe/ru/m/tankz/bundle/LevelBundle.hx | 5 ++- src/client/haxe/ru/m/tankz/local/LocalGame.hx | 27 ++++++++++++ src/client/haxe/ru/m/tankz/render/Render.hx | 34 +++++++------- src/client/haxe/ru/m/tankz/view/GameFrame.hx | 19 -------- .../haxe/ru/m/tankz/view/LevelFrame.yaml | 28 ++++++------ .../haxe/ru/m/tankz/view/RecordFrame.yaml | 3 -- .../haxe/ru/m/tankz/view/ResultFrame.hx | 44 ++++++++++++++----- .../haxe/ru/m/tankz/view/ResultFrame.yaml | 22 ++++++++-- .../haxe/ru/m/tankz/view/SettingsFrame.yaml | 7 +-- .../haxe/ru/m/tankz/view/StartFrame.yaml | 3 -- .../haxe/ru/m/tankz/view/common/LifeView.hx | 5 ++- .../m/tankz/view/popup/CreateGamePopup.yaml | 4 +- src/common/haxe/ru/m/tankz/config/Config.hx | 1 + src/common/haxe/ru/m/tankz/game/GameRunner.hx | 8 ++-- src/common/haxe/ru/m/tankz/game/GameState.hx | 4 ++ .../haxe/ru/m/tankz/game/PackProgress.hx | 2 +- .../ru/m/tankz/editor/view/EditorView.yaml | 2 - 18 files changed, 131 insertions(+), 88 deletions(-) diff --git a/WORK.md b/WORK.md index b6a0260..b209f44 100644 --- a/WORK.md +++ b/WORK.md @@ -8,3 +8,4 @@ * improve bonuses system * screen gamepad on mobiles * resize render on mobiles +* save state in classic game diff --git a/src/client/haxe/ru/m/tankz/bundle/LevelBundle.hx b/src/client/haxe/ru/m/tankz/bundle/LevelBundle.hx index 5498294..3549efa 100644 --- a/src/client/haxe/ru/m/tankz/bundle/LevelBundle.hx +++ b/src/client/haxe/ru/m/tankz/bundle/LevelBundle.hx @@ -13,7 +13,10 @@ class LevelBundle implements ILevelBundle { var bytes = Assets.getBytes('levels/${id}.zip'); return { id: id, - data: LevelUtil.unpack(bytes), + data: LevelUtil.unpack(bytes).map(function(level) { + level.packId = id; + return level; + }), }; } } diff --git a/src/client/haxe/ru/m/tankz/local/LocalGame.hx b/src/client/haxe/ru/m/tankz/local/LocalGame.hx index 7ed5669..6d2c3af 100644 --- a/src/client/haxe/ru/m/tankz/local/LocalGame.hx +++ b/src/client/haxe/ru/m/tankz/local/LocalGame.hx @@ -3,11 +3,38 @@ package ru.m.tankz.local; import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameRunner; import ru.m.tankz.local.LocalControlFactory; +import ru.m.tankz.storage.GameStorage; +import ru.m.tankz.Type; class LocalGame extends GameRunner { + @:provide static var gameStorage:GameStorage; + public function new(start:Start) { super(start); controlFactory = new LocalControlFactory(); } + + override public function onGameEvent(event:GameEvent):Void { + super.onGameEvent(event); + switch event { + case COMPLETE(result): + updateProgress(result); + case _: + } + } + + private static function updateProgress(result:Result):Void { + var complete = true; + for (rule in result.state.config.game.complete) { + if (rule.team != null && rule.team != result.winner) { + complete = false; + } + } + if (complete) { + var progress = gameStorage.get(new PackId(result.state.type)); + progress.completeLevel(result.level.id, result.state.presetId); + gameStorage.set(progress); + } + } } diff --git a/src/client/haxe/ru/m/tankz/render/Render.hx b/src/client/haxe/ru/m/tankz/render/Render.hx index c507c6f..1e4b76f 100755 --- a/src/client/haxe/ru/m/tankz/render/Render.hx +++ b/src/client/haxe/ru/m/tankz/render/Render.hx @@ -207,9 +207,7 @@ class Render extends SpriteView implements IRender { var item = items[id]; entryLayer.removeChild(item.view); playAnimate(item.rect.center, AnimateBundle.tankBoom()); - if (shot.score != null) { - showScore(item.rect.center, shot.score); - } + showScore(item.rect.center, shot.score); items.remove(id); } case DESTROY(BULLET(id)): @@ -226,18 +224,14 @@ class Render extends SpriteView implements IRender { if (items.exists(id)) { var item = items[id]; playAnimate(item.rect.center, AnimateBundle.tankBoom()); - if (shot.score != null) { - showScore(item.rect.center, shot.score); - } + showScore(item.rect.center, shot.score); cast(item, EagleRenderItem).death = true; } case DESTROY(BONUS(id, shot)): if (items.exists(id)) { var item = items[id]; upperLayer.removeChild(item.view); - if (shot.score != null) { - showScore(item.rect.center, shot.score); - } + showScore(item.rect.center, shot.score); items.remove(id); } case DESTROY(CELL(id, x, y, shot)): @@ -266,15 +260,17 @@ class Render extends SpriteView implements IRender { }); } - private function showScore(point:Point, score:Int):Void { - var view:LabelView = new LabelView(); - view.skinId = "text"; - view.text = Std.string(score); - view.update(); - view.redraw(); - view.x = point.x - view.width / 2; - view.y = point.y - view.height / 2; - upperLayer.addChild(view.content); - Timer.delay(function() upperLayer.removeChildSafety(view.content), 1000); + private function showScore(point:Point, score:Null):Void { + if (score != null && score != 0) { + var view:LabelView = new LabelView(); + view.skinId = "text"; + view.text = Std.string(score); + view.update(); + view.redraw(); + view.x = point.x - view.width / 2; + view.y = point.y - view.height / 2; + upperLayer.addChild(view.content); + Timer.delay(function() upperLayer.removeChildSafety(view.content), 1000); + } } } diff --git a/src/client/haxe/ru/m/tankz/view/GameFrame.hx b/src/client/haxe/ru/m/tankz/view/GameFrame.hx index ed32cbc..d9a69eb 100644 --- a/src/client/haxe/ru/m/tankz/view/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/GameFrame.hx @@ -14,7 +14,6 @@ import ru.m.tankz.network.NetworkGame; import ru.m.tankz.sound.SoundManager; import ru.m.tankz.storage.GameStorage; import ru.m.tankz.storage.SettingsStorage; -import ru.m.tankz.Type; import ru.m.tankz.view.game.GameView; import ru.m.tankz.view.GamepadView; @@ -31,7 +30,6 @@ import ru.m.tankz.view.GamepadView; @:provide static var gameStorage:GameStorage; @:provide static var settings:SettingsStorage; - //@:provide var result:Result; @:provide static var bus:IControlBus; private var game:IGame; @@ -87,29 +85,12 @@ import ru.m.tankz.view.GamepadView; public function onGameEvent(event:GameEvent):Void { switch event { case COMPLETE(result): - //this.result = result; - updateProgress(game, result.winner); stop(); switcher.change(ResultFrame.ID, result); case _: } } - // ToDo: - private static function updateProgress(game:IGame, winner:TeamId):Void { - var complete = true; - for (rule in game.config.game.complete) { - if (rule.team != null && rule.team != winner) { - complete = false; - } - } - if (complete) { - var progress = gameStorage.get(new PackId(game.state.type)); - progress.completeLevel(game.level.id, game.state.presetId); - gameStorage.set(progress); - } - } - override public function onHide():Void { stop(); soundManager.stopAll(); diff --git a/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml b/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml index c9b4ff6..242a40e 100644 --- a/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml @@ -1,21 +1,23 @@ --- -geometry.size.stretch: true -layout: - $type: haxework.view.layout.VerticalLayout views: - $type: haxework.view.VGroupView skinId: container + geometry.padding: 20 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.ScrollView + geometry.size.stretch: true + scroll.skinId: scroll.vertical + view: + 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 diff --git a/src/client/haxe/ru/m/tankz/view/RecordFrame.yaml b/src/client/haxe/ru/m/tankz/view/RecordFrame.yaml index 86cfb9b..3487ecf 100644 --- a/src/client/haxe/ru/m/tankz/view/RecordFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/RecordFrame.yaml @@ -1,7 +1,4 @@ --- -geometry.size.stretch: true -layout: - $type: haxework.view.layout.VerticalLayout views: - $type: haxework.view.VGroupView skinId: container diff --git a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx index e1deb36..e694c3b 100644 --- a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx @@ -1,11 +1,15 @@ package ru.m.tankz.view; +import haxework.view.ButtonView; import haxework.view.DataView; import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameView; import haxework.view.LabelView; +import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.game.GameEvent; +import ru.m.tankz.game.GameInit; import ru.m.tankz.game.GameState; +import ru.m.tankz.storage.GameStorage; import ru.m.tankz.view.common.LifeView; @:template class ResultFrame extends FrameView { @@ -13,10 +17,13 @@ import ru.m.tankz.view.common.LifeView; @:view("result") var resultView:DataView; @:view("level") var levelLabel:LabelView; + @:view("next") var nextButton:ButtonView; @:provide var frames:FrameSwitcher; + @:provide static var levelBundle:ILevelBundle; + @:provide static var gameStorage:GameStorage; - private var state:GameState; + private var result:Result; public function new() { super(ID); @@ -24,28 +31,45 @@ import ru.m.tankz.view.common.LifeView; private function playerViewFactory(index:Int, player:PlayerState):LifeView { var view = new LifeView(); - var playerConfig = state.config.getPlayer(player.id); + var playerConfig = result.state.config.getPlayer(player.id); var tankType = playerConfig.tanks[0].type; - var tankConfig = state.config.getTank(tankType); + var tankConfig = result.state.config.getTank(tankType); view.tank = tankConfig == null ? 'ba' : tankConfig.skin; - view.color = state.getPlayerColor(player.id); + view.color = result.state.getPlayerColor(player.id); view.life = player.frags; view.score = player.score; return view; } override public function onShow(data:Result):Void { - state = data.state; - resultView.data = Lambda.array(data.state.players); - var label = '${data.state.type} Level ${data.level.id}'; - if (data.level.name != null) { - label += '\n${data.level.name}'; + result = data; + resultView.data = Lambda.array(result.state.players); + var label = '${result.state.type} Level ${result.level.id}'; + if (result.level.name != null) { + label += '\n${result.level.name}'; } levelLabel.text = label; + nextButton.visible = gameStorage.get(result.level.packId).isPresetAvailable(result.level.id + 1, result.state.presetId); + nextButton.text = 'Next (${result.level.id + 1})'; + } + + private function levels():Void { + frames.change(LevelFrame.ID, levelBundle.get(result.level.packId)); + } + + private function restart():Void { + frames.change(GameFrame.ID, LOCAL({state: result.state.clean(), level: result.level})); } private function next():Void { - //ToDo: next level? + var pack = levelBundle.get(result.level.packId); + if (pack.data.length > result.level.id + 1) { + var level = pack.data[result.level.id + 1]; + var progress = gameStorage.get(pack.id); + if (progress.isPresetAvailable(level.id, result.state.presetId)) { + frames.change(GameFrame.ID, LOCAL({state: result.state.clean(), level: level})); + } + } } private function close():Void { diff --git a/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml b/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml index 4eed01f..0d692b0 100644 --- a/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml @@ -1,7 +1,4 @@ --- -geometry.size.stretch: true -layout: - $type: haxework.view.layout.VerticalLayout views: - $type: haxework.view.VGroupView skinId: container @@ -18,3 +15,22 @@ views: $type: haxework.view.layout.VerticalLayout hAlign: right margin: 10 + - $type: haxework.view.HGroupView + layout.margin: 10 + geometry.padding: 10 + views: + - id: levels + $type: haxework.view.ButtonView + skinId: button.simple + text: Levels + +onPress: $code:levels() + - id: restart + $type: haxework.view.ButtonView + skinId: button.simple + text: Restart + +onPress: $code:restart() + - id: next + $type: haxework.view.ButtonView + skinId: button.simple + text: Next + +onPress: $code:next() diff --git a/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml b/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml index 661f7eb..2476d0b 100644 --- a/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml @@ -1,7 +1,4 @@ --- -geometry.size.stretch: true -layout: - $type: haxework.view.layout.VerticalLayout views: - $type: haxework.view.VGroupView skinId: container @@ -12,9 +9,7 @@ views: text: Settings - $type: haxework.view.ScrollView geometry.size.stretch: true - scroll: - $type: haxework.view.list.VScrollBarView - skinId: scroll.vertical + scroll.skinId: scroll.vertical view: $type: haxework.view.GroupView geometry.size.stretch: true diff --git a/src/client/haxe/ru/m/tankz/view/StartFrame.yaml b/src/client/haxe/ru/m/tankz/view/StartFrame.yaml index 51113b0..1a65708 100644 --- a/src/client/haxe/ru/m/tankz/view/StartFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/StartFrame.yaml @@ -1,7 +1,4 @@ --- -geometry.size.stretch: true -layout: - $type: haxework.view.layout.VerticalLayout views: - $type: haxework.view.VGroupView skinId: container diff --git a/src/client/haxe/ru/m/tankz/view/common/LifeView.hx b/src/client/haxe/ru/m/tankz/view/common/LifeView.hx index b97d291..a09df3a 100644 --- a/src/client/haxe/ru/m/tankz/view/common/LifeView.hx +++ b/src/client/haxe/ru/m/tankz/view/common/LifeView.hx @@ -1,5 +1,6 @@ package ru.m.tankz.view.common; +import haxework.color.Color; import haxework.view.HGroupView; import haxework.view.ImageView; import haxework.view.LabelView; @@ -16,7 +17,7 @@ import ru.m.tankz.Type; public var playerId(default, default):PlayerId; public var state(null, set):PlayerState; public var tank(null, set):String; - public var color(null, set):Int; + public var color(null, set):Color; public var life(null, set):Int; public var score(null, set):Int; @@ -37,7 +38,7 @@ import ru.m.tankz.Type; return tank; } - private inline function set_color(value:Int):Int { + private inline function set_color(value:Color):Color { tankImage.color = value; return value; } diff --git a/src/client/haxe/ru/m/tankz/view/popup/CreateGamePopup.yaml b/src/client/haxe/ru/m/tankz/view/popup/CreateGamePopup.yaml index 70ad593..33b6733 100644 --- a/src/client/haxe/ru/m/tankz/view/popup/CreateGamePopup.yaml +++ b/src/client/haxe/ru/m/tankz/view/popup/CreateGamePopup.yaml @@ -51,9 +51,7 @@ view: text: Level - $type: haxework.view.ScrollView geometry.size.stretch: true - scroll: - $type: haxework.view.list.VScrollBarView - skinId: scroll.vertical + scroll.skinId: scroll.vertical view: id: level $type: haxework.view.DataView diff --git a/src/common/haxe/ru/m/tankz/config/Config.hx b/src/common/haxe/ru/m/tankz/config/Config.hx index 252d8f1..0eecbba 100644 --- a/src/common/haxe/ru/m/tankz/config/Config.hx +++ b/src/common/haxe/ru/m/tankz/config/Config.hx @@ -107,6 +107,7 @@ typedef GamePreset = { } typedef LevelConfig = { + @:optional var packId:PackId; @:optional var id:LevelId; var data:Array; @:optional var name:String; diff --git a/src/common/haxe/ru/m/tankz/game/GameRunner.hx b/src/common/haxe/ru/m/tankz/game/GameRunner.hx index a885d83..6341b29 100644 --- a/src/common/haxe/ru/m/tankz/game/GameRunner.hx +++ b/src/common/haxe/ru/m/tankz/game/GameRunner.hx @@ -238,10 +238,12 @@ class GameRunner extends Game implements EngineListener { gameEventSignal.emit(DESTROY(BULLET(bullet.id))); } case [BULLET(bullet), EAGLE(eagle)]: - if (!eagle.protect) { - gameEventSignal.emit(DESTROY(EAGLE(eagle.id, buildShot(bullet, eagle.score)))); + if (!eagle.death) { + if (!eagle.protect) { + gameEventSignal.emit(DESTROY(EAGLE(eagle.id, buildShot(bullet, eagle.score)))); + } + gameEventSignal.emit(DESTROY(BULLET(bullet.id))); } - gameEventSignal.emit(DESTROY(BULLET(bullet.id))); case _: } } diff --git a/src/common/haxe/ru/m/tankz/game/GameState.hx b/src/common/haxe/ru/m/tankz/game/GameState.hx index 1bff71a..2fdda37 100644 --- a/src/common/haxe/ru/m/tankz/game/GameState.hx +++ b/src/common/haxe/ru/m/tankz/game/GameState.hx @@ -144,4 +144,8 @@ class GameState { var playerState = players[id]; return (playerState == null || playerState.color.zero) ? config.getColor(id) : playerState.color; } + + public function clean():GameState { + return new GameState(type, presetId, null, controls); + } } diff --git a/src/common/haxe/ru/m/tankz/game/PackProgress.hx b/src/common/haxe/ru/m/tankz/game/PackProgress.hx index 7b80484..a3c196a 100644 --- a/src/common/haxe/ru/m/tankz/game/PackProgress.hx +++ b/src/common/haxe/ru/m/tankz/game/PackProgress.hx @@ -27,7 +27,7 @@ class PackProgress { } public function isPresetAvailable(levelId:LevelId, presetId:PresetId):Bool { - return presetId == 0 || completed.exists(levelId) && completed.get(levelId).presets.get(presetId - 1) != null; + return isLevelAvailable(levelId) && (presetId == 0 || (completed.exists(levelId) && completed.get(levelId).presets.get(presetId - 1) != null)); } public function isPresetCompleted(levelId:LevelId, presetId:PresetId):Bool { diff --git a/src/editor/haxe/ru/m/tankz/editor/view/EditorView.yaml b/src/editor/haxe/ru/m/tankz/editor/view/EditorView.yaml index d7e8c2a..2083992 100644 --- a/src/editor/haxe/ru/m/tankz/editor/view/EditorView.yaml +++ b/src/editor/haxe/ru/m/tankz/editor/view/EditorView.yaml @@ -9,8 +9,6 @@ views: $type: haxework.view.ButtonGroup geometry.margin.bottom: -2 buttonSkinId: button.tab - layout: - $type: haxework.view.layout.HorizontalLayout +onDataSelect: $code:function(id) switcher.change(id) data: - "map"