Reverse gravity fixes pt 1: basic driving

- Turning dust is spawned in the correct position
- Turning dust sprites are flipped
- Shadows display on the ceiling for flipped objects
- Drift sparks display in the correct position for flipped players

Will continue with item fixes tomorrow
This commit is contained in:
TehRealSalt 2018-07-28 02:37:00 -04:00
parent a80c6ccf39
commit f0f9e204aa
2 changed files with 23 additions and 8 deletions

View file

@ -2264,6 +2264,10 @@ void K_DriftDustHandling(mobj_t *spawner)
fixed_t spawny = P_RandomRange(-spawnrange, spawnrange)<<FRACBITS;
INT32 speedrange = 2;
mobj_t *dust = P_SpawnMobj(spawner->x + spawnx, spawner->y + spawny, spawner->z, MT_DRIFTDUST);
if (spawner->eflags & MFE_VERTICALFLIP)
{
dust->z += spawner->height - dust->height;
}
dust->momx = FixedMul(spawner->momx + (P_RandomRange(-speedrange, speedrange)<<FRACBITS), 3*FRACUNIT/4);
dust->momy = FixedMul(spawner->momy + (P_RandomRange(-speedrange, speedrange)<<FRACBITS), 3*FRACUNIT/4);
dust->momz = P_MobjFlip(spawner) * P_RandomRange(1, 4)<<FRACBITS;
@ -2279,6 +2283,11 @@ void K_DriftDustHandling(mobj_t *spawner)
else
dust->flags2 &= ~MF2_DONTDRAW;
if (spawner->eflags & MFE_VERTICALFLIP)
dust->eflags |= MFE_VERTICALFLIP;
else
dust->eflags &= ~MFE_VERTICALFLIP;
if (spawner->eflags & MFE_DRAWONLYFORP1)
dust->eflags |= MFE_DRAWONLYFORP1;
else

View file

@ -6291,6 +6291,11 @@ void P_RunShadows(void)
else
mobj->flags2 &= ~MF2_DONTDRAW;
if (mobj->target->eflags & MFE_VERTICALFLIP)
mobj->eflags |= MFE_VERTICALFLIP;
else
mobj->eflags &= ~MFE_VERTICALFLIP;
if (mobj->target->eflags & MFE_DRAWONLYFORP1) // groooooaann...
mobj->eflags |= MFE_DRAWONLYFORP1;
else
@ -6316,12 +6321,13 @@ void P_RunShadows(void)
P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z);
if (mobj->floorz < mobj->z)
if (((mobj->eflags & MFE_VERTICALFLIP) && (mobj->ceilingz > mobj->z+mobj->height))
|| (!(mobj->eflags & MFE_VERTICALFLIP) && (mobj->floorz < mobj->z)))
{
INT32 i;
fixed_t prevz;
mobj->z = mobj->floorz;
mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : mobj->floorz);
for (i = 0; i < MAXFFLOORS; i++)
{
@ -6333,7 +6339,7 @@ void P_RunShadows(void)
// Check new position to see if you should still be on that ledge
P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->z);
mobj->z = mobj->floorz;
mobj->z = (mobj->eflags & MFE_VERTICALFLIP ? mobj->ceilingz : mobj->floorz);
if (mobj->z == prevz)
break;
@ -6609,7 +6615,7 @@ void P_MobjThinker(mobj_t *mobj)
{
if (mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator)
{
INT32 HEIGHT;
fixed_t HEIGHT;
fixed_t radius;
fixed_t dsone = K_GetKartDriftSparkValue(mobj->target->player);
@ -6679,15 +6685,15 @@ void P_MobjThinker(mobj_t *mobj)
mobj->angle = ANGLE_180 + mobj->target->player->frameangle;
// If the player is on the ceiling, then flip
if (mobj->target->player && mobj->target->eflags & MFE_VERTICALFLIP)
if (mobj->target->eflags & MFE_VERTICALFLIP)
{
mobj->eflags |= MFE_VERTICALFLIP;
HEIGHT = mobj->target->height;
HEIGHT = (16<<FRACBITS);
}
else
{
mobj->eflags &= ~MFE_VERTICALFLIP;
HEIGHT = mobj->target->height-mobj->target->height;
HEIGHT = 0;
}
// Shrink if the player shrunk too.
@ -6698,7 +6704,7 @@ void P_MobjThinker(mobj_t *mobj)
const angle_t fa = mobj->angle>>ANGLETOFINESHIFT;
mobj->x = mobj->target->x + FixedMul(finecosine[fa],radius);
mobj->y = mobj->target->y + FixedMul(finesine[fa],radius);
mobj->z = mobj->target->z + HEIGHT;
mobj->z = mobj->target->z - HEIGHT;
P_SetThingPosition(mobj);
}
}