// 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)
	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 // Not much point, otherwise
		if var1 < 0
			lowerbound = 0
		else
			lowerbound = var1
		end
		
		newtics = (((actor.tics - lowerbound) * actor.health) / actor.info.spawnhealth) + lowerbound
		if newtics < 1
			newtics = 1
		end
		
		actor.tics = newtics
	end
	
	if actor.reactiontime
		actor.reactiontime = $-1
		if actor.reactiontime == 0 and actor.type == MT_OLDCYBRAKDEMON
			S_StartSound(nil, sfx_bewar1 + P_RandomKey(4))
		end
	end
	
	// modify target threshold
	if actor.threshold
		if not actor.target and actor.target.health <= 0
			actor.threshold = 0
		else
			actor.threshold = $-1
		end
	end
	
	// turn towards movement direction if not there yet
	if actor.movedir < 8
		actor.angle = $ & (7*(2^29))
		delta = actor.angle - (actor.movedir * (2^29))
		
		if delta > 0
			actor.angle = $-ANGLE_45
		elseif delta < 0
			actor.angle = $+ANGLE_45
		end
	end
	
	if not actor.target or not (actor.target.flags & MF_SHOOTABLE)
		// Look for a new target
		if P_LookForPlayers(actor, 0, true, false)
			return // got a new target
		end
		
		P_SetMobjStateNF(actor, actor.info.spawnstate)
		return
	end
	
	if (actor.flags2 & MF2_JUSTATTACKED)
		actor.flags2 = $ & ~MF2_JUSTATTACKED
		P_NewChaseDir(actor)
		return
	end
	
	// Check if we can attack
	if P_CheckMissileRange(actor) and not actor.movecount
		// 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) // Guaranteed true if <= 1/4 health, guaranteed false if > 3/4 health
			if actor.info.attacksound
				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
			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)
		return
	end
	
	// chase towards player
	actor.movecount = $-1
	if actor.movecount < 0 or not P_Move(actor, actor.info.speed)
		P_NewChaseDir(actor)
	end
	
	// Optionally play a sound effect
	if var2 > 0 and var2 < #sfxinfo
		S_StartSound(actor, var2)
	end
	
	if actor.type != MT_OLDCYBRAKDEMON and actor.info.activesound and P_RandomChance(3*FRACUNIT/256)
		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 (mthing.options & MTF_AMBUSH)
		local elecmobj
		elecmobj = P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_OLDCYBRAKDEMON_ELECTRIC_BARRIER) // Replace the electric barrier with a 2.1 variant!!!
		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)
	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
	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,
	mass = 100,
	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)
	mobj.fuse = mobj.info.painchance
end, MT_OLDCYBRAKDEMON_NAPALM_BOMB_LARGE)

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

addHook("MobjFuse", function(mobj)
	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)
