Add MFE_APPLYPMOMZ to fix camera movement.

Here's how it works: When a player walks off the
moving platform, it applies their pmomz once, and
then _keeps pmomz set_ so that the camera still
adds pmomz to its movements until they hit another
floor. This way, the camera doesn't jerk around.
This commit is contained in:
Yukita Mayako 2015-05-29 13:53:06 -04:00
parent 213a0caa23
commit a1c67e7e67
6 changed files with 42 additions and 43 deletions

View file

@ -7193,7 +7193,7 @@ static const char *const MOBJFLAG2_LIST[] = {
NULL
};
static const char *const MOBJEFLAG_LIST[] = {
static const char *const MOBJEFLAG_LIST[8] = {
"ONGROUND", // The mobj stands on solid floor (not on another mobj or in air)
"JUSTHITFLOOR", // The mobj just hit the floor while falling, this is cleared on next frame
"TOUCHWATER", // The mobj stands in a sector with water, and touches the surface
@ -7201,7 +7201,7 @@ static const char *const MOBJEFLAG_LIST[] = {
"JUSTSTEPPEDDOWN", // used for ramp sectors
"VERTICALFLIP", // Vertically flip sprite/allow upside-down physics
"GOOWATER", // Goo water
NULL
"APPLYPMOMZ" // Platform movement
};
static const char *const MAPTHINGFLAG_LIST[4] = {

View file

@ -449,6 +449,7 @@ static int mobj_set(lua_State *L)
break;
case mobj_pmomz:
mo->pmomz = (fixed_t)luaL_checkinteger(L, 3);
mo->eflags |= MFE_APPLYPMOMZ;
break;
case mobj_tics:
mo->tics = luaL_checkinteger(L, 3);

View file

@ -2076,14 +2076,7 @@ static boolean P_ThingHeightClip(mobj_t *thing)
thing->pmomz = thing->ceilingz - (thing->z + thing->height);
else
thing->pmomz = thing->floorz - thing->z;
if (thing->player)
{
if (splitscreen && camera2.chase && thing->player == &players[secondarydisplayplayer])
camera2.z += thing->pmomz;
else if (camera.chase && thing->player == &players[displayplayer])
camera.z += thing->pmomz;
}
thing->eflags |= MFE_APPLYPMOMZ;
if (thing->eflags & MFE_VERTICALFLIP)
thing->z = thing->ceilingz - thing->height;

View file

@ -1493,12 +1493,13 @@ static void P_RingZMovement(mobj_t *mo)
P_AdjustMobjFloorZ_PolyObjs(mo, mo->subsector);
// adjust height
if (mo->pmomz && mo->z != mo->floorz)
mo->z += mo->momz;
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
{
mo->momz += mo->pmomz;
mo->pmomz = 0;
mo->eflags &= ~MFE_APPLYPMOMZ;
}
mo->z += mo->momz;
// clip movement
if (mo->z <= mo->floorz && !(mo->flags & MF_NOCLIPHEIGHT))
@ -1562,12 +1563,13 @@ static boolean P_ZMovement(mobj_t *mo)
P_AdjustMobjFloorZ_PolyObjs(mo, mo->subsector);
// adjust height
if (mo->pmomz && mo->z != mo->floorz)
mo->z += mo->momz;
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
{
mo->momz += mo->pmomz;
mo->pmomz = 0;
mo->eflags &= ~MFE_APPLYPMOMZ;
}
mo->z += mo->momz;
switch (mo->type)
{
@ -1987,16 +1989,14 @@ static void P_PlayerZMovement(mobj_t *mo)
}
// adjust height
if (mo->pmomz && !P_IsObjectOnGround(mo))
{
if ((mo->eflags & MFE_VERTICALFLIP && mo->pmomz < 0)
|| (!(mo->eflags & MFE_VERTICALFLIP) && mo->pmomz > 0))
mo->momz += mo->pmomz;
mo->pmomz = 0;
}
mo->z += mo->momz;
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
{
mo->momz += mo->pmomz;
mo->eflags &= ~MFE_APPLYPMOMZ;
}
// Have player fall through floor?
if (mo->player->playerstate == PST_DEAD
|| mo->player->playerstate == PST_REBORN)
@ -2010,7 +2010,7 @@ static void P_PlayerZMovement(mobj_t *mo)
else
mo->z = mo->floorz;
if (mo->player && (mo->player->pflags & PF_NIGHTSMODE))
if (mo->player->pflags & PF_NIGHTSMODE)
{
if (mo->player->flyangle < 90 || mo->player->flyangle >= 270)
mo->player->flyangle += P_MobjFlip(mo)*90;
@ -2025,12 +2025,11 @@ static void P_PlayerZMovement(mobj_t *mo)
if (P_MobjFlip(mo)*mo->momz < 0) // falling
{
mo->pmomz = 0; // We're on a new floor, don't keep doing platform movement.
// Squat down. Decrease viewheight for a moment after hitting the ground (hard),
if (mo->player)
{
if (P_MobjFlip(mo)*mo->momz < -FixedMul(8*FRACUNIT, mo->scale))
mo->player->deltaviewheight = (P_MobjFlip(mo)*mo->momz)>>3; // make sure momz is negative
}
if (P_MobjFlip(mo)*mo->momz < -FixedMul(8*FRACUNIT, mo->scale))
mo->player->deltaviewheight = (P_MobjFlip(mo)*mo->momz)>>3; // make sure momz is negative
if (!tmfloorthing || tmfloorthing->flags & (MF_PUSHABLE|MF_MONITOR)
|| tmfloorthing->flags2 & MF2_STANDONME || tmfloorthing->type == MT_PLAYER) // Spin Attack
@ -2103,14 +2102,14 @@ static void P_PlayerZMovement(mobj_t *mo)
// Cut momentum in half when you hit the ground and
// aren't pressing any controls.
if (!mo->player || (!(mo->player->cmd.forwardmove || mo->player->cmd.sidemove) && !mo->player->cmomx && !mo->player->cmomy && !(mo->player->pflags & PF_SPINNING)))
if (!(mo->player->cmd.forwardmove || mo->player->cmd.sidemove) && !mo->player->cmomx && !mo->player->cmomy && !(mo->player->pflags & PF_SPINNING))
{
mo->momx = mo->momx/2;
mo->momy = mo->momy/2;
}
}
if (mo->health && mo->player)
if (mo->health)
{
if (mo->player->pflags & PF_GLIDING) // ground gliding
{
@ -2156,7 +2155,7 @@ static void P_PlayerZMovement(mobj_t *mo)
mo->player->powers[pw_tailsfly] = 0;
}
}
if (mo->player && !(mo->player->pflags & PF_SPINNING))
if (!(mo->player->pflags & PF_SPINNING))
mo->player->pflags &= ~PF_STARTDASH;
if (tmfloorthing && (tmfloorthing->flags & (MF_PUSHABLE|MF_MONITOR)
@ -2199,7 +2198,7 @@ nightsdone:
else
mo->z = mo->ceilingz - mo->height;
if (mo->player && (mo->player->pflags & PF_NIGHTSMODE))
if (mo->player->pflags & PF_NIGHTSMODE)
{
if (mo->player->flyangle < 90 || mo->player->flyangle >= 270)
mo->player->flyangle -= P_MobjFlip(mo)*90;
@ -2214,7 +2213,7 @@ nightsdone:
{
msecnode_t *node;
if (CheckForMarioBlocks && mo->player && !(netgame && mo->player->spectator)) // Only let the player punch
if (CheckForMarioBlocks && !(netgame && mo->player->spectator)) // Only let the player punch
{
// Search the touching sectors, from side-to-side...
for (node = mo->touching_sectorlist; node; node = node->m_snext)
@ -2242,7 +2241,7 @@ nightsdone:
if (mariomode)
S_StartSound(mo, sfx_mario1);
if (!(mo->player && mo->player->climbing))
if (!mo->player->climbing)
mo->momz = 0;
}
}
@ -2257,12 +2256,13 @@ static boolean P_SceneryZMovement(mobj_t *mo)
P_AdjustMobjFloorZ_PolyObjs(mo, mo->subsector);
// adjust height
if (mo->pmomz && mo->z != mo->floorz)
mo->z += mo->momz;
if (mo->eflags & MFE_APPLYPMOMZ && !P_IsObjectOnGround(mo))
{
mo->momz += mo->pmomz;
mo->pmomz = 0;
mo->eflags &= ~MFE_APPLYPMOMZ;
}
mo->z += mo->momz;
switch (mo->type)
{
@ -2840,10 +2840,10 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled
thiscam->floorz = tmfloorz;
thiscam->ceilingz = tmceilingz;
if (thiscam->momz)
if (thiscam->momz || player->mo->pmomz)
{
// adjust height
thiscam->z += thiscam->momz;
thiscam->z += thiscam->momz + player->mo->pmomz;
if (!itsatwodlevel && !(player->pflags & PF_NOCLIP))
{

View file

@ -232,7 +232,8 @@ typedef enum
MFE_VERTICALFLIP = 1<<5,
// Goo water
MFE_GOOWATER = 1<<6,
// free: to and including 1<<7
// Platform movement
MFE_APPLYPMOMZ = 1<<7
} mobjeflag_t;
//

View file

@ -3623,14 +3623,18 @@ void P_DoJump(player_t *player, boolean soundandstate)
player->mo->z--;
if (player->mo->pmomz < 0)
player->mo->momz += player->mo->pmomz; // Add the platform's momentum to your jump.
else
player->mo->pmomz = 0;
}
else
{
player->mo->z++;
if (player->mo->pmomz > 0)
player->mo->momz += player->mo->pmomz; // Add the platform's momentum to your jump.
else
player->mo->pmomz = 0;
}
player->mo->pmomz = 0;
player->mo->eflags &= ~MFE_APPLYPMOMZ;
player->pflags |= PF_JUMPED;