[common] PlayerControl update
This commit is contained in:
@@ -7,9 +7,11 @@ import ru.m.tankz.util.LevelUtil;
|
|||||||
|
|
||||||
class LevelBundle implements ILevelBundle {
|
class LevelBundle implements ILevelBundle {
|
||||||
|
|
||||||
|
private var _cache:Map<String, LevelPack> = new Map();
|
||||||
|
|
||||||
public function new() {}
|
public function new() {}
|
||||||
|
|
||||||
public function get(id:PackId):LevelPack {
|
private function resolve(id:PackId):LevelPack {
|
||||||
var bytes = Assets.getBytes('levels/${id}.zip');
|
var bytes = Assets.getBytes('levels/${id}.zip');
|
||||||
return {
|
return {
|
||||||
id: id,
|
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;
|
package ru.m.tankz.network;
|
||||||
|
|
||||||
import haxe.Unserializer;
|
import haxe.Unserializer;
|
||||||
|
import ru.m.tankz.control.Controller;
|
||||||
import ru.m.tankz.game.Game;
|
import ru.m.tankz.game.Game;
|
||||||
import ru.m.tankz.game.GameEvent;
|
import ru.m.tankz.game.GameEvent;
|
||||||
import ru.m.tankz.network.NetworkControlFactory;
|
import ru.m.tankz.network.NetworkControlFactory;
|
||||||
@@ -40,7 +41,7 @@ class NetworkGame extends Game {
|
|||||||
override private function onStart(start:Start):Void {
|
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);
|
var slot:RoomSlotProto = Lambda.find(network.room.slots, function(slot:RoomSlotProto) return slot.hasUser() && slot.user.uuid == network.user.uuid);
|
||||||
if (slot != null) {
|
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);
|
super.onStart(start);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,13 @@ import haxework.view.frame.FrameView;
|
|||||||
import haxework.view.LabelView;
|
import haxework.view.LabelView;
|
||||||
import ru.m.tankz.bundle.IConfigBundle;
|
import ru.m.tankz.bundle.IConfigBundle;
|
||||||
import ru.m.tankz.config.Config;
|
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.GameInit;
|
||||||
import ru.m.tankz.game.GameState;
|
import ru.m.tankz.game.GameState;
|
||||||
import ru.m.tankz.storage.GameStorage;
|
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.view.popup.LevelPopup;
|
||||||
|
|
||||||
@:template class LevelFrame extends FrameView<LevelPack> {
|
@:template class LevelFrame extends FrameView<LevelPack> {
|
||||||
@@ -40,9 +44,9 @@ import ru.m.tankz.view.popup.LevelPopup;
|
|||||||
levels.data = pack.data;
|
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({
|
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,
|
level: level,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -64,12 +68,31 @@ import ru.m.tankz.view.popup.LevelPopup;
|
|||||||
if (levelPopup == null) {
|
if (levelPopup == null) {
|
||||||
levelPopup = new LevelPopup();
|
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(
|
levelPopup.setData(
|
||||||
level,
|
level,
|
||||||
config.presets,
|
config.presets,
|
||||||
config.controls,
|
controls,
|
||||||
storage.get(pack.id)
|
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 {
|
override public function onShow(data:Result):Void {
|
||||||
result = data;
|
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}';
|
var label = '${result.state.type} Level ${result.level.id}';
|
||||||
if (result.level.name != null) {
|
if (result.level.name != null) {
|
||||||
label += '\n${result.level.name}';
|
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;
|
package ru.m.tankz.view.popup;
|
||||||
|
|
||||||
|
using haxe.EnumTools.EnumValueTools;
|
||||||
import haxework.view.ButtonView;
|
import haxework.view.ButtonView;
|
||||||
import haxework.view.DataView;
|
import haxework.view.DataView;
|
||||||
import haxework.view.LabelView;
|
import haxework.view.LabelView;
|
||||||
import haxework.view.popup.PopupView;
|
import haxework.view.popup.PopupView;
|
||||||
import haxework.view.ToggleButtonView;
|
|
||||||
import ru.m.tankz.config.Config;
|
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.game.PackProgress;
|
||||||
|
import ru.m.tankz.Type;
|
||||||
|
import ru.m.tankz.view.common.SlotView;
|
||||||
|
|
||||||
private typedef Result = {
|
private typedef Result = {
|
||||||
var control:ControlPreset;
|
var presetId:PresetId;
|
||||||
var preset:GamePreset;
|
var controls:Array<PlayerControl>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@:template class LevelPopup extends PopupView<Result> {
|
@:template class LevelPopup extends PopupView<Result> {
|
||||||
@@ -20,16 +24,46 @@ private typedef Result = {
|
|||||||
|
|
||||||
@:view var name:LabelView;
|
@:view var name:LabelView;
|
||||||
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
|
@:view("presets") var presetsView:DataView<GamePreset, ButtonView>;
|
||||||
@:view("controls") var controlsView:DataView<ControlPreset, ToggleButtonView>;
|
@:view("slots") var slotsView:DataView<PlayerControl, SlotView>;
|
||||||
private var control:ControlPreset;
|
|
||||||
|
|
||||||
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.level = level;
|
||||||
this.progress = progress;
|
this.progress = progress;
|
||||||
name.text = '${level.id}. ${level.name != null ? level.name : "#"}';
|
name.text = '${level.id}. ${level.name != null ? level.name : "#"}';
|
||||||
presetsView.data = presets;
|
presetsView.data = presets;
|
||||||
control = controls[0];
|
slotsView.data = controls;
|
||||||
controlsView.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 {
|
private function presetViewFactory(index:Int, value:GamePreset):ButtonView {
|
||||||
@@ -42,22 +76,7 @@ private typedef Result = {
|
|||||||
|
|
||||||
private function onPresetSelect(value:GamePreset):Void {
|
private function onPresetSelect(value:GamePreset):Void {
|
||||||
if (progress.isPresetAvailable(level.id, value.id)) {
|
if (progress.isPresetAvailable(level.id, value.id)) {
|
||||||
close({control: control, preset: value});
|
close({presetId: value.id, controls: slotsView.data});
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,43 +2,47 @@
|
|||||||
layout.hAlign: center
|
layout.hAlign: center
|
||||||
layout.vAlign: middle
|
layout.vAlign: middle
|
||||||
view:
|
view:
|
||||||
$type: haxework.view.VGroupView
|
$type: haxework.view.VGroupView
|
||||||
layout.hAlign: center
|
layout.hAlign: center
|
||||||
geometry.size.width: 400
|
geometry.size.width: 400
|
||||||
geometry.size.height: 400
|
geometry.size.height: 400
|
||||||
skinId: window
|
geometry.margin: 10
|
||||||
views:
|
skinId: window
|
||||||
- $type: haxework.view.HGroupView
|
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.size.width: 100%
|
||||||
geometry.padding: 10
|
geometry.margin.left: 10
|
||||||
layout.vAlign: middle
|
layout.hAlign: left
|
||||||
views:
|
skinId: text
|
||||||
- id: name
|
- $type: haxework.view.ButtonView
|
||||||
$type: haxework.view.LabelView
|
skinId: window.close
|
||||||
geometry.size.width: 100%
|
+onPress: $code:reject('close')
|
||||||
geometry.margin.left: 10
|
- $type: haxework.view.ScrollView
|
||||||
layout.hAlign: left
|
geometry.size.stretch: true
|
||||||
skinId: text
|
layout.hAlign: center
|
||||||
- $type: haxework.view.ButtonView
|
scroll.skinId: scroll.vertical
|
||||||
skinId: window.close
|
view:
|
||||||
+onPress: $code:reject('close')
|
id: slots
|
||||||
- $type: haxework.view.SpriteView
|
$type: haxework.view.DataView
|
||||||
geometry.size.height: 100%
|
geometry.padding: 10
|
||||||
- id: controls
|
factory: $this:slotViewFactory
|
||||||
$type: haxework.view.DataView
|
layout:
|
||||||
factory: $this:controlViewFactory
|
$type: haxework.view.layout.VerticalLayout
|
||||||
+onItemSelect: $this:onControlSelect
|
# $type: haxework.view.layout.TailLayout
|
||||||
layout:
|
margin: 5
|
||||||
$type: haxework.view.layout.HorizontalLayout
|
+onItemSelect: $this:onControlSelect
|
||||||
hAlign: center
|
- id: presets
|
||||||
margin: 5
|
$type: haxework.view.DataView
|
||||||
skinId: panel
|
factory: $this:presetViewFactory
|
||||||
- id: presets
|
+onDataSelect: $this:onPresetSelect
|
||||||
$type: haxework.view.DataView
|
layout:
|
||||||
factory: $this:presetViewFactory
|
$type: haxework.view.layout.HorizontalLayout
|
||||||
+onDataSelect: $this:onPresetSelect
|
hAlign: center
|
||||||
layout:
|
margin: 5
|
||||||
$type: haxework.view.layout.HorizontalLayout
|
skinId: panel
|
||||||
hAlign: center
|
|
||||||
margin: 5
|
|
||||||
skinId: panel
|
|
||||||
|
|||||||
@@ -26,6 +26,16 @@ abstract PlayerId(Array<Dynamic>) {
|
|||||||
|
|
||||||
private inline function get_index():Int return this[1];
|
private inline function get_index():Int return this[1];
|
||||||
|
|
||||||
|
public function compare(other:PlayerId):Int {
|
||||||
|
if (other == null) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (other.team != team) {
|
||||||
|
return team > other.team ? 1 : -1;
|
||||||
|
}
|
||||||
|
return index - other.index;
|
||||||
|
}
|
||||||
|
|
||||||
@:from static public inline function fromArray(value:Array<Dynamic>):PlayerId {
|
@:from static public inline function fromArray(value:Array<Dynamic>):PlayerId {
|
||||||
return new PlayerId(value[0], value[1]);
|
return new PlayerId(value[0], value[1]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,25 +120,11 @@ typedef LevelPack = {
|
|||||||
var data:Array<LevelConfig>;
|
var data:Array<LevelConfig>;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef PlayerControl = {
|
|
||||||
var playerId:PlayerId;
|
|
||||||
var control:String;
|
|
||||||
@:optional var color:Null<Int>;
|
|
||||||
@:optional var name:String;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef ControlPreset = {
|
|
||||||
var id:Int;
|
|
||||||
var name:String;
|
|
||||||
var values:Array<PlayerControl>;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef ConfigSource = {
|
typedef ConfigSource = {
|
||||||
var game:GameConfig;
|
var game:GameConfig;
|
||||||
var map: MapConfig;
|
var map: MapConfig;
|
||||||
var bricks: Array<BrickConfig>;
|
var bricks: Array<BrickConfig>;
|
||||||
var presets: Array<GamePreset>;
|
var presets: Array<GamePreset>;
|
||||||
var controls: Array<ControlPreset>;
|
|
||||||
var points: Array<SpawnPoint>;
|
var points: Array<SpawnPoint>;
|
||||||
var tanks: Array<TankConfig>;
|
var tanks: Array<TankConfig>;
|
||||||
var bonuses: Array<BonusConfig>;
|
var bonuses: Array<BonusConfig>;
|
||||||
@@ -151,7 +137,6 @@ class Config {
|
|||||||
public var bricks(default, null):Array<BrickConfig>;
|
public var bricks(default, null):Array<BrickConfig>;
|
||||||
public var tanks(default, null):Array<TankConfig>;
|
public var tanks(default, null):Array<TankConfig>;
|
||||||
public var presets(default, null):Array<GamePreset>;
|
public var presets(default, null):Array<GamePreset>;
|
||||||
public var controls(default, null):Array<ControlPreset>;
|
|
||||||
public var points(default, null):Array<SpawnPoint>;
|
public var points(default, null):Array<SpawnPoint>;
|
||||||
public var bonuses(default, null):Array<BonusConfig>;
|
public var bonuses(default, null):Array<BonusConfig>;
|
||||||
|
|
||||||
@@ -164,7 +149,7 @@ class Config {
|
|||||||
private var playersMap:Map<String, PlayerConfig>;
|
private var playersMap:Map<String, PlayerConfig>;
|
||||||
|
|
||||||
public static function fromSource(type:GameType, source:ConfigSource):Config {
|
public static function fromSource(type:GameType, source:ConfigSource):Config {
|
||||||
return new Config(type, source.game, source.map, source.bricks, source.presets, source.controls, source.points, source.tanks, source.bonuses);
|
return new Config(type, source.game, source.map, source.bricks, source.presets, source.points, source.tanks, source.bonuses);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function new(
|
public function new(
|
||||||
@@ -173,7 +158,6 @@ class Config {
|
|||||||
map:MapConfig,
|
map:MapConfig,
|
||||||
bricks:Array<BrickConfig>,
|
bricks:Array<BrickConfig>,
|
||||||
presets:Array<GamePreset>,
|
presets:Array<GamePreset>,
|
||||||
controls:Array<ControlPreset>,
|
|
||||||
points:Array<SpawnPoint>,
|
points:Array<SpawnPoint>,
|
||||||
tanks:Array<TankConfig>,
|
tanks:Array<TankConfig>,
|
||||||
bonuses:Array<BonusConfig>
|
bonuses:Array<BonusConfig>
|
||||||
@@ -183,7 +167,6 @@ class Config {
|
|||||||
this.map = map;
|
this.map = map;
|
||||||
this.bricks = bricks;
|
this.bricks = bricks;
|
||||||
this.presets = presets;
|
this.presets = presets;
|
||||||
this.controls = controls;
|
|
||||||
this.points = points;
|
this.points = points;
|
||||||
this.tanks = tanks;
|
this.tanks = tanks;
|
||||||
this.bonuses = bonuses;
|
this.bonuses = bonuses;
|
||||||
@@ -271,10 +254,6 @@ class Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function isHuman(playerId:PlayerId) {
|
public function isHuman(playerId:PlayerId) {
|
||||||
var controller:Controller = AController.fromString(getPlayer(playerId).control);
|
return ControllerParser.fromString(getPlayer(playerId).control).match(HUMAN(_));
|
||||||
return switch controller {
|
|
||||||
case HUMAN(_): true;
|
|
||||||
case _: false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,21 +6,23 @@ enum Controller {
|
|||||||
BOT(type:String);
|
BOT(type:String);
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract AController(Controller) {
|
class ControllerParser {
|
||||||
|
|
||||||
public inline function new(value:Controller) {
|
public static function fromString(value:String):Controller {
|
||||||
this = value;
|
return switch value {
|
||||||
|
case null: NONE;
|
||||||
|
case x: switch x.split("-") {
|
||||||
|
case ["human", index]: HUMAN(Std.parseInt(index));
|
||||||
|
case ["bot", type]: BOT(type);
|
||||||
|
case _: NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@:from public static function fromString(value:String):AController {
|
public static function defaultName(controller:Controller):String {
|
||||||
return new AController(switch value.split("-") {
|
return switch controller {
|
||||||
case ["human", index]: HUMAN(Std.parseInt(index));
|
case HUMAN(index): 'Player $index';
|
||||||
case ["bot", type]: BOT(type);
|
case BOT(_) | NONE: null;
|
||||||
case _: NONE;
|
}
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@:to public inline function toController():Controller {
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
src/common/haxe/ru/m/tankz/control/PlayerControl.hx
Normal file
11
src/common/haxe/ru/m/tankz/control/PlayerControl.hx
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package ru.m.tankz.control;
|
||||||
|
|
||||||
|
import haxework.color.Color;
|
||||||
|
import ru.m.tankz.Type;
|
||||||
|
|
||||||
|
typedef PlayerControl = {
|
||||||
|
var playerId:PlayerId;
|
||||||
|
var controller:Controller;
|
||||||
|
@:optional var color:Color;
|
||||||
|
@:optional var name:String;
|
||||||
|
}
|
||||||
@@ -1,14 +1,12 @@
|
|||||||
package ru.m.tankz.game;
|
package ru.m.tankz.game;
|
||||||
|
|
||||||
import ru.m.geom.Point;
|
|
||||||
import ru.m.geom.Position;
|
|
||||||
import ru.m.tankz.bundle.IConfigBundle;
|
import ru.m.tankz.bundle.IConfigBundle;
|
||||||
import ru.m.tankz.config.Config;
|
import ru.m.tankz.config.Config;
|
||||||
import ru.m.tankz.control.Control;
|
import ru.m.tankz.control.Control;
|
||||||
import ru.m.tankz.control.Controller;
|
import ru.m.tankz.control.Controller;
|
||||||
import ru.m.tankz.control.IControlFactory;
|
import ru.m.tankz.control.IControlFactory;
|
||||||
import ru.m.tankz.control.NoneControlFactory;
|
import ru.m.tankz.control.NoneControlFactory;
|
||||||
import ru.m.tankz.core.Entity;
|
import ru.m.tankz.control.PlayerControl;
|
||||||
import ru.m.tankz.core.EntityType;
|
import ru.m.tankz.core.EntityType;
|
||||||
import ru.m.tankz.engine.IEngine;
|
import ru.m.tankz.engine.IEngine;
|
||||||
import ru.m.tankz.game.GameEvent;
|
import ru.m.tankz.game.GameEvent;
|
||||||
@@ -102,6 +100,7 @@ import ru.m.tankz.Type;
|
|||||||
}
|
}
|
||||||
for (team in teams.iterator()) {
|
for (team in teams.iterator()) {
|
||||||
for (player in team.players.iterator()) {
|
for (player in team.players.iterator()) {
|
||||||
|
var controller = ControllerParser.fromString(player.config.control);
|
||||||
var playerControl = controlsById.get(player.id);
|
var playerControl = controlsById.get(player.id);
|
||||||
if (playerControl != null) {
|
if (playerControl != null) {
|
||||||
if (playerControl.color != null) {
|
if (playerControl.color != null) {
|
||||||
@@ -110,9 +109,11 @@ import ru.m.tankz.Type;
|
|||||||
if (playerControl.name != null) {
|
if (playerControl.name != null) {
|
||||||
player.state.name = playerControl.name;
|
player.state.name = playerControl.name;
|
||||||
}
|
}
|
||||||
|
if (playerControl.controller != null && !playerControl.controller.match(NONE)) {
|
||||||
|
controller = playerControl.controller;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
var controlType:Controller = AController.fromString(playerControl != null ? playerControl.control : player.config.control);
|
var control = controlFactory.build(player.id, controller);
|
||||||
var control = controlFactory.build(player.id, controlType);
|
|
||||||
if (control != null) {
|
if (control != null) {
|
||||||
controls[player.id] = control;
|
controls[player.id] = control;
|
||||||
control.bind(this, engine);
|
control.bind(this, engine);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package ru.m.tankz.game;
|
|||||||
import haxework.color.Color;
|
import haxework.color.Color;
|
||||||
import ru.m.tankz.bundle.IConfigBundle;
|
import ru.m.tankz.bundle.IConfigBundle;
|
||||||
import ru.m.tankz.config.Config;
|
import ru.m.tankz.config.Config;
|
||||||
|
import ru.m.tankz.control.PlayerControl;
|
||||||
import ru.m.tankz.Type;
|
import ru.m.tankz.Type;
|
||||||
|
|
||||||
class State {
|
class State {
|
||||||
|
|||||||
@@ -196,20 +196,3 @@ presets:
|
|||||||
- {<<: *bot, index: 3, control: bot-hard}
|
- {<<: *bot, index: 3, control: bot-hard}
|
||||||
- {<<: *bot, index: 4, control: bot-hard}
|
- {<<: *bot, index: 4, control: bot-hard}
|
||||||
- {<<: *bot, index: 5, control: bot-hard}
|
- {<<: *bot, index: 5, control: bot-hard}
|
||||||
|
|
||||||
controls:
|
|
||||||
- id: 0
|
|
||||||
name: 1 Player
|
|
||||||
values:
|
|
||||||
- playerId: [human, 0]
|
|
||||||
control: human-0
|
|
||||||
name: Player 1
|
|
||||||
- id: 1
|
|
||||||
name: 2 Player
|
|
||||||
values:
|
|
||||||
- playerId: [human, 0]
|
|
||||||
control: human-0
|
|
||||||
name: Player 1
|
|
||||||
- playerId: [human, 1]
|
|
||||||
control: human-1
|
|
||||||
name: Player 2
|
|
||||||
|
|||||||
@@ -91,20 +91,3 @@ tanks:
|
|||||||
skin: pc
|
skin: pc
|
||||||
|
|
||||||
bonuses: []
|
bonuses: []
|
||||||
|
|
||||||
controls:
|
|
||||||
- id: 0
|
|
||||||
name: 1 Player
|
|
||||||
values:
|
|
||||||
- playerId: [alpha, 0]
|
|
||||||
control: human-0
|
|
||||||
name: Player 1
|
|
||||||
- id: 1
|
|
||||||
name: 2 Player
|
|
||||||
values:
|
|
||||||
- playerId: [alpha, 0]
|
|
||||||
control: human-0
|
|
||||||
name: Player 1
|
|
||||||
- playerId: [beta, 0]
|
|
||||||
control: human-1
|
|
||||||
name: Player 2
|
|
||||||
|
|||||||
@@ -115,34 +115,3 @@ bonuses:
|
|||||||
- {type: life}
|
- {type: life}
|
||||||
- {type: shovel, duration: 10}
|
- {type: shovel, duration: 10}
|
||||||
- {type: star}
|
- {type: star}
|
||||||
|
|
||||||
controls:
|
|
||||||
- id: 0
|
|
||||||
name: 1 Player
|
|
||||||
values:
|
|
||||||
- playerId: [radiant, 0]
|
|
||||||
control: human-0
|
|
||||||
color: 0xff8866
|
|
||||||
name: Player 1
|
|
||||||
- id: 1
|
|
||||||
name: 2 Player Coop
|
|
||||||
values:
|
|
||||||
- playerId: [radiant, 0]
|
|
||||||
control: human-0
|
|
||||||
color: 0xff8866
|
|
||||||
name: Player 1
|
|
||||||
- playerId: [radiant, 1]
|
|
||||||
control: human-1
|
|
||||||
color: 0xff8866
|
|
||||||
name: Player 2
|
|
||||||
- id: 2
|
|
||||||
name: 2 Player VS
|
|
||||||
values:
|
|
||||||
- playerId: [radiant, 0]
|
|
||||||
control: human-0
|
|
||||||
color: 0xff8866
|
|
||||||
name: Player 1
|
|
||||||
- playerId: [dire, 0]
|
|
||||||
control: human-1
|
|
||||||
color: 0x4294ff
|
|
||||||
name: Player 2
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
package ru.m.tankz.server.game;
|
package ru.m.tankz.server.game;
|
||||||
|
|
||||||
|
import ru.m.tankz.control.Controller;
|
||||||
import ru.m.tankz.bundle.ILevelBundle;
|
import ru.m.tankz.bundle.ILevelBundle;
|
||||||
import ru.m.tankz.config.Config;
|
import ru.m.tankz.control.PlayerControl;
|
||||||
import ru.m.tankz.core.EntityType;
|
import ru.m.tankz.core.EntityType;
|
||||||
import ru.m.tankz.game.EventUtil;
|
import ru.m.tankz.game.EventUtil;
|
||||||
import ru.m.tankz.game.GameEvent;
|
import ru.m.tankz.game.GameEvent;
|
||||||
@@ -81,7 +82,7 @@ class ServerGame extends GameRunner {
|
|||||||
.filter(function(slot:RoomSlotProto) return slot.hasUser())
|
.filter(function(slot:RoomSlotProto) return slot.hasUser())
|
||||||
.map(function(slot:RoomSlotProto):PlayerControl return {
|
.map(function(slot:RoomSlotProto):PlayerControl return {
|
||||||
playerId: [slot.slot.team, slot.slot.index],
|
playerId: [slot.slot.team, slot.slot.index],
|
||||||
control: "human-0",
|
controller: HUMAN(0),
|
||||||
name: slot.user.name,
|
name: slot.user.name,
|
||||||
});
|
});
|
||||||
super.start();
|
super.start();
|
||||||
|
|||||||
Reference in New Issue
Block a user