// Crossbow -----------------------------------------------------------------

class Crossbow : HereticWeapon
{
	Default
	{
		Weapon.SelectionOrder 800;
		Weapon.AmmoUse 1;
		Weapon.AmmoGive 10;
		Weapon.AmmoType "CrossbowAmmo";
		Weapon.SisterWeapon "CrossbowPowered";
		Weapon.YAdjust 15;
		Inventory.PickupMessage "$TXT_WPNCROSSBOW";
		Tag "$TAG_CROSSBOW";
	}

	States
	{
	Spawn:
		WBOW A -1;
		Stop;
	Ready:
		CRBW AAAAAABBBBBBCCCCCC 1 A_WeaponReady;
		Loop;
	Deselect:
		CRBW A 1 A_Lower;
		Loop;
	Select:
		CRBW A 1 A_Raise;
		Loop;
	Fire:
		CRBW D 6 A_FireCrossbowPL1;
		CRBW EFGH 3;
		CRBW AB 4;
		CRBW C 5 A_ReFire;
		Goto Ready;
	}
	
	//----------------------------------------------------------------------------
	//
	// PROC A_FireCrossbowPL1
	//
	//----------------------------------------------------------------------------

	// [BB] This is only clientsafe because the native implementation of SpawnPlayerMissile is.
	clientsafe action void A_FireCrossbowPL1 ()
	{
		if (player == null)
		{
			return;
		}

		Weapon weapon = player.ReadyWeapon;
		if (weapon != null)
		{
			if (!weapon.DepleteAmmo (weapon.bAltFire))
				return;
		}
		SpawnPlayerMissile ("CrossbowFX1");
		SpawnPlayerMissile ("CrossbowFX3", angle - 4.5);
		SpawnPlayerMissile ("CrossbowFX3", angle + 4.5);
	}
}


class CrossbowPowered : Crossbow
{
	Default
	{
		+WEAPON.POWERED_UP
		Weapon.AmmoGive 0;
		Weapon.SisterWeapon "Crossbow";
		Tag "$TAG_CROSSBOWP";
	}

	States
	{
	Fire:
		CRBW D 5 A_FireCrossbowPL2;
		CRBW E 3;
		CRBW F 2;
		CRBW G 3;
		CRBW H 2;
		CRBW A 3;
		CRBW B 3;
		CRBW C 4 A_ReFire;
		Goto Ready;
	}
	
	//----------------------------------------------------------------------------
	//
	// PROC A_FireCrossbowPL2
	//
	//----------------------------------------------------------------------------

	// [BB] This is only clientsafe because the native implementation of SpawnPlayerMissile is.
	clientsafe action void A_FireCrossbowPL2()
	{
		if (player == null)
		{
			return;
		}

		Weapon weapon = player.ReadyWeapon;
		if (weapon != null)
		{
			if (!weapon.DepleteAmmo (weapon.bAltFire))
				return;
		}
		SpawnPlayerMissile ("CrossbowFX2");
		SpawnPlayerMissile ("CrossbowFX2", angle - 4.5);
		SpawnPlayerMissile ("CrossbowFX2", angle + 4.5);
		SpawnPlayerMissile ("CrossbowFX3", angle - 9.);
		SpawnPlayerMissile ("CrossbowFX3", angle + 9.);
	}
}


// Crossbow FX1 -------------------------------------------------------------

class CrossbowFX1 : Actor
{
	Default
	{
		Radius 11;
		Height 8;
		Speed 30;
		Damage 10;
		Projectile;
		RenderStyle "Add";
		SeeSound "weapons/bowshoot";
		DeathSound "weapons/bowhit";
		Obituary "$OB_MPCROSSBOW";
	}

	States
	{
	Spawn:
		FX03 B 1 BRIGHT;
		Loop;
	Death:
		FX03 HIJ 8 BRIGHT;
		Stop;
	}
}


// Crossbow FX2 -------------------------------------------------------------

class CrossbowFX2 : CrossbowFX1
{
	Default
	{
		Speed 32;
		Damage 6;
		Obituary "$OB_MPPCROSSBOW";
	}

	States
	{
	Spawn:
		FX03 B 1 BRIGHT A_SpawnItemEx("CrossbowFX4", random2[BoltSpark]()*0.015625, random2[BoltSpark]()*0.015625, 0, 0,0,0,0,SXF_ABSOLUTEPOSITION, 50);
		Loop;
	}
}

// Crossbow FX3 -------------------------------------------------------------

class CrossbowFX3 : CrossbowFX1
{
	Default
	{
		Speed 20;
		Damage 2;
		SeeSound "";
		-NOBLOCKMAP
		+WINDTHRUST
		+THRUGHOST
	}

	States
	{
	Spawn:
		FX03 A 1 BRIGHT;
		Loop;
	Death:
		FX03 CDE 8 BRIGHT;
		Stop;
	}
}

// Crossbow FX4 -------------------------------------------------------------

class CrossbowFX4 : Actor
{
	Default
	{
		+NOBLOCKMAP
		Gravity 0.125;
		RenderStyle "Add";
	}

	States
	{
	Spawn:
		FX03 FG 8 BRIGHT;
		Stop;
	}
}

