Fix spring strentghs and doomednums
This commit is contained in:
parent
4417a9e5c2
commit
7721a104d8
2 changed files with 82 additions and 129 deletions
90
src/info.c
90
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
|
||||
|
|
|
|||
121
src/p_map.c
121
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
|
||||
|
|
|
|||
Loading…
Reference in a new issue