if pcall(do return _G["MT_CYCLA"] end)
    print("\131NOTICE:\128 Cycla objects already loaded.")
    return
end


freeslot(
"MT_CYCLA",
"S_CYCLALOOK",
"S_CYCLACHASE",
"S_CYCLADRIFT",
"S_CYCLADED0",
"S_CYCLADED1",
"S_CYCLADED2",
"S_CYCLADED3",
"sfx_cengin",
"sfx_cdrift",
"SPR_CPOS"
)


sfxinfo[sfx_cdrift] = {
	singular = true,
    flags = SF_TOTALLYSINGLE
}


function A_CyclaChase(actor, var1, var2)
	A_PlayAttackSound(actor, 0, 0)
	if not (actor.target) then
		actor.state = mobjinfo[actor.type].spawnstate
	end
	local dist = R_PointToDist2(actor.x, actor.y, actor.target.x, actor.target.y)/FRACUNIT
	if (dist > 3000) then
		actor.state = mobjinfo[actor.type].spawnstate
	end
	
		local angle2 = R_PointToAngle2(actor.x, actor.y, actor.target.x, actor.target.y)
		local anglediff = actor.angle - angle2
		if (anglediff < 0) then
			actor.angle = $+(ANG1/2)
		else
			actor.angle = $-(ANG1/2)
		end
		
		P_InstaThrust(actor, actor.angle, 32*FRACUNIT)
		
		actor.frame = (leveltime%2)
		
		if (abs(anglediff) > ANGLE_90) and (dist > 1024) then
			actor.state = mobjinfo[actor.type].missilestate
		end

end


function A_CyclaDrift(actor, var1, var2)
	if (leveltime%5 == 0 )then
		A_PlaySeeSound(actor, 0, 0)
	end
	if not (actor.target) then
		actor.state = mobjinfo[actor.type].spawnstate
	end
	local dist = R_PointToDist2(actor.x, actor.y, actor.target.x, actor.target.y)/FRACUNIT
	if (dist > 10000) then
		actor.state = mobjinfo[actor.type].spawnstate
	end
	
		local angle2 = R_PointToAngle2(actor.x, actor.y, actor.target.x, actor.target.y)
		local anglediff = actor.angle - angle2
		if (anglediff < 0) then
			actor.angle = $+(ANG1*5)
			actor.frame = 3
		else
			actor.angle = $-(ANG1*5)
			actor.frame = 2
		end
		
		P_InstaThrust(actor, actor.angle, 16*FRACUNIT)
		
				
		if (abs(anglediff) < ANG10) then
			actor.state = mobjinfo[actor.type].spawnstate
		end
		
		local smokeDist = P_RandomRange(-50, 50)
		local smoke = P_SpawnMobj(actor.x+(smokeDist*cos(actor.angle)),actor.y+(smokeDist*sin(actor.angle)),actor.z,MT_SPINDUST)
		smoke.scale = P_RandomFixed()*2

end

mobjinfo[MT_CYCLA] = {
//$Name Cycla
//$Category Sol Enemies
//$Sprite CPOSA1
spawnstate = S_CYCLALOOK,
seestate = S_CYCLACHASE,
missilestate = S_CYCLADRIFT,
deathstate = S_CYCLADED0,
deathsound = sfx_cybdth,
attacksound = sfx_cengin,
seesound = sfx_cdrift,
doomednum = 1511,
reactiontime = 65,
speed = 6,
radius = 60*FRACUNIT,
height = 100*FRACUNIT,
damage = 9,
spawnhealth = 1,
dispoffset = 0,
flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_CYCLALOOK] = {
sprite = SPR_CPOS,
frame = D,
tics = 2,
action = A_Look,
var1 = (3000<<16)+1,
nextstate = S_CYCLALOOK
}


states[S_CYCLACHASE] = {
sprite = SPR_CPOS,
frame = D,
tics = 1,
action = A_CyclaChase,
nextstate = S_CYCLACHASE
}

states[S_CYCLADRIFT] = {
sprite = SPR_CPOS,
frame = D,
tics = 1,
action = A_CyclaDrift,
nextstate = S_CYCLADRIFT
}


states[S_CYCLADED0] = {
sprite = SPR_DISS,
frame = A,
tics = 2,
action = A_Thrust,
var1 = 10,
var2 = 1,
nextstate = S_CYCLADED1
}

states[S_CYCLADED1] = {
sprite = SPR_CPOS,
frame = C,
action = A_BossScream,
tics = 2,
nextstate = S_CYCLADED2
}

states[S_CYCLADED2] = {
sprite = SPR_CPOS,
frame = C,
action = A_ChangeAngleRelative,
var1 = -30,
var2 = 30,
tics = 0,
nextstate = S_CYCLADED3
}

states[S_CYCLADED3] = {
sprite = SPR_CPOS,
frame = A,
tics = 2,
action = A_Repeat,
var1 = 8, 
var2 = S_CYCLADED0,
nextstate = S_XPLD_FLICKY
}


addHook("MobjCollide", function(actor, collider) 
	if collider.type == MT_CYCLA
		return false --
	end
end, MT_CYCLA)

addHook("MobjSpawn", function(actor) 
	actor.color = P_RandomRange(47, 68)
end, MT_CYCLA)


addHook("MobjMoveBlocked", function(actor) 
	if (actor.state == mobjinfo[actor.type].seestate) then
		actor.state = mobjinfo[actor.type].missilestate
	end
end, MT_CYCLA)
