//------------------------------------------------------------
// Ion ammo class
//------------------------------------------------------------
Actor IonAmmo : Ammo
{
	+SERVERNETID
	Inventory.MaxAmount 50
}

//------------------------------------------------------------
// Ion Alt-Fire cooldown class
//------------------------------------------------------------
Actor IonAltCD : Ammo
{
	+SERVERNETID 
	Inventory.MaxAmount 280
}

//------------------------------------------------------------
// Ion Rebounder weapon class
//------------------------------------------------------------
ACTOR IonRebounder : LSWeaponBase
{
	// Vertical recoil constant.
	const float ION_RECOIL = 0.5;

	// Properties
	Tag "Ion Rebounder"
	Weapon.AmmoType1 "IonAmmo"
	Weapon.AmmoType2 "IonAmmo"
	Weapon.AmmoUse1 1
	Weapon.AmmoUse2 5
	Weapon.SlotNumber 2
	Inventory.Icon "IONPA0"

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

	Ready:
		IONR A 1 A_WeaponReady
		loop

	Select:
		IONR AA 0 A_Raise
		IONR A 1 A_Raise
		loop

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

	Fire:
		TNT1 A 0 A_GiveInventory("SideAmmoRegenCD", 999)
		TNT1 A 0 A_JumpIfInventory("IonRebounderEmpoweredTics", 1, "FireEmpowered")
		TNT1 A 0 A_SpawnItemEX("BlueLightShoot")
		TNT1 A 0 A_PlaySound("IonRebounder/Fire", CHAN_WEAPON)
		TNT1 A 0 A_PlaySound("IonRebounder/FireFar", CHAN_6)
		TNT1 A 0 A_FireCustomMissile("IonProjectile", 0.0, true, 12.0, 6.0, 0, 0.0)
		IONF A 1 A_SetPitch(pitch - ION_RECOIL)
		IONF B 1 A_SetPitch(pitch + ION_RECOIL * 0.5)
		IONF C 1 A_SetPitch(pitch + ION_RECOIL * 0.5)
		IONF D 1
		IONF EF 1 A_Refire
		goto Ready
		
	FireEmpowered:
		TNT1 A 0 A_SpawnItemEX("RedLightShoot")
		TNT1 A 0 A_PlaySound("IonRebounder/FireEmpowered", CHAN_WEAPON)
		TNT1 A 0 A_PlaySound("IonRebounder/FireEmpoweredFar", CHAN_6)
		TNT1 A 0 A_FireCustomMissile("IonProjectileEmpowered", 0.0, true, 12.0, 6.0, 0, 0.0)
		IONF A 1 A_SetPitch(pitch - ION_RECOIL * 2.0) //Intentional recoil
		IONF B 1 A_SetPitch(pitch + ION_RECOIL * 0.5)
		IONF C 1 A_SetPitch(pitch + ION_RECOIL * 0.5)
		IONF DEF 1 A_Refire
		goto Ready

	AltFire:
		
	AltFire:
		TNT1 A 0 A_JumpIfInventory("SideAltCD", 1, "AltFireFail")
		Goto AltFireSuccess
	
	AltFireFail:
		TNT1 A 0 ACS_NamedExecuteAlways("AltFireFail")
		IONR A 1 A_WeaponReady(WRF_NOPRIMARY|WRF_NOSECONDARY)
		Goto Ready

	AltFireSuccess:
		TNT1 A 0 A_GiveInventory("SideAmmoRegenCD", 999)
		TNT1 A 0 A_GiveInventory("SideAltCD", 8)
		TNT1 A 0 A_SpawnItemEX("BlueLightShoot")
		TNT1 A 0 A_PlaySound("IonRebounder/Fire", CHAN_WEAPON)
		TNT1 A 0 A_PlaySound("IonRebounder/FireFar", CHAN_6)
		TNT1 A 0 A_Recoil(16.0)
		TNT1 A 0 A_FireCustomMissile("IonAltProjectile", 0.0, true, 12.0, 1.0, 0, 0.0)
		TNT1 A 0 A_GiveInventory("IonRebounderEmpoweredTics", 70)
		IONR A 1 A_WeaponReady(WRF_NOPRIMARY|WRF_NOSECONDARY)
		goto Ready
		
	/*AltFail:
		TNT1 A 0 ACS_NamedExecuteAlways("AltFireFail", 0)
		"####" A 1 A_WeaponReady(WRF_NOPRIMARY|WRF_NOSECONDARY)
		Goto Ready*/
		
	/*FireRailSphere:
		"####" 20*/
	}
}

//------------------------------------------------------------
// Alt fire duration
//------------------------------------------------------------
Actor IonRebounderEmpoweredTics : Inventory
{
	+SERVERNETID
	Inventory.MaxAmount 70
}

//------------------------------------------------------------
// Ion projectile
//------------------------------------------------------------
Actor IonProjectile
{
	// Properties
	Projectile
	Radius 8
	Height 8
	Scale 1.2
	Speed 64
	Damage (8)
	Decal "CarbineMainDecal"
	RenderStyle Add
	Obituary "%k > \cvIon Rebounder\c- > %o"
	
	// Flags
	+BRIGHT
	
	// States
	States
	{
	Spawn:
		BSPK A 1 nodelay A_SpawnItemEX("IonProjectileTrail")
		loop

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

	Death:
		TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("IonDeathFX", 0, 0, 0, frandom(-4.0, 4.0), frandom(-4.0, 4.0), frandom(-4.0, 4.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_PlaySound("PlasmaCarbine/Hit", CHAN_AUTO, 0.8)
		TNT1 A 0 A_SetScale(scalex * 0.75, scaley * 0.75)
		BSPK AAAAAAAAAA 1 A_FadeOut(0.1)
		TNT1 A 35
		stop
	}
}

Actor IonProjectileEmpowered : IonProjectile
{
	Damage (8)
	Decal "SparkMainDecal"
	Obituary "%k > \cvIon Rebounder (Bounce)\c- > %o"
	// States
	
	States
	{
	Spawn:
		RSPK A 1 nodelay A_SpawnItemEX("IonEmpoweredProjectileTrail")
		loop

	XDeath:
		TNT1 A 0 A_GiveToTarget("HitSoundSmall", 1)
		TNT1 A 0 A_PlaySound("PlasmaCarbine/Hit", CHAN_AUTO, 0.8)
		TNT1 A 35
		stop

	Death:
		TNT1 A 0 A_FaceTarget
		TNT1 A 0 A_CustomMissile("IonProjectileEmpowered2", 0, 0, 0, CMF_OFFSETPITCH|CMF_TRACKOWNER|CMF_SAVEPITCH, 0)
		TNT1 A 0 A_PlaySound("PlasmaCarbine/Hit", CHAN_AUTO, 0.8)
		TNT1 A 35
		stop
	}
}
Actor IonProjectileEmpowered2 : IonProjectileEmpowered
{
	// States
	States
	{
	Death:
		TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("IonEmpoweredDeathFX", 0, 0, 0, frandom(-4.0, 4.0), frandom(-4.0, 4.0), frandom(-4.0, 4.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_PlaySound("PlasmaCarbine/Hit", CHAN_AUTO, 0.8)
		TNT1 A 0 A_SetScale(scalex * 0.75, scaley * 0.75)
		RSPK AAAAAAAAAA 1 A_FadeOut(0.1)
		TNT1 A 35
		stop
	}
}

//------------------------------------------------------------
// Ion projectile visual effects
//------------------------------------------------------------
Actor IonDeathFX : LSParticleBase
{
	// Properties
	Scale 0.8
	
	// Flags
	-NOGRAVITY
	-NOINTERACTION
	
	// States
	States
	{
	Spawn:
		TNT1 A 0 A_SetScale(scalex - 0.05, scaley - 0.05)
		BSPK A 1 A_FadeOut(0.05)
		loop
	}
}

//------------------------------------------------------------
// Ion empowered projectile visual effects
//------------------------------------------------------------
Actor IonEmpoweredDeathFX : LSParticleBase
{
	// Properties
	Scale 0.8
	
	// Flags
	-NOGRAVITY
	-NOINTERACTION
	
	// States
	States
	{
	Spawn:
		TNT1 A 0 A_SetScale(scalex - 0.05, scaley - 0.05)
		RSPK A 1 A_FadeOut(0.05)
		loop
	}
}

//------------------------------------------------------------
// Projectile trail
//------------------------------------------------------------
Actor IonProjectileTrail : LSParticleBase
{
	// Properties
	Scale 0.8
	Alpha 0.75

	// States
	States
	{
	Spawn:
		TNT1 A 0 A_SetScale(scalex * 0.9, scaley * 0.9)
		BSPK A 1 A_FadeOut(0.125)
		loop
	}
}


//------------------------------------------------------------
// Empowered projectile trail
//------------------------------------------------------------
Actor IonEmpoweredProjectileTrail : LSParticleBase
{
	// Properties
	Scale 0.8
	Alpha 0.75

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


//------------------------------------------------------------
// Ion Alt projectile
//------------------------------------------------------------
Actor IonAltProjectile
{
	// Properties
	Projectile
	Radius 8
	Height 6
	Scale 1.5
	Speed 48
	Damage (0)
	Decal "CarbineMainDecal"
	RenderStyle Add
	Obituary "%k > \cvIon Rebounder (Alt)\c- > %o"
	
	// Flags
	+BRIGHT
	+SEEKERMISSILE  // For hit sounds
	
	// Constants
	const int RADIUS_OUTER = 160;
	const int RADIUS_INNER = 32;
	
	// States
	States
	{
	Spawn:
		BORB A 1 nodelay A_SpawnItemEX("IonAltProjectileTrail")
		loop
	
	Death:
		TNT1 A 0 A_FaceTarget
		TNT1 A 0 A_CustomMissile("IonAltProjectile2", 0, 0, 0, CMF_OFFSETPITCH|CMF_TRACKOWNER|CMF_SAVEPITCH, 0)
		TNT1 A 0 A_PlaySound("PlasmaCarbine/Hit", CHAN_AUTO, 0.8)
		TNT1 A 35
		stop
		
	XDeath:
		TNT1 A 0 A_GiveToTarget("HitSoundLarge", 1)
		goto Explode

	Explode:
		TNT1 A 0 A_SpawnItemEx("ExplosionSpawner", 0, 0, 0, 0, 0, 0, 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_SpawnItemEx("PlasmaGrenadeDeathFX", 0, 0, 0, 0, 0, 0, 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("PlasmaGrenadeDeathDot", 0, 0, 0, frandom(-16.0, 16.0), frandom(-16.0, 16.0), frandom(-16.0, 16.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("PlasmaGrenadeDeathSpark", 0, 0, 0, frandom(-16.0, 16.0), frandom(-16.0, 16.0), frandom(-16.0, 16.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_Quake(2, 8, 0, 384)
		TNT1 A 0 A_Explode(30, RADIUS_OUTER, !XF_HURTSOURCE, true, RADIUS_INNER)
		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 105  // Required for unlagged
		stop
	}
}

//------------------------------------------------------------
// Ion Alt projectile returning
//------------------------------------------------------------
Actor IonAltProjectile2 : IonAltProjectile
{
	Obituary "%k > \cvIon Rebounder (Alt Bounce)\c- > %o"
	ProjectileKickBack 200
	
	// Flags
	+BRIGHT
	
	// States
	States
	{
	
	XDeath:
		TNT1 A 0 A_GiveToTarget("HitSoundLarge", 1)
		goto Death

	Death:
		TNT1 A 0 A_SpawnItemEx("ExplosionSpawner", 0, 0, 0, 0, 0, 0, 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_SpawnItemEx("PlasmaGrenadeDeathFX", 0, 0, 0, 0, 0, 0, 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("PlasmaGrenadeDeathDot", 0, 0, 0, frandom(-16.0, 16.0), frandom(-16.0, 16.0), frandom(-16.0, 16.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 AAAAAAAAAAAAAAAA 0 A_SpawnItemEx("PlasmaGrenadeDeathSpark", 0, 0, 0, frandom(-16.0, 16.0), frandom(-16.0, 16.0), frandom(-16.0, 16.0), 0)//, SXF_NOUNLAGGED|SXF_SKIPOWNER)
		TNT1 A 0 A_Quake(2, 8, 0, 384)
		TNT1 A 0 A_Explode(30, RADIUS_OUTER, !XF_HURTSOURCE, true, RADIUS_INNER)
		TNT1 A 0 A_SeekerMissile(360, 360, SMF_LOOK, 256, RADIUS_OUTER)
		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 105  // Required for unlagged
		stop
	}
}


//------------------------------------------------------------
// Projectile trail
//------------------------------------------------------------
Actor IonAltProjectileTrail : LSParticleBase
{
	// Properties
	Scale 0.2

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