From 74322ca6a4194d3176574e72fcba2c7f06f3ec2d Mon Sep 17 00:00:00 2001 From: shmyga Date: Mon, 4 Mar 2019 18:00:44 +0300 Subject: [PATCH] [client] level frames update --- src/client/haxe/ru/m/tankz/ClientView.yaml | 14 ++- src/client/haxe/ru/m/tankz/Style.hx | 2 +- .../haxe/ru/m/tankz/frame/StartFrame.hx | 21 +--- .../haxe/ru/m/tankz/frame/StartGameFrame.hx | 88 --------------- .../haxe/ru/m/tankz/frame/StartGameFrame.yaml | 36 ------ .../m/tankz/frame/classic/ClassicGameFrame.hx | 20 ++++ .../tankz/frame/classic/ClassicGameFrame.yaml | 13 +++ .../{game => classic}/ClassicGamePanel.hx | 3 +- .../{game => classic}/ClassicGamePanel.yaml | 0 .../tankz/frame/classic/ClassicLevelFrame.hx | 51 +++++++++ .../frame/classic/ClassicLevelFrame.yaml | 25 +++++ .../haxe/ru/m/tankz/frame/common/GameFrame.hx | 105 ++++++++++++++++++ .../frame/{game => common}/IGamePanel.hx | 2 +- .../ru/m/tankz/frame/common/LevelFrame.hx | 59 ++++++++++ .../frame/{start => common}/LevelView.hx | 4 +- .../frame/{start => common}/LevelView.yaml | 0 .../frame/{start => common}/PlayerView.hx | 2 +- .../frame/{start => common}/PlayerView.yaml | 0 .../frame/{start => common}/PresetsView.hx | 4 +- .../{GameFrame.hx => dota/DotaGameFrame.hx} | 13 +-- .../DotaGameFrame.yaml} | 4 +- .../frame/{game => dota}/DotaGamePanel.hx | 3 +- .../frame/{game => dota}/DotaGamePanel.yaml | 0 .../ru/m/tankz/frame/dota/DotaLevelFrame.hx | 42 +++++++ .../ru/m/tankz/frame/dota/DotaLevelFrame.yaml | 22 ++++ src/common/haxe/ru/m/tankz/config/Config.hx | 1 + src/common/resources/classic/config.yaml | 1 + 27 files changed, 372 insertions(+), 163 deletions(-) delete mode 100644 src/client/haxe/ru/m/tankz/frame/StartGameFrame.hx delete mode 100644 src/client/haxe/ru/m/tankz/frame/StartGameFrame.yaml create mode 100755 src/client/haxe/ru/m/tankz/frame/classic/ClassicGameFrame.hx create mode 100644 src/client/haxe/ru/m/tankz/frame/classic/ClassicGameFrame.yaml rename src/client/haxe/ru/m/tankz/frame/{game => classic}/ClassicGamePanel.hx (92%) rename src/client/haxe/ru/m/tankz/frame/{game => classic}/ClassicGamePanel.yaml (100%) create mode 100644 src/client/haxe/ru/m/tankz/frame/classic/ClassicLevelFrame.hx create mode 100644 src/client/haxe/ru/m/tankz/frame/classic/ClassicLevelFrame.yaml create mode 100644 src/client/haxe/ru/m/tankz/frame/common/GameFrame.hx rename src/client/haxe/ru/m/tankz/frame/{game => common}/IGamePanel.hx (80%) create mode 100644 src/client/haxe/ru/m/tankz/frame/common/LevelFrame.hx rename src/client/haxe/ru/m/tankz/frame/{start => common}/LevelView.hx (93%) rename src/client/haxe/ru/m/tankz/frame/{start => common}/LevelView.yaml (100%) rename src/client/haxe/ru/m/tankz/frame/{start => common}/PlayerView.hx (98%) rename src/client/haxe/ru/m/tankz/frame/{start => common}/PlayerView.yaml (100%) rename src/client/haxe/ru/m/tankz/frame/{start => common}/PresetsView.hx (94%) rename src/client/haxe/ru/m/tankz/frame/{GameFrame.hx => dota/DotaGameFrame.hx} (90%) rename src/client/haxe/ru/m/tankz/frame/{GameFrame.yaml => dota/DotaGameFrame.yaml} (84%) rename src/client/haxe/ru/m/tankz/frame/{game => dota}/DotaGamePanel.hx (94%) rename src/client/haxe/ru/m/tankz/frame/{game => dota}/DotaGamePanel.yaml (100%) create mode 100644 src/client/haxe/ru/m/tankz/frame/dota/DotaLevelFrame.hx create mode 100644 src/client/haxe/ru/m/tankz/frame/dota/DotaLevelFrame.yaml diff --git a/src/client/haxe/ru/m/tankz/ClientView.yaml b/src/client/haxe/ru/m/tankz/ClientView.yaml index 72ead9e..843ef97 100755 --- a/src/client/haxe/ru/m/tankz/ClientView.yaml +++ b/src/client/haxe/ru/m/tankz/ClientView.yaml @@ -13,10 +13,16 @@ views: views: - id: start $type: ru.m.tankz.frame.StartFrame - - id: level - $type: ru.m.tankz.frame.StartGameFrame - - id: game - $type: ru.m.tankz.frame.GameFrame + # classic + - id: classic.level + $type: ru.m.tankz.frame.classic.ClassicLevelFrame + - id: classic.game + $type: ru.m.tankz.frame.classic.ClassicGameFrame + # dota + - id: dota.level + $type: ru.m.tankz.frame.dota.DotaLevelFrame + - id: dota.game + $type: ru.m.tankz.frame.dota.DotaGameFrame # - id: network # $type: ru.m.tankz.frame.NetworkFrame - id: settings diff --git a/src/client/haxe/ru/m/tankz/Style.hx b/src/client/haxe/ru/m/tankz/Style.hx index 3d32aa5..280c810 100644 --- a/src/client/haxe/ru/m/tankz/Style.hx +++ b/src/client/haxe/ru/m/tankz/Style.hx @@ -36,7 +36,7 @@ class Style { Skin.text(textColor, 16, fontFamily), Skin.size(100, 36), ]); - resources.skin.put("button.toggle", [ + resources.skin.put("button.tab", [ Skin.tabColor(lightColor), Skin.text(textColor, 16, fontFamily), Skin.size(200, 36), diff --git a/src/client/haxe/ru/m/tankz/frame/StartFrame.hx b/src/client/haxe/ru/m/tankz/frame/StartFrame.hx index fbb42b2..e1fadd1 100644 --- a/src/client/haxe/ru/m/tankz/frame/StartFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/StartFrame.hx @@ -1,42 +1,29 @@ package ru.m.tankz.frame; +import ru.m.tankz.frame.classic.ClassicLevelFrame; +import ru.m.tankz.frame.dota.DotaLevelFrame; import haxework.gui.ButtonView; import haxework.gui.frame.IFrameSwitcher; import haxework.gui.VGroupView; -import ru.m.tankz.game.GameState; -import ru.m.tankz.preset.ClassicGame; -import ru.m.tankz.preset.DotaGame; import ru.m.tankz.storage.SaveStorage; -import ru.m.tankz.Type; @:template class StartFrame extends VGroupView { public static var ID(default, never):String = "start"; - @:view var classic(default, null):ButtonView; - @:view var dota(default, null):ButtonView; - @:view var network(default, null):ButtonView; - @:view var settings(default, null):ButtonView; - @:provide var frameSwitcher:IFrameSwitcher; - @:provide var state:GameState; @:provide var storage:SaveStorage; public function onPress(view:ButtonView):Void { switch (view.id) { case 'classic': - startGame(ClassicGame.TYPE, ClassicGame.PLAYER1); + frameSwitcher.change(ClassicLevelFrame.ID); case 'dota': - startGame(DotaGame.TYPE, DotaGame.PLAYER1); + frameSwitcher.change(DotaLevelFrame.ID); case 'network': //frameSwitcher.change(NetworkFrame.ID); case 'settings': frameSwitcher.change(SettingsFrame.ID); } } - - private function startGame(type:GameType, presetId:PresetId):Void { - state = new GameState(type, presetId); - frameSwitcher.change(StartGameFrame.ID); - } } diff --git a/src/client/haxe/ru/m/tankz/frame/StartGameFrame.hx b/src/client/haxe/ru/m/tankz/frame/StartGameFrame.hx deleted file mode 100644 index a36dfc4..0000000 --- a/src/client/haxe/ru/m/tankz/frame/StartGameFrame.hx +++ /dev/null @@ -1,88 +0,0 @@ -package ru.m.tankz.frame; - -import haxework.gui.frame.IFrameSwitcher; -import haxework.gui.list.ListView; -import haxework.gui.VGroupView; -import haxework.provider.Provider; -import ru.m.tankz.bundle.IConfigBundle; -import ru.m.tankz.config.Config; -import ru.m.tankz.control.Control; -import ru.m.tankz.frame.start.PresetsView; -import ru.m.tankz.game.GameState; -import ru.m.tankz.storage.SaveStorage; -import ru.m.tankz.Type; - - -@:template class StartGameFrame extends VGroupView { - public static inline var ID = "level"; - - @:view var presets(default, null):PresetsView; - @:view var players(default, null):ListView; - @:view var levels(default, null):ListView; - - @:provide var state:GameState; - @:provide var storage:SaveStorage; - - public var gameType(default, set):GameType; - public var presetId(default, set):PresetId; - - private var config:Config; - private var preset:GamePreset; - - public function init():Void { - presets.change.connect(function(presetId) this.presetId = presetId); - } - - private function set_gameType(value:GameType):GameType { - if (gameType != value) { - gameType = value; - config = Provider.get(IConfigBundle).get(gameType); - presets.data = config.presets; - levels.data = [for (i in 0...config.game.levels) i]; - presetId = null; - presetId = config.presets[0].id; - - var save:GameState = storage.read(gameType); - // ToDo: start save button - } - return gameType; - } - - private function set_presetId(value:PresetId):PresetId { - if (presetId != value) { - presetId = value; - presets.selected = presetId; - state = new GameState(gameType, presetId); - if (presetId != null) { - preset = config.getPreset(presetId); - var players:Array = []; - var human = true; - for (team in preset.teams) { - for (player in team.players) { - var playerId = new PlayerId(team.id, player.index); - state.control.set(playerId, human ? Control.HUMAN : Control.BOT); - human = false; - players.push(playerId); - } - } - this.players.data = players; - } else { - this.players.data = []; - } - } - toUpdate(); - return presetId; - } - - public function onShow():Void { - gameType = state.type; - if (state.presetId != null) { - presetId = state.presetId; - } - } - - public function onListItemClick(item:IListItemView):Void { - state.level = item.data; - Provider.get(IFrameSwitcher).change(GameFrame.ID); - } -} diff --git a/src/client/haxe/ru/m/tankz/frame/StartGameFrame.yaml b/src/client/haxe/ru/m/tankz/frame/StartGameFrame.yaml deleted file mode 100644 index e582190..0000000 --- a/src/client/haxe/ru/m/tankz/frame/StartGameFrame.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- -geometry.size.stretch: true -views: - - id: presets - $type: ru.m.tankz.frame.start.PresetsView - geometry.size.width: 100% - geometry.margin.top: 10 - geometry.margin.bottom: -3 - layout.hAlign: center - - $type: haxework.gui.HGroupView - skin: $r:skin:border - geometry.size.stretch: true - views: - - id: players - $type: haxework.gui.list.VListView - factory: { $class: ru.m.tankz.frame.start.PlayerView } - geometry.size.percent: [50, 100] - geometry.padding: 10 - scroll: - $type: haxework.gui.list.VScrollBarView - geometry.size.width: 10 - geometry.size.height: 100% - skin: - - $type: [haxework.gui.list.ScrollBarSkin.vertical] - - id: levels - $type: haxework.gui.list.VListView - factory: { $class: ru.m.tankz.frame.start.LevelView } - +onItemSelect: $this:onListItemClick - geometry.size.percent: [50, 100] - geometry.padding: 10 - scroll: - $type: haxework.gui.list.VScrollBarView - geometry.size.width: 10 - geometry.size.height: 100% - skin: - - $type: [haxework.gui.list.ScrollBarSkin.vertical] diff --git a/src/client/haxe/ru/m/tankz/frame/classic/ClassicGameFrame.hx b/src/client/haxe/ru/m/tankz/frame/classic/ClassicGameFrame.hx new file mode 100755 index 0000000..1ff4cd6 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/classic/ClassicGameFrame.hx @@ -0,0 +1,20 @@ +package ru.m.tankz.frame.classic; + +import ru.m.tankz.frame.common.IGamePanel; +import ru.m.tankz.render.Render; +import ru.m.tankz.frame.common.GameFrame; + +@:template class ClassicGameFrame extends GameFrame { + public static inline var ID = "classic.game"; + + @:view("render") private var renderView(default, null):Render; + @:view("panel") private var panelView(default, null):IGamePanel; + + override private function get_render():Render { + return renderView; + } + + override private function get_panel():IGamePanel { + return panelView; + } +} diff --git a/src/client/haxe/ru/m/tankz/frame/classic/ClassicGameFrame.yaml b/src/client/haxe/ru/m/tankz/frame/classic/ClassicGameFrame.yaml new file mode 100644 index 0000000..1635509 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/classic/ClassicGameFrame.yaml @@ -0,0 +1,13 @@ +--- +layout: + $type: haxework.gui.layout.HorizontalLayout + hAlign: center + vAlign: middle +geometry.size.stretch: true +views: + - id: render + $type: ru.m.tankz.render.Render + - id: panel + $type: ru.m.tankz.frame.classic.ClassicGamePanel + geometry.size.width: 200 + geometry.size.height: 100% diff --git a/src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.hx b/src/client/haxe/ru/m/tankz/frame/classic/ClassicGamePanel.hx similarity index 92% rename from src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.hx rename to src/client/haxe/ru/m/tankz/frame/classic/ClassicGamePanel.hx index daaef8c..f674929 100644 --- a/src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.hx +++ b/src/client/haxe/ru/m/tankz/frame/classic/ClassicGamePanel.hx @@ -1,5 +1,6 @@ -package ru.m.tankz.frame.game; +package ru.m.tankz.frame.classic; +import ru.m.tankz.frame.common.IGamePanel; import haxework.gui.LabelView; import haxework.gui.VGroupView; import ru.m.tankz.game.Game; diff --git a/src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.yaml b/src/client/haxe/ru/m/tankz/frame/classic/ClassicGamePanel.yaml similarity index 100% rename from src/client/haxe/ru/m/tankz/frame/game/ClassicGamePanel.yaml rename to src/client/haxe/ru/m/tankz/frame/classic/ClassicGamePanel.yaml diff --git a/src/client/haxe/ru/m/tankz/frame/classic/ClassicLevelFrame.hx b/src/client/haxe/ru/m/tankz/frame/classic/ClassicLevelFrame.hx new file mode 100644 index 0000000..3e0edd0 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/classic/ClassicLevelFrame.hx @@ -0,0 +1,51 @@ +package ru.m.tankz.frame.classic; + +import haxework.gui.DataView; +import haxework.gui.frame.IFrameSwitcher; +import haxework.gui.ToggleButtonView; +import ru.m.tankz.config.Config; +import ru.m.tankz.frame.common.LevelFrame; +import ru.m.tankz.preset.ClassicGame; + +@:template class ClassicLevelFrame extends LevelFrame { + public static inline var ID = "classic.level"; + + @:view var presets(default, null):DataView; + @:view var levels(default, null):DataView; + + @:provide var frames:IFrameSwitcher; + + private function onShow():Void { + gameType = ClassicGame.TYPE; + levels.data = [for (i in 0...config.game.levels) i]; + presets.data = config.presets; + setSelectedPreset(preset); + } + + private function setSelectedPreset(preset:GamePreset) { + for (view in presets.views) { + cast(view, ToggleButtonView).on = view.id == preset.id; + } + } + + private function presetViewFactory(index:Int, preset:GamePreset):ToggleButtonView { + var view = new ToggleButtonView(); + view.id = preset.id; + view.text = '${preset.id}'; + resources.skin.bind("button.simple", view, "skin"); + return view; + } + + override private function set_preset(value:GamePreset):GamePreset { + var result = super.set_preset(value); + setSelectedPreset(result); + return result; + } + + + override private function set_level(value:Int):Int { + var result = super.set_level(value); + frames.change(ClassicGameFrame.ID); + return result; + } +} diff --git a/src/client/haxe/ru/m/tankz/frame/classic/ClassicLevelFrame.yaml b/src/client/haxe/ru/m/tankz/frame/classic/ClassicLevelFrame.yaml new file mode 100644 index 0000000..cd663bb --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/classic/ClassicLevelFrame.yaml @@ -0,0 +1,25 @@ +--- +geometry.size.stretch: true +layout: + $type: haxework.gui.layout.VerticalLayout + hAlign: center +views: + - id: presets + $type: haxework.gui.DataView + layout: + $type: haxework.gui.layout.HorizontalLayout + hAlign: center + margin: 2 + factory: $this:presetViewFactory + +onDataSelect: $code:function(value) preset = value + geometry.size.width: 100% + geometry.padding: 10 + - id: levels + $type: haxework.gui.DataView + layout: + $type: haxework.gui.layout.TailLayout + margin: 2 + factory: $this:levelViewFactory + +onDataSelect: $code:function(value) level = value + geometry.size.stretch: true + geometry.padding: 10 diff --git a/src/client/haxe/ru/m/tankz/frame/common/GameFrame.hx b/src/client/haxe/ru/m/tankz/frame/common/GameFrame.hx new file mode 100644 index 0000000..3d0b75d --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/common/GameFrame.hx @@ -0,0 +1,105 @@ +package ru.m.tankz.frame.common; + +import flash.events.Event; +import haxe.ds.Option; +import haxe.Timer; +import haxework.gui.frame.IFrameSwitcher; +import haxework.gui.GroupView; +import ru.m.tankz.frame.common.IGamePanel; +import ru.m.tankz.game.Game; +import ru.m.tankz.game.GameState; +import ru.m.tankz.network.NetworkGame; +import ru.m.tankz.network.NetworkManager; +import ru.m.tankz.render.Render; +import ru.m.tankz.sound.SoundManager; +import ru.m.tankz.storage.SaveStorage; + +class GameFrame extends GroupView { + + private static inline var TAG = "GameFrame"; + + private var render(get, null):Render; + private var panel(get, null):IGamePanel; + + @:provide var network:NetworkManager; + @:provide var sound:SoundManager; + @:provide var state:GameState; + @:provide var storage:SaveStorage; + @:provide var switcher:IFrameSwitcher; + + private var game:Game; + private var timer:Timer; + + private function get_render():Render { + throw "Not implemented"; + } + + private function get_panel():IGamePanel { + throw "Not implemented"; + } + + public function onShow():Void { + start(state); + } + + private function start(state:GameState):Void { + game = new Game(state.type); + game.engine.connect(render); + game.engine.connect(sound); + game.start(state).then(onGameStateChange).endThen(onGameComplete); + timer = new Timer(10); + timer.run = updateEngine; + panel.game = game; + content.addEventListener(Event.ENTER_FRAME, _redraw); + render.draw(game.engine); + sound.play('start'); + } + + private function stop():Void { + if (timer != null) { + timer.stop(); + timer = null; + } + content.removeEventListener(Event.ENTER_FRAME, _redraw); + if (game != null) { + game.dispose(); + game = null; + } + render.reset(); + } + + private function onGameStateChange(s:GameState):GameState { + panel.toUpdate(); + return s; + } + + private function onGameComplete(result:Option):Void { + switch (result) { + case Option.Some(s): + panel.toUpdate(); + case Option.None: + } + switch (game.next()) { + case Option.Some(s): + var state = game.save(); + this.state = state; + storage.write(state); + stop(); + start(state); + case Option.None: + switcher.change(StartFrame.ID); + } + } + + public function onHide():Void { + stop(); + } + + private function updateEngine():Void { + game.engine.update(); + } + + private function _redraw(_):Void { + render.draw(game.engine); + } +} diff --git a/src/client/haxe/ru/m/tankz/frame/game/IGamePanel.hx b/src/client/haxe/ru/m/tankz/frame/common/IGamePanel.hx similarity index 80% rename from src/client/haxe/ru/m/tankz/frame/game/IGamePanel.hx rename to src/client/haxe/ru/m/tankz/frame/common/IGamePanel.hx index bb74d23..a5e52db 100644 --- a/src/client/haxe/ru/m/tankz/frame/game/IGamePanel.hx +++ b/src/client/haxe/ru/m/tankz/frame/common/IGamePanel.hx @@ -1,4 +1,4 @@ -package ru.m.tankz.frame.game; +package ru.m.tankz.frame.common; import ru.m.tankz.game.Game; import haxework.gui.IView; diff --git a/src/client/haxe/ru/m/tankz/frame/common/LevelFrame.hx b/src/client/haxe/ru/m/tankz/frame/common/LevelFrame.hx new file mode 100644 index 0000000..84b2b7e --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/common/LevelFrame.hx @@ -0,0 +1,59 @@ +package ru.m.tankz.frame.common; + +import haxework.gui.ButtonView; +import haxework.gui.GroupView; +import haxework.resources.IResources; +import ru.m.tankz.bundle.IConfigBundle; +import ru.m.tankz.config.Config; +import ru.m.tankz.control.Control; +import ru.m.tankz.game.GameState; +import ru.m.tankz.storage.SaveStorage; +import ru.m.tankz.Type; + +class LevelFrame extends GroupView { + + public var gameType(default, set):GameType; + public var preset(default, set):GamePreset; + public var level(default, set):Int; + private var config(default, null):Config; + + @:provide var configBundle:IConfigBundle; + @:provide var state:GameState; + @:provide var storage:SaveStorage; + @:provide var resources:IResources; + + private function set_gameType(value:GameType):GameType { + if (gameType != value) { + gameType = value; + config = configBundle.get(gameType); + preset = config.presets[0]; + } + return gameType; + } + + private function set_preset(value:GamePreset):GamePreset { + if (preset != value) { + preset = value; + state = new GameState(gameType, preset.id); + for (team in value.teams) { + for (player in team.players) { + var playerId = new PlayerId(team.id, player.index); + state.control.set(playerId, player.control != null ? player.control : Control.BOT); + } + } + } + return preset; + } + + private function set_level(value:Int):Int { + state.level = value; + return state.level; + } + + private function levelViewFactory(index:Int, level:Int):ButtonView { + var view = new ButtonView(); + view.text = '${level}'; + resources.skin.bind("button.simple", view, "skin"); + return view; + } +} diff --git a/src/client/haxe/ru/m/tankz/frame/start/LevelView.hx b/src/client/haxe/ru/m/tankz/frame/common/LevelView.hx similarity index 93% rename from src/client/haxe/ru/m/tankz/frame/start/LevelView.hx rename to src/client/haxe/ru/m/tankz/frame/common/LevelView.hx index d6e3c42..bd2424b 100755 --- a/src/client/haxe/ru/m/tankz/frame/start/LevelView.hx +++ b/src/client/haxe/ru/m/tankz/frame/common/LevelView.hx @@ -1,4 +1,4 @@ -package ru.m.tankz.frame.start; +package ru.m.tankz.frame.common; import haxework.gui.HGroupView; import haxework.gui.LabelView; @@ -17,4 +17,4 @@ import haxework.gui.list.ListView.IListItemView; label.text = 'Level ${data}'; return data; } -} \ No newline at end of file +} diff --git a/src/client/haxe/ru/m/tankz/frame/start/LevelView.yaml b/src/client/haxe/ru/m/tankz/frame/common/LevelView.yaml similarity index 100% rename from src/client/haxe/ru/m/tankz/frame/start/LevelView.yaml rename to src/client/haxe/ru/m/tankz/frame/common/LevelView.yaml diff --git a/src/client/haxe/ru/m/tankz/frame/start/PlayerView.hx b/src/client/haxe/ru/m/tankz/frame/common/PlayerView.hx similarity index 98% rename from src/client/haxe/ru/m/tankz/frame/start/PlayerView.hx rename to src/client/haxe/ru/m/tankz/frame/common/PlayerView.hx index 79b7570..19ed981 100644 --- a/src/client/haxe/ru/m/tankz/frame/start/PlayerView.hx +++ b/src/client/haxe/ru/m/tankz/frame/common/PlayerView.hx @@ -1,4 +1,4 @@ -package ru.m.tankz.frame.start; +package ru.m.tankz.frame.common; import ru.m.draw.Color; import ru.m.tankz.bundle.IConfigBundle; diff --git a/src/client/haxe/ru/m/tankz/frame/start/PlayerView.yaml b/src/client/haxe/ru/m/tankz/frame/common/PlayerView.yaml similarity index 100% rename from src/client/haxe/ru/m/tankz/frame/start/PlayerView.yaml rename to src/client/haxe/ru/m/tankz/frame/common/PlayerView.yaml diff --git a/src/client/haxe/ru/m/tankz/frame/start/PresetsView.hx b/src/client/haxe/ru/m/tankz/frame/common/PresetsView.hx similarity index 94% rename from src/client/haxe/ru/m/tankz/frame/start/PresetsView.hx rename to src/client/haxe/ru/m/tankz/frame/common/PresetsView.hx index e66b034..f1a3d79 100644 --- a/src/client/haxe/ru/m/tankz/frame/start/PresetsView.hx +++ b/src/client/haxe/ru/m/tankz/frame/common/PresetsView.hx @@ -1,4 +1,4 @@ -package ru.m.tankz.frame.start; +package ru.m.tankz.frame.common; import haxework.resources.IResources; import haxework.gui.ButtonView; @@ -28,7 +28,7 @@ class PresetsView extends HGroupView { removeAllViews(); for (item in data) { var view = new ToggleButtonView(); - view.skin = resources.skin.get("button.toggle"); + view.skin = resources.skin.get("button.tab"); view.text = item.id; view.fontFamily = "Courirer New"; view.fontColor = 0xffffff; diff --git a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx b/src/client/haxe/ru/m/tankz/frame/dota/DotaGameFrame.hx similarity index 90% rename from src/client/haxe/ru/m/tankz/frame/GameFrame.hx rename to src/client/haxe/ru/m/tankz/frame/dota/DotaGameFrame.hx index be6b075..171870f 100755 --- a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/dota/DotaGameFrame.hx @@ -1,14 +1,13 @@ -package ru.m.tankz.frame; +package ru.m.tankz.frame.dota; -import haxework.gui.core.Geometry.Position; +import ru.m.tankz.frame.classic.ClassicGamePanel; +import ru.m.tankz.frame.common.IGamePanel; import flash.events.Event; import haxe.ds.Option; import haxe.Timer; +import haxework.gui.core.Geometry.Position; import haxework.gui.frame.IFrameSwitcher; import haxework.gui.VGroupView; -import ru.m.tankz.frame.game.ClassicGamePanel; -import ru.m.tankz.frame.game.DotaGamePanel; -import ru.m.tankz.frame.game.IGamePanel; import ru.m.tankz.game.Game; import ru.m.tankz.game.GameState; import ru.m.tankz.network.NetworkGame; @@ -20,11 +19,11 @@ import ru.m.tankz.sound.SoundManager; import ru.m.tankz.storage.SaveStorage; import ru.m.tankz.Type.GameType; -@:template class GameFrame extends VGroupView { +@:template class DotaGameFrame extends VGroupView { private static inline var TAG = "GameFrame"; - public static inline var ID = "game"; + public static inline var ID = "dota.game"; @:view var render(default, null):Render; diff --git a/src/client/haxe/ru/m/tankz/frame/GameFrame.yaml b/src/client/haxe/ru/m/tankz/frame/dota/DotaGameFrame.yaml similarity index 84% rename from src/client/haxe/ru/m/tankz/frame/GameFrame.yaml rename to src/client/haxe/ru/m/tankz/frame/dota/DotaGameFrame.yaml index f1eed0c..1409bfc 100644 --- a/src/client/haxe/ru/m/tankz/frame/GameFrame.yaml +++ b/src/client/haxe/ru/m/tankz/frame/dota/DotaGameFrame.yaml @@ -4,7 +4,7 @@ layout.hAlign: center layout.vAlign: middle views: - id: dotaPanel - $type: ru.m.tankz.frame.game.DotaGamePanel + $type: ru.m.tankz.frame.dota.DotaGamePanel geometry.size.width: 100% geometry.size.height: 20 geometry.position: absolute @@ -17,7 +17,7 @@ views: - id: render $type: ru.m.tankz.render.Render - id: classicPanel - $type: ru.m.tankz.frame.game.ClassicGamePanel + $type: ru.m.tankz.frame.classic.ClassicGamePanel geometry.size.width: 200 geometry.size.height: 100% geometry.position: absolute diff --git a/src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.hx b/src/client/haxe/ru/m/tankz/frame/dota/DotaGamePanel.hx similarity index 94% rename from src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.hx rename to src/client/haxe/ru/m/tankz/frame/dota/DotaGamePanel.hx index c04af67..65bbbd7 100644 --- a/src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.hx +++ b/src/client/haxe/ru/m/tankz/frame/dota/DotaGamePanel.hx @@ -1,5 +1,6 @@ -package ru.m.tankz.frame.game; +package ru.m.tankz.frame.dota; +import ru.m.tankz.frame.common.IGamePanel; import haxework.gui.LabelView; import haxework.gui.HGroupView; import ru.m.tankz.game.Game; diff --git a/src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.yaml b/src/client/haxe/ru/m/tankz/frame/dota/DotaGamePanel.yaml similarity index 100% rename from src/client/haxe/ru/m/tankz/frame/game/DotaGamePanel.yaml rename to src/client/haxe/ru/m/tankz/frame/dota/DotaGamePanel.yaml diff --git a/src/client/haxe/ru/m/tankz/frame/dota/DotaLevelFrame.hx b/src/client/haxe/ru/m/tankz/frame/dota/DotaLevelFrame.hx new file mode 100644 index 0000000..9a1e00e --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/dota/DotaLevelFrame.hx @@ -0,0 +1,42 @@ +package ru.m.tankz.frame.dota; + +import haxework.gui.DataView; +import haxework.gui.frame.IFrameSwitcher; +import ru.m.tankz.frame.common.LevelFrame; +import ru.m.tankz.frame.common.PlayerView; +import ru.m.tankz.preset.DotaGame; +import ru.m.tankz.Type; + +@:template class DotaLevelFrame extends LevelFrame { + public static inline var ID = "dota.level"; + + @:view var levels(default, null):DataView; + @:view var players(default, null):DataView; + + @:provide var frames:IFrameSwitcher; + + private function onShow():Void { + gameType = DotaGame.TYPE; + levels.data = [for (i in 0...config.game.levels) i]; + var data = []; + for (team in preset.teams) { + for (p in team.players) { + data.push(new PlayerId(team.id, p.index)); + } + } + players.data = data; + } + + private function playerViewFactory(index:Int, player:PlayerId):PlayerView { + var view = new PlayerView(); + view.item_index = index; + view.data = player; + return view; + } + + override private function set_level(value:Int):Int { + var result = super.set_level(value); + frames.change(DotaGameFrame.ID); + return result; + } +} diff --git a/src/client/haxe/ru/m/tankz/frame/dota/DotaLevelFrame.yaml b/src/client/haxe/ru/m/tankz/frame/dota/DotaLevelFrame.yaml new file mode 100644 index 0000000..0c113fb --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/dota/DotaLevelFrame.yaml @@ -0,0 +1,22 @@ +--- +geometry.size.stretch: true +layout: + $type: haxework.gui.layout.HorizontalLayout +views: + - id: players + $type: haxework.gui.DataView + layout: + $type: haxework.gui.layout.VerticalLayout + hAlign: center + factory: $this:playerViewFactory + geometry.size.percent: [50, 100] + geometry.padding: 10 + - id: levels + $type: haxework.gui.DataView + layout: + $type: haxework.gui.layout.TailLayout + margin: 2 + factory: $this:levelViewFactory + +onDataSelect: $code:function(value) level = value + geometry.size.percent: [50, 100] + geometry.padding: 10 diff --git a/src/common/haxe/ru/m/tankz/config/Config.hx b/src/common/haxe/ru/m/tankz/config/Config.hx index ce837af..4d29dc8 100644 --- a/src/common/haxe/ru/m/tankz/config/Config.hx +++ b/src/common/haxe/ru/m/tankz/config/Config.hx @@ -76,6 +76,7 @@ typedef PlayerConfig = { @:optional var protect:Float; @:optional var life:Int; @:optional var color:Color; + @:optional var control:ControlType; } typedef TeamConfig = { diff --git a/src/common/resources/classic/config.yaml b/src/common/resources/classic/config.yaml index b02b3ca..a8e337d 100644 --- a/src/common/resources/classic/config.yaml +++ b/src/common/resources/classic/config.yaml @@ -23,6 +23,7 @@ player: human: &human life: 3 protect: 5 + control: human tanks: - {type: human0, rate: 1} bot: &bot