// The Fighter's Axe --------------------------------------------------------

class FWeapAxe : FighterWeapon
{
	const AXERANGE = (2.25 * DEFMELEERANGE);

	Default
	{
		Weapon.SelectionOrder 1500;
		+WEAPON.AXEBLOOD +WEAPON.AMMO_OPTIONAL +WEAPON.MELEEWEAPON
		Weapon.AmmoUse1 2;
		Weapon.AmmoGive1 25;
		Weapon.KickBack 150;
		Weapon.YAdjust -12;
		Weapon.AmmoType1 "Mana1";
		Inventory.PickupMessage "$TXT_WEAPON_F2";
		Obituary "$OB_MPFWEAPAXE";
		Tag "$TAG_FWEAPAXE";
	}

	States
	{
	Spawn:
		WFAX A -1;
		Stop;
	Select:
		FAXE A 1 A_FAxeCheckUp;
		Loop;
	Deselect:
		FAXE A 1 A_Lower;
		Loop;
	Ready:
		FAXE A 1 A_FAxeCheckReady;
		Loop;
	Fire:
		FAXE B 4 Offset (15, 32) A_FAxeCheckAtk;
		FAXE C 3 Offset (15, 32);
		FAXE D 2 Offset (15, 32);
		FAXE D 1 Offset (-5, 70) A_FAxeAttack;
	EndAttack:
		FAXE D 2 Offset (-25, 90);
		FAXE E 1 Offset (15, 32);
		FAXE E 2 Offset (10, 54);
		FAXE E 7 Offset (10, 150);
		FAXE A 1 Offset (0, 60) A_ReFire;
		FAXE A 1 Offset (0, 52);
		FAXE A 1 Offset (0, 44);
		FAXE A 1 Offset (0, 36);
		FAXE A 1;
		Goto Ready;
	SelectGlow:
		FAXE L 1 A_FAxeCheckUpG;
		Loop;
	DeselectGlow:
		FAXE L 1 A_Lower;
		Loop;
	ReadyGlow:
		FAXE LLL 1 A_FAxeCheckReadyG;
		FAXE MMM 1 A_FAxeCheckReadyG;
		Loop;
	FireGlow:
		FAXE N 4 Offset (15, 32);
		FAXE O 3 Offset (15, 32);
		FAXE P 2 Offset (15, 32);
		FAXE P 1 Offset (-5, 70) A_FAxeAttack;
		FAXE P 2 Offset (-25, 90);
		FAXE Q 1 Offset (15, 32);
		FAXE Q 2 Offset (10, 54);
		FAXE Q 7 Offset (10, 150);
		FAXE A 1 Offset (0, 60) A_ReFire;
		FAXE A 1 Offset (0, 52);
		FAXE A 1 Offset (0, 44);
		FAXE A 1 Offset (0, 36);
		FAXE A 1;
		Goto ReadyGlow;
	}
	
	override State GetUpState ()
	{
		return Ammo1.Amount ? FindState ("SelectGlow") : Super.GetUpState();
	}

	override State GetDownState ()
	{
		return Ammo1.Amount ? FindState ("DeselectGlow") : Super.GetDownState();
	}

	override State GetReadyState ()
	{
		return Ammo1.Amount ? FindState ("ReadyGlow") : Super.GetReadyState();
	}

	override State GetAtkState (bool hold)
	{
		return Ammo1.Amount ? FindState ("FireGlow") :  Super.GetAtkState(hold);
	}

	
	
	//============================================================================
	//
	// A_FAxeCheckReady
	//
	//============================================================================

	action void A_FAxeCheckReady()
	{
		if (player == null)
		{
			return;
		}
		Weapon w = player.ReadyWeapon;
		if (w.Ammo1 && w.Ammo1.Amount > 0)
		{
			player.SetPsprite(PSP_WEAPON, w.FindState("ReadyGlow"));
		}
		else
		{
			A_WeaponReady();
		}
	}

	//============================================================================
	//
	// A_FAxeCheckReadyG
	//
	//============================================================================

	action void A_FAxeCheckReadyG()
	{
		if (player == null)
		{
			return;
		}
		Weapon w = player.ReadyWeapon;
		if (!w.Ammo1 || w.Ammo1.Amount <= 0)
		{
			player.SetPsprite(PSP_WEAPON, w.FindState("Ready"));
		}
		else
		{
			A_WeaponReady();
		}
	}

	//============================================================================
	//
	// A_FAxeCheckUp
	//
	//============================================================================

	action void A_FAxeCheckUp()
	{
		if (player == null)
		{
			return;
		}
		Weapon w = player.ReadyWeapon;
		if (w.Ammo1 && w.Ammo1.Amount > 0)
		{
			player.SetPsprite(PSP_WEAPON, w.FindState("SelectGlow"));
		}
		else
		{
			A_Raise();
		}
	}

	//============================================================================
	//
	// A_FAxeCheckUpG
	//
	//============================================================================

	action void A_FAxeCheckUpG()
	{
		if (player == null)
		{
			return;
		}
		Weapon w = player.ReadyWeapon;
		if (!w.Ammo1 || w.Ammo1.Amount <= 0)
		{
			player.SetPsprite(PSP_WEAPON, w.FindState("Select"));
		}
		else
		{
			A_Raise();
		}
	}

	//============================================================================
	//
	// A_FAxeCheckAtk
	//
	//============================================================================

	action void A_FAxeCheckAtk()
	{
		if (player == null)
		{
			return;
		}
		Weapon w = player.ReadyWeapon;
		if (w.Ammo1 && w.Ammo1.Amount > 0)
		{
			player.SetPsprite(PSP_WEAPON, w.FindState("FireGlow"));
		}
	}

	//============================================================================
	//
	// A_FAxeAttack
	//
	//============================================================================

	action void A_FAxeAttack()
	{
		FTranslatedLineTarget t;

		if (player == null)
		{
			return;
		}

		int damage = random[AxeAtk](40, 55);
		damage += random[AxeAtk](0, 7);
		int power = 0;
		Weapon weapon = player.ReadyWeapon;
		class<Actor> pufftype;
		int usemana;
		if ((usemana = (weapon.Ammo1 && weapon.Ammo1.Amount > 0)))
		{
			damage <<= 1;
			power = 6;
			pufftype = "AxePuffGlow";
		}
		else
		{
			pufftype = "AxePuff";
		}
		for (int i = 0; i < 16; i++)
		{
			for (int j = 1; j >= -1; j -= 2)
			{
				double ang = angle + j*i*(45. / 16);
				double slope = AimLineAttack(ang, AXERANGE, t, 0., ALF_CHECK3D);
				if (t.linetarget)
				{
					LineAttack(ang, AXERANGE, slope, damage, 'Melee', pufftype, true, t);
					if (t.linetarget != null)
					{
						if (t.linetarget.bIsMonster || t.linetarget.player)
						{
							t.linetarget.Thrust(power, t.attackAngleFromSource);
						}
						AdjustPlayerAngle(t);
						
						weapon.DepleteAmmo (weapon.bAltFire, false);

						if ((weapon.Ammo1 == null || weapon.Ammo1.Amount == 0) &&
							(!(weapon.bPrimary_Uses_Both) ||
							  weapon.Ammo2 == null || weapon.Ammo2.Amount == 0))
						{
							player.SetPsprite(PSP_WEAPON, weapon.FindState("EndAttack"));
						}
						return;
					}
				}
			}
		}
		// didn't find any creatures, so try to strike any walls
		self.weaponspecial = 0;

		double slope = AimLineAttack (angle, DEFMELEERANGE, null, 0., ALF_CHECK3D);
		LineAttack (angle, DEFMELEERANGE, slope, damage, 'Melee', pufftype, true);
	}
}

// Axe Puff -----------------------------------------------------------------

class AxePuff : Actor
{
	Default
	{
		+NOBLOCKMAP +NOGRAVITY
		+PUFFONACTORS
		RenderStyle "Translucent";
		Alpha 0.6;
		SeeSound "FighterAxeHitThing";
		AttackSound "FighterHammerHitWall";
		ActiveSound "FighterHammerMiss";
	}
	States
	{
	Spawn:
		FHFX STUVW 4;
		Stop;
	}
}

// Glowing Axe Puff ---------------------------------------------------------

class AxePuffGlow : AxePuff
{
	Default
	{
		+PUFFONACTORS
		+ZDOOMTRANS
		RenderStyle "Add";
		Alpha 1;
	}
	States
	{
	Spawn:
		FAXE RSTUVWX 4 Bright;
		Stop;
	}
}