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

freeslot(
"MT_BLUEHALO4",
"S_BLUEHALOSTATIC4",
"SPR_BHL4")

mobjinfo[MT_BLUEHALO4] = {
	doomednum = 3052,
	radius = 32*FRACUNIT,
	height = 32*FRACUNIT,
	spawnstate = S_BLUEHALOSTATIC4,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT
}

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

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_MoveOrigin(mob,mob.x,mob.y,0+((boss_position_z*FRACUNIT)+(64*FRACUNIT)))
		end
	end
end
,MT_BLUEHALO4)

freeslot(
"MT_GREENFIELD",
"S_GFIELD",
"SPR_BPLA",
"sfx_wavy")

sfxinfo[sfx_wavy] = {
	singular = true,
	priority = 64,
	flags = SF_X4AWAYSOUND
}

mobjinfo[MT_GREENFIELD] = {
	doomednum = 3054,
	radius = 64*FRACUNIT,
	height = 40*FRACUNIT,
	spawnstate = S_GFIELD,
	speed = 20*FRACUNIT,
	flags = MF_NOGRAVITY|MF_PAIN|MF_MISSILE|MF_SPECIAL
}

states[S_GFIELD] = {
	sprite = SPR_BPLA, frame = FF_ADD|A, tics = 5000, nextstate = S_GFIELD}

addHook("MobjThinker",function(mob)
	if mob.tics >= 4500 then
		mob.tracer = boss_target_player
		
		if mob.z > mob.tracer.z+(32*FRACUNIT) then
			mob.z = mob.z-FRACUNIT
		else
			mob.z = mob.z+FRACUNIT
		end
		
		if mob.x > mob.tracer.x then
			mob.momx = mob.momx-(FRACUNIT/4)
		else
			mob.momx = mob.momx+(FRACUNIT/4)
		end
		
		if (mob.tics%35 == 0 or mob.tics == 5000) then
			A_PlaySound(mob,sfx_wavy,0+0>>16)
		end
	end
end
,MT_GREENFIELD)

-- Begin, main boss object--
freeslot(
"MT_WINDBOSS", 
"SPR_EGWN",
"S_WINDBOSS_INIT","S_WINDBOSS_STANDARD","S_WINDBOSS_ATTACK", "S_WINDBOSS_PREATTACK",
"S_WINDBOSS_FLEE","S_WINDBOSS_RELIEF","S_WINDBOSS_DIE","S_WINDBOSS_EXIT",
"sfx_blow")

sfxinfo[sfx_blow] = {
	singular = true,
	priority = 64,
	flags = SF_X4AWAYSOUND
}

mobjinfo[MT_WINDBOSS] = {
	--$Category Wondrous Windsock
	--$Name Wind Boss
	--$Sprite EGWNA1
	//$Color 2
	//$Arg0 Boss ID
	//$Arg0Default 4
	//$Arg1 End Level On Death
	//$Arg1Default false
	//$Arg2 Death trigger tag
	//$Arg2Default 700
	//$Arg3 Victory trigger tag
	//$Arg3Default 800
	//$Arg4 Pinch trigger tag
	//$Arg4Default 900
	doomednum = 3053,
	spawnstate = S_WINDBOSS_INIT,
	seestate = S_WINDBOSS_PREATTACK,
	seesound = sfx_None,
	attacksound = sfx_None,
	painstate = S_WINDBOSS_FLEE,
	painsound = sfx_dmpain,
	meleestate = null,
	missilestate = null,
	deathstate = S_WINDBOSS_DIE,
	xdeathstate = S_WINDBOSS_EXIT,
	deathsound = sfx_cybdth,
	activesound = sfx_telept,
	raisestate = MT_GREENFIELD,
	spawnhealth = 8,
	reactiontime = 200,
	painchance = 5000,
	speed = 8,
	radius = 64*FRACUNIT,
	height = 135*FRACUNIT,
	mass = sfx_None,
	damage = 3,
	dispoffset = 2,
	flags = MF_SPECIAL|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_BOSS
}
states[S_WINDBOSS_INIT] = {
	sprite = SPR_EGWN, frame = A, tics = 5, action = null, nextstate = S_WINDBOSS_STANDARD}
	
states[S_WINDBOSS_STANDARD] = {
	sprite = SPR_EGWN, frame = A, tics = 40, action = A_Look, nextstate = S_WINDBOSS_STANDARD}

states[S_WINDBOSS_PREATTACK] = {
	sprite = SPR_EGWN, frame = A, tics = 7, var1 = 7, var2 = 1, nextstate = S_WINDBOSS_ATTACK}
	
states[S_WINDBOSS_ATTACK] = {
	sprite = SPR_EGWN, frame = A, tics = 350, action = null, nextstate = S_WINDBOSS_RELIEF}

states[S_WINDBOSS_RELIEF] = {
	sprite = SPR_EGWN, frame = A, tics = 70, action = null, nextstate = S_WINDBOSS_STANDARD}

states[S_WINDBOSS_FLEE] = {
	sprite = SPR_EGWN, frame = A, tics = 35, action = A_Pain, nextstate = S_WINDBOSS_INIT}

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

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

--Main boss logic--
addHook("MobjThinker", function(mob)
	boss_mobj = mob
	boss_position_z = mob.z/FRACUNIT
	
	if mob.state == S_WINDBOSS_INIT then
		mob.rate = 15
		mob.storedmomX = 0
		mob.storedmomY = 0
	end
	
	if mob.health > 3 then
		mob.rate = 35
	else
		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)
		mob.rate = 20
	end
	
	if mob.state == S_WINDBOSS_ATTACK then
		//avoid facing the wall (to shoot the energy fields//
		if mob.tics == 350 then
			mob.angle = ANGLE_270
		end
		
		A_FaceTarget(mob)
		boss_target_player = mob.target
		mob.storedmomX = mob.momx
		mob.storedmomY = mob.momy
		
		if mob.tics%mob.rate == 0 then
			//finding the remainder of a division is a good way to set the shooting rate//
			A_ShootBullet(mob)
			A_FindTracer(mob,MT_GREENFIELD)
			local last_bullet = mob.tracer
			
			if not(mob.tracer == nil) then
				A_FindTracer(last_bullet,MT_WINDBOSS)
			else
				last_bullet = nil
			end
			
			if not(last_bullet == nil) then
				A_CapeChase(last_bullet,1+128<<16,0<<16)
			end
		end
	end
	
	if mob.state == S_WINDBOSS_FLEE then
		//another pedantic instruction to avoid facing the wall//
		mob.angle = ANGLE_270
	end
	
	if mob.state == S_WINDBOSS_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_WINDBOSS)

addHook("MobjDamage",function(mob,imob,source,damage,type)
	//bounce the player back to the other side of the arena//
	for player in players.iterate do
		if player.mo == imob then
			A_PlaySound(mob,sfx_blow,0+0>>16)
			P_InstaThrust(player.mo,ANGLE_270,150*FRACUNIT)
			player.mo.momz = 32*FRACUNIT
		end
	end
end
,MT_WINDBOSS)