Actor " Fists " : Fist
{
	Weapon.SlotNumber 1
	+WEAPON.NOALERT
	+INVENTORY.UNDROPPABLE
	Obituary "%o had %p shit beaten by %k."
    Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 2.1
    Weapon.BobRangeY 0.4
    Weapon.BobRangeX 0.7
	Weapon.SelectionOrder 99999
	Tag "$WEP_0_0_TAG"
	+WEAPON.NOAUTOAIM
	States
	{
		Ready:
			PUNK A 1 A_WeaponReady
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot1", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 10, 1 | (3 << 16), DND_WEAPON_FIST)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 15, 12 | (16 << 16), DND_WEAPON_FIST)
		SelectLoop:
			PUNK A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot1", 1)
		DeselectLoop:
			PUNK A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
	    Fire:
			TNT1 A 0 A_PlaySound("weapons/fistmiss")
			TNT1 A 0 A_JumpIfInventory("FistSide", 1, "Other")
			PUNK BC 1
			PUNK D 2 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FIST, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			PUNK CB 2
			PUNK A 5 A_ReFire
		goto Ready
		Other:
			PUNK EF 1
			PUNK G 2 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FIST, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			PUNK FE 2
			PUNK A 5 A_ReFire
		goto Ready
		Altfire:
			TNT1 A 0 A_JumpIFInventory("Ability_Kick", 1, "ContinueAltFire")
			PUNK A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		ContinueAltFire:
			TNT1 A 0 A_Stop
			TNT1 A 0 ACS_ExecuteAlways(920, 0, 0)
			PUNK H 1 Offset(0, 34) A_SetAngle(angle - 36)
			PUNK H 1 Offset(0, 36) A_SetAngle(angle - 36)
			PUNK I 1 Offset(0, 34) A_SetAngle(angle - 36)
			PKFS I 1 Offset(0, 36) A_SetAngle(angle - 36)
			PKFS J 1 Offset(0, 36) A_SetAngle(angle - 36)
			TNT1 A 0 A_Playsound("Weapons/KickSwing")
			MLEG AA 1 Offset(16, 32) A_SetAngle(angle - 36)
			MLEG BB 1 A_SetAngle(angle - 18)
			MLEG CC 1 A_SetAngle(angle - 9)
			MLEG D 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FIST, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			TNT1 A 0 A_SetAngle(angle - 9)
			MLEG D 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FIST, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_SetAngle(angle - 9)
			MLEG E 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FIST, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_SetAngle(angle - 9)
			MLEG E 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FIST, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_SetAngle(angle - 9)
			MLEG F 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FIST, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_SetAngle(angle - 9)
			MLEG F 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FIST, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_SetAngle(angle - 9)
			MLEG F 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FIST, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			MLEG G 2
			MLEG H 2 ACS_ExecuteAlways(920, 0, 1)
			PUNK J 1 Offset(0, 36)
			PUNK H 1 Offset(0, 36)
			PUNK H 1 Offset(0, 34)
			PUNK I 1 Offset(0, 36)
			PUNK I 1 Offset(0, 34)
		goto Ready   
	}
}

Actor FistPuff : DnD_BasePuff {
	Stamina 4096

	States {
		Spawn:
			TNT1 AAA 0
			TNT1 A 1 A_PlaySound("Weapons/fisthit")
		Stop
		Crash:
		HitNoBlood:
			TNT1 A 0 A_PlaySound("Weapons/FistWall")
			TNT1 AAAAAA 0 A_CustomMissile ("MeleeSmoke", 0, 0, random (0, 360), 2, random (0, 360))
			TNT1 A 1
		Stop
	}
}

Actor FistSide : DnD_Boolean { }

ACTOR " Chainsaw " : Chainsaw
{
  Weapon.Slotnumber 1
  Weapon.BobStyle InverseSmooth
  Weapon.BobSpeed 2.1
  Weapon.BobRangeY 0.4
  Weapon.BobRangeX 0.7
  Inventory.PickupSound "weapons/pickup"
  Weapon.UpSound "weapons/sawup"
  Decal "ChainsawMark"
  Tag "$WEP_0_1_TAG"
  +WEAPON.NOAUTOAIM
  States
  {
  Ready:
	TNT1 A 0 A_PlayWeaponSound("weapons/sawidle")
    SAWG CD 4 A_WeaponReady
    Loop
  Deselect:
	TNT1 A 0 A_TakeInventory("H_WeaponSlot1", 1)
  DeSelectLoop:
    SAWG C 1 A_Lower
	TNT1 A 0 A_Lower
    Loop
  Select:
    TNT1 A 0 A_GiveInventory("H_WeaponSlot1", 1)
	TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 4, 5 | (10 << 16), DND_WEAPON_CHAINSAW)
  SelectLoop:
    SAWG C 1 A_Raise
	TNT1 A 0 A_Raise
    Loop
  Fire:
	TNT1 A 0 A_GiveInventory("DnD_UsedNonSpecial", 1)
	TNT1 A 0 A_PlayWeaponSound("weapons/sawfull")
    SAWG A 4 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_CHAINSAW, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
	TNT1 A 0 A_PlayWeaponSound("weapons/sawfull")
	SAWG B 4 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_CHAINSAW, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
	TNT1 A 0 A_Refire
	SAWG B 4
    Goto Ready
  Spawn:
    CSAW A -1
    Stop
  }
}

Actor ChainsawPuff : DnD_BasePuff {
	SeeSound "Weapons/SawHit"
	AttackSound "Weapons/SawScreech"
	Decal "ChainsawMark"
	RenderStyle Add
	Alpha 0.8
	Scale 0.4

	Stamina 4096
	
	+THRUGHOST
	States {
		Crash:
		HitNoBlood:
			TNT1 A 0 A_Jump(128, "Alt")
			CSF1 ABCDEFGHIJ 1 Bright A_FadeOut(0.08)
		Stop
		Alt:
			CSF2 ABCDEFGHIJ 1 Bright A_FadeOut(0.08)
		Stop
	}
}

Actor ChainsawPuff_GhostHitter : ChainsawPuff {
	-THRUGHOST
}

// Sprites by Eriance
ACTOR "Upgraded Chainsaw" : Chainsaw
{
  Weapon.Kickback 0
  Weapon.SlotNumber 1
  Weapon.SelectionOrder 2200
  Weapon.UpSound "weapons/sawup2"
  Inventory.PickupMessage "$GOTCHAINSAW"
  Inventory.PickupSound "weapons/pickup"
  Obituary "$OB_MPCHAINSAW"
  Tag "$WEP_0_2_TAG"
  +WEAPON.MELEEWEAPON
  +INVENTORY.UNDROPPABLE
  Weapon.BobStyle InverseSmooth
  Weapon.BobSpeed 2.1
  Weapon.BobRangeY 0.4
  Weapon.BobRangeX 0.7
  Decal "ChainsawMark"
  +WEAPON.NOAUTOAIM
  States
  {
  Ready:
	TNT1 A 0 A_PlaySound("weapons/sawidle2", CHAN_WEAPON, 0.6)
    SAW2 CD 4 A_WeaponReady
    Loop
  Deselect:
	TNT1 A 0 A_TakeInventory("H_WeaponSlot1", 1)
  DeSelectLoop:
    SAW2 C 1 A_Lower
	TNT1 A 0 A_Lower
    Loop
  Select:
	TNT1 A 0 A_GiveInventory("H_WeaponSlot1", 1)
	TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check (Melee)")
	TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 4, 5 | (10 << 16), DND_WEAPON_DOUBLECHAINSAW)
  SelectLoop:
    SAW2 C 1 A_Raise
	TNT1 A 0 A_Raise
    Loop
  Fire:
	TNT1 A 0 A_GiveInventory("DnD_UsedNonSpecial", 1)
    TNT1 A 0 A_PlayWeaponSound("weapons/sawfull2")
    SAW2 A 4 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DOUBLECHAINSAW, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
	TNT1 A 0 A_PlayWeaponSound("weapons/sawfull2")
	SAW2 B 4 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DOUBLECHAINSAW, DND_ATK_PRIMARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE)
    SAWG B 0 A_ReFire
    Goto Ready
  Spawn:
    CSW2 A -1
    Stop
  }
}

Actor DChainsawPuff : ChainsawPuff {
	Stamina 4096
}

Actor DChainsawPuff_NoSound : DChainsawPuff {
	SeeSound ""
}

Actor DChainsawPuff_GhostHitter : DChainsawPuff {
	-THRUGHOST
}

Actor DChainsawPuff_NoSound_GhostHitter : DChainsawPuff_GhostHitter {
	SeeSound ""
}

ACTOR Sickle : Weapon {
    +MELEEWEAPON
	Weapon.KickBack 0
	Weapon.AmmoType "Souls"
	Weapon.AmmoUse 0
	Weapon.SlotNumber 1
	+UNDROPPABLE
	Weapon.SelectionOrder 88888
	Tag "$WEP_0_7_TAG"
    Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 1.6
    Weapon.BobRangeY 0.4
    Weapon.BobRangeX 0.7
	+WEAPON.NOAUTOAIM
    States {
		Spawn:
			TNT1 A 1
		Stop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot1", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 5, 8 | (12 << 16), DND_WEAPON_SICKLE)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 5, 15 | (18 << 16), DND_WEAPON_SICKLE)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 80, 0, DND_WEAPON_SICKLE)
		SelectLoop:
			SCKL A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot1", 1)
		DeSelectLoop:
			SCKL A 1 A_lower
			TNT1 A 0 A_lower
		Loop
		Ready:
			SCKL A 1 Offset(0, 32) A_weaponready
		Loop
		Fire:
			TNT1 A 0 A_GiveInventory("DnD_UsedNonSpecial", 1)
			SCKL A 1 Offset (32,32)
			SCKL A 1 Offset (28,34)
			SCKL A 1 Offset (24,36)
			TNT1 A 0 A_PlayWeaponSound("weapons/bigswing")
			SCKL B 1 Offset (22,32)
			SCKL B 1 Offset (15,32)
			SCKL B 1 Offset (10,32)
			SCKL C 1 Offset (20,33) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SICKLE, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			SCKL C 1 Offset (12,34) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SICKLE, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			SCKL C 1 Offset (0,36) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SICKLE, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			SCKL C 1 Offset (-10,36)
			SCKL D 1 Offset (40,36)
			SCKL D 1 Offset (36,39)
			SCKL D 1 Offset (32,42)
			TNT1 A 4 Offset(0, 32)
			TNT1 A 0 A_ReFire
			TNT1 A 2 Offset(-1, 72)
			SCKL A 1 Offset(-1, 72)
			SCKL A 1 Offset(-1, 62)
			SCKL A 1 Offset(-1, 52)
			SCKL A 1 Offset(-1, 42)
			SCKL A 1 Offset(-1, 32)
			TNT1 A 0 Offset(0, 32)
		goto Ready
		Altfire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_SICKLE, 1, 0, DND_CFW_ALTFIRECHECK), "ContinueAltFire")
			SCKL A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		ContinueAltFire:
			SCKL A 1 Offset (32,32)
			SCKL A 1 Offset (28,34)
			SCKL A 1 Offset (24,36)
			SCKL A 1 Offset (20,38)
			TNT1 A 0 A_PlayWeaponSound("weapons/bigswing")
			SCKL I 1 Offset (36,38)
			SCKL I 1 Offset (34,34)
			SCKL I 1 Offset (32,32)
			SCKL I 1 Offset (30,30)
			SCKL J 1 Offset (31,31)
			SCKL J 1 Offset (33,33)
			SCKL K 1 Offset (35,35)
			SCKL K 1 Offset (36,36)
			SCKL L 1 Offset (38,28)
			SCKL L 1 Offset (32,32)
			SCKL L 1 Offset (28,38)
			TNT1 A 0 A_SetBlend("55 55 55", 0.75, 25)
			SCKL H 1 Offset (39,32) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SICKLE, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0)
			SCKL H 1 Offset (34,40) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SICKLE, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			SCKL H 1 Offset (29,48) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_SICKLE, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			SCKL H 1 Offset(24, 56)
			SCKL H 1 Offset(19, 64)
			SCKL H 1 Offset(14, 72)
			TNT1 A 6 Offset(0, 32)
			TNT1 A 2 Offset(-1, 72)
			SCKL A 1 Offset(-1, 72)
			SCKL A 1 Offset(-1, 62)
			SCKL A 1 Offset(-1, 52)
			SCKL A 1 Offset(-1, 42)
			SCKL A 1 Offset(-1, 32)
			TNT1 A 0 Offset(0, 32)
		Goto Ready
    }
}

Actor SicklePuff : DnD_BasePuff {
	Damagetype "Melee_Magic"
	AttackSound "weapons/swingwall"
	SeeSound "weapons/swinghit"
	Alpha 0.6
	Vspeed 0.8
	Renderstyle Translucent
	
	Stamina 528384
	
	States {
		Spawn:
		Crash:
		HitNoBlood:
			TNT1 AAAAAA 0 A_CustomMissile ("MeleeSmoke", 0, 0, random (0, 360), 2, random (0, 360))
			VFX2 A 1
			VFX2 A 1 A_GiveToTarget("ScreenPitch", 1)
			VFX2 A 1 A_GiveToTarget("ScreenPitchBack", 1)
			TNT1 A 0 A_JumpIf(!ACS_NamedExecuteWithResult("DnD Sickle Check Res", 25), "ContinueFX")
			VFX2 A 1 A_GiveInventory("DnD_ResurrectChecker", 1, AAPTR_TRACER)
		ContinueFX:
			VFX2 BCDE 4
		Stop
	}
}

Actor SicklePuff_X : SicklePuff {
	Stamina 529408
}

Actor ScreenPitch : DND_Activator {
	States {
		Use:
			TNT1 A 0 A_SetPitch(Pitch-2)
		Stop
	}
}

Actor ScreenPitchBack : DND_Activator {
	States {
		Use:
			TNT1 A 0 A_SetPitch(Pitch+2)
		Stop
	}
}

Actor SickleGhostwave : DnD_BaseProjectile {
	Speed 48
	Damage (
		DND_WEAPON_SICKLE |
		(DND_DMGID_2 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_OCCULT << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	Radius 10
	Height 20
	Scale 0.75
	Renderstyle Add
	Alpha 0.75
	SeeSound "Sickle/Ghost"
	
	Stamina 268468224
	
	var int user_ripperid;
	var int user_expdmg;
	
	+BLOODLESSIMPACT
	+RIPPER
	+DONTREFLECT
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_SICKLE |
				(DND_DMGID_2 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_OCCULT << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			SRV2 A 1 A_SpawnItemEx("SickleGhostAfterwave", -8, 0)
		SpawnStateLoop:
			SRV2 AAAAAAA 1 A_SpawnItemEx("SickleGhostAfterwave", -8, 0)
			TNT1 A 0 A_SpawnItemEx("SickleGhostShockwaveFX", -8, 0)
			TNT1 A 0 A_SpawnItemEx ("GrayFlare", 0, 0, 0, 0, 0, 0, 0, SXF_CLIENTSIDE | SXF_NOCHECKPOSITION, 0)
			TNT1 A 0 A_PlaySound("Sickle/GhostRes", CHAN_5)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Sickle Mass Res", 0, 50, 192)
			SRV2 AAAAAAAAAAAAAA 1 A_SpawnItemEx("SickleGhostAfterwave", -8, 0)
		Loop
		Death:
			SRV3 ABCDEFGHI 2
		Stop
	}
}

Actor SickleGhostAfterwave {
	Renderstyle Add
	Alpha 0.75
	Scale 0.75
	Height 2
	Radius 2
	+CLIENTSIDEONLY
	+NOINTERACTION
	States {
		Spawn:
			TNT1 A 1
		SpawnLoop:
			SRV2 A 1 A_FadeOut(0.1)
		Loop
	}
}

Actor SickleGhostShockwaveFX {
	Renderstyle Add
	Alpha 0.75
	Scale 0.75
	Height 2
	Radius 2
	+CLIENTSIDEONLY
	+NOINTERACTION
	Translation "112:127=%[0.00,0.00,0.00]:[1.40,1.40,1.40]"
	States {
		Spawn:
			R075 ABCDEFFGGHHIIIJJJKKKLLMMNNOP 1 BRIGHT A_FadeOut(0.03)
		Stop
	}
}

ACTOR Excalibat : Weapon {
    +MELEEWEAPON
	Weapon.KickBack 300
	Weapon.SlotNumber 1
	+UNDROPPABLE
	Weapon.SelectionOrder 88888
	Weapon.AmmoUse1 0
	Weapon.AmmoUse2 0
	Weapon.AmmoType1 "BatCharge"
	Weapon.AmmoType2 "Souls"
    Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 1.6
    Weapon.BobRangeY 0.4
    Weapon.BobRangeX 0.7
	Tag "$WEP_0_4_TAG"
	const int rate = 4;
    +WEAPON.NOAUTOAIM
	States {
		Spawn:
			EBAT A -1
		Stop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot1", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check (Melee)")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 5, 4 | (6 << 16), DND_WEAPON_EXCALIBAT)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 25, 4 | (6 << 16), DND_WEAPON_EXCALIBAT)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 128, 0, DND_WEAPON_EXCALIBAT)
		SelectLoop:
			EXCL A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot1", 1)
		DeSelectLoop:
			EXCL A 1 A_lower
			TNT1 A 0 A_lower
		Loop
		Ready:
			EXCL A 6 A_weaponready
			TNT1 A 0 A_Jump(16, "Blink")
			EXCL B 6 A_weaponready
			TNT1 A 0 A_Jump(16, "Blink")
			EXCL C 6 A_weaponready
			TNT1 A 0 A_Jump(16, "Blink")
			EXCL D 6 A_weaponready
			TNT1 A 0 A_Jump(16, "Blink")
			EXCL E 6 A_weaponready
			TNT1 A 0 A_Jump(128, "LookAround")
			TNT1 A 0 A_Jump(16, "Blink")
		ContinueReady:
			EXCL D 6 A_weaponready
			TNT1 A 0 A_Jump(16, "Blink")
			EXCL C 6 A_weaponready
			TNT1 A 0 A_Jump(16, "Blink")
			EXCL B 6 A_weaponready
			TNT1 A 0 A_Jump(16, "Blink")
		Goto Ready
		LookAround:
			TNT1 A 0 A_Jump(128, "LookAround2")
			EXCL FGHG 6 A_WeaponReady
		Goto ContinueReady
		LookAround2:
			EXCL HFG 6 A_WeaponReady
		Goto ContinueReady
		Blink:
			EXCL IJKJI 4 A_WeaponReady
		Goto Ready
		Fire:
			TNT1 A 0 A_GiveInventory("DnD_UsedNonSpecial", 1)
			EXCL A 1 Offset(8, 30)
			EXCL A 1 Offset(20, 28)
			EXCL A 1 Offset(36, 26)
		FireHold:
			EXCL L 1 Offset(271, 32) A_SetPitch(pitch - 1.0, SPF_INTERPOLATE)
			TNT1 A 0 A_PlayWeaponSound("weapons/batswing")
			EXCL L 1 Offset(284, 23) A_SetPitch(pitch - 1.0, SPF_INTERPOLATE)
			EXCL L 1 Offset(299, 13) A_SetPitch(pitch - 1.0, SPF_INTERPOLATE)
			EXCL L 1 Offset(270, 19) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			EXCL L 1 Offset(234, 26) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			EXCL L 1 Offset(203, 29) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			TNT1 A 0 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_EXCALIBAT, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			EXCL O 1 Offset(171, -2) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_EXCALIBAT, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			EXCL P 1 Offset(80, 14) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_EXCALIBAT, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			EXCL Q 1 Offset(-7, 50) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_EXCALIBAT, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			EXCL R 1 Offset(-75, 91) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			EXCL R 1 Offset(-128, 106) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			EXCL R 1 Offset(-185, 125) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			EXCL R 1 Offset(-232, 149) A_SetPitch(pitch + 0.3, SPF_INTERPOLATE)
			TNT1 A 4
			TNT1 A 0 A_Refire("FireHold")
			EXCL A 1 Offset(-28, 132)
			EXCL A 1 Offset(-20, 112)
			EXCL A 1 Offset(-12, 92)
			EXCL A 1 Offset(-6, 72)
			EXCL A 1 Offset(-3, 52)
			EXCL A 1 Offset(-2, 42)
			EXCL A 1 Offset(-1, 32)
		goto Ready
		Altfire:
			TNT1 A 0 A_GiveInventory("DnD_UsedNonSpecial", 1)
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_EXCALIBAT, 0, 0, DND_CFW_ALTFIRECHECK), "FireConfirmed")
			EXCL A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			TNT1 A 0 A_PlayWeaponSound("weapons/batcharge")
		ContinueAltFireLoop:
			EXCL A 2 A_GiveInventory("BatCharge", rate)
			TNT1 A 0 A_JumpIfInventory("BatCharge", 0, "AltFireUnleash")
			TNT1 A 0 A_JumpIf(!ACS_ExecuteWithResult(994, 3), "CleanFinish")
			EXCL B 2 A_GiveInventory("BatCharge", rate - 1)
			TNT1 A 0 A_JumpIfInventory("BatCharge", 0, "AltFireUnleash")
			TNT1 A 0 A_JumpIf(!ACS_ExecuteWithResult(994, 3), "CleanFinish")
			EXCL C 2 A_GiveInventory("BatCharge", rate)
			TNT1 A 0 A_JumpIfInventory("BatCharge", 0, "AltFireUnleash")
			TNT1 A 0 A_JumpIf(!ACS_ExecuteWithResult(994, 3), "CleanFinish")
			EXCL D 2 A_GiveInventory("BatCharge", rate - 1)
			TNT1 A 0 A_JumpIfInventory("BatCharge", 0, "AltFireUnleash")
			TNT1 A 0 A_JumpIf(!ACS_ExecuteWithResult(994, 3), "CleanFinish")
			EXCL E 2 A_GiveInventory("BatCharge", rate - 1)
			TNT1 A 0 A_JumpIfInventory("BatCharge", 0, "AltFireUnleash")
			TNT1 A 0 A_JumpIf(!ACS_ExecuteWithResult(994, 3), "CleanFinish")
			EXCL D 2 A_GiveInventory("BatCharge", rate - 1)
			TNT1 A 0 A_JumpIfInventory("BatCharge", 0, "AltFireUnleash")
			TNT1 A 0 A_JumpIf(!ACS_ExecuteWithResult(994, 3), "CleanFinish")
			EXCL C 2 A_GiveInventory("BatCharge", rate)
			TNT1 A 0 A_JumpIfInventory("BatCharge", 0, "AltFireUnleash")
			TNT1 A 0 A_JumpIf(!ACS_ExecuteWithResult(994, 3), "CleanFinish")
			EXCL B 2 A_GiveInventory("BatCharge", rate - 1)
			TNT1 A 0 A_JumpIfInventory("BatCharge", 0, "AltFireUnleash")
			TNT1 A 0 A_Refire("ContinueAltFireLoop")
		CleanFinish:
			TNT1 A 0 A_JumpIfInventory("BatCharge", 20, "AltFireUnleash")
			EXCL A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			TNT1 A 0 A_TakeInventory("BatCharge", 0)
		Goto Ready
		AltFireUnleash:
			TNT1 A 0 A_PlayWeaponSound("weapons/batfire")
			EXCL A 1 Offset(8, 30)
			EXCL A 1 Offset(20, 28)
			EXCL A 1 Offset(36, 26)
			EXCL U 1 Bright Offset(289, 9) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_EXCALIBAT, DND_ATK_SECONDARY, 0, 0)
			EXCL U 1 Bright Offset(263, 7)
			EXCL U 1 Bright Offset(244, -3)
			EXCL U 1 Bright Offset(214, -4)
			EXCL V 1 Bright Offset(204, -3)
			EXCL V 1 Bright Offset(185, -2)
			EXCL V 1 Bright Offset(141, 5)
			EXCL V 1 Bright Offset(115, 9)
			EXCL W 1 Bright Offset(103, -6)
			EXCL W 1 Bright Offset(82, -11)
			EXCL W 1 Bright Offset(39, -6)
			EXCL X 1 Bright Offset(-93, 16)
			EXCL X 1 Bright Offset(-127, 32)
			EXCL X 1 Bright Offset(-168, 49)
			EXCL X 1 Bright Offset(-218, 62)
			TNT1 A 1 Offset(0, 32)
		Goto Excalibat_Finish
		Excalibat_Finish:
			TNT1 A 5 Offset(0, 32)
			EXCL A 1 Offset(-1, 132)
			EXCL A 1 Offset(-1, 112)
			EXCL A 1 Offset(-1, 92)
			EXCL A 1 Offset(-1, 72)
			EXCL A 1 Offset(-1, 52)
			EXCL A 1 Offset(-1, 42)
			EXCL A 1 Offset(-1, 32)
		Goto Ready
    }
}

Actor BatCharge : Ammo {
	inventory.amount 1
	inventory.maxamount 100
	ammo.backpackamount 0
	ammo.backpackmaxamount 100
	+IGNORESKILL
}

Actor ExcalibatPuff : DnD_BasePuff {
	AttackSound "weapons/swingwall"
	SeeSound "weapons/swinghit"
	
	Stamina 528384
	
	States {
		Spawn:
			TNT1 AAAAAA 0 A_CustomMissile ("MeleeSmoke", 0, 0, random (0, 360), 2, random (0, 360))
			VFX2 ABCDE 4
		Stop
		Crash:
		HitNoBlood:
		Goto AfterDamage
	}
}

Actor ExcalibatBall : DnD_ExplosiveBase {
	Speed 32
	Height 10
	Radius 5
	ReactionTime 10
	Renderstyle Add
	SeeSound "weapons/batlaunch"
	DeathSound "weapons/bathit"
	
	Damage (
		DND_WEAPON_EXCALIBAT |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_OCCULTEXPLOSION << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	Stamina 268435456
	
	+EXTREMEDEATH
	+FOILINVUL
	+THRUGHOST
	+NODAMAGETHRUST
	+FORCERADIUSDMG
	States {
		SpawnState:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Update Melee ReactionTime", 10)
		SpawnLoop:
			ECAL A 3 Bright A_CountDown
		Loop
		Death:
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_EXCALIBAT |
				(DND_DMGID_2 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_OCCULTEXPLOSION << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_expradius", 128)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", user_expradius)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_SOULATTACK)
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 AA 0 A_SpawnItemEx("GreenParticleSpawner", 0, 0, 0, 0, 0, 0, 0, 128)
			TNT1 A 0 A_SetScale(0.625, 0.625)
			D3BX ABCDEFG 2 Bright A_FadeOut(0.075)
		Goto FinishExplosion
	}
}

Actor ExcalibatBall_GhostHitter : ExcalibatBall {
	-THRUGHOST
}

Actor KatanaUnsheated : DnD_Boolean { }
Actor KatanaIdleTimer : PowerProtection {
	damagefactor "normal", 1.0
	powerup.duration -5
}

Actor KatanaAltTimer : PowerProtection {
	damagefactor "normal", 1.0
	powerup.duration 157
}

Actor KatanaAltTimer_Short : PowerProtection {
	damagefactor "normal", 1.0
	powerup.duration 87
}

ACTOR Katana : Weapon {
	Weapon.SlotNumber 1
	Weapon.SelectionOrder 6
	Obituary "%o was eviscerated by %k."
	Tag "$WEP_0_3_TAG"
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.5
	Weapon.BobRangeX 0.2
	Weapon.BobRangeY 0.5
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			JFIS Z -1
		Stop
		Ready:
			TNT1 A 0 A_JumpIfInventory ("KatanaUnsheated", 1, "ReadyUnsheathed")
			TNT1 A 1 A_WeaponReady
		Loop
		ReadyUnsheathed:
			TNT1 A 0 A_GiveInventory("KatanaUnsheated", 1)
			TNT1 A 0 A_GiveInventory("KatanaIdleTimer", 1)
		ReadyUnsheathedLoop:
			JFIS D 1 A_WeaponReady(WRF_ALLOWRELOAD)
			TNT1 A 0 A_JumpIfInventory("KatanaIdleTimer", 1, "IdleReady")
		Goto ForcedSheathe
		IdleReady:
			JFIS D 1 A_WeaponReady(WRF_ALLOWRELOAD)
		Goto ReadyUnsheathedLoop
	
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot1", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Berserker Perk5 Check (Melee)")
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 20, 0, DND_WEAPON_KATANA)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 12, 0, DND_WEAPON_KATANA)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_2, 80, 0, DND_WEAPON_KATANA)
		SelectLoop:
			TNT1 A 0 A_Raise
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot1", 1)
			TNT1 A 0 A_JumpIfInventory("DnD_PDead", 1, "DeselectLoop")
			TNT1 A 0 A_JumpIfInventory ("KatanaUnsheated", 1, "DeselectSheathe")
			TNT1 A 1
			TNT1 A 0 A_TakeInventory("KatanaIdleTimer", 1)
			TNT1 A 0 A_StopSound(7)
		DeselectLoop:
			TNT1 A 0 A_Lower
		Loop
		DeselectSheathe:
			TNT1 A 0 A_StopSound(7)
			JIA1 FFGGHH 1 A_JumpIfInventory("DnD_PDead", 1, "DeselectLoop")
			TNT1 A 0 A_TakeInventory ("KatanaUnsheated", 1)
			TNT1 A 0 A_TakeInventory("KatanaIdleTimer", 1)
			TNT1 A 0 A_PlaySound("jpcpfist/sheathe", CHAN_WEAPON, 1.0, 0, 1.5)
			JIA1 HIJ 2
			JIA1 K 3
			JIA1 L 8
			JIA1 MN 2
		Goto DeselectLoop

		Fire:
			TNT1 A 0 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
			TNT1 A 0 A_JumpIfInventory ("KatanaUnsheated", 1, "FireUnsheathed")
		IaiSlash:
			TNT1 A 0 A_PlaySound("jpcpfist/iai", CHAN_WEAPON, 1.0, 0, 1.5)
			JIA1 AB 1
		IaiSlashNormal:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, 0, 0, DND_ATF_NOAMMOTAKE)
			JIA1 C 1 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, 0, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JIA1 D 1 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, 0, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JIA1 E 1 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, 0, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			
		Goto IaiSlashFinish
		IaiSlashFinish:
			TNT1 AAAAAAAA 1
			TNT1 AAAAAAA 1 A_Refire ("SwitchToStandard")
			JFIS ABC 2
		Goto ReadyUnsheathed
		ForcedSheathe:
			JIA1 F 2
			TNT1 A 0 A_TakeInventory ("KatanaUnsheated", 1)
			JIA1 GH 2
			TNT1 A 0 A_PlaySound("jpcpfist/sheathe", CHAN_WEAPON, 1.0, 0, 1.5)
			JIA1 HIJ 2
			JIA1 K 3
			JIA1 L 8 A_JumpIfInventory("Ability_Kick", 1, "ForcedSheatheQuick")
			JIA1 MN 2
		Goto Ready
		ForcedSheatheQuick:
			JIA1 L 1 A_WeaponReady(WRF_NOFIRE | WRF_NOBOB | WRF_NOSWITCH)
			JIA1 LLLLLLL 1 A_WeaponReady(WRF_NOPRIMARY | WRF_NOBOB | WRF_NOSWITCH)
			JIA1 MMNN 1 A_WeaponReady(WRF_NOPRIMARY | WRF_NOBOB | WRF_NOSWITCH)
		Goto Ready

		SwitchToStandard:
			TNT1 A 0 A_GiveInventory ("KatanaUnsheated", 1)
		Goto LeftSlash

		FireUnsheathed:
			JFIS EF 1
			TNT1 A 3 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
		Goto LeftSlash
		LeftSlash:
			TNT1 A 0 A_PlaySound("jpcpfist/swing", CHAN_WEAPON, 1.0, 0, 1.5)
			JFIS G 1 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
		LeftSlashNormal:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE)
			JFIS H 1 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS I 1 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS J 1 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
		Goto LeftSlashFinish
		LeftSlashFinish:
			JFIS K 1
			TNT1 A 1 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
			TNT1 A 0 A_JumpIFInventory("Ability_Kick", 1, "SlashQuickFinish_Left")
			TNT1 AAAAAAA 1
			TNT1 A 0 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
			TNT1 AAAAAAA 1 A_Refire ("RightSlash")
			JFIS ABC 2
		Goto Ready
		SlashQuickFinish_Left:
			TNT1 A 1
			TNT1 AAAAAAA 1 A_WeaponReady(WRF_NOPRIMARY | WRF_NOBOB | WRF_NOSWITCH)
			TNT1 AAAAAAA 1 A_Refire ("RightSlash")
			JFIS ABC 2
		Goto Ready

		RightSlash:
			TNT1 A 0 A_PlaySound("jpcpfist/swing", CHAN_WEAPON, 1.0, 0, 1.5)
			JFIS L 1 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
		RightSlashNormal:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE)
			JFIS M 1 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS N 1 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS O 1 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
		Goto RightSlashFinish
		RightSlashFinish:
			JFIS P 1
			TNT1 A 1
			TNT1 A 0 A_JumpIFInventory("Ability_Kick", 1, "SlashQuickFinish_Right")
			TNT1 AAAAAAA 1
			TNT1 A 0 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
			TNT1 AAAAAAA 1 A_Refire ("LeftSlash")
			JFIS ABC 2
		Goto Ready
		SlashQuickFinish_Right:
			TNT1 A 1
			TNT1 AAAAAAA 1 A_WeaponReady(WRF_NOPRIMARY | WRF_NOBOB | WRF_NOSWITCH)
			TNT1 AAAAAAA 1 A_Refire ("LeftSlash")
			JFIS ABC 2
		Goto Ready
		
		Altfire:
			TNT1 A 0 A_JumpIFInventory("Ability_Kick", 1, "ContinueAltFire")
		CheckNothing:
			TNT1 A 0 A_JumpIfInventory ("KatanaUnsheated", 1, "NothingUnsheathed")
		NothingNormal:
			TNT1 A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		NothingUnsheathed:
			JFIS D 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		ContinueAltFire:
			TNT1 A 0 A_JumpIfInventory ("KatanaUnsheated", 1, "ComboUnsheathed")
			TNT1 A 0 A_JumpIfInventory("KatanaAltTimer_Short", 1, "NothingNormal")
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD On Attack", 0)
			JIA1 A 1 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
			JIA1 B 1 A_PlaySound("jpcpfist/iai", CHAN_WEAPON, 1.0, 0, 1.5)
			
			JIA1 C 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JIA1 D 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JIA1 E 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			
			
			TNT1 AAAA 1
			JFIS L 1 A_PlaySound("jpcpfist/swing", CHAN_WEAPON, 1.0, 0, 1.5)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS M 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS N 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS O 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS P 1
			TNT1 A 2
			JFIS G 1 A_PlaySound("jpcpfist/swing", CHAN_WEAPON, 1.0, 0, 1.5)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS H 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS I 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS J 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS K 1
			TNT1 A 2
			JFIS L 1 A_PlaySound("jpcpfist/swing", CHAN_WEAPON, 1.0, 0, 1.5)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS M 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS N 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS O 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS P 1
			TNT1 A 2
			JFIS G 1 A_PlaySound("jpcpfist/swing", CHAN_WEAPON, 1.0, 0, 1.5)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS H 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS I 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS J 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS K 1
			TNT1 A 2
			TNT1 A 0 A_PlaySound("jpcpfist/iai2", CHAN_WEAPON, 1.0, 0, 1.5)
			JFIS AB 1
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS C 2 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			//TNT1 A 0 A_Recoil(-3.6)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS D 3 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS C 2 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory ("KatanaUnsheated", 1)
			TNT1 A 0 A_GiveInventory("KatanaAltTimer_Short", 1)
			JFIS B 2
		Goto ReadyUnsheathed
		ComboUnsheathed:
			TNT1 A 0 A_JumpIfInventory("KatanaAltTimer", 1, "NothingUnsheathed")
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD On Attack", 0)
			JFIS DA 1 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
			TNT1 A 0 A_PlaySound("jpcpfist/iai2", CHAN_WEAPON, 1.0, 0, 1.5)
			JFIS AB 1
			JFIS C 2 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS D 3 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS C 2 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory ("KatanaUnsheated", 1)
			JFIS BA 1
			TNT1 A 1
			JFIS L 1 A_PlaySound("jpcpfist/swing", CHAN_WEAPON, 1.0, 0, 1.5)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS M 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS N 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS O 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS P 1
			JFIS G 1 A_PlaySound("jpcpfist/swing", CHAN_WEAPON, 1.0, 0, 1.5)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS H 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS I 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS J 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			JFIS K 1
			TNT1 A 0 A_PlaySound("jpcpfist/iai2", CHAN_WEAPON, 1.0, 0, 1.5)
			JFIS AB 1
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS C 2 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS D 3 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			JFIS C 2 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_KATANA, DND_ATK_SECONDARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("KatanaAltTimer", 1)
			JFIS CD 2
		Goto ReadyUnsheathed
		
		
		Reload:
			TNT1 A 0 A_TakeInventory("KatanaIdleTimer", 1)
		Goto ForcedSheathe
	}
}

Actor KatanaBlocker {
	Species "Player"
	Radius 28
	Height 56
	+SHOOTABLE
	+THRUSPECIES
	+NOBLOOD
	+NOGRAVITY
	States {
		Spawn:
			TNT1 A 2
		Stop
	}
}

ACTOR KatanaProjectileSlash {
	Radius 4
	Height 4
	Speed 50
	Mass 0x7fffffff
	Species "Player"
	Projectile
	+THRUACTORS
	+THRUSPECIES
	+NOTONAUTOMAP
	States {
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_SpawnItem("KatanaBlocker")
			TNT1 A 1 A_Stop
		Stop
		Death:
			TNT1 A 0
		Stop
	}
}

Actor KatanaHitFlesh : PowerProtection {
	damagefactor "normal", 1.0
	powerup.duration 5
}

Actor KatanaHitSpark : PowerProtection {
	damagefactor "normal", 1.0
	powerup.duration 5
}

Actor KatanaPuff : DnD_BasePuff {
	Scale 0.8
	
	Stamina 4096
	
	+HITTRACER
	+NOEXTREMEDEATH
	States {
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_JumpIfInventory ("KatanaHitFlesh", 1, 3, AAPTR_TARGET)
			TNT1 A 0 A_GiveInventory ("KatanaHitFlesh", 1, AAPTR_TARGET)
			TNT1 A 0 A_PlaySound("jpcpfist/hit", CHAN_AUTO, 1.0, 0, 1.5)
			TNT1 A 2
		Stop
		Crash:
		HitNoBlood:
			TNT1 A 0 A_JumpIfInventory ("KatanaHitSpark", 1, 3, AAPTR_TARGET)
			TNT1 A 0 A_GiveInventory ("KatanaHitSpark", 1, AAPTR_TARGET)
			TNT1 A 0 A_PlaySound("jpcpfist/hitwall", CHAN_AUTO, 1.0, 0, 1.6)
			TNT1 A 0 A_Jump (256, 1,2,3,4,5,6,7)
			TNT1 AAAAAAA 0 A_SpawnItemEx ("FDJPCPSwordSpark", frandom(-2.0,2.0),frandom(-2.0,2.0),frandom(-2.0,2.0) ,frandom(-5.0,5.0),frandom(-5.0,5.0),frandom(-1.0,4.0), 0, SXF_NOCHECKPOSITION)
		Animation:
			JNSL A 1 Bright Light("FDNormalKatanaSlashLight1")
			JNSL B 1 Bright Light("FDNormalKatanaSlashLight2")
			JNSL C 1 Bright Light("FDNormalKatanaSlashLight3")
			JNSL D 1 Bright Light("FDNormalKatanaSlashLight4")
		Stop
	}
}

Actor KatanaPuff2 : KatanaPuff {
	States {
		Crash:
		HitNoBlood:
			TNT1 A 0 A_JumpIfInventory ("KatanaHitSpark", 1, 3, AAPTR_TARGET)
			TNT1 A 0 A_GiveInventory ("KatanaHitSpark", 1, AAPTR_TARGET)
			TNT1 A 0 A_PlaySound("jpcpfist/hitwall", CHAN_WEAPON, 1.0, 0, 1.6)
			TNT1 A 0 A_Jump (256, 1,2,3,4,5,6,7)
			TNT1 AAAAAAA 0 A_SpawnItemEx ("FDJPCPSwordSpark", frandom(-2.0,2.0),frandom(-2.0,2.0),frandom(-2.0,2.0) ,frandom(-5.0,5.0),frandom(-5.0,5.0),frandom(-1.0,4.0), 0, SXF_NOCHECKPOSITION)
		Animation:
			TNT1 A 0 A_SetScale (scalex - (scalex * 2), scaley)
			JNSL A 1 Bright Light("FDNormalKatanaSlashLight1")
			JNSL B 1 Bright Light("FDNormalKatanaSlashLight2")
			JNSL C 1 Bright Light("FDNormalKatanaSlashLight3")
			JNSL D 1 Bright Light("FDNormalKatanaSlashLight4")
		Stop
	}
}

Actor KatanaPuff3 : KatanaPuff {
	States {
		Crash:
		HitNoBlood:
			TNT1 A 0 A_JumpIfInventory ("KatanaHitSpark", 1, 3, AAPTR_TARGET)
			TNT1 A 0 A_GiveInventory ("KatanaHitSpark", 1, AAPTR_TARGET)
			TNT1 A 0 A_PlaySound("jpcpfist/hitwall", CHAN_WEAPON, 1.0, 0, 1.6)
			TNT1 A 0 A_Jump (256, 1,2,3,4,5,6,7)
			TNT1 AAAAAAA 0 A_SpawnItemEx ("FDJPCPSwordSpark", frandom(-2.0,2.0),frandom(-2.0,2.0),frandom(-2.0,2.0) ,frandom(-5.0,5.0),frandom(-5.0,5.0),frandom(-1.0,4.0), 0, SXF_NOCHECKPOSITION)
		Animation:
			JNSL E 1 Bright Light("FDNormalKatanaSlashLight1")
			JNSL F 1 Bright Light("FDNormalKatanaSlashLight2")
			JNSL G 1 Bright Light("FDNormalKatanaSlashLight3")
			JNSL H 1 Bright Light("FDNormalKatanaSlashLight4")
		Stop
	}
}

Actor FDJPCPSwordSpark { 
	Renderstyle Add
	Scale 0.02
	+CLIENTSIDEONLY
	+NOINTERACTION
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
			TNT1 A 0 A_SetScale (scalex * frandom(0.5,1.5))
		FadeLoop:
			OGLP F 1 Bright A_FadeTo (0, 0.05, 1)
		Loop
	}
}

Actor KatanaShockWaveTrail {
	RenderStyle Add
	Alpha 0.625
	Translation "0:255=%[0.00,0.00,0.00]:[0.94,1.04,1.06]"
	Scale 1.625
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			DAET AAABBBCCCDDDEEE 1 A_FadeOut(0.05)
		Stop
	}
}

Actor KatanaShockWave : DnD_BaseProjectile {
	Projectile
	Speed 60
	Radius 12
	Height 24
	Damage (
		DND_WEAPON_KATANA |
		(DND_DMGID_2 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_MELEE << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	Renderstyle Add
	Alpha 0.875
	Translation "0:255=%[0.00,0.00,0.00]:[0.94,1.04,1.06]"
	Scale 1.625
	ReactionTime 10
	
	Stamina 134250512
	
	var int user_tics;
	var int user_ripperid;				// one time / special rippers need this
	var int user_expdmg;				// bigger collision box imitating rippers need this
	
	// simulate ripper of r = 24, h = 64
	// assume avg area of 56
	
	+DONTREFLECT
	+RIPPER
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_tics", 0)
			TNT1 A 0 A_SetUserVar("user_expdmg",
				DND_WEAPON_KATANA |
				(DND_DMGID_2 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_MELEE << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Update Melee ReactionTime", 10)
		SpawnStateLoop:
			DAET A 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			DAET A 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
			TNT1 A 0 A_ScaleVelocity(0.75)
			TNT1 A 0 A_CountDown
			DAET B 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
			DAET B 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
			TNT1 A 0 A_ScaleVelocity(0.75)
			TNT1 A 0 A_CountDown
			DAET C 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
			DAET C 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
			TNT1 A 0 A_ScaleVelocity(0.75)
			TNT1 A 0 A_CountDown
			DAET D 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
			DAET D 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
			TNT1 A 0 A_ScaleVelocity(0.75)
			TNT1 A 0 A_CountDown
			DAET E 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
			DAET E 1 Bright A_SpawnItemEx("KatanaShockWaveTrail")
			TNT1 A 0 A_Explode(user_expdmg, 56, 0)
			TNT1 A 0 A_SetUserVar("user_tics", user_tics + 4)
		Loop
		Death:
			TNT1 A 1
			TNT1 A 0 A_Stop
			TNT1 A 0 A_ChangeVelocity(0, 0, 0, CVF_REPLACE)
			TNT1 A 5
		Stop
	}
}

// Sprites by Eriance
Actor "Dusk Blade" : Weapon {
	Scale 0.8
	Weapon.SlotNumber 1
	Weapon.SelectionOrder 1600
	Weapon.AmmoType1 "SwordHitCharge"
	Weapon.AmmoType2 "Souls"
	Weapon.AmmoUse2 0
	Inventory.PickupMessage "You got the blade!!!11"
	Obituary "%o was removed by %k's Dusk Blade."
	Tag "$WEP_0_6_TAG"
    +INVENTORY.UNDROPPABLE
	+WEAPON.NOAUTOFIRE
    Weapon.BobStyle InverseSmooth
    Weapon.BobSpeed 2.1
    Weapon.BobRangeY 0.4
    Weapon.BobRangeX 0.7
	States {
		Spawn:
			VORP X -1 
		Stop
		Ready:
			TNT1 A 0 A_JumpIfInventory("DuskMode", 1, "DuskReady")
			VORP A 1 A_WeaponReady
		Loop
		DuskReady:
			VORP JKLM 4 Bright A_WeaponReady(WRF_NOSWITCH)
		Goto Ready
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot1", 1)
		DeselectLoop:
			VORP A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot1", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 25, 0, DND_WEAPON_DUSKBLADE)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 96, 0, DND_WEAPON_DUSKBLADE)
		SelectLoop:
			VORP A 1 A_Raise
			TNT1 A 0 A_Raise
		loop
		Fire:
			TNT1 A 0 A_JumpIfInventory("DuskMode", 1, "FireDusk")
			VORP B 3
			TNT1 A 0 A_GiveInventory("SwordHitCharge", 5)
			TNT1 A 0 A_Refire
			VORP B 1
			VORP C 1 A_AlertMonsters
			TNT1 A 0 A_PlaySound("Sword/Swing")
			VORP D 1 A_TakeInventory("DnD_Weapon_FrameChecker", 0)
			VORP E 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DUSKBLADE, DND_ATK_PRIMARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			VORP F 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DUSKBLADE, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			VORP G 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DUSKBLADE, DND_ATK_PRIMARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_GiveInventory("DnD_Weapon_FrameChecker", 1)
			VORP H 1 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DUSKBLADE, DND_ATK_PRIMARY | DND_ATK_OTHER_DIR, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			TNT1 A 0 A_TakeInventory("SwordHitCharge", 100)
			VORP I 1
			TNT1 A 6
		Goto PreReady
		FireDusk:
			VORP B 1 A_AlertMonsters
			VORP N 1 Bright
			TNT1 A 0 A_PlaySound("Sword/Swing")
			VORP O 1 Bright A_TakeInventory("DnD_Weapon_FrameChecker", 0)
			VORP P 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DUSKBLADE, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE)
			VORP Q 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DUSKBLADE, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			VORP R 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DUSKBLADE, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			VORP S 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DUSKBLADE, DND_ATK_SECONDARY, 0, DND_ATF_NOAMMOTAKE | DND_ATF_NOATTACKTRIGGER)
			VORP T 1 Bright
			TNT1 A 6
		Goto PreReady
		Altfire:
			TNT1 A 0 A_JumpIfInventory("DuskMode", 1, "DuskDoNothing")
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_DUSKBLADE, 1, 0, DND_CFW_ALTFIRECHECK), "ContinueAltFire")
			VORP A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		DuskDoNothing:
			VORP JJJJKKKKLLLLMMMM 1 Bright A_WeaponReady(WRF_NOSECONDARY | WRF_NOSWITCH)
		Goto Ready
		ContinueAltFire:
			VORP A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
			TNT1 A 0 A_SetBlend("60 00 60", 0.85, 9)
			TNT1 A 0 A_GiveInventory("DuskMode", 1)
			VORP M 1
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Take Ammo From Weapon", 0, DND_WEAPON_DUSKBLADE, 1, 11)
		FinishAlt:
			VORP M 1
			TNT1 A 0 A_PlaySound("DuskMode/Activate")
			VORP M 3
		Goto Ready
		PreReady:
			TNT1 A 0 A_JumpIfInventory("DuskMode", 1, "DuskPreReady")
			VORS EDCBA 1
			TNT1 A 0 A_Refire
		Goto Ready
		DuskPreReady:
			VORS FGHI 1 Bright
			VORP J 1 Bright
			TNT1 A 0 A_Refire
		Goto Ready
	}
}

Actor DuskMode : PowerSpeed {
	Speed 1.15
	powerup.color "60 00 60"
	powerup.duration -8
}

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

Actor DuskBladePuff : DnD_BasePuff {
	Radius 1
	Height 1
	RENDERSTYLE Translucent
	ALPHA 0.66
	
	Stamina 528384
	
	+LOOKALLAROUND
	+FORCEXYBILLBOARD
	States {
		Spawn:
			TNT1 AAAA 0
			TNT1 A 0 A_GiveToTarget("DuskHealFX", 1)
			TNT1 A 0 A_SpawnItem("SwordDuskPuff")
			TNT1 A 1 A_PlaySound("Sword/Hit")
		Stop
		Crash:
		HitNoBlood:
			TNT1 AAAAAA 0 A_CustomMissile ("MeleeSmoke", 0, 0, random (0, 360), 2, random (0, 360))
			VFX2 A 3 A_PlaySound("Sword/HitWall")
			VFX2 BCDE 3
		Stop
	}
}

Actor DuskBladePuff_NoArmor : DuskBladePuff {
	States {
		AfterDamage:
			TNT1 A 0 A_GiveToTarget("DuskHealFX_NoArmor", 1)
			TNT1 A 0 A_SpawnItem("SwordDuskPuff")
			TNT1 A 1 A_PlaySound("Sword/Hit")
		Stop
	}
}

Actor SwordDuskPuff {
	Renderstyle Add
	Alpha 0.85
	Translation "0:255=%[0.00,0.00,0.00]:[1.52,0.43,1.88]"
	+CLIENTSIDEONLY
	+NOINTERACTION
	States {
		Spawn:
			VFX4 BCDEFGH 3 Bright
		Stop
	}
}

Actor DuskHealFXSpawner : SoulEffectSpawner {
	Translation "0:255=%[0.00,0.00,0.00]:[1.46,0.52,1.96]"
}

Actor DuskHealFX : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_SpawnItem("DuskHealFXSpawner")
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Give Energy Shield", 0, 1)
		Stop
	}
}

Actor DuskHealFX_NoArmor : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_SpawnItem("DuskHealFXSpawner")
		Stop
	}
}

Actor DuskSlash : DnD_BaseProjectile {
	Radius 8
	Height 16
	Speed 28
	Renderstyle Add
	Alpha 0.9
	Scale 0.55
	ReactionTime 11
	+THRUACTORS
	+EXTREMEDEATH
	+NODAMAGETHRUST
	States {
		SpawnState:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Update Melee ReactionTime", 11)
			TNT1 A 0 A_PlaySound("Sword/SWave")
			//TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
		SpawnLoop:
			VFX4 I 1 Bright A_SpawnItem("DuskSlashTrail",0,0)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager", -24, -64, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager", -12, -32, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager", 12, 32, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager", 24, 64, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_FadeOut(0.05)
			TNT1 A 0 A_CountDown
		Loop
		Crit:
			VFX4 I 1 Bright A_SpawnItem("DuskSlashTrail",0,0)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager_Crit", -24, -64, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager_Crit", -12, -32, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager_Crit", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager_Crit", 12, 32, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("DuskSlash_Damager_Crit", 24, 64, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_FadeOut(0.05)
			TNT1 A 0 A_CountDown
		Loop
		Death:
			TNT1 A 1
		Stop
	}
}

Actor DuskSlash_Damager : DnD_BaseProjectile {
	Radius 5
	Height 10
	Speed 0
	
	Damage (
		DND_WEAPON_DUSKBLADE |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_OCCULT << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	Stamina 403701760
	
	States {
		SpawnState:
			TNT1 A 1
		Stop
		XDeath:
			TNT1 A 0 A_PlaySound("Sword/Hit")
		Death:
			TNT1 A 1
		Stop
	}
}

Actor DuskSlash_Damager_Crit : DuskSlash_Damager {
	Accuracy 69
}

Actor DuskSlashTrail {
	+CLIENTSIDEONLY
	+NOINTERACTION
	Renderstyle Add
	Scale 0.55
	Alpha 0.9
	States {
		Spawn:
			TNT1 A 1
		SpawnLoop:
			VFX4 I 2 Bright A_FadeOut(0.10)
		Loop
	}
}