From 5dc72e98868a0cd59a061ba269c8ab77347bec58 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sat, 5 Jul 2025 16:16:26 -0400 Subject: [PATCH] Restore PreFilItemRoulette by moving hooks outside of reelbuilder --- src/k_kart.c | 2 ++ src/k_roulette.c | 26 +++++++++++++------------- src/k_roulette.h | 18 ++++++++++++++++++ src/lua_baselib.c | 4 ++++ src/lua_hook.h | 4 +++- src/lua_hooklib.c | 6 ++++++ 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index c12b18e96..cf395cc50 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -145,6 +145,8 @@ boolean K_InRaceDuel(void) fixed_t K_EffectiveGradingFactor(const player_t *player) { + I_Assert(player != NULL); + fixed_t min = (franticitems) ? MINFRANTICFACTOR : MINGRADINGFACTOR; if (grandprixinfo.gp && grandprixinfo.masterbots && !K_PlayerUsesBotMovement(player)) return min; diff --git a/src/k_roulette.c b/src/k_roulette.c index 7a2c46f59..b76ee6bae 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -1162,9 +1162,19 @@ static boolean K_TimingPermitsItem(kartitems_t item, const itemroulette_t *roule return true; } -static void K_LuaHookItemRoulette(player_t *player, itemroulette_t *const roulette) +void K_FillItemRoulette(player_t *const player, itemroulette_t *const roulette, boolean ringbox) { - // Lua can override the final result. + // Lua may want to intercept reelbuilder entirely. + LUA_HookPreFillItemRoulette(player, roulette); + + // If prehook did something, no need to continue. + if (roulette->itemList.len != 0) { + return; + } + + K_FillItemRouletteData(player, roulette, ringbox, false); + + // Lua can modify the final result. LUA_HookFillItemRoulette(player, roulette); // If somehow there's no items, add sad. @@ -1212,7 +1222,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo K_PushToRouletteItemList(roulette, presetlist[i]); } - K_LuaHookItemRoulette(player, roulette); return; } @@ -1221,7 +1230,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo if (cv_kartdebugitem.value != KITEM_NONE) { K_PushToRouletteItemList(roulette, cv_kartdebugitem.value); - K_LuaHookItemRoulette(player, roulette); return; } @@ -1236,7 +1244,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo K_PushToRouletteItemList(roulette, K_KartItemReelSpecialEnd[i]); } - K_LuaHookItemRoulette(player, roulette); return; } } @@ -1247,7 +1254,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo K_PushToRouletteItemList(roulette, K_KartItemReelBoss[i]); } - K_LuaHookItemRoulette(player, roulette); return; } else if (K_TimeAttackRules() == true) @@ -1314,8 +1320,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo } } - K_LuaHookItemRoulette(player, roulette); - return; } @@ -1324,7 +1328,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo if (K_ForcedSPB(player, roulette) == true) { K_AddItemToReel(player, roulette, KITEM_SPB); - K_LuaHookItemRoulette(player, roulette); return; } @@ -1349,7 +1352,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo // singleItem = KITEM_SAD by default, // so it will be used when all items are turned off. K_AddItemToReel(player, roulette, singleItem); - K_LuaHookItemRoulette(player, roulette); return; } @@ -1705,8 +1707,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo totalSpawnChance--; } - - K_LuaHookItemRoulette(player, roulette); } /*-------------------------------------------------- @@ -1719,7 +1719,7 @@ void K_StartItemRoulette(player_t *const player, boolean ringbox) itemroulette_t *const roulette = &player->itemRoulette; size_t i; - K_FillItemRouletteData(player, roulette, ringbox, false); + K_FillItemRoulette(player, roulette, ringbox); if (roulette->autoroulette) roulette->index = P_RandomRange(PR_AUTOROULETTE, 0, roulette->itemList.len - 1); diff --git a/src/k_roulette.h b/src/k_roulette.h index 84356ea06..e45dd7809 100644 --- a/src/k_roulette.h +++ b/src/k_roulette.h @@ -180,6 +180,24 @@ void K_CalculateRouletteSpeed(itemroulette_t *const roulette); INT32 K_KartGetBattleOdds(const player_t *player, UINT8 pos, kartitems_t item); +/*-------------------------------------------------- + void K_FillItemRoulette(player_t *player, itemroulette_t *const roulette, boolean ringbox); + + Entry point for roulette builder. + Includes Lua hooks. + + Input Arguments:- + player - The player this roulette data is for. + Can be NULL for generic use. + roulette - The roulette data struct to fill out. + ringbox - Is this roulette fill triggered by a just-respawned Ring Box? + + Return:- + N/A +--------------------------------------------------*/ + +void K_FillItemRoulette(player_t *player, itemroulette_t *const roulette, boolean ringbox); + /*-------------------------------------------------- void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, boolean ringbox, boolean dryrun); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 8c891c335..435df1345 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4167,17 +4167,21 @@ static void getItemRouletteOrPlayerBasedOnFirstParam(lua_State *L, player_t **pl { if (lua_getmetatable(L, 1)) { + CONS_Printf("case A\n"); lua_getfield(L, LUA_REGISTRYINDEX, META_ITEMROULETTE); if (lua_rawequal(L, -1, -2)) { + CONS_Printf("case A2\n"); *itemRoulette = *(itemroulette_t **)p; } else { + CONS_Printf("case B\n"); lua_pop(L, 1); lua_getfield(L, LUA_REGISTRYINDEX, META_PLAYER); if (lua_rawequal(L, -1, -2)) { + CONS_Printf("case B2\n"); *player = *(player_t **)p; *itemRoulette = &(*player)->itemRoulette; } diff --git a/src/lua_hook.h b/src/lua_hook.h index b4ec2b24a..8187cbaa7 100644 --- a/src/lua_hook.h +++ b/src/lua_hook.h @@ -79,7 +79,8 @@ automatically. X (GameQuit),\ X (PlayerCmd),/* building the player's ticcmd struct */\ X (VoteThinker),/* Y_VoteTicker */\ - X (FillItemRoulette),/* K_FillItemRouletteData, right at the end */\ + X (PreFillItemRoulette),/* K_FillItemRouletteData, before attempted reel build */\ + X (FillItemRoulette),/* K_FillItemRouletteData, after built reel is in place */\ #define STRING_HOOK_LIST(X) \ X (SpecialExecute),\ @@ -147,6 +148,7 @@ void LUA_HookPlayerQuit(player_t *, kickreason_t); //int LUA_HookTeamSwitch(player_t *, int newteam, boolean fromspectators, boolean tryingautobalance, boolean tryingscramble); int LUA_HookViewpointSwitch(player_t *player, player_t *newdisplayplayer, boolean forced); int LUA_HookSeenPlayer(player_t *player, player_t *seenfriend); +int LUA_HookPreFillItemRoulette(player_t *player, itemroulette_t *const roulette); int LUA_HookFillItemRoulette(player_t *player, itemroulette_t *const roulette); #ifdef __cplusplus diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index b751f75ee..0d9b72cbe 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -1034,6 +1034,12 @@ static int roulette_hook( return hook.status; } +int LUA_HookPreFillItemRoulette(player_t *player, itemroulette_t *const roulette) +{ + return roulette_hook(player, roulette, false, HOOK(PreFillItemRoulette), res_true); +} + + int LUA_HookFillItemRoulette(player_t *player, itemroulette_t *const roulette) { return roulette_hook(player, roulette, false, HOOK(FillItemRoulette), res_true);