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