From 6366aa61dd3a379804bb89e165b05bae67689229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D1=97=D0=BB=20=D0=93=D1=80=D0=B8?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=27=D1=94=D0=B2?= Date: Mon, 21 Jul 2025 16:55:28 +0300 Subject: [PATCH] Split KEYCODES from KeyActionMapper Move KEYCODES and related functions to a separate file. No further refactoring is done yet. --- src/js/core/keycodes.ts | 194 +++++++++++++++++++ src/js/core/modal_dialog_elements.ts | 2 +- src/js/game/hud/parts/keybinding_overlay.js | 9 +- src/js/game/key_action_mapper.js | 199 +------------------- src/js/states/keybindings.js | 3 +- 5 files changed, 200 insertions(+), 207 deletions(-) create mode 100644 src/js/core/keycodes.ts diff --git a/src/js/core/keycodes.ts b/src/js/core/keycodes.ts new file mode 100644 index 00000000..d2e1df33 --- /dev/null +++ b/src/js/core/keycodes.ts @@ -0,0 +1,194 @@ +import { T } from "@/translations"; + +export function keyToKeyCode(key: string) { + return key.toUpperCase().charCodeAt(0); +} + +export const KEYCODES = { + Tab: 9, + Enter: 13, + + Shift: 16, + Ctrl: 17, + Alt: 18, + + Escape: 27, + + Space: 32, + + ArrowLeft: 37, + ArrowUp: 38, + ArrowRight: 39, + ArrowDown: 40, + + Delete: 46, + + F1: 112, + F2: 113, + F3: 114, + F4: 115, + F5: 116, + F6: 117, + F7: 118, + F8: 119, + F9: 120, + F10: 121, + F11: 122, + F12: 123, + + Plus: 187, + Minus: 189, +}; + +export const KEYCODE_LMB = 1; +export const KEYCODE_MMB = 2; +export const KEYCODE_RMB = 3; + +export function getStringForKeyCode(code: number): string { + // @todo: Refactor into dictionary + switch (code) { + case KEYCODE_LMB: + return "LMB"; + case KEYCODE_MMB: + return "MMB"; + case KEYCODE_RMB: + return "RMB"; + case 4: + return "MB4"; + case 5: + return "MB5"; + case 8: + return "⌫"; + case KEYCODES.Tab: + return T.global.keys.tab; + case KEYCODES.Enter: + return "⏎"; + case KEYCODES.Shift: + return "⇪"; + case KEYCODES.Ctrl: + return T.global.keys.control; + case KEYCODES.Alt: + return T.global.keys.alt; + case 19: + return "PAUSE"; + case 20: + return "CAPS"; + case KEYCODES.Escape: + return T.global.keys.escape; + case KEYCODES.Space: + return T.global.keys.space; + case 33: + return "PGUP"; + case 34: + return "PGDOWN"; + case 35: + return "END"; + case 36: + return "HOME"; + case KEYCODES.ArrowLeft: + return "⬅"; + case KEYCODES.ArrowUp: + return "⬆"; + case KEYCODES.ArrowRight: + return "➡"; + case KEYCODES.ArrowDown: + return "⬇"; + case 44: + return "PRNT"; + case 45: + return "INS"; + case 46: + return "DEL"; + case 93: + return "SEL"; + case 96: + return "NUM 0"; + case 97: + return "NUM 1"; + case 98: + return "NUM 2"; + case 99: + return "NUM 3"; + case 100: + return "NUM 4"; + case 101: + return "NUM 5"; + case 102: + return "NUM 6"; + case 103: + return "NUM 7"; + case 104: + return "NUM 8"; + case 105: + return "NUM 9"; + case 106: + return "*"; + case 107: + return "+"; + case 109: + return "-"; + case 110: + return "."; + case 111: + return "/"; + case KEYCODES.F1: + return "F1"; + case KEYCODES.F2: + return "F2"; + case KEYCODES.F3: + return "F3"; + case KEYCODES.F4: + return "F4"; + case KEYCODES.F5: + return "F5"; + case KEYCODES.F6: + return "F6"; + case KEYCODES.F7: + return "F7"; + case KEYCODES.F8: + return "F8"; + case KEYCODES.F9: + return "F9"; + case KEYCODES.F10: + return "F10"; + case KEYCODES.F11: + return "F11"; + case KEYCODES.F12: + return "F12"; + + case 144: + return "NUMLOCK"; + case 145: + return "SCRLOCK"; + case 182: + return "COMP"; + case 183: + return "CALC"; + case 186: + return ";"; + case 187: + return "+"; + case 188: + return ","; + case 189: + return "-"; + case 190: + return "."; + case 191: + return "/"; + case 192: + return "`"; + case 219: + return "["; + case 220: + return "\\"; + case 221: + return "]"; + case 222: + return "'"; + } + + return (48 <= code && code <= 57) || (65 <= code && code <= 90) + ? String.fromCharCode(code) + : "[" + code + "]"; +} diff --git a/src/js/core/modal_dialog_elements.ts b/src/js/core/modal_dialog_elements.ts index 57a01a1d..90353132 100644 --- a/src/js/core/modal_dialog_elements.ts +++ b/src/js/core/modal_dialog_elements.ts @@ -1,11 +1,11 @@ import type { Application } from "../application"; -import { getStringForKeyCode } from "../game/key_action_mapper"; import { SOUNDS } from "../platform/sound"; import { T } from "../translations"; import { ClickDetector, ClickDetectorConstructorArgs } from "./click_detector"; import { globalConfig } from "./config"; import { InputReceiver, KeydownEvent } from "./input_receiver"; +import { getStringForKeyCode } from "./keycodes"; import { createLogger } from "./logging"; import { FormElement } from "./modal_dialog_forms"; import { Signal, STOP_PROPAGATION } from "./signal"; diff --git a/src/js/game/hud/parts/keybinding_overlay.js b/src/js/game/hud/parts/keybinding_overlay.js index 1d21fb5b..fbce79f2 100644 --- a/src/js/game/hud/parts/keybinding_overlay.js +++ b/src/js/game/hud/parts/keybinding_overlay.js @@ -1,12 +1,7 @@ +import { getStringForKeyCode, KEYCODE_LMB, KEYCODE_MMB, KEYCODE_RMB } from "@/core/keycodes"; import { makeDiv } from "../../../core/utils"; import { T } from "../../../translations"; -import { - getStringForKeyCode, - KEYCODE_LMB, - KEYCODE_MMB, - KEYCODE_RMB, - KEYMAPPINGS, -} from "../../key_action_mapper"; +import { KEYMAPPINGS } from "../../key_action_mapper"; import { enumHubGoalRewards } from "../../tutorial_goals"; import { BaseHUDPart } from "../base_hud_part"; import { DynamicDomAttach } from "../dynamic_dom_attach"; diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js index d460a459..7578f948 100644 --- a/src/js/game/key_action_mapper.js +++ b/src/js/game/key_action_mapper.js @@ -4,50 +4,11 @@ import { InputReceiver } from "../core/input_receiver"; import { GameRoot } from "./root"; /* typehints:end */ +import { getStringForKeyCode, KEYCODES, keyToKeyCode } from "@/core/keycodes"; import { IS_MOBILE } from "../core/config"; import { Signal, STOP_PROPAGATION } from "../core/signal"; import { T } from "../translations"; -export function keyToKeyCode(str) { - return str.toUpperCase().charCodeAt(0); -} - -export const KEYCODES = { - Tab: 9, - Enter: 13, - - Shift: 16, - Ctrl: 17, - Alt: 18, - - Escape: 27, - - Space: 32, - - ArrowLeft: 37, - ArrowUp: 38, - ArrowRight: 39, - ArrowDown: 40, - - Delete: 46, - - F1: 112, - F2: 113, - F3: 114, - F4: 115, - F5: 116, - F6: 117, - F7: 118, - F8: 119, - F9: 120, - F10: 121, - F11: 122, - F12: 123, - - Plus: 187, - Minus: 189, -}; - export const KEYMAPPINGS = { // Make sure mods come first so they can override everything mods: {}, @@ -163,164 +124,6 @@ for (const categoryId in KEYMAPPINGS) { } } -export const KEYCODE_LMB = 1; -export const KEYCODE_MMB = 2; -export const KEYCODE_RMB = 3; - -/** - * Returns a keycode -> string - * @param {number} code - * @returns {string} - */ -export function getStringForKeyCode(code) { - // @todo: Refactor into dictionary - switch (code) { - case KEYCODE_LMB: - return "LMB"; - case KEYCODE_MMB: - return "MMB"; - case KEYCODE_RMB: - return "RMB"; - case 4: - return "MB4"; - case 5: - return "MB5"; - case 8: - return "⌫"; - case KEYCODES.Tab: - return T.global.keys.tab; - case KEYCODES.Enter: - return "⏎"; - case KEYCODES.Shift: - return "⇪"; - case KEYCODES.Ctrl: - return T.global.keys.control; - case KEYCODES.Alt: - return T.global.keys.alt; - case 19: - return "PAUSE"; - case 20: - return "CAPS"; - case KEYCODES.Escape: - return T.global.keys.escape; - case KEYCODES.Space: - return T.global.keys.space; - case 33: - return "PGUP"; - case 34: - return "PGDOWN"; - case 35: - return "END"; - case 36: - return "HOME"; - case KEYCODES.ArrowLeft: - return "⬅"; - case KEYCODES.ArrowUp: - return "⬆"; - case KEYCODES.ArrowRight: - return "➡"; - case KEYCODES.ArrowDown: - return "⬇"; - case 44: - return "PRNT"; - case 45: - return "INS"; - case 46: - return "DEL"; - case 93: - return "SEL"; - case 96: - return "NUM 0"; - case 97: - return "NUM 1"; - case 98: - return "NUM 2"; - case 99: - return "NUM 3"; - case 100: - return "NUM 4"; - case 101: - return "NUM 5"; - case 102: - return "NUM 6"; - case 103: - return "NUM 7"; - case 104: - return "NUM 8"; - case 105: - return "NUM 9"; - case 106: - return "*"; - case 107: - return "+"; - case 109: - return "-"; - case 110: - return "."; - case 111: - return "/"; - case KEYCODES.F1: - return "F1"; - case KEYCODES.F2: - return "F2"; - case KEYCODES.F3: - return "F3"; - case KEYCODES.F4: - return "F4"; - case KEYCODES.F5: - return "F5"; - case KEYCODES.F6: - return "F6"; - case KEYCODES.F7: - return "F7"; - case KEYCODES.F8: - return "F8"; - case KEYCODES.F9: - return "F9"; - case KEYCODES.F10: - return "F10"; - case KEYCODES.F11: - return "F11"; - case KEYCODES.F12: - return "F12"; - - case 144: - return "NUMLOCK"; - case 145: - return "SCRLOCK"; - case 182: - return "COMP"; - case 183: - return "CALC"; - case 186: - return ";"; - case 187: - return "+"; - case 188: - return ","; - case 189: - return "-"; - case 190: - return "."; - case 191: - return "/"; - case 192: - return "`"; - case 219: - return "["; - case 220: - return "\\"; - case 221: - return "]"; - case 222: - return "'"; - } - - return (48 <= code && code <= 57) || (65 <= code && code <= 90) - ? String.fromCharCode(code) - : "[" + code + "]"; -} - export class Keybinding { /** * diff --git a/src/js/states/keybindings.js b/src/js/states/keybindings.js index 98b23efa..bb1afe6c 100644 --- a/src/js/states/keybindings.js +++ b/src/js/states/keybindings.js @@ -1,6 +1,7 @@ +import { getStringForKeyCode } from "@/core/keycodes"; import { Dialog } from "../core/modal_dialog_elements"; import { TextualGameState } from "../core/textual_game_state"; -import { getStringForKeyCode, KEYMAPPINGS } from "../game/key_action_mapper"; +import { KEYMAPPINGS } from "../game/key_action_mapper"; import { SOUNDS } from "../platform/sound"; import { T } from "../translations";