From 375fb72de1548a776ecbec4909e6edd07b83a5c8 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 23 Sep 2022 03:07:35 -0700 Subject: [PATCH 1/2] Add K_GetRollingRouletteItem, refactor item drawers Roulette now cycles through all single items (that have odds). Added missing shields and drop target. --- src/k_hud.c | 187 ++++++++++++++------------------------------------- src/k_kart.c | 35 +++++++++- src/k_kart.h | 1 + src/p_mobj.c | 74 +------------------- 4 files changed, 86 insertions(+), 211 deletions(-) diff --git a/src/k_hud.c b/src/k_hud.c index fd4493a93..91c0abb88 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -695,6 +695,40 @@ const char *K_GetItemPatch(UINT8 item, boolean tiny) } } +static patch_t **K_GetItemPatchTable(INT32 item) +{ + patch_t **kp[1 + NUMKARTITEMS] = { + kp_sadface, + NULL, + kp_sneaker, + kp_rocketsneaker, + kp_invincibility, + kp_banana, + kp_eggman, + kp_orbinaut, + kp_jawz, + kp_mine, + kp_landmine, + kp_ballhog, + kp_selfpropelledbomb, + kp_grow, + kp_shrink, + kp_lightningshield, + kp_bubbleshield, + kp_flameshield, + kp_hyudoro, + kp_pogospring, + kp_superring, + kp_kitchensink, + kp_droptarget, + }; + + if (item >= KITEM_SAD && item < NUMKARTITEMS) + return kp[item - KITEM_SAD]; + else + return NULL; +} + //} INT32 ITEM_X, ITEM_Y; // Item Window @@ -1096,90 +1130,23 @@ static void K_drawKartItem(void) if (stplyr->itemroulette) { + const INT32 item = K_GetRollingRouletteItem(stplyr); + if (stplyr->skincolor) localcolor = stplyr->skincolor; - switch((stplyr->itemroulette % (16*3)) / 3) + switch (item) { - // Each case is handled in threes, to give three frames of in-game time to see the item on the roulette - case 0: // Sneaker - localpatch = kp_sneaker[offset]; - //localcolor = SKINCOLOR_RASPBERRY; - break; - case 1: // Banana - localpatch = kp_banana[offset]; - //localcolor = SKINCOLOR_YELLOW; - break; - case 2: // Orbinaut - localpatch = kp_orbinaut[3+offset]; - //localcolor = SKINCOLOR_STEEL; - break; - case 3: // Mine - localpatch = kp_mine[offset]; - //localcolor = SKINCOLOR_JET; - break; - case 4: // Grow - localpatch = kp_grow[offset]; - //localcolor = SKINCOLOR_TEAL; - break; - case 5: // Hyudoro - localpatch = kp_hyudoro[offset]; - //localcolor = SKINCOLOR_STEEL; - break; - case 6: // Rocket Sneaker - localpatch = kp_rocketsneaker[offset]; - //localcolor = SKINCOLOR_TANGERINE; - break; - case 7: // Jawz - localpatch = kp_jawz[offset]; - //localcolor = SKINCOLOR_JAWZ; - break; - case 8: // Self-Propelled Bomb - localpatch = kp_selfpropelledbomb[offset]; - //localcolor = SKINCOLOR_JET; - break; - case 9: // Shrink - localpatch = kp_shrink[offset]; - //localcolor = SKINCOLOR_ORANGE; - break; - case 10: // Invincibility + case KITEM_INVINCIBILITY: localpatch = localinv; - //localcolor = SKINCOLOR_GREY; break; - case 11: // Eggman Monitor - localpatch = kp_eggman[offset]; - //localcolor = SKINCOLOR_ROSE; + + case KITEM_ORBINAUT: + localpatch = kp_orbinaut[3 + offset]; break; - case 12: // Ballhog - localpatch = kp_ballhog[offset]; - //localcolor = SKINCOLOR_LILAC; - break; - case 13: // Lightning Shield - localpatch = kp_lightningshield[offset]; - //localcolor = SKINCOLOR_CYAN; - break; - case 14: // Super Ring - localpatch = kp_superring[offset]; - //localcolor = SKINCOLOR_GOLD; - break; - case 15: // Land Mine - localpatch = kp_landmine[offset]; - //localcolor = SKINCOLOR_JET; - break; - case 16: // Drop Target - localpatch = kp_droptarget[offset]; - //localcolor = SKINCOLOR_LIME; - break; - /*case 17: // Pogo Spring - localpatch = kp_pogospring[offset]; - localcolor = SKINCOLOR_TANGERINE; - break; - case 18: // Kitchen Sink - localpatch = kp_kitchensink[offset]; - localcolor = SKINCOLOR_STEEL; - break;*/ + default: - break; + localpatch = K_GetItemPatchTable(item)[offset]; } } else @@ -1240,79 +1207,27 @@ static void K_drawKartItem(void) switch(stplyr->itemtype) { - case KITEM_SNEAKER: - localpatch = kp_sneaker[offset]; - break; - case KITEM_ROCKETSNEAKER: - localpatch = kp_rocketsneaker[offset]; - break; case KITEM_INVINCIBILITY: localpatch = localinv; localbg = kp_itembg[offset+1]; break; - case KITEM_BANANA: - localpatch = kp_banana[offset]; - break; - case KITEM_EGGMAN: - localpatch = kp_eggman[offset]; - break; + case KITEM_ORBINAUT: localpatch = kp_orbinaut[(offset ? 4 : min(stplyr->itemamount-1, 3))]; break; - case KITEM_JAWZ: - localpatch = kp_jawz[offset]; - break; - case KITEM_MINE: - localpatch = kp_mine[offset]; - break; - case KITEM_LANDMINE: - localpatch = kp_landmine[offset]; - break; - case KITEM_DROPTARGET: - localpatch = kp_droptarget[offset]; - break; - case KITEM_BALLHOG: - localpatch = kp_ballhog[offset]; - break; + case KITEM_SPB: - localpatch = kp_selfpropelledbomb[offset]; - localbg = kp_itembg[offset+1]; - break; - case KITEM_GROW: - localpatch = kp_grow[offset]; - break; - case KITEM_SHRINK: - localpatch = kp_shrink[offset]; - break; case KITEM_LIGHTNINGSHIELD: - localpatch = kp_lightningshield[offset]; - localbg = kp_itembg[offset+1]; - break; case KITEM_BUBBLESHIELD: - localpatch = kp_bubbleshield[offset]; - localbg = kp_itembg[offset+1]; - break; case KITEM_FLAMESHIELD: - localpatch = kp_flameshield[offset]; localbg = kp_itembg[offset+1]; - break; - case KITEM_HYUDORO: - localpatch = kp_hyudoro[offset]; - break; - case KITEM_POGOSPRING: - localpatch = kp_pogospring[offset]; - break; - case KITEM_SUPERRING: - localpatch = kp_superring[offset]; - break; - case KITEM_KITCHENSINK: - localpatch = kp_kitchensink[offset]; - break; - case KITEM_SAD: - localpatch = kp_sadface[offset]; - break; + /*FALLTHRU*/ + default: - localpatch = kp_nodraw; // diagnose underflows + localpatch = K_GetItemPatchTable(stplyr->itemtype)[offset]; + + if (localpatch == NULL) + localpatch = kp_nodraw; // diagnose underflows break; } diff --git a/src/k_kart.c b/src/k_kart.c index 99f74b751..c645e8914 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -350,7 +350,7 @@ consvar_t *KartItemCVars[NUMKARTRESULTS-1] = #define NUMKARTODDS 80 // Less ugly 2D arrays -static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = +static UINT8 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = { //P-Odds 0 1 2 3 4 5 6 7 /*Sneaker*/ { 0, 0, 2, 4, 6, 0, 0, 0 }, // Sneaker @@ -383,7 +383,7 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = /*Jawz x2*/ { 0, 0, 1, 2, 1, 0, 0, 0 } // Jawz x2 }; -static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] = +static UINT8 K_KartItemOddsBattle[NUMKARTRESULTS][2] = { //P-Odds 0 1 /*Sneaker*/ { 2, 1 }, // Sneaker @@ -899,6 +899,37 @@ UINT8 K_FindUseodds(player_t *player, fixed_t mashed, UINT32 pdis, UINT8 bestbum return useodds; } +INT32 K_GetRollingRouletteItem(player_t *player) +{ + static UINT8 translation[NUMKARTITEMS-1]; + static UINT16 roulette_size; + + static boolean odds_uncached = true; + + const UINT8 EMPTYODDS[sizeof K_KartItemOddsRace[0]] = {0}; + + if (odds_uncached) + { + UINT8 i; + + roulette_size = 0; + + for (i = 1; i < NUMKARTITEMS; ++i) + { + if (memcmp(K_KartItemOddsRace[i - 1], EMPTYODDS, sizeof EMPTYODDS)) + { + translation[roulette_size] = i; + roulette_size++; + } + } + + roulette_size *= 3; + odds_uncached = false; + } + + return translation[(player->itemroulette % roulette_size) / 3]; +} + static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) { INT32 i; diff --git a/src/k_kart.h b/src/k_kart.h index 46f97a3f5..98a372188 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -48,6 +48,7 @@ UINT8 K_FindUseodds(player_t *player, fixed_t mashed, UINT32 pdis, UINT8 bestbum fixed_t K_ItemOddsScale(UINT8 numPlayers, boolean spbrush); UINT32 K_ScaleItemDistance(UINT32 distance, UINT8 numPlayers, boolean spbrush); INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, UINT32 ourDist, fixed_t mashed, boolean spbrush, boolean bot, boolean rival); +INT32 K_GetRollingRouletteItem(player_t *player); INT32 K_GetShieldFromItem(INT32 item); fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against); boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2); diff --git a/src/p_mobj.c b/src/p_mobj.c index 28b596e2e..42d8c8302 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5997,79 +5997,7 @@ static void P_MobjSceneryThink(mobj_t *mobj) { P_SetMobjState(mobj, S_PLAYERARROW_BOX); mobj->tracer->sprite = SPR_ITEM; - switch((mobj->target->player->itemroulette % (16*3)) / 3) - { - // Each case is handled in threes, to give three frames of in-game time to see the item on the roulette - case 0: // Sneaker - mobj->tracer->frame = KITEM_SNEAKER; - //localcolor = SKINCOLOR_RASPBERRY; - break; - case 1: // Banana - mobj->tracer->frame = KITEM_BANANA; - //localcolor = SKINCOLOR_YELLOW; - break; - case 2: // Orbinaut - mobj->tracer->frame = KITEM_ORBINAUT; - //localcolor = SKINCOLOR_STEEL; - break; - case 3: // Mine - mobj->tracer->frame = KITEM_MINE; - //localcolor = SKINCOLOR_JET; - break; - case 4: // Grow - mobj->tracer->frame = KITEM_GROW; - //localcolor = SKINCOLOR_TEAL; - break; - case 5: // Hyudoro - mobj->tracer->frame = KITEM_HYUDORO; - //localcolor = SKINCOLOR_STEEL; - break; - case 6: // Rocket Sneaker - mobj->tracer->frame = KITEM_ROCKETSNEAKER; - //localcolor = SKINCOLOR_TANGERINE; - break; - case 7: // Jawz - mobj->tracer->frame = KITEM_JAWZ; - //localcolor = SKINCOLOR_JAWZ; - break; - case 8: // Self-Propelled Bomb - mobj->tracer->frame = KITEM_SPB; - //localcolor = SKINCOLOR_JET; - break; - case 9: // Shrink - mobj->tracer->frame = KITEM_SHRINK; - //localcolor = SKINCOLOR_ORANGE; - break; - case 10: // Invincibility - mobj->tracer->frame = KITEM_INVINCIBILITY; - //localcolor = SKINCOLOR_GREY; - break; - case 11: // Eggman Monitor - mobj->tracer->frame = KITEM_EGGMAN; - //localcolor = SKINCOLOR_ROSE; - break; - case 12: // Ballhog - mobj->tracer->frame = KITEM_BALLHOG; - //localcolor = SKINCOLOR_LILAC; - break; - case 13: // Lightning Shield - mobj->tracer->frame = KITEM_LIGHTNINGSHIELD; - //localcolor = SKINCOLOR_CYAN; - break; - case 14: // Super Ring - mobj->tracer->frame = KITEM_SUPERRING; - //localcolor = SKINCOLOR_GOLD; - break; - case 15: // Land Mine - mobj->tracer->frame = KITEM_LANDMINE; - //localcolor = SKINCOLOR_JET; - break; - case 16: // Drop Target - mobj->tracer->frame = KITEM_DROPTARGET; - //localcolor = SKINCOLOR_LIME; - break; - } - mobj->tracer->frame |= FF_FULLBRIGHT; + mobj->tracer->frame = K_GetRollingRouletteItem(mobj->target->player) | FF_FULLBRIGHT; mobj->tracer->renderflags &= ~RF_DONTDRAW; } else if (mobj->target->player->stealingtimer < 0) From 3d01fca41ba64eab35a00ca305ccdea94bd0961c Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 23 Sep 2022 04:29:40 -0700 Subject: [PATCH 2/2] K_GetRollingRouletteItem: support Battle --- src/k_kart.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index c645e8914..fd260891d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -904,27 +904,44 @@ INT32 K_GetRollingRouletteItem(player_t *player) static UINT8 translation[NUMKARTITEMS-1]; static UINT16 roulette_size; - static boolean odds_uncached = true; + static INT16 odds_cached = -1; + // Race odds have more columns than Battle const UINT8 EMPTYODDS[sizeof K_KartItemOddsRace[0]] = {0}; - if (odds_uncached) + if (odds_cached != gametype) { + UINT8 *odds_row; + size_t odds_row_size; + UINT8 i; roulette_size = 0; + if (gametype == GT_BATTLE) + { + odds_row = K_KartItemOddsBattle[0]; + odds_row_size = sizeof K_KartItemOddsBattle[0]; + } + else + { + odds_row = K_KartItemOddsRace[0]; + odds_row_size = sizeof K_KartItemOddsRace[0]; + } + for (i = 1; i < NUMKARTITEMS; ++i) { - if (memcmp(K_KartItemOddsRace[i - 1], EMPTYODDS, sizeof EMPTYODDS)) + if (memcmp(odds_row, EMPTYODDS, odds_row_size)) { translation[roulette_size] = i; roulette_size++; } + + odds_row += odds_row_size; } roulette_size *= 3; - odds_uncached = false; + odds_cached = gametype; } return translation[(player->itemroulette % roulette_size) / 3];