Actor SpecOpsShotgunner 17566
{
//$Category Monsters/DUST
//$Sprite SPE1A1
//$Title "Spec-Ops Shotgunner"
  Health 150
  Height 56
  Radius 20
  Speed 8
  PainChance 96
  Monster
  +FloorClip
  +NoTarget
  +NoInfighting
  Species "SpecOps"
  SeeSound "SpecOpsZombie/Sight"
  ActiveSound "SpecOpsZombie/Active"
  PainSound "SpecOpsZombie/Pain"
  DeathSound "SpecOpsZombie/Death"
  Obituary "%o was gunned down by a Spec Ops Zombie."
  Decal BulletChip
  DropItem "Combat Shotgun" 256 1
  DropItem "StimKit" 80
  DropItem "ArmorBooster" 80
  DropItem "AmmoPack" 60
  DropItem "HandGrenadeAmmo" 100 1
  DropItem "MineAmmo" 50 1
  DropItem "NewShell" 100 20
  DropItem "NewShell" 100 20
  States
  {
  Spawn:
    SPE1 A 1 A_Look
    Loop

  //Switching
  See:
	TNT1 A 0 A_JumpIfTargetInLOS("See2")
	SPE1 ABCD 4 A_Chase
	Loop
  
  See2:
    SPE1 A 0 A_TakeInventory("ZSpecOpAggressive", 1)
    SPE1 A 0 A_TakeInventory("ZSpecOpSprint", 1)
    SPE1 A 0 A_TakeInventory("ZSpecOpWander", 1)
    SPE1 A 0 A_TakeInventory("ZSpecOpCreep", 1)
    SPE1 A 0 A_TakeInventory("ZSpecOpBerserk", 1)
    SPE1 A 0 A_ChangeFlag("MissileMore", 0)
    SPE1 A 0 A_ChangeFlag("MissileEvenMore", 0)
    SPE1 A 0 A_ChangeFlag("AvoidMelee", 0)
    SPE1 A 0 A_ChangeFlag("NoPain", 0)
    SPE1 A 0 A_GiveInventory("ZSpecOpsSGSitRep", 1)
    SPE1 A 0 A_JumpIfInventory("ZSpecOpAggressive", 1, "AggressiveSwitch")
    SPE1 A 0 A_JumpIfInventory("ZSpecOpSprint", 1, "SprintSwitch")
    SPE1 A 0 A_JumpIfInventory("ZSpecOpWander", 1, "WanderSwitch")
    SPE1 A 0 A_JumpIfInventory("ZSpecOpCreep", 1, "CreepSwitch")
    SPE1 A 0 A_JumpIfInventory("ZSpecOpBerserk", 1, "BerserkSwitch")

  //Aggressive Mode
  AggressiveSwitch:
    SPE1 A 0 A_ChangeFlag("MissileMore", 1)
    SPE1 A 0 A_ChangeFlag("MissileEvenMore", 1)
    Goto AggressiveSee
  AggressiveSee:
    SPE1 A 3 A_Chase("", "AggressiveMissile")
    SPE1 A 0 A_Jump(192, 2)
    SPE1 A 0 A_JumpIfHealthLower(50, "See")
    SPE1 A 0 A_Jump(32, 2)
    SPE1 A 0 A_JumpIfCloser(768, 1)
    Goto See
    SPE1 A 3 A_Chase("", "AggressiveMissile")
    SPE1 A 0 A_Jump(192, 2)
    SPE1 A 0 A_JumpIfHealthLower(50, "See")
    SPE1 A 0 A_Jump(32, 2)
    SPE1 A 0 A_JumpIfCloser(768, 1)
    Goto See
    SPE1 B 3 A_Chase("", "AggressiveMissile")
    SPE1 B 0 A_Jump(192, 2)
    SPE1 B 0 A_JumpIfHealthLower(50, "See")
    SPE1 B 0 A_Jump(32, 2)
    SPE1 B 0 A_JumpIfCloser(768, 1)
    Goto See
    SPE1 B 3 A_Chase("", "AggressiveMissile")
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
    SPE1 B 0 A_Jump(192, 2)
    SPE1 B 0 A_JumpIfHealthLower(50, "See")
    SPE1 B 0 A_Jump(32, 2)
    SPE1 B 0 A_JumpIfCloser(768, 1)
    Goto See
    SPE1 C 3 A_Chase("", "AggressiveMissile")
    SPE1 C 0 A_Jump(192, 2)
    SPE1 C 0 A_JumpIfHealthLower(50, "See")
    SPE1 C 0 A_Jump(32, 2)
    SPE1 C 0 A_JumpIfCloser(768, 1)
    Goto See
    SPE1 C 3 A_Chase("", "AggressiveMissile")
    SPE1 C 0 A_Jump(192, 2)
    SPE1 C 0 A_JumpIfHealthLower(50, "See")
    SPE1 C 0 A_Jump(32, 2)
    SPE1 C 0 A_JumpIfCloser(768, 1)
    Goto See
    SPE1 D 3 A_Chase("", "AggressiveMissile")
    SPE1 D 0 A_Jump(192, 2)
    SPE1 D 0 A_JumpIfHealthLower(50, "See")
    SPE1 D 0 A_Jump(32, 2)
    SPE1 D 0 A_JumpIfCloser(768, 1)
    Goto See
    SPE1 D 3 A_Chase("", "AggressiveMissile")
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
    SPE1 D 0 A_Jump(192, 2)
    SPE1 D 0 A_JumpIfHealthLower(50, "See")
    SPE1 D 0 A_Jump(32, 2)
    SPE1 D 0 A_JumpIfCloser(768, 1)
    Goto See
    SPE1 A 0
    Loop
  AggressiveMissile:
    SPE1 EEE 4 A_FaceTarget
	TNT1 AAAA 0 Bright A_CustomMissile("MonsterTracer2",Random(28,34),0,Random(6,-6),0)
    SPE1 F 0 Bright A_PlayWeaponSound("SpecOpsZombie/Shotgun")
    SPE1 F 2 Bright A_CustomBulletAttack(11,0,3,Random(1,5)*3)
    SPE1 EEE 2 A_FaceTarget
    Goto AggressiveSee

  //Sprint Mode
  SprintSwitch:
    SPE1 A 0 A_ChangeFlag("NoPain", 1)
    Goto SprintSee
  SprintSee:
    SPE1 A 2 A_Chase("", "")
    SPE1 A 0 A_JumpIfCloser(384, "See")
    SPE1 A 2 A_Chase("", "")
    SPE1 A 0 A_JumpIfCloser(384, "See")
    SPE1 B 2 A_Chase("", "")
    SPE1 B 0 A_JumpIfCloser(384, "See")
    SPE1 B 2 A_Chase("", "")
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
    SPE1 B 0 A_JumpIfCloser(384, "See")
    SPE1 C 2 A_Chase("", "")
    SPE1 C 0 A_JumpIfCloser(384, "See")
    SPE1 C 2 A_Chase("", "")
    SPE1 C 0 A_JumpIfCloser(384, "See")
    SPE1 D 2 A_Chase("", "")
    SPE1 D 0 A_JumpIfCloser(384, "See")
    SPE1 D 2 A_Chase("", "")
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
    SPE1 D 0 A_JumpIfCloser(384, "See")
    Loop

  //Wander Mode
  WanderSwitch:
    SPE1 A 0 A_ClearTarget
    Goto WanderSee
  WanderSee:
    SPE1 A 4 A_Wander
    SPE1 A 0 A_LookEx(10, 0, 0, 0, 360, "See")
    SPE1 A 4 A_Wander
    SPE1 A 0 A_LookEx(10, 0, 0, 0, 360, "See")
    SPE1 B 4 A_Wander
    SPE1 A 0 A_LookEx(10, 0, 0, 0, 360, "See")
    SPE1 B 4 A_Wander
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
    SPE1 A 0 A_LookEx(10, 0, 0, 0, 360, "See")
    SPE1 C 4 A_Wander
    SPE1 A 0 A_LookEx(10, 0, 0, 0, 360, "See")
    SPE1 C 4 A_Wander
    SPE1 A 0 A_LookEx(10, 0, 0, 0, 360, "See")
    SPE1 D 4 A_Wander
    SPE1 A 0 A_LookEx(10, 0, 0, 0, 360, "See")
    SPE1 D 4 A_Wander
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
    SPE1 A 0 A_LookEx(10, 0, 0, 0, 360, "See")
    Loop

  //Creep Mode
  CreepSwitch:
    SPE1 A 0 A_ChangeFlag("MissileMore", 1)
    SPE1 A 0 A_ChangeFlag("AvoidMelee", 1)
    Goto CreepSee
  CreepSee:
    SPE1 A 0 A_CheckSight("CreepCheck")
    SPE1 A 0 A_JumpIfHealthLower(50, "See")
    SPE1 AABB 5 A_Chase("", "CreepMissile", 2)
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
	SPE1 CCDD 5 A_Chase("", "CreepMissile", 2)
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
    Loop
  CreepCheck:
    SPE1 A 0 A_Jump(32, "See")
    Goto CreepSee+1
  CreepMissile:
    SPE1 EEE 4 A_FaceTarget
	TNT1 AAAA 0 Bright A_CustomMissile("MonsterTracer2",Random(28,34),0,Random(6,-6),0)
    SPE1 F 0 Bright A_PlayWeaponSound("SpecOpsZombie/Shotgun")
    SPE1 F 2 Bright A_CustomBulletAttack(11,0,3,Random(1,5)*3)
    SPE1 EEE 2 A_FaceTarget
    Goto CreepSee

  //Berserk Mode
  BerserkSwitch:
    SPE1 A 0 A_ChangeFlag("MissileMore", 1)
    SPE1 A 0 A_ChangeFlag("MissileEvenMore", 1)
    SPE1 A 0 A_ChangeFlag("NoPain", 1)
    Goto BerserkSee
  BerserkSee:
    SPE1 AABB 3 A_Chase("", "BerserkMissile")
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
	SPE1 CCDD 3 A_Chase("", "BerserkMissile")
    TNT1 A 0 A_SpawnItem("FootStep",0,0,0,0)
    SPE1 A 0 A_JumpIfCloser(768, 1)
    Goto See
    SPE1 A 0
    Loop
  BerserkMissile:
    SPE1 EE 4 A_FaceTarget
	TNT1 AAAA 0 Bright A_CustomMissile("MonsterTracer2",Random(28,34),0,Random(6,-6),0)
    SPE1 F 0 Bright A_PlayWeaponSound("SpecOpsZombie/Shotgun")
    SPE1 F 2 Bright A_CustomBulletAttack(11,0,3,Random(1,5)*3)
    SPE1 EEE 2 A_FaceTarget
    SPE1 F 0 A_Jump(192, "BerserkSee")
    SPE1 F 0 A_MonsterRefire(40, "BerserkSee")
    Loop

  //Misc hurting states
  Pain:
    SPE1 G 4
    SPE1 G 4 A_Pain
    SPE1 G 0 A_Jump(96, "See")
    Goto WhatPainState
  WhatPainState:
    SPE1 G 0 A_JumpIfInventory("ZSpecOpAggressive", 1, "AggressiveSee")
    SPE1 G 0 A_JumpIfInventory("ZSpecOpSprint", 1, "SprintSee")
    SPE1 G 0 A_JumpIfInventory("ZSpecOpWander", 1, "WanderSee")
    SPE1 G 0 A_JumpIfInventory("ZSpecOpCreep", 1, "CreepSee")
    SPE1 G 0 A_JumpIfInventory("ZSpecOpBerserk", 1, "BerserkSee")
    Goto AggressiveSee
  Death:
    SPE1 H 5
    SPE1 I 5 A_Scream
    SPE1 J 5
    SPE1 K 5 A_NoBlocking
    SPE1 L -1
  Raise:
	TNT1 A 0
	TNT1 A 0 A_SpawnItemEx("VileHealEffect",0,0,0,0,0,0,0,SXF_NOCHECKPOSITION)
    SPE1 LKJIH 5
    Goto See
  }
}

Actor ZSpecOpsSGSitRep : CustomInventory
{
  Inventory.MaxAmount 0
  +Inventory.AutoActivate
  States
  {
  Spawn:
    TNT1 A 1
    Fail

  Use:
    TNT1 A 0 A_JumpIfHealthLower(50, "LowHealth")
    TNT1 A 0 A_CheckSight("OutOfSight")
    TNT1 A 0 A_JumpIfCloser(384, "Close")
  ChecksFailed:
    TNT1 A 0 A_Jump(256, "AggressiveMode", "SprintMode")

  LowHealth:
    TNT1 A 0 A_CheckSight("LowHealthOutOfSight")
    TNT1 A 0 A_JumpIfCloser(768, "LowHealthClose")
    TNT1 A 0 A_Jump(256, "SprintMode", "BerserkMode")
  LowHealthOutOfSight:
    TNT1 A 0 A_JumpIfCloser(768, "LowHealthOutOfSightClose")
    TNT1 A 0 A_Jump(256, "SprintMode", "CreepMode")
  LowHealthOutOfSightClose:
    TNT1 A 0 A_Jump(256, "CreepMode", "AggressiveMode", "BerserkMode")
  LowHealthClose:
    TNT1 A 0 A_Jump(256, "BerserkMode", "AggressiveMode")

  OutOfSight:
    TNT1 A 0 A_JumpIfCloser(384, "OutOfSightClose")
    TNT1 A 0 A_Jump(256, "AggressiveMode", "WanderMode", "CreepMode")
  OutOfSightClose:
    TNT1 A 0 A_Jump(256, "AggressiveMode", "CreepMode")

  Close:
    TNT1 A 0 A_Jump(256, "AggressiveMode")

  AggressiveMode:
    TNT1 A 0 A_GiveInventory("ZSpecOpAggressive", 1)
    Stop
  SprintMode:
    TNT1 A 0 A_GiveInventory("ZSpecOpSprint", 1)
    Stop
  WanderMode:
    TNT1 A 0 A_GiveInventory("ZSpecOpWander", 1)
    Stop
  CreepMode:
    TNT1 A 0 A_GiveInventory("ZSpecOpCreep", 1)
    Stop
  BerserkMode:
    TNT1 A 0 A_GiveInventory("ZSpecOpBerserk", 1)
    Stop
  }
}

Actor ZSpecOpBerserk : Inventory { Inventory.MaxAmount 1 }
Actor ZSpecOpSprint : Inventory { Inventory.MaxAmount 1 }