// 2.1 Brak Eggman ("Cybrakdemon") - Ported from 2.1.25

freeslot(
	// Sprites
	"SPR_OBRK",
	"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] = {
	sprite = SPR_OBRK,
	frame = A,
	tics = 10,
	action = A_Look,
	nextstate = S_OLDCYBRAKDEMON_IDLE
}

states[S_OLDCYBRAKDEMON_WALK1] = {
	sprite = SPR_OBRK,
	frame = B,
	tics = 8,
	action = A_21BrakChase,
	var1 = 3,
	var2 = 0,
	nextstate = S_OLDCYBRAKDEMON_WALK2
}

states[S_OLDCYBRAKDEMON_WALK2] = {
	sprite = SPR_OBRK,
	frame = C,
	tics = 8,
	action = A_21BrakChase,
	var1 = 3,
	var2 = 0,
	nextstate = S_OLDCYBRAKDEMON_WALK3
}

states[S_OLDCYBRAKDEMON_WALK3] = {
	sprite = SPR_OBRK,
	frame = D,
	tics = 8,
	action = A_21BrakChase,
	var1 = 3,
	var2 = sfx_bestep,
	nextstate = S_OLDCYBRAKDEMON_WALK4
}

states[S_OLDCYBRAKDEMON_WALK4] = {
	sprite = SPR_OBRK,
	frame = E,
	tics = 8,
	action = A_21BrakChase,
	var1 = 3,
	var2 = 0,
	nextstate = S_OLDCYBRAKDEMON_WALK5
}

states[S_OLDCYBRAKDEMON_WALK5] = {
	sprite = SPR_OBRK,
	frame = F,
	tics = 8,
	action = A_21BrakChase,
	var1 = 3,
	var2 = 0,
	nextstate = S_OLDCYBRAKDEMON_WALK6
}

states[S_OLDCYBRAKDEMON_WALK6] = {
	sprite = SPR_OBRK,
	frame = G,
	tics = 8,
	action = A_21BrakChase,
	var1 = 3,
	var2 = sfx_bestp2,
	nextstate = S_OLDCYBRAKDEMON_WALK1
}

states[S_OLDCYBRAKDEMON_CHOOSE_ATTACK1] = {
	sprite = SPR_OBRK,
	frame = H,
	tics = 6,
	action = A_RandomState,
	var1 = S_OLDCYBRAKDEMON_MISSILE_ATTACK1,
	var2 = S_OLDCYBRAKDEMON_FLAME_ATTACK1,
	nextstate = S_OLDCYBRAKDEMON_MISSILE_ATTACK1
}

states[S_OLDCYBRAKDEMON_MISSILE_ATTACK1] = {
	sprite = SPR_OBRK,
	frame = H,
	tics = 6,
	action = A_FaceTarget,
	nextstate = S_OLDCYBRAKDEMON_MISSILE_ATTACK2
}

states[S_OLDCYBRAKDEMON_MISSILE_ATTACK2] = {
	sprite = SPR_OBRK,
	frame = 26 + FF_FULLBRIGHT,
	tics = 12,
	action = A_BrakFireShot, // Replace this with a 2.1/2.2 variant if it changes in the future
	var1 = MT_OLDCYBRAKDEMON_MISSILE, // Replace this with a 2.1 variant, maybe?
	var2 = 128,
	nextstate = S_OLDCYBRAKDEMON_MISSILE_ATTACK3
}

states[S_OLDCYBRAKDEMON_MISSILE_ATTACK3] = {
	sprite = SPR_OBRK,
	frame = H,
	tics = 12,
	action = A_FaceTarget,
	nextstate = S_OLDCYBRAKDEMON_MISSILE_ATTACK4
}

states[S_OLDCYBRAKDEMON_MISSILE_ATTACK4] = {
	sprite = SPR_OBRK,
	frame = 26 + FF_FULLBRIGHT,
	tics = 12,
	action = A_BrakFireShot, // Replace this with a 2.1/2.2 variant if it changes in the future
	var1 = MT_OLDCYBRAKDEMON_MISSILE, // Replace this with a 2.1 variant, maybe?
	var2 = 128,
	nextstate = S_OLDCYBRAKDEMON_MISSILE_ATTACK5
}

states[S_OLDCYBRAKDEMON_MISSILE_ATTACK5] = {
	sprite = SPR_OBRK,
	frame = H,
	tics = 12,
	action = A_FaceTarget,
	nextstate = S_OLDCYBRAKDEMON_MISSILE_ATTACK6
}

states[S_OLDCYBRAKDEMON_MISSILE_ATTACK6] = {
	sprite = SPR_OBRK,
	frame = 26 + FF_FULLBRIGHT,
	tics = 12,
	action = A_BrakFireShot, // Replace this with a 2.1/2.2 variant if it changes in the future
	var1 = MT_OLDCYBRAKDEMON_MISSILE,
	var2 = 128,
	nextstate = S_OLDCYBRAKDEMON_FINISH_ATTACK1
}

states[S_OLDCYBRAKDEMON_FLAME_ATTACK1] = {
	sprite = SPR_OBRK,
	frame = H,
	tics = 1,
	action = A_Repeat,
	var1 = 1,
	var2 = S_OLDCYBRAKDEMON_FLAME_ATTACK1,
	nextstate = S_OLDCYBRAKDEMON_FLAME_ATTACK2
}

states[S_OLDCYBRAKDEMON_FLAME_ATTACK2] = {
	sprite = SPR_OBRK,
	frame = H,
	tics = 6,
	action = A_FaceTarget,
	nextstate = S_OLDCYBRAKDEMON_FLAME_ATTACK3
}

states[S_OLDCYBRAKDEMON_FLAME_ATTACK3] = {
	sprite = SPR_OBRK,
	frame = 26 + FF_FULLBRIGHT,
	tics = 2,
	action = A_BrakFireShot,
	var1 = MT_OLDCYBRAKDEMON_FLAMESHOT,
	var2 = 128,
	nextstate = S_OLDCYBRAKDEMON_FLAME_ATTACK4
}

states[S_OLDCYBRAKDEMON_FLAME_ATTACK4] = {
	sprite = SPR_OBRK,
	frame = H,
	tics = 1,
	action = A_Repeat,
	var1 = 30,
	var2 = S_OLDCYBRAKDEMON_FLAME_ATTACK3,
	nextstate = S_OLDCYBRAKDEMON_FINISH_ATTACK1
}

states[S_OLDCYBRAKDEMON_CHOOSE_ATTACK2] = {
	sprite = SPR_OBRK,
	frame = A,
	tics = 6,
	action = A_RandomState,
	var1 = S_OLDCYBRAKDEMON_VILE_ATTACK1,
	var2 = S_OLDCYBRAKDEMON_NAPALM_ATTACK1,
	nextstate = S_OLDCYBRAKDEMON_MISSILE_ATTACK1
}

states[S_OLDCYBRAKDEMON_VILE_ATTACK1] = {
	sprite = U,
	tics = 0,
	action = A_LinedefExecute,
	var1 = LE_BRAKVILEATACK,
	var2 = 0,
	nextstate = S_OLDCYBRAKDEMON_VILE_ATTACK2
}

states[S_OLDCYBRAKDEMON_VILE_ATTACK2] = {
	sprite = SPR_OBRK,
	frame = U,
	tics = 24,
	action = A_VileTarget,
	var1 = MT_OLDCYBRAKDEMON_TARGET_RETICULE, // Replace with a 2.1/2.2 variant if it changes in the future
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMON_VILE_ATTACK3
}

states[S_OLDCYBRAKDEMON_VILE_ATTACK3] = {
	sprite = SPR_OBRK,
	frame = T,
	tics = 8,
	action = A_FaceTarget,
	nextstate = S_OLDCYBRAKDEMON_VILE_ATTACK4
}

states[S_OLDCYBRAKDEMON_VILE_ATTACK4] = {
	sprite = SPR_OBRK,
	frame = S,
	tics = 8,
	action = A_FaceTarget,
	nextstate = S_OLDCYBRAKDEMON_VILE_ATTACK5
}

states[S_OLDCYBRAKDEMON_VILE_ATTACK5] = {
	sprite = SPR_OBRK,
	frame = I,
	tics = 32,
	action = A_FaceTarget,
	nextstate = S_OLDCYBRAKDEMON_VILE_ATTACK6
}

states[S_OLDCYBRAKDEMON_VILE_ATTACK6] = {
	sprite = SPR_OBRK,
	frame = U|FF_FULLBRIGHT,
	tics = 28,
	action = A_VileAttack,
	var1 = sfx_brakrx,
	var2 = MT_CYBRAKDEMON_VILE_EXPLOSION + (1<<16), // Replace MT_CYBRAKDEMON_VILE_EXPLOSION with a 2.1 variant?
	nextstate = S_OLDCYBRAKDEMON_FINISH_ATTACK1
}

states[S_OLDCYBRAKDEMON_NAPALM_ATTACK1] = {
	sprite = SPR_OBRK,
	frame = A,
	tics = 6,
	action = A_FaceTarget,
	nextstate = S_OLDCYBRAKDEMON_NAPALM_ATTACK2
}

states[S_OLDCYBRAKDEMON_NAPALM_ATTACK2] = {
	sprite = SPR_OBRK,
	frame = V|FF_FULLBRIGHT,
	tics = 8,
	action = A_BrakLobShot,
	var1 = MT_OLDCYBRAKDEMON_NAPALM_BOMB_LARGE, // Replace this with a 2.1 variant
	var2 = 96,
	nextstate = S_OLDCYBRAKDEMON_NAPALM_ATTACK3
}

states[S_OLDCYBRAKDEMON_NAPALM_ATTACK3] = {
	sprite = SPR_OBRK,
	frame = A,
	tics = 8,
	action = A_FaceTarget,
	nextstate = S_OLDCYBRAKDEMON_FINISH_ATTACK1
}

states[S_OLDCYBRAKDEMON_FINISH_ATTACK1] = {
	sprite = SPR_OBRK,
	frame = A,
	tics = 0,
	action = A_SetObjectFlags2,
	var1 = MF2_FRET,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMON_FINISH_ATTACK2
}

states[S_OLDCYBRAKDEMON_FINISH_ATTACK2] = {
	sprite = SPR_OBRK,
	frame = A,
	tics = 0,
	action = A_SetReactionTime,
	var1 = 0,
	var2 = 0,
	nextstate = S_OLDCYBRAKDEMON_WALK1
}

states[S_OLDCYBRAKDEMON_PAIN1] = {
	sprite = SPR_OBRK,
	frame = S,
	tics = 24,
	action = A_Pain,
	nextstate = S_OLDCYBRAKDEMON_PAIN2
}

states[S_OLDCYBRAKDEMON_PAIN2] = {
	sprite = SPR_OBRK,
	frame = S,
	tics = 0,
	action = A_CheckHealth,
	var1 = 3,
	var2 = S_OLDCYBRAKDEMON_PAIN3,
	nextstate = S_OLDCYBRAKDEMON_CHOOSE_ATTACK1
}

states[S_OLDCYBRAKDEMON_PAIN3] = {
	sprite = SPR_OBRK,
	frame = S,
	tics = 0,
	action = A_LinedefExecute,
	var1 = LE_PINCHPHASE,
	var2 = 0,
	nextstate = S_OLDCYBRAKDEMON_CHOOSE_ATTACK1
}

states[S_OLDCYBRAKDEMON_DIE1] = {
	sprite = SPR_OBRK,
	frame = S,
	tics = 1,
	action = A_Repeat,
	var1 = 1,
	var2 = S_OLDCYBRAKDEMON_DIE1,
	nextstate = S_OLDCYBRAKDEMON_DIE2
}

states[S_OLDCYBRAKDEMON_DIE2] = {
	sprite = SPR_OBRK,
	frame = S,
	tics = 2,
	action = A_BossScream,
	var1 = 0,
	//var2 = MT_SONIC3KBOSSEXPLODE, // Not necessary in 2.2; It uses this object by default
	nextstate = S_OLDCYBRAKDEMON_DIE3
}

states[S_OLDCYBRAKDEMON_DIE3] = {
	sprite = SPR_OBRK,
	frame = S,
	tics = 0,
	action = A_Repeat,
	var1 = 52,
	var2 = S_OLDCYBRAKDEMON_DIE2,
	nextstate = S_OLDCYBRAKDEMON_DIE4
}

states[S_OLDCYBRAKDEMON_DIE4] = {
	sprite = SPR_OBRK,
	frame = N,
	tics = 14,
	action = A_PlaySound,
	var1 = sfx_bedie2,
	var2 = 0,
	nextstate = S_OLDCYBRAKDEMON_DIE5
}

states[S_OLDCYBRAKDEMON_DIE5] = {
	sprite = SPR_OBRK,
	frame = O,
	tics = 7,
	nextstate = S_OLDCYBRAKDEMON_DIE6
}

states[S_OLDCYBRAKDEMON_DIE6] = {
	sprite = SPR_OBRK,
	frame = P,
	tics = 5,
	nextstate = S_OLDCYBRAKDEMON_DIE7
}

states[S_OLDCYBRAKDEMON_DIE7] = {
	sprite = SPR_OBRK,
	frame = Q,
	tics = 3,
	action = A_PlaySound,
	var1 = sfx_bgxpld,
	var2 = 0,
	nextstate = S_OLDCYBRAKDEMON_DIE8
}

states[S_OLDCYBRAKDEMON_DIE8] = {
	sprite = SPR_OBRK,
	frame = R,
	tics = -1,
	action = A_BossDeath
}

states[S_OLDCYBRAKDEMON_DEINVINCIBLERIZE] = {
	sprite = SPR_OBRK,
	frame = A,
	tics = 0,
	action = A_SetObjectFlags,
	var1 = MF_SPECIAL|MF_SHOOTABLE,
	var2 = 2,
	nextstate = S_OLDCYBRAKDEMON_IDLE
}

states[S_OLDCYBRAKDEMON_INVINCIBLERIZE] = {
	sprite = SPR_OBRK,
	frame = A,
	tics = 0,
	action = A_SetObjectFlags,
	var1 = MF_SPECIAL|MF_SHOOTABLE,
	var2 = 1,
	nextstate = 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] = {
	sprite = SPR_OELC,
	frame = A|FF_FULLBRIGHT,
	tics = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_INIT2
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_INIT2] = {
	sprite = SPR_OELC,
	frame = A|FF_FULLBRIGHT,
	tics = 0,
	action = A_RemoteAction,
	var1 = -1,
	var2 = S_OLDCYBRAKDEMON_INVINCIBLERIZE,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_PLAYSOUND
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_PLAYSOUND] = {
	sprite = SPR_OELC,
	frame = A|FF_FULLBRIGHT,
	tics = 0,
	action = A_PlayActiveSound,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER1
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER1] = {
	sprite = SPR_OELC,
	frame = A|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER2
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER2] = {
	sprite = SPR_OELC,
	frame = A|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER3
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER3] = {
	sprite = SPR_OELC,
	frame = B|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER4
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER4] = {
	sprite = SPR_OELC,
	frame = B|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER5
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER5] = {
	sprite = SPR_OELC,
	frame = C|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER6
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER6] = {
	sprite = SPR_OELC,
	frame = C|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER7
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER7] = {
	sprite = SPR_OELC,
	frame = D|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER8
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER8] = {
	sprite = SPR_OELC,
	frame = D|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER9
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER9] = {
	sprite = SPR_OELC,
	frame = E|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER10
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER10] = {
	sprite = SPR_OELC,
	frame = E|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER11
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER11] = {
	sprite = SPR_OELC,
	frame = F|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER12
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER12] = {
	sprite = SPR_OELC,
	frame = F|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER13
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER13] = {
	sprite = SPR_OELC,
	frame = G|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER14
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER14] = {
	sprite = SPR_OELC,
	frame = G|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER15
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER15] = {
	sprite = SPR_OELC,
	frame = H|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER16
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER16] = {
	sprite = SPR_OELC,
	frame = H|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER17
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER17] = {
	sprite = SPR_OELC,
	frame = I|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER18
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER18] = {
	sprite = SPR_OELC,
	frame = I|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER19
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER19] = {
	sprite = SPR_OELC,
	frame = J|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER20
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER20] = {
	sprite = SPR_OELC,
	frame = J|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER21
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER21] = {
	sprite = SPR_OELC,
	frame = K|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER22
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER22] = {
	sprite = SPR_OELC,
	frame = K|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER23
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER23] = {
	sprite = SPR_OELC,
	frame = L|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER24
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER24] = {
	sprite = SPR_OELC,
	frame = L|FF_FULLBRIGHT,
	tics = 1,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_PLAYSOUND
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_DIE1] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 0,
	action = A_RemoteAction,
	var1 = -1,
	var2 = S_OLDCYBRAKDEMON_DEINVINCIBLERIZE,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_DIE2
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_DIE2] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 0,
	action = A_SetObjectFlags,
	var1 = MF_PUSHABLE|MF_FIRE|MF_PAIN,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_DIE3
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_DIE3] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 20*TICRATE,
	action = A_Scream,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHECK] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 0,
	action = A_CheckRandom,
	var1 = 10,
	var2 = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMFAIL
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 0,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHOOSE
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHOOSE] = {
	sprite = SPR_NULL,
	frame = A,
	rics = 0,
	action = A_RandomStateRange,
	var1 = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM1,
	var2 = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM12,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM1
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM1] = {
	sprite = SPR_OELC,
	frame = A|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM2] = {
	sprite = SPR_OELC,
	frame = B|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM3] = {
	sprite = SPR_OELC,
	frame = C|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM4] = {
	sprite = SPR_OELC,
	frame = D|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM5] = {
	sprite = SPR_OELC,
	frame = E|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM6] = {
	sprite = SPR_OELC,
	frame = F|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM7] = {
	sprite = SPR_OELC,
	frame = G|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM8] = {
	sprite = SPR_OELC,
	frame = H|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM9] = {
	sprite = SPR_OELC,
	frame = I|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM10] = {
	sprite = SPR_OELC,
	frame = J|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM11] = {
	sprite = SPR_OELC,
	frame = K|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM12] = {
	sprite = SPR_OELC,
	frame = L|FF_FULLBRIGHT,
	tics = 1,
	action = A_PlaySound,
	var1 = sfx_s3k5c,
	var2 = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMFAIL] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 1,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 0,
	action = A_Repeat,
	var1 = 5*TICRATE,
	var2 = S_OLDCYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHECK,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE1
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE1] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 0,
	action = A_CapeChase,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE2
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE2] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 0,
	action = A_SpawnFreshCopy,
	nextstate = S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE3
}

states[S_OLDCYBRAKDEMONELECTRICBARRIER_REVIVE3] = {
	sprite = SPR_NULL,
	frame = A,
	tics = TICRATE,
	action = A_PlaySound,
	var1 = sfx_s3k79,
	var2 = 0
}

// 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
}

states[S_OLDCYBRAKDEMONMISSILE] = {
	sprite = SPR_RCKT, // Replace this with a 2.1 variant, if necessary
	frame = A|FF_FULLBRIGHT,
	tics = 1,
	action = A_SetObjectFlags2,
	var1 = MF2_RAILRING,
	var2 = 2,
	nextstate = S_OLDCYBRAKDEMONMISSILE
}

states[S_OLDCYBRAKDEMONMISSILE_EXPLODE1] = {
	sprite = SPR_RCKT,
	frame = B|FF_FULLBRIGHT,
	tics = 8,
	action = A_Explode,
	nextstate = S_OLDCYBRAKDEMONMISSILE_EXPLODE2
}

states[S_OLDCYBRAKDEMONMISSILE_EXPLODE2] = {
	sprite = SPR_RCKT,
	frame = C|FF_FULLBRIGHT,
	tics = 6,
	action = A_NapalmScatter,
	var1 = MT_OLDCYBRAKDEMON_NAPALM_FLAMES + (6<<16), // Replace MT_CYBRAKDEMON_NAPALM_FLAMES with MT_OLDCYBRAKDEMON_NAPALM_FLAMES
	var2 = 32 + (16<<16),
	nextstate = S_OLDCYBRAKDEMONMISSILE_EXPLODE3
}

states[S_OLDCYBRAKDEMONMISSILE_EXPLODE3] = {
	sprite = SPR_RCKT,
	frame = D|FF_FULLBRIGHT,
	tics = 4
}

// 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] = {
	sprite = SPR_OFLE,
	frame = A|FF_FULLBRIGHT|FF_TRANS50,
	tics = 15,
	nextstate = S_OLDCYBRAKDEMONFLAMESHOT_FLY2
}

states[S_OLDCYBRAKDEMONFLAMESHOT_FLY2] = {
	sprite = SPR_OFLE,
	frame = B|FF_FULLBRIGHT|FF_TRANS50,
	tics = 15,
	nextstate = S_OLDCYBRAKDEMONFLAMESHOT_FLY3
}

states[S_OLDCYBRAKDEMONFLAMESHOT_FLY3] = {
	sprite = SPR_OFLE,
	frame = C|FF_FULLBRIGHT|FF_TRANS50,
	tics = -1,
	nextstate = S_OLDCYBRAKDEMONFLAMESHOT_FLY3
}

states[S_OLDCYBRAKDEMONFLAMESHOT_DIE] = {
	sprite = SPR_OFLE,
	frame = C|FF_FULLBRIGHT|FF_TRANS50,
	tics = 0,
	action = A_SpawnObjectRelative,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_FLAMEREST
}

// 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] = {
	sprite = SPR_OFLA,
	frame = D|FF_FULLBRIGHT|FF_TRANS50,
	tics = 1,
	action = A_SetFuse,
	var1 = 10*TICRATE,
	var2 = 0,
	nextstate = S_OLDFLAME
}

states[S_OLDFLAME] = {
	sprite = SPR_OFLA,
	frame = FF_FULLBRIGHT|FF_TRANS50|FF_ANIMATE|A,
	tics = -1,
	var1 = 3,
	var2 = 3,
	nextstate = 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
}

states[S_OLDCYBRAKDEMONTARGETRETICULE1] = {
	sprite = SPR_TARG, // Replace this with a 2.1/2.2 variant
	frame = FF_TRANS50|FF_FULLBRIGHT|A,
	tics = 1,
	action = A_VileFire,
	var1 = sfx_s3k9d,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE2
}

states[S_OLDCYBRAKDEMONTARGETRETICULE2] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|G,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE3
}

states[S_OLDCYBRAKDEMONTARGETRETICULE3] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|B,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE4
}

states[S_OLDCYBRAKDEMONTARGETRETICULE4] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|G,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE5
}

states[S_OLDCYBRAKDEMONTARGETRETICULE5] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|C,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE6
}

states[S_OLDCYBRAKDEMONTARGETRETICULE6] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|G,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE7
}

states[S_OLDCYBRAKDEMONTARGETRETICULE7] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|D,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE8
}

states[S_OLDCYBRAKDEMONTARGETRETICULE8] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|G,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE9
}

states[S_OLDCYBRAKDEMONTARGETRETICULE9] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|E,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE10
}

states[S_OLDCYBRAKDEMONTARGETRETICULE10] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|G,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE11
}

states[S_OLDCYBRAKDEMONTARGETRETICULE11] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|F,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE12
}

states[S_OLDCYBRAKDEMONTARGETRETICULE12] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|G,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE13
}

states[S_OLDCYBRAKDEMONTARGETRETICULE13] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|A,
	tics = 1,
	action = A_VileFire,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_TARGET_DOT,
	nextstate = S_OLDCYBRAKDEMONTARGETRETICULE14
}

states[S_OLDCYBRAKDEMONTARGETRETICULE14] = {
	sprite = SPR_TARG,
	frame = FF_TRANS50|FF_FULLBRIGHT|G,
	tics = 1,
	action = A_Repeat,
	var1 = 6,
	var2 = S_OLDCYBRAKDEMONTARGETRETICULE2
}

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] = {
	sprite = SPR_OHOP,
	frame = A|FF_TRANS50|FF_FULLBRIGHT,
	tics = 2
}

// 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 mo.z-FRACUNIT <= mo.floorz
		// Going down? (Or up in reverse gravity?)
		if P_MobjFlip(mo)*mo.momz < 0
			// If going slower than a fracunit, just stop
			if abs(mo.momz) < FixedMul(FRACUNIT, mo.scale)
				/*
				mo.momx = 0
				mo.momy = 0
				mo.momz = 0
				*/
				
				// Napalm hack
				if mo.fuse
					mo.fuse = 1
				end
			end
		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
}

states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_FLY] = {
	sprite = SPR_NPLM,
	frame = FF_ANIMATE|A,
	tics = -1,
	var1 = 3,
	var2 = 2,
	nextstate = S_OLDCYBRAKDEMONNAPALMBOMBLARGE_FLY
}

states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE1] = {
	sprite = SPR_NPLM,
	frame = A,
	tics = 1,
	action = A_Explode,
	nextstate = S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE2
}

states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE2] = {
	sprite = SPR_NPLM,
	frame = A,
	tics = 1,
	action = A_NapalmScatter,
	var1 = MT_OLDCYBRAKDEMON_NAPALM_BOMB_SMALL + (6<<16),
	var2 = 128 + (40<<16),
	nextstate = S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE3
}

states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE3] = {
	sprite = SPR_NPLM,
	frame = A,
	tics = 1,
	action = A_NapalmScatter,
	var1 = MT_OLDCYBRAKDEMON_NAPALM_BOMB_SMALL + (1<<16),
	var2 = 32<<16,
	nextstate = S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE4
}

states[S_OLDCYBRAKDEMONNAPALMBOMBLARGE_DIE4] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 81,
	action = A_Scream
}

// 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] = {
	sprite = SPR_MNPL,
	frame = A,
	tics = 1,
	nextstate = S_OLDCYBRAKDEMONNAPALMBOMBSMALL
}

states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE1] = {
	sprite = SPR_MNPL,
	frame = A,
	tics = 1,
	action = A_Explode,
	nextstate = S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE2
}

states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE2] = {
	sprite = SPR_MNPL,
	frame = A,
	tics = 1,
	action = A_NapalmScatter,
	var1 = MT_OLDCYBRAKDEMON_NAPALM_FLAMES + (12<<16),
	var2 = 128 + (40<<16),
	nextstate = S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE3
}

states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE3] = {
	sprite = SPR_MNPL,
	frame = A,
	tics = 1,
	action = A_NapalmScatter,
	var1 = MT_OLDCYBRAKDEMON_NAPALM_FLAMES + (8<<16),
	var2 = 64 + (32<<16),
	nextstate = S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE4
}

states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE4] = {
	sprite = SPR_MNPL,
	frame = A,
	tics = 1,
	action = A_NapalmScatter,
	var1 = MT_OLDCYBRAKDEMON_NAPALM_FLAMES + (1<<16),
	var2 = 24<<16,
	nextstate = S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE5
}

states[S_OLDCYBRAKDEMONNAPALMBOMBSMALL_DIE5] = {
	sprite = SPR_NULL,
	frame = A,
	tics = 24,
	action = A_Scream
}

// 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
}

states[S_OLDCYBRAKDEMONNAPALMFLAME_FLY] = {
	sprite = SPR_SFLM, // Replace this with a 2.1/2.2 variant if it changes in the future
	frame = FF_FULLBRIGHT|FF_ANIMATE|A,
	tics = -1,
	var1 = 5,
	var2 = 2,
	nextstate = S_OLDCYBRAKDEMONNAPALMFLAME_FLY
}

states[S_OLDCYBRAKDEMONNAPALMFLAME_DIE] = {
	sprite = SPR_SFLM,
	frame = A|FF_FULLBRIGHT,
	tics = 0,
	action = A_SpawnObjectRelative,
	var1 = 0,
	var2 = MT_OLDCYBRAKDEMON_FLAMEREST
}

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