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 bff6c6234c
commit 9d2afe7403
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; fixed_t spawny = P_RandomRange(-spawnrange, spawnrange)<<FRACBITS;
INT32 speedrange = 2; INT32 speedrange = 2;
mobj_t *dust = P_SpawnMobj(spawner->x + spawnx, spawner->y + spawny, spawner->z, MT_DRIFTDUST); 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->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->momy = FixedMul(spawner->momy + (P_RandomRange(-speedrange, speedrange)<<FRACBITS), 3*FRACUNIT/4);
dust->momz = P_MobjFlip(spawner) * P_RandomRange(1, 4)<<FRACBITS; dust->momz = P_MobjFlip(spawner) * P_RandomRange(1, 4)<<FRACBITS;
@ -2279,6 +2283,11 @@ void K_DriftDustHandling(mobj_t *spawner)
else else
dust->flags2 &= ~MF2_DONTDRAW; dust->flags2 &= ~MF2_DONTDRAW;
if (spawner->eflags & MFE_VERTICALFLIP)
dust->eflags |= MFE_VERTICALFLIP;
else
dust->eflags &= ~MFE_VERTICALFLIP;
if (spawner->eflags & MFE_DRAWONLYFORP1) if (spawner->eflags & MFE_DRAWONLYFORP1)
dust->eflags |= MFE_DRAWONLYFORP1; dust->eflags |= MFE_DRAWONLYFORP1;
else else

View file

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