diff --git a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx index 2e95b1f..8d43332 100644 --- a/src/client/haxe/ru/m/tankz/view/ResultFrame.hx +++ b/src/client/haxe/ru/m/tankz/view/ResultFrame.hx @@ -10,14 +10,14 @@ 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.game.PlayerView; +import ru.m.tankz.view.result.ResultPlayerView; using ru.m.tankz.view.ViewUtil; @:template class ResultFrame extends FrameView { public static var ID(default, never):String = "result"; - @:view("result") var resultView:DataView; + @:view("result") var resultView:DataView; @:view("level") var levelLabel:LabelView; @:view("next") var nextButton:ButtonView; @@ -31,20 +31,14 @@ using ru.m.tankz.view.ViewUtil; super(ID); } - private function playerViewFactory(index:Int, player:PlayerState):PlayerView { - var view = new PlayerView(); - view.tank = result.state.config.getPlayerTank(player.id).skin; - view.color = result.state.getPlayerColor(player.id); - view.life = player.frags; - view.score = player.score; - return view; - } - override public function onShow(data:Result):Void { result = data; - var players = Lambda.array(result.state.players); + var players = result.state.humans; players.sort(function(a, b) return a.id.compare(b.id)); resultView.data = players; + for (view in resultView.dataViews) { + view.tank = result.state.config.getPlayerTank(view.data.id).skin; + } levelLabel.text = data.level.toLevelLabel(); nextButton.disabled = !gameStorage.get(result.level.packId).isPresetAvailable(result.level.id + 1, result.state.presetId); nextButton.text = 'Next #${result.level.id + 1}'; diff --git a/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml b/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml index cbc8aee..43650b5 100644 --- a/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml +++ b/src/client/haxe/ru/m/tankz/view/ResultFrame.yaml @@ -9,11 +9,15 @@ views: font.align: center - id: result $type: haxework.view.data.DataView - factory: ~playerViewFactory + layout: + $type: haxework.view.layout.TailLayout + factory: ~ru.m.tankz.view.result.ResultPlayerView.factory + geometry.width: 100% geometry.height: 100% overflow.y: scroll geometry.margin.top: 20 layout.margin: 5 + layout.hAlign: center - $type: haxework.view.group.HGroupView style: panel layout.margin: 10 diff --git a/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.hx b/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.hx new file mode 100644 index 0000000..c0b15cf --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.hx @@ -0,0 +1,37 @@ +package ru.m.tankz.view.result; + +import haxework.view.form.LabelView; +import haxework.view.group.VGroupView; +import haxework.view.ImageView; +import openfl.Assets; +import ru.m.tankz.game.GameState; + +@:template class ResultPlayerView extends VGroupView { + + @:view("tank") var tankView:ImageView; + @:view("title") var titleView:LabelView; + @:view("score") var scoreView:LabelView; + + public var data(default, set):PlayerState; + public var tank(default, set):String; + + private function set_data(value:PlayerState):PlayerState { + data = value; + titleView.text = data.name; + scoreView.text = '${data.score}$'; + tankView.color = value.color; + return data; + } + + public function set_tank(value:String):String { + tank = value; + tankView.image = Assets.getBitmapData('resources/image/tank/${tank}-0.png'); + return tank; + } + + public static function factory(index:Int, data:PlayerState):ResultPlayerView { + var result = new ResultPlayerView(); + result.data = data; + return result; + } +} diff --git a/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.yaml b/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.yaml new file mode 100644 index 0000000..57c6f2c --- /dev/null +++ b/src/client/haxe/ru/m/tankz/view/result/ResultPlayerView.yaml @@ -0,0 +1,20 @@ +--- +style: light +geometry.margin: 10 +geometry.padding: 10 +geometry.width: 50% +geometry.height: 100% +layout.hAlign: center +views: + - $type: haxework.view.group.HGroupView + views: + - id: tank + $type: haxework.view.ImageView + geometry.width: 42 + geometry.height: 42 + - id: title + $type: haxework.view.form.LabelView + - id: score + $type: haxework.view.form.LabelView + style: text.box + geometry.width: 100 diff --git a/src/common/haxe/ru/m/tankz/game/GameState.hx b/src/common/haxe/ru/m/tankz/game/GameState.hx index 48e5ea0..3555b29 100644 --- a/src/common/haxe/ru/m/tankz/game/GameState.hx +++ b/src/common/haxe/ru/m/tankz/game/GameState.hx @@ -3,6 +3,7 @@ package ru.m.tankz.game; import haxework.color.Color; import ru.m.tankz.bundle.IConfigBundle; import ru.m.tankz.config.Config; +import ru.m.tankz.control.Controller; import ru.m.tankz.control.PlayerControl; import ru.m.tankz.Type; @@ -74,6 +75,7 @@ class GameState { public var presetId:PresetId; public var controls:Array; public var players:Map; + public var humans(get, null):Array; public var teams:Map; public var preset(get, null):GamePreset; public var config(get, null):Config; @@ -103,6 +105,17 @@ class GameState { } } + public function get_humans():Array { + return controls.filter(function(control:PlayerControl):Bool { + return switch control.controller { + case HUMAN(_): true; + case _: false; + } + }).map(function(control:PlayerControl):PlayerState { + return players.get(control.playerId); + }); + } + private function get_preset():GamePreset { var config = configBundle.get(type); var preset = config.getPreset(presetId);