home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 56 / CDPowerplay56Disc2.iso / demos / blade / data1.cab / Program_Executable_Files / Lib / Enm_Def.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2000-10-27  |  63.5 KB  |  1,689 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 1.5)
  3.  
  4. import Bladex
  5. import whrandom
  6. import AuxTran
  7. import ScorerActions
  8. import Actions
  9. import Reference
  10. import Basic_Funcs
  11. import Combat
  12. import CharStats
  13. import copy
  14. import whrandom
  15. import Damage
  16. import Stars
  17. import DMusic
  18. import GameStateAux
  19. import pdb
  20. DEBUG_SOUNDS = 0
  21. TwinkleObjs = [
  22.     'Gema']
  23. THROWNHURTTIME_GAP = 45
  24. BM_IDC = 0
  25. BM_NONE = 1
  26. BM_XYZ = 2
  27. BM_XZ = 3
  28. BM_2ANM = 4
  29. BM_SCRIPT = 5
  30. HEADF_ENG = 0
  31. HEADF_ANM = 1
  32. HEADF_ANM2SEE = 2
  33. HEADF_ANM2ENG = 3
  34. ASTAR_THINKING = 0
  35. ASTAR_NOSOLVED = 1
  36. ASTAR_SOLVED = 2
  37. ASTAR_RECALCULATING = 3
  38. TRUE = 1 == 1
  39. FALSE = not TRUE
  40. WUEA_NONE = 0
  41. WUEA_WAIT = 1
  42. WUEA_ENDED = 2
  43. ROUTE_WATCH = 0
  44. ROUTE_BAY = 1
  45. ROUTE_CHASE = 2
  46. ROUTE_SINGLE = 3
  47. ROUTE_BOWING = 4
  48. CHOOSE_FIRST = -1
  49. CHOOSE_SECOND = 1
  50. CHOOSE_EITHER = 0
  51. new_key_sound = Bladex.CreateSound('..\\..\\Sounds\\Manipulado-llave2.wav', 'NewKeySound')
  52. new_key_sound.Volume = 1
  53. new_key_sound.MinDistance = 10000
  54. new_key_sound.MaxDistance = 20000
  55.  
  56. def ChooseNearest(entity1name, entity2name):
  57.     p1 = Bladex.GetEntity(entity1name)
  58.     p2 = Bladex.GetEntity(entity2name)
  59.     if not p1 and not p2:
  60.         return CHOOSE_EITHER
  61.     elif not p1:
  62.         return CHOOSE_SECOND
  63.     elif not p2:
  64.         return CHOOSE_FIRST
  65.     
  66.     if p1.Life <= 0 and p2.Life <= 0:
  67.         return CHOOSE_EITHER
  68.     elif p1.Life <= 0:
  69.         return CHOOSE_SECOND
  70.     elif p2.Life <= 0:
  71.         return CHOOSE_FIRST
  72.     
  73.     if p1.Data.group_leader:
  74.         return CHOOSE_SECOND
  75.     elif p2.Data.group_leader:
  76.         return CHOOSE_FIRST
  77.     
  78.     enemy = Bladex.GetEntity(p1.GetEnemyName())
  79.     if not enemy:
  80.         return CHOOSE_EITHER
  81.     
  82.     val = enemy.SQDistance2(p1) - enemy.SQDistance2(p2)
  83.     if val < 0:
  84.         return CHOOSE_FIRST
  85.     elif val > 0:
  86.         return CHOOSE_SECOND
  87.     else:
  88.         return CHOOSE_EITHER
  89.  
  90.  
  91. def ChooseFurthest(entity1name, entity2name):
  92.     p1 = Bladex.GetEntity(entity1name)
  93.     p2 = Bladex.GetEntity(entity2name)
  94.     if not p1 and not p2:
  95.         return CHOOSE_EITHER
  96.     elif not p1:
  97.         return CHOOSE_SECOND
  98.     elif not p2:
  99.         return CHOOSE_FIRST
  100.     
  101.     if p1.Life <= 0 and p2.Life <= 0:
  102.         return CHOOSE_EITHER
  103.     elif p1.Life <= 0:
  104.         return CHOOSE_SECOND
  105.     elif p2.Life <= 0:
  106.         return CHOOSE_FIRST
  107.     
  108.     if p1.Data.group_leader:
  109.         return CHOOSE_SECOND
  110.     elif p2.Data.group_leader:
  111.         return CHOOSE_FIRST
  112.     
  113.     enemy = Bladex.GetEntity(p1.GetEnemyName())
  114.     if not enemy:
  115.         return CHOOSE_EITHER
  116.     
  117.     val = enemy.SQDistance2(p1) - enemy.SQDistance2(p2)
  118.     if val < 0:
  119.         return CHOOSE_SECOND
  120.     elif val > 0:
  121.         return CHOOSE_FIRST
  122.     else:
  123.         return CHOOSE_EITHER
  124.  
  125.  
  126. def ChooseMostLife(entity1name, entity2name):
  127.     p1 = Bladex.GetEntity(entity1name)
  128.     p2 = Bladex.GetEntity(entity2name)
  129.     if not p1 and not p2:
  130.         return CHOOSE_EITHER
  131.     elif not p1:
  132.         return CHOOSE_SECOND
  133.     elif not p2:
  134.         return CHOOSE_FIRST
  135.     
  136.     if p1.Life <= 0 and p2.Life <= 0:
  137.         return CHOOSE_EITHER
  138.     elif p1.Life <= 0:
  139.         return CHOOSE_SECOND
  140.     elif p2.Life <= 0:
  141.         return CHOOSE_FIRST
  142.     
  143.     l1 = p1.Life
  144.     l2 = p2.Life
  145.     val = l2 - l1
  146.     if val < 0:
  147.         return CHOOSE_FIRST
  148.     elif val > 0:
  149.         return CHOOSE_SECOND
  150.     else:
  151.         return ChooseNearest(entity1name, entity2name)
  152.  
  153.  
  154. def ChooseFighter(entity1name, entity2name):
  155.     p1 = Bladex.GetEntity(entity1name)
  156.     p2 = Bladex.GetEntity(entity2name)
  157.     if not p1 and not p2:
  158.         return CHOOSE_EITHER
  159.     elif not p1:
  160.         return CHOOSE_SECOND
  161.     elif not p2:
  162.         return CHOOSE_FIRST
  163.     
  164.     if p1.Life <= 0 and p2.Life <= 0:
  165.         return CHOOSE_EITHER
  166.     elif p1.Life <= 0:
  167.         return CHOOSE_SECOND
  168.     elif p2.Life <= 0:
  169.         return CHOOSE_FIRST
  170.     
  171.     enemy = Bladex.GetEntity(p1.GetEnemyName())
  172.     if not (p1.InCombat):
  173.         if not (p2.InCombat):
  174.             return ChooseNearest(entity1name, entity2name)
  175.         
  176.         return CHOOSE_SECOND
  177.     elif not (p2.InCombat):
  178.         return CHOOSE_FIRST
  179.     
  180.     if not p1.CanISee(enemy):
  181.         if not p2.CanISee(enemy):
  182.             return ChooseMostLife(entity1name, entity2name)
  183.         
  184.         return CHOOSE_SECOND
  185.     elif not p2.CanISee(enemy):
  186.         return CHOOSE_FIRST
  187.     
  188.     return ChooseMostLife(entity1name, entity2name)
  189.  
  190.  
  191. def ChooseLeaderOutOfCombat(entity1name, entity2name):
  192.     p1 = Bladex.GetEntity(entity1name)
  193.     p2 = Bladex.GetEntity(entity2name)
  194.     if p1.CanISee(p2):
  195.         if not p2.CanISee(p1):
  196.             return CHOOSE_FIRST
  197.         
  198.     elif p2.CanISee(p1):
  199.         return CHOOSE_SECOND
  200.     
  201.     enemy = Bladex.GetEntity(p1.GetEnemyName())
  202.     if p1.CanISee(enemy):
  203.         if not p2.CanISee(enemy):
  204.             return CHOOSE_FIRST
  205.         
  206.     elif p2.CanISee(enemy):
  207.         return CHOOSE_SECOND
  208.     
  209.     return ChooseFurthest(entity1name, entity2name)
  210.  
  211.  
  212. def ChooseLeader(entity1name, entity2name):
  213.     p1 = Bladex.GetEntity(entity1name)
  214.     p2 = Bladex.GetEntity(entity2name)
  215.     if not p1 and not p2:
  216.         return CHOOSE_EITHER
  217.     elif not p1:
  218.         return CHOOSE_SECOND
  219.     elif not p2:
  220.         return CHOOSE_FIRST
  221.     
  222.     if p1.Life <= 0 and p2.Life <= 0:
  223.         return CHOOSE_EITHER
  224.     elif p1.Life <= 0:
  225.         return CHOOSE_SECOND
  226.     elif p2.Life <= 0:
  227.         return CHOOSE_FIRST
  228.     
  229.     enemy = Bladex.GetEntity(p1.GetEnemyName())
  230.     if p1.Data.group_fighter:
  231.         if p2.InCombat and p2.CanISee(enemy) and p2.GetActionMode() == ROUTE_CHASE and p2.AstarState == ASTAR_SOLVED:
  232.             return CHOOSE_SECOND
  233.         
  234.         return CHOOSE_FIRST
  235.     elif p2.Data.group_fighter:
  236.         if p1.InCombat and p1.CanISee(enemy) and p1.GetActionMode() == ROUTE_CHASE and p1.AstarState == ASTAR_SOLVED:
  237.             return CHOOSE_FIRST
  238.         
  239.         return CHOOSE_SECOND
  240.     
  241.     if not (p1.InCombat):
  242.         if not (p2.InCombat):
  243.             return ChooseLeaderOutOfCombat(entity1name, entity2name)
  244.         
  245.         return CHOOSE_SECOND
  246.     elif not (p2.InCombat):
  247.         return CHOOSE_FIRST
  248.     
  249.     if not p1.CanISee(enemy):
  250.         if not p2.CanISee(enemy):
  251.             return ChooseMostLife(entity1name, entity2name)
  252.         
  253.         return CHOOSE_SECOND
  254.     elif not p2.CanISee(enemy):
  255.         return CHOOSE_FIRST
  256.     
  257.     return ChooseMostLife(entity1name, entity2name)
  258.  
  259.  
  260. class NPCPerson(Basic_Funcs.PlayerPerson):
  261.     InvestigatingSound = FALSE
  262.     SoundPriorities = [
  263.         -1.0,
  264.         -1.0,
  265.         -1.0,
  266.         -1.0,
  267.         -1.0]
  268.     Asleep = FALSE
  269.     SleepYOffset = 1100.0
  270.     group_fighter = TRUE
  271.     group_leader = TRUE
  272.     AttackingNPC = FALSE
  273.     imusic_noseen_warp = 0
  274.     DelayNoSeenFuncMusicBackUp = 0
  275.     last_insulting_time_1AA = -1
  276.     LastThrownHurtTime = 0
  277.     AttacksOwnKind = FALSE
  278.     AttackNPCTime = 5
  279.     Angry = FALSE
  280.     Furious = FALSE
  281.     ChanceOfFuryOnHurt = 0.0
  282.     ChanceOfFuryOnLeaderDeath = 0.0
  283.     ImpatientAttackTime = 5.0
  284.     
  285.     def __init__(self, me):
  286.         Basic_Funcs.PlayerPerson.__init__(self, me)
  287.         self.SoundPriorities = [
  288.             -1.0,
  289.             -1.0,
  290.             -1.0,
  291.             -1.0,
  292.             -1.0]
  293.         AddMyWatchAnims(me.Name)
  294.         self.NPC = 1
  295.         self.ResetCombat(me.Name)
  296.         self.NoFXOnHit = FALSE
  297.         me.SubscribeToList('Listeners')
  298.         me.Deaf = 0
  299.         me.CombatGroup = 'Group of ' + me.Name
  300.         me.SeeFunc = self.StdSeeTheEnemy
  301.         me.HearFunc = self.StdHearFunc
  302.         me.DelayNoSeenFunc = self.StdDelayNoSeen
  303.         me.NoAllowedAreaFunc = self.StdNoAllowedArea
  304.         me.EnemyNoAllowedAreaFunc = self.StdEnemyNoAllowedArea
  305.         me.ImHurtFunc = self.StdImHurt
  306.         me.ImDeadFunc = self.StdImDead
  307.         me.EnemyDeadFunc = self.StdEnemyDead
  308.         me.AnmEndedFunc = self.StdAnmEnded
  309.         me.EnterCloseFunc = self.StdEnterClose
  310.         me.EnterLargeFunc = self.StdEnterLarge
  311.         me.EnterPrimaryAAFunc = self.StdEnterPrimaryAA
  312.         me.EnterSecondaryAAFunc = self.StdEnterSecondaryAA
  313.         me.CharSeeingEnemyFunc = self.StdCharSeeingEnemy
  314.         me.ToggleCombatFunc = self.StdToggleCombat
  315.         self.WeaponsOut(me.Name)
  316.  
  317.     
  318.     def ResetCombat(self, EntityName):
  319.         me = Bladex.GetEntity(EntityName)
  320.         if me and me.Life > 0:
  321.             me.BlockingPropensity = 0.5
  322.             me.AttackList = []
  323.             me.CombatDistFlag = not (self.group_fighter)
  324.         
  325.         self.AttacksOwnKind = FALSE
  326.         self.AttackNPCTime = 5
  327.         self.Angry = FALSE
  328.         self.Furious = FALSE
  329.         self.ChanceOfFuryOnHurt = 0.0
  330.         self.ChanceOfFuryOnLeaderDeath = 0.0
  331.         self.ImpatientAttackTime = 5.0
  332.  
  333.     
  334.     def StopNPCsAttacking(self, EntityName):
  335.         me = Bladex.GetEntity(EntityName)
  336.         if me and me.Life > 0:
  337.             enemy = Bladex.GetEntity(me.GetEnemyName())
  338.             if enemy and enemy.Life > 0 and enemy.Data.NPC:
  339.                 enemy.Data.StopAttackingNPC(enemy.Name)
  340.             
  341.         
  342.         self.StopAttackingNPC(EntityName)
  343.  
  344.     
  345.     def StopAttackingNPC(self, EntityName):
  346.         if self.AttackingNPC:
  347.             self.AttackingNPC = FALSE
  348.             me = Bladex.GetEntity(EntityName)
  349.             if me and me.Life > 0:
  350.                 enemy = Bladex.GetEntity(me.GetEnemyName())
  351.                 if not enemy or enemy.Data.NPC:
  352.                     enemy = Bladex.GetEntity('Player1')
  353.                     if not enemy:
  354.                         print EntityName + ': Cannot access handle to Player, in StopAttackingNPC()'
  355.                         return None
  356.                     
  357.                     Damage.DropInvalidObjectsOnImpact(EntityName)
  358.                     me.Wuea = Reference.WUEA_ENDED
  359.                     me.InterruptCombat()
  360.                     me.SetEnemy(enemy)
  361.                     MaxCombatDist = Bladex.GetCharType(me.CharType, me.CharTypeExt).MaxCombatDist
  362.                     if me.SQDistance2(enemy) < MaxCombatDist * MaxCombatDist or me.CanISee(enemy):
  363.                         me.SetActiveEnemy(enemy)
  364.                         me.Chase(enemy, me.ActionAreaMax)
  365.                         if me.GetActionMode() == ROUTE_CHASE and self.IsArcher():
  366.                             self.Switch2MeleeWeapons(EntityName)
  367.                         
  368.                     else:
  369.                         me.LaunchWatch()
  370.                         Damage.DropInvalidObjectsOnImpact(EntityName)
  371.                         me.Wuea = Reference.WUEA_ENDED
  372.                         me.LaunchAnmType('attack_look', 1)
  373.                     self.CheckToJoin(EntityName)
  374.                 
  375.             
  376.         
  377.  
  378.     
  379.     def StdRouteEnded(self, EntityName):
  380.         pass
  381.  
  382.     
  383.     def StdEndChase(self, EntityName):
  384.         me = Bladex.GetEntity(EntityName)
  385.         if me and me.Life > 0:
  386.             if not (me.InCombat):
  387.                 Reference.debugprint(EntityName + ': I have ended a chase without combat (StdEndChase1)')
  388.                 enemy_pos = me.EnemyLastSeen
  389.                 if Actions.IsFacingPos(EntityName, enemy_pos[0], enemy_pos[2]):
  390.                     self.StdEndChase2(EntityName)
  391.                 else:
  392.                     Actions.TurnToFacePos(EntityName, enemy_pos[0], enemy_pos[2])
  393.                     me.RouteEndedFunc = self.StdEndChase2
  394.             
  395.         
  396.  
  397.     
  398.     def StdEndChase2(self, EntityName):
  399.         me = Bladex.GetEntity(EntityName)
  400.         if me and me.Life > 0:
  401.             Reference.debugprint(EntityName + ': I have ended a chase without combat (StdEndChase2)')
  402.             me.RouteEndedFunc = self.StdRouteEnded
  403.             me.StopLooking()
  404.             self.InvestigatingSound = FALSE
  405.             enemy = Bladex.GetEntity(me.GetEnemyName())
  406.             if enemy:
  407.                 pass
  408.             enemy_in_sight = me.CanISee(enemy)
  409.             if enemy_in_sight and enemy.InsideActionArea(me.ActionAreaMax):
  410.                 if Actions.IsFacingEntity(EntityName, me.GetEnemyName()):
  411.                     self.LaunchMyWatch(EntityName)
  412.                 else:
  413.                     Actions.TurnToFaceEntity(EntityName, me.GetEnemyName())
  414.                     me.RouteEndedFunc = self.LaunchMyWatch
  415.             elif enemy_in_sight:
  416.                 self.StdSeeEnemyUnreachable(EntityName)
  417.             else:
  418.                 Damage.DropInvalidObjectsOnImpact(EntityName)
  419.                 me.Wuea = Reference.WUEA_ENDED
  420.                 if me.GetActionMode() != ROUTE_WATCH:
  421.                     self.LaunchMyWatch(EntityName)
  422.                 
  423.                 me.LaunchAnmType('look_around', 1)
  424.             me.DelayNoSeenFunc = self.EndChaseDelayNoSeen
  425.             if me.Data.imusic_noseen_warp == 1:
  426.                 DMusic.RestoreMusicWarperDelayNoSeenFunc(EntityName)
  427.             
  428.         
  429.  
  430.     
  431.     def PutMeToSleep(self, EntityName):
  432.         if not (self.Asleep):
  433.             me = Bladex.GetEntity(EntityName)
  434.             me.SetTmpAnmFlags(1, 1, 0, 0, 1, 1)
  435.             me.Position = (me.Position[0], me.Position[1] + self.SleepYOffset, me.Position[2])
  436.             me.LaunchAnimation('Tkn_sleep')
  437.             me.Blind = 1
  438.             self.Asleep = TRUE
  439.         
  440.  
  441.     
  442.     def WakeMeUp(self, EntityName):
  443.         if self.Asleep:
  444.             me = Bladex.GetEntity(EntityName)
  445.             me.Blind = 0
  446.             me.Position = (me.Position[0], me.Position[1] - self.SleepYOffset * 0.5, me.Position[2])
  447.             if me.AnimName[:5] == 'Sleep' or me.AnimName[:5] == 'sleep':
  448.                 me.Wuea = Reference.WUEA_ENDED
  449.                 me.LaunchAnmType('alarm01', 1)
  450.             
  451.             self.Asleep = FALSE
  452.         
  453.  
  454.     
  455.     def StdStartChase(self, EntityName):
  456.         me = Bladex.GetEntity(EntityName)
  457.         enemy = Bladex.GetEntity(me.GetEnemyName())
  458.         me.AnmEndedFunc = self.StdAnmEnded
  459.         if enemy.InsideActionArea(me.ActionAreaMax) and self.IsArcher() and me.InsideActionArea(me.ActionAreaMax):
  460.             self.StdStartChase2(EntityName)
  461.         else:
  462.             self.StdSeeEnemyUnreachable(EntityName)
  463.  
  464.     
  465.     def StdSeeEnemyUnreachable(self, EntityName, check1aaTo2aa = 1):
  466.         me = Bladex.GetEntity(EntityName)
  467.         Reference.debugprint(EntityName + ': Enemy Unreachable')
  468.         if Bladex.GetTime() - self.LastThrownHurtTime < THROWNHURTTIME_GAP:
  469.             return None
  470.         
  471.         if me.InsideActionArea(me.ActionAreaMin) and check1aaTo2aa and not (me.Will1aaTo2aa):
  472.             back_area_min = me.ActionAreaMin
  473.             back_area_max = me.ActionAreaMax
  474.             me.ActionAreaMin = 0
  475.             me.ActionAreaMax = 0
  476.             enemy = Bladex.GetEntity(me.GetEnemyName())
  477.             des_pos = enemy.Position
  478.             me.GoToJogging = 1
  479.             if me.GoTo(des_pos[0], des_pos[1], des_pos[2]):
  480.                 me.ActionAreaMin = back_area_min
  481.                 me.ActionAreaMax = back_area_max
  482.             else:
  483.                 Reference.debugprint(EntityName + ': GoTo enemy_pos not working, with action area 0!')
  484.                 me.ActionAreaMin = back_area_min
  485.                 me.ActionAreaMax = back_area_max
  486.             return None
  487.         elif me.InsideActionArea(me.ActionAreaMin):
  488.             if me.GetActionMode() != ROUTE_WATCH:
  489.                 self.LaunchMyWatch(EntityName)
  490.             
  491.             if not Actions.IsFacingEntity(EntityName, me.GetEnemyName()):
  492.                 Actions.TurnToFaceEntity(EntityName, me.GetEnemyName())
  493.             else:
  494.                 curr_time = Bladex.GetTime()
  495.                 if curr_time - self.last_insulting_time_1AA > 4:
  496.                     insult_prob = whrandom.uniform(0.0, 1.0)
  497.                     if insult_prob < 0.8:
  498.                         Combat.Insult(EntityName)
  499.                     
  500.                     insult_var = whrandom.uniform(-2.0, 1.0)
  501.                     self.last_insulting_time_1AA = Bladex.GetTime() + insult_var
  502.                 
  503.         else:
  504.             back_area_min = me.ActionAreaMin
  505.             back_area_max = me.ActionAreaMax
  506.             me.ActionAreaMax = 0
  507.             me.ActionAreaMin = 0
  508.             init_pos = me.InitPos
  509.             me.InvertedRoute = 1
  510.             if me.GoTo(init_pos[0], init_pos[1], init_pos[2]):
  511.                 me.ActionAreaMin = back_area_min
  512.                 me.ActionAreaMax = back_area_max
  513.             else:
  514.                 Reference.debugprint(EntityName + ': GoTo init_pos not working, with action area 0!')
  515.                 me.ActionAreaMin = back_area_min
  516.                 me.ActionAreaMax = back_area_max
  517.  
  518.     
  519.     def StdStartChase2(self, EntityName):
  520.         me = Bladex.GetEntity(EntityName)
  521.         enemy = Bladex.GetEntity(me.GetEnemyName())
  522.         oldActionMode = me.GetActionMode()
  523.         if oldActionMode == ROUTE_WATCH or oldActionMode == ROUTE_BOWING:
  524.             me.RouteEndedFunc = self.StdRouteEnded
  525.         
  526.         if oldActionMode == ROUTE_CHASE:
  527.             pass
  528.         else:
  529.             self.ResetCombat(EntityName)
  530.             last_time_seen = me.LastTimeSeen
  531.             me.Chase(enemy, me.ActionAreaMax)
  532.             if me.GetActionMode() == ROUTE_CHASE:
  533.                 if self.IsArcher():
  534.                     self.Switch2MeleeWeapons(EntityName)
  535.                 elif Bladex.GetTime() - last_time_seen > 40 or last_time_seen < 0:
  536.                     me.LaunchAnmType('alarm01', 1)
  537.                 
  538.                 self.InvestigatingSound = FALSE
  539.                 me.RouteEndedFunc = self.StdEndChase
  540.                 if me.Aim or Actions.CurrentlyBowing(EntityName):
  541.                     me.Wuea = Reference.WUEA_ENDED
  542.                     Actions.EndBowMode(EntityName)
  543.                 
  544.             else:
  545.                 self.StdChaseFailed(EntityName, oldActionMode)
  546.  
  547.     
  548.     def IsArcher(self):
  549.         return Actions.StatL(self.Name) == Actions.RA_BOW
  550.  
  551.     
  552.     def StdChaseFailed(self, EntityName, oldActionMode):
  553.         me = Bladex.GetEntity(EntityName)
  554.         newActionMode = me.GetActionMode()
  555.         if newActionMode == ROUTE_BOWING:
  556.             Reference.debugprint(EntityName + ': I cannot start a chase so I will bow')
  557.         elif oldActionMode == ROUTE_WATCH:
  558.             Reference.debugprint(EntityName + ': I cannot start a chase so I will watch again')
  559.             self.LaunchMyWatch(EntityName)
  560.             enemy = Bladex.GetEntity(me.GetEnemyName())
  561.             if enemy and me.CanISee(enemy) and me.InsideActionArea(me.ActionAreaMin):
  562.                 inv = me.GetInventory()
  563.                 if inv.HasBow and me.RangeActive:
  564.                     enemy_pos = me.EnemyLastSeen
  565.                     if not Actions.IsFacingPos(EntityName, enemy_pos[0], enemy_pos[2]):
  566.                         Actions.TurnToFacePos(EntityName, enemy_pos[0], enemy_pos[2])
  567.                     
  568.                 else:
  569.                     self.StdSeeEnemyUnreachable(EntityName, 0)
  570.             
  571.         
  572.  
  573.     
  574.     def GiveOrders(self, EntityName):
  575.         me = Bladex.GetEntity(EntityName)
  576.         if me and me.Life > 0 and self.NextOrdersTo and self.NextOrders:
  577.             me.Wuea = Reference.WUEA_ENDED
  578.             me.SetTmpAnmFlags(1, 0, 1, 0, 1, 1)
  579.             me.LaunchAnmType('order', 1)
  580.             me.AnmEndedFunc = self.GiveOrders2
  581.         
  582.  
  583.     
  584.     def GiveOrders2(self, EntityName):
  585.         me = Bladex.GetEntity(EntityName)
  586.  
  587.     
  588.     def CheckToJoin(self, EntityName):
  589.         me = Bladex.GetEntity(EntityName)
  590.         ally_list = me.GetCombatants()
  591.         for ally_name in ally_list:
  592.             if ally_name != EntityName:
  593.                 ally = Bladex.GetEntity(ally_name)
  594.                 if ally:
  595.                     return None
  596.                 
  597.             
  598.         
  599.         self.CheckGoodGroupFormation(EntityName, TRUE)
  600.  
  601.     
  602.     def JoinGroup(self, EntityName, GroupName):
  603.         me = Bladex.GetEntity(EntityName)
  604.         me.CombatGroup = GroupName
  605.         self.group_fighter = FALSE
  606.         self.group_leader = FALSE
  607.         if not (self.Furious):
  608.             me.CombatDistFlag = 1
  609.         
  610.         self.CheckGoodGroupFormation(EntityName, TRUE)
  611.  
  612.     
  613.     def LeaveGroup(self, EntityName):
  614.         me = Bladex.GetEntity(EntityName)
  615.         if self.group_fighter or self.group_leader:
  616.             self.SetGroupFormation(EntityName, FALSE, self.group_leader)
  617.         
  618.         NewCombatGroup = 'Group of ' + me.Name
  619.         if me.CombatGroup == NewCombatGroup:
  620.             NewCombatGroup = NewCombatGroup + '... Splitters'
  621.         
  622.         me.CombatGroup = NewCombatGroup
  623.         self.group_leader = TRUE
  624.         self.group_fighter = TRUE
  625.  
  626.     
  627.     def StdSeeTheEnemy(self, EntityName):
  628.         me = Bladex.GetEntity(EntityName)
  629.         Reference.debugprint(EntityName + ': I see the enemy')
  630.         life = me.Life
  631.         if life > 0.0:
  632.             if me.Blind == 1:
  633.                 pass
  634.             else:
  635.                 me.LookAtEntity(me.GetEnemyName())
  636.                 if me.GetActionMode() == ROUTE_BAY:
  637.                     me.Wuea = Reference.WUEA_ENDED
  638.                 
  639.                 self.CheckToJoin(EntityName)
  640.                 if me.GetActionMode() != ROUTE_CHASE:
  641.                     self.StdStartChase(EntityName)
  642.                 
  643.                 if me.GetActionMode() == ROUTE_BOWING:
  644.                     if self.AimPressed:
  645.                         angle = Reference.TARGET_ANGLE_MAX - me.Accuracy * (Reference.TARGET_ANGLE_MAX - Reference.TARGET_ANGLE_MIN)
  646.                         if me.AimOffTarget < angle:
  647.                             print 'Releasing Arrow'
  648.                             Actions.TestReleaseArrow(EntityName)
  649.                         
  650.                     elif me.Wuea != Reference.WUEA_WAIT:
  651.                         print 'Drawing Bow'
  652.                         Actions.TestDrawBow(EntityName)
  653.                     
  654.                 elif me.Aim or Actions.CurrentlyBowing(EntityName):
  655.                     me.Wuea = Reference.WUEA_ENDED
  656.                     Actions.EndBowMode(EntityName)
  657.                     me.SetOnFloor()
  658.                 
  659.         else:
  660.             print EntityName + ': Cannot get a handle on me'
  661.  
  662.     
  663.     def GetSoundType(self, SoundName):
  664.         if Reference.SoundTypes.has_key(SoundName):
  665.             return Reference.SoundTypes[SoundName][0]
  666.         
  667.         return Reference.SND_UNCLASSIFIED
  668.  
  669.     
  670.     def GetSoundPriority(self, EntityName, SoundName, Volume):
  671.         me = Bladex.GetEntity(EntityName)
  672.         priority = Reference.SND_UNCLASSIFIED
  673.         sound_type = self.GetSoundType(SoundName)
  674.         if sound_type != Reference.SND_UNCLASSIFIED:
  675.             priority = self.SoundPriorities[sound_type]
  676.             return priority + Volume * 0.01
  677.         
  678.  
  679.     
  680.     def IsSoundHigherPriority(self, EntityName, SoundName, Volume):
  681.         me = Bladex.GetEntity(EntityName)
  682.         priority = self.GetSoundPriority(EntityName, SoundName, Volume)
  683.         if priority <= 0.0:
  684.             return FALSE
  685.         elif not (self.InvestigatingSound) or me.GetActionMode() != ROUTE_SINGLE:
  686.             return TRUE
  687.         else:
  688.             investigating_priority = self.GetSoundPriority(EntityName, self.InvestigatingSoundName, self.InvestigatingSoundVolume)
  689.             return priority > investigating_priority
  690.  
  691.     
  692.     def StdInvestigateSound(self, EntityName):
  693.         me = Bladex.GetEntity(EntityName)
  694.         if me and me.Life > 0:
  695.             me.StartLooking(self.InvestigatingSoundX, self.InvestigatingSoundY, self.InvestigatingSoundZ)
  696.             Reference.debugprint(EntityName + ': Im going to investigate ' + self.InvestigatingSoundName + ' at pos ' + `self.InvestigatingSoundX` + ', ' + `self.InvestigatingSoundY` + ', ' + `self.InvestigatingSoundZ`)
  697.             me.GoToSneaking = 1
  698.             me.GoTo(self.InvestigatingSoundX, self.InvestigatingSoundY, self.InvestigatingSoundZ)
  699.             if me.AstarState != ASTAR_SOLVED:
  700.                 me.GoToSneaking = 0
  701.                 if Actions.IsFacingPos(EntityName, self.InvestigatingSoundX, self.InvestigatingSoundZ):
  702.                     self.LaunchMyWatch(EntityName)
  703.                 else:
  704.                     Actions.TurnToFacePos(EntityName, self.InvestigatingSoundX, self.InvestigatingSoundZ)
  705.                     me.RouteEndedFunc = self.LaunchMyWatch
  706.             else:
  707.                 me.Heard = TRUE
  708.                 me.RouteEndedFunc = self.StdEndChase2
  709.         
  710.  
  711.     
  712.     def CanGoTo(self, EntityName, x, y, z):
  713.         me = Bladex.GetEntity(EntityName)
  714.         if me and me.Life > 0:
  715.             me.GoTo(x, y, z)
  716.             if me.AstarState == ASTAR_SOLVED:
  717.                 me.LaunchWatch()
  718.                 return TRUE
  719.             
  720.         
  721.         return FALSE
  722.  
  723.     
  724.     def StdHearFunc(self, EntityName, SoundName, x, y, z, Volume):
  725.         me = Bladex.GetEntity(EntityName)
  726.         if me and me.Life > 0 and me.Deaf != 1:
  727.             if Volume < Bladex.GetCharType(me.CharType, me.CharTypeExt).HearMinVolume:
  728.                 return None
  729.             
  730.             if me.InCombat:
  731.                 return None
  732.             
  733.             if DEBUG_SOUNDS:
  734.                 pdb.set_trace()
  735.             
  736.             sound_type = self.GetSoundType(SoundName)
  737.             if sound_type == Reference.SND_UNCLASSIFIED:
  738.                 return None
  739.             
  740.             enemy = Bladex.GetEntity(me.GetEnemyName())
  741.             if not enemy and not (enemy.Person) or enemy.Life <= 0:
  742.                 return None
  743.             
  744.             if sound_type == Reference.SND_NOISYPC:
  745.                 if enemy.LastSound != SoundName:
  746.                     return None
  747.                 
  748.                 elsp = enemy.LastSoundPosition
  749.                 if elsp[0] != x and elsp[1] != y or elsp[2] != z:
  750.                     return None
  751.                 
  752.             
  753.             if me.LastSound == SoundName:
  754.                 lsp = me.LastSoundPosition
  755.                 if lsp[0] == x and lsp[1] == y and lsp[2] == z:
  756.                     return None
  757.                 
  758.             
  759.             if Bladex.GetTime() - self.LastThrownHurtTime < THROWNHURTTIME_GAP * 0.5:
  760.                 return None
  761.             
  762.             if me.CanISee(enemy):
  763.                 return None
  764.             
  765.             if self.Asleep:
  766.                 self.WakeMeUp(EntityName)
  767.             
  768.             if me.GetActionMode() == ROUTE_BAY and me.CanGoTo(x, y, z) == 0:
  769.                 return None
  770.             
  771.             if self.group_leader:
  772.                 self.DealtWithSound = SoundName
  773.                 self.DealtWithSoundX = x
  774.                 self.DealtWithSoundY = y
  775.                 self.DealtWithSoundZ = z
  776.                 investigator = self.GetGroupFighter(EntityName)
  777.                 if not investigator and investigator.GetActionMode() == ROUTE_CHASE or investigator.InCombat:
  778.                     investigator = me
  779.                 
  780.             else:
  781.                 group_leader = self.GetGroupLeader(EntityName)
  782.                 if group_leader:
  783.                     if not group_leader.InCombat:
  784.                         pass
  785.                     if not (group_leader.GetActionMode() == ROUTE_CHASE):
  786.                         
  787.                         try:
  788.                             ldr_data = group_leader.Data
  789.                             if SoundName == ldr_data.DealtWithSound and x == ldr_data.DealtWithSoundX and y == ldr_data.DealtWithSoundY and z == ldr_data.DealtWithSoundZ:
  790.                                 return None
  791.                         except:
  792.                             pass
  793.  
  794.                         group_leader.HearFunc(group_leader.Name, SoundName, x, y, z, Volume)
  795.                         if not (me.InCombat) and me.GetActionMode() != ROUTE_CHASE:
  796.                             if not Actions.IsFacingPos(EntityName, x, z):
  797.                                 Actions.QuickTurnToFacePos(EntityName, x, z)
  798.                             
  799.                         
  800.                         return None
  801.                     else:
  802.                         investigator = me
  803.             if investigator.Data.InvestigatingSound and SoundName == investigator.Data.InvestigatingSoundName and x == investigator.Data.InvestigatingSoundX and y == investigator.Data.InvestigatingSoundY and z == investigator.Data.InvestigatingSoundZ:
  804.                 return None
  805.             elif investigator.Data.IsSoundHigherPriority(investigator.Name, SoundName, Volume) and investigator.GetActionMode() != ROUTE_CHASE and not (investigator.InCombat):
  806.                 me.StartLooking(x, y, z)
  807.                 if not Actions.IsFacingPos(EntityName, x, z):
  808.                     Actions.QuickTurnToFacePos(EntityName, x, z)
  809.                 
  810.                 if investigator.Name != EntityName:
  811.                     if not Actions.IsFacingPos(investigator.Name, x, z):
  812.                         Actions.QuickTurnToFacePos(investigator.Name, x, z)
  813.                     
  814.                     if not (investigator.Data.InvestigatingSound):
  815.                         if me.AnimName[:4] != 'hurt' and me.AnimName[:5] != 'sleep':
  816.                             if investigator.Data.CanGoTo(investigator.Name, x, y, z):
  817.                                 me.Wuea = Reference.WUEA_ENDED
  818.                                 me.SetTmpAnmFlags(1, 0, 1, 0, 1, 1)
  819.                                 me.LaunchAnmType('alarm01', 1)
  820.                             
  821.                         
  822.                     
  823.                 
  824.                 investigator.Data.InvestigatingSound = TRUE
  825.                 investigator.Data.InvestigatingSoundName = SoundName
  826.                 investigator.Data.InvestigatingSoundVolume = Volume
  827.                 investigator.Data.InvestigatingSoundX = x
  828.                 investigator.Data.InvestigatingSoundY = y
  829.                 investigator.Data.InvestigatingSoundZ = z
  830.                 if me.AnimName == 'alarm01':
  831.                     if EntityName != investigator.Name:
  832.                         self.NextOrdersTo = []
  833.                         self.NextOrdersTo.append(investigator.Name)
  834.                         self.NextOrders = investigator.Data.StdInvestigateSound
  835.                         me.AnmEndedFunc = self.GiveOrders
  836.                     else:
  837.                         me.AnmEndedFunc = self.StdInvestigateSound
  838.                 elif EntityName != investigator.Name:
  839.                     self.NextOrdersTo = []
  840.                     self.NextOrdersTo.append(investigator.Name)
  841.                     self.NextOrders = investigator.Data.StdInvestigateSound
  842.                     self.GiveOrders(EntityName)
  843.                 else:
  844.                     self.StdInvestigateSound(EntityName)
  845.             
  846.         
  847.  
  848.     
  849.     def LaunchMyWatch(self, EntityName):
  850.         me = Bladex.GetEntity(EntityName)
  851.         if me and me.Life > 0:
  852.             enemy = Bladex.GetEntity(me.GetEnemyName())
  853.             if not enemy or not me.CanISee(enemy):
  854.                 me.StopLooking()
  855.             
  856.             me.GoToJogging = 0
  857.             me.GoToSneaking = 0
  858.             me.LaunchWatch()
  859.         
  860.  
  861.     
  862.     def Turn180AndWatch(self, EntityName):
  863.         me = Bladex.GetEntity(EntityName)
  864.         Actions.Turn180(EntityName)
  865.         me.RouteEndedFunc = self.LaunchMyWatch
  866.  
  867.     
  868.     def LaunchMyPatrol(self, EntityName):
  869.         me = Bladex.GetEntity(EntityName)
  870.         me.StopLooking()
  871.         init_pos = me.InitPos
  872.         my_pos = me.Position
  873.         x = init_pos[0] - my_pos[0]
  874.         z = init_pos[2] - my_pos[2]
  875.         DiscountDistance = 1000.0
  876.         if not me.InsideActionArea(me.ActionAreaMin) or x * x + z * z > DiscountDistance * DiscountDistance:
  877.             me.GoTo(init_pos[0], init_pos[1], init_pos[2])
  878.             Reference.debugprint(EntityName + ': Going 2 InitPos - self.LaunchMyPatrol')
  879.             me.RouteEndedFunc = self.Turn180AndWatch
  880.         else:
  881.             Reference.debugprint(EntityName + ': Not back2init cause quite close and inside MinAA')
  882.  
  883.     
  884.     def StdDelayNoSeen(self, EntityName):
  885.         me = Bladex.GetEntity(EntityName)
  886.         if me.Life > 0:
  887.             if not (self.Asleep) and not (me.Blind):
  888.                 if me.Aim or Actions.CurrentlyBowing(EntityName):
  889.                     me.Wuea = Reference.WUEA_ENDED
  890.                     Actions.EndBowMode(EntityName)
  891.                     me.SetOnFloor()
  892.                 
  893.                 Reference.debugprint(EntityName + ': Im in StdDelayNoSeen')
  894.                 me.StopLooking()
  895.                 enemy_name = me.GetEnemyName()
  896.                 enemy = Bladex.GetEntity(enemy_name)
  897.                 if me.GetActionMode() != ROUTE_CHASE:
  898.                     if me.GetActionMode() != ROUTE_SINGLE and me.GetActionMode() != ROUTE_BAY:
  899.                         Reference.debugprint(EntityName + ': I am not chasing')
  900.                         self.LaunchMyPatrol(EntityName)
  901.                     
  902.                 else:
  903.                     Reference.debugprint(EntityName + ': I am chasing')
  904.                     if me.AstarState != ASTAR_SOLVED:
  905.                         lastseenpos = me.EnemyLastSeen
  906.                         me.StartLooking(lastseenpos[0], lastseenpos[1], lastseenpos[2])
  907.                         if Actions.IsFacingPos(EntityName, lastseenpos[0], lastseenpos[2]):
  908.                             self.LaunchMyWatch(EntityName)
  909.                         else:
  910.                             Actions.TurnToFacePos(EntityName, lastseenpos[0], lastseenpos[2])
  911.                             me.RouteEndedFunc = self.LaunchMyWatch
  912.                     
  913.             
  914.         
  915.  
  916.     
  917.     def EndChaseDelayNoSeen(self, EntityName):
  918.         me = Bladex.GetEntity(EntityName)
  919.         Reference.debugprint(EntityName + ': Im in EndChaseDelayNoSeen!')
  920.         if me.Life > 0:
  921.             me.DelayNoSeenFunc = self.StdDelayNoSeen
  922.             self.StdDelayNoSeen(EntityName)
  923.             if me.Data.imusic_noseen_warp == 1:
  924.                 DMusic.RestoreMusicWarperDelayNoSeenFunc(EntityName)
  925.             
  926.         
  927.  
  928.     
  929.     def StdNoAllowedArea(self, EntityName):
  930.         me = Bladex.GetEntity(EntityName)
  931.         Reference.debugprint(EntityName + ': Im entering non-allowed area!')
  932.         back_area_min = me.ActionAreaMin
  933.         back_area_max = me.ActionAreaMax
  934.         me.ActionAreaMin = 0
  935.         me.ActionAreaMax = 0
  936.         init_pos = me.InitPos
  937.         me.InvertedRoute = 0
  938.         if me.GoTo(init_pos[0], init_pos[1], init_pos[2]):
  939.             me.ActionAreaMin = back_area_min
  940.             me.ActionAreaMax = back_area_max
  941.         
  942.  
  943.     
  944.     def StdEnemyNoAllowedArea(self, EntityName):
  945.         me = Bladex.GetEntity(EntityName)
  946.         enemy = Bladex.GetEntity(me.GetEnemyName())
  947.         if me.GetActionMode() != ROUTE_CHASE:
  948.             return None
  949.         
  950.         init_pos = me.InitPos
  951.         if not me.InsideActionArea(me.ActionAreaMin) and me.InsideActionArea(me.ActionAreaMax):
  952.             me.InvertedRoute = 1
  953.         else:
  954.             me.InvertedRoute = 0
  955.         me.GoTo(init_pos[0], init_pos[1], init_pos[2])
  956.         Reference.debugprint(EntityName + ': My enemy has entered a non-allowed area')
  957.  
  958.     
  959.     def StdImHurt(self, EntityName):
  960.         Reference.debugprint(EntityName + ': Oh! That hurt.')
  961.         me = Bladex.GetEntity(EntityName)
  962.         if self.NPC == 0:
  963.             return None
  964.         
  965.         if self.Asleep:
  966.             self.WakeMeUp(EntityName)
  967.         
  968.  
  969.     
  970.     def GroupCoveringPoint(self, EntityName, x, y, z, include_me = TRUE):
  971.         me = Bladex.GetEntity(EntityName)
  972.         if me.CombatGroup:
  973.             memberlist = me.GetGroupMembers()
  974.             for member_name in memberlist:
  975.                 if include_me or member_name != EntityName:
  976.                     member = Bladex.GetEntity(member_name)
  977.                     if member.TestPosInOwnBox(x, y, z, 1.05):
  978.                         return TRUE
  979.                     
  980.                 
  981.             
  982.         elif include_me:
  983.             return me.TestPosInOwnBox(x, y, z, 1.05)
  984.         
  985.         return FALSE
  986.  
  987.     
  988.     def GetGroupLeader(self, EntityName):
  989.         me = Bladex.GetEntity(EntityName)
  990.         if me.CombatGroup:
  991.             memberlist = me.GetGroupMembers()
  992.             for member_name in memberlist:
  993.                 member = Bladex.GetEntity(member_name)
  994.             
  995.         
  996.         return None
  997.  
  998.     
  999.     def GetGroupFighter(self, EntityName):
  1000.         me = Bladex.GetEntity(EntityName)
  1001.         if me.CombatGroup:
  1002.             memberlist = me.GetGroupMembers()
  1003.             for member_name in memberlist:
  1004.                 member = Bladex.GetEntity(member_name)
  1005.             
  1006.         
  1007.         return None
  1008.  
  1009.     
  1010.     def CheckGoodGroupFormation(self, EntityName, include_me):
  1011.         me = Bladex.GetEntity(EntityName)
  1012.         if me.CombatGroup:
  1013.             memberlist = me.GetGroupMembers()
  1014.             if len(memberlist) > 1:
  1015.                 fighter_found = None
  1016.                 leader_found = None
  1017.                 enemy = Bladex.GetEntity(me.GetEnemyName())
  1018.                 for member_name in memberlist:
  1019.                     if include_me or member_name != EntityName:
  1020.                         member = Bladex.GetEntity(member_name)
  1021.                         if not leader_found and member and member.Data.group_leader and member.Life > 0:
  1022.                             leader_found = member.Name
  1023.                         else:
  1024.                             member.Data.group_leader = FALSE
  1025.                         if not fighter_found and member and member.Data.group_fighter and member.Life > 0 and enemy and member.CanISee(enemy):
  1026.                             member.CombatDistFlag = 0
  1027.                             fighter_found = member.Name
  1028.                         elif member.Data.group_fighter:
  1029.                             if not (member.Data.Furious):
  1030.                                 member.CombatDistFlag = 1
  1031.                             
  1032.                             member.Data.group_fighter = FALSE
  1033.                         
  1034.                     
  1035.                 
  1036.                 if fighter_found and leader_found and fighter_found != leader_found:
  1037.                     return None
  1038.                 
  1039.                 self.SetGroupFormation(EntityName, include_me, not leader_found)
  1040.             elif include_me:
  1041.                 self.group_leader = TRUE
  1042.                 self.group_fighter = TRUE
  1043.                 me.CombatDistFlag = 0
  1044.             
  1045.             return None
  1046.         
  1047.  
  1048.     
  1049.     def CallGroupMemberFunc(self, EntityName, func, include_me):
  1050.         me = Bladex.GetEntity(EntityName)
  1051.  
  1052.     
  1053.     def SetNoGroupFighter(self, EntityName):
  1054.         me = Bladex.GetEntity(EntityName)
  1055.         if me.CombatGroup:
  1056.             memberlist = me.GetGroupMembers()
  1057.             for member_name in memberlist:
  1058.                 member = Bladex.GetEntity(member_name)
  1059.                 member.Data.group_fighter = FALSE
  1060.             
  1061.         
  1062.  
  1063.     
  1064.     def SetNoGroupLeader(self, EntityName):
  1065.         me = Bladex.GetEntity(EntityName)
  1066.  
  1067.     
  1068.     def SetGroupFormation(self, EntityName, include_me, new_leader_needed):
  1069.         if new_leader_needed:
  1070.             self.SetGroupLeader(EntityName, include_me)
  1071.         
  1072.         self.SetGroupFighter(EntityName, include_me)
  1073.  
  1074.     
  1075.     def SetGroupFighter(self, EntityName, include_me):
  1076.         me = Bladex.GetEntity(EntityName)
  1077.         if me.CombatGroup:
  1078.             self.SetNoGroupFighter(EntityName)
  1079.             memberlist = me.GetGroupMembers()
  1080.             if not include_me and memberlist.count(EntityName) > 0:
  1081.                 memberlist.remove(EntityName)
  1082.             
  1083.             if len(memberlist) > 0:
  1084.                 memberlist.sort(ChooseFighter)
  1085.                 member = Bladex.GetEntity(memberlist[0])
  1086.                 if member and member.Life > 0:
  1087.                     member.CombatDistFlag = 0
  1088.                     member.Data.group_fighter = TRUE
  1089.                 
  1090.             
  1091.         
  1092.  
  1093.     
  1094.     def SetGroupLeader(self, EntityName, include_me):
  1095.         me = Bladex.GetEntity(EntityName)
  1096.         if me.CombatGroup:
  1097.             self.SetNoGroupLeader(EntityName)
  1098.             memberlist = me.GetGroupMembers()
  1099.             if not include_me and memberlist.count(EntityName) > 0:
  1100.                 memberlist.remove(EntityName)
  1101.             
  1102.             if len(memberlist) > 0:
  1103.                 memberlist.sort(ChooseLeader)
  1104.                 member = Bladex.GetEntity(memberlist[0])
  1105.                 if member and member.Life > 0:
  1106.                     member.Data.group_leader = TRUE
  1107.                 
  1108.             
  1109.         
  1110.  
  1111.     
  1112.     def Respond2Thrown(self, EntityName, AttackerName):
  1113.         me = Bladex.GetEntity(EntityName)
  1114.         if AttackerName:
  1115.             enemy = Bladex.GetEntity(me.GetEnemyName())
  1116.             if enemy and not enemy.InsideActionArea(me.ActionAreaMax):
  1117.                 self.LastThrownHurtTime = Bladex.GetTime()
  1118.                 init_pos = me.InitPos
  1119.                 me.InvertedRoute = 0
  1120.                 me.GoToJogging = 1
  1121.                 if me.GoTo(init_pos[0], init_pos[1], init_pos[2]):
  1122.                     me.RouteEndedFunc = self.Turn180AndWatch
  1123.                 
  1124.             elif me.GetActionMode() == ROUTE_WATCH:
  1125.                 Actions.QuickTurnToFaceEntity(EntityName, AttackerName)
  1126.             else:
  1127.                 print 'Respond2Thrown->Bug?'
  1128.         
  1129.  
  1130.     
  1131.     def RespondToHit(self, EntityName, AttackerName, DamagePoints, DamageZone, Shielded):
  1132.         Basic_Funcs.PlayerPerson.RespondToHit(self, EntityName, AttackerName, DamagePoints, DamageZone, Shielded)
  1133.         if AttackerName and AttackerName != 'BWorld' and AttackerName != EntityName:
  1134.             me = Bladex.GetEntity(EntityName)
  1135.             if me and me.Life > 0:
  1136.                 chartype = Bladex.GetCharType(me.CharType, me.CharTypeExt)
  1137.                 if me.Life <= CharStats.GetCharMaxLife(me.Kind, me.Level) * 0.25 and whrandom.random() < self.ChanceOfFuryOnHurt:
  1138.                     self.GetFurious(EntityName)
  1139.                 
  1140.                 damage_factor = DamagePoints / (me.Life + DamagePoints)
  1141.                 if damage_factor > me.Data.DamageFactorNone:
  1142.                     Reference.debugprint(EntityName + ': Im being attacked by ' + AttackerName)
  1143.                     if AttackerName != me.GetEnemyName():
  1144.                         Reference.debugprint(EntityName + ': ' + AttackerName + ' is not my enemy!')
  1145.                         attacker = Bladex.GetEntity(AttackerName)
  1146.                         if attacker and self.AttacksOwnKind or attacker.Kind != me.Kind:
  1147.                             Reference.debugprint(EntityName + ': I will attack back')
  1148.                             if not (attacker.Data.NPC) or not (self.AttackingNPC):
  1149.                                 Reference.debugprint('attacker.Data.NPC: ' + `attacker.Data.NPC` + ', self.AttackingNPC: ' + `self.AttackingNPC`)
  1150.                                 Damage.DropInvalidObjectsOnImpact(EntityName)
  1151.                                 me.Wuea = Reference.WUEA_ENDED
  1152.                                 me.InterruptCombat()
  1153.                                 me.SetEnemy(attacker)
  1154.                                 me.SetActiveEnemy(attacker)
  1155.                                 me.Chase(attacker, me.ActionAreaMax)
  1156.                                 if me.GetActionMode() == ROUTE_CHASE and self.IsArcher():
  1157.                                     self.Switch2MeleeWeapons(EntityName)
  1158.                                 
  1159.                                 if attacker.Data.NPC:
  1160.                                     self.AttackingNPC = TRUE
  1161.                                     Bladex.AddScheduledFunc(Bladex.GetTime() + self.AttackNPCTime, self.StopNPCsAttacking, (EntityName,))
  1162.                                     if me.CombatGroup == attacker.CombatGroup:
  1163.                                         self.LeaveGroup(EntityName)
  1164.                                         self.CheckToJoin(EntityName)
  1165.                                         return None
  1166.                                     
  1167.                                 
  1168.                             
  1169.                         
  1170.                     
  1171.                     if me.CombatGroup and self.group_fighter and me.Life > 0:
  1172.                         self.SetGroupFormation(EntityName, TRUE, FALSE)
  1173.                     
  1174.                 
  1175.             
  1176.         
  1177.  
  1178.     
  1179.     def HitFunc(self, EntityName, WeaponName, Cx, Cy, Cz, DirX, DirY, DirZ, wcx, wcy, wcz, wdx, wdy, wdz):
  1180.         me = Bladex.GetEntity(EntityName)
  1181.         if me and me.Life > 0:
  1182.             if not (me.InCombat):
  1183.                 weapon = Bladex.GetEntity(WeaponName)
  1184.                 if weapon and weapon.Parent:
  1185.                     if not Actions.IsFacingEntity(EntityName, weapon.Parent):
  1186.                         Actions.QuickTurnToFaceEntity(EntityName, WeaponName)
  1187.                     
  1188.                 else:
  1189.                     pos = me.Position
  1190.                     x = pos[0] + (Cx - pos[0]) * 1000.0
  1191.                     z = pos[2] + (Cz - pos[2]) * 1000.0
  1192.                     if not Actions.IsFacingPos(EntityName, x, z):
  1193.                         Actions.QuickTurnToFacePos(EntityName, x, z)
  1194.                     
  1195.             
  1196.         
  1197.         Basic_Funcs.PlayerPerson.HitFunc(self, EntityName, WeaponName, Cx, Cy, Cz, DirX, DirY, DirZ, wcx, wcy, wcz, wdx, wdy, wdz)
  1198.  
  1199.     
  1200.     def StdImDead(self, EntityName):
  1201.         Reference.debugprint(EntityName + ': I died!')
  1202.         Basic_Funcs.PlayerPerson.PCImDead(self, EntityName)
  1203.         me = Bladex.GetEntity(EntityName)
  1204.         if me.Life > 0:
  1205.             print EntityName + ': Warning! dead func when Life > 0!'
  1206.         
  1207.         DMusic.InformDead(EntityName)
  1208.         me.RemoveFromList('Listeners')
  1209.         me.AddAnmEventFunc('UnlinkAll', self.UnlinkAll)
  1210.         if self.Asleep:
  1211.             me.Wuea = Reference.WUEA_ENDED
  1212.             me.LaunchAnmType('sleep_wall_d')
  1213.             Reference.debugprint(EntityName + ': Uuurgh! I died in my sleep!')
  1214.         
  1215.         if self.group_leader:
  1216.             memberlist = me.GetGroupMembers()
  1217.             if EntityName in memberlist:
  1218.                 memberlist.remove(EntityName)
  1219.             
  1220.             if len(memberlist) == 1:
  1221.                 member = Bladex.GetEntity(memberlist[0])
  1222.                 if member and member.Life > 0:
  1223.                     enemy = Bladex.GetEntity(member.GetEnemyName())
  1224.                     if member.SQDistance2(enemy) > 3000 * 3000 or not Actions.IsFacingEntity(enemy.Name, member.Name):
  1225.                         if whrandom.random() < self.ChanceOfFuryOnLeaderDeath:
  1226.                             member.Data.GetFurious(member.Name)
  1227.                         
  1228.                     
  1229.                 
  1230.             
  1231.         
  1232.         self.CheckGoodGroupFormation(EntityName, FALSE)
  1233.         self.CallGroupMemberFunc(EntityName, Combat.GetAngry, FALSE)
  1234.         me.RemoveFromList(me.CombatGroup)
  1235.         csound = Bladex.GetEntity(EntityName + 'ContinuosSound')
  1236.         if csound:
  1237.             csound.StopSound()
  1238.             csound.SubscribeToList('Pin')
  1239.         
  1240.         
  1241.         try:
  1242.             object = Bladex.GetEntity(me.InvLeft)
  1243.             if me.InvLeft and object and not (object.TestHit):
  1244.                 Actions.RemoveFromInventory(me, object, 'DropLeftEvent')
  1245.                 object.Alpha = 1.0
  1246.                 object.Impulse(0.0, 0.0, 0.0)
  1247.         except AttributeError:
  1248.             pdb.set_trace()
  1249.  
  1250.         
  1251.         try:
  1252.             object = Bladex.GetEntity(me.InvRight)
  1253.             if me.InvRight and object and not (object.TestHit):
  1254.                 Actions.RemoveFromInventory(me, object, 'DropRightEvent')
  1255.                 object.Alpha = 1.0
  1256.                 object.Impulse(0.0, 0.0, 0.0)
  1257.         except AttributeError:
  1258.             pdb.set_trace()
  1259.  
  1260.         inv = me.GetInventory()
  1261.         while inv.nObjects > 0:
  1262.             object_name = inv.GetObject(0)
  1263.             object = Bladex.GetEntity(object_name)
  1264.             if object:
  1265.                 object.Position = me.Position
  1266.                 me.Unlink(object)
  1267.                 inv.RemoveObject(object_name)
  1268.                 object.ExcludeHitFor(me)
  1269.                 if object.Kind in TwinkleObjs:
  1270.                     Bladex.AddScheduledFunc(Bladex.GetTime(), Actions.TakeObject, ('Player1', object_name))
  1271.                 elif object.TestHit:
  1272.                     print 'WARNING OBJECT ' + object.Name + ' REMOVED FROM WORLD BECAUSE COLLIDING'
  1273.                     object.RemoveFromWorld()
  1274.                 else:
  1275.                     object.Alpha = 1.0
  1276.                     object.Impulse(0.0, 0.0, 0.0)
  1277.             
  1278.         while inv.nWeapons > 0:
  1279.             object_name = inv.GetWeapon(0)
  1280.             object = Bladex.GetEntity(object_name)
  1281.             if object:
  1282.                 object.Position = me.Position
  1283.                 me.Unlink(object)
  1284.                 inv.RemoveWeapon(object_name)
  1285.                 object.ExcludeHitFor(me)
  1286.                 
  1287.                 try:
  1288.                     if object.TestHit:
  1289.                         object.RemoveFromWorld()
  1290.                     else:
  1291.                         object.Alpha = 1.0
  1292.                         object.Impulse(0.0, 0.0, 0.0)
  1293.                 except AttributeError:
  1294.                     print 'TestHit unsupported for object ' + object.Name
  1295.                     pdb.set_trace()
  1296.  
  1297.             
  1298.         while inv.nShields > 0:
  1299.             object_name = inv.GetShield(0)
  1300.             object = Bladex.GetEntity(object_name)
  1301.             if object:
  1302.                 object.Position = me.Position
  1303.                 me.Unlink(object)
  1304.                 inv.RemoveShield(object_name)
  1305.                 object.ExcludeHitFor(me)
  1306.                 if object.TestHit:
  1307.                     object.RemoveFromWorld()
  1308.                 else:
  1309.                     object.Alpha = 1.0
  1310.                     object.Impulse(0.0, 0.0, 0.0)
  1311.             
  1312.         while inv.nQuivers > 0:
  1313.             object_name = inv.GetQuiver(0)
  1314.             object = Bladex.GetEntity(object_name)
  1315.             if object:
  1316.                 object.Position = me.Position
  1317.                 me.Unlink(object)
  1318.                 inv.RemoveQuiver(object_name)
  1319.                 object.ExcludeHitFor(me)
  1320.                 if object.TestHit:
  1321.                     object.RemoveFromWorld()
  1322.                 else:
  1323.                     object.Alpha = 1.0
  1324.                     object.Impulse(0.0, 0.0, 0.0)
  1325.             
  1326.         while inv.nKeys > 0:
  1327.             object_name = inv.GetKey(0)
  1328.             object = Bladex.GetEntity(object_name)
  1329.             if object:
  1330.                 object.Position = me.Position
  1331.                 me.Unlink(object)
  1332.                 inv.RemoveKey(object_name)
  1333.                 object.ExcludeHitFor(me)
  1334.                 Bladex.AddScheduledFunc(Bladex.GetTime(), Actions.TakeObject, ('Player1', object_name))
  1335.                 char = Bladex.GetEntity('Player1')
  1336.                 new_key_sound.Stop()
  1337.                 new_key_sound.PlayStereo()
  1338.             
  1339.  
  1340.     
  1341.     def StdEnemyDead(self, EntityName):
  1342.         me = Bladex.GetEntity(EntityName)
  1343.         if me:
  1344.             if me.Life > 0 and me.GetActionMode() == ROUTE_CHASE or me.InCombat:
  1345.                 me.DelayNoSeenFunc = self.StdDelayNoSeen
  1346.                 if me.Data.imusic_noseen_warp == 1:
  1347.                     DMusic.RestoreMusicWarperDelayNoSeenFunc(EntityName)
  1348.                 
  1349.                 self.InvestigatingSound = FALSE
  1350.                 self.LaunchMyWatch(EntityName)
  1351.                 Reference.debugprint(EntityName + ': My enemy is dead.He he ! - py')
  1352.             
  1353.         
  1354.  
  1355.     
  1356.     def GetFurious(self, EntityName):
  1357.         me = Bladex.GetEntity(EntityName)
  1358.         if me and self.Furious == 0:
  1359.             Reference.debugprint(EntityName + ': Getting Furious')
  1360.             self.Furious = 1
  1361.             me.BlockingPropensity = 0
  1362.             movelist = me.AttackList
  1363.             first_attack = None
  1364.             for move in movelist:
  1365.                 pass
  1366.             
  1367.             me.AttackList = filter(Combat.DoneInFury, me.AttackList)
  1368.             if first_attack:
  1369.                 first_attack[1] = 1.0
  1370.                 me.AttackList.insert(0, first_attack)
  1371.             
  1372.             me.CombatDistFlag = 0
  1373.             Damage.DropInvalidObjectsOnImpact(EntityName)
  1374.             me.Wuea = Reference.WUEA_ENDED
  1375.             me.InterruptCombat()
  1376.             me.LaunchAnmType('fury', 1)
  1377.             FuryTime = 30.0
  1378.             Bladex.AddScheduledFunc(Bladex.GetTime() + FuryTime, self.ResetCombat, (EntityName,))
  1379.         
  1380.  
  1381.     
  1382.     def StdAnmEnded(self, EntityName):
  1383.         Reference.debugprint(EntityName + ': Anm ended - py ')
  1384.  
  1385.     
  1386.     def StdEnterClose(self, EntityName):
  1387.         Reference.debugprint(EntityName + ': I am entering close combat')
  1388.         me = Bladex.GetEntity(EntityName)
  1389.         if me and me.Life > 0:
  1390.             self.SetGroupFormation(EntityName, TRUE, FALSE)
  1391.             self.Switch2MeleeWeapons(EntityName)
  1392.         
  1393.  
  1394.     
  1395.     def Switch2MeleeWeapons(self, EntityName):
  1396.         me = Bladex.GetEntity(EntityName)
  1397.         if me and me.Life > 0 and not (me.RangeActive):
  1398.             inv = me.GetInventory()
  1399.             right_type = Reference.GiveObjectFlag(me.InvRight)
  1400.             if not inv.HoldingBow:
  1401.                 if not right_type == Reference.OBJ_STANDARD:
  1402.                     pass
  1403.                 if not (right_type == Reference.OBJ_WEAPON):
  1404.                     enemy = Bladex.GetEntity(me.GetEnemyName())
  1405.                     if me.AstarState != ASTAR_NOSOLVED:
  1406.                         me.SwitchTo1H()
  1407.                         weapon_name = inv.GetSelectedWeapon()
  1408.                         if weapon_name and weapon_name != me.InvRight and weapon_name != me.InvLeft:
  1409.                             out = ScorerActions.CB_WeaponOutX(EntityName, 0)
  1410.                             if not out:
  1411.                                 me.AnmEndedFunc = ScorerActions.CB_WeaponOutX
  1412.                             
  1413.                             Bladex.AddScheduledFunc(Bladex.GetTime() + 2.0, self.Switch2MeleeWeapons, (EntityName,), EntityName + 'ReSwitch2MeleeWeapons')
  1414.                         
  1415.                         Actions.EndBowMode(EntityName)
  1416.                     
  1417.                 
  1418.             
  1419.  
  1420.     
  1421.     def WeaponsOut(self, EntityName):
  1422.         me = Bladex.GetEntity(EntityName)
  1423.         if me.Life > 0:
  1424.             inv = me.GetInventory()
  1425.             if inv.HasBow:
  1426.                 des_quiver_name = inv.GetSelectedQuiver()
  1427.                 if des_quiver_name:
  1428.                     inv.LinkBack(des_quiver_name)
  1429.                     inv.LinkRightHand('None')
  1430.                     quiver = Bladex.GetEntity(des_quiver_name)
  1431.                     if quiver and quiver.Data.NumberOfArrows() > 0:
  1432.                         arrow = quiver.Data.GiveArrow()
  1433.                         inv.LinkRightHand(arrow.Name)
  1434.                         bow = inv.GetBow()
  1435.                         inv.LinkLeftHand(bow)
  1436.                         return None
  1437.                     
  1438.                 
  1439.                 print 'Enemy starting with bow, but without quiver/arrows'
  1440.             
  1441.             if inv.nWeapons > 0 and not (me.InvRight):
  1442.                 weapon_name = inv.GetSelectedWeapon()
  1443.                 if not weapon_name:
  1444.                     weapon_name = inv.GetWeapon(0)
  1445.                 
  1446.                 inv.LinkRightHand('None')
  1447.                 inv.LinkRightHand(weapon_name)
  1448.             
  1449.             if inv.nShields > 0 and not (me.InvLeft):
  1450.                 shield_name = inv.GetSelectedShield()
  1451.                 if not shield_name:
  1452.                     shield_name = inv.GetShield(0)
  1453.                 
  1454.                 inv.LinkLeftHand('None')
  1455.                 inv.LinkLeftHand(weapon_name)
  1456.             
  1457.         
  1458.  
  1459.     
  1460.     def StdEnterLarge(self, EntityName):
  1461.         me = Bladex.GetEntity(EntityName)
  1462.         Reference.debugprint(EntityName + ': Im entering large area!')
  1463.         if me.Life > 0 and not (me.MeleeActive):
  1464.             inv = me.GetInventory()
  1465.             if inv.HasBow:
  1466.                 left_type = Reference.GiveObjectFlag(me.InvLeft)
  1467.                 if left_type != Reference.OBJ_BOW:
  1468.                     me.SwitchToBow()
  1469.                     if inv.GetSelectedWeapon() != me.InvRight and inv.GetSelectedWeapon() != me.InvLeft:
  1470.                         out = ScorerActions.CB_WeaponOutX(EntityName, 0)
  1471.                         if not out:
  1472.                             me.AnmEndedFunc = ScorerActions.CB_WeaponOutX
  1473.                         
  1474.                         Bladex.AddScheduledFunc(Bladex.GetTime() + 2.0, self.StdEnterLarge, (EntityName,), EntityName + 'ReStdEnterLarge')
  1475.                     
  1476.                 
  1477.             
  1478.         
  1479.  
  1480.     
  1481.     def StdEnterPrimaryAA(self, EntityName):
  1482.         me = Bladex.GetEntity(EntityName)
  1483.         Reference.debugprint(EntityName + ': Im entering primary area!')
  1484.         if me.Life > 0:
  1485.             if me.InvertedRoute == 1:
  1486.                 self.LaunchMyWatch(EntityName)
  1487.                 me.LastTimeSeen = Bladex.GetTime()
  1488.             
  1489.             me.InvertedRoute = 0
  1490.         
  1491.  
  1492.     
  1493.     def StdEnterSecondaryAA(self, EntityName):
  1494.         Reference.debugprint(EntityName + ': Im entering secondary area!')
  1495.  
  1496.     
  1497.     def StdCharSeeingEnemy(self, EntityName, EntityName2):
  1498.         me = Bladex.GetEntity(EntityName)
  1499.         ally = Bladex.GetEntity(EntityName2)
  1500.         if me.CombatGroup == ally.CombatGroup:
  1501.             pass
  1502.         
  1503.         if me.Life > 0:
  1504.             if ally and me.CanISee(ally) and me.GetActionMode() != ROUTE_CHASE:
  1505.                 if ally.GetActionMode() == ROUTE_CHASE and me.GetActionMode() != ROUTE_CHASE:
  1506.                     me.SeeFunc(EntityName)
  1507.                 
  1508.                 if ally.GetActionMode() == ROUTE_SINGLE and ally.Data.InvestigatingSound:
  1509.                     self.StdHearFunc(EntityName, ally.Data.InvestigatingSoundName, ally.Data.InvestigatingSoundX, ally.Data.InvestigatingSoundY, ally.Data.InvestigatingSoundZ, 1.0)
  1510.                 
  1511.             
  1512.         
  1513.  
  1514.     
  1515.     def StdToggleCombat(self, EntityName):
  1516.         import DMusic
  1517.         if self.NPC == 1:
  1518.             DMusic.notifyCombat(EntityName)
  1519.         
  1520.  
  1521.     
  1522.     def __save_core_funcs__(self):
  1523.         me = Bladex.GetEntity(self.Name)
  1524.         if not me:
  1525.             print '__save_core_funcs__() Warning: trying to save a non existent entity', self.Name
  1526.             return None
  1527.         
  1528.         core_funcs = []
  1529.         j = 0
  1530.         funcs = [
  1531.             ('SeeFunc', self.StdSeeTheEnemy),
  1532.             ('HearFunc', self.StdHearFunc),
  1533.             ('DelayNoSeenFunc', self.StdDelayNoSeen),
  1534.             ('NoAllowedAreaFunc', self.StdNoAllowedArea),
  1535.             ('EnemyNoAllowedAreaFunc', self.StdEnemyNoAllowedArea),
  1536.             ('ImHurtFunc', self.StdImHurt),
  1537.             ('ImDeadFunc', self.StdImDead),
  1538.             ('EnemyDeadFunc', self.StdEnemyDead),
  1539.             ('AnmEndedFunc', self.StdAnmEnded),
  1540.             ('EnterCloseFunc', self.StdEnterClose),
  1541.             ('EnterLargeFunc', self.StdEnterLarge),
  1542.             ('EnterPrimaryAAFunc', self.StdEnterPrimaryAA),
  1543.             ('EnterSecondaryAAFunc', self.StdEnterSecondaryAA),
  1544.             ('CharSeeingEnemyFunc', self.StdCharSeeingEnemy),
  1545.             ('ToggleCombatFunc', self.StdToggleCombat),
  1546.             ('DamageFunc', Damage.CalculateDamage)]
  1547.         for i in funcs:
  1548.             exec 'f = me.' + i[0]
  1549.             if i[1] != f:
  1550.                 print 'Save Core Func para', me.Name, ' callback ', i[0], ' funcion ', f
  1551.                 core_funcs.append((j, GameStateAux.SaveFunctionAux(f)))
  1552.             
  1553.             j = j + 1
  1554.         
  1555.         return core_funcs
  1556.  
  1557.     
  1558.     def __load_core_funcs__(self, param):
  1559.         me = Bladex.GetEntity(self.Name)
  1560.         if not me:
  1561.             print '__load_core_funcs__ -> Warning, trying to get a non existent entity', self.Name
  1562.             return None
  1563.         
  1564.         funcs = [
  1565.             'SeeFunc',
  1566.             'HearFunc',
  1567.             'DelayNoSeenFunc',
  1568.             'NoAllowedAreaFunc',
  1569.             'EnemyNoAllowedAreaFunc',
  1570.             'ImHurtFunc',
  1571.             'ImDeadFunc',
  1572.             'EnemyDeadFunc',
  1573.             'AnmEndedFunc',
  1574.             'EnterCloseFunc',
  1575.             'EnterLargeFunc',
  1576.             'EnterPrimaryAAFunc',
  1577.             'EnterSecondaryAAFunc',
  1578.             'CharSeeingEnemyFunc',
  1579.             'ToggleCombatFunc',
  1580.             'DamageFunc']
  1581.         for i in param:
  1582.             
  1583.             try:
  1584.                 GameStateAux.LoadFunctionAux(i[1], me, funcs[i[0]])
  1585.             except Exception:
  1586.                 0
  1587.                 exc = 0
  1588.                 param
  1589.                 print 'Exception in __load_core_funcs__', exc, i
  1590.             except:
  1591.                 0
  1592.  
  1593.         
  1594.  
  1595.     
  1596.     def __getstate__(self):
  1597.         PlayerPerson_state = Basic_Funcs.PlayerPerson.__getstate__(self)
  1598.         if PlayerPerson_state[0] != 1:
  1599.             print 'ERROR: NPCPerson.__getstate__(): Base class version differs.'
  1600.             return playerperson_state
  1601.         
  1602.         me = Bladex.GetEntity(self.Name)
  1603.         PlayerPerson_state[1]['NPCPerson'] = (self.InvestigatingSound, self.SoundPriorities, self.Asleep, self.SleepYOffset, self.group_fighter, self.group_leader, self.AttackingNPC, self.last_insulting_time_1AA, self.LastThrownHurtTime, self.AttacksOwnKind, self.AttackNPCTime, self.Angry, self.Furious, self.ChanceOfFuryOnHurt, self.ChanceOfFuryOnLeaderDeath, self.ImpatientAttackTime, self.imusic_noseen_warp, self.DelayNoSeenFuncMusicBackUp, me.CombatGroup, self.__save_core_funcs__())
  1604.         return PlayerPerson_state
  1605.  
  1606.     
  1607.     def __setstate__(self, parm):
  1608.         Basic_Funcs.PlayerPerson.__setstate__(self, parm)
  1609.         me = Bladex.GetEntity(self.Name)
  1610.         me.SeeFunc = self.StdSeeTheEnemy
  1611.         me.HearFunc = self.StdHearFunc
  1612.         me.DelayNoSeenFunc = self.StdDelayNoSeen
  1613.         me.NoAllowedAreaFunc = self.StdNoAllowedArea
  1614.         me.EnemyNoAllowedAreaFunc = self.StdEnemyNoAllowedArea
  1615.         me.ImHurtFunc = self.StdImHurt
  1616.         me.ImDeadFunc = self.StdImDead
  1617.         me.EnemyDeadFunc = self.StdEnemyDead
  1618.         me.AnmEndedFunc = self.StdAnmEnded
  1619.         me.EnterCloseFunc = self.StdEnterClose
  1620.         me.EnterLargeFunc = self.StdEnterLarge
  1621.         me.EnterPrimaryAAFunc = self.StdEnterPrimaryAA
  1622.         me.EnterSecondaryAAFunc = self.StdEnterSecondaryAA
  1623.         me.CharSeeingEnemyFunc = self.StdCharSeeingEnemy
  1624.         me.ToggleCombatFunc = self.StdToggleCombat
  1625.         version = parm[0]
  1626.         if version == 1:
  1627.             parms = parm[1]['NPCPerson']
  1628.             self.InvestigatingSound = parms[0]
  1629.             self.SoundPriorities = parms[1]
  1630.             self.Asleep = parms[2]
  1631.             self.SleepYOffset = parms[3]
  1632.             self.group_fighter = parms[4]
  1633.             self.group_leader = parms[5]
  1634.             self.AttackingNPC = parms[6]
  1635.             self.last_insulting_time_1AA = parms[7]
  1636.             self.LastThrownHurtTime = parms[8]
  1637.             self.AttacksOwnKind = parms[9]
  1638.             self.AttackNPCTime = parms[10]
  1639.             self.Angry = parms[11]
  1640.             self.Furious = parms[12]
  1641.             self.ChanceOfFuryOnHurt = parms[13]
  1642.             self.ChanceOfFuryOnLeaderDeath = parms[14]
  1643.             self.ImpatientAttackTime = parms[15]
  1644.             self.imusic_noseen_warp = parms[16]
  1645.             self.DelayNoSeenFuncMusicBackUp = parms[17]
  1646.             me.CombatGroup = parms[18]
  1647.             self.__load_core_funcs__(parms[19])
  1648.         
  1649.         self.ResetCombat(self.Name)
  1650.         AddMyWatchAnims(self.Name)
  1651.         me = Bladex.GetEntity(self.Name)
  1652.         me.CombatDistFlag = not (self.group_fighter)
  1653.         self.NoFXOnHit = FALSE
  1654.         self.WeaponsOut(self.Name)
  1655.  
  1656.  
  1657.  
  1658. def AddMyWatchAnims(EntityName):
  1659.     Reference.debugprint(EntityName + ' adding WatchAnims')
  1660.     me = Bladex.GetEntity(EntityName)
  1661.  
  1662.  
  1663. class StupidNPCPerson(Basic_Funcs.PlayerPerson):
  1664.     InvestigatingSound = FALSE
  1665.     SoundPriorities = [
  1666.         -1.0,
  1667.         -1.0,
  1668.         -1.0,
  1669.         -1.0,
  1670.         -1.0]
  1671.     
  1672.     def __init__(self, me):
  1673.         Basic_Funcs.PlayerPerson.__init__(self, me)
  1674.         self.SoundPriorities = [
  1675.             -1.0,
  1676.             -1.0,
  1677.             -1.0,
  1678.             -1.0,
  1679.             -1.0]
  1680.         self.NPC = 1
  1681.         me.SubscribeToList('Listeners')
  1682.         me.Deaf = 0
  1683.  
  1684.     
  1685.     def RespondToHit(self, EntityName, AttackerName, DamagePoints, DamageZone, Shielded):
  1686.         pass
  1687.  
  1688.  
  1689.