WIP: Ring Box

This commit is contained in:
AJ Martinez 2023-06-14 23:32:31 -07:00
parent 5eeb29d552
commit 41540ed9e5
10 changed files with 163 additions and 14 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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