--Sawblade lua
--by Callmore

freeslot("MT_SSBLADE", "S_SSBLADE_FLOAT", "S_SSBLADE_TOFIRE", "S_SSBLADE_FIRE", "SPR_SSFL", "sfx_hotru")--, "S_MMSAWBLADE2")

states[S_SSBLADE_FLOAT] = {SPR_SSFL, A|FF_FULLBRIGHT, -1, nil, 0, 0, S_SSBLADE_FLOAT}
states[S_SSBLADE_TOFIRE] = {SPR_SSFL, B|FF_ANIMATE|FF_FULLBRIGHT, -1, nil, 1, 2, S_SSBLADE_TOFIRE}
states[S_SSBLADE_FIRE] = {SPR_SSFL, D|FF_ANIMATE|FF_FULLBRIGHT, -1, nil, 4, 2, S_SSBLADE_FIRE}

local function trySetState(mo, s)
	if mo.state ~= s then
		mo.state = s
	end
end

local function mmSawbladeSpawn(mo)
	mo.scale = $*2
end

addHook("MobjSpawn", mmSawbladeSpawn, MT_SSBLADE)

local function mmSawbladeThink(mo)
	local xdir = sin(mo.angle - ANGLE_90)
	local ydir = cos(mo.angle + ANGLE_90)
	
	local didMove
	if mo.currentmovement then
		didMove = P_TryMove(mo, mo.x + (xdir * mo.info.speed), mo.y + (ydir * mo.info.speed))
	else
		didMove = P_TryMove(mo, mo.x - (xdir * mo.info.speed), mo.y - (ydir * mo.info.speed))
	end
	
	if not didMove then
		--print("Flipping sawblade")
		mo.currentmovement = not $
	end
	
	if not (leveltime%35) then
		--S_StartSound(mo, sfx_sawsus)
	end
	
	if not mo.firedelay then
		mo.firedelay = mo.spawnpoint.extrainfo*TICRATE
		if mo.firing == nil then
			-- hasent been setup
			mo.firing = 0
			--print("Just spawned")
		else
			mo.firing = 2*TICRATE
			--print("Reset firing")
		end
	elseif not mo.firing then
		mo.firedelay = $-1
		mo.flags = $&(~MF_PAIN)
		--print("Decrementing fire (" .. mo.firedelay .. ")")
	else
		if mo.firing == 2*TICRATE then 
			S_StartSound(mo, sfx_hotru)
		end
		mo.firing = $-1
		mo.flags = $|MF_PAIN
		--print("Decrementing firing (" .. mo.firing .. ")")
	end
	
	if not mo.firing
	and (mo.firedelay < TICRATE
	or mo.firedelay > (mo.spawnpoint.extrainfo*TICRATE) - TICRATE) then
		trySetState(mo, S_SSBLADE_TOFIRE)
	elseif not mo.firing then
		trySetState(mo, S_SSBLADE_FLOAT)
		if not (leveltime % (TICRATE/8)) then
			local g = P_SpawnGhostMobj(mo)
			g.fuse = 3*TICRATE/4
		end
	else
		trySetState(mo, S_SSBLADE_FIRE)
	end
end

addHook("MobjThinker", mmSawbladeThink, MT_SSBLADE)
