Cleanup K_AwardPlayerItem

This commit is contained in:
GenericHeroGuy 2025-11-12 22:49:00 +01:00
parent 15c64731e4
commit e95faf8b55
7 changed files with 80 additions and 143 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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