// shotgun pickup that creates random weapon values
ACTOR RandomShotgunPickup : PickupBase
{
	States
	{
		Spawn:
			TNT1 A 0	// functions on the first "Spawn"-frame do not get executed (https://zdoom.org/wiki/Actor_states).
			TNT1 A 0 A_SetUserVar("user_isBDPickupItem", 1)	// mark thing as BorderDoom pickup item
			TNT1 A 0 A_SetUserVar("user_pickupType", ItemType_Shotgun)	// set pickup type to weapon (shotgun)
			TNT1 A 0 ACS_NamedExecuteAlways("CreateRandomShotgunData")
			TNT1 A 0 A_SetSpecial(ACS_ExecuteAlways,901,0,0,0,0)	// script for picking up the item
			goto Waiting
		Waiting:
			SHOT A -1
			stop
		// called by script. makes the pickup "useable" for a short amount of time so it can be picked up.
		IsUseable:
			SHOT A 0 A_ChangeFlag("USESPECIAL", TRUE)
			SHOT A 7
			SHOT A 0 A_ChangeFlag("USESPECIAL", FALSE)
			goto Waiting
	}
}

// shotgun pickup that uses pre-existing/pre-set weapon values
ACTOR FixedShotgunPickup : RandomShotgunPickup
{
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_SetUserVar("user_isBDPickupItem", 1)	// mark thing as BorderDoom pickup item
			TNT1 A 0 A_SetUserVar("user_pickupType", ItemType_Shotgun)	// set pickup type to weapon (shotgun)
			TNT1 A 0 A_SetSpecial(ACS_ExecuteAlways,901,0,0,0,0)	// script for picking up the item
			SHOT A -1
			stop	// FIXME? should use "A_Jump" to go to "Waiting" state. but works as long it gets set to "IsUseable" state by script.
	}
}

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////

ACTOR RealShotgun : Shotgun
{
	Weapon.AmmoGive 0
	Weapon.BobSpeed 2.0

	+INVENTORY.UNDROPPABLE	// should only be dropped by script
	+Weapon.CHEATNOTWEAPON	// don't give this weapon when using cheats
	+Weapon.Ammo_Optional

	Decal BulletChip	// so this weapon also creates decals when fired at walls
	Tag "Shotgun"

	States
	{
		Ready:
			SHTG A 1 A_WeaponReady(WRF_ALLOWRELOAD)
			TNT1 A 0 A_JumpIfNoAmmo("Reload")	// auto-reload if player has more ammo
			Loop
		Select:
			TNT1 A 0 ACS_NamedExecuteAlways("SetWeaponDamageMultiplier")
//			TNT1 A 0 ACS_NamedExecute("PrintEquippedWeaponInfo", 0, CallACS("GetWeaponIndex"))
			SHTG A 1 A_Raise
			Loop
		Fire:
//			SHTG A 3
			TNT1 A 0 A_JumpIfNoAmmo("NoAmmo")
			goto DoFire
			// play "click" sound if no ammo remains in magazine/clip and player has no ammo to reload
			NoAmmo:
			TNT1 A 0 A_JumpIfInventory("Shell", 1, "Reload")
			TNT1 A 0 A_PlaySound("player/noammo", CHAN_AUTO)
			// the hold state is necessary to avoid repeated clicks
			NoAmmoHold:
			SHTG A 1 A_WeaponReady(WRF_NOFIRE)
			TNT1 A 0 A_Refire("NoAmmoHold")
			goto Ready
			DoFire:
			TNT1 A 0 A_Quake (4, 4, 0, 1)
			SHTG A 0 A_PlaySound ("shotgun/fire_med", CHAN_AUTO)
			SHTG A 0 A_FireBullets (CallACS("GetCurrentSpread")/65536.0, (CallACS("GetCurrentSpread")/65536.0)/2, CallACS("GetCurrentBulletcount"), CallACS("GetCurrentDamage"), "BulletPuff", FBF_USEAMMO|FBF_NORANDOM)
			TNT1 A 0 ACS_NamedExecuteAlways("WeaponRecoil", 0, CallACS("GetCurrentRecoil"), 90, 8)

			TNT1 A 0 A_JumpIf(CallACS("GetCurrentFirerate") == 1, "FireSpeed1")
			TNT1 A 0 A_JumpIf(CallACS("GetCurrentFirerate") == 2, "FireSpeed2")
			TNT1 A 0 A_JumpIf(CallACS("GetCurrentFirerate") == 3, "FireSpeed3")
			TNT1 A 0 A_JumpIf(CallACS("GetCurrentFirerate") == 4, "FireSpeed4")
			TNT1 A 0 A_JumpIf(CallACS("GetCurrentFirerate") == 5, "FireSpeed5")
			Goto Ready
		// fire speeds: very fast: -2, fast: -1, normal: +0, slow: +1, very slow: +2
		FireSpeed1:
			SHTG A 1 Offset(0, 48) A_GunFlash
			SHTG A 2 Offset(0, 40)
			SHTG A 2 Offset(0, 32)
			SHTG BC 3
			SHTG D 2 A_PlaySound("shotgun/pump_in", CHAN_WEAPON)
			SHTG C 3 A_PlaySound("shotgun/pump_out", CHAN_WEAPON)
			SHTG B 3
			SHTG A 2
			SHTG A 0 A_ReFire
			Goto Ready
		FireSpeed2:
			SHTG A 1 Offset(0, 48) A_GunFlash
			SHTG A 2 Offset(0, 40)
			SHTG A 3 Offset(0, 32)
			SHTG BC 4
			SHTG D 3 A_PlaySound("shotgun/pump_in", CHAN_WEAPON)
			SHTG C 4 A_PlaySound("shotgun/pump_out", CHAN_WEAPON)
			SHTG B 4
			SHTG A 2
			SHTG A 0 A_ReFire
			Goto Ready
		FireSpeed3:
			SHTG A 1 Offset(0, 48) A_GunFlash
			SHTG A 2 Offset(0, 40)
			SHTG A 4 Offset(0, 32)
			SHTG BC 5
			SHTG D 4 A_PlaySound("shotgun/pump_in", CHAN_WEAPON)
			SHTG C 5 A_PlaySound("shotgun/pump_out", CHAN_WEAPON)
			SHTG B 5
			SHTG A 2
			SHTG A 0 A_ReFire
			Goto Ready
		FireSpeed4:
			SHTG A 1 Offset(0, 48) A_GunFlash
			SHTG A 2 Offset(0, 40)
			SHTG A 5 Offset(0, 32)
			SHTG BC 6
			SHTG D 5 A_PlaySound("shotgun/pump_in", CHAN_WEAPON)
			SHTG C 6 A_PlaySound("shotgun/pump_out", CHAN_WEAPON)
			SHTG B 6
			SHTG A 2
			SHTG A 0 A_ReFire
			Goto Ready
		FireSpeed5:
			SHTG A 1 Offset(0, 48) A_GunFlash
			SHTG A 2 Offset(0, 40)
			SHTG A 6 Offset(0, 32)
			SHTG BC 7
			SHTG D 6 A_PlaySound("shotgun/pump_in", CHAN_WEAPON)
			SHTG C 7 A_PlaySound("shotgun/pump_out", CHAN_WEAPON)
			SHTG B 7
			SHTG A 2
			SHTG A 0 A_ReFire
			Goto Ready
		Flash:
			SHTF A 2 Bright A_Light1
			SHTF B 1 Bright A_Light2
			Goto LightDone

		ReloadWork:
			SHTG D 0 A_ZoomFactor(1.0)
			TNT1 A 0 A_PlaySound("shotgun/reload_detach", CHAN_WEAPON)
			SHTG D 1 Offset(30,40)
			SHTG D 1 Offset(30,48)
			SHTG D 1 Offset(30,56)
			SHTG D 1 Offset(30,64)
			SHTG D 1 Offset(30,72)
			SHTG D 1 Offset(30,80)
			SHTG D 1 Offset(30,88)
			SHTG D 1 Offset(30,96)
			TNT1 A 0 A_PlaySound("shotgun/reload_hit", CHAN_WEAPON)
			SHTG D 40	// wait for reload
			TNT1 A 0 A_PlaySound("shotgun/reload_attach", CHAN_WEAPON)
			SHTG D 0 A_Jump(256, "ReloadLoop")	// A_Jump jumps are virtual, "goto" is not
			//Goto ReloadLoop
		ReloadFinish:
			SHTG D 1 Offset(30,96)
			SHTG D 1 Offset(30,90)
			SHTG D 1 Offset(30,84)
			SHTG D 1 Offset(30,78)
			SHTG D 1 Offset(30,72)
			SHTG D 1 Offset(30,66)
			SHTG D 1 Offset(30,60)
			SHTG D 1 Offset(30,54)
			SHTG D 1 Offset(30,48)
			SHTG D 1 Offset(30,42)
			SHTG D 1 Offset(30,36)
			Goto Ready
	}
}


///////////////////////////////
// EQUIPPABLE SHOTGUNS
///////////////////////////////
// used ammo types have to be explicitly written here because strings can not be returned from ACS

ACTOR RealShotgun0 : RealShotgun
{
	Weapon.SlotNumber 1
	Weapon.AmmoType "LoadedAmmoSlot0"

	States
	{
		Reload:
			TNT1 A 0 A_JumpIfInventory("LoadedAmmoSlot0", CallACS("GetCurrentClipSize"), "Ready")	// ignore if fully loaded
			TNT1 A 0 A_JumpIfInventory("Shell", 1, "ReloadWork")	// do real reload
			Goto Ready
		ReloadLoop:
			TNT1 A 0 A_TakeInventory("Shell", 1)
			TNT1 A 0 A_GiveInventory("LoadedAmmoSlot0", 1)
			TNT1 A 0 A_JumpIfInventory("LoadedAmmoSlot0", CallACS("GetCurrentClipSize"), "ReloadFinish")
			TNT1 A 0 A_JumpIfInventory("Shell", 1, "ReloadLoop")
			Goto ReloadFinish
	}
}

ACTOR RealShotgun1 : RealShotgun
{
	Weapon.SlotNumber 2
	Weapon.AmmoType "LoadedAmmoSlot1"

	States
	{
		Reload:
			TNT1 A 0 A_JumpIfInventory("LoadedAmmoSlot1", CallACS("GetCurrentClipSize"), "Ready")	// ignore if fully loaded
			TNT1 A 0 A_JumpIfInventory("Shell", 1, "ReloadWork")	// do real reload
			Goto Ready
		ReloadLoop:
			TNT1 A 0 A_TakeInventory("Shell", 1)
			TNT1 A 0 A_GiveInventory("LoadedAmmoSlot1", 1)
			TNT1 A 0 A_JumpIfInventory("LoadedAmmoSlot1", CallACS("GetCurrentClipSize"), "ReloadFinish")
			TNT1 A 0 A_JumpIfInventory("Shell", 1, "ReloadLoop")
			Goto ReloadFinish
	}
}

ACTOR RealShotgun2 : RealShotgun
{
	Weapon.SlotNumber 3
	Weapon.AmmoType "LoadedAmmoSlot2"

	States
	{
		Reload:
			TNT1 A 0 A_JumpIfInventory("LoadedAmmoSlot2", CallACS("GetCurrentClipSize"), "Ready")	// ignore if fully loaded
			TNT1 A 0 A_JumpIfInventory("Shell", 1, "ReloadWork")	// do real reload
			Goto Ready
		ReloadLoop:
			TNT1 A 0 A_TakeInventory("Shell", 1)
			TNT1 A 0 A_GiveInventory("LoadedAmmoSlot2", 1)
			TNT1 A 0 A_JumpIfInventory("LoadedAmmoSlot2", CallACS("GetCurrentClipSize"), "ReloadFinish")
			TNT1 A 0 A_JumpIfInventory("Shell", 1, "ReloadLoop")
			Goto ReloadFinish
	}
}
