From d0c796aab25fb24cc727765a2aa150216ef871ba Mon Sep 17 00:00:00 2001 From: shmyga Date: Thu, 19 Jul 2018 17:47:25 +0300 Subject: [PATCH] [client] add SettingsFrame --- package.json | 2 +- src/client/haxe/ru/m/tankz/Client.yaml | 4 + src/client/haxe/ru/m/tankz/Init.hx | 2 + src/client/haxe/ru/m/tankz/Style.yaml | 11 ++ .../haxe/ru/m/tankz/control/ActionConfig.hx | 86 +++++++++++++++ .../haxe/ru/m/tankz/control/HumanControl.hx | 32 +----- src/client/haxe/ru/m/tankz/frame/GameFrame.hx | 9 +- .../haxe/ru/m/tankz/frame/SettingsFrame.hx | 24 +++++ .../haxe/ru/m/tankz/frame/SettingsFrame.yaml | 24 +++++ .../haxe/ru/m/tankz/frame/StartFrame.hx | 4 + .../haxe/ru/m/tankz/frame/StartFrame.yaml | 12 +++ .../ru/m/tankz/frame/settings/ActionView.hx | 88 ++++++++++++++++ .../ru/m/tankz/frame/settings/ActionView.yaml | 21 ++++ .../m/tankz/frame/settings/SettingsEditor.hx | 75 +++++++++++++ .../tankz/frame/settings/SettingsEditor.yaml | 27 +++++ .../ru/m/tankz/storage/SettingsStorage.hx | 55 ++++++++++ src/client/resources/image/ui/close.png | Bin 0 -> 2677 bytes .../resources/image/ui/close.source.png | Bin 0 -> 7252 bytes src/client/resources/image/ui/settings.png | Bin 0 -> 6069 bytes .../resources/image/ui/settings.source.png | Bin 0 -> 43914 bytes src/client/resources/keyboard.txt | 99 ++++++++++++++++++ src/common/haxe/ru/m/geom/Direction.hx | 8 +- 22 files changed, 549 insertions(+), 34 deletions(-) create mode 100644 src/client/haxe/ru/m/tankz/control/ActionConfig.hx create mode 100644 src/client/haxe/ru/m/tankz/frame/SettingsFrame.hx create mode 100644 src/client/haxe/ru/m/tankz/frame/SettingsFrame.yaml create mode 100755 src/client/haxe/ru/m/tankz/frame/settings/ActionView.hx create mode 100644 src/client/haxe/ru/m/tankz/frame/settings/ActionView.yaml create mode 100644 src/client/haxe/ru/m/tankz/frame/settings/SettingsEditor.hx create mode 100644 src/client/haxe/ru/m/tankz/frame/settings/SettingsEditor.yaml create mode 100644 src/client/haxe/ru/m/tankz/storage/SettingsStorage.hx create mode 100644 src/client/resources/image/ui/close.png create mode 100644 src/client/resources/image/ui/close.source.png create mode 100644 src/client/resources/image/ui/settings.png create mode 100644 src/client/resources/image/ui/settings.source.png create mode 100644 src/client/resources/keyboard.txt diff --git a/package.json b/package.json index 3ce5009..f43a628 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tankz", - "version": "0.7.3", + "version": "0.7.4", "private": true, "devDependencies": { "dateformat": "^3.0.3", diff --git a/src/client/haxe/ru/m/tankz/Client.yaml b/src/client/haxe/ru/m/tankz/Client.yaml index 64eda98..ffaf918 100755 --- a/src/client/haxe/ru/m/tankz/Client.yaml +++ b/src/client/haxe/ru/m/tankz/Client.yaml @@ -20,10 +20,14 @@ views: $type: ru.m.tankz.frame.GameFrame - id: network $type: ru.m.tankz.frame.NetworkFrame + - id: settings + $type: ru.m.tankz.frame.SettingsFrame - $type: haxework.gui.LabelView $style: label inLayout: false contentSize: true vAlign: BOTTOM hAlign: RIGHT + rightMargin: 10 + bottomMargin: 10 text: "@res:text:version" diff --git a/src/client/haxe/ru/m/tankz/Init.hx b/src/client/haxe/ru/m/tankz/Init.hx index 137773f..a31495f 100644 --- a/src/client/haxe/ru/m/tankz/Init.hx +++ b/src/client/haxe/ru/m/tankz/Init.hx @@ -1,5 +1,6 @@ package ru.m.tankz; +import ru.m.tankz.storage.SettingsStorage; import haxework.provider.Provider; import haxework.resources.IResources; import haxework.resources.Resources; @@ -47,6 +48,7 @@ class Init { Provider.setFactory(IConfigBundle, ConfigBundle); Provider.setFactory(SaveStorage, SaveStorage); Provider.setFactory(UserStorage, UserStorage); + Provider.setFactory(SettingsStorage, SettingsStorage); Provider.setFactory(SoundManager, SoundManager); Provider.setFactory(NetworkManager, NetworkManager); Provider.setFactory(IControlFactory, ClientControlFactory); diff --git a/src/client/haxe/ru/m/tankz/Style.yaml b/src/client/haxe/ru/m/tankz/Style.yaml index 5d0b116..cdd2598 100644 --- a/src/client/haxe/ru/m/tankz/Style.yaml +++ b/src/client/haxe/ru/m/tankz/Style.yaml @@ -19,3 +19,14 @@ label: fontFamily: Courirer New fontSize: 16 shadowColor: 0x000000 + +close: + inLayout: false + hAlign: LEFT + vAlign: BOTTOM + leftMargin: 10 + bottomMargin: 10 + contentSize: true + skin: + $type: haxework.gui.skin.ButtonBitmapSkin + image: "@asset:image:resources/image/ui/close.png" diff --git a/src/client/haxe/ru/m/tankz/control/ActionConfig.hx b/src/client/haxe/ru/m/tankz/control/ActionConfig.hx new file mode 100644 index 0000000..3bac949 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/control/ActionConfig.hx @@ -0,0 +1,86 @@ +package ru.m.tankz.control; + +import ru.m.geom.Direction; +import ru.m.tankz.control.Control.TankAction; +import yaml.Parser; +import yaml.Renderer; +import yaml.Yaml; + + +typedef ActionItem = { + public var action: TankAction; + public var key: Int; +} + +typedef KeyBinding = Map; + +typedef ActionItemRaw = { + public var action: String; + public var key: Int; +} + +class ActionConfig { + + public var data(default, null): Array; + + public function new(data: Array) { + this.data = data; + } + + public function asKeyBinding(): KeyBinding { + var result = new Map(); + for (item in data) { + result[item.key] = item.action; + } + return result; + } + + public static function action2string(action: TankAction): String { + return switch (action) { + case TankAction.SHOT: "SHOT"; + case TankAction.MOVE(Direction.TOP): "MOVE_TOP"; + case TankAction.MOVE(Direction.LEFT): "MOVE_LEFT"; + case TankAction.MOVE(Direction.BOTTOM): "MOVE_BOTTOM"; + case TankAction.MOVE(Direction.RIGHT): "MOVE_RIGHT"; + case _: throw 'Unsupported action "${action}"'; + } + } + + public static function string2action(value: String): TankAction { + return switch (value) { + case "SHOT": TankAction.SHOT; + case "MOVE_TOP": TankAction.MOVE(Direction.TOP); + case "MOVE_LEFT": TankAction.MOVE(Direction.LEFT); + case "MOVE_BOTTOM": TankAction.MOVE(Direction.BOTTOM); + case "MOVE_RIGHT": TankAction.MOVE(Direction.RIGHT); + case _: throw 'Unsupported value "${value}"'; + } + } + + public function clone(): ActionConfig { + return loads(dumps()); + } + + public function dumps(): String { + var raw: Array = []; + for (item in this.data) { + raw.push({ + action: action2string(item.action), + key: item.key, + }); + } + return Yaml.render(raw, Renderer.options().setFlowLevel(0)); + } + + public static function loads(value: String): ActionConfig { + var raw: Array = Yaml.parse(value, Parser.options().useObjects()); + var data: Array = []; + for (item in raw) { + data.push({ + action: string2action(item.action), + key: item.key, + }); + } + return new ActionConfig(data); + } +} diff --git a/src/client/haxe/ru/m/tankz/control/HumanControl.hx b/src/client/haxe/ru/m/tankz/control/HumanControl.hx index 52904e6..4a31ecf 100644 --- a/src/client/haxe/ru/m/tankz/control/HumanControl.hx +++ b/src/client/haxe/ru/m/tankz/control/HumanControl.hx @@ -5,22 +5,23 @@ import flash.events.KeyboardEvent; import flash.Lib; import flash.ui.Keyboard; import haxe.Timer; -import ru.m.geom.Direction; +import ru.m.tankz.control.ActionConfig; import ru.m.tankz.control.Control; +import ru.m.tankz.storage.SettingsStorage; import ru.m.tankz.Type; -typedef KeyBinding = Map; - class HumanControl extends Control { + @:provide var settings: SettingsStorage; + private var keyBinding:KeyBinding; private var moveQueue:Array; private var shotTimer:Timer; public function new(playerId:PlayerId, controlIndex:Int) { super(playerId); - this.keyBinding = resolve(controlIndex); + this.keyBinding = settings.read(controlIndex).asKeyBinding(); moveQueue = new Array(); Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); Lib.current.stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); @@ -81,27 +82,4 @@ class HumanControl extends Control { private function shot():Void { action(TankAction.SHOT); } - - private static function resolve(controlIndex:Int):KeyBinding { - switch (controlIndex) { - case 0: - return [ - Keyboard.A => TankAction.MOVE(Direction.LEFT), - Keyboard.S => TankAction.MOVE(Direction.BOTTOM), - Keyboard.W => TankAction.MOVE(Direction.TOP), - Keyboard.D => TankAction.MOVE(Direction.RIGHT), - Keyboard.SPACE => TankAction.SHOT - ]; - case 1: - return [ - Keyboard.LEFT => TankAction.MOVE(Direction.LEFT), - Keyboard.DOWN => TankAction.MOVE(Direction.BOTTOM), - Keyboard.UP => TankAction.MOVE(Direction.TOP), - Keyboard.RIGHT => TankAction.MOVE(Direction.RIGHT), - Keyboard.NUMPAD_0 => TankAction.SHOT - ]; - case x: - throw 'Invalid control index ${x}'; - } - } } diff --git a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx b/src/client/haxe/ru/m/tankz/frame/GameFrame.hx index 43e345c..f65305b 100755 --- a/src/client/haxe/ru/m/tankz/frame/GameFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/GameFrame.hx @@ -37,19 +37,24 @@ class GameFrame extends VGroupView { start(Provider.get(GameSave)); } + private function connectGame(game: Game) { + game.engine.connect(render); + game.engine.connect(Provider.get(SoundManager)); + } + private function start(save:GameSave):Void { switch (save.server) { case GameServer.LOCAL: game = new Game(save.state.type); + connectGame(game); game.start(save).then(onGameStateChange).endThen(onGameComplete); timer = new Timer(10); timer.run = updateEngine; case GameServer.NETWORK: game = new NetworkGame(save.state.type); + connectGame(game); network.game = cast game; } - game.engine.connect(render); - game.engine.connect(Provider.get(SoundManager)); content.addEventListener(Event.ENTER_FRAME, redraw); render.draw(game.engine); state.text = stateString(game); diff --git a/src/client/haxe/ru/m/tankz/frame/SettingsFrame.hx b/src/client/haxe/ru/m/tankz/frame/SettingsFrame.hx new file mode 100644 index 0000000..3f13ccb --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/SettingsFrame.hx @@ -0,0 +1,24 @@ +package ru.m.tankz.frame; + +import haxework.gui.frame.IFrameSwitcher; +import haxework.gui.ButtonView; +import haxework.gui.VGroupView; + + +@:template("ru/m/tankz/frame/SettingsFrame.yaml", "ru/m/tankz/Style.yaml") +class SettingsFrame extends VGroupView { + + public static var ID(default, never):String = "settings"; + + @:provide var frameSwitcher:IFrameSwitcher; + + @:view var close:ButtonView; + + private function init():Void { + close.onPress = this; + } + + public function onPress(_):Void { + frameSwitcher.change(StartFrame.ID); + } +} diff --git a/src/client/haxe/ru/m/tankz/frame/SettingsFrame.yaml b/src/client/haxe/ru/m/tankz/frame/SettingsFrame.yaml new file mode 100644 index 0000000..40487cf --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/SettingsFrame.yaml @@ -0,0 +1,24 @@ +--- +pWidth: 100 +pHeight: 100 +views: +- $type: haxework.gui.LabelView + $style: label + pWidth: 100 + height: 20 + text: Settings +- $type: haxework.gui.HGroupView + pWidth: 100 + pHeight: 100 + views: + - $type: ru.m.tankz.frame.settings.SettingsEditor + pWidth: 50 + pHeight: 100 + controlIndex: 0 + - $type: ru.m.tankz.frame.settings.SettingsEditor + pWidth: 50 + pHeight: 100 + controlIndex: 1 +- id: close + $type: haxework.gui.ButtonView + $style: close \ No newline at end of file diff --git a/src/client/haxe/ru/m/tankz/frame/StartFrame.hx b/src/client/haxe/ru/m/tankz/frame/StartFrame.hx index be27444..b95a06c 100644 --- a/src/client/haxe/ru/m/tankz/frame/StartFrame.hx +++ b/src/client/haxe/ru/m/tankz/frame/StartFrame.hx @@ -23,6 +23,7 @@ class StartFrame extends VGroupView { @:view var dota_2p_coop(default, null):ButtonView; @:view var dota_2p_vs(default, null):ButtonView; @:view var network(default, null):ButtonView; + @:view var settings(default, null):ButtonView; @:provide var frameSwitcher:IFrameSwitcher; @:provide var storage:SaveStorage; @@ -35,6 +36,7 @@ class StartFrame extends VGroupView { dota_2p_coop.onPress = this; dota_2p_vs.onPress = this; network.onPress = this; + settings.onPress = this; } public function onShow():Void { @@ -63,6 +65,8 @@ class StartFrame extends VGroupView { startGame(DotaGame.TYPE, DotaGame.PLAYER2_VS); case 'network': frameSwitcher.change(NetworkFrame.ID); + case 'settings': + frameSwitcher.change(SettingsFrame.ID); } } diff --git a/src/client/haxe/ru/m/tankz/frame/StartFrame.yaml b/src/client/haxe/ru/m/tankz/frame/StartFrame.yaml index 72544d9..0a29cda 100644 --- a/src/client/haxe/ru/m/tankz/frame/StartFrame.yaml +++ b/src/client/haxe/ru/m/tankz/frame/StartFrame.yaml @@ -70,3 +70,15 @@ views: $type: haxework.gui.ButtonView text: Network $style: button +# settings +- id: settings + $type: haxework.gui.ButtonView + inLayout: false + hAlign: LEFT + vAlign: BOTTOM + leftMargin: 10 + bottomMargin: 10 + contentSize: true + skin: + $type: haxework.gui.skin.ButtonBitmapSkin + image: "@asset:image:resources/image/ui/settings.png" diff --git a/src/client/haxe/ru/m/tankz/frame/settings/ActionView.hx b/src/client/haxe/ru/m/tankz/frame/settings/ActionView.hx new file mode 100755 index 0000000..2c12630 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/settings/ActionView.hx @@ -0,0 +1,88 @@ +package ru.m.tankz.frame.settings; + +import haxework.gui.ButtonView; +import haxework.gui.HGroupView; +import haxework.gui.LabelView; +import haxework.gui.list.ListView.IListItemView; +import haxework.gui.skin.ColorSkin; +import openfl.Assets; +import openfl.events.KeyboardEvent; +import promhx.Deferred; +import promhx.Promise; +import ru.m.tankz.control.ActionConfig; +import ru.m.tankz.control.Control; + + +class KeyboardMap { + + private var data:Map; + + public function new() { + this.data = new Map(); + var data = Assets.getText("resources/keyboard.txt"); + for (line in data.split("\n")) { + var arr = line.split("\t"); + if (arr.length == 2) { + this.data.set(Std.parseInt(arr[1]), arr[0]); + } + } + + } + + private static var instance: KeyboardMap; + + public static function getName(key: Int): String { + if (instance == null) instance = new KeyboardMap(); + return key == -1 ? "" : instance.data.exists(key) ? instance.data.get(key) : Std.string(key); + } +} + + +@:template("ru/m/tankz/frame/settings/ActionView.yaml", "ru/m/tankz/Style.yaml") +class ActionView extends HGroupView implements IListItemView { + + public var item_index(default, default):Int; + public var data(default, set):ActionItem; + + @:view var action(default, null):LabelView; + @:view var key(default, null):LabelView; + + private var editDeferred: Deferred; + + private function init():Void { + } + + private static function actionLabel(action: TankAction): String { + return ActionConfig.action2string(action); + } + + private static function keyLabel(key: Int): String { + return KeyboardMap.getName(key); + } + + private function set_data(value:ActionItem):ActionItem { + data = value; + action.text = actionLabel(data.action); + key.text = keyLabel(data.key); + return data; + } + + public function edit():Promise { + cast(this.skin, ColorSkin).color = 0x00ff00; + invalidate(); + editDeferred = new Deferred(); + content.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); + return editDeferred.promise(); + } + + private function onKeyDown(event: KeyboardEvent):Void { + content.stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); + cast(this.skin, ColorSkin).color = 0x000000; + invalidate(); + + data.key = event.keyCode; + key.text = keyLabel(data.key); + editDeferred.resolve(data.key); + editDeferred = null; + } +} \ No newline at end of file diff --git a/src/client/haxe/ru/m/tankz/frame/settings/ActionView.yaml b/src/client/haxe/ru/m/tankz/frame/settings/ActionView.yaml new file mode 100644 index 0000000..eb07136 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/settings/ActionView.yaml @@ -0,0 +1,21 @@ +--- +width: 440 +height: 44 +margins: 5 +views: +- id: action + $type: haxework.gui.LabelView + $style: label + pWidth: 50 + pHeight: 100 + text: "" +- id: key + $type: haxework.gui.LabelView + $style: label + pWidth: 50 + pHeight: 100 + text: "" +skin: + $type: haxework.gui.skin.ColorSkin + color: "#000000" + alpha: 0.2 diff --git a/src/client/haxe/ru/m/tankz/frame/settings/SettingsEditor.hx b/src/client/haxe/ru/m/tankz/frame/settings/SettingsEditor.hx new file mode 100644 index 0000000..4b4992a --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/settings/SettingsEditor.hx @@ -0,0 +1,75 @@ +package ru.m.tankz.frame.settings; + +import haxework.gui.LabelView; +import ru.m.tankz.control.ActionConfig; +import promhx.Promise; +import ru.m.tankz.storage.SettingsStorage; +import haxework.gui.ButtonView; +import ru.m.tankz.control.ActionConfig.ActionItem; +import haxework.gui.list.ListView; +import haxework.gui.VGroupView; + + +@:template("ru/m/tankz/frame/settings/SettingsEditor.yaml", "ru/m/tankz/Style.yaml") +class SettingsEditor extends VGroupView { + + public var controlIndex(default, set): Int; + + @:view var label:LabelView; + @:view var list:ListView; + @:view var change:ButtonView; + @:view var clear:ButtonView; + @:view var reset:ButtonView; + + @:provide var storage: SettingsStorage; + + private function init():Void { + change.onPress = this; + clear.onPress = this; + reset.onPress = this; + } + + private function set_controlIndex(value: Int): Int { + this.controlIndex = value; + label.text = 'Player ${controlIndex+1}'; + list.data = storage.read(controlIndex).data; + return this.controlIndex; + } + + public function onPress(view:ButtonView):Void { + switch (view.id) { + case "change": _change(); + case "clear": _clear(); + case "reset": _reset(); + case _: + } + } + + private function _change():Void { + var p: Promise = Promise.promise(0); + for (view in list.items) { + var v: ActionView = cast view; + if (v.data == null) break; + p = p.pipe(function(_):Promise return v.edit()); + } + p.then(function(_) _save()); + } + + private function _clear():Void { + for (item in list.data) { + item.key = -1; + } + list.invalidate(); + _save(); + } + + private function _reset():Void { + list.data = SettingsStorage.getDefault(controlIndex).data; + list.invalidate(); + _save(); + } + + private function _save():Void { + storage.write(controlIndex, new ActionConfig(list.data)); + } +} \ No newline at end of file diff --git a/src/client/haxe/ru/m/tankz/frame/settings/SettingsEditor.yaml b/src/client/haxe/ru/m/tankz/frame/settings/SettingsEditor.yaml new file mode 100644 index 0000000..7003587 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/frame/settings/SettingsEditor.yaml @@ -0,0 +1,27 @@ +$type: haxework.gui.VGroupView +layoutMargin: 10 +views: +- id: label + $type: haxework.gui.LabelView + $style: label +- id: change + $type: haxework.gui.ButtonView + $style: button + text: Change +- id: clear + $type: haxework.gui.ButtonView + $style: button + text: Clear +- id: reset + $type: haxework.gui.ButtonView + $style: button + text: Reset +- id: list + $type: haxework.gui.list.VListView + factory: "@class:ru.m.tankz.frame.settings.ActionView" + pWidth: 100 + pHeight: 100 + scroll: + $type: haxework.gui.list.VScrollView + width: 1 + pHeight: 100 \ No newline at end of file diff --git a/src/client/haxe/ru/m/tankz/storage/SettingsStorage.hx b/src/client/haxe/ru/m/tankz/storage/SettingsStorage.hx new file mode 100644 index 0000000..9c4e926 --- /dev/null +++ b/src/client/haxe/ru/m/tankz/storage/SettingsStorage.hx @@ -0,0 +1,55 @@ +package ru.m.tankz.storage; + +import flash.net.SharedObject; +import flash.ui.Keyboard; +import ru.m.geom.Direction; +import ru.m.tankz.control.ActionConfig; +import ru.m.tankz.control.Control.TankAction; + + +class SettingsStorage { + + private static var TAG(default, never):String = 'SettingsStorage'; + + private var so:SharedObject; + + public function new() { + so = SharedObject.getLocal('settings'); + } + + public function read(index: Int):Null { + var data:String = Reflect.getProperty(so.data, Std.string(index)); + L.d(TAG, 'read: ${data}'); + if (data != null) { + return ActionConfig.loads(data); + } + return getDefault(index); + } + + public function write(index: Int, data: ActionConfig):Void { + L.d(TAG, 'write: ${data}'); + so.setProperty(Std.string(index), data.dumps()); + so.flush(); + } + + public static function getDefault(index: Int): ActionConfig { + return defaults.get(index).clone(); + } + + private static var defaults: Map = [ + 0 => new ActionConfig([ + {action:TankAction.MOVE(Direction.TOP), key:Keyboard.W}, + {action:TankAction.MOVE(Direction.LEFT), key:Keyboard.A}, + {action:TankAction.MOVE(Direction.BOTTOM), key:Keyboard.S}, + {action:TankAction.MOVE(Direction.RIGHT), key:Keyboard.D}, + {action:TankAction.SHOT, key:Keyboard.SPACE}, + ]), + 1 => new ActionConfig([ + {action:TankAction.MOVE(Direction.TOP), key:Keyboard.UP}, + {action:TankAction.MOVE(Direction.LEFT), key:Keyboard.LEFT}, + {action:TankAction.MOVE(Direction.BOTTOM), key:Keyboard.RIGHT}, + {action:TankAction.MOVE(Direction.RIGHT), key:Keyboard.DOWN}, + {action:TankAction.SHOT, key:Keyboard.NUMPAD_0}, + ]), + ]; +} diff --git a/src/client/resources/image/ui/close.png b/src/client/resources/image/ui/close.png new file mode 100644 index 0000000000000000000000000000000000000000..1867d863596b2e738a21d342a01d60d86eb92fd0 GIT binary patch literal 2677 zcmV-*3X1iKP)3Ia() zK~#9!?VDX}T*Vc~e`js4y>=k6P2zx?q@f6C=?74FXepvaDt+h!LVc|&v3sjfQK?U@ zD(!ADyB1WcK&pgLL0#_~@J1UXr1H?d^h2szk`M@r^U;K;wTwyHkT`_cJEsqKHokj3 zb3bfXb=6#Hbv$$DSSg9xaEW2o3NYp7RHwKSgxs-T^!ed;u5)2JElj{)!RWeb*PMABffWJM?!6xMJy2r0jaP9HHIc$G~CW*T9jL z^}TIB+vH`yAAv6k@O{vGKn!RBWB{~i=>SN-)rfd~pQQu#ebLhXNIf7|K$k$4K(Bx- z$I44q!qIjeOP6BpyPEbFkmpx4G)z)x3RKMp*fl>v*u@WY@Ff_xG5KC1yHviD46Pj;zE zD976;^^cE}HlDHNBFK%P$3gxI`a6(cg}l0K<+y5}$DeNj!$r`q0uP3ZrxQ+sMySTh zzIqKepb~qJqrEkBJqn-+{i5w9v=jQbP)qdz;AjFU8P^!*|*3A%Shqwa_=)`jMVu#)e$);D_I;@P{dJ(+dyXD$2YCBX(QfZVcT zbBD4p0DxWL;=PjW2kndO$?jeh&mJbScS(4kx4i+q0Q}vdd0ovITzwd&GoTcc01-MA zImM(GdHq-D2O<7)PpPd15tK2OYBlT=D`f1?Lu~Wi?peerw7!T%-Y66># z7D0zW79BoAZVe!2b)#iAsRo$vSaaH}+!_$Ix_0nY-k3`geUCgMGBKg%jW@)cJh?83 zT7xQun{U>_Ll240&uiz^R}=gBPKkBd028ss4vs27VSHRmv$M$9*wxeE%G4BBo_um$ zk}W>*gchf!R;>TIbNbP3w_!f`z}eo1Cwv-ENYVfoGV3BOVzl_uOTy@A=wF0WN^xq6 zVzcRNpGFmApwXZ>H6?1tLlqetlj6%Sd%r_Hh;&Uhz<3auO9T2Icp#L3{n{=q)@rIE zT&~qrGT4wVju@Jr*1>9Z)p)9^efQt*9H-zxm}}Mm7bjiV+W>m;q5z0U4+UhfT4k`= zO!X-=gx)gPXfRl7{3$QAC^)Q&om)H63a; zSM`fh0}M5rI#jPa$LW6B;(@)Ds?Y3KDRsyA3jnee=RZTFl zaZAl6rCQA^c@g1KyDf`PJ+-R8%X^G^nQJ};eEz(|Xdmc5%Vmr)x}{R_O0ZO|s;aVB zulMZvk!Dj%wOXR&FSc5o4+1TEzJqKwE1L%3@WVBt0UZY&0L}%0TxhitHDS0`W4O_{ z+HbhgU^qqc7g{Yj7X%C>%x_Xot-Me;4N*D0v?Az25MT-g-TLUGUWty>>#Cg&fR3c> z`Sa~I=Yl{>DW^y@LS!=9fTUxv#|uyzQ5;Z_o8M*UL-P>$B?;-Nibt6Ha4ah?~AfwGD+Y-+C zI8NABt1;?9j7d}z?kCn|158XK^7!-PjfRdUAUq!(wTSVoMT}YID|mbu)@uWZaWV@v zAY+XNWA%C>!b{SGv09C>X0r#0W{D%@@dk56gtBOW*!DZ7r*+)p&v)Cu_rePZ=&pVH zyzRzoHARH?YqhKXewqfD9KJw*N<*Fp*sHIDm?HAjU_wmsE@#3q_ey&=V`JKbtA8w5IO%SVF%712Ej zIN^p`O%<50*Htni!7NeX%s9YAY=McA@ z$kO&|Rd-aYJ^eLd@2?vNm<$N8uyrdtr>7Gof1=frcY=UPkHk74lfXMcASY7d2|K5! zDQw;9MS?Emx^4|fy3a4&b5EjIccR_qa1iLO3`lYp=;0vXM7!PoN^p^K+ab9(>&9*F@u+iG#JQqjF(9^a~dKDrF-1wB})FdMT8fS!8oH5N~wcJ|kt z8qnvc`yMdy4UoN#xIp(b5L*@-3q1JBE3zcQ$W1rNrMWrYY&7I(z0Rj>|7iOx6p&Hi zo&Ede{K5j)?cOa{&Y$PVbI-|vef!wy=m&5%%qQ%z33I@k;rn^u7inp7hk(yL1AN`4 zS9Vh@J2oTJmvDF{`~V8T4&X*#dS;HN0LJtCd_CjI^G~8CwkKV2dy{b-Vj5_ACA?}r zu{p!`{p)#>rAt2mzHP04_cVxFS4}8qsWU5>BUc+=zj$AO-vawrw)SvVAoL?Zeh$2w z18XNmWU}N2XU#G8Wv;~Aoe38&R?t869pAp^_rQGu`ZM5u%R(2&NzsnANIp-$c)PyP zhVjc4hW!EfN?ry49JIhe?*;je%_5hCynd4-hj_g?#_{?N=uwd0fX=S0?X5WY$-@9F zblev`M|XNKwCk|-{TB%vT-O24tzO#;z+-H{a|{1l|2FqB8~AT?@#l8nlWe|!oLmA< j0Y|y^TzjrPS)YFcqWr+{D`4U*00000NkvXXu0mjfGFA+j literal 0 HcmV?d00001 diff --git a/src/client/resources/image/ui/close.source.png b/src/client/resources/image/ui/close.source.png new file mode 100644 index 0000000000000000000000000000000000000000..a37916924475b07d1d4be07ef1f8ddd397edd927 GIT binary patch literal 7252 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 v-;n)h+Dy+Ywt7odF6O?=y?f1HmT>26Ruhi>>D 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%0A^02j6!Kvbg+2k9IN68X@_ah5QM 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 literal 0 HcmV?d00001 diff --git a/src/client/resources/keyboard.txt b/src/client/resources/keyboard.txt new file mode 100644 index 0000000..2a773a9 --- /dev/null +++ b/src/client/resources/keyboard.txt @@ -0,0 +1,99 @@ +BACKSPACE 8 +TAB 9 +ENTER 13 +SHIFT 16 +CTRL 17 +ALT 18 +PAUSE/BREAK 19 +CAPS LOCK 20 +ESCAPE 27 +SPACE 32 +PAGE UP 33 +PAGE DOWN 34 +END 35 +HOME 36 +LEFT ARROW 37 +UP ARROW 38 +RIGHT ARROW 39 +DOWN ARROW 40 +INSERT 45 +DELETE 46 +0 48 +1 49 +2 50 +3 51 +4 52 +5 53 +6 54 +7 55 +8 56 +9 57 +A 65 +B 66 +C 67 +D 68 +E 69 +F 70 +G 71 +H 72 +I 73 +J 74 +K 75 +L 76 +M 77 +N 78 +O 79 +P 80 +Q 81 +R 82 +S 83 +T 84 +U 85 +V 86 +W 87 +X 88 +Y 89 +Z 90 +LEFT WINDOW KEY 91 +RIGHT WINDOW KEY 92 +SELECT KEY 93 +NUMPAD 0 96 +NUMPAD 1 97 +NUMPAD 2 98 +NUMPAD 3 99 +NUMPAD 4 100 +NUMPAD 5 101 +NUMPAD 6 102 +NUMPAD 7 103 +NUMPAD 8 104 +NUMPAD 9 105 +MULTIPLY 106 +ADD 107 +SUBTRACT 109 +DECIMAL POINT 110 +DIVIDE 111 +F1 112 +F2 113 +F3 114 +F4 115 +F5 116 +F6 117 +F7 118 +F8 119 +F9 120 +F10 121 +F11 122 +F12 123 +NUM LOCK 144 +SCROLL LOCK 145 +SEMI-COLON 186 +EQUAL SIGN 187 +COMMA 188 +DASH 189 +PERIOD 190 +FORWARD SLASH 191 +GRAVE ACCENT 192 +OPEN BRACKET 219 +BACK SLASH 220 +CLOSE BRAKET 221 +SINGLE QUOTE 222 \ No newline at end of file diff --git a/src/common/haxe/ru/m/geom/Direction.hx b/src/common/haxe/ru/m/geom/Direction.hx index 4541324..5169f3f 100644 --- a/src/common/haxe/ru/m/geom/Direction.hx +++ b/src/common/haxe/ru/m/geom/Direction.hx @@ -5,10 +5,10 @@ import haxe.ds.IntMap; class Direction { private static var directions:IntMap = new IntMap(); - public static var LEFT(default, null) = new Direction(-1, 0); - public static var TOP(default, null) = new Direction(0, -1); - public static var RIGHT(default, null) = new Direction(1, 0); - public static var BOTTOM(default, null) = new Direction(0, 1); + public static var LEFT(default, never) = new Direction(-1, 0); + public static var TOP(default, never) = new Direction(0, -1); + public static var RIGHT(default, never) = new Direction(1, 0); + public static var BOTTOM(default, never) = new Direction(0, 1); public var x(default, null):Int; public var y(default, null):Int;