From 41540ed9e5a6ed17e59a14a1d4c957bf11176f25 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Wed, 14 Jun 2023 23:32:31 -0700 Subject: [PATCH] WIP: Ring Box --- src/d_netcmd.c | 8 +++++- src/d_player.h | 9 +++++- src/k_hud.c | 36 +++++++++++++++++++++++- src/k_kart.c | 42 ++++++++++++++++++++++++++++ src/k_roulette.c | 59 +++++++++++++++++++++++++++++++++++---- src/k_roulette.h | 10 ++++--- src/objects/random-item.c | 3 ++ src/p_enemy.c | 7 ++++- src/p_inter.c | 2 +- src/p_mobj.c | 1 + 10 files changed, 163 insertions(+), 14 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 712c01a3f..66878ca66 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -398,7 +398,13 @@ consvar_t cv_items[NUMKARTRESULTS-1] = { CVAR_INIT ("tripleorbinaut", "On", CV_NETVAR, CV_OnOff, NULL), CVAR_INIT ("quadorbinaut", "On", CV_NETVAR, CV_OnOff, NULL), CVAR_INIT ("dualjawz", "On", CV_NETVAR, CV_OnOff, NULL), - CVAR_INIT ("triplegachabom", "On", CV_NETVAR, CV_OnOff, NULL) + CVAR_INIT ("triplegachabom", "On", CV_NETVAR, CV_OnOff, NULL), + CVAR_INIT ("bar", "On", CV_NETVAR, CV_OnOff, NULL), + CVAR_INIT ("doublebar", "On", CV_NETVAR, CV_OnOff, NULL), + CVAR_INIT ("triplebar", "On", CV_NETVAR, CV_OnOff, NULL), + CVAR_INIT ("slotring", "On", CV_NETVAR, CV_OnOff, NULL), + CVAR_INIT ("seven", "On", CV_NETVAR, CV_OnOff, NULL), + CVAR_INIT ("jackpot", "On", CV_NETVAR, CV_OnOff, NULL) }; consvar_t cv_kartspeed = CVAR_INIT ("gamespeed", "Auto", CV_NETVAR|CV_CALL|CV_NOINIT, kartspeed_cons_t, KartSpeed_OnChange); diff --git a/src/d_player.h b/src/d_player.h index 877f65c59..56378db93 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -160,7 +160,13 @@ Run this macro, then #undef FOREACH afterward FOREACH (KITCHENSINK, 20),\ FOREACH (DROPTARGET, 21),\ FOREACH (GARDENTOP, 22),\ - FOREACH (GACHABOM, 23) + FOREACH (GACHABOM, 23),\ + FOREACH (BAR, 24),\ + FOREACH (DOUBLEBAR, 25),\ + FOREACH (TRIPLEBAR, 26),\ + FOREACH (SLOTRING, 27),\ + FOREACH (SEVEN, 28),\ + FOREACH (JACKPOT, 29) typedef enum { @@ -399,6 +405,7 @@ struct itemroulette_t tic_t elapsed; boolean eggman; + boolean ringbox; }; // enum for bot item priorities diff --git a/src/k_hud.c b/src/k_hud.c index f958ff6c9..30574a616 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -114,6 +114,7 @@ static patch_t *kp_wantedsplit; static patch_t *kp_wantedreticle; static patch_t *kp_itembg[4]; +static patch_t *kp_ringbg[4]; static patch_t *kp_itemtimer[2]; static patch_t *kp_itemmulsticker[2]; static patch_t *kp_itemx; @@ -142,6 +143,12 @@ static patch_t *kp_kitchensink[2]; static patch_t *kp_droptarget[2]; static patch_t *kp_gardentop[2]; static patch_t *kp_gachabom[2]; +static patch_t *kp_bar[2]; +static patch_t *kp_doublebar[2]; +static patch_t *kp_triplebar[2]; +static patch_t *kp_slotring[2]; +static patch_t *kp_seven[2]; +static patch_t *kp_jackpot[2]; static patch_t *kp_check[6]; @@ -443,6 +450,9 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_itemmulsticker[0], "K_ITMUL"); HU_UpdatePatch(&kp_itemx, "K_ITX"); + HU_UpdatePatch(&kp_ringbg[0], "K_RBBG"); + HU_UpdatePatch(&kp_ringbg[1], "K_SBBG"); + HU_UpdatePatch(&kp_sadface[0], "K_ITSAD"); HU_UpdatePatch(&kp_sneaker[0], "K_ITSHOE"); HU_UpdatePatch(&kp_rocketsneaker[0], "K_ITRSHE"); @@ -478,6 +488,12 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_droptarget[0], "K_ITDTRG"); HU_UpdatePatch(&kp_gardentop[0], "K_ITGTOP"); HU_UpdatePatch(&kp_gachabom[0], "K_ITGBOM"); + HU_UpdatePatch(&kp_bar[0], "K_RBBAR"); + HU_UpdatePatch(&kp_doublebar[0], "K_RBBAR2"); + HU_UpdatePatch(&kp_triplebar[0], "K_RBBAR3"); + HU_UpdatePatch(&kp_slotring[0], "K_RBRING"); + HU_UpdatePatch(&kp_seven[0], "K_RBSEV"); + HU_UpdatePatch(&kp_jackpot[0], "K_RBJACK"); sprintf(buffer, "FSMFGxxx"); for (i = 0; i < 104; i++) @@ -531,6 +547,12 @@ void K_LoadKartHUDGraphics(void) HU_UpdatePatch(&kp_droptarget[1], "K_ISDTRG"); HU_UpdatePatch(&kp_gardentop[1], "K_ISGTOP"); HU_UpdatePatch(&kp_gachabom[1], "K_ISGBOM"); + HU_UpdatePatch(&kp_bar[1], "K_SBBAR"); + HU_UpdatePatch(&kp_doublebar[1], "K_SBBAR2"); + HU_UpdatePatch(&kp_triplebar[1], "K_SBBAR3"); + HU_UpdatePatch(&kp_slotring[1], "K_SBRING"); + HU_UpdatePatch(&kp_seven[1], "K_SBSEV"); + HU_UpdatePatch(&kp_jackpot[1], "K_SBJACK"); sprintf(buffer, "FSMFSxxx"); for (i = 0; i < 104; i++) @@ -844,6 +866,12 @@ static patch_t *K_GetCachedItemPatch(INT32 item, UINT8 offset) kp_droptarget, kp_gardentop, kp_gachabom, + kp_bar, + kp_doublebar, + kp_triplebar, + kp_slotring, + kp_seven, + kp_jackpot, }; if (item == KITEM_SAD || (item > KITEM_NONE && item < NUMKARTITEMS)) @@ -1211,6 +1239,12 @@ static void K_drawKartItem(void) vector2_t rouletteCrop = {7, 7}; INT32 i; + if (stplyr->itemRoulette.ringbox) + { + // Todo: owl + localbg = offset ? kp_ringbg[1] : kp_ringbg[0]; + } + if (stplyr->itemRoulette.itemListLen > 0) { // Init with item roulette stuff. @@ -4943,7 +4977,7 @@ static void K_drawDistributionDebugger(void) return; } - K_FillItemRouletteData(stplyr, &rouletteData); + K_FillItemRouletteData(stplyr, &rouletteData, false); for (i = 0; i < rouletteData.itemListLen; i++) { diff --git a/src/k_kart.c b/src/k_kart.c index 33fcd8819..f1144f364 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -11430,6 +11430,48 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_UpdateHnextList(player, false); } break; + case KITEM_BAR: + if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) + { + K_AwardPlayerRings(player, 10, true); + player->itemamount--; + } + break; + case KITEM_DOUBLEBAR: + if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) + { + K_AwardPlayerRings(player, 20, true); + player->itemamount--; + } + break; + case KITEM_TRIPLEBAR: + if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) + { + K_AwardPlayerRings(player, 30, true); + player->itemamount--; + } + break; + case KITEM_SLOTRING: + if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) + { + K_AwardPlayerRings(player, 50, true); + player->itemamount--; + } + break; + case KITEM_SEVEN: + if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) + { + K_AwardPlayerRings(player, 77, true); + player->itemamount--; + } + break; + case KITEM_JACKPOT: + if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) + { + K_AwardPlayerRings(player, 150, true); + player->itemamount--; + } + break; case KITEM_SAD: if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO && !player->sadtimer) diff --git a/src/k_roulette.c b/src/k_roulette.c index 5a6f79dda..a6caea8b1 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -100,6 +100,12 @@ static UINT8 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = { 3, 0, 0, 0, 0, 0, 0, 0 }, // Drop Target { 0, 0, 0, 1, 2, 2, 0, 0 }, // Garden Top { 0, 0, 0, 0, 0, 0, 0, 0 }, // Gachabom + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Bar + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Double Bar + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Triple Bar + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Slot Ring + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Seven + { 0, 0, 0, 0, 0, 0, 0, 0 }, // Jackpot { 0, 0, 2, 3, 3, 1, 0, 0 }, // Sneaker x2 { 0, 0, 0, 0, 4, 4, 4, 0 }, // Sneaker x3 { 0, 1, 1, 0, 0, 0, 0, 0 }, // Banana x3 @@ -134,6 +140,12 @@ static UINT8 K_KartItemOddsBattle[NUMKARTRESULTS-1][2] = { 2, 0 }, // Drop Target { 4, 0 }, // Garden Top { 0, 0 }, // Gachabom + { 0, 0 }, // Bar + { 0, 0 }, // Double Bar + { 0, 0 }, // Triple Bar + { 0, 0 }, // Slot Ring + { 0, 0 }, // Seven + { 0, 0 }, // Jackpot { 0, 0 }, // Sneaker x2 { 0, 1 }, // Sneaker x3 { 0, 0 }, // Banana x3 @@ -168,6 +180,12 @@ static UINT8 K_KartItemOddsSpecial[NUMKARTRESULTS-1][4] = { 0, 0, 0, 0 }, // Drop Target { 0, 0, 0, 0 }, // Garden Top { 0, 0, 0, 0 }, // Gachabom + { 0, 0, 0, 0 }, // Bar + { 0, 0, 0, 0 }, // Double Bar + { 0, 0, 0, 0 }, // Triple Bar + { 0, 0, 0, 0 }, // Slot Ring + { 0, 0, 0, 0 }, // Seven + { 0, 0, 0, 0 }, // Jackpot { 0, 1, 1, 0 }, // Sneaker x2 { 0, 0, 1, 1 }, // Sneaker x3 { 0, 0, 0, 0 }, // Banana x3 @@ -218,6 +236,17 @@ static kartitems_t K_KartItemReelBoss[] = KITEM_NONE }; +static kartitems_t K_KartItemReelRingBox[] = +{ + KITEM_BAR, + KITEM_DOUBLEBAR, + KITEM_TRIPLEBAR, + KITEM_SLOTRING, + KITEM_SEVEN, + KITEM_JACKPOT, + KITEM_NONE +}; + /*-------------------------------------------------- boolean K_ItemEnabled(kartitems_t item) @@ -1052,6 +1081,7 @@ static void K_InitRoulette(itemroulette_t *const roulette) roulette->active = true; roulette->eggman = false; + roulette->ringbox = false; for (i = 0; i < MAXPLAYERS; i++) { @@ -1257,7 +1287,7 @@ static void K_CalculateRouletteSpeed(itemroulette_t *const roulette) See header file for description. --------------------------------------------------*/ -void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulette) +void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulette, boolean ringbox) { UINT32 spawnChance[NUMKARTRESULTS] = {0}; UINT32 totalSpawnChance = 0; @@ -1284,6 +1314,22 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet return; } + // SPECIAL CASE No. 1.5: + // If this is being invoked by a Ring Box, it should literally never produce items. + if (ringbox) + { + kartitems_t *presetlist = K_KartItemReelRingBox; + + roulette->ringbox = true; + + for (i = 0; presetlist[i] != KITEM_NONE; i++) + { + K_PushToRouletteItemList(roulette, presetlist[i]); + } + + return; + } + // SPECIAL CASE No. 2: // Use a special, pre-determined item reel for Time Attack / Free Play / End of Sealed Stars if (specialstageinfo.valid) @@ -1412,12 +1458,12 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet See header file for description. --------------------------------------------------*/ -void K_StartItemRoulette(player_t *const player) +void K_StartItemRoulette(player_t *const player, boolean ringbox) { itemroulette_t *const roulette = &player->itemRoulette; size_t i; - K_FillItemRouletteData(player, roulette); + K_FillItemRouletteData(player, roulette, ringbox); if (K_PlayerUsesBotMovement(player) == true) { @@ -1444,7 +1490,7 @@ void K_StartItemRoulette(player_t *const player) void K_StartEggmanRoulette(player_t *const player) { itemroulette_t *const roulette = &player->itemRoulette; - K_StartItemRoulette(player); + K_StartItemRoulette(player, false); roulette->eggman = true; } @@ -1603,7 +1649,10 @@ void K_KartItemRoulette(player_t *const player, ticcmd_t *const cmd) if (P_IsDisplayPlayer(player) && !demo.freecam) { - S_StartSound(NULL, sfx_itrol1 + roulette->sound); + if (roulette->ringbox) + S_StartSound(NULL, sfx_s240); + else + S_StartSound(NULL, sfx_itrol1 + roulette->sound); } } else diff --git a/src/k_roulette.h b/src/k_roulette.h index 61624525d..379a67434 100644 --- a/src/k_roulette.h +++ b/src/k_roulette.h @@ -98,7 +98,7 @@ INT32 K_KartGetItemOdds(const player_t *player, itemroulette_t *const roulette, /*-------------------------------------------------- - void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulette); + void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulette, boolean ringbox); Fills out the item roulette struct when it is initially created. This function needs to be @@ -109,16 +109,17 @@ INT32 K_KartGetItemOdds(const player_t *player, itemroulette_t *const roulette, 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_FillItemRouletteData(const player_t *player, itemroulette_t *const roulette); +void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulette, boolean ringbox); /*-------------------------------------------------- - void K_StartItemRoulette(player_t *const player); + void K_StartItemRoulette(player_t *const player, boolean ringbox); Starts the item roulette sequence for a player. This stage can only be used by gameplay, thus @@ -126,12 +127,13 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet Input Arguments:- player - The player to start the item roulette for. + ringbox - Is this roulette being started from a just-respawned Ring Box? Return:- N/A --------------------------------------------------*/ -void K_StartItemRoulette(player_t *const player); +void K_StartItemRoulette(player_t *const player, boolean ringbox); /*-------------------------------------------------- diff --git a/src/objects/random-item.c b/src/objects/random-item.c index 4ec2106fe..cae20f752 100644 --- a/src/objects/random-item.c +++ b/src/objects/random-item.c @@ -102,6 +102,8 @@ void Obj_RandomItemVisuals(mobj_t *mobj) ItemBoxBob(mobj); ItemBoxScaling(mobj); item_vfxtimer(mobj)++; + if (mobj->fuse == 0) + mobj->extravalue1++; } boolean Obj_RandomItemSpawnIn(mobj_t *mobj) @@ -116,6 +118,7 @@ boolean Obj_RandomItemSpawnIn(mobj_t *mobj) } else { + // Spawn a battle monitor in your place and Fucking Die mobj_t *paperspawner = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_PAPERITEMSPOT); paperspawner->spawnpoint = mobj->spawnpoint; mobj->spawnpoint->mobj = paperspawner; diff --git a/src/p_enemy.c b/src/p_enemy.c index 17aa6ea71..4553e4fe5 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -13006,9 +13006,14 @@ void A_ItemPop(mobj_t *actor) } else if (locvar1 == 0) { - K_StartItemRoulette(actor->target->player); + if (actor->extravalue1 >= TICRATE) + K_StartItemRoulette(actor->target->player, false); + else + K_StartItemRoulette(actor->target->player, true); } + actor->extravalue1 = 0; + // Here at mapload in battle? if (!(gametyperules & GTR_CIRCUIT) && (actor->flags2 & MF2_BOSSNOTRAP)) { diff --git a/src/p_inter.c b/src/p_inter.c index c771b3427..58dd878fc 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -434,7 +434,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (special->fuse || !P_CanPickupItem(player, 1)) return; - K_StartItemRoulette(player); + K_StartItemRoulette(player, false); // Karma fireworks /*for (i = 0; i < 5; i++) diff --git a/src/p_mobj.c b/src/p_mobj.c index f0e529a0d..4be545796 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9731,6 +9731,7 @@ static boolean P_FuseThink(mobj_t *mobj) // Transfer flags2 (strongbox, objectflip, bossnotrap) newmobj->flags2 = mobj->flags2; + newmobj->extravalue1 = 0; } P_RemoveMobj(mobj); // make sure they disappear