diff --git a/src/client/haxe/ru/m/tankz/AppTheme.hx b/src/client/haxe/ru/m/tankz/AppTheme.hx index 2a45374..10d723f 100644 --- a/src/client/haxe/ru/m/tankz/AppTheme.hx +++ b/src/client/haxe/ru/m/tankz/AppTheme.hx @@ -45,7 +45,7 @@ class AppTheme extends Theme { "skin.background.alpha" => 0.1, "skin.border.color" => colors.light, "geometry.padding" => Box.fromArray([50, 8]), - "geometry.margin" => Box.fromArray([0, 0, 10, 30]), + "geometry.margin" => Box.fromArray([0, 0, 30, 30]), ], ["text"])); register(new Style("button.menu", [ @@ -104,6 +104,7 @@ class AppTheme extends Theme { registerButton("settings", "cog-solid.svg"); registerButton("close", "times-circle-solid.svg"); registerButton("next", "arrow-alt-circle-right-solid.svg"); + registerButton("prev", "arrow-alt-circle-left-solid.svg"); registerButton("start", "play-circle-solid.svg"); registerButton("login", "sign-in-solid.svg"); registerButton("logout", "sign-out-solid.svg"); diff --git a/src/client/haxe/ru/m/tankz/view/ClientView.hx b/src/client/haxe/ru/m/tankz/view/ClientView.hx index e6dc2fd..ac19547 100644 --- a/src/client/haxe/ru/m/tankz/view/ClientView.hx +++ b/src/client/haxe/ru/m/tankz/view/ClientView.hx @@ -3,20 +3,14 @@ package ru.m.tankz.view; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import haxework.resources.IResources; -import haxework.view.form.ButtonView; import haxework.view.frame.FrameSwitcher; -import haxework.view.form.LabelView; import haxework.view.group.VGroupView; import ru.m.tankz.game.IGame; import ru.m.tankz.network.NetworkManager; import ru.m.tankz.sound.SoundManager; -import ru.m.tankz.view.popup.LoginPopup; @:template class ClientView extends VGroupView { @:view("switcher") var switcherView:FrameSwitcher; - @:view var username:LabelView; - @:view("login") var loginButton:ButtonView; - @:view("logout") var logoutButton:ButtonView; @:provide var network:NetworkManager; @:provide var resources:IResources; @@ -27,8 +21,6 @@ import ru.m.tankz.view.popup.LoginPopup; public function init():Void { resources.text.put('version', '${Const.VERSION}'); switcher = switcherView; - network.stateSignal.connect(onConnectionState); - onConnectionState(network.state); } public function launch():Void { @@ -36,7 +28,7 @@ import ru.m.tankz.view.popup.LoginPopup; content.stage.addEventListener(KeyboardEvent.KEY_UP, function(event:KeyboardEvent):Void { switch event.keyCode { case Keyboard.ESCAPE: - switcher.change(StartFrame.ID); + switcher.change(MenuFrame.ID); case Keyboard.M: soundManager.mute = !soundManager.mute; case Keyboard.P: @@ -45,41 +37,6 @@ import ru.m.tankz.view.popup.LoginPopup; } } }); - switcher.change(StartFrame.ID); - } - - private function onConnectionState(state:ConnectionState):Void { - L.d("ClientView", 'onConnectionState: ${state}'); - switch state { - case ONLINE(user): - username.text = user.name; - logoutButton.visible = true; - loginButton.visible = false; - case CONNECTED: - username.text = ""; - logoutButton.visible = false; - loginButton.visible = true; - case ERROR(error): - //L.e("ClientView", 'onConnectionState: ERROR', error); - L.w("ClientView", 'onConnectionState: ERROR'); - case _: - username.text = ""; - logoutButton.visible = false; - loginButton.visible = false; - } - } - - private function login():Void { - LoginPopup.instance.show().then(function(user:User):Void { - L.d("Login", 'user: $user'); - }); - } - - private function logout():Void { - network.logout(); - } - - private function close():Void { - switcher.change(StartFrame.ID); + switcher.change(MenuFrame.ID); } } diff --git a/src/client/haxe/ru/m/tankz/view/ClientView.yaml b/src/client/haxe/ru/m/tankz/view/ClientView.yaml index 96f0cd5..5de9f8c 100755 --- a/src/client/haxe/ru/m/tankz/view/ClientView.yaml +++ b/src/client/haxe/ru/m/tankz/view/ClientView.yaml @@ -5,39 +5,12 @@ views: geometry.stretch: true style: dark factory: - _start_: {$class: ru.m.tankz.view.StartFrame} + _menu_: {$class: ru.m.tankz.view.MenuFrame} _level_: {$class: ru.m.tankz.view.LevelFrame} + _start_: {$class: ru.m.tankz.view.StartFrame} _game_: {$class: ru.m.tankz.view.GameFrame} _result_: {$class: ru.m.tankz.view.ResultFrame} _settings_: {$class: ru.m.tankz.view.SettingsFrame} _record_: {$class: ru.m.tankz.view.RecordFrame} _room_list_: {$class: ru.m.tankz.view.network.RoomListFrame} _room_: {$class: ru.m.tankz.view.network.RoomFrame} - - $type: haxework.view.group.HGroupView - style: panel - layout.margin: 10 - views: - - id: settings - $type: haxework.view.form.ButtonView - style: button.settings - +onPress: ~switcher.change('settings') - - $type: haxework.view.SpriteView - geometry.width: 50% - - id: username - $type: haxework.view.form.LabelView - style: text - - id: login - $type: haxework.view.form.ButtonView - style: button.login - +onPress: ~login() - - id: logout - $type: haxework.view.form.ButtonView - style: button.logout - +onPress: ~logout() - visible: false - - $type: haxework.view.SpriteView - geometry.width: 50% - - id: close - $type: haxework.view.form.ButtonView - style: button.close - +onPress: ~close() diff --git a/src/client/haxe/ru/m/tankz/view/GameFrame.hx b/src/client/haxe/ru/m/tankz/view/GameFrame.hx index d9a69eb..6450f65 100644 --- a/src/client/haxe/ru/m/tankz/view/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/GameFrame.hx @@ -1,5 +1,6 @@ package ru.m.tankz.view; +import haxework.view.layout.DefaultLayout; import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameView; import ru.m.control.DeviceType; @@ -36,7 +37,7 @@ import ru.m.tankz.view.GamepadView; private var recorder:GameRecord; public function new() { - super(id); + super(id, new DefaultLayout()); } public function init():Void { @@ -97,6 +98,6 @@ import ru.m.tankz.view.GamepadView; } public function close():Void { - switcher.change(StartFrame.ID); + switcher.change(MenuFrame.ID); } } diff --git a/src/client/haxe/ru/m/tankz/view/GameFrame.yaml b/src/client/haxe/ru/m/tankz/view/GameFrame.yaml index 57d1f75..593f016 100644 --- a/src/client/haxe/ru/m/tankz/view/GameFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/GameFrame.yaml @@ -1,15 +1,10 @@ --- -geometry.stretch: true -layout: - $type: haxework.view.layout.VerticalLayout +style: container +overflow.x: crop +overflow.y: crop views: - - $type: haxework.view.group.VGroupView - style: container - overflow.x: crop - overflow.y: crop - views: - - id: game - $type: ru.m.tankz.view.game.GameView + - id: game + $type: ru.m.tankz.view.game.GameView - id: gamepad $type: ru.m.tankz.view.GamepadView geometry.position: absolute diff --git a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx index 6e37d57..6484591 100644 --- a/src/client/haxe/ru/m/tankz/view/LevelFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/LevelFrame.hx @@ -1,33 +1,29 @@ package ru.m.tankz.view; -import haxework.view.form.ButtonView; import haxework.view.data.DataView; +import haxework.view.form.ButtonView; +import haxework.view.form.LabelView; import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameView; -import haxework.view.form.LabelView; import ru.m.tankz.bundle.IConfigBundle; +import ru.m.tankz.bundle.ILevelBundle; import ru.m.tankz.config.Config; -import ru.m.tankz.control.Controller; -import ru.m.tankz.control.PlayerControl; -import ru.m.tankz.game.GameInit; import ru.m.tankz.game.GameState; import ru.m.tankz.storage.GameStorage; -import ru.m.tankz.Type.PlayerId; -import ru.m.tankz.Type; -import ru.m.tankz.view.popup.LevelPopup; +import ru.m.tankz.Type.PackId; -@:template class LevelFrame extends FrameView { +@:template class LevelFrame extends FrameView { public static inline var ID = "level"; - @:view var header:LabelView; - @:view var levels:DataView; - @:provide static var switcher:FrameSwitcher; @:provide static var storage:GameStorage; @:provide static var configBundle:IConfigBundle; + @:provide static var levelBundle:ILevelBundle; + + @:view var header:LabelView; + @:view var levels:DataView; private var pack:LevelPack; - private var levelPopup:LevelPopup; private var config(get, never):Config; public function new() { @@ -38,19 +34,12 @@ import ru.m.tankz.view.popup.LevelPopup; return configBundle.get(pack.id.type); } - override public function onShow(data:LevelPack):Void { - header.text = data.id.type; - pack = data; + override public function onShow(data:PackId):Void { + header.text = data.type; + pack = levelBundle.get(data); levels.data = pack.data; } - private function start(level:LevelConfig, presetId:PresetId, controls:Array):Void { - switcher.change(GameFrame.ID, LOCAL({ - state: new GameState(pack.id.type, presetId, controls), - level: level, - })); - } - private function levelViewFactory(index:Int, level:LevelConfig):ButtonView { var progress = storage.get(pack.id); var result = new ButtonView(); @@ -62,37 +51,11 @@ import ru.m.tankz.view.popup.LevelPopup; } private function onLevelSelect(index:Int, level:LevelConfig, view:ButtonView):Void { - if (!storage.get(pack.id).isLevelAvailable(level.id)) { - return; + if (storage.get(pack.id).isLevelAvailable(level.id)) { + switcher.change(StartFrame.ID, { + state: new GameState(pack.id.type), + level: level, + }); } - if (levelPopup == null) { - levelPopup = new LevelPopup(); - } - var controls:Array = []; - var preset = config.getPreset(0); - for (team in preset.teams) { - if (team.id != "bot") { // ToDo: - for (player in team.players) { - var playerId = new PlayerId(team.id, player.index); - controls.push({ - playerId: playerId, - color: config.getColor(playerId), - controller: NONE, - }); - } - } - } - controls.sort(function(a, b) return a.playerId.compare(b.playerId)); - if (controls.length > 0) { - controls[0].controller = HUMAN(0); - controls[0].name = ControllerParser.defaultName(controls[0].controller); - } - levelPopup.setData( - level, - config.presets, - controls, - storage.get(pack.id) - ); - levelPopup.show().then(function(result) result != null ? start(level, result.presetId, result.controls) : {}); } } diff --git a/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml b/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml index 5925984..103019b 100644 --- a/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/LevelFrame.yaml @@ -1,21 +1,29 @@ --- views: - - $type: haxework.view.group.VGroupView - style: container - geometry.padding: 20 - views: - - id: header - $type: haxework.view.form.LabelView - style: text.header - - id: levels - $type: haxework.view.data.DataView - geometry.width: 100% - geometry.height: 100% - overflow.y: scroll - layout: - $type: haxework.view.layout.TailLayout - rowSize: 10 - margin: 5 - factory: ~levelViewFactory - +onItemSelect: ~onLevelSelect - geometry.padding: 10 + - $type: haxework.view.group.VGroupView + style: container + views: + - id: header + $type: haxework.view.form.LabelView + style: text.header + - id: levels + $type: haxework.view.data.DataView + geometry.width: 100% + geometry.height: 100% + overflow.y: scroll + layout: + $type: haxework.view.layout.TailLayout + rowSize: 10 + margin: 5 + factory: ~levelViewFactory + +onItemSelect: ~onLevelSelect + geometry.padding: 10 + - $type: haxework.view.group.HGroupView + style: panel + layout.margin: 10 + views: + - $type: haxework.view.SpriteView + geometry.width: 100% + - $type: haxework.view.form.ButtonView + style: button.prev + +onPress: ~switcher.change("menu") diff --git a/src/client/haxe/ru/m/tankz/view/MenuFrame.hx b/src/client/haxe/ru/m/tankz/view/MenuFrame.hx new file mode 100644 index 0000000..9d134d7 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/MenuFrame.hx @@ -0,0 +1,96 @@ +package ru.m.tankz.view; + +import haxework.view.form.ButtonView; +import haxework.view.form.LabelView; +import haxework.view.frame.FrameSwitcher; +import haxework.view.frame.FrameView; +import ru.m.tankz.game.GameInit; +import ru.m.tankz.game.GameState; +import ru.m.tankz.network.NetworkManager; +import ru.m.tankz.Type; +import ru.m.tankz.view.network.RoomFrame; +import ru.m.tankz.view.network.RoomListFrame; +import ru.m.tankz.view.popup.LoginPopup; + +@:template class MenuFrame extends FrameView { + + public static var ID(default, never):String = "menu"; + + @:provide var gameInit:GameInit; + @:provide var switcher:FrameSwitcher; + @:provide var network:NetworkManager; + + @:view var username:LabelView; + @:view("login") var loginButton:ButtonView; + @:view("logout") var logoutButton:ButtonView; + + public function new() { + super(ID); + } + + override public function onShow(data:Dynamic):Void { + super.onShow(data); + network.stateSignal.connect(onConnectionState); + onConnectionState(network.state); + } + + override public function onHide():Void { + super.onHide(); + network.stateSignal.disconnect(onConnectionState); + } + + private function startGame(type:GameType):Void { + gameInit = LOCAL({state: new GameState(type), level: null}); + switcher.change(LevelFrame.ID, new PackId(type)); + } + + private function startNetwork():Void { + switch network.state { + case ONLINE(user): + if (network.room != null) { + switcher.change(RoomFrame.ID, network.room); + network.joinGame(network.room.game.id, true); + } else { + switcher.change(RoomListFrame.ID); + } + case CONNECTED: + LoginPopup.instance.show().then(function(user):Void { + if (user != null) { + switcher.change(RoomListFrame.ID); + } + }); + case _: + } + } + + private function onConnectionState(state:ConnectionState):Void { + L.d("ClientView", 'onConnectionState: ${state}'); + switch state { + case ONLINE(user): + username.text = user.name; + logoutButton.visible = true; + loginButton.visible = false; + case CONNECTED: + username.text = ""; + logoutButton.visible = false; + loginButton.visible = true; + case ERROR(error): + //L.e("ClientView", 'onConnectionState: ERROR', error); + L.w("ClientView", 'onConnectionState: ERROR'); + case _: + username.text = ""; + logoutButton.visible = false; + loginButton.visible = false; + } + } + + private function login():Void { + LoginPopup.instance.show().then(function(user:User):Void { + L.d("Login", 'user: $user'); + }); + } + + private function logout():Void { + network.logout(); + } +} diff --git a/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml b/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml new file mode 100644 index 0000000..d3068a5 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/MenuFrame.yaml @@ -0,0 +1,65 @@ +--- +views: + - $type: haxework.view.group.VGroupView + style: container + layout.margin: 10 + overflow.y: scroll + views: + - $type: haxework.view.form.LabelView + text: Tank'z + style: font + font.size: 100 + geometry.margin.bottom: 30 + - $type: haxework.view.form.ButtonView + style: button.menu + +onPress: ~startGame('classic') + text: Classic + - $type: haxework.view.form.ButtonView + style: button.menu + +onPress: ~startGame('dota') + text: DotA + - $type: haxework.view.form.ButtonView + style: button.menu + +onPress: ~startGame('death') + text: DeathMatch + - $type: haxework.view.form.ButtonView + style: button.menu + +onPress: ~switcher.change('record') + text: Records + - id: network + $type: haxework.view.form.ButtonView + style: button.menu + +onPress: ~startNetwork() + text: Network + - $type: haxework.view.form.LabelView + geometry.hAlign: right + geometry.vAlign: top + geometry.padding: [20, 5] + geometry.position: absolute + geometry.margin: [0, 20, 20, 0] + style: text.box + text: $r:text:version + - $type: haxework.view.group.HGroupView + style: panel + layout.margin: 10 + views: + - id: settings + $type: haxework.view.form.ButtonView + style: button.settings + +onPress: ~switcher.change('settings') + - $type: haxework.view.SpriteView + geometry.width: 50% + - id: username + $type: haxework.view.form.LabelView + style: text + - id: login + $type: haxework.view.form.ButtonView + style: button.login + +onPress: ~login() + - id: logout + $type: haxework.view.form.ButtonView + style: button.logout + +onPress: ~logout() + visible: false + - $type: haxework.view.SpriteView + geometry.width: 50% diff --git a/src/client/haxe/ru/m/tankz/view/RecordFrame.hx b/src/client/haxe/ru/m/tankz/view/RecordFrame.hx index 679cb3c..146ad84 100644 --- a/src/client/haxe/ru/m/tankz/view/RecordFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/RecordFrame.hx @@ -7,12 +7,13 @@ import ru.m.tankz.game.record.GameRecord; import ru.m.tankz.storage.RecordStorage; @:template class RecordFrame extends FrameView { + public static var ID(default, never):String = "record"; - @:view var data:VListView; + @:provide static var switcher:FrameSwitcher; + @:provide static var recordStorage:RecordStorage; - @:provide var recordStorage:RecordStorage; - @:provide var switcher:FrameSwitcher; + @:view var data:VListView; public function new() { super(ID); diff --git a/src/client/haxe/ru/m/tankz/view/RecordFrame.yaml b/src/client/haxe/ru/m/tankz/view/RecordFrame.yaml index e9a1640..637cd55 100644 --- a/src/client/haxe/ru/m/tankz/view/RecordFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/RecordFrame.yaml @@ -2,7 +2,6 @@ views: - $type: haxework.view.group.VGroupView style: container - geometry.padding: 20 views: - $type: haxework.view.form.LabelView style: text.header @@ -13,4 +12,13 @@ views: geometry.margin.top: 20 geometry.stretch: true scroll: - $type: haxework.view.list.VScrollBarView + $type: haxework.view.list.VScrollBarView + - $type: haxework.view.group.HGroupView + style: panel + layout.margin: 10 + views: + - $type: haxework.view.SpriteView + geometry.width: 100% + - $type: haxework.view.form.ButtonView + style: button.prev + +onPress: ~switcher.change("menu") diff --git a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx index d0f08f9..7004729 100644 --- a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx @@ -56,7 +56,7 @@ import ru.m.tankz.view.common.LifeView; } private function levels():Void { - frames.change(LevelFrame.ID, levelBundle.get(result.level.packId)); + frames.change(LevelFrame.ID, result.level.packId); } private function restart():Void { @@ -75,6 +75,6 @@ import ru.m.tankz.view.common.LifeView; } private function close():Void { - frames.change(StartFrame.ID); + frames.change(MenuFrame.ID); } } diff --git a/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml b/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml index 67ec4bb..adc7405 100644 --- a/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml @@ -10,24 +10,30 @@ views: - id: result $type: haxework.view.data.DataView factory: ~playerViewFactory + geometry.height: 100% + overflow.y: scroll geometry.margin.top: 20 layout: $type: haxework.view.layout.VerticalLayout hAlign: right margin: 10 - - $type: haxework.view.group.HGroupView - layout.margin: 10 - geometry.padding: 10 - views: - - id: levels - $type: haxework.view.form.ButtonView - text: Levels - +onPress: ~levels() - - id: restart - $type: haxework.view.form.ButtonView - text: Restart - +onPress: ~restart() - - id: next - $type: haxework.view.form.ButtonView - text: Next - +onPress: ~next() + - $type: haxework.view.group.HGroupView + style: panel + layout.margin: 10 + views: + - $type: haxework.view.SpriteView + geometry.width: 50% + - id: levels + $type: haxework.view.form.ButtonView + text: Levels + +onPress: ~levels() + - id: restart + $type: haxework.view.form.ButtonView + text: Restart + +onPress: ~restart() + - id: next + $type: haxework.view.form.ButtonView + text: Next + +onPress: ~next() + - $type: haxework.view.SpriteView + geometry.width: 50% diff --git a/src/client/haxe/ru/m/tankz/view/SettingsFrame.hx b/src/client/haxe/ru/m/tankz/view/SettingsFrame.hx index d93670a..b62749e 100644 --- a/src/client/haxe/ru/m/tankz/view/SettingsFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/SettingsFrame.hx @@ -1,10 +1,13 @@ package ru.m.tankz.view; +import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameView; @:template class SettingsFrame extends FrameView { public static var ID(default, never):String = "settings"; + @:provide static var switcher:FrameSwitcher; + public function new() { super(ID); } diff --git a/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml b/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml index cedc1b1..57eb304 100644 --- a/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/SettingsFrame.yaml @@ -1,24 +1,32 @@ --- views: - - $type: haxework.view.group.VGroupView - style: container - geometry.padding: 20 + - $type: haxework.view.group.VGroupView + style: container + views: + - $type: haxework.view.form.LabelView + style: text.header + text: Settings + - $type: haxework.view.group.GroupView + geometry.width: 100% + geometry.height: 100% + overflow.y: scroll + layout: + $type: haxework.view.layout.TailLayout + vAlign: top + margin: 20 views: - - $type: haxework.view.form.LabelView - style: text.header - text: Settings - - $type: haxework.view.group.GroupView - geometry.width: 100% - geometry.height: 100% - overflow.y: scroll - layout: - $type: haxework.view.layout.TailLayout - vAlign: top - margin: 20 - views: - - id: settings0 - $type: ru.m.tankz.view.settings.SettingsEditor - controlIndex: 0 - - id: settings1 - $type: ru.m.tankz.view.settings.SettingsEditor - controlIndex: 1 + - id: settings0 + $type: ru.m.tankz.view.settings.SettingsEditor + controlIndex: 0 + - id: settings1 + $type: ru.m.tankz.view.settings.SettingsEditor + controlIndex: 1 + - $type: haxework.view.group.HGroupView + style: panel + layout.margin: 10 + views: + - $type: haxework.view.SpriteView + geometry.width: 100% + - $type: haxework.view.form.ButtonView + style: button.prev + +onPress: ~switcher.change("menu") diff --git a/src/client/haxe/ru/m/tankz/view/StartFrame.hx b/src/client/haxe/ru/m/tankz/view/StartFrame.hx index 1e2f9da..9e420b2 100644 --- a/src/client/haxe/ru/m/tankz/view/StartFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/StartFrame.hx @@ -1,50 +1,113 @@ package ru.m.tankz.view; +import haxework.view.data.DataView; +import haxework.view.form.ButtonView; +import haxework.view.form.LabelView; import haxework.view.frame.FrameSwitcher; import haxework.view.frame.FrameView; -import ru.m.tankz.bundle.ILevelBundle; +import ru.m.tankz.config.Config; +import ru.m.tankz.control.Controller; +import ru.m.tankz.control.PlayerControl; +import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameInit; -import ru.m.tankz.game.GameState; -import ru.m.tankz.network.NetworkManager; +import ru.m.tankz.game.PackProgress; +import ru.m.tankz.storage.GameStorage; import ru.m.tankz.Type; -import ru.m.tankz.view.network.RoomFrame; -import ru.m.tankz.view.network.RoomListFrame; -import ru.m.tankz.view.popup.LoginPopup; +import ru.m.tankz.view.common.SlotView; -@:template class StartFrame extends FrameView { +using haxe.EnumTools.EnumValueTools; + +@:template class StartFrame extends FrameView { public static var ID(default, never):String = "start"; - @:provide var gameInit:GameInit; - @:provide var switcher:FrameSwitcher; - @:provide var network:NetworkManager; - @:provide var levelBundle:ILevelBundle; + @:provide static var switcher:FrameSwitcher; + @:provide static var storage:GameStorage; + + private var progress:PackProgress; + + @:view var header:LabelView; + @:view("presets") var presetsView:DataView; + @:view("slots") var slotsView:DataView; + + private var humanIndex:Int = 0; + private var humanTotal:Int = 2; + + + private var start:Start; public function new() { super(ID); } - private function startGame(type:GameType):Void { - gameInit = LOCAL({state: new GameState(type), level: null}); - switcher.change(LevelFrame.ID, levelBundle.get(new PackId(type))); + override public function onShow(data:Start):Void { + super.onShow(data); + start = data; + this.progress = storage.get(start.level.packId); + header.text = '${start.state.type} - ${start.level.id}. ${start.level.name != null ? start.level.name : "#"}'; + presetsView.data = start.state.config.presets; + slotsView.data = defaultControls(start.state.config); } - private function startNetwork():Void { - switch network.state { - case ONLINE(user): - if (network.room != null) { - switcher.change(RoomFrame.ID, network.room); - network.joinGame(network.room.game.id, true); - } else { - switcher.change(RoomListFrame.ID); + private static function defaultControls(config:Config):Array { + var controls:Array = []; + var preset = config.getPreset(0); + for (team in preset.teams) { + if (team.id != "bot") { // ToDo: + for (player in team.players) { + var playerId = new PlayerId(team.id, player.index); + controls.push({ + playerId: playerId, + color: config.getColor(playerId), + controller: NONE, + }); } - case CONNECTED: - LoginPopup.instance.show().then(function(user):Void { - if (user != null) { - switcher.change(RoomListFrame.ID); - } - }); + } + } + controls.sort(function(a, b) return a.playerId.compare(b.playerId)); + if (controls.length > 0) { + controls[0].controller = HUMAN(0); + controls[0].name = ControllerParser.defaultName(controls[0].controller); + } + return controls; + } + + private function slotViewFactory(index:Int, value:PlayerControl):SlotView { + var result = new SlotView(); + result.select.onSelect.connect(function(controller:Controller) setController(value, controller)); + result.control = value; + return result; + } + + private function setController(value:PlayerControl, controller:Controller):Void { + switch controller { + case NONE: case _: + for (view in slotsView.dataViews) { + if (view.control.controller.equals(controller)) { + view.control.controller = NONE; + view.select.selected = NONE; + view.control.name = null; + } + } + } + value.controller = controller; + value.name = ControllerParser.defaultName(controller); + } + + private function presetViewFactory(index:Int, value:GamePreset):ButtonView { + var result = new ButtonView(); + result.style = 'button${!progress.isPresetCompleted(start.level.id, value.id) ? ".active" : ""}'; + result.text = value.name; + result.disabled = !progress.isPresetAvailable(start.level.id, value.id); + return result; + } + + private function onPresetSelect(value:GamePreset):Void { + if (progress.isPresetAvailable(start.level.id, value.id)) { + start.state.presetId = value.id; + start.state.controls = slotsView.data; + switcher.change(GameFrame.ID, LOCAL(start)); } } } diff --git a/src/client/haxe/ru/m/tankz/view/StartFrame.yaml b/src/client/haxe/ru/m/tankz/view/StartFrame.yaml index 4146c9d..7883f6a 100644 --- a/src/client/haxe/ru/m/tankz/view/StartFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/StartFrame.yaml @@ -1,40 +1,39 @@ --- views: - - $type: haxework.view.group.VGroupView - style: container - layout.margin: 10 - views: - - $type: haxework.view.form.LabelView - text: Tank'z - style: font - font.size: 100 - geometry.margin.bottom: 30 - - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~startGame('classic') - text: Classic - - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~startGame('dota') - text: DotA - - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~startGame('death') - text: DeathMatch - - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~switcher.change('record') - text: Records - - id: network - $type: haxework.view.form.ButtonView - style: button.menu - +onPress: ~startNetwork() - text: Network - - $type: haxework.view.form.LabelView - geometry.hAlign: right - geometry.vAlign: top - geometry.padding: [20, 5] - geometry.position: absolute - geometry.margin: [0, 20, 20, 0] - style: text.box - text: $r:text:version + - $type: haxework.view.group.VGroupView + style: container + views: + - id: header + $type: haxework.view.form.LabelView + style: text.header + - id: slots + $type: haxework.view.data.DataView + geometry.padding: 10 + geometry.width: 100% + geometry.height: 100% + layout.hAlign: center + overflow.y: scroll + factory: ~slotViewFactory + layout: + $type: haxework.view.layout.VerticalLayout + # $type: haxework.view.layout.TailLayout + margin: 5 + - $type: haxework.view.group.HGroupView + style: panel + layout.margin: 10 + views: + - $type: haxework.view.SpriteView + geometry.width: 50% + - id: presets + $type: haxework.view.data.DataView + factory: ~presetViewFactory + +onDataSelect: ~onPresetSelect + layout: + $type: haxework.view.layout.HorizontalLayout + hAlign: center + margin: 5 + - $type: haxework.view.SpriteView + geometry.width: 50% + - $type: haxework.view.form.ButtonView + style: button.prev + +onPress: ~switcher.change("level", start.level.packId) diff --git a/src/client/haxe/ru/m/tankz/view/common/SlotView.hx b/src/client/haxe/ru/m/tankz/view/common/SlotView.hx index 15a2bef..daf4588 100644 --- a/src/client/haxe/ru/m/tankz/view/common/SlotView.hx +++ b/src/client/haxe/ru/m/tankz/view/common/SlotView.hx @@ -15,7 +15,7 @@ import ru.m.tankz.control.PlayerControl; private function set_control(value:PlayerControl):PlayerControl { control = value; - slotLabel.text = '${control.playerId.team}(${control.playerId.index})'; + slotLabel.text = '${control.playerId.team} #${control.playerId.index}'; slotLabel.font.color = value.color; select.selected = control.controller; return control; diff --git a/src/client/haxe/ru/m/tankz/view/game/GameView.hx b/src/client/haxe/ru/m/tankz/view/game/GameView.hx index 2d2c562..3a457e8 100644 --- a/src/client/haxe/ru/m/tankz/view/game/GameView.hx +++ b/src/client/haxe/ru/m/tankz/view/game/GameView.hx @@ -50,4 +50,18 @@ import ru.m.tankz.Type; case _: throw 'Unsupported position: ${position}'; } } + + override public function update():Void { + super.update(); + if (parent != null) { + var s = Math.min(parent.width / width, parent.height / height); + if (s < 1) { + content.scaleX = content.scaleY = s; + content.x = (parent.width - width * s) / 2; + content.y = (parent.height - height * s) / 2; + } else { + content.scaleX = content.scaleY = 1; + } + } + } } diff --git a/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.hx b/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.hx deleted file mode 100644 index d8a555f..0000000 --- a/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.hx +++ /dev/null @@ -1,76 +0,0 @@ -package ru.m.tankz.view.popup; - -using haxe.EnumTools.EnumValueTools; -import haxework.view.form.ButtonView; -import haxework.view.data.DataView; -import haxework.view.form.LabelView; -import haxework.view.popup.PopupView; -import ru.m.tankz.config.Config; -import ru.m.tankz.control.Controller; -import ru.m.tankz.control.PlayerControl; -import ru.m.tankz.game.PackProgress; -import ru.m.tankz.Type; -import ru.m.tankz.view.common.SlotView; - -private typedef Result = { - var presetId:PresetId; - var controls:Array; -} - -@:template class LevelPopup extends PopupView { - - private var level:LevelConfig; - private var progress:PackProgress; - - @:view var name:LabelView; - @:view("presets") var presetsView:DataView; - @:view("slots") var slotsView:DataView; - - private var humanIndex:Int = 0; - private var humanTotal:Int = 2; - - public function setData(level:LevelConfig, presets:Array, controls:Array, progress:PackProgress):Void { - this.level = level; - this.progress = progress; - name.text = '${level.id}. ${level.name != null ? level.name : "#"}'; - presetsView.data = presets; - slotsView.data = controls; - } - - private function slotViewFactory(index:Int, value:PlayerControl):SlotView { - var result = new SlotView(); - result.select.onSelect.connect(function(controller:Controller) setController(value, controller)); - result.control = value; - return result; - } - - private function setController(value:PlayerControl, controller:Controller):Void { - switch controller { - case NONE: - case _: - for (view in slotsView.dataViews) { - if (view.control.controller.equals(controller)) { - view.control.controller = NONE; - view.select.selected = NONE; - view.control.name = null; - } - } - } - value.controller = controller; - value.name = ControllerParser.defaultName(controller); - } - - private function presetViewFactory(index:Int, value:GamePreset):ButtonView { - var result = new ButtonView(); - result.style = 'button${!progress.isPresetCompleted(level.id, value.id) ? ".active" : ""}'; - result.text = value.name; - result.disabled = !progress.isPresetAvailable(level.id, value.id); - return result; - } - - private function onPresetSelect(value:GamePreset):Void { - if (progress.isPresetAvailable(level.id, value.id)) { - close({presetId: value.id, controls: slotsView.data}); - } - } -} diff --git a/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.yaml b/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.yaml deleted file mode 100644 index 7e95111..0000000 --- a/src/client/haxe/ru/m/tankz/view/popup/LevelPopup.yaml +++ /dev/null @@ -1,48 +0,0 @@ ---- -layout.hAlign: center -layout.vAlign: middle -view: - $type: haxework.view.group.VGroupView - layout.hAlign: center - geometry.width: 100% - geometry.height: 100% - # geometry.width: 400 - # geometry.height: 400 - geometry.margin: 10 - style: window - views: - - $type: haxework.view.group.HGroupView - geometry.width: 100% - geometry.padding: 10 - layout.vAlign: middle - views: - - id: name - $type: haxework.view.form.LabelView - geometry.width: 100% - geometry.margin.left: 10 - layout.hAlign: left - style: text - - $type: haxework.view.form.ButtonView - style: window.close - +onPress: ~reject('close') - - id: slots - $type: haxework.view.data.DataView - geometry.padding: 10 - geometry.width: 100% - geometry.height: 100% - layout.hAlign: center - overflow.y: scroll - factory: ~slotViewFactory - layout: - $type: haxework.view.layout.VerticalLayout - # $type: haxework.view.layout.TailLayout - margin: 5 - - id: presets - $type: haxework.view.data.DataView - factory: ~presetViewFactory - +onDataSelect: ~onPresetSelect - layout: - $type: haxework.view.layout.HorizontalLayout - hAlign: center - margin: 5 - style: panel diff --git a/src/client/resources/image/icon/arrow-alt-circle-left-solid.svg b/src/client/resources/image/icon/arrow-alt-circle-left-solid.svg new file mode 100644 index 0000000..32c31ee --- /dev/null +++ b/src/client/resources/image/icon/arrow-alt-circle-left-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file