local Mint = Mint

addHook("AbilitySpecial",function(p)
if p.spectator or p.bot return end
local s = p.realmo if not (s and s.valid) return end
local spr2 = s.sprite2
local sv = p.realmo.valid
local mint = p.minttable
local pain = P_PlayerInPain(p)
local ong = P_IsObjectOnGround(s)
local hitflr = (s.eflags&MFE_JUSTHITFLOOR)
if pain or (p.playerstate==PST_DEAD) or p.powers[pw_justsprung] return end
if not ActiveMint(s) or not (s and sv and p.playerstate==PST_LIVE) return end

if not ong and not (p.pflags&PF_THOKKED) and not mint.spinlaunchcharge
and not mint.burststomp
and not pain
and not (s.eflags&MFE_UNDERWATER)

s.state = S_PLAY_SPINDASH
p.pflags = $1&~PF_JUMPED
p.pflags = $|PF_THOKKED
//p.pflags = $|PF_SPINNING
mint.spinlaunchcharge = true
mint.twirl,mint.trick,s.rollangle,mint.framejump = 0,0,0,0
S_StartSound(s,sfx_mspnd)
if not mint and mint.shield==SH_ATTRACT
mint.combo = 0
end;end
if (s.eflags&MFE_UNDERWATER) and not ong and not (p.pflags&PF_THOKKED)
S_StartSoundAtVolume(s,sfx_mdash,150)
P_InstaThrust(s, s.angle, 21*FU + p.speed)
P_DoMintEffect(p,s.color)
s.state = S_PLAY_MINTDASH
p.pflags = $|PF_THOKKED
s.spritexscale = FU-28500
s.spriteyscale = FU+21000
mint.stretch = {timer = 3}
for a=1,9 do
local bub = P_SpawnMobj(s.x,s.y,s.z, MT_MEDIUMBUBBLE)
bub.angle = p.drawangle
P_InstaThrust(bub, bub.angle, -3*FU)
P_SetObjectMomZ(bub, 0*FU)
end
if not (s.momz*P_MobjFlip(s) < 0*s.scale)
s.momz = 0
end;end;end)

addHook("PlayerThink",function(p)
local s = p.realmo if not (s and s.valid) return end
local spr2 = s.sprite2
local sv = p.realmo.valid
local mint = p.minttable
local pain = P_PlayerInPain(p)
local ong = P_IsObjectOnGround(s)
if not ActiveMint(s) or not (s and sv and p.playerstate==PST_LIVE) return end
if pain or (p.playerstate==PST_DEAD) or p.powers[pw_justsprung] return end
if not P_IsObjectOnGround(s)
and mint and mint.spinlaunchcharge
and not (p.cmd.buttons&BT_JUMP)
and not p.powers[pw_justsprung]
and not pain

if (mint.realcharge >= 1) and (mint.realcharge < 7) or (s.eflags&MFE_UNDERWATER)
Mint.AirDash(p,s,mint)
elseif not (mint.realcharge < 7) or (mint.realcharge >= 7)
s.state = S_PLAY_SPRING
mint.spintrail = 10
p.pflags = $|PF_THOKKED
p.pflags = $1&~PF_JUMPED
p.pflags = $1&~PF_SPINNING
mint.spinlaunchcharge = false
S_StopSoundByID(s,sfx_mspnd)
mint.framejump = 0
for i = 1,6
local dust = P_SpawnMobj(s.x, s.y, s.z, MT_THOK)
dust.angle = ANG60*i
dust.blendmode = AST_ADD
dust.fuse,dust.tics = 20,20
P_InstaThrust(dust, dust.angle, 10*FU)
local minttrail = dust
if s.color==SKINCOLOR_SWEETNAM and not p.powers[pw_sneakers]
or s.color==SKINCOLOR_ICY and not p.powers[pw_sneakers]
or s.color==SKINCOLOR_LEGACYMINT and not p.powers[pw_sneakers]
or s.color==SKINCOLOR_NEOBLUE and not p.powers[pw_sneakers]
minttrail.color = SKINCOLOR_SAPPHIRE
elseif p.powers[pw_sneakers] or mint.canLSA
minttrail.color = SKINCOLOR_PEPPER
else
minttrail.color = s.color
end;end
if (mint.realcharge >= 30)
mint.realcharge = 31
P_DoMintEffect2(p,SKINCOLOR_GREY)
P_StartQuake(12*FU, 1*TICRATE*1/2)
S_StartSound(s,sfx_mlnch)
s.spritexscale = FU-28500
s.spriteyscale = FU+41000
mint.stretch = {timer = 20}
mint.zoomout = 20
local launchready = P_SpawnGhostMobj(s)
launchready.fuse = 5
launchready.blendmode = AST_ADD
launchready.color = SKINCOLOR_WHITE
launchready.colorized = true
if (p.speed >= 55*s.scale)
s.state = S_PLAY_MINTDASH2
P_DoMintEffect(p,SKINCOLOR_GREY)
S_StartSoundAtVolume(s,sfx_mdive,155)
else
s.state = S_PLAY_SPRING
end;end
if (p.powers[pw_shield]&SH_FIREFLOWER)
S_StartSound(s,sfx_s3k47)
S_StartSound(s,sfx_s3k43)
mint.flames = 10
else
S_StartSound(s,sfx_kc5b)
end
if (s.eflags&MFE_UNDERWATER)
P_SetObjectMomZ(s,10*FU,false)
else
P_SetObjectMomZ(s,mint.realcharge*FU,false)
end;end
if P_IsObjectInGoop(s,s.angle) or p.powers[pw_carry]==CR_ROPEHANG or p.powers[pw_justsprung] or pain
mint.spinlaunchcharge = false
mint.realcharge = 0
end
end;end)