freeslot("S_ASHURA_BRST", "S_ASHURA_SWIM")

states[S_ASHURA_BRST] = {
	sprite = SPR_PLAY,
	frame = A|SPR2_ROLL,
	var1 = 0,
	var2 = 0,
	tics = 2,
	nextstate = S_ASHURA_BRST
}
states[S_ASHURA_SWIM] = {
	sprite = SPR_PLAY,
	frame = A|SPR2_SPNG,
	var1 = 0,
	var2 = 0,
	tics = 2,
	nextstate = S_ASHURA_SWIM
}

local ashura_savedspd = 0
local ashura_burstspd = 0
local ashura_swimspd = 0

addHook("AbilitySpecial",function(p)
	if p.mo.skin == "ashura"
	and not (p.mo.eflags & MFE_UNDERWATER or p.pflags & PF_THOKKED)
		p.ashura_savedspd = FixedMul(p.mo.scale, p.speed)
		p.mo.state = S_ASHURA_BRST
		p.pflags = ($|PF_THOKKED) & ~ (PF_SPINNING|PF_STARTJUMP)
		P_SetObjectMomZ(p.mo, 16*p.jumpfactor, false)
		S_StartSound(p.mo, sfx_s220)
	end
	if p.mo.skin == "ashura"
	and p.mo.eflags & MFE_UNDERWATER
	and not (p.pflags & PF_THOKKED or p.pflags & PF_SPINDOWN)
		p.mo.state = S_ASHURA_SWIM
		p.pflags = ($|PF_THOKKED) & ~ (PF_JUMPED|PF_SPINNING)
	end
end)

--Bubble Burst
addHook("PlayerThink",function(p)
	if p.powers[pw_super]
		p.ashura_burstspd = 48
	else
		p.ashura_burstspd = 24
	end
	if p.mo.state == S_ASHURA_BRST
	and p.mo.momz >= 0
		local ghost = P_SpawnGhostMobj(p.mo)
		ghost.fuse = 4
	end
	if p.mo.state == S_ASHURA_BRST
	and p.mo.momz <= 0
		p.mo.momz = $-FixedMul(P_GetMobjGravity(p.mo), 3*FU/4)
	end
	if p.mo.state == S_ASHURA_BRST
	and FixedHypot(p.mo.momx, p.mo.momy) >= FixedMul(4, p.mo.scale)
		p.mo.momx = FixedMul(p.mo.momx, (950 * FU) / 1000)
		p.mo.momy = FixedMul(p.mo.momy, (950 * FU) / 1000)
	end
	if p.mo.state == S_ASHURA_BRST
		if (p.mo.eflags & MFE_UNDERWATER or P_IsObjectInGoop(p.mo))
		and not (p.mo.eflags & MFE_TOUCHWATER)
			p.mo.state = S_ASHURA_SWIM
			p.pflags = $ & ~(PF_JUMPED)
		end
	end
end)

addHook("JumpSpecial",function(p)
	if p.mo.state == S_ASHURA_BRST
	and not (p.pflags & PF_JUMPDOWN)
		p.mo.state = S_PLAY_FALL
		p.pflags = $ & ~PF_JUMPED
		P_SetObjectMomZ(p.mo, 10*p.jumpfactor, false)
		S_StartSound(p.mo, sfx_splish)
		local splash = P_SpawnMobjFromMobj(p.mo, 0,0,0,MT_SPLISH)
		splash.scale = p.mo.scale*2
		if (p.isxmomentum or p.boosting == true)
		and p.ashura_savedspd > p.ashura_burstspd*FU
			P_InstaThrust(p.mo, p.mo.angle, p.ashura_savedspd)
		else
			P_InstaThrust(p.mo, p.mo.angle, p.ashura_burstspd*p.mo.scale)
		end
	end
end)

addHook("SpinSpecial",function(p)
	if p.mo.state == S_ASHURA_BRST
	and not (p.pflags & PF_SPINDOWN)
		p.mo.state = S_PLAY_FALL
		p.pflags = $ & ~PF_JUMPED
		P_SetObjectMomZ(p.mo, -10*p.jumpfactor, false)
		S_StartSound(p.mo, sfx_splish)
		local splash = P_SpawnMobjFromMobj(p.mo, 0,0,0,MT_SPLISH)
		splash.scale = p.mo.scale*2
		if (p.isxmomentum or p.boosting == true)
		and p.ashura_savedspd > p.ashura_burstspd*FU
			P_InstaThrust(p.mo, p.mo.angle, p.ashura_savedspd)
		else
			P_InstaThrust(p.mo, p.mo.angle, p.ashura_burstspd*p.mo.scale)
		end
	end
end)

--Dynamic Swim
addHook("PlayerThink",function(p)
	if p.powers[pw_super]
		p.ashura_swimspd = 2
	else
		p.ashura_swimspd = 1
	end
	if p.mo.state == S_ASHURA_SWIM
		p.pflags = $|PF_CANCARRY
	elseif p.mo.skin == "ashura"
	and not (p.mo.state == S_ASHURA_SWIM)
		p.pflags = $ & ~(PF_CANCARRY)
	end
	if p.mo.state == S_ASHURA_SWIM
	and not (p.powers[pw_sneakers] or p.powers[pw_super])
		p.normalspeed = skins[p.mo.skin].normalspeed*166/100
		p.fakenormalspeed = skins[p.mo.skin].normalspeed*166/100
		p.acceleration = skins[p.mo.skin].acceleration*166/100
	elseif (p.mo.state == S_ASHURA_SWIM and (p.powers[pw_sneakers] or p.powers[pw_super]))
		p.normalspeed = skins[p.mo.skin].normalspeed*2
		p.fakenormalspeed = skins[p.mo.skin].normalspeed*2
		p.acceleration = skins[p.mo.skin].acceleration*2
	else
		p.normalspeed = skins[p.mo.skin].normalspeed
		p.fakenormalspeed = skins[p.mo.skin].normalspeed
		p.acceleration = skins[p.mo.skin].acceleration
	end
	if p.mo.state == S_ASHURA_SWIM
		if not P_IsObjectInGoop(p.mo)
			if not (p.pflags & PF_JUMPDOWN)
			and p.mo.momz > 0*FU
				p.mo.momz = $ - 1*FU / 2
			elseif not (p.pflags & PF_SPINDOWN and not P_IsObjectInGoop(p.mo))
			and p.mo.momz < 0*FU
				p.mo.momz = $ + 1*FU / 2
			end
		end
	end
	if p.mo.state == S_ASHURA_SWIM
	and p.pflags & PF_JUMPDOWN
		p.mo.momz = $ + p.ashura_swimspd*p.mo.scale / 2
	end
	if p.mo.state == S_ASHURA_SWIM
	and p.pflags & PF_SPINDOWN
		if not (P_IsObjectInGoop(p.mo))
			p.mo.momz = $ - p.ashura_swimspd*p.mo.scale / 3
		elseif (p.mo.momz >= 1*p.mo.scale and P_IsObjectInGoop(p.mo))
			p.mo.momz = $-FixedMul(P_GetMobjGravity(p.mo), 2*FU/5)
		end
	end
	if p.mo.state == S_ASHURA_SWIM
	and (p.pflags & PF_JUMPDOWN and p.pflags & PF_SPINDOWN)
		p.mo.state = S_PLAY_JUMP
		p.pflags = ($|PF_JUMPED|PF_THOKKED)
	end
	if p.mo.state == S_ASHURA_SWIM
		if not (p.mo.eflags & MFE_UNDERWATER)
		or p.mo.eflags & MFE_TOUCHWATER
			p.mo.state = S_PLAY_JUMP
			p.pflags = ($|PF_JUMPED|PF_THOKKED)
			if p.mo.momz >= 1*FU
				P_SetObjectMomZ(p.mo, p.mo.momz + 3*p.jumpfactor, false)
			end
		end
	end
end)