//------------------------------------------------------------
// C-14 ammo class
//------------------------------------------------------------
Actor GammaAmmo : Ammo
{
	+SERVERNETID
	Inventory.MaxAmount 40
}

//------------------------------------------------------------
// C-14 Alt-Fire cooldown class
//------------------------------------------------------------
Actor C14AltCD : Ammo
{
	+SERVERNETID 
	Inventory.MaxAmount 280
}

//------------------------------------------------------------
// C-14 weapon class
//------------------------------------------------------------
ACTOR C14 : LSWeaponBase
{
	// Vertical recoil constant.
	// Recoil resets before the next shot is fired, thus this is visual-only
	const float C14_RECOIL = 0.6;

	// Properties
	Tag "C-14 Gamma Rifle"
	Weapon.AmmoType1 "GammaAmmo"
	Weapon.AmmoType2 "GammaAmmo"
	Weapon.AmmoUse1 1
	Weapon.AmmoUse2 5
	Weapon.SlotNumber 1
	Inventory.Icon "C14PA0"
	
	// States
	States
	{
	Spawn:
		C14P A 1 bright A_SetAngle(angle + 1.0)
		loop

	Ready:
		C14R A 1 A_WeaponReady
		loop

	Deselect:
		TNT1 A 0 A_ZoomFactor(1.0)
		C14R AA 0 A_Lower
		C14R A 1 A_Lower
		loop

	Select:
		C14R AA 0 A_Raise
		C14R A 1 A_Raise
		loop

	Fire:
		TNT1 A 0 A_GiveInventory("MainAmmoRegenCD", 999)
		TNT1 A 0 A_PlaySound("C14/Fire", CHAN_WEAPON)
		TNT1 A 0 A_PlaySound("C14/FireFar", CHAN_7)
		TNT1 A 0 A_SpawnItemEX("GreenLightShoot")
		TNT1 A 0 A_FireCustomMissile("C14Projectile", 0.0, true, 3.0, 6.0, 0, 0.0)
		C14F A 2 A_SetPitch(pitch - C14_RECOIL)
		C14F BCDE 1 A_SetPitch(pitch + C14_RECOIL * 0.25)
		C14R A 2
		goto Ready
		
	AltFire:
		TNT1 A 0 A_JumpIfInventory("MainAltCD", 1, "AltFireFail")
		Goto AltFireSuccess
	
	AltFireFail:
		TNT1 A 0 ACS_NamedExecuteAlways("AltFireFail")
		C14R A 1 A_WeaponReady(WRF_NOPRIMARY|WRF_NOSECONDARY)
		Goto Ready

	AltFireSuccess:
		TNT1 A 0 A_GiveInventory("MainAmmoRegenCD", 999)
		TNT1 A 0 A_GiveInventory("MainAltCD", 12)
		TNT1 A 0 A_SpawnItemEX("GreenLightShoot")
		TNT1 A 0 A_PlaySound("C14/AltFire", CHAN_WEAPON)
		TNT1 A 0 A_FireCustomMissile("C14GasGrenade", 0.0, true, 3.0,6.0, 0, 0.0)
		C14F A 2 A_SetPitch(pitch - C14_RECOIL * 4.0)
		C14F BCDE 1 A_SetPitch(pitch + C14_RECOIL * 1.0)
		C14R A 2
		goto Ready
		
	}
}

//------------------------------------------------------------
// C-14 main-fire projectile
//------------------------------------------------------------
Actor C14Projectile
{
	// Properties
	Projectile
	Radius 4
	Height 8
	Scale 0.35
	Speed 72
	Damage (0)
	RenderStyle Add
	Decal "C14MainDecal"
	Obituary "%k > \cdC14 Gamma Rifle\c- > %o"
	ProjectileKickBack 10
	
	// Flags
	+BRIGHT
	-NOGRAVITY
	+SEEKERMISSILE  // For hit sounds
	
	// Constants
	const int RADIUS_OUTER = 96;
	const int RADIUS_INNER = 32;
	
	// States
	States 
	{
	Spawn:
		GGRN A 1 A_SpawnItemEX("C14ProjectileTrail")
		loop

	XDeath:
		TNT1 A 0 A_GiveToTarget("HitSoundLarge", 1)
		Goto Death

	Death:
		TNT1 A 0 A_SpawnItemEx("C14DeathFX", 0, 0, 0, 0, 0, 0, 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 AAAAAA 0 A_SpawnItemEx("C14DeathDots", 0, 0, 0, frandom(-4.0, 4.0), frandom(-4.0, 4.0), frandom(2.0, 8.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_PlaySound("C14/Hit", CHAN_AUTO)
		TNT1 A 0 A_Explode(18, RADIUS_OUTER, XF_HURTSOURCE, true, RADIUS_INNER)
		TNT1 A 0 A_Explode(5, RADIUS_OUTER, XF_HURTSOURCE, true, RADIUS_OUTER)
		TNT1 A 0 A_SeekerMissile(360, 360, SMF_LOOK, 256, RADIUS_OUTER / 128)
		TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT, AAPTR_TRACER)
		TNT1 A 0 A_JumpIfMasterCloser(RADIUS_INNER - radius, "HitMedium")
		TNT1 A 0 A_JumpIfMasterCloser(RADIUS_OUTER - radius, "HitSoft")
		Goto FinishDeath

	HitMedium:
		TNT1 A 0 A_GiveToTarget("HitSoundMedium", 1)
		Goto FinishDeath

	HitSoft:
		TNT1 A 0 A_GiveToTarget("HitSoundSmall", 1)
		Goto FinishDeath

	FinishDeath:
		TNT1 A 0 A_Stop
		GGRN AAAAAAAAAA 1 A_FadeOut(0.1)
		TNT1 A 70  // Make sure this is here for unlagged to work
		stop
	}
}

//------------------------------------------------------------
// C-14 main-fire projectile trail
//------------------------------------------------------------
Actor C14ProjectileTrail : LSParticleBase
{
	// Properties
	Scale 0.1
	Alpha 0.9
	
	// States
	States 
	{
	Spawn:
		TNT1 A 0 nodelay A_SetScale(scalex + 0.02, scaley + 0.02)
		GRNG A 1 A_FadeOut(0.1)
		loop
	}
}

//------------------------------------------------------------
// C-14 main-fire projectile death effect (expanding ring)
//------------------------------------------------------------
Actor C14DeathFX : LSParticleBase
{
	// Properties
	Scale 0.6
	
	// States
	States
	{
	Spawn:
		TNT1 A 0 nodelay A_SetScale(scalex * 1.1, scaley * 1.1)
		GRNG A 1 A_FadeOut(0.1)
		loop
	}
}

//------------------------------------------------------------
// C-14 main-fire projectile death particles
//------------------------------------------------------------
Actor C14DeathDots : LSBouncingParticleBase
{
	// Properties
	Scale 0.1
	Gravity 1.5
	BounceFactor 0.5
	BounceCount 2
	
	// States
	States
	{
	Spawn:
		GSPK A 1
		loop

	Death:
		GSPK A 1 A_FadeOut(0.1)
		stop
	}
}

// Gas damage radius
const int GAS_RADIUS = 128;

//------------------------------------------------------------
// C-14 alt-fire projectile
//------------------------------------------------------------
Actor C14GasGrenade
{
	// Counter for gas damage indicator spawn logic
	args 0 
	
	// Properties
	Height 8
	Radius 8
	Speed 48
	Damage (5)
	Projectile
	Obituary "%k > \cdC14 (Alt Impact)\c- > %o"
	
	// Flags
	-NOGRAVITY
	+NOBLOOD
	+DONTSPLASH
	
	// States
	States
	{
	Spawn:
		SGRN A 1
		loop

	Death:
		TNT1 A 0 A_SpawnItemEx("C14GasDamageIndicator", GAS_RADIUS, 0)//, 0, 0, 0, 0, 0, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_SpawnItemEx("C14GasDamageIndicator", -GAS_RADIUS, 0)//, 0, 0, 0, 0, 0, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_SpawnItemEx("C14GasDamageIndicator", 0, GAS_RADIUS)//, 0, 0, 0, 0, 0, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_SpawnItemEx("C14GasDamageIndicator", 0, -GAS_RADIUS)//, 0, 0, 0, 0, 0, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_SetAngle(angle + 1)
		TNT1 A 0 A_SetArg(0, args[0] + 1)
		TNT1 A 0 A_JumpIf(args[0] < 90, "Death")
		goto DeathCont

	DeathCont:
		SGRN A 25 A_PlaySound("GrenadeHit", CHAN_AUTO)
		TNT1 A 0 A_PlaySound("C14/GasHiss", CHAN_AUTO)
		TNT1 A 0 A_SpawnItemEX("C14GasDamage", 0, 0, 0, 0, 0, 0, 0)//, SXF_FORCESERVERSIDE)
		SGRN AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 4 A_SpawnItemEX("C14GasCloudSpawner")//, 0, 0, 0, 0, 0, 0, 0, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		SGRN A 350
		TNT1 A 1
		stop
	}
}

//------------------------------------------------------------
// C-14 alt-fire gas particle spawner
//------------------------------------------------------------
Actor C14GasCloudSpawner : LSSpawnerBase
{
	// States
	States
	{
	Spawn:
		TNT1 AAAAA 0 nodelay A_SpawnItemEX("C14GasCloud", 0.0, 0.0, 0.0, frandom(-2.0, 2.0), frandom(-2.0, 2.0), frandom(0.0, 2.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 35
		stop
	}
}

//------------------------------------------------------------
// C-14 alt-fire gas particle
//------------------------------------------------------------
Actor C14GasCloud : LSParticleBase
{
	// Properties
	Scale 0.6
	Alpha 0.2
	RenderStyle Translucent
	
	// States
	States
	{
	Spawn:
		TNT1 A 0 nodelay A_SetScale(scalex * 1.2, scaley * 1.2)
		SMKG A 8 A_FadeOut(0.025)
		loop

	Death:
		TNT1 A 35
		stop
	}
}

//------------------------------------------------------------
// C-14 alt-fire gas damage actor
//------------------------------------------------------------
Actor C14GasDamage
{
	// Properties
	DamageType "C14Gas"
	Obituary "%k > \cdC14 (Alt)\c- > %o"
	args 0
	
	// Flags
	+THRUACTORS
	+NOGRAVITY
	+NODAMAGETHRUST
	+DONTSPLASH
	+SERVERNETID
	
	// States
	States
	{
	Spawn:
		TNT1 A 0 A_Explode(5, GAS_RADIUS, XF_HURTSOURCE, true, GAS_RADIUS)
		TNT1 A 0 A_SetArg(0, args[0] + 1)
		TNT1 A 1 A_JumpIf(args[0] > 105, "Death")
		loop

	Death:
		TNT1 A 1
		Stop
	}
}

//------------------------------------------------------------
// C-14 alt-fire gas damage indicator
//------------------------------------------------------------
Actor C14GasDamageIndicator : LSParticleBase
{
	// Properties
	Scale 0.1
	
	// States
	States
	{
	Spawn:
		TNT1 A 0 nodelay A_Warp(AAPTR_DEFAULT, 0, 0, 0, 0, WARPF_TOFLOOR)
		GSPK A 105
		GSPK AAAAAAAAAAAAAAAAAAAA 1 A_FadeOut(0.05)
		goto Death
	}
}

//------------------------------------------------------------
// C-14 alt-fire respawn protection
//------------------------------------------------------------
Actor C14RespawnProtection : PowerProtection
{
	+SERVERNETID
	DamageFactor "C14Gas", 0.0
	Powerup.Duration -2
}