//------------------------------------------------------------------------------ IfSpawned tmpargument = 30 SetTime //------------------------------------------------------------------------------ // 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 SetTargetToWideEnemy 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 = 65535 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 IfTargetIsOnOtherTeam tmpargument = MESSAGEDEATH Else tmpargument = 1 SendMessageNear // Scream tmpdistance = rand & 2047 + 11000 tmpargument = 3 PlaySound //------------------------------------------------------------------------------ // ZZ> Handle being bumped by countering or wandering IfBumped IfStateIsRetreat GetState // NOP Else SetTargetToWhoeverBumped IfTargetIsOnHatedTeam tmpargument = [LUMP] IfTargetHasID SetTargetToOldTarget Else tmpargument = STATEPARRY SetState Else SetTargetToOldTarget //------------------------------------------------------------------------------ // ZZ> Handle being attacked by blocking or countering or running away IfAttacked // Scream tmpdistance = rand & 2047 + 11000 tmpargument = 2 PlaySound // Pick either 0 or 7, Parry or Combat SetTargetToWhoeverAttacked IfStateIsRetreat GetState // NOP Else IfTargetIsOnHatedTeam tmpargument = [LUMP] IfTargetHasID 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 //------------------------------------------------------------------------------ // 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 GetState // NOP Else IfStateIsRetreat GetState // NOP 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 // Is the enemy facing the character? tmpx = targetturnto - targetturn tmpy = 30000 IfXIsMoreThanY tmpargument = rand & 15 + 15 SetTime tmpargument = STATEPARRY tmpy = 0 - 30000 IfXIsLessThanY 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 // Find an enemy tmpx = 0 IfTargetIsOnHatedTeam // Already have an enemy tmpx = targetdistance tmpy = 900 IfXIsMoreThanY tmpx = 0 // Find a new enemy tmpargument = [LUMP] tmpdistance = 18 // BLAHENEMIES | BLAHINVERTID SetTargetToWideBlahID tmpx = 1 Else // Keep the current enemy tmpx = 1 Else tmpargument = [LUMP] tmpdistance = 18 // BLAHENEMIES | BLAHINVERTID SetTargetToWideBlahID 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 GetContent tmpargument = tmpargument - 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 tmpx = tmpturn - selfturn tmpy = 6000 IfXIsLessThanY tmpy = 0 - 6000 IfXIsMoreThanY PressLatchButton Else // Wave weapon around if not mounted IfSitting GetState Else tmpx = rand & 1023 tmpy = 800 IfXIsMoreThanY // Is it caught in a trap? tmpx = selfaccel tmpy = 1 IfXIsMoreThanY // Nope, so cheer... tmpargument = ACTIONMC DoAction tmpdistance = rand & 2047 + 11000 tmpargument = tmpdistance & 1 PlaySound tmpx = targetx tmpy = targety tmpdistance = 200 Compass Else // Find a weapon!!! tmpx = rand & 255 - 128 + selfx tmpy = rand & 255 - 128 + selfy 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 //------------------------------------------------------------------------------