/*
	This monster code is done in a very DECORATE style, so don't take this as how ZScript is supposed to work. For that, try the new imp.txt.
*/

class BabelZombieMan : SyncEnabledMonster Replaces ZombieMan
{
	int user_loopCounter;
	int baseHealth;
	default
	{
		Health 20;
		Radius 20;
		Height 56;
		Speed 8;
		Monster;
		+FLOORCLIP;
		SeeSound "grunt/sight";
		PainSound "grunt/pain";
		DeathSound "grunt/death";
		ActiveSound "grunt/active";
		Obituary "$OB_ZOMBIE"; // "%o was killed by a zombieman."
		DropItem "Clip";
		PainChance 32;
		Species "Zombie";
		+DOHARMSPECIES;
		MinMissileChance 150;
		ReactionTime 4;
		PainChance "PlayerPistol", 256;
		DamageType "Monster";
		Tag "Zombieman (Babel)";
		
		BabelMonster.SyncChainCheckLOS	true;
		BabelMonster.SyncChainCheckLOF	true;
	}
	
	action void A_BabelZMShot(double xspread, double yspread, string attackSound = "grunt/attack")
	{
		string missileType = "ZManShot";
		if(CVar.FindCVar("egr_enemy_tracer_type").GetInt() == 3)
		{
			missileType = "ClassicZManShot";
		}
		invoker.A_PlaySound(attackSound);
		A_SpawnProjectile(missileType,32.0,0,(Random2[GunShot]() * (xspread / 256)), CMF_OFFSETPITCH, frandom(-yspread, yspread));
	}
	
	override void BeginPlay()
	{
		super.BeginPlay();
		
		baseHealth = health;
	}
	
	States
	{
	Spawn:
		TNT1 A 0 Nodelay 
		{
			return ResolveState("Look");
		}
	Wander:
		POSS AABBCCDD 4 Fast 
		{
			A_Wander();
			A_Look();
		}
		Loop;
	Look:
		POSS AB 10 A_Look();
		Loop;
	See:
		TNT1 A 0 ReleaseState();
		POSS AABBCCDD 4 Fast A_Chase();
		Goto See;
	Melee:
		TNT1 A 0 A_Jump(256, "MissileBurst");
	Missile:
		TNT1 A 0 
		{
			TriggerSync("BabelZombieMan", 20.0);
			TriggerSync("BabelChaingunGuy", 30.0);
			TriggerSync("BabelShotgunGuy", 35.0);
			TriggerSync("BabelNazi", 75.0);
		}
	MissileNoSignal:
		TNT1 A 0 JumpIfCannotTarget("See");
		TNT1 A 0 HoldState();
		//----------------------------
		TNT1 A 0 A_JumpIfCloser(256, "MissileBurst");
		TNT1 A 0 A_JumpIfCloser(768, 2);
		TNT1 A 0 A_Jump(256, "MissileSnipe");
		//Target is between 257 and 768 units from zombieman
		//Fire 1 or 2 shots
		POSS E 9 A_FaceTarget();
		POSS E 1 A_FaceTarget();
		POSS F 3 Bright A_BabelZMShot(9.3, 5.9);
		POSS E 0 A_Jump(128, "See");
		POSS E 2 A_FaceTarget();
		POSS E 1 A_FaceTarget();
		POSS F 3 Bright A_BabelZMShot(9.3, 5.9);
		POSS E 3;
		Goto See;
	/* Fires a three round burst */
	MissileBurst:
		POSS E 9 A_FaceTarget();
		POSS E 1 A_FaceTarget();
		POSS F 3 Bright A_BabelZMShot(11.3, 7.2);
		POSS E 2 A_FaceTarget();
		POSS E 1 A_FaceTarget();
		POSS F 3 Bright A_BabelZMShot(11.3, 7.2);
		POSS E 2 A_FaceTarget();
		POSS E 1 A_FaceTarget();
		POSS F 3 Bright A_BabelZMShot(11.3, 7.2);
		POSS E 3;
		Goto See;
	
	/* Fires a more accurate bullet */
	MissileSnipe:
		POSS E 9 A_FaceTarget();
		POSS E 1 A_FaceTarget();
		POSS F 3 Bright A_BabelZMShot(5.6, 3.6);
		POSS E 8;
		Goto See;
	Pain:
		POSS G 3 Fast;
		POSS G 3 Fast A_BabelPain();
		Goto See;
	Death:
		TNT1 A 0 A_Jump(48, "Death.Monster");
		TNT1 A 0 
		{
			TriggerSync("BabelZombieMan", 20.0);
			TriggerSync("BabelChaingunGuy", 30.0);
			TriggerSync("BabelShotgunGuy", 35.0);
			TriggerSync("BabelNazi", 75.0);
		}
	Death.Monster:
	XDeath.Massacre:
		POSS H 5;
		POSS I 5 A_Scream();
		POSS J 5 A_NoBlocking;
		POSS K 5;
		POSS L -1;
		Stop;
	XDeath:
		TNT1 A 0 A_Jump(64, "XDeath.Monster");
		TNT1 A 0 
		{
			TriggerSync("BabelZombieMan", 20.0);
			TriggerSync("BabelChaingunGuy", 30.0);
			TriggerSync("BabelShotgunGuy", 35.0);
			TriggerSync("BabelNazi", 75.0);
		}
	XDeath.Monster:
		TNT1 A 0
		{
			if(CVar.FindCVar("egr_gore").GetInt())
			{
				for(user_loopCounter = 0; user_loopCounter < 4*CVar.FindCVar("egr_gore_level").GetInt(); user_loopCounter++)
				{
					
					A_SpawnProjectile("Bits", random(24, 48), random(-10, 10), random (0, 360), CMF_OFFSETPITCH, -random (0, 160));
					A_SpawnItemEx("BloodSpew", random(-10, 10), random(-10, 10), random(24, 56));
				}
				for(user_loopCounter = 0; user_loopCounter < CVar.FindCVar("egr_gore_level").GetInt()/2; user_loopCounter++)
				{
					A_SpawnProjectile("Chunks", random(24, 48), random(-10, 10), random (0, 360), CMF_OFFSETPITCH, -random (0, 160));
				}
			}
		}
		POSS M 5;
		POSS N 5 A_XScream();
		POSS O 5 A_NoBlocking;
		POSS PQRST 5;
		POSS U -1;
		Stop;
	Raise:
		POSS K 5;
		POSS JIH 5;
		Goto See;
	}
}