Add K_TimeAttackRules

Lets Time Attack capsules spawn in Free Play, and prevents Time Attack specific rules from happening in Special Stages
This commit is contained in:
Sally Coolatta 2022-12-17 01:05:30 -05:00
parent f51a913710
commit 36e9a56f29
6 changed files with 52 additions and 13 deletions

View file

@ -547,7 +547,7 @@ void DRPC_UpdatePresence(void)
if (gamestate == GS_LEVEL && Playing()) if (gamestate == GS_LEVEL && Playing())
{ {
const time_t currentTime = time(NULL); const time_t currentTime = time(NULL);
const time_t mapTimeStart = currentTime - ((leveltime + (modeattacking ? starttime : 0)) / TICRATE); const time_t mapTimeStart = currentTime - ((leveltime + starttime) / TICRATE);
discordPresence.startTimestamp = mapTimeStart; discordPresence.startTimestamp = mapTimeStart;

View file

@ -506,6 +506,43 @@ void K_RunItemCooldowns(void)
} }
} }
boolean K_TimeAttackRules(void)
{
UINT8 playing = 0;
UINT8 i;
if (specialStage.active == true)
{
// Kind of a hack -- Special Stages
// are expected to be 1-player, so
// we won't use the Time Attack changes
return false;
}
if (modeattacking != ATTACKING_NONE)
{
// Time Attack obviously uses Time Attack rules :p
return true;
}
for (i = 0; i < MAXPLAYERS; i++)
{
if (playeringame[i] == false || players[i].spectator == true)
{
continue;
}
playing++;
if (playing > 1)
{
break;
}
}
// Use Time Attack gameplay rules with only 1P.
return (playing <= 1);
}
//} //}
//{ SRB2kart p_user.c Stuff //{ SRB2kart p_user.c Stuff
@ -3208,7 +3245,7 @@ boolean K_PlayerShrinkCheat(player_t *player)
return ( return (
(player->pflags & PF_SHRINKACTIVE) (player->pflags & PF_SHRINKACTIVE)
&& (player->bot == false) && (player->bot == false)
&& (modeattacking == false) // Anyone want to make another record attack category? && (modeattacking == ATTACKING_NONE) // Anyone want to make another record attack category?
); );
} }

View file

@ -56,7 +56,9 @@ UINT8 K_ItemResultToAmount(SINT8 getitem);
tic_t K_GetItemCooldown(SINT8 itemResult); tic_t K_GetItemCooldown(SINT8 itemResult);
void K_SetItemCooldown(SINT8 itemResult, tic_t time); void K_SetItemCooldown(SINT8 itemResult, tic_t time);
void K_RunItemCooldowns(void); void K_RunItemCooldowns(void);
boolean K_ItemEnabled(SINT8 item);
boolean K_TimeAttackRules(void);
fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against); fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against);
boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2); boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2);
boolean K_KartSolidBounce(mobj_t *bounceMobj, mobj_t *solidMobj); boolean K_KartSolidBounce(mobj_t *bounceMobj, mobj_t *solidMobj);

View file

@ -502,12 +502,12 @@ INT32 K_KartGetItemOdds(const player_t *player, itemroulette_t *const roulette,
else if (specialStage.active == true) else if (specialStage.active == true)
{ {
I_Assert(pos < 4); // Ditto I_Assert(pos < 4); // Ditto
newodds = K_KartItemOddsSpecial[item-1][pos]; 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;
@ -693,12 +693,12 @@ static UINT8 K_FindUseodds(const player_t *player, itemroulette_t *const roulett
{ {
UINT8 j; UINT8 j;
if (specialStage.active == true && i > 3) if (gametype == GT_BATTLE && i > 1)
{ {
oddsvalid[i] = false; oddsValid[i] = false;
continue; continue;
} }
else if (gametype == GT_BATTLE && i > 1) else if (specialStage.active == true && i > 3)
{ {
oddsValid[i] = false; oddsValid[i] = false;
continue; continue;
@ -1016,7 +1016,7 @@ static void K_CalculateRouletteSpeed(itemroulette_t *const roulette)
fixed_t progress = 0; fixed_t progress = 0;
fixed_t total = 0; fixed_t total = 0;
if (modeattacking || roulette->playing <= 1) if (K_TimeAttackRules() == true)
{ {
// Time Attack rules; use a consistent speed. // Time Attack rules; use a consistent speed.
roulette->tics = roulette->speed = ROULETTE_SPEED_TIMEATTACK; roulette->tics = roulette->speed = ROULETTE_SPEED_TIMEATTACK;
@ -1099,7 +1099,7 @@ void K_FillItemRouletteData(const player_t *player, itemroulette_t *const roulet
return; return;
} }
else if (modeattacking || roulette->playing <= 1) else if (K_TimeAttackRules() == true)
{ {
switch (gametype) switch (gametype)
{ {

View file

@ -1367,7 +1367,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
INT16 spacing = (target->radius >> 1) / target->scale; INT16 spacing = (target->radius >> 1) / target->scale;
// set respawn fuse // set respawn fuse
if (modeattacking) // no respawns if (K_TimeAttackRules() == true) // no respawns
; ;
else if (target->threshold == KITEM_SUPERRING) else if (target->threshold == KITEM_SUPERRING)
target->fuse = 20*TICRATE; target->fuse = 20*TICRATE;
@ -2212,7 +2212,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
K_PlayPainSound(target, source); K_PlayPainSound(target, source);
if ((hardhit == true) || (cv_kartdebughuddrop.value && !modeattacking)) if ((hardhit == true) || cv_kartdebughuddrop.value)
{ {
K_DropItems(player); K_DropItems(player);
} }

View file

@ -11974,7 +11974,7 @@ static boolean P_AllowMobjSpawn(mapthing_t* mthing, mobjtype_t i)
// in record attack, only spawn ring capsules // in record attack, only spawn ring capsules
// (behavior can be inverted with the Extra flag, i.e. item capsule spawns and ring capsule does not) // (behavior can be inverted with the Extra flag, i.e. item capsule spawns and ring capsule does not)
if (modeattacking if (K_TimeAttackRules() == true
&& (!(mthing->args[2] & TMICF_INVERTTIMEATTACK) == !isRingCapsule)) && (!(mthing->args[2] & TMICF_INVERTTIMEATTACK) == !isRingCapsule))
return false; return false;
} }