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)
{
I_Assert(player != NULL);
fixed_t min = (franticitems) ? MINFRANTICFACTOR : MINGRADINGFACTOR;
if (grandprixinfo.gp && grandprixinfo.masterbots && !K_PlayerUsesBotMovement(player))
return min;

View file

@ -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);

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);
/*--------------------------------------------------
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);

View file

@ -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;
}

View file

@ -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

View file

@ -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);