-- -- ---CUSTOM BOSS--- -- --
//brute projectile//
freeslot(
"MT_BARBEDPROJECTILE",
"S_BARBEDPROJECTILESHOT",
"SPR_BARB")

local pinch_accelerator = 1
local boss_mobj = nil
local boss_defeated = false
local boss_position_z = 0

mobjinfo[MT_BARBEDPROJECTILE] = {
	doomednum = 3003,
	radius = 32*FRACUNIT,
	height = 32*FRACUNIT,
	speed = 20*FRACUNIT,
	spawnstate = S_BARBEDPROJECTILESHOT,
	seesound = sfx_none,
	attacksound	= sfx_none,
	reactiontime = 8,
	spawnhealth = 1,
	painchance = 200,
	mass = 100,
	damage = 1,
	flags = MF_MISSILE|MF_SPECIAL|MF_PAIN
}

states[S_BARBEDPROJECTILESHOT] = {
	sprite = SPR_BARB, frame = A, tics = 350, nextstate = S_BARBEDPROJECTILESHOT}

addHook("MobjThinker", function(mob)
	if mob.tics == 350 then
		A_ChangeAngleRelative(mob,0,360)
		local randThrust = P_RandomRange(-10,10)
		A_Thrust(mob,(randThrust*pinch_accelerator),0)
	end
	
	if mob.tics == 340 then
		A_SetObjectFlags(mob,MF_MISSILE,1)
	end
	
	if mob.tics == 1 then
		P_RemoveMobj(mob)
	end
end
,MT_BARBEDPROJECTILE)

freeslot(
"MT_BLUEHALO",
"S_BLUEHALOSTATIC",
"SPR_BHLO")

mobjinfo[MT_BLUEHALO] = {
	doomednum = 3005,
	radius = 32*FRACUNIT,
	height = 32*FRACUNIT,
	spawnstate = S_BLUEHALOSTATIC,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT
}

states[S_BLUEHALOSTATIC] = {
	sprite = SPR_BHLO, frame = FF_FULLBRIGHT|TR_TRANS40|A, tics = 5, nextstate = S_BLUEHALOSTATIC}

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

-- Begin, main boss object--
freeslot(
"MT_BCZBOSS","MT_BCZATTACH",
"SPR_EGGM","SPR_EGAT",
"S_BROADMOBILE_INIT","S_BROADMOBILE_STANDARD","S_BROADMOBILE_ATTACK", "S_BROADMOBILE_PREATTACK",
"S_BROADMOBILE_FLEE","S_BROADMOBILE_RELIEF",
"S_BROADMOBILE_ATTACK_PINCH","S_BROADMOBILE_PREATTACK_PINCH","S_BROADMOBILE_RELIEF_PINCH",
"S_BROADMOBILE_DIE","S_BROADMOBILE_EXIT",
"S_EGGATTACHSTATIC","sfx_dmspit")

sfxinfo[sfx_dmspit] = {
	singular = true,
	priority = 64,
	flags = SF_X4AWAYSOUND|SF_X8AWAYSOUND
}

mobjinfo[MT_BCZBOSS] = {
	--$Category Broadside Cliffs
	--$Name Broadside Boss
	--$Sprite EGATA1
	doomednum = 3002,
	spawnstate = S_BROADMOBILE_INIT,
	seestate = S_BROADMOBILE_PREATTACK,
	seesound = sfx_None,
	attacksound = sfx_dmspit,
	painstate = S_BROADMOBILE_FLEE,
	painsound = sfx_dmpain,
	meleestate = null,
	missilestate = null,
	deathstate = S_BROADMOBILE_DIE,
	xdeathstate = S_BROADMOBILE_EXIT,
	deathsound = sfx_cybdth,
	activesound = sfx_telept,
	raisestate = MT_BARBEDPROJECTILE,
	spawnhealth = 8,
	reactiontime = 200,
	painchance = 5000,
	speed = 8,
	radius = 36*FRACUNIT,
	height = 90*FRACUNIT,
	mass = sfx_None,
	damage = 3,
	dispoffset = 2,
	flags = MF_SPECIAL|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_BOSS
}

states[S_BROADMOBILE_INIT] = {
	sprite = SPR_EGAT, frame = A, tics = 5, action = null, nextstate = S_BROADMOBILE_STANDARD}
	
states[S_BROADMOBILE_STANDARD] = {
	sprite = SPR_EGAT, frame = A, tics = 40, action = A_Look, var1 = 0+3750<<16, var2 = 1, nextstate = S_BROADMOBILE_STANDARD}

states[S_BROADMOBILE_PREATTACK] = {
	sprite = SPR_EGAT, frame = A, tics = 7, var1 = 7, var2 = 1, nextstate = S_BROADMOBILE_ATTACK}
	
states[S_BROADMOBILE_ATTACK] = {
	sprite = SPR_EGAT, frame = A, tics = 150, action = null, nextstate = S_BROADMOBILE_RELIEF}

states[S_BROADMOBILE_RELIEF] = {
	sprite = SPR_EGAT, frame = A, tics = 75, action = null, nextstate = S_BROADMOBILE_STANDARD}

states[S_BROADMOBILE_PREATTACK_PINCH] = {
	sprite = SPR_EGAT, frame = B, tics = 7, var1 = 7, var2 = 1, nextstate = S_BROADMOBILE_ATTACK_PINCH} 

states[S_BROADMOBILE_ATTACK_PINCH] = {
	sprite = SPR_EGAT, frame = A, tics = 35, action = null, nextstate = S_BROADMOBILE_RELIEF_PINCH}

states[S_BROADMOBILE_RELIEF_PINCH] = {
	sprite = SPR_EGAT, frame = A, tics = 35, action = null, nextstate = S_BROADMOBILE_STANDARD}

states[S_BROADMOBILE_FLEE] = {
	sprite = SPR_EGAT, frame = A, tics = 70, action = A_Pain, nextstate = S_BROADMOBILE_INIT}

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

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

--Main boss logic--
addHook("MobjThinker", function(mob)
	boss_mobj = mob
	boss_position_z = mob.z/FRACUNIT
	
	if mob.state == S_BROADMOBILE_INIT then
		mob.timer = 0
		mob.storedmomX = 0
		mob.storedmomY = 0
	else
		
		if not(mob.target == nil) then
			if abs(mob.z-mob.target.z) > 96*FRACUNIT then
				mob.momz = -1*FRACUNIT
			else
				mob.momz = 0
			end
		end
		
		if mob.health <= 3 then
			mob.info.seestate = S_BROADMOBILE_PREATTACK_PINCH
			pinch_accelerator = 2
			local spawnX = P_RandomRange(0,64)
			local spawnY = P_RandomRange(0,64)
			local spawnZ = P_RandomRange(0,64)
			P_SpawnMobjFromMobj(mob,spawnX*FRACUNIT,spawnY*FRACUNIT,spawnZ*FRACUNIT,MT_SMOKE)
		else
			mob.info.seestate = S_BROADMOBILE_PREATTACK
			pinch_accelerator = 1
		end
		
		if (mob.state == S_BROADMOBILE_ATTACK) or (mob.state == S_BROADMOBILE_ATTACK_PINCH) then
			A_FaceTarget(mob)
			A_ShootBullet(mob)
			A_Thrust(mob,10,1)
		end
		
		if mob.state == S_BROADMOBILE_STANDARD then
			if mob.tics%2 == 0 then
				A_ChangeAngleRelative(mob,5,5)
			end
		end
		
		if mob.state == S_BROADMOBILE_FLEE then
			
			if mob.tics == 70 then
				A_KnockBack(mob,1)
			end
			
			if mob.tics == 50 then
				A_ChangeAngleRelative(mob,180,180)
			end
			
			if mob.tics <= 49 then
				A_Thrust(mob,20,1)
				mob.momz = 4*FRACUNIT
			end
			
			if mob.tics == 1 then
				A_Thrust(mob,0,1)
				A_ChangeAngleRelative(mob,180,180)
				mob.momz = 3*FRACUNIT
			end
		end
		
		if mob.state == S_BROADMOBILE_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)
			else
				A_BossDeath(mob)
			end
		end
	end
end
,MT_BCZBOSS)