
// Knight -------------------------------------------------------------------

class Knight : Actor
{
	Default
	{
		Health 200;
		Radius 24;
		Height 78;
		Mass 150;
		Speed 12;
		Painchance 100;
		Monster;
		+FLOORCLIP
		SeeSound "hknight/sight";
		AttackSound "hknight/attack";
		PainSound "hknight/pain";
		DeathSound "hknight/death";
		ActiveSound "hknight/active";
		Obituary "$OB_BONEKNIGHT";
		HitObituary "$OB_BONEKNIGHTHIT";
		DropItem "CrossbowAmmo", 84, 5;
	}
	
	States
	{
	Spawn:
		KNIG AB 10 A_Look;
		Loop;
	See:
		KNIG ABCD 4 A_Chase;
		Loop;
	Melee:
	Missile:
		KNIG E 10 A_FaceTarget;
		KNIG F 8 A_FaceTarget;
		KNIG G 8 A_KnightAttack;
		KNIG E 10 A_FaceTarget;
		KNIG F 8 A_FaceTarget;
		KNIG G 8 A_KnightAttack;
		Goto See;
	Pain:
		KNIG H 3;
		KNIG H 3 A_Pain;
		Goto See;
	Death:
		KNIG I 6;
		KNIG J 6 A_Scream;
		KNIG K 6;
		KNIG L 6 A_NoBlocking;
		KNIG MN 6;
		KNIG O -1;
		Stop;
	}

	//----------------------------------------------------------------------------
	//
	// PROC A_KnightAttack
	//
	//----------------------------------------------------------------------------

	void A_KnightAttack ()
	{
		let targ = target;
		if (!targ) return;
		if (CheckMeleeRange ())
		{
			int damage = random[KnightAttack](1, 8) * 3;
			int newdam = targ.DamageMobj (self, self, damage, 'Melee');
			targ.TraceBleed (newdam > 0 ? newdam : damage, self);
			A_PlaySound ("hknight/melee", CHAN_BODY);
			return;
		}
		// Throw axe
		A_PlaySound (AttackSound, CHAN_BODY);
		if (self.bShadow || random[KnightAttack]() < 40)
		{ // Red axe
			SpawnMissileZ (pos.Z + 36, targ, "RedAxe");
		}
		else
		{ // Green axe
			SpawnMissileZ (pos.Z + 36, targ, "KnightAxe");
		}
	}
}


// Knight ghost -------------------------------------------------------------

class KnightGhost : Knight
{
	Default
	{
		+SHADOW
		+GHOST
		RenderStyle "Translucent";
		Alpha 0.4;
	}
}

// Knight axe ---------------------------------------------------------------

class KnightAxe : Actor 
{
	Default
	{
		Radius 10;
		Height 8;
		Speed 9;
		FastSpeed 18;
		Damage 2;
		Projectile;
		-NOBLOCKMAP
		-ACTIVATEIMPACT
		-ACTIVATEPCROSS
		+WINDTHRUST
		+THRUGHOST
		DeathSound "hknight/hit";
	}

	States
	{
	Spawn:
		SPAX A 3 BRIGHT A_PlaySound("hknight/axewhoosh");
		SPAX BC 3 BRIGHT;
		Loop;
	Death:
		SPAX DEF 6 BRIGHT;
		Stop;
	}
}


// Red axe ------------------------------------------------------------------

class RedAxe : KnightAxe
{
	Default
	{
		+NOBLOCKMAP
		-WINDTHRUST
		Damage 7;
	}

	States
	{
	Spawn:
		RAXE AB 5 BRIGHT A_DripBlood;
		Loop;
	Death:
		RAXE CDE 6 BRIGHT;
		Stop;
	}

	//----------------------------------------------------------------------------
	//
	// PROC A_DripBlood
	//
	//----------------------------------------------------------------------------
	
	void A_DripBlood ()
	{
		double xo = random2[DripBlood]() / 32.0;
		double yo = random2[DripBlood]() / 32.0;
		Actor mo = Spawn ("Blood", Vec3Offset(xo, yo, 0.), ALLOW_REPLACE);
		if (mo != null)
		{
			mo.Vel.X = random2[DripBlood]() / 64.0;
			mo.Vel.Y = random2[DripBlood]() / 64.0;
			mo.Gravity = 1./8;
		}
	}
}
