

//***Che: I get a feeling this code is ancient, predating even Brutal Doom - and maybe even predating Zandronum
// Because I vaguely recall that before BD Mark-sensei was making some sort of total conversion
//  (how was it called - apocalypse something?) that included tanks and mechs.
// Seems Brutal Doom inherited these vehicles from that project.

// Seriously. Looking at this code makes me shudder. How ancient were the technologies
//  at the time and how much effort and creativity was required just to make simplest things work?
//  I mean, using standard ammo types as control tokens -- because there was no way to define your own token items...?
//  The horror.



//***Che Aggroing the turret at other tanks *still* doesn't work because of the clause
// that a minion cannot aggro at monsters of the same class as its master.
// So no, you can't make tanks infight via scripting. 
// The body is willing but the turret doesn't undestand and keeps sleeping.
// Well, I tried.

//***Che all enemy tanks are immune to the Killme damage type (not subscribed to it) so they ignore captured marines
/*
DamageType AggroTuretDmg
{
	Factor 0.0 // don't do damage to anything that doesn't specifically mark itself vulnerable
	ReplaceFactor
}


the quality of documentation does this to people.
all i had to do was
TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
on the turret

Actor TurretAggroSyncer // the tank body uses this to aggro the turret at its current target
{
	+MISSILE
	+SEEKERMISSILE
	+NOINTERACTION // all collision checks disabled, total noclip -- including floors
	+NOBLOCKMAP
	+THRUACTORS
	+THRUGHOST
	Speed 0
	DamageType AggroTuretDmg
	Damage 0
	States 
	{
		Spawn:
			// the turret's origin is also at body's origin
			TNT1 A 1
			TNT1 A 0 A_Warp(AAPTR_TARGET, 0, 0, 10, 0, WARPF_NOCHECKPOSITION) 
			
			// swindle the pointers to make it look like the damage came from the tank base's target
			TNT1 A 0 A_RearrangePointers (AAPTR_TRACER, AAPTR_NULL, AAPTR_NULL, PTROP_NOSAFEGUARDS)
			TNT1 A 1 A_Explode(2, 20, 0) // inflict 1 damage. The turret has 99999 health anyway, it'll live.
			Stop
	}
}
*/
ACTOR TankPotpourriChecker: AbstractPotpourriChecker
{
	Height 120 // requires extra ceiling space on top of actor's height
	Radius 64
}


ACTOR FBD_EnemyMBT 17875 

	//***Che: cross-mod hardening: see ACTOR ZombieMainBattleTank : FBD_EnemyMBT 9951 {} in Doom_Replacements.txt

	//***Che This actor is the tank chassis. 
	 // The turret is a separate minion monster that follows it using Warp
	 // The turret itself has no collision, the tank's hitbox extends up to cover it
	 // The real height of the tank base (sprite) is 65, diameter >= 125 (radius 62)
	 // The weak spot was a transient headbox-derived thing,
	 //   I replaced it with my advanced headbox.
{
	
	//***Che radius, height and maxdropoffheight (n/a for flying ones) MUST be kept consistent with FBD_TrySpawn in FBD_CORE.acs!
	
	//$category "FBD Bosses"
	//$Sprite TNK1B1
	
	//This actor is what the probe would find because it has the hitbox. The obituary goes to the turret.
	Tag "$FBD_TANK" // "Zombie-controlled tank"; // 
	
    YScale 1.8
	XScale 1.9
	Game Doom
    GibHealth 25
	damagefactor "Avoid", 0.0
	
	//***Che note this fire immunity here does not list "Burn" of imp fireballs!
	//***Che nerfing total immunity to very high resistance
	damagefactor "Fire", 0.07 //0.0
	damagefactor "Flames", 0.07 //0.0
	damagefactor "Slime", 0
	
	//***Che and don't forget frost
	damagefactor "Ice", 0.07
	damagefactor "Frost", 0.07
	
	PainChance "Kick", 255
	
	damagefactor "Head", 5.0 // this makes it receive 10x damage from hits to the engine!
	
	//***Che
	damagefactor "HeadStun", 5.0
	damagefactor "HeadPlasma", 5.0
	
	
	damagefactor "Stomp", 0.0
	damagefactor "GibRemoving", 0.0
	damagefactor "TeleportRemover", 0.0
	DamageFactor "CauseObjectsToSplash", 0.0
	damagefactor "Railgun", 1.8 // 720 damage
	damagefactor "Desintegrate", 3.0 // +200% damage vulnerability to bfg 9000 and unmaker
	
	// immunity to splash damage (otherwise kills self because turret is a 
	// separate monster of a different class, game engine's default failsafes don't work)
	damagefactor "ExplosiveImpact", 0.0
	damagefactor "FriendlyExplosion", 0.0
	
	// immunity to all kinds of crap
	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	
	
    Health 5000
	+NOICEDEATH
	BloodType "TankBlood", "TankBlood", "TankBlood"
    damagefactor "Blood", 0.0 damagefactor "BlueBlood", 0.0 damagefactor "GreenBlood", 0.0
	
	//***Che
	damagefactor "Psionic", 0.1
    
   // damagefactor "Shrapnel", 0.0 //0.4 // if the hand grenade wants in on the action, it can use its "Shotgun" type projectiles
	damagefactor "Explosive", 1.5 // direct rocket hit
	//***Che
	damagefactor "Bfg10k", 1.5
	Obituary "%o was destroyed by a zombie-seized tank."
	MaxStepHeight 24
	MaxDropOffHeight 32
	Speed 1
	
	//***Che: it's for the artillery tank. The mbt is MUCH lower according its 3d model -- causes hitbox dissonance!
	//Height 100
	Height 80
	
	Radius 64
	Mass 99999
	Painchance 10
	Painchance "Explosive", 150
	MONSTER
	+BOSS
	//***Che
	//+DONTHURTSPECIES
	//Nope:
	//  DONTHARMCLASS
	//  Prevents monsters with this flag from dealing explosion damage to other monsters 
	//    of the same class. By default, projectiles fired by monsters of the same class
	//    don't deal impact damage but can deal damage and trigger infighting via A_Explode.
	//  This flag overrides that behavior, blocking explosion damage between the same
	//    class as well. (This also means that monsters with this flag can't blow 
	//    themselves up with their own explosive projectiles.)
	//      Note, if DONTHARMSPECIES is used on the monster, adding this flag is pointless 
	//        because it's implied.
    //		This flag was previously named DONTHURTSPECIES, which was a misleading name that
	//        could lead to believe its effect was that of DONTHARMSPECIES.
	+DONTHARMSPECIES
	+MTHRUSPECIES
	+SLIDESONWALLS
	+NORADIUSDMG
	+DONTRIP
	Species "EnemyTank"
	
	var int user_head_tid;
	var int user_head_type; // 10, tank engine
	var int user_head_rel;
	var int user_head_scale;
	var int user_head_xyzf; /* 
		a packed value: 
		bits 0..7 =x+128, clamped to -128..127
		bits 8..15 =y+128, clamped to -128..127
		bits 16..23 =z, clamped to 1..255
		bit 29 is a command to assume an unique TID, used in monster-on-monster headshotting
		A zero value is a command to terminate
	*/
	var int user_sleeping;
	var int user_item_no;
	var int user_serverside_sfchk;
	
	+NOBLOODDECALS
	-BLOODSPLATTER	
	
	+LOOKALLAROUND
	
	//***Che
	+NODROPOFF
	
	States
	{
	/////////////////////
		
		Halt://Use a script to give RocketAmmo to a tank to stop.
			TNK1 B 0
			TNT1 A 0 A_PlaySound("TANK2", 4, 1, 1)
			TNK1 BBBBB 5 //A_SpawnItemEx ("TankEngineWeakSpot" , -70, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_JumpIfInventory("RocketAMmo", 1, "Halt")
			Goto Rolling
			
		Spawn:
			//***Che: switching to my advanced headboxes
			TNK1 B 0 NODELAY ACS_NamedExecuteWithResult("FBD_RunMonster", 10) // tank weak spot
			TNT1 A 0 A_GiveInventory("TargetIsABoss") // advanced monster behavior
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			//TNT1 A 0 A_SpawnItemEx ("KillTreads",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
			
			// an intangible minion monster that follows us using A_Warp and shoots in our stead
			TNT1 A 0 A_SpawnItemEx ("EnemyMBTTurret", 0, 0, 0, velx, vely, velz, angle, SXF_SETMASTER | SXF_ABSOLUTEANGLE)
			
			TNK1 B 1 // takes 5 tics for slaughtermap init
			TNT1 A 0 ACS_NamedExecuteWithResult("AdjustHeadboxMkII", -60, 0, 1, 1) // in the ass // force create
				// cannot use z=0, headboxes treat it as "not yet initialized"
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			Goto Standby
		Standby:
		Idle:
			TNK1 B 4
			TNK1 B 0 A_Look
			//TNT1 A 0 A_SpawnItemEx ("TankEngineWeakSpot" , -50, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			Loop
			
		
		
		See:
			TNK1 A 1
			
			//TNK1 A 1 A_Chase("","") // the only function of this is jumping to idle when losing target
			
			//***Che: 60, not 100! Otherwise this shit knocks you down half a tank's length ahead of it or through doorframes or thin walls.
			TNT1 A 0 A_JumpIfInventory("RocketAMmo", 1, "Halt")
			TNT1 A 0 A_PlaySound("juggernaut/engine", 4, 1, 1)
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 60, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			
			//***Che
			//TNT1 A 0 A_CheckSight("RollingCantSee")
			//Goto Rolling
			TNT1 A 0 A_JumpIfTargetInLOS("Rolling", 0, JLOSF_DEADNOJUMP)
			Goto RollingCantSee
		
		Rolling:
			//***Che  keep the turret updated on the base's enemy
			//TNT1 A 0 A_CustomMissile("TurretAggroSyncer", 10, 0, 0, 2, 0)
			// oh the shame.
			// replaced with
			// TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			// on the turret
			
			// make sure we still have a target
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP | JLOSF_NOSIGHT)
			Goto Idle
			
			TNT1 A 0 A_SpawnItemEx("TnkStep", 0, 0, 8, 0, 0, 0, angle, SXF_ABSOLUTEANGLE)
			TNT1 A 0
			TNK1 B 1 A_Recoil(-1)
			TNK1 B 1 A_FaceTarget(3)
			TNT1 A 0 A_JumpIfInventory("RifleAMmo", 1, "TurnLeft")
			TNT1 A 0 A_JumpIfInventory("ShotgunAmmo", 1, "TurnRight")
			TNT1 A 0 A_JumpIfInventory("RocketAMmo", 1, "Halt")
			
			TNT1 A 0
			TNK1 D 1 A_Recoil(-1)
			TNK1 D 1 A_FaceTarget(3)
			TNT1 A 0 A_CustomMissile ("TankCheckLeft", 32, 0, -64, 2, 0)
			TNT1 A 0 A_CustomMissile ("TankCheckRight", 32, 0, 64, 2, 0)
			
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 60, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0
			TNK1 E 1 A_Recoil(-1)
			TNK1 E 1 A_FaceTarget(3)
			
			//TNT1 A 0 A_CheckSight("RollingCantSee")
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP)
			Goto RollingCantSee
			
			TNT1 A 0 A_CustomMissile ("TankCheckLeft", 32, 0, -64, 2, 0)
			TNT1 A 0 A_CustomMissile ("TankCheckRight", 32, 0, 64, 2, 0)
			TNT1 A 0 A_Jump(32, "TurnLeft", "TurnRight")
			Loop
			
		TurnLeft:
			TNT1 A 0 A_SpawnItemEx("TnkStep", 0, 0, 8, 0, 0, 0, angle, SXF_ABSOLUTEANGLE)
			TNT1 A 0
			TNK1 B 1 A_Recoil(-1)
			TNT1 A 0 A_JumpIfInventory("RocketAMmo", 1, "Halt")
			TNK1 B 1 A_SetAngle(angle+6)
			
			TNT1 A 0
			TNK1 D 1 A_Recoil(-2)
			TNK1 D 1 A_SetAngle(angle+6)
			
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 60, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0
			TNK1 E 1 A_Recoil(-2)
			TNK1 E 1 A_SetAngle(angle+6)
			
			
			TNT1 A 0 A_SpawnItemEx("TnkStep", 0, 0, 8, 0, 0, 0, angle, SXF_ABSOLUTEANGLE)
			TNT1 A 0
			TNK1 B 1 A_Recoil(-1)
			TNK1 B 1 A_SetAngle(angle+6)
			
			TNT1 A 0
			TNK1 D 1 A_Recoil(-2)
			TNK1 D 1 A_SetAngle(angle+6)
			
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 60, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0
			TNK1 E 1 A_Recoil(-2)
			TNK1 E 1 A_SetAngle(angle+6)
			TNT1 A 0 A_TakeInventory("ShotgunAmmo", 10)
			TNT1 A 0 A_TakeInventory("RifleAmmo", 10)
			Goto Rolling
			
			
		TurnRight:
		Missile:
			TNT1 A 0 A_SpawnItemEx("TnkStep", 0, 0, 8, 0, 0, 0, angle, SXF_ABSOLUTEANGLE)
			TNT1 A 0
			TNK1 B 1 A_Recoil(-1)
			TNT1 A 0 A_JumpIfInventory("RocketAMmo", 1, "Halt")
			TNK1 B 1 A_SetAngle(angle-6)
			
			TNT1 A 0
			TNK1 D 1 A_Recoil(-2)
			TNK1 D 1 A_SetAngle(angle-6)
			
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 60, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0
			TNK1 E 1 A_Recoil(-2)
			TNK1 E 1 A_SetAngle(angle-6)
			
			TNT1 A 0 A_SpawnItemEx("TnkStep", 0, 0, 8, 0, 0, 0, angle, SXF_ABSOLUTEANGLE)
			TNT1 A 0
			TNK1 B 1 A_Recoil(-1)
			TNK1 B 1 A_SetAngle(angle-6)
			
			TNT1 A 0
			TNK1 D 1 A_Recoil(-2)
			TNK1 D 1 A_SetAngle(angle-6)
			
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 60, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0
			TNK1 E 1 A_Recoil(-2)
			TNK1 E 1 A_SetAngle(angle-6)
			TNT1 A 0 A_TakeInventory("ShotgunAmmo", 10)
			TNT1 A 0 A_TakeInventory("RifleAmmo", 10)
			Goto Rolling	
			
			
		RollingCantSee:
			 // make sure we still have a target
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP | JLOSF_NOSIGHT)
			Goto Idle		
			TNT1 A 0 A_SpawnItemEx("TnkStep", 0, 0, 8, 0, 0, 0, angle, SXF_ABSOLUTEANGLE)
			TNT1 A 0
			TNK1 B 1 A_Chase("","")
			TNK1 B 1 A_Recoil(-1)
			
			TNT1 A 0
			TNK1 D 1 A_Recoil(-1)
			TNK1 D 1 A_Chase("","")
			
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 60, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0
			TNK1 E 1 A_Recoil(-1)
			TNK1 E 1 A_Recoil(-1)
			TNT1 A 0 A_Jump(16, "Missile")
			
			//TNT1 A 0 A_CheckSight("RollingCantSee")
			//Goto See	
			TNT1 A 0 A_JumpIfTargetInLOS("See", 0, JLOSF_DEADNOJUMP)
			Goto RollingCantSee
			
			
		Pain:	
			TNT1 A 0
			TNK1 B 2
			TNK1 B 2 A_Pain
			Goto Rolling
			
			
		///////////////////////
		Death:
			TNT1 A 1
			TNT1 A 0 A_StopSound(4)
			TNT1 A 0 A_SpawnItemEx("BigExplosion1112",0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
			TNT1 A 0 A_PlaySound("weapons/explode")
			TNT1 A 0 A_PlaySound("EXPLOSIO", 3)
			TNT1 A 0 A_ChangeFlag("USESPECIAL", 0)
			TNT1 A 0 A_KillChildren
			TNT1 A 0 A_Scream
			TNT1 A 0 A_BossDeath
			TNT1 A 0 A_SpawnItemEx("TankExplode",0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
			ELEC A 0 A_Explode(100, 250)
			TNT1 A 15 A_NoBlocking
			TNT1 A 0
			Stop
		
		//***Che: killed by hitting its weak spot
		Death.Head:
		Death.HeadStun:
		Death.HeadPlasma:
			TNT1 A 0
			TNT1 A 0 A_StopSound(4)
			TNT1 A 0 A_ChangeFlag("USESPECIAL", 0)
			TNT1 A 0 A_BossDeath
			
			TNK1 E 1 A_SpawnItemEx("TankEngineExplosionSFX", -70,0,64, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
			TNT1 A 0 A_GiveInventory("TankIsDead", 1) // turret monitors this and freezes
			
			
			TNK1 EEEEEEE 9 A_SpawnItemEx("TankEngineFlame", -70,0,64, 0,0,0, 0,SXF_NOCHECKPOSITION,0)

			TNK1 E 0 A_SpawnItemEx("BurningZombie", 0,0,101, Random(-10,10), random(10,10), 0, random(0,360),SXF_NOCHECKPOSITION,0)
			
			TNK1 EEEEEEEEEEEEEEEEEEEEEEEEEEEEE 9 A_SpawnItemEx("TankEngineFlame", -70,0,64, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
		FinalBoom:	
			TNT1 A 0 A_KillChildren
			TNT1 A 0 A_Scream
			TNT1 A 0 A_SpawnItemEx("BigExplosion1112",0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
			TNT1 A 0 A_PlaySound("weapons/explode")
			TNT1 A 0 A_SpawnItemEx("TankExplode",0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
			ELEC A 0 A_Explode(100, 250)
			TNT1 A 15 A_NoBlocking
			TNT1 A 0
			Stop
	}
} 


Actor TankEngineExplosionSFX // a clone of mancubus fireball exploding
{
	+NOINTERACTION
	+NOCLIP
	+NOGRAVITY
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 AA 0 A_SpawnItemEx ("ExplosionFlareSpawner",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)
			TNT1 A 0 A_CustomMissile ("BDExplosionparticles", 0, 0, random (0, 360), 2, random (40, 90))
			TNT1 A 0 A_CustomMissile ("BDExplosionparticles2", 0, 0, random (0, 360), 2, random (40, 90))
			TNT1 A 0 A_CustomMissile ("BDExplosionparticles3", 10, 0, random (0, 360), 2, random (40, 90))
			EXPL A 0 A_CustomMissile ("FlamethrowerFireParticles", 6, 0, random (0, 360), 2, random (0, 90))
			TNT1 A 0 A_SpawnItemEx("TinyBurningPiece", random (-15, 15), random (-15, 15))
			TNT1 A 0 A_SpawnItemEx("TinyBurningPiece2", random (-35, 35), random (-35, 35))
			TNT1 A 0 A_SpawnItemEx("TinyBurningPiece3", random (-45, 45), random (-45, 35))
			TNT1 AAAAAA 0 A_CustomMissile ("MetalShard1", 0, 0, random (0, 360), 2, random (30, 90))
			TNT1 AAAAAA 0 A_CustomMissile ("MetalShard2", 0, 0, random (0, 360), 2, random (30, 90))
			TNT1 AAAAAA 0 A_CustomMissile ("MetalShard3", 0, 0, random (0, 360), 2, random (30, 90))
			TNT1 AAAAAAA 20 A_CustomMissile ("BigBlackSmoke", 0, 0, random (0, 360), 2, random (40, 160))
			Stop	
	}	
}


Actor TankEngineFlame //***Che made it a separate actor because a_custommissile does not support x-shifting
{
	+NOINTERACTION
	+NOCLIP
	+NOGRAVITY
	States
	{
		Spawn:
			TNT1 A 1 NODELAY A_CustomMissile ("FlamethrowerFireParticles", 0, 0, random (0, 360), 2, random (40, 90))
			Stop
	}
}



Actor TankEngineBlood 
{
	+THRUACTORS
	-ALLOWPARTICLES
	+NOBLOODDECALS
	-BLOODSPLATTER
	+CLIENTSIDEONLY
	Renderstyle Add
	Speed 0
	Scale 0.4
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_Stop
			TNT1 A 0 A_Jump(256, "Sfx1", "Sfx2", "Sfx3", "Sfx4")
		Sfx1:	
			TNT1 A 0 A_SpawnItem ("YellowFlareSmall", 0)
			FX58 ABCD 1 BRIGHT 
			FX58 EFGHIJ 1 bright
			TNT1 A 60
			Stop
		Sfx2:
			TNT1 A 0 A_CustomMissile ("MetalShard1", 0, 0, random (-30, 30), 2, random (-30, 30))
			TNT1 A 3
			Stop
		Sfx3:
			TNT1 A 0 A_CustomMissile ("MetalShard2", 0, 0, random (-30, 30), 2, random (-30, 30))
			TNT1 A 3
			Stop
		Sfx4:
			TNT1 A 0 A_CustomMissile ("MetalShard3", 0, 0, random (-30, 30), 2, random (-30, 30))
			TNT1 A 3
			Stop
	}
}

ACTOR DarkGlassParticle
{
	+noteleport
	+missile
	+bounceonactors
	+doombounce
	+forcexybillboard
    +CLIENTSIDEONLY
    Speed 7
    Gravity 0.7
	bouncefactor 0.5
	height 1
	radius 1
	States
    {
		Spawn:
			TNT1 A 1
			TNT1 A 0 A_Jump(256, "Scale1", "Scale2", "Scale3", "Scale4")
		Scale1:
			TNT1 A 0 A_SetScale(0.6, -0.7)
			Goto Fly
		Scale2:
			TNT1 A 0 A_SetScale(0.8, 0.8)
			Goto Fly
		Scale3:
			TNT1 A 0 A_SetScale(-0.9, 0.6)
			Goto Fly
		Scale4:
			TNT1 A 0 A_SetScale(-0.6, -0.5)
			Goto Fly
		Fly:
			GLSP ABCDEFGH 3
			Loop
		Death:
			GLSP C 1
			GLSP C 100
			GLSP CCCCCCCCCCCCCCCCCCCC 35 A_FadeOut(0.05)
			Stop
    }
}



Actor MecCockpitBlood: TankEngineBlood 
{
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_Stop
			TNT1 A 0 A_Jump(256, "Sfx1", "Sfx2", "Sfx3", "Sfx3")
		Sfx1:	
			TNT1 A 0 A_SpawnItem ("YellowFlareSmall", 0)
			FX58 ABCD 1 BRIGHT 
			FX58 EFGHIJ 1 bright
			TNT1 A 60
			Stop
		Sfx2:
			TNT1 A 0 A_Jump(256, "Shard1", "Shard2", "Shard3")
		Shard1:	
			TNT1 A 0 A_CustomMissile ("MetalShard1", 0, 0, random (-30, 30), 2, random (-30, 30))
			TNT1 A 3
			Stop
		Shard2:
			TNT1 A 0 A_CustomMissile ("MetalShard2", 0, 0, random (-30, 30), 2, random (-30, 30))
			TNT1 A 3
			Stop
		Shard3:
			TNT1 A 0 A_CustomMissile ("MetalShard3", 0, 0, random (-30, 30), 2, random (-30, 30))
			TNT1 A 3
			Stop
		Sfx3:
			TNT1 A 0 A_CustomMissile ("DarkGlassParticle", 0, 0, random (-30, 30), 2, random (-30, 30))
			TNT1 A 3
			Stop
	}
}


Actor TankIsDead : Inventory 
{
	inventory.maxamount 1 
}


//***Che this check cannot be done on the projectile's side
// because target inventory checks fail on fast projectiles
// BUT! we cannot just turn those flags off right away.
// Because the turret (radius 2) is embedded deep inside the tank's hitbox (radius 64)

Actor HeavyMachinegunProjectileEnemyKS: HeavyMachinegunProjectileEnemy // speed 180
{
	States
	{
		Spawn:
			MG74 A 1 Bright
			TNT1 A 0 A_SpawnItem("HeavyMachinegunHitsProjectiles", 0, 5)
		
			TNT1 A 0 A_ChangeFlag("THRUSPECIES", 0)
			TNT1 A 0 A_ChangeFlag("MTHRUSPECIES", 0)
		Fly:
			MG74 A 1 Bright
			TNT1 A 0 A_SpawnItem("HeavyMachinegunHitsProjectiles", 0, 5)
			Loop

	
	}
}


Actor EnemYTankShellKS: EnemYTankShell // speed 50
{
	States
	{
		Spawn:
			MISL A 1 Bright
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail2", (6 *momx)/-35.0, -(6 *momy)/-35.0, 2+(6 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail3", (12 *momx)/-35.0, -(12 *momy)/-35.0, 2+(12 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail4", (18 *momx)/-35.0, -(18 *momy)/-35.0, 2+(18 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail5", (24 *momx)/-35.0, -(24 *momy)/-35.0, 2+(24 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail6", (30*momx)/-35.0, -(30*momy)/-35.0, 2+(30*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			
			MISL A 1 Bright
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail2", (6 *momx)/-35.0, -(6 *momy)/-35.0, 2+(6 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail3", (12 *momx)/-35.0, -(12 *momy)/-35.0, 2+(12 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail4", (18 *momx)/-35.0, -(18 *momy)/-35.0, 2+(18 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail5", (24 *momx)/-35.0, -(24 *momy)/-35.0, 2+(24 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail6", (30*momx)/-35.0, -(30*momy)/-35.0, 2+(30*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			
			MISL A 1 Bright
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail2", (6 *momx)/-35.0, -(6 *momy)/-35.0, 2+(6 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail3", (12 *momx)/-35.0, -(12 *momy)/-35.0, 2+(12 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail4", (18 *momx)/-35.0, -(18 *momy)/-35.0, 2+(18 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail5", (24 *momx)/-35.0, -(24 *momy)/-35.0, 2+(24 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail6", (30*momx)/-35.0, -(30*momy)/-35.0, 2+(30*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)			
			
			
			TNT1 A 0 A_ChangeFlag("THRUSPECIES", 0)
			TNT1 A 0 A_ChangeFlag("MTHRUSPECIES", 0)
		Fly:
			MISL A 1 Bright
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail2", (6 *momx)/-35.0, -(6 *momy)/-35.0, 2+(6 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail3", (12 *momx)/-35.0, -(12 *momy)/-35.0, 2+(12 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail4", (18 *momx)/-35.0, -(18 *momy)/-35.0, 2+(18 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail5", (24 *momx)/-35.0, -(24 *momy)/-35.0, 2+(24 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("HeavyMachinegunProjectileTracerTrail6", (30*momx)/-35.0, -(30*momy)/-35.0, 2+(30*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			Loop
	}
}

Actor AutoCannonProjectileEnemyKS: AutoCannonProjectileEnemy // speed 100
{
	States
	{
		
		Spawn:
			TNT1 A 1 Bright
			
			TNT1 A 0 A_ChangeFlag("THRUSPECIES", 0)
			TNT1 A 0 A_ChangeFlag("MTHRUSPECIES", 0)
		
		Fly:
			TNT1 A 1 Bright
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail2", (2 *momx)/-35.0, -(2 *momy)/-35.0, 2+(2 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail3", (4 *momx)/-35.0, -(4 *momy)/-35.0, 2+(4 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail4", (6 *momx)/-35.0, -(6 *momy)/-35.0, 2+(6 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail5", (8 *momx)/-35.0, -(8 *momy)/-35.0, 2+(8 *momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail6", (10*momx)/-35.0, -(10*momy)/-35.0, 2+(10*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail7", (12*momx)/-35.0, -(12*momy)/-35.0, 2+(12*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail8", (14*momx)/-35.0, -(14*momy)/-35.0, 2+(14*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail9", (16*momx)/-35.0, -(16*momy)/-35.0, 2+(16*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail10", (18*momx)/-35.0, -(18*momy)/-35.0, 2+(18*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail11", (20*momx)/-35.0, -(20*momy)/-35.0, 2+(20*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItemEx("AutoCannonTracerTrail12", (22*momx)/-35.0, -(22*momy)/-35.0, 2+(22*momz)/-35.0, 0,0,0, 0, SXF_ABSOLUTEANGLE)
			TNT1 A 0 A_SpawnItem("HeavyMachinegunHitsProjectiles", 0, 5)

			Loop	
	}
}


ACTOR TankCheckLeft: FastProjectile
{
	DamageType None
	Damage (random (0, 0))
	+THRUACTORS
	Radius 2
	Height 2
	Speed 60
	States
	{
		Spawn:
			TNT1 A 2
			Stop
		Death:
		    TNT1 A 1
			TNT1 A 0 A_GiveToTarget("RifleAmmo", 1)
			TNT1 A 1
			Stop
		Xdeath:
			TNT1 A 0
			TNT1 A 1
			Stop
			}
}



ACTOR TankCheckRight: TankCheckLeft
{
States
{
		Death:
		    TNT1 A 1
			TNT1 A 0 A_GiveToTarget("ShotgunAmmo", 1)
			TNT1 A 1
			Stop
}}








Actor EnemyMBTTurret
	//***Che: cross-mod hardening: see ACTOR ZombieMainBattleTankBody1 : EnemyMBTTurret {} in Doom_Replacements.txt
{
	MONSTER
	Obituary "$FBD_TANK_O" // "%o was pasted by a zombie-controlled tank.";

	//***Che: 
	-COUNTKILL
	// monster automatically sets countkill
	// The "enemy tanks count as two monsters for the purpose of kill count" bug
	DamageFactor "Kick", 0.0 // just in case
	DamageFactor "Flames", 0.0
	DamageFactor "ExplosiveImpact", 0.0
	DamageFactor "FriendlyExplosion", 0.0
	DamageFactor "Stomp", 0.0
	DamageFactor "Head", 0.0
	DamageFactor "HeadStun", 0.0
	DamageFactor "HeadPlasma", 0.0
	DamageFactor "Decaptate", 0.0
	+NORADIUSDMG // Actor cannot be hurt by radius (explosive) damage.

	+FORCEXYBILLBOARD 
	+DONTSPLASH
	+THRUACTORS 
	+NOGRAVITY
	+NOCLIP 
	+NOBLOOD 
	+NOPAIN 
	+MISSILEMORE 
	+MISSILEEVENMORE
	+DONTHARMSPECIES
	
	damage 0
	radius 2
	//***Che: otherwise monsters attacking them due to infighting hit ground 
	// because they aggro at this turret, not at the tank!
	//height 2
	height 78
	
	speed 0
	Scale 1.2
	Health 99999
	Mass 99999
	MinMissileChance 1
	
	//+QUICKTORETALIATE
	//DamageFactor "AggroTuretDmg", 1.0 // the only thing in the universe not immune to this
	
	states
	{
		Spawn:
			TNT1 A 0 A_GiveInventory("TargetIsABoss") // advanced monster behavior
		Live:
		Idle:
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			//TNKZ T 1 A_Look
			// copy aggro from the body
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			TNT1 A 0 A_JumpIfTargetInLOS("See", 0, JLOSF_DEADNOJUMP)
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			Loop
			
		See:
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			//TNKZ T 1 A_Chase("","")
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP | JLOSF_NOSIGHT)
			Goto Idle
			TNT1 A 0
			
		See2:	
			TNKZ TTTTTT 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			// copy aggro from the body
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)			
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			

			
		Missile:
			TNT1 A 0
			//***Che: this prevented infighting out of player's sight
			//TNT1 A 0 A_CheckSight("See")
			
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP)
			Goto See
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP | JLOSF_NOSIGHT)
			Goto Idle
			
			TNT1 A 0
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			
		Rotate:	
			//***Che: after the tank dies to weak spot but before it exploses
			TNKZ T 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(6)
			TNKZ T 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			TNKZ T 0 A_JumpIfTargetInLOS("Shoot", 6, JLOSF_NOSIGHT | JLOSF_DEADNOJUMP) // we locked in
			TNKZ T 0 A_JumpIfTargetInLOS("Rotate", 0, JLOSF_DEADNOJUMP) // in sight but outside of our firing arc - keep rotating
			Goto Idle // out of sight or no target
			
			
		Jam: //***Che
			// stops other infighting tanks from kicking this dead horse 
			// (they keep attacking it because they aggro at this turret 
			//  but the turret is not dead until the tank base deletes it on it final explosion)
			TNT1 A 0 A_ChangeFlag("NOTARGET", 1)
			TNT1 A 0 A_ChangeFlag("NEVERTARGET", 1) // NPCs too!
		StayJammed:
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			Loop
		
		Shoot:
			
			//***Che: after the tank dies to weak spot but before it explodes
			"----" A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)			
			
			TNT1 A 0
			//TNT1 A 0 A_CheckSight("See")
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP)
			Goto See
			
			//***Che Kinslayer check:	
			TNT1 A 0 A_JumpIf(!CheckClass("FBD_EnemyMBT", AAPTR_TARGET, true) && !CheckClass("FBD_EnemySPAAG", AAPTR_TARGET, true) && !CheckClass("EnemySPAAGTurret", AAPTR_TARGET, true) && !CheckClass("EnemyMBTTurret", AAPTR_TARGET, true), 2)
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_InfightFriendlyFireOn")
			
			TNT1 A 0 A_JumpIf(CheckClass("FBD_EnemyMBT", AAPTR_TARGET, true) || CheckClass("EnemyMBTTurret", AAPTR_TARGET, true), "Cannon")
			TNT1 A 0 A_JumpIfInTargetInventory("IsInATank", 1, "Cannon")
			TNT1 A 0 A_Jump(114, "Cannon")
			
			// machinegun
			
			TNKZ T 1 A_FaceTarget(6)
				TNT1 A 0 A_PlaySound("TANKMG", 1)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 1 A_FaceTarget(6)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemyKS", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 1
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 AAA 0 A_CustomMissile("HeavyMachinegunFlash", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("YellowFlareSmall", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("RifleCaseSpawn", 78, 24, 0, 0)
			
			
			TNKZ TTTT 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
				TNT1 A 0 A_PlaySound("TANKMG", 1)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 1 A_FaceTarget(24)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemyKS", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 1
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 AAA 0 A_CustomMissile("HeavyMachinegunFlash", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("YellowFlareSmall", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("RifleCaseSpawn", 78, 24, 0, 0)
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			
			TNKZ TTTT 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
				TNT1 A 0 A_PlaySound("TANKMG", 1)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 1 A_FaceTarget(24)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemyKS", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 1
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 AAA 0 A_CustomMissile("HeavyMachinegunFlash", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("YellowFlareSmall", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("RifleCaseSpawn", 78, 24, 0, 0)
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			
			TNKZ TTTT 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
				TNT1 A 0 A_PlaySound("TANKMG", 1)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 1 A_FaceTarget(24)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemyKS", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 1
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 AAA 0 A_CustomMissile("HeavyMachinegunFlash", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("YellowFlareSmall", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("RifleCaseSpawn", 78, 24, 0, 0)
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			
			TNKZ TTTT 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
				TNT1 A 0 A_PlaySound("TANKMG", 1)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 1 A_FaceTarget(24)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemyKS", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 1
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 AAA 0 A_CustomMissile("HeavyMachinegunFlash", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("YellowFlareSmall", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("RifleCaseSpawn", 78, 24, 0, 0)
			
			TNKZ TTTT 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
				TNT1 A 0 A_PlaySound("TANKMG", 1)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 1 A_FaceTarget(24)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemyKS", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 1
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 AAA 0 A_CustomMissile("HeavyMachinegunFlash", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("YellowFlareSmall", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("RifleCaseSpawn", 78, 24, 0, 0)
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			
			TNKZ TTTT 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
				TNT1 A 0 A_PlaySound("TANKMG", 1)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 1 A_FaceTarget(24)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemyKS", 78, 24, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 1
				TNT1 A 0 A_CustomMissile("HeavyMachinegunProjectileEnemy", 78, 24, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 AAA 0 A_CustomMissile("HeavyMachinegunFlash", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("YellowFlareSmall", 78, 24, 0, 0)
			TNT1 A 0 A_CustomMissile("RifleCaseSpawn", 78, 24, 0, 0)
			
			//***Che
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			Goto See
			
		Cannon:
		
			//***Che Kinslayer check:	
			TNT1 A 0 A_JumpIf(!CheckClass("FBD_EnemyMBT", AAPTR_TARGET, true) && !CheckClass("FBD_EnemySPAAG", AAPTR_TARGET, true) && !CheckClass("EnemySPAAGTurret", AAPTR_TARGET, true) && !CheckClass("EnemyMBTTurret", AAPTR_TARGET, true), 2)
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_InfightFriendlyFireOn")		
		
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			
			//TNKZ AAA 0 A_Chase("","")
			//TNKZ T 1 A_FaceTarget
			
			
			TNT1 A 0 A_PlaySound("TANKF", 1)
			
			
			//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
			TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
			TNT1 A 0 A_CustomMissile("EnemyTankShell", 70, 0, random(-5, 5), 0)
			TNT1 A 0 A_Jump(256, 2)
			TNT1 A 0 A_CustomMissile("EnemyTankShellKS", 70, 0, random(-5, 5), 0)
			
			
			TNT1 A 0 A_CustomMissile("TankFireEffect", 70, 0, 0, 0)
			
			//***Che
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
		
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			Goto Rotate
		
		Death:
			TNT1 A 0
			Stop
		XDeath:
			TNT1 A 0
			Stop
	}
}











ACTOR FBD_EnemySPAAG : FBD_EnemyMBT 17876
{
    //***Che: cross-mod hardening: see ACTOR ZombieArtilleryTank : FBD_EnemySPAAG 9950 {} in Doom_Replacements.txt
	
	Tag "$FBD_ARTANK" // "Zombie-controlled anti-aircraft gun";
	Health 4000
	Height 100
	States
	{
		Spawn:
			//***Che: switching to my advanced headboxes
			TNK1 B 0 NODELAY ACS_NamedExecuteWithResult("FBD_RunMonster", 10) // tank weak spot
			TNT1 A 0 A_GiveInventory("TargetIsABoss") //***Che advanced monster behavior
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			//TNT1 A 0 A_SpawnItemEx ("KillTreads",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION,0)

			// an intangible minion monster that follows us using A_Warp
			TNT1 A 0 A_SpawnItemEx ("EnemySPAAGTurret", 0, 0, 0, velx, vely, velz, angle, SXF_SETMASTER | SXF_ABSOLUTEANGLE)

			TNK1 B 7 // takes 5 tics for slaughtermap init
			TNT1 A 0 ACS_NamedExecuteWithResult("AdjustHeadboxMkII", -60, 0, 1, 1) // force create 
				// cannot use z=0, headboxes treat it as "not yet initialized"
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)			
			Goto Standby
	}
} 





Actor EnemySPAAGTurret : EnemyMBTTurret // again, this is a turret, not a body
{
	
	//***Che: cross-mod hardening: see ACTOR ZombieArtilleryTankBody1 : EnemySPAAGTurret {} in Doom_Replacements.txt
	
	// note the sprite is the same as the MBT's, TNKZ T. Only the model differs - designed to be played with 3d models on!
	
	Obituary "$FBD_ARTANK_O" // "%o was dispersed by a zombie-controlled anti-aircraft gun.";
	states
	{
		Spawn:
			TNT1 A 0 NODELAY A_GiveInventory("TargetIsABoss") //***Che advanced monster behavior
		Live:
		Idle:
		
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
		
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			//TNKZ T 1 A_Look
			//***Che
			// copy aggro from the body
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			TNT1 A 0 A_JumpIfTargetInLOS("See", 0, JLOSF_DEADNOJUMP)
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			Loop
			
		See:
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			//***Che
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			//TNKZ T 1 A_Chase("","")
			
			
		See2:	
			TNKZ TTTTTT 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )

			
		Missile:
			TNT1 A 0
			//TNT1 A 0 A_CheckSight("See")
			
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP | JLOSF_NOSIGHT)
			Goto Idle
			
			
		
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
		Rotate:	
			//***Che: after the tank dies to weak spot but before it exploses
			TNKZ T 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 0 A_FaceTarget(4)
			TNKZ T 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			TNKZ T 0 A_JumpIfTargetInLOS("Shoot", 6, JLOSF_DEADNOJUMP) // we locked in
			TNKZ T 0 A_JumpIfTargetInLOS("Rotate", 0, JLOSF_DEADNOJUMP) // in sight but outside of our firing arc - keep rotating
			Goto Idle // out of sight or no target	
			
		Shoot:
		
			//***Che: after the tank dies to weak spot but before it exploses
			"----" A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)			

			"----" A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP | JLOSF_NOSIGHT)
			Goto See
			
		
			TNT1 A 0 A_Jump(64, "Cannon")
			TNKZ T 1 A_FaceTarget (6)
			
			//***Che Kinslayer check:	
			TNT1 A 0 A_JumpIf(!CheckClass("FBD_EnemyMBT", AAPTR_TARGET, true) && !CheckClass("FBD_EnemySPAAG", AAPTR_TARGET, true) && !CheckClass("EnemySPAAGTurret", AAPTR_TARGET, true) && !CheckClass("EnemyMBTTurret", AAPTR_TARGET, true), 2)
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_InfightFriendlyFireOn")
			
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)			
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)			
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			
			
			//FIRE AGAIN
			
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)			
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 180)
			TNT1 A 0 A_SpawnItemEx("AutoCannonCaseSpawn", 0, 0, 40, 0, 0, 0, 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 8)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 6)
					// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 5)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, 40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				// the not autoaimed version
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, 40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, 40, 60)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 9)
				TNT1 A 0 A_JumpIfTargetInLOS(2, 0, JLOSF_DEADNOJUMP)
				TNT1 A 0 A_Jump(256, 7)
				TNKZ T 2 A_FaceTarget(12)
				// the auto-aimed version
				//***Che cannot check on the projectile's side because target inventory checks do not work for fast projectiles
				TNT1 A 0 A_JumpIfInventory("IsAKinslayer", 1, 3) 
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemyKS", 70, -40, random(-4, 4), 0)
				TNT1 A 0 A_Jump(256, 3)
				// the not autoaimed version
				TNKZ T 2 // no face target
				TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 70, -40, angle + random(-4, 4), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)	
			TNT1 A 0 A_SpawnItemEx("AutocannonMuzzle2", 80, -40, 60)
			TNT1 A 0 A_PlaySound("ACANO1", 1)
			TNT1 A 0 A_PlaySound("FARCAN1", 4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			//***Che
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
			
			
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)
			
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNT1 A 0 A_Jump(128, "Rotate")
			Goto See
			
			
			
			
		Cannon:
		
			//***Che Kinslayer check:	
			TNT1 A 0 A_JumpIf(!CheckClass("FBD_EnemyMBT", AAPTR_TARGET, true) && !CheckClass("FBD_EnemySPAAG", AAPTR_TARGET, true) && !CheckClass("EnemySPAAGTurret", AAPTR_TARGET, true) && !CheckClass("EnemyMBTTurret", AAPTR_TARGET, true), 2)
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_InfightFriendlyFireOn")
		
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(6)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			//***Che: after the tank dies to weak spot but before it exploses
			TNT1 A 0 A_JumpIfInventory("TankIsDead", 1, "Jam", AAPTR_MASTER)			
			
			//TNKZ AAA 0 A_Chase("","")
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_NOSIGHT | JLOSF_DEADNOJUMP)
			Goto Idle
			TNKZ T 1 A_FaceTarget(6)
			
			
			TNT1 A 0 A_PlaySound("TANKF", 1)
			TNT1 A 0 A_PlaySound("MISFAR", 2)
			//***Che: as I figure it out, without CMF_SAVEPITCH
			// the missile has a pitch of zero in its spawn state
			// resulting in backblast not forming correctly (its always horizontal)
			TNT1 A 0 A_CustomMissile("TankMissile2", 90, -50, 0, CMF_SAVEPITCH)
		
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(12)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			
			
			TNT1 A 0 A_PlaySound("TANKF", 1)
			TNT1 A 0 A_PlaySound("MISFAR", 2)
			TNT1 A 0 A_CustomMissile("TankMissile2", 90, 50, 0, CMF_SAVEPITCH)
			
			//***Che
			TNT1 A 0 A_TransferPointer(AAPTR_MASTER, AAPTR_DEFAULT, AAPTR_TARGET, AAPTR_TARGET)
		
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )
			TNKZ T 1 A_FaceTarget(4)
			TNKZ T 1 A_Warp(AAPTR_MASTER, 0, 0, 0, 0, WARPF_USECALLERANGLE )

			Goto Rotate
		
		Death:
			TNT1 A 0
			Stop
		XDeath:
			TNT1 A 0
			Stop
	}
}






Actor HeliCheckerRight
{
	Radius 64 
	Height 140 // the visual height of the heli is 136, taller than its hitbox!
	
	Speed 64
	damage 0
	damage 0
	+MISSILE
	+NOBLOCKMAP // no one can collide with us
	+THRUGHOST 
	-THRUACTORS // but we can and will collide with actors
	+NOGRAVITY
	+NOTELEPORT
	+CANNOTPUSH
	+NODAMAGETHRUST
	
	States	{
		Spawn:
			TNT1 A 0 
			// rotor blade length is 160, we must travel for 160/64 = 3 tics unobscured to guarantee the rotor does not clip through walls
			TNT1 AAA 1 
			// do not interfere with strafing caused by the missile state
			//TNT1 A 0 A_TakeInventory("CircleStrafeRight", 1, AAPTR_TARGET)
			Stop
		Death: // oh noes we collided with sumthing
			TNT1 A 0
			TNT1 A 0 A_GiveInventory("CircleStrafeRight", 1, AAPTR_TARGET)
			Stop
	}	
}

Actor HeliCheckerLeft: HeliCheckerRight
{
	States	{
		Spawn:
			TNT1 A 0 
			// rotor blade length is 160, we must travel for 160/64 = 3 tics unobscured to guarantee the rotor does not clip through walls
			TNT1 AAA 1 
			//TNT1 A 0 A_TakeInventory("CircleStrafeLeft", 1, AAPTR_TARGET)
			Stop
		Death: // oh noes we collided with sumthing
			TNT1 A 0
			TNT1 A 0 A_GiveInventory("CircleStrafeLeft", 1, AAPTR_TARGET)
			Stop
	}
}


/* OBSOLETED
Actor HeliTargetAttitudeChecker
{
	+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;	
	var int user_distance;
	var int user_x;
	var int user_y;
	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_SetUserVar("user_x", x)
			TNT1 A 0 A_SetUserVar("user_y", y)
			TNT1 A 0 A_Warp(AAPTR_TRACER, 0,0,0, 0,WARPF_NOCHECKPOSITION)
			TNT1 A 0 A_SetUserVar("user_z_delta", z - user_z_delta)
			TNT1 A 0 A_SetUserVar("user_x", user_x - x)
			TNT1 A 0 A_SetUserVar("user_y", user_y - y)
			TNT1 A 0 A_SetUserVar("user_distance", Sqrt((user_x * user_x) + (user_y * user_y)))
			
			TNT1 A 0 A_JumpIf(user_distance < 300, 3) // ignore if too close (OR no target!)
			TNT1 A 0 A_JumpIf(user_z_delta * 2 > user_distance, "IsBelow")
			TNT1 A 0 A_JumpIf(user_z_delta < 600, "IsAbove")
			TNT1 A 0 A_TakeInventory("TargetIsAbove", 1, 0, AAPTR_TARGET)
			TNT1 A 0 A_TakeInventory("TargetIsBelow", 1, 0, AAPTR_TARGET)
			TNT1 A 1
			Stop
		IsAbove:
			TNT1 A 0 A_GiveInventory("TargetIsAbove", 1, AAPTR_TARGET)
			//TNT1 A 0 A_Log("Heli too low, must ascend.")
			TNT1 A 1 
			Stop
		IsBelow:
			TNT1 A 0 A_GiveInventory("TargetIsBelow", 1, AAPTR_TARGET)
			//TNT1 A 0 A_Log("Heli too high, must descend.")
			TNT1 A 1 
			Stop
	}
}		
*/

//***Che: helicopter does not check if the ceiling above it is sky or not. Just don't put in in maps that are not outdoors.



ACTOR FBD_EnemyHeli 17877
{
	//***Che: cross-mod hardening: see ACTOR ZombieHelicopter : FBD_EnemyHeli 9953 {} in Doom_Replacements.txt
	
	//$category "FBD Bosses"
	Game Doom
	//$Sprite HELZa1
	Health 1000
	Radius 56 //***Che while visible rotor radius is 152. Must push off walls to keep distance of ~200
	Height 96
	Mass 400
	Speed 3
	PainChance 128
	BloodType "TankBlood", "TankBlood", "TankBlood"
	PainChance "HitGround", 255
	Monster
	+FLOAT +NOGRAVITY +FLOATBOB
	+DONTRIP +DONTHURTSPECIES
	Species "AttackHelicopterZombie"
	damagefactor "Railgun", 2.0 // die in two hits
	DamageFactor "TankShell", 2.0 // absolutely unnecessary since this raises player tank's direct hit damage from 2000 to 4000 while we only have 1000 health. Overkill much.
	Tag "$FBD_HELI" // "Enemy attack helicopter"
	Obituary "$FBD_HELI_O" // "%o was destroyed by a zombie-seized helicopter."
	
	// helicopter operates on 4-frame animations (full rotor revolution) 4 tic long, considering them atomic
	
	var int user_active;
	var int user_cooldown; // used by missile, to fire every fourth animation
	var int user_shots; // shots remaining in sequence
	var int user_weapon; // 1 machinegun 2 missiles
	var int user_firing_right; // to switch between left and right
	
	+NOBLOODDECALS
	-BLOODSPLATTER	
	
	var int user_angle;
	
	States
	{
		Spawn:
			HELZ ABCD 1 A_Look
			Loop
		Idle:
			TNT1 A 0 A_SetUserVar("user_active", 0)
			Goto Behavior
		See:
			TNT1 A 0
			TNT1 A 0 A_JumpIf(user_active, 4)
			TNT1 A 0 A_PlaySound("HELILOP", 6, 1, 1)
			TNT1 A 0 A_PlaySound("HELILOP2", 7, 1, 1)
			TNT1 A 0 A_SetUserVar("user_active", 1)
			TNT1 A 0 // <--- jumps here
			Goto Behavior
		Behavior:
			
			TNT1 A 0 A_CustomMissile("HeliCheckerRight", 0, 0, angle - 90, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, 0)
			TNT1 A 0 A_CustomMissile("HeliCheckerLeft", 10, 0, angle + 90, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, 0)
			
			TNT1 A 0 A_JumpIfCloser(900, "BehavFallback") // no matter if can see or not. Never come any closer
			TNT1 A 0 A_JumpIf(user_weapon, "BehavStrafe") // always strafe when firing
			
			// strafing token would be given by wall proximity probes!
			TNT1 A 0 A_JumpIfInventory("CircleStrafeLeft", 1, "BehavStrafe") 
			TNT1 A 0 A_JumpIfInventory("CircleStrafeRight", 1, "BehavStrafe")
			TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), "BehavWander")
			TNT1 A 0 A_JumpIf(!user_active, "BehavWander")
			Goto BehavChase
			
		BehavWander:
			TNT1 A 0 A_Jump(220, 2)
			TNT1 A 0 A_SetAngle(angle + Random(-15, 15))
			HELZ ABCD 1 A_Wander
			TNT1 A 0 A_Look
		BehavChase:
			HELZ A 1 A_Chase
			HELZ B 1 A_Chase("","")
			HELZ C 1 A_Chase
			HELZ D 1 A_Chase("","")
			TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), "AttitudeControl") // skip trying to strafe around corners
			TNT1 A 0 A_JumpIfTargetInLOS("AttitudeControl") //no need to strafe, target in plain sight
			
			// Try strafing around corners:

			// these are defined in DECORATE.supermastermind. Will give strafing tokens if they see the target
			TNT1 A 0 A_CustomMissile("CircleStrafeCheckerRight64", 10, 0, angle - 90, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, 0)
			TNT1 A 0 A_CustomMissile("CircleStrafeCheckerLeft64", 10, 0, angle + 90, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, 0)
			Goto AttitudeControl
			
		BehavStrafe:
			// the face target is managed by the firing code
			
			TNT1 A 0 A_JumpIfInventory("CircleStrafeLeft", 1, "BehavSL") 
			TNT1 A 0 A_JumpIfInventory("CircleStrafeRight", 1, "BehavSR")
			
			// After the initial nudge, hang passively facing the target driven by inertia
			// This happens while firing
			HELZ ABCD 1
			Goto AttitudeControl
			
		BehavSL:
			HELZ ABCD 1 ThrustThing(angle*256/360+192, 1, 0, 0)
			TNT1 A 0 A_TakeInventory("CircleStrafeLeft", 1)
			TNT1 A 0 A_JumpIfInventory("CircleStrafeRight", 1, "UnstuckHack") // If both, stuck in corner. Push forward.
			TNT1 A 0 A_JumpIf (user_weapon, "AttitudeControl") // firing already
			"----" A 0 A_SetUserVar("user_angle", angle * 100.0) // CHF_DONTMOVE fucks the angle up
			TNT1 AA 0 A_Chase("", "Missile", CHF_DONTMOVE) // must have a missile chance
			"----" A 0 A_SetAngle("user_angle", angle * 0.01)

			Goto AttitudeControl

		
		UnstuckHack:	
			TNT1 A 0 A_Recoil(-6)
			TNT1 A 0 A_JumpIf (user_weapon, "AttitudeControl") // firing already
			"----" A 0 A_SetUserVar("user_angle", angle * 100.0) // CHF_DONTMOVE fucks the angle up
			TNT1 AA 0 A_Chase("", "Missile", CHF_DONTMOVE) // must have a missile chance
			"----" A 0 A_SetAngle("user_angle", angle * 0.01)
			Goto AttitudeControl

			
		BehavSR:
			HELZ ABCD 1 ThrustThing(angle*256/360+64, 1, 0, 0)
			TNT1 A 0 A_TakeInventory("CircleStrafeRight", 1)
			TNT1 A 0 A_JumpIf (user_weapon, "AttitudeControl") // firing already
			"----" A 0 A_SetUserVar("user_angle", angle * 100.0) // CHF_DONTMOVE fucks the angle up
			TNT1 AA 0 A_Chase("", "Missile", CHF_DONTMOVE) // must have a missile chance
			"----" A 0 A_SetAngle("user_angle", angle * 0.01)
			Goto AttitudeControl

			
		BehavFallback:
			TNT1 A 0 A_Recoil(4)
			TNT1 A 0 A_JumpIfInventory("CircleStrafeLeft", 1, "BehavSL") 
			TNT1 A 0 A_JumpIfInventory("CircleStrafeRight", 1, "BehavSR")
			HELZ ABCD 1
			TNT1 A 0 A_JumpIf (user_weapon, "AttitudeControl") // firing already
			"----" A 0 A_SetUserVar("user_angle", angle * 100.0) // CHF_DONTMOVE fucks the angle up
			TNT1 AA 0 A_Chase("", "Missile", CHF_DONTMOVE) // must have a missile chance
			"----" A 0 A_SetAngle("user_angle", angle * 0.01)
			Goto AttitudeControl


		AttitudeControl:
			// avoiding floor/ceiling takes precedent
			
			TNT1 A 0 A_JumpIf((z - floorz) < 128, "Ascend")
			TNT1 A 0 A_JumpIf((ceilingz - z) < 160, "Descend") // the visual heigh of the heli is 136, taller than its hitbox!
			
			/*
			TNT1 A 0 A_CustomMissile("HeliTargetAttitudeChecker")
			TNT1 A 0 A_JumpIfInventory("TargetIsBelow", 1, "Descend")
			TNT1 A 0 A_JumpIfInventory("TargetIsAbove", 1, "Ascend")
			*/
			TNT1 A 0 A_JumpIf(CallAcs("GetDistanceToTarget", 0) < 300, "Firing") // skip
			TNT1 A 0 A_JumpIf(CallAcs("GetZDeltaToTarget") * 2 < CallAcs("GetDistanceToTarget"), "Ascend")
			TNT1 A 0 A_JumpIf(CallAcs("GetZDeltaToTarget") > 600, "Descend")			
			
			Goto Firing
		Ascend:
			TNT1 A 0 ThrustThingZ(0,2,0,0)
			Goto Firing
		Descend:
			TNT1 A 0 ThrustThingZ(0,2,1,0)
			Goto Firing
			
		Firing:
			TNT1 A 0 A_JumpIf(user_weapon == 1, "FireMachinegun")
			TNT1 A 0 A_JumpIf(user_weapon == 2, "FireMissile")
			Goto Behavior // not firing, just loop back to the beginning
		
		FireMachinegun:	
			TNT1 A 0 A_PlaySound("TANKMG", 1)
			TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 40, 0, random(-2, 2), 0)
				//***Che: do NOT adjust aim if target goes out of sight or is invisible
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
				TNT1 A 0 A_JumpIfTargetInLOS(2)
				TNT1 A 0 A_Jump(256, 2)
				TNT1 A 0 A_FaceTarget

			// with auto-aim disabled, relying on angle:			
			TNT1 A 0 A_CustomMissile("AutoCannonProjectileEnemy", 40, 0, angle + random(-2, 2), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
			TNT1 A 0 A_CustomMissile("AutocannonMuzzle2", 40, 0, random(-2, 2), 0)
			Goto Refire
			
		FireMissile:
			TNT1 A 0 A_SetUserVar("user_cooldown", user_cooldown + 1)
			TNT1 A 0 A_JumpIf(user_cooldown < 4, "Behavior")
			TNT1 A 0 A_SetUserVar("user_cooldown", 0)
			
			TNT1 A 0 A_JumpIf(user_firing_right, "FireMissileRight")
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
				// MUST use auto-aiming at visible targets, otherwise misses at close range due to projectile's origin offset
				TNT1 A 0 A_JumpIfTargetInLOS(3)
				// the version with auto-aim disabled:		
				TNT1 A 0 A_CustomMissile("EnemyHelicopterRocket", 15, -42, angle + random(-3, 3), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
				TNT1 A 0 A_Jump(256, 2)
				// the auto-aimed version:
				TNT1 A 0 A_CustomMissile("EnemyHelicopterRocket", 15, -42, random(-3, 3), 0)
			TNT1 A 0 A_SetUserVar("user_firing_right", 1)
			Goto Refire
		
		FireMissileRight:
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
				// MUST use auto-aiming at visible targets, otherwise misses at close range due to projectile's origin offset
				TNT1 A 0 A_JumpIfTargetInLOS(3)
				// the version with auto-aim disabled:		
				TNT1 A 0 A_CustomMissile("EnemyHelicopterRocket", 15, 42, angle + random(-3, 3), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
				TNT1 A 0 A_Jump(256, 2)
				// the auto-aimed version:
				TNT1 A 0 A_CustomMissile("EnemyHelicopterRocket", 15, 42, random(-3, 3), 0)		
			TNT1 A 0 A_SetUserVar("user_firing_right", 0)
			Goto Refire
			
		Refire:
			TNT1 A 0 A_SetUserVar("user_shots", user_shots - 1)
			TNT1 A 0 A_JumpIf(user_shots, "Behavior")
			TNT1 A 0 A_SetUserVar("user_weapon", 0)
			Goto Behavior
		
		Missile:
			TNT1 A 0

			//***Che Kinslayer check:	
			TNT1 A 0 A_JumpIf(!CheckClass("ZombieHelicopter", AAPTR_TARGET, true), 2)
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_InfightFriendlyFireOn")

			TNT1 A 0 A_FaceTarget
			
			TNT1 A 0 A_Jump(128, "Machinegun")
			
			TNT1 A 0 A_SetUserVar("user_weapon", 2)
			TNT1 A 0 A_SetUserVar("user_shots", 2 * Random(1, 3))
			Goto MissileStartStrafing

		Machinegun:	
			TNT1 A 0 A_SetUserVar("user_weapon", 1)
			TNT1 A 0 A_SetUserVar("user_shots", Random(6, 10))
			Goto MissileStartStrafing
			
		MissileStartStrafing:
			// don't, if already strafing:
			TNT1 A 0 A_JumpIfInventory("CircleStrafeLeft", 1, "Behavior") 
			TNT1 A 0 A_JumpIfInventory("CircleStrafeRight", 1, "Behavior")
			
			TNT1 A 0 A_Jump(128, 2)
			TNT1 A 0 A_GiveInventory("CircleStrafeLeft") 
			Goto Behavior
			TNT1 A 0 A_GiveInventory("CircleStrafeRight")
			Goto Behavior
			
		Pain:
			HELZ ABCD 1
			Goto See
			
		Pain.HitGround:
			PLAY G 0
			TNT1 A 0 ThrustThingZ(0,10,0,1)
			TNT1 A 0 A_SpawnItem("HeliBase1")
			HELZ A 1 A_Pain
			Goto See	
			
		Death:	
			TNT1 A 0
			TNT1 A 0 A_Stop
			TNT1 A 0 A_Recoil(-3)
			TNT1 A 0 A_StopSound(6)
			TNT1 A 0 A_StopSound(7)
			TNT1 A 0 A_TakeInventory("AttackhelicopterGun", 1)
			TNT1 A 0 ACS_ExecuteAlways(871, 0, 0, 0, 0)
			TNT1 A 0 SetPlayerProperty(0,0,4)
			TNT1 A 0 A_PlaySound("HELSTOP", 6)
			TNT1 A 0 A_ChangeFlag("QUARTERGRAVITY", 1)
		
		Falling:
			TNT1 A 0 A_Scream
			TNT1 A 0 A_ClearTarget
			TNT1 A 0 A_NoBlocking
			HEL1 AB 1 A_CustomMissile ("FlamethrowerFireParticles", 32, 0, random (0, 360), 2, random (0, 180))
			TNT1 A 0 A_SetAngle(10 + angle)
			HEL1 CD 1 A_CustomMissile ("FlamethrowerFireParticles", 32, 0, random (0, 360), 2, random (0, 180))
			TNT1 A 0 A_SetAngle(10 + angle)
			TNT1 A 0 A_CheckFloor("Crashed")
			Loop
		
		Crashed:
			TNT1 A 0 A_SpawnItem("BigExplosion1112")
			TNT1 A 0 A_PlaySound("weapons/explode")
			TNT1 A 0 A_PlaySound("EXPLOSIO", 3)
			
			NULL AAAAAA 0 A_CustomMissile ("MetalShard1", 96, 0, random (0, 360), 2, random (0, 180))
			NULL AAAAAA 0 A_CustomMissile ("MetalShard2", 96, 0, random (0, 360), 2, random (0, 180))
			NULL AAAAAAAAA 0 A_CustomMissile ("GlassShard", 96, 0, random (0, 360), 2, random (0, 360))
			TNT1 A 0 A_StopSound(6)
			ELEC A 0 A_Explode(100, 250)
			TNT1 A 0 A_SpawnItemEx("DestroyedAircraft",0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
			8762 A 500
			8762 A 2000
			8762 A -1
			Stop
	}
}



Actor HMGEnemyBulletSimplePuff: HeavyMachinegunProjectileEnemy
{
	// the mech has fire rate so high it spams too many sparks!
	States
	{
		Death:
			TNT1 A 0 A_NoBlocking
			TNT1 A 0 A_CustomMissile ("PlasmaSmoke", 2, 0, random (0, 360), 2, random (0, 360))
			TNT1 A 1 A_Jump(85, "RegularSfx")
			Stop
		RegularSfx:
			TNT1 A 0 A_SpawnItem("BulletPuff")
			TNT1 AA 0 A_CustomMissile ("ExplosionParticleVeryFast", 0, 0, random (0, 360), 2, random (0, 40))
			TNT1 A 1
			Stop		
	}
}


ACTOR MechPotpourriChecker: AbstractPotpourriChecker
{
	Radius 48
	Height 160
}

//***Che: also fixed the bug of mech dragging a tank engine weak spot between its legs:
//  it was being spawned by EnemyTnkTreadsDamage

ACTOR FBD_EnemyMech 17878
{

	//***Che: turning his state machine inside out by implementing two independent layers manually: moving and firing
	
	//***Che: cross-mod hardening: see ACTOR ZombieMech : FBD_EnemyMech 9954 {} in Doom_Replacements.txt
	
	//$category "FBD Bosses"
	Game Doom
	//$Sprite MEKEC1
	//***Che I made him into a smartass dodgy ninja. Something had to give!
	//Health 3000
	Health 1000
	Scale 1.3
	Radius 48
	Height 160
	
	MaxStepHeight 64
	MaxDropoffHeight 64
	
	Mass 1000
	Speed 16
	//PainChance 20
	PainChance 255
	// he spends critical animation phases in NOPAIN anyway
	
	damagefactor "Avoid", 1.0
	damagefactor "RailAvoid", 1.0 // one of 2 monsters affected by this
	
	damagefactor "Stomp", 0.0 // otherwise they kill each other while bunny-hopping
	
	Monster
	MinMissileChance 160
	+BOSS
	+FULLVOLACTIVE
	+MISSILEMORE
	+FLOORCLIP
	+NORADIUSDMG
	+DONTMORPH
	+BOSSDEATH
	BloodType "TankBlood", "TankBlood", "TankBlood"
	SeeSound "none"
	PainSound "none"
	DeathSound "none"
	ActiveSound "none"
	Tag "$FBD_MECH" // "Zombie-seized Mech";
	Obituary "$FBD_MECH_O" // "%o was destroyed by a zombie-seized Mech."
	
	var int user_head_tid;
	var int user_head_type; // 11, mech cockpit
	var int user_head_rel;
	var int user_head_scale;
	var int user_head_xyzf; /* 
		a packed value: 
		bits 0..7 =x+128, clamped to -128..127
		bits 8..15 =y+128, clamped to -128..127
		bits 16..23 =z, clamped to 1..255
		bit 29 is a command to assume an unique TID, used in monster-on-monster headshotting
		A zero value is a command to terminate
	*/	
	var int user_sleeping;
	var int user_item_no;
	var int user_serverside_sfchk;
	
	var int user_shots; // shots remaining in sequence
	var int user_weapon; // 1 machinegun 2 rockets 3 plasma
	var int user_fire_period; // tics between shots
	var int user_wp_tic; // current tic after a shot
	// mortar is always fired from a standing position & nopain
	var int user_firing_right; // to switch between left and right
	var int user_anim_phase; // 1 - stang (firing); 2,3 - strafe left; 4,5 - strafe right; 6 - jump;
	var int user_anim_frame; 
	var int user_anim_left; // tics left 
	
	PainChance "Head", 255
	PainChance "HeadPlasma", 255
	PainChance "HeadStun", 255
	PainChance "Decaptate", 255
	PainChance "Avoid", 255
	PainChance "RailAvoid", 255
	
	//***Che:
	Species "EnemyMech"
	
	GibHealth 1000
	
	// A_Chase("Melee", "Missile", CHF_DONTMOVE)
	
	
	// headbox offset 16 0 79
	// x 1.3 = 21 0 103, correcting to 48 - 12 = 36, 0, 103
	
	// weapon muzzle offsets (muzzle flash forward) sideways up
	// raw | x 1.3
	// plasma (31) 36 70 | (40) 47 91
	// machinegun (31) 57 83 | (40) 74 108
	// rockets (6) 39 104 | (9) 51 135
	
	var int user_aggro_at_head; // required for the ACS script "FBD_TryReAggroAtHead"
	
	+NOBLOODDECALS
	-BLOODSPLATTER
	
	var int user_angle;
	
	States
	{
		
		Spawn:
			//***Che: switching to my advanced headboxes
			MEKE A 0 NODELAY ACS_NamedExecuteWithResult("FBD_RunMonster", 11) // mech cockpit
			TNT1 A 0 A_GiveInventory("TargetIsAGreatTerribleBoss") // advanced monster behavior
			TNT1 A 0 A_GiveInventory("TargetIsABoss") // advanced monster behavior
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			MEKE A 7 // takes 5 tics for slaughtermap init
			TNT1 A 0 ACS_NamedExecuteWithResult("AdjustHeadboxMkII", 36, 0, 103, 1) // force create
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
		Stand:
			MEKE A 5 A_Look
			Loop
		See:
			TNT1 A 0 A_SetUserVar("user_anim_phase", 0)
			TNT1 A 0  A_JumpIfCloser(700, "SeeMaybeStrafe")
		SeeContinue:	
			MEKE BBB 2 A_Chase
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 100, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_PlaySound("MECHWLK", 15)
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			MEKE CCC 2 A_Chase
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 100, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			MEKE DDD 2
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			MEKE EEE 2 A_Chase
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 100, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_PlaySound("MECHWLK", 15)
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			MEKE FFF 2 A_Chase
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 100, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			MEKE GGG 2
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			TNT1 A 0 A_JumpIfCloser(300, "MaybeStomp")
			Loop
		Idle: // without this state, jumps to Spawn wrecking havok with the init scripts!
			TNT1 A 0
			TNT1 A 0 A_SetUserVar("user_sleeping", 1)
		LookingForPlayer:
			MEKE AAA 10 A_Look
			TNT1 A 0 A_Jump(64, "LookingForPlayer2")
			Loop
		LookingForPlayer2: // walking at half speed
			TNT1 A 0 A_SetAngle(angle + Random(-50,50))
			MEKE BBB 4 A_Wander
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 100, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_PlaySound("MECHWLK", 15)
			MEKE CCC 4 A_Wander
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 100, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			MEKE DDD 4 A_Look
			MEKE EEE 4 A_Wander
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 100, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_PlaySound("MECHWLK", 15)
			MEKE FFF 4 A_Wander
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 100, 0, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			MEKE GGG 4 A_Look
			TNT1 A 0 A_Jump(32, "LookingForPlayer")
			Loop			
			
		SeeMaybeStrafe: // jumps here from See
			TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), "LookingForPlayer2") //***Che это зацикливалось и игра вылетала:  "LookingForPlayer")
				// потому что LookingForPlayer сразу вызывает A_Look, которая прыгает на See и мы снова прилетаем сюда,
				// и у попа была собака
			TNT1 A 0 A_JumpIfTargetInLOS("Strafe", 0, JLOSF_DEADNOJUMP)
			TNT1 A 0 A_JumpIfInTargetInventory("TargetIsABoss", 1, "Strafe")
			TNT1 A 0 A_JumpIfInTargetInventory("TargetIsAGreatTerribleBoss", 1, "Strafe")
			TNT1 A 0 A_JumpIfInTargetInventory("IsInATank", 1, "Strafe")
			Goto SeeContinue
		Pain:
			MEKE B 1 A_Pain
			Goto Strafe
		Pain.KillMe:
		Pain.Taunt:
			TNT1 A 0 HealThing(1)
			Goto Strafe
		Pain.Avoid:
		Pain.RailAvoid:
		Pain.KillMe:
		Pain.Taunt:
			TNT1 A 0 HealThing(1)
			Goto Dodge
		Pain.Bfg10k:
		Pain.Explosive: // direct rocket hit
		pain.Explosives: // revenant fireball
		Pain.TankShell: // meaningless: player tank does 2000 direct hit damage, we have 1000 health
		Pain.Railgun:
		Pain.Head: // doesn't like to be shot in the cockpit
		Pain.HeadStun:
		Pain.HeadPlasma:
			MEKE B 1 A_Pain
			Goto Dodge
		Strafe:	
			TNT1 A 0 A_JumpIf(user_anim_phase >= 2 && user_anim_phase <= 6, "AnimateMoving") // if jumpiing or already strafing, skip
			TNT1 A 0 A_FaceTarget
			TNT1 A 0 A_Jump(256, "StrafeLeft", "StrafeRight")
			TNT1 A 0 A_SetUserVar("user_anim_left", 24) // 4 walking frames
			TNT1 A 0 A_SetUserVar("user_anim_frame", 0)
			TNT1 A 0 A_Jump(256, "StrafeLeft", "StrafeRight")
		StrafeLeft:
			TNT1 A 0 A_JumpIf(user_anim_phase == 6, "AnimateMoving") // if jumpiing, skip
			TNT1 A 0 A_SetUserVar("user_anim_phase", 2)
			TNT1 A 0 A_TakeInventory("CircleStrafeLeft", 1) // tokens given by strafe checker projectiles
			TNT1 A 0 A_TakeInventory("CircleStrafeRight", 1)
			TNT1 A 0 A_SetUserVar("user_anim_left", user_anim_left + 24) //+ 4 walking frames
			Goto AnimateMoving
		StrafeRight:
			TNT1 A 0 A_JumpIf(user_anim_phase == 6, "AnimateMoving") // if jumpiing, skip
			TNT1 A 0 A_SetUserVar("user_anim_phase", 4)
			TNT1 A 0 A_TakeInventory("CircleStrafeLeft", 1)
			TNT1 A 0 A_TakeInventory("CircleStrafeRight", 1)
			TNT1 A 0 A_SetUserVar("user_anim_left", user_anim_left + 24) //+ 4 walking frames
			Goto AnimateMoving
		Dodge:
			TNT1 A 0 A_JumpIf(user_anim_phase == 6, "AnimateMoving") // if already jumpiing, skip
			TNT1 A 0 A_TakeInventory("DuckYouFool", 1)
			TNT1 A 0 A_FaceTarget
			TNT1 A 0 ThrustThingZ(0,20,0,1)
			TNT1 A 0 A_SetUserVar("user_anim_phase", 6) // jumping
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			MEKE H 1 // otherwise a_checkfloor would fire before he lifts off
			TNT1 A 0 A_Jump(256, "DodgeLeft", "DodgeRight")
		DodgeLeft:
			TNT1 A 0 A_SetAngle(angle + 90)
			TNT1 A 0 A_Recoil(10)
			TNT1 A 0 A_SetAngle(angle - 90)
			Goto AnimateMoving
		DodgeRight:
			TNT1 A 0 A_SetAngle(angle - 90)
			TNT1 A 0 A_Recoil(10)
			TNT1 A 0 A_SetAngle(angle + 90)
			Goto AnimateMoving
		LeapBackSpraying:
			TNT1 A 0 A_TakeInventory("DuckYouFool", 1)
			TNT1 A 0 A_JumpIf(user_anim_phase == 6, "AnimateMoving") // already in a jump
			TNT1 A 0 A_FaceTarget
			TNT1 A 0 ThrustThingZ(0,20,0,1)
			TNT1 A 0 A_SetUserVar("user_anim_phase", 6) // jumping
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			MEKE H 1 // otherwise a_checkfloor would fire before he lifts off
			TNT1 A 0 A_Recoil(10)
			TNT1 A 0 A_JumpIf(user_weapon, "AnimateMoving") // already firing
			Goto MissileOnTheMove // start firing
		MaybeStomp:
			TNT1 A 0 A_JumpIfTargetInLOS(1, 0, JLOSF_DEADNOJUMP)
			Goto AnimateMoving
			TNT1 A 0 A_JumpIfInTargetInventory("TargetIsAGreatTerribleBoss", 1, "Dodge")
			TNT1 A 0 A_JumpIfInTargetInventory("TargetIsABoss", 1, "LeapBackSpraying")
			TNT1 A 0 A_JumpIfInTargetInventory("IsInATank", 1, "LeapBackSpraying")
			Goto Stomp
		Stomp:
			TNT1 A 0 A_TakeInventory("DuckYouFool", 1)
			TNT1 A 0 A_JumpIf(user_anim_phase == 6, "AnimateMoving") // already in a jump
			TNT1 A 0 A_FaceTarget
			TNT1 A 0 ThrustThingZ(0,20,0,1)
			TNT1 A 0 A_SetUserVar("user_anim_phase", 6) // jumping
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			MEKE H 1 // otherwise a_checkfloor would fire before he lifts off
			TNT1 A 0 A_Recoil(-10) // leap towards the target -- he *always* makes a cyberdemon stomp every time he lands from a jump!
			Goto AnimateMoving
			
		AnimateMoving:
			TNT1 A 0 A_JumpIf(!user_anim_phase, "See")
			TNT1 A 0 A_JumpIf(user_anim_phase == 2, "AnimSL1")
			TNT1 A 0 A_JumpIf(user_anim_phase == 3, "AnimSL2")
			TNT1 A 0 A_JumpIf(user_anim_phase == 4, "AnimSR1")
			TNT1 A 0 A_JumpIf(user_anim_phase == 5, "AnimSR2")
			TNT1 A 0 A_JumpIf(user_anim_phase == 6, "AnimJump")
		
			// treat any other as phase == 1
			Goto AnimStand
			
		AnimStand:
			MEKE A 1 A_ChangeFlag("NOPAIN", 0)
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			TNT1 A 0 A_JumpIf(!user_weapon, "See") // if not firing, out of this phase and into walking
			TNT1 A 0 A_JumpIfTargetInLOS("AnimateFiring")
			TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), "AnimateFiring") // don't check is targeted player is invisible
			Goto AnimCheckStrafe
		AnimCheckStrafe:
			// tokens given by theprobing projectiles below during the previous cycles
			TNT1 A 0 A_JumpIfInventory("CircleStrafeLeft", 1, "CircleStrafeLeft") 
			TNT1 A 0 A_JumpIfInventory("CircleStrafeRight", 1, "CircleStrafeRight")

			// these are defined in DECORATE.supermastermind
			TNT1 A 0 A_CustomMissile("CircleStrafeCheckerRight64", 70, 0, angle - 90, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, 0)
			TNT1 A 0 A_CustomMissile("CircleStrafeCheckerLeft64", 70, 0, angle + 90, CMF_ABSOLUTEANGLE | CMF_ABSOLUTEPITCH | CMF_SAVEPITCH, 0)
			Goto AnimateFiring
			
		CircleStrafeLeft:
			TNT1 A 0 A_JumpIf(user_anim_phase == 6, "AnimateMoving") // if jumpiing, skip
			TNT1 A 0 A_SetUserVar("user_anim_phase", 2)
			TNT1 A 0 A_TakeInventory("CircleStrafeLeft", 1) // tokens given by strafe checker projectiles
			TNT1 A 0 A_TakeInventory("CircleStrafeRight", 1)
			TNT1 A 0 A_SetUserVar("user_anim_left", 24) //+ 4 walking frames
			Goto AnimateFiring
		CircleStrafeRight:
			TNT1 A 0 A_JumpIf(user_anim_phase == 6, "AnimateMoving") // if jumpiing, skip
			TNT1 A 0 A_SetUserVar("user_anim_phase", 4)
			TNT1 A 0 A_TakeInventory("CircleStrafeLeft", 1)
			TNT1 A 0 A_TakeInventory("CircleStrafeRight", 1)
			TNT1 A 0 A_SetUserVar("user_anim_left", 24) //+ 4 walking frames
			Goto AnimateFiring			

		AnimJump:
			MEKE H 1 A_CheckFloor("AnimLand")
			Goto AnimateFiring
		AnimLand:
			TNT1 A 0 A_SetUserVar("user_anim_phase", 1) // stand
			MEKE A 1 A_CustomMissile("CyberStomp",10,0,0,0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			Goto AnimateFiring
		AnimStop:
			TNT1 A 0 A_SetUserVar("user_anim_phase", 1) // stand
			MEKE A 1 A_PlaySound("MECHWLK", CHAN_BODY)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			Goto AnimateFiring
		AnimSL1:
			TNT1 A 0 A_SetUserVar("user_anim_left", user_anim_left - 1)
			TNT1 A 0 A_JumpIf(user_anim_left <= 0, "AnimStop")
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			TNT1 A 0 A_SetUserVar("user_anim_left", user_anim_left -1)
			MEKE E 1 A_SetUserVar("user_anim_frame", user_anim_frame + 1)
			TNT1 A 0 A_JumpIf(user_anim_frame > 4, 1)
			Goto AnimateFiring
			TNT1 A 0 A_PlaySound("MECHWLK", CHAN_BODY)
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 0, -100, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			TNT1 A 0 A_SetUserVar("user_anim_frame", 0)
			TNT1 A 0 A_SetUserVar("user_anim_phase", 3)
			TNT1 A 0 A_Stop // otherwise they accelerate to near-teleporting speeds while out of sight
			TNT1 A 0 ThrustThingZ(0,5,0,1)
			TNT1 A 0 A_SetAngle(angle + 90)
			TNT1 A 0 A_Recoil(7)
			TNT1 A 0 A_SetAngle(angle - 90)
			Goto AnimateFiring	
		AnimSL2:
			TNT1 A 0 A_SetUserVar("user_anim_left", user_anim_left - 1)
			TNT1 A 0 A_JumpIf(user_anim_left <= 0, "AnimStop")
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			MEKE B 1 A_SetUserVar("user_anim_frame", user_anim_frame + 1)
			TNT1 A 0 A_JumpIf(user_anim_frame > 4, 1)
			Goto AnimateFiring
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 0, -100, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			TNT1 A 0 A_SetUserVar("user_anim_frame", 0)
			TNT1 A 0 A_SetUserVar("user_anim_phase", 2)
			TNT1 A 0 A_Stop // otherwise they accelerate to near-teleporting speeds while out of sight
			TNT1 A 0 ThrustThingZ(0,5,0,1)
			TNT1 A 0 A_SetAngle(angle + 90)
			TNT1 A 0 A_Recoil(7)
			TNT1 A 0 A_SetAngle(angle - 90)
			Goto AnimateFiring
		AnimSR1:
			TNT1 A 0 A_SetUserVar("user_anim_left", user_anim_left - 1)
			TNT1 A 0 A_JumpIf(user_anim_left <= 0, "AnimStop")
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			MEKE B 1 A_SetUserVar("user_anim_frame", user_anim_frame + 1)
			TNT1 A 0 A_JumpIf(user_anim_frame > 4, 1)
			Goto AnimateFiring
			TNT1 A 0 A_PlaySound("MECHWLK", CHAN_BODY)
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 0, 100, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			TNT1 A 0 A_SetUserVar("user_anim_frame", 0)
			TNT1 A 0 A_SetUserVar("user_anim_phase", 5)
			TNT1 A 0 A_Stop // otherwise they accelerate to near-teleporting speeds while out of sight
			TNT1 A 0 ThrustThingZ(0,5,0,1)
			TNT1 A 0 A_SetAngle(angle - 90)
			TNT1 A 0 A_Recoil(7)
			TNT1 A 0 A_SetAngle(angle + 90)
			Goto AnimateFiring	
		AnimSR2:
			TNT1 A 0 A_SetUserVar("user_anim_left", user_anim_left - 1)
			TNT1 A 0 A_JumpIf(user_anim_left <= 0, "AnimStop")
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			MEKE E 1 A_SetUserVar("user_anim_frame", user_anim_frame + 1)
			TNT1 A 0 A_JumpIf(user_anim_frame > 4, 1)
			Goto AnimateFiring
			TNT1 A 0 A_SpawnItemEx ("EnemyTnkTreadsDamage" , 0, 100, 0, 0, 0, 0, angle, SXF_ABSOLUTEANGLE | SXF_ABSOLUTEVELOCITY)
			TNT1 A 0 A_JumpIfInventory("DuckYouFool", 1, "Dodge")
			TNT1 A 0 A_SetUserVar("user_anim_frame", 0)
			TNT1 A 0 A_SetUserVar("user_anim_phase", 4)
			TNT1 A 0 A_Stop // otherwise they accelerate to near-teleporting speeds while out of sight
			TNT1 A 0 ThrustThingZ(0,5,0,1)
			TNT1 A 0 A_SetAngle(angle - 90)
			TNT1 A 0 A_Recoil(7)
			TNT1 A 0 A_SetAngle(angle + 90)
			Goto AnimateFiring
			
		AnimateFiring:
			// if not firing yet, usual firing chance
			TNT1 A 0 A_JumpIf(!user_weapon, "AnimChase")
			
			// otherwise, firing weapon:
			TNT1 A 0 A_SetUserVar("user_wp_tic", user_wp_tic + 1)
			TNT1 A 0 A_JumpIf(user_wp_tic < user_fire_period, "AnimateMoving")
			TNT1 A 0 A_SetUserVar("user_wp_tic", 0)
			TNT1 A 0 A_JumpIf(user_weapon == 2, "AnimFireRocketLeft")
			TNT1 A 0 A_JumpIf(user_weapon == 3, "AnimFirePlasmaLeft")
			
			// treat all others as user_weapon == 1 machinegun
		AnimFireMachinegunLeft:
			TNT1 A 0 A_JumpIf(user_firing_right, "AnimFireMachinegunRight")
			TNT1 A 0 A_PlaySound("TANKMG", CHAN_WEAPON)
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
				// MUST use auto-aiming at visible targets, otherwise misses at close range due to projectile's origin offset
				TNT1 A 0 A_JumpIfTargetInLOS(3)
				// the version with auto-aim disabled:		
				TNT1 A 0 A_CustomMissile("HMGEnemyBulletSimplePuff", 108, -74, angle + random(-11, 11), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
				TNT1 A 0 A_Jump(256, 2)
				// the auto-aimed version:
				TNT1 A 0 A_CustomMissile("HMGEnemyBulletSimplePuff", 108, -74, random(-11, 11), 0)
			TNT1 AA 0 A_CustomMissile("HeavyMachinegunFlash", 108, -74, 0, 0)
			TNT1 A 0 A_CustomMissile("RifleCaseSpawn", 72, -42, 180, 0)			
			Goto AnimRefire
			
		AnimFireMachinegunRight:
			TNT1 A 0 A_PlaySound("TANKMG", 6)
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
				// MUST use auto-aiming at visible targets, otherwise misses at close range due to projectile's origin offset
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 2)
				TNT1 A 0 A_JumpIfTargetInLOS(3)
				// the version with auto-aim disabled:		
				TNT1 A 0 A_CustomMissile("HMGEnemyBulletSimplePuff", 108, 74, angle + random(-11, 11), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
				TNT1 A 0 A_Jump(256, 2)
				// the auto-aimed version:
				TNT1 A 0 A_CustomMissile("HMGEnemyBulletSimplePuff", 108, 74, random(-11, 11), 0)
			TNT1 AA 0 A_CustomMissile("HeavyMachinegunFlash", 108, 74, 0, 0)
			TNT1 A 0 A_CustomMissile("RifleCaseSpawn", 72, 42, 180, 0)			
			Goto AnimRefire
			
		AnimFireRocketLeft:
			TNT1 A 0 A_JumpIf(user_firing_right, "AnimFireRocketRight")
			TNT1 A 0 A_PlaySound("MISLFIRE", CHAN_WEAPON)
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
				// MUST use auto-aiming at visible targets, otherwise misses at close range due to projectile's origin offset
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 2)
				TNT1 A 0 A_JumpIfTargetInLOS(3)
				// the version with auto-aim disabled:		
				TNT1 A 0 A_CustomMissile("JuggernautROcket", 135, -51, angle + random(-9, 9), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
				TNT1 A 0 A_Jump(256, 2)
				// the auto-aimed version:
				TNT1 A 0 A_CustomMissile("JuggernautROcket", 135, -51, random(-9, 9), 0)
			TNT1 A 0 A_CustomMissile("TankFireEffect", 135, -51, 0, 0)				
			Goto AnimRefire
			
		AnimFireRocketRight:
			TNT1 A 0 A_PlaySound("MISLFIRE", CHAN_WEAPON)
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
				// MUST use auto-aiming at visible targets, otherwise misses at close range due to projectile's origin offset
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 2)
				TNT1 A 0 A_JumpIfTargetInLOS(3)
				// the version with auto-aim disabled:		
				TNT1 A 0 A_CustomMissile("JuggernautROcket", 135, 51, angle + random(-9, 9), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
				TNT1 A 0 A_Jump(256, 2)
				// the auto-aimed version:
				TNT1 A 0 A_CustomMissile("JuggernautROcket", 135, 51, random(-9, 9), 0)
			TNT1 A 0 A_CustomMissile("TankFireEffect", 135, 51, 0, 0)				
			Goto AnimRefire
			
		AnimFirePlasmaLeft:
			TNT1 A 0 A_JumpIf(user_firing_right, "AnimFirePlasmaRight")
			TNT1 A 0 A_PlaySound("BIGPLSM1", CHAN_WEAPON)
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
				// MUST use auto-aiming at visible targets, otherwise misses at close range due to projectile's origin offset
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 2)
				TNT1 A 0 A_JumpIfTargetInLOS(3)
				// the version with auto-aim disabled:		
				TNT1 A 0 A_CustomMissile("heavyplasmaProjectileEnemy", 91, -49, angle + random(-3, 3), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
				TNT1 A 0 A_Jump(256, 2)
				// the auto-aimed version:
				TNT1 A 0 A_CustomMissile("heavyplasmaProjectileEnemy", 91, -49, random(-3, 3), 0)
			TNT1 AA 0 A_CustomMissile("heavyplasmaFlash", 91, -49, 0, 0)				
			Goto AnimRefire
		AnimFirePlasmaRight:
			TNT1 A 0 A_PlaySound("BIGPLSM1", 6)
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
				// MUST use auto-aiming at visible targets, otherwise misses at close range due to projectile's origin offset
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 2)
				TNT1 A 0 A_JumpIfTargetInLOS(3)
				// the version with auto-aim disabled:		
				TNT1 A 0 A_CustomMissile("heavyplasmaProjectileEnemy", 91, 49, angle + random(-3, 3), CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
				TNT1 A 0 A_Jump(256, 2)
				// the auto-aimed version:
				TNT1 A 0 A_CustomMissile("heavyplasmaProjectileEnemy", 91, 49, random(-3, 3), 0)
			TNT1 AA 0 A_CustomMissile("heavyplasmaFlash", 91, 49, 0, 0)				
			Goto AnimRefire			
		AnimRefire:
			TNT1 A 0 A_SetUserVar("user_shots", user_shots - 1)
			TNT1 A 0 A_JumpIf(user_shots <= 0, "AnimStopFiring")
			TNT1 A 0 A_JumpIf(user_firing_right, 2)
			TNT1 A 0 A_SetUserVar("user_firing_right", 1)
			Goto AnimateMoving
			TNT1 A 0 A_SetUserVar("user_firing_right", 0)
			TNT1 A 0 A_JumpIfCloser(300, "MaybeStomp")
			Goto AnimateMoving
		
		AnimStopFiring:
			TNT1 A 0 A_SetUserVar("user_weapon", 0)
			Goto AnimateMoving

		
		AnimChase: // effectively doubles missile chance (by design, not because Cheb is lazy!)
					// because is called every tic, not every 2 tics as in See
			"----" A 0 A_SetUserVar("user_angle", angle * 100.0)
			TNT1 A 0 A_Chase("", "MissileOnTheMove", CHF_DONTMOVE) // on the move excludes mortar
			"----" A 0 A_SetAngle("user_angle", angle * 0.01)
			TNT1 A 0 A_JumpIfCloser(300, "MaybeStomp")
			Goto AnimateMoving
		
		Missile:
			TNT1 A 0 A_FaceTarget
			
			//***Che Kinslayer check:	
			TNT1 A 0 A_JumpIf(!CheckClass("ZombieMech", AAPTR_TARGET, true), 2)
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_InfightFriendlyFireOn")
			
			//***Che: attack bosses by headshotting them
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_TryReAggroAtHead",1,0,TIDtoHate)

			
			TNT1 A 0 A_SetUserVar("user_firing_right", 0)
			TNT1 A 0 A_SetUserVar("user_wp_tic", 0)
			TNT1 A 0 A_Jump(256, "Machinegun", "Machinegun", "Rockets", "Rockets", "Plasma", "Mortar")
		Machinegun:
			TNT1 A 0 A_SetUserVar("user_shots", 60)
			TNT1 A 0 A_SetUserVar("user_fire_period", 1)
			TNT1 A 0 A_SetUserVar("user_weapon", 1)
			Goto ProceedFiring
		Plasma:
			TNT1 A 0 A_SetUserVar("user_shots", 8)
			TNT1 A 0 A_SetUserVar("user_fire_period", 4)
			TNT1 A 0 A_SetUserVar("user_weapon", 2)	
			Goto ProceedFiring
		Rockets:
			TNT1 A 0 A_SetUserVar("user_shots", 4)
			TNT1 A 0 A_SetUserVar("user_fire_period", 8)
			TNT1 A 0 A_SetUserVar("user_weapon", 3)	
		ProceedFiring:
			TNT1 A 0 A_JumpIf(user_anim_phase, "AnimateMoving")
			TNT1 A 0 A_SetUserVar("user_anim_phase", 1) // use standing animation if did not have one active yet
			Goto AnimateMoving
			
		MissileOnTheMove: // excludes mortar
			TNT1 A 0 A_FaceTarget
		
			//***Che Kinslayer check:	
			TNT1 A 0 A_JumpIf(!CheckClass("ZombieMech", AAPTR_TARGET, true), 2)
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_InfightFriendlyFireOn")
			
			//***Che: attack bosses by headshotting them
			TNT1 A 0 ACS_NamedExecuteWithResult("FBD_TryReAggroAtHead",1,0,TIDtoHate)
		
			TNT1 A 0 A_SetUserVar("user_firing_right", 0)
			TNT1 A 0 A_SetUserVar("user_wp_tic", 0)
			TNT1 A 0 A_Jump(256, "Machinegun", "Machinegun", "Rockets", "Rockets", "Plasma")
			
		Mortar:
			// mortar is always fired from a standing position & nopain
			TNT1 A 0
			TNT1 A 0 A_ChangeFlag("NOPAIN", 1)
			MEKE A 8 A_FaceTarget
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
			MEKE A 8 
			
			TNT1 A 0 A_PlaySound("MISLFIRE", 1)
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
				// MUST use auto-aiming at visible targets, otherwise misses at close range due to projectile's origin offset
				TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 2)
				TNT1 A 0 A_JumpIfTargetInLOS(3)
				// the version with auto-aim disabled:		
				TNT1 A 0 A_CustomMissile("MechMortar", 140, -51, angle, CMF_ABSOLUTEANGLE | CMF_OFFSETPITCH | CMF_SAVEPITCH)
				TNT1 A 0 A_Jump(256, 2)
				// the auto-aimed version:
				TNT1 A 0 A_CustomMissile("MechMortar", 140, -51, random(-9, 9), 0)		
			
			TNT1 A 0 A_CustomMissile("TankFireEffect", 140, -51, 0, 0)
			TNT1 A 0 A_ChangeFlag("NOPAIN", 0)
			
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget
			
			MEKE A 8 //A_FaceTarget
			
					//***Che: do NOT adjust aim if target goes out of sight or is invisible
					TNT1 A 0 A_JumpIf(CallAcs("FBD_TargetIsInvisible"), 4)
					TNT1 A 0 A_JumpIfTargetInLOS(2)
					TNT1 A 0 A_Jump(256, 2)
					TNT1 A 0 A_FaceTarget		
			
			MEKE A 16 //A_FaceTarget
			Goto See	
			
		Death:	
			TNT1 A 0 A_JumpIfInventory ("Headache", 30, "Death.Head") //received 600 headshot damage total
			TNT1 A 1
			TNT1 A 0 A_ChangeFlag("USESPECIAL", 0)
			TNT1 A 0 A_SpawnItem("BigExplosion1112")
			TNT1 A 0 A_PlaySound("weapons/explode")
			TNT1 A 0 A_PlaySound("EXPLOSIO", 3)
			TNT1 A 0 A_Scream
			NULL AAAAAA 0 A_CustomMissile ("MetalShard1", 96, 0, random (0, 360), 2, random (0, 180))
			NULL AAAAAA 0 A_CustomMissile ("MetalShard2", 96, 0, random (0, 360), 2, random (0, 180))
			NULL AAAAAAAAA 0 A_CustomMissile ("GlassShard", 96, 0, random (0, 360), 2, random (0, 360))
			//TNT1 A 0 A_SpawnItem("DestroyedArmouredVehicle")
			//***Che: because tank threads. Sirisly.
			TNT1 A 0 A_SpawnItemEx("DestroyedAircraft",0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
			ELEC A 0 A_Explode(100, 250)
			TNT1 A 15
			TNT1 A 0
			Stop
		Death.Head:
		Death.Decaptate:
		Death.HeadStun:
		Death.HeadPlasma:
			TNT1 A 0
			TNT1 A 0 A_NoBlocking
			TNT1 A 0 A_ChangeFlag("USESPECIAL", 0)
			TNT1 A 0 A_SpawnItem("BigExplosion1112")
			TNT1 A 0 A_PlaySound("weapons/explode")
			TNT1 A 0 A_PlaySound("EXPLOSIO", 3)
			TNT1 A 0 A_Scream
			NULL AAAAAA 0 A_CustomMissile ("MetalShard1", 96, 0, random (0, 360), 2, random (0, 180))
			NULL AAAAAA 0 A_CustomMissile ("MetalShard2", 96, 0, random (0, 360), 2, random (0, 180))
			NULL AAAAAAAAA 0 A_CustomMissile ("GlassShard", 96, 0, random (0, 360), 2, random (0, 360))
			
			TNT1 A 0 A_SpawnItemEx("DeadMechCockpitSmashed",0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
			TNK1 E 0 A_SpawnItemEx("DyingZManFatality5", 65,0,80, Random(1,4),0,0, 0,SXF_NOCHECKPOSITION,0)
			
			TNT1 A 30
			Stop
	}
}


ACTOR DeadMechCockpitSmashed
{
	Game Doom
	//$Sprite MEKEY1
	Health 500
	Scale 1.3
	Radius 48
	Height 160
	Mass 1000
	+NOTARGET
	+SOLID
	+SHOOTABLE
	-NOGRAVITY
	+NOTELEPORT
	BloodType "TankBlood", "TankBlood", "TankBlood"
	
	damagefactor "Stomp", 0.0
	
	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
	
	States
	{
		Spawn:
			MEKE Y 1
			MEKE Y -1
		Death:	
			TNT1 A 1
			TNT1 A 0 A_SpawnItem("BigExplosion1112")
			TNT1 A 0 A_PlaySound("weapons/explode")
			TNT1 A 0 A_PlaySound("EXPLOSIO", 3)
			NULL AAAAAA 0 A_CustomMissile ("MetalShard1", 96, 0, random (0, 360), 2, random (0, 180))
			NULL AAAAAA 0 A_CustomMissile ("MetalShard2", 96, 0, random (0, 360), 2, random (0, 180))
			NULL AAAAAAAAA 0 A_CustomMissile ("GlassShard", 96, 0, random (0, 360), 2, random (0, 360))
			TNT1 A 0 A_SpawnItemEx("DestroyedAircraft",0,0,0, 0,0,0, 0,SXF_NOCHECKPOSITION,0)
			ELEC A 0 A_Explode(100, 250)
			TNT1 A 15
			TNT1 A 0
			Stop			
	}
}