//------------------------------------------------------------------------------
// ZZ> Run away if too close to killer
IfOrdered
  tmpx = selforder
  tmpy = 0
  IfXIsEqualToY
    // Someone said that there's an enemy around, so look for 'im
    SetTargetToNearbyEnemy
  Else
    // Someone died, so make Scrub Lumpkins run away
    tmpargument = 0
    IfArmorIs
      // It's a Scrub, so check distance
      tmpx = selforder > 8
      tmpy = selforder & 255
      tmpx = selfx > 7 - tmpx
      tmpy = selfy > 7 - tmpy
      tmpturn = xydistance
      tmpdistance = 5  // Number of tiles

      IfDistanceIsMoreThanTurn
        tmpargument = 2
        SendMessageNear
        tmpargument = rand & 3 + 7
        SetContent
        tmpargument = STATERETREAT
        SetState

//------------------------------------------------------------------------------
// ZZ> Handle death by sending a message and telling allies to run away
IfKilled
  // Drop goodies
  tmpargument = selfmoney
  DropMoney
  DropKeys

  // Make the character body
  tmpargument = 45
  SetBumpHeight

  // Tell friends to run away
  tmpx = targetx > 7
  tmpy = targety > 7
  tmpargument = tmpx < 8 + tmpy
  IssueOrder

  // Send the message
  tmpx = selfmorale
  tmpy = 0
  IfXIsEqualToY
    // The player won...
    tmpargument = [BEAT]
    AddIDSZ
    EnableExport
    BeatModule

    // Finish text
    ClearEndMessage
    tmpargument = 6
    AddEndMessage
    tmpargument = 7
    AddEndMessage
    tmpargument = 8
    AddEndMessage

    //Make enemy cheer
    IfTargetIsAlive
      tmpargument = ACTIONMC
      TargetDoAction
      tmpargument = 4
      PlayFullSound

    tmpargument = 3
    SendMessageNear

    //Award bonus xp if captain survived
    tmpargument = [CAPT]
    tmpdistance = 2
    SetTargetToNearestBlahID
      tmpargument = 100
    Else
      tmpargument = 20
    tmpdistance = EXPQUEST
    GiveExperienceToTargetTeam
    
  Else
    IfTargetIsOnOtherTeam
      tmpargument = MESSAGEDEATH
      SendMessageNear
    Else
      tmpargument = 1
      SendMessageNear

  // Scream
  tmpargument = 3
  PlaySound

//------------------------------------------------------------------------------
// ZZ> Respawn the character
IfCleanedUp
  RespawnCharacter

//------------------------------------------------------------------------------
//Handle being bumped by countering or wandering
IfBumped
  IfStateIsRetreat
    DoNothing
  Else
    SetTargetToWhoeverBumped
    IfTargetIsOnHatedTeam
      tmpargument = STATEPARRY
      SetState
    Else
      SetTargetToOldTarget

//------------------------------------------------------------------------------
// ZZ> Handle being attacked by blocking or countering or running away
IfAttacked
  // Scream
  tmpargument = 2
  PlaySound
  
  // Pick either 0 or 7, Parry or Combat
  SetTargetToWhoeverAttacked
  IfStateIsRetreat
    DoNothing
  Else
    IfTargetIsOnHatedTeam
      tmpargument = 0
      IssueOrder
      tmpargument = rand & 1
      tmpargument = tmpargument < 3 - tmpargument
      // Check remaining life and remaining friends
      tmpx = selfmorale < 8 + selflife
      tmpy = 800
      IfXIsLessThanY
        tmpargument = rand & 3 + 7
        SetContent
        tmpargument = STATERETREAT
      SetState
      
  //Dismount if attacked
  IfSitting
    tmpargument = LATCHJUMP
    PressLatchButton

//------------------------------------------------------------------------------
// ZZ> Handle being healed by spitting out a message and stopping retreat
IfHealed
  IfStateIsRetreat
    tmpargument = STATECHARGE
    SetState
    tmpargument = 5
  Else
    tmpargument = 4
  SendMessageNear

//------------------------------------------------------------------------------
// ZZ> Handle blocking an attack by countering
IfBlocked
  IfStateIsRetreat
    GetState  // NOP
  Else
    tmpargument = STATECOMBAT
    SetState

//------------------------------------------------------------------------------
// ZZ> Handle an aggressive enemy by checking dexterity to block
IfTargetIsAttacking
  // If it's not a threat, circle around the enemy
  IfStateIsParry
    DoNothing
  Else
    IfStateIsRetreat
      DoNothing
    Else
      tmpargument = STATECOMBAT
      tmpx = targetdistance
      tmpy = 600
      IfXIsLessThanY    
        // Are the character and enemy facing opposite directions?
        tmpturn = targetturn - selfturn
        tmpx = tmpturn
        tmpy = 16000
        IfXIsMoreThanY
          tmpy = 48000
          IfXIsLessThanY
            // Does it pass the Dex check...  8191 is perfect
            tmpx = selfdex
            tmpy = rand & 16383
            IfXIsMoreThanY
              IfTargetIsFacingSelf      // Is the enemy facing the character?
                tmpargument = rand & 15 + 15
                SetTime
                tmpargument = STATEPARRY
      SetState

//------------------------------------------------------------------------------
// ZZ> This is the state chooser and interpreter
IfTimeOut
  // Choose a new state, by setting tmpargument
  // Look for enemies
  SetTurnModeToVelocity

  //Handle the lumpkin in the Gatling Gonne
  IfSitting
    SetTargetToWideEnemy
      SetTurnModeToWatchTarget
      tmpx = targetdistance
      tmpy = 600
      IfXIsLessThanY
        tmpargument = LATCHLEFT
        PressLatchButton
      tmpx = 0
    Else
      SetTurnModeToSpin
    tmpx = targetx
    tmpy = targety
    tmpargument = rand & 5 + 10
  Else
    // Find an enemy
    tmpx = 0
    IfTargetIsOnHatedTeam
      // Already have an enemy
      tmpx = targetdistance
      tmpy = 900
      IfXIsMoreThanY
        tmpx = 0
        // Find a new enemy
        SetTargetToNearbyEnemy
          tmpx = 1
      Else
        // Keep the current enemy
        tmpx = 1
    Else
      SetTargetToNearbyEnemy
        tmpx = 1
        
    tmpy = 0
    IfXIsMoreThanY
      // Default to previous state
      GetState

      // Switch to combat if close enough
      IfStateIsCharge
        tmpx = targetdistance
        tmpy = 600
        IfXIsLessThanY
          tmpargument = STATECOMBAT

      // Fight 'em if there's nothing better to do
      IfStateIsGuard
        tmpargument = STATECOMBAT

      // Let courage come back ( content is used as a timer )
      IfStateIsRetreat
        tmpargument = selfcontent - 1
        SetContent
        tmpargument = 0
        IfContentIs
          tmpargument = STATECHARGE
        Else
          GetState

      // Lower shield and attack
      IfStateIsParry
        tmpargument = STATECOMBAT

    // No enemy in general area, so return to the guard post
    Else
      IfStateIsRetreat
        GetState
      Else
        tmpargument = STATEGUARD

    // Now set the state to whatever tmpargument is
    SetState

    // Interpret the states and set the latches
    // Defend
    IfStateIsParry
      IfHoldingShield
        PressLatchButton
        tmpx = selfx
        tmpy = selfy
        tmpargument = rand & 31 + 15

    // Return to guard post
    IfStateIsGuard
      tmpx = rand & 511 - 256 + selfspawnx
      tmpy = rand & 511 - 256 + selfspawny
      tmpargument = rand & 63 + 30

    // Run away
    IfStateIsRetreat
      tmpx = selfx
      tmpy = selfy
      tmpdistance = 400
      tmpturn = rand & 32767 + targetturnto + 16384
      Compass
      tmpargument = rand & 15 + 10

    // Approach
    IfStateIsCharge
      tmpx = targetx + selfx > 1
      tmpy = targety + selfy > 1
      tmpargument = rand & 15 + 10

    // Attack with melee weapon, Keep back with ranged
    IfStateIsCombat
      tmpturn = targetturnto
      IfHoldingRangedWeapon
        tmpx = selfz
        tmpy = targetz + 60
        IfSitting
          tmpy = targetz + 110
        IfXIsLessThanY
          IfSitting
            tmpx = tmpturn - selfturn
            tmpy = 6000
            IfXIsLessThanY
              tmpy = 0 - 6000
              IfXIsMoreThanY
                PressLatchButton
            tmpx = targetx
            tmpy = targety
          Else
            SetTurnModeToWatchTarget
            tmpx = tmpturn - selfturn
            tmpy = 6000
            IfXIsLessThanY
              tmpy = 0 - 6000
              IfXIsMoreThanY
                PressLatchButton
            tmpx = selfx
            tmpy = selfy
        Else
          tmpx = rand & 255 - 128 + selfx
          tmpy = rand & 255 - 128 + selfy
      Else
        IfHoldingMeleeWeapon
          tmpx = targetdistance
          tmpy = 200
          IfSitting
            tmpy = 400
          IfXIsLessThanY
            IfFacingTarget
              PressLatchButton
          Else
            // Wave weapon around if not mounted
            IfSitting
              DoNothing
            Else
              tmpx = rand & 1023
              tmpy = 800
              IfXIsMoreThanY
                // Is it caught in a trap?
                tmpx = selfaccel
                tmpy = 1
                IfXIsMoreThanY
                  // Nope, so cheer...
                  tmpargument = ACTIONMC
                  DoAction
                  tmpargument = tmpdistance & 1
                  PlaySound
          tmpx = targetx
          tmpy = targety
          tmpdistance = 200
          Compass
        Else
          // Find a weapon!!!
          tmpx = 0
          tmpargument = [GONN]      //Gonne
          tmpdistance = BLAHITEMS
          SetTargetToWideBlahID
            tmpx = 1
          Else
            tmpargument = [CLAW]    //Claw
            SetTargetToWideBlahID
              tmpx = 1
            Else
              tmpargument = [TORC]  //Torch
              SetTargetToWideBlahID
                tmpx = 1
          tmpy = 1
          IfXIsEqualToY
            tmpx = targetdistance
            tmpy = 70
            IfXIsLessThanY
              tmpargument = rand & 1 + LATCHALTLEFT
              PressLatchButton
            tmpx = targetx
            tmpy = targety
          Else
            tmpx = rand & 1023 + selfx - 512
            tmpy = rand & 1023 + selfy - 512
      tmpargument = rand & 7 + 8
  ClearWaypoints
  AddWaypoint
  SetTime
Else
  // Hide behind shield until timer runs out
  IfStateIsParry
    IfHoldingShield
      PressLatchButton
      IfTargetIsAttacking
        tmpargument = 5
        SetTime
    Else
      tmpargument = 0
      SetTime

//------------------------------------------------------------------------------
End
//------------------------------------------------------------------------------
