Actor ResPlasma1 : Weapon {
	Weapon.SelectionOrder 1600
	Weapon.SlotNumber 6
    Inventory.PickupSound "weapons/pickup"
    Inventory.PickupMessage "You got the flame thrower!"	
    Obituary "%o was burned to a crisp by %k's flame thrower."
	Weapon.AmmoType1 "Fuel"
	Weapon.AmmoType2 "FuelClip"
	Weapon.AmmoUse2 0
	Weapon.AmmoUse1 0
	Weapon.AmmoGive1 60
	+WEAPON.NOALERT
	AttackSound ""
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_6_4_TAG"
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 1.8
	Weapon.BobRangeY 0.5
	Weapon.BobRangeX 0.8
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			RW05 X -1
		Stop
		Ready:
			RW05 A 1 A_WeaponReady(WRF_ALLOWRELOAD)
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot6", 1)
		DeselectLoop:
			RW05 A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot6", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 1, 1 | (4 << 16), DND_WEAPON_FLAMETHROWER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 2, 0, DND_WEAPON_FLAMETHROWER)
	    SelectLoop:
			RW05 A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_FLAMETHROWER, 1), "FireConfirmed")
			RW05 A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Reload
		FireConfirmed:
			RW05 B 1 Bright A_AlertMonsters
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FLAMETHROWER, DND_ATK_SECONDARY, DND_AMMOSLOT_MAGAZINE | (DND_MAGAZINE_FUELCLIP), 0)
			RW05 B 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FLAMETHROWER, DND_ATK_SECONDARY, DND_AMMOSLOT_MAGAZINE | (DND_MAGAZINE_FUELCLIP), DND_ATF_NOAMMOTAKE)
			RW05 C 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FLAMETHROWER, DND_ATK_SECONDARY, DND_AMMOSLOT_MAGAZINE | (DND_MAGAZINE_FUELCLIP), 0)
			RW05 C 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FLAMETHROWER, DND_ATK_SECONDARY, DND_AMMOSLOT_MAGAZINE | (DND_MAGAZINE_FUELCLIP), 0)
			RW05 D 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FLAMETHROWER, DND_ATK_SECONDARY, DND_AMMOSLOT_MAGAZINE | (DND_MAGAZINE_FUELCLIP), 0)
			RW05 D 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_FLAMETHROWER, DND_ATK_SECONDARY, DND_AMMOSLOT_MAGAZINE | (DND_MAGAZINE_FUELCLIP), DND_ATF_NOAMMOTAKE)
			RW05 E 3 Bright A_Refire("Fire")
		FireEnd:
			RW05 FGHI 2
			RW05 A 2	
		Goto Ready
		Reload:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_FLAMETHROWER, 0), "ContinueReload")
			RW05 A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		ContinueReload:
			TNT1 A 0 A_JumpIfInventory("FuelClip", 0, "Failed")
			TNT1 A 0 A_JumpIfInventory("Ability_Reloader", 1, "ReloadFaster")
			RW05 J 3
			TNT1 A 0 A_PlayWeaponSound("FlameThrower/Out")
			RW05 K 3
			TNT1 A 0 A_FireCustomMissile("FlameThrowerFuelTankDrop", frandom(-12.0, 12.0), 0, 0, 0)
			RW05 LMNO 3
			RW05 P 18
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Handle Reload", 0, DND_WEAPON_FLAMETHROWER)
			TNT1 A 0 A_PlayWeaponSound("FlameThrower/In")
			RW05 Q 4
			RW05 RSTU 4
			RW05 A 2
		Goto Ready
		Failed:
			RW05 A 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		
		ReloadFaster:
			RW05 J 1
			TNT1 A 0 A_PlayWeaponSound("FlameThrower/Out")
			RW05 K 2
			TNT1 A 0 A_FireCustomMissile("FlameThrowerFuelTankDrop", frandom(-12.0, 12.0), 0, 0, 0)
			RW05 LM 1
			RW05 NO 2
			RW05 P 9
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Handle Reload", 0, DND_WEAPON_FLAMETHROWER)
			TNT1 A 0 A_PlayWeaponSound("FlameThrower/In")
			RW05 Q 2
			RW05 RSTU 2
			RW05 A 1
		Goto Ready
		Flash:
		  TNT1 A 4 A_Light1
		  TNT1 A 3 A_Light2
		  TNT1 A 0 A_Light0
		  stop
	}
}

// damage every 2 tics
// radius: 8 -> 16 -> 32 -> 64
// first 30 tics dont hurt player
// then 16 tics player hurting dmg
// damage is the same
Actor FTExplosion1 : DnD_ExplosiveBase {
	Speed 0
	+THRUACTORS
	+NODAMAGETHRUST
	var int user_count;
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 1 A_SetUserVar("user_count", 23)
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_FLAMETHROWER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_FIRE << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 0)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF | DND_DAMAGEFLAG_ISDAMAGEOVERTIME | DND_DAMAGEFLAG_ADDEDIGNITE)
		ExplosionLoop:
			TNT1 A 0 A_SetUserVar("user_expradius", 8 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 2 A_SetUserVar("user_count", user_count - 1)
			TNT1 A 1 A_JumpIf(user_count == 0, "Finish")
			TNT1 A 0 A_JumpIf(user_count == 11 || user_count == 14 || user_count == 17 || user_count == 20, "Update")
			TNT1 A 0 A_JumpIf(user_count == 14, "Update")
			TNT1 A 0 A_JumpIf(user_count == 17, "Update")
			TNT1 A 0 A_JumpIf(user_count == 20, "Update")
		Goto ExplosionLoop
		Update:
			TNT1 A 0 A_SetUserVar("user_expradius", user_expradius * 2)
		Goto ExplosionLoop
		Finish:
			TNT1 A 1
		Stop
	}
}

Actor FTExplosion1_NoSelf : FTExplosion1 {
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 1 A_SetUserVar("user_count", 23)
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_FLAMETHROWER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_FIRE << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 0)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_ISDAMAGEOVERTIME | DND_DAMAGEFLAG_ADDEDIGNITE)
		ExplosionLoop:
			TNT1 A 0 A_SetUserVar("user_expradius", 8 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 2 A_SetUserVar("user_count", user_count - 1)
			TNT1 A 1 A_JumpIf(user_count == 0, "Finish")
			TNT1 A 0 A_JumpIf(user_count == 11 || user_count == 14 || user_count == 17 || user_count == 20, "Update")
			TNT1 A 0 A_JumpIf(user_count == 14, "Update")
			TNT1 A 0 A_JumpIf(user_count == 17, "Update")
			TNT1 A 0 A_JumpIf(user_count == 20, "Update")
		Goto ExplosionLoop
		Update:
			TNT1 A 0 A_SetUserVar("user_expradius", user_expradius * 2)
		Goto ExplosionLoop
		Finish:
			TNT1 A 1
		Stop
	}
}

// this just always hurts player and has same radius all around
// lasts 5 x 14 = 70 damages, deals damage every 2 tics
// uses radius 32, same damage
Actor FTExplosion2 : DnD_ExplosiveBase {
	Speed 0
	+THRUACTORS
	+NODAMAGETHRUST
	var int user_count;
	States {
		SpawnState:
			TNT1 A 0
		Death:
			TNT1 A 1 A_SetUserVar("user_count", 70)
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_FLAMETHROWER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_FIRE << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 0)
			TNT1 A 0 A_SetUserVar("user_expflags", DND_DAMAGEFLAG_BLASTSELF | DND_DAMAGEFLAG_ISDAMAGEOVERTIME | DND_DAMAGEFLAG_ADDEDIGNITE)
			TNT1 A 0 A_SetUserVar("user_expradius", 32 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
		ExplosionLoop:
			TNT1 A 1
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 1 A_SetUserVar("user_count", user_count - 1)
			TNT1 A 1 A_JumpIf(user_count > 0, "ExplosionLoop")
		Stop
	}
}

// spawn state explosions dont hurt player
Actor FTFire : DnD_BaseProjectile {
	Radius 2
	Height 4
	Speed 16
	RenderStyle Add
	Alpha 0.67
	Scale 0.67
	SeeSound "Flamethrower/Fire"
	DeathSound "Flamethrower/Hit"
	
	Damage(
		DND_WEAPON_FLAMETHROWER |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_FIRE << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	Stamina 262144
	
	+MTHRUSPECIES
	States {
		SpawnState:
			TNT1 A 2
			TNT1 A 0 A_CustomMissile("FTExplosion1_NoSelf", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			FRFX ABCD 2 bright
			TNT1 A 0 A_LowGravity
			FRFX EFGHIJKLMNO 2 bright
		Stop
		Death:
			FRFX HIJ 2 bright
			TNT1 A 0 A_CustomMissile("DropFire", 0, 0, 0, CMF_TRACKOWNER)
			FRFX KLMNO 2 bright
		Stop
	}
}

Actor DropFire : DnD_BaseProjectile {
	Radius 2
	Height 32
	RenderStyle Add
	Alpha 0.90
	+THRUSPECIES
	+THRUACTORS
	-NoGravity
	+LowGravity
	+NoExplodeFloor
	+NoDamageThrust
	States {
		SpawnState:
			TNT1 A 0 A_SetScale(frandom(0.925, 1.0), frandom(0.925, 1.0))
			TNT1 A 0 A_CustomMissile("FTExplosion2", 0, 0, 0, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_Jump(128, "Var2", "Var3", "Var4")
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME ABCDEFGHIJKLMN 2 bright 
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME ABCDEFGHIJKLMN 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME ABCDEFGHIJKLMN 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME ABCDEFGHIJKLMN 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME ABCDEFGHIJKLMN 2 bright
			TNT1 A 0 A_Jump(192, "Death")
		Loop
		Var2:
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME EFGHIJKLMNABCD 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME EFGHIJKLMNABCD 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME EFGHIJKLMNABCD 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME EFGHIJKLMNABCD 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME EFGHIJKLMNABCD 2 bright
			TNT1 A 0 A_Jump(192, "Death")
		Loop
		Var3:
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME HIJKLMNABCDEFG 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME HIJKLMNABCDEFG 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME HIJKLMNABCDEFG 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME HIJKLMNABCDEFG 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME HIJKLMNABCDEFG 2 bright
			TNT1 A 0 A_Jump(192, "Death")
		Loop
		Var4:
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME LMNABCDEFGHIJK 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME LMNABCDEFGHIJK 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME LMNABCDEFGHIJK 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME LMNABCDEFGHIJK 2 bright
			TNT1 A 0 A_PlaySound("Flamethrower/Flame")
			FLME LMNABCDEFGHIJK 2 bright
			TNT1 A 0 A_Jump(192, "Death")
		Loop
		Death:
			FLME B 2 bright A_SetScale(0.925, 0.925)
			FLME C 2 bright A_SetScale(0.85, 0.85)
			FLME D 2 bright A_SetScale(0.775, 0.775)
			FLME E 2 bright A_SetScale(0.7, 0.7)
			FLME F 2 bright A_SetScale(0.625, 0.625)
			FLME G 2 bright A_SetScale(0.55, 0.55)
			FLME H 2 bright A_SetScale(0.475, 0.475)
			FLME I 2 bright A_SetScale(0.4, 0.4)
			FLME J 2 bright A_SetScale(0.325, 0.325)
			FLME K 2 bright A_SetScale(0.25, 0.25)
			FLME L 2 bright A_SetScale(0.175, 0.175)
			FLME M 2 bright A_SetScale(0.1, 0.1)
			FLME N 2 bright A_SetScale(0.025, 0.025)
		Stop
	}
}

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

const int lg_dmg_min = 7;
const int lg_dmg_max = 10;

// Taken from D4forDoom mod, prob most of this is by MajorCooke
Actor ResPlasma2 : Weapon {
	Weapon.SelectionOrder 1600
	Weapon.SlotNumber 6
    Inventory.PickupSound "weapons/pickup"
    Inventory.PickupMessage "You got the lightning gun!"	
    Obituary "%o was shocked by %k's lightning gun."
	Weapon.AmmoType1 "LightningCell"
	Weapon.AmmoType2 "LightningStacks"
	Weapon.AmmoUse2 0
	Weapon.AmmoUse1 0
	Weapon.AmmoGive1 60
	AttackSound ""
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_6_5_TAG"
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.0
	Weapon.BobRangeY 0.5
	Weapon.BobRangeX 0.8
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			LTGS A -1
		Stop
		Ready:
			TNT1 A 0 A_StopSound(7)
		ReadyLoop:
			LGNI AABBCC 1 A_WeaponReady(WRF_ALLOWRELOAD)
			TNT1 A 0 A_TakeInventory("LightningStacks", 5)
		Loop
		Deselect:
			TNT1 A 0 A_StopSound(7)
			TNT1 A 0 A_TakeInventory("LightningStacks", 0)
			TNT1 A 0 A_StopSound(CHAN_WEAPON)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot6", 1)
			TNT1 A 0 A_TakeInventory("P_PlasmaFire", 1)
			LGNI A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot6", 1)
			TNT1 A 0 A_GiveInventory("P_PlasmaFire", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 1, lg_dmg_min | (lg_dmg_max << 16), DND_WEAPON_LIGHTNINGGUN)
	    SelectLoop:
			LGNI A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_LIGHTNINGGUN, 0), "FireConfirmed")
			LGNI AABBCC 1 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			TNT1 A 0 A_PlaySound("LightningGun/Fire", CHAN_WEAPON, 1, 1)
			TNT1 A 0 A_PlaySound("LightningGun/Loop", 7, 0.5, 1)
		HoldPt1:
			TNT1 A 0 A_GunFlash
			LGNF A 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_LIGHTNINGGUN, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_LIGHTNING << 16), 0)
			LGNF B 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_LIGHTNINGGUN, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_LIGHTNING << 16), DND_ATF_NOAMMOTAKE)
			TNT1 A 0 A_GiveInventory("LightningStacks", 1)
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_LIGHTNINGGUN, 0), "HoldCheck2")
			LGNF A 2
		Goto EndHold
		HoldCheck2:
			LGNF A 2 A_ReFire("HoldPt2")		//it has 2 stages of fire, to be able to do the "quick tap"
		Goto EndHold
		HoldPt2:
			LGNF A 0 A_GunFlash
			LGNF C 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_LIGHTNINGGUN, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_LIGHTNING << 16), 0)
			LGNF A 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_LIGHTNINGGUN, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_LIGHTNING << 16), DND_ATF_NOAMMOTAKE)
			TNT1 A 0 A_GiveInventory("LightningStacks", 1)
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_LIGHTNINGGUN, 0), "HoldCheck3")
			LGNF B 2
		Goto EndHold
		HoldCheck3:
			LGNI B 2 A_ReFire("HoldPt3")
		Goto EndHold
		HoldPt3:
			LGNF A 0 A_GunFlash
			LGNF B 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_LIGHTNINGGUN, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_LIGHTNING << 16), 0)
			LGNF C 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_LIGHTNINGGUN, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_LIGHTNING << 16), DND_ATF_NOAMMOTAKE)
			TNT1 A 0 A_GiveInventory("LightningStacks", 1)
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_LIGHTNINGGUN, 0), "HoldCheck4")
			LGNF C 2
		Goto EndHold
		HoldCheck4:
			LGNI C 2 A_ReFire("HoldPt1")
		Goto EndHold
		EndHold:
			TNT1 A 0 A_TakeInventory("LightningStacks", 5)
			LGNI A 1
			TNT1 A 0 A_StopSound(7)
			LGNI A 1 A_PlaySound("LightningGun/FireEnd", CHAN_WEAPON)
		Goto Ready
		AltFire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_LIGHTNINGGUN, 0, 3), "ContinueAlt")
			TNT1 A 0 A_TakeInventory("LightningStacks", 5)
			LGNI AABBCC 1 A_WeaponReady(WRF_ALLOWRELOAD | WRF_NOSECONDARY)
		Goto Ready
		ContinueAlt:
			LGNG A 3 A_PlaySound("LightningGun/Fire", CHAN_WEAPON, 1, 1)
			LGNG B 3
		Goto AlternateHold
		AlternateHold:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_LIGHTNINGGUN, 0, 3), "ContinueHold")
			LGNG B 2
		Goto AltEndHold
		ContinueHold:
			TNT1 A 0 A_GunFlash			
			LGNG C 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_LIGHTNINGGUN, DND_ATK_PRIMARY | DND_ATK_OTHER_DIR, DND_AMMOSLOT_CELL | (AMMO_LIGHTNING << 16), 0)
			TNT1 A 0 A_GiveInventory("LightningStacks", 3)
			LGNG D 1 Bright ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_LIGHTNINGGUN, DND_ATK_PRIMARY | DND_ATK_OTHER_DIR, DND_AMMOSLOT_CELL | (AMMO_LIGHTNING << 16), DND_ATF_NOAMMOTAKE)
			LGNG B 1 A_ReFire("AlternateHold")		
		Goto AltEndHold
		AltEndHold:
			LGNI A 0 A_PlaySound("LightningGun/FireEnd", CHAN_WEAPON)
			LGNG B 1 A_WeaponReady(WRF_ALLOWRELOAD | WRF_NOSECONDARY | WRF_NOBOB) 
			TNT1 A 0 A_StopSound(7)
			LGNG B 2 A_WeaponReady(WRF_ALLOWRELOAD | WRF_NOSECONDARY | WRF_NOBOB)
			LGNG A 3 A_WeaponReady(WRF_ALLOWRELOAD | WRF_NOSECONDARY | WRF_NOBOB)
		Goto Ready
		
		Flash:
		  TNT1 A 4 A_Light1
		  TNT1 A 3 A_Light2
		  TNT1 A 0 A_Light0
		  stop
	}
}

Actor LGShooter : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_RailAttack(
				DND_WEAPON_LIGHTNINGGUN |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_LIGHTNING << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT), 
				4, 1, None, None, RGF_SILENT|RGF_NOPIERCING, 32, "LGPuffSEX",0,0,512,0,18,0,"D4LGTrail")
		Stop
	}
}

Actor LGAltShooter : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_RailAttack(
				DND_WEAPON_LIGHTNINGGUN |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_LIGHTNING << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT), 
				4,0,None,None,RGF_EXPLICITANGLE | RGF_SILENT|RGF_NOPIERCING,256,"LGAltPuff",frandom(-12.0, 12.0) * (1.0 - accuracy * accuracy_factor),frandom(-5.5, 5.5) * (1.0 - accuracy * accuracy_factor),384,0,9.0,0,"LGAltTrail"
			)
			TNT1 A 0 A_RailAttack(
				DND_WEAPON_LIGHTNINGGUN |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_LIGHTNING << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT), 
				4,0,None,None,RGF_EXPLICITANGLE | RGF_SILENT|RGF_NOPIERCING,256,"LGAltPuff_NoPain",frandom(-12.0, 12.0) * (1.0 - accuracy * accuracy_factor),frandom(-5.5, 5.5) * (1.0 - accuracy * accuracy_factor),384,0,9.0,0,"LGAltTrail"
			)
		Stop
	}
}

Actor LGPuffSEX : DnD_BaseRailPuff {
	Height 4
	Radius 2
	+THRUSPECIES
	States {
		Spawn:
		Crash:
		HitNoBlood:
			TNT1 AAAA 0
			TNT1 A 1 A_SpawnItemEx("LGPuffEffect", 0, 0, 0, 0, 0, 0, 0, SXF_TRANSFERTRANSLATION)
		Stop
	}
}

Actor LGPuffNoPain : LGPuffSEX {
	+PAINLESS
	+BLOODLESSIMPACT
}

Actor D4LGTrail {
	+NOINTERACTION
	Scale 0.16
	RenderStyle Add
	Translation "0:255=%[0,0,0]:[0.3,0.6,1.4]"
	+FORCEXYBILLBOARD
	+CLIENTSIDEONLY
	States {
		Spawn:
			TNT1 A 0 NoDelay A_Warp(AAPTR_TARGET,x,y,z,0,WARPF_NOCHECKPOSITION|WARPF_USECALLERANGLE)
			TNT1 A 0 A_SpawnItemEx("ElectDrSpark",0,0,0,frandom(-2.0, 2.0),frandom(-2.0, 2.0),frandom(-2.0, 2.0),0,SXF_NOCHECKPOSITION|SXF_TRANSFERTRANSLATION,224)
			TNT1 A 0 A_Jump(256, "1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
		1:
			HSP2 A 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
		2:
			HSP2 B 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
		3:
			HSP2 C 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
		4:
			HSP2 D 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
		5:
			HSP2 E 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
		6:
			HSP2 F 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
		7:
			HSP2 G 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
		8:
			HSP2 H 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
		9:
			HSP2 I 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
		10:
			HSP2 J 1 BRIGHT A_FadeOut(0.125)
			TNT1 A 0 A_Warp(AAPTR_TARGET,cos(-pitch),8+frandom(-1,1),frandom(-1,1)+32+sin(-pitch),0,WARPF_NOCHECKPOSITION|WARPF_INTERPOLATE)
		Loop
	}
}

Actor LGAltTrail : D4LGTrail {
	Translation "0:255=%[0,0,0]:[0.7,0.4,1.5]"
}

Actor LGAltPuff : LGPuffSEX {
	Translation "0:255=%[0,0,0]:[0.7,0.4,1.5]"
}

Actor LGAltPuff_NoPain : LGAltPuff {
	+PAINLESS
}

Actor LGPuffEffect {
	+CLIENTSIDEONLY
	+NOINTERACTION
	Scale 0.35
	Renderstyle Add
	States {
		Spawn:
			TNT1 A 0 NoDelay A_Jump(256, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
			DB08 ABCDEFGHIJLKMNOPQRSTUVWXYZ 1 BRIGHT A_Jump(256, "Play")
		Play:
			"----" "##" 2 Bright
		Stop
	}
}

Actor ResPlasma3 : Weapon {	
	Weapon.Slotnumber 6
	Weapon.SelectionOrder 600
	+INVENTORY.UNDROPPABLE
	Weapon.BobStyle InverseSmooth
	Weapon.BobSpeed 2.0
	Weapon.BobRangeY 0.35
	Weapon.BobRangeX 0.65
	Weapon.AmmoGive 0
	Weapon.AmmoType1 "Cell"
	Weapon.AmmoType2 "RebounderOverheat"
	Weapon.AmmoUse1 0
	Weapon.AmmoUse2 0
	Tag "$WEP_6_6_TAG"
	+WEAPON.NOAUTOAIM
	States {
		Spawn:
			DGAP A -1
		Stop
		Ready:
			TNT1 A 0 A_GiveInventory("DnD_OverheatCanReduce", 1)
			TNT1 A 0 ACS_NamedExecuteAlways("DnD Overheat Reduction", 0, DND_OVERHEAT_REBOUNDER, 4 | (10 << 16))
		ReadyLoop:
			DGAG A 3 A_WeaponReady
		Loop
		Deselect:
			TNT1 A 0 A_TakeInventory("P_PlasmaFire", 1)
			TNT1 A 0 A_TakeInventory("H_WeaponSlot6", 1)
			TNT1 A 0 A_TakeInventory("DnD_UsingEnergy", 1)
		DeselectLoop:
			DGAG 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_WeaponSlot6", 1)
			TNT1 A 0 A_GiveInventory("DnD_UsingEnergy", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 35, 0, DND_WEAPON_REBOUNDER)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 150, 0, DND_WEAPON_REBOUNDER)
		SelectLoop:
			DGAG A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_REBOUNDER, 0), "FireConfirmed")
			DGAG A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			TNT1 A 0 A_TakeInventory("DnD_OverheatCanReduce", 1)
			DGAF A 2 Bright
			TNT1 A 0 A_PlayWeaponSound("Rebounder/Fire")
			TNT1 A 0 A_SpawnItemEx("GunSmokeSmaller", 18 * cos(-pitch), 3, 34 * (1 + sin(-pitch)), 0, 0, 1)
			TNT1 A 0 A_SpawnItemEx ("PlasmaSmoke2", cos(-pitch) * 25, 4, 35 + (sin(-pitch)*20),0,0,0,0,0,0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_REBOUNDER, DND_ATK_PRIMARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), 0)
			TNT1 A 0 A_GiveInventory("RebounderCooldownGiver", 1)
			DGAF BCDEFG 1
		Goto Ready
		AltFire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_REBOUNDER, 1), "AltFireConfirmed")
			DGAG A 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		AltFireConfirmed:
			TNT1 A 0 A_TakeInventory("DnD_OverheatCanReduce", 1)
			DGXF A 2 Bright
			TNT1 A 0 A_PlayWeaponSound("Rebounder/AltFire")
			TNT1 A 0 A_SpawnItemEx("GunSmokeSmaller", 18 * cos(-pitch), 3, 34 * (1 + sin(-pitch)), 0, 0, 1)
			TNT1 A 0 A_SpawnItemEx ("PlasmaSmoke2", cos(-pitch) * 25, 4, 35 + (sin(-pitch)*20),0,0,0,0,0,0)
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_REBOUNDER, DND_ATK_SECONDARY, DND_AMMOSLOT_CELL | (AMMO_CELL << 16), 0)
			TNT1 A 0 A_GiveInventory("RebounderCooldownGiver", 1)
			DGXF B 1
			TNT1 A 0 A_SetPitch(pitch - 5.0)
			DGXF CDEF 1 A_SetPitch(pitch + 0.5)
			DGAE ABCD 1 A_SetPitch(pitch + 0.5)
			DGAR AA 1 A_SetPitch(pitch + 0.5)
			DGAR BCDE 2
			DGAR F 8
			DGAR GHI 3
			DGAR JKLM 2
			DGAG A 4
		Goto Ready
		
		Nothing:
			DGAG A 1 A_WeaponReady(WRF_NOSWITCH | WRF_NOFIRE)
		Goto Ready
		
		Flash:
			TNT1 A 1 A_Light1
			TNT1 A 1 A_Light2
			TNT1 A 1 A_Light1
			TNT1 A 1 A_Light0
		stop
	}
}

Actor RebounderProjectile : DnD_BaseProjectile {
	Height 16
	Radius 8
	Speed 32
	Scale 0.25
	Renderstyle Add
	Alpha 0.85
	Deathsound "Rebounder/Hit"
	
	Damage(
		DND_WEAPON_REBOUNDER |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+DONTREFLECT
	States {
		SpawnState:
			REBP A 1 Bright A_SpawnItemEx("RebounderTrail")
		Loop
		Death:
			TNT1 A 0 A_SpawnItem("RebounderHitFX")
		Stop
	}
}

Actor RebounderProjectile_Crit : RebounderProjectile {
	Accuracy 69
}

Actor RebounderProjectileB1 : RebounderProjectile {
	States {
		Death:
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 A 0 A_CustomMissile("RebounderProjectile", 0, 4, 90, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectile", 0, -4, -90, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
		Crit:
			TNT1 A 0 A_CustomMissile("RebounderProjectile_Crit", 0, 4, 90, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectile_Crit", 0, -4, -90, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
	}
}

Actor RebounderProjectileB1_Crit : RebounderProjectileB1 {
	Accuracy 69
	States {
		Death:
			TNT1 A 0 A_CustomMissile("RebounderProjectile_Crit", 0, 4, 90, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectile_Crit", 0, -4, -90, CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
	}
}

Actor RebounderProjectileB2 : RebounderProjectile {
	States {
		Death:
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 A 0 A_CustomMissile("RebounderProjectileB1", 0, 4, 90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectileB1", 0, -4, -90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
		Crit:
			TNT1 A 0 A_CustomMissile("RebounderProjectileB1_Crit", 0, 4, 90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectileB1_Crit", 0, -4, -90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
	}
}

Actor RebounderProjectileB2_Crit : RebounderProjectileB2 {
	Accuracy 69
	States {
		Death:
			TNT1 A 0 A_CustomMissile("RebounderProjectileB1_Crit", 0, 4, 90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectileB1_Crit", 0, -4, -90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
	}
}

Actor RebounderProjectileB3 : RebounderProjectile {
	States {
		Death:
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 A 0 A_CustomMissile("RebounderProjectileB2", 0, 4, 90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectileB2", 0, -4, -90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
		Crit:
			TNT1 A 0 A_CustomMissile("RebounderProjectileB2_Crit", 0, 4, 90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectileB2_Crit", 0, -4, -90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
	}
}

Actor RebounderProjectileB3_Crit : RebounderProjectileB3 {
	Accuracy 69
	States {
		Death:
			TNT1 A 0 A_CustomMissile("RebounderProjectileB2_Crit", 0, 4, 90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectileB2_Crit", 0, -4, -90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
	}
}

Actor RebounderProjectileB4 : RebounderProjectile {
	States {
		Death:
			TNT1 A 0 A_JumpIf(accuracy == DND_CRITTOKEN, "Crit")
			TNT1 A 0 A_CustomMissile("RebounderProjectileB3", 0, 4, 90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectileB3", 0, -4, -90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
		Crit:
			TNT1 A 0 A_CustomMissile("RebounderProjectileB3_Crit", 0, 4, 90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 0 A_CustomMissile("RebounderProjectileB3_Crit", 0, -4, -90 + frandom(-10, 10), CMF_TRACKOWNER | CMF_AIMDIRECTION)
			TNT1 A 1 A_SpawnItem("RebounderHitFX")
		Stop
	}
}

Actor RebounderTrail {
	+CLIENTSIDEONLY
	+NOINTERACTION
	Scale 0.25
	Renderstyle Add
	Alpha 0.85
	States {
		Spawn:
			TNT1 A 0 NoDelay Thing_ChangeTID(0, SPECIAL_FX_TID)
		SpawnLoop:
			REBP A 1 Bright A_FadeOut(0.15)
		Loop
	}
}

Actor RebounderHitFX {
	Renderstyle Add
	Alpha 0.85
	Scale 1.15
	+CLIENTSIDEONLY
	+NOINTERACTION
	States {
		Spawn:
			REBP BC 3 Bright
			REBP DEF 2 Bright
		Stop
	}
}

Actor RebounderCooldownGiver : DnD_Activator {
	States {
		Pickup:
			TNT1 A 0 A_JumpIfInventory("RebounderOverHeat", 0, "Give")
		Stop
		Give:
			TNT1 A 0 A_GiveInventory("RebounderCooldown", 1)
		Stop
	}
}

Actor RebounderCooldown : PowerDamage {
	powerup.duration -3
	damagefactor "normal", 1.0
}

// dont hurt player
Actor RebounderProjectileAlt : DnD_ExplosiveBase {
	Height 24
	Radius 12
	Speed 48
	Scale 0.5
	Renderstyle Add
	Alpha 0.85
	Deathsound "Rebounder/Hit"
	
	Damage(
		DND_WEAPON_REBOUNDER |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+DONTREFLECT
	+FOILINVUL
	var int user_count;
	States {
		SpawnState:
			REBP A 1 Bright A_SpawnItemEx("RebounderTrail2")
		Loop
		Death:
			TNT1 A 0 A_SpawnItem("RebounderHitFX2")
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Hit Monster Trait Check", DND_ISBLOCKING), "BigExplosion")
			TNT1 A 0 A_CheckFlag("DONTRIP", "BigExplosion", AAPTR_TRACER)
			TNT1 A 0 A_CheckFlag("INVULNERABLE", "BigExplosion", AAPTR_TRACER)
			TNT1 A 1 A_CheckFlag("REFLECTIVE", "BigExplosion", AAPTR_TRACER)
		Cont:
			TNT1 AAAAAA 1 A_JumpIfInventory("DnD_Boolean", 1, "RealExplosion")
		Stop
		BigExplosion:
			TNT1 A 0 A_GiveInventory("DnD_Boolean", 1)
		Goto Cont
		RealExplosion:
			TNT1 A 0 A_SetUserVar("user_count", 4)
			TNT1 A 0 Radius_Quake(5, 10, 0, 4, 0)
			TNT1 A 0 A_PlaySound("Rebounder/AltHit", 7)
			TNT1 A 0 A_SpawnItemEx("RebounderHitFX3")
			
			TNT1 A 0 A_SetUserVar("user_expdmg", 
				DND_WEAPON_REBOUNDER |
				(DND_DMGID_1 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_ENERGY << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
			TNT1 A 0 A_SetUserVar("user_fullexpradius", 0)
			TNT1 A 0 A_SetUserVar("user_expradius", 256 * (1.0 + ACS_NamedExecuteWithResult("DND Explosion Radius Retrieve", DND_USETARGET) * exprad_factor))
		ExplosionLoop:
			TNT1 A 1
		Goto DoExplosionDamage
		ContinueFromExplosion:
			TNT1 A 5 A_SetUserVar("user_count", user_count - 1)
			TNT1 A 1 A_JumpIf(user_count > 0, "ExplosionLoop")
		Stop
	}
}

Actor RebounderHitFX2 : RebounderHitFX {
	Scale 1.5
}

Actor RebounderHitFX3 : RebounderHitFX {
	Scale 1.0
	States {
		Spawn:
			REBP GH 3 Bright
			REBP IJKLMNO 2 Bright
		Stop
	}
}

Actor RebounderTrail2 : RebounderTrail {
	Scale 0.4
}

const int lance_lvl_1 = 20;
const int lance_lvl_2 = 40;
const int lance_lvl_3 = 60;
const int lance_lvl_4 = 80;

Actor "ResPlasma4" : Weapon {
	Weapon.SelectionOrder 900
	Weapon.SlotNumber 6
    Inventory.PickupSound "weapons/pickup"
    Inventory.PickupMessage "You got the Dark Lance!"	
    Obituary "%o had their soul pierced by %k's Dark Lance."
	Weapon.AmmoType1 "DemonBlood"
	Weapon.AmmoType2 "LanceStacks"
	Weapon.AmmoUse2 0
	Weapon.AmmoUse1 0
	Weapon.AmmoGive1 10
	+INVENTORY.UNDROPPABLE
	Tag "$WEP_6_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
		
		Ready:
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_4, "Level4_Ready")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_3, "Level3_Ready")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_2, "Level2_Ready")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_1, "Level1_Ready")
			RW10 A 1 A_WeaponReady
		Loop
		Level4_Ready:
			RW10 W 1 A_WeaponReady
		Goto Ready
		Level3_Ready:
			RW10 V 1 A_WeaponReady
		Goto Ready
		Level2_Ready:
			RW10 U 1 A_WeaponReady
		Goto Ready
		Level1_Ready:
			RW10 T 1 A_WeaponReady
		Goto Ready
		
		Deselect:
			TNT1 A 0 A_TakeInventory("H_WeaponSlot6", 1)
			TNT1 A 0 A_TakeInventory("P_GrayFire", 1)
		DeselectLoop:
			RW10 A 1 A_Lower
			TNT1 A 0 A_Lower
		Loop
		Select:
			TNT1 A 0 A_GiveInventory("H_WeaponSlot6", 1)
			TNT1 A 0 A_GiveInventory("P_GrayFire", 1)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_0, 25, 0, DND_WEAPON_DARKLANCE)
			TNT1 A 0 ACS_NamedExecuteWithResult("DND Weapon Damage Cache", DND_DMGID_1, 50, 0, DND_WEAPON_DARKLANCE)
	    SelectLoop:
			RW10 A 1 A_Raise
			TNT1 A 0 A_Raise
		Loop
		
		Fire:
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("DnD Can Fire Weapon", DND_WEAPON_DARKLANCE, 0), "FireConfirmed")
			RW10 W 0 A_JumpIfInventory("LanceStacks", lance_lvl_4, "NoFiring")
			RW10 V 0 A_JumpIfInventory("LanceStacks", lance_lvl_3, "NoFiring")
			RW10 U 0 A_JumpIfInventory("LanceStacks", lance_lvl_2, "NoFiring")
			RW10 T 0 A_JumpIfInventory("LanceStacks", lance_lvl_1, "NoFiring")
			RW10 A 0
		NoFiring:
			"####" "#" 3 A_WeaponReady(WRF_NOFIRE | WRF_NOSWITCH)
		Goto Ready
		FireConfirmed:
			TNT1 A 0 A_PlayWeaponSound("Darklance/Charge")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_4, "Level4")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_3, "Level3")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_2, "Level2")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_1, "Level1")
		Level0:
			RW10 A 1
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L3", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R3", 0, 0)
			RW10 BCDBCDBCD 2 Bright
		Goto FireEnd
		Level4:
			RW10 W 1
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L3", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R3", 0, 0)
			RW10 NOPNOPNOP 2 Bright
		Goto FireEnd
		Level3:
			RW10 V 1
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L3", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R3", 0, 0)
			RW10 KLMKLMKLM 2 Bright
		Goto FireEnd
		Level2:
			RW10 U 1
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L3", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R3", 0, 0)
			RW10 HIJHIJHIJ 2 Bright
		Goto FireEnd
		Level1:
			RW10 T 1
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_L3", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R1", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R2", 0, 0)
			TNT1 A 0 A_FireCustomMissile("DarkLanceEffect_R3", 0, 0)
			RW10 EFGEFGEFG 2 Bright
		Goto FireEnd
		
		
		FireEnd:
			TNT1 A 0 A_StopSound(CHAN_WEAPON)
			TNT1 A 0 A_PlaySound("Darklance/Fire")
			TNT1 A 0 A_SpawnItemEx("GrayFlare_DarkLance", 28 * cos(-pitch), 0, 36 * (1 + sin(-pitch)))
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DARKLANCE, DND_ATK_PRIMARY, DND_AMMOSLOT_SHELL | (AMMO_DEMONBLOOD << 16), 0)
			RW10 S 1 Offset(0, 40)
			RW10 S 1 Offset(0, 42)
			RW10 S 2 Offset(0, 43)
			RW10 S 1 Offset(0, 40)
			RW10 S 1 Offset(0, 36)
			RW10 S 1 Offset(0, 32)
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_4, "Level4_End")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_3, "Level3_End")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_2, "Level2_End")
			TNT1 A 0 A_JumpIfInventory("LanceStacks", lance_lvl_1, "Level1_End")
		Level0_End:
			RW10 A 8
		Goto Ready
		Level4_End:
			RW10 W 8
		Goto Ready
		Level3_End:
			RW10 V 8
		Goto Ready
		Level2_End:
			RW10 U 8
		Goto Ready
		Level1_End:
			RW10 T 8
		Goto Ready
		
		Altfire:
			"####" "#" 1 A_JumpIfInventory("LanceStacks", 1, "ContinueAlt")
			"####" "#" 1 A_WeaponReady(WRF_NOFIRE)
		Goto Ready
		ContinueAlt:
			TNT1 A 0 A_StopSound(CHAN_WEAPON)
			TNT1 A 0 A_TakeInventory("LanceBuffer", 0)
			RW10 Q 5 Bright
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Lance Stack Buffer")
			TNT1 A 0 A_PlaySound("Darklance/AltFire", CHAN_5)
			TNT1 A 0 A_SpawnItemEx("GrayFlare_DarkLance", 28 * cos(-pitch), 0, 36 * (1 + sin(-pitch)))
			RW10 R 1 Bright Offset(0, 40) ACS_NamedExecuteWithResult("DnD Fire Weapon", DND_WEAPON_DARKLANCE, DND_ATK_SECONDARY, DND_AMMOSLOT_SHELL | (AMMO_DEMONBLOOD << 16), DND_ATF_NOAMMOTAKE | DND_ATF_NOAMMOGAINCHECK)
			RW10 R 1 Bright Offset(0, 42)
			RW10 R 2 Bright Offset(0, 43)
			RW10 R 1 Bright Offset(0, 40)
			RW10 R 1 Bright Offset(0, 36)
			RW10 R 1 Bright Offset(0, 32)
			RW10 S 6
		Goto Ready
	}
}

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

Actor GrayFlare_DarkLance : GrayFlare {
	Scale 0.1
}

Actor DarkLanceEffect_L1 {
	Scale 0.175
	Height 1
	Radius 1
	Renderstyle Add
	Alpha 0.01
	const float f = 1.0 / 18;
	+MISSILE
	+NOCLIP
	+CLIENTSIDEONLY
	+NOINTERACTION
	States {
		Spawn:
			TNT1 A 1
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Dark Lance Aligner", 36, -8, 36, 18)
		Goto SpawnLoop
		SpawnLoop:
			OGLP FFFFFFFFFFFFFFFFFF 1 Bright A_FadeIn(f)
		Stop
	}
}

Actor DarkLanceEffect_L2 : DarkLanceEffect_L1 {
	States {
		Spawn:
			TNT1 A 1
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Dark Lance Aligner", 32, -12, 32, 18)
		Goto Super::SpawnLoop
	}
}

Actor DarkLanceEffect_L3 : DarkLanceEffect_L1 {
	States {
		Spawn:
			TNT1 A 1
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Dark Lance Aligner", 28, -16, 28, 18)
		Goto Super::SpawnLoop
	}
}

Actor DarkLanceEffect_R1 : DarkLanceEffect_L1 {
	States {
		Spawn:
			TNT1 A 1
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Dark Lance Aligner", 36, 8, 36, 18)
		Goto Super::SpawnLoop
	}
}

Actor DarkLanceEffect_R2 : DarkLanceEffect_L1 {
	States {
		Spawn:
			TNT1 A 1
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Dark Lance Aligner", 32, 12, 32, 18)
		Goto Super::SpawnLoop
	}
}

Actor DarkLanceEffect_R3 : DarkLanceEffect_L1 {
	States {
		Spawn:
			TNT1 A 1
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Dark Lance Aligner", 28, 16, 28, 18)
		Goto Super::SpawnLoop
	}
}

Actor DarkLanceProjectile : DnD_BaseFastProjectile {
	Speed 90
	Height 8
	Radius 4
	Renderstyle Add
	Scale 0.275
	DeathSound "weapons/firex5_l"
	
	Stamina 32768
	
	var int user_ripperid;
	var int user_expdmg;
	
	Damage(
		DND_WEAPON_DARKLANCE |
		(DND_DMGID_0 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_OCCULT << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	+RIPPER
	+BLOODLESSIMPACT
	States {
		SpawnState:
			TNT1 A 0 A_SetUserVar("user_expdmg",
				DND_WEAPON_DARKLANCE |
				(DND_DMGID_0 << CACHE_SHIFT) |
				(DND_DAMAGETYPE_OCCULT << DTYPE_SHIFT) |
				(100 << DPCT_SHIFT)
			)
		SpawnLoop:
			OGLP F 1 Bright A_Explode(user_expdmg, 12, 0)
			TNT1 A 0 A_ChangeFlag("THRUACTORS", 1)
		Loop
		Death:
			TNT1 AAA 0 A_CustomMissile("FireballSmoke", 0, 0, random(0,360), 2, random(0,360))
			TNT1 A 0 A_SetScale(1.0, 1.0)
			SRV1 DEFGHIJ 2 Bright
		Stop
	}
}

Actor DarkLanceShredder : DnD_BaseProjectile {
	Speed 45
	Height 32
	Radius 16
	RenderStyle Add
	DeathSound "DarkLance/AltHit"
	
	Damage(
		DND_WEAPON_DARKLANCE |
		(DND_DMGID_1 << CACHE_SHIFT) |
		(DND_DAMAGETYPE_OCCULT << DTYPE_SHIFT) |
		(100 << DPCT_SHIFT)
	)
	
	Stamina 8
	
	+DONTREFLECT
	States {
		SpawnState:
			FX69 AAABBBCCCDDDEEE 1 Bright A_SpawnItemEx("DarkLanceShredder_Trail")
		Loop
		XDeath:
			TNT1 A 0 ACS_NamedExecuteWithResult("DnD Dark Lance Shred", 0)
			TNT1 A 0 A_PlaySound("DarkLance/Curse", CHAN_5)
			SRV3 ABCD 4 Bright
			SRV3 EFGHI 3 Bright
		Stop
		Death:
			TNT1 A 0 A_SetScale(1.25, 1.25)
			FX69 F 1 Bright A_SetScale(scalex - 0.105, scaley - 0.105)
			TNT1 A 0 A_FadeOut(0.0875)
			FX69 F 1 Bright A_SetScale(scalex - 0.105, scaley - 0.105)
			TNT1 A 0 A_FadeOut(0.0875)
			FX69 F 1 Bright A_SetScale(scalex - 0.105, scaley - 0.105)
			TNT1 A 0 A_FadeOut(0.0875)
			FX69 F 1 Bright A_SetScale(scalex - 0.105, scaley - 0.105)
			TNT1 A 0 A_FadeOut(0.0875)
			FX69 F 1 Bright A_SetScale(scalex - 0.105, scaley - 0.105)
			TNT1 A 0 A_FadeOut(0.0875)
			FX69 F 1 Bright A_SetScale(scalex - 0.105, scaley - 0.105)
			TNT1 A 0 A_FadeOut(0.0875)
			FX69 F 1 Bright A_SetScale(scalex - 0.105, scaley - 0.105)
			TNT1 A 0 A_FadeOut(0.0875)
			FX69 F 1 Bright A_SetScale(scalex - 0.105, scaley - 0.105)
		Stop
	}
}

Actor DarkLanceShredder_Trail {
	Renderstyle Add
	Scale 1.25
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			FX68 ABCDEF 2 Bright
		Stop
	}
}

Actor DarkLanceShredder_FX {
	Renderstyle Add
	Alpha 0.4
	Scale 1.0
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			TNT1 A 0
		SpawnLoop:
			X122 AABBCCDDEEFFGGHH 1 Bright A_FadeIn(0.0375)
			X122 IIJJKKLLMMNNOOPP 1 Bright A_FadeOut(0.0375)
		Loop
		Vanish:
			"####" "#" 0 A_PlaySound("DarkLance/Consume")
			"####" "####" 1 Bright A_FadeOut(0.2)
		Stop
	}
}

Actor DarkLanceConsumeFX {
	+NOINTERACTION
	+CLIENTSIDEONLY
	States {
		Spawn:
			TNT1 A 0 NoDelay A_SpawnItemEx("GrayFlare", 0, 0, 16)
			TNT1 A 0 A_SpawnItemEx("WhiteParticleSpawner")
			TNT1 A 2
		Stop
	}
}

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

Actor LanceBuffer : Inventory {
	inventory.maxamount 100
}