freeslot(

    "MT_ELECTRORB",
		"SPR_LORB",		
        "S_LORB1",
		"S_LORB2",
		"S_LORB3",
		"S_LORB4",
    "MT_ELECTROBALL",
		"S_BALLSTOP",
		"S_BALLHUNT1",
		"S_BALLHUNT2",		

	"MT_ELECTRICTURRET3",
		"SPR_ELEG",	
		"S_ELEG_NORMAL1",
		"S_ELEG_NORMAL2",
        "S_ELEG_SEE1",
		"S_ELEG_SEE2",
		"S_ELEG_SEE3",
		"S_ELEG_SEE4",
		"S_ELEG_SEE5",
		"S_ELEG_SEE6",
		"S_ELEG_SEE7",
        "S_ELEG_SEE8"
)

addHook("MapThingSpawn", function(mobj)
	if mobj.balls == nil then
		mobj.balls = {}
	end
	for i=1, mobj.info.damage do
		mobj.balls[i] = P_SpawnMobj(mobj.x, mobj.y, mobj.z, mobj.info.painchance)
		mobj.balls[i].target = mobj
		mobj.balls[i].movedir = FixedAngle(FixedMul(FixedDiv(i<<FRACBITS, mobj.info.damage<<FRACBITS), 360<<FRACBITS))
		mobj.balls[i].threshold = mobj.balls[i].radius + mobj.radius + FixedMul(mobj.balls[i].info.painchance, mobj.balls[i].scale)
	end
end,MT_ELECTRICTURRET3)

---@param mobj mobj_t
addHook("MobjThinker", function(mobj)
	-- respawn the balls when they are gone
	for i=1, mobj.info.damage do
		if mobj.balls[i].valid == false then
			mobj.balls[i] = P_SpawnMobj(mobj.x, mobj.y, mobj.z, mobj.info.painchance)
			mobj.balls[i].target = mobj
			mobj.balls[i].movedir = FixedAngle(FixedMul(FixedDiv(i<<FRACBITS, mobj.info.damage<<FRACBITS), 360<<FRACBITS))
			mobj.balls[i].threshold = mobj.balls[i].radius + mobj.radius + FixedMul(mobj.balls[i].info.painchance, mobj.balls[i].scale)
		end
	end
end, MT_ELECTRICTURRET3)

mobjinfo[MT_ELECTRICTURRET3]={
	doomednum = 1579,
	spawnstate = S_ELEG_NORMAL1,
	seestate = S_ELEG_SEE1,
	reactiontime = 8,
	painchance = MT_ELECTRORB,
	painsound = sfx_fizzle,
	deathsound = sfx_athun1,
	raisestate = MT_ELECTROBALL,
	speed = 0,
	mass = DMG_ELECTRIC,
	damage = 2,
	radius = 64*FRACUNIT,
	height = 256*FRACUNIT,	
	flags = MF_SOLID|MF_NOCLIP|MF_SCENERY|MF_SHOOTABLE|MF_SPECIAL|MF_PAIN
}

states[S_ELEG_NORMAL1]={SPR_ELEG, A, 2,  A_Look, 0, 0, S_ELEG_NORMAL2}
states[S_ELEG_NORMAL2]={SPR_ELEG, B, 2,  A_Look, 0, 0, S_ELEG_NORMAL1}

states[S_ELEG_SEE1]={SPR_ELEG, A, 6,  A_FaceTarget, 0, 0, S_ELEG_SEE2}
states[S_ELEG_SEE2]={SPR_ELEG, B, 6,  A_Pain, 0, 0, S_ELEG_SEE3}
states[S_ELEG_SEE3]={SPR_ELEG, A, 4,  None, 0, 0, S_ELEG_SEE4}
states[S_ELEG_SEE4]={SPR_ELEG, A, 4,  None, 0, 0, S_ELEG_SEE5}
states[S_ELEG_SEE5]={SPR_ELEG, A, 4,  None, 0, 0, S_ELEG_SEE6}
states[S_ELEG_SEE6]={SPR_ELEG, A, 4,  A_JetgShoot, 0, 0, S_ELEG_SEE7}
states[S_ELEG_SEE7]={SPR_ELEG, A, 4,  A_Scream, 0, 0, S_ELEG_SEE8}
states[S_ELEG_SEE8]={SPR_ELEG, A, 4,  A_SetTics, 0, 0, S_ELEG_NORMAL1}

mobjinfo[MT_ELECTRORB]={
	doomednum = -1,
	spawnstate = S_LORB1,
	spawnhealth = 1,
	reactiontime = 1,
	painchance = 40*FRACUNIT, --additional distance from spawner
	speed = 2*FRACUNIT,
	mass = DMG_ELECTRIC, --damage type
	damage = 8*FRACUNIT,
	radius = 128*FRACUNIT,
	height = 128*FRACUNIT,	
	flags = MF_PAIN|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING
}

states[S_LORB1]={SPR_LORB, A, 1,  A_UnidusBall, 1, 0, S_LORB2}
states[S_LORB2]={SPR_LORB, B, 1,  A_UnidusBall, 1, 0, S_LORB3}
states[S_LORB3]={SPR_LORB, C, 1,  A_UnidusBall, 1, 0, S_LORB4}
states[S_LORB4]={SPR_LORB, D, 1,  A_UnidusBall, 1, 0, S_LORB1}

states[S_BALLSTOP]={SPR_THMG, A, 1,  A_Look, 1, 0, S_BALLSTOP}
states[S_BALLHUNT1]={SPR_THMG, B|FF_FULLBRIGHT, 1,  A_JetChase, 1, 0, S_BALLHUNT2}
states[S_BALLHUNT2]={SPR_THMG, C, 1,  A_JetChase, 1, 0, S_BALLHUNT1}

mobjinfo[MT_ELECTROBALL]={
	doomednum = -2,
	spawnstate = S_BALLSTOP,
	seestate = S_BALLHUNT1,
	spawnhealth = 1,
	reactiontime = 1,
	painchance = 40*FRACUNIT, --additional distance from spawner
	speed = 6*FRACUNIT,
	mass = DMG_ELECTRIC, --damage type
	damage = 8*FRACUNIT,
	radius = 1*FRACUNIT,
	height = 2*FRACUNIT,	
	flags = MF_PAIN|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_FLOAT|MF_MISSILE
}