// Sprites by Eriance
Actor "Rocket Launcher" : RocketLauncher
{	
	Weapon.Slotnumber 5
	Inventory.PickupSound "weapons/pickup"
	+INVENTORY.UNDROPPABLE
    Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 1.6
    Weapon.BobRangeY 0.5
    Weapon.BobRangeX 0.9
	Weapon.AmmoUse 0
	Weapon.AmmoGive 0
	Tag "$WEP_5_0_TAG"
	+WEAPON.NOAUTOAIM
   States
   {
   Spawn:
      LAUN A -1
      Stop
   Ready:
      MIS9 A 1 A_WeaponReady
      Loop
   Deselect:
	  TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
      MIS9 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, 45, 2 | (4 << 16), DND_WEAPON_ROCKETLAUNCHER)
	  TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 128, 0, DND_WEAPON_ROCKETLAUNCHER)
  SelectLoop:
      MIS9 A 1 A_Raise
	  TNT1 A 0 A_Raise
      Loop
   Fire:
		TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_ROCKETLAUNCHER, 0), "FireConfirmed")
		MIS9 A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
    Goto Ready
    FireConfirmed:
      MIS9 D 3 Bright A_GunFlash
	  TNT1 A 0 Radius_Quake(4,3,0,1,0)
      MIS9 E 4 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_ROCKETLAUNCHER, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_ROCKET << 16), 0)
      MIS9 FGHC 3 Bright
	  MIS9 B 4 Bright
      MIS9 A 0 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 "Upgraded Rocket Launcher" : RocketLauncher {	
	Weapon.Slotnumber 5
	Inventory.PickupSound "weapons/pickup"
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_5_1_TAG"
    Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 1.6
    Weapon.BobRangeY 0.5
    Weapon.BobRangeX 0.9
	+WEAPON.NOAUTOAIM
	-NOAUTOFIRE
	States {
		Spawn:
			WPPK G -1
		Stop
		Ready:
			RLDI A 1 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
			RLDI A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot5", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Weapon Input Handler", 0, DND_WEAPON_TORPEDOLAUNCHER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 20, 15 | (20 << 16), DND_WEAPON_TORPEDOLAUNCHER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 224, 0, DND_WEAPON_TORPEDOLAUNCHER)
	    SelectLoop:
			RLDI A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_TORPEDOLAUNCHER, 0), "FireConfirmed")
			RLDI A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			RLDI A 1
			RLDF A 1 Bright A_GunFlash
			TNT1 A 0 A_PlayWeaponSound("weapons/newrocketfire")
			TNT1 A 0 Radius_Quake(4, 3, 0, 1,0)
			RLDF B 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_TORPEDOLAUNCHER, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_ROCKET << 16), 0)
			RLDF C 1 Bright Offset(14, 39)
			RLDF D 1 Bright Offset(19, 42)
			RLDF E 1 Bright Offset(21, 44)
			RLDF F 2 Offset(23, 45)
			RLDR A 1 Offset(21, 44)
			RLDR A 1 Offset(19, 43)
			RLDR B 1 Offset(17, 42)
			RLDR B 1 Offset(15, 41)
			RLDR C 1 Offset(13, 40)
			RLDR C 1 Offset(11, 39)
			RLDR D 1 Offset(9, 38)
			RLDR D 1 Offset(7, 37)
			RLDR E 1 Offset(5, 36)
			RLDR E 1 Offset(3, 35)
			RLDR F 1 Offset(1, 33)
			RLDR F 1 Offset(0, 32)
			RLDR G 1 Offset(0, 32)
			RLDR H 1 Offset(0, 32)
			RLDR I 1 Offset(0, 32)
			RLDR JKLMNOPQRST 1 Offset(0, 32)
			RLDI A 4
		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 TorpedoBoomSignal : PowerDamage {
	damagefactor "normal", 1.0
	powerup.duration 3
}

Actor TorpedoTimer : PowerDamage {
	damagefactor "normal", 1.0
	powerup.duration 10
}

Actor RocketX : DnD_ExplosiveBase {
	SeeSound "weapons/rocklf"
	DeathSound "weapons/rocklx"
	Radius 11
	Height 8
	Speed 20
	Decal "Scorch"
	
	Damage (
		DND_WEAPON_ROCKETLAUNCHER |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+DONTBLAST
	+THRUGHOST
	States {
		SpawnState:
			MISL A 2 Bright A_SpawnItemEx("DnD_RocketTrail", -12, 0, 5)
		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_ROCKETLAUNCHER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 144 * (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:
			MISL B 8 Bright
			MISL C 6 Bright
			MISL D 4 Bright
		Goto FinishExplosion
	}	
}

Actor RocketX_GhostHitter : RocketX {
	-THRUGHOST
}

Actor NewRocket : RocketX {
	Speed 52
	SeeSound ""
	Decal "Scorch"
	Scale 1.15
	
	Damage(
		DND_WEAPON_TORPEDOLAUNCHER |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+DONTREFLECT
	var int user_exprad;
	States {
		SpawnState:
			MICM AA 1 A_JumpIfInTargetInventory("TorpedoBoomSignal", 1, "Boom")
			TNT1 A 0 A_SpawnItemEx("DnD_RocketTrail", -12, 0, 5)
		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_TORPEDOLAUNCHER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
				(100 << 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", 0)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			MISL B 8 Bright
			MISL C 6 Bright
			MISL D 4 Bright
		Goto FinishExplosion
		
		Boom:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_ChangeVelocity(0, 0, 0, CVF_REPLACE)
		
			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_TORPEDOLAUNCHER |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
				(100 << 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", 0)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF)
		Goto DoExplosionDamage
	}
}

Actor NewRocket_GhostHitter : NewRocket {
	-THRUGHOST
}

ACTOR "Upgraded Rocket Launcher3" : Weapon {
	Weapon.SelectionOrder 600
	Weapon.AmmoUse1 0
	Weapon.AmmoUse2 0
	Weapon.AmmoGive 0
	Weapon.AmmoType1 "FlakShell"
	Weapon.AmmoType2 "ShellSize_18"
	Weapon.SlotNumber 5
	Inventory.PickupMessage "$GOTSHOTGUN2"
	Inventory.PickupSound "weapons/pickup"
	Obituary "$OB_MPSSHOTGUN"
	Tag "$WEP_5_3_TAG"
	Decal "BulletChip"
	+INVENTORY.UNDROPPABLE
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 1.8
	Weapon.BobRangeY 0.7
	Weapon.BobRangeX 0.8
	+WEAPON.NOAUTOAIM
	States {
		Ready:
			TNT1 A 0 A_JumpIfInventory("VindicatorZoomed", 1, "ZoomReady")
			VS9G A 1 A_WeaponReady(WRF_ALLOWRELOAD)
		Loop
		ZoomReady:
			V9ZG A 1 A_WeaponReady(WRF_ALLOWRELOAD)
		Loop
		Deselect:
			TNT1 A 0 A_JumpIfInventory("VindicatorZoomed", 1, "UnzoomDeselect")
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
		DeselectLoop:
			VS9G 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, 5, 0, DND_WEAPON_VINDICATOR)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 12, 0, DND_WEAPON_VINDICATOR)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 16, 0, DND_WEAPON_VINDICATOR)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_3, 20, 0, DND_WEAPON_VINDICATOR)
		SelectLoop:
			VS9G A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIfInventory("VindicatorZoomed", 1, "FireZoom")
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_VINDICATOR, 1), "FireConfirmed")
			VS9G A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Reload
		FireConfirmed:
			VS9F A 2 Bright
			TNT1 A 0 A_PlaySound("Vindicator/Fire", CHAN_AUTO)
			TNT1 A 0 A_GunFlash
			TNT1 AAAAAA 0 A_FireCustomMissile("SGTracer", frandom(-6, 6), 0, 0, frandom(-6, 6))
			TNT1 A 0 A_SpawnItemEx("GunSmoke", 18 * cos(-pitch), 5, 34 * (1 + sin(-pitch)), 2, 0, 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_VINDICATOR, DND_ATK_SECONDARY, DND_AMMOSLOT_MAGAZINE | (DND_MAGAZINE_SHELLSIZE_18 << 16), DND_ATF_CANFIRECIRCLE)
			TNT1 A 0 A_SpawnItemEx ("SHOTGUNSMOKE", cos(-pitch)*36, random(5, 10), 36+(sin(-pitch)*20),0,0,2,0,0,0)
			VS9F B 1 A_SetPitch(pitch - 5.0)
			VS9F B 1 A_SetPitch(pitch + 1.0)
			VS9F B 1 A_SetPitch(pitch + 1.0)
			VS9F CC 1 A_SetPitch(pitch + 1.0)
			TNT1 A 0 A_SpawnItemEx ("FlakShellCasing",cos(-pitch)*28, 24, 30+(sin(-pitch)*36),0,random(5, 8), random(1, 8),0,0,0)
			TNT1 A 0 A_SpawnItemEx ("SHOTGUNSMOKE", cos(-pitch)*36, random(5, 10), 36+(sin(-pitch)*20),0,0,2,0,0,0)
			VS9F D 2
			VS9F EFG 2 A_SpawnItemEx ("SHOTGUNSMOKE", cos(-pitch)*36, random(5, 10), 36+(sin(-pitch)*20),0,0,2,0,0,0)
			VS9G A 2
			VS9G A 2 A_Refire
		Goto Ready
		FireZoom:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_VINDICATOR, 1), "FireZoomConfirmed")
			V9ZG A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Reload
		FireZoomConfirmed:
			V9ZF A 2 Bright
			TNT1 A 0 A_PlaySound("Vindicator/Fire", CHAN_AUTO)
			TNT1 A 0 A_GunFlash
			TNT1 AAAAAA 0 A_FireCustomMissile("SGTracer", frandom(-6, 6), 0, 0, frandom(-6, 6))
			TNT1 A 0 A_SpawnItemEx("GunSmoke", 18 * cos(-pitch), 5, 34 * (1 + sin(-pitch)), 2, 0, 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_VINDICATOR, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, DND_AMMOSLOT_MAGAZINE | (DND_MAGAZINE_SHELLSIZE_18 << 16), DND_ATF_CANFIRECIRCLE)
			TNT1 A 0 A_SpawnItemEx ("SHOTGUNSMOKE", cos(-pitch)*36, 0, 36+(sin(-pitch)*20),0,0,2,0,0,0)
			V9ZF B 1 A_SetPitch(pitch - 3.0)
			V9ZF B 1 A_SetPitch(pitch + 1.0)
			V9ZF B 1 A_SetPitch(pitch + 1.0)
			V9ZF C 2 A_SetPitch(pitch + 1.0)
			TNT1 A 0 A_SpawnItemEx ("FlakShellCasing",cos(-pitch)*28, 24, 30+(sin(-pitch)*36),0,random(5, 8), random(1, 8),0,0,0)
			TNT1 A 0 A_SpawnItemEx ("SHOTGUNSMOKE", cos(-pitch)*36, 0, 36+(sin(-pitch)*20),0,0,2,0,0,0)
			V9ZF D 2
			V9ZF EFG 2 A_SpawnItemEx ("SHOTGUNSMOKE", cos(-pitch)*36, 0, 36+(sin(-pitch)*20),0,0,2,0,0,0)
			V9ZG A 4
		Goto Ready
		
		Reload:
			TNT1 A 0 A_JumpIfInventory("ShellSize_18", 0, "NoReload")
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_VINDICATOR, 0), "ContinueCheck")
			TNT1 A 0 A_JumpIfInventory("VindicatorZoomed", 1, "ZoomFailReload")
			VS9G A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		ZoomFailReload:
			V9ZG A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		
		ContinueCheck:
			TNT1 A 0 A_JumpIfInventory("VindicatorZoomed", 1, "UnzoomReload")
		ReloadZoomCont:
			TNT1 A 0 A_JumpIfInventory("Ability_Reloader", 1, "DoReloadFaster")
		DoReload:
			VS9R ABCDE 2
			VS9R F 3 A_PlayWeaponSound("Vindicator/Clipout")
			VS9R GHIJK 2
			TNT1 A 0 A_FireCustomMissile("FlakClipDrop", frandom(-12.0, 12.0), 0, 0, 0)
			VS9R L 35
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Handle Reload", 0, DND_WEAPON_VINDICATOR)
			VS9R MNOPQ 2
			VS9R R 3 A_PlayWeaponSound("Vindicator/Clipin")
			VS9R STUVWX 2
		Goto Ready

		DoReloadFaster:
			VS9R ABCDE 1
			VS9R F 2 A_PlayWeaponSound("Vindicator/Clipout")
			VS9R GHIJK 1
			TNT1 A 0 A_FireCustomMissile("FlakClipDrop", frandom(-12.0, 12.0), 0, 0, 0)
			VS9R L 17
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Handle Reload", 0, DND_WEAPON_VINDICATOR)
			VS9R MNOPQ 1
			VS9R R 2 A_PlayWeaponSound("Vindicator/Clipin")
			VS9R STUVWX 1
		Goto Ready
		NoReload:
			VS9G A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		
		AltFire:
			TNT1 A 0 A_JumpIfInventory("VindicatorZoomed", 1, "UnZoom")
			VS9Z A 1
			VS9Z B 1
			VS9Z C 1 A_ZoomFactor(2.0)
			TNT1 A 0 A_PlaySound("Weapons/Scope", CHAN_WEAPON)
			VS9Z D 1 A_GiveInventory("VindicatorZoomed", 1)
			VS9Z E 1 
			VS9Z F 1
		Goto Ready
		UnZoom:
			VS9Z F 1 A_ZoomFactor(1.0)
			TNT1 A 0 A_PlaySound("Weapons/Scope", CHAN_WEAPON)
			VS9Z E 1 A_TakeInventory("VindicatorZoomed", 1)
			VS9Z D 1
			VS9Z C 1
			VS9Z B 1
			VS9Z A 1
		Goto Ready
		UnZoomDeselect:
			VS9Z F 1 A_ZoomFactor(1.0)
			TNT1 A 0 A_PlaySound("Weapons/Scope", CHAN_WEAPON)
			VS9Z E 1 A_TakeInventory("VindicatorZoomed", 1)
			VS9Z D 1
			VS9Z C 1
			VS9Z B 1
			VS9Z A 1
		Goto DeselectLoop
		UnZoomReload:
			VS9Z F 1 A_ZoomFactor(1.0)
			TNT1 A 0 A_PlaySound("Weapons/Scope", CHAN_WEAPON)
			VS9Z E 1 A_TakeInventory("VindicatorZoomed", 1)
			VS9Z D 1
			VS9Z C 1
			VS9Z B 1
			VS9Z A 1
		Goto ReloadZoomCont

		Flash:
			TNT1 A 4 Bright A_Light1
			TNT1 A 3 Bright A_Light2
		Goto LightDone
		Spawn:
			VS9P X -1
		Stop
	}
}

Actor VindicatorZoomed : DnD_Boolean { }

Actor FlakShellPuff : DnD_BasePuff {
	Renderstyle "Add"
	Alpha 1.0
	Scale 0.5
	
	Stamina 4096
	
	+ALWAYSPUFF
	States {
		Spawn:
			TNT1 AAAAA 0
		Regular:
			FP97 A 2 Bright A_PlaySound("Vindicator/PuffExp")
			TNT1 A 0 A_CustomMissile("FlakShellExplosion", 0, 0, 0, CMF_AIMDIRECTION | CMF_TRACKOWNER)
			FP97 BCDEFGHI 2 Bright
		Stop
		Crash:
		Melee:
		HitNoBlood:
			TNT1 A 0 A_JumpIfInTargetInventory("DnD_CritToken", 1, "Crit")
			TNT1 AAA 0 A_CustomMissile("FlakProjectile", 0, 0, 180 + frandom(-3.6, 3.6), CMF_SAVEPITCH | CMF_OFFSETPITCH | CMF_TRACKOWNER, 180 + frandom(-2.4, 2.4))
		Goto Regular
		Crit:
			TNT1 AAA 0 A_CustomMissile("FlakProjectile_Crit", 0, 0, 180 + frandom(-3.6, 3.6), CMF_SAVEPITCH | CMF_OFFSETPITCH | CMF_TRACKOWNER, 180 + frandom(-2.4, 2.4))
		Goto Regular
	}
}

Actor FlakShellPuff_GhostHitter : FlakShellPuff {
	States {
		Crash:
		Melee:
		HitNoBlood:
			TNT1 A 0 A_JumpIfInTargetInventory("DnD_CritToken", 1, "Crit")
			TNT1 AAA 0 A_CustomMissile("FlakProjectile_GhostHitter", 0, 0, 180 + frandom(-3.6, 3.6), CMF_SAVEPITCH | CMF_OFFSETPITCH | CMF_TRACKOWNER, 180 + frandom(-2.4, 2.4))
		Goto Regular
		Crit:
			TNT1 AAA 0 A_CustomMissile("FlakProjectile_GhostHitter_Crit", 0, 0, 180 + frandom(-3.6, 3.6), CMF_SAVEPITCH | CMF_OFFSETPITCH | CMF_TRACKOWNER, 180 + frandom(-2.4, 2.4))
		Goto Regular
	}
}

Actor FlakShellExplosion : DnD_ExplosiveBase {
	Speed 0
	+THRUACTORS
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_VINDICATOR |
				(DND_DMGID_3 << 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)
			TNT1 A 1 
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 1
		Stop
	}
}

ACTOR FlakProjectile : DnD_BaseFastProjectile {
	Height 4
	Radius 2
	RenderStyle "Add"
	Alpha 1.0
	Speed 48
	DeathSound "Vindicator/FlakExp"
	MissileType "FlakProjectileTrail"
	MissileHeight 4
	ReactionTime 8
	
	Damage(
		DND_WEAPON_VINDICATOR |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+THRUGHOST
	States {
		SpawnState:
			TNT1 A 1
		SpawnLoop:
			TNT1 A 0 A_CountDown
			DPTC A 1 Bright
		Loop
		Death:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_Jump(256, "1", "2", "3", "4")
		1:
			TNT1 A 2 A_CustomMissile("FlakProjectileExplosion1", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Stop
		2:
			TNT1 A 2 A_CustomMissile("FlakProjectileExplosion2", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Stop
		3:
			TNT1 A 2 A_CustomMissile("FlakProjectileExplosion3", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Stop
		4:
			TNT1 A 2 A_CustomMissile("FlakProjectileExplosion4", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Stop
	}
}

Actor FlakProjectile_Crit : FlakProjectile {
	Accuracy 69
	States {
		Death:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_Jump(256, "1", "2", "3", "4")
		1:
			TNT1 A 2 A_CustomMissile("FlakProjectileExplosion1_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Stop
		2:
			TNT1 A 2 A_CustomMissile("FlakProjectileExplosion2_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Stop
		3:
			TNT1 A 2 A_CustomMissile("FlakProjectileExplosion3_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Stop
		4:
			TNT1 A 2 A_CustomMissile("FlakProjectileExplosion4_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Stop
	}
}

Actor FlakProjectile_GhostHitter : FlakProjectile {
	-THRUGHOST
}

Actor FlakProjectile_GhostHitter_Crit : FlakProjectile_Crit {
	Accuracy 69
	-THRUGHOST
}

Actor FlakProjectileExplosion1 : DnD_ExplosiveBase {
	Speed 0
	Renderstyle "Add"
	Alpha 0.925
	Scale 0.35
	+THRUACTORS
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_VINDICATOR |
				(DND_DMGID_2 << 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:
			DEXP ABCDEFGHIJK 2 Bright
		Goto FinishExplosion
	}
}

Actor FlakProjectileExplosion1_Crit : FlakProjectileExplosion1 {
	Accuracy 69
}

Actor FlakProjectileExplosion2 : FlakProjectileExplosion1 {
	States {
		ContinueFromExplosion:
			DXP2 ABCDEFGHIJKLMNPQR 2 Bright
		Goto FinishExplosion
	}
}

Actor FlakProjectileExplosion2_Crit : FlakProjectileExplosion2 {
	Accuracy 69
}

Actor FlakProjectileExplosion3 : FlakProjectileExplosion1 {
	States {
		ContinueFromExplosion:
			DXP3 ABCDEFGHIJKLMNOP 2 Bright
		Goto FinishExplosion
	}
}

Actor FlakProjectileExplosion3_Crit : FlakProjectileExplosion3 {
	Accuracy 69
}

Actor FlakProjectileExplosion4 : FlakProjectileExplosion1 {
	States {
		ContinueFromExplosion:
			DXP4 ABCDEFGHIJKLMNOPQ 2 Bright
		Goto FinishExplosion
	}
}

Actor FlakProjectileExplosion4_Crit : FlakProjectileExplosion4 {
	Accuracy 69
}

Actor FlakProjectileTrail {
	RenderStyle Add
	Alpha 1.0
	+NOBLOCKMONST
	+NOTELEPORT
	+FORCEXYBILLBOARD
	+NOBLOCKMAP
	+NOGRAVITY
	+THRUACTORS
	+CLIENTSIDEONLY
	States {
		Spawn:
			DPTC BCDEFGHIJ 1 Bright
		Stop
	}
}

// Sprites by Eriance
Actor "Grenade Launcher" : RocketLauncher {
	Weapon.Slotnumber 5
    Inventory.PickupSound "weapons/pickup"
    Inventory.PickupMessage "You got the grenade launcher!"
	Weapon.AmmoType "Grenades"
	Weapon.AmmoGive 3
	Weapon.AmmoUse 0
	Obituary "%o was blown away by %k's grenade launcher!"
	+NOAUTOAIM
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_5_2_TAG"
    Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 1.6
    Weapon.BobRangeY 0.5
    Weapon.BobRangeX 0.9
   States
   {
   Spawn:
      NGLP A -1
      Stop
   Ready:
      NGLN A 1 A_WeaponReady
      Loop
   Deselect:
	  TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
      NGLN 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_1, 128, 0, DND_WEAPON_GRENADELAUNCHER)
	  TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 80, 0, DND_WEAPON_GRENADELAUNCHER)
   SelectLoop:
      NGLN A 1 A_Raise
	  TNT1 A 0 A_Raise
      Loop
   Fire:
	  TNT1 A 0 A_JumpIfInventory("SpecialAmmoMode_5X", AMMO_40MMSONIC, "ContinueFire")
	  TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_GRENADELAUNCHER, 0), "ContinueFire")
	  NGLN A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
   Goto Ready
   ContinueFire:
      NGLN D 3 Bright A_GunFlash
	  TNT1 A 0 A_PlayWeaponSound("weapons/glauncherfire")
      NGLN E 3 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_GRENADELAUNCHER, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_GRENADE << 16), 0)
      NGLN FGH 3 Bright
	  NGLN CI 2
	  NGLN B 2
	  NGLN A 4
      NGLN A 4 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
	Altfire:
		TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Weapon Can Switch Mode", AMMO_TYPE_GRENADE, SPWEP_GL), "ModeSwitch")
		NGLN A 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
	Goto Ready
	ModeSwitch:
		TNT1 A 0 A_JumpIfInventory("AmmoSwitchCooldown", 1, "NoAction")
		NGLN A 1 Offset(0, 41)
		TNT1 A 0 A_GiveInventory("AmmoSwitchCooldown", 1)
		TNT1 A 0 ACS_ExecuteAlways(DND_SPECIALAMMO_SCRIPT, 0, AMMO_TYPE_GRENADE, SPWEP_GL)
		NGLN A 1 Offset(0, 50)
		TNT1 A 0 ACS_ExecuteAlways(DND_SPECIALAMMOMSG_SCRIPT, 0)
		NGLN A 1 Offset(0, 59)
		NGLN A 1 Offset(0, 68)
		NGLN A 12 Offset(0, 77)
		NGLN A 1 Offset(0, 68)
		NGLN A 1 Offset(0, 56)
		NGLN A 1 Offset(0, 44)
		NGLN A 1 Offset(0, 32)
	Goto Ready
	NoAction:
		NGLN A 1 A_WeaponReady(WRF_NOSWITCH | WRF_NOFIRE)
	Goto Ready
   }
}

Actor "Upgraded Grenade Launcher" : RocketLauncher
{	
	Weapon.Slotnumber 5
    Inventory.PickupSound "weapons/pickup"
    Inventory.PickupMessage "You got the grenade launcher!"
	Weapon.AmmoType "Grenades"
	Weapon.AmmoGive 3
	Obituary "%o was blown away by %k's grenade launcher!"
	+NOAUTOAIM
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_5_11_TAG"
	Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 1.6
    Weapon.BobRangeY 0.5
    Weapon.BobRangeX 0.9
   States
   {
   Spawn:
      RTGL Z -1
      Stop
   Ready:
      RTGL A 1 A_WeaponReady
      Loop
   Deselect:
      TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
      RTGL 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, 192, 0, DND_WEAPON_ROTARYGRENADELAUNCHER)
	  TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 384, 0, DND_WEAPON_ROTARYGRENADELAUNCHER)
   SelectLoop:
      RTGL A 1 A_Raise
	  TNT1 A 0 A_Raise
      Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_ROTARYGRENADELAUNCHER, 0), "FireConfirmed")
			RTGL A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			RTGL BC 1 Bright A_GunFlash
			TNT1 A 0 A_PlayWeaponSound("weapons/glauncherfiren")
			TNT1 A 0 Radius_Quake(4,3,0,1,0)
			RTGL D 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_ROTARYGRENADELAUNCHER, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_GRENADE << 16), 0)
			RTGL EF 1 Bright
			TNT1 A 0 A_CheckReload
			RTGL G 1
			TNT1 A 0 A_PlaySound("weapons/glauncherload")
			RTGL GHH 1
			RTGL IJ 5
			RTGL K 2
			RTGL A 5 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 NormalGrenade : DnD_ExplosiveBase {
	speed 36
	BounceSound "weapons/grenadebounce"
	Scale 1.0
	Radius 8
	Height 16
	
	Damage(
		DND_WEAPON_GRENADELAUNCHER |
		(DND_DMGID_2 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+DONTBLAST
	+EXPLODEONWATER
	+THRUGHOST
	-NOGRAVITY
	BounceType Doom
	Bouncecount 3
	BounceFactor 0.625
	Gravity 0.75
	DeathSound "Weapons/grenadexpl"
	States {
		SpawnState:
			NGLP B 5 A_SpawnItem("GrenadeSmoke")
		Loop
		Death:
			TNT1 A 0 A_ChangeFlag("NOGRAVITY", 1)
			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_GRENADELAUNCHER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 144 * (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:
			MISL B 8 Bright
			MISL C 6 Bright
			MISL D 4 Bright	
		Goto FinishExplosion
	}
}

Actor NormalGrenade_GhostHitter : NormalGrenade {
	-THRUGHOST
}

Actor NewGrenade : NormalGrenade {
	Scale 0.55
	DeathSound "Weapons/grenadexpl2"
	Damage(
		DND_WEAPON_ROTARYGRENADELAUNCHER |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	States {
		SpawnState:
			NGLP C 5 A_SpawnItem("GrenadeSmoke")
		Loop
		Death:
			TNT1 A 0 A_ChangeFlag("NOGRAVITY", 1)
			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_ROTARYGRENADELAUNCHER |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_EXPLOSIVES << 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 17 A_SpawnItem("NewGrenadeExplosion")
		Goto FinishExplosion
	}
}

Actor NewGrenade_GhostHitter : NewGrenade {
	-THRUGHOST
}

// Another drop only weapon, Sprites by Eriance
ACTOR "Heavy Missile Launcher" : Weapon
{
   Inventory.PickupSound "weapons/pickup"
   Inventory.PickupMessage "You got the Heavy Missile Launcher!"
   Obituary "%o couldn't dodge %k's missiles."
   Weapon.AmmoType "MISAmmo"
   Weapon.AmmoType2 "MISAmmo"
   Weapon.AmmoGive 2
   Weapon.AmmoUse1 1
   Weapon.AmmoUse2 1
   Weapon.Slotnumber 5
   Weapon.SelectionOrder 1600
   +INVENTORY.UNDROPPABLE
	Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 1.6
    Weapon.BobRangeY 0.5
    Weapon.BobRangeX 0.9
	Tag "$WEP_5_12_TAG"
	+WEAPON.NOAUTOAIM
   States
   {
   Spawn:
      WMLN A -1
      Loop
   Ready:
      MLNG A 1 A_WeaponReady
      Loop
   Deselect:
      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:
      MLNG A 1 A_Lower
	  TNT1 A 0 A_Lower
      Loop
   Select:
      TNT1 A 0 A_GiveInventory("H_WeaponSlot5", 1)
	  TNT1 A 0 A_TakeInventory("DnD_RemoveLockOn", 1)
	  TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 192, 0, DND_WEAPON_HEAVYMISSILELAUNCHER)
	  TNT1 A 0 ACS_NamedExecuteAlways("DnD Homing Lock-on Draw", 0, 250, 250, 768)
	SelectLoop:
      MLNG A 1 A_Raise
	  TNT1 A 0 A_Raise
      Loop
   Fire:
   		TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_HEAVYMISSILELAUNCHER, 0), "FireConfirmed")
		MLNG A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
	  Goto Ready
   FireConfirmed:
      MLNG A 4
      MLNG D 0 Bright A_GunFlash
      MLNG D 4 Bright
	  TNT1 A 0 A_PlayWeaponSound("weapons/heavyrlfire")
	  TNT1 A 0 Radius_Quake(4,3,0,1,0)
      MLNG E 3 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_HEAVYMISSILELAUNCHER, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_HMISSILE << 16), 0)
	  MLNG FGHCB 3 Bright
	  MLNG A 2 
      MLNG A 2 A_Refire  
      Goto Ready
   AltFire:
		TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_HEAVYMISSILELAUNCHER, 0), "AltFireConfirmed")
		MLNG A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
	  Goto Ready
   AltFireConfirmed:
      MLNG A 4
      MLNG D 0 Bright A_GunFlash
      MLNG D 4 Bright
	  TNT1 A 0 A_PlayWeaponSound("weapons/heavyrlfire")
	  TNT1 A 0 Radius_Quake(4,3,0,1,0)
      MLNG E 3 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_HEAVYMISSILELAUNCHER, DND_ATK_PRIMARY | DND_ATK_OTHER_DIR, DND_AMMOSLOT_ROCKET | (AMMO_HMISSILE << 16), 0)
	  MLNG FGHCB 3 Bright
	  MLNG A 2 
      MLNG A 2 A_Refire  
      Goto Ready
   Flash:
      TNT1 A 5 A_Light1
      TNT1 A 6 A_Light2
      TNT1 A 5 A_Light1
      TNT1 A 0 A_Light0
      stop
   }
}

ACTOR HomRocket1 : DnD_ExplosiveBase {
	Radius 8
	Height 11
	Speed 32
	DeathSound "weapons/heavyrlexp"
	
	Damage(
		DND_WEAPON_HEAVYMISSILELAUNCHER |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_EXPLOSIVES << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+SeekerMissile
	+Rockettrail
	+THRUGHOST
	+FORCEXYBILLBOARD
	+EXPLODEONWATER
	+DONTBLAST
	+FORCERADIUSDMG
	SeeSound ""
	States {
		SpawnState:
			HMIS A 4 Bright
		SpawnLoop:
			TNT1 A 0 A_SpawnItemEx("DnD_RocketTrail", -12, 0, 10)
			HMIS AA 2 Bright A_SeekerMissile (10, 18, SMF_PRECISE | SMF_CURSPEED)
		Loop
		Death:
			TNT1 A 0 A_SetTranslucent (0.75,1)
			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_HEAVYMISSILELAUNCHER |
				(DND_DMGID_0 << 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)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			MACX A 2 Bright
			MACX BCDEFGHIJ 2 Bright
		Goto FinishExplosion
	}
}

Actor HomRocket1NH : HomRocket1 {
	-SEEKERMISSILE
}

Actor HomRocket1_GhostHitter : HomRocket1 {
	-THRUGHOST
}

Actor HomRocket1NH_GhostHitter : HomRocket1NH {
	-THRUGHOST
}

// Sprites by Yholl
ACTOR "Sedrin Staff" : Weapon {
	Inventory.PickupSound "weapons/pickup"
	Inventory.PickupMessage "You got the Sedrin Staff!"
	Obituary "%o couldn't dodge %k's missiles."
	Weapon.AmmoType "SedrinAmmo"
	Weapon.AmmoType2 "SedrinAmmo"
	Weapon.AmmoGive 5
	Weapon.AmmoUse1 0
	Weapon.AmmoUse2 0
	Weapon.Slotnumber 5
	Weapon.SelectionOrder 1000
	+INVENTORY.UNDROPPABLE
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 1.6
	Weapon.BobRangeY 0.4
	Weapon.BobRangeX 0.7
	Tag "$WEP_5_13_TAG"
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			TNT1 A 1
		Stop
	
		Ready:
			TNT1 A 0 A_PlaySound("SedrinStaff/idle", 7, 1.0, 1, 1.5)
			ARO2 AABBCCDDEEFF 1 A_WeaponReady
		Loop

		Select:
			TNT1 A 0 A_PlaySound("SedrinStaff/idle", 7, 1.0, 1, 1.5)
			TNT1 A 0 A_GiveInventory("H_WeaponSlot5", 1)
			TNT1 A 0 A_GiveInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 5, 15 | (20 << 16), DND_WEAPON_SEDRINSTAFF)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 96, 0, DND_WEAPON_SEDRINSTAFF)
			AROK T 1 A_Raise
			"####" "#" 0 A_Raise
			AROK T 1 A_Raise
			"####" "#" 0 A_Raise
		SelectLoop:
			AROK U 1 A_Raise
			"####" "#" 0 A_Raise
		Loop
		Deselect:
			TNT1 A 0 A_StopSound(7)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
			TNT1 A 0 A_TakeInventory("DnD_UsingEnergy", 1)
			AROK U 1 A_Lower
			"####" "#" 0 A_Lower
			AROK U 1 A_Lower
			"####" "#" 0 A_Lower
		DeselectLoop:
			AROK T 1 A_Lower
			"####" "#" 0 A_Lower
		Loop

		Dryfire:
			TNT1 A 0 A_StopSound(CHAN_7)
			AROK TUCCBABCCUT 1
		Goto Ready

		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_SEDRINSTAFF, 0), "FireConfirmed")
			ARO2 AA 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			AROK TUCCBABCCUT 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			AROK RSD 1
			AROK EFG 2
			TNT1 A 0 A_GunFlash ("Flash")
			TNT1 A 0 A_AlertMonsters
			TNT1 A 0 A_StopSound(CHAN_7)
			AROK HIJ 1 Bright
			TNT1 A 0 A_GunFlash ("FlashFire")
			TNT1 A 0 A_PlayWeaponSound("SedrinStaff/Fire")
			AROK K 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SEDRINSTAFF, DND_ATK_PRIMARY, DND_AMMOSLOT_ROCKET | (AMMO_SEDRIN << 16), 0)
			AROK L 1 A_SetPitch(pitch - 1.65)
			AROK L 1 A_SetPitch(pitch - 0.5)
			AROK L 1 A_SetPitch(pitch + 0.05)
			AROK L 1 A_SetPitch(pitch + 0.25)
			AROK M 1 A_SetPitch(pitch + 0.5)
			AROK M 1 A_SetPitch(pitch + 0.39)
			AROK N 1 A_SetPitch(pitch + 0.31)
			AROK N 1 A_SetPitch(pitch + 0.25)
			AROK O 1 A_SetPitch(pitch + 0.19)
			AROK O 1 A_SetPitch(pitch + 0.13)
			AROK P 1 A_SetPitch(pitch + 0.07)
			AROK P 1 A_SetPitch(pitch + 0.01)
			AROK Q 2
			ARO2 AABBCCDDEEFF 1 A_WeaponReady (WRF_NOBOB)
		Goto Ready
		
		AltFire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_SEDRINSTAFF, 0), "AltFireConfirmed")
			ARO2 AA 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			AROK TUCCBABCCUT 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		AltFireConfirmed:
			AROK RSD 1
			AROK EFG 2
			TNT1 A 0 A_GunFlash ("Flash")
			TNT1 A 0 A_AlertMonsters
			TNT1 A 0 A_StopSound(CHAN_7)
			AROK HIJ 1 Bright
			TNT1 A 0 A_GunFlash ("FlashFire")
			TNT1 A 0 A_PlayWeaponSound("SedrinStaff/Fire")
			AROK K 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SEDRINSTAFF, DND_ATK_SECONDARY, DND_AMMOSLOT_ROCKET | (AMMO_SEDRIN << 16), DND_ATF_CANFIRECIRCLE)
			AROK L 1 A_SetPitch(pitch - 1.65)
			AROK L 1 A_SetPitch(pitch - 0.5)
			AROK L 1 A_SetPitch(pitch + 0.05)
			AROK L 1 A_SetPitch(pitch + 0.25)
			AROK M 1 A_SetPitch(pitch + 0.5)
			AROK M 1 A_SetPitch(pitch + 0.39)
			AROK N 1 A_SetPitch(pitch + 0.31)
			AROK N 1 A_SetPitch(pitch + 0.25)
			AROK O 1 A_SetPitch(pitch + 0.19)
			AROK O 1 A_SetPitch(pitch + 0.13)
			AROK P 1 A_SetPitch(pitch + 0.07)
			AROK P 1 A_SetPitch(pitch + 0.01)
			AROK Q 2
			ARO2 AABBCCDDEEFF 1 A_WeaponReady (WRF_NOBOB)
		Goto Ready

		Flash:
			TNT1 AAAA 1 A_Light (random(1,4))
			TNT1 A 0 A_Light0
		Goto LightDone
		FlashFire:
			TNT1 A 1 A_Light (20)
			TNT1 A 1 A_Light (10)
			TNT1 A 1 A_Light (5)
			TNT1 A 1 A_Light (2)
			TNT1 A 1 A_Light (1)
			TNT1 A 0 A_Light0
		Goto LightDone
	}
}

Actor SedrinProjectile : DnD_ExplosiveBase {
	DeathSound "SedrinStaff/Hit"
	Radius 12
	Height 24
	Speed 36
	Renderstyle Add
	Scale 1.5
	
	Damage(
		DND_WEAPON_SEDRINSTAFF |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	Stamina 128
	
	+FORCERADIUSDMG
	States {
		SpawnState:
			ACID A 2 Bright A_SpawnItemEx("SedrinTrail", -12, 0, 0)
		Loop
		Death:
			TNT1 A 0 A_SpawnItemEx ("GreenSmallFlash", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AAAAAAAAA 0 A_SpawnItemEx("GreenParticleSlowVanish", 0, 0, 0, frandom(-1, 1), frandom(-1, 1), frandom(-1, 1))

			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_SEDRINSTAFF |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
				(100 << 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", 128)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF | DND_DAMAGEFLAG_INFLICTPOISON)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 0 A_SetScale(0.75, 0.75)
			BPLO ABC 2 Bright
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile", 0, 0, 60, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile", 0, 0, 120, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile", 0, 0, 180, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile", 0, 0, 240, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile", 0, 0, 300, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		FinishAnim:
			BPLO DEFGHIJKLM 2 Bright
		Goto FinishExplosion
		Crit:
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile_Crit", 0, 0, 60, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile_Crit", 0, 0, 120, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile_Crit", 0, 0, 180, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile_Crit", 0, 0, 240, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("SedrinSplitProjectile_Crit", 0, 0, 300, CMF_TRACKOWNER | CMF_AIMDIRECTION)
		Goto FinishAnim
	}
}

Actor SedrinSplitProjectile : SedrinProjectile {
	Radius 6
	Height 12
	Speed 24
	Renderstyle Add
	Scale 0.5
	ReactionTime 4
	+THRUACTORS
	
	States {
		SpawnState:
			ACID AA 2 Bright A_SpawnItemEx("SedrinTrail_Small", -12, 0, 0)
		Goto ExplosionSetup
		Spawn2:
			ACID AA 2 Bright A_SpawnItemEx("SedrinTrail_Small", -12, 0, 0)
		Goto Boom
		Spawn3:
			ACID AA 2 Bright A_SpawnItemEx("SedrinTrail_Small", -12, 0, 0)
		Goto Boom
		Spawn4:
			ACID AA 2 Bright A_SpawnItemEx("SedrinTrail_Small", -12, 0, 0)
		Goto Boom
		XDeath:
		Death:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_ChangeVelocity(0, 0, 0, CVF_REPLACE)
			TNT1 A 0 A_SpawnItemEx ("GreenSmallFlash_Smaller", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AA 0 A_SpawnItemEx("GreenParticleSlowVanish", 0, 0, 0, frandom(-1, 1), frandom(-1, 1), frandom(-1, 1))
		Stop
		ExplosionSetup:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_SEDRINSTAFF |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_POISON << DTYPE_SHIFT) |
				(50 << 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", 64)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_INFLICTPOISON)
		Boom:
			TNT1 A 0 A_SpawnItemEx("SedrinSmallExplosion")
			TNT1 A 0 A_CountDown
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 0 A_JumpIf(reactiontime == 3, "Spawn4")
			TNT1 A 0 A_JumpIf(reactiontime == 2, "Spawn3")
			TNT1 A 0 A_JumpIf(reactiontime == 1, "Spawn2")
			ACID A 1 Bright
		Goto Spawn2
	}
}

Actor SedrinSplitProjectile_Crit : SedrinSplitProjectile {
	Accuracy 69
}

Actor SedrinSmallExplosion {
	Renderstyle Add
	Scale 0.5
	+CLIENTSIDEONLY
	+NOINTERACTION
	States {
		Spawn:
			TNT1 A 0 NoDelay A_PlaySound("SedrinStaff/Hit")
			BPLO ABCDEFGHIJKLM 2 Bright
		Stop
	}
}

Actor SedrinTrail {
	Renderstyle Add
	Alpha 0.875
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			ACID BBBCCCDDDEEEFFF 1 Bright A_FadeOut(0.0175)
		Stop
	}
}

Actor SedrinTrail_Small : SedrinTrail {
	Scale 0.6
}

Actor TheHammer : Weapon {
	Inventory.PickupSound "weapons/pickup"
	Inventory.PickupMessage "You got the Hammer!"
	Obituary "%o couldn't dodge %k's missiles."
	Weapon.AmmoType1 "HammerThrowStrength"
	Weapon.AmmoType2 "HammerAmmo"
	Weapon.AmmoGive1 0
	Weapon.AmmoGive2 1
	Weapon.AmmoUse1 0
	Weapon.AmmoUse2 0
	Weapon.Slotnumber 5
	Weapon.SelectionOrder 1000
	+INVENTORY.UNDROPPABLE
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 1.45
	Weapon.BobRangeY 0.215
	Weapon.BobRangeX 0.325
	Tag "$WEP_5_4_TAG"
	+WEAPON.NOAUTOAIM
	+WEAPON.NOALERT
	States {
		Spawn:
			TNT1 A -1
		Stop
		Ready:
			TNT1 A 0 A_JumpIfInventory("HammerAmmo", 1, "ReadyAmmo")
		ReadyNoAmmo:
			TNT1 A 0 A_JumpIfInventory("HammerFetched", 1, "Fetch")
			FHMR H 1 A_WeaponReady
		Goto Ready
		Fetch:
			TNT1 A 0 A_TakeInventory("HammerFetched", 1)
			TNT1 A 0 A_TakeInventory("HammerReturnSignal", 1)
			FHMR I 1 Offset(8, 32)
			FHMR I 1 Offset(-9, 27)
			FHMR I 1 Offset(-24, 22)
			FHMR I 1 Offset(-36, 15)
			FHMR I 1 Offset(-48, 12)
			TNT1 A 0 A_PlayWeaponSound("Hammer/Fetched")
			FHMR I 1 Offset(-55, 11)
			FHMR I 1 Offset(-67, 10)
			TNT1 A 0 A_GiveInventory("HammerAmmo", 1)
			FHMR A 1 Bright Offset(-81, 50)
			FHMR A 1 Bright Offset(-83, 51)
			FHMR A 1 Bright Offset(-84, 49)
			FHMR A 1 Bright Offset(-78, 48)
			FHMR A 1 Bright Offset(-67, 45)
			FHMR A 1 Bright Offset(-55, 42)
			FHMR A 1 Bright Offset(-45, 38)
			FHMR A 1 Bright Offset(-31, 35)
			FHMR A 1 Bright Offset(-20, 34)
			FHMR A 1 Bright Offset(-10, 33)
		Goto ReadyAmmo
		ReadyAmmo:
			TNT1 A 0 A_TakeInventory("HammerFetched", 1)
			FHMR ABC 3 Bright A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot5", 1)
			TNT1 A 0 A_JumpIfInventory("HammerAmmo", 1, "DeselectAmmo")
		DeselectNoAmmo:
			FHMR H 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		DeselectAmmo:
			TNT1 A 0 A_TakeInventory("HammerFetched", 1)
			FHMR A 1 Bright A_Lower
			TNT1 A 0 A_Lower
			FHMR A 1 Bright A_Lower
			TNT1 A 0 A_Lower
			FHMR A 1 Bright A_Lower
			TNT1 A 0 A_Lower
			FHMR B 1 Bright A_Lower
			TNT1 A 0 A_Lower
			FHMR B 1 Bright A_Lower
			TNT1 A 0 A_Lower
			FHMR B 1 Bright 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, 25, 3 | (5 << 16), DND_WEAPON_HAMMER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 96, 0, DND_WEAPON_HAMMER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 180, 0, DND_WEAPON_HAMMER)
			TNT1 A 0 A_JumpIfInventory("HammerAmmo", 1, "SelectLoop")
		SelectNoAmmo:
			FHMR H 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		SelectLoop:
			TNT1 A 0 A_TakeInventory("HammerFetched", 1)
			FHMR A 1 Bright A_Raise
			TNT1 A 0 A_Raise
			FHMR A 1 Bright A_Raise
			TNT1 A 0 A_Raise
			FHMR A 1 Bright A_Raise
			TNT1 A 0 A_Raise
			FHMR B 1 Bright A_Raise
			TNT1 A 0 A_Raise
			FHMR B 1 Bright A_Raise
			TNT1 A 0 A_Raise
			FHMR B 1 Bright A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_HAMMER, 0), "FireConfirmed")
			FHMR HH 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto ReadyNoAmmo
		FireConfirmed:
			FHMR D 1 Bright Offset(1, 32) ACS_NamedExecuteWithResult("DnD Player Speed Slowdown", 1, 2)
			FHMR D 1 Bright Offset(4, 27)
			FHMR D 1 Bright Offset(9, 20)
			FHMR D 1 Bright Offset(16, 11)
			FHMR D 1 Bright Offset(25, 0)
		HammerHeld:
			TNT1 A 0 A_GiveInventory("HammerThrowStrength", 4)
			FHMR D 1 Bright Offset(25, 0)
			TNT1 A 0 A_Refire("HammerHeld")
			TNT1 A 0 A_PlayWeaponSound("Hammer/Throw")
			FHMR E 1 Bright Offset(25, 32) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_HAMMER, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			TNT1 A 0 A_AlertMonsters
			FHMR E 1 Bright Offset(19, 35)
			FHMR E 1 Bright Offset(13, 39)
			FHMR F 1 Bright Offset(10, 35)
			FHMR F 1 Bright Offset(5, 37)
			FHMR F 1 Bright Offset(0, 41)
			FHMR G 1 Bright Offset(-7, 41)
			FHMR G 1 Bright Offset(-15, 47)
			FHMR G 1 Bright Offset(-25, 69)
			FHMR G 1 Bright Offset(-37, 95)
			FHMR G 1 Bright Offset(-50, 120)
			TNT1 A 0 A_JumpIfInventory("HammerThrowStrength", 0, "ThrowHammer")
			TNT1 A 0 A_JumpIfInventory("HammerAmmo", 1, "FireAmmo")
		Goto FireNoAmmo
		ThrowHammer:
			FHMR G 1 Offset(5, 150)
			TNT1 A 0 A_GiveInventory("HammerRecallCooldown", 1)
			TNT1 A 0 A_TakeInventory("HammerReturnSignal", 1)
			FHMR G 2 Bright Offset(5, 150) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_HAMMER, DND_ATK_SECONDARY, DND_AMMOSLOT_ROCKET | (AMMO_HAMMER << 16), 0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Player Speed Slowdown", -1, -1)
			FHMR G 1 Bright Offset(5, 150) //Radius_Quake(4,3,0,1,0)
			TNT1 A 0 A_JumpIfInventory("HammerAmmo", 1, "FireAmmo")
		FireNoAmmo:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Player Speed Slowdown", -1, -1)
			TNT1 A 0 A_TakeInventory("HammerThrowStrength", 0)
			FHMR G 9 Offset(5, 150)
			FHMR H 1 Offset(0, 150)
			FHMR H 1 Offset(0, 120)
			FHMR H 1 Offset(0, 100)
			FHMR H 1 Offset(0, 85)
			FHMR H 1 Offset(0, 67)
			FHMR H 1 Offset(0, 52)
			FHMR H 1 Offset(0, 39)
		Goto Ready
		FireAmmo:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Player Speed Slowdown", -1, -1)
			TNT1 A 0 A_TakeInventory("HammerThrowStrength", 0)
			FHMR G 9 Offset(5, 150)
			FHMR B 1 Bright Offset(0, 60)
			FHMR B 1 Bright Offset(0, 55)
			FHMR B 1 Bright Offset(0, 50)
			FHMR C 1 Bright Offset(0, 45)
			FHMR C 1 Bright Offset(0, 40)
			FHMR C 1 Bright Offset(0, 35)
			FHMR A 1 Bright
		Goto Ready
		AltFire:
			TNT1 A 0 A_JumpIfInventory("HammerRecallCooldown", 1, "NoCatch")
		AltFireLoop:
			TNT1 A 0 A_JumpIfInventory("HammerAmmo", 1, "NoAlt")
			TNT1 A 0 A_JumpIFInventory("Ability_Kick", 1, "CanCatchHammer")
		Goto NoCatch
		CanCatchHammer:
			FHMR I 1 Offset(8, 32) A_JumpIfInventory("HammerFetched", 1, "Fetch")
			TNT1 A 0 A_GiveInventory("HammerReturnSignal", 1)
			FHMR I 1 Offset(8, 32) A_Refire
		Goto Ready
		NoCatch:
			FHMR H 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		NoAlt:
			FHMR ABC 3 Bright A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
	}
}

Actor HammerRecallCooldown : PowerDamage {
	damagefactor "normal", 1.0
	powerup.duration 17
}

Actor HammerThrowStrength : Ammo {
	inventory.amount 1
	inventory.maxamount 100
	ammo.backpackamount 0
	ammo.backpackmaxamount 100
	Inventory.Icon "STTPRCNT"
	+IGNORESKILL
}

Actor HammerReturnSignal : DnD_Boolean { }
Actor HammerFetched : DnD_Boolean { }
Actor HammerSeekDelay : DnD_Boolean { }

Actor HammerSeeker : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_JumpIfInventory("HammerSeekDelay", 1, "DoNothing")
			TNT1 A 0 A_SeekerMissile(45, 45, SMF_CURSPEED | SMF_PRECISE | SMF_LOOK)
			TNT1 A 0 A_JumpIfInventory("DnD_Character", 1, "Clear", AAPTR_TRACER)
			TNT1 A 0 A_CheckFlag("FRIENDLY", "Clear", AAPTR_TRACER)
			TNT1 A 0
		Stop
		ReturnToOwner:
			TNT1 A 0 A_GiveToTarget("HammerReturnSignal", 1)
		Stop
		Clear:
			TNT1 A 0 A_RearrangePointers(AAPTR_DEFAULT, AAPTR_DEFAULT, AAPTR_NULL)
		Stop
		DoNothing:
			TNT1 A 0
		Stop
	}
}

Actor HammerThruActors : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 1)
			TNT1 A 0 A_ChangeFlag("MISSILE", 1)
		Stop
	}
}

Actor HammerNoThruActors : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 0)
			TNT1 A 0 A_ChangeFlag("MISSILE", 1)
		Stop
	}
}

Actor HammerThrown : DnD_BaseProjectile {
	Radius 5
	Height 10
	Speed 36
	Scale 1.5
	
	Damage(
		DND_WEAPON_HAMMER |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_MELEE << DTYPE_SHIFT) |
		(80 << DPCT_SHIFT)
	)
	
	BounceType "Hexen"
	BounceCount 24
	BounceFactor 0.925
	WallBounceFactor 0.925
	var int user_bcount;
	var int user_lifetime;
	var int user_returndist;
	const int DND_HAMMER_CRITBOUNCES = 4;
	const int max_lifetime = 10;
	const int max_bounces = 8;
	+LOOKALLAROUND
	+USEBOUNCESTATE
	+FORCERADIUSDMG
	+DONTREFLECT
	+CANBOUNCEWATER
	+SKYEXPLODE
	+FOILINVUL
	+BOUNCEONACTORS
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_bcount", 0)
			TNT1 A 0 A_SetUserVar("user_returndist", ACS_NamedExecuteWithResult("DnD Get Melee Range Increase", 900, 1))
			TNT1 A 0 A_GiveInventory("DnD_ActorWorking", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Hammer Speed Limiter", 0, 40, 20)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Sync Hack Immediate", x, y, z)
		SpawnStateLoop:
			BHMR A 0 A_PlaySound("Hammer/Spin")
			BHMR A 2 Bright A_GiveInventory("HammerSeeker", 1)
			BHMR A 0 A_JumpIfInTargetInventory("HammerReturnSignal", 1, "Disappear")
			BHMR B 2 Bright A_GiveInventory("HammerSeeker", 1)
			BHMR B 0 A_JumpIfInTargetInventory("HammerReturnSignal", 1, "Disappear")
			BHMR C 2 Bright A_GiveInventory("HammerSeeker", 1)
			BHMR C 0 A_JumpIfInTargetInventory("HammerReturnSignal", 1, "Disappear")
			BHMR D 2 Bright A_GiveInventory("HammerSeeker", 1)
			BHMR D 0 A_JumpIfInTargetInventory("HammerReturnSignal", 1, "Disappear")
			BHMR E 2 Bright A_GiveInventory("HammerSeeker", 1)
			BHMR E 0 A_JumpIfInTargetInventory("HammerReturnSignal", 1, "Disappear")
			BHMR E 0 A_TakeInventory("HammerSeekDelay", 1)
			BHMR F 2 Bright A_GiveInventory("HammerSeeker", 1)
			BHMR F 0 A_JumpIfInTargetInventory("HammerReturnSignal", 1, "Disappear")
			BHMR G 2 Bright A_GiveInventory("HammerSeeker", 1)
			BHMR G 0 A_JumpIfInTargetInventory("HammerReturnSignal", 1, "Disappear")
			BHMR H 2 Bright A_GiveInventory("HammerSeeker", 1)
			BHMR H 0 A_JumpIfInTargetInventory("HammerReturnSignal", 1, "Disappear")
			BHMR H 0 A_SetUserVar("user_lifetime", user_lifetime + 1)
			BHMR H 0 A_JumpIf(user_lifetime == max_lifetime, "Death")
		Loop
		Bounce.Floor:
		Bounce.Ceiling:
		Bounce.Wall:
			"####" "#" 0 A_SetUserVar("user_bcount", user_bcount + 1)
			"####" "#" 0 A_JumpIf(user_bcount >= max_bounces, "Disappear")
			"####" "#" 2
		Goto SpawnStateLoop
		Bounce.Actor:
			"####" "#" 0 A_SetUserVar("user_lifetime", 0)
			"####" "#" 0 A_GiveInventory("HammerSeekDelay", 1)
			"####" "#" 0 A_GiveInventory("DnD_Boolean", 1)
			"####" "#" 0 A_ChangeFlag("SEEKERMISSILE", 1)
			"####" "#" 0 A_SetUserVar("user_bcount", user_bcount + 1)
			"####" "#" 0 A_PlaySound("Hammer/BounceOffActor", CHAN_5)
			"####" "#" 0 Radius_Quake(4,3,0,1,0)
		XDeath:
			"####" "#" 1
			"####" "#" 1 A_JumpIf(user_bcount >= DND_HAMMER_CRITBOUNCES, "Crit")
			"####" "#" 0 A_CustomMissile("HammerExplosion", 0, 0, 0, CMF_TRACKOWNER)
			"####" "#" 1 A_JumpIf(user_bcount >= max_bounces, "Disappear")
		Goto FinishAnim
		Death:
		Disappear:
			// died of natural reasons, take this away
			"####" "#" 0 A_TakeInventory("DnD_ActorWorking", 1)
			"####" "#" 0 A_TakeInventory("DnD_Boolean", 1)
			"####" "#" 0 A_Stop
			"####" "#" 0 A_ScaleVelocity(0)
			"####" "#" 1 A_CustomMissile("HammerReturn", 0, 0, 0, CMF_TRACKOWNER)
			TNT1 A 1
		Stop
		FinishAnim:
			"####" "#" 1 A_JumpIfInventory("DnD_Boolean", 1, "BounceReset")
		Stop
		Crit:
			"####" "#" 0 A_CustomMissile("HammerBoomer",0,0,0,CMF_TRACKOWNER)
			"####" "#" 0 A_CustomMissile("HammerBoomer",0,0,45, CMF_TRACKOWNER)
			"####" "#" 0 A_CustomMissile("HammerBoomer",0,0,90, CMF_TRACKOWNER)
			"####" "#" 0 A_CustomMissile("HammerBoomer",0,0,135, CMF_TRACKOWNER)
			"####" "#" 0 A_CustomMissile("HammerBoomer",0,0,180, CMF_TRACKOWNER)
			"####" "#" 0 A_CustomMissile("HammerBoomer",0,0,225, CMF_TRACKOWNER)
			"####" "#" 0 A_CustomMissile("HammerBoomer",0,0,270, CMF_TRACKOWNER)
			"####" "#" 0 A_CustomMissile("HammerBoomer",0,0,315, CMF_TRACKOWNER)
			"####" "#" 1 A_JumpIf(user_bcount >= max_bounces, "Disappear")
		Goto FinishAnim
		BounceReset:
			"####" "#" 1 A_RearrangePointers(AAPTR_DEFAULT, AAPTR_DEFAULT, AAPTR_NULL)
		Goto SpawnStateLoop
	}
}

Actor HammerExplosion : DnD_ExplosiveBase {
	Renderstyle Add
	Alpha 0.9
	Scale 1.5
	+NOINTERACTION
	+FORCERADIUSDMG
	+FOILINVUL
	+DONTREFLECT
	+NOCLIP
	States {
		SpawnState:
			TNT1 A 0 A_PlaySound("Hammer/Exp")
			MACX C 3 Bright
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_HAMMER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_FIRE << 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", 48)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 0 A_SpawnItemEx ("ExplosionFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AAAAAAAAA 0 A_CustomMissile ("ExplosionParticleHeavy", 0, 0, random (0, 360), 2, random (0, 180))
			TNT1 AAAAAAAAA 0 A_CustomMissile ("ExplosionParticleVeryFast", 0, 0, random (0, 360), 2, random (0, 360))
			MACX DEFGHIJ 3 Bright
		Goto FinishExplosion
	}
}

Actor HammerExplosion_Crit : DnD_ExplosiveBase {
	Renderstyle Add
	Alpha 0.9
	Scale 0.8
	+FOILINVUL
	+FORCERADIUSDMG
	+NOINTERACTION
	+NOCLIP
	States {
		SpawnState:
			MSP1 G 3 Bright //ACS_NamedExecuteWithResult("DnD Set to Crit")
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_HAMMER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_FIRE << DTYPE_SHIFT) |
				(10 << 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", 24)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 0 A_SpawnItemEx ("ExplosionFlareSmall", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AA 0 A_CustomMissile("RocketSmokeSmall", 0, 0, random(0, 360), 2, random(0, 180))
			TNT1 AAAA 0 A_CustomMissile("RocketSmokeSmall", 0, 0, random(0, 360), 2, random(0, 360))
			TNT1 AAA 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))
		
			MSP1 H 3 Bright Radius_Quake(5, 8, 0, 2, 0)
			MSP1 IJKLMNOP 3 Bright
		Goto FinishExplosion
	}
}

ACTOR HammerBoomer {
	Radius 8
	Height 8
	Speed 9
	Damage 0
	PROJECTILE
	+THRUACTORS
	+BLOODLESSIMPACT
	+DONTSPLASH
	+DONTBLAST
	SeeSound "Hammer/BigExp"
	States {
		Spawn:
			TNT1 A 4
			TNT1 AAA 6 A_CustomMissile("HammerExplosion_Crit", 0, 0, 0, CMF_TRACKOWNER)
		Stop
		Death:
			TNT1 A 1
		Stop
	}
}

Actor HammerReturn {
	PROJECTILE
	Speed 48
	Radius 1
	Height 2
	BounceType "Hexen"
	BounceCount 4
	const float spd = 48.0;
	const float grab_range_dist = 240.0;
	+THRUACTORS
	+CANBOUNCEWATER
	+SKYEXPLODE
	+NOINTERACTION
	+NOCLIP
	States {
		Spawn:
			TNT1 A 0 NoDelay A_GiveInventory("DnD_ActorWorking", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Hammer Return")
		SpawnLoop:
			BHMR A 2 Bright A_JumpIfCloser(grab_range_dist, "Returned")
			TNT1 A 0 A_FaceTarget(30, 0)
			TNT1 A 0 A_ChangeVelocity(spd * cos(angle), spd * sin(angle), velz, CVF_REPLACE)
			BHMR B 2 Bright A_JumpIfCloser(grab_range_dist, "Returned")
			TNT1 A 0 A_FaceTarget(30, 0)
			TNT1 A 0 A_ChangeVelocity(spd * cos(angle), spd * sin(angle), velz, CVF_REPLACE)
			BHMR C 2 Bright A_JumpIfCloser(grab_range_dist, "Returned")
			TNT1 A 0 A_FaceTarget(30, 0)
			TNT1 A 0 A_ChangeVelocity(spd * cos(angle), spd * sin(angle), velz, CVF_REPLACE)
			BHMR D 2 Bright A_JumpIfCloser(grab_range_dist, "Returned")
			TNT1 A 0 A_FaceTarget(30, 0)
			TNT1 A 0 A_ChangeVelocity(spd * cos(angle), spd * sin(angle), velz, CVF_REPLACE)
			BHMR E 2 Bright A_JumpIfCloser(grab_range_dist, "Returned")
			TNT1 A 0 A_FaceTarget(30, 0)
			TNT1 A 0 A_ChangeVelocity(spd * cos(angle), spd * sin(angle), velz, CVF_REPLACE)
			BHMR F 2 Bright A_JumpIfCloser(grab_range_dist, "Returned")
			TNT1 A 0 A_FaceTarget(30, 0)
			TNT1 A 0 A_ChangeVelocity(spd * cos(angle), spd * sin(angle), velz, CVF_REPLACE)
			BHMR G 2 Bright A_JumpIfCloser(grab_range_dist, "Returned")
			TNT1 A 0 A_FaceTarget(30, 0)
			TNT1 A 0 A_ChangeVelocity(spd * cos(angle), spd * sin(angle), velz, CVF_REPLACE)
			BHMR H 2 Bright A_JumpIfCloser(grab_range_dist, "Returned")
			TNT1 A 0 A_FaceTarget(30, 0)
			TNT1 A 0 A_ChangeVelocity(spd * cos(angle), spd * sin(angle), velz, CVF_REPLACE)
		Loop
		Death:
		Returned:
			"####" "#" 0 A_TakeInventory("DnD_ActorWorking", 1)
			"####" "#" 0 A_GiveToTarget("HammerFetched", 1)
			"####" "###" 2 Bright A_FaceTarget(90)
		Stop
	}
}

Actor BigHammerPuff : DnD_BasePuff {
	AttackSound "weapons/swingwall"
	SeeSound "weapons/swinghit"
	Alpha 0.8
	Scale 0.9
	
	Stamina 4096
	
	States {
		Spawn:
			TNT1 AAAA 0
			TNT1 A 0 Radius_Quake(5, 8, 0, 2, 0)
			VFX2 ABCDE 4
		Stop
		Crash:
		HitNoBlood:
			TNT1 A 0 Radius_Quake(5, 8, 0, 2, 0)
			VFX2 ABCDE 4
		Stop
	}
}