From 30457f6b79f1c38b5dab5b390b5344c2a4fc8fac Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 3 Feb 2023 01:39:18 -0700 Subject: [PATCH 1/8] Briefly remove players from reality on early POSITION beam cross --- src/d_player.h | 2 ++ src/k_kart.c | 16 ++++++++++++++++ src/p_spec.c | 15 +++++++++++---- src/r_skins.c | 3 ++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 2fc8bb62b..9ac8d6f53 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -107,6 +107,8 @@ typedef enum PF_SHRINKME = 1<<28, // "Shrink me" cheat preference PF_SHRINKACTIVE = 1<<29, // "Shrink me" cheat is in effect. (Can't be disabled mid-race) + PF_VOID = 1<<30 + // up to 1<<31 is free } pflags_t; diff --git a/src/k_kart.c b/src/k_kart.c index 9c9feac0f..c6b61f33b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7788,6 +7788,22 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->superring--; } + if (player->pflags & PF_VOID) // Returning from FAULT VOID + { + player->pflags &= ~PF_VOID; + player->mo->renderflags &= ~RF_DONTDRAW; + player->mo->flags &= ~MF_NOCLIPTHING; + player->mo->momx = 0; + player->mo->momy = 0; + player->mo->momz = 0; + player->nocontrol = 0; + player->driftboost = 0; + player->strongdriftboost = 0; + player->tiregrease = 0; + player->sneakertimer = 0; + player->spindashboost = 0; + } + if (player->stealingtimer == 0 && player->rocketsneakertimer) player->rocketsneakertimer--; diff --git a/src/p_spec.c b/src/p_spec.c index 4438401a6..80d828421 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1909,10 +1909,17 @@ static void K_HandleLapIncrement(player_t *player) { if (leveltime < starttime && !(gametyperules & GTR_ROLLINGSTART)) { - // Will fault the player - K_DoIngameRespawn(player); + // freeze 'em until fault penalty is over + player->mo->hitlag = starttime - leveltime + 50; + player->pflags = PF_VOID; + player->mo->renderflags |= RF_DONTDRAW; + player->mo->flags |= MF_NOCLIPTHING; + player->nocontrol = 69; + player->hyudorotimer = 69; + K_StripItems(player); } - else if ((player->starpostnum == numstarposts) || (player->laps == 0)) + + if ((player->starpostnum == numstarposts) || (player->laps == 0)) { size_t i = 0; UINT8 nump = 0; @@ -1948,7 +1955,7 @@ static void K_HandleLapIncrement(player_t *player) player->karthud[khud_lapanimation] = 80; } - if (rainbowstartavailable == true) + if (rainbowstartavailable == true && player->mo->hitlag == 0) { S_StartSound(player->mo, sfx_s23c); player->startboost = 125; diff --git a/src/r_skins.c b/src/r_skins.c index 8e236904b..946004e7d 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -433,7 +433,7 @@ void SetRandomFakePlayerSkin(player_t* player, boolean fast) SetFakePlayerSkin(player, i); - if (player->mo && player->spectator == false) + if (player->mo && player->spectator == false && !(player->pflags & PF_VOID)) { S_StartSound(player->mo, sfx_kc33); S_StartSound(player->mo, sfx_cdfm44); @@ -448,6 +448,7 @@ void SetRandomFakePlayerSkin(player_t* player, boolean fast) P_SetTarget(&box->target, parent); box->angle = FixedAngle((baseangle + j*90) * FRACUNIT); box->flags2 |= MF2_AMBUSH; + box->renderflags |= parent->renderflags; if (fast) { box->extravalue1 = 10; // Rotation rate From 101db619e64b36f9bb38e620934191de7fb0d25a Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 3 Feb 2023 02:23:52 -0700 Subject: [PATCH 2/8] Add visual flicker in and out when faulting --- src/k_kart.c | 1 + src/p_mobj.c | 11 +++++++++++ src/p_spec.c | 2 ++ src/r_skins.c | 2 +- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index c6b61f33b..f1b7ab5b5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7802,6 +7802,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->tiregrease = 0; player->sneakertimer = 0; player->spindashboost = 0; + player->flashing = TICRATE/2; } if (player->stealingtimer == 0 diff --git a/src/p_mobj.c b/src/p_mobj.c index e83417123..51024300b 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9805,6 +9805,17 @@ void P_MobjThinker(mobj_t *mobj) mobj->eflags |= MFE_PAUSED; mobj->hitlag--; + if (mobj->type == MT_PLAYER && mobj->player->faulttimer > 0) + { + ClearFakePlayerSkin(mobj->player); + if (mobj->player->faulttimer & 1) + mobj->renderflags |= RF_DONTDRAW; + else + mobj->renderflags &= ~RF_DONTDRAW; + + mobj->player->faulttimer--; + } + if (mobj->type == MT_DROPTARGET && mobj->reactiontime > 0 && mobj->hitlag == 2) { mobj->spritexscale = FRACUNIT; diff --git a/src/p_spec.c b/src/p_spec.c index 80d828421..9e228b10c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1917,6 +1917,8 @@ static void K_HandleLapIncrement(player_t *player) player->nocontrol = 69; player->hyudorotimer = 69; K_StripItems(player); + player->faulttimer = TICRATE/3; + ClearFakePlayerSkin(player); } if ((player->starpostnum == numstarposts) || (player->laps == 0)) diff --git a/src/r_skins.c b/src/r_skins.c index 946004e7d..d6294fa0d 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -501,7 +501,7 @@ void ClearFakePlayerSkin(player_t* player) if ((flags & SF_IRONMAN) && !P_MobjWasRemoved(player->mo)) { SetFakePlayerSkin(player, skinid); - if (player->spectator == false) + if (player->spectator == false && player->mo->hitlag == 0) { S_StartSound(player->mo, sfx_s3k9f); K_SpawnMagicianParticles(player->mo, 5); From dfdfef335579afff604aba9b693f84d922786f09 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 3 Feb 2023 02:34:36 -0700 Subject: [PATCH 3/8] Fix missing timer definition, unset player speed when unfaulting --- src/d_player.h | 2 ++ src/p_spec.c | 1 + 2 files changed, 3 insertions(+) diff --git a/src/d_player.h b/src/d_player.h index 9ac8d6f53..8f1dd263c 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -581,6 +581,8 @@ struct player_t tic_t ebrakefor; // Ebrake timer, used for visuals. + UINT16 faulttimer; // Used for misc FAULT visuals + UINT32 roundscore; // battle score this round UINT8 emeralds; UINT8 bumpers; diff --git a/src/p_spec.c b/src/p_spec.c index 9e228b10c..9257bea53 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1916,6 +1916,7 @@ static void K_HandleLapIncrement(player_t *player) player->mo->flags |= MF_NOCLIPTHING; player->nocontrol = 69; player->hyudorotimer = 69; + player->speed = 0; K_StripItems(player); player->faulttimer = TICRATE/3; ClearFakePlayerSkin(player); From de268b744be726b770bf36da24d6059ca54659c1 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sat, 11 Feb 2023 19:09:52 -0700 Subject: [PATCH 4/8] Beam fault cleanup, make non-circuit death faults respawn at wp behind finish --- src/d_player.h | 2 +- src/k_kart.c | 14 ++++++++++++++ src/k_respawn.c | 14 ++++++++++++-- src/p_spec.c | 9 ++++++--- src/p_user.c | 4 ++++ 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 8f1dd263c..d15dc1d98 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -107,7 +107,7 @@ typedef enum PF_SHRINKME = 1<<28, // "Shrink me" cheat preference PF_SHRINKACTIVE = 1<<29, // "Shrink me" cheat is in effect. (Can't be disabled mid-race) - PF_VOID = 1<<30 + PF_VOID = 1<<30, // Removed from reality! When leaving hitlag, reenable visibility+collision and kill speed. // up to 1<<31 is free } pflags_t; diff --git a/src/k_kart.c b/src/k_kart.c index f1b7ab5b5..081b1b124 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7803,8 +7803,22 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->sneakertimer = 0; player->spindashboost = 0; player->flashing = TICRATE/2; + player->ringboost = 0; + player->driftboost = player->strongdriftboost = 0; + player->gateBoost = 0; } + if (player->pflags & PF_FAULT && player->nocontrol) // Hold player on respawn platform, no fair skipping long POSITION areas + { + if (rainbowstartavailable && ((leveltime <= starttime) || (leveltime - starttime < 10*TICRATE))) + { + player->nocontrol = 50; + player->mo->renderflags |= RF_DONTDRAW; + player->mo->flags |= MF_NOCLIPTHING; + } + } + + if (player->stealingtimer == 0 && player->rocketsneakertimer) player->rocketsneakertimer--; diff --git a/src/k_respawn.c b/src/k_respawn.c index 873d00fd7..4f3ab1020 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -119,6 +119,8 @@ void K_DoFault(player_t *player) S_StartSound(player->mo, sfx_s3k83); player->karthud[khud_fault] = 1; player->pflags |= PF_FAULT; + player->mo->renderflags |= RF_DONTDRAW; + player->mo->flags |= MF_NOCLIPTHING; } } @@ -147,7 +149,12 @@ void K_DoIngameRespawn(player_t *player) // FAULT if (leveltime < starttime) + { + if (!(mapheaderinfo[gamemap-1]->levelflags & LF_SECTIONRACE)) + player->respawn.wp = K_GetFinishLineWaypoint()->prevwaypoints[0]; K_DoFault(player); + } + player->ringboost = 0; player->driftboost = player->strongdriftboost = 0; @@ -163,7 +170,7 @@ void K_DoIngameRespawn(player_t *player) player->respawn.pointz += K_RespawnOffset(player, player->respawn.flip); player->respawn.manual = false; // one respawn only! } - else if (player->respawn.wp != NULL && leveltime >= starttime) + else if (player->respawn.wp != NULL) { const UINT32 dist = RESPAWN_DIST + (player->airtime * 48); player->respawn.distanceleft = (dist * mapobjectscale) / FRACUNIT; @@ -272,7 +279,7 @@ void K_DoIngameRespawn(player_t *player) player->respawn.init = true; player->respawn.airtimer = player->airtime; - player->respawn.truedeath = false; + player->respawn.truedeath = player->pflags & PF_FAULT; } /*-------------------------------------------------- @@ -612,6 +619,9 @@ static void K_DropDashWait(player_t *player) if (player->nocontrol == 0) player->respawn.timer--; + if (player->pflags & PF_FAULT) + return; + if (leveltime % 8 == 0) { const UINT8 ns = 8; diff --git a/src/p_spec.c b/src/p_spec.c index 9257bea53..05e81e549 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1910,16 +1910,19 @@ static void K_HandleLapIncrement(player_t *player) if (leveltime < starttime && !(gametyperules & GTR_ROLLINGSTART)) { // freeze 'em until fault penalty is over - player->mo->hitlag = starttime - leveltime + 50; + player->mo->hitlag = starttime - leveltime + TICRATE*3; player->pflags = PF_VOID; player->mo->renderflags |= RF_DONTDRAW; player->mo->flags |= MF_NOCLIPTHING; - player->nocontrol = 69; - player->hyudorotimer = 69; + player->nocontrol = UINT16_MAX; + player->hyudorotimer = UINT16_MAX; player->speed = 0; K_StripItems(player); player->faulttimer = TICRATE/3; ClearFakePlayerSkin(player); + S_StartSound(player->mo, sfx_s3k8a); + P_MoveOrigin(player->mo, player->mo->old_x, player->mo->old_y, player->mo->z); + return; } if ((player->starpostnum == numstarposts) || (player->laps == 0)) diff --git a/src/p_user.c b/src/p_user.c index f3c7c49c9..e37167386 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4207,7 +4207,11 @@ void P_PlayerThink(player_t *player) if (player->nocontrol && player->nocontrol < UINT16_MAX) { if (!(--player->nocontrol)) + { player->pflags &= ~PF_FAULT; + player->mo->renderflags &= ~RF_DONTDRAW; + player->mo->flags &= ~MF_NOCLIPTHING; + } } else player->nocontrol = 0; From 32ea795639b965551c27b1961d6fbcaf8325bf5d Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 13 Feb 2023 15:31:39 -0700 Subject: [PATCH 5/8] Fault rework cleanup for merge --- src/d_player.h | 2 +- src/k_respawn.c | 2 +- src/p_mobj.c | 6 +++--- src/p_spec.c | 2 +- src/p_user.c | 9 ++++++--- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index d15dc1d98..c0e3a361a 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -581,7 +581,7 @@ struct player_t tic_t ebrakefor; // Ebrake timer, used for visuals. - UINT16 faulttimer; // Used for misc FAULT visuals + UINT16 faultflash; // Used for misc FAULT visuals UINT32 roundscore; // battle score this round UINT8 emeralds; diff --git a/src/k_respawn.c b/src/k_respawn.c index 4f3ab1020..98661ad35 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -279,7 +279,7 @@ void K_DoIngameRespawn(player_t *player) player->respawn.init = true; player->respawn.airtimer = player->airtime; - player->respawn.truedeath = player->pflags & PF_FAULT; + player->respawn.truedeath = !!(player->pflags & PF_FAULT); } /*-------------------------------------------------- diff --git a/src/p_mobj.c b/src/p_mobj.c index 51024300b..e5b125bb8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9805,15 +9805,15 @@ void P_MobjThinker(mobj_t *mobj) mobj->eflags |= MFE_PAUSED; mobj->hitlag--; - if (mobj->type == MT_PLAYER && mobj->player->faulttimer > 0) + if (mobj->player != NULL && mobj->player->faultflash > 0) { ClearFakePlayerSkin(mobj->player); - if (mobj->player->faulttimer & 1) + if (mobj->player->faultflash & 1) mobj->renderflags |= RF_DONTDRAW; else mobj->renderflags &= ~RF_DONTDRAW; - mobj->player->faulttimer--; + mobj->player->faultflash--; } if (mobj->type == MT_DROPTARGET && mobj->reactiontime > 0 && mobj->hitlag == 2) diff --git a/src/p_spec.c b/src/p_spec.c index 05e81e549..c52b57e2f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1918,7 +1918,7 @@ static void K_HandleLapIncrement(player_t *player) player->hyudorotimer = UINT16_MAX; player->speed = 0; K_StripItems(player); - player->faulttimer = TICRATE/3; + player->faultflash = TICRATE/3; ClearFakePlayerSkin(player); S_StartSound(player->mo, sfx_s3k8a); P_MoveOrigin(player->mo, player->mo->old_x, player->mo->old_y, player->mo->z); diff --git a/src/p_user.c b/src/p_user.c index e37167386..eade004f2 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4208,9 +4208,12 @@ void P_PlayerThink(player_t *player) { if (!(--player->nocontrol)) { - player->pflags &= ~PF_FAULT; - player->mo->renderflags &= ~RF_DONTDRAW; - player->mo->flags &= ~MF_NOCLIPTHING; + if (player->pflags & PF_FAULT) + { + player->pflags &= ~PF_FAULT; + player->mo->renderflags &= ~RF_DONTDRAW; + player->mo->flags &= ~MF_NOCLIPTHING; + } } } else From c7374c6a9146cbcd1ddebdd697861b0ed0a7394e Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 13 Feb 2023 15:32:27 -0700 Subject: [PATCH 6/8] Increase line fault penalty for similar punishment to old method --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index c52b57e2f..1d30711a4 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1910,7 +1910,7 @@ static void K_HandleLapIncrement(player_t *player) if (leveltime < starttime && !(gametyperules & GTR_ROLLINGSTART)) { // freeze 'em until fault penalty is over - player->mo->hitlag = starttime - leveltime + TICRATE*3; + player->mo->hitlag = starttime - leveltime + TICRATE*6; player->pflags = PF_VOID; player->mo->renderflags |= RF_DONTDRAW; player->mo->flags |= MF_NOCLIPTHING; From 6996f06cebee7f202951e93d9779c8bba15c97c1 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 13 Feb 2023 15:50:00 -0700 Subject: [PATCH 7/8] Fix line faults doing pflag nonsense --- src/p_spec.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index 1d30711a4..ef8553793 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1911,7 +1911,8 @@ static void K_HandleLapIncrement(player_t *player) { // freeze 'em until fault penalty is over player->mo->hitlag = starttime - leveltime + TICRATE*6; - player->pflags = PF_VOID; + P_ResetPlayer(player); + player->pflags |= PF_VOID; player->mo->renderflags |= RF_DONTDRAW; player->mo->flags |= MF_NOCLIPTHING; player->nocontrol = UINT16_MAX; From 14fedef403c6c26d2cdf4f6022bc7b7a99d13ca2 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 13 Feb 2023 15:54:35 -0700 Subject: [PATCH 8/8] Revert line fault punish duration (Oni) --- src/p_spec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_spec.c b/src/p_spec.c index ef8553793..3d15c5679 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1910,7 +1910,7 @@ static void K_HandleLapIncrement(player_t *player) if (leveltime < starttime && !(gametyperules & GTR_ROLLINGSTART)) { // freeze 'em until fault penalty is over - player->mo->hitlag = starttime - leveltime + TICRATE*6; + player->mo->hitlag = starttime - leveltime + TICRATE*3; P_ResetPlayer(player); player->pflags |= PF_VOID; player->mo->renderflags |= RF_DONTDRAW;