From 47bda26da51b7221548131698e6ac0af3882f9ca Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sun, 16 Feb 2025 12:45:29 +0000 Subject: [PATCH] begin coding functionality for remapping keys --- fcore/core-key.sml | 277 ++++++++++++++++++++++++++++++++++++++++ fcore/game-type.sml | 13 ++ fcore/game-update.sml | 2 + fcore/player/player.sml | 5 +- oms.mlb | 1 + shell/input-state.sml | 6 - 6 files changed, 294 insertions(+), 10 deletions(-) create mode 100644 fcore/core-key.sml diff --git a/fcore/core-key.sml b/fcore/core-key.sml new file mode 100644 index 0000000..d20ab95 --- /dev/null +++ b/fcore/core-key.sml @@ -0,0 +1,277 @@ +signature CORE_KEY = +sig + (* enumeration of keys, following GLFW names + * taken from https://www.glfw.org/docs/latest/group__keys.html + * note that there is no dependency on GLFW here: it is just a plain datatype. + * *) + datatype key_code = + KEY_SPACE + | KEY_APOSTROPHE + | KEY_COMMA + | KEY_MINUS + | KEY_PERIOD + | KEY_SLASH + | KEY_0 + | KEY_1 + | KEY_2 + | KEY_3 + | KEY_4 + | KEY_5 + | KEY_6 + | KEY_7 + | KEY_8 + | KEY_9 + | KEY_SEMICOLON + | KEY_EQUAL + | KEY_A + | KEY_B + | KEY_C + | KEY_D + | KEY_E + | KEY_F + | KEY_G + | KEY_H + | KEY_I + | KEY_J + | KEY_K + | KEY_L + | KEY_M + | KEY_N + | KEY_O + | KEY_P + | KEY_Q + | KEY_R + | KEY_S + | KEY_T + | KEY_U + | KEY_V + | KEY_W + | KEY_X + | KEY_Y + | KEY_Z + | KEY_LEFT_BRACKET + | KEY_BACKSLASH + | KEY_RIGHT_BRACKET + | KEY_GRAVE_ACCENT + | KEY_WORLD_1 + | KEY_WORLD_2 + | KEY_ESCAPE + | KEY_ENTER + | KEY_TAB + | KEY_BACKSPACE + | KEY_INSERT + | KEY_DELETE + | KEY_LEFT + | KEY_RIGHT + | KEY_DOWN + | KEY_UP + | KEY_PAGE_UP + | KEY_PAGE_DOWN + | KEY_HOME + | KEY_END + | KEY_CAPS_LOCK + | KEY_SCROLL_LOCK + | KEY_NUM_LOCK + | KEY_PRINT_SCREEN + | KEY_PAUSE + | KEY_F1 + | KEY_F2 + | KEY_F3 + | KEY_F4 + | KEY_F5 + | KEY_F6 + | KEY_F7 + | KEY_F8 + | KEY_F9 + | KEY_F10 + | KEY_F11 + | KEY_F12 + | KEY_F13 + | KEY_F14 + | KEY_F15 + | KEY_F16 + | KEY_F17 + | KEY_F18 + | KEY_F19 + | KEY_F20 + | KEY_F21 + | KEY_F22 + | KEY_F23 + | KEY_F24 + | KEY_F25 + | KEY_KP_0 + | KEY_KP_1 + | KEY_KP_2 + | KEY_KP_3 + | KEY_KP_4 + | KEY_KP_5 + | KEY_KP_6 + | KEY_KP_7 + | KEY_KP_8 + | KEY_KP_9 + | KEY_KP_DECIMAL + | KEY_KP_DIVIDE + | KEY_KP_MULTIPLY + | KEY_KP_SUBTRACT + | KEY_KP_ADD + | KEY_KP_ENTER + | KEY_KP_EQUAL + | KEY_LEFT_SHIFT + | KEY_LEFT_CONTROL + | KEY_LEFT_ALT + | KEY_LEFT_SUPER + | KEY_RIGHT_SHIFT + | KEY_RIGHT_CONTROL + | KEY_RIGHT_ALT + | KEY_RIGHT_SUPER + | KEY_MENU + + (* user's chosen key mappings *) + type user_key = + { left: key_code + , right: key_code + , up: key_code + , down: key_code + , jump: key_code + , attack: key_code + } +end + +structure CoreKey :> CORE_KEY = +struct + (* enumeration of keys, following GLFW names + * taken from https://www.glfw.org/docs/latest/group__keys.html + * note that there is no dependency on GLFW here: it is just a plain datatype. + * *) + datatype key_code = + KEY_SPACE + | KEY_APOSTROPHE + | KEY_COMMA + | KEY_MINUS + | KEY_PERIOD + | KEY_SLASH + | KEY_0 + | KEY_1 + | KEY_2 + | KEY_3 + | KEY_4 + | KEY_5 + | KEY_6 + | KEY_7 + | KEY_8 + | KEY_9 + | KEY_SEMICOLON + | KEY_EQUAL + | KEY_A + | KEY_B + | KEY_C + | KEY_D + | KEY_E + | KEY_F + | KEY_G + | KEY_H + | KEY_I + | KEY_J + | KEY_K + | KEY_L + | KEY_M + | KEY_N + | KEY_O + | KEY_P + | KEY_Q + | KEY_R + | KEY_S + | KEY_T + | KEY_U + | KEY_V + | KEY_W + | KEY_X + | KEY_Y + | KEY_Z + | KEY_LEFT_BRACKET + | KEY_BACKSLASH + | KEY_RIGHT_BRACKET + | KEY_GRAVE_ACCENT + | KEY_WORLD_1 + | KEY_WORLD_2 + | KEY_ESCAPE + | KEY_ENTER + | KEY_TAB + | KEY_BACKSPACE + | KEY_INSERT + | KEY_DELETE + | KEY_LEFT + | KEY_RIGHT + | KEY_DOWN + | KEY_UP + | KEY_PAGE_UP + | KEY_PAGE_DOWN + | KEY_HOME + | KEY_END + | KEY_CAPS_LOCK + | KEY_SCROLL_LOCK + | KEY_NUM_LOCK + | KEY_PRINT_SCREEN + | KEY_PAUSE + | KEY_F1 + | KEY_F2 + | KEY_F3 + | KEY_F4 + | KEY_F5 + | KEY_F6 + | KEY_F7 + | KEY_F8 + | KEY_F9 + | KEY_F10 + | KEY_F11 + | KEY_F12 + | KEY_F13 + | KEY_F14 + | KEY_F15 + | KEY_F16 + | KEY_F17 + | KEY_F18 + | KEY_F19 + | KEY_F20 + | KEY_F21 + | KEY_F22 + | KEY_F23 + | KEY_F24 + | KEY_F25 + | KEY_KP_0 + | KEY_KP_1 + | KEY_KP_2 + | KEY_KP_3 + | KEY_KP_4 + | KEY_KP_5 + | KEY_KP_6 + | KEY_KP_7 + | KEY_KP_8 + | KEY_KP_9 + | KEY_KP_DECIMAL + | KEY_KP_DIVIDE + | KEY_KP_MULTIPLY + | KEY_KP_SUBTRACT + | KEY_KP_ADD + | KEY_KP_ENTER + | KEY_KP_EQUAL + | KEY_LEFT_SHIFT + | KEY_LEFT_CONTROL + | KEY_LEFT_ALT + | KEY_LEFT_SUPER + | KEY_RIGHT_SHIFT + | KEY_RIGHT_CONTROL + | KEY_RIGHT_ALT + | KEY_RIGHT_SUPER + | KEY_MENU + + (* user's chosen key mappings *) + type user_key = + { left: key_code + , right: key_code + , up: key_code + , down: key_code + , jump: key_code + , attack: key_code + } +end diff --git a/fcore/game-type.sml b/fcore/game-type.sml index 41409e5..ab68004 100644 --- a/fcore/game-type.sml +++ b/fcore/game-type.sml @@ -9,6 +9,7 @@ sig , enemies: EnemyMap.t , graph: PlatSet.elem vector vector , fallingEnemies: FallingEnemyMap.t + , userKeys: CoreKey.user_key } val initial: game_type @@ -25,6 +26,7 @@ struct , enemies: EnemyMap.t , graph: PlatSet.elem vector vector , fallingEnemies: FallingEnemyMap.t + , userKeys: CoreKey.user_key } fun enemyMapFromList (hd :: tl, map) = @@ -53,6 +55,16 @@ struct , platID = ~1 } + (* todo: replace initialKeys with keys parsed from file *) + val initialKeys = + { left = CoreKey.KEY_S + , right = CoreKey.KEY_L + , up = CoreKey.KEY_E + , down = CoreKey.KEY_D + , jump = CoreKey.KEY_K + , attack = CoreKey.KEY_J + } + val wall1 = {id = 1, x = 0, y = 0, width = 100, height = 1080} val wall2 = {id = 2, x = 1820, y = 0, width = 100, height = 1080} val wall3 = {id = 3, x = 0, y = 980, width = 1920, height = 108} @@ -140,6 +152,7 @@ struct , enemies = enemies , graph = graph , fallingEnemies = FallingEnemyMap.empty + , userKeys = initialKeys } end end diff --git a/fcore/game-update.sml b/fcore/game-update.sml index 714e94f..d8331f0 100644 --- a/fcore/game-update.sml +++ b/fcore/game-update.sml @@ -11,6 +11,7 @@ struct , enemies , graph , fallingEnemies + , userKeys } = game val player = Player.runPhysicsAndInput (game, input) @@ -39,6 +40,7 @@ struct , enemies = enemies , graph = graph , fallingEnemies = fallingEnemies + , userKeys = userKeys } end end diff --git a/fcore/player/player.sml b/fcore/player/player.sml index 4b6e1f2..f0249f1 100644 --- a/fcore/player/player.sml +++ b/fcore/player/player.sml @@ -142,7 +142,6 @@ struct , defeteadEnemies , projectiles , attackHeld - , chargeHeld , charge , player , acc @@ -206,8 +205,7 @@ struct , ... } = player - val {leftHeld, rightHeld, upHeld, downHeld, attackHeld, chargeHeld} = - input + val {leftHeld, rightHeld, upHeld, downHeld, attackHeld} = input val xAxis = getXAxis (leftHeld, rightHeld) val facing = getFacing (facing, xAxis) @@ -221,7 +219,6 @@ struct , enemies , projectiles , attackHeld - , chargeHeld , charge , player , acc diff --git a/oms.mlb b/oms.mlb index 22a4857..79d9932 100644 --- a/oms.mlb +++ b/oms.mlb @@ -34,6 +34,7 @@ fcore/enemy/enemy-map.sml fcore/enemy/falling-enemy-pair.sml fcore/enemy/falling-enemy-map.sml +fcore/core-key.sml fcore/player/player-type.sml fcore/game-type.sml diff --git a/shell/input-state.sml b/shell/input-state.sml index 9809f27..09dcab0 100644 --- a/shell/input-state.sml +++ b/shell/input-state.sml @@ -7,7 +7,6 @@ struct , upHeld = ref false , downHeld = ref false , attackHeld = ref false - , chargeHeld = ref false , width = ref (1920.0 : Real32.real) , height = ref (1080.0 : Real32.real) } @@ -18,7 +17,6 @@ struct , upHeld = !(#upHeld state) , downHeld = !(#downHeld state) , attackHeld = !(#attackHeld state) - , chargeHeld = !(#chargeHeld state) } fun getWidth () = @@ -53,10 +51,6 @@ struct if action = PRESS then (#attackHeld state) := true else if action = RELEASE then (#attackHeld state) := false else () - else if key = KEY_L then - if action = PRESS then (#chargeHeld state) := true - else if action = RELEASE then (#chargeHeld state) := false - else () else ()