function A_TrickJump(actor) local p = actor.player if not p return end local flip = actor.eflags&MFE_VERTICALFLIP if (flip and actor.momz > 0) or (actor.momz <= 0 and not flip) then actor.state = S_PLAY_TRICKFALL else p.panim = PA_RUN local spark1 = P_SpawnMobjFromMobj(actor, actor.radius/2, actor.radius/2, 0, MT_BOXSPARKLE) local spark2 = P_SpawnMobjFromMobj(actor, -actor.radius/2, -actor.radius/2, 0, MT_BOXSPARKLE) spark1.color = actor.color spark1.colorized = true spark2.color = actor.color spark2.colorized = true end end function A_TrickFall(actor) local p = actor.player if not p return end p.panim = PA_FALL local spark1 = P_SpawnMobjFromMobj(actor, actor.radius/2, actor.radius/2, 0, MT_BOXSPARKLE) local spark2 = P_SpawnMobjFromMobj(actor, -actor.radius/2, -actor.radius/2, 0, MT_BOXSPARKLE) spark1.color = actor.color spark1.colorized = true spark2.color = actor.color spark2.colorized = true P_Thrust(actor, actor.angle, FRACUNIT/2) end freeslot("S_PLAY_TRICKJUMP", "S_PLAY_TRICKFALL") states [S_PLAY_TRICKJUMP] = { sprite = SPR_PLAY, frame = SPR2_ROLL, tics = 1, action = A_TrickJump, nextstate = S_PLAY_TRICKJUMP, } states [S_PLAY_TRICKFALL] = { sprite = SPR_PLAY, frame = SPR2_FALL, tics = 2, action = A_TrickFall, nextstate = S_PLAY_TRICKFALL, } addHook("JumpSpecial", function(p) local mo = p.mo if not P_IsObjectOnGround(mo) if mo.state == S_PLAY_RUN or (mo.state == S_PLAY_SPRING and p.speed >= p.runspeed) local jump = max(7*FRACUNIT, mo.momz + 5*FRACUNIT) P_SetObjectMomZ(mo, jump) mo.state = S_PLAY_TRICKJUMP S_StartSound(mo, sfx_zoom) return true end end end) addHook("SpinSpecial", function(p) local mo = p.mo if mo.state == S_PLAY_TRICKFALL then p.pflags = $|PF_SPINNING mo.state = S_PLAY_ROLL P_SetObjectMomZ(mo, 0) P_InstaThrust(mo, mo.angle, max(p.mindash, p.speed)) local spark = P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_IVSP) spark.color = mo.color spark.colorized = true S_StartSound(mo, sfx_spin) return true end local carrier = mo.tracer if not (carrier and carrier.valid and carrier.player) return end if p.powers[pw_carry] == CR_PLAYER and carrier.player.speed >= carrier.player.runspeed then mo.tracer = nil p.powers[pw_carry] = 0 P_SetObjectMomZ(mo, 7*FRACUNIT) P_Thrust(mo, mo.angle, 5*FRACUNIT) mo.state = S_PLAY_TRICKJUMP P_SetObjectMomZ(carrier, 15*FRACUNIT) carrier.state = S_PLAY_TRICKJUMP S_StartSound(carrier, sfx_zoom) end end)