//------------------------------------------------------------
// Railgun ammo class
//------------------------------------------------------------
Actor RailAmmo : Ammo
{
	+SERVERNETID
	Inventory.MaxAmount 4
}

//------------------------------------------------------------
// Flux Railgun Alt-Fire cooldown class
//------------------------------------------------------------
Actor RailAltCD : Ammo
{
	+SERVERNETID 
	Inventory.MaxAmount 210
}

//------------------------------------------------------------
// Flux Railgun weapon class
//------------------------------------------------------------
ACTOR FluxRailgun : LSWeaponBase
{
	// Properties
	Tag "Flux Railgun"
	Weapon.AmmoType1 "RailAmmo"
	Weapon.AmmoType2 "RailAmmo"
	Weapon.AmmoUse1 1
	Weapon.AmmoUse2 0
	Weapon.SlotNumber 1
	Inventory.Icon "SPKPA0"
	Decal "RailgunMainDecal"

	// States
	States
	{
	Spawn:
		SPKP A 1 bright A_SetAngle(angle + 1.0)
		loop

	Ready:
		SPKR A 1 A_WeaponReady
		loop

	Select:
		TNT1 AA 0 A_Raise
		SPKR A 1 A_Raise
		loop

	Deselect:
		TNT1 A 0 A_ZoomFactor(1.0)
		TNT1 AA 0 A_Lower
		SPKR A 1 A_Lower
		loop
		
	Fire:
		TNT1 A 0 A_GiveInventory("MainAmmoRegenCD", 999)
		TNT1 A 0 A_SpawnItemEX("RedLightShoot")
		TNT1 A 0 A_PlaySound("FluxRailgun/Fire", CHAN_WEAPON)
		TNT1 A 0 A_PlaySound("FluxRailgun/FireFar", CHAN_7)
		TNT1 A 0 A_RailAttack(80, 2.0, true, "none", "none", RGF_SILENT, 0.0, "RailHitPuff", 0, 0, 16384.0, 1, 2.0, 0, "RailTrail", 6.0)
		SPKF D 2 A_RailAttack(0, 2.0, false, "none", "none", RGF_SILENT, 0.0, "None", 0, 0, 16384.0, 1, 256.0, 0, "RailTrail2", 6.0)
		SPKF E 4
		SPKF FGHIJKLMNOPQ 1
		SPKF Q 4
		SPKF Q 4 A_PlaySound("FluxRailgun/Hiss", CHAN_6)
		TNT1 AAAA 0 A_SpawnItemEX("RailgunExhaustSpawner", 8.0, 0.0, 32.0, frandom(-1.0, 1.0), frandom(-1.0, 1.0), frandom(-1.0, 1.0))
		SPKF Q 10
		SPKF QPONMLKJIHGF 1
		goto Ready
		
	AltFire:
		TNT1 A 0 A_JumpIfInventory("MainAltCD", 1, "AltFireFail")
		Goto AltFireSuccess
	
	AltFireFail:
		TNT1 A 0 ACS_NamedExecuteAlways("AltFireFail")
		SPKR A 1 A_WeaponReady(WRF_NOPRIMARY|WRF_NOSECONDARY)
		Goto Ready

	AltFireSuccess:
		TNT1 A 0 A_GiveInventory("MainAmmoRegenCD", 999)
		TNT1 A 0 A_GiveInventory("MainAltCD", 6)
		TNT1 A 0 A_SpawnItemEX("RedLightShoot")
		TNT1 A 0 A_PlaySound("FluxRailgun/AltFire", CHAN_WEAPON)
		TNT1 A 0 A_PlaySound("FluxRailgun/AltFireFar", CHAN_7)
		TNT1 A 0 A_Recoil(32.0)
		TNT1 A 0 A_FireCustomMissile("FluxOrbMissile", 0, true, 0, 7.0, 0, 0)
		SPKF D 8
		SPKF E 8
		SPKR A 8
		goto Ready
	}
}

//------------------------------------------------------------
// Railgun exhaust effect spawner
//------------------------------------------------------------
ACTOR RailgunExhaustSpawner : LSSpawnerBase
{
	// States
	States
	{
	Spawn:
		TNT1 A 0
		TNT1 AAAA 0 A_SpawnItemEx("RailgunExhaust", 0, 0, 0, frandom(-2.0, 2.0), frandom(-2.0, 2.0), frandom(-2.0, 2.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		stop
	}
}

//------------------------------------------------------------
// Railgun exhaust particle
//------------------------------------------------------------
ACTOR RailgunExhaust : LSParticleBase
{
	// Properties
	Scale 0.2
	Alpha 0.4
	VSpeed 7
	
	// States
	States
	{
	Spawn:
		SMOK A 1 A_FadeOut(0.025)
		loop
	}
}

//------------------------------------------------------------
// Railgun trail effect
//------------------------------------------------------------
Actor RailTrail : LSParticleBase
{
	// Properties
	Scale 0.2
	
	// States
	States
	{
	Spawn:
		RSPK A 5

	Spawn1:
		RSPK A 1 A_FadeOut(0.05)
		loop
	}
}

//------------------------------------------------------------
// Secondary railgun trail (rings)
//------------------------------------------------------------
Actor RailTrail2 : RailTrail
{
	// Properties
	Scale 0.1

	// States
	States
	{
	Spawn:
		TNT1 A 0 A_SetScale(scalex + 0.01, scaley + 0.01)
		RRNG A 1 bright A_FadeOut(0.025)
		loop
	}
}

//------------------------------------------------------------
// Railgun hit puff
//------------------------------------------------------------
Actor RailHitPuff : BulletPuff
{
	// Properties
	Scale 0.3
	Alpha 1.0
	VSpeed 0
	ProjectileKickBack 50
	Obituary "%k > \cgFlux Railgun\c- > %o"
	DamageType "FluxRail"  // For interaction with Alt-Fire
	
	// Flags
	+ALWAYSPUFF
	+BRIGHT
	+NOBLOCKMAP
	-ALLOWPARTICLES

	// States
	States
	{
	Spawn:
		TNT1 AAAAAAAAAAAAAAAAAAAAAAAA 0 nodelay A_SpawnItemEx("RailHitFX", 0, 0, 0, frandom(-8.0, 8.0), frandom(-8.0, 8.0), frandom(-8.0, 8.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 1 A_SpawnItemEX("RailHitSmokeSpawner")
		stop

	Crash:
		TNT1 AAAAAAAAAAAAAAAAAAAAAAAA 0 A_SpawnItemEx("RailHitFX", 0, 0, 0, frandom(-8.0, 8.0), frandom(-8.0, 8.0), frandom(-8.0, 8.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 1 A_SpawnItemEX("RailHitSmokeSpawner")
		stop

	XDeath:
		TNT1 A 0 A_GiveToTarget("HitSoundLarge", 1)
		TNT1 AAAAAAAAAAAAAAAAAAAAAAAA 0 A_SpawnItemEx("RailHitFX", 0, 0, 0, frandom(-8.0, 8.0), frandom(-8.0, 8.0), frandom(-8.0, 8.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 1 A_SpawnItemEX("RailHitSmokeSpawner")
		stop
	}
}

//------------------------------------------------------------
// Railgun hit smoke spawner
//------------------------------------------------------------
ACTOR RailHitSmokeSpawner : LSSpawnerBase
{
	// States
	States
	{
	Spawn:
		TNT1 A 0
		TNT1 AAAAAAAA random(2, 4) A_CustomMissile("RailHitSmoke", 0, 0, random(0, 360), 2, random(0, 360))
		stop
	}
}

ACTOR RailHitSmoke : LSParticleBase
{
	// Properties
	Alpha 0.0
	Scale 0.4
	Speed 1
	VSpeed 7

	// Flags
	+NOGRAVITY
	+FORCEXYBILLBOARD

	// States
	States
	{
	Spawn:
		TNT1 A 0 nodelay A_FadeIn(0.2)
		SMOK A 1 A_SetScale(scalex + 0.025, scaley + 0.025)
		TNT1 A 0 A_JumpIf(alpha >= 0.8, "Death")
		loop
	Death:
		TNT1 A 0 A_SetScale(scalex + 0.025, scaley + 0.025)
		SMOK A 1 A_FadeOut(0.05)
		loop
	}
}

//------------------------------------------------------------
// Railgun hit visual particle
//------------------------------------------------------------
Actor RailHitFX : LSParticleBase
{
	// Properties
	Scale 1.2
	Gravity 0.5

	// Flags
	-NOGRAVITY
	-NOINTERACTION

	// States
	States
	{
	Spawn:
		TNT1 A 0 A_FadeOut(0.05)
		RSPK A 1 A_SetScale(scalex * 0.8, scaley * 0.8)
		loop
	}
}

// Explosion radii for Alt-Fire
const int FLUX_ALT_RADIUS = 128;
const int FLUX_ALT_COMBO_RADIUS = 192;

//------------------------------------------------------------
// Railgun alt-fire projectile
//------------------------------------------------------------
Actor FluxOrbMissile //: UnlaggedActor
{
	// Properties
	Radius 10
	Height 20
	Speed 64
	Scale 2.0
	Damage (0)
	Projectile
	ProjectileKickBack 400
	RenderStyle add
	Obituary "%k > \cgFlux Railgun (Alt)\c- > %o"
	Decal "PlasmaScorchLower"
	
	MissileType "RailTrail2"
	//MissileHeight 10
	
	// Flags
	+BRIGHT
	+SEEKERMISSILE  // For hit sounds
	
	// States
	States
	{
	Spawn:
		SPBA AABBCCAABBCCAABBCCAABBCC 1 A_ScaleVelocity(0.9) //A_SpawnItemEx("RailTrail2")
		Goto Death

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

	Death:
		TNT1 A 0 A_Explode(50, FLUX_ALT_RADIUS, !XF_HURTSOURCE)
		TNT1 A 0 A_SeekerMissile(360, 360, SMF_LOOK, 256, FLUX_ALT_RADIUS / 128)
		TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT, AAPTR_TRACER)
		TNT1 A 0 A_JumpIfMasterCloser(FLUX_ALT_RADIUS - radius, "HitEnemy")
		Goto FinishDeath

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

	FinishDeath:
		TNT1 A 0 A_SpawnItemEx("ExplosionSpawner", 0, 0, 0, 0, 0, 0, 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_Stop
		SPBA DEFGHI 3
		TNT1 A 105  // Make sure this is here for unlagged to work
		//TNT1 A 1 Thing_Remove(0)
		stop

	}
}

//------------------------------------------------------------
// Railgun alt-fire explosion effect
//------------------------------------------------------------
Actor FluxOrbFXSpawner : LSParticleBase
{
	// Flags
	//+NOINTERACTION
	//+NONETID
	//+SERVERNETID

	// States
	States
	{
	Spawn:
		TNT1 A 0 nodelay A_SpawnItemEx("ExplosionSpawner", 0, 0, 0, 0, 0, 0, 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		Stop
	}
}

//------------------------------------------------------------
// Railgun alt-fire explosion effect (empowered)
//------------------------------------------------------------
Actor FluxOrbFXSpawner2 : LSParticleBase
{
	// Flags
	//+NOINTERACTION
	//+NONETID
	//+SERVERNETID

	// States
	States
	{
	Spawn:
		TNT1 AAAAAAAAAAAAAAAAAAAA 0 nodelay A_SpawnItemEx("FluxOrbFX", 0, 0, 0, frandom(-24.0, 24.0), frandom(-24.0, 24.0), frandom(-24.0, 24.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_SpawnItemEx("ExplosionSpawner", 0, 0, 0, 0, 0, 0, 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		Stop
	}
}

//------------------------------------------------------------
// Railgun alt-fire explosion effect particles (empowered)
//------------------------------------------------------------
Actor FluxOrbFX : LSBouncingParticleBase
{
	// Properties
	Scale 1.0
	Gravity 1.0
	BounceFactor 0.75
	BounceCount 4

	// States
	States
	{
	Spawn:
		RSPK A 1
		loop

	Death:
		RSPK A 35
		RSPK AAAAAAAAAAAAAAAAAAAA 1 A_FadeOut(0.05)
		TNT1 A 1
		stop
	}
}