From f9cfa0fa437faa1b087ef2e92919b2857c0f720b Mon Sep 17 00:00:00 2001 From: Raf <> Date: Mon, 31 Mar 2025 10:34:25 +0800 Subject: [PATCH] mpsetups: introduced "menu alt" button/key to toggle presets Currently the "menu alt" (L/R buttons, or Ctrl/Alt keys) is fixed, but we may make it bindable later --- port/include/input.h | 7 +++++ port/src/input.c | 27 +++++++++++++++++++ src/game/mplayer/mplayer.c | 4 +++ src/game/mplayer/setup.c | 53 ++++++++++++++++++++++++++++++-------- src/include/types.h | 1 + 5 files changed, 81 insertions(+), 11 deletions(-) diff --git a/port/include/input.h b/port/include/input.h index 6d5d88bfd..98f5928fc 100644 --- a/port/include/input.h +++ b/port/include/input.h @@ -40,6 +40,7 @@ enum virtkey { VK_DELETE = 76, VK_LCTRL = 224, VK_LSHIFT = 225, + VK_LALT = 226, VK_RCTRL = 228, VK_RSHIFT = 229, @@ -56,6 +57,8 @@ enum virtkey { /* same order as SDL gamecontroller buttons plus two buttons for triggers */ VK_JOY_BEGIN, VK_JOY1_BEGIN = VK_JOY_BEGIN, + VK_JOY1_LSHOULDER = VK_JOY1_BEGIN + 9, + VK_JOY1_RSHOULDER = VK_JOY1_BEGIN + 10, VK_JOY1_LTRIG = VK_JOY1_BEGIN + 30, VK_JOY1_RTRIG = VK_JOY1_BEGIN + 31, VK_JOY2_BEGIN = VK_JOY1_BEGIN + INPUT_MAX_CONTROLLER_BUTTONS, @@ -267,4 +270,8 @@ const char *inputGetClipboard(void); // returns keymod values u32 inputGetKeyModState(void); +s32 inputMenuAlt1MenuPressed(s32 playerNum); +s32 inputMenuAlt2MenuPressed(s32 playerNum); +s32 inputMenuAltMenuPressed(s32 playerNum); + #endif diff --git a/port/src/input.c b/port/src/input.c index cfee620a5..7024fc822 100644 --- a/port/src/input.c +++ b/port/src/input.c @@ -1162,6 +1162,33 @@ s32 inputKeyJustPressed(u32 vk) return result; } +s32 inputMenuAlt1MenuPressed(s32 playerNum) +{ + s32 RSHOULDER = VK_JOY1_RSHOULDER + playerNum * INPUT_MAX_CONTROLLER_BUTTONS; + + if (playerNum == 0) { + return inputKeyJustPressed(VK_LCTRL) || inputKeyJustPressed(RSHOULDER); + } + + return inputKeyJustPressed(RSHOULDER); +} + +s32 inputMenuAlt2MenuPressed(s32 playerNum) +{ + s32 LSHOULDER = VK_JOY1_LSHOULDER + playerNum * INPUT_MAX_CONTROLLER_BUTTONS; + + if (playerNum == 0) { + return inputKeyJustPressed(VK_LALT) || inputKeyJustPressed(LSHOULDER); + } + + return inputKeyJustPressed(LSHOULDER); +} + +s32 inputMenuAltMenuPressed(s32 playerNum) +{ + return inputMenuAlt1MenuPressed(playerNum) || inputMenuAlt2MenuPressed(playerNum); +} + static inline u32 inputContToContKey(const u32 cont) { if (cont == 0) { diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index 4b8f70ecf..add19e0aa 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -600,6 +600,10 @@ void mpInit(void) } g_MpSetup.chrslots = 0; + + for (i = 0; i < ARRAYCOUNT(g_Menus); i++) { + g_Menus[i].mpsetup.showpresets = 1; + } } #if VERSION >= VERSION_PAL_BETA diff --git a/src/game/mplayer/setup.c b/src/game/mplayer/setup.c index 27e0b7fc3..a72e55759 100644 --- a/src/game/mplayer/setup.c +++ b/src/game/mplayer/setup.c @@ -20,10 +20,12 @@ #include "lib/vi.h" #include "lib/rng.h" #include "lib/str.h" +#include "lib/joy.h" #include "data.h" #include "gbiex.h" #include "types.h" #include "system.h" +#include "input.h" #include "mpsetups.h" struct menuitem g_MpCharacterMenuItems[]; @@ -2252,16 +2254,19 @@ MenuItemHandlerResult mpPlayerNameMenuHandler(s32 operation, struct menuitem *it MenuItemHandlerResult mpLoadSettingsMenuHandler(s32 operation, struct menuitem *item, union handlerdata *data) { + u8 presets = g_Menus[g_MpPlayerNum].mpsetup.showpresets; + s32 numpresets = mpGetNumUnlockedPresets()*presets; + switch (operation) { case MENUOP_GETOPTIONCOUNT: - data->list.value = mpGetNumUnlockedPresets() + g_MpSetupFile.numsetups; + data->list.value = numpresets + g_MpSetupFile.numsetups; break; case MENUOP_GETOPTIONTEXT: - if (data->list.value < mpGetNumUnlockedPresets()) { + if (presets && data->list.value < mpGetNumUnlockedPresets()) { return (uintptr_t)mpGetPresetNameBySlot(data->list.value); } if (g_MpSetupFile.numsetups > 0) { - struct setupblock *block = &g_MpSetupFile.setups[data->list.value - mpGetNumUnlockedPresets()]; + struct setupblock *block = &g_MpSetupFile.setups[data->list.value - numpresets]; func0f0d564c_ext(block->bytes, g_StringPointer, false, MPSETUP_MAXNAME+1); return (uintptr_t)g_StringPointer; } @@ -2269,12 +2274,12 @@ MenuItemHandlerResult mpLoadSettingsMenuHandler(s32 operation, struct menuitem * case MENUOP_SET: mpCloseDialogsForNewSetup(); - if (data->list.value < mpGetNumUnlockedPresets()) { + if (presets && data->list.value < mpGetNumUnlockedPresets()) { mp0f18dec4(data->list.value); g_MpCurrentSetup = -1; } else { - mpsetupLoadSetup(data->list.value - mpGetNumUnlockedPresets()); + mpsetupLoadSetup(data->list.value - numpresets); } if (item->param == 1) { @@ -2289,22 +2294,22 @@ MenuItemHandlerResult mpLoadSettingsMenuHandler(s32 operation, struct menuitem * data->list.value = 0xfffff; break; case MENUOP_GETOPTGROUPCOUNT: - data->list.value = 2; + data->list.value = presets ? 2 : 1; break; case MENUOP_GETOPTGROUPTEXT: - if (data->list.value == 0) { + if (presets && data->list.value == 0) { return (uintptr_t)langGet(L_MPMENU_141); // "Presets" } return (uintptr_t)"Custom"; case MENUOP_GETGROUPSTARTINDEX: - data->list.groupstartindex = data->list.value == 0 ? 0 : mpGetNumUnlockedPresets(); + data->list.groupstartindex = data->list.value == 0 ? 0 : numpresets; break; case MENUOP_LISTITEMFOCUS: - if (data->list.value < mpGetNumUnlockedPresets()) { + if (presets && data->list.value < mpGetNumUnlockedPresets()) { g_Menus[g_MpPlayerNum].mpsetup.slotindex = 0xffff; } else { - g_Menus[g_MpPlayerNum].mpsetup.slotindex = data->list.value - mpGetNumUnlockedPresets(); + g_Menus[g_MpPlayerNum].mpsetup.slotindex = data->list.value - numpresets; } break; } @@ -2632,14 +2637,40 @@ struct menuitem g_MpLoadSettingsMenuItems[] = { 0, NULL, }, + { + MENUITEMTYPE_SEPARATOR, + 0, + 0, + 0, + 0, + NULL, + }, + { + MENUITEMTYPE_LABEL, + 0, + MENUITEMFLAG_LITERAL_TEXT | MENUITEMFLAG_LESSLEFTPADDING | MENUITEMFLAG_SMALLFONT, + (uintptr_t)"Menu Alt: Toggle Presets\n", + 0, + NULL, + }, { MENUITEMTYPE_END }, }; +MenuDialogHandlerResult loadSettingsDialogHandler(s32 operation, struct menudialogdef *dialogdef, union handlerdata *data) +{ + if (operation == MENUOP_TICK) { + if (inputMenuAltMenuPressed(g_MpPlayerNum)) { + u8 presets = g_Menus[g_MpPlayerNum].mpsetup.showpresets; + g_Menus[g_MpPlayerNum].mpsetup.showpresets = 1 - presets; + } + } +} + struct menudialogdef g_MpLoadSettingsMenuDialog = { MENUDIALOGTYPE_DEFAULT, L_MPMENU_139, // "Load Game Settings" g_MpLoadSettingsMenuItems, - NULL, + loadSettingsDialogHandler, MENUDIALOGFLAG_CLOSEONSELECT, NULL, }; diff --git a/src/include/types.h b/src/include/types.h index 61d8a96f5..cc0b2ed32 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3774,6 +3774,7 @@ struct menudata_main { struct menudata_mpsetup { u32 slotindex; u32 slotcount; + u8 showpresets; u32 unke24; };