// Sprites by Eriance
Actor "BFG 9000" : BFG9000
{
	Inventory.PickupSound "weapons/pickup"
	Weapon.SlotNumber 7
	+INVENTORY.UNDROPPABLE
	inventory.pickupmessage "\ccWeapon pickup: \c[Y5]BFG 6000"
	Tag "$WEP_7_0_TAG"
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.1
	Weapon.BobRangeY 0.4
	Weapon.BobRangeX 0.7
	Weapon.AmmoGive 0
	Weapon.AmmoUse 0
	+WEAPON.NOAUTOAIM
	States
	{
		Ready:
			PRDC A 1 A_WeaponReady
			Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("P_GreenFire", 1)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_TakeInventory("DnD_UsingEnergy", 1)
			PRDC A 1 A_Lower
			TNT1 A 0 A_Lower
			Loop
		Select:
			TNT1 A 0 A_GiveInventory("P_GreenFire", 1)
			TNT1 A 0 A_GiveInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_GiveInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 100, 1 | (8 << 16), DND_WEAPON_BFG6000)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 2000, 0, DND_WEAPON_BFG6000)
	    SelectLoop:
			PRDC A 1 A_Raise
			TNT1 A 0 A_Raise
			Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_BFG6000, 0), "FireConfirmed")
			PRDC A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			PRDC B 10 A_BFGsound
			PRDC CDE 3 Bright Radius_Quake(2,2,0,1,0)
			TNT1 A 0 A_GunFlash
			PRDC FFFGG 1 Bright Radius_Quake(3,2,0,1,0)
			PRDC GHHHI 1 Bright Radius_Quake(4,2,0,1,0)
			PRDC II 1 Bright Radius_Quake(6,2,0,1,0)
			TNT1 A 0 Radius_Quake(12,4,0,1,0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_BFG6000, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), DND_ATF_NOAMMOGAINCHECK)
			PRDC J 3 Bright
			PRDC KLMN 3 Bright 
			PRDC A 16
			PRDC A 2 A_Refire
			Goto Ready	
		Flash:
			TNT1 A 5 Bright A_Light1
			TNT1 A 5 Bright A_Light2
			TNT1 A 2 Bright A_Light(3)
			TNT1 A 2 Bright A_Light2
			TNT1 A 2 Bright A_Light1
			Goto LightDone
		Spawn:
			PRDC X -1
			Stop	
	}
}

// Sprites by Eriance
Actor "Upgraded BFG 9000" : BFG9000
{
	Inventory.PickupSound "weapons/pickup"
	inventory.pickupmessage "\ccWeapon pickup: \c[Y5]BFG 32768"
	Weapon.SlotNumber 7
	Weapon.AmmoType1 "Cell"
	Weapon.AmmoType2 "BFG32768Overheat"
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_7_1_TAG"
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.1
	Weapon.BobRangeY 0.4
	Weapon.BobRangeX 0.7
	Weapon.AmmoGive 0
	Weapon.AmmoUse 0
	States
	{
		Ready:
			TNT1 A 0 A_GiveInventory("DnD_OverheatCanReduce", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Overheat Reduction", 0, DND_OVERHEAT_BFG32768, 5 | (17 << 16))
		ReadyLoop:
			DBFG A 1 A_WeaponReady
			Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("P_GreenFire", 1)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_TakeInventory("DnD_UsingEnergy", 1)
			DBFG A 1 A_Lower
			TNT1 A 0 A_Lower
			Loop
		Select:
			TNT1 A 0 A_GiveInventory("P_GreenFire", 1)
			TNT1 A 0 A_GiveInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_GiveInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 150, 4 | (6 << 16), DND_WEAPON_BFG32768)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 224, 0, DND_WEAPON_BFG32768)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 2500, 0, DND_WEAPON_BFG32768)
	    SelectLoop:
			DBFG A 1 A_Raise
			TNT1 A 0 A_Raise
			Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_BFG32768, 0), "FireConfirmed")
			DBFG A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			DBFG B 1 A_PlayWeaponSound("weapons/newbfgfire")
			DBFG B 9 A_TakeInventory("DnD_OverheatCanReduce", 1)
			DBFC ABCDE 2 Bright Radius_Quake(2,2,0,1,0)
			TNT1 A 0 A_GunFlash
			DBFC FFG 1 Bright Radius_Quake(3,2,0,1,0)
			DBFC GHHII 1 Bright Radius_Quake(4,2,0,1,0)
			DBFC JJ 1 Bright Radius_Quake(6,2,0,1,0)
			TNT1 A 0 Radius_Quake(12,4,0,1,0)
			DBFF A 2 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_BFG32768, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), DND_ATF_NOAMMOGAINCHECK)
			TNT1 A 0 A_GiveInventory("BFG32768CooldownGiver", 1)
			DBFF B 2 Bright 
			DBFG CDA 2 Bright
			DBFG A 14
			DBFG A 19 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_BFG32768, 1), "FireConfirmed")
			Goto Ready			
		Flash:
			TNT1 A 5 Bright A_Light1
			TNT1 A 5 Bright A_Light2
			TNT1 A 2 Bright A_Light(3)
			TNT1 A 2 Bright A_Light2
			TNT1 A 2 Bright A_Light1
			Goto LightDone
		NoAction:
			DBFG A 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			Goto Ready
		Spawn:
			DEBF A -1
			Stop	
	}
}

Actor BFG32768Cooldown : PowerDamage {
	powerup.duration -5
	damagefactor "normal", 1.0
}

Actor BFG32768CooldownGiver : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_JumpIfInventory("BFG32768Overheat", 0, "Give")
		Stop
		Give:
			TNT1 A 0 A_GiveInventory("BFG32768Cooldown", 1)
		Stop
	}
}

Actor BFGExtra2 {
	+CLIENTSIDEONLY
	+NOINTERACTION
	+NOBLOCKMAP
	+NOGRAVITY
	RenderStyle Add
	Alpha 0.75
	States {
		Spawn:
			BFE2 ABCD 8 Bright
		Stop
	}
}

Actor BFGExtraUpgraded : BFGExtra2 {
	Scale 0.425
    States {
		Spawn:
			TNT1 A 0
			TNT1 AAAAA 0 A_SpawnDebris("BFGParticles")
			BFOG ABCDEFG 4 Bright
		Stop
    }
}

actor BFGParticles : ExplosiveSpark {
    States {
		Spawn:
			BFFX A 1 BRIGHT A_FadeOut(0.01)
		loop
    }
}

Actor BFGShockWave {
	Speed 0
	Height 64 
	Radius 32
	Scale 2.25 
	RenderStyle add
	Alpha 0.9
	+DROPOFF 
	+NOBLOCKMAP 
	+NOGRAVITY 
	+CLIENTSIDEONLY
	States { 
		Spawn: 
			R075 ABCDEFFGGHHIIIJJJKKKLLMMNNOP 1 BRIGHT A_FadeOut(0.03)
		Stop 
	} 
} 

Actor BFGBallTrail {
	Renderstyle Add
	Alpha 0.75
	+NOINTERACTION
	+CLIENTSIDEONLY
	+NOTELEPORT
	
	States {
		Spawn:
			BFS1 AABB 2 Bright A_FadeOut(0.15)
		Loop
	}
}

Actor BFGBall2 : DnD_BaseProjectile replaces BFGBall {
	Decal "BFGLightning"
	Radius 13
	Height 8
	Speed 25
	Alpha 0.75
	DeathSound "weapons/bfgx"
	
	Damage(
		DND_WEAPON_BFG6000 |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+RANDOMIZE
	+DONTREFLECT
	+FOILINVUL
	+DONTBLAST
	States {
		SpawnState:
			BFS1 AAAABBBB 1 Bright A_SpawnItemEx("GreenParticleSlowVanish",Random(-12,12),Random(-12,12),Random(-12,12),Random(-2,2),Random(-2,2),Random(-2,2),Random(-20,20),128)
		Loop
		Death:
			TNT1 A 0 A_SpawnItemEx ("BFGFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			BFE1 AB 8 Bright
			BFE1 C 8 Bright ACS_NamedExecuteWithResult("DnD Do Scan Attack", ACS_NamedExecuteWithResult("DND Weapon Damage Retrieve", DND_DMGID_1 | (DND_WEAPON_BFG6000 << 16), DND_DAMAGECATEGORY_ENERGY, DND_USETARGET | DND_ISSUPER | DND_ISSLOT7), DND_DAMAGETYPE_ENERGY, 30 | (DND_SCANNER_BFG << 16), DND_DAMAGEFLAG_DISTANCEGIVESDAMAGE)
			BFE1 DEF 8 Bright
		Stop
	}
}

Actor BFGBallUpgraded : DnD_ExplosiveBase {
	Decal "BFGLightning"
	Radius 13
	Height 8
	Speed 25
	Alpha 0.75
	DeathSound "weapons/bfgx"
	
	Damage(
		DND_WEAPON_BFG32768 |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+RANDOMIZE
	+DONTREFLECT
	+FOILINVUL
	+DONTBLAST
	+FORCERADIUSDMG
	States {
		SpawnState:
			BFS1 A 1 Bright A_SpawnItem("BFGBallTrail")
			TNT1 A 0 A_SpawnItemEx("GreenParticleSlowVanish",Random(-12,12),Random(-12,12),Random(-12,12),Random(-2,2),Random(-2,2),Random(-2,2),Random(-20,20),128)
			BFS1 A 1 Bright A_SpawnItem("BFGBallTrail")
			TNT1 A 0 A_SpawnItemEx("GreenParticleSlowVanish",Random(-12,12),Random(-12,12),Random(-12,12),Random(-2,2),Random(-2,2),Random(-2,2),Random(-20,20),128)
			BFS1 A 1 Bright A_SpawnItem("BFGBallTrail")
			TNT1 A 0 A_SpawnItemEx("GreenParticleSlowVanish",Random(-12,12),Random(-12,12),Random(-12,12),Random(-2,2),Random(-2,2),Random(-2,2),Random(-20,20),128)
			BFS1 A 1 Bright A_SpawnItem("BFGBallTrail")
			TNT1 A 0 A_SpawnItemEx("GreenParticleSlowVanish",Random(-12,12),Random(-12,12),Random(-12,12),Random(-2,2),Random(-2,2),Random(-2,2),Random(-20,20),128)
			BFS1 B 1 Bright A_SpawnItem("BFGBallTrail")
			TNT1 A 0 A_SpawnItemEx("GreenParticleSlowVanish",Random(-12,12),Random(-12,12),Random(-12,12),Random(-2,2),Random(-2,2),Random(-2,2),Random(-20,20),128)
			BFS1 B 1 Bright A_SpawnItem("BFGBallTrail")
			TNT1 A 0 A_SpawnItemEx("GreenParticleSlowVanish",Random(-12,12),Random(-12,12),Random(-12,12),Random(-2,2),Random(-2,2),Random(-2,2),Random(-20,20),128)
			BFS1 B 1 Bright A_SpawnItem("BFGBallTrail")
			TNT1 A 0 A_SpawnItemEx("GreenParticleSlowVanish",Random(-12,12),Random(-12,12),Random(-12,12),Random(-2,2),Random(-2,2),Random(-2,2),Random(-20,20),128)
			BFS1 B 1 Bright A_SpawnItem("BFGBallTrail")
			TNT1 A 0 A_SpawnItemEx("GreenParticleSlowVanish",Random(-12,12),Random(-12,12),Random(-12,12),Random(-2,2),Random(-2,2),Random(-2,2),Random(-20,20),128)
		Loop
	    Death:
			BFE1 A 8 Bright
			TNT1 A 0 A_SpawnItemEx ("BFGFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 A 0 A_SpawnItem("BFGShockWave")
			
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_BFG32768 |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 192)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius / 2)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			BFE1 B 8 Bright
			TNT1 AAAAAAAAAAAAAAAAAA 0 A_SpawnDebris("BFGParticles")
			BFE1 C 8 Bright ACS_NamedExecuteWithResult("DnD Do Scan Attack", ACS_NamedExecuteWithResult("DND Weapon Damage Retrieve", DND_DMGID_2 | (DND_WEAPON_BFG32768 << 16), DND_DAMAGECATEGORY_ENERGY, DND_USETARGET | DND_ISSUPER | DND_ISSLOT7), DND_DAMAGETYPE_ENERGY, 30 | (DND_SCANNER_BFGUPGRADED << 16), DND_DAMAGEFLAG_DISTANCEGIVESDAMAGE)
			BFE1 DEF 8 Bright
		Stop
	}
}

Actor Devastator : BFG9000 { // upgraded bfg 9000-2
	Inventory.PickupSound "weapons/pickup"
	inventory.pickupmessage "\ccWeapon pickup: \c[Y5]Devastator 5000"
	Weapon.SlotNumber 7
	Weapon.SelectionOrder 500
	Weapon.AmmoType1 "DevastatorAmmo"
	Weapon.AmmoType2 "DevastatorAmmo"
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_7_2_TAG"
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 1.8
	Weapon.BobRangeY 0.3
	Weapon.BobRangeX 0.6
	Weapon.AmmoGive 0
	Weapon.AmmoUse1 5
	Weapon.AmmoUse2 60
	-NOAUTOFIRE
	+WEAPON.NOAUTOAIM
	States {
		Ready:
			DEVA A 1 A_WeaponReady
			Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot7", 1)
			DEVA A 1 A_Lower
			TNT1 A 0 A_Lower
			Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot7", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 8, 8 | (10 << 16), DND_WEAPON_DEVASTATOR)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 64, 0, DND_WEAPON_DEVASTATOR)
		SelectLoop:
			DEVA A 1 A_Raise
			TNT1 A 0 A_Raise
			Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_DEVASTATOR, 0), "FireConfirmed")
			DEVA A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			TNT1 A 0 A_JumpIfInventory("DevastatorTurn", 1, "Fire2")
			DEVA B 2 Bright A_GunFlash
			TNT1 A 0 A_GiveInventory("DevastatorTurn", 1)
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			TNT1 A 0 Radius_Quake(4,2,0,1,0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DEVASTATOR, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_DEVASTATOR << 16), DND_ATF_CANFIRECIRCLE | DND_ATF_NOAMMOGAINCHECK)
			DEVA CD 1 Bright
			DEVA EF 2
			DEVA A 3 A_Refire
			Goto Ready	
		Fire2:
			DEVA G 2 Bright A_GunFlash
			TNT1 A 0 A_TakeInventory("DevastatorTurn", 1)
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			TNT1 A 0 Radius_Quake(4,2,0,1,0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DEVASTATOR, DND_ATK_PRIMARY | DND_ATK_OTHER_DIR, DND_AMMOSLOT_CELL | (AMMO_DEVASTATOR << 16), DND_ATF_CANFIRECIRCLE | DND_ATF_NOAMMOGAINCHECK)
			DEVA HI 1 Bright
			DEVA JK 2
			DEVA A 3 A_Refire
			Goto Ready
		Altfire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_DEVASTATOR, 1), "AltFireConfirmed")
			DEVA A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		AltFireConfirmed:
			// 66 tics => 1.5 secs
			DEVA A 2 Offset(0, 31) A_GiveInventory("DnD_DevastatorSlowGiver", 1)
			DEVA A 2 Offset(0, 30) A_PlayWeaponSound("weapons/bigcharge")
			DEVA A 2 Offset(0, 28)
			DEVA A 2 Offset(0, 26)
			DEVA A 2 Offset(0, 25)
			DEVA A 2 Offset(0, 26)
			DEVA A 2 Offset(0, 27)
			DEVA A 2 Offset(0, 29)
			DEVA A 2 Offset(0, 31)
			DEVA A 2 Offset(0, 34)
			DEVA A 2 Offset(0, 37)
			DEVA A 2 Offset(0, 41)
			DEVA A 8 Offset(0, 44)
			// 15 so far, we need 37 for up then down then up for settle
			DEVA A 1 Offset(0, 43)
			DEVA A 1 Offset(0, 42)
			DEVA A 1 Offset(0, 40)
			DEVA A 1 Offset(0, 38)
			DEVA A 1 Offset(0, 35)
			DEVA A 1 Offset(0, 34)
			DEVA A 1 Offset(0, 33)
			DEVA A 1 Offset(0, 32)
			DEVA A 1 Offset(0, 31)
			DEVA A 1 Offset(0, 30)
			DEVA A 1 Offset(0, 29)
			DEVA A 3 Offset(0, 28)
			DEVA A 1 Offset(0, 29)
			DEVA A 1 Offset(0, 30)
			DEVA A 1 Offset(0, 31) A_PlayWeaponSound("weapons/bigcharge2")
			// 17 here, so we need 20 tics of idle shaking
			DEVA A 1 Offset(0, 32)
			DEVA A 1 Offset(-2, 33)
			DEVA A 1 Offset(-3, 32)
			DEVA A 1 Offset(1, 34)
			DEVA A 1 Offset(0, 33)
			DEVA A 1 Offset(2, 34)
			DEVA A 1 Offset(-3, 32)
			DEVA A 1 Offset(1, 32)
			DEVA A 1 Offset(-1, 34)
			DEVA A 1 Offset(0, 32)
			DEVA A 1 Offset(0, 32)
			DEVA A 1 Offset(-2, 33)
			DEVA A 1 Offset(-3, 32)
			DEVA A 1 Offset(1, 34)
			DEVA A 1 Offset(0, 33)
			DEVA A 1 Offset(2, 34)
			DEVA A 1 Offset(-3, 32)
			DEVA A 1 Offset(1, 32)
			DEVA A 1 Offset(-1, 34)
			DEVA A 1 Offset(0, 32)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DEVASTATOR, DND_ATK_SECONDARY, DND_AMMOSLOT_CELL | (AMMO_DEVASTATOR << 16), DND_ATF_NOAMMOGAINCHECK)
			//--------------------
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA B 1 Bright A_GunFlash
			DEVA D 1 Bright
			DEVA F 1
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA G 1 Bright A_GunFlash
			DEVA I 1 Bright
			DEVA K 1
			//--------------------
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA B 1 Bright A_GunFlash
			DEVA D 1 Bright
			DEVA F 1
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA G 1 Bright A_GunFlash
			DEVA I 1 Bright
			DEVA K 1
			//--------------------
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA B 1 Bright A_GunFlash
			DEVA D 1 Bright
			DEVA F 1
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA G 1 Bright A_GunFlash
			DEVA I 1 Bright
			DEVA K 1
			//--------------------
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA B 1 Bright A_GunFlash
			DEVA D 1 Bright
			DEVA F 1
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA G 1 Bright A_GunFlash
			DEVA I 1 Bright
			DEVA K 1
			//--------------------
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA B 1 Bright A_GunFlash
			DEVA D 1 Bright
			DEVA F 1
			TNT1 A 0 A_PlaySound("weapons/devastatorfire", 5)
			DEVA G 1 Bright A_GunFlash
			DEVA I 1 Bright
			DEVA K 1
			//--------------------
			DEVA A 5 A_WeaponReady(WRF_NOFIRE)
			Goto Ready
		FailAlt:
			DEVA A 1 A_WeaponReady(WRF_NOFIRE)
			Goto Ready
		Flash:
			TNT1 A 2 Bright A_Light1
			TNT1 A 2 Bright A_Light2
			TNT1 A 1 Bright A_Light(3)
			TNT1 A 2 Bright A_Light2
			TNT1 A 2 Bright A_Light1
			Goto LightDone
		Spawn:
			DEVA Z -1
			Stop	
	}
}

Actor DnD_DevastatorSlowGiver : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Check Unique Player Property", PUP_KNOCKBACKIMMUNE), "NoRecoil")
			TNT1 A 0 A_GiveInventory("DnD_DevastatorSlower", 1)
		Stop
		NoRecoil:
			TNT1 A 0
		Stop
	}
}

Actor DnD_DevastatorSlower : PowerSpeed {
	Speed 0.15
	powerup.duration 104
}

Actor DevastatorTurn : DnD_Boolean { }

Actor DevastatorRocket : DnD_ExplosiveBase {
	Speed 32
	DamageType "Explosives"
	DeathSound "Weapons/DevastatorExpl"
	Height 10
	Radius 5
	Scale 0.5
	
	Damage(
		DND_WEAPON_DEVASTATOR |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+THRUGHOST
	+FOILINVUL
	+FORCERADIUSDMG
	+NODAMAGETHRUST
	+SEEKERMISSILE
	States {
		SpawnState:
			TNT1 A 0 A_SpawnItem("DevastatorSmoke")
			DEVM A 2 Bright A_SeekerMissile(2, 2)
		Loop
		Death:
			TNT1 A 0 A_SpawnItemEx ("ExplosionFlareSmall", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			TNT1 AAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AA 0 A_CustomMissile ("ExplosionParticleVeryFast", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AAAAA 0 A_CustomMissile("DevastatorSmoke", 0, 0, random(0, 360), 2, random(0, 180))
			
			TNT1 A 0 A_SetUserVar("user_expdmg",
				DND_WEAPON_DEVASTATOR |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 96 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 0)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 17 A_SpawnItem("DevastatorExplosion")
		Stop
	}
}

Actor DevastatorRocket_LessRange : DevastatorRocket {
	ReactionTime 12
	States {
		SpawnState:
			TNT1 A 0 A_SpawnItem("DevastatorSmoke")
			DEVM A 2 Bright A_Countdown
		Loop
	}
}

Actor DevastatorRocket_GhostHitter : DevastatorRocket {
	-THRUGHOST
}

Actor DevastatorRocket_LessRange_GhostHitter : DevastatorRocket_GhostHitter {
	ReactionTime 10
	States {
		SpawnState:
			TNT1 A 0 A_SpawnItem("DevastatorSmoke")
			DEVM A 2 Bright A_Countdown
		Loop
	}
}

Actor DevastatorExplosion {
	Renderstyle Add
	Alpha 0.85
	+NOGRAVITY
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_ChangeVelocity(0, 0, 0.1)
			TNT1 A 0 A_Jump(256, "Var1", "Var2", "Var3", "Var4", "Var5")
		Var1:
			EXP6 ABCDEFGH 1 Bright
		Stop
		Var2:
			EXP7 ABCDEFGH 1 Bright
		Stop
		Var3:
			EXP8 ABCDEFGH 1 Bright
		Stop
		Var4:
			EXP9 ABCDEFGH 1 Bright
		Stop
		Var5:
			EXP0 ABCDEFGH 1 Bright
		Stop
	}
}

ACTOR MFG : BFG9000 {
	Weapon.SlotNumber 7
	Weapon.SelectionOrder 6500
	Inventory.PickupMessage "You got the Destruction Generator!"
	Tag "$WEP_7_3_TAG"
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 1.6
	Weapon.BobRangeY 0.35
	Weapon.BobRangeX 0.6
	Weapon.AmmoUse 60
	Weapon.AmmoGive 0
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			BFGP A -1
		Stop
		Deselect:
			TNT1 A 0 A_TakeInventory("P_GreenFire", 1)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_TakeInventory("DnD_UsingEnergy", 1)
		DeselectLoop:
			NBFG A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("P_GreenFire", 1)
			TNT1 A 0 A_GiveInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_giveInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 425, 0, DND_WEAPON_MFG)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 200, 0, DND_WEAPON_MFG)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 32, 0, DND_WEAPON_MFG)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_3, 128, 0, DND_WEAPON_MFG)
		SelectLoop:
			NBFG A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Ready:
			NBFG A 1 A_WeaponReady
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_MFG, 0), "FireConfirmed")
			NBFG A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			NBFG A 0 A_PlaySound("Weapons/MFGCharge", 5)
			NBFG A 1 BRIGHT Offset(1,34) A_Quake(4, 12, 0, 20, "")
			NBFG A 1 BRIGHT Offset(-1,32)
			NBFG A 1 BRIGHT Offset(-1,34)
			NBFG A 1 BRIGHT Offset(1,32)
			NBFG A 1 BRIGHT Offset(1,34)
			NBFG A 1 BRIGHT Offset(-1,32)
			NBFG A 1 BRIGHT Offset(-1,34)
			NBFG A 1 BRIGHT Offset(1,32)
			NBFG A 1 BRIGHT Offset(1,34)
			NBFG A 1 BRIGHT Offset(-1,32)
			NBFG A 1 BRIGHT Offset(-1,34)
			NBFG A 1 BRIGHT Offset(1,32)
			NBFG B 1 BRIGHT Offset(1,34)
			NBFG B 1 BRIGHT Offset(-1,32)
			NBFG C 1 BRIGHT Offset(-1,34)
			TNT1 A 0 Offset(-1, 34) A_PlayWeaponSound("Weapons/MFGFire")
			NBFG C 1 BRIGHT Offset(1,32) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_MFG, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), DND_ATF_NOAMMOGAINCHECK)
			NBFG D 1 BRIGHT Offset(1,34)
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Check Unique Player Property", PUP_KNOCKBACKIMMUNE), "NoRecoil")
			NBFG D 1 BRIGHT Offset(-1,32)
			TNT1 A 0 A_Recoil(3.0)
		Goto SkipRecoil
		NoRecoil:
			NBFG D 1 BRIGHT Offset(-1,32)
		SkipRecoil:
			NBFG E 1 BRIGHT Offset(1,36)
			NBFG E 1 BRIGHT Offset(1,43)
			NBFG F 1 BRIGHT Offset(1,50)
			NBFG G 1 Offset(1,53)
			NBFG H 1 Offset(1,54)
			NBFG A 1 Offset(1,50)
			NBFG A 1 Offset(1,44)
			NBFG A 1 Offset(1,40)
			NBFG A 1 Offset(1,37)
			NBFG A 1 Offset(1,35)
			NBFG A 1 Offset(1,33)
			TNT1 A 0 A_CheckReload
			NBFG A 7 Offset(1, 32)
			NBFG A 1 Offset(1, 32) A_Refire
		Goto Ready
	}
}

//Projectile recoded by Pillowblaster.
// does full damage regardless
ACTOR DNBFGBall : DnD_BaseProjectile {
	Radius 8
	Height 16
	Speed 40
	Decal BFGLightning
	ReactionTime 8
	
	Damage(
		DND_WEAPON_MFG |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+FORCERADIUSDMG
	+FOILINVUL
	+NODAMAGETHRUST
	+DONTREFLECT
	+DONTSPLASH
	States {
		SpawnState:
			NBFP ABCD 1 BRIGHT A_SpawnItemEx("DNBFGTrailSpawner")
			TNT1 A 0 A_Countdown
		Loop
		XDeath:
			TNT1 A 0
		Goto PostDeath
		Death:
			TNT1 A 0 A_JumpIf(reactiontime, "PostDeath")
			NBFP ABCDABCD 1 Bright A_SetScale(scalex * 0.875, scaley * 0.875)
			TNT1 A 4 A_SpawnItemEx("BFGFlare")
		PostDeath:
			NBFP A 0 A_PlaySound("Weapons/MFGExplode", CHAN_AUTO, 1.0)
			NBFP A 0 A_SpawnItemEx("DNBFGInitBlast")
			NBFP A 0 A_SpawnItemEx("DNBFGReverseBlast")
			NBFP A 0 A_SpawnItemEx("DNBFGMiniblastSpammer")
			NBFP A 0 A_SpawnItemEx("DNBFGGLDEFThingy")
			NBFP A 0 A_Quake(3,15,0,768,"")
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 A 0 A_CustomMissile("DNBFGBallExp1", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall", 32, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall", 32, 0, 60, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall", 32, 0, 120, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall", 32, 0, 180, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall", 32, 0, 240, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall", 32, 0, 300, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
		FinishAnim:
			TNT1 AAAAAA 1 A_SpawnItemEx("DNBFGParticleBlast")
			TNT1 A 9
		Stop
		Crit:
			TNT1 A 0 A_CustomMissile("DNBFGBallExp1_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall_Crit", 32, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall_Crit", 32, 0, 60, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall_Crit", 32, 0, 120, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall_Crit", 32, 0, 180, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall_Crit", 32, 0, 240, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmall_Crit", 32, 0, 300, CMF_TRACKOWNER | CMF_AIMDIRECTION, 120)
		Goto FinishAnim
	}
}

Actor DNBFGBallExp1 : DnD_ExplosiveBase {
	Speed 0
	+FORCERADIUSDMG
	+THRUACTORS
	var int user_count;
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 0 A_SetUserVar("user_count", 2)
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_MFG |
				(DND_DMGID_2 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(300 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 448 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius / 2)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF)
		ExplosionLoop:
			TNT1 A 0
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 0 A_SetUserVar("user_count", user_count - 1)
			TNT1 A 0 A_JumpIf(user_count > 0, "Recalc")
			TNT1 A 3
		Stop
		Recalc:
			TNT1 A 0 A_SetUserVar("user_expdmg", user_expdmg * 3)
			TNT1 A 0 A_SetUserVar("user_expradius", user_expradius * 1.7145) // 768 ~= 448 x 1.7145
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 2 * user_expradius / 3) // 512
		Goto ExplosionLoop
	}
}

Actor DNBFGBallExp1_Crit : DNBFGBallExp1 {
	Accuracy 69
}

Actor DNBFGBallSmallExp1 : DnD_ExplosiveBase {
	Speed 0
	+FORCERADIUSDMG
	+THRUACTORS
	var int user_count;
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 0 A_SetUserVar("user_count", 2)
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_MFG |
				(DND_DMGID_3 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 256 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 3 * user_expradius / 4)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF | DND_DAMAGEFLAG_HALFDMGSELF)
		ExplosionLoop:
			TNT1 A 0
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 0 A_SetUserVar("user_count", user_count - 1)
			TNT1 A 0 A_JumpIf(user_count > 0, "Recalc")
			TNT1 A 3
		Stop
		Recalc:
			TNT1 A 0 A_SetUserVar("user_expdmg", user_expdmg * 2)
		Goto ExplosionLoop
	}
}

Actor DNBFGBallSmallExp1_Crit : DNBFGBallSmallExp1 {
	Accuracy 69
}

Actor DNBFGBallSmall : DNBFGBall {
	Speed 24
	Scale 0.6
	Gravity 2.0
	
	Damage(
		DND_WEAPON_MFG |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	-FOILINVUL
	-NOGRAVITY
	States {
		SpawnState:
			NBFP ABCD 1 BRIGHT A_SpawnItemEx("DNBFGTrailSpawner")
		Loop
		Death:
			NBFP A 0 A_PlaySound("Weapons/MFGExplode", CHAN_AUTO, 1.0)
			TNT1 A 0 A_CustomMissile("DNBFGBallSmallExp1", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			NBFP A 0 A_SpawnItemEx("DNBFGInitBlast")
			NBFP A 0 A_SpawnItemEx("DNBFGReverseBlast2")
			NBFP A 0 A_Quake(2,11,0,192,"")
			TNT1 AAAAAA 1
			TNT1 A 9
		Stop
	}
}

Actor DNBFGBallSmall_Crit : DNBFGBallSmall {
	Accuracy 69
}

Actor MFGShooter : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_PlaySound("Weapons/MFGFire", 6)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD On Attack", 0)
			//TNT1 A 0 ACS_NamedExecuteAlways("DnD Ammo Gain Chance", 0, DND_AMMOSLOT_CELL, AMMO_CELL, 60)
			TNT1 A 0 A_FireCustomMissile("DNBFGBall", 0, 1)
		Stop
	}
}

//Thingamajib used for GLDEF

ACTOR DNBFGGLDEFThingy
{
	+NOINTERACTION
	+NOGRAVITY
	+CLIENTSIDEONLY
	States
	{
	Spawn:
		TNT1 A 35
		Stop
	}
}

//Basis for all effects
ACTOR DNBFGBase
{
	+NOINTERACTION
	+CLIENTSIDEONLY
	+DONTSPLASH
	Alpha 0.99
	Renderstyle Add
	States
	{
	Spawn:
		TNT1 A 0
		TNT1 A 0 Thing_ChangeTID(0, SPECIAL_FX_TID)
		TNT1 A 0
		TNT1 A 0 A_Jump(256,"SpriteA","SpriteB","SpriteC","SpriteD")
	SpriteA:
		NBFP A 0 A_Jump(256,"Main")
	SpriteB:
		NBFP B 0 A_Jump(256,"Main")
	SpriteC:
		NBFP C 0 A_Jump(256,"Main")
	SpriteD:
		NBFP D 0 A_Jump(256,"Main")
		Goto Main
	Main:
		TNT1 A 1 // Let's see if this stops the warnings
		Stop
	}
}

//Trail

ACTOR DNBFGTrailSpawner
{
	+NOINTERACTION
	+NOGRAVITY
	+CLIENTSIDEONLY
	States
	{
	Spawn:
		TNT1 A 0
		"####" "#" 0 A_SpawnItemEx("DNBFGTrail")
		"####" "###" 0 A_SpawnItemEx("DNBFGTrailParticle",random(20,-20),random(20,-20),random(10,-20),frandom(5.0,0.5),0,frandom(3.0,0.5),random(225,135), SXF_NOCHECKPOSITION | SXF_CLIENTSIDE,60)
		Stop
	}
}

ACTOR DNBFGTrail : DNBFGBase
{
	States
	{
	Main:
		"####" "#" 0 A_JumpIf(ScaleX<=0,"NULL")
		"####" "#" 0 A_SetScale(ScaleX - FRandom(0.05,0.02))
		"####" "#" 1 A_FadeOut(0.1)
		Loop
	}
}

ACTOR DNBFGTrailParticle : DNBFGBase
{
	Scale 0
	Alpha 0
	States
	{
	Main:
		"####" "#" 0 A_SetScale(ScaleX+frandom(0.1,0.05))
		"####" "#" 0 A_FadeIn(FRandom(0.7,0.5))
	Looplet:
		"####" "#" 0 A_JumpIf(ScaleX<=0,"NULL")
		"####" "#" 0 A_Jump(192,2)
		"####" "#" 0 A_FadeOut(frandom(0.01,0.005))
		"####" "#" 0 A_ChangeVelocity(frandom(0.2,-0.2),frandom(0.2,-0.2),frandom(0.2,-0.2),0)
		"####" "#" 1 A_SetScale(ScaleX - FRandom(0.002,0.001))
		Loop
	}
}

//Impact

ACTOR DNBFGInitBlast : DNBFGBase
{
	States
	{
	Main:
		"####" "#" 0 A_SetScale(ScaleX + FRandom(0.3,0.2))
		"####" "#" 1 A_FadeOut(0.025)
		Loop
	}
}

ACTOR DNBFGReverseBlast : DNBFGBase
{
	Scale 5
	States
	{
	Main:
		"####" "#" 0 A_JumpIf(ScaleX<=0,"NULL")
		"####" "#" 0 A_SetScale(ScaleX - FRandom(0.3,0.2))
		"####" "#" 1 A_FadeOut(0.05)
		Loop
	}
}

ACTOR DNBFGReverseBlast2 : DNBFGReverseBlast
{
	Scale 2.5
}

ACTOR DNBFGParticleBlast : DNBFGBase
{
	Renderstyle Normal
	Var Int User_Count;
	States
	{
	Spawn:
		TNT1 AA 0 A_SetUserVar("User_Count", 12)
	Looplet:
		TNT1 A 0 A_SetUserVar("User_Count", User_Count - 1)
		TNT1 A random(1,2) A_SpawnItemEx("DNBFGParticle",random(35,-35),random(35,-35),random(35,-35),frandom(8.0,-8.0),frandom(8.0,-8.0),frandom(8.0,-8.0),random(0.0,360.0),0,40)
		TNT1 A 0 A_JumpIf(User_Count <= 0,"OvertureEnds")
		Loop
	OvertureEnds:
		TNT1 A 0
		Stop
	}
}

ACTOR DNBFGParticle : DNBFGBase
{
	Scale 0
	Alpha 0
	States
	{
	Main:
		"####" "#" 0 A_SetScale(ScaleX+frandom(0.15,0.05))
		"####" "#" 0 A_FadeIn(FRandom(0.7,0.5))
	Looplet:
		"####" "#" 0 A_JumpIf(ScaleX<=0,"NULL")
		"####" "#" 0 A_Jump(192,2)
		"####" "#" 0 A_FadeOut(frandom(0.005,0.002))
		"####" "#" 0 A_ChangeVelocity(frandom(2.0,-2.0),frandom(2.0,-2.0),frandom(2.0,-2.0),0)
		"####" "#" 1 A_SetScale(ScaleX - FRandom(0.002,0.001))
		Loop
	}
}

ACTOR DNBFGMiniblastSpammer : DNBFGBase
{
	Renderstyle Normal
	Var Int User_Count;
	States
	{
	Spawn:
		TNT1 AA 0 A_SetUserVar("User_Count", 12)
	Looplet:
		TNT1 A 0 A_SetUserVar("User_Count", User_Count - 1)
		TNT1 A 1 A_SpawnItemEx("DNBFGMiniblast",random(35,-35),random(35,-35),random(35,-35))
		TNT1 A 0 A_JumpIf(User_Count <= 0,"OvertureEnds")
		Loop
	OvertureEnds:
		TNT1 A 0
		Stop
	}
}

ACTOR DNBFGMiniblast : DNBFGBase
{
	States
	{
	Main:
		"####" "#" 0 A_SetScale(ScaleX + FRandom(0.25,0.3))
		"####" "#" 1 A_FadeOut(0.1)
		Loop
	}
}

// Drop only, Sprites by Eriance
ACTOR "Rail Gun" : Weapon {
	Inventory.PickupSound "weapons/pickup"
	Inventory.PickupMessage "You got the railgun!"
	Obituary "%o was railed by %k."
	Weapon.AmmoType "Cell"
	Weapon.AmmoGive 40
	Weapon.AmmoUse 8
	Weapon.SlotNumber 7
	+INVENTORY.UNDROPPABLE
	+NOAUTOAIM
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.1
	Weapon.BobRangeY 0.4
	Weapon.BobRangeX 0.7
	Tag "$WEP_7_7_TAG"
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			WRAL A -1
		Loop
		Ready: 
			TNT1 A 0 A_GiveInventory("P_RedFire", 1)
			RAIG A 2 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("P_RedFire", 1)
			TNT1 A 0 A_TakeInventory("P_PlasmaFire", 1)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_GiveInventory("DnD_UsingEnergy", 1)
			RAIG A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("P_RedFire", 1)
			TNT1 A 0 A_GiveInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_GiveInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 80, 0, DND_WEAPON_RAILGUN)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 160, 0, DND_WEAPON_RAILGUN)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 240, 0, DND_WEAPON_RAILGUN)
		SelectLoop:
			RAIG A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			RAIG A 0 A_JumpIfInventory("Railgun_Charge", 2, "Level3")
			RAIG A 0 A_JumpIfInventory("Railgun_Charge", 1, "Level2")
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_RAILGUN, 0), "FireConfirmed")
			RAIG A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			RAIG T 2 A_PlayWeaponSound("weapons/plasmacharge")
			RAIG BUCVD 2
			RAIG E 1 Bright
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_RAILGUN, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), DND_ATF_NOAMMOGAINCHECK)
			RAIG L 1 Bright A_GunFlash
			RAIG M 1 Bright A_PlayWeaponSound("weapons/newrailfire")
			RAIG N 1 Bright
			RAIG FFO 1 Bright
			RAIG Z 2
			RLOA ABCDEFEDCBA 1
			RAIG A 3
		Goto Ready
		Level2:
			TNT1 A 0 A_TakeInventory("P_RedFire", 1)
			TNT1 A 0 A_TakeInventory("P_PlasmaFire", 1)
			RAI2 E 1 Bright
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_RAILGUN, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), DND_ATF_NOAMMOGAINCHECK)
			RAI2 L 1 Bright A_GunFlash
			TNT1 A 0 Radius_Quake(6,2,0,1,0)
			TNT1 A 0 A_PlayWeaponSound("weapons/newrailfire")
			RAI2 M 1 Bright A_SetPitch(pitch - 5.0)
			RAI2 N 1 Bright A_SetPitch(pitch + 0.5)
			RAI2 FFO 1 Bright A_SetPitch(pitch + 0.5)
			RAIG ZZ 1  A_SetPitch(pitch + 0.5)
			RLOA ABCC 1 A_SetPitch(pitch + 0.5)
			RLOA CDEFEDCBA 1
			RAIG A 3
		Goto Ready
		Level3:
			TNT1 A 0 A_TakeInventory("P_RedFire", 1)
			TNT1 A 0 A_GiveInventory("P_PlasmaFire", 1)
			RAI3 E 1 Bright
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_RAILGUN, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), DND_ATF_NOAMMOGAINCHECK)
			RAI3 L 1 Bright A_GunFlash
			TNT1 A 0 Radius_Quake(12,4,0,1,0)
			TNT1 A 0 A_PlayWeaponSound("weapons/newrailfire")
			RAI3 M 1 Bright A_SetPitch(pitch - 12.0)
			RAI3 N 1 Bright A_SetPitch(pitch + 0.75)
			RAI3 FFO 1 Bright A_SetPitch(pitch + 0.75)
			RAIG ZZ 1 A_SetPitch(pitch + 0.75)
			RLOA ABCDEF 1 A_SetPitch(pitch + 0.75)
			RLOA EDCBA 1
			RAIG A 3
		Goto Ready
		AltFire:
			TNT1 A 0 A_JumpIfInventory("Railgun_Charge", 2, "NoMore")
			TNT1 A 0 A_JumpIfInventory("ArtemisCheck", 1, "ContinueCharge")
			TNT1 A 0 A_JumpIfInventory("Cell", 8, "ContinueCharge")
			RAIG A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		ContinueCharge:
			TNT1 A 0 A_PlayWeaponSound("weapons/plasmacharge")
			RAIG T 2  A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Take Ammo From Weapon", DND_WEAPON_RAILGUN, 0, 8)
		NoTake:
			TNT1 A 0 A_GiveInventory("Railgun_Charge", 1)
			RAIG BUCVD 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			RAIG A 4 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		NoMore:
			RAIG A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		Flash:
			TNT1 A 4 A_Light1
			TNT1 A 4 A_Light2
			TNT1 A 1 A_Light1
			TNT1 A 0 A_Light0
		stop
   }
}

Actor Railgun_Charge : Inventory {
	inventory.maxamount 2
}

const int railoffset = 12;
Actor RailgunShooter1 : DnD_Activator {
	States {
		Pickup:
			// fire the 4 side rails to "extend" hitbox
			TNT1 A 0 A_SetArg(DND_ARG_DAMAGE,
				DND_WEAPON_RAILGUN |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], -railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], -railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, -railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, -railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], 0, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, "RedRayTrail", 1)
		Stop
	}
}

Actor RailgunShooter2 : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_SetArg(DND_ARG_DAMAGE,
				DND_WEAPON_RAILGUN |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], -railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], -railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, -railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, -railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], 0, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, "YellowRayTrail", 1)
		Stop
	}
}

Actor RailgunShooter3 : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_SetArg(DND_ARG_DAMAGE,
				DND_WEAPON_RAILGUN |
				(DND_DMGID_2 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], -railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], -railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, -railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], railoffset, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, none, -railoffset + 1)
			TNT1 A 0 A_RailAttack(Args[DND_ARG_DAMAGE], 0, 0, none, none, RGF_SILENT, 0, "RailgunPuff", 0, 0, 0xFFF, 0, 5.0, 0, "BlueRayTrail", 1)
		Stop
	}
}

Actor RailgunPuff : DnD_BaseRailPuff {
	+FOILINVUL
	States {
		Spawn:
		Crash:
		HitNoBlood:
		Melee:
			TNT1 AAAA 0
			TNT1 A 1
		Stop
	}
}

ACTOR RedRayTrail
{
    +NOBLOCKMAP
    +NOGRAVITY
    +NOTELEPORT
    +CANNOTPUSH
    +NODAMAGETHRUST
	+DONTBLAST
	+DONTREFLECT
    Height 1
	Radius 1
	Alpha 0.85
	Scale 1.75
	Renderstyle Add
	States
	{
		Spawn:
			TNT1 A 0
			NFX3 ABCD 2 Bright
		Stop
	}
}

ACTOR BlueRayTrail : RedRayTrail
{
	States
	{
		Spawn:
			NFX3 EFGH 2 Bright
		Stop
	}
}

ACTOR BlueRayTrail_Test : RedRayTrail
{
	States
	{
		Spawn:
			NFX3 E 2 Bright
		Stop
	}
}

ACTOR YellowRayTrail : RedRayTrail
{
	States
	{
		Spawn:
			NFX3 IJKL 2 Bright
		Stop
	}
}

Actor "Gauss Rifle" : Weapon {
    Inventory.PickupSound "weapons/pickup"
    Inventory.PickupMessage "You got the gauss rifle!"
    Obituary "%o was shot by the super-charged metal of %k."
    Weapon.AmmoType "GaussRound"
    Weapon.AmmoGive 5
    Weapon.AmmoUse 0
    Weapon.SlotNumber 7
    +INVENTORY.UNDROPPABLE
    +NOAUTOAIM
	+NOALERT
	+NOAUTOFIRE
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 1.8
	Weapon.BobRangeY 0.4
	Weapon.BobRangeX 0.7
	Tag "$WEP_7_6_TAG"
	+WEAPON.NOAUTOAIM
	States {
	   Ready:
	        TNT1 A 0 A_JumpIfInventory("GaussZoom", 3, "Zoom3")
		    TNT1 A 0 A_JumpIfInventory("GaussZoom", 2, "Zoom2")
		    TNT1 A 0 A_JumpIfInventory("GaussZoom", 1, "Zoom1")
		    GAUS A 2 A_WeaponReady
		    Loop
	   Zoom3:
		    GAUS W 2 A_WeaponReady(WRF_NOBOB)
		    Goto Ready
	   Zoom2:
		    GAUS X 2 A_WeaponReady(WRF_NOBOB)
		    Goto Ready
	   Zoom1:
		    GAUS Y 2 A_WeaponReady(WRF_NOBOB)
		    Goto Ready
	   Deselect:
		    TNT1 A 0 A_TakeInventory("P_PlasmaFire", 1)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_TakeInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 A_ZoomFactor(1.0)
			TNT1 A 0 A_TakeInventory("GaussZoom", 3)
			TNT1 A 0 A_SetCrossHair(0)
			GAUS A 1 A_Lower
			TNT1 A 0 A_Lower
			Loop
	   Select:
		    TNT1 A 0 A_GiveInventory("P_PlasmaFire", 1)
			TNT1 A 0 A_GiveInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_GiveInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 200, 0, DND_WEAPON_GAUSSRIFLE)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 96, 0, DND_WEAPON_GAUSSRIFLE)
	    SelectLoop:
			GAUS A 1 A_Raise
			TNT1 A 0 A_Raise
			Loop
		Fire:
			TNT1 A 0 A_JumpIfInventory("GaussZoom", 3, "FireZoom3")
			TNT1 A 0 A_JumpIfInventory("GaussZoom", 2, "FireZoom2")
			TNT1 A 0 A_JumpIfInventory("GaussZoom", 1, "FireZoom1")
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_GAUSSRIFLE, 0), "FireConfirmed")
			GAUS A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
		    TNT1 A 0 A_PlaySound("Weapons/GaussBegin", 6)
			GAUS BCD 1 Bright
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_AlertMonsters
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_GAUSSRIFLE, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16))
			TNT1 A 0 A_PlaySound("Weapons/GaussFire")
			GAUS A 1 offset(1, 32)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS A 1 offset(10, 40)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS A 1 offset(19, 49)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS A 1 offset(22, 52)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS A 1 offset(19, 49)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS A 1 Offset(16, 47)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS A 1 Offset(13, 45)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS A 1 Offset(10, 43)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS A 1 Offset(7, 41)
			GAUS A 1 Offset(4, 37)
			GAUS A 1 Offset(1, 34)
			GAUS A 1 Offset(0, 32)
			GAUS A 5
		  Goto Ready
	   FireZoom1:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_GAUSSRIFLE, 0), "FireConfirmed1")
			GAUS Y 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed1:
			TNT1 A 0 A_PlaySound("Weapons/GaussBegin", 6)
			GAUS Y 3
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_AlertMonsters
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_GAUSSRIFLE, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), DND_ATF_NOAMMOGAINCHECK)
			TNT1 A 0 A_Recoil(2.5)
			TNT1 A 0 A_PlaySound("Weapons/GaussFire")
			GAUS Y 1 offset(1, 32)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS Y 1 offset(10, 40)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS Y 1 offset(19, 49)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS Y 1 offset(22, 52)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS Y 1 offset(19, 49)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS Y 1 Offset(16, 47)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS Y 1 Offset(13, 45)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS Y 1 Offset(10, 43)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS Y 1 Offset(7, 41)
			GAUS Y 1 Offset(4, 37)
			GAUS Y 1 Offset(1, 34)
			GAUS Y 1 Offset(0, 32)
			GAUS Y 5 Offset(0, 32)
		  Goto Ready
	   FireZoom2:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_GAUSSRIFLE, 0), "FireConfirmed2")
			GAUS X 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed2:
			TNT1 A 0 A_PlaySound("Weapons/GaussBegin", 6)
			GAUS X 3
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_AlertMonsters
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_GAUSSRIFLE, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), DND_ATF_NOAMMOGAINCHECK)
			TNT1 A 0 A_PlaySound("Weapons/GaussFire")
			GAUS X 1 offset(1, 32)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS X 1 offset(10, 40)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS X 1 offset(19, 49)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS X 1 offset(22, 52)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS X 1 offset(19, 49)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS X 1 Offset(16, 47)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS X 1 Offset(13, 45)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS X 1 Offset(10, 43)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS X 1 Offset(7, 41)
			GAUS X 1 Offset(4, 37)
			GAUS X 1 Offset(1, 34)
			GAUS X 1 Offset(0, 32)
			GAUS X 5 Offset(0, 32)
		  Goto Ready
	   FireZoom3:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_GAUSSRIFLE, 0), "FireConfirmed3")
			GAUS W 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed3:
			TNT1 A 0 A_PlaySound("Weapons/GaussBegin", 6)
			GAUS W 3
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_AlertMonsters
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_GAUSSRIFLE, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), DND_ATF_NOAMMOGAINCHECK)
			TNT1 A 0 A_PlaySound("Weapons/GaussFire")
			GAUS W 1 offset(1, 32)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS W 1 offset(10, 40)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS W 1 offset(19, 49)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS W 1 offset(22, 52)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS W 1 offset(19, 49)
			TNT1 A 0 A_SetPitch(pitch - 0.5)
			GAUS W 1 Offset(16, 47)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS W 1 Offset(13, 45)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS W 1 Offset(10, 43)
			TNT1 A 0 A_SetPitch(pitch + 0.5)
			GAUS W 1 Offset(7, 41)
			GAUS W 1 Offset(4, 37)
			GAUS W 1 Offset(1, 34)
			GAUS W 1 Offset(0, 32)
			GAUS W 5 Offset(0, 32)
		  Goto Ready
	   AltFire:
		    TNT1 A 0 A_JumpIfInventory("GaussZoom", 3, "EndZoom")
		    TNT1 A 0 A_JumpIfInventory("GaussZoom", 2, "LastZoom")
			TNT1 A 0 A_JumpIfInventory("GaussZoom", 1, "SecondZoom")
			TNT1 A 0 A_PlayWeaponSound("Weapons/GaussZoom")
			TNT1 A 0 A_SetCrossHair(8)
		    TNT1 A 0 A_GiveInventory("GaussZoom", 1)
			TNT1 A 0 A_ZoomFactor(2.0)
		    GAUS Y 1 A_WeaponReady(WRF_NOBOB)
		    Goto Ready
	   SecondZoom:
		    TNT1 A 0 A_PlayWeaponSound("Weapons/GaussZoom")
		    TNT1 A 0 A_GiveInventory("GaussZoom", 1)
			TNT1 A 0 A_ZoomFactor(3.0)
		    GAUS X 1 A_WeaponReady(WRF_NOBOB)
		    Goto Ready
	   LastZoom:
			TNT1 A 0 A_PlayWeaponSound("Weapons/GaussZoom")
		    TNT1 A 0 A_GiveInventory("GaussZoom", 1)
			TNT1 A 0 A_ZoomFactor(4.0)
		    GAUS W 1 A_WeaponReady(WRF_NOBOB)
		    Goto Ready
	   EndZoom:
		    TNT1 A 0 A_PlayWeaponSound("Weapons/GaussZoom")
		    TNT1 A 0 A_TakeInventory("GaussZoom", 3)
			TNT1 A 0 A_ZoomFactor(1.0)
			TNT1 A 0 A_SetCrossHair(0)
		    GAUS A 1
		    Goto Ready
	   Flash:
		    TNT1 A 4 A_Light1
		    TNT1 A 4 A_Light2
		    TNT1 A 1 A_Light1
		    TNT1 A 0 A_Light0
	   stop
	   Spawn:
			GAUS Z -1
	   Stop
	}
}

Actor GaussShooter1 : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_RailAttack(
				DND_WEAPON_GAUSSRIFLE |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT),
				0, 0, "", "", RGF_SILENT | RGF_FULLBRIGHT | RGF_NOPIERCING, 0, "NoPuff", 0, 0, 0, 27, 10.0, 1.0, "GaussFX1", 4
			)
		Stop
	}
}

Actor GaussShooter2 : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_RailAttack(
				DND_WEAPON_GAUSSRIFLE |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
				(200 << DPCT_SHIFT),
				0, 0, "", "", RGF_SILENT | RGF_FULLBRIGHT | RGF_NOPIERCING, 0, "NoPuff", 0, 0, 0, 27, 10.0, 1.0, "GaussFX2", 4
			)
		Stop
	}
}

Actor GaussShooter3 : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_RailAttack(
				DND_WEAPON_GAUSSRIFLE |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
				(300 << DPCT_SHIFT),
				0, 0, "", "", RGF_SILENT | RGF_FULLBRIGHT | RGF_NOPIERCING, 0, "NoPuff", 0, 0, 0, 27, 10.0, 1.0, "GaussFX3", 4
			)
		Stop
	}
}

Actor GaussShooter4 : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_RailAttack(
				DND_WEAPON_GAUSSRIFLE |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
				(400 << DPCT_SHIFT),
				0, 0, "", "", RGF_SILENT | RGF_FULLBRIGHT | RGF_NOPIERCING, 0, "NoPuff", 0, 0, 0, 27, 10.0, 1.0, "GaussFX4", 4
			)
		Stop
	}
}

Actor GaussPuff1 : DnD_BasePuff {
	+NODAMAGETHRUST
	Alpha 0.6
	RenderStyle Add
	Scale 0.1
	States {
		Spawn:
		Crash:
		HitNoBlood:
			TNT1 AAAA 0
			WMI4 A 1 Bright A_SpawnItemEx ("PlasmaFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AAAA 0 A_CustomMissile ("MeleeSmoke", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			TNT1 AAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AA 0 A_CustomMissile ("ExplosionParticleVeryFast", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 A 0 A_CustomMissile("GaussExplosion1", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			WMI4 BCDEFGHIJKLMNOPQ 1 Bright
		Stop
	}
}

Actor GaussPuff2 : DnD_BasePuff {
	Alpha 0.65
	Scale 0.175
	RenderStyle Add
	+NODAMAGETHRUST
	States {
		Spawn:
		Crash:
		HitNoBlood:
			TNT1 AAAA 0
			WMI4 A 1 Bright A_SpawnItemEx ("GaussFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AAAAAAA 0 A_CustomMissile ("MeleeSmoke", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			TNT1 AAAAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AAAA 0 A_CustomMissile ("ExplosionParticleVeryFast", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 A 0 A_CustomMissile("GaussExplosion2", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			WMI4 BCDEFGHIJKLMNOPQ 1 Bright
		Stop
	}
}

Actor GaussPuff3 : DnD_BasePuff {
	Alpha 0.7
	Scale 0.25
	RenderStyle Add
	+NODAMAGETHRUST
	States {
		Spawn:
		Crash:
		HitNoBlood:
			TNT1 AAAA 0
			WMI4 A 1 Bright A_SpawnItemEx ("GaussFlare2", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AAAAAAAAAAA 0 A_CustomMissile ("MeleeSmoke", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			TNT1 AAAAAAAAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AAAAAA 0 A_CustomMissile ("ExplosionParticleVeryFast", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 A 0 A_CustomMissile("GaussExplosion3", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			WMI4 BCDEFGHIJKLMNOPQ 1 Bright
		Stop
	}
}

Actor GaussPuff4 : DnD_BasePuff {
	Alpha 0.75
	Scale 0.325
	RenderStyle Add
	+NODAMAGETHRUST
	States {
		Init:
			TNT1 A 0 A_SetArg(DND_ARG_DAMAGE, 4 * ACS_NamedExecuteWithResult("DND Weapon Damage Retrieve", DND_DMGID_0 | (DND_WEAPON_GAUSSRIFLE << 16), DND_DAMAGECATEGORY_ENERGY, DND_USETARGET | DND_ISSUPER | DND_ISSLOT7))
			TNT1 A 0 A_SetArg(DND_ARG_DAMAGETYPE, DND_DAMAGETYPE_ENERGY)
			TNT1 A 0 A_SetArg(DND_ARG_DAMAGEFLAGS, DND_DAMAGEFLAG_ISHITSCAN)
			TNT1 A 0 A_SetArg(DND_ARG_WEAPONID, DND_WEAPON_GAUSSRIFLE)
		Goto DoDamage
		AfterDamage:
			WMI4 A 1 Bright A_SpawnItemEx ("GaussFlare3", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("MeleeSmoke", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AAAAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			TNT1 AAAAAAAAAAAAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AAAAAAAA 0 A_CustomMissile ("ExplosionParticleVeryFast", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 A 0 A_CustomMissile("GaussExplosion4", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			WMI4 BCDEFGHIJKLMNOPQ 1 Bright
		Stop
		Crash:
		HitNoBlood:
		Goto AfterDamage
	}
}

Actor GaussZoom : Inventory {
	inventory.maxamount 3
}

Actor GaussExplosion1 : DnD_ExplosiveBase {
	Speed 0
	+EXTREMEDEATH
	+FORCERADIUSDMG
	+NODAMAGETHRUST
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_GAUSSRIFLE |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 128)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius / 2)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 1
		Stop
	}
}

Actor GaussExplosion2 : GaussExplosion1 {
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_GAUSSRIFLE |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(200 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 128)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius / 2)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF)
		Goto DoExplosionDamage
	}
}

Actor GaussExplosion3 : GaussExplosion1 {
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_GAUSSRIFLE |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(300 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 128)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius / 2)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF)
		Goto DoExplosionDamage
	}
}

Actor GaussExplosion4 : GaussExplosion1 {
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_GAUSSRIFLE |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(400 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 128)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius / 2)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF)
		Goto DoExplosionDamage
	}
}

Actor GaussFX1 {
    +NOBLOCKMAP
    +NOGRAVITY
    +NOTELEPORT
    +CANNOTPUSH
    +NODAMAGETHRUST
	+NOINTERACTION
    +CLIENTSIDEONLY	
	Renderstyle Add
	Alpha 0.625
	Scale 0.2
	PROJECTILE
	states {
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_Recoil(-12.5)
			TNT1 A 1
			TNT1 A 0 A_Stop
			TNT1 A 0 A_CustomMissile ("GaussParticle", 0, 0, random (0, 360), 2, random (0, 360))
			SP60 ABCDEFGHIJKLMNOP 2 Bright A_FadeOut(0.025)
		stop
	}
}

Actor GaussFX2 : GaussFX1 {
	Alpha 0.75
	Scale 0.25
}

Actor GaussFX3 : GaussFX1 {
	Alpha 0.875
	Scale 0.3
}

Actor GaussFX4 : GaussFX1 {
	Alpha 1.0
	Scale 0.35
}

// sprites by s3ntey
ACTOR "Death Ray" : Weapon
{	
	Inventory.PickupSound "weapons/pickup"
	Inventory.PickupMessage "You got the death ray!"
	Obituary "%o met death at the hands of %k."
	Weapon.AmmoType1 "IonAmmo"
	Weapon.AmmoType2 "DeathRayOverheat"
	Weapon.AmmoGive 36
	Weapon.AmmoUse 0
	Weapon.SlotNumber 7
	+INVENTORY.UNDROPPABLE
	+NOAUTOAIM
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 1.8
	Weapon.BobRangeY 0.35
	Weapon.BobRangeX 0.6
	Tag "$WEP_7_8_TAG"
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			ERWE X -1
		Loop
		Ready: 
			TNT1 A 0 A_GiveInventory("P_RedFire", 1)
			TNT1 A 0 A_PlaySound("Deathray/Loop", CHAN_WEAPON, 1.0, 1)
			TNT1 A 0 A_GiveInventory("DnD_OverheatCanReduce", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Overheat Reduction", 0, DND_OVERHEAT_DEATHRAY, 10 | (17 << 16))
		ReadyLoop:
			ERWE AABBCCDDAABBCCDDAABBCCDD 1 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("P_RedFire", 1)
			TNT1 A 0 A_TakeInventory("P_PlasmaFire", 1)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_GiveInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 A_StopSound(CHAN_WEAPON)
		DeselectLoop:
			ERWE E 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("P_RedFire", 1)
			TNT1 A 0 A_GiveInventory("H_WeaponSlot7", 1)
			TNT1 A 0 A_GiveInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 450, 0, DND_WEAPON_DEATHRAY)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 150, 0, DND_WEAPON_DEATHRAY)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 550, 0, DND_WEAPON_DEATHRAY)
		SelectLoop:
			ERWE E 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_DEATHRAY, 0), "FireConfirmed")
			ERWE ABCD 2 A_WeaponReady(WRF_NOFIRE)
			ERWE ABCDABCD 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			ERWE E 1 Offset(0, 34)
			TNT1 A 0 A_TakeInventory("DnD_OverheatCanReduce", 1)
			ERWE E 1 Offset(0, 38)
			TNT1 A 0 A_GunFlash
			ERWE F 1 Bright Offset(0, 42)
			ERWE F 1 Bright Offset(0, 45)
			ERWE F 1 Bright Offset(1, 47)
			TNT1 A 0 A_PlaySound("DeathRay/Fire", 5)
			TNT1 A 0 A_SpawnItemEx("GunSmokeSmaller", 18 * cos(-pitch), 0, 36 * (1 + sin(-pitch)), 0, 0, 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DEATHRAY, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_ION << 16), DND_ATF_NOAMMOGAINCHECK)
			ERWE G 1 Bright Offset(1, 52)
			ERWE G 1 Bright Offset(1, 55)
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Check Unique Player Property", PUP_KNOCKBACKIMMUNE), "NoRecoil")
			TNT1 A 0 A_Recoil(2.8)
		NoRecoil:
			ERWE G 1 Bright Offset(2, 60)
			ERWE H 1 Bright Offset(3, 66)
			ERWE H 1 Bright Offset(3, 68)
			ERWE H 1 Bright Offset(3, 70)
			ERWE I 1 Bright Offset(3, 71)
			ERWE I 1 Bright Offset(3, 71)
			ERWE I 1 Bright Offset(3, 70)
			ERWE F 1 Bright Offset(3, 69)
			ERWE F 1 Bright Offset(3, 67)
			ERWE E 1 Offset(2, 65)
			ERWE E 1 Offset(2, 63)
			ERWE E 1 Offset(2, 60)
			ERWE E 1 Offset(2, 58)
			ERWE E 1 Offset(1, 54)
			ERWE E 1 Offset(0, 49)
			ERWE E 1 Offset(0, 45)
			ERWE E 1 Offset(0, 40)
			ERWE E 1 Offset(0, 37)
			ERWE E 1 Offset(0, 34)
			TNT1 A 0 A_JumpIfInventory("DeathRayOverheat", 0, "Overheat")
			ERWE E 1 Offset(0, 33)
		Goto Ready
		Overheat:
			TNT1 A 0 A_GiveInventory("DeathRayCooldown", 1)
		NoAction:
			ERWE E 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		AltFire:
			TNT1 A 0 A_TakeInventory("DnD_OverheatCanReduce", 1)
			ERWE E 2 A_PlayWeaponSound("PlasmaCannon/Charge")
			ERWE E 2 A_FireBullets(0, 0, 1, 0, "DeathrayPuff", 0, 4096)
			TNT1 A 0 A_GiveInventory("DeathRayTrigger", 1)
			ERWE E 10
		Goto Ready
		Flash:
			TNT1 A 4 A_Light1
			TNT1 A 4 A_Light2
			TNT1 A 1 A_Light1
			TNT1 A 0 A_Light0
		stop
	}
}

Actor DeathRayTrigger : PowerProtection {
	damagefactor "normal", 1.0
	powerup.duration 3
}

Actor DeathrayCooldown : PowerDamage {
	powerup.duration 87
	damagefactor "normal", 1.0
}

Actor DeathrayPuff {
	Height 4
	Radius 2
	+ALWAYSPUFF
	+PUFFONACTORS
	+BLOODLESSIMPACT
	+PUFFGETSOWNER
	+SKYEXPLODE
	-NONETID
	States {
		Spawn:
			TNT1 AAAAAA 0
			TNT1 A 5 ACS_NamedExecuteAlways("DnD DeathRay Marker TID")
		Stop
	}
}

Actor DeathRayProjectile : DnD_ExplosiveBase {
	Height 20
	Radius 10
	Speed 8
	Renderstyle None
	Deathsound "Deathray/Hit"
	var int user_count;
	const int r = 18;
	const float f = 7.5;
	
	Damage(
		DND_WEAPON_DEATHRAY |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+FORCERADIUSDMG
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_count", 0)
			
		SpawnLoop:
			TNT1 A 0 A_JumpIfInTargetInventory("DeathRayTrigger", 1, "LaserFire")
			TNT1 A 0 A_SpawnItemEx("DeathRayTrail", 0, r * sin(f * user_count), r * cos(f * user_count))
			TNT1 A 1 Light("DRayLight") A_SpawnItemEx("DeathRayTrail", 0, r * sin(f * user_count + 180), r * cos(f * user_count + 180))
			TNT1 A 0 A_SetUserVar("user_count", (user_count + 1) % 24) // 180 / 7.5
		Loop
		LaserFire:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_SetAngle(0) // this is necessary!
			TNT1 A 1 Light("DRayLight2") ACS_NamedExecuteAlways("DnD DeathRay Laser Aim", 0, 24)
			TNT1 A 0 A_PlaySound("DeathRay/LaserFire")
			TNT1 AAAAA 0 A_SpawnItemEx("ExplosionFX8", 0, 0, 0, frandom(-1, 1), frandom(-1, 1), frandom(-1, 1))
			TNT1 AAAAAAAAAA 0 A_SpawnItemEx("DeathRayTrailSpark", frandom(19.0, -19.0), frandom(19.0, -19.0), frandom(19.0, -19.0))
			TNT1 A 15 Light("DRayLight2")
		Stop
		
		Death:
			TNT1 AAAAA 0 A_SpawnItemEx("ExplosionFX8", 0, 0, 0, frandom(-1, 1), frandom(-1, 1), frandom(-1, 1))
			
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_DEATHRAY |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 96)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 1
		Stop
	}
}

Actor DeathRayTrail {
	Renderstyle Add
	Alpha 0.85
	+CLIENTSIDEONLY
	+NOINTERACTION
	Scale 0.85
	States {
		Spawn:
			ERWE J 1 Bright A_FadeOut(0.085)
		Loop
	}
}

Actor DeathRayLaserTrail {
	RenderStyle Add
	Scale 0.1875
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
			ERWE K 2 Bright A_SpawnItemEx("DeathRayTrailSpark", frandom(4.0, -4.0), frandom(4.0, -4.0), frandom(4.0, -4.0))
			ERWE K 2 bright A_SetScale(ScaleX, ScaleY - 0.0875)
		SpawnLoop:
			ERWE K 1 bright A_FadeOut(0.095)
			TNT1 A 0 A_SetScale(ScaleX - 0.01, ScaleY - 0.01)
		Loop
	}
}

Actor DeathRayTrailSpark : DeathRayLaserTrail { 
    Scale 0.0125
    Alpha 0.95
    States {
		Spawn:
			ERWE K 3 NoDelay Bright A_ChangeVelocity (frandom(-0.8, 0.8), frandom(-0.8, 0.8), frandom(-0.8, 0.8), CVF_RELATIVE)
			TNT1 A 0 A_SetScale(ScaleX - 0.00075)
			ERWE K 1 bright A_FadeOut(0.05)
		Loop
    }
}

ACTOR DeathRayLaserExplode {
	Renderstyle Add
	Scale 0.5
	+NOINTERACTION
	+CLIENTSIDEONLY
	states {
		Spawn:
			ERWL ABCDEFGHIJKLMNOPQRS 1 bright A_FadeOut(0.05)
		stop
	}
}

Actor DeathRayExp : DnD_ExplosiveBase {
	Speed 0
	+THRUACTORS
	+FORCERADIUSDMG
	+FOILINVUL
	+NODAMAGETHRUST
	+EXTREMEDEATH
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_DEATHRAY |
				(DND_DMGID_2 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 160)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 1
		Stop
	}
}

ACTOR DeathRayLaser : DnD_BaseFastProjectile {
	Speed 512
	Radius 2
	Height 4
	Renderstyle Add
	+FOILINVUL
	+SKYEXPLODE
	+NODAMAGETHRUST
	+EXTREMEDEATH
	+FORCERADIUSDMG
	DeathSound "Deathray/LaserHit"
	
	Damage(
		DND_WEAPON_DEATHRAY |
		(DND_DMGID_2 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	var int user_x;
	var int user_y;
	var int user_z;
	
	States {
		SpawnState:
			TNT1 A 1 A_PlaySound("DeathRay/Fly", 5, 1.0, 1)
			TNT1 A -1
		Stop
		Death:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Deathray Laser Trail", 20, user_x, user_y, user_z)
			TNT1 A 0 A_PlaySound("Deathray/LaserExplode", 5)
			TNT1 AAAAAAAAAA 0 A_SpawnItemEx("DeathRayTrailSpark",frandom(19.0, -19.0), frandom(19.0, -19.0), frandom(19.0, -19.0))
			TNT1 A 0 A_SpawnItemEx("DeathRayLaserExplode", 0, 0, 16)
			TNT1 A 0 A_CustomMissile("DeathRayExp", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 BCD 4
		stop
	}
}