// Actor code by TheUltimateDoomer, sprites by Eriance, modified by TheUltimateDoomer and me
ACTOR "Death Staff" : Weapon {  
	Weapon.SelectionOrder 666  
	Weapon.AmmoType "Souls" 
	Weapon.AmmoGive 15
	Weapon.AmmoUse 1
	Weapon.SlotNumber 8
	Weapon.KickBack 150
	Inventory.PickupMessage "Death Staff now serves your will... for now."
	+INVENTORY.UNDROPPABLE
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.1
	Weapon.BobRangeY 0.4
	Weapon.BobRangeX 0.7
	Tag "$WEP_8_0_TAG"
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			LICS Y -1
			Stop
		Ready: 
			LICS A 1 A_WeaponReady 
			Loop 
		Deselect: 
			TNT1 A 0 A_TakeInventory("P_PurpleFire", 1)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot8", 1)
			LICS A 1 A_Lower 
			TNT1 A 0 A_Lower
			Loop 
		Select: 
			TNT1 A 0 A_GiveInventory("P_PurpleFire", 1)
			TNT1 A 0 A_GiveInventory("H_WeaponSlot8", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 128, 0, DND_WEAPON_DEATHSTAFF)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 200, 2 | (3 << 16), DND_WEAPON_DEATHSTAFF)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 8, 16 | (24 << 16), DND_WEAPON_DEATHSTAFF)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_3, 1, 6 | (12 << 16), DND_WEAPON_DEATHSTAFF)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_4, 1, 0, DND_WEAPON_DEATHSTAFF)
		SelectLoop:
			LICS A 1 A_Raise
			TNT1 A 0 A_Raise
			Loop 
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_DEATHSTAFF, 0), "FireConfirmed")
			LICS A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			LICS BCD 4 Bright
			TNT1 A 0 A_PlayWeaponSound ("weapons/deathstfire")
			TNT1 A 0 A_GunFlash
			TNT1 A 0 Radius_Quake(4,2,0,1,0)
			LICS E 4 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DEATHSTAFF, DND_ATK_PRIMARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_NOAMMOGAINCHECK)
			LICS DCBA 4 Bright
			Goto Ready
		AltFire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_DEATHSTAFF, 1), "AltFireConfirmed")
			LICS A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		AltFireConfirmed:
			LICS F 1 
			TNT1 A 0 A_PlayWeaponSound ("weapons/deathstfire2")
			LICS GHI 1
			LICX AB 1
			LICS JKLMNOPQRSTU 1 Bright
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_PlayWeaponSound ("weapons/deathstfire")
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD On Attack", 0)
			//TNT1 A 0 ACS_NamedExecuteAlways("DnD Ammo Gain Chance", 0, DND_AMMOSLOT_SOULS, AMMO_SOUL, 9)
			TNT1 A 0 A_JumpIfInventory("ArtemisCheck", 1, "NoTake")
			TNT1 A 0 A_TakeInventory("Souls", 9)
		NoTake:
			TNT1 A 0 Radius_Quake(12,4,0,1,0)
			LICS V 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DEATHSTAFF, DND_ATK_SECONDARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_CANFIRECIRCLE | DND_ATF_NOAMMOGAINCHECK)
			LICS E 3 Bright
			LICS DCBA 4 Bright
			Goto Ready
		Flash:
			TNT1 A 3 A_Light2
			TNT1 A 3 A_Light0
			Goto LightDone
	}
}

ACTOR VolcanoFireball5 : DnD_ExplosiveBase {
	Radius 16
	Height 32
	Speed 40
	SeeSound "weapons/deathstfire"
	DeathSound "weapons/deathstexp1"
	Decal "Scorch"
	
	Damage(
		DND_WEAPON_DEATHSTAFF |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+DONTSPLASH
	States {
		SpawnState:
			VOL3 AB 4 BRIGHT A_SpawnItemEx("LichPuff",0,0,0,0,0,0,0,0,0)
		Loop
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_DEATHSTAFF |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
				(200 << 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:
			TNT1 A 0 A_SpawnItemEx ("DeathStaffFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball6", 8, 0, 0, CMF_TRACKOWNER, 64)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball7", 8, 0, 72, CMF_TRACKOWNER, 56)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball8", 8, 0, 144, CMF_TRACKOWNER, 48)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball7", 8, 0, 216, CMF_TRACKOWNER, 56)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball6", 8, 0, 288, CMF_TRACKOWNER, 64)

			VOL3 C 0 A_CustomMissile ("VolcanoFireball8", 8, 0, 24, CMF_TRACKOWNER, 64)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball6", 8, 0, 96, CMF_TRACKOWNER, 56)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball7", 8, 0, 168, CMF_TRACKOWNER, 48)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball6", 8, 0, 240, CMF_TRACKOWNER, 56)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball8", 8, 0, 312, CMF_TRACKOWNER, 64)

			VOL3 C 0 A_CustomMissile ("VolcanoFireball7", 8, 0, 48, CMF_TRACKOWNER, 64)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball8", 8, 0, 120, CMF_TRACKOWNER, 56)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball6", 8, 0, 192, CMF_TRACKOWNER, 48)
			VOL3 C 0 A_CustomMissile ("VolcanoFireball8", 8, 0, 264, CMF_TRACKOWNER, 56)
			VOL3 C 2 BRIGHT A_CustomMissile ("VolcanoFireball7", 8, 0, 336, CMF_TRACKOWNER, 64)
			VOL3 DEFGH 2 BRIGHT
			TNT1 A 0 A_PlaySound ("weapons/burning", CHAN_7, 1.0, 1)
			TNT1 A 372
			TNT1 A 1 A_StopSound(CHAN_7)
		Stop
	}
}

ACTOR VolcanoFireball6 : DnD_BaseProjectile {
	Radius 8
	Height 16
	Speed 5
	
	Damage(
		DND_WEAPON_DEATHSTAFF |
		(DND_DMGID_3 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+RIPPER
	-BLOODSPLATTER
	+BLOODLESSIMPACT
	-NOGRAVITY
	+DONTSPLASH
	Gravity 0.2
	DeathSound "weapons/deathstexp2"
	States {
		SpawnState:
			VOL4 ABABABABABAB 4 BRIGHT
			TNT1 A 0 A_Die
		Death:
			TNT1 A 0 A_CustomMissile("VolcanoFireball6Fire", 0, 0, 180, CMF_TRACKOWNER | CMF_AIMDIRECTION, 0)
			VOL4 EDCDEFG 2 BRIGHT
		Stop
	}
}

Actor VolcanoFireball6Exp : DnD_ExplosiveBase {
	Speed 0
	+THRUACTORS
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_DEATHSTAFF |
				(DND_DMGID_4 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_SOUL << 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", 0)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 3
		stop
	}
}

Actor VolcanoFireball6NOFIRE_Fall : VolcanoFireball6 {
	Damage (
		DND_WEAPON_DEATHSTAFF |
		(DND_DMGID_4 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	DamageType "SoulType"
	Species "Player"
	+THRUSPECIES
	+NOGRAVITY
	+NODAMAGETHRUST
	+RANDOMIZE
	States {
		SpawnState:
			VOL4 A 1 BRIGHT ThrustThingZ(0, 8, 1, 1)
			VOL4 A 1 BRIGHT
			VOL4 A 1 BRIGHT ThrustThingZ(0, 8, 1, 1)
			VOL4 A 1 BRIGHT
			VOL4 B 1 BRIGHT ThrustThingZ(0, 8, 1, 1)
			VOL4 B 1 BRIGHT
			VOL4 B 1 BRIGHT ThrustThingZ(0, 8, 1, 1)
			VOL4 B 1 BRIGHT
		Loop
		Death:
			TNT1 A 0 A_CustomMissile("VolcanoFireball6Exp", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			VOL4 EDCDEFG 2 BRIGHT
		Stop
	}
}

Actor VolcanoFireball6NOFIRE_Rise : VolcanoFireball6NOFIRE_Fall {
	States {
		SpawnState:
			VOL4 A 1 BRIGHT ThrustThingZ(0, 8, 0, 1)
			VOL4 A 1 BRIGHT 
			VOL4 A 1 BRIGHT ThrustThingZ(0, 8, 0, 1)
			VOL4 A 1 BRIGHT
			VOL4 B 1 BRIGHT ThrustThingZ(0, 8, 0, 1)
			VOL4 B 1 BRIGHT
			VOL4 B 1 BRIGHT ThrustThingZ(0, 8, 0, 1)
			VOL4 B 1 BRIGHT
		Loop
	}
}

ACTOR VolcanoFireball7 : VolcanoFireball6  {
	Speed 4
}

ACTOR VolcanoFireball8 : VolcanoFireball6 {
	Speed 3
}

ACTOR VolcanoFireball6Fire : DnD_BaseProjectile {
	Radius 15
	Height 38
	Speed 1
	Scale 1.0
	BounceFactor 0.0
	
	Damage(
		DND_WEAPON_DEATHSTAFF |
		(DND_DMGID_4 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
		(50 << DPCT_SHIFT)
	)
	
	Stamina 8
	
	-NOGRAVITY
	+HEXENBOUNCE
	+RIPPER
	+BLOODLESSIMPACT
	+DONTSPLASH
	var int user_count;
	States {
		SpawnState:
			FFLG A 0 Thing_Stop(0)
			TNT1 A 0 A_SetUserVar("user_count", 7)
			TNT1 A 0 A_Jump(256, "F1", "F2", "F3", "F4")
		F1:
			FFLG A 4 BRIGHT
		F2:
			FFLG B 4 BRIGHT
		F3:
			FFLG C 4 BRIGHT
		F4:
			FFLG D 4 BRIGHT
		FireLoop:
			FFLG EFGHIJKLMNOP 4
			TNT1 A 0 A_SetUserVar("user_count", user_count - 1)
			TNT1 A 0 A_JumpIf(user_count > 0, "FireLoop")
		Goto Death
		Death:
			FFLG EDCBA 4 BRIGHT
		Stop
	}
}

ACTOR LichPuff : PhoenixPuff {
	Scale 2.0
}

Actor HellFireLinkF : DnD_ExplosiveBase {
	Radius 6
	Height 12
	Speed 24
	Alpha 0.85
	Renderstyle add
	Reactiontime 1
	
	Damage(
		DND_WEAPON_DEATHSTAFF |
		(DND_DMGID_2 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+NODAMAGETHRUST
	+FOILINVUL
	+FLOORHUGGER
	+DONTSPLASH
	States {
		SpawnState:
			TNT1 A 0
			TNT1 AAAAAAAAAA 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 A_CountDown
		Loop
		Death:
			TNT1 A 0 A_Stop
			TNT1 A 0 A_PlaySound("weapons/deathstexp2")
			TNT1 A 0 A_SpawnItemEx ("DeathStaffFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_DEATHSTAFF |
				(DND_DMGID_4 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_SOUL << 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:
			FX13 I 4 Bright
			FX13 JJJJKKKKLLLLMMMM 1 Bright A_SpawnItemEx("VolcanoFireball6NOFIRE_Rise", random(-2,2), random(-2,2), 0, random(-4,4), random(-4,4))
		Stop
	}
}

Actor HellFireLinkC : HellFireLinkF {
	-FLOORHUGGER
	+CEILINGHUGGER
	States {
		SpawnState:
			TNT1 A 0
			TNT1 AAAAAAAAAA 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 A_CountDown
		Loop
		ContinueFromExplosion:
			FX1U I 4 Bright
			FX1U JJJJKKKKLLLLMMMM 1 Bright A_SpawnItemEx("VolcanoFireball6NOFIRE_Fall", random(-2,2), random(-2,2), -16, random(-4,4), random(-4,4))
		Stop
	}	
}

Actor HellFireLinkFL : HellFireLinkF {
	States {
		SpawnState:
			TNT1 A 0
			TNT1 AAAAAA 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360+64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360+64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360+64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360+64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 A_CountDown
		Loop
	}
}

Actor HellFireLinkFR : HellFireLinkFL {
	States {
		SpawnState:
			TNT1 A 0
			TNT1 AAAAAA 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360-64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360-64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360-64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360-64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailF", random(-4,4), random(-4,4))
			TNT1 A 0 A_CountDown
		Loop
	}
}

Actor HellFireLinkCL : HellFireLinkC {
	States {
		SpawnState:
			TNT1 A 0
			TNT1 AAAAAA 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360+64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360+64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360+64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360+64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 A_CountDown
		Loop
	}
}

Actor HellFireLinkCR : HellFireLinkCL {
	States {
		SpawnState:
			TNT1 A 0
			TNT1 AAAAAA 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360-64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360-64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360-64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 ThrustThing(angle*256/360-64, 8, 0, 0)
			TNT1 A 2 Bright A_SpawnItemEx("HellFireTrailC", random(-4,4), random(-4,4))
			TNT1 A 0 A_CountDown
		Loop	
	}
}

Actor HellFireTrailFExp : DnD_ExplosiveBase {
	Speed 0
	+THRUACTORS
	var int user_count;
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 1 A_SetUserVar("user_count", 9)
			TNT1 A 0 A_SetUserVar("user_expradius", 72 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 0)
		
		ExplosionLoop:		
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_DEATHSTAFF |
				(DND_DMGID_4 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
				((random(600, 800) << DPCT_SHIFT))
			)
			TNT1 A 3
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 1
			TNT1 A 1 A_JumpIf(user_count > 0, "Finish")
		Stop
		Finish:
			TNT1 A 0
		Stop
	}
}

ACTOR HellFireTrailF : HellFireLinkF {
  Radius 8
  Height 16
  Speed 0
  States
  {
  SpawnState:
	TNT1 A 0 A_CustomMissile("HellFireTrailFExp", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
    FX13 DC 4 Bright 
    FX13 BCDE 5 Bright
    FX13 FGH 4 Bright
    Stop
  }
}

Actor HellFireTrailC : HellFireTrailF
{
	-FLOORHUGGER
	+CEILINGHUGGER
  States
  {
  SpawnState:
	TNT1 A 0 A_CustomMissile("HellFireTrailFExp", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
    FX1U DC 4 Bright
    FX1U BCDE 5 Bright
    FX1U FGH 4 Bright
    Stop
  }	
}

ACTOR Razorfang : Weapon {
	Inventory.PickupSound "misc/haha"
	Inventory.PickupMessage "You got the Razorfang."
	Obituary "%o was torn apart by %k's Razorfang."
	Weapon.AmmoType "Souls"
	Weapon.AmmoGive 15
	Weapon.SelectionOrder 40
	Weapon.AmmoUse 2
	Weapon.SlotNumber 8
	+INVENTORY.UNDROPPABLE
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.1
	Weapon.BobRangeY 0.4
	Weapon.BobRangeX 0.7
	Tag "$WEP_8_1_TAG"
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			WRAZ A -1
		Loop
		Ready:
			TNT1 A 0 A_GiveInventory("DnD_RemoveLockOn", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Clear Homing Lock-on", 0)
		ReadyLoop:
			RAZG A 0 A_JumpIfInventory("RazorCount", 1, "ReadyHoming")
			RAZG BCDEFG 3 A_weaponReady
		Loop
		ReadyHoming:
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Homing Lock-on Draw", 0, 480, 480, 160)
		ReadyHomingLoop:
			RAZG HIJKJI 3 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("P_PlasmaFire", 1)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot8", 1)
			TNT1 A 0 A_GiveInventory("DnD_RemoveLockOn", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Clear Homing Lock-on", 0)
		DeselectLoop:
			RAZG 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_WeaponSlot8", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 12, 4 | (6 << 16), DND_WEAPON_RAZORFANG)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 2, 6 | (9 << 16), DND_WEAPON_RAZORFANG)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 1, 16 | (20 << 16), DND_WEAPON_RAZORFANG)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_3, 64, 0, DND_WEAPON_RAZORFANG)
		SelectLoop:
			RAZG A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		DisabledFiring:
			RAZG A 0 A_JumpIfInventory("RazorCount",1, "DisabledFiring2")
			RAZG B 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		DisabledFiring2:
			RAZG H 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		Fire:
			RAZG E 0 A_JumpIfInventory("RazorCount", 1, "Secondary")
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_RAZORFANG, 0), "FireConfirmed")
			RAZG B 3 A_WeaponReady(WRF_NOFIRE)
			RAZG CDEFG 3 A_weaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			RAZG L 1 A_Playsound("weapons/boltfi")
			RAZX AB 2
			TNT1 A 0 A_GunFlash
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_RAZORFANG, DND_ATK_PRIMARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_CANFIRECIRCLE | DND_ATF_NOAMMOGAINCHECK)
			RAZG M 1 Bright A_SetPitch(pitch - 6.0)
			RAZG M 1 Bright A_SetPitch(pitch + 0.5)
			RAZX CCDDEEFFGGH 1 Bright A_SetPitch(pitch + 0.5)
			RAZX H 1 Bright
			RAZX IJ 2 Bright
			RAZG A 4
		Goto Ready
		Secondary:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_RAZORFANG, 1), "AltFireConfirmed")
			RAZG H 3 A_WeaponReady(WRF_NOFIRE)
			RAZG IJKJI 3 A_weaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		AltFireConfirmed:
			RAZG N 1 A_Playsound("weapons/boltf2")
			RAZX KL 2
			TNT1 A 0 A_GunFlash
			TNT1 A 0 Radius_Quake(4,2,0,1,0)
			RAZG O 3 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_RAZORFANG, DND_ATK_SECONDARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_CANFIRECIRCLE | DND_ATF_NOAMMOGAINCHECK)
			RAZX MN 2 Bright
			RAZG P 2 Bright
			RAZX QRS 2 Bright 
			RAZG JIH 2 Bright
		Goto ReadyLoop
		AltFire:
			TNT1 A 0 A_JumpIfInventory("ArtemisCheck", 1, "DisabledFiring")
			RAZG A 0 A_JumpIfInventory("RazorCount", 1, "FireHoming")
			RAZG A 0 A_GiveInventory("RazorCount",1)
			TNT1 A 0 A_TakeInventory("DnD_RemoveLockOn", 1)
			RAZG A 2 A_PlaySound("door/flsd1a")
			RAZG HIJK 4
		Goto ReadyLoop
		FireHoming:
			RAZG A 0 A_TakeInventory("RazorCount",1)
			RAZG A 2 A_PlaySound("door/flsd1a")
			RAZG KJIH 4
		Goto Ready
		Flash:
			TNT1 A 4 A_Light2
			TNT1 A 4 A_Light0
		Goto LightDone
	}
}

ACTOR RazorShot1 : DnD_BaseProjectile {
	Radius 4
	Height 8
	Speed 50
	
	Damage(
		DND_WEAPON_RAZORFANG |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+THRUGHOST
	+RIPPER
	+FORCEXYBILLBOARD
	DeathSound "weapons/glahit"
	States {
		SpawnState:
			RFX1 PPPPPPPP 1 Bright A_SpawnItemEx("BoneTrail",0,0,0,0,0,0,0,128,0)
			TNT1 AAAAAAAAA 0 A_SpawnItemEx("RazorShot2",0,0,0,25,random(-6,6),(momz*0.5)+random(-3,3),0,0,0)
		stop
		Death:
			RFX1 L 0 Bright A_SetTranslucent(0.67,1)
			RFX1 LMNO 4 Bright
		stop
	}
}

ACTOR RazorShot2 : DnD_BaseProjectile {
	Radius 2
	Height 4
	Speed 35
	
	Damage(
		DND_WEAPON_RAZORFANG |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+THRUGHOST
	+FORCEXYBILLBOARD
	+DONTBLAST
	DeathSound "weapons/thornx"
	States {
		SpawnState:
			RFX1 A 1 Bright A_SpawnItemEx("RazorTrail",0,0,0,0,0,0,0,128,0)
		loop
		Death:
			RFX1 G 0 Bright A_SetTranslucent(0.67,1)
			RFX1 GHIJCDEF 3 Bright
		stop
	}
}

ACTOR Razortrail
{   
   Radius 1
   Height 1
   RENDERSTYLE ADD
   ALPHA 0.50
   +NOGRAVITY
   +NOBLOCKMAP
   +FORCEXYBILLBOARD
   States
   {
   Spawn:
      RFX1 BCDEF 3 Bright
      Stop 
   }
}

Actor RazorSkullExp : BaseExplosionDamage {
	Speed 0
	+THRUACTORS
	+FORCERADIUSDMG
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_RAZORFANG |
				(DND_DMGID_3 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 40)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 0)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 1
		Stop
	}
}

ACTOR RazorSkull : DnD_BaseProjectile {
	Radius 8
	Height 11
	Speed 25
	Damage (
		DND_WEAPON_RAZORFANG |
		(DND_DMGID_2 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	ReactionTime 210
	BounceFactor 1
	+SEEKERMISSILE
	+RIPPER
	+DOOMBOUNCE
	+SCREENSEEKER
	+FORCEXYBILLBOARD
	DeathSound "monster/dishht1"
	States {
		SpawnState:
			RFX1 KKKKKKKKK 1 Bright A_SpawnItemEx("BoneTrail",0,0,0,0,0,0,0,128,0)
		SpawnLoop:
			RFX1 K 1 Bright A_SpawnItemEx("BoneTrail",0,0,0,0,0,0,0,128,0)
			RFX1 K 0 A_SeekerMissile(32, 32, SMF_PRECISE | SMF_CURSPEED)
			RFX1 K 0 A_CustomMissile("RazorSkullExp", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			RFX1 K 0 A_Countdown
		Loop
		Death:
			TNT1 A 0 A_SetTranslucent(0.67,1)
			RFX1 LMNO 4 Bright
		stop
	}
}

ACTOR Bonetrail
{
   Radius 1
   Height 1
   Damage 0
   Scale 0.5
   +NOGRAVITY
   +NOBLOCKMAP
   +FORCEXYBILLBOARD
   RENDERSTYLE ADD
   ALPHA 0.50
   States
   {
   Spawn:
      BONE BCDEFGH 2 Bright
      Stop 
   }
}

ACTOR RazorCount : Ammo {
     Inventory.Amount 1
     Inventory.MaxAmount 1
     Ammo.BackpackAmount 0
     Ammo.BackpackMaxAmount 1
}

Actor "Sun Staff" : Weapon {
	Inventory.PickupSound "weapons/pickup"
	Inventory.PickupMessage "Picked up the Sun Staff."
	Obituary "%o was seared by %k."
	Weapon.AmmoType "Souls"
	Weapon.AmmoGive 15
	Weapon.AmmoUse 0
	Weapon.SlotNumber 8
	+INVENTORY.UNDROPPABLE
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.1
	Weapon.BobRangeY 0.4
	Weapon.BobRangeX 0.7
	Tag "$WEP_8_2_TAG"
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			LTBR A -1 Bright
		Stop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot8", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 64, 0, DND_WEAPON_SUNSTAFF)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 48, 0, DND_WEAPON_SUNSTAFF)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 36, 0, DND_WEAPON_SUNSTAFF)
		SelectLoop:
			LTBR M 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot8", 1)
			TNT1 A 0 A_StopSoundEx("SoundSlot7")
			TNT1 A 0 A_JumpIfInventory("Souls", 1, 1)
		Goto Deselect2
			LTBR ON 4 Bright
			LTBR M 4
		DeselectLoop:
			LTBR M 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Ready:
			LTBR M 4 A_JumpIfInventory("Souls", 1, "FullReady")
		Goto Ready2
		FullReady:
			TNT1 A 0 A_PlaySoundEx("Weapons/SunstaffRecharge", "SoundSlot6", 0)
			LTBR NO 4 Bright
		ReadyCheckAnim:
			TNT1 A 0 A_JumpIfInventory("Souls", 1, "Part2")
		Goto Ready2
		Part2:
			TNT1 A 0 A_StopSoundEx("SoundSlot7")
			LTBR BBBBCCCCDDDDEEEE 1 Bright A_WeaponReady
		Goto ReadyCheckAnim
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_SUNSTAFF, 0), "FireConfirmed")
			LTBR BB 2 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			LTBR CCDDEE 2 A_weaponReady(WRF_NOFIRE)
		Goto Ready
		FireConfirmed:
			LTBR B 1 Bright
			TNT1 A 0 A_PlayWeaponSound("Weapons/SunStaffFire") 
			LTBR CD 1 Bright
			LTBX AB 1 Bright
			TNT1 A 0 A_Refire("HoldConfirmed")
		FinishFire:
			LTBR EDCB 2 Bright
			TNT1 A 0 A_JumpIfInventory("Souls", 1, "FinishFireAmmo")
			LTBR O 3
		Goto NoAmmo
		FinishFireAmmo:
			LTBR B 1
		Goto Part2
		Hold:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_SUNSTAFF, 0), "HoldConfirmed")
			LTBR F 2 Bright
		Goto FinishFire
		HoldConfirmed:
			TNT1 A 0 A_PlaySound("Weapons/SunStaffLoop", 7)
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_FireCustomMissile("Illuminator", 0, 0, 0, 0)
			LTBR F 2 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SUNSTAFF, DND_ATK_PRIMARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_NOAMMOGAINCHECK | DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_FireCustomMissile("Illuminator", 0, 0, 0, 0)
			LTBR G 2 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SUNSTAFF, DND_ATK_PRIMARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_NOAMMOGAINCHECK | DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_FireCustomMissile("Illuminator", 0, 0, 0, 0)
			LTBR H 2 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SUNSTAFF, DND_ATK_PRIMARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_NOAMMOGAINCHECK | DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_PlaySound("Weapons/SunStaffLoop", 7)
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_FireCustomMissile("Illuminator", 0, 0, 0, 0)
			LTBR I 2 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SUNSTAFF, DND_ATK_PRIMARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_NOAMMOGAINCHECK | DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("BeamCounter", 1)
			TNT1 A 0 A_Refire
			LTBR I 1 Bright
		Goto FinishFire
		NoAmmo:
			LTBR ON 4 Bright
		Goto Ready2
		Deselect2:
			LTBR M 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Ready2:
			LTBR M 0 A_StopSoundEx("SoundSlot7")
			LTBR M 0 A_JumpIfInventory("Souls", 1, "Ready")
			LTBR M 1 A_WeaponReady
		Loop
		AltFire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_SUNSTAFF, 1), "AltFireConfirmed")
			LTBR BB 2 A_WeaponReady(WRF_NOFIRE)
			LTBR CCDDEE 2 A_weaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready + 5
		AltFireConfirmed:
			TNT1 A 0 A_PlayWeaponSound("Weapons/SunStaffCharge")
			LTBR BCDEBCDEBCDEBCD 2 Bright
			LTBR FGHIFGHIFGHI 2 Bright
			LTBR J 2 Bright
			LTBR M 0 A_SetBlend("FF FF 88", 1.0, 35)
			LTBR M 0 A_PlayWeaponSound("Weapons/SunStaffFire2")
			TNT1 A 0 A_JumpIfInventory("ArtemisCheck", 1, "NoTake2")
			TNT1 A 0 A_TakeInventory("Souls", 5)
		NoTake2:
			TNT1 A 0 A_GunFlash
			TNT1 A 0 Radius_Quake(12,27,0,1,0)
			LTBR M 2 Offset (0,48) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SUNSTAFF, DND_ATK_SECONDARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_NOAMMOGAINCHECK)
			LTBR M 2 Offset (0,40)
			LTBR M 2 Offset (0,36)
			LTBR M 2 Offset (0,34)
			LTBR M 10 Offset (0,32)
			LTBR M 4 A_JumpIfInventory("Souls", 1, 1)
		Goto Ready2
			LTBR M 10 A_PlaySound("Weapons/SunStaffRecharge")
			LTBR NO 4 Bright
			LTBR BCDE 3 Bright
		Goto ReadyCheckAnim
		Flash:
			TNT1 A 4 A_Light2
			TNT1 A 3 A_Light0
		Goto LightDone
	}
}

Actor BeamCounter : Inventory {
	inventory.maxamount 3
}

Actor SunShooter : DnD_Activator {
	States {
		Use:
			TNT1 A 0 A_RailAttack(
				DND_WEAPON_SUNSTAFF |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_OCCULTFIRE << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT),
				0, 0, "", "", RGF_SILENT | RGF_FULLBRIGHT, 0, "SunPuff", 0, 0, 960, 27, 9.0, 1.0, "LightBeamSmoke", 0
			)
		Stop
	}
}

Actor SunPuff_HitFX {
	+NOINTERACTION
	+CLIENTSIDEONLY
	Alpha 0.85
	RenderStyle Translucent
	States {
		Spawn:
			SUNP BCDEFGH 2 Bright
		Stop
	}
}

Actor SunPuff : DnD_BaseRailPuff {
	Height 8
	Radius 4
	Alpha 0.85
	Renderstyle Translucent
	
	Stamina 2101248
	
	+BLOODLESSIMPACT
	+FOILINVUL
	States {
		Spawn:
		Crash:
		Melee:
		HitNoBlood:
			TNT1 AAAA 0
			TNT1 A 0 A_PlaySound("weapons/SunStaffHit")
			TNT1 A 0 A_SpawnItemEx("SunPuff_HitFX")
			BEAM BCDEF 2
		Stop
	}
}

Actor Illuminator
{
	Mass 5
	+RIPPER
	+NOGRAVITY
	+NOCLIP
	+NOBLOCKMAP
	+BLOODLESSIMPACT
	+DONTSPLASH
	+NOTELEPORT
	+CLIENTSIDEONLY
	States 
	{ 
		Spawn: 
			ILLR A 25
		Stop
	} 
}

Actor LightSmoke
{
	Height 2
	Radius 2
	+NOGRAVITY
	+NOTELEPORT
	+CLIENTSIDEONLY
	+ALWAYSPUFF
	Alpha 0.85
	Renderstyle Translucent
	States
	{
		Spawn:
			TNT1 A 0 NoDelay A_PlaySound("weapons/SunStaffHit")
			BEAM BCDEF 2
		Stop
	}
}

ACTOR LightBeamSmoke {
	Alpha 0.8
	Scale 0.33
	+CLIENTSIDEONLY
	+NOGRAVITY
	+SHADOW
	+NOBLOCKMAP
	+NOTELEPORT
	States {
		Spawn:
			SUNP X 1 BRIGHT A_FadeOut(0.05)
		Loop
	}
}

Actor SunBurstExp : DnD_ExplosiveBase {
	Speed 0
	+THRUACTORS
	+FORCERADIUSDMG
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_SUNSTAFF |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_OCCULTFIRE << DTYPE_SHIFT) |
				(400 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 128)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 0)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_SOULATTACK)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 3
		stop
	}
}

Actor SunRay
{
  Radius 5
  Height 6
  Speed 16
  Projectile
  Damage 0
  -NoGravity
  +ForceXYBillBoard
  +DontSplash
  +RIPPER
  +BLOODLESSIMPACT
  +CLIENTSIDEONLY
  RenderStyle Add
  States
  {
  Spawn:
    TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
  SpawnLoop:
    FX01 AAABBB 1 Bright
    Loop
  Death:
    FX01 EFGH 3 Bright
    Stop
  }
}

Actor SunBeamSpawner : DnD_BaseProjectile {
	Radius 1
	Height 2
	Speed 20
	ReactionTime 40
	+THRUACTORS
	+CEILINGHUGGER
	States {
		SpawnState:
			TNT1 A 1 A_CustomMissile("SunBeamDamager", -1, random(-64,64), random(0,359), CMF_AIMDIRECTION | CMF_TRACKOWNER, -90)
			TNT1 A 0 A_Countdown
		Loop
		Death:
			TNT1 A 0
		Stop
	}
}

ACTOR SunBeamDamagerTrailSpawner
{
	Radius 1
	Height 1
	+NOINTERACTION
	+CLIENTSIDEONLY
    States
    {
     Spawn:
	    TNT1 A 0 NoDelay A_Jump(192, "Stopped")
		TNT1 A 1 A_SpawnItemEx("YellowBallParticle_Shrinking",0,0,0,frandom(-0.4,0.4),frandom(-0.4,0.4),frandom(-0.4,0.4),0,SXF_NOCHECKPOSITION)
	 Stopped:
		TNT1 A 1
		Stop
    }
}

Actor SunBeamDamager : DnD_BaseProjectile {
	Radius 8
	Height 8
	Speed 48
	Decal "PlasmaScorchLower"
	+FORCEXYBILLBOARD
	+BLOODSPLATTER
	+FORCERADIUSDMG
	Renderstyle Add
	Alpha 0.90
	Scale 1.15
	DeathSound "Weapons/SunbeamHit"
	DamageType "SoulType"
	
	Damage(
		DND_WEAPON_SUNSTAFF |
		(DND_DMGID_2 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_OCCULTFIRE << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	Stamina 268435456
	
	States {
		SpawnState:
			FX01 A 1 Bright A_SpawnItemEx("SunBeamDamagerTrailSpawner", 0, 0, 8)
		Loop
		Death:
			TNT1 A 0 A_SpawnItemEx ("SunFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 AA 0 A_SpawnItemEx("SunRay", 0, 0, 15, 8, 0, Random(4, 16), Random(0, 360), 160, 0)
			TNT1 A 0 A_CustomMissile("SunBurstExp", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 8 A_SpawnItem("SunBeamExplosionFX")
		Stop
	}
}

Actor SunBeamExplosionFX {
	+CLIENTSIDEONLY
	+NOINTERACTION
	Renderstyle Add
	Alpha 0.9
	Scale 0.6
	States {
		Spawn:
			SNXP ABCDEFGHIJ 4 Bright
		Stop
	}
}

Actor SunShooter_Alt : DnD_Activator {
	States {
		Use:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Check Unique Player Property", PUP_PELLETSFIRECIRCLE), "FireCircle")
			TNT1 A 0 A_FireCustomMissile("SunBeamSpawner", 9, 1, 0, -3)
			TNT1 A 0 A_FireCustomMissile("SunBeamSpawner", -9, 1, 0, -3)
			TNT1 A 0 A_FireCustomMissile("SunBeamSpawner", 0, 1, 0, -3)
		Stop
		
		FireCircle:
			TNT1 A 0 A_SetArg(2, ACS_NamedExecuteWithResult("DnD Pellet Count", 3))
			TNT1 A 0 A_SetArg(4, Args[2])
		LoopStart:
			TNT1 A 0 A_JumpIf(Args[4], "LoopContinue")
		Goto Finish
		LoopContinue:
			TNT1 A 0 A_FireCustomMissile("SunBeamSpawner", (360.0 / Args[2]) * Args[4], 0)
			TNT1 A 0 A_SetArg(4, Args[4] - 1)
		Goto LoopStart
		Finish:
			TNT1 A 0
		Stop
	}
}

Actor "Soul Reaver" : Weapon {
	Inventory.PickupSound "weapons/pickup"
	Inventory.PickupMessage "Picked up the Soul Reaver."
	Obituary "%o's soul was twisted by %k."
	Weapon.AmmoType "Souls"
	Weapon.AmmoGive 15
	Weapon.AmmoUse 0
	Weapon.SlotNumber 8
	+INVENTORY.UNDROPPABLE
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.1
	Weapon.BobRangeY 0.4
	Weapon.BobRangeX 0.7
	Tag "$WEP_8_3_TAG"
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			SREA Z -1
		Stop
		Ready:
			SREA A 1 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("P_GrayFire", 1)
		    TNT1 A 0 A_TakeInventory("H_WeaponSlot8", 1)
			SREA A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("P_GrayFire", 1)
			TNT1 A 0 A_GiveInventory("H_WeaponSlot8", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 6, 4 | (6 << 16), DND_WEAPON_SOULREAVER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 128, 0, DND_WEAPON_SOULREAVER)
	    SelectLoop:
			SREA A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			SREA A 1 A_JumpIfInventory("SphereMade", 2, "NoMoreSphere")
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_SOULREAVER, 0), "FireConfirmed")
			SREA A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			TNT1 A 0 A_PlaySound("Weapons/SReaverBegin", 6, 0.6)
			SREA CDEFGHIJ 4 Bright
			TNT1 A 0 A_Refire
			TNT1 A 0 A_PlayWeaponSound("Weapons/SReaverFire")
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_SetBlend("55 55 55", 0.75, 25)
			TNT1 A 0 Radius_Quake(12,16,0,1,0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SOULREAVER, DND_ATK_PRIMARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_NOAMMOGAINCHECK)
			TNT1 A 0 A_GiveInventory("SphereMade", 1)
			SREA OP 5 Bright
			SREA B 4
		Goto Ready
		Hold:
			TNT1 A 0 A_GiveInventory("SoulReaverLooper", 1)
			SREA KLMN 2 Bright A_SpawnItemEx("SoulReaverDeflect", 0, 48, 32)
			TNT1 A 0 A_Refire
			TNT1 A 0 A_PlayWeaponSound("Weapons/SReaverFire")
			TNT1 A 0 A_GunFlash
			TNT1 A 0 A_SetBlend("55 55 55", 0.75, 25)
			TNT1 A 0 Radius_Quake(12,16,0,1,0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SOULREAVER, DND_ATK_PRIMARY, DND_AMMOSLOT_SOULS | (AMMO_SOUL << 16), DND_ATF_NOAMMOGAINCHECK)
			TNT1 A 0 A_GiveInventory("SphereMade", 1)
			SREA OP 5 Bright
			SREA B 4
		Goto Ready
		Flash:
			TNT1 A 8 A_LightInverse
			TNT1 A 3 A_Light0
		Goto LightDone
		NoMoreSphere:
			SREA A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
	}
}

Actor SphereMade : Inventory { 
	inventory.maxamount 2
}

Actor SoulReaverDeflect {
    Species "Player"
    +THRUSPECIES
    //+SOLID
    +SHOOTABLE
    +NOBLOOD
    +NOGRAVITY
    +NOTELEPORT
    +INVULNERABLE
    +DONTRIP
    +NOBLOODDECALS
    +FLOORCLIP
    +REFLECTIVE
	+NOTIMEFREEZE
	Height 40
	Radius 56
	States {
		Spawn:
			TNT1 A 2
		Stop
	}
}

Actor SoulReaverSphere : DnD_BaseProjectile {
	Height 48
	Radius 24
	Scale 1.55
	Renderstyle Add
	Alpha 0.05
	Speed 40
	+DOOMBOUNCE
	+DONTSPLASH
	+THRUACTORS
	var int user_count;
	States {
		SpawnState:
			TNT1 A 0
			TNT1 A 0 A_SetUserVar("user_count", 0)
			TNT1 A 1
			TNT1 A 0 A_Stop
			TNT1 A 0 A_SpawnItemEx ("GrayFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			ORRB AABBCCDDAABBCCDD 1 Bright A_FadeIn(0.05)
			TNT1 A 0 A_playSound("Weapons/SReaverOpen")
		SpawnLoop:
			TNT1 A 0 A_JumpIf(16 == user_count, "Death")
			TNT1 A 0 A_CustomMissile("SoulReaverGhost", 8 * random(3, 5), 0, random(0, 360), CMF_TRACKOWNER | CMF_AIMDIRECTION, frandom(-12.0, 12.0))
			TNT1 AAA 0 A_CustomMissile("SoulReaverTinyGhost", 8 * random(3, 5), 0, random(0, 360), CMF_AIMDIRECTION, frandom(-12.0, 12.0))
			ORRB ABCD 2 Bright
			TNT1 A 0 A_SetUserVar("user_count", user_count + 1)
		Loop
		Death:
			ORRB ABCDABCDABCDABCDABCDABCDABCD 2 Bright
			TNT1 A 0 A_TakeFromTarget("SphereMade", 1)
		DeathLoop:
			ORRB AABBCCDD 1 Bright A_FadeOut(0.05)
		Loop
	}
}

Actor SoulReaverExp1 : DnD_ExplosiveBase {
	Speed 0
	+FOILINVUL
	+THRUACTORS
	+FORCERADIUSDMG
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_SOULREAVER |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_SOUL << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 48)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 3
		stop
	}
}

Actor SoulReaverExp2 : DnD_ExplosiveBase {
	Speed 0
	+FOILINVUL
	+THRUACTORS
	+EXTREMEDEATH
	+FORCERADIUSDMG
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_SOULREAVER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_SOUL << 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", user_expradius)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 3
		stop
	}
}

Actor SoulReaverGhost : DnD_BaseProjectile {
	Height 24
	Radius 12
	Renderstyle Add
	Alpha 0.75
	Scale 0.85
	Speed 22
	+THRUACTORS
	+FORCERADIUSDMG
	+SEEKERMISSILE
	+SCREENSEEKER
	+LOOKALLAROUND
	+EXTREMEDEATH
	+FOILINVUL
	+HEXENBOUNCE
	+SKYEXPLODE
	var int user_count;
	States {
		SpawnState:
			TNT1 A 0
			TNT1 A 0 A_SetUserVar("user_count", 0)
		SpawnLoop:
			TNT1 A 0 A_PlaySound("Weapons/SReaverGhost")
			TNT1 A 0 A_JumpIf(11 == user_count, "Vanish")
			TNT1 A 0 A_SpawnItemEx("SoulReaverExp1", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 AA 1 Bright A_SeekerMissile(10, 10, SMF_PRECISE | SMF_LOOK)
			TNT1 A 0 A_SpawnItem("SoulReaverGhostTrail")
			TNT1 A 0 A_SpawnItemEx("SoulReaverExp1", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 AA 1 Bright A_SeekerMissile(10, 10, SMF_PRECISE | SMF_LOOK)
			TNT1 A 0 A_SpawnItem("SoulReaverGhostTrail")
			TNT1 A 0 A_SpawnItemEx("SoulReaverExp1", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 AA 1 Bright A_SeekerMissile(10, 10, SMF_PRECISE | SMF_LOOK)
			TNT1 A 0 A_SpawnItem("SoulReaverGhostTrail")
			TNT1 A 0 A_SpawnItemEx("SoulReaverExp1", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 AA 1 Bright A_SeekerMissile(10, 10, SMF_PRECISE | SMF_LOOK)
			TNT1 A 0 A_SpawnItem("SoulReaverGhostTrail")
			TNT1 A 0 A_SpawnItemEx("SoulReaverExp1", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 AA 1 Bright A_SeekerMissile(10, 10, SMF_PRECISE | SMF_LOOK)
			TNT1 A 0 A_SpawnItem("SoulReaverGhostTrail")
			TNT1 A 0 A_SpawnItemEx("SoulReaverExp1", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 AA 1 Bright A_SeekerMissile(10, 10, SMF_PRECISE | SMF_LOOK)
			TNT1 A 0 A_SpawnItem("SoulReaverGhostTrail")
			TNT1 A 0 A_SpawnItemEx("SoulReaverExp1", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 AA 1 Bright A_SeekerMissile(10, 10, SMF_PRECISE | SMF_LOOK)
			TNT1 A 0 A_SpawnItem("SoulReaverGhostTrail")
			TNT1 A 0 A_SpawnItemEx("SoulReaverExp1", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 AA 1 Bright A_SeekerMissile(10, 10, SMF_PRECISE | SMF_LOOK)
			TNT1 A 0 A_SpawnItem("SoulReaverGhostTrail")
			TNT1 A 0 A_SetUserVar("user_count", user_count + 1)
		Loop
		Vanish:
		Death:
			TNT1 A 0 A_SpawnItem("SoulReaverExp2")
			TNT1 A 0 A_PlaySound("Weapons/SReaverExpl")
			TNT1 A 0 A_SpawnItemEx("SoulReaverGhostFX", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 A 1 Bright
			TNT1 A 0 A_SpawnItemEx("SoulReaverGhostFX", 0, 0, 0, 0, 0, 0, 0, SXF_NOCHECKPOSITION)
			SRV2 A 1 Bright
		Stop
	}
}

Actor SoulReaverGhostTrail {
	Renderstyle Add
	Alpha 0.8
	Scale 0.85
	Height 2
	Radius 2
	+CLIENTSIDEONLY
	+NOGRAVITY
	
	States {
		Spawn:
			TNT1 A 1
		SpawnLoop:
			SRV2 A 1 A_FadeOut(0.1)
		Loop
	}
}

Actor SoulReaverGhostFX {
	Height 4
	Radius 4
	Renderstyle Add
	Alpha 0.825
	Vspeed 1
	Scale 0.85
	+NOGRAVITY
	+CLIENTSIDEONLY
	
	States {
		Spawn:
			SRV3 A 5 Bright
			SRV3 B 4 Bright
			SRV3 C 3 Bright
			SRV3 DEFGHI 2 Bright
		Stop
	}
}

Actor SoulReaverTinyGhost {
	PROJECTILE
	Height 16
	Radius 8
	Renderstyle Add
	Alpha 0.75
	Speed 18
	+THRUACTORS
	+HEXENBOUNCE
	+SKYEXPLODE
	+CLIENTSIDEONLY
	var int user_count;
	States {
		Spawn:
			TNT1 A 0 A_SetUserVar("user_count", 0)
		SpawnLoop:
			TNT1 A 0 A_JumpIF(105 == user_count, "Vanish")
			SRV1 K 1 Bright
			TNT1 A 0 A_SpawnItem("SoulReaverTinyGhostTrail")
			TNT1 A 0 A_SetUserVar("user_count", user_count + 1)
		Loop
		Vanish:
			SRV1 K 1 Bright A_FadeOut(0.05)
		Loop
	}
}

Actor SoulReaverTinyGhostTrail {
	Renderstyle Add
	Alpha 0.8
	Scale 0.85
	Height 2
	Radius 2
	+CLIENTSIDEONLY
	+NOGRAVITY
	States {
		Spawn:
			TNT1 A 2
			SRV1 DEFGHIJ 1
		Stop
	}
}

Actor SoulReaverSoundTimer : PowerProtection {
	powerup.duration 17
	damagefactor "normal", 1.0
}

Actor SoulReaverLooper : CustomInventory {
	inventory.maxamount 1
	+AUTOACTIVATE
	+ALWAYSPICKUP
	
	States {
		Pickup:
			TNT1 A 0 A_JumpIfInventory("SoulReaverSoundTimer", 1, "Failure")
			TNT1 A 0 A_GiveInventory("SoulReaverSoundTimer", 1)
			TNT1 A 0 A_PlaySoundEx("Weapons/SReaverLoop", 7)
		Stop
		Failure:
			TNT1 A 0
		Stop
	}
}