From b66f384d1ca3abc2430750a0728a4c44deddda59 Mon Sep 17 00:00:00 2001 From: NepDisk <16447892+NepDisk@users.noreply.github.com> Date: Sun, 27 Oct 2024 14:03:09 -0400 Subject: [PATCH] Fix Jawz behaviour --- src/m_menu.c | 2 +- src/p_enemy.c | 94 ++------------------------- src/p_mobj.c | 171 +++++++++++++++++++++++++++----------------------- 3 files changed, 96 insertions(+), 171 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index fce638104..ffe09f6d1 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3290,7 +3290,7 @@ void M_StartControlPanel(void) //SPauseMenu[spause_levelselect].status = (gamecomplete) ? (IT_STRING | IT_CALL) : (IT_DISABLED); // And emblem hints. - SPauseMenu[spause_hints].status = (M_SecretUnlocked(SECRET_EMBLEMHINTS)) ? (IT_STRING | IT_CALL) : (IT_DISABLED); + SPauseMenu[spause_hints].status = /*(M_SecretUnlocked(SECRET_EMBLEMHINTS)) ? (IT_STRING | IT_CALL) :*/ (IT_DISABLED); // Shift up Pandora's Box if both pandora and levelselect are active /*if (SPauseMenu[spause_pandora].status != (IT_DISABLED) diff --git a/src/p_enemy.c b/src/p_enemy.c index 603f8d1e2..6c45b9bb1 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -13136,119 +13136,33 @@ void A_ItemPop(mobj_t *actor) void A_JawzChase(mobj_t *actor) { - const fixed_t currentspeed = R_PointToDist2(0, 0, actor->momx, actor->momy); player_t *player; - fixed_t thrustamount = 0; - fixed_t frictionsafety = (actor->friction == 0) ? 1 : actor->friction; - fixed_t topspeed = actor->movefactor; if (LUA_CallAction(A_JAWZCHASE, actor)) return; if (actor->tracer) { - /*if ((gametyperules & GTR_CIRCUIT)) // Stop looking after first target in race - actor->extravalue1 = 1;*/ if (actor->tracer->health) { - const angle_t targetangle = R_PointToAngle2(actor->x, actor->y, actor->tracer->x, actor->tracer->y); mobj_t *ret; - angle_t angledelta = actor->angle - targetangle; - boolean turnclockwise = true; - - if (gametyperules & GTR_CIRCUIT) - { - const fixed_t distbarrier = FixedMul(512*mapobjectscale, FRACUNIT + ((gamespeed-1) * (FRACUNIT/4))); - const fixed_t distaway = P_AproxDistance(actor->tracer->x - actor->x, actor->tracer->y - actor->y); - if (distaway < distbarrier) - { - if (actor->tracer->player) - { - fixed_t speeddifference = abs(topspeed - min(actor->tracer->player->speed, K_GetKartSpeed(actor->tracer->player, false, false))); - topspeed = topspeed - FixedMul(speeddifference, FRACUNIT-FixedDiv(distaway, distbarrier)); - } - } - } - - if (angledelta != 0) - { - angle_t MAX_JAWZ_TURN = ANGLE_90/15; // We can turn a maximum of 6 degrees per frame at regular max speed - // MAX_JAWZ_TURN gets stronger the slower the top speed of jawz - if (topspeed < actor->movefactor) - { - if (topspeed == 0) - { - MAX_JAWZ_TURN = ANGLE_180; - } - else - { - fixed_t anglemultiplier = FixedDiv(actor->movefactor, topspeed); - MAX_JAWZ_TURN += FixedAngle(FixedMul(AngleFixed(MAX_JAWZ_TURN), anglemultiplier)); - } - } - - if (angledelta > ANGLE_180) - { - angledelta = InvAngle(angledelta); - turnclockwise = false; - } - - if (angledelta > MAX_JAWZ_TURN) - { - angledelta = MAX_JAWZ_TURN; - } - - if (turnclockwise) - { - actor->angle -= angledelta; - } - else - { - actor->angle += angledelta; - } - } ret = P_SpawnMobj(actor->tracer->x, actor->tracer->y, actor->tracer->z, MT_PLAYERRETICULE); + P_SetTarget(&ret->target, actor->tracer); ret->old_x = actor->tracer->old_x; ret->old_y = actor->tracer->old_y; ret->old_z = actor->tracer->old_z; - P_SetTarget(&ret->target, actor->tracer); ret->frame |= ((leveltime % 10) / 2) + 5; ret->color = actor->cvmem; + + P_Thrust(actor, R_PointToAngle2(actor->x, actor->y, actor->tracer->x, actor->tracer->y), (7*actor->movefactor)/64); + return; } else P_SetTarget(&actor->tracer, NULL); } - if (!P_IsObjectOnGround(actor)) - { - // No friction in the air - frictionsafety = FRACUNIT; - } - - if (currentspeed >= topspeed) - { - // Thrust as if you were at top speed, slow down naturally - thrustamount = FixedDiv(topspeed, frictionsafety) - topspeed; - } - else - { - const fixed_t beatfriction = FixedDiv(currentspeed, frictionsafety) - currentspeed; - // Thrust to immediately get to top speed - thrustamount = beatfriction + FixedDiv(topspeed - currentspeed, frictionsafety); - } - - if (!actor->tracer) - { - actor->angle = K_MomentumAngle(actor); - } - - P_Thrust(actor, actor->angle, thrustamount); - - if ((actor->tracer != NULL) && (actor->tracer->health > 0)) - return; - if (actor->extravalue1) // Disable looking by setting this return; diff --git a/src/p_mobj.c b/src/p_mobj.c index 84a375bd3..133a0a1c3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -15,6 +15,7 @@ #include "d_netcmd.h" #include "dehacked.h" #include "doomdef.h" +#include "doomstat.h" #include "doomtype.h" #include "g_game.h" #include "g_input.h" @@ -3202,11 +3203,11 @@ void P_MobjCheckWater(mobj_t *mobj) if (!!(mobj->eflags & MFE_UNDERWATER) == wasinwater) return; - if (p && !p->waterskip && + /*if (p && !p->waterskip && p->curshield != KSHIELD_BUBBLE && wasinwater) { S_StartSound(mobj, sfx_s3k38); - } + }*/ if ((p) // Players || (mobj->flags & MF_PUSHABLE) // Pushables @@ -6879,92 +6880,102 @@ static boolean P_MobjRegularThink(mobj_t *mobj) break; } case MT_JAWZ: - { - mobj_t *ghost = P_SpawnGhostMobj(mobj); - - if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player) { - ghost->color = mobj->target->player->skincolor; - ghost->colorized = true; - } + sector_t *sec2; + fixed_t topspeed = mobj->movefactor; + fixed_t distbarrier = 512*mapobjectscale; + fixed_t distaway; - if (mobj->threshold > 0) - mobj->threshold--; - if (leveltime % TICRATE == 0) - S_StartSound(mobj, mobj->info->activesound); - - // Movement handling has ALL been moved to A_JawzChase - - K_DriftDustHandling(mobj); - - if (P_MobjTouchingSectorSpecial(mobj, 3, 1)) - K_DoPogoSpring(mobj, 0, 1); - - if (!(gametyperules & GTR_CIRCUIT)) - mobj->friction = max(0, 3 * mobj->friction / 4); - - break; - } - case MT_JAWZ_DUD: - { - boolean grounded = P_IsObjectOnGround(mobj); - - if (mobj->flags2 & MF2_AMBUSH) - { - if (grounded && (mobj->flags & MF_NOCLIPTHING)) - { - mobj->momx = 1; - mobj->momy = 0; - S_StartSound(mobj, mobj->info->deathsound); - mobj->flags &= ~MF_NOCLIPTHING; - } - } - else - { - mobj_t *ghost = P_SpawnGhostMobj(mobj); - const fixed_t currentspeed = R_PointToDist2(0, 0, mobj->momx, mobj->momy); - fixed_t frictionsafety = (mobj->friction == 0) ? 1 : mobj->friction; - fixed_t thrustamount = 0; - - if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player) - { - ghost->color = mobj->target->player->skincolor; - ghost->colorized = true; - } - - if (!grounded) - { - // No friction in the air - frictionsafety = FRACUNIT; - } - - if (currentspeed >= mobj->movefactor) - { - // Thrust as if you were at top speed, slow down naturally - thrustamount = FixedDiv(mobj->movefactor, frictionsafety) - mobj->movefactor; - } - else - { - const fixed_t beatfriction = FixedDiv(currentspeed, frictionsafety) - currentspeed; - // Thrust to immediately get to top speed - thrustamount = beatfriction + FixedDiv(mobj->movefactor - currentspeed, frictionsafety); - } - - mobj->angle = K_MomentumAngle(mobj); - P_Thrust(mobj, mobj->angle, thrustamount); - - if (P_MobjTouchingSectorSpecial(mobj, 3, 1)) - K_DoPogoSpring(mobj, 0, 1); + P_SpawnGhostMobj(mobj); if (mobj->threshold > 0) mobj->threshold--; - if (leveltime % TICRATE == 0) S_StartSound(mobj, mobj->info->activesound); - } - break; - } + if (gamespeed == 0) + distbarrier = FixedMul(distbarrier, FRACUNIT-FRACUNIT/4); + //expert speed + else if (gamespeed == 2 || gamespeed == 3) + distbarrier = FixedMul(distbarrier, FRACUNIT+FRACUNIT/4); + + if ((gametyperules & GTR_CIRCUIT) && mobj->tracer) + { + distaway = P_AproxDistance(mobj->tracer->x - mobj->x, mobj->tracer->y - mobj->y); + if (distaway < distbarrier) + { + if (mobj->tracer->player) + { + fixed_t speeddifference = abs(topspeed - min(mobj->tracer->player->speed, K_GetKartSpeed(mobj->tracer->player, false,false))); + topspeed = topspeed - FixedMul(speeddifference, FRACUNIT-FixedDiv(distaway, distbarrier)); + } + } + } + + if (gametype == GT_BATTLE) + { + mobj->friction -= 1228; + if (mobj->friction > FRACUNIT) + mobj->friction = FRACUNIT; + if (mobj->friction < 0) + mobj->friction = 0; + } + + mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); + P_InstaThrust(mobj, mobj->angle, topspeed); + + if (mobj->tracer) + mobj->angle = R_PointToAngle2(mobj->x, mobj->y, mobj->tracer->x, mobj->tracer->y); + else + mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); + + K_DriftDustHandling(mobj); + + sec2 = P_ThingOnSpecial3DFloor(mobj); + if ((sec2 && GETSECSPECIAL(sec2->special, 3) == 1) + || (P_IsObjectOnRealGround(mobj, mobj->subsector->sector) + && GETSECSPECIAL(mobj->subsector->sector->special, 3) == 1)) + K_DoPogoSpring(mobj, 0, 1); + + break; + } + case MT_JAWZ_DUD: + { + boolean grounded = P_IsObjectOnGround(mobj); + if (mobj->flags2 & MF2_AMBUSH) + { + if (grounded && (mobj->flags & MF_NOCLIPTHING)) + { + mobj->momx = 1; + mobj->momy = 0; + S_StartSound(mobj, mobj->info->deathsound); + mobj->flags &= ~MF_NOCLIPTHING; + } + } + else + { + P_SpawnGhostMobj(mobj); + mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); + P_InstaThrust(mobj, mobj->angle, mobj->movefactor); + + if (grounded) + { + sector_t *sec2 = P_ThingOnSpecial3DFloor(mobj); + if ((sec2 && GETSECSPECIAL(sec2->special, 3) == 1) + || (P_IsObjectOnRealGround(mobj, mobj->subsector->sector) + && GETSECSPECIAL(mobj->subsector->sector->special, 3) == 1)) + K_DoPogoSpring(mobj, 0, 1); + } + + if (mobj->threshold > 0) + mobj->threshold--; + + if (leveltime % TICRATE == 0) + S_StartSound(mobj, mobj->info->activesound); + } + + break; + } case MT_EGGMANITEM: /* FALLTHRU */ case MT_BANANA: