local ScriptLoaded = false
local BattleFuncSet = false

local B = CBW_Battle
local cooldown = TICRATE*3
local jumpthrust = 3*FRACUNIT
local jumpfriction = FRACUNIT*85/100
local jumptime = 27
local jumpcut = FRACUNIT/2
local movefriction = FRACUNIT*85/100

local SpecialMove=function(mo,doaction)
	local player = mo.player
	local B = CBW_Battle
	if not(CBW_Battle.CanDoAction(player)) then
		player.actionstate = 0
	return end
	
	player.actiontext = "Propulsion"
	player.actionrings = 10
	
	
	if player.actionstate != 0 then player.canguard = false end
	
	local water = B.WaterFactor(mo)
	local jumpflags = (player.pflags|PF_JUMPED|PF_THOKKED|PF_NOJUMPDAMAGE)&~(PF_STARTJUMP|PF_GLIDING|PF_BOUNCING|PF_SPINNING)
	local thrust = FixedMul(jumpthrust,player.jumpfactor)

	//Neutral
	if player.actionstate == 0
		if doaction == 1 then
			B.PayRings(player)
			//Do high jump
			player.actionstate = 1
			player.actiontime = 0
--			P_DoJump(player,true)
			P_SetObjectMomZ(mo,thrust,true) //Inherit platform momentum
-- 			P_InstaThrust(mo,mo.angle,0)
			S_StartSound(mo,sfx_s3k3c)
			S_StartSound(mo,sfx_kc5b)
			player.pflags = jumpflags
			mo.state = S_PLAY_SPRING
			player.secondjump = 0
			player.canguard = false
			B.ApplyCooldown(player,cooldown)
			mo.momz = FixedMul($, jumpcut)
			player.ftd.crashing = false
			player.ftd.cstage = 1

-- 			print("start")
		end
	return end
	//Propulsion state
	if player.actionstate == 1
		P_SetObjectMomZ(player.mo,FRACUNIT*5,false) //Inherit platform momentum
-- 		B.ControlThrust(mo,movefriction,nil,jumpfriction,nil)
		//Go into fall frames after end-rising
		mo.state = S_PLAY_SPRING
		player.actiontime = $+1

		//End state
		if player.actiontime > jumptime
		or player.ftd.crashing
		or player.ftd.cstage == 2
			mo.state = S_PLAY_FALL
-- 			player.pflags = $&~(PF_JUMPED)
			player.actionstate = 0
			mo.momz = FixedMul($, jumpcut)
		end
		if P_IsObjectOnGround(mo) then
			player.actionstate = 0
		end
	end
	if player.actionstate and player.pflags&PF_JUMPED and player.actiontime % 4 == 0 then
-- 		P_SpawnThokMobj(player)
		local z = mo.z
		if P_MobjFlip(mo) == -1
			z = $+mo.height
		end
		local prop = P_SpawnPointMissile(
			player.mo, 
			player.mo.x + P_ReturnThrustX(nil,player.mo.angle, FRACUNIT*10), 
			player.mo.y + P_ReturnThrustY(nil,player.mo.angle, FRACUNIT*10), 
			player.mo.z - 100*FRACUNIT*P_MobjFlip(player.mo), 
			MT_FTDDOWNBALL, 
			player.mo.x, 
			player.mo.y, 
			player.mo.z
		)
        if prop and prop.valid then
           prop.flags2 = $&~MF2_OBJECTFLIP|(player.mo.flags2&MF2_OBJECTFLIP)
           prop.eflags = $&~MFE_VERTICALFLIP|(player.mo.eflags&MFE_VERTICALFLIP)
		   if G_GametypeHasTeams()
		   or player.powers[pw_super]
             prop.color = player.skincolor
             prop.colorized = true
           end
        end
		player.pflags = $|PF_THOKKED
	end
end


local function BurstColor (mo)
     if mo.target and mo.target.valid and mo.target.player then
       if G_GametypeHasTeams()
	   or mo.target.player.powers[pw_super]
         mo.color = mo.target.color
         mo.colorized = true
       end
	 end  
end

addHook("ThinkFrame", function()
	if not(CBW_Battle) or ScriptLoaded then return end
	ScriptLoaded = true	
	
	local function FlameDragPriority(player)
		if player.mo.state == S_PLAY_FCRASH
		  if player.ftd.cstage == 3
		    CBW_Battle.SetPriority(player,1,1,"fang_tailbounce",3,1,"Giga Crash Dive")
		  else
			CBW_Battle.SetPriority(player,1,1,"fang_tailbounce",2,1,"Crash Dive")
		  end	
		end	
		if player.mo.state == S_PLAY_FROCKET
		    CBW_Battle.SetPriority(player,0,0,"nil",0,0,"Rocket Spark")
		end
		if player.mo.state == S_PLAY_SPRING
		    CBW_Battle.SetPriority(player,0,0,"nil",0,0,"Jumping Attack")
		end
		if player.mo.state == S_PLAY_FALL
		    CBW_Battle.SetPriority(player,0,0,"nil",0,0,"Jumping Attack")
		end
		if player.actionstate == 1
		    CBW_Battle.SetPriority(player,0,0,"nil",0,0,"Propulsion Thrust")
		end	
	end	


mobjinfo[MT_FROCKET].name = "Rocket Burst"	
mobjinfo[MT_FTDBALL].name = "Fireball"	
mobjinfo[MT_FTDDOWNBALL].name = "Fireball"	


	
	CBW_Battle.SkinVars["flame"] = {
		weight = 100,
		shields = 1,
		func_priority_ext = FlameDragPriority,
		special = SpecialMove,
		flags = SKINVARS_GUARD|SKINVARS_NOSPINSHIELD		
	}
		print("Flame BattleMod action has been loaded.")
end)



