Implement the Special Stage item table

This commit is contained in:
Sally Coolatta 2022-11-22 00:39:53 -05:00
parent 0a733c7265
commit dc6caf1eb3
3 changed files with 97 additions and 30 deletions

View file

@ -60,5 +60,6 @@ mobj_t *Obj_SpawnBrolyKi(mobj_t *source, tic_t duration);
/* Special Stage UFO */ /* Special Stage UFO */
void Obj_SpecialUFOThinker(mobj_t *bomb); void Obj_SpecialUFOThinker(mobj_t *bomb);
mobj_t *Obj_CreateSpecialUFO(void); mobj_t *Obj_CreateSpecialUFO(void);
UINT32 K_GetSpecialUFODistance(void);
#endif/*k_objects_H*/ #endif/*k_objects_H*/

View file

@ -108,7 +108,6 @@ static UINT8 K_KartItemOddsRace[NUMKARTRESULTS-1][8] =
static UINT8 K_KartItemOddsBattle[NUMKARTRESULTS-1][2] = static UINT8 K_KartItemOddsBattle[NUMKARTRESULTS-1][2] =
{ {
//K L
{ 2, 1 }, // Sneaker { 2, 1 }, // Sneaker
{ 0, 0 }, // Rocket Sneaker { 0, 0 }, // Rocket Sneaker
{ 4, 1 }, // Invincibility { 4, 1 }, // Invincibility
@ -139,6 +138,38 @@ static UINT8 K_KartItemOddsBattle[NUMKARTRESULTS-1][2] =
{ 5, 1 } // Jawz x2 { 5, 1 } // Jawz x2
}; };
static UINT8 K_KartItemOddsSpecial[NUMKARTRESULTS-1][4] =
{
{ 1, 1, 0, 0 }, // Sneaker
{ 0, 0, 0, 0 }, // Rocket Sneaker
{ 0, 0, 0, 0 }, // Invincibility
{ 0, 0, 0, 0 }, // Banana
{ 0, 0, 0, 0 }, // Eggman Monitor
{ 1, 1, 0, 0 }, // Orbinaut
{ 1, 1, 0, 0 }, // Jawz
{ 0, 0, 0, 0 }, // Mine
{ 0, 0, 0, 0 }, // Land Mine
{ 0, 0, 0, 0 }, // Ballhog
{ 0, 0, 0, 1 }, // Self-Propelled Bomb
{ 0, 0, 0, 0 }, // Grow
{ 0, 0, 0, 0 }, // Shrink
{ 0, 0, 0, 0 }, // Lightning Shield
{ 0, 0, 0, 0 }, // Bubble Shield
{ 0, 0, 0, 0 }, // Flame Shield
{ 0, 0, 0, 0 }, // Hyudoro
{ 0, 0, 0, 0 }, // Pogo Spring
{ 0, 0, 0, 0 }, // Super Ring
{ 0, 0, 0, 0 }, // Kitchen Sink
{ 0, 0, 0, 0 }, // Drop Target
{ 0, 0, 0, 0 }, // Garden Top
{ 0, 1, 1, 0 }, // Sneaker x2
{ 0, 0, 1, 1 }, // Sneaker x3
{ 0, 0, 0, 0 }, // Banana x3
{ 0, 1, 1, 0 }, // Orbinaut x3
{ 0, 0, 1, 1 }, // Orbinaut x4
{ 0, 0, 1, 1 } // Jawz x2
};
static kartitems_t K_KartItemReelTimeAttack[] = static kartitems_t K_KartItemReelTimeAttack[] =
{ {
KITEM_SNEAKER, KITEM_SNEAKER,
@ -321,7 +352,6 @@ static UINT32 K_GetItemRouletteDistance(const player_t *player, UINT8 numPlayers
return 0; return 0;
} }
#if 0
if (specialStage.active == true) if (specialStage.active == true)
{ {
UINT32 ufoDis = K_GetSpecialUFODistance(); UINT32 ufoDis = K_GetSpecialUFODistance();
@ -338,7 +368,6 @@ static UINT32 K_GetItemRouletteDistance(const player_t *player, UINT8 numPlayers
} }
} }
else else
#endif
{ {
UINT8 i; UINT8 i;
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
@ -470,10 +499,15 @@ INT32 K_KartGetItemOdds(const player_t *player, itemroulette_t *const roulette,
I_Assert(pos < 2); // DO NOT allow positions past the bounds of the table I_Assert(pos < 2); // DO NOT allow positions past the bounds of the table
newOdds = K_KartItemOddsBattle[item-1][pos]; newOdds = K_KartItemOddsBattle[item-1][pos];
} }
else if (specialStage.active == true)
{
I_Assert(pos < 4); // Ditto
newodds = K_KartItemOddsSpecial[item-1][pos];
}
else else
{ {
I_Assert(pos < 8); // Ditto I_Assert(pos < 8); // Ditto
newOdds = K_KartItemOddsRace[item-1][pos]; newodds = K_KartItemOddsRace[item-1][pos];
} }
newOdds <<= FRACBITS; newOdds <<= FRACBITS;
@ -532,6 +566,8 @@ INT32 K_KartGetItemOdds(const player_t *player, itemroulette_t *const roulette,
return 0; return 0;
} }
if (specialStage.active == false)
{
if (roulette->firstDist < ENDDIST*2 // No SPB when 1st is almost done if (roulette->firstDist < ENDDIST*2 // No SPB when 1st is almost done
|| position == 1) // No SPB for 1st ever || position == 1) // No SPB for 1st ever
{ {
@ -556,6 +592,7 @@ INT32 K_KartGetItemOdds(const player_t *player, itemroulette_t *const roulette,
newOdds = FixedMul(maxOdds, multiplier); newOdds = FixedMul(maxOdds, multiplier);
} }
}
break; break;
} }
@ -684,6 +721,15 @@ static UINT8 K_FindUseodds(const player_t *player, itemroulette_t *const roulett
useOdds = 0; useOdds = 0;
} }
else else
{
if (specialStage.active == true) // Special Stages
{
SETUPDISTTABLE(0,1);
SETUPDISTTABLE(1,2);
SETUPDISTTABLE(2,3);
SETUPDISTTABLE(3,1);
}
else
{ {
SETUPDISTTABLE(0,1); SETUPDISTTABLE(0,1);
SETUPDISTTABLE(1,1); SETUPDISTTABLE(1,1);
@ -693,6 +739,7 @@ static UINT8 K_FindUseodds(const player_t *player, itemroulette_t *const roulett
SETUPDISTTABLE(5,3); SETUPDISTTABLE(5,3);
SETUPDISTTABLE(6,3); SETUPDISTTABLE(6,3);
SETUPDISTTABLE(7,1); SETUPDISTTABLE(7,1);
}
for (i = 0; i < totalSize; i++) for (i = 0; i < totalSize; i++)
{ {
@ -749,6 +796,11 @@ static boolean K_ForcedSPB(const player_t *player, itemroulette_t *const roulett
return false; return false;
} }
if (specialStage.active == true)
{
return false;
}
if (player == NULL) if (player == NULL)
{ {
return false; return false;

View file

@ -22,6 +22,7 @@
#include "../g_game.h" #include "../g_game.h"
#include "../z_zone.h" #include "../z_zone.h"
#include "../k_waypoint.h" #include "../k_waypoint.h"
#include "../k_specialstage.h"
#define UFO_BASE_SPEED (12 * FRACUNIT) // UFO's slowest speed. #define UFO_BASE_SPEED (12 * FRACUNIT) // UFO's slowest speed.
#define UFO_SPEEDUP (FRACUNIT) #define UFO_SPEEDUP (FRACUNIT)
@ -373,3 +374,16 @@ mobj_t *Obj_CreateSpecialUFO(void)
return InitSpecialUFO(startWaypoint); return InitSpecialUFO(startWaypoint);
} }
UINT32 K_GetSpecialUFODistance(void)
{
if (specialStage.active == true)
{
if (specialStage.ufo != NULL && P_MobjWasRemoved(specialStage.ufo) == false)
{
return (UINT32)ufo_distancetofinish(specialStage.ufo);
}
}
return UINT32_MAX;
}