// 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(mobj, mthing)
	if not (mobj and mobj.valid
	and mthing and mthing.valid) then
		return
	end
	
	if (mthing.options & MTF_AMBUSH) then
		local elecmobj
		elecmobj = P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_OLDCYBRAKDEMON_ELECTRIC_BARRIER)
		elecmobj.target = mobj
		elecmobj.angle = FixedAngle(mthing.angle*FRACUNIT)
		elecmobj.destscale = mobj.scale*2
		P_SetScale(elecmobj, elecmobj.destscale)
	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
	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
}

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,	A_LinedefExecute,	LE_BRAKVILEATACK,					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_LinedefExecute,	LE_PINCHPHASE,	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(mobj)
	if not (mobj and mobj.valid) then return end
	
	mobj.fuse = mobj.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(mobj)
	if not (mobj and mobj.valid) then return end
	
	mobj.state = mobj.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)
