// --------------------------------------
// Lua_Spark
// Spark ability!
// --------------------------------------
local function buttonPressed(player, button)
	if(player.cmd.buttons & button)
		and not(player.kvars.prevcmd & button)
		return true
	end
	return false
end

local function lockControl(player)
	if(player.powers[pw_nocontrol] <= 2)
		player.powers[pw_nocontrol] = 2
	end
	player.pflags = $1|PF_STASIS
end

local function spawnSparkEffect(mobj)
	local dist = mobj.scale * 10
	local angle1 = FixedAngle((P_RandomByte()*360/256)*FRACUNIT)
	local angle2 = FixedAngle((P_RandomByte()*360/256)*FRACUNIT)
	local momx = FixedMul(FixedMul(cos(angle1), cos(angle2)), dist)
	local momy = FixedMul(FixedMul(sin(angle1), cos(angle2)), dist)
	local momz = FixedMul(dist, sin(angle2))

	local spark = P_SpawnMobj(mobj.x+momx, mobj.y+momy, mobj.z+(mobj.height/2)+momz, MT_SPARKEFF)
	spark.momx = momx+mobj.momx
	spark.momy = momy+mobj.momy
	spark.momz = momz+mobj.momz
	spark.scale = mobj.scale
	if(mobj.eflags & MFE_VERTICALFLIP)
		spark.eflags = $1|MFE_VERTICALFLIP
		spark.flags2 = $1|MF2_OBJECTFLIP
	end
end

rawset(_G, "K_Spark", function(checkflags, destroy, late, player)
	if(checkflags)
		if(player.kvars.ablstate)
			return AF_NOFLOAT|AF_NODUCK|AF_NOJUMP|AF_NOSWIM|AF_NODROP
		end
		return 0
	end
	if(destroy)
		return
	end
	if(late)
		return
	end
	
	if(buttonPressed(player, BT_USE))
		and not(player.kvars.ducking)
		and not(player.kvars.floating)
		and not(player.pflags & PF_SLIDING)
		and not(player.powers[pw_carry] or player.kvars.prevcarry)
		and not(player.exiting)
		and not(player.pflags & PF_STASIS)
		and not(player.kvars.industdevil)
		player.kvars.ablstate = 1
		player.mo.state = S_KIRBY_SPARK1
	end
	
	if(player.kvars.ablstate)
		if(player.pflags & PF_SLIDING)
			or(player.powers[pw_carry] or player.kvars.prevcarry)
			or(player.exiting)
			or(player.pflags & PF_STASIS)
			player.kvars.ablstate = 0
			player.pflags = ($1 & !PF_JUMPED)|PF_NOJUMPDAMAGE
			if(P_IsObjectOnGround(player.mo))
				player.mo.state = S_PLAY_STND
			else
				player.mo.state = S_PLAY_FALL
			end
		elseif not(player.cmd.buttons & BT_USE)
			player.kvars.ablstate = 0
			player.pflags = ($1 & !PF_JUMPED)|PF_NOJUMPDAMAGE
			if(P_IsObjectOnGround(player.mo))
				player.mo.state = S_PLAY_STND
			else
				player.mo.state = S_PLAY_FALL
			end
		else
			if not(player.mo.state >= S_KIRBY_SPARK1 and player.mo.state <= S_KIRBY_SPARK6)
				player.mo.state = S_KIRBY_SPARK5+(leveltime&1)
			end
			
			if(player.mo.state >= S_KIRBY_SPARK4)
				spawnSparkEffect(player.mo)
				
				player.kvars.ablstate = $1 + 1
				if(player.kvars.ablstate >= 4)
					S_StartSound(player.mo, sfx_spark)
					player.kvars.ablstate = 1
				end
				
				local toheight = FixedMul(mobjinfo[MT_SPARKHURT].height/2, player.mo.scale)
				local hurt = P_SpawnMobj(player.mo.x+player.mo.momx, player.mo.y+player.mo.momy, player.mo.z+player.mo.momz+(player.mo.height/2)-toheight, MT_SPARKHURT)
				hurt.scale = player.mo.scale
				hurt.target = player.mo
			end
			
			player.pflags = ($1|PF_JUMPED) & !PF_NOJUMPDAMAGE
			
			lockControl(player)
		end
	end
	
end)
