diff --git a/src/p_mobj.c b/src/p_mobj.c index 5cd039797..38dca6073 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1900,6 +1900,9 @@ void P_XYMovement(mobj_t *mo) if (player && player->homing) // no friction for homing return; + if (player && player->pflags & PF_NIGHTSMODE) + return; // no friction for NiGHTS players + #ifdef ESLOPE if ((mo->type == MT_BIGTUMBLEWEED || mo->type == MT_LITTLETUMBLEWEED) && (mo->standingslope && abs(mo->standingslope->zdelta) > FRACUNIT>>8)) // Special exception for tumbleweeds on slopes @@ -2656,11 +2659,16 @@ static void P_PlayerZMovement(mobj_t *mo) if (mo->player->pflags & PF_NIGHTSMODE) { - if (mo->player->flyangle < 90 || mo->player->flyangle >= 270) - mo->player->flyangle += P_MobjFlip(mo)*90; - else - mo->player->flyangle -= P_MobjFlip(mo)*90; - mo->player->speed = FixedMul(mo->player->speed, 4*FRACUNIT/5); + // 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) + mo->player->flyangle += P_MobjFlip(mo)*90; + else + mo->player->flyangle -= P_MobjFlip(mo)*90; + mo->player->speed = FixedMul(mo->player->speed, 4*FRACUNIT/5); + } goto nightsdone; } // Get up if you fell. @@ -2851,12 +2859,17 @@ nightsdone: if (mo->player->pflags & PF_NIGHTSMODE) { - if (mo->player->flyangle < 90 || mo->player->flyangle >= 270) - mo->player->flyangle -= P_MobjFlip(mo)*90; - else - mo->player->flyangle += P_MobjFlip(mo)*90; - mo->player->flyangle %= 360; - mo->player->speed = FixedMul(mo->player->speed, 4*FRACUNIT/5); + // 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) + mo->player->flyangle -= P_MobjFlip(mo)*90; + else + mo->player->flyangle += P_MobjFlip(mo)*90; + mo->player->flyangle %= 360; + mo->player->speed = FixedMul(mo->player->speed, 4*FRACUNIT/5); + } } // Check for "Mario" blocks to hit and bounce them @@ -3719,7 +3732,8 @@ static void P_PlayerMobjThinker(mobj_t *mobj) } else { - mobj->player->jumping = 0; + if (!(mobj->player->pflags & PF_NIGHTSMODE)) // "jumping" is used for drilling + mobj->player->jumping = 0; mobj->player->pflags &= ~PF_JUMPED; if (mobj->player->secondjump || mobj->player->powers[pw_tailsfly]) { diff --git a/src/p_user.c b/src/p_user.c index c996f0e15..0ee5a36b4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4952,8 +4952,9 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad else { const angle_t fa = player->angle_pos>>ANGLETOFINESHIFT; - player->mo->momx = player->mo->target->x + FixedMul(FINECOSINE(fa),radius) - player->mo->x; - player->mo->momy = player->mo->target->y + FixedMul(FINESINE(fa),radius) - player->mo->y; + const angle_t faold = player->old_angle_pos>>ANGLETOFINESHIFT; + 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) @@ -5660,6 +5661,29 @@ static void P_NiGHTSMovement(player_t *player) if (player->mo->eflags & MFE_VERTICALFLIP) 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. if (player->powers[pw_flashing] > (2*flashingtics)/3) {