[common] PlayerControl update
This commit is contained in:
@@ -7,9 +7,11 @@ import ru.m.tankz.util.LevelUtil;
|
||||
|
||||
class LevelBundle implements ILevelBundle {
|
||||
|
||||
private var _cache:Map<String, LevelPack> = new Map();
|
||||
|
||||
public function new() {}
|
||||
|
||||
public function get(id:PackId):LevelPack {
|
||||
private function resolve(id:PackId):LevelPack {
|
||||
var bytes = Assets.getBytes('levels/${id}.zip');
|
||||
return {
|
||||
id: id,
|
||||
@@ -19,4 +21,11 @@ class LevelBundle implements ILevelBundle {
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
public function get(id:PackId):LevelPack {
|
||||
if (!_cache.exists(id)) {
|
||||
_cache.set(id, resolve(id));
|
||||
}
|
||||
return _cache.get(id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package ru.m.tankz.network;
|
||||
|
||||
import haxe.Unserializer;
|
||||
import ru.m.tankz.control.Controller;
|
||||
import ru.m.tankz.game.Game;
|
||||
import ru.m.tankz.game.GameEvent;
|
||||
import ru.m.tankz.network.NetworkControlFactory;
|
||||
@@ -40,7 +41,7 @@ class NetworkGame extends Game {
|
||||
override private function onStart(start:Start):Void {
|
||||
var slot:RoomSlotProto = Lambda.find(network.room.slots, function(slot:RoomSlotProto) return slot.hasUser() && slot.user.uuid == network.user.uuid);
|
||||
if (slot != null) {
|
||||
start.state.controls.push({playerId: [slot.slot.team, slot.slot.index], control: "human-0"});
|
||||
start.state.controls.push({playerId: [slot.slot.team, slot.slot.index], controller: HUMAN(0)});
|
||||
}
|
||||
super.onStart(start);
|
||||
}
|
||||
|
||||
@@ -7,9 +7,13 @@ import haxework.view.frame.FrameView;
|
||||
import haxework.view.LabelView;
|
||||
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.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;
|
||||
|
||||
@:template class LevelFrame extends FrameView<LevelPack> {
|
||||
@@ -40,9 +44,9 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
levels.data = pack.data;
|
||||
}
|
||||
|
||||
private function start(level:LevelConfig, preset:GamePreset, control:ControlPreset):Void {
|
||||
private function start(level:LevelConfig, presetId:PresetId, controls:Array<PlayerControl>):Void {
|
||||
switcher.change(GameFrame.ID, LOCAL({
|
||||
state: new GameState(pack.id.type, preset.id, control.values),
|
||||
state: new GameState(pack.id.type, presetId, controls),
|
||||
level: level,
|
||||
}));
|
||||
}
|
||||
@@ -64,12 +68,31 @@ import ru.m.tankz.view.popup.LevelPopup;
|
||||
if (levelPopup == null) {
|
||||
levelPopup = new LevelPopup();
|
||||
}
|
||||
var controls:Array<PlayerControl> = [];
|
||||
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,
|
||||
config.controls,
|
||||
controls,
|
||||
storage.get(pack.id)
|
||||
);
|
||||
levelPopup.show().then(function(result) result != null ? start(level, result.preset, result.control) : {});
|
||||
levelPopup.show().then(function(result) result != null ? start(level, result.presetId, result.controls) : {});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,9 @@ import ru.m.tankz.view.common.LifeView;
|
||||
|
||||
override public function onShow(data:Result):Void {
|
||||
result = data;
|
||||
resultView.data = Lambda.array(result.state.players);
|
||||
var players = Lambda.array(result.state.players);
|
||||
players.sort(function(a, b) return a.id.compare(b.id));
|
||||
resultView.data = players;
|
||||
var label = '${result.state.type} Level ${result.level.id}';
|
||||
if (result.level.name != null) {
|
||||
label += '\n${result.level.name}';
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
geometry.margin: 5
|
||||
layout.margin: 10
|
||||
layout.vAlign: middle
|
||||
views:
|
||||
- id: label
|
||||
$type: haxework.view.LabelView
|
||||
skinId: text
|
||||
- id: teams
|
||||
$type: haxework.view.DataView
|
||||
factory: $this:teamViewFactory
|
||||
layout:
|
||||
$type: haxework.view.layout.TailLayout
|
||||
rowSize: 5
|
||||
margin: 3
|
||||
+onDataSelect: $this:onTeamSelect
|
||||
29
src/client/haxe/ru/m/tankz/view/common/SlotView.hx
Normal file
29
src/client/haxe/ru/m/tankz/view/common/SlotView.hx
Normal file
@@ -0,0 +1,29 @@
|
||||
package ru.m.tankz.view.common;
|
||||
|
||||
import haxework.view.ButtonView;
|
||||
import haxework.view.HGroupView;
|
||||
import haxework.view.LabelView;
|
||||
import ru.m.tankz.control.Controller;
|
||||
import ru.m.tankz.control.PlayerControl;
|
||||
|
||||
@:template class SlotView extends HGroupView {
|
||||
|
||||
@:view("slot") var slotLabel:LabelView;
|
||||
@:view("player") var playerButton:ButtonView;
|
||||
|
||||
public var control(default, set):PlayerControl;
|
||||
|
||||
private function set_control(value:PlayerControl):PlayerControl {
|
||||
control = value;
|
||||
slotLabel.text = '${control.playerId.team}(${control.playerId.index})';
|
||||
playerButton.skinId = switch control.controller {
|
||||
case HUMAN(_): "button.simple.active";
|
||||
case _: "button.simple";
|
||||
}
|
||||
var name = ControllerParser.defaultName(control.controller);
|
||||
playerButton.text = name != null ? name : "None";
|
||||
slotLabel.skin = Style.textBox(value.color != null ? value.color : Style.textColor);
|
||||
return control;
|
||||
}
|
||||
|
||||
}
|
||||
16
src/client/haxe/ru/m/tankz/view/common/SlotView.yaml
Normal file
16
src/client/haxe/ru/m/tankz/view/common/SlotView.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
geometry.size.height: 48
|
||||
geometry.padding: 2
|
||||
layout.margin: 10
|
||||
views:
|
||||
- id: slot
|
||||
$type: haxework.view.LabelView
|
||||
skinId: text.box
|
||||
geometry.size.height: 100%
|
||||
geometry.size.width: 150
|
||||
- id: player
|
||||
$type: haxework.view.ButtonView
|
||||
skinId: button.simple
|
||||
geometry.size.height: 100%
|
||||
geometry.size.width: 120
|
||||
text: "-"
|
||||
@@ -1,16 +1,20 @@
|
||||
package ru.m.tankz.view.popup;
|
||||
|
||||
using haxe.EnumTools.EnumValueTools;
|
||||
import haxework.view.ButtonView;
|
||||
import haxework.view.DataView;
|
||||
import haxework.view.LabelView;
|
||||
import haxework.view.popup.PopupView;
|
||||
import haxework.view.ToggleButtonView;
|
||||
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 control:ControlPreset;
|
||||
var preset:GamePreset;
|
||||
var presetId:PresetId;
|
||||
var controls:Array<PlayerControl>;
|
||||
}
|
||||
|
||||
@:template class LevelPopup extends PopupView<Result> {
|
||||
@@ -20,16 +24,46 @@ private typedef Result = {
|
||||
|
||||
@:view var name:LabelView;
|
||||
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
|
||||
@:view("controls") var controlsView:DataView<ControlPreset, ToggleButtonView>;
|
||||
private var control:ControlPreset;
|
||||
@:view("slots") var slotsView:DataView<PlayerControl, SlotView>;
|
||||
|
||||
public function setData(level:LevelConfig, presets:Array<GamePreset>, controls:Array<ControlPreset>, progress:PackProgress):Void {
|
||||
private var humanIndex:Int = 0;
|
||||
private var humanTotal:Int = 2;
|
||||
|
||||
public function setData(level:LevelConfig, presets:Array<GamePreset>, controls:Array<PlayerControl>, progress:PackProgress):Void {
|
||||
this.level = level;
|
||||
this.progress = progress;
|
||||
name.text = '${level.id}. ${level.name != null ? level.name : "#"}';
|
||||
presetsView.data = presets;
|
||||
control = controls[0];
|
||||
controlsView.data = controls;
|
||||
slotsView.data = controls;
|
||||
}
|
||||
|
||||
private function slotViewFactory(index:Int, value:PlayerControl):SlotView {
|
||||
var result = new SlotView();
|
||||
result.control = value;
|
||||
return result;
|
||||
}
|
||||
|
||||
private function onControlSelect(index:Int, value:PlayerControl, view:SlotView):Void {
|
||||
if (!value.controller.match(NONE)) {
|
||||
value.controller = NONE;
|
||||
value.name = null;
|
||||
} else {
|
||||
humanIndex++;
|
||||
if (humanIndex == humanTotal) {
|
||||
humanIndex = 0;
|
||||
}
|
||||
var controller = HUMAN(humanIndex);
|
||||
for (v in slotsView.dataViews) {
|
||||
if (v.control.controller.equals(controller)) {
|
||||
v.control.controller = NONE;
|
||||
v.control.name = null;
|
||||
v.control = v.control;
|
||||
}
|
||||
}
|
||||
value.controller = controller;
|
||||
value.name = ControllerParser.defaultName(controller);
|
||||
}
|
||||
view.control = value;
|
||||
}
|
||||
|
||||
private function presetViewFactory(index:Int, value:GamePreset):ButtonView {
|
||||
@@ -42,22 +76,7 @@ private typedef Result = {
|
||||
|
||||
private function onPresetSelect(value:GamePreset):Void {
|
||||
if (progress.isPresetAvailable(level.id, value.id)) {
|
||||
close({control: control, preset: value});
|
||||
}
|
||||
}
|
||||
|
||||
private function controlViewFactory(index:Int, value:ControlPreset):ToggleButtonView {
|
||||
var result = new ToggleButtonView();
|
||||
result.skinId = 'button.simple.active';
|
||||
result.on = control == value;
|
||||
result.text = value.name;
|
||||
return result;
|
||||
}
|
||||
|
||||
private function onControlSelect(index:Int, value:ControlPreset, view:ToggleButtonView):Void {
|
||||
control = value;
|
||||
for (v in controlsView.dataViews) {
|
||||
v.on = v == view;
|
||||
close({presetId: value.id, controls: slotsView.data});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,43 +2,47 @@
|
||||
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:
|
||||
- $type: haxework.view.HGroupView
|
||||
$type: haxework.view.VGroupView
|
||||
layout.hAlign: center
|
||||
geometry.size.width: 400
|
||||
geometry.size.height: 400
|
||||
geometry.margin: 10
|
||||
skinId: window
|
||||
views:
|
||||
- $type: haxework.view.HGroupView
|
||||
geometry.size.width: 100%
|
||||
geometry.padding: 10
|
||||
layout.vAlign: middle
|
||||
views:
|
||||
- id: name
|
||||
$type: haxework.view.LabelView
|
||||
geometry.size.width: 100%
|
||||
geometry.padding: 10
|
||||
layout.vAlign: middle
|
||||
views:
|
||||
- id: name
|
||||
$type: haxework.view.LabelView
|
||||
geometry.size.width: 100%
|
||||
geometry.margin.left: 10
|
||||
layout.hAlign: left
|
||||
skinId: text
|
||||
- $type: haxework.view.ButtonView
|
||||
skinId: window.close
|
||||
+onPress: $code:reject('close')
|
||||
- $type: haxework.view.SpriteView
|
||||
geometry.size.height: 100%
|
||||
- id: controls
|
||||
$type: haxework.view.DataView
|
||||
factory: $this:controlViewFactory
|
||||
+onItemSelect: $this:onControlSelect
|
||||
layout:
|
||||
$type: haxework.view.layout.HorizontalLayout
|
||||
hAlign: center
|
||||
margin: 5
|
||||
skinId: panel
|
||||
- id: presets
|
||||
$type: haxework.view.DataView
|
||||
factory: $this:presetViewFactory
|
||||
+onDataSelect: $this:onPresetSelect
|
||||
layout:
|
||||
$type: haxework.view.layout.HorizontalLayout
|
||||
hAlign: center
|
||||
margin: 5
|
||||
skinId: panel
|
||||
geometry.margin.left: 10
|
||||
layout.hAlign: left
|
||||
skinId: text
|
||||
- $type: haxework.view.ButtonView
|
||||
skinId: window.close
|
||||
+onPress: $code:reject('close')
|
||||
- $type: haxework.view.ScrollView
|
||||
geometry.size.stretch: true
|
||||
layout.hAlign: center
|
||||
scroll.skinId: scroll.vertical
|
||||
view:
|
||||
id: slots
|
||||
$type: haxework.view.DataView
|
||||
geometry.padding: 10
|
||||
factory: $this:slotViewFactory
|
||||
layout:
|
||||
$type: haxework.view.layout.VerticalLayout
|
||||
# $type: haxework.view.layout.TailLayout
|
||||
margin: 5
|
||||
+onItemSelect: $this:onControlSelect
|
||||
- id: presets
|
||||
$type: haxework.view.DataView
|
||||
factory: $this:presetViewFactory
|
||||
+onDataSelect: $this:onPresetSelect
|
||||
layout:
|
||||
$type: haxework.view.layout.HorizontalLayout
|
||||
hAlign: center
|
||||
margin: 5
|
||||
skinId: panel
|
||||
|
||||
Reference in New Issue
Block a user