// Sprites by Eriance
Actor "Upgraded Rocket Launcher2" : RocketLauncher {	
	Weapon.Slotnumber 5
	Inventory.PickupSound "weapons/pickup"
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_5_10_TAG"
    Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 1.6
    Weapon.BobRangeY 0.5
    Weapon.BobRangeX 0.8
	Weapon.AmmoUse 0
	+WEAPON.NOAUTOAIM
	-NOAUTOFIRE
	States {
		Spawn:
			MERC X -1
		Stop
		Ready:
			MERC A 1 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_StopSound(CHAN_WEAPON)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
			TNT1 A 0 A_GiveInventory("DnD_RemoveLockOn", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Clear Homing Lock-on", 0)
		DeselectLoop:
			MERC A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot5", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 16, 16 | (20 << 16), DND_WEAPON_MERCURYLAUNCHER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 24, 0, DND_WEAPON_MERCURYLAUNCHER)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Homing Lock-on Draw", 0, 192, 192, 1536)
	    SelectLoop:
			MERC A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_MERCURYLAUNCHER, 0), "FireConfirmed")
			MERC A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			MERC A 1 A_CheckReload
			MERC B 1 Bright A_Gunflash
			MERC BC 1 Bright
			TNT1 A 0 A_PlayWeaponSound("weapons/mercuryfire")
			TNT1 A 0 Radius_Quake(4,3,0,1,0)
			MERC C 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_MERCURYLAUNCHER, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_ROCKET << 16), 0)
			MERC DEFGHI 1 Bright
			MERC JKLMN 3
			MERC A 15
			MERC A 6 A_Refire
		Goto Ready
		Flash:
			TNT1 A 3 A_Light1
			TNT1 A 4 A_Light2
			TNT1 A 3 A_Light1
			TNT1 A 2 A_Light0
		stop
	}
}

Actor MercurySmoke : RocketSmoke {
	Renderstyle Add
	Alpha 0.85
	
	States {
		Spawn:
			OBSK ABCDEFGHIJKLMNOPQRSTUVWXYZ 1 Bright A_FadeOut(0.03)
		Stop
	}
}

Actor MercuryExplosion : DnD_ExplosiveBase {
	Speed 0
	+THRUACTORS
	const int max_exp = 8;
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 0 A_SetUserVar("user_count", 0)
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_MERCURYLAUNCHER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 160 * (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)
		Again:
			TNT1 A 1 
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 7 A_SetUserVar("user_count", user_count + 1)
			TNT1 AAAAAAAAAAAA 0 A_SpawnItemEx("MercurySmoke", 0, 0, 0, frandom(-4, 4), frandom(-4, 4), frandom(-4, 4))
			TNT1 A 1 A_JumpIf(user_count < max_exp, "Again")
			TNT1 A 10
		Goto FinishExplosion
	}
}

Actor MercuryExplosion_Crit : MercuryExplosion {
	Accuracy 69
}

Actor MercuryRocket : RocketX {
	Speed 16
	SeeSound ""
	Decal "Scorch"
	Scale 1.1
	
	Damage(
		DND_WEAPON_MERCURYLAUNCHER |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+LOOKALLAROUND
	+SCREENSEEKER
	+THRUGHOST
	+SEEKERMISSILE
	States {
		SpawnState:
			HMMS C 12
			TNT1 A 0 A_ChangeVelocity(velx * 2.75, vely * 2.75, velz * 2.75, CVF_REPLACE)
		SpawnLoop:
			HMMS A 2 Bright A_SeekerMissile(45, 15, SMF_PRECISE | SMF_CURSPEED)
			TNT1 A 0 A_CustomMissile("MercurySmoke", 0, 0, random(225, 315), 2, random(0, 360))
			HMMS B 2 Bright A_SeekerMissile(45, 15, SMF_PRECISE | SMF_CURSPEED)
			TNT1 A 0 A_CustomMissile("MercurySmoke", 0, 0, random(225, 315), 2, random(0, 360))
		Loop
		Death:
			TNT1 A 0 A_SpawnItemEx ("ExplosionFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AAAAAAA 0 A_CustomMissile("MercurySmoke", 0, 0, random(0, 360), 2, random(0, 180))
			TNT1 AAAAAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			TNT1 AAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AAAAAAAAA 0 A_CustomMissile ("ExplosionParticleVeryFast", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 A 0 A_CustomMissile("MercuryExplosion", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		FinishAnim:
			MISL B 8 Bright
			MISL C 7 Bright
			MISL D 6 Bright
		Stop
		Crit:
			TNT1 A 0 A_CustomMissile("MercuryExplosion_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Goto FinishAnim
	}
}

Actor MercuryRocket_GhostHitter : MercuryRocket {
	-THRUGHOST
}

Actor ResRL1 : Weapon {
	Weapon.SelectionOrder 2400
	Weapon.SlotNumber 5
    Inventory.PickupSound "weapons/pickup"
    Inventory.PickupMessage "You got the meteor launcher!"	
    Obituary "%o was blown up by %k's meteor."
	Weapon.AmmoType "MeteorAmmo"
	Weapon.AmmoUse 0
	Weapon.AmmoGive 5
	Decal "BulletChip"
	AttackSound ""
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_5_5_TAG"
	Weapon.BobSpeed 1.6
	Weapon.BobRangeY 0.25
	Weapon.BobRangeX 0.45
	Weapon.BobStyle InverseSmooth
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			RW06 X -1
		Stop
		Ready:
			RW06 AAABBBCCCDDD 1 A_WeaponReady
			RW06 EEEEE 5 A_WeaponReady
			RW06 DDDCCCBBB 1 A_WeaponReady
			RW06 AAAA 5 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
			RW06 A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot5", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 200, 0, DND_WEAPON_METEORLAUNCHER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 192, 0, DND_WEAPON_METEORLAUNCHER)
	    SelectLoop:
			RW06 A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_METEORLAUNCHER, 0), "FireConfirmed")
			RW06 AAABBBCCCDDD 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			RW06 EEEEE 5 A_WeaponReady(WRF_NOFIRE)
			RW06 DDDCCCBBB 1 A_WeaponReady(WRF_NOFIRE)
			RW06 AAAA 5 A_WeaponReady(WRF_NOFIRE)
		Goto Ready
		FireConfirmed:
			RW06 F 2 A_PlayWeaponSound("MeteorLauncher/Charge")
			RW06 G 1
			RW06 H 2
			RW06 I 1
			RW06 J 2
			RW06 K 1
			RW06 L 2
			RW06 M 1
			RW06 Q 1 Bright
			TNT1 A 0 A_PlayWeaponSound("MeteorLauncher/fire")
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_METEORLAUNCHER, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_METEOR << 16), 0)
			TNT1 A 0 Radius_Quake(5,3,0,4,0)
			RW06 Q 1 Bright
			RW06 RSTU 2 Bright
			RW06 M 1
			RW06 L 2
			RW06 K 1
			RW06 J 2
			RW06 I 1
			RW06 H 2
			RW06 G 1
			RW06 F 2
		Goto Ready
	}
}

Actor MeteorMissileTrail {
	+NOINTERACTION
	+CLIENTSIDEONLY
	Renderstyle Add
	Alpha 0.8
	Scale 1.15
	States {
		Spawn:
			RW6F CDEFGH 2 Bright A_FadeOut(0.075)
		Stop
	}
}

Actor MeteorMissileSplit_1 : DnD_ExplosiveBase {
	Height 14
	Radius 7
	Speed 25
	BounceSound "MeteorLauncher/Bounce"
	DeathSound "MeteorLauncher/HitSmall"
	BounceType Doom
	BounceCount 4
	const float projvel = 13.5;
	Gravity 0.66
	
	Damage(
		DND_WEAPON_METEORLAUNCHER |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_OCCULT << DTYPE_SHIFT) |
		(50 << DPCT_SHIFT)
	)
	
	-NOGRAVITY
	States {
		SpawnState:
			TNT1 A 0 A_Jump(256, "1", "2", "3")
		1:
			RW6G E 1
		Loop
		2:
			RW6G F 1
		Loop
		3:
			RW6G G 1
		Loop
		Death:
			TNT1 A 0 A_ChangeVelocity(0, 0, 0)
			TNT1 A 0 A_ChangeFlag("NOGRAVITY", 1)
			TNT1 AAAAA 0 A_CustomMissile("RocketSmokeSmall", 0, 0, random(0, 360), 2, random(0, 180))
			TNT1 AAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_METEORLAUNCHER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_OCCULTEXPLOSION << DTYPE_SHIFT) |
				(50 << 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 AAAAAAAAAAA 0 A_SpawnItemEx("MeteorMissileSplit_2", 0, 0, 0, frandom(-projvel, projvel), frandom(-projvel, projvel), frandom(0, projvel), 0, SXF_TRANSFERPOINTERS)
			RW6F IJKL 3 Bright
		Stop
	}
}

Actor MeteorMissileSplit_1_Crit : MeteorMissileSplit_1 {
	Accuracy 69
	States {
		ContinueFromExplosion:
			TNT1 AAAAAAAAAAA 0 A_SpawnItemEx("MeteorMissileSplit_2_Crit", 0, 0, 0, frandom(-projvel, projvel), frandom(-projvel, projvel), frandom(0, projvel), 0, SXF_TRANSFERPOINTERS)
			RW6F IJKL 3 Bright
		Stop
	}
}

Actor MeteorMissileSplit_2 : MeteorMissileSplit_1 {
	Height 8
	Radius 4
	Speed 18
	
	Damage(
		DND_WEAPON_METEORLAUNCHER |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_OCCULT << DTYPE_SHIFT) |
		(25 << DPCT_SHIFT)
	)
	
	const float projvel = 13.5;
	States {
		SpawnState:
			TNT1 A 0 A_Jump(256, "1", "2")
		1:
			RW6G H 1
		Loop
		2:
			RW6G I 1
		Loop
		XDeath:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Do Impact Damage", ACS_NamedExecuteWithResult("DND Weapon Damage Retrieve", DND_DMGID_1 | (DND_WEAPON_METEORLAUNCHER << 16), DND_DAMAGECATEGORY_OCCULT, DND_USETARGET | DND_ISSLOT5) / 4, DND_DAMAGETYPE_OCCULT, 0, DND_WEAPON_METEORLAUNCHER)
		Death:
			TNT1 A 0 A_ChangeVelocity(0, 0, 0)
			TNT1 A 0 A_ChangeFlag("NOGRAVITY", 1)
			TNT1 AA 0 A_CustomMissile("RocketSmokeSmall", 0, 0, random(0, 360), 2, random(0, 180))
			TNT1 AAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			
			TNT1 A 0 A_SetUserVar("user_expdmg",
				DND_WEAPON_METEORLAUNCHER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_OCCULTEXPLOSION << DTYPE_SHIFT) |
				(25 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 48 * (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 0 A_SetScale(0.75, 0.75)
			RW6F IJKL 3 Bright
		Stop
	}
}

Actor MeteorMissileSplit_2_Crit : MeteorMissileSplit_2 {
	Accuracy 69
}

Actor MeteorMissile : DnD_ExplosiveBase {
	Height 20
	Radius 10
	Speed 30
	Deathsound "MeteorLauncher/Hit"
	const float projvel = 13.5;
	Scale 0.9
	
	Damage(
		DND_WEAPON_METEORLAUNCHER |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_OCCULT << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+FOILINVUL
	States {
		SpawnState:
			RW6G AABBCCDD 2 A_SpawnItem("MeteorMissileTrail")
		Loop
		Death:
			TNT1 A 0 A_SpawnItemEx ("ExplosionFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AAAAA 0 A_CustomMissile("RocketSmoke", 0, 0, random(0, 360), 2, random(0, 180))
			TNT1 AAAAAAAA 0 A_CustomMissile("RocketSmoke", 0, 0, random(0, 360), 2, random(0, 360))
			TNT1 AAAAAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			TNT1 AAAAAAAAAAAAAAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 AAAAAAAAA 0 A_CustomMissile ("ExplosionParticleVeryFast", 0, 0, random (0, 360), 2, random (0, 360))
		
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_METEORLAUNCHER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_OCCULTEXPLOSION << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 192 * (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 0 A_SpawnItemEx("MeteorMissile_HitFX")
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 AAAAA 0 A_SpawnItemEx("MeteorMissileSplit_1", 0, 0, 0, frandom(-projvel, projvel), frandom(-projvel, projvel), frandom(0, projvel), 0, SXF_TRANSFERPOINTERS)
		FinishAnim:
			TNT1 A 39
		Goto FinishExplosion
		Crit:
			TNT1 AAAAA 0 A_SpawnItemEx("MeteorMissileSplit_1_Crit", 0, 0, 0, frandom(-projvel, projvel), frandom(-projvel, projvel), frandom(0, projvel), 0, SXF_TRANSFERPOINTERS)
		Goto FinishAnim
	}
}

Actor MeteorMissile_HitFX {
	Scale 1.25
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			RW6A EF 3 Bright
			TNT1 A 0 A_ChangeVelocity(0, 0, 1)
			RW6A GHI 4 Bright
			RW6A JJJJJJJJJJJ 2 Bright A_FadeOut(0.075)
		Stop
	}
}

ACTOR ResRL2 : Weapon {
	//$Category Weapons
	Weapon.SelectionOrder 2400
	Weapon.AmmoUse1 0
	Weapon.AmmoUse2 0
	Weapon.AmmoGive 0
	Weapon.SlotNumber 5
	Weapon.AmmoType1 "HeavyGrenades"
	Weapon.AmmoType2 "HeavyGLCounter"
	Scale 0.75
	Tag "$WEP_5_6_TAG"
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 1.6
	Weapon.BobRangeY 0.5
	Weapon.BobRangeX 0.75
	+WEAPON.NOAUTOAIM
	States {
		Ready:
			GLAU A 1 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
		DeselectLoop:
			GLAU A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot5", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 128, 0, DND_WEAPON_HEAVYGL)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 6, 1 | (3 << 16), DND_WEAPON_HEAVYGL)
		SelectLoop:
			GLAU A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_HEAVYGL, 0), "FireConfirmed")
			GLAU A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			GLAU B 3
			GLAU B 3 Offset(1, 34)
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_PlayWeaponSound("HeavyGL/Fire")
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_HEAVYGL, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_HEAVYGRENADE << 16), 0)
			TNT1 A 0 A_PlaySound("HeavyGL/Cock", 7)
			GLAU C 1 Offset(1, 35)
			GLAU C 1 Offset(3, 40)
			GLAU C 1 Offset(6, 47)
			GLAU C 2 Offset(6, 47)
			GLAU D 1 Offset(5, 44)
			GLAU D 1 Offset(4, 41)
			GLAU D 1 Offset(3, 37)
			GLAU D 1 Offset(2, 36)
			GLAU E 1 Offset(1, 35)
			GLAU E 1 Offset(1, 34)
			GLAU E 2 Offset(1, 33)
			GLAU F 11 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		DoNothing:
			GLAU A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		AltFire:
			TNT1 A 0 A_JumpIfInventory("HeavyGLCounter", 3, "DoNothing")
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_HEAVYGL, 0, 2), "AltFireConfirmed") // this has a 2 mult because we will use 1... need to have at least one more!
			GLAU A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		AltFireConfirmed:
			GLAU B 6
			TNT1 A 0
			GLAU G 4 A_PlaySound("HeavyGL/Cock", 7)
			TNT1 A 0 A_GiveInventory("HeavyGrenadeShooter2", 1)
			GLAU H 4
			GLAU I 4
			GLAU F 4 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		
		Flash:
			TNT1 A 3 Bright A_Light1
			TNT1 A 4 Bright
			TNT1 AA 4 Bright A_Light2
		Goto LightDone
		Spawn:
			GLAU G -1
		Stop
	}
}

Actor HeavyGrenadeShooter2 : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Ammo Gain Chance", 0, DND_AMMOSLOT_ROCKET, AMMO_HEAVYGRENADE, 1)
			TNT1 A 0 A_JumpIfInventory("ArtemisCheck", 1, "NoTake")
			TNT1 A 0 A_TakeInventory("HeavyGrenades", 1)
		NoTake:
			TNT1 A 0 A_GiveInventory("HeavyGLCounter", 1)
		Stop
	}
}

// dec by xaser
Actor HeavyGrenade : DnD_ExplosiveBase {
	Radius 6
	Height 12
	Speed 24
	Gravity 0.6
	BounceFactor 0.3
	
	Damage(
		DND_WEAPON_HEAVYGL |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+BOUNCEONWALLS
	+BOUNCEONFLOORS
	+BOUNCEONCEILINGS
	+CANBOUNCEWATER
	+RANDOMIZE
	+MOVEWITHSECTOR
	-NOGRAVITY
	+THRUGHOST
	ReactionTime 30
	BounceSound "HeavyGL/Bounce"
	DeathSound "HeavyGL/explode"
	States {
		SpawnState:
			TNT1 A 0 A_Recoil(-1) // to stop the "freeze in midair" bug from happening
			TNT1 A 0 ThrustThingZ(0, 4, 0, 1)
		SpawnLoop:
			HGRN A 3 A_JumpIf(ACS_NamedExecuteWithResult("DND HeavyGL Check", momx, momy, momz) < 1, "StopSpawnStart") TNT1 A 0 A_Countdown
			HGRN B 3 A_JumpIf(ACS_NamedExecuteWithResult("DND HeavyGL Check", momx, momy, momz) < 1, "StopSpawnStart") TNT1 A 0 A_Countdown
			HGRN C 3 A_JumpIf(ACS_NamedExecuteWithResult("DND HeavyGL Check", momx, momy, momz) < 1, "StopSpawnStart") TNT1 A 0 A_Countdown
			HGRN D 3 A_JumpIf(ACS_NamedExecuteWithResult("DND HeavyGL Check", momx, momy, momz) < 1, "StopSpawnStart") TNT1 A 0 A_Countdown
			HGRN E 3 A_JumpIf(ACS_NamedExecuteWithResult("DND HeavyGL Check", momx, momy, momz) < 1, "StopSpawnStart") TNT1 A 0 A_Countdown
			HGRN F 3 A_JumpIf(ACS_NamedExecuteWithResult("DND HeavyGL Check", momx, momy, momz) < 1, "StopSpawnStart") TNT1 A 0 A_Countdown
			HGRN G 3 A_JumpIf(ACS_NamedExecuteWithResult("DND HeavyGL Check", momx, momy, momz) < 1, "StopSpawnStart") TNT1 A 0 A_Countdown
			HGRN H 3 A_JumpIf(ACS_NamedExecuteWithResult("DND HeavyGL Check", momx, momy, momz) < 1, "StopSpawnStart") TNT1 A 0 A_Countdown
		Loop
		StopSpawnStart:
			HGRN A 0 A_Jump(128, 1)
		Goto StopSpawn
			HGRN E 0
		StopSpawn:
			TNT1 A 0 A_ScaleVelocity(0)
		StopSpawnLoop:
			HGRN "###" 1 A_Stop
			TNT1 A 0 A_Countdown
		Loop
		Death:
			TNT1 A 0 A_SetTranslucent(1.0, 1)
			HGRN I 2 Bright A_NoGravity
			
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_HEAVYGL |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
				(50 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 128 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius / 4)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF | DND_DAMAGEFLAG_HALFDMGSELF)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
		PelletLoop:
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 24, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 48, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 72, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 96, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 120, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			HGRN J 1 Bright A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 144, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 168, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 192, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 216, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 240, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 264, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 288, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 312, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel", 0, 0, 336, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
		Goto Finish
		Crit:
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 24, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 48, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 72, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 96, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 120, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			HGRN J 1 Bright A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 144, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 168, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 192, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 216, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 240, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 264, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 288, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 312, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_Crit", 0, 0, 336, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
		Goto Finish
		Finish:
			HGRN JKLMNOPQRST 2 Bright
		Goto FinishExplosion
	}
}

Actor HeavyGrenadeShrapnel : DnD_BaseProjectile {
	Height 4
	Radius 2
	Speed 20
	Damage (
		DND_WEAPON_HEAVYGL |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_PHYSICAL << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	Decal "BulletChip"
	Gravity 1.33
	BounceType "Doom"
	BounceFactor 0.66
	BounceSound "HeavyGL/ShrapnelBounce"
	DeathSound "HeavyGL/ShrapnelHit"
	ReactionTime 16
	+THRUGHOST
	+RIPPER
	+BLOODSPLATTER
	+BLOODLESSIMPACT
	-NOGRAVITY
	+MOVEWITHSECTOR
	States {
		SpawnState:
			SFRG ABCDABCDEFGHEFGH 1 Bright
		SpawnLoop:
			SFRG IJKL 1 Bright
			TNT1 A 0 A_Countdown
		Loop
		Death:
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 1)
			SFRG GKO 2 Bright
			SFRG S 100 Bright
			SFRG S 1 Bright A_FadeOut(0.02)
		Wait
		XDeath:
			TNT1 A 0 A_PlaySound("HeavyGL/ShrapnelFlesh")
			TNT1 A 3
		Stop
	}
}

Actor HeavyGrenadeShrapnel_Crit : HeavyGrenadeShrapnel {
	Accuracy 69
	States {
		SpawnState:
			SFRG ABCDABCDEFGHEFGH 1 Bright
		SpawnLoop:
			SFRG IJKL 1 Bright
			TNT1 A 0 A_Countdown
		Loop
	}
}

Actor HeavyGrenade_GhostHitter : HeavyGrenade {
	-THRUGHOST
	States {
		ContinueFromExplosion:
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
		PelletLoop:
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 24, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 48, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 72, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 96, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 120, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			HGRN J 1 Bright A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 144, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 168, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 192, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 216, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 240, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 264, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 288, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 312, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter", 0, 0, 336, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
		Loop
		Crit:
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 24, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 48, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 72, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 96, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 120, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			HGRN J 1 Bright A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 144, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 168, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 192, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 216, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 240, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 264, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 288, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 312, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
			TNT1 A 0 A_CustomMissile("HeavyGrenadeShrapnel_GhostHitter_Crit", 0, 0, 336, CMF_TRACKOWNER | CMF_AIMDIRECTION, 135)
		Loop
		Finish:
			HGRN JKLMNOPQRST 2 Bright
		Goto FinishExplosion
	}
}

Actor HeavyGrenadeShrapnel_GhostHitter : HeavyGrenadeShrapnel {
	-THRUGHOST
}

Actor HeavyGrenadeShrapnel_GhostHitter_Crit : HeavyGrenadeShrapnel_GhostHitter {
	Accuracy 69
}

Actor ResRL3 : Weapon {
	Weapon.AmmoUse 0
	Weapon.AmmoGive 0
	Weapon.AmmoType1 "EverIce"
	Weapon.AmmoType2 "FreezerOverheat"
	Weapon.SlotNumber 5
	Inventory.PickupMessage "You got the Freezer Cannon!"
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_5_7_TAG"
	Weapon.BobSpeed 1.5
	Weapon.BobRangeY 0.25
	Weapon.BobRangeX 0.35
	Weapon.BobStyle InverseSmooth
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			FRZC Z -1
		Stop
		Ready:
			FRZC A 1 A_WeaponReady(WRF_NOSWITCH)
		ReadyLoop:
			TNT1 A 0 A_GiveInventory("DnD_OverheatCanReduce", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Overheat Reduction", 0, DND_OVERHEAT_FREEZER, 5 | (7 << 16))
			FRZC AAAAAAAAA 1 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
			TNT1 A 0 A_TakeInventory("P_PlasmaFire", 1)
		DeselectLoop:
			FRZC 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_WeaponSlot5", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 150, 0, DND_WEAPON_FREEZER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 3, 1 | (3 << 16), DND_WEAPON_FREEZER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 150, 0, DND_WEAPON_FREEZER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_3, 36, 0, DND_WEAPON_FREEZER)
		SelectLoop:
			FRZC A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Nothing:
			FRZC A 1 A_WeaponReady(WRF_NOFIRE)
		Goto Ready
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_FREEZER, 0), "FireConfirmed")
			FRZC A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			FRZC A 1
			TNT1 A 0 A_TakeInventory("DnD_OverheatCanReduce", 1)
			FRZC A 3
			TNT1 A 0 A_PlaySound("Weapons/FreezerFire", CHAN_AUTO)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FREEZER, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_EVERICE << 16), 0)
			TNT1 A 0 A_GunFlash
			FRZC ABCD 2 A_SetPitch (pitch - 0.5)
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Check Unique Player Property", PUP_KNOCKBACKIMMUNE), "NoRecoil")
			TNT1 A 0 A_Recoil(3)
		NoRecoil:
			TNT1 A 0 A_GiveInventory("FreezerCooldownGiver", 1)
			FRZC DCBA 2 A_SetPitch (pitch + 0.5)
			FRZC A 5 A_ReFire
			FRZC A 16 A_WeaponReady(WRF_NOFIRE)
		Goto Ready
		Hold:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_FREEZER, 1), "HoldConfirmed")
			FRZC A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		HoldConfirmed:
			FRZC A 1
			TNT1 A 0 A_TakeInventory("DnD_OverheatCanReduce", 1)
			TNT1 A 0 A_PlaySound("Weapons/FreezerFire", CHAN_AUTO)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FREEZER, DND_ATK_PRIMARY | DND_ATK_OTHER_DIR, DND_AMMOSLOT_CELL | (AMMO_EVERICE << 16), 0)
			TNT1 A 0 A_GunFlash
			FRZC ABCD 2 A_SetPitch (pitch-0.50)
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Check Unique Player Property", PUP_KNOCKBACKIMMUNE), "NoRecoil")
			FRZC D 0 A_Recoil(3)
		NoRecoilHold:
			TNT1 A 0 A_GiveInventory("FreezerCooldownGiver", 1)
			FRZC DCBA 2 A_SetPitch (pitch+0.50)
			FRZC A 3 A_ReFire
			FRZC A 16 A_WeaponReady(WRF_NOFIRE)
		Goto Ready
			
		Flash:
			FRZC E 2 Bright A_Light1
			FRZC F 2 Bright A_Light1
			FRZC G 2 Bright A_Light1
		goto lightdone	
	}
}

Actor FreezerCooldown : PowerDamage {
	powerup.duration 88
	damagefactor "normal", 1.0
}

Actor FreezerCooldownGiver : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_JumpIfInventory("FreezerOverHeat", 0, "Give")
		Stop
		Give:
			TNT1 A 0 A_GiveInventory("FreezerCooldown", 1)
		Stop
	}
}

Actor FreezeBallTrail {
	+NOINTERACTION
	+CLIENTSIDEONLY
	Renderstyle Add
	Alpha 0.875
	Scale 0.675
	States {
		Spawn:
			TNT1 A 0 NoDelay A_Jump(256, "1", "2", "3")
		1:
			FRZX A 0
		Goto Fade
		2:
			FRZX B 0
		Goto Fade
		3:
			FRZX C 0
		Goto Fade
		Fade:
			"####" "#" 1 A_FadeOut(0.075)
			"####" "#" 0 A_SetScale(scalex - 0.0375, scaley - 0.0375)
		Loop
	}
}

Actor FreezeSparklet {
	+NOINTERACTION
	+CLIENTSIDEONLY
	+RANDOMIZE
	Renderstyle Add
	Alpha 0.875
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
		SpawnLoop:
			FRZG ABCDE 3 Bright A_FadeOut(0.075)
		Loop
	}
}

Actor FreezeBall : DnD_ExplosiveBase {
	PROJECTILE
	Speed 36
	Height 20
	Radius 10
	Renderstyle "Add"
	Alpha 0.875
	Scale 0.675
	var int user_count;
	const int steps = 5;
	DeathSound "Freezer/Hit"
	
	Damage(
		DND_WEAPON_FREEZER |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ICE << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+NODAMAGETHRUST
	+MTHRUSPECIES
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_count", 0)
		SpawnLoop:
			TNT1 A 0 A_JumpIf(user_count == steps, "Death")
			FRZX A 3 Bright A_SpawnItem("FreezeBallTrail")
			TNT1 A 0 A_ScaleVelocity(0.875)
			FRZX B 3 Bright A_SpawnItem("FreezeBallTrail")
			TNT1 A 0 A_ScaleVelocity(0.875)
			FRZX C 3 Bright A_SpawnItem("FreezeBallTrail")
			TNT1 A 0 A_ScaleVelocity(0.875)
			TNT1 A 0 A_SetUserVar("user_count", user_count + 1)
		Loop
		Death:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_SetScale(1.25)
			FRZX D 3 Bright
			TNT1 A 0 A_PlaySound("Freezer/Ambience")
			
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_FREEZER |
				(DND_DMGID_2 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ICE << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 176 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius * 0.364)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			FRZX D 1 Bright A_SpawnItemEx("FreezeBallBigBoom", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			TNT1 A 0 A_Explode(1, user_expradius, 0, 0, user_fullexpradius)
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 A 4 
			TNT1 AAAAAA 0 A_CustomMissile("FreezeBallSmall", 0, 0, frandom(0, 360), CMF_AIMDIRECTION | CMF_TRACKOWNER, frandom(-180, 180))
			TNT1 A 5 
			TNT1 AAAA 0 A_CustomMissile("FreezeBallSmall", 0, 0, frandom(0, 360), CMF_AIMDIRECTION | CMF_TRACKOWNER, frandom(-180, 180))
			TNT1 A 5 
			TNT1 AAAA 0 A_CustomMissile("FreezeBallSmall", 0, 0, frandom(0, 360), CMF_AIMDIRECTION | CMF_TRACKOWNER, frandom(-180, 180))
			TNT1 A 4 
			TNT1 AAAAAA 0 A_CustomMissile("FreezeBallSmall", 0, 0, frandom(0, 360), CMF_AIMDIRECTION | CMF_TRACKOWNER, frandom(-180, 180))
			TNT1 A 3
		Goto FinishExplosion
		Crit:
			TNT1 A 0 A_Explode(1, user_expradius, 0, 0, user_fullexpradius)
			TNT1 A 4 
			TNT1 AAAAAA 0 A_CustomMissile("FreezeBallSmall_Crit", 0, 0, frandom(0, 360), CMF_AIMDIRECTION | CMF_TRACKOWNER, frandom(-180, 180))
			TNT1 A 5
			TNT1 AAAA 0 A_CustomMissile("FreezeBallSmall_Crit", 0, 0, frandom(0, 360), CMF_AIMDIRECTION | CMF_TRACKOWNER, frandom(-180, 180))
			TNT1 A 5 
			TNT1 AAAA 0 A_CustomMissile("FreezeBallSmall_Crit", 0, 0, frandom(0, 360), CMF_AIMDIRECTION | CMF_TRACKOWNER, frandom(-180, 180))
			TNT1 A 4 
			TNT1 AAAAAA 0 A_CustomMissile("FreezeBallSmall_Crit", 0, 0, frandom(0, 360), CMF_AIMDIRECTION | CMF_TRACKOWNER, frandom(-180, 180))
			TNT1 A 3 
		Goto FinishExplosion
	}
}

Actor FreezeBallBigBoom {
	Scale 1.25
	Renderstyle "Add"
	Alpha 0.875
	+NOINTERACTION
	States {
		Spawn:
			TNT1 A 0
			TNT1 AAAAAA 0 A_SpawnItemEx("FreezeSparklet", frandom(-72, 72), frandom(-72, 72), frandom(-72, 72))
			FRZX EEEE 1 Bright A_SetScale(scalex + 0.1, scaley + 0.1)
			TNT1 AAAAAA 0 A_SpawnItemEx("FreezeSparklet", frandom(-72, 72), frandom(-72, 72), frandom(-72, 72))
			FRZX FFFFF 1 Bright A_SetScale(scalex + 0.1, scaley + 0.1)
			TNT1 AAAAAA 0 A_SpawnItemEx("FreezeSparklet", frandom(-72, 72), frandom(-72, 72), frandom(-72, 72))
			FRZX GGGGG 1 Bright A_SetScale(scalex - 0.0875, scaley - 0.0875)
			TNT1 AAAAAA 0 A_SpawnItemEx("FreezeSparklet", frandom(-72, 72), frandom(-72, 72), frandom(-72, 72))
			FRZX HHHH 1 Bright A_SetScale(scalex - 0.0875, scaley - 0.0875)
			TNT1 AAAAAA 0 A_SpawnItemEx("FreezeSparklet", frandom(-72, 72), frandom(-72, 72), frandom(-72, 72))
			FRZX III 1 Bright A_SetScale(scalex - 0.1, scaley - 0.1)
		Stop
	}
}

Actor FreezeBallSmall : DnD_ExplosiveBase {
	Speed 20
	Height 10
	Radius 5
	Renderstyle "Add"
	Alpha 0.875
	Scale 0.25
	DeathSound "Freezer/Hit"
	
	Damage(
		DND_WEAPON_FREEZER |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ICE << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+NODAMAGETHRUST
	+RIPPER
	+BLOODLESSIMPACT
	+MTHRUSPECIES
	States {
		SpawnState:
			FRZX A 3 Bright
			FRZX BCABC 3 Bright A_ScaleVelocity(0.675)
		Goto Death
		Death:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_SetScale(0.675)
			TNT1 A 0 A_PlaySound("Freezer/Particle", CHAN_AUTO)
			FRZX DE 2 Bright
		
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_FREEZER |
				(DND_DMGID_3 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ICE << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 64 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius / 4)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 0 A_Explode(1, user_expradius, 0, 0, user_fullexpradius)
			FRZX FGHI 2 Bright
		Stop
	}
}

Actor FreezeBallSmall_Crit : FreezeBallSmall {
	Accuracy 69
}

Actor ResRL4 : Weapon {
	Weapon.SelectionOrder 2400
	Weapon.SlotNumber 5
    Inventory.PickupSound "weapons/pickup"
    Inventory.PickupMessage "You got the Gravdis 5000!"	
    Obituary "%o was pulled down to earth by %k's Gravdis 5000."
	Weapon.AmmoType "GravdisAmmo"
	Weapon.AmmoUse 0
	Weapon.AmmoGive 5
	AttackSound ""
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_5_8_TAG"
	Weapon.BobSpeed 1.6
	Weapon.BobRangeY 0.25
	Weapon.BobRangeX 0.45
	Weapon.BobStyle InverseSmooth
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			BRSG X -1
		Stop
		Ready:
			BRSG A 0 A_PlaySound("Gravdis/Idle", CHAN_WEAPON, 0.8, 1)
		ReadyLoop:
			BRSG BCDEFGHIJKLMNOPQRSTU 2 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_StopSound(CHAN_WEAPON)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
		DeselectLoop:
			BRSG A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot5", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 400, 0, DND_WEAPON_GRAVDIS)
	    SelectLoop:
			BRSG A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_GRAVDIS, 0), "FireConfirmed")
			BRSG B 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			BRSG A 0 A_PlaySound("Gravdis/Idle", CHAN_WEAPON, 0.8, 1)
			BRSG CDE 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			BRSG FGHIJKLMNOPQRSTU 2 A_WeaponReady(WRF_NOFIRE)
		Goto Ready
		FireConfirmed:
			BRSG A 1 Bright
			BRSG A 2 Bright A_PlaySound("Gravdis/Charge", CHAN_WEAPON)
			BRSC A 3 Bright Offset(1, 33)
			BRSC B 3 Bright Offset(-1, 34)
			BRSC C 2 Bright Offset(0, 35)
			BRSC C 1 Bright Offset(1, 34)
			BRSC D 1 Bright Offset(1, 34)
			BRSC D 2 Bright Offset(0, 31)
			BRSC E 1 Bright Offset(-1, 30)
			BRSC E 1 Bright Offset(-2, 32)
			BRSC E 1 Bright Offset(0, 34)
			BRSC F 1 Bright Offset(2, 33)
			BRSC F 1 Bright Offset(1, 35)
			BRSC F 1 Bright Offset(0, 33)
			BRSC G 1 Bright Offset(-1, 35)
			BRSC G 1 Bright Offset(1, 32)
			BRSC G 1 Bright Offset(0, 32)
			BRSC H 3 Bright Offset(0, 32)
			BRSC I 4 Bright Offset(0, 32)
			TNT1 A 0 A_StopSound(CHAN_WEAPON)
			TNT1 AAA 0 A_SpawnItemEx("GravdisSmoke2", 18 * cos(-pitch), 16, 32 * (1 + sin(-pitch)), frandom(2, 3.5), frandom(-1, 1), frandom(-1, 1))
			TNT1 A 0 A_PlaySound("Gravdis/Fire", 6)
			TNT1 A 0 A_PlaySound("Gravdis/FireAdd", 7)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_GRAVDIS, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_GRAVDIS << 16), 0)
			BRSF A 1 Bright Offset(10, 38)
			BRSF A 1 Bright Offset(19, 46)
			BRSF A 1 Bright Offset(27, 51)
			BRSF B 1 Bright Offset(28, 52)
			BRSF B 2 Bright Offset(29, 52)
			BRSF C 1 Bright Offset(27, 50)
			BRSF C 1 Bright Offset(24, 47)
			BRSF C 1 Bright Offset(20, 41)
			BRSF D 1 Bright Offset(17, 39)
			BRSF D 1 Bright Offset(15, 37)
			BRSF D 1 Bright Offset(14, 36)
			BRSF E 1 Bright Offset(10, 35)
			BRSF E 1 Bright Offset(8, 35)
			BRSF E 1 Bright Offset(6, 34)
			BRSF F 1 Bright Offset(3, 33)
			BRSF F 1 Bright Offset(1, 33)
			BRSF F 1 Bright Offset(0, 32)
			BRSG A 35 Offset(0, 32)
		Goto Ready
		Altfire:
			"####" "#" 0 A_JumpIfInventory("GravdisCanAlt", 1, "ContinueAlt")
			"####" "#" 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		ContinueAlt:
			BRSF A 1 Bright Offset(10, 38)
			TNT1 A 0 A_PlaySound("Gravdis/FireAdd", CHAN_WEAPON)
			TNT1 A 0 A_GiveInventory("GravdisDunk", 1)
			BRSF A 1 Bright Offset(19, 46)
			BRSF A 1 Bright Offset(27, 51)
			BRSF B 1 Bright Offset(28, 52)
			BRSF B 2 Bright Offset(29, 52)
			TNT1 A 0 A_TakeInventory("GravdisCanAlt", 1)
			BRSF C 1 Bright Offset(27, 50)
			BRSF C 1 Bright Offset(24, 47)
			BRSF C 1 Bright Offset(20, 41)
			BRSF D 1 Bright Offset(17, 39)
			BRSF D 1 Bright Offset(15, 37)
			BRSF D 1 Bright Offset(14, 36)
			BRSF E 1 Bright Offset(10, 35)
			BRSF E 1 Bright Offset(8, 35)
			BRSF E 1 Bright Offset(6, 34)
			BRSF F 1 Bright Offset(3, 33)
			BRSF F 1 Bright Offset(1, 33)
			BRSF F 1 Bright Offset(0, 32)
			BRSG A 10 Bright Offset(0, 32)
		Goto Ready
	}
}

Actor GravdisDunk : PowerProtection {
	damagefactor "normal", 1.0
	powerup.duration 10
}

Actor GravdisImmunity : DnD_Boolean { }
Actor GravdisCanAlt : DnD_Boolean { }
Actor GravdisToken : DnD_Boolean { }

// 3.5 seconds on gravity hold, then half second for the rise up section = 4 seconds
Actor GravdisDebuff : DnD_Info { }

Actor GravdisProjectile : DnD_BaseProjectile {
	Speed 50
	Radius 16
	Height 32
	Damage 0
	DeathSound "Gravdis/Hit"
	Renderstyle Add
	var int user_rad;
	var int user_f;
	const float r = 64.0;
	+DONTREFLECT
	States {
		SpawnState:
			VOIP ABCDEFGHIJKL 2 Bright
		Loop
		Death:
			TNT1 A 0 A_SetUserVar("user_rad", 256 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_SetUserVar("user_f", 5 * ACS_NamedExecuteWithResult("DND Weapon Damage Retrieve", DND_DMGID_0 | (DND_WEAPON_GRAVDIS << 16), DND_DAMAGECATEGORY_BULLET, DND_USETARGET | DND_ISSLOT5) / 4)
			TNT1 A 0 A_RadiusGive("GravdisToken", user_rad, RGF_MONSTERS, 1)
			VORX A 1 Bright
			// base damage is input here from weapon -- pulls things toward its center scaling with weapon damage in force
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Gravdis Hit Fx", 0, user_rad)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Gravdis Debuff", ACS_NamedExecuteWithResult("DND Weapon Damage Retrieve", DND_DMGID_0 | (DND_WEAPON_GRAVDIS << 16), DND_DAMAGECATEGORY_BULLET, DND_USETARGET | DND_ISSLOT5))
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(15), r * sin(15), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(105), r * sin(105), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(195), r * sin(195), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(285), r * sin(285), 0, 0, 0, 2)
			VORX B 2 Bright ACS_NamedExecuteWithResult("DnD Gravdis Thrust", 8, user_f)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(30), r * sin(30), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(120), r * sin(120), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(210), r * sin(210), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(300), r * sin(300), 0, 0, 0, 2)
			VORX C 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(45), r * sin(45), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(135), r * sin(135), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(225), r * sin(225), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(315), r * sin(315), 0, 0, 0, 2)
			VORX D 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(60), r * sin(60), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(150), r * sin(150), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(285), r * sin(285), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(330), r * sin(330), 0, 0, 0, 2)
			VORX E 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(75), r * sin(75), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(165), r * sin(165), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(255), r * sin(255), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(345), r * sin(345), 0, 0, 0, 2)
			VORX F 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(90), r * sin(90), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(180), r * sin(180), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(270), r * sin(270), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(0), r * sin(0), 0, 0, 0, 2)
			VORX G 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(105), r * sin(105), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(195), r * sin(195), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(285), r * sin(285), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(15), r * sin(15), 0, 0, 0, 2)
			VORX H 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(120), r * sin(120), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(210), r * sin(210), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(300), r * sin(300), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(30), r * sin(30), 0, 0, 0, 2)
			VORX I 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(135), r * sin(135), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(225), r * sin(225), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(315), r * sin(315), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(45), r * sin(45), 0, 0, 0, 2)
			VORX J 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(150), r * sin(150), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(240), r * sin(240), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(330), r * sin(330), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(60), r * sin(60), 0, 0, 0, 2)
			VORX K 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(165), r * sin(165), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(255), r * sin(255), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(345), r * sin(345), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(75), r * sin(75), 0, 0, 0, 2)
			VORX L 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(180), r * sin(180), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(270), r * sin(270), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(0), r * sin(0), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(90), r * sin(90), 0, 0, 0, 2)
			VORX M 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(195), r * sin(195), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(285), r * sin(285), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(15), r * sin(15), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(105), r * sin(105), 0, 0, 0, 2)
			VORX N 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(210), r * sin(210), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(300), r * sin(300), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(30), r * sin(30), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(120), r * sin(120), 0, 0, 0, 2)
			VORX O 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(225), r * sin(225), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(315), r * sin(315), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(45), r * sin(45), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(135), r * sin(135), 0, 0, 0, 2)
			VORX P 2 Bright
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(240), r * sin(240), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(330), r * sin(330), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(60), r * sin(60), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(150), r * sin(150), 0, 0, 0, 2)
			TNT1 A 2
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(255), r * sin(255), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(345), r * sin(345), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(75), r * sin(75), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(165), r * sin(165), 0, 0, 0, 2)
			TNT1 A 2
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(270), r * sin(270), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(0), r * sin(0), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(90), r * sin(90), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(180), r * sin(180), 0, 0, 0, 2)
			TNT1 A 2
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(285), r * sin(285), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(15), r * sin(15), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(105), r * sin(105), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(195), r * sin(195), 0, 0, 0, 2)
			TNT1 A 2
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(300), r * sin(300), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(30), r * sin(30), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(120), r * sin(120), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(210), r * sin(210), 0, 0, 0, 2)
			TNT1 A 2
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(315), r * sin(315), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(45), r * sin(45), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(135), r * sin(135), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(225), r * sin(225), 0, 0, 0, 2)
			TNT1 A 2
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(330), r * sin(330), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(60), r * sin(60), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(150), r * sin(150), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(240), r * sin(240), 0, 0, 0, 2)
			TNT1 A 2
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(345), r * sin(345), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(75), r * sin(75), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(165), r * sin(165), 0, 0, 0, 2)
			TNT1 A 0 A_SpawnItemEx("GravdisSpinnyParticle", r * cos(255), r * sin(255), 0, 0, 0, 2)
			TNT1 A 2
		Stop
	}
}

Actor GravdisSmoke1 {
	Renderstyle Add
	Alpha 0.75
	Scale 0.8
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
			TNT1 A 0 A_Jump(256, "1", "2", "3")
		1:
			VODS A 0
		Goto Finish
		2:
			VODS B 0
		Goto Finish
		3:
			VODS C 0
		Goto Finish
		Finish:
			"####" "#" 1 A_FadeOut(0.05)
			"####" "#" 0 A_SetScale(scalex - 0.05, scaley - 0.05)
		Loop
	}
}

Actor GravdisSmoke2 {
	Renderstyle Add
	Alpha 1.0
	Scale 0.75
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
		SpawnLoop:
			VSMK ABCDEFGHIJKLMNOPQ 1 Bright A_FadeOut(0.05)
		Loop
	}
}

Actor GravdisSmoke3 : GravdisSmoke2 {
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
		SpawnLoop:
			VSMK ABCDEFGHIJKLMNOPQ 2 Bright A_FadeOut(0.05)
		Loop
	}
}

Actor GravdisCircle {
	Renderstyle Add
	Alpha 1.0
	Scale 0.075
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			VSHK A 1 A_FadeOut(0.0875)
			TNT1 A 0 A_SetScale(scalex + 0.0875, scaley + 0.0875)
		Loop
	}
}

Actor GravdisPullFX_Spawner : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_SpawnItemEx("GravdisCircle", 0, 0, height / 2, 0, 0, 0)
			TNT1 A 0 A_SpawnItemEx("GravdisParticle", radius * cos(0), radius * sin(0), 0, 0, 0, (-z + floorz) / 4)
			TNT1 A 0 A_SpawnItemEx("GravdisParticle", radius * cos(60), radius * sin(60), 0, 0, 0, (-z + floorz) / 4)
			TNT1 A 0 A_SpawnItemEx("GravdisParticle", radius * cos(120), radius * sin(120), 0, 0, 0, (-z + floorz) / 4)
			TNT1 A 0 A_SpawnItemEx("GravdisParticle", radius * cos(180), radius * sin(180), 0, 0, 0, (-z + floorz) / 4)
			TNT1 A 0 A_SpawnItemEx("GravdisParticle", radius * cos(240), radius * sin(240), 0, 0, 0, (-z + floorz) / 4)
			TNT1 A 0 A_SpawnItemEx("GravdisParticle", radius * cos(300), radius * sin(300), 0, 0, 0, (-z + floorz) / 4)
		Stop
	}
}

Actor GravdisLandFX_Spawner : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_SpawnItemEx("GravdisSmoke1", 0, 0, height / 2, 0, 0, frandom(0.8, 1.5))
			TNT1 AA 0 A_SpawnItemEx("GravdisSmoke3", frandom(-16, 16), frandom(-16, 16), 0, frandom(-1, 1), frandom(-1, 1), frandom(0, 1))
		Stop
	}
}

Actor GravdisParticle {
	Renderstyle Add
	Alpha 1.0
	Scale 0.33
	+DONTSPLASH
	+CLIENTSIDEONLY
	+NOINTERACTION
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
		SpawnLoop:
			OGLP X 2 Bright A_FadeOut(0.08)
		Loop
	}
}

Actor GravdisBorderParticle {
	Renderstyle Add
	Alpha 0.01
	Scale 0.33
	+DONTSPLASH
	+CLIENTSIDEONLY
	+NOINTERACTION
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
			OGLP PPPPPPPPPP 1 A_FadeIn(0.1)
		SpawnLoop:
			OGLP P 2 Bright A_FadeOut(0.08)
		Loop
	}
}

Actor GravdisSpinnyParticle {
	Renderstyle Add
	Alpha 1.0
	Scale 0.25
	+DONTSPLASH
	+CLIENTSIDEONLY
	+NOINTERACTION
	+NOCLIP
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
		SpawnLoop:
			SPKP AA 1 Bright A_FadeOut(0.025)
			TNT1 A 0 A_ChangeVelocity(0, 0, 0.5, CVF_RELATIVE)
		Loop
	}
}

// Pickup by SoloSpaghetti, weapon by Charch
Actor ResRL5 : Weapon {
	Weapon.SelectionOrder 1600
	Weapon.SlotNumber 5
    Inventory.PickupSound "weapons/pickup"
    Inventory.PickupMessage "You got the Void Cannon!"	
    Obituary "%o was proven to be null and void by %k's Void Cannon."
	Weapon.AmmoType1 "Cell"
	Weapon.AmmoType2 "VoidCannonOverheat"
	Weapon.AmmoUse1 30
	Weapon.AmmoUse2 0
	Weapon.AmmoGive1 30
	Weapon.AmmoGive2 0
	AttackSound ""
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_5_9_TAG"
	Weapon.BobSpeed 1.5
	Weapon.BobRangeY 0.2
	Weapon.BobRangeX 0.4
	Weapon.BobStyle InverseSmooth
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			RW07 X -1
		Stop
		Ready:
			RW07 BCDE 2
			TNT1 A 0 A_PlaySound("VoidWeapon/Idle", CHAN_7, 1.0, true)
		ReadyLoop:
			TNT1 A 0 A_GiveInventory("DnD_OverheatCanReduce", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Overheat Reduction", 0, DND_OVERHEAT_VOIDCANNON, 5 | (17 << 16))
			RW07 FGHIJKLMNO 2 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
			TNT1 A 0 A_TakeInventory("P_GrayFire", 1)
			RW07 EDCB 1 A_StopSound(CHAN_7)
		DeselectLoop:
			RW07 A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot5", 1)
			TNT1 A 0 A_GiveInventory("P_GrayFire", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Weapon Input Handler", 0, DND_WEAPON_VOIDCANNON)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 100, 0, DND_WEAPON_VOIDCANNON)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 300, 0, DND_WEAPON_VOIDCANNON)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 30, 0, DND_WEAPON_VOIDCANNON)
	    SelectLoop:
			RW07 A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_VOIDCANNON, 0), "FireConfirmed")
			RW07 BCDE 2 A_WeaponReady(WRF_NOFIRE)
			TNT1 A 0 A_PlaySound("VoidWeapon/Idle", CHAN_7, 1.0, true)
			RW07 FGHIJKLMNO 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			TNT1 A 0 A_TakeInventory("DnD_OverheatCanReduce", 1)
			RW07 P 3 Bright
			TNT1 A 0 A_StopSound(CHAN_7)
			TNT1 A 0 A_PlaySound("VoidWeapon/Charge", CHAN_6)
			RW07 Q 3 Bright
			RW07 R 1 Bright Offset(0, 33)
			RW07 R 1 Bright Offset(0, 34)
			RW07 R 1 Bright Offset(0, 35)
			TNT1 A 0 A_PlayWeaponSound("VoidWeapon/Fire")
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_VOIDCANNON, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), 0)
			RW07 S 1 Bright Offset(0, 38)
			RW07 S 1 Bright Offset(0, 49)
			RW07 S 1 Bright Offset(0, 56)
			RW07 T 1 Bright Offset(0, 58)
			RW07 T 2 Bright Offset(0, 60)
			TNT1 A 0 A_GiveInventory("VoidCannonCooldownGiver", 1)
			RW07 U 1 Offset(0, 58)
			RW07 U 1 Offset(0, 54)
			RW07 U 1 Offset(0, 48)
			RW07 U 1 Offset(0, 41)
			RW07 V 2 Offset(0, 35)
			RW07 V 2 Offset(0, 33)
			RW07 W 4 Offset(0, 32)
			RW07 A 15
		Goto Ready
		Nothing:
			RW07 F 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
	}
}

Actor VoidCannonCooldown : PowerDamage {
	powerup.duration 105
	damagefactor "normal", 1.0
}

Actor VoidCannonCooldownGiver : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_JumpIfInventory("VoidCannonOverHeat", 0, "Give")
		Stop
		Give:
			TNT1 A 0 A_GiveInventory("VoidCannonCooldown", 1)
		Stop
	}
}

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

Actor VoidMissile : DnD_ExplosiveBase {
	SeeSound "VoidWeapon/Bzoop"
	Scale 0.7
	Radius 24
	Height 48
	Speed 40
	RenderStyle Translucent
	Damage (
		DND_WEAPON_VOIDCANNON |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	var int user_f;
	var int user_rad;
	var int user_inc;
	const float r = 100;
	
	Stamina 32768
	
	var int user_ripperid;
	
	+RIPPER
	+BLOODLESSIMPACT
	+FORCERADIUSDMG
	+FOILINVUL
	+DONTREFLECT
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_f", 2000 * ACS_NamedExecuteWithResult("DND Weapon Damage Retrieve", DND_DMGID_0 | (DND_WEAPON_VOIDCANNON << 16), DND_DAMAGECATEGORY_ENERGY, DND_USETARGET | DND_ISSLOT5) / 100)
			TNT1 A 0 A_SetUserVar("user_rad", 150 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_PlaySound("VoidWeapon/Zap", CHAN_6, 1.0, true)
		SpawnLoop:
			R044 J 3 Bright ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SpawnItemEx("VoidMissileTrail")
			TNT1 A 0 A_JumpIfInTargetInventory("VoidDetonation", 1, "Kaboom")
			R044 K 3 Bright ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SpawnItemEx("VoidMissileTrail")
			TNT1 A 0 A_JumpIfInTargetInventory("VoidDetonation", 1, "Kaboom")
			R044 L 3 Bright ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SpawnItemEx("VoidMissileTrail")
			TNT1 A 0 A_JumpIfInTargetInventory("VoidDetonation", 1, "Kaboom")
			R044 M 3 Bright ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SpawnItemEx("VoidMissileTrail")
			TNT1 A 0 A_JumpIfInTargetInventory("VoidDetonation", 1, "Kaboom")
			R044 N 3 Bright ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SpawnItemEx("VoidMissileTrail")
			TNT1 A 0 A_JumpIfInTargetInventory("VoidDetonation", 1, "Kaboom")
			R044 O 3 Bright ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SpawnItemEx("VoidMissileTrail")
			TNT1 A 0 A_JumpIfInTargetInventory("VoidDetonation", 1, "Kaboom")
			R044 P 3 Bright ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SpawnItemEx("VoidMissileTrail")
			TNT1 A 0 A_JumpIfInTargetInventory("VoidDetonation", 1, "Kaboom")
			R044 Q 3 Bright ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SpawnItemEx("VoidMissileTrail")
			TNT1 A 0 A_JumpIfInTargetInventory("VoidDetonation", 1, "Kaboom")
		Loop
		Kaboom:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_ChangeVelocity(0, 0, 0, CVF_REPLACE)
		Death:
			TNT1 A 0 A_SetUserVar("user_inc", r)
			TNT1 A 0 A_StopSound(CHAN_6)
			TNT1 A 0 A_PlaySound("VoidWeapon/PreBoom")
			R044 JJJ 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 KKK 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 LLL 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 MMM 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 NNN 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 OOO 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 PPP 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 QQQ 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 JJJ 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 KKK 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 LLL 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 MMM 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 NNN 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 OOO 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 PPP 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			R044 QQQ 1 Bright A_SetScale(scalex + user_inc / 1000.0, scaley + user_inc / 1000.0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f, user_rad)
			TNT1 A 0 A_SetUserVar("user_inc", user_inc * 0.95)
			TNT1 A 0 A_PlaySound("VoidWeapon/Explode")
			R044 JJKKLLMMNNOO 1 Bright A_SetScale(scalex - 0.3, scaley - 0.3)
			TNT1 A 0 A_PlaySound("VoidWeapon/BigBoom", CHAN_ITEM)
			
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_VOIDCANNON |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 2 * user_rad)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_rad / 2)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF | DND_DAMAGEFLAG_HALFDMGSELF)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 0 A_SetScale(1.8, 1.8)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Pull Towards Self", user_f * 8, user_rad * 2, DND_PULLF_CANPULLDEAD | DND_PULLF_REVERSEDIR)
			TNT1 A 0 A_SpawnItemEx("GrayFlare")
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 A 0 A_CustomMissile("VoidMissileExploder", 0, 0, 0, CMF_TRACKOWNER)
		FinishAnim:
			R045 ABCDEFGHIJKLMNOPQRSTUVWXY 1 Bright A_SetScale(scalex * 1.025, scaley * 1.025)
		Goto FinishExplosion
		Crit:
			TNT1 A 0 A_CustomMissile("VoidMissileExploder_Crit", 0, 0, 0, CMF_TRACKOWNER)
		Goto FinishAnim
	}
}

Actor VoidMissileExploder : DnD_ExplosiveBase {
	Speed 0
	Height 1
	Radius 1
	ReactionTime 7
	+THRUACTORS
	+FORCERADIUSDMG
	+FOILINVUL
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_VOIDCANNON |
				(DND_DMGID_2 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGYEXPLOSION << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 300 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius / 4)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF | DND_DAMAGEFLAG_HALFDMGSELF)
		XDeath:
		Death:
		Repeat:
			TNT1 AAAAAAAA 0 A_SpawnItemEx("WhiteBallParticle_Void", frandom(-16, 16), frandom(-16, 16), 0, frandom(-2.5, 2.5), frandom(-2.5, 2.5), frandom(-2.5, 2.5))
			TNT1 A 1
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 1 A_Countdown
			TNT1 A 0 A_JumpIf(reactiontime > 1, "Repeat")
			TNT1 A 1
		Stop
	}
}

Actor VoidMissileExploder_Crit : VoidMissileExploder {
	Accuracy 69
}

Actor WhiteBallParticle_Void {
	RenderStyle Add
	+NOINTERACTION
	+CLIENTSIDEONLY
	Scale 0.45
	States {
		Spawn:
			TNT1 A 0
			TNT1 A 0 Thing_ChangeTID(0, SPECIAL_FX_TID)
			TNT1 A 1
		SpawnLoop:
			SPKW A 2 Bright A_FadeOut(0.08)
			TNT1 A 0 A_SetScale(scalex * 0.975, scaley * 0.975)
		Loop
	}
}

Actor VoidMissileTrail {
	Renderstyle Translucent
	Alpha 0.75
	Scale 0.75
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			R044 JJKKLLMMNNOOPPQQ 1 Bright A_FadeOut(0.0375)
		Loop
	}
}