/* Stray-Bolts and Related Things */

/* Used by BOTH Stray-Bolts. */
freeslot(
"MT_STRAYBOLTS_WAYPOINT",
"MT_STRAYBOLTS_BOLT",
"SPR_BOLT",
"S_STRAYBOLTS_BOLT1",
"S_STRAYBOLTS_BOLT2",
"S_STRAYBOLTS_BOLT3",
"S_STRAYBOLTS_BOLT4",
"MT_STRAYBOLTS_EYES",
"SPR_BLTE",
"S_STRAYBOLTS_EYES_NORM",
"S_STRAYBOLTS_EYES_JOY",
"S_STRAYBOLTS_EYES_OUCH",
"S_STRAYBOLTS_EYES_TIRED"
)

mobjinfo[MT_STRAYBOLTS_WAYPOINT] = {
	--$Name Straybolts Waypoint
	--$Sprite WYPNA0
	--$Category Sempiternity Shores
	doomednum = 2342,
	radius = 1*FRACUNIT,
	height = 2*FRACUNIT,
	spawnstate = S_INVISIBLE,
	flags = MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY|MF_NOCLIPTHING
}

mobjinfo[MT_STRAYBOLTS_BOLT] = {
	radius = 8*FRACUNIT,
	height = 128*FRACUNIT,
	spawnstate = S_STRAYBOLTS_BOLT1,
	flags = MF_NOGRAVITY|MF_PAIN
}

states[S_STRAYBOLTS_BOLT1] = {
	sprite = SPR_BOLT,
	frame = A,
	tics = 2,
	nextstate = S_STRAYBOLTS_BOLT2,
}

states[S_STRAYBOLTS_BOLT2] = {
	sprite = SPR_BOLT,
	frame = B,
	tics = 2,
	nextstate = S_STRAYBOLTS_BOLT3,
}

states[S_STRAYBOLTS_BOLT3] = {
	sprite = SPR_BOLT,
	frame = C,
	tics = 2,
	nextstate = S_STRAYBOLTS_BOLT4,
}

states[S_STRAYBOLTS_BOLT4] = {
	sprite = SPR_BOLT,
	frame = D,
	tics = 2,
	nextstate = S_NULL,
}

mobjinfo[MT_STRAYBOLTS_EYES] = {
	radius = 128*FRACUNIT,
	height = 64*FRACUNIT,
	spawnstate = S_STRAYBOLTS_EYES_NORM,
	flags = MF_NOCLIP|MF_NOCLIPTHING|MF_NOGRAVITY
}

states[S_STRAYBOLTS_EYES_NORM] = {
	sprite = SPR_BLTE,
	frame = A|FF_PAPERSPRITE,
	tics = -1,
	nextstate = S_STRAYBOLTS_EYES_NORM,
}

states[S_STRAYBOLTS_EYES_JOY] = {
	sprite = SPR_BLTE,
	frame = B|FF_PAPERSPRITE,
	tics = -1,
	nextstate = S_STRAYBOLTS_EYES_JOY
}

states[S_STRAYBOLTS_EYES_OUCH] = {
	sprite = SPR_BLTE,
	frame = C|FF_PAPERSPRITE,
	tics = -1,
	nextstate = S_STRAYBOLTS_EYES_OUCH
}

states[S_STRAYBOLTS_EYES_TIRED] = {
	sprite = SPR_BLTE,
	frame = D|FF_PAPERSPRITE,
	tics = -1,
	nextstate = S_STRAYBOLTS_EYES_TIRED
}


/* Stray-Bolts Cutscene At the Beggining of SSZ2 */

freeslot(
"SPR_STBT",
"MT_STRAYBOLTS_CUTSCENE",
"S_STRAYBOLTS_CUTSCENE1",
"S_STRAYBOLTS_CUTSCENE2",
"S_STRAYBOLTS_CUTSCENE3"
)

mobjinfo[MT_STRAYBOLTS_CUTSCENE] = {
	radius = 128*FRACUNIT,
	height = 64*FRACUNIT,
	spawnstate = S_STRAYBOLTS_CUTSCENE1,
	flags = MF_NOCLIP|MF_NOCLIPTHING|MF_NOGRAVITY
}

states[S_STRAYBOLTS_CUTSCENE1] = {
	sprite = SPR_STBT,
	frame = A,
	tics = 5,
	nextstate = S_STRAYBOLTS_CUTSCENE2
}

states[S_STRAYBOLTS_CUTSCENE2] = {
	sprite = SPR_STBT,
	frame = B,
	tics = 5,
	nextstate = S_STRAYBOLTS_CUTSCENE3
}

states[S_STRAYBOLTS_CUTSCENE3] = {
	sprite = SPR_STBT,
	frame = C,
	tics = 5,
	nextstate = S_STRAYBOLTS_CUTSCENE1
}

local function straybolts_cutscene(mo)
	if modeattacking == true
		S_StartSound(nil,sfx_litng1)
		P_SwitchWeather(PRECIP_SNOW)
		P_SetupLevelSky(81)
		P_TeleportMove(mo,mo.x+(2400*FRACUNIT),mo.y,mo.z)
		for i in players.iterate()
			P_FlashPal(i,PAL_MIXUP,5)
			P_TeleportMove(i.mo,i.mo.x+(2400*FRACUNIT),i.mo.y,i.mo.z)
		end
		P_RemoveMobj(mo)
	else
		//no moving
		if mo.players
			for _,i in pairs(mo.players)
				i.powers[pw_nocontrol] = 1
				i.drawangle = R_PointToAngle2(i.mo.x,i.mo.y,mo.x,mo.y)
			end
		end
		//taking a gander
		P_LookForPlayers(mo,0,true,false)
		if mo.target
			mo.angle = R_PointToAngle2(mo.x,mo.y,mo.target.x,mo.target.y)
		end
		//THE EYES!!
		if not mo.eyes
			mo.eyes = P_SpawnMobj(mo.x,mo.y,mo.z,MT_STRAYBOLTS_EYES)
			mo.eyes.state = S_STRAYBOLTS_EYES_OUCH
			mo.eyes_float = 0
			mo.eyes_toggle = false
			mo.players = {}
			for i in players.iterate()
				table.insert(mo.players,i)
				i.mo.angle = R_PointToAngle2(i.mo.x,i.mo.y,mo.x,mo.y)
			end
		else
			mo.eyes.angle = FixedAngle(AngleFixed(mo.angle) + (90*FRACUNIT))
			P_TeleportMove(mo.eyes,mo.x,mo.y,mo.z+(16*FRACUNIT)+(mo.eyes_float*FRACUNIT))
			P_InstaThrust(mo.eyes,mo.angle,FRACUNIT*16)
			if mo.eyes_toggle == false
				mo.eyes_float = mo.eyes_float + 1
				if mo.eyes_float > 5
					mo.eyes_toggle = true
				end
			else
				mo.eyes_float = mo.eyes_float - 1
				if mo.eyes_float < -5
					mo.eyes_toggle = false
				end
			end
		end
		//CUTSCENE
		if not mo.cutscene_state then
			mo.cutscene_state = 1
			mo.angle = FixedAngle(90*FRACUNIT)
			S_StartSound(nil,sfx_s3k51)
			for _,i in pairs(mo.players)
				S_ChangeMusic("SSZC",true,i,0,0,1000,1000)
			end
		end
		//State 1 -  He flies down to see you
		if mo.cutscene_state == 1
			if mo.z > mo.floorz + (196*FRACUNIT)
				mo.momz = mo.momz - (1*FRACUNIT)
				if mo.momz < -(16*FRACUNIT)
					mo.momz = -(16*FRACUNIT)
				end
			elseif mo.z < mo.floorz + (190*FRACUNIT)
				mo.momz = mo.momz + (1*FRACUNIT)
				if mo.momz > (4*FRACUNIT)
					mo.momz = (4*FRACUNIT)
				end
			else
				mo.momz = 0
				mo.timer = TICRATE * 3
				mo.cutscene_state = 2
				mo.eyes.state = S_STRAYBOLTS_EYES_NORM
				for _,i in pairs(mo.players)
					if R_PointToDist2(mo.x,mo.y,i.mo.x,i.mo.y) < 128*FRACUNIT
						i.mo.momz = 10 * FRACUNIT
						P_InstaThrust(i.mo,i.drawangle,-8*FRACUNIT)
						i.mo.state = S_PLAY_STUN
						S_StartSound(nil,sfx_s3k49,i)
					end
				end
				return
			end
		//State 2 - He Waits....
		elseif mo.cutscene_state == 2
			mo.timer = mo.timer - 1
			if mo.timer == 0
				mo.timer = TICRATE
				mo.cutscene_state = 3
				mo.eyes.state = S_STRAYBOLTS_EYES_JOY
				mo.recticle = P_SpawnMobj(mo.x,mo.y,mo.floorz,MT_CYBRAKDEMON_TARGET_RETICULE)
				S_StartSound(nil,sfx_cdpcm6)
				S_StartSound(nil,sfx_beelec)
				return
			end
		//State 3 - Giggles...
		elseif mo.cutscene_state == 3
			mo.timer = mo.timer - 1
			if mo.timer == 0
				mo.timer = TICRATE * 2
				mo.cutscene_state = 4
				return
			end
		//State 4 - Then everything goes to hell (tm)
		elseif mo.cutscene_state == 4
			S_StartSound(nil,sfx_litng1)
			P_SwitchWeather(PRECIP_SNOW)
			P_SetupLevelSky(81)
			P_TeleportMove(mo,mo.x+(2400*FRACUNIT),mo.y,mo.z)
			for _,i in pairs(mo.players)
				P_FlashPal(i,PAL_MIXUP,5)
				P_TeleportMove(i.mo,i.mo.x+(2400*FRACUNIT),i.mo.y,i.mo.z+2*FRACUNIT)
				i.mo.state = S_PLAY_STUN
				i.mo.momz = 8*FRACUNIT
			end
			P_SpawnMobj(mo.x,mo.y,mo.floorz,MT_STRAYBOLTS_BOLT)
			P_RemoveMobj(mo.recticle)
			mo.eyes.state = S_STRAYBOLTS_EYES_NORM
			mo.timer = TICRATE*3
			mo.cutscene_state = 5
		//State 5 - Wait some more.
		elseif mo.cutscene_state == 5
			mo.timer = mo.timer - 1
			if mo.timer == 0
				mo.timer = TICRATE*3
				mo.cutscene_state = 6
				S_StartSound(nil,sfx_s3kbes)
				mo.eyes.state = S_STRAYBOLTS_EYES_TIRED
				return
			end
		//State 6 - and GTFO
		elseif mo.cutscene_state == 6
			if mo.z < mo.floorz + 1024*FRACUNIT
				mo.momz = mo.momz + 1*FRACUNIT
				if mo.momz > 16*FRACUNIT
					mo.momz = 16*FRACUNIT
				end
			else
				for _,i in pairs(mo.players)
					S_ChangeMusic("SSZ2",true,i,0,0,1000,1000)
				end
				P_RemoveMobj(mo.eyes)
				P_RemoveMobj(mo)
			end
		end
	end
end

addHook("MobjThinker",straybolts_cutscene,MT_STRAYBOLTS_CUTSCENE)

/* Stray-Bolts Actual Boss Fight */
freeslot(
	"MT_STRAYBOLTS_BOSS",
	"S_STRAYBOLTS_BOSS",
	"S_STRAYBOLTS_BOSS_CUTSCENE",
	"S_STRAYBOLTS_BOSS_TIRED",
	"S_STRAYBOLTS_BOSS_PAIN1",
	"S_STRAYBOLTS_BOSS_PAIN2",
	"S_STRAYBOLTS_BOSS_DEATH",
	"S_STRAYBOLTS_BOSS_FINISH",
	"SPR_LBAL",
	"MT_STRAYBOLTS_MISSILE",
	"S_STRAYBOLTS_MISSILE1",
	"S_STRAYBOLTS_MISSILE2"
)

mobjinfo[MT_STRAYBOLTS_BOSS] = {
	--$Name Stray-Bolts
	--$Sprite STBTA1A5
	--$Category Sempiternity Shores
	doomednum = 2343,
	radius = 128*FRACUNIT,
	height = 64*FRACUNIT,
	spawnhealth = 8,
	spawnstate = S_STRAYBOLTS_BOSS_CUTSCENE,
	painstate = S_STRAYBOLTS_BOSS_PAIN1,
	painsound = sfx_cdpcm7,
	deathstate = S_STRAYBOLTS_BOSS_DEATH,
	deathsound = sfx_dmpain,
	flags = MF_NOCLIP|MF_NOCLIPTHING|MF_NOGRAVITY,
	damage = 3,
}

states[S_STRAYBOLTS_BOSS_CUTSCENE] = {
	sprite = SPR_STBT,
	frame = FF_ANIMATE|A,
	var1 = 2,
	var2 = 5,
	tics = 6,
	nextstate = S_STRAYBOLTS_BOSS_CUTSCENE
}

states[S_STRAYBOLTS_BOSS] = {
	sprite = SPR_STBT,
	frame = FF_ANIMATE|A,
	var1 = 2,
	var2 = 5,
	tics = 6,
	nextstate = S_STRAYBOLTS_BOSS
}

states[S_STRAYBOLTS_BOSS_TIRED] = {
	sprite = SPR_STBT,
	frame = FF_ANIMATE|A,
	var1 = 2,
	var2 = 5,
	tics = 6,
	nextstate = S_STRAYBOLTS_BOSS_TIRED
}

states[S_STRAYBOLTS_BOSS_PAIN1] = {
	sprite = SPR_STBT,
	frame = A,
	var1 = sfx_dmpain,
	tics = 0,
	action = A_PlaySound,
	nextstate = S_STRAYBOLTS_BOSS_PAIN2
}

states[S_STRAYBOLTS_BOSS_PAIN2] = {
	sprite = SPR_STBT,
	frame = FF_ANIMATE|A,
	var1 = 2,
	var2 = 5,
	tics = TICRATE,
	action = A_Pain,
	nextstate = S_STRAYBOLTS_BOSS
}

states[S_STRAYBOLTS_BOSS_DEATH] = {
	sprite = SPR_STBT,
	frame = FF_ANIMATE|A,
	var1 = 2,
	var2 = 5,
	tics = TICRATE*3,
	nextstate = S_STRAYBOLTS_BOSS_FINISH
}

states[S_STRAYBOLTS_BOSS_FINISH] = {
	sprite = SPR_NULL,
	tics = 1,
	nextstate = S_NULL
}

mobjinfo[MT_STRAYBOLTS_MISSILE] = {
	radius = 8*FRACUNIT,
	height = 128*FRACUNIT,
	spawnstate = S_STRAYBOLTS_MISSILE1,
	deathstate = S_SPLISH1,
	flags = MF_NOGRAVITY|MF_MISSILE|MF_PAIN
}

states[S_STRAYBOLTS_MISSILE1] = {
	sprite = SPR_LBAL,
	frame = A,
	tics = 15,
	nextstate = S_STRAYBOLTS_MISSILE2
}

states[S_STRAYBOLTS_MISSILE2] = {
	sprite = SPR_LBAL,
	frame = B,
	tics = 15,
	nextstate = S_STRAYBOLTS_MISSILE1
}

// Silver Support
local straybolts_missile_properties = {
	//shamelessly stolen from the original silver code
	//why change it if it works?
	noaim = true,
	grabf = function(mo, pmo)
		mo.silv_desperatemeasure = $ or mo.type
		mo.type = MT_ROCKET	-- fuck your mobjthinker, asshole
		mo.target = nil
		end,
	resetf = function(mo)
		mo.silv_desperatemeasure = nil
		end,
}

local straybolts_boss_properties = {
	nograb = true,
	bossdamage = true,
}


local function A_StrayBolts_Float(mo,height,speed,cap)
	if mo.z > mo.floorz + (height*FRACUNIT)
		mo.momz = mo.momz - (speed*FRACUNIT)
		if mo.momz < -(cap*FRACUNIT)
			mo.momz = -(cap*FRACUNIT)
		end
	else
		mo.momz = mo.momz + (speed*FRACUNIT)
		if mo.momz > (cap*FRACUNIT)
			mo.momz = (cap*FRACUNIT)
		end
	end
end

local function A_StrayBolts_Chase(mo,target,speed,cap)
	if mo.x > target.x
		mo.momx = mo.momx - (speed*FRACUNIT)
		if mo.momx < -(cap*FRACUNIT)
			mo.momx = -(cap*FRACUNIT)
		end
	elseif mo.x < target.x
		mo.momx = mo.momx + (speed*FRACUNIT)
		if mo.momx > (cap*FRACUNIT)
			mo.momx = (cap*FRACUNIT)
		end
	end

	if mo.y > target.y
		mo.momy = mo.momy - (speed*FRACUNIT)
		if mo.momy < -(cap*FRACUNIT)
			mo.momy = -(cap*FRACUNIT)
		end
	elseif mo.y < target.y
		mo.momy = mo.momy + (speed*FRACUNIT)
		if mo.momy > (cap*FRACUNIT)
			mo.momy = (cap*FRACUNIT)
		end
	end
end

local function A_StrayBolts_SBZAttack(mo,loc_list)
	for _,i in pairs(loc_list)
		if mo.valid then
			local new_missile = P_SpawnMobj(i.x,i.y,mo.floorz+(256*FRACUNIT),MT_STRAYBOLTS_MISSILE)
			new_missile.target = mo
		end
	end
end

local function straybolts_boss(mo)
	//the most important thing.. the bobbing eyes
	if not mo.eyes
		mo.eyes = P_SpawnMobj(mo.x,mo.y,mo.z,MT_STRAYBOLTS_EYES)
		mo.eyes.state = S_STRAYBOLTS_EYES_JOY
		mo.eyes_float = 0
		mo.eyes_toggle = false
	else
		mo.eyes.angle = FixedAngle(AngleFixed(mo.angle) + (90*FRACUNIT))
		P_TeleportMove(mo.eyes,mo.x,mo.y,mo.z+(16*FRACUNIT)+(mo.eyes_float*FRACUNIT))
		P_InstaThrust(mo.eyes,mo.angle,FRACUNIT*16)
		if mo.eyes_toggle == false
			mo.eyes_float = mo.eyes_float + 1
			if mo.eyes_float > 5
				mo.eyes_toggle = true
			end
		else
			mo.eyes_float = mo.eyes_float - 1
			if mo.eyes_float < -5
				mo.eyes_toggle = false
			end
		end
	end
	//initalizition
	if not mo.attack_waypoints
		//getting waypoints
		mo.attack_waypoints = {}
		mo.centerwaypoint = nil
		//add all waypoints in the map to this table. 9 is recommened.
		for mobj in mobjs.iterate()
			if mobj.type == MT_STRAYBOLTS_WAYPOINT
				table.insert(mo.attack_waypoints,mobj)
				if mobj.flags2 & MF2_AMBUSH
					mo.centerwaypoint = mobj
				end
			end
		end
		//if we can't find a center waypoint (this is where he goes when during his pinch phase..)
		if not mo.centerwaypoint
			mo.centerwaypoint = mo.attack_waypoints[1]
			print("WARNING: No Stray-Bolts center waypoint Found.")
			print("Defaulting to first waypoint in list....")
		end
		mo.silver = false
		for i in players.iterate()
			if i.mo.skin == "silver" then
				mo.silver = true
				if not silv_TKextra[MT_STRAYBOLTS_MISSILE]
					silv_addTKextra(MT_STRAYBOLTS_MISSILE, straybolts_missile_properties)
					silv_addTKextra(MT_STRAYBOLTS_BOSS, straybolts_boss_properties)
				end
			elseif i.mo.skin == "yoshi" then
				mo.silver = true
			end
		end
		mo.timer = TICRATE*9  //it's long so we can sync with the music~
		mo.dead = false
	end
	if mo.state == S_STRAYBOLTS_BOSS_CUTSCENE
		P_BossTargetPlayer(mo,true)
		if mo.target.valid
			mo.angle = R_PointToAngle2(mo.x,mo.y,mo.target.x,mo.target.y)
		end
		
		mo.timer = mo.timer - 1

		A_StrayBolts_Float(mo,196,1,4)
		
		if mo.timer == 0
			mo.timer = 10*TICRATE+1
			mo.state = S_STRAYBOLTS_BOSS
			S_StartSound(nil,sfx_beelec)
			S_StartSound(nil,sfx_cdpcm6)
		end
	elseif mo.state == S_STRAYBOLTS_BOSS
		P_BossTargetPlayer(mo,true)
		if mo.target.valid
			mo.angle = R_PointToAngle2(mo.x,mo.y,mo.target.x,mo.target.y)
		end
		
		mo.timer = mo.timer - 1
		
		mo.flags = MF_BOSS|MF_PAIN|MF_SPECIAL|MF_NOGRAVITY
		mo.flags2 = $1 & ~MF2_FRET
		
		mo.eyes.state = S_STRAYBOLTS_EYES_NORM 
		
		//phase 1 - more than 6 gits
		if mo.health > 6
			A_StrayBolts_Float(mo,196,1,4)
			if mo.target.valid
				A_StrayBolts_Chase(mo,mo.target,2,6)
			end
			if mo.timer % (TICRATE*2) == 0
				S_StopSound(mo)
				P_SpawnMobj(mo.x,mo.y,mo.floorz,MT_STRAYBOLTS_BOLT)
				S_StartSound(mo,sfx_litng1)
			end
			if mo.timer % (TICRATE*20) == 0
			and mo.silver == true
				A_StrayBolts_SBZAttack(mo,mo.attack_waypoints)
				S_StartSound(nil,sfx_beelec)
			end
		//phase 2 - more than 3 hits
		elseif mo.health > 3
			A_StrayBolts_Float(mo,196,1,4)
			if mo.target.valid
				A_StrayBolts_Chase(mo,mo.target,2,6)
			end
			if mo.timer % (TICRATE) == 0
				S_StopSound(mo)
				P_SpawnMobj(mo.x,mo.y,mo.floorz,MT_STRAYBOLTS_BOLT)
				S_StartSound(mo,sfx_litng1)
			end
			if mo.timer % (TICRATE*5) == 0
				A_StrayBolts_SBZAttack(mo,mo.attack_waypoints)
				S_StartSound(nil,sfx_beelec)
			end
		//PINCH PHASE WOOT
		else
			A_StrayBolts_Float(mo,196,1,2)
			A_StrayBolts_Chase(mo,mo.centerwaypoint,1,2)
			if mo.timer % (TICRATE) == 0
				A_StrayBolts_SBZAttack(mo,mo.attack_waypoints)
				S_StartSound(nil,sfx_beelec)
			end
		end
		
		if mo.timer == 0
			mo.state = S_STRAYBOLTS_BOSS_TIRED
			mo.eyes.state = S_STRAYBOLTS_EYES_TIRED
			S_StartSound(nil,sfx_s3k51)
			mo.timer = 5*TICRATE
		end
	elseif mo.state == S_STRAYBOLTS_BOSS_TIRED
		P_BossTargetPlayer(mo,true)
		if mo.target.valid
			mo.angle = R_PointToAngle2(mo.x,mo.y,mo.target.x,mo.target.y)
		end
		
		mo.timer = mo.timer - 1
		
		mo.flags = MF_BOSS|MF_SHOOTABLE|MF_SPECIAL|MF_NOGRAVITY
		
		mo.eyes.state = S_STRAYBOLTS_EYES_TIRED
		
		mo.momx = 0
		mo.momy = 0
		
		A_StrayBolts_Float(mo,64,1,4)
		
		if mo.timer == 0
			mo.state = S_STRAYBOLTS_BOSS
			mo.eyes.state = S_STRAYBOLTS_EYES_NORM
			mo.timer = 10*TICRATE+1
		end
	elseif mo.state == S_STRAYBOLTS_BOSS_PAIN2
		mo.eyes.state = S_STRAYBOLTS_EYES_OUCH
		mo.elec_attack = false
		mo.momz = 0
		mo.timer = 10*TICRATE+1
	elseif mo.state == S_STRAYBOLTS_BOSS_DEATH
		mo.eyes.state = S_STRAYBOLTS_EYES_OUCH
		if mo.tics % 2 == 0
			A_BossScream(mo,1)
		end
	elseif	mo.state == S_STRAYBOLTS_BOSS_FINISH
		P_SwitchWeather(PRECIP_NONE)
		S_FadeOutStopMusic(MUSICRATE)
		for i in players.iterate()
			P_FlashPal(i,PAL_MIXUP,5)
			P_DoPlayerExit(i)
		end
		S_StartSound(mo,sfx_s3k73)
		P_RemoveMobj(mo.eyes)
		for i = 0,36
			local new_seed = P_SpawnMobj(mo.x,mo.y,mo.z,MT_SEED)
			new_seed.angle = FixedAngle(i*10*FRACUNIT)
			P_Thrust(new_seed,new_seed.angle,4*FRACUNIT)
			new_seed.momz = 4*FRACUNIT
		end	
		for i = 0,36
			local new_seed = P_SpawnMobj(mo.x,mo.y,mo.z,MT_SEED)
			new_seed.angle = FixedAngle(i*10*FRACUNIT)
			P_Thrust(new_seed,new_seed.angle,2*FRACUNIT)
			new_seed.momz = 8*FRACUNIT
		end	
	end
end

addHook("MobjThinker",straybolts_boss,MT_STRAYBOLTS_BOSS)

local function straybolts_missile(mo)
	mo.momz = -FRACUNIT*2
	P_LookForPlayers(mo,0,true,true)
	if mo.tracer
		A_StrayBolts_Chase(mo,mo.tracer,1,2)
	end
end

addHook("MobjThinker",straybolts_missile,MT_STRAYBOLTS_MISSILE)