diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 498d81815..daa66b652 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -50,7 +50,7 @@ jobs: retention-days: 0 build-i686-linux: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Install dependencies run: | diff --git a/port/src/input.c b/port/src/input.c index 8500f4716..ede18d9e3 100644 --- a/port/src/input.c +++ b/port/src/input.c @@ -333,6 +333,14 @@ static inline void inputInitController(const s32 cidx, const s32 jidx) sysLogPrintf(LOG_NOTE, "input: assigned controller '%d: (%s)' (id %d) to player %d", jidx, SDL_GameControllerName(pads[cidx]), inputControllerGetId(pads[cidx]), cidx); + + SDL_Joystick* joy = SDL_GameControllerGetJoystick(pads[cidx]); + if (joy) { + char guidStr[1024] = ""; + SDL_JoystickGUID guid = SDL_JoystickGetGUID(joy); + SDL_JoystickGetGUIDString(guid, guidStr, sizeof(guidStr)); + sysLogPrintf(LOG_NOTE, "input: GUID for controller %d: %s", jidx, guidStr); + } } static inline void inputCloseController(const s32 cidx) diff --git a/port/src/main.c b/port/src/main.c index b104e7820..8ddff3e61 100644 --- a/port/src/main.c +++ b/port/src/main.c @@ -197,5 +197,6 @@ PD_CONSTRUCTOR static void gameConfigInit(void) configRegisterUInt(strFmt("Game.Player%d.CrosshairColour", i), &g_PlayerExtCfg[j].crosshaircolour, 0, 0xFFFFFFFF); configRegisterUInt(strFmt("Game.Player%d.CrosshairSize", i), &g_PlayerExtCfg[j].crosshairsize, 0, 4); configRegisterInt(strFmt("Game.Player%d.CrosshairHealth", i), &g_PlayerExtCfg[j].crosshairhealth, 0, CROSSHAIR_HEALTH_ON_WHITE); + configRegisterInt(strFmt("Game.Player%d.UseKeyReloads", i), &g_PlayerExtCfg[j].usereloads, 0, false); } } diff --git a/port/src/optionsmenu.c b/port/src/optionsmenu.c index 91353705b..aa7f501b3 100644 --- a/port/src/optionsmenu.c +++ b/port/src/optionsmenu.c @@ -965,6 +965,21 @@ struct menudialogdef g_ExtendedAudioMenuDialog = { NULL, }; +static MenuItemHandlerResult menuhandlerUseKeyReloads(s32 operation, struct menuitem *item, union handlerdata *data) +{ + switch (operation) { + case MENUOP_CHECKDISABLED: + return !g_PlayerExtCfg[g_ExtMenuPlayer].extcontrols; + case MENUOP_GET: + return g_PlayerExtCfg[g_ExtMenuPlayer].usereloads; + case MENUOP_SET: + g_PlayerExtCfg[g_ExtMenuPlayer].usereloads = data->checkbox.value; + break; + } + + return 0; +} + static MenuItemHandlerResult menuhandlerCrouchMode(s32 operation, struct menuitem *item, union handlerdata *data) { static const char *opts[] = { @@ -1269,6 +1284,14 @@ struct menuitem g_ExtendedGameMenuItems[] = { 0, menuhandlerCrosshairHealth, }, + { + MENUITEMTYPE_CHECKBOX, + 0, + MENUITEMFLAG_LITERAL_TEXT, + (uintptr_t)"Use Key Reloads", + 0, + menuhandlerUseKeyReloads, + }, { MENUITEMTYPE_SEPARATOR, 0, diff --git a/src/game/bondmove.c b/src/game/bondmove.c index 3d69918b8..88d14eb09 100644 --- a/src/game/bondmove.c +++ b/src/game/bondmove.c @@ -2008,7 +2008,9 @@ void bmoveProcessInput(bool allowc1x, bool allowc1y, bool allowc1buttons, bool i g_Vars.currentplayer->bondactivateorreload = 0; + s32 usereloads = (controlmode != CONTROLMODE_PC); #ifndef PLATFORM_N64 + usereloads = usereloads || PLAYER_EXTCFG().usereloads; if (controlmode == CONTROLMODE_PC && movedata.alt1tapcount) { g_Vars.currentplayer->bondactivateorreload = g_Vars.currentplayer->bondactivateorreload | JO_ACTION_RELOAD; } @@ -2016,7 +2018,7 @@ void bmoveProcessInput(bool allowc1x, bool allowc1y, bool allowc1buttons, bool i if (movedata.btapcount) { g_Vars.currentplayer->activatetimelast = g_Vars.currentplayer->activatetimethis; g_Vars.currentplayer->activatetimethis = g_Vars.lvframe60; - if (controlmode == CONTROLMODE_PC) { + if (!usereloads) { g_Vars.currentplayer->bondactivateorreload = g_Vars.currentplayer->bondactivateorreload | JO_ACTION_ACTIVATE; } else { g_Vars.currentplayer->bondactivateorreload = movedata.btapcount ? diff --git a/src/game/lv.c b/src/game/lv.c index 2d0622be5..ba1daa5b0 100644 --- a/src/game/lv.c +++ b/src/game/lv.c @@ -1330,7 +1330,7 @@ Gfx *lvRender(Gfx *gdl) if (!currentPlayerInteract(false)) { #ifndef PLATFORM_N64 // n64 behavior: interact sucessful, cancel reload - if (!PLAYER_EXTCFG().extcontrols) { + if (!PLAYER_EXTCFG().extcontrols || PLAYER_EXTCFG().usereloads) { g_Vars.currentplayer->bondactivateorreload = (g_Vars.currentplayer->bondactivateorreload & ~JO_ACTION_RELOAD); } #endif diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index 9449cfe8b..76326af4a 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -133,6 +133,7 @@ struct mpweapon g_MpWeapons[NUM_MPWEAPONS] = { .crosshaircolour = 0x00ff0028, \ .crosshairsize = 2, \ .crosshairhealth = CROSSHAIR_HEALTH_OFF, \ + .usereloads = false, \ } struct extplayerconfig g_PlayerExtCfg[MAX_LOCAL_PLAYERS] = { diff --git a/src/include/types.h b/src/include/types.h index 6d0b5ea50..cf5e99322 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -6167,6 +6167,7 @@ struct extplayerconfig { u32 crosshaircolour; u32 crosshairsize; s32 crosshairhealth; + s32 usereloads; }; #endif