Restore PreFilItemRoulette by moving hooks outside of reelbuilder

This commit is contained in:
Antonio Martinez 2025-07-05 16:16:26 -04:00
parent bed1feb1a0
commit 5dc72e9886
6 changed files with 46 additions and 14 deletions

View file

@ -145,6 +145,8 @@ boolean K_InRaceDuel(void)
fixed_t K_EffectiveGradingFactor(const player_t *player) fixed_t K_EffectiveGradingFactor(const player_t *player)
{ {
I_Assert(player != NULL);
fixed_t min = (franticitems) ? MINFRANTICFACTOR : MINGRADINGFACTOR; fixed_t min = (franticitems) ? MINFRANTICFACTOR : MINGRADINGFACTOR;
if (grandprixinfo.gp && grandprixinfo.masterbots && !K_PlayerUsesBotMovement(player)) if (grandprixinfo.gp && grandprixinfo.masterbots && !K_PlayerUsesBotMovement(player))
return min; return min;

View file

@ -1162,9 +1162,19 @@ static boolean K_TimingPermitsItem(kartitems_t item, const itemroulette_t *roule
return true; 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); LUA_HookFillItemRoulette(player, roulette);
// If somehow there's no items, add sad. // 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_PushToRouletteItemList(roulette, presetlist[i]);
} }
K_LuaHookItemRoulette(player, roulette);
return; return;
} }
@ -1221,7 +1230,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo
if (cv_kartdebugitem.value != KITEM_NONE) if (cv_kartdebugitem.value != KITEM_NONE)
{ {
K_PushToRouletteItemList(roulette, cv_kartdebugitem.value); K_PushToRouletteItemList(roulette, cv_kartdebugitem.value);
K_LuaHookItemRoulette(player, roulette);
return; return;
} }
@ -1236,7 +1244,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo
K_PushToRouletteItemList(roulette, K_KartItemReelSpecialEnd[i]); K_PushToRouletteItemList(roulette, K_KartItemReelSpecialEnd[i]);
} }
K_LuaHookItemRoulette(player, roulette);
return; return;
} }
} }
@ -1247,7 +1254,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo
K_PushToRouletteItemList(roulette, K_KartItemReelBoss[i]); K_PushToRouletteItemList(roulette, K_KartItemReelBoss[i]);
} }
K_LuaHookItemRoulette(player, roulette);
return; return;
} }
else if (K_TimeAttackRules() == true) 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; return;
} }
@ -1324,7 +1328,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo
if (K_ForcedSPB(player, roulette) == true) if (K_ForcedSPB(player, roulette) == true)
{ {
K_AddItemToReel(player, roulette, KITEM_SPB); K_AddItemToReel(player, roulette, KITEM_SPB);
K_LuaHookItemRoulette(player, roulette);
return; return;
} }
@ -1349,7 +1352,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo
// singleItem = KITEM_SAD by default, // singleItem = KITEM_SAD by default,
// so it will be used when all items are turned off. // so it will be used when all items are turned off.
K_AddItemToReel(player, roulette, singleItem); K_AddItemToReel(player, roulette, singleItem);
K_LuaHookItemRoulette(player, roulette);
return; return;
} }
@ -1705,8 +1707,6 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo
totalSpawnChance--; totalSpawnChance--;
} }
K_LuaHookItemRoulette(player, roulette);
} }
/*-------------------------------------------------- /*--------------------------------------------------
@ -1719,7 +1719,7 @@ void K_StartItemRoulette(player_t *const player, boolean ringbox)
itemroulette_t *const roulette = &player->itemRoulette; itemroulette_t *const roulette = &player->itemRoulette;
size_t i; size_t i;
K_FillItemRouletteData(player, roulette, ringbox, false); K_FillItemRoulette(player, roulette, ringbox);
if (roulette->autoroulette) if (roulette->autoroulette)
roulette->index = P_RandomRange(PR_AUTOROULETTE, 0, roulette->itemList.len - 1); roulette->index = P_RandomRange(PR_AUTOROULETTE, 0, roulette->itemList.len - 1);

View file

@ -180,6 +180,24 @@ void K_CalculateRouletteSpeed(itemroulette_t *const roulette);
INT32 K_KartGetBattleOdds(const player_t *player, UINT8 pos, kartitems_t item); 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); void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, boolean ringbox, boolean dryrun);

View file

@ -4167,17 +4167,21 @@ static void getItemRouletteOrPlayerBasedOnFirstParam(lua_State *L, player_t **pl
{ {
if (lua_getmetatable(L, 1)) if (lua_getmetatable(L, 1))
{ {
CONS_Printf("case A\n");
lua_getfield(L, LUA_REGISTRYINDEX, META_ITEMROULETTE); lua_getfield(L, LUA_REGISTRYINDEX, META_ITEMROULETTE);
if (lua_rawequal(L, -1, -2)) if (lua_rawequal(L, -1, -2))
{ {
CONS_Printf("case A2\n");
*itemRoulette = *(itemroulette_t **)p; *itemRoulette = *(itemroulette_t **)p;
} }
else else
{ {
CONS_Printf("case B\n");
lua_pop(L, 1); lua_pop(L, 1);
lua_getfield(L, LUA_REGISTRYINDEX, META_PLAYER); lua_getfield(L, LUA_REGISTRYINDEX, META_PLAYER);
if (lua_rawequal(L, -1, -2)) if (lua_rawequal(L, -1, -2))
{ {
CONS_Printf("case B2\n");
*player = *(player_t **)p; *player = *(player_t **)p;
*itemRoulette = &(*player)->itemRoulette; *itemRoulette = &(*player)->itemRoulette;
} }

View file

@ -79,7 +79,8 @@ automatically.
X (GameQuit),\ X (GameQuit),\
X (PlayerCmd),/* building the player's ticcmd struct */\ X (PlayerCmd),/* building the player's ticcmd struct */\
X (VoteThinker),/* Y_VoteTicker */\ 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) \ #define STRING_HOOK_LIST(X) \
X (SpecialExecute),\ 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_HookTeamSwitch(player_t *, int newteam, boolean fromspectators, boolean tryingautobalance, boolean tryingscramble);
int LUA_HookViewpointSwitch(player_t *player, player_t *newdisplayplayer, boolean forced); int LUA_HookViewpointSwitch(player_t *player, player_t *newdisplayplayer, boolean forced);
int LUA_HookSeenPlayer(player_t *player, player_t *seenfriend); 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); int LUA_HookFillItemRoulette(player_t *player, itemroulette_t *const roulette);
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -1034,6 +1034,12 @@ static int roulette_hook(
return hook.status; 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) int LUA_HookFillItemRoulette(player_t *player, itemroulette_t *const roulette)
{ {
return roulette_hook(player, roulette, false, HOOK(FillItemRoulette), res_true); return roulette_hook(player, roulette, false, HOOK(FillItemRoulette), res_true);