Merge branch 'nights-hotfix' into 'next'

NiGHTS hotfix

Fixes the following issues relating to playing as NiGHTS Super Sonic that apparently popped up between 2.1.14 and next (mostly due to the changes to SRB2's trig stuff it seems):
* Super Sonic drifts to the side at some angles around an axis, and is unable to go directly upwards or downwards as a result
* Drilling to the side when on the ground causes the drill sound to constantly restart
* CEZS's start not actually being lined up properly with the first axis means the player is not able to go backwards along the track (because the player is not actually aligned with the track properly, preventing you from touching the attached line transfer)
* trying to hug some walls such as the tall wall before the library section of CEZS allows Super Sonic to go through them

These fixes needs proper testing before this branch can be merged in, in case they accidentally break other things as a result or something.

See merge request !71
This commit is contained in:
Inuyasha 2016-05-18 07:09:05 -04:00
commit ab7af594d9
2 changed files with 52 additions and 14 deletions

View file

@ -1900,6 +1900,9 @@ void P_XYMovement(mobj_t *mo)
if (player && player->homing) // no friction for homing if (player && player->homing) // no friction for homing
return; return;
if (player && player->pflags & PF_NIGHTSMODE)
return; // no friction for NiGHTS players
#ifdef ESLOPE #ifdef ESLOPE
if ((mo->type == MT_BIGTUMBLEWEED || mo->type == MT_LITTLETUMBLEWEED) if ((mo->type == MT_BIGTUMBLEWEED || mo->type == MT_LITTLETUMBLEWEED)
&& (mo->standingslope && abs(mo->standingslope->zdelta) > FRACUNIT>>8)) // Special exception for tumbleweeds on slopes && (mo->standingslope && abs(mo->standingslope->zdelta) > FRACUNIT>>8)) // Special exception for tumbleweeds on slopes
@ -2655,12 +2658,17 @@ static void P_PlayerZMovement(mobj_t *mo)
mo->z = mo->floorz; mo->z = mo->floorz;
if (mo->player->pflags & PF_NIGHTSMODE) if (mo->player->pflags & PF_NIGHTSMODE)
{
// bounce off floor if you were flying towards it
if ((mo->eflags & MFE_VERTICALFLIP && mo->player->flyangle > 0 && mo->player->flyangle < 180)
|| (!(mo->eflags & MFE_VERTICALFLIP) && mo->player->flyangle > 180 && mo->player->flyangle <= 359))
{ {
if (mo->player->flyangle < 90 || mo->player->flyangle >= 270) if (mo->player->flyangle < 90 || mo->player->flyangle >= 270)
mo->player->flyangle += P_MobjFlip(mo)*90; mo->player->flyangle += P_MobjFlip(mo)*90;
else else
mo->player->flyangle -= P_MobjFlip(mo)*90; mo->player->flyangle -= P_MobjFlip(mo)*90;
mo->player->speed = FixedMul(mo->player->speed, 4*FRACUNIT/5); mo->player->speed = FixedMul(mo->player->speed, 4*FRACUNIT/5);
}
goto nightsdone; goto nightsdone;
} }
// Get up if you fell. // Get up if you fell.
@ -2850,6 +2858,10 @@ nightsdone:
mo->z = mo->ceilingz - mo->height; mo->z = mo->ceilingz - mo->height;
if (mo->player->pflags & PF_NIGHTSMODE) if (mo->player->pflags & PF_NIGHTSMODE)
{
// bounce off ceiling if you were flying towards it
if ((mo->eflags & MFE_VERTICALFLIP && mo->player->flyangle > 180 && mo->player->flyangle <= 359)
|| (!(mo->eflags & MFE_VERTICALFLIP) && mo->player->flyangle > 0 && mo->player->flyangle < 180))
{ {
if (mo->player->flyangle < 90 || mo->player->flyangle >= 270) if (mo->player->flyangle < 90 || mo->player->flyangle >= 270)
mo->player->flyangle -= P_MobjFlip(mo)*90; mo->player->flyangle -= P_MobjFlip(mo)*90;
@ -2858,6 +2870,7 @@ nightsdone:
mo->player->flyangle %= 360; mo->player->flyangle %= 360;
mo->player->speed = FixedMul(mo->player->speed, 4*FRACUNIT/5); mo->player->speed = FixedMul(mo->player->speed, 4*FRACUNIT/5);
} }
}
// Check for "Mario" blocks to hit and bounce them // Check for "Mario" blocks to hit and bounce them
if (P_MobjFlip(mo)*mo->momz > 0) if (P_MobjFlip(mo)*mo->momz > 0)
@ -3719,6 +3732,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj)
} }
else else
{ {
if (!(mobj->player->pflags & PF_NIGHTSMODE)) // "jumping" is used for drilling
mobj->player->jumping = 0; mobj->player->jumping = 0;
mobj->player->pflags &= ~PF_JUMPED; mobj->player->pflags &= ~PF_JUMPED;
if (mobj->player->secondjump || mobj->player->powers[pw_tailsfly]) if (mobj->player->secondjump || mobj->player->powers[pw_tailsfly])

View file

@ -4952,8 +4952,9 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad
else else
{ {
const angle_t fa = player->angle_pos>>ANGLETOFINESHIFT; const angle_t fa = player->angle_pos>>ANGLETOFINESHIFT;
player->mo->momx = player->mo->target->x + FixedMul(FINECOSINE(fa),radius) - player->mo->x; const angle_t faold = player->old_angle_pos>>ANGLETOFINESHIFT;
player->mo->momy = player->mo->target->y + FixedMul(FINESINE(fa),radius) - player->mo->y; player->mo->momx = FixedMul(FINECOSINE(fa),radius) - FixedMul(FINECOSINE(faold),radius);
player->mo->momy = FixedMul(FINESINE(fa),radius) - FixedMul(FINESINE(faold),radius);
} }
if (player->exiting) if (player->exiting)
@ -5660,6 +5661,29 @@ static void P_NiGHTSMovement(player_t *player)
if (player->mo->eflags & MFE_VERTICALFLIP) if (player->mo->eflags & MFE_VERTICALFLIP)
cmd->forwardmove = (SINT8)(-cmd->forwardmove); cmd->forwardmove = (SINT8)(-cmd->forwardmove);
if (!(player->pflags & PF_TRANSFERTOCLOSEST))
{
fixed_t realdist = R_PointToDist2(player->mo->x, player->mo->y, player->mo->target->x, player->mo->target->y);
// teleport player to correct radius if neccessary
if (realdist>>FRACBITS != radius>>FRACBITS)
{
CONS_Debug(DBG_NIGHTS, "Aligning player with axis\n");
P_UnsetThingPosition(player->mo);
if (realdist == 0) // other method won't work if we're exactly on the target lol
{
const angle_t fa = player->old_angle_pos>>ANGLETOFINESHIFT;
player->mo->x = player->mo->target->x + FixedMul(FINECOSINE(fa), radius);
player->mo->y = player->mo->target->y + FixedMul(FINESINE(fa), radius);
}
else
{
player->mo->x = player->mo->target->x + FixedMul(FixedDiv(player->mo->x - player->mo->target->x, realdist), radius);
player->mo->y = player->mo->target->y + FixedMul(FixedDiv(player->mo->y - player->mo->target->y, realdist), radius);
}
P_SetThingPosition(player->mo);
}
}
// Currently reeling from being hit. // Currently reeling from being hit.
if (player->powers[pw_flashing] > (2*flashingtics)/3) if (player->powers[pw_flashing] > (2*flashingtics)/3)
{ {