//==-----------------------------------------==
// R A V A G E R   A M M U N I T I O N
//
// Maximum unperked is 100
// Gun 1: > 9
// Gun 2: <= 6
// Gun 3: <= 3
// Gun 4: <= 0
//
// Hand 1: > 97
// Hand 2: <= 97
// Hand 3: <= 94
// Hand 4: <= 91
// Hand 5: <= 88
//==-----------------------------------------==

// Controls raising and lowering the left hand
ACTOR HideLeftHand : Boolean {}

ACTOR RavagerPrimary : Ammo
{
  Inventory.Amount 0
  Inventory.MaxAmount 150
  Ammo.BackpackAmount 0
  Ammo.BackpackMaxAmount 150
  +IGNORESKILL
  Inventory.Icon "CLIPA0"
}

ACTOR RavagerSecondary : Ammo
{
  Inventory.Amount 25
  Inventory.MaxAmount 300
  Ammo.BackpackAmount 25
  Ammo.BackpackMaxAmount 300
  +IGNORESKILL
  Inventory.Icon "CLIPA0"
}

ACTOR M60FireMode : FireMode {}

// STATE TO GO TO
// 0: SELECT
// 1: READY
// 2: DESELECT
// 3: RELOAD
ACTOR M60State : Inventory { Inventory.MaxAmount 4 }
ACTOR M60StateH : Inventory { Inventory.MaxAmount 4 }

ACTOR "SS-2 Ravager" : Weapon
{
  +WEAPON.NOAUTOAIM
  +WEAPON.NOAUTOFIRE
  +WEAPON.AMMO_OPTIONAL
  Weapon.BobStyle Smooth
  Weapon.BobSpeed 2.5
  Weapon.BobRangeX 0.5
  Weapon.BobRangeY 0.3
   Weapon.SelectionOrder 100
   Weapon.AmmoUse 1
   Weapon.AmmoGive2 100
   Weapon.AmmoType "RavagerPrimary"
   Weapon.AmmoType2 "RavagerSecondary"
   Inventory.PickupMessage "You got the SS-2 Ravager. Yes!" // "You got the chaingun"
   Inventory.PickupSound "m60/boltfwd"
   Obituary "%o was mowed down by %k's Ravager"
   Tag "SS-2 Ravager"
   Scale 0.25
   States
   {
   Select:
	 M6S1 A 0 A_TakeInventory("M60State", 99)
	 M6S1 A 0 A_TakeInventory("M60StateH", 99)
	 M6S1 A 0 A_Raise
	 Goto FrameSet
	 
//==========================================================
// -- FRAME SET: GUN
//==========================================================

  FrameSet:
    TNT1 A 0 A_JumpIfInventory("M60State", 3, "FrameSetR")
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 9, "FrameSet1")
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 6, "FrameSet2")
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 3, "FrameSet3")
	Goto FrameSet4
  FrameSet1:
	M6S1 A 0
	Goto FrameJump
  FrameSet2:
	M6S2 A 0
	Goto FrameJump
  FrameSet3:
	M6S3 A 0
	Goto FrameJump
  FrameSet4:
	M6S4 A 0
	Goto FrameJump
	
  FrameSetR:
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 9, "FrameSetR1")
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 6, "FrameSetR2")
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 3, "FrameSetR3")
	M6E1 A 0
	Goto FrameJump
  FrameSetR1:
	M6E1 A 0
	Goto FrameJump
  FrameSetR2:
	M6E2 A 0
	Goto FrameJump
  FrameSetR3:
	M6E3 A 0
	Goto FrameJump
	
  // Which state?
  FrameJump:
	"####" "#" 0 A_JumpIfInventory("M60State",3,"Eject")
	"####" "#" 0 A_JumpIfInventory("M60State",2,"DeselectAnim")
	"####" "#" 0 A_JumpIfInventory("M60State",1,"ToReady")
	"####" "#" 0
	Goto SelectAnim
	
//==========================================================
// -- FRAME SET: HAND
//==========================================================

  FrameSetH:
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 97, "FrameSetH1")
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 94, "FrameSetH2")
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 91, "FrameSetH3")
	TNT1 A 0 A_JumpIfInventory("RavagerPrimary", 88, "FrameSetH4")
	Goto FrameSetH5
  FrameSetH1:
	H6S1 A 0
	Goto FrameJumpH
  FrameSetH2:
	H6S2 A 0
	Goto FrameJumpH
  FrameSetH3:
	H6S3 A 0
	Goto FrameJumpH
  FrameSetH4:
	H6S4 A 0
	Goto FrameJumpH
  FrameSetH5:
	TNT1 A 0
	Goto FrameJumpH
	
  // Which state?
  FrameJumpH:
	"####" "#" 0 A_JumpIfInventory("M60StateH",2,"DeselectHand")
	"####" "#" 0 A_JumpIfInventory("M60StateH",1,"ReadyHand")
	Goto SelectHand
	 
//==========================================================
// -- SELECT
//==========================================================

  SelectAnim:
	"####" A 0 A_TakeInventory("M60State", 99)
	"####" A 0 A_GiveInventory("M60State", 1)
	"####" A 0 A_SetCrosshair( ACS_NamedExecuteWithResult("GetCrosshair",0) )
	"####" A 0 A_PlaySoundEx("m60/deploy","SoundSlot5")
	"####" A 0 A_TakeInventory("HideLeftHand",1)
	"####" ABC 1  A_WeaponReady(WRF_NOSWITCH|WRF_NOFIRE)
	"####" A 0 A_GunFlash("FrameSetH")
	"####" DEFGH 1 A_WeaponReady(WRF_NOSWITCH|WRF_NOFIRE)
	Goto FrameSet
	
  SelectHand:
	"####" A 0 A_TakeInventory("M60StateH", 99)
	"####" A 0 A_GiveInventory("M60StateH", 1)
	"####" ABCD 1
	Goto ReadyHand
	
//==========================================================
// -- DESELECT
//==========================================================

  Deselect:
	"####" A 0 A_TakeInventory("HideLeftHand",1)
	"####" A 0 A_TakeInventory("M60StateH", 99)
	"####" A 0 A_GiveInventory("M60StateH", 2)
	"####" A 0 A_GunFlash("FrameSetH")
	
	"####" A 0 A_TakeInventory("M60State", 99)
	"####" A 0 A_GiveInventory("M60State", 2)
	Goto FrameSet
	
  DeselectAnim:
	"####" FEDCBA 1
  ReallyLower:
	TNT1 AAAAAAAAAA 0 A_Lower
	TNT1 A 1 A_Lower
	Loop

  DeselectHand:
	"####" DCBA 1
	TNT1 A 1
	Stop

//==========================================================
// -- IDLING
//==========================================================

  // HACK: Must have a sprite in the ready state for the gun to work
  // Zdoom "magic", whoops I mean TRAGIC
  ToReady:
	"####" "#" 0
	Goto Ready+1
	
  Ready:
	M6S1 I 0 
	"####" I 0 A_JumpIfInventory("IsReloading",1,"ReloadCheck")
	// "####" I 0 A_JumpIfInventory("PendingQuickness",1,"ToQuick")
	"####" I 1 A_WeaponReady
	Goto Ready+1
	
  ToQuick:
	"####" A 0 ACS_NamedExecute("ProcessQuick",0,0,0,0)
	Goto Ready+2
	
  ReadyHand:
	"####" D 1
	Loop
	
//==========================================================
// -- FIRING
//==========================================================

  // Perform a special exception if the hand is going to
  // run out of bullets to hold
  Fire:
	"####" A 0 A_JumpIfInventory("RavagerPrimary",1,1)
	Goto ToReady
	"####" A 0 A_JumpIfInventory("RavagerPrimary",89,"DoHandFlash")
	Goto ActualFire
	
  DoHandFlash:
	"####" A 0 A_GunFlash("FireHand")
	Goto ActualFire
	
  ActualFire:
	"####" A 0 A_FireCustomMissile("MuzzleSmokeFX",0,0,4,0)
	"####" A 0 A_PlayWeaponSound("m60/fire")
	"####" A 0 A_FireCustomMissile("LongRifleCaseSpawn",5,0,20,-3)
	"####" A 0 A_FireCustomMissile("BlackLinkSpawn",5,0,20,-3)
	"####" A 0 A_PlaySoundEx("m60/distant","SoundSlot6")
	"####" A 0 A_Recoil(1.0)
	"####" A 0 A_SpawnItemEx("ShooterLight",0,0,0)
	"####" A 0 A_JumpIfInventory("Perk_Commando",1,"FireFXPerk")
	Goto FireFX
  FireFX:
	"####" A 0 A_FireBullets(5.6, 5.6, 1, 30, "BulletPuff2")
	"####" A 0 A_FireCustomMissile("ShakeYourAssDouble",0,0)
	"####" A 0 A_SetPitch(Pitch-5.0)
	Goto FireJump
  FireFXPerk:
	"####" A 0 A_FireBullets(2.6, 2.6, 1, 30, "BulletPuff2")
	"####" A 0 A_FireCustomMissile("ShakeYourAss",0,0)
	"####" A 0 A_SetPitch(Pitch-2.5)
	Goto FireJump
  FireJump:
	"####" A 0 A_Jump(256, "MF1", "MF2", "MF3")
  MF1:
	"####" J 1 bright A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	Goto FireEnd
  MF2:
	"####" K 1 bright A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	Goto FireEnd
  MF3:
	"####" L 1 bright A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	Goto FireEnd
  FireEnd:
	"####" MNO 1 bright A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	"####" A 0 A_JumpIfInventory("M60FireMode",1,"Ready")
	"####" A 0 A_Refire
	Goto Ready
	
  FireHand:
	"####" EEF 1
	"####" A 0 A_JumpIfInventory("RavagerPrimary",89,"FrameSetH")
	"####" A 0 A_TakeInventory("M60StateH",99)
	"####" A 0 A_GiveInventory("M60StateH",2)
	Goto FrameSetH
	
//==========================================================
// -- PRE-RELOAD EJECT
//==========================================================
  ReloadCheck:
	TNT1 A 0 A_TakeInventory("IsReloading",1)
	TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("ReloadAllowed",0), 1)
	Goto Ready
	//9MRL A 0 ACS_ExecuteAlways(820,0,0,0,0)
	9MRL A 0 A_TakeInventory("M60State", 99)
	9MRL A 0 A_GiveInventory("M60State", 3)
	
	// Move the hand down
	M6R2 P 0 A_TakeInventory("M60StateH", 99)
	M6R2 P 0 A_GiveInventory("M60StateH", 2)
	M6R2 P 0 A_GunFlash("FrameSetH")
	
	Goto FrameSet
	
  Eject:
	"####" A 0 A_JumpIfInventory("RavagerPrimary",1,1)
	Goto EjectEmpty
	"####" A 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	"####" BCDE 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	"####" A 0 A_PlaySoundEx("m60/clipout","SoundSlot5") // EJECT SOUND
	"####" FG 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	"####" Z 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	"####" A 0 A_JumpIfInventory("RavagerPrimary",9,"ES1")
	"####" A 0 A_JumpIfInventory("RavagerPrimary",6,"ES2")
	"####" A 0 A_JumpIfInventory("RavagerPrimary",3,"ES3")
	Goto ReloadAnim
	
  // No pull back or anything, just DROP it
  EjectEmpty:
	"####" A 0 A_PlaySoundEx("m60/clipout","SoundSlot5") // EJECT SOUND
	"####" Z 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	Goto ReloadAnim
	
  ES1:
	"####" A 0 A_FireCustomMissile("M60Shooter11",5,0,16,-3)
	Goto ReloadAnim
  ES2:
	"####" A 0 A_FireCustomMissile("M60Shooter6",5,0,16,-3)
	Goto ReloadAnim
  ES3:
	"####" A 0 A_FireCustomMissile("M60Shooter3",5,0,16,-3)
	Goto ReloadAnim

//==========================================================
// -- RELOADING
//==========================================================

  ReloadAnim:
	M6R1 A 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 B 3 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 C 4 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 D 3 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 G 0 A_PlaySoundEx("m60/cliptoss","SoundSlot5") // EJECT SOUND
	M6R1 E 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 F 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 G 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 H 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 IJKLM 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 N 3 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 O 4 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 P 3 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 S 0 A_PlaySoundEx("m60/clipin","SoundSlot5") // EJECT SOUND
	
	"####" A 0 ACS_NamedExecuteAlways("ReloadAmmo",0,0,0,0)
	
	M6R1 QR 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 S 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 T 3 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 U 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 V 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R1 WXYZ 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 ABC 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 E 0 A_PlaySoundEx("m60/boltback","SoundSlot5") // EJECT SOUND
	M6R2 DE 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 FG 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 H 4 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 J 0 A_PlaySoundEx("m60/boltfwd","SoundSlot5") // EJECT SOUND
	M6R2 H 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 I 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 J 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 K 2 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 L 3 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 MNO 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	
	M6R2 P 0 A_TakeInventory("M60StateH", 99)
	M6R2 P 0 A_GunFlash("FrameSetH")
	
	M6R2 PQ 1 A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH)
	M6R2 Q 0 A_TakeInventory("M60State", 99)
	M6R2 Q 0 A_GiveInventory("M60State", 1)
	Goto FrameSet

   //=================================================================================
   
   AltFire:
	"####" "#" 0 ACS_NamedExecuteAlways("FireModeSwitch",0,0,0,0)
	"####" "#" 0 A_JumpIfInventory("M60FireMode",1,"ToSemi")
	"####" "#" 0 A_PlaySoundEx("modeswitch/on", "SoundSlot6")
	 Goto XHairCheck
   ToSemi:
	 "####" "#" 0 A_PlaySoundEx("modeswitch/off", "SoundSlot6")
	 Goto XHairCheck
   XHairCheck:
	 "####" "#" 1
	 "####" "#" 0 A_SetCrosshair( ACS_NamedExecuteWithResult("GetCrosshair",0) )
	 Goto Ready
	 
   //=================================================================================

   Spawn:
     HMGP A -1
     Stop
   }
}