From 2bc5a7665ed8bcd72ed428416f0607f13a626497 Mon Sep 17 00:00:00 2001 From: Greenlamp Date: Sun, 12 May 2024 16:10:25 +0200 Subject: [PATCH] first step of keyboard rebinding --- public/images/inputs/keyboard.json | 644 +++++++++++++++++++++++++ public/images/inputs/keyboard.png | Bin 0 -> 51888 bytes src/configs/keyboard.ts | 176 +++++++ src/loading-scene.ts | 1 + src/system/settings-keyboard.ts | 87 ++++ src/ui/keyboard-binding-ui-handler.ts | 89 ++++ src/ui/settings-gamepad-ui-handler.ts | 10 +- src/ui/settings-keyboard-ui-handler.ts | 89 ++++ src/ui/settings-ui-handler.ts | 11 +- src/ui/ui.ts | 6 + 10 files changed, 1109 insertions(+), 4 deletions(-) create mode 100644 public/images/inputs/keyboard.json create mode 100644 public/images/inputs/keyboard.png create mode 100644 src/configs/keyboard.ts create mode 100644 src/system/settings-keyboard.ts create mode 100644 src/ui/keyboard-binding-ui-handler.ts create mode 100644 src/ui/settings-keyboard-ui-handler.ts diff --git a/public/images/inputs/keyboard.json b/public/images/inputs/keyboard.json new file mode 100644 index 00000000000..e86dcc1d5ac --- /dev/null +++ b/public/images/inputs/keyboard.json @@ -0,0 +1,644 @@ +{"frames": [ + +{ + "filename": "T_0_Key_Dark.png", + "frame": {"x":0,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_1_Key_Dark.png", + "frame": {"x":128,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_2_Key_Dark.png", + "frame": {"x":256,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_3_Key_Dark-1.png", + "frame": {"x":384,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_3_Key_Dark.png", + "frame": {"x":512,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_5_Key_Dark.png", + "frame": {"x":640,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_6_Key_Dark.png", + "frame": {"x":768,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_7_Key_Dark.png", + "frame": {"x":896,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_8_Key_Dark.png", + "frame": {"x":1024,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_9_Key_Dark.png", + "frame": {"x":1152,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_A_Key_Dark.png", + "frame": {"x":1280,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Alt_Key_Dark.png", + "frame": {"x":1408,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Asterisk_Key_Dark.png", + "frame": {"x":1536,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_B_Key_Dark.png", + "frame": {"x":1664,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Backspace_Alt_Key_Dark.png", + "frame": {"x":1792,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_BackSpace_Key_Dark.png", + "frame": {"x":1920,"y":0,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Brackets_L_Key_Dark.png", + "frame": {"x":0,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Brackets_R_Key_Dark.png", + "frame": {"x":128,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_C_Key_Dark.png", + "frame": {"x":256,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Crtl_Key_Dark.png", + "frame": {"x":384,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_D_Key_Dark.png", + "frame": {"x":512,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Del_Key_Dark.png", + "frame": {"x":640,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Down_Key_Dark.png", + "frame": {"x":768,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_E_Key_Dark.png", + "frame": {"x":896,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_End_Key_Dark.png", + "frame": {"x":1024,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Enter_Alt_Key_Dark.png", + "frame": {"x":1152,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Esc_Key_Dark.png", + "frame": {"x":1280,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F1_Key_Dark.png", + "frame": {"x":1408,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F2_Key_Dark.png", + "frame": {"x":1536,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F3_Key_Dark.png", + "frame": {"x":1664,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F4_Key_Dark.png", + "frame": {"x":1792,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F5_Key_Dark.png", + "frame": {"x":1920,"y":128,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F6_Key_Dark.png", + "frame": {"x":0,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F7_Key_Dark.png", + "frame": {"x":128,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F8_Key_Dark.png", + "frame": {"x":256,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F9_Key_Dark.png", + "frame": {"x":384,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F10_Key_Dark.png", + "frame": {"x":512,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F11_Key_Dark.png", + "frame": {"x":640,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F12_Key_Dark.png", + "frame": {"x":768,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_F_Key_Dark.png", + "frame": {"x":896,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_G_Key_Dark.png", + "frame": {"x":1024,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_H_Key_Dark.png", + "frame": {"x":1152,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Home_Key_Dark.png", + "frame": {"x":1280,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_I_Key_Dark.png", + "frame": {"x":1408,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Ins_Key_Dark.png", + "frame": {"x":1536,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_J_Key_Dark.png", + "frame": {"x":1664,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_K_Key_Dark.png", + "frame": {"x":1792,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Keyboard_R_Key_Dark-1.png", + "frame": {"x":1920,"y":256,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Keyboard_R_Key_Dark.png", + "frame": {"x":0,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_L_Key_Dark.png", + "frame": {"x":128,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Left_Key_Dark.png", + "frame": {"x":256,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_M_Key_Dark.png", + "frame": {"x":384,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Minus_Key_Dark.png", + "frame": {"x":512,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_N_Key_Dark.png", + "frame": {"x":640,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_O_Key_Dark.png", + "frame": {"x":768,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_P_Key_Dark.png", + "frame": {"x":896,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_PageDown_Key_Dark.png", + "frame": {"x":1024,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_PageUp_Key_Dark.png", + "frame": {"x":1152,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Plus_Tall_Key_Dark.png", + "frame": {"x":1280,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Q_Key_Dark.png", + "frame": {"x":1408,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Quotation_Key_Dark.png", + "frame": {"x":1536,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_R_Key_Dark.png", + "frame": {"x":1664,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Right_Key_Dark.png", + "frame": {"x":1792,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_S_Key_Dark.png", + "frame": {"x":1920,"y":384,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Semicolon_Key_Dark.png", + "frame": {"x":0,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Shift_Key_Dark.png", + "frame": {"x":128,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Shift_Super_Wide_Key_Dark.png", + "frame": {"x":256,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Slash_Key_Dark.png", + "frame": {"x":384,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Space_Key_Dark.png", + "frame": {"x":512,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_T_Key_Dark.png", + "frame": {"x":640,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Tab_Key_Dark.png", + "frame": {"x":768,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Tilde_Key_Dark.png", + "frame": {"x":896,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_U_Key_Dark.png", + "frame": {"x":1024,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Up_Key_Dark.png", + "frame": {"x":1152,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_V_Key_Dark.png", + "frame": {"x":1280,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_W_Key_Dark.png", + "frame": {"x":1408,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_X_Key_Dark.png", + "frame": {"x":1536,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Y_Key_Dark.png", + "frame": {"x":1664,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}, +{ + "filename": "T_Z_Key_Dark.png", + "frame": {"x":1792,"y":512,"w":128,"h":128}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, + "sourceSize": {"w":128,"h":128} +}], +"meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "1.0", + "image": "keyboard.png", + "format": "RGBA8888", + "size": {"w":2048,"h":640}, + "scale": "1", + "smartupdate": "$TexturePacker:SmartUpdate:c63c48370eadc7845a8cc15895f925a0:5ddaf57801c3bd84e190cd9b4786d52d:bad03abb89ad027d879c383c13fd51bc$" +} +} diff --git a/public/images/inputs/keyboard.png b/public/images/inputs/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..af019a60da1d842bd6f180290b5dd59a71db73c9 GIT binary patch literal 51888 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 { + scene.ui.revertMode(); + (scene.ui.getHandler() as SettingsKeyboardUiHandler).updateBindings(); + return success; + } + scene.ui.setOverlayMode(Mode.KEYBOARD_BINDING, { + target: setting, + cancelHandler: cancelHandler, + }) + } + } + break; + } + return true; + +} \ No newline at end of file diff --git a/src/ui/keyboard-binding-ui-handler.ts b/src/ui/keyboard-binding-ui-handler.ts new file mode 100644 index 00000000000..ba237215bef --- /dev/null +++ b/src/ui/keyboard-binding-ui-handler.ts @@ -0,0 +1,89 @@ +import UiHandler from "#app/ui/ui-handler"; +import BattleScene from "#app/battle-scene"; +import {Mode} from "#app/ui/ui"; +import {Button} from "#app/enums/buttons"; + + +export default class KeyboardBindingUiHandler extends UiHandler { + constructor(scene: BattleScene, mode?: Mode) { + super(scene, mode); + } + + setup() { + const ui = this.getUi(); + } + + updateBindings(): void { + + } + + show(args: any[]): boolean { + super.show(args); + + // Move the settings container to the end of the UI stack to ensure it is displayed on top. + // this.getUi().moveTo(this.settingsContainer, this.getUi().length - 1); + + // Hide any tooltips that might be visible before showing the settings container. + this.getUi().hideTooltip(); + + // Return true to indicate the UI was successfully shown. + return true; + } + + processInput(button: Button): boolean { + const ui = this.getUi(); + return false; + } + + setCursor(cursor: integer): boolean { + const ret = super.setCursor(cursor); + return ret; + } + + setOptionCursor(settingIndex: integer, cursor: integer, save?: boolean): boolean { + return true; + } + + setScrollCursor(scrollCursor: integer): boolean { + return true; + } + + // updateSettingsScroll(): void { + // // Return immediately if the options container is not initialized. + // if (!this.optionsContainer) return; + // + // // Set the vertical position of the options container based on the current scroll cursor, multiplying by the item height. + // this.optionsContainer.setY(-16 * this.scrollCursor); + // + // // Iterate over all setting labels to update their visibility. + // for (let s = 0; s < this.settingLabels.length; s++) { + // // Determine if the current setting should be visible based on the scroll position. + // const visible = s >= this.scrollCursor && s < this.scrollCursor + 9; + // + // // Set the visibility of the setting label and its corresponding options. + // this.settingLabels[s].setVisible(visible); + // for (let option of this.optionValueLabels[s]) + // option.setVisible(visible); + // } + // } + + clear(): void { + super.clear(); + + // Hide the settings container to remove it from the view. + // this.settingsContainer.setVisible(false); + + // Remove the cursor from the UI. + this.eraseCursor(); + } + + eraseCursor(): void { + // Check if a cursor object exists. + // if (this.cursorObj) + // this.cursorObj.destroy(); // Destroy the cursor object to clean up resources. + // + // // Set the cursor object reference to null to fully dereference it. + // this.cursorObj = null; + } + +} \ No newline at end of file diff --git a/src/ui/settings-gamepad-ui-handler.ts b/src/ui/settings-gamepad-ui-handler.ts index 0e12d92507b..f78888238b9 100644 --- a/src/ui/settings-gamepad-ui-handler.ts +++ b/src/ui/settings-gamepad-ui-handler.ts @@ -78,12 +78,17 @@ export default class SettingsGamepadUiHandler extends UiHandler { gamepadText.setOrigin(0, 0); gamepadText.setPositionRelative(headerBg, 50, 4); + const keyboardText = addTextObject(this.scene, 0, 0, 'Keyboard', TextStyle.SETTINGS_LABEL); + keyboardText.setOrigin(0, 0); + keyboardText.setPositionRelative(headerBg, 97, 4); + this.optionsBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - headerBg.height - 2); this.optionsBg.setOrigin(0, 0); this.settingsContainer.add(headerBg); this.settingsContainer.add(headerText); this.settingsContainer.add(gamepadText); + this.settingsContainer.add(keyboardText); this.settingsContainer.add(this.optionsBg); /// Initialize a new configuration "screen" for each type of gamepad. @@ -367,10 +372,13 @@ export default class SettingsGamepadUiHandler extends UiHandler { success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); break; case Button.CYCLE_FORM: // Change the UI mode to SETTINGS mode. - case Button.CYCLE_SHINY: this.scene.ui.setMode(Mode.SETTINGS) success = true; break; + case Button.CYCLE_SHINY: + this.scene.ui.setMode(Mode.SETTINGS_KEYBOARD) + success = true; + break; } } diff --git a/src/ui/settings-keyboard-ui-handler.ts b/src/ui/settings-keyboard-ui-handler.ts new file mode 100644 index 00000000000..6b01be325d8 --- /dev/null +++ b/src/ui/settings-keyboard-ui-handler.ts @@ -0,0 +1,89 @@ +import UiHandler from "#app/ui/ui-handler"; +import BattleScene from "#app/battle-scene"; +import {Mode} from "#app/ui/ui"; +import {Button} from "#app/enums/buttons"; + + +export default class SettingsKeyboardUiHandler extends UiHandler { + constructor(scene: BattleScene, mode?: Mode) { + super(scene, mode); + } + + setup() { + const ui = this.getUi(); + } + + updateBindings(): void { + + } + + show(args: any[]): boolean { + super.show(args); + + // Move the settings container to the end of the UI stack to ensure it is displayed on top. + // this.getUi().moveTo(this.settingsContainer, this.getUi().length - 1); + + // Hide any tooltips that might be visible before showing the settings container. + this.getUi().hideTooltip(); + + // Return true to indicate the UI was successfully shown. + return true; + } + + processInput(button: Button): boolean { + const ui = this.getUi(); + return false; + } + + setCursor(cursor: integer): boolean { + const ret = super.setCursor(cursor); + return ret; + } + + setOptionCursor(settingIndex: integer, cursor: integer, save?: boolean): boolean { + return true; + } + + setScrollCursor(scrollCursor: integer): boolean { + return true; + } + + // updateSettingsScroll(): void { + // // Return immediately if the options container is not initialized. + // if (!this.optionsContainer) return; + // + // // Set the vertical position of the options container based on the current scroll cursor, multiplying by the item height. + // this.optionsContainer.setY(-16 * this.scrollCursor); + // + // // Iterate over all setting labels to update their visibility. + // for (let s = 0; s < this.settingLabels.length; s++) { + // // Determine if the current setting should be visible based on the scroll position. + // const visible = s >= this.scrollCursor && s < this.scrollCursor + 9; + // + // // Set the visibility of the setting label and its corresponding options. + // this.settingLabels[s].setVisible(visible); + // for (let option of this.optionValueLabels[s]) + // option.setVisible(visible); + // } + // } + + clear(): void { + super.clear(); + + // Hide the settings container to remove it from the view. + // this.settingsContainer.setVisible(false); + + // Remove the cursor from the UI. + this.eraseCursor(); + } + + eraseCursor(): void { + // Check if a cursor object exists. + // if (this.cursorObj) + // this.cursorObj.destroy(); // Destroy the cursor object to clean up resources. + // + // // Set the cursor object reference to null to fully dereference it. + // this.cursorObj = null; + } + +} \ No newline at end of file diff --git a/src/ui/settings-ui-handler.ts b/src/ui/settings-ui-handler.ts index 678b5bca823..691e5cb8f36 100644 --- a/src/ui/settings-ui-handler.ts +++ b/src/ui/settings-ui-handler.ts @@ -50,6 +50,10 @@ export default class SettingsUiHandler extends UiHandler { gamepadText.setOrigin(0, 0); gamepadText.setPositionRelative(headerBg, 50, 4); + const keyboardText = addTextObject(this.scene, 0, 0, 'Keyboard', TextStyle.SETTINGS_LABEL); + keyboardText.setOrigin(0, 0); + keyboardText.setPositionRelative(headerBg, 97, 4); + this.optionsBg = addWindow(this.scene, 0, headerBg.height, (this.scene.game.canvas.width / 6) - 2, (this.scene.game.canvas.height / 6) - headerBg.height - 2); this.optionsBg.setOrigin(0, 0); @@ -97,6 +101,7 @@ export default class SettingsUiHandler extends UiHandler { this.settingsContainer.add(headerBg); this.settingsContainer.add(headerText); this.settingsContainer.add(gamepadText); + this.settingsContainer.add(keyboardText); this.settingsContainer.add(this.optionsBg); this.settingsContainer.add(this.optionsContainer); @@ -187,11 +192,11 @@ export default class SettingsUiHandler extends UiHandler { if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); break; - case Button.CYCLE_FORM: - this.scene.ui.setMode(Mode.SETTINGS_GAMEPAD) + case Button.CYCLE_FORM: // to the left + this.scene.ui.setMode(Mode.SETTINGS_KEYBOARD) success = true; break; - case Button.CYCLE_SHINY: + case Button.CYCLE_SHINY: // to the right this.scene.ui.setMode(Mode.SETTINGS_GAMEPAD) success = true; break; diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 3e6ba979551..2f23a6035e8 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -38,6 +38,8 @@ import OutdatedModalUiHandler from './outdated-modal-ui-handler'; import SessionReloadModalUiHandler from './session-reload-modal-ui-handler'; import {Button} from "../enums/buttons"; import GamepadBindingUiHandler from "./gamepad-binding-ui-handler"; +import SettingsKeyboardUiHandler from "#app/ui/settings-keyboard-ui-handler"; +import KeyboardBindingUiHandler from "#app/ui/keyboard-binding-ui-handler"; export enum Mode { MESSAGE, @@ -60,6 +62,8 @@ export enum Mode { SETTINGS, SETTINGS_GAMEPAD, GAMEPAD_BINDING, + SETTINGS_KEYBOARD, + KEYBOARD_BINDING, ACHIEVEMENTS, GAME_STATS, VOUCHERS, @@ -145,6 +149,8 @@ export default class UI extends Phaser.GameObjects.Container { new SettingsUiHandler(scene), new SettingsGamepadUiHandler(scene), new GamepadBindingUiHandler(scene), + new SettingsKeyboardUiHandler(scene), + new KeyboardBindingUiHandler(scene), new AchvsUiHandler(scene), new GameStatsUiHandler(scene), new VouchersUiHandler(scene),