

// an include for DECORATE.aaa_FrankenHeads

//***Che THIS IS WHERE OLD CRAP CODE CRAWLS AWAY TO DIE
// Everything here is condemned, will be deleted when I get to replacing it
//   in all the places that call upon it.






/*
		TNT1 A 0 A_JumpIfInventory("IAmSfestMonster", 1, 3)
		TNT1 A 0 A_JumpIfInventory("HasLegbox", 1, 2)
		TNT1 A 0 A_SpawnItemEx("FrankenLeg",10,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION)
*/	
 
ACTOR FrankenLeg // tracer-based, x y and z are hard-coded to 10,0,0
{
	// legbox has 300 health and a logarythmic-like damage curve (max 200 at receiving 300).
	// all monsters who can have a leg (zombiemen, shotgun guys, labguys and imps) have much less health than that.
	// legbox terminates after inflicting 80 and more damage on its spawner -- which should be certain death.
	
	var int user_lifetime;
	
	damagefactor "Taunt", 0.0 damagefactor "Blood", 0.0 damagefactor "BlueBlood", 0.0
	damagefactor "Head", 0.0 damagefactor "MinorHead", 0.0 damagefactor "KillMe", 0.0
	damagefactor "Control", 0.0 damagefactor "Trample", 0.0 damagefactor "GibRemoving", 0.0
	damagefactor "Alert", 0.0 
	damagefactor "ExplosiveImpact", 0.0
	damagefactor "FriendlyExplosion", 0.0
	damagefactor "GibRemoving", 0.0 damagefactor "use", 0.0
	damagefactor "TeleportRemover", 0.0 damagefactor "Fire", 0.0 damagefactor "Stealth", 0.0
	
	damagefactor "Control", 0.0 // wth is this?
	damagefactor "SSG", 0.0 // specifically immune to SSG's short-range central hitscan
	
	damagefactor "YouMustDuck", 0.0
	
	// there are cases where a prone zombie's head is tucked in at z=1, blasting its damage at the legbox
	damagefactor "HeadStun", 0.0 
	damagefactor "HeadPlasma", 0.0
	damagefactor "Head", 0.0 
	damagefactor "MinorHead", 0.0
	
	damagefactor "Leg", 0.0
	
	damagefactor "SniperBullet", 1.5
	
	Health 300
	GibHealth 10000
	Radius 24
	Height 12
	DamageType Leg
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
	PainChance 255
	+NOGRAVITY
	+SHOOTABLE
	+NOTELEPORT
	+FORCERADIUSDMG // overcome others' AOE immunity
	+NORADIUSDMG // have AOE immunity to others' damage
	-SOLID
	+NODAMAGETHRUST
	+THRUGHOST
	+GHOST
	+SERVERSIDEONLY
	-COUNTKILL
	+NOTAUTOAIMED	
	+NOTARGET
	
	+QUICKTORETALIATE // always switch target to your last damager
	+PIERCEARMOR	
	

	States
	{
		Spawn:
			//TNT1 A 0 //NODELAY A_GiveInventory("TargetIsALegbox")
			TNT1 A 1 NODELAY
			TNT1 A 0 A_RearrangePointers(AAPTR_NULL, AAPTR_DEFAULT, AAPTR_TARGET, 0) // set tracer to target, erase target
			TNT1 A 0 A_GiveInventory("HasLegbox", 1, AAPTR_TRACER)
			TNT1 A 0 A_SetUserVar("user_lifetime", 60) //40) // default
			Goto Follow
		Follow:
			TNT1 A 0 A_CheckFlag("SOLID", 1, AAPTR_Tracer)
			Goto Vanish
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			"----" KKK 2 A_Warp(AAPTR_Tracer,10,0,0,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			// emulate BD21's leg flickering behavior. Only be present 40% of the time.
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_SetUserVar("user_lifetime", user_lifetime - 10)
			TNT1 A 0 A_JumpIf(user_lifetime <= 0, "Vanish")
			TNT1 A 4 //6 // the no-leg intangible phase
			TNT1 A 0 A_CheckFlag("CORPSE", "Vanish", AAPTR_TRACER) // extra check in case the monster forgets A_KillChildren on dying
			Loop
		Vanish:
			TNT1 A 0 A_TakeInventory("HasLegbox", 1, 0, AAPTR_TRACER)
			TNT1 A 1 A_NoBlocking
			TNT1 A 30
			Stop
			
		Pain.ExplosiveImpact: // moot: immune to splash damage!
		Pain.Explosive: // moot: direct hits of rocket or bfg KILL THE LEGBOX OUTRIGHT (300 damage)
		Pain.Bfg10k: 
			"----" JJ 1 A_Warp(AAPTR_Tracer,10,0,0,0,WARPF_NOCHECKPOSITION)
			Goto Pain

		Pain:
			// sit accumulating damage for 1 tic
			// unlike original BD, much higher chance to rip a leg using shotgun due to catching *all* pellets, not just one
			"----" J 1 A_Warp(AAPTR_Tracer,10,0,0,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0
			TNT1 A 1 A_NoBlocking
			TNT1 A 0 A_JumpIfHealthLower(25, "Pain550")
			TNT1 A 0 A_JumpIfHealthLower(50, "Pain500")
			TNT1 A 0 A_JumpIfHealthLower(75, "Pain450")
			TNT1 A 0 A_JumpIfHealthLower(100, "Pain400")
			TNT1 A 0 A_JumpIfHealthLower(125, "Pain350")
			TNT1 A 0 A_JumpIfHealthLower(150, "Pain300")
			TNT1 A 0 A_JumpIfHealthLower(175, "Pain250")
			TNT1 A 0 A_JumpIfHealthLower(200, "Pain200")
			TNT1 A 0 A_JumpIfHealthLower(225, "Pain150")
			TNT1 A 0 A_JumpIfHealthLower(250, "Pain100")
			TNT1 A 0 A_JumpIfHealthLower(275, "Pain50")
			TNT1 A 0 A_JumpIfHealthLower(288, "Pain35")
			TNT1 A 0 A_Explode(4,20,0)//hs //***Che: changed the damage curve, 4 instead of 20 at receiving below 8
			TNT1 A 0 HealThing(300)
			Goto Follow
		Pain35:
			TNT1 A 0
			XDT3 A 0 A_Explode(5,20,0)//hs
			TNT1 A 0 HealThing(300)
			Goto Follow
		Pain50:
			TNT1 A 0
			XDT3 A 0 A_Explode(10,20,0)//hs
			TNT1 A 0 HealThing(300)
			Goto Follow
		Pain100:
			TNT1 A 0
			XDT3 A 0 A_Explode(40,20,0)//hs
			TNT1 A 0 HealThing(300)
			Goto Follow
		Pain150:
			TNT1 A 0
			XDT3 A 0 A_Explode(80,20,0)//hs // from this much damage and up, recipient dies. No need to follow further
			Goto Vanish
		Pain200:
			TNT1 A 0
			XDT3 A 0 A_Explode(120,20,0)//hs
			Goto Vanish
		Pain250:
			TNT1 A 0
			XDT3 A 0 A_Explode(160,20,0)//hs
			Goto Vanish
		Pain300:
			TNT1 A 0
			XDT3 A 0 A_Explode(200,20,0)//hs
			Goto Vanish
		Pain350:
		Pain.SSG: //legbox immune, moot.
			TNT1 A 0
			XDT3 A 0 A_Explode(250,20,0)//hs
			Goto Vanish
		Pain400:
			TNT1 A 0
			XDT3 A 0 A_Explode(400,20,0)//hs
			Goto Vanish
		Pain450:
			TNT1 A 0
			XDT3 A 0 A_Explode(120,20,0)//hs //***Che: such strange damage curve... Copying from BD21 unthinkigly
			Goto Vanish
		Pain500:
			TNT1 A 0
			XDT3 A 0 A_Explode(140,20,0)//hs
			Goto Vanish
		Pain550:
			TNT1 A 0
			XDT3 A 0 A_Explode(160,20,0)//hs
			Goto Vanish
		Pain600:
			TNT1 A 0
			XDT3 A 0 A_Explode(180,20,0)//hs
			Goto Vanish
		Death:
			TNT1 A 0
			XDT3 A 0 A_Explode(200,20,0)//hs
			TNT1 A 0 A_TakeInventory("HasLegbox", 1, 0, AAPTR_TRACER)
			TNT1 A 1 A_NoBlocking
			Stop
		XDeath:
			TNT1 A 0
			XDT3 A 0 A_Explode(400,20,0)//hs
			TNT1 A 0 A_TakeInventory("HasLegbox", 1, 0, AAPTR_TRACER)
			TNT1 A 1 A_NoBlocking
			Stop
	}
}

Actor FrankenLeg100: FrankenLeg
{
	States
	{
		Spawn:
			TNT1 A 0 //NODELAY A_GiveInventory("TargetIsALegbox")
			TNT1 A 0 A_RearrangePointers(AAPTR_NULL, AAPTR_TARGET, AAPTR_DEFAULT, 0) // set tracer to target, erase tracer
			TNT1 A 0 A_GiveInventory("HasLegbox", 1, AAPTR_TRACER)
			TNT1 A 0 A_SetUserVar("user_lifetime", 150) //100)
			Goto Follow	
	}
}

actor FrankenHeadEmulateBD21
{
	
	var int user_x_org; // forward
	var int user_y_org; // right
	var int user_z_org; // up
	var int user_sleeping; // the user is still sleeping after spawn OR had lost the player at high slaughter optimizations
	var int user_hispeed; // for revenant & archvile, must clock MUCH faster
	var int user_countdown; // to despawn at extreme slaughter optimization levels
	
	// where A_SpawnItemEx is ("class", x, y, z , ...
	//       A_SpawnItem is   ("class", x, z, 0)
	
	damagefactor "Taunt", 0.0 damagefactor "Blood", 0.0 damagefactor "BlueBlood", 0.0
	damagefactor "Head", 0.0 damagefactor "MinorHead", 0.0 damagefactor "KillMe", 0.0
	damagefactor "Control", 0.0 damagefactor "Trample", 0.0 damagefactor "GibRemoving", 0.0
	damagefactor "Alert", 0.0 damagefactor "SSG", 1.5 damagefactor "ExplosiveImpact", 0.0
	damagefactor "GibRemoving", 0.0 damagefactor "use", 0.0 damagefactor "SHOTGUN", 1.4
	damagefactor "TeleportRemover", 0.0 damagefactor "Fire", 0.0 damagefactor "Stealth", 0.0
	
	damagefactor "FriendlyExplosion", 0.0
	
	damagefactor "YouMustDuck", 1.0
	
	damagefactor "SniperBullet", 2.0 // a headshot with Mosin-Nagant (60 damage) 
		//a) counts as stun, because it inflicts 120 > 118 threshold
		//b) inflicts 240 on the monster
	
	Health 2300
	Radius 7
	Height 18
	Mass 999999
	DamageType head
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
	PainChance 255
	
	+SERVERSIDEONLY
	
	//+ISMONSTER // for the master-minion link to work
	+QUICKTORETALIATE // always switch target to your last damager
	+PIERCEARMOR
	
	-COUNTKILL +NOTARGET
	+NOGRAVITY +NOTELEPORT +FORCERADIUSDMG -SOLID +NODAMAGETHRUST
	+THRUGHOST +NORADIUSDMG +GHOST  +NOTAUTOAIMED
	
	+NOTRIGGER //Disables all line action (crossing, impacting, using, etc.) for the actor.


	// initial flags, revert on activation
	-SHOOTABLE
	+THRUACTORS
	+NOPAIN	
	
	States
	{
		Pain.YouMustDuck:
			// do NOT convey as damage!
			TNT1 A 0
			TNT1 A 0 A_JumpIfHealthLower(2298, "Pain")
			TNT1 A 0 HealThing(2300, 2300)
			TNT1 A 0 A_GiveInventory("DuckYouFool", 1, AAPTR_TRACER)
			Goto Follow
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			// erase the target pointer just in case
			TNT1 A 0 A_RearrangePointers(AAPTR_NULL, AAPTR_DEFAULT, AAPTR_DEFAULT, 0)
			//TNT1 A 0 A_SetUserVar("user_z_org", 0)
			TNT1 A 0 A_SetUserVar("user_countdown", 100)
			TNT1 A 0 A_Jump(256, "WaitForActivation") // reliable because serverside
		WaitForActivation:
			TNT1 A 2 
			TNT1 A 0 A_JumpIf(!user_z_org, "WaitForActivation")
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			"----" N 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
		Sleep:
			TNT1 A 0
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")			
			"----" O 5 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("SOLID", "Sleep", AAPTR_Tracer) // a *very* high chance the deaths states don't have a sleep reset
			Goto Death
		Follow:
			TNT1 A 0
			TNT1 A 0 A_JumpIf(user_hispeed, "FollowSpeedy")
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepily")
			TNT1 A 0 A_JumpIf(user_sleeping < 0, "FollowSlaughter")
			"----" HHHH 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer) // extra check in case the master forgets A_KillChildren on dying
			// never exists on a client, so no need to worry about skipping jumps into a wrong state
			TNT1 A 0 A_CheckFlag("SOLID", "Follow", AAPTR_Tracer) // keep looping while master is not null and is not killed
			Goto Death
		FollowSlaughter:
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepily")
			"----" MMM 3 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSlaughter", AAPTR_Tracer) // keep looping while master is not null and is not killed
			Goto Death
		FollowSleepily:
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSleepily", AAPTR_Tracer)
			Goto Death
		FollowSpeedy:
			TNT1 A 0
			//TNT1 A 0 A_JumpIf(user_hispeed, "FollowSpeedy") // Face, meet palm. COPY-PASTING IS EVIL!
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepilySpeedy")
			TNT1 A 0 A_JumpIf(user_sleeping < 0, "FollowSlaughterSpeedy")
			"----" HHHHHHHH 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer) // extra check in case the master forgets A_KillChildren on dying
			// never exists on a client, so no need to worry about skipping jumps into a wrong state
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSpeedy", AAPTR_Tracer) // keep looping while master is not null and is not killed
			Goto Death
		FollowSlaughterSpeedy: // fucking revenants! I wanted 2 but had to accelerate to 1.
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepilySpeedy")
			"----" MMMMMMMM 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSlaughterSpeedy", AAPTR_Tracer) // keep looping while master is not null and is not killed
			Goto Death
		FollowSleepilySpeedy: // fucking revenants! I wanted 3, but noooo. Had to accelerate to 2.
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "FollowSpeedy")
			"----" OO 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "FollowSpeedy")
			"----" OO 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSleepilySpeedy", AAPTR_Tracer)
			Goto Death
			
		Reset:
			// a bit like those invulnerability frames in platformer games -- partly reproduces
			// the behavior of BD21's single-use headboxes that despawn on hit
			TNT1 A 0
			TNT1 A 0 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_SetDamageType("Head")
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 1)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			TNT1 A 0 A_JumpIf(health >= 2300, 3)
			TNT1 A 0 A_GiveInventory("Headache", (2300 - health) / 10, AAPTR_TRACER)
			"----" I 1 HealThing(2300, 2300)
			"----" II 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			TNT1 A 0 A_CheckFlag("SOLID", "Follow", AAPTR_Tracer)
			Goto Death
		Pain.Plasma:
		Pain.Plasma2:
		Pain.SuperPlasma:
		Pain.GreenFire:
			TNT1 A 0
			// it is called "exact" but it actually *emulates* BD21 behavior, 
			// replacing monsterside checks for "HasPlasmaWeapon" in target's inventory
			// with headbox-side checks for actual damage type
			TNT1 A 0 A_SetDamageType("HeadPlasma") 
			Goto Pain
		Pain.Explosive:
		Pain.ExplosiveImpact:
		Pain.SSG:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			// wait for 3 tics accumulating all damage received
			"----" HHH 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			Goto Pain	
		Pain.Saw: // "Saw" is the vertical swing damage of both chanisaw and axe
		Pain.Cut: // "Cut" is the horizontal swing damage of both chainsaw and axe
			TNT1 A 0
			TNT1 A 0 A_SetDamageType("Decaptate") 
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			Goto Pain
		Pain:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik") // should never happen -- instant death
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200")
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600")
			TNT1 A 0 A_JumpIfHealthLower(2025, "Pain550")
			TNT1 A 0 A_JumpIfHealthLower(2050, "Pain500")
			TNT1 A 0 A_JumpIfHealthLower(2075, "Pain450")
			TNT1 A 0 A_JumpIfHealthLower(2100, "Pain400")
			TNT1 A 0 A_JumpIfHealthLower(2125, "Pain350")
			TNT1 A 0 A_JumpIfHealthLower(2151, "Pain300")
			TNT1 A 0 A_JumpIfHealthLower(2176, "Pain250")
			TNT1 A 0 A_JumpIfHealthLower(2184, "Pain234")//Shotgun
			TNT1 A 0 A_JumpIfHealthLower(2201, "Pain200")
			TNT1 A 0 A_JumpIfHealthLower(2226, "Pain150")
			TNT1 A 0 A_JumpIfHealthLower(2251, "Pain100")
			TNT1 A 0 A_JumpIfHealthLower(2276, "Pain50")// took 25 damage
			TNT1 A 0 A_JumpIfHealthLower(2281, "Pain40")//took 20 damage
			TNT1 A 0 A_JumpIfHealthLower(2285, "Pain32")//took 16 damage
			TNT1 A 0 A_JumpIfHealthLower(2286, "Pain30")//took 15 damage
			TNT1 A 0 A_JumpIfHealthLower(2287, "Pain28")//took 14 damage
			TNT1 A 0 A_JumpIfHealthLower(2288, "Pain26")//took 13 damage
			TNT1 A 0 A_JumpIfHealthLower(2290, "Pain22")//took 11 damage
			TNT1 A 0 A_JumpIfHealthLower(2291, "Pain20")//took 10 damage
			TNT1 A 0 A_JumpIfHealthLower(2296, "Pain10")//took 5 damage
			Goto Pain20 // took less than 5 damage -- a quirks mode
			
		Pain10:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(10,5,0)
			Goto Reset
		Pain20:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(20,5,0)
			Goto Reset
		Pain22:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(22,5,0)
			Goto Reset
		Pain26:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(26,5,0)
			Goto Reset
		Pain28:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(28,5,0)
			Goto Reset
		Pain30:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(30,5,0)
			Goto Reset
		Pain32:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(32,5,0)
			Goto Reset
		Pain40:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(40,5,0)
			Goto Reset
		Pain50:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(50,5,0)
			Goto Reset
		Pain100:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(100,5,0)
			Goto Reset
		Pain150:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(150,5,0)
			Goto Reset
		Pain200:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(200,5,0)
			Goto Reset
		Pain234:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(234,5,0)
			Goto Reset
		Pain250:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(250,5,0)
			Goto Reset
		Pain300:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(300,5,0)
			Goto Reset
		Pain350:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(350,5,0)
			Goto Reset
		Pain400:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(400,5,0)
			Goto Reset
		Pain450:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(450,5,0)
			Goto Reset
		Pain500:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(500,5,0)
			Goto Reset
		Pain550:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(550,5,0)
			Goto Reset
		Pain600:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(600,5,0)
			Goto Reset
		Pain1200:
			TNT1 A 0 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(1200,5,0)
			Goto Reset
		PainOopsnik:	
			TNT1 A 0
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_SetDamageType("Desintegrate")
			TNT1 A 0 A_Explode(32766,5,0)
		Death:
			TNT1 A 0
			TNT1 A 1 A_NoBlocking
			Stop
	}
}

ACTOR FrankenHeadFBDAdvanced // a partial clone of FrankenHeadEmulateBD21: the core code is the same but NO common ancestor
{
	
	var int user_x_org;
	var int user_y_org;
	var int user_z_org;
	var int user_sleeping;
	var int user_hispeed; 
	var int user_countdown;
	
	damagefactor "Taunt", 0.0 damagefactor "Blood", 0.0 damagefactor "BlueBlood", 0.0
	damagefactor "Head", 0.0 damagefactor "MinorHead", 0.0 damagefactor "KillMe", 0.0
	damagefactor "Control", 0.0 damagefactor "Trample", 0.0 damagefactor "GibRemoving", 0.0
	damagefactor "Alert", 0.0 damagefactor "SSG", 1.5 damagefactor "ExplosiveImpact", 0.0
	damagefactor "GibRemoving", 0.0 damagefactor "use", 0.0 damagefactor "SHOTGUN", 1.4
	damagefactor "TeleportRemover", 0.0 damagefactor "Fire", 0.0 damagefactor "Stealth", 0.0
	
	damagefactor "FriendlyExplosion", 0.0
	damagefactor "YouMustDuck", 1.0
	damagefactor "Leg", 0.0
	
	damagefactor "SniperBullet", 2.0 // a headshot with Mosin-Nagant (60 damage) 
		//a) counts as stun, because it inflicts 120 > 118 threshold
		//b) inflicts 240 on the monster	
	
	Health 2300
	Radius 7
	Height 18
	Mass 999999
	DamageType head
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
	PainChance 255
	
	+SERVERSIDEONLY

	//+ISMONSTER // for the master-minion link to work
	+QUICKTORETALIATE // always switch target to your last damager
	+PIERCEARMOR

	-COUNTKILL +NOTARGET
	+NOGRAVITY +NOTELEPORT +FORCERADIUSDMG -SOLID +NODAMAGETHRUST
	+THRUGHOST +NORADIUSDMG +GHOST  +NOTAUTOAIMED
	+NOTRIGGER //Disables all line action (crossing, impacting, using, etc.) for the actor.


	// initial flags, revert on activation
	-SHOOTABLE
	+THRUACTORS
	+NOPAIN	
	States
	{
		Pain.YouMustDuck:
			// do NOT convey as damage!
			TNT1 A 0
			TNT1 A 0 A_JumpIfHealthLower(2298, "Pain")
			TNT1 A 0 HealThing(2)
			TNT1 A 0 A_GiveInventory("DuckYouFool", 1, AAPTR_TRACER)
			Goto Follow
		
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			// erase the target pointer just in case
			TNT1 A 0 A_RearrangePointers(AAPTR_NULL, AAPTR_DEFAULT, AAPTR_DEFAULT, 0)			
			//TNT1 A 0 A_SetUserVar("user_z_org", 0)
			TNT1 A 0 A_SetUserVar("user_countdown", 100)
			TNT1 A 0 A_Jump(256, "WaitForActivation") // reliable because serverside
		WaitForActivation:
			TNT1 A 2 
			TNT1 A 0 A_JumpIf(!user_z_org, "WaitForActivation")
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			"----" N 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
		Sleep:
			TNT1 A 0
			"----" O 5 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")			
			TNT1 A 0 A_CheckFlag("SOLID", "Sleep", AAPTR_Tracer) // a *very* high chance the deaths states don't have a sleep reset
			Goto Death
		Follow:
			TNT1 A 0
			TNT1 A 0 A_JumpIf(user_hispeed, "FollowSpeedy")
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepily")
			TNT1 A 0 A_JumpIf(user_sleeping < 0, "FollowSlaughter")
			"----" HHHH 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer) // extra check in case the master forgets A_KillChildren on dying
			// never exists on a client, so no need to worry about skipping jumps into a wrong state
			TNT1 A 0 A_CheckFlag("SOLID", "Follow", AAPTR_Tracer) // keep looping while master is not null and is not killed
			Goto Death
		FollowSlaughter:
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepily")
			"----" MMM 3 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSlaughter", AAPTR_Tracer) // keep looping while master is not null and is not killed
			Goto Death
		FollowSleepily:
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSleepily", AAPTR_Tracer)
			Goto Death
		FollowSpeedy:
			TNT1 A 0
			//TNT1 A 0 A_JumpIf(user_hispeed, "FollowSpeedy") // Face, meet palm. COPY-PASTING IS EVIL!
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepilySpeedy")
			TNT1 A 0 A_JumpIf(user_sleeping < 0, "FollowSlaughterSpeedy")
			"----" HHHHHHHH 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer) // extra check in case the master forgets A_KillChildren on dying
			// never exists on a client, so no need to worry about skipping jumps into a wrong state
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSpeedy", AAPTR_Tracer) // keep looping while master is not null and is not killed
			Goto Death
		FollowSlaughterSpeedy: // fucking revenants! I wanted 2 but had to accelerate to 1.
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepilySpeedy")
			"----" MMMMMMMM 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSlaughterSpeedy", AAPTR_Tracer) // keep looping while master is not null and is not killed
			Goto Death
		FollowSleepilySpeedy: // fucking revenants! I wanted 3, but noooo. Had to accelerate to 2.
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "FollowSpeedy")
			"----" OO 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "FollowSpeedy")
			"----" OO 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Tracer)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSleepilySpeedy", AAPTR_Tracer)
			Goto Death
			
		Reset:
			// Unlike the "exact" profile, this one has NO invulnerability frames -- it uses an *accumulation* frame instead
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_JumpIf(health >= 2300, 3)
			TNT1 A 0 A_GiveInventory("Headache", (2300 - health) / 10, AAPTR_TRACER)			
			TNT1 A 0 HealThing(2300, 2300)
			"----" HHH 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			TNT1 A 0 A_CheckFlag("SOLID", "Follow", AAPTR_Tracer)
			Goto Death
			
		Pain.Plasma:
		Pain.Plasma2:
		Pain.SuperPlasma:
		Pain.GreenFire:
			TNT1 A 0
			// replacing monsterside checks for "HasPlasmaWeapon" in target's inventory
			// with headbox-side checks for actual damage type
			
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200") // took 500 damage -- cap and relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600") // took 300 damage -- relay as HeadStun
			
			TNT1 A 0 A_SetDamageType("HeadPlasma") 
			
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_JumpIfHealthLower(2291, 2)//took 10 damage
			TNT1 A 0 A_Explode(20,5,0)
			Goto Reset
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset			
			
		Pain.Explosive:
		Pain.ExplosiveImpact:
		Pain.SSG:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			"----" HHH 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
		Pain:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200") // took 500 damage -- cap and relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600") // took 300 damage -- relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2176, "PainStun") // took 125 damage or more
			TNT1 A 0 A_JumpIfHealthLower(2291, "PainLinear2x")//took 10 damage
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(20,5,0)
			Goto Reset
		Pain.Saw: // "Saw" is the vertical swing damage of both chanisaw and axe
		Pain.Cut: // "Cut" is the horizontal swing damage of both chainsaw and axe
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200") // took 500 damage -- cap and relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600") // took 300 damage -- relay as HeadStun
			
			TNT1 A 0 A_SetDamageType("Decaptate") 
			
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_JumpIfHealthLower(2291, 2)//took 10 damage
			TNT1 A 0 A_Explode(20,5,0)  // minimum 20
			Goto Reset
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset
			
		PainStun:	
			TNT1 A 0
			TNT1 A 0 A_SetDamageType("HeadStun")
		PainLinear2x:
			TNT1 A 0
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset			
		Pain600:
			TNT1 A 0 
			TNT1 A 0 A_SetDamageType("HeadStun")
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(600,5,0)
			Goto Reset
		Pain1200:
			TNT1 A 0 
			TNT1 A 0 A_SetDamageType("HeadStun")
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(1200,5,0)
			Goto Reset
		PainOopsnik:	
			TNT1 A 0
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_SetDamageType("Desintegrate")
			TNT1 A 0 A_Explode(32766,5,0)
		Death:
		Vanish:
			TNT1 A 0
			TNT1 A 1 A_NoBlocking
			Stop
	}
}

Actor FrankenHeadDying: FrankenHeadFBDAdvanced // duing guy's, ignores the SOLID flag
// must delete manually at all costs, does NOT die with the monster.

{
	damagefactor "YouMustDuck", 0.0 // immune to ssg alerter
	States 
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			// erase the target pointer just in case
			TNT1 A 0 A_RearrangePointers(AAPTR_NULL, AAPTR_DEFAULT, AAPTR_DEFAULT, 0)			
			TNT1 A 0 A_SetUserVar("user_countdown", 100)
			TNT1 A 0 A_Jump(256, "WaitForActivation") // reliable because serverside
		WaitForActivation:
			TNT1 A 1 
			TNT1 A 0 A_JumpIf(!user_z_org, "WaitForActivation")
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			"----" N 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			Goto Follow
		Follow:
			TNT1 A 0
			"----" NN 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("SHOOTABLE", 1, AAPTR_Tracer)
			Goto Vanish
			"----" NN 2 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			//Loop
			TNT1 A 0 A_CheckFlag("SHOOTABLE", "Follow", AAPTR_Tracer)
			Goto Vanish
			
			
// had to cLONE *all* these states because Reset now checks for the Solid flag
		Reset:
			// Unlike the "exact" profile, this one has NO invulnerability frames -- it uses an *accumulation* frame instead
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_JumpIf(health >= 2300, 3)
			TNT1 A 0 A_GiveInventory("Headache", (2300 - health) / 10, AAPTR_TRACER)			
			TNT1 A 0 HealThing(2300, 2300)
			"----" HHH 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			// do NOT check solid in this one!
			TNT1 A 0 A_Jump(256, "Follow") // allows inheritance, is reliable because serverside only
			Goto Follow

		Pain.Plasma:
		Pain.Plasma2:
		Pain.SuperPlasma:
		Pain.GreenFire:
			TNT1 A 0
			// replacing monsterside checks for "HasPlasmaWeapon" in target's inventory
			// with headbox-side checks for actual damage type
			
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200") // took 500 damage -- cap and relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600") // took 300 damage -- relay as HeadStun
			
			TNT1 A 0 A_SetDamageType("HeadPlasma") 
			
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_JumpIfHealthLower(2291, 2)//took 10 damage
			TNT1 A 0 A_Explode(20,5,0)
			Goto Reset
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset			
			
		Pain.Explosive:
		Pain.ExplosiveImpact:
		Pain.SSG:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			"----" HHH 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
		Pain:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200") // took 500 damage -- cap and relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600") // took 300 damage -- relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2176, "PainStun") // took 125 damage or more
			TNT1 A 0 A_JumpIfHealthLower(2291, "PainLinear2x")//took 10 damage
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(20,5,0)
			Goto Reset
		Pain.Saw: // "Saw" is the vertical swing damage of both chanisaw and axe
		Pain.Cut: // "Cut" is the horizontal swing damage of both chainsaw and axe
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200") // took 500 damage -- cap and relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600") // took 300 damage -- relay as HeadStun
			
			TNT1 A 0 A_SetDamageType("Decaptate") 
			
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_JumpIfHealthLower(2291, 2)//took 10 damage
			TNT1 A 0 A_Explode(20,5,0)  // minimum 20
			Goto Reset
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset
			
		PainStun:	
			TNT1 A 0
			TNT1 A 0 A_SetDamageType("HeadStun")
		PainLinear2x:
			TNT1 A 0
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset			
		Pain600:
			TNT1 A 0 
			TNT1 A 0 A_SetDamageType("HeadStun")
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(600,5,0)
			Goto Reset
		Pain1200:
			TNT1 A 0 
			TNT1 A 0 A_SetDamageType("HeadStun")
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(1200,5,0)
			Goto Reset
			
	}
}



Actor FrankenHeadDyingNoble: FrankenHeadDying
{
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 24
	Decal GreenBloodSplat

	//for debugging
	XScale 1.71
	YScale 1.33
}



actor FrankenTankWeakSpot: FrankenHeadFBDAdvanced {
	damagefactor "Shotgun", 0.4
	
	// vulnerable to flames:
	-NORADIUSDMG 
	damagefactor "Fire", 0.5
	damagefactor "Flames", 0.5
	damagefactor "Burn", 0.5
	damagefactor "GreenFire", 0.5	
	
	// but still immune to explosion splash damage:
	//  (otherwise, artillery tank kills itself by launching its rockets)
	damagefactor "ExplosiveImpact", 0.0
	damagefactor "FriendlyExplosion", 0.0
	damagefactor "Shrapnel", 0.0 // if the hand grenade wants in on the action, it can use its "Shotgun" type projectiles
	damagefactor "CauseWaterSplash", 0.0
	damagefactor "TeleportRemover", 0.0
	DamageFactor "CallingTheBaronAFaggot", 0.0
	damagefactor "Avoid", 0.0
	damagefactor "DontCallTheBaron", 0.0
	DamageFactor "CauseSplash", 0.0 DamageFactor "CauseObjectsToSplashSlime", 0.0 DamageFactor "CauseObjectsToSplashNukage", 0.0
	DamageFactor "CauseObjectsToSplashBlood", 0.0 DamageFactor "CauseObjectsToSplashLava", 0.0
	damagefactor "Blood", 0.0 damagefactor "BlueBlood", 0.0 damagefactor "GreenBlood", 0.0
	
	-THRUACTORS
	+THRUSPECIES
	Species "EnemyTank"
	Radius 24
	Height 44
	
	//for debugging
	XScale 3.43
	YScale 2.44	
	
	BloodType "TankEngineBlood", "TankEngineBlood", "TankEngineBlood"
}


actor FrankenMechCockpit: FrankenHeadFBDAdvanced {
	damagefactor "Shotgun", 1.0
	-THRUACTORS
	+THRUSPECIES
	Species "EnemyMech"
	Radius 24
	Height 44
	
	//for debugging
	XScale 3.43
	YScale 2.44		
	
	damagefactor "ExplosiveImpact", 0.0
	damagefactor "FriendlyExplosion", 0.0
	damagefactor "Shrapnel", 0.0 
	damagefactor "CauseWaterSplash", 0.0
	damagefactor "TeleportRemover", 0.0
	DamageFactor "CallingTheBaronAFaggot", 0.0
	damagefactor "Avoid", 0.0
	damagefactor "DontCallTheBaron", 0.0
	DamageFactor "CauseSplash", 0.0 DamageFactor "CauseObjectsToSplashSlime", 0.0 DamageFactor "CauseObjectsToSplashNukage", 0.0
	DamageFactor "CauseObjectsToSplashBlood", 0.0 DamageFactor "CauseObjectsToSplashLava", 0.0
	damagefactor "Blood", 0.0 damagefactor "BlueBlood", 0.0 damagefactor "GreenBlood", 0.0	
	
	BloodType "MecCockpitBlood", "MecCockpitBlood", "MecCockpitBlood"
	
/*
	damagefactor "RailAvoid", 1.0 // NO USE: it has thrughost and headboxes are ghosts!
	PainChance "RailAvoid", 255			
	
	States 
	{
		Pain.RailAvoid:
			// do NOT convey as damage!
			TNT1 A 0
			TNT1 A 0 A_JumpIfHealthLower(2290, "Pain")
			TNT1 A 0 HealThing(10)
			TNT1 A 0 A_GiveInventory("DuckYouFool", 1, AAPTR_TRACER)
			Goto Follow		
	}
*/	
}


actor FrankenHeadEmulateBD21Sfest 
	// Higher performance but the damage is in practice not traceable back to inflictor.
	// Meaning headshots do not aggro and do not count towards target switching
{
	
	var int user_x_org; // forward
	var int user_y_org; // right
	var int user_z_org; // up
	var int user_sleeping; // the user is still sleeping after spawn OR had lost the player at high slaughter optimizations
	var int user_hispeed; // for revenant & archvile, must clock MUCH faster
	var int user_countdown; // to despawn at extreme slaughter optimization levels
	
	// where A_SpawnItemEx is ("class", x, y, z , ...
	//       A_SpawnItem is   ("class", x, z, 0)
	
	damagefactor "Taunt", 0.0 damagefactor "Blood", 0.0 damagefactor "BlueBlood", 0.0
	damagefactor "Head", 0.0 damagefactor "MinorHead", 0.0 damagefactor "KillMe", 0.0
	damagefactor "Control", 0.0 damagefactor "Trample", 0.0 damagefactor "GibRemoving", 0.0
	damagefactor "Alert", 0.0 damagefactor "SSG", 1.5 damagefactor "ExplosiveImpact", 0.0
	damagefactor "GibRemoving", 0.0 damagefactor "use", 0.0 damagefactor "SHOTGUN", 1.4
	damagefactor "TeleportRemover", 0.0 damagefactor "Fire", 0.0 damagefactor "Stealth", 0.0
	
	damagefactor "FriendlyExplosion", 0.0
	damagefactor "YouMustDuck", 1.0
	damagefactor "Leg", 0.0
	
	damagefactor "SniperBullet", 2.0 // a headshot with Mosin-Nagant (60 damage) 
		//a) counts as stun, because it inflicts 120 > 118 threshold
		//b) inflicts 240 on the monster		
	
	Health 2300
	Radius 7
	Height 18
	Mass 999999
	DamageType head
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
	PainChance 255
	
	+SERVERSIDEONLY
	
	+ISMONSTER
	
	-COUNTKILL +NOTARGET
	+NOGRAVITY +NOTELEPORT +FORCERADIUSDMG -SOLID +NODAMAGETHRUST
	+THRUGHOST +NORADIUSDMG +GHOST  +NOTAUTOAIMED
	
	+NOTRIGGER //Disables all line action (crossing, impacting, using, etc.) for the actor.

	
	// initial flags, revert on activation
	-SHOOTABLE
	+THRUACTORS
	+NOPAIN	
	
	States
	{
		Pain.YouMustDuck:
			// do NOT convey as damage!
			TNT1 A 0
			TNT1 A 0 A_JumpIfHealthLower(2298, "Pain")
			TNT1 A 0 HealThing(2)
			TNT1 A 0 A_GiveInventory("DuckYouFool", 1, AAPTR_MASTER)
			Goto Follow	
			
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			//TNT1 A 0 A_SetUserVar("user_z_org", 0)
			TNT1 A 0 A_SetUserVar("user_countdown", 100)
			TNT1 A 0 A_Jump(256, "WaitForActivation") // reliable because serverside
		WaitForActivation:
			TNT1 A 2 
			TNT1 A 0 A_JumpIf(!user_z_org, "WaitForActivation")
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			"----" N 2 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
		Sleep:
			TNT1 A 0
			"----" O 5 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")			
			TNT1 A 0 A_CheckFlag("SOLID", "Sleep", AAPTR_Master) // a *very* high chance the deaths states don't have a sleep reset
			Goto Death
		Follow:
			TNT1 A 0
			TNT1 A 0 A_JumpIf(user_hispeed, "FollowSpeedy")
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepily")
			TNT1 A 0 A_JumpIf(user_sleeping < 0, "FollowSlaughter")
			"----" HHHH 2 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master) // extra check in case the master forgets A_KillChildren on dying
			// never exists on a client, so no need to worry about skipping jumps into a wrong state
			TNT1 A 0 A_CheckFlag("SOLID", "Follow", AAPTR_Master) // keep looping while master is not null and is not killed
			Goto Death
		FollowSlaughter:
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepily")
			"----" MMM 3 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSlaughter", AAPTR_Master) // keep looping while master is not null and is not killed
			Goto Death
		FollowSleepily:
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSleepily", AAPTR_Master)
			Goto Death
		FollowSpeedy:
			TNT1 A 0
			//TNT1 A 0 A_JumpIf(user_hispeed, "FollowSpeedy") // Face, meet palm. COPY-PASTING IS EVIL!
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepilySpeedy")
			TNT1 A 0 A_JumpIf(user_sleeping < 0, "FollowSlaughterSpeedy")
			"----" HHHHHHHH 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master) // extra check in case the master forgets A_KillChildren on dying
			// never exists on a client, so no need to worry about skipping jumps into a wrong state
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSpeedy", AAPTR_Master) // keep looping while master is not null and is not killed
			Goto Death
		FollowSlaughterSpeedy: // fucking revenants! I wanted 2 but had to accelerate to 1.
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepilySpeedy")
			"----" MMMMMMMM 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSlaughterSpeedy", AAPTR_Master) // keep looping while master is not null and is not killed
			Goto Death
		FollowSleepilySpeedy: // fucking revenants! I wanted 3, but noooo. Had to accelerate to 2.
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "FollowSpeedy")
			"----" OO 2 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "FollowSpeedy")
			"----" OO 2 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSleepilySpeedy", AAPTR_Master)
			Goto Death
			
		Reset:
			// a bit like those invulnerability frames in platformer games -- partly reproduces
			// the behavior of BD21's single-use headboxes that despawn on hit
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 1)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			TNT1 A 0 A_JumpIf(health >= 2300, 3)
			TNT1 A 0 A_GiveInventory("Headache", (2300 - health) / 10, AAPTR_Master)
			"----" I 3 HealThing(2300, 2300)
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			TNT1 A 0 A_CheckFlag("SOLID", "Follow", AAPTR_MASTER)
			Goto Death
		Pain.Explosive:
		Pain.ExplosiveImpact:
		Pain.SSG:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			"----" HHH 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			Goto Pain	
		Pain:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik") // should never happen -- instant death
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200")
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600")
			TNT1 A 0 A_JumpIfHealthLower(2025, "Pain550")
			TNT1 A 0 A_JumpIfHealthLower(2050, "Pain500")
			TNT1 A 0 A_JumpIfHealthLower(2075, "Pain450")
			TNT1 A 0 A_JumpIfHealthLower(2100, "Pain400")
			TNT1 A 0 A_JumpIfHealthLower(2125, "Pain350")
			TNT1 A 0 A_JumpIfHealthLower(2151, "Pain300")
			TNT1 A 0 A_JumpIfHealthLower(2176, "Pain250")
			TNT1 A 0 A_JumpIfHealthLower(2184, "Pain234")//Shotgun
			TNT1 A 0 A_JumpIfHealthLower(2201, "Pain200")
			TNT1 A 0 A_JumpIfHealthLower(2226, "Pain150")
			TNT1 A 0 A_JumpIfHealthLower(2251, "Pain100")
			TNT1 A 0 A_JumpIfHealthLower(2276, "Pain50")// took 25 damage
			TNT1 A 0 A_JumpIfHealthLower(2281, "Pain40")//took 20 damage
			TNT1 A 0 A_JumpIfHealthLower(2285, "Pain32")//took 16 damage
			TNT1 A 0 A_JumpIfHealthLower(2286, "Pain30")//took 15 damage
			TNT1 A 0 A_JumpIfHealthLower(2287, "Pain28")//took 14 damage
			TNT1 A 0 A_JumpIfHealthLower(2288, "Pain26")//took 13 damage
			TNT1 A 0 A_JumpIfHealthLower(2290, "Pain22")//took 11 damage
			TNT1 A 0 A_JumpIfHealthLower(2291, "Pain20")//took 10 damage
			TNT1 A 0 A_JumpIfHealthLower(2296, "Pain10")//took 5 damage
			Goto Pain20 // took less than 5 damage -- a quirks mode
			
		Pain.Plasma:
		Pain.Plasma2:
		Pain.SuperPlasma:
		Pain.GreenFire:
			TNT1 A 0
			// it is called "exact" but it actually *emulates* BD21 behavior, 
			// replacing monsterside checks for "HasPlasmaWeapon" in target's inventory
			// with headbox-side checks for actual damage type
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik") // should never happen -- instant death
			TNT1 A 0 A_JumpIfHealthLower(1800, "PlasmaPain1200")
			TNT1 A 0 A_JumpIfHealthLower(2000, "PlasmaPain600")
			TNT1 A 0 A_JumpIfHealthLower(2025, "PlasmaPain550")
			TNT1 A 0 A_JumpIfHealthLower(2050, "PlasmaPain500")
			TNT1 A 0 A_JumpIfHealthLower(2075, "PlasmaPain450")
			TNT1 A 0 A_JumpIfHealthLower(2100, "PlasmaPain400")
			TNT1 A 0 A_JumpIfHealthLower(2125, "PlasmaPain350")
			TNT1 A 0 A_JumpIfHealthLower(2151, "PlasmaPain300")
			TNT1 A 0 A_JumpIfHealthLower(2176, "PlasmaPain250")
			TNT1 A 0 A_JumpIfHealthLower(2184, "PlasmaPain234")//Shotgun
			TNT1 A 0 A_JumpIfHealthLower(2201, "PlasmaPain200")
			TNT1 A 0 A_JumpIfHealthLower(2226, "PlasmaPain150")
			TNT1 A 0 A_JumpIfHealthLower(2251, "PlasmaPain100")
			TNT1 A 0 A_JumpIfHealthLower(2276, "PlasmaPain50")// took 25 damage
			TNT1 A 0 A_JumpIfHealthLower(2281, "PlasmaPain40")//took 20 damage
			TNT1 A 0 A_JumpIfHealthLower(2285, "PlasmaPain32")//took 16 damage
			TNT1 A 0 A_JumpIfHealthLower(2286, "PlasmaPain30")//took 15 damage
			TNT1 A 0 A_JumpIfHealthLower(2287, "PlasmaPain28")//took 14 damage
			TNT1 A 0 A_JumpIfHealthLower(2288, "PlasmaPain26")//took 13 damage
			TNT1 A 0 A_JumpIfHealthLower(2290, "PlasmaPain22")//took 11 damage
			TNT1 A 0 A_JumpIfHealthLower(2291, "PlasmaPain20")//took 10 damage
			TNT1 A 0 A_JumpIfHealthLower(2296, "PlasmaPain10")//took 5 damage
			Goto PlasmaPain20 // took less than 5 damage -- a quirks mode		
		Pain.Saw:
		Pain.Cut:
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik") // should never happen -- instant death
			TNT1 A 0 A_JumpIfHealthLower(1800, "DecaptatePain1200")
			TNT1 A 0 A_JumpIfHealthLower(2000, "DecaptatePain600")
			TNT1 A 0 A_JumpIfHealthLower(2025, "DecaptatePain550")
			TNT1 A 0 A_JumpIfHealthLower(2050, "DecaptatePain500")
			TNT1 A 0 A_JumpIfHealthLower(2075, "DecaptatePain450")
			TNT1 A 0 A_JumpIfHealthLower(2100, "DecaptatePain400")
			TNT1 A 0 A_JumpIfHealthLower(2125, "DecaptatePain350")
			TNT1 A 0 A_JumpIfHealthLower(2151, "DecaptatePain300")
			TNT1 A 0 A_JumpIfHealthLower(2176, "DecaptatePain250")
			TNT1 A 0 A_JumpIfHealthLower(2184, "DecaptatePain234")//Shotgun
			TNT1 A 0 A_JumpIfHealthLower(2201, "DecaptatePain200")
			TNT1 A 0 A_JumpIfHealthLower(2226, "DecaptatePain150")
			TNT1 A 0 A_JumpIfHealthLower(2251, "DecaptatePain100")
			TNT1 A 0 A_JumpIfHealthLower(2276, "DecaptatePain50")// took 25 damage
			TNT1 A 0 A_JumpIfHealthLower(2281, "DecaptatePain40")//took 20 damage
			TNT1 A 0 A_JumpIfHealthLower(2285, "DecaptatePain32")//took 16 damage
			TNT1 A 0 A_JumpIfHealthLower(2286, "DecaptatePain30")//took 15 damage
			TNT1 A 0 A_JumpIfHealthLower(2287, "DecaptatePain28")//took 14 damage
			TNT1 A 0 A_JumpIfHealthLower(2288, "DecaptatePain26")//took 13 damage
			TNT1 A 0 A_JumpIfHealthLower(2290, "DecaptatePain22")//took 11 damage
			TNT1 A 0 A_JumpIfHealthLower(2291, "DecaptatePain20")//took 10 damage
			TNT1 A 0 A_JumpIfHealthLower(2296, "DecaptatePain10")//took 5 damage
			Goto DecaptatePain20 // took less than 5 damage -- a quirks mode					
		Pain10:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(10, "Head") // LOWER than the 20 for damage below 5. This is a quirk.
			//XDT3 A 0 A_Explode(10,15, 0, 0, 15)//hs
			Goto Reset
		Pain20:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(20,"Head")
			Goto Reset
		Pain22:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(22,"Head")
			Goto Reset
		Pain26:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(26,"Head")
			Goto Reset
		Pain28:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(28,"Head")
			Goto Reset
		Pain30:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(30,"Head")
			Goto Reset
		Pain32:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(32,"Head")
			Goto Reset
		Pain40:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(40,"Head")
			Goto Reset
		Pain50:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(50,"Head")
			Goto Reset
		Pain100:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(100,"Head")
			Goto Reset
		Pain150:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(150,"Head")
			Goto Reset
		Pain200:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(200,"Head")
			Goto Reset
		Pain234:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(234,"Head")
			Goto Reset
		Pain250:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(250,"Head")
			Goto Reset
		Pain300:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(300,"Head")
			Goto Reset
		Pain350:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(350,"Head")
			Goto Reset
		Pain400:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(400,"Head")
			Goto Reset
		Pain450:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(450,"Head")
			Goto Reset
		Pain500:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(500,"Head")
			Goto Reset
		Pain550:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(550,"Head")
			Goto Reset
		Pain600:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(600,"Head")
			Goto Reset
		Pain1200:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(1200,"Head")
			Goto Reset
		PlasmaPain10:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(10, "HeadPlasma") // LOWER than the 20 for damage below 5. This is a quirk.
			Goto Reset
		PlasmaPain20:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(20,"HeadPlasma")
			Goto Reset
		PlasmaPain22:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(22,"HeadPlasma")
			Goto Reset
		PlasmaPain26:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(26,"HeadPlasma")
			Goto Reset
		PlasmaPain28:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(28,"HeadPlasma")
			Goto Reset
		PlasmaPain30:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(30,"HeadPlasma")
			Goto Reset
		PlasmaPain32:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(32,"HeadPlasma")
			Goto Reset
		PlasmaPain40:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(40,"HeadPlasma")
			Goto Reset
		PlasmaPain50:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(50,"HeadPlasma")
			Goto Reset
		PlasmaPain100:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(100,"HeadPlasma")
			Goto Reset
		PlasmaPain150:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(150,"HeadPlasma")
			Goto Reset
		PlasmaPain200:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(200,"HeadPlasma")
			Goto Reset
		PlasmaPain234:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(234,"HeadPlasma")
			Goto Reset
		PlasmaPain250:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(250,"HeadPlasma")
			Goto Reset
		PlasmaPain300:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(300,"HeadPlasma")
			Goto Reset
		PlasmaPain350:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(350,"HeadPlasma")
			Goto Reset
		PlasmaPain400:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(400,"HeadPlasma")
			Goto Reset
		PlasmaPain450:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(450,"HeadPlasma")
			Goto Reset
		PlasmaPain500:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(500,"HeadPlasma")
			Goto Reset
		PlasmaPain550:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(550,"HeadPlasma")
			Goto Reset
		PlasmaPain600:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(600,"HeadPlasma")
			Goto Reset
		PlasmaPain1200:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(1200,"HeadPlasma")
			Goto Reset
		DecaptatePain10:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(10, "Decaptate") // LOWER than the 20 for damage below 5. This is a quirk.
			//XDT3 A 0 A_Explode(10,15, 0, 0, 15)//hs
			Goto Reset
		DecaptatePain20:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(20,"Decaptate")
			Goto Reset
		DecaptatePain22:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(22,"Decaptate")
			Goto Reset
		DecaptatePain26:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(26,"Decaptate")
			Goto Reset
		DecaptatePain28:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(28,"Decaptate")
			Goto Reset
		DecaptatePain30:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(30,"Decaptate")
			Goto Reset
		DecaptatePain32:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(32,"Decaptate")
			Goto Reset
		DecaptatePain40:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(40,"Decaptate")
			Goto Reset
		DecaptatePain50:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(50,"Decaptate")
			Goto Reset
		DecaptatePain100:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(100,"Decaptate")
			Goto Reset
		DecaptatePain150:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(150,"Decaptate")
			Goto Reset
		DecaptatePain200:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(200,"Decaptate")
			Goto Reset
		DecaptatePain234:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(234,"Decaptate")
			Goto Reset
		DecaptatePain250:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(250,"Decaptate")
			Goto Reset
		DecaptatePain300:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(300,"Decaptate")
			Goto Reset
		DecaptatePain350:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(350,"Decaptate")
			Goto Reset
		DecaptatePain400:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(400,"Decaptate")
			Goto Reset
		DecaptatePain450:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(450,"Decaptate")
			Goto Reset
		DecaptatePain500:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(500,"Decaptate")
			Goto Reset
		DecaptatePain550:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(550,"Decaptate")
			Goto Reset
		DecaptatePain600:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(600,"Decaptate")
			Goto Reset
		DecaptatePain1200:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(1200,"Decaptate")
			Goto Reset			
			
		PainOopsnik:	
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(32766,"Desintegrate") // proofing it agains failure		
		Death:
			TNT1 A 0
			TNT1 A 1 A_NoBlocking
			Stop
	}
} // end FrankenHeadEmulateBD21Sfest 











ACTOR FrankenHeadFBDAdvancedSfest
	// Higher performance but the damage is in practice not traceable back to inflictor.
	// Meaning headshots do not aggro and do not count towards target switching
{
	
	var int user_x_org;
	var int user_y_org;
	var int user_z_org;
	var int user_sleeping;
	var int user_hispeed; 
	var int user_countdown;
	
	damagefactor "Taunt", 0.0 damagefactor "Blood", 0.0 damagefactor "BlueBlood", 0.0
	damagefactor "Head", 0.0 damagefactor "MinorHead", 0.0 damagefactor "KillMe", 0.0
	damagefactor "Control", 0.0 damagefactor "Trample", 0.0 damagefactor "GibRemoving", 0.0
	damagefactor "Alert", 0.0 damagefactor "SSG", 1.5 damagefactor "ExplosiveImpact", 0.0
	damagefactor "GibRemoving", 0.0 damagefactor "use", 0.0 damagefactor "SHOTGUN", 1.4
	damagefactor "TeleportRemover", 0.0 damagefactor "Fire", 0.0 damagefactor "Stealth", 0.0
	
	damagefactor "FriendlyExplosion", 0.0
	damagefactor "YouMustDuck", 1.0
	damagefactor "Leg", 0.0
	
	damagefactor "SniperBullet", 2.0 // a headshot with Mosin-Nagant (60 damage) 
		//a) counts as stun, because it inflicts 120 > 118 threshold
		//b) inflicts 240 on the monster		
	
	Health 2300
	Radius 7
	Height 18
	Mass 999999
	DamageType head
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
	PainChance 255
	
	+SERVERSIDEONLY

	+ISMONSTER // for the master-minion link to work

	-COUNTKILL +NOTARGET
	+NOGRAVITY +NOTELEPORT +FORCERADIUSDMG -SOLID +NODAMAGETHRUST
	+THRUGHOST +NORADIUSDMG +GHOST  +NOTAUTOAIMED
	+NOTRIGGER //Disables all line action (crossing, impacting, using, etc.) for the actor.


	// initial flags, revert on activation
	-SHOOTABLE
	+THRUACTORS
	+NOPAIN	
	States
	{
		Pain.YouMustDuck:
			// do NOT convey as damage!
			TNT1 A 0
			TNT1 A 0 A_JumpIfHealthLower(2298, "Pain")
			TNT1 A 0 HealThing(2300, 2300)
			TNT1 A 0 A_GiveInventory("DuckYouFool", 1, AAPTR_MASTER)
			Goto Follow
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			//TNT1 A 0 A_SetUserVar("user_z_org", 0)
			TNT1 A 0 A_SetUserVar("user_countdown", 100)
			TNT1 A 0 A_Jump(256, "WaitForActivation") // reliable because serverside
		WaitForActivation:
			TNT1 A 2 
			TNT1 A 0 A_JumpIf(!user_z_org, "WaitForActivation")
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			"----" N 2 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
		Sleep:
			TNT1 A 0
			"----" O 5 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")			
			TNT1 A 0 A_CheckFlag("SOLID", "Sleep", AAPTR_Master) // a *very* high chance the deaths states don't have a sleep reset
			Goto Death
		Follow:
			TNT1 A 0
			TNT1 A 0 A_JumpIf(user_hispeed, "FollowSpeedy")
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepily")
			TNT1 A 0 A_JumpIf(user_sleeping < 0, "FollowSlaughter")
			"----" HHHH 2 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master) // extra check in case the master forgets A_KillChildren on dying
			// never exists on a client, so no need to worry about skipping jumps into a wrong state
			TNT1 A 0 A_CheckFlag("SOLID", "Follow", AAPTR_Master) // keep looping while master is not null and is not killed
			Goto Death
		FollowSlaughter:
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepily")
			"----" MMM 3 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSlaughter", AAPTR_Master) // keep looping while master is not null and is not killed
			Goto Death
		FollowSleepily:
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "Follow")
			"----" O 5 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSleepily", AAPTR_Master)
			Goto Death
		FollowSpeedy:
			TNT1 A 0
			//TNT1 A 0 A_JumpIf(user_hispeed, "FollowSpeedy") // Face, meet palm. COPY-PASTING IS EVIL!
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepilySpeedy")
			TNT1 A 0 A_JumpIf(user_sleeping < 0, "FollowSlaughterSpeedy")
			"----" HHHHHHHH 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master) // extra check in case the master forgets A_KillChildren on dying
			// never exists on a client, so no need to worry about skipping jumps into a wrong state
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSpeedy", AAPTR_Master) // keep looping while master is not null and is not killed
			Goto Death
		FollowSlaughterSpeedy: // fucking revenants! I wanted 2 but had to accelerate to 1.
			TNT1 A 0 A_JumpIf(user_sleeping > 0, "FollowSleepilySpeedy")
			"----" MMMMMMMM 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSlaughterSpeedy", AAPTR_Master) // keep looping while master is not null and is not killed
			Goto Death
		FollowSleepilySpeedy: // fucking revenants! I wanted 3, but noooo. Had to accelerate to 2.
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "FollowSpeedy")
			"----" OO 2 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_JumpIf(user_sleeping <= 0, "FollowSpeedy")
			"----" OO 2 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_CheckFlag("CORPSE", "Death", AAPTR_Master)
			TNT1 A 0 A_CheckFlag("SOLID", "FollowSleepilySpeedy", AAPTR_Master)
			Goto Death
			
		Reset:
			// Unlike the "exact" profile, this one has NO invulnerability frames -- it uses an *accumulation* frame instead
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_JumpIf(health >= 2300, 3)
			TNT1 A 0 A_GiveInventory("Headache", (2300 - health) / 10, AAPTR_Master)
			TNT1 A 0 HealThing(2300, 2300)
			"----" HHH 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			TNT1 A 0 A_CheckFlag("SOLID", "Follow", AAPTR_MASTER)
			Goto Death

		Pain.Explosive:
		Pain.ExplosiveImpact:
		Pain.SSG:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			"----" HHH 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			Goto Pain	
	
		Pain:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200") // took 500 damage
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600") // took 300 damage
			TNT1 A 0 A_JumpIfHealthLower(2176, "PainLinear2xStun") // took 125 damage
			TNT1 A 0 A_JumpIfHealthLower(2291, "PainLinear2x")//took 10 damage
			TNT1 A 0 A_DamageMaster(20,"Head")
			Goto Reset
		Pain.Saw:
		Pain.Cut:
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200") // took 500 damage
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600") // took 300 damage
			TNT1 A 0 A_JumpIfHealthLower(2291, "PainLinear2xDecaptate")//took 10 damage
			TNT1 A 0 A_DamageMaster(20,"Decaptate")
			Goto Reset
		Pain.Plasma:
		Pain.Plasma2:
		Pain.SuperPlasma:
		Pain.GreenFire:	
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			// there are NO weapons that's inflict plasma damage on such scale. So we relay it as HeadStun.
			TNT1 A 0 A_JumpIfHealthLower(1800, "Pain1200") // took 500 damage
			TNT1 A 0 A_JumpIfHealthLower(2000, "Pain600") // took 300 damage
			TNT1 A 0 A_JumpIfHealthLower(2291, "PainLinear2xPlasma")//took 10 damage
			TNT1 A 0 A_DamageMaster(20,"HeadPlasma")
			Goto Reset			
		Pain600:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(600,"HeadStun")
			Goto Reset
		Pain1200:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(1200,"HeadStun")		
		PainLinear2x:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(2 * (2300 - health),"Head")
			Goto Reset
		PainLinear2xStun:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(2 * (2300 - health),"HeadStun")
			Goto Reset
		PainLinear2xDecaptate:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(2 * (2300 - health),"Decaptate")
			Goto Reset	
		PainLinear2xPlasma:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(2 * (2300 - health),"HeadPlasma")
			Goto Reset	
		PainOopsnik:	
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(32766,"Desintegrate") // proofing it agains failure		
		Death:
			TNT1 A 0
			TNT1 A 1 A_NoBlocking
			Stop			
	}
} // end FrankenHeadFBDAdvancedSfest


















ACTOR FrankenHeadLinear2x: FrankenHeadFBDAdvanced {	
	States {

		Pain.Plasma:
		Pain.Plasma2:
		Pain.SuperPlasma:
		Pain.GreenFire:
			TNT1 A 0
			// it it called "exact" but it actually *emulates* BD21 behavior, 
			// replacing monsterside checks for "HasPlasmaWeapon" in target's inventory
			// with headbox-side checks for actual damage type
			
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1200") // took 600 damage -- relay as HeadStun
			
			TNT1 A 0 A_SetDamageType("HeadPlasma") 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset			
			
		Pain.Explosive:
		Pain.ExplosiveImpact:
		Pain.SSG:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			"----" HHH 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
		Pain:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1200") // took 600 damage, inflict 1200 HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2176, "PainStun") // took 125 damage or more
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset
		Pain.Saw: // "Saw" is the vertical swing damage of both chanisaw and axe
		Pain.Cut: // "Cut" is the horizontal swing damage of both chainsaw and axe
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1200") // took 600 damage, inflict 1200 HeadStun
			
			TNT1 A 0 A_SetDamageType("Decaptate") 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset
			
		PainStun:	
			TNT1 A 0
			TNT1 A 0 A_SetDamageType("HeadStun")
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(2 * (2300 - health),5,0)
			Goto Reset
		
					
	}
}



ACTOR FrankenHeadLinear2xSfest: FrankenHeadFBDAdvancedSfest {	
	States {
		Pain.Explosive:
		Pain.ExplosiveImpact:
		Pain.SSG:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			"----" HHH 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			Goto Pain	
		Pain:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1200") // took 600 damage, relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2176, "PainLinear2xStun") // took 125 damage
			TNT1 A 0 A_DamageMaster(2 * (2300 - health),"Head")
			Goto Reset
		Pain.Saw:
		Pain.Cut:
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1200") // took 600 damage, relay as HeadStun
			TNT1 A 0 A_DamageMaster(2 * (2300 - health),"Decaptate")
			Goto Reset			
	
		Pain.Plasma:
		Pain.Plasma2:
		Pain.SuperPlasma:
		Pain.GreenFire:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1200") // took 600 damage, relay as HeadStun
			TNT1 A 0 A_DamageMaster(2 * (2300 - health),"HeadPlasma")
			Goto Reset
	}
}

ACTOR FrankenHeadLinear3x: FrankenHeadLinear2x {
	States {
		
		
		
		Pain.Plasma:
		Pain.Plasma2:
		Pain.SuperPlasma:
		Pain.GreenFire:
			TNT1 A 0
			// it it called "exact" but it actually *emulates* BD21 behavior, 
			// replacing monsterside checks for "HasPlasmaWeapon" in target's inventory
			// with headbox-side checks for actual damage type
			
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1800") // took 600 damage -- relay as HeadStun
			
			TNT1 A 0 A_SetDamageType("HeadPlasma") 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(3 * (2300 - health),5,0)
			Goto Reset			
			
		Pain.Explosive:
		Pain.ExplosiveImpact:
		Pain.SSG:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			"----" HHH 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
		Pain:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1800") // took 600 damage -- relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2176, "PainStun") // took 125 damage or more -- relay as HeadStun
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(3 * (2300 - health),5,0)
			Goto Reset
		Pain.Saw: // "Saw" is the vertical swing damage of both chanisaw and axe
		Pain.Cut: // "Cut" is the horizontal swing damage of both chainsaw and axe
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			
			"----" H 1 A_Warp(AAPTR_Tracer,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1800") // took 600 damage -- relay as HeadStun
			
			TNT1 A 0 A_SetDamageType("Decaptate") 
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(3 * (2300 - health),5,0)
			Goto Reset
			
		PainStun:	
			TNT1 A 0
			TNT1 A 0 A_SetDamageType("HeadStun")
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(3 * (2300 - health),5,0)
			Goto Reset

		Pain1800:
			TNT1 A 0
			TNT1 A 0 A_SetDamageType("HeadStun")
			TNT1 A 0 A_Warp(AAPTR_Tracer,5,0,5,0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(1800,5,0)
			Goto Reset
			
			
	}		
			
}


ACTOR FrankenHeadLinear3xSfest: FrankenHeadLinear2xSfest {
	States {
		Pain.Explosive:
		Pain.ExplosiveImpact:
		Pain.SSG:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			"----" HHH 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)
			Goto Pain	
		Pain:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1800") // took 600 damage -- relay as HeadStun
			TNT1 A 0 A_JumpIfHealthLower(2176, "PainLinear3xStun") // took 125 damage
			TNT1 A 0 A_DamageMaster(3 * (2300 - health),"Head")	
			Goto Reset
			
		Pain.Plasma:
		Pain.Plasma2:
		Pain.SuperPlasma:
		Pain.GreenFire:
			TNT1 A 0
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1800") // took 600 damage -- relay as HeadStun
			TNT1 A 0 A_DamageMaster(3 * (2300 - health),"HeadPlasma")	
			Goto Reset
		Pain.Saw:
		Pain.Cut:
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			"----" H 1 A_Warp(AAPTR_Master,user_x_org,user_y_org,user_z_org,0,WARPF_NOCHECKPOSITION|WARPF_COPYINTERPOLATION)	
			
			TNT1 A 0 A_JumpIfHealthLower(1, "PainOopsnik")
			TNT1 A 0 A_JumpIfHealthLower(1700, "Pain1800") // took 600 damage -- relay as HeadStun
			TNT1 A 0 A_DamageMaster(3 * (2300 - health),"Decaptate")	
			Goto Reset			
		PainLinear3xStun:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(3 * (2300 - health),"HeadStun")
			Goto Reset
		Pain1800:
			TNT1 A 0
			TNT1 A 0 A_DamageMaster(1200,"HeadStun")
			Goto Reset
			
	}		
			
}














ACTOR FrankenHeadEmulateBD22: FrankenHeadEmulateBD21Sfest {

	// Higher performance but the damage is in practice not traceable back to inflictor.
	// Meaning headshots do not aggro and do not count towards target switching

	damagefactor "Taunt", 0.0 damagefactor "Blood", 0.0 damagefactor "BlueBlood", 0.0
	damagefactor "Head", 0.0 damagefactor "MinorHead", 0.0 damagefactor "KillMe", 0.0
	damagefactor "Control", 0.0 damagefactor "Trample", 0.0 damagefactor "GibRemoving", 0.0
	damagefactor "Alert", 0.0 /*damagefactor "SSG", 1.5*/ damagefactor "ExplosiveImpact", 0.0
	damagefactor "GibRemoving", 0.0 damagefactor "use", 0.0 damagefactor "SHOTGUN", 0.8/*1.4*/ 
	damagefactor "Railgun", 2.0
	damagefactor "TeleportRemover", 0.0 damagefactor "Fire", 0.0 damagefactor "Stealth", 0.0
	damagefactor "Leg", 0.0
	
	damagefactor "SniperBullet", 2.0 // a headshot with Mosin-Nagant (60 damage) 
		//a) counts as stun, because it inflicts 120 > 118 threshold
		//b) inflicts 240 on the monster		
	
	States {
		// these hitboxes are for BD21.5 monsters only -- who all know "HeadStun" damage type
		// Besides, BD22 has high pain chance for "Head" on many monsters -- but we don't!
		// so, an exact copy would behave differently anyway
		Reset:
			// No invulnerability cooldown on this one
			TNT1 A 0
			TNT1 A 0 A_JumpIf(health >= 2300, 3)
			TNT1 A 0 A_GiveInventory("Headache", (2300 - health) / 10, AAPTR_Master)			
			TNT1 A 0 HealThing(2300, 2300)
			TNT1 A 0 A_ChangeFlag("SHOOTABLE", 1)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			TNT1 A 0 A_CheckFlag("SOLID", "Follow", AAPTR_MASTER)
			Goto Death
		Pain.Saw:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(30,"decaptate")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Cut:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(80,"decaptate")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset

		Pain:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(50,"head")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Kick:
			TNT1 A 0
			TNT1 A 0 A_Jump(128, 2)
			XDT3 A 0 A_DamageMaster(100,"Head")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset
			XDT3 A 0 A_DamageMaster(100,"HeadStun")
			Goto Reset

		Pain.Fire:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(50,"fire")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset


		Pain.Fatality:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(200,"HeadStun")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset


		Pain.Plasma:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(80,"Plasma")//A_Explode(10,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Explosive:
		Pain.ExplosiveImpact:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(100,"ExplosiveImpact")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset


		Pain.Shotgun:
		Pain.SSG:
			TNT1 A 0
			TNT1 A 0 A_Jump(96, 2)
			XDT3 A 0 A_DamageMaster(45,"Head")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset
			XDT3 A 0 A_DamageMaster(45,"HeadStun")
			Goto Reset

		Pain.SniperDamage:
			TNT1 A 0
			TNT1 A 0 A_Jump(128, 2)
			XDT3 A 0 A_DamageMaster(200,"Head")//A_Explode(10,15, 0, 0, 15)//hs
			Goto Reset
			XDT3 A 0 A_DamageMaster(200,"HeadStun")
			Goto Reset


		Pain.Minigun:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(32,"Head")//A_Explode(10,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Minor:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(25,"Head")//A_Explode(10,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Bullet:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(40,"Head")//A_Explode(10,15, 0, 0, 15)//hs
			Goto Reset


		Pain.Railgun:
		Pain.Extreme:
		Pain1200:
		Pain.Bfg10k: //***Che changed damage type from extreme to custom
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(1200,"HeadStun") 
			Goto Reset
	}
}

ACTOR FrankenHeadEmulateBD22Noble: FrankenHeadEmulateBD22 {
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 24
	Decal GreenBloodSplat
	+DONTRIP

	//for debugging
	XScale 1.71
	YScale 1.33
	
	Species "Bruisers" // without this, barrel thrown by baron explodes against baron's head
	
	States {
		Pain.Plasma:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(65,"Plasma")//A_Explode(10,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Explosive:
		Pain.ExplosiveImpact:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(150,"Explosiveimpact")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Shotgun:
		Pain.SSG:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(30,"Head")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset
	
	}
}

ACTOR FrankenHeadEmulateBD22Cyber: FrankenHeadEmulateBD22 {
	Radius 24
	Height 44 // NOT as ridiculously tall as BD22's (70)
	DamageFactor "Explosiveimpact",0.0
	DamageFactor "Stomp",0.0
	+DONTRIP

	//for debugging
	XScale 3.43
	YScale 2.44

	States {
		Pain.Plasma:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(50,"Head")//A_Explode(10,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Explosive:
		Pain.ExplosiveImpact:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(125,"Head")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Railgun:
		Pain.Extreme:
		Pain1200:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(650,"Head")//A_Explode(1200,15, 0, 0, 15)//hs
			Goto Reset

		Pain.Shotgun:
		Pain.SSG:
			TNT1 A 0
			XDT3 A 0 A_DamageMaster(25,"Head")//A_Explode(20,15, 0, 0, 15)//hs
			Goto Reset
	}
}


ACTOR FrankenHeadEmulateBD22Revenant: FrankenHeadEmulateBD22 {

	BloodType "Bone_DustFBD"
	+DONTRIP
	Damagefactor "Explosive.impact",0.0
	DamageFactor "Explosives",0.0 //Mark-sensei says: "To prevent the revenat from killing himself!DON'T REMOVE!" -- this wee Cheb has no idea.
	
	// these mofos (revenant and archvile) are jerking their heads around too much, require hi-speed headboxes
	// the old BD21 mechanism wasn't working at all with them: it was lagging behind!
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_SetUserVar("user_hispeed", 1)
			TNT1 A 0 A_Jump(256, "WaitForActivation") // reliable because serverside	
	}
}

ACTOR FrankenHeadEmulateBD22Vile: FrankenHeadEmulateBD22Revenant {
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
}

ACTOR FrankenHeadEmulateBD22Mummy: FrankenHeadEmulateBD22Revenant {
	Radius 5
	Height 12
	-DONTRIP
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadEmulateBD22EvilMarine: FrankenHeadEmulateBD22Vile {
	Radius 5
	Height 12
	Species "EvilMarines" // without this, rocket marines' rockets eplode right away hitting the headbox
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadEmulateBD22Volcabus: FrankenHeadEmulateBD22 {
	Radius 14
	Height 24
	+DONTRIP

	//for debugging
	XScale 2.0
	YScale 1.33
}


/*
actor HeadshotTarget4: HeadshotTargetBase
{
States
 {
Spawn:
XXXX A 5
XXXX A 1 A_NoBlocking
Stop
 }
}
*/

ACTOR FrankenHeadEmulateBD21Cyber: FrankenHeadEmulateBD21 {
	Radius 24
	Height 44
	damagefactor "Explosive", 0.7
	//***Che
	damagefactor "Bfg10k", 0.7
	+DONTRIP

	//for the debugging square to show the correct size
	XScale 3.43
	YScale 2.44
}

ACTOR FrankenHeadFBDAdvancedCyber: FrankenHeadFBDAdvanced {
	Radius 24
	Height 44
	damagefactor "Explosive", 0.7
	//***Che
	damagefactor "Bfg10k", 0.7
	+DONTRIP

	//for the debugging square to show the correct size
	XScale 3.43
	YScale 2.44
}

ACTOR FrankenHeadLinear2xCyber: FrankenHeadLinear2x {
	Radius 24
	Height 44
	damagefactor "Explosive", 0.7
	//***Che
	damagefactor "Bfg10k", 0.7
	+DONTRIP

	//for the debugging square to show the correct size
	XScale 3.43
	YScale 2.44
}

ACTOR FrankenHeadLinear3xCyber: FrankenHeadLinear3x {
	Radius 24
	Height 44
	damagefactor "Explosive", 0.7
	//***Che
	damagefactor "Bfg10k", 0.7
	+DONTRIP

	//for the debugging square to show the correct size
	XScale 3.43
	YScale 2.44
}

ACTOR FrankenHeadEmulateBD21SfestCyber: FrankenHeadEmulateBD21Sfest {
	Radius 24
	Height 44
	damagefactor "Explosive", 0.7
	//***Che
	damagefactor "Bfg10k", 0.7
	+DONTRIP

	//for the debugging square to show the correct size
	XScale 3.43
	YScale 2.44
}

ACTOR FrankenHeadFBDAdvancedSfestCyber: FrankenHeadFBDAdvancedSfest {
	Radius 24
	Height 44
	damagefactor "Explosive", 0.7
	//***Che
	damagefactor "Bfg10k", 0.7
	+DONTRIP

	//for the debugging square to show the correct size
	XScale 3.43
	YScale 2.44
}

ACTOR FrankenHeadLinear2xSfestCyber: FrankenHeadLinear2xSfest {
	Radius 24
	Height 44
	damagefactor "Explosive", 0.7
	//***Che
	damagefactor "Bfg10k", 0.7
	+DONTRIP

	//for the debugging square to show the correct size
	XScale 3.43
	YScale 2.44
}

ACTOR FrankenHeadLinear3xSfestCyber: FrankenHeadLinear3xSfest {
	Radius 24
	Height 44
	damagefactor "Explosive", 0.7
	//***Che
	damagefactor "Bfg10k", 0.7
	+DONTRIP

	//for the debugging square to show the correct size
	XScale 3.43
	YScale 2.44
}



// EmulateBD21
// FBDAdvanced
// Linear2x
// Linear3x


ACTOR FrankenHeadEmulateBD21Noble: FrankenHeadEmulateBD21 {
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 22
	+DONTRIP

	//for debugging
	XScale 1.71
	YScale 1.22
	
	Species "Bruisers" // without this, barrel thrown by baron explodes against baron's head
}

ACTOR FrankenHeadFBDAdvancedNoble: FrankenHeadFBDAdvanced {
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 22
	+DONTRIP

	//for debugging
	XScale 1.71
	YScale 1.22
	Species "Bruisers" // without this, barrel thrown by baron explodes against baron's head
}	

ACTOR FrankenHeadLinear2xNoble: FrankenHeadLinear2x {
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 22
	+DONTRIP

	//for debugging
	XScale 1.71
	YScale 1.22
	Species "Bruisers" // without this, barrel thrown by baron explodes against baron's head
}	

ACTOR FrankenHeadLinear3xNoble: FrankenHeadLinear3x {
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 22
	+DONTRIP

	//for debugging
	XScale 1.71
	YScale 1.22
	Species "Bruisers" // without this, barrel thrown by baron explodes against baron's head
}

ACTOR FrankenHeadEmulateBD21SfestNoble: FrankenHeadEmulateBD21Sfest {
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 22
	+DONTRIP

	//for debugging
	XScale 1.71
	YScale 1.22
	Species "Bruisers" // without this, barrel thrown by baron explodes against baron's head
}

ACTOR FrankenHeadFBDAdvancedSfestNoble: FrankenHeadFBDAdvancedSfest {
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 22
	+DONTRIP

	//for debugging
	XScale 1.71
	YScale 1.22
	Species "Bruisers" // without this, barrel thrown by baron explodes against baron's head
}	

ACTOR FrankenHeadLinear2xSfestNoble: FrankenHeadLinear2xSfest {
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 22
	+DONTRIP

	//for debugging
	XScale 1.71
	YScale 1.22
	Species "Bruisers" // without this, barrel thrown by baron explodes against baron's head
}	

ACTOR FrankenHeadLinear3xSfestNoble: FrankenHeadLinear3xSfest {
	BloodType "Green_Blood", "GreenFBD_SawBlood", "GreenFBD_SawBlood"
	BloodColor "DarkGreen"
	Radius 12
	Height 22
	+DONTRIP

	//for debugging
	XScale 1.71
	YScale 1.22
	Species "Bruisers" // without this, barrel thrown by baron explodes against baron's head
}


// Duke of Hell was part of chebskies-EDAY, later ported to standalone FBD 21.5
ACTOR FrankenHeadEmulateBD21Duke: FrankenHeadEmulateBD21Noble {
	Radius 19
	Height 35
	
	//for debugging
	XScale 2.74
	YScale 1.95
}

ACTOR FrankenHeadFBDAdvancedDuke: FrankenHeadFBDAdvancedNoble {
	Radius 19
	Height 35
	
	//for debugging
	XScale 2.74
	YScale 1.95
}

ACTOR FrankenHeadLinear2xDuke: FrankenHeadLinear2xNoble {
	Radius 19
	Height 35
	
	//for debugging
	XScale 2.74
	YScale 1.95
}

ACTOR FrankenHeadLinear3xDuke: FrankenHeadLinear3xNoble {
	Radius 19
	Height 35
	
	//for debugging
	XScale 2.74
	YScale 1.95
}

ACTOR FrankenHeadEmulateBD21SfestDuke: FrankenHeadEmulateBD21SfestNoble {
	Radius 19
	Height 35
	
	//for debugging
	XScale 2.74
	YScale 1.95
}

ACTOR FrankenHeadFBDAdvancedSfestDuke: FrankenHeadFBDAdvancedSfestNoble {
	Radius 19
	Height 35
	
	//for debugging
	XScale 2.74
	YScale 1.95
}

ACTOR FrankenHeadLinear2xSfestDuke: FrankenHeadLinear2xSfestNoble {
	Radius 19
	Height 35
	
	//for debugging
	XScale 2.74
	YScale 1.95
}

ACTOR FrankenHeadLinear3xSfestDuke: FrankenHeadLinear3xSfestNoble {
	Radius 19
	Height 35
	
	//for debugging
	XScale 2.74
	YScale 1.95
}


ACTOR FrankenHeadEmulateBD22Duke: FrankenHeadEmulateBD22Noble {
	Radius 19
	Height 35
	
	//for debugging
	XScale 2.74
	YScale 1.95
}


ACTOR FrankenHeadEmulateBD21Revenant: FrankenHeadEmulateBD21 {
	BloodType "Bone_DustFBD"
	+DONTRIP
	// these mofos (revenant and archvile) 
	// are jerking their heads around so much they require hi-speed headboxes
	// the old BD21 mechanism wasn't working at all with them: it was lagging behind!
	States
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			TNT1 A 0 A_SetUserVar("user_hispeed", 1)
			TNT1 A 0 A_Jump(256, "WaitForActivation") // reliable because serverside	
	}
}

ACTOR FrankenHeadFBDAdvancedRevenant: FrankenHeadFBDAdvanced {
	BloodType "Bone_DustFBD"
	+DONTRIP
	States
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			TNT1 A 0 A_SetUserVar("user_hispeed", 1)
			TNT1 A 0 A_Jump(256, "WaitForActivation")
	}
}

ACTOR FrankenHeadLinear2xRevenant: FrankenHeadLinear2x {
	BloodType "Bone_DustFBD"
	+DONTRIP
	States
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			TNT1 A 0 A_SetUserVar("user_hispeed", 1)
			TNT1 A 0 A_Jump(256, "WaitForActivation")
	}
}

ACTOR FrankenHeadLinear3xRevenant: FrankenHeadLinear3x {
	BloodType "Bone_DustFBD"
	+DONTRIP
	States
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			TNT1 A 0 A_SetUserVar("user_hispeed", 1)
			TNT1 A 0 A_Jump(256, "WaitForActivation")
	}
}

ACTOR FrankenHeadEmulateBD21SfestRevenant: FrankenHeadEmulateBD21Sfest {
	BloodType "Bone_DustFBD"
	+DONTRIP
	States
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			TNT1 A 0 A_SetUserVar("user_hispeed", 1)
			TNT1 A 0 A_Jump(256, "WaitForActivation") // reliable because serverside	
	}
}

ACTOR FrankenHeadFBDAdvancedSfestRevenant: FrankenHeadFBDAdvancedSfest {
	BloodType "Bone_DustFBD"
	+DONTRIP
	States
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			TNT1 A 0 A_SetUserVar("user_hispeed", 1)
			TNT1 A 0 A_Jump(256, "WaitForActivation")
	}
}

ACTOR FrankenHeadLinear2xSfestRevenant: FrankenHeadLinear2xSfest {
	BloodType "Bone_DustFBD"
	+DONTRIP
	States
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			TNT1 A 0 A_SetUserVar("user_hispeed", 1)
			TNT1 A 0 A_Jump(256, "WaitForActivation")
	}
}

ACTOR FrankenHeadLinear3xSfestRevenant: FrankenHeadLinear3xSfest {
	BloodType "Bone_DustFBD"
	+DONTRIP
	States
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsAHeadbox")
			TNT1 A 0 A_SetUserVar("user_hispeed", 1)
			TNT1 A 0 A_Jump(256, "WaitForActivation")
	}
}


ACTOR FrankenHeadEmulateBD21Vile: FrankenHeadEmulateBD21Revenant {
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
}

ACTOR FrankenHeadFBDAdvancedVile: FrankenHeadFBDAdvancedRevenant {
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
}

ACTOR FrankenHeadLinear2xVile: FrankenHeadLinear2xRevenant {
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
}

ACTOR FrankenHeadLinear3xVile: FrankenHeadLinear3xRevenant {
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
}

ACTOR FrankenHeadEmulateBD21SfestVile: FrankenHeadEmulateBD21SfestRevenant {
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
}

ACTOR FrankenHeadFBDAdvancedSfestVile: FrankenHeadFBDAdvancedSfestRevenant {
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
}

ACTOR FrankenHeadLinear2xSfestVile: FrankenHeadLinear2xSfestRevenant {
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
}

ACTOR FrankenHeadLinear3xSfestVile: FrankenHeadLinear3xSfestRevenant {
	BloodType "FBD_Blood", "FBD_SawBlood", "FBD_SawBlood"
}


ACTOR FrankenHeadEmulateBD21Mummy: FrankenHeadEmulateBD21Revenant {
	Radius 5
	Height 12
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadFBDAdvancedMummy: FrankenHeadFBDAdvancedRevenant {
	Radius 5
	Height 12
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadLinear2xMummy: FrankenHeadLinear2xRevenant {
	Radius 5
	Height 12
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadLinear3xMummy: FrankenHeadLinear3xRevenant {
	Radius 5
	Height 12
	
	//for debugging
	XScale 0.71
	YScale 0.67
}


ACTOR FrankenHeadEmulateBD21SfestMummy: FrankenHeadEmulateBD21SfestRevenant {
	Radius 5
	Height 12
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadFBDAdvancedSfestMummy: FrankenHeadFBDAdvancedSfestRevenant {
	Radius 5
	Height 12
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadLinear2xSfestMummy: FrankenHeadLinear2xSfestRevenant {
	Radius 5
	Height 12
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadLinear3xSfestMummy: FrankenHeadLinear3xSfestRevenant {
	Radius 5
	Height 12
	
	//for debugging
	XScale 0.71
	YScale 0.67
}





ACTOR FrankenHeadEmulateBD21EvilMarine: FrankenHeadEmulateBD21Vile {
	Radius 5
	Height 12
	Species "EvilMarines" // without this, rocket marines' rockets eplode right away hitting the headbox
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadFBDAdvancedEvilMarine: FrankenHeadFBDAdvancedVile {
	Radius 5
	Height 12
	Species "EvilMarines" // without this, rocket marines' rockets eplode right away hitting the headbox
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadLinear2xEvilMarine: FrankenHeadLinear2xVile {
	Radius 5
	Height 12
	Species "EvilMarines" // without this, rocket marines' rockets eplode right away hitting the headbox
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadLinear3xEvilMarine: FrankenHeadLinear3xVile {
	Radius 5
	Height 12
	Species "EvilMarines" // without this, rocket marines' rockets eplode right away hitting the headbox
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

/* cycling out. Sfest headboxes are unsuitable for evil marines, interfere with Maradeur's interaction with his summons
ACTOR FrankenHeadEmulateBD21SfestEvilMarine: FrankenHeadEmulateBD21SfestVile {
	Radius 5
	Height 12
	Species "EvilMarines" // without this, rocket marines' rockets eplode right away hitting the headbox
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadFBDAdvancedSfestEvilMarine: FrankenHeadFBDAdvancedSfestVile {
	Radius 5
	Height 12
	Species "EvilMarines" // without this, rocket marines' rockets eplode right away hitting the headbox
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadLinear2xSfestEvilMarine: FrankenHeadLinear2xSfestVile {
	Radius 5
	Height 12
	Species "EvilMarines" // without this, rocket marines' rockets eplode right away hitting the headbox
	
	//for debugging
	XScale 0.71
	YScale 0.67
}

ACTOR FrankenHeadLinear3xSfestEvilMarine: FrankenHeadLinear3xSfestVile {
	Radius 5
	Height 12
	Species "EvilMarines" // without this, rocket marines' rockets eplode right away hitting the headbox
	
	//for debugging
	XScale 0.71
	YScale 0.67
}
*/




ACTOR FrankenHeadEmulateBD21Volcabus: FrankenHeadEmulateBD21 {
	Radius 14
	Height 24
	+DONTRIP

	//for debugging
	XScale 2.0
	YScale 1.33
}

ACTOR FrankenHeadFBDAdvancedVolcabus: FrankenHeadFBDAdvanced {
	Radius 14
	Height 24
	+DONTRIP

	//for debugging
	XScale 2.0
	YScale 1.33
}

ACTOR FrankenHeadLinear2xVolcabus: FrankenHeadLinear2x {
	Radius 14
	Height 24
	+DONTRIP

	//for debugging
	XScale 2.0
	YScale 1.33
}

ACTOR FrankenHeadLinear3xVolcabus: FrankenHeadLinear3x {
	Radius 14
	Height 24
	+DONTRIP

	//for debugging
	XScale 2.0
	YScale 1.33
}

ACTOR FrankenHeadEmulateBD21SfestVolcabus: FrankenHeadEmulateBD21Sfest {
	Radius 14
	Height 24
	+DONTRIP

	//for debugging
	XScale 2.0
	YScale 1.33
}

ACTOR FrankenHeadFBDAdvancedSfestVolcabus: FrankenHeadFBDAdvancedSfest {
	Radius 14
	Height 24
	+DONTRIP

	//for debugging
	XScale 2.0
	YScale 1.33
}

ACTOR FrankenHeadLinear2xSfestVolcabus: FrankenHeadLinear2xSfest {
	Radius 14
	Height 24
	+DONTRIP

	//for debugging
	XScale 2.0
	YScale 1.33
}

ACTOR FrankenHeadLinear3xSfestVolcabus: FrankenHeadLinear3xSfest {
	Radius 14
	Height 24
	+DONTRIP

	//for debugging
	XScale 2.0
	YScale 1.33
}





ACTOR FrankenHeadEmulateBD21Infernal: FrankenHeadEmulateBD21Cyber {
	Height 60
	YScale 3.33
	damagefactor "Desintegrate", 0.6 // bfg 9000 & unmaker -- only 120% damage
}

ACTOR FrankenHeadFBDAdvancedInfernal: FrankenHeadFBDAdvancedCyber {
	Height 60
	YScale 3.33
	damagefactor "Desintegrate", 0.6
}

ACTOR FrankenHeadLinear2xInfernal: FrankenHeadLinear2xCyber {
	Height 60
	YScale 3.33
	damagefactor "Desintegrate", 0.6
}

ACTOR FrankenHeadLinear3xInfernal: FrankenHeadLinear3xCyber {
	Height 60
	YScale 3.33
	damagefactor "Desintegrate", 0.6
}
// no sfest support for infernal (a loner EDAY boss) and no BD22 emulation



ACTOR FrankenHeadEmulateBD21Cyberlord: FrankenHeadEmulateBD21Cyber {
	Radius 70 
	Height 100
	XScale 11.43
	YScale 5.55
	damagefactor "Desintegrate", 0.6
	Species "Cyberdemons" // otherwise his fire breath is blocked by his own head!
	+DONTRIP
}

ACTOR FrankenHeadFBDAdvancedCyberlord: FrankenHeadFBDAdvancedCyber {
	Radius 70 
	Height 100
	XScale 11.43
	YScale 5.55
	damagefactor "Desintegrate", 0.6
	Species "Cyberdemons" 
	+DONTRIP
}

ACTOR FrankenHeadLinear2xCyberlord: FrankenHeadLinear2xCyber {
	Radius 70 
	Height 100
	XScale 11.43
	YScale 5.55
	damagefactor "Desintegrate", 0.6
	Species "Cyberdemons" 
	+DONTRIP
}

ACTOR FrankenHeadLinear3xCyberlord: FrankenHeadLinear3xCyber {
	Radius 70 
	Height 100
	XScale 11.43
	YScale 5.55
	damagefactor "Desintegrate", 0.6
	damagefactor "Desintegrate", 0.6
	Species "Cyberdemons" 
	+DONTRIP
}
// no sfest support for cyberlord (a loner EDAY boss) and no BD22 emulation




// Zandronum doesn't support A_JumpIfLower and the like.
// But cyberdemons must NOT try stomping whoever is above their stomping reach or far below them
// Argh times twenty.

// DEPRECATED:  cannot get rid of these until enemy helicopter's target attitude check is remade:
Actor TargetIsBelow : Inventory
{
	inventory.maxamount 1
}
Actor TargetIsAbove : Inventory
{
	inventory.maxamount 1
}

/* already got rid of
Actor FBD_CheckIfTargetIsAbove40
{
	+MISSILE
	+SEEKERMISSILE
	+NOINTERACTION // all collision checks disabled, total noclip -- including floors
	+NOBLOCKMAP 
	+THRUACTORS
	+THRUGHOST
	+GHOST
	Speed 0
	Radius 2
	Height 2
	var int user_z_delta;
	States 
	{
		Spawn:
		Death:
			TNT1 A 0
			TNT1 A 0 A_Warp(AAPTR_TARGET, 0,0,40, 0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_SetUserVar("user_z_delta", z) 
			TNT1 A 0 A_Warp(AAPTR_TRACER, 0,0,0, 0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_JumpIf((z - user_z_delta) > 0, "IsAbove")
			TNT1 A 0 A_TakeInventory("TargetIsAbove", 1, 0, AAPTR_TARGET)
			TNT1 A 1
			Stop
		IsAbove:
			TNT1 A 0 A_GiveInventory("TargetIsAbove", 1, AAPTR_TARGET)
			TNT1 A 0 A_Log("Target is above me.")
			TNT1 A 1 
			
			Stop
	}
}


Actor FBD_CheckIfTargetIsBelow40: FBD_CheckIfTargetIsAbove40
{
	States 
	{
		Spawn:
		Death:
			TNT1 A 0
			TNT1 A 0 A_Warp(AAPTR_TARGET, 0,0,0, 0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_SetUserVar("user_z_delta", z)
			TNT1 A 0 A_Warp(AAPTR_TRACER, 0,0,0, 0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_JumpIf((z - user_z_delta) < -40, "IsBelow")
			TNT1 A 0 A_TakeInventory("TargetIsBelow", 1, 0, AAPTR_TARGET)
			TNT1 A 1
			Stop
		IsBelow:
			TNT1 A 0 A_GiveInventory("TargetIsBelow", 1, AAPTR_TARGET)
			//TNT1 A 0 A_Log("Target is below me.")
			TNT1 A 1
			Stop
	}	
}


Actor FBD_CheckIfTargetIsAbove60
{
	+MISSILE
	+SEEKERMISSILE
	//+NOINTERACTION // all collision checks disabled, total noclip
	+THRUACTORS
	+THRUGHOST
	+GHOST
	Speed 0
	Radius 2
	Height 2
	var int user_z_delta;
	States 
	{
		Spawn:
		Death:
			TNT1 A 0
			TNT1 A 0 A_Warp(AAPTR_TARGET, 0,0,0, 0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_SetUserVar("user_z_delta", z) 
			TNT1 A 0 A_Warp(AAPTR_TRACER, 0,0,0, 0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_JumpIf((z - user_z_delta) > 60, "IsAbove")
			TNT1 A 0 A_TakeInventory("TargetIsAbove", 1, 0, AAPTR_TARGET)
			TNT1 A 1
			Stop
		IsAbove:
			TNT1 A 0 A_GiveInventory("TargetIsAbove", 1, AAPTR_TARGET)
			//TNT1 A 0 A_Log("Target is above me.")
			TNT1 A 1 
			
			Stop
	}
}
*/