[common] add PlayerControl presets

This commit is contained in:
2019-05-30 15:24:26 +03:00
parent c7946ef1da
commit abf944418e
26 changed files with 264 additions and 92 deletions

View File

@@ -16,7 +16,7 @@ class ConfigBundle implements IConfigBundle {
public function get(type:GameType):Config {
if (!_cache.exists(type)) {
var source:ConfigSource = Yaml.parse(Assets.getText('resources/${type}/config.yaml'), Parser.options().useObjects());
_cache.set(type, new Config(type, source.game, source.map, source.bricks, source.presets, source.points, source.tanks, source.bonuses));
_cache.set(type, Config.fromSource(type, source));
}
return _cache.get(type);
}

View File

@@ -8,6 +8,8 @@ class NetworkControl extends HumanControl {
@:provide private var network:NetworkManager;
override public function action(action:TankAction):Void {
network.action(tankId, action);
if (tankId > -1) {
network.action(tankId, action);
}
}
}

View File

@@ -26,6 +26,14 @@ class NetworkGame extends Game {
gameEventSignal.emit(event);
}
override public function start():Void {
var player = Lambda.find(network.game.players, function(player) return player.user.uuid == network.user.uuid);
if (player != null) {
state.controls.push({playerId: [player.team, player.index], control: "human-0"});
}
super.start();
}
override public function dispose():Void {
super.dispose();
network.gameEventSignal.disconnect(onGameEventProto);

View File

@@ -117,7 +117,7 @@ class Render extends SpriteView implements IRender {
case SPAWN(TANK(id, rect, playerId, info)):
var item = new TankRenderItem(rect);
var tankConfig = config.getTank(info.type);
item.color = config.getColor(playerId);
item.color = info.color;
item.skin = tankConfig.skin;
item.hits = info.hits;
item.bonus = info.bonus;

View File

@@ -33,9 +33,10 @@ import ru.m.tankz.view.popup.LevelPopup;
levels.data = [for (i in 0...state.config.game.levels) i];
}
private function start(level:LevelConfig, preset:GamePreset):Void {
private function start(level:LevelConfig, preset:GamePreset, control:ControlPreset):Void {
state.levelId = level.id;
state.presetId = preset.id;
state.controls = control.values;
game = new LocalGame(state);
switcher.change(GameFrame.ID);
}
@@ -61,8 +62,9 @@ import ru.m.tankz.view.popup.LevelPopup;
levelPopup.setData(
level,
state.config.presets,
state.config.controls,
storage.get(state.type)
);
levelPopup.show().then(function(preset) preset != null ? start(level, preset) : {});
levelPopup.show().then(function(result) result != null ? start(level, result.preset, result.control) : {});
}
}

View File

@@ -10,7 +10,7 @@ import ru.m.tankz.game.NetworkGame;
import ru.m.tankz.network.NetworkManager;
import ru.m.tankz.proto.core.GameProto;
import ru.m.tankz.proto.core.GameStateProto;
import ru.m.tankz.proto.core.UserProto;
import ru.m.tankz.proto.core.PlayerProto;
@:template class GameRoomFrame extends VGroupView {
@@ -18,7 +18,7 @@ import ru.m.tankz.proto.core.UserProto;
@:view var start:ButtonView;
@:view var info:TextView;
@:view var players:VListView<UserProto>;
@:view var players:VListView<PlayerProto>;
@:provide var switcher:FrameSwitcher;
@:provide var network:NetworkManager;

View File

@@ -3,18 +3,18 @@ package ru.m.tankz.view.network;
import haxework.view.HGroupView;
import haxework.view.LabelView;
import haxework.view.list.ListView;
import ru.m.tankz.proto.core.UserProto;
import ru.m.tankz.proto.core.PlayerProto;
@:template class PlayerItemView extends HGroupView implements IListItemView<UserProto> {
@:template class PlayerItemView extends HGroupView implements IListItemView<PlayerProto> {
public var item_index(default, default):Int;
public var data(default, set):UserProto;
public var data(default, set):PlayerProto;
@:view var label:LabelView;
private function set_data(value:UserProto):UserProto {
private function set_data(value:PlayerProto):PlayerProto {
data = value;
label.text = '${value.name}';
label.text = '${value.user.name}';
return data;
}

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.view.popup;
import haxework.view.ToggleButtonView;
import haxework.view.ButtonView;
import haxework.view.DataView;
import haxework.view.LabelView;
@@ -7,19 +8,28 @@ import haxework.view.popup.PopupView;
import ru.m.tankz.config.Config;
import ru.m.tankz.game.GameProgress;
@:template class LevelPopup extends PopupView<GamePreset> {
typedef Result = {
var control:ControlPreset;
var preset:GamePreset;
}
@:template class LevelPopup extends PopupView<Result> {
private var level:LevelConfig;
private var progress:GameProgress;
@:view var name:LabelView;
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
@:view("controls") var controlsView:DataView<ControlPreset, ToggleButtonView>;
private var control:ControlPreset;
public function setData(level:LevelConfig, presets:Array<GamePreset>, progress:GameProgress):Void {
public function setData(level:LevelConfig, presets:Array<GamePreset>, controls:Array<ControlPreset>, progress:GameProgress):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;
}
private function presetViewFactory(index:Int, value:GamePreset):ButtonView {
@@ -32,7 +42,22 @@ import ru.m.tankz.game.GameProgress;
private function onPresetSelect(value:GamePreset):Void {
if (progress.isPresetAvailable(level.id, value.id)) {
close(value);
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;
}
}
}

View File

@@ -24,6 +24,15 @@ view:
+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