-- 2.1 Brak Eggman ("Cybrakdemon") - Ported from 2.1.25
-- PLEASE LOAD LUA_BECM BEFORE THIS

freeslot(
	-- Sprites
	"SPR_OELC",
	"SPR_OFLE",
	"SPR_OFLA",
	"SPR_OHOP",
	-- Objects
	"MT_OLDCYBRAKDEMON",
	"MT_OLDCYBRAKDEMON_ELECTRIC_BARRIER",
	"MT_OLDCYBRAKDEMON_MISSILE",
	"MT_OLDCYBRAKDEMON_FLAMESHOT",
	"MT_OLDCYBRAKDEMON_FLAMEREST",
	"MT_OLDCYBRAKDEMON_TARGET_RETICULE",
	"MT_OLDCYBRAKDEMON_TARGET_DOT",
	"MT_OLDCYBRAKDEMON_NAPALM_BOMB_LARGE",
	"MT_OLDCYBRAKDEMON_NAPALM_BOMB_SMALL",
	"MT_OLDCYBRAKDEMON_NAPALM_FLAMES",
	--"MT_OLDCYBRAKDEMON_VILE_EXPLOSION", --Use this if post-2.2 versions change this
	-- States
	-- Cybrakdemon States
	"S_OLDCYBRAKDEMON_IDLE",
	"S_OLDCYBRAKDEMON_WALK1",
	"S_OLDCYBRAKDEMON_WALK2",
	"S_OLDCYBRAKDEMON_WALK3",
	"S_OLDCYBRAKDEMON_WALK4",
	"S_OLDCYBRAKDEMON_WALK5",
	"S_OLDCYBRAKDEMON_WALK6",
	"S_OLDCYBRAKDEMON_CHOOSE_ATTACK1",
	"S_OLDCYBRAKDEMON_MISSILE_ATTACK1",
	"S_OLDCYBRAKDEMON_MISSILE_ATTACK2",
	"S_OLDCYBRAKDEMON_MISSILE_ATTACK3",
	"S_OLDCYBRAKDEMON_MISSILE_ATTACK4",
	"S_OLDCYBRAKDEMON_MISSILE_ATTACK5",
	"S_OLDCYBRAKDEMON_MISSILE_ATTACK6",
	"S_OLDCYBRAKDEMON_FLAME_ATTACK1",
	"S_OLDCYBRAKDEMON_FLAME_ATTACK2",
	"S_OLDCYBRAKDEMON_FLAME_ATTACK3",
	"S_OLDCYBRAKDEMON_FLAME_ATTACK4",
	"S_OLDCYBRAKDEMON_CHOOSE_ATTACK2",
	"S_OLDCYBRAKDEMON_VILE_ATTACK1",
	"S_OLDCYBRAKDEMON_VILE_ATTACK2",
	"S_OLDCYBRAKDEMON_VILE_ATTACK3",
	"S_OLDCYBRAKDEMON_VILE_ATTACK4",
	"S_OLDCYBRAKDEMON_VILE_ATTACK5",
	"S_OLDCYBRAKDEMON_VILE_ATTACK6",
	"S_OLDCYBRAKDEMON_NAPALM_ATTACK1",
	"S_OLDCYBRAKDEMON_NAPALM_ATTACK2",
	"S_OLDCYBRAKDEMON_NAPALM_ATTACK3",
	"S_OLDCYBRAKDEMON_FINISH_ATTACK1",
	"S_OLDCYBRAKDEMON_FINISH_ATTACK2",
	"S_OLDCYBRAKDEMON_PAIN1",
	"S_OLDCYBRAKDEMON_PAIN2",
	"S_OLDCYBRAKDEMON_PAIN3",
	"S_OLDCYBRAKDEMON_DIE1",
	"S_OLDCYBRAKDEMON_DIE2",
	"S_OLDCYBRAKDEMON_DIE3",
	"S_OLDCYBRAKDEMON_DIE4",
	"S_OLDCYBRAKDEMON_DIE5",
	"S_OLDCYBRAKDEMON_DIE6",
	"S_OLDCYBRAKDEMON_DIE7",
	"S_OLDCYBRAKDEMON_DIE8",
	"S_OLDCYBRAKDEMON_DEINVINCIBLERIZE",
	"S_OLDCYBRAKDEMON_INVINCIBLERIZE",
	-- 2.1 Cybrakdemon Electric Barrier States
	"S_OLDCYBRAKDEMONELECTRICBARRIER_INIT1",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_INIT2",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_PLAYSOUND",
	"S_OLDCYBRAKDEMONELECTRICBARRIER1",
	"S_OLDCYBRAKDEMONELECTRICBARRIER2",
	"S_OLDCYBRAKDEMONELECTRICBARRIER3",
	"S_OLDCYBRAKDEMONELECTRICBARRIER4",
	"S_OLDCYBRAKDEMONELECTRICBARRIER5",
	"S_OLDCYBRAKDEMONELECTRICBARRIER6",
	"S_OLDCYBRAKDEMONELECTRICBARRIER7",
	"S_OLDCYBRAKDEMONELECTRICBARRIER8",
	"S_OLDCYBRAKDEMONELECTRICBARRIER9",
	"S_OLDCYBRAKDEMONELECTRICBARRIER10",
	"S_OLDCYBRAKDEMONELECTRICBARRIER11",
	"S_OLDCYBRAKDEMONELECTRICBARRIER12",
	"S_OLDCYBRAKDEMONELECTRICBARRIER13",
	"S_OLDCYBRAKDEMONELECTRICBARRIER14",
	"S_OLDCYBRAKDEMONELECTRICBARRIER15",
	"S_OLDCYBRAKDEMONELECTRICBARRIER16",
	"S_OLDCYBRAKDEMONELECTRICBARRIER17",
	"S_OLDCYBRAKDEMONELECTRICBARRIER18",
	"S_OLDCYBRAKDEMONELECTRICBARRIER19",
	"S_OLDCYBRAKDEMONELECTRICBARRIER20",
	"S_OLDCYBRAKDEMONELECTRICBARRIER21",
	"S_OLDCYBRAKDEMONELECTRICBARRIER22",
	"S_OLDCYBRAKDEMONELECTRICBARRIER23",
	"S_OLDCYBRAKDEMONELECTRICBARRIER24",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_DIE1",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_DIE2",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_DIE3",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHECK",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHOOSE",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM1",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM2",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM3",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM4",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM5",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM6",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM7",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM8",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM9",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM10",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM11",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM12",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMFAIL",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE1",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE2",
	"S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE3",
	-- 2.1 Cybrakdemon Missile States
	"S_OLDCYBRAKDEMONMISSILE",
	"S_OLDCYBRAKDEMONMISSILE_EXPLODE1",
	"S_OLDCYBRAKDEMONMISSILE_EXPLODE2",
	"S_OLDCYBRAKDEMONMISSILE_EXPLODE3",
	-- 2.1 Cybrakdemon Flame States
	"S_OLDCYBRAKDEMONFLAMESHOT_FLY1",
	"S_OLDCYBRAKDEMONFLAMESHOT_FLY2",
	"S_OLDCYBRAKDEMONFLAMESHOT_FLY3",
	"S_OLDCYBRAKDEMONFLAMESHOT_DIE",
	"S_OLDCYBRAKDEMONFLAMEREST",
	"S_OLDFLAME",
	-- 2.1 Cybrakdemon Target State(s)
	"S_OLDCYBRAKDEMONTARGETRETICULE1",
	"S_OLDCYBRAKDEMONTARGETRETICULE2",
	"S_OLDCYBRAKDEMONTARGETRETICULE3",
	"S_OLDCYBRAKDEMONTARGETRETICULE4",
	"S_OLDCYBRAKDEMONTARGETRETICULE5",
	"S_OLDCYBRAKDEMONTARGETRETICULE6",
	"S_OLDCYBRAKDEMONTARGETRETICULE7",
	"S_OLDCYBRAKDEMONTARGETRETICULE8",
	"S_OLDCYBRAKDEMONTARGETRETICULE9",
	"S_OLDCYBRAKDEMONTARGETRETICULE10",
	"S_OLDCYBRAKDEMONTARGETRETICULE11",
	"S_OLDCYBRAKDEMONTARGETRETICULE12",
	"S_OLDCYBRAKDEMONTARGETRETICULE13",
	"S_OLDCYBRAKDEMONTARGETRETICULE14",
	"S_OLDCYBRAKDEMONTARGETDOT",
	-- 2.1 Cybrakdemon Napalm States
	"S_OLDCYBRAKDEMONNAPALMBOMBLARGE_FLY",
	"S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE1",
	"S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE2",
	"S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE3",
	"S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE4",
	"S_OLDCYBRAKDEMONNAPALMBOMBSMALL",
	"S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE1",
	"S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE2",
	"S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE3",
	"S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE4",
	"S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE5",
	"S_OLDCYBRAKDEMONNAPALMFLAME_FLY",
	"S_OLDCYBRAKDEMONNAPALMFLAME_DIE"
	-- 2.1 Cybrakdemon Vile Explosion States
	-- Porting not necessary for now
)

-- 2.1 "Cybrakdemon"

-- A_BrakChase - Ported from 2.1.25
function A_21BrakChase(actor, var1, var2)
	if not (actor and actor.valid) then return end
	
	local delta
	local lowerbound
	local newtics
	
	-- Set new tics NOW, in case the state changes while we're doing this and we try applying this to the painstate or something silly
	if actor.tics > 1 and var1 < actor.tics then -- Not much point, otherwise
		if var1 < 0 then
			lowerbound = 0
		else
			lowerbound = var1
		end
		
		newtics = (((actor.tics - lowerbound) * actor.health) / actor.info.spawnhealth) + lowerbound
		if newtics < 1 then
			newtics = 1
		end
		
		actor.tics = newtics
	end
	
	if actor.reactiontime then
		actor.reactiontime = $-1
		if actor.reactiontime == 0 and actor.type == MT_OLDCYBRAKDEMON then
			S_StartSound(nil, sfx_bewar1 + P_RandomKey(4))
		end
	end
	
	-- modify target threshold
	if actor.threshold then
		if not actor.target and actor.target.health <= 0 then
			actor.threshold = 0
		else
			actor.threshold = $-1
		end
	end
	
	-- turn towards movement direction if not there yet
	if actor.movedir < 8 then
		actor.angle = $ & (7*(2^29))
		delta = actor.angle - (actor.movedir * (2^29))
		
		if delta > 0 then
			actor.angle = $-ANGLE_45
		elseif delta < 0 then
			actor.angle = $+ANGLE_45
		end
	end
	
	if not (actor.target and actor.target.valid) or not (actor.target.flags & MF_SHOOTABLE) then
		-- Look for a new target
		if P_LookForPlayers(actor, 0, true, false) then
			return -- got a new target
		end
		
		P_SetMobjStateNF(actor, actor.info.spawnstate)
		return
	end
	
	if (actor.flags2 & MF2_JUSTATTACKED) then
		actor.flags2 = $ & ~MF2_JUSTATTACKED
		P_NewChaseDir(actor)
		return
	end
	
	-- Check if we can attack
	if P_CheckMissileRange(actor) and not actor.movecount then
		-- Check if we should use "melee" attack first. (Yes, this still runs outside of melee range. Quiet, you.)
		if actor.info.meleestate
		and actor.health <= P_RandomRange(actor.info.spawnhealth/4, (actor.info.spawnhealth * 3)/4) then -- Guaranteed true if <= 1/4 health, guaranteed false if > 3/4 health
			if actor.info.attacksound then
				S_StartSound(actor, actor.info.attacksound) -- Originally S_StartAttackSound
			end
			
			actor.state = actor.info.meleestate
			actor.flags2 = $|MF2_JUSTATTACKED
			return
		-- Else, check for missile attack.
		elseif actor.info.missilestate then
			actor.state = actor.info.missilestate
			actor.flags2 = $|MF2_JUSTATTACKED
			return
		end
	end
	
	-- possibly choose another target
	if multiplayer and not actor.threshold and (actor.target.health <= 0 or not P_CheckSight(actor, actor.target))
	and P_LookForPlayers(actor, 0, true, false) then
		return
	end
	
	-- chase towards player
	actor.movecount = $-1
	if actor.movecount < 0 or not P_Move(actor, actor.info.speed) then
		P_NewChaseDir(actor)
	end
	
	-- Optionally play a sound effect
	if var2 > 0 and var2 < #sfxinfo then
		S_StartSound(actor, var2)
	end
	
	if actor.type ~= MT_OLDCYBRAKDEMON and actor.info.activesound and P_RandomChance(3*FRACUNIT/256) then
		S_StartSound(actor, actor.info.activesound)
	end
end

-- Protect the 2.1 "Cybrakdemon" with an electric barrier if it is spawned with the ambush flag
addHook("MapThingSpawn", function(mo, mthing)
	if not (mo and mo.valid and mthing and mthing.valid) then return end
	
	if (not udmf and (mthing.options & MTF_AMBUSH))
	or (udmf and mthing.args[6]) then
		local elecmobj = P_SpawnMobj(mo.x, mo.y, mo.z, MT_OLDCYBRAKDEMON_ELECTRIC_BARRIER)
		elecmobj.target = mo
		elecmobj.angle = FixedAngle(mthing.angle*FRACUNIT)
-- 		elecmobj.destscale = mo.scale*2
-- 		P_SetScale(elecmobj, elecmobj.destscale)
		elecmobj.scale = mo.scale*2
	end
end, MT_OLDCYBRAKDEMON)

-- Prevent the 2.1 "Cybrakdemon" from disappearing when defeated
addHook("BossDeath", function(mo)
	if not (mo and mo.valid) then return end
	
	mo.flags = $|MF_NOCLIP
	mo.flags = $ & ~MF_SPECIAL
	
	S_StartSound(nil, sfx_befall)
	return true
end, MT_OLDCYBRAKDEMON)

mobjinfo[MT_OLDCYBRAKDEMON] = {
	--$Name 2.1 Cybrakdemon
	--$Sprite OBRKA1
	--$Category Bosses
	--$Flags4Text End level on death
	--$Flags8Text Electric barrier
	--$Arg0 Boss ID
	--$Arg1 End level on death?
	--$Arg1Type 11
	--$Arg1Enum noyes
	--$Arg2 Death trigger tag
	--$Arg2Type 15
	--$Arg3 Victory trigger tag
	--$Arg3Type 15
	--$Arg4 Pinch trigger tag
	--$Arg4Type 15
	--$Arg5 Attack trigger tag
	--$Arg5Type 15
	--$Arg6 Electric barrier
	--$Arg6Type 11
	--$Arg6Enum offon
	doomednum = 4049,
	spawnstate = S_OLDCYBRAKDEMON_IDLE,
	spawnhealth = 12,
	seestate = S_OLDCYBRAKDEMON_WALK1,
	reactiontime = 15,
	painstate = S_OLDCYBRAKDEMON_PAIN1,
	painsound = sfx_behurt,
	meleestate = S_OLDCYBRAKDEMON_CHOOSE_ATTACK2,
	missilestate = S_OLDCYBRAKDEMON_CHOOSE_ATTACK1,
	deathstate = S_OLDCYBRAKDEMON_DIE1,
	deathsound = sfx_s3kb4,
	speed = 40,
	radius = 48*FRACUNIT,
	height = 160*FRACUNIT,
	mass = 100,
	damage = 1,
	activesound = sfx_bewar1,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE
}

local function RB_BrakVileAttack(actor, var1, var2)
	if not (actor and actor.valid) then return end
	local tag = LE_BRAKVILEATACK
	if udmf and actor.spawnpoint and actor.spawnpoint.valid then
		tag = actor.spawnpoint.args[5]
	end
	P_LinedefExecute(tag, actor, nil)
end

states[S_OLDCYBRAKDEMON_IDLE] =	{SPR_OBRK,	A,	10,	A_Look,	0,	0,	S_OLDCYBRAKDEMON_IDLE}

states[S_OLDCYBRAKDEMON_WALK1] =	{SPR_OBRK,	B,	8,	A_21BrakChase,	3,	0,			S_OLDCYBRAKDEMON_WALK2}
states[S_OLDCYBRAKDEMON_WALK2] =	{SPR_OBRK,	C,	8,	A_21BrakChase,	3,	0,			S_OLDCYBRAKDEMON_WALK3}
states[S_OLDCYBRAKDEMON_WALK3] =	{SPR_OBRK,	D,	8,	A_21BrakChase,	3,	sfx_bestep,	S_OLDCYBRAKDEMON_WALK4}
states[S_OLDCYBRAKDEMON_WALK4] =	{SPR_OBRK,	E,	8,	A_21BrakChase,	3,	0,			S_OLDCYBRAKDEMON_WALK5}
states[S_OLDCYBRAKDEMON_WALK5] =	{SPR_OBRK,	F,	8,	A_21BrakChase,	3,	0,			S_OLDCYBRAKDEMON_WALK6}
states[S_OLDCYBRAKDEMON_WALK6] =	{SPR_OBRK,	G,	8,	A_21BrakChase,	3,	sfx_bestp2,	S_OLDCYBRAKDEMON_WALK1}

states[S_OLDCYBRAKDEMON_CHOOSE_ATTACK1] =	{SPR_OBRK,	H,	6,	A_RandomState,	S_OLDCYBRAKDEMON_MISSILE_ATTACK1,	S_OLDCYBRAKDEMON_FLAME_ATTACK1,	S_OLDCYBRAKDEMON_MISSILE_ATTACK1}

states[S_OLDCYBRAKDEMON_MISSILE_ATTACK1] =	{SPR_OBRK,	H,					6,	A_FaceTarget,	0,							0,		S_OLDCYBRAKDEMON_MISSILE_ATTACK2}
-- Replace A_BrakFireShot with a 2.1/2.2 variant if it changes in the future
states[S_OLDCYBRAKDEMON_MISSILE_ATTACK2] =	{SPR_OBRK,	26 + FF_FULLBRIGHT,	12,	A_BrakFireShot,	MT_OLDCYBRAKDEMON_MISSILE,	128,	S_OLDCYBRAKDEMON_MISSILE_ATTACK3}
states[S_OLDCYBRAKDEMON_MISSILE_ATTACK3] =	{SPR_OBRK,	H,					12,	A_FaceTarget,	0,							0,		S_OLDCYBRAKDEMON_MISSILE_ATTACK4}
-- Replace A_BrakFireShot with a 2.1/2.2 variant if it changes in the future
states[S_OLDCYBRAKDEMON_MISSILE_ATTACK4] =	{SPR_OBRK,	26 + FF_FULLBRIGHT,	12,	A_BrakFireShot, MT_OLDCYBRAKDEMON_MISSILE,	128,	S_OLDCYBRAKDEMON_MISSILE_ATTACK5}
states[S_OLDCYBRAKDEMON_MISSILE_ATTACK5] =	{SPR_OBRK,	H,					12,	A_FaceTarget,	0,							0,		S_OLDCYBRAKDEMON_MISSILE_ATTACK6}
-- Replace A_BrakFireShot with a 2.1/2.2 variant if it changes in the future
states[S_OLDCYBRAKDEMON_MISSILE_ATTACK6] =	{SPR_OBRK,	26 + FF_FULLBRIGHT,	12,	A_BrakFireShot,	MT_OLDCYBRAKDEMON_MISSILE,	128,	S_OLDCYBRAKDEMON_FINISH_ATTACK1}

states[S_OLDCYBRAKDEMON_FLAME_ATTACK1] =	{SPR_OBRK,	H,					1,	A_Repeat,		1,								S_OLDCYBRAKDEMON_FLAME_ATTACK1,	S_OLDCYBRAKDEMON_FLAME_ATTACK2}
states[S_OLDCYBRAKDEMON_FLAME_ATTACK2] =	{SPR_OBRK,	H,					6,	A_FaceTarget,	0,								0,								S_OLDCYBRAKDEMON_FLAME_ATTACK3}
states[S_OLDCYBRAKDEMON_FLAME_ATTACK3] =	{SPR_OBRK,	26 + FF_FULLBRIGHT,	2,	A_BrakFireShot,	MT_OLDCYBRAKDEMON_FLAMESHOT,	128,							S_OLDCYBRAKDEMON_FLAME_ATTACK4}
states[S_OLDCYBRAKDEMON_FLAME_ATTACK4] =	{SPR_OBRK,	H,					1,	A_Repeat,		30,								S_OLDCYBRAKDEMON_FLAME_ATTACK3,	S_OLDCYBRAKDEMON_FINISH_ATTACK1}

states[S_OLDCYBRAKDEMON_CHOOSE_ATTACK2] =	{SPR_OBRK,	A,	6,	A_RandomState,	S_OLDCYBRAKDEMON_VILE_ATTACK1,	S_OLDCYBRAKDEMON_NAPALM_ATTACK1,	S_OLDCYBRAKDEMON_MISSILE_ATTACK1}

states[S_OLDCYBRAKDEMON_VILE_ATTACK1] =	{SPR_OBRK,	U,					0,	RB_BrakVileAttack,	0,									0,											S_OLDCYBRAKDEMON_VILE_ATTACK2}
states[S_OLDCYBRAKDEMON_VILE_ATTACK2] =	{SPR_OBRK,	U,					24,	A_VileTarget,		MT_OLDCYBRAKDEMON_TARGET_RETICULE,	1,											S_OLDCYBRAKDEMON_VILE_ATTACK3}
states[S_OLDCYBRAKDEMON_VILE_ATTACK3] =	{SPR_OBRK,	T,					8,	A_FaceTarget,		0,									0,											S_OLDCYBRAKDEMON_VILE_ATTACK4}
states[S_OLDCYBRAKDEMON_VILE_ATTACK4] =	{SPR_OBRK,	S,					8,	A_FaceTarget,		0,									0,											S_OLDCYBRAKDEMON_VILE_ATTACK5}
states[S_OLDCYBRAKDEMON_VILE_ATTACK5] =	{SPR_OBRK,	I,					32,	A_FaceTarget,		0,									0,											S_OLDCYBRAKDEMON_VILE_ATTACK6}
-- Replace MT_CYBRAKDEMON_VILE_EXPLOSION with a 2.1 variant?
states[S_OLDCYBRAKDEMON_VILE_ATTACK6] =	{SPR_OBRK,	U|FF_FULLBRIGHT,	28,	A_VileAttack,		sfx_brakrx,							MT_CYBRAKDEMON_VILE_EXPLOSION + (1<<16),	S_OLDCYBRAKDEMON_FINISH_ATTACK1}

states[S_OLDCYBRAKDEMON_NAPALM_ATTACK1] =	{SPR_OBRK,	A,					6,	A_FaceTarget,	0,										0,	S_OLDCYBRAKDEMON_NAPALM_ATTACK2}
states[S_OLDCYBRAKDEMON_NAPALM_ATTACK2] =	{SPR_OBRK,	V|FF_FULLBRIGHT,	8,	A_BrakLobShot,	MT_OLDCYBRAKDEMON_NAPALM_BOMB_LARGE,	96,	S_OLDCYBRAKDEMON_NAPALM_ATTACK3}
states[S_OLDCYBRAKDEMON_NAPALM_ATTACK3] =	{SPR_OBRK,	A,					8,	A_FaceTarget,	0,										0,	S_OLDCYBRAKDEMON_FINISH_ATTACK1}

states[S_OLDCYBRAKDEMON_FINISH_ATTACK1] =	{SPR_OBRK,	A,	0,	A_SetObjectFlags2,	MF2_FRET,	1,	S_OLDCYBRAKDEMON_FINISH_ATTACK2}
states[S_OLDCYBRAKDEMON_FINISH_ATTACK2] =	{SPR_OBRK,	A,	0,	A_SetReactionTime,	0,			0,	S_OLDCYBRAKDEMON_WALK1}

states[S_OLDCYBRAKDEMON_PAIN1] =	{SPR_OBRK,	S,	24,	A_Pain,						0,	0,						S_OLDCYBRAKDEMON_PAIN2}
states[S_OLDCYBRAKDEMON_PAIN2] =	{SPR_OBRK,	S,	0,	A_CheckHealth,				3,	S_OLDCYBRAKDEMON_PAIN3,	S_OLDCYBRAKDEMON_CHOOSE_ATTACK1}
states[S_OLDCYBRAKDEMON_PAIN3] =	{SPR_OBRK,	S,	0,	A_LinedefExecuteFromArg,	4,	0,						S_OLDCYBRAKDEMON_CHOOSE_ATTACK1}

states[S_OLDCYBRAKDEMON_DIE1] =	{SPR_OBRK,	S,	1,	A_Repeat,		1,			S_OLDCYBRAKDEMON_DIE1,	S_OLDCYBRAKDEMON_DIE2}
-- MT_SONIC3KBOSSEXPLODE is not necessary in 2.2; A_BossScream uses this object by default
states[S_OLDCYBRAKDEMON_DIE2] =	{SPR_OBRK,	S,	2,	A_BossScream,	0,			0,						S_OLDCYBRAKDEMON_DIE3}
states[S_OLDCYBRAKDEMON_DIE3] =	{SPR_OBRK,	S,	0,	A_Repeat,		52,			S_OLDCYBRAKDEMON_DIE2,	S_OLDCYBRAKDEMON_DIE4}
states[S_OLDCYBRAKDEMON_DIE4] =	{SPR_OBRK,	N,	14,	A_PlaySound,	sfx_bedie2,	0,						S_OLDCYBRAKDEMON_DIE5}
states[S_OLDCYBRAKDEMON_DIE5] =	{SPR_OBRK,	O,	7,	nil,			0,			0,						S_OLDCYBRAKDEMON_DIE6}
states[S_OLDCYBRAKDEMON_DIE6] =	{SPR_OBRK,	P,	5,	nil,			0,			0,						S_OLDCYBRAKDEMON_DIE7}
states[S_OLDCYBRAKDEMON_DIE7] =	{SPR_OBRK,	Q,	3,	A_PlaySound,	sfx_bgxpld,	0,						S_OLDCYBRAKDEMON_DIE8}
states[S_OLDCYBRAKDEMON_DIE8] =	{SPR_OBRK,	R,	-1,	A_BossDeath,	0,			0,						S_NULL}

states[S_OLDCYBRAKDEMON_DEINVINCIBLERIZE] =	{SPR_OBRK,	A,	0,	A_SetObjectFlags,	MF_SPECIAL|MF_SHOOTABLE,	2,	S_OLDCYBRAKDEMON_IDLE}
states[S_OLDCYBRAKDEMON_INVINCIBLERIZE] =	{SPR_OBRK,	A,	0,	A_SetObjectFlags,	MF_SPECIAL|MF_SHOOTABLE,	1,	S_OLDCYBRAKDEMON_IDLE}

-- 2.1 "Cybrakdemon" Electric Barrier

mobjinfo[MT_OLDCYBRAKDEMON_ELECTRIC_BARRIER] =	{
	doomednum = -1,
	spawnstate = S_OLDCYBRAKDEMONELECTRICBARRIER_INIT1,
	spawnhealth = 1000,
	seesound = sfx_s3k79,
	reactiontime = 8,
	deathstate = S_OLDCYBRAKDEMONELECTRICBARRIER_DIE1,
	deathsound = sfx_fizzle,
	speed = 10*FRACUNIT,
	radius = 48*FRACUNIT,
	height = 160*FRACUNIT,
	mass = 100,
	damage = 1,
	activesound = sfx_beelec,
	flags = MF_PAIN|MF_FIRE|MF_NOGRAVITY|MF_PUSHABLE
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_INIT1] =	{SPR_OELC,	A|FF_FULLBRIGHT,	1,	nil,			0,	0,									S_OLDCYBRAKDEMONELECTRICBARRIER_INIT2}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_INIT2] =	{SPR_OELC,	A|FF_FULLBRIGHT,	0,	A_RemoteAction,	-1,	S_OLDCYBRAKDEMON_INVINCIBLERIZE,	S_OLDCYBRAKDEMONELECTRICBARRIER_PLAYSOUND}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_PLAYSOUND] =	{SPR_OELC,	A|FF_FULLBRIGHT,	0,	A_PlayActiveSound,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER1}

states[S_OLDCYBRAKDEMONELECTRICBARRIER1] =	{SPR_OELC,	A|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER2}
states[S_OLDCYBRAKDEMONELECTRICBARRIER2] =	{SPR_OELC,	A|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER3}
states[S_OLDCYBRAKDEMONELECTRICBARRIER3] =	{SPR_OELC,	B|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER4}
states[S_OLDCYBRAKDEMONELECTRICBARRIER4] =	{SPR_OELC,	B|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER5}
states[S_OLDCYBRAKDEMONELECTRICBARRIER5] =	{SPR_OELC,	C|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER6}
states[S_OLDCYBRAKDEMONELECTRICBARRIER6] =	{SPR_OELC,	C|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER7}
states[S_OLDCYBRAKDEMONELECTRICBARRIER7] =	{SPR_OELC,	D|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER8}
states[S_OLDCYBRAKDEMONELECTRICBARRIER8] =	{SPR_OELC,	D|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER9}
states[S_OLDCYBRAKDEMONELECTRICBARRIER9] =	{SPR_OELC,	E|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER10}
states[S_OLDCYBRAKDEMONELECTRICBARRIER10] =	{SPR_OELC,	E|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER11}
states[S_OLDCYBRAKDEMONELECTRICBARRIER11] =	{SPR_OELC,	F|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER12}
states[S_OLDCYBRAKDEMONELECTRICBARRIER12] =	{SPR_OELC,	F|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER13}
states[S_OLDCYBRAKDEMONELECTRICBARRIER13] =	{SPR_OELC,	G|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER14}
states[S_OLDCYBRAKDEMONELECTRICBARRIER14] =	{SPR_OELC,	G|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER15}
states[S_OLDCYBRAKDEMONELECTRICBARRIER15] =	{SPR_OELC,	H|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER16}
states[S_OLDCYBRAKDEMONELECTRICBARRIER16] =	{SPR_OELC,	H|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER17}
states[S_OLDCYBRAKDEMONELECTRICBARRIER17] =	{SPR_OELC,	I|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER18}
states[S_OLDCYBRAKDEMONELECTRICBARRIER18] =	{SPR_OELC,	I|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER19}
states[S_OLDCYBRAKDEMONELECTRICBARRIER19] =	{SPR_OELC,	J|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER20}
states[S_OLDCYBRAKDEMONELECTRICBARRIER20] =	{SPR_OELC,	J|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER21}
states[S_OLDCYBRAKDEMONELECTRICBARRIER21] =	{SPR_OELC,	K|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER22}
states[S_OLDCYBRAKDEMONELECTRICBARRIER22] =	{SPR_OELC,	K|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER23}
states[S_OLDCYBRAKDEMONELECTRICBARRIER23] =	{SPR_OELC,	L|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER24}
states[S_OLDCYBRAKDEMONELECTRICBARRIER24] =	{SPR_OELC,	L|FF_FULLBRIGHT,	1,	A_CapeChase,	0,	0,	S_OLDCYBRAKDEMONELECTRICBARRIER_PLAYSOUND}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_DIE1] =	{SPR_NULL,	A,	0,			A_RemoteAction,		-1,								S_OLDCYBRAKDEMON_DEINVINCIBLERIZE,	S_OLDCYBRAKDEMONELECTRICBARRIER_DIE2}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_DIE2] =	{SPR_NULL,	A,	0,			A_SetObjectFlags,	MF_PUSHABLE|MF_FIRE|MF_PAIN,	1,									S_OLDCYBRAKDEMONELECTRICBARRIER_DIE3}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_DIE3] =	{SPR_NULL,	A,	20*TICRATE,	A_Scream,			0,								0,									S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHECK] =		{SPR_NULL,	A,	0,	A_CheckRandom,		10,												S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMFAIL}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS] =	{SPR_NULL,	A,	0,	A_CapeChase,		0,												0,														S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHOOSE}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHOOSE] =	{SPR_NULL,	A,	0,	A_RandomStateRange,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM12,			S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM1}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM1] =		{SPR_OELC,	A|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM2] =		{SPR_OELC,	B|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM3] =		{SPR_OELC,	C|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM4] =		{SPR_OELC,	D|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM5] =		{SPR_OELC,	E|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM6] =		{SPR_OELC,	F|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM7] =		{SPR_OELC,	G|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM8] =		{SPR_OELC,	H|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM9] =		{SPR_OELC,	I|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM10] =	{SPR_OELC,	J|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM11] =	{SPR_OELC,	K|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM12] =	{SPR_OELC,	L|FF_FULLBRIGHT,	1,	A_PlaySound,	sfx_s3k5c,	1,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMFAIL] =	{SPR_NULL,	A,	1,	nil,		0,			0,													S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP] =	{SPR_NULL,	A,	0,	A_Repeat,	5*TICRATE,	S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHECK,	S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE1}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE1] =	{SPR_NULL,	A,	0,			A_CapeChase,		0,			0,	S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE2}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE2] =	{SPR_NULL,	A,	0,			A_SpawnFreshCopy,	0,			0,	S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE3}
states[S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE3] =	{SPR_NULL,	A,	TICRATE,	A_PlaySound,		sfx_s3k79,	0,	S_NULL}

-- 2.1 "Cybrakdemon" Missile

mobjinfo[MT_OLDCYBRAKDEMON_MISSILE] = {
	doomednum = -1,
	spawnstate = S_OLDCYBRAKDEMONMISSILE,
	spawnhealth = 1000,
	seesound = sfx_brakrl,
	reactiontime = 8,
	deathstate = S_OLDCYBRAKDEMONMISSILE_EXPLODE1,
	deathsound = sfx_brakrx,
	speed = 40*FRACUNIT,
	radius = 11*FRACUNIT,
	height = 8*FRACUNIT,
	mass = 100,
	damage = 32*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY
}

-- Replace SPR_RCKT with a 2.1/2.2 variant if it gets changed in the future
states[S_OLDCYBRAKDEMONMISSILE] =	{SPR_RCKT,	A|FF_FULLBRIGHT,	1,	A_SetObjectFlags2,	MF2_RAILRING,	2,	S_OLDCYBRAKDEMONMISSILE}

states[S_OLDCYBRAKDEMONMISSILE_EXPLODE1] =	{SPR_RCKT,	B|FF_FULLBRIGHT,	8,	A_Explode,			0,											0,				S_OLDCYBRAKDEMONMISSILE_EXPLODE2}
states[S_OLDCYBRAKDEMONMISSILE_EXPLODE2] =	{SPR_RCKT,	C|FF_FULLBRIGHT,	6,	A_NapalmScatter,	MT_OLDCYBRAKDEMON_NAPALM_FLAMES + (6<<16),	32 + (16<<16),	S_OLDCYBRAKDEMONMISSILE_EXPLODE3}
states[S_OLDCYBRAKDEMONMISSILE_EXPLODE3] =	{SPR_RCKT,	D|FF_FULLBRIGHT,	4,	nil,				0,											0,				S_NULL}

-- 2.1 "Cybrakdemon" Flame Shot

mobjinfo[MT_OLDCYBRAKDEMON_FLAMESHOT] = {
	doomednum = -1,
	spawnstate = S_OLDCYBRAKDEMONFLAMESHOT_FLY1,
	spawnhealth = 1000,
	seesound = sfx_s3kc2s,
	reactiontime = 8,
	deathstate = S_OLDCYBRAKDEMONFLAMESHOT_DIE,
	speed = 20*FRACUNIT,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	mass = 100,
	damage = 1,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY
}

states[S_OLDCYBRAKDEMONFLAMESHOT_FLY1] =	{SPR_OFLE,	A|FF_FULLBRIGHT|FF_TRANS50,	15,	nil,	0,	0,	S_OLDCYBRAKDEMONFLAMESHOT_FLY2}
states[S_OLDCYBRAKDEMONFLAMESHOT_FLY2] =	{SPR_OFLE,	B|FF_FULLBRIGHT|FF_TRANS50,	15,	nil,	0,	0,	S_OLDCYBRAKDEMONFLAMESHOT_FLY3}
states[S_OLDCYBRAKDEMONFLAMESHOT_FLY3] =	{SPR_OFLE,	C|FF_FULLBRIGHT|FF_TRANS50,	-1,	nil,	0,	0,	S_OLDCYBRAKDEMONFLAMESHOT_FLY3}

states[S_OLDCYBRAKDEMONFLAMESHOT_DIE] =	{SPR_OFLE,	C|FF_FULLBRIGHT|FF_TRANS50,	0,	A_SpawnObjectRelative,	0,	MT_OLDCYBRAKDEMON_FLAMEREST,	S_NULL}

-- 2.1 "Cybrakdemon" Flame Rest

mobjinfo[MT_OLDCYBRAKDEMON_FLAMEREST] = {
	doomednum = -1,
	spawnstate = S_OLDCYBRAKDEMONFLAMEREST,
	spawnhealth = 1000,
	seesound = sfx_s3kc2s,
	reactiontime = 8,
	speed = 20*FRACUNIT,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	damage = 1,
	flags = MF_PAIN|MF_FIRE|MF_RUNSPAWNFUNC
}

states[S_OLDCYBRAKDEMONFLAMEREST] =	{SPR_OFLA,	D|FF_FULLBRIGHT|FF_TRANS50,	1,	A_SetFuse,	10*TICRATE,	0,	S_OLDFLAME}

states[S_OLDFLAME] =	{SPR_OFLA,	FF_FULLBRIGHT|FF_TRANS50|FF_ANIMATE|A,	-1,	nil,	3,	3,	S_OLDFLAME}

-- 2.1 "Cybrakdemon" Target Stuff

mobjinfo[MT_OLDCYBRAKDEMON_TARGET_RETICULE] = {
	doomednum = -1,
	spawnstate = S_OLDCYBRAKDEMONTARGETRETICULE1,
	spawnhealth = 1000,
	reactiontime = 8,
	deathstate = S_BOSSEXPLODE,
	speed = 10*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 64*FRACUNIT,
	mass = 100,
	damage = 1,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_RUNSPAWNFUNC
}

-- Replace SPR_TARG with a 2.1/2.2 variant if it changes in the future
states[S_OLDCYBRAKDEMONTARGETRETICULE1] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|A,	1,	A_VileFire,	sfx_s3k9d,	MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE2}
states[S_OLDCYBRAKDEMONTARGETRETICULE2] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|G,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE3}
states[S_OLDCYBRAKDEMONTARGETRETICULE3] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|B,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE4}
states[S_OLDCYBRAKDEMONTARGETRETICULE4] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|G,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE5}
states[S_OLDCYBRAKDEMONTARGETRETICULE5] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|C,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE6}
states[S_OLDCYBRAKDEMONTARGETRETICULE6] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|G,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE7}
states[S_OLDCYBRAKDEMONTARGETRETICULE7] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|D,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE8}
states[S_OLDCYBRAKDEMONTARGETRETICULE8] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|G,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE9}
states[S_OLDCYBRAKDEMONTARGETRETICULE9] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|E,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE10}
states[S_OLDCYBRAKDEMONTARGETRETICULE10] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|G,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE11}
states[S_OLDCYBRAKDEMONTARGETRETICULE11] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|F,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE12}
states[S_OLDCYBRAKDEMONTARGETRETICULE12] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|G,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE13}
states[S_OLDCYBRAKDEMONTARGETRETICULE13] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|A,	1,	A_VileFire,	0,			MT_OLDCYBRAKDEMON_TARGET_DOT,		S_OLDCYBRAKDEMONTARGETRETICULE14}
states[S_OLDCYBRAKDEMONTARGETRETICULE14] =	{SPR_TARG,	FF_TRANS50|FF_FULLBRIGHT|G,	1,	A_Repeat,	6,			S_OLDCYBRAKDEMONTARGETRETICULE2,	S_NULL}

mobjinfo[MT_OLDCYBRAKDEMON_TARGET_DOT] = {
	doomednum = -1,
	spawnstate = S_OLDCYBRAKDEMONTARGETDOT,
	spawnhealth = 1000,
	reactiontime = 8,
	deathstate = S_BOSSEXPLODE,
	speed = 10*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 64*FRACUNIT,
	mass = 100,
	damage = 1,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT
}

states[S_OLDCYBRAKDEMONTARGETDOT] =	{SPR_OHOP,	A|FF_TRANS50|FF_FULLBRIGHT,	2,	nil,	0,	0,	S_NULL}

-- 2.1 "Cybrakdemon" Large Napalm Bomb

addHook("MobjSpawn", function(mo)
	if not (mo and mo.valid) then return end
	
	mo.fuse = mo.info.painchance
end, MT_OLDCYBRAKDEMON_NAPALM_BOMB_LARGE)

-- Allow Cybrakdemon's large napalm bomb to explode
addHook("MobjThinker", function(mo)
	if not (mo and mo.valid) then return end
	
	-- hit the floor
	if P_IsObjectOnGround(mo) and abs(mo.momz) < FixedMul(FRACUNIT, mo.scale) then
		if mo.fuse
			mo.fuse = 1
		end
	end
end, MT_OLDCYBRAKDEMON_NAPALM_BOMB_LARGE)

addHook("MobjFuse", function(mo)
	if not (mo and mo.valid) then return end
	
	mo.state = mo.info.deathstate
	return true
end, MT_OLDCYBRAKDEMON_NAPALM_BOMB_LARGE)

mobjinfo[MT_OLDCYBRAKDEMON_NAPALM_BOMB_LARGE] = {
	doomednum = -1,
	spawnstate = S_OLDCYBRAKDEMONNAPALMBOMBLARGE_FLY,
	spawnhealth = 1000,
	seesound = sfx_s3k81,
	reactiontime = 8,
	painchance = 20*TICRATE,
	deathstate = S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE1,
	deathsound = sfx_s3k4e,
	speed = 10*FRACUNIT,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	damage = 48*FRACUNIT,
	activesound = sfx_s3k5d,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_BOUNCE|MF_GRENADEBOUNCE
}

-- Replace SPR_NPLM with a 2.1/2.2 variant if it changes in the future
states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_FLY] =	{SPR_NPLM,	FF_ANIMATE|A,	-1,	nil,	3,	2,	S_OLDCYBRAKDEMONNAPALMBOMBLARGE_FLY}

states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE1] =	{SPR_NPLM,	A,	1,	A_Explode,			0,												0,				S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE2}
states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE2] =	{SPR_NPLM,	A,	1,	A_NapalmScatter,	MT_OLDCYBRAKDEMON_NAPALM_BOMB_SMALL + (6<<16),	128 + (40<<16),	S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE3}
states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE3] =	{SPR_NPLM,	A,	1,	A_NapalmScatter,	MT_OLDCYBRAKDEMON_NAPALM_BOMB_SMALL + (1<<16),	32<<16,			S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE4}
states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE4] =	{SPR_NULL,	A,	81,	A_Scream,			0,												0,				S_NULL}

-- 2.1 "Cybrakdemon" Small Napalm Bomb

mobjinfo[MT_OLDCYBRAKDEMON_NAPALM_BOMB_SMALL] = {
	doomednum = -1,
	spawnstate = S_OLDCYBRAKDEMONNAPALMBOMBSMALL,
	spawnhealth = 1000,
	reactiontime = 8,
	deathstate = S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE1,
	deathsound = sfx_s3k70,
	speed = 10*FRACUNIT,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	mass = 100,
	damage = 32*FRACUNIT,
	activesound = sfx_s3k99,
	flags = MF_NOBLOCKMAP|MF_MISSILE|MF_BOUNCE
}

states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL] =	{SPR_MNPL,	A,	1,	nil,	0,	0,	S_OLDCYBRAKDEMONNAPALMBOMBSMALL}

states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE1] =	{SPR_MNPL,	A,	1,	A_Explode,			0,											0,				S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE2}
states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE2] =	{SPR_MNPL,	A,	1,	A_NapalmScatter,	MT_OLDCYBRAKDEMON_NAPALM_FLAMES + (12<<16),	128 + (40<<16),	S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE3}
states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE3] =	{SPR_MNPL,	A,	1,	A_NapalmScatter,	MT_OLDCYBRAKDEMON_NAPALM_FLAMES + (8<<16),	64 + (32<<16),	S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE4}
states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE4] =	{SPR_MNPL,	A,	1,	A_NapalmScatter,	MT_OLDCYBRAKDEMON_NAPALM_FLAMES + (1<<16),	24<<16,			S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE5}
states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE5] =	{SPR_NULL,	A,	24,	A_Scream,			0,											0,				S_NULL}

-- 2.1 "Cybrakdemon" Napalm Flames

mobjinfo[MT_OLDCYBRAKDEMON_NAPALM_FLAMES] = {
	doomednum = -1,
	spawnstate = S_OLDCYBRAKDEMONNAPALMFLAME_FLY,
	spawnhealth = 1000,
	reactiontime = 8,
	deathstate = S_OLDCYBRAKDEMONNAPALMFLAME_DIE,
	speed = 10*FRACUNIT,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	mass = 100,
	damage = 1,
	flags = MF_NOBLOCKMAP|MF_MISSILE
}

-- Replace SPR_SFLM with a 2.1/2.2 variant if it changes in the future
states[S_OLDCYBRAKDEMONNAPALMFLAME_FLY] =	{SPR_SFLM,	FF_FULLBRIGHT|FF_ANIMATE|A,	-1,	nil,	5,	2,	S_OLDCYBRAKDEMONNAPALMFLAME_FLY}

states[S_OLDCYBRAKDEMONNAPALMFLAME_DIE] =	{SPR_SFLM,	A|FF_FULLBRIGHT,	0,	A_SpawnObjectRelative,	0,	MT_OLDCYBRAKDEMON_FLAMEREST, S_NULL}

-- 2.1 "Cybrakdemon" Vile Explosion (if necessary)
-- Not necessary (for now)
