From e95faf8b55e0ea65f883c4fb77276420694b33fa Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Wed, 12 Nov 2025 22:49:00 +0100 Subject: [PATCH] Cleanup K_AwardPlayerItem --- src/d_player.h | 6 -- src/deh_tables.c | 9 +-- src/k_hud.c | 5 +- src/k_items.c | 170 +++++++++++++++++------------------------------ src/k_items.h | 11 ++- src/k_kart.c | 2 +- src/p_inter.c | 20 +----- 7 files changed, 80 insertions(+), 143 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 985459e45..d69d8c72b 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -148,12 +148,6 @@ typedef enum { KROULETTETYPE_EGGMAN, } kartroulettetype_t; -typedef enum { - KITEMBLINKMODE_NORMAL, - KITEMBLINKMODE_MASHED, - KITEMBLINKMODE_KARMA, -} kartitemblinkmode_t; - typedef enum { KSHIELD_NONE = 0, diff --git a/src/deh_tables.c b/src/deh_tables.c index 422e60be9..4ae8378de 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1554,10 +1554,11 @@ struct int_const_s const INT_CONST[] = { {"KROULETTETYPE_KARMA",KROULETTETYPE_KARMA}, {"KROULETTETYPE_EGGMAN",KROULETTETYPE_EGGMAN}, - // kartitemblinkmode_t - {"KITEMBLINKMODE_NORMAL",KITEMBLINKMODE_NORMAL}, - {"KITEMBLINKMODE_MASHED",KITEMBLINKMODE_MASHED}, - {"KITEMBLINKMODE_KARMA",KITEMBLINKMODE_KARMA}, + // kartitemblink_e + {"KITEMBLINK_NORMAL",KITEMBLINK_NORMAL}, + {"KITEMBLINK_MASHED",KITEMBLINK_MASHED}, + {"KITEMBLINK_KARMA",KITEMBLINK_KARMA}, + {"KITEMBLINK_DEBUG",KITEMBLINK_DEBUG}, // kartitemflags_e {"KIF_UNIQUESLOT",KIF_UNIQUESLOT}, diff --git a/src/k_hud.c b/src/k_hud.c index 1753919a3..6d2f43617 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -1332,10 +1332,11 @@ static void K_drawKartItem(void) switch (stplyr->itemblinkmode) { - case 2: + case KITEMBLINK_DEBUG: + case KITEMBLINK_KARMA: localcolor = K_RainbowColor(leveltime); break; - case 1: + case KITEMBLINK_MASHED: localcolor = SKINCOLOR_RED; break; default: diff --git a/src/k_items.c b/src/k_items.c index c8c8978a1..bbebb7cd6 100644 --- a/src/k_items.c +++ b/src/k_items.c @@ -184,8 +184,10 @@ kartitemflags_e K_GetItemFlags(kartitemtype_e itemtype) UINT8 K_GetItemNumberDisplayMin(kartitemtype_e type, boolean tiny) { + if (type == MAXKARTITEMS) + type = 0; // KITEM_SAD displays like normal if (type >= numkartitems) - return 1; + return 1; // actually broken items show x1 to let you know return kartitems[type].flags & KIF_ANIMATED ? 2 : kartitems[type].graphics[tiny ? 1 : 0].numpatches + 1; } @@ -307,43 +309,60 @@ static UINT32 K_IntDistanceForMap(fixed_t curx, \return Don't double for this item? */ -static boolean K_DontDoubleMyItems(const kartresult_t *result) +static boolean K_DontDoubleMyItems(kartitemtype_e type, UINT8 amount) { - return result->type == KITEM_BALLHOG || result->type == KITEM_SPB - || result->type == KITEM_INVINCIBILITY || result->type == KITEM_GROW - || result->type == KITEM_BUBBLESHIELD || result->type == KITEM_FLAMESHIELD - || result->type == KITEM_ROCKETSNEAKER || result->type == KITEM_SHRINK - || result->type == KITEM_HYUDORO - || (result->type == KITEM_BANANA && result->amount >= 4) - || (result->type == KITEM_ORBINAUT && result->amount >= 3) - || (result->type == KITEM_SNEAKER && result->amount >= 3) - || (result->type == KITEM_JAWZ && result->amount >= 2) - || result->type >= KITEM_FIRSTFREESLOT; // TODO: excludes custom items for now + return type == KITEM_BALLHOG || type == KITEM_SPB + || type == KITEM_INVINCIBILITY || type == KITEM_GROW + || type == KITEM_BUBBLESHIELD || type == KITEM_FLAMESHIELD + || type == KITEM_ROCKETSNEAKER || type == KITEM_SHRINK + || type == KITEM_HYUDORO + || (type == KITEM_BANANA && amount >= 4) + || (type == KITEM_ORBINAUT && amount >= 3) + || (type == KITEM_SNEAKER && amount >= 3) + || (type == KITEM_JAWZ && amount >= 2) + || type >= KITEM_FIRSTFREESLOT; // TODO: excludes custom items for now } -static void K_AwardPlayerItem(player_t *player, kartresult_t *result) +static sfxenum_t resultfx[] = { + [KITEMBLINK_NORMAL] = sfx_itrolf, + [KITEMBLINK_MASHED] = sfx_itrolm, + [KITEMBLINK_KARMA] = sfx_itrolk, + [KITEMBLINK_DEBUG] = sfx_dbgsal, +}; + +// be careful with invalid item types here +void K_AwardPlayerItem(player_t *player, kartitemtype_e type, UINT8 amount, kartitemblink_e blink) { K_BotResetItemConfirm(player, true); + player->itemblink = TICRATE; + player->itemblinkmode = blink; + player->itemroulette = KROULETTE_DISABLED; // Since we're done, clear the roulette number + player->roulettetype = KROULETTETYPE_NORMAL; // This too + + if (P_IsDisplayPlayer(player)) + S_StartSound(NULL, resultfx[blink]); + + player->itemtype = type; + + if (K_IsAltShrunk(player) && !K_DontDoubleMyItems(type, amount) && blink != KITEMBLINK_DEBUG) + amount *= 2; + + player->itemamount = amount; +} + +static void K_AwardPlayerResult(player_t *player, kartresult_t *result, kartitemblink_e blink) +{ + kartitemtype_e type = result != NULL ? result->type : MAXKARTITEMS; + UINT8 amount = result != NULL ? result->amount : 1; + + K_AwardPlayerItem(player, type, amount, blink); + if (result == NULL) - { - player->itemtype = MAXKARTITEMS; - player->itemamount = 1; return; - } if (result->basecooldown > 0) result->cooldown = result->basecooldown; - - player->itemtype = result->type; - UINT8 itemamount = result->amount; - - if (K_IsAltShrunk(player) && !K_DontDoubleMyItems(result)) - { - itemamount *= 2; - } - - player->itemamount = itemamount; } static fixed_t K_ItemOddsScale(UINT8 numPlayers, boolean spbrush) @@ -1308,14 +1327,7 @@ void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) // Give a debug item instead if specified if (cv_kartdebugitem.value != 0 && !modeattacking) { - player->itemtype = cv_kartdebugitem.value; - player->itemamount = cv_kartdebugamount.value; - player->itemblink = TICRATE; - player->itemblinkmode = KITEMBLINKMODE_KARMA; - player->itemroulette = KROULETTE_DISABLED; - player->roulettetype = KROULETTETYPE_NORMAL; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_dbgsal); + K_AwardPlayerItem(player, cv_kartdebugitem.value, cv_kartdebugamount.value, KITEMBLINK_DEBUG); return; } @@ -1324,14 +1336,7 @@ void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) if (!(gametyperules & GTR_RACEODDS) && !(gametyperules & GTR_BATTLEODDS)) { UINT8 itemroll = P_RandomRange(0, numkartresults - 1); - - K_AwardPlayerItem(player, &kartresults[itemroll]); - player->itemblink = TICRATE; - player->itemblinkmode = KITEMBLINKMODE_NORMAL; - player->itemroulette = KROULETTE_DISABLED; - player->roulettetype = KROULETTETYPE_NORMAL; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolf); + K_AwardPlayerResult(player, &kartresults[itemroll], KITEMBLINK_NORMAL); return; } @@ -1345,50 +1350,25 @@ void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) { if (mashed && (K_ItemResultEnabled(K_GetKartResult("superring")) || (modeattacking && K_RingsActive()))) // ANY mashed value? You get rings. { - K_AwardPlayerItem(player, K_GetKartResult("superring")); - player->itemblinkmode = KITEMBLINKMODE_MASHED; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolm); + K_AwardPlayerResult(player, K_GetKartResult("superring"), KITEMBLINK_MASHED); } else { if (modeattacking || K_ItemResultEnabled(K_GetKartResult("sneaker"))) // Waited patiently? You get a sneaker! - K_AwardPlayerItem(player, K_GetKartResult("sneaker")); + K_AwardPlayerResult(player, K_GetKartResult("sneaker"), KITEMBLINK_NORMAL); else // Default to sad if nothing's enabled... - K_AwardPlayerItem(player, NULL); - player->itemblinkmode = KITEMBLINKMODE_NORMAL; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolf); + K_AwardPlayerResult(player, NULL, KITEMBLINK_NORMAL); } } else if (gametyperules & GTR_BATTLEODDS) { if (mashed && (bossinfo.boss || K_ItemResultEnabled(K_GetKartResult("banana"))) && !itembreaker) // ANY mashed value? You get a banana. - { - K_AwardPlayerItem(player, K_GetKartResult("banana")); - player->itemblinkmode = KITEMBLINKMODE_MASHED; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolm); - } + K_AwardPlayerResult(player, K_GetKartResult("banana"), KITEMBLINK_MASHED); else if (bossinfo.boss) - { - K_AwardPlayerItem(player, K_GetKartResult("orbinaut")); - player->itemblinkmode = KITEMBLINKMODE_NORMAL; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolf); - } + K_AwardPlayerResult(player, K_GetKartResult("orbinaut"), KITEMBLINK_NORMAL); else if (itembreaker) - { - K_AwardPlayerItem(player, K_GetKartResult("sneaker")); - player->itemblinkmode = KITEMBLINKMODE_MASHED; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolm); - } + K_AwardPlayerResult(player, K_GetKartResult("sneaker"), KITEMBLINK_MASHED); } - - player->itemblink = TICRATE; - player->itemroulette = KROULETTE_DISABLED; - player->roulettetype = KROULETTETYPE_NORMAL; return; } @@ -1399,13 +1379,7 @@ void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) INT32 debtamount = min(abs(player->ringmin), abs(player->rings)); if (P_RandomChance((debtamount*FRACUNIT)/abs(player->ringmin))) { - K_AwardPlayerItem(player, K_GetKartResult("superring")); - player->itemblink = TICRATE; - player->itemblinkmode = KITEMBLINKMODE_MASHED; - player->itemroulette = KROULETTE_DISABLED; - player->roulettetype = KROULETTETYPE_NORMAL; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolm); + K_AwardPlayerResult(player, K_GetKartResult("superring"), KITEMBLINK_MASHED); return; } } @@ -1416,13 +1390,7 @@ void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) && spbplace == -1 && K_GetKartResult("spb")->cooldown == 0 && !dontforcespb && K_ItemResultEnabled(K_GetKartResult("spb"))) { - K_AwardPlayerItem(player, K_GetKartResult("spb")); - player->itemblink = TICRATE; - player->itemblinkmode = KITEMBLINKMODE_KARMA; - player->itemroulette = KROULETTE_DISABLED; - player->roulettetype = KROULETTETYPE_NORMAL; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolk); + K_AwardPlayerResult(player, K_GetKartResult("spb"), KITEMBLINK_KARMA); return; } @@ -1465,13 +1433,7 @@ void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) if ((bestforce) && (forceresult)) { - K_AwardPlayerItem(player, forceresult); - player->itemblink = TICRATE; - player->itemblinkmode = KITEMBLINKMODE_KARMA; - player->itemroulette = KROULETTE_DISABLED; - player->roulettetype = KROULETTETYPE_NORMAL; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolk); + K_AwardPlayerResult(player, forceresult, KITEMBLINK_KARMA); return; } } @@ -1483,26 +1445,14 @@ void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) } // Award the player whatever power is rolled + kartresult_t *result = NULL; if (totalspawnchance > 0) { totalspawnchance = P_RandomKey(totalspawnchance); for (i = 0; i < numkartresults && spawnchance[i] <= totalspawnchance; i++); - - K_AwardPlayerItem(player, &kartresults[i]); + result = &kartresults[i]; } - else - { - K_AwardPlayerItem(player, NULL); - } - - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, ((player->roulettetype == KROULETTETYPE_KARMA) ? sfx_itrolk : (mashed ? sfx_itrolm : sfx_itrolf))); - - player->itemblink = TICRATE; - player->itemblinkmode = ((player->roulettetype == KROULETTETYPE_KARMA) ? KITEMBLINKMODE_KARMA : (mashed ? KITEMBLINKMODE_MASHED : KITEMBLINKMODE_NORMAL)); - - player->itemroulette = KROULETTE_DISABLED; // Since we're done, clear the roulette number - player->roulettetype = KROULETTETYPE_NORMAL; // This too + K_AwardPlayerResult(player, result, player->roulettetype == KROULETTETYPE_KARMA ? KITEMBLINK_KARMA : mashed ? KITEMBLINK_MASHED : KITEMBLINK_NORMAL); } void K_SetPlayerItemCooldown(player_t *player, tic_t timer, boolean force) diff --git a/src/k_items.h b/src/k_items.h index 4b0b05791..9925fc8ee 100644 --- a/src/k_items.h +++ b/src/k_items.h @@ -43,6 +43,14 @@ typedef enum #define MAXKARTRESULTS 255 +typedef enum +{ + KITEMBLINK_NORMAL, + KITEMBLINK_MASHED, + KITEMBLINK_KARMA, + KITEMBLINK_DEBUG, +} kartitemblink_e; + typedef enum { ODDS_RACE, @@ -161,8 +169,9 @@ boolean K_IsKartItemAlternate(kartitemtype_e itemtype); kartitemflags_e K_GetItemFlags(kartitemtype_e itemtype); UINT8 K_GetItemNumberDisplayMin(kartitemtype_e type, boolean tiny); patch_t *K_GetCachedItemPatch(kartitemtype_e type, boolean tiny, UINT8 amount); -void K_UpdateMobjItemOverlay(mobj_t *part, kartitemtype_e itemType, UINT8 itemCount); +void K_AwardPlayerItem(player_t *player, kartitemtype_e type, UINT8 amount, kartitemblink_e blink); +void K_UpdateMobjItemOverlay(mobj_t *part, kartitemtype_e itemType, UINT8 itemCount); void K_UpdateItemCooldown(void); tic_t K_GetIndirectItemCooldown(void); void K_SetIndirectItemCooldown(tic_t cooldown); diff --git a/src/k_kart.c b/src/k_kart.c index 69f58771a..078987902 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7178,7 +7178,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->itemblink && player->itemblink-- <= 0) { - player->itemblinkmode = KITEMBLINKMODE_NORMAL; + player->itemblinkmode = KITEMBLINK_NORMAL; player->itemblink = 0; } diff --git a/src/p_inter.c b/src/p_inter.c index 3b066ecb0..db594a633 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1742,25 +1742,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget break; } - if (target->threshold < 1 || target->threshold >= numkartitems) // bruh moment prevention - { - player->itemtype = MAXKARTITEMS; - player->itemamount = 1; - } - else - { - player->itemtype = target->threshold; - if (K_GetShieldFromPlayer(player) != KSHIELD_NONE) // never give more than 1 shield - player->itemamount = 1; - else - player->itemamount = max(1, target->movecount); - } - player->itemblink = TICRATE; - player->itemblinkmode = KITEMBLINKMODE_NORMAL; - player->itemroulette = KROULETTE_DISABLED; - player->roulettetype = KROULETTETYPE_NORMAL; - if (P_IsDisplayPlayer(player)) - S_StartSound(NULL, sfx_itrolf); + K_AwardPlayerItem(player, target->threshold, max(1, target->movecount), KITEMBLINK_NORMAL); } break; }