From 7721a104d8fe87c89cd00e2d1d9701b7dbb286b2 Mon Sep 17 00:00:00 2001 From: NepDisk <16447892+NepDisk@users.noreply.github.com> Date: Fri, 2 Aug 2024 01:14:19 -0400 Subject: [PATCH] Fix spring strentghs and doomednums --- src/info.c | 90 +++++++++++++++++++------------------- src/p_map.c | 121 ++++++++++++++++------------------------------------ 2 files changed, 82 insertions(+), 129 deletions(-) diff --git a/src/info.c b/src/info.c index 4cdd46f6c..e695241d3 100644 --- a/src/info.c +++ b/src/info.c @@ -8057,10 +8057,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 32*FRACUNIT, // height + 20*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset - 40*FRACUNIT, // mass + 26*FRACUNIT, // mass 0, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags @@ -8084,10 +8084,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 32*FRACUNIT, // height + 20*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset - 64*FRACUNIT, // mass + 40*FRACUNIT, // mass 0, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags @@ -8111,10 +8111,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 32*FRACUNIT, // height + 20*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset - 102*FRACUNIT, // mass + 14*FRACUNIT, // mass 0, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags @@ -8138,10 +8138,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 32*FRACUNIT, // height + 20*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset - 25*FRACUNIT, // mass + 6*FRACUNIT, // mass 0, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags @@ -8176,7 +8176,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = }, { // MT_YELLOWDIAG - 554, // doomednum + 555, // doomednum S_YDIAG1, // spawnstate 1, // spawnhealth S_YDIAG2, // seestate @@ -8192,18 +8192,18 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 56*FRACUNIT, // height + 16*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset - 40*FRACUNIT, // mass - 40*FRACUNIT, // damage + 26*FRACUNIT, // mass + 26*FRACUNIT, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_YDIAG2 // raisestate }, { // MT_REDDIAG - 555, // doomednum + 556, // doomednum S_RDIAG1, // spawnstate 1, // spawnhealth S_RDIAG2, // seestate @@ -8219,18 +8219,18 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 56*FRACUNIT, // height + 16*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset - 64*FRACUNIT, // mass - 64*FRACUNIT, // damage + 40*FRACUNIT, // mass + 40*FRACUNIT, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_RDIAG2 // raisestate }, { // MT_BLUEDIAG - 556, // doomednum + 557, // doomednum S_BDIAG1, // spawnstate 1, // spawnhealth S_BDIAG2, // seestate @@ -8246,18 +8246,18 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 56*FRACUNIT, // height + 16*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset - 102*FRACUNIT, // mass - 102*FRACUNIT, // damage + 14*FRACUNIT, // mass + 14*FRACUNIT, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_BDIAG2 // raisestate }, { // MT_GREYDIAG - 557, // doomednum + 558, // doomednum S_GDIAG1, // spawnstate 1, // spawnhealth S_GDIAG2, // seestate @@ -8276,15 +8276,15 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 48*FRACUNIT, // radius 56*FRACUNIT, // height 0, // display offset - 25*FRACUNIT, // mass - 25*FRACUNIT, // damage + 6*FRACUNIT, // mass + 6*FRACUNIT, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_GDIAG2 // raisestate }, { // MT_YELLOWHORIZ - 558, // doomednum + 559, // doomednum S_YHORIZ1, // spawnstate 1, // spawnhealth S_YHORIZ2, // seestate @@ -8300,8 +8300,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 56*FRACUNIT, // height + 52*FRACUNIT, // radius + 52*FRACUNIT, // height 0, // display offset 0, // mass 72*FRACUNIT, // damage @@ -8311,7 +8311,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = }, { // MT_REDHORIZ - 559, // doomednum + 560, // doomednum S_RHORIZ1, // spawnstate 1, // spawnhealth S_RHORIZ2, // seestate @@ -8327,18 +8327,18 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 56*FRACUNIT, // height + 16*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset 0, // mass - 115*FRACUNIT, // damage + 80*FRACUNIT, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_RHORIZ2 // raisestate }, { // MT_BLUEHORIZ - 560, // doomednum + 561, // doomednum S_BHORIZ1, // spawnstate 1, // spawnhealth S_BHORIZ2, // seestate @@ -8354,18 +8354,18 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 56*FRACUNIT, // height + 16*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset 0, // mass - 184*FRACUNIT, // damage + 28*FRACUNIT, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_BHORIZ2 // raisestate }, { // MT_GREYHORIZ - 561, // doomednum + 562, // doomednum S_GHORIZ1, // spawnstate 1, // spawnhealth S_GHORIZ2, // seestate @@ -8381,11 +8381,11 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // xdeathstate sfx_None, // deathsound 0, // speed - 48*FRACUNIT, // radius - 56*FRACUNIT, // height + 16*FRACUNIT, // radius + 16*FRACUNIT, // height 0, // display offset 0, // mass - 45*FRACUNIT, // damage + 12*FRACUNIT, // damage sfx_None, // activesound MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags S_GHORIZ2 // raisestate diff --git a/src/p_map.c b/src/p_map.c index c34564339..b026e124b 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -292,154 +292,107 @@ static boolean P_SpecialIsLinedefCrossType(line_t *ld) // boolean P_DoSpring(mobj_t *spring, mobj_t *object) { - const fixed_t scaleVal = FixedSqrt(FixedMul(mapobjectscale, spring->scale)); + const fixed_t hscale = mapobjectscale + (mapobjectscale - object->scale); + const fixed_t vscale = mapobjectscale + (object->scale - mapobjectscale); + fixed_t offx, offy; fixed_t vertispeed = spring->info->mass; fixed_t horizspeed = spring->info->damage; - UINT16 starcolor = (spring->info->painchance % numskincolors); - fixed_t savemomx = 0; - fixed_t savemomy = 0; - statenum_t raisestate = spring->info->raisestate; - // Object was already sprung this tic - if (object->eflags & MFE_SPRUNG) + if (object->eflags & MFE_SPRUNG) // Object was already sprung this tic return false; // Spectators don't trigger springs. if (object->player && object->player->spectator) return false; - // "Even in Death" is a song from Volume 8, not a command. - if (!spring->health || !object->health) - return false; + object->standingslope = NULL; // Okay, now we can't return - no launching off at silly angles for you. + + object->eflags |= MFE_SPRUNG; // apply this flag asap! + spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify -#if 0 if (horizspeed && vertispeed) // Mimic SA { object->momx = object->momy = 0; P_TryMove(object, spring->x, spring->y, true); } -#endif - - // Does nothing? - if (!vertispeed && !horizspeed) - { - return false; - } - - object->standingslope = NULL; // Okay, now we know it's not going to be relevant - no launching off at silly angles for you. - object->terrain = NULL; - - object->eflags |= MFE_SPRUNG; // apply this flag asap! - spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify if (spring->eflags & MFE_VERTICALFLIP) vertispeed *= -1; - if ((spring->eflags ^ object->eflags) & MFE_VERTICALFLIP) - vertispeed *= 2; - - // Vertical springs teleport you on TOP of them. if (vertispeed > 0) - { object->z = spring->z + spring->height + 1; - } else if (vertispeed < 0) - { object->z = spring->z - object->height - 1; - } else { - fixed_t offx, offy; - // Horizontal springs teleport you in FRONT of them. - savemomx = object->momx; - savemomy = object->momy; object->momx = object->momy = 0; // Overestimate the distance to position you at offx = P_ReturnThrustX(spring, spring->angle, (spring->radius + object->radius + 1) * 2); offy = P_ReturnThrustY(spring, spring->angle, (spring->radius + object->radius + 1) * 2); - // Then clip it down to a square, so it matches the hitbox size. + // Make it square by clipping if (offx > (spring->radius + object->radius + 1)) offx = spring->radius + object->radius + 1; else if (offx < -(spring->radius + object->radius + 1)) offx = -(spring->radius + object->radius + 1); + if (offy > (spring->radius + object->radius + 1)) + offy = spring->radius + object->radius + 1; + else if (offy < -(spring->radius + object->radius + 1)) + offy = -(spring->radius + object->radius + 1); + + // Set position! P_TryMove(object, spring->x + offx, spring->y + offy, true); } if (vertispeed) - { - object->momz = FixedMul(vertispeed, scaleVal); - } + object->momz = FixedMul(vertispeed,FixedSqrt(FixedMul(vscale, spring->scale))); if (horizspeed) { - angle_t finalAngle = spring->angle; - fixed_t finalSpeed = FixedMul(horizspeed, scaleVal); - fixed_t objectSpeed; - - if (object->player) - objectSpeed = object->player->speed; + if (!object->player) + P_InstaThrust(object, spring->angle, FixedMul(horizspeed,FixedSqrt(FixedMul(hscale, spring->scale)))); else - objectSpeed = R_PointToDist2(0, 0, savemomx, savemomy); - - if (!vertispeed) { - // Scale to gamespeed - finalSpeed = FixedMul(finalSpeed, K_GetKartGameSpeedScalar(gamespeed)); + fixed_t finalSpeed = FixedDiv(horizspeed, hscale); + fixed_t pSpeed = object->player->speed; - // Reflect your momentum angle against the surface of horizontal springs. - // This makes it a bit more interesting & unique than just being a speed boost in a pre-defined direction - if (savemomx || savemomy) - { - finalAngle = K_ReflectAngle( - R_PointToAngle2(0, 0, savemomx, savemomy), finalAngle, - objectSpeed, finalSpeed - ); - } + if (pSpeed > finalSpeed) + finalSpeed = pSpeed; + + P_InstaThrust(object, spring->angle, FixedMul(finalSpeed,FixedSqrt(FixedMul(hscale, spring->scale)))); } - - // Horizontal speed is used as a minimum thrust, not a direct replacement - finalSpeed = max(objectSpeed, finalSpeed); - - P_InstaThrust(object, finalAngle, finalSpeed); } // Re-solidify - spring->flags |= (spring->info->flags & (MF_SPRING|MF_SPECIAL)); + spring->flags |= (spring->info->flags & (MF_SPECIAL|MF_SOLID)); + + P_SetMobjState(spring, spring->info->raisestate); if (object->player) { if (spring->flags & MF_ENEMY) // Spring shells - { P_SetTarget(&spring->target, object); - } - P_ResetPlayer(object->player); - - object->player->springstars = max(vertispeed, horizspeed) / FRACUNIT / 2; - object->player->springcolor = starcolor; - - if (spring->type == MT_POGOSPRING) + if (horizspeed && object->player->cmd.forwardmove == 0 && object->player->cmd.sidemove == 0) { - if (spring->reactiontime == 0) - { - object->eflags &= ~MFE_SPRUNG; - object->player->pogospring = 1; - K_DoPogoSpring(object, 0, 0); - } + object->angle = spring->angle; - spring->reactiontime++; + if (!demo.playback) + { + for (int i = 0; i <= r_splitscreen; i++) + { + localangle[i] = spring->angle; + } + } } } - - P_SetMobjState(spring, raisestate); - return true; } + static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object) { player_t *p = object->player; // will be NULL if not a player