-- -- ---CUSTOM BOSS--- -- --
local boss_mobj = nil
local boss_defeated = false
local boss_position_z = 0

freeslot(
"MT_BLUEHALO3",
"S_BLUEHALOSTATIC3",
"SPR_BHL3")

mobjinfo[MT_BLUEHALO3] = {
	doomednum = 3040,
	radius = 32*FRACUNIT,
	height = 32*FRACUNIT,
	spawnstate = S_BLUEHALOSTATIC3,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT
}

states[S_BLUEHALOSTATIC3] = {
	sprite = SPR_BHL3, frame = FF_FULLBRIGHT|TR_TRANS40|FF_ANIMATE|A, tics = 30, var1 = 1, var2 = 1, nextstate = S_BLUEHALOSTATIC3}

addHook("MobjThinker",function(mob)
	if mob.spritexscale == 1*FRACUNIT then
		mob.spritexscale = (3*FRACUNIT)/2
		mob.spriteyscale = (3*FRACUNIT)/2
	else
		A_FindTracer(mob,MT_SGZBOSS)
		
		if mob.tracer.valid == true and boss_defeated == false then
			A_CapeChase(mob,1+0<<16,0+0<<16)
		else
			P_TeleportMove(mob,mob.x,mob.y,0+((boss_position_z*FRACUNIT)+(64*FRACUNIT)))
		end
	end
end
,MT_BLUEHALO3)

-- Begin, main boss object--
freeslot(
"MT_SGZBOSS", 
"SPR_EGSK",
"S_SKYMOBILE_INIT","S_SKYMOBILE_STANDARD","S_SKYMOBILE_ATTACK", "S_SKYMOBILE_PREATTACK",
"S_SKYMOBILE_FLEE","S_SKYMOBILE_RELIEF","S_SKYMOBILE_DIE","S_SKYMOBILE_EXIT")
mobjinfo[MT_SGZBOSS] = {
	--$Category Skyward Garden
	--$Name Sky Boss
	--$Sprite EGSKA1
	//$Color 14
	doomednum = 3041,
	spawnstate = S_SKYMOBILE_INIT,
	seestate = S_SKYMOBILE_PREATTACK,
	seesound = sfx_None,
	attacksound = sfx_None,
	painstate = S_SKYMOBILE_FLEE,
	painsound = sfx_dmpain,
	meleestate = null,
	missilestate = null,
	deathstate = S_SKYMOBILE_DIE,
	xdeathstate = S_SKYMOBILE_EXIT,
	deathsound = sfx_cybdth,
	activesound = sfx_telept,
	raisestate = MT_TORPEDO,
	spawnhealth = 8,
	reactiontime = 200,
	painchance = 5000,
	speed = 8,
	radius = 104*FRACUNIT,
	height = 200*FRACUNIT,
	mass = sfx_None,
	damage = 3,
	dispoffset = 2,
	flags = MF_SPECIAL|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_BOSS
}
states[S_SKYMOBILE_INIT] = {
	sprite = SPR_EGSK, frame = A, tics = 5, action = null, nextstate = S_SKYMOBILE_STANDARD}
	
states[S_SKYMOBILE_STANDARD] = {
	sprite = SPR_EGSK, frame = A, tics = 40, action = A_Look, var1 = 0+3750<<16, var2 = 1, nextstate = S_SKYMOBILE_STANDARD}

states[S_SKYMOBILE_PREATTACK] = {
	sprite = SPR_EGSK, frame = A, tics = 7, var1 = 7, var2 = 1, nextstate = S_SKYMOBILE_ATTACK}
	
states[S_SKYMOBILE_ATTACK] = {
	sprite = SPR_EGSK, frame = A, tics = 100, action = null, nextstate = S_SKYMOBILE_RELIEF}

states[S_SKYMOBILE_RELIEF] = {
	sprite = SPR_EGSK, frame = A, tics = 70, action = null, nextstate = S_SKYMOBILE_STANDARD}

states[S_SKYMOBILE_FLEE] = {
	sprite = SPR_EGSK, frame = A, tics = 70, action = A_Pain, nextstate = S_SKYMOBILE_INIT}

states[S_SKYMOBILE_DIE] = {
	sprite = SPR_EGSK, frame = C, tics = 50, action = null, nextstate = S_NULL}

states[S_SKYMOBILE_EXIT] = {
	sprite = SPR_EGSK, frame = FF_ANIMATE|C, tics = 70, action = null, var1 = 1, var2 = 5, nextstate = S_SKYMOBILE_EXIT}

--Main boss logic--
addHook("MobjThinker", function(mob)
	boss_mobj = mob
	boss_position_z = mob.z/FRACUNIT
	
	local turret = 0
	
	if mob.state == S_SKYMOBILE_INIT then
		mob.rate = 15
		mob.storedmomX = 0
		mob.storedmomY = 0
	end
	
	if mob.health > 3 then
		mob.rate = 15
		
		if boss_position_z > 140 then
			mob.momz = -1*FRACUNIT
		else
			mob.momz = 0
		end
	else
		local spawnX = P_RandomRange(0,96)
		local spawnY = P_RandomRange(0,96)
		local spawnZ = P_RandomRange(0,200)
		P_SpawnMobjFromMobj(mob,spawnX*FRACUNIT,spawnY*FRACUNIT,spawnZ*FRACUNIT,MT_SMOKE)
		mob.rate = 5
		
		if boss_position_z > 532 then
			mob.momz = -1*FRACUNIT
		elseif boss_position_z < 532 then
			mob.momz = 8*FRACUNIT
		else
			mob.momz = 0
		end
	end
	
	if mob.state == S_SKYMOBILE_STANDARD then
		if mob.tics%2 == 0 then
			A_ChangeAngleRelative(mob,5,5)
		end
	end
	
	if mob.state == S_SKYMOBILE_RELIEF then
		A_Thrust(mob,20,1)
	end
	
	--attack loop--
	if mob.state == S_SKYMOBILE_ATTACK then
		if mob.tics%20 == 0 then
			A_MultiShot(mob,MT_SHOCKWAVE*65536+16,-45)
		end
		
		--additional shooting at the player for pinch mode--
		if mob.tics%10 == 0 and mob.health <= 3 then
			A_ShootBullet(mob)
			A_FindTracer(mob,MT_TORPEDO)
			local last_bullet = mob.tracer
			
			if not(mob.tracer == nil) then
				A_FindTracer(last_bullet,MT_SGZBOSS)
			else
				last_bullet = nil
			end
			
			if not(last_bullet == nil) then
				A_CapeChase(last_bullet,1+168<<16,turret+0<<16)
				--P_TeleportMove(mob.tracer,mob.x+(32*FRACUNIT),mob.y,mob.z+(64*FRACUNIT))
			end
		end
	end
	
	--fleeing--
	if mob.state == S_SKYMOBILE_FLEE then
		if mob.tics == 70 then
			A_KnockBack(mob,1)
		end
			
		if mob.tics == 50 then
			A_ChangeAngleRelative(mob,45,90)
		end
			
		if (mob.tics < 50 and mob.tics > 1) then
			A_Thrust(mob,20,1)
		end
			
		if mob.tics == 1
			A_Thrust(mob,0,1)
			A_ChangeAngleRelative(mob,180,180)
		end
	end
	
	if mob.state == S_SKYMOBILE_DIE then
		boss_defeated = true
		if mob.tics == 50 then
			A_Fall(mob)
		elseif (mob.tics < 50 and mob.tics > 1) then
			A_BossScream(mob)
		elseif mob.tics <= 1
			A_BossDeath(mob)
		end
	end
end
,MT_SGZBOSS)