Fix spring strentghs and doomednums

This commit is contained in:
NepDisk 2024-08-02 01:14:19 -04:00
parent 4417a9e5c2
commit 7721a104d8
2 changed files with 82 additions and 129 deletions

View file

@ -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

View file

@ -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