local BattleFuncSet = false

freeslot("S_LOGIC_BOUNCE", "SPR2_LBNC")

states[S_LOGIC_BOUNCE] = {
        sprite = SPR_PLAY,
        frame = SPR2_LBNC,
        tics = -1,
        nextstate = S_LOGIC_BOUNCE
}

addHook("ThinkFrame",function()
local jumpbtn = false
	if (BattleFuncSet) or not(CBW_Battle and CBW_Battle.SkinVars) then return end
	BattleFuncSet = true
	
	local LogicSpecial = function(mo,doaction,pressedaction)
	local player = mo.player
		if mo.logichoming
			if mo.target
				if mo.target.type == MT_TARGETDUMMY
				mo.tracer = mo.target
				mo.logichoming = false
				mo.homingtics = TICRATE
				player.homing = TICRATE
				mo.lasthoming = nil
				player.pflags = $1|PF_THOKKED
				end
			end
		end
		if P_IsObjectOnGround(mo)
		player.actiontext = "Spin Attack"
		player.actionrings = 10
		else
			if mo.dropdash
			and mo.dropdash > 0
			player.actiontext = "Fast Drop"
			player.actionrings = 10
			else
			player.actiontext = "Stomp"
			player.actionrings = 10
			end
		end
		if doaction == 1
			if CBW_Battle.CanDoAction(player)
			and not player.actionstate
				if P_IsObjectOnGround(mo) // Spin Attack
				player.actionstate = 1
				player.actiontime = TICRATE
				P_InstaThrust(mo, mo.angle, 2*FRACUNIT)
				S_StartSound(mo, sfx_spin)
				else
					if mo.dropdash
					P_SetObjectMomZ(mo, -32*FRACUNIT)
					player.actionstate = 3
					S_StartSound(mo, sfx_cdfm40)
					//CBW_Battle.ApplyCooldown(player, TICRATE)
					else
					player.actionstate = 2
					S_StartSound(mo, sfx_kc5b)
					player.actiontime = 3*TICRATE
					end
				end
			CBW_Battle.PayRings(player)
			end
		end
		if player.actionstate == 1
		player.actiontime = $1 - 1
			if P_IsObjectOnGround(mo)
			mo.state = S_PLAY_SPINDASH
			P_SpawnThokMobj(player)
			player.powers[pw_nocontrol] = 2
			player.drawangle = R_PointToAngle2(0, 0, mo.momx, mo.momy)
			P_InstaThrust(mo, R_PointToAngle2(0, 0, mo.momx, mo.momy), player.actiontime*FRACUNIT)
			player.pflags = $1|PF_JUMPED
				if (player.cmd.buttons & BT_JUMP)
				and jumpbtn == false
					if not (mo.eflags & MFE_UNDERWATER)
					P_SetObjectMomZ(mo, 8*FRACUNIT)
					else
					P_SetObjectMomZ(mo, 4*FRACUNIT)
					end
				mo.state = S_LOGIC_TRICK1
				P_SpawnParaloop(player.mo.x,player.mo.y,player.mo.z,player.mo.scale*64,12,MT_DUST,ANGLE_90,nil,true) //You are genius author :D
				P_InstaThrust(mo, R_PointToAngle2(0, 0, mo.momx, mo.momy), -8*FRACUNIT)
				player.actionstate = 0
				player.actiontime = 0
				S_StartSound(mo, sfx_jump)
				end
			else
				if (player.pflags & PF_JUMPED)
				player.pflags = $1 & ~PF_JUMPED
				end
			player.actionstate = 0
			player.actiontime = 0
			mo.state = S_PLAY_FALL
			CBW_Battle.ApplyCooldown(player, TICRATE)
			end
			if player.actiontime <= 5
				if (player.pflags & PF_JUMPED)
				player.pflags = $1 & ~PF_JUMPED
				end
				if player.actiontime == 5
				mo.state = S_PLAY_WALK
				end
			player.actionstate = 0
			player.actiontime = 0
			CBW_Battle.ApplyCooldown(player, TICRATE)
			end
		elseif player.actionstate == 2
		player.actiontime = $1 - 1
			if not P_IsObjectOnGround(mo)
			mo.momx = 0
			mo.momy = 0
			P_SetObjectMomZ(mo, -32*FRACUNIT)
			mo.state = S_LOGIC_BOUNCE
			P_SpawnGhostMobj(mo)
			player.pflags = $1|(PF_JUMPED|PF_THOKKED)
				if (mo.eflags & MFE_GOOWATER)
				or not player.actiontime
				player.actiontime = 0
				player.actionstate = 0
				mo.state = S_PLAY_FALL
				player.pflags = $1 & ~(PF_JUMPED|PF_THOKKED)
				CBW_Battle.ApplyCooldown(player, 15)
				end
				if player.powers[pw_justsprung]
				player.actiontime = 0
				player.actionstate = 0
				mo.state = S_PLAY_SPRING
				player.pflags = $1 & ~(PF_JUMPED|PF_THOKKED)
				CBW_Battle.ApplyCooldown(player, 15)
				mo.momz = $*5/4
				mo.momx = $*5/4
				mo.momy = $*5/4
				S_StartSound(mo, sfx_sprong)
				end
				if player.powers[pw_carry]
				or P_PlayerInPain(player)
				or (player.pflags & PF_SLIDING)
				player.actiontime = 0
				player.actionstate = 0
				CBW_Battle.ApplyCooldown(player, 15)
				end
			else
			player.actiontime = 0
			player.actionstate = 0
				if not (mo.eflags & MFE_UNDERWATER)
				P_SetObjectMomZ(mo, 4*FRACUNIT)
				else
				P_SetObjectMomZ(mo, 2*FRACUNIT)
				end
			mo.state = S_PLAY_FALL
			player.pflags = $1 & ~(PF_JUMPED|PF_THOKKED)
			S_StartSound(mo, sfx_s3k5f)
				for i = 0, 23
					local gp_pt = P_SPMAngle(mo,MT_GROUNDPOUND,mo.angle+i*ANG15,0)
					if gp_pt
					and gp_pt.valid
					local water = CBW_Battle.WaterFactor(mo)
					gp_pt.momz = mo.scale*P_MobjFlip(mo)*2/water
					gp_pt.fuse = TICRATE/3
					end
				end
			CBW_Battle.ApplyCooldown(player, TICRATE+15)
			end
		elseif player.actionstate == 3
		P_SpawnGhostMobj(mo)
			if mo.dropdash
				if P_IsObjectOnGround(mo)
				player.actionstate = 1
				player.actiontime = mo.dropdash
				P_NukeEnemies(mo, mo, 1*FRACUNIT)
				end
			else
			player.actionstate = 0
			CBW_Battle.ApplyCooldown(player, TICRATE)
			end
		end
		if (player.cmd.buttons & BT_JUMP)
		jumpbtn = true
		else
		jumpbtn = false
		end
	end
	
	local LogicPriority = function(player)
		if player.mo.dropdash
		and player.mo.dropdash > 0
		CBW_Battle.SetPriority(player,1,2,nil,1,2,"drop dash")
		end
		if player.actionstate == 1
		CBW_Battle.SetPriority(player,2,2,nil,2,2,"spin attack")
		elseif player.actionstate == 2
		CBW_Battle.SetPriority(player,2,2,nil,2,2,"stomp")
		elseif player.actionstate == 3
		CBW_Battle.SetPriority(player,2,2,nil,2,2,"fast drop")
		end
	end

	CBW_Battle.SkinVars["ultsonic"] = {
		weight = 80,
		shields = 1,
		guard_frame = 2,
		special = LogicSpecial,
		func_priority_ext = LogicPriority
	}
end)