diff --git a/src/k_objects.h b/src/k_objects.h index 4ba2253c0..d7abad6e5 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -60,5 +60,6 @@ mobj_t *Obj_SpawnBrolyKi(mobj_t *source, tic_t duration); /* Special Stage UFO */ void Obj_SpecialUFOThinker(mobj_t *bomb); mobj_t *Obj_CreateSpecialUFO(void); +UINT32 K_GetSpecialUFODistance(void); #endif/*k_objects_H*/ diff --git a/src/k_roulette.c b/src/k_roulette.c index ec15f4e9b..836aa29ba 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -108,7 +108,6 @@ static UINT8 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = static UINT8 K_KartItemOddsBattle[NUMKARTRESULTS-1][2] = { - //K L { 2, 1 }, // Sneaker { 0, 0 }, // Rocket Sneaker { 4, 1 }, // Invincibility @@ -139,6 +138,38 @@ static UINT8 K_KartItemOddsBattle[NUMKARTRESULTS-1][2] = { 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[] = { KITEM_SNEAKER, @@ -321,7 +352,6 @@ static UINT32 K_GetItemRouletteDistance(const player_t *player, UINT8 numPlayers return 0; } -#if 0 if (specialStage.active == true) { UINT32 ufoDis = K_GetSpecialUFODistance(); @@ -338,7 +368,6 @@ static UINT32 K_GetItemRouletteDistance(const player_t *player, UINT8 numPlayers } } else -#endif { UINT8 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 newOdds = K_KartItemOddsBattle[item-1][pos]; } + else if (specialStage.active == true) + { + I_Assert(pos < 4); // Ditto + newodds = K_KartItemOddsSpecial[item-1][pos]; + } else { I_Assert(pos < 8); // Ditto - newOdds = K_KartItemOddsRace[item-1][pos]; + newodds = K_KartItemOddsRace[item-1][pos]; } newOdds <<= FRACBITS; @@ -532,29 +566,32 @@ INT32 K_KartGetItemOdds(const player_t *player, itemroulette_t *const roulette, return 0; } - if (roulette->firstDist < ENDDIST*2 // No SPB when 1st is almost done - || position == 1) // No SPB for 1st ever + if (specialStage.active == false) { - return 0; - } - else - { - const UINT32 dist = max(0, ((signed)roulette->secondToFirst) - SPBSTARTDIST); - const UINT32 distRange = SPBFORCEDIST - SPBSTARTDIST; - const fixed_t maxOdds = 20 << FRACBITS; - fixed_t multiplier = FixedDiv(dist, distRange); - - if (multiplier < 0) + if (roulette->firstDist < ENDDIST*2 // No SPB when 1st is almost done + || position == 1) // No SPB for 1st ever { - multiplier = 0; + return 0; } - - if (multiplier > FRACUNIT) + else { - multiplier = FRACUNIT; - } + const UINT32 dist = max(0, ((signed)roulette->secondToFirst) - SPBSTARTDIST); + const UINT32 distRange = SPBFORCEDIST - SPBSTARTDIST; + const fixed_t maxOdds = 20 << FRACBITS; + fixed_t multiplier = FixedDiv(dist, distRange); - newOdds = FixedMul(maxOdds, multiplier); + if (multiplier < 0) + { + multiplier = 0; + } + + if (multiplier > FRACUNIT) + { + multiplier = FRACUNIT; + } + + newOdds = FixedMul(maxOdds, multiplier); + } } break; } @@ -685,14 +722,24 @@ static UINT8 K_FindUseodds(const player_t *player, itemroulette_t *const roulett } else { - SETUPDISTTABLE(0,1); - SETUPDISTTABLE(1,1); - SETUPDISTTABLE(2,1); - SETUPDISTTABLE(3,2); - SETUPDISTTABLE(4,2); - SETUPDISTTABLE(5,3); - SETUPDISTTABLE(6,3); - SETUPDISTTABLE(7,1); + if (specialStage.active == true) // Special Stages + { + SETUPDISTTABLE(0,1); + SETUPDISTTABLE(1,2); + SETUPDISTTABLE(2,3); + SETUPDISTTABLE(3,1); + } + else + { + SETUPDISTTABLE(0,1); + SETUPDISTTABLE(1,1); + SETUPDISTTABLE(2,1); + SETUPDISTTABLE(3,2); + SETUPDISTTABLE(4,2); + SETUPDISTTABLE(5,3); + SETUPDISTTABLE(6,3); + SETUPDISTTABLE(7,1); + } for (i = 0; i < totalSize; i++) { @@ -749,6 +796,11 @@ static boolean K_ForcedSPB(const player_t *player, itemroulette_t *const roulett return false; } + if (specialStage.active == true) + { + return false; + } + if (player == NULL) { return false; diff --git a/src/objects/ufo.c b/src/objects/ufo.c index 8b5dfaf6a..3d2ad68d7 100644 --- a/src/objects/ufo.c +++ b/src/objects/ufo.c @@ -22,6 +22,7 @@ #include "../g_game.h" #include "../z_zone.h" #include "../k_waypoint.h" +#include "../k_specialstage.h" #define UFO_BASE_SPEED (12 * FRACUNIT) // UFO's slowest speed. #define UFO_SPEEDUP (FRACUNIT) @@ -373,3 +374,16 @@ mobj_t *Obj_CreateSpecialUFO(void) 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; +}