diff --git a/src/p_map.c b/src/p_map.c index b91358140..e2d296fb4 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -134,6 +134,17 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) object->standingslope = NULL; // Okay, now we can't return - no launching off at silly angles for you. #endif + if (object->player + && ((object->player->charability == CA_TWINSPIN && object->player->panim == PA_ABILITY) + || (object->player->charability2 == CA2_MELEE && object->player->panim == PA_ABILITY2))) + { + S_StartSound(object, sfx_s3k8b); +#define scalefactor ((4*FRACUNIT)/3) + horizspeed = FixedMul(horizspeed, scalefactor); + vertispeed = FixedMul(vertispeed, FixedSqrt(scalefactor)); +#undef scalefactor + } + object->eflags |= MFE_SPRUNG; // apply this flag asap! spring->flags &= ~(MF_SOLID|MF_SPECIAL); // De-solidify diff --git a/src/p_mobj.c b/src/p_mobj.c index 111777ccf..4de36ff07 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3211,10 +3211,10 @@ static void P_PlayerZMovement(mobj_t *mo) mo->player->skidtime = TICRATE; mo->tics = -1; } - else if (mo->player->charability2 == CA2_MELEE && ((mo->player->charability == CA_TWINSPIN && mo->player->panim == PA_ABILITY) || (mo->player->panim == PA_ABILITY2))) + else if (mo->player->charability2 == CA2_MELEE && ((mo->player->charability == CA_TWINSPIN && mo->player->panim == PA_ABILITY) || (mo->player->panim == PA_ABILITY2 && mo->state-states != S_PLAY_MELEE_LANDING))) { P_SetPlayerMobjState(mo, S_PLAY_MELEE_LANDING); - mo->tics = mo->player->powers[pw_nocontrol] = (mo->movefactor == FRACUNIT) ? TICRATE/2 : (FixedDiv(35<<(FRACBITS-1), FixedSqrt(mo->movefactor)))>>FRACBITS; + mo->tics = (mo->movefactor == FRACUNIT) ? TICRATE/2 : (FixedDiv(35<<(FRACBITS-1), FixedSqrt(mo->movefactor)))>>FRACBITS; S_StartSound(mo, sfx_s3k8b); } else if (mo->player->pflags & PF_JUMPED || (mo->player->pflags & (PF_SPINNING|PF_USEDOWN)) != (PF_SPINNING|PF_USEDOWN) diff --git a/src/p_user.c b/src/p_user.c index 38ff9da9a..59142edd0 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3833,7 +3833,6 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd) } else { - player->powers[pw_nocontrol] = TICRATE; player->mo->z += P_MobjFlip(player->mo); P_SetObjectMomZ(player->mo, player->mindash, false); if (player->mo->eflags & MFE_UNDERWATER) @@ -5181,7 +5180,6 @@ static void P_NightsTransferPoints(player_t *player, fixed_t xspeed, fixed_t rad if (notallowed) return; } -#endif { const INT32 sequence = player->mo->target->threshold; @@ -6555,9 +6553,9 @@ static void P_MovePlayer(player_t *player) runspd = FixedMul(runspd, player->mo->movefactor); // Control relinquishing stuff! - if (player->powers[pw_carry] == CR_BRAKGOOP) - player->pflags |= PF_FULLSTASIS; - else if (player->pflags & PF_GLIDING && player->skidtime) + if ((player->powers[pw_carry] == CR_BRAKGOOP) + || (player->pflags & PF_GLIDING && player->skidtime) + || (player->charability2 == CA2_MELEE && player->panim == PA_ABILITY2)) player->pflags |= PF_FULLSTASIS; else if (player->powers[pw_nocontrol]) {