| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package AIType_100  | 
| #  | 
| # @todo: ÕÙ»½ÊÞAI  | 
| # @author Alee  | 
| # @date 2013-06-18 22:30  | 
| # @version 1.1  | 
| #  | 
| # ÏêϸÃèÊö:  | 
| # @change: "2013-11-28 18:20" Alee ÉèÖÃÕÙ»½Ê޿ɹ¥»÷  | 
| #------------------------------------------------------------------------------   | 
| """Version = 2013-11-28 18:20"""  | 
| #------------------------------------------------------------------------------  | 
|   | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import NPCCommon  | 
| import BaseAttack  | 
| import ChConfig  | 
| import AICommon  | 
| import SkillShell  | 
| import GameObj  | 
| #---------------------------------------------------------------------  | 
|   | 
| ## ³õʼ³ðºÞ  | 
| #  @param curNPC ÊµÀý  | 
| #  @return None  | 
| def DoInit(curNPC):  | 
|     curNPC.GetNPCAngry().Init(ChConfig.Def_BossAngryCount)  | 
|   | 
|   | 
| ## AIÑ»·µ÷ÓÃ  | 
| #  @param curNPC ÊµÀý  | 
| #  @return None  | 
| def ProcessAI(curNPC, tick):  | 
|     if not curNPC.IsAlive():  | 
|         #NPCËÀÍö  | 
|         return  | 
|       | 
|     curNPCControl = NPCCommon.NPCControl(curNPC)  | 
|     if curNPC.GetLastTime() != 0 and tick - curNPC.GetBornTime() >= curNPC.GetLastTime():  | 
|         #ÕÙ»½ÊÞ³¬¹ý´æ»îʱ¼ä, ÉèÖÃËÀÍö  | 
|         curNPCControl.SetKilled()  | 
|         return  | 
|   | 
|     if not curNPC.GetCanAttack():  | 
|         curNPC.SetCanAttack(True)  | 
|           | 
|     curNPCOwner = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curNPC)  | 
|     if curNPCOwner == None:  | 
|         #ûÓÐÖ÷ÈË, ²»×öÈκζ¯×÷  | 
|         return  | 
|           | 
|     #ÕÙ»½ÊÞÓÅÏȹ¥»÷×Ô¼ºÖ÷ÈË´òµÄÄ¿±ê  | 
|     #Ë¢ÐÂ×Ô¼ºµÄbuff  | 
|     curNPCControl.RefreshBuffState(tick)  | 
|     if GameObj.GetHP(curNPC) == 0 :  | 
|         # BUFFË¢ÐÂÖпÉÄܻᵼÖÂNPCËÀÍö  | 
|         return  | 
|       | 
|     #NPC¿ìËÙ±¼ÅÜÖÐ, ´¦Àí  | 
|     if curNPC.GetCurAction() == IPY_GameWorld.laNPCMove and curNPC.GetCurMoveType() == IPY_GameWorld.mtRun:  | 
|         __SummonOutRefreshArea(curNPC, curNPCControl)  | 
|         return  | 
|       | 
|     #¿ÉÒÔ¹¥»÷µÄ¶ÔÏó  | 
|     masterAttackObj = AICommon.PlayerSummonAkObj(curNPC, tick, False)      | 
|     if masterAttackObj != None:  | 
|         __NPCFight(curNPC, masterAttackObj.GetID(), masterAttackObj.GetGameObjType(), tick)  | 
|         return  | 
|           | 
|     #----------------ÕÙ»½ÊÞ¹¥»÷×Ô¼º³ðºÞÁбíÖеĶÔÏó  | 
|     #Ë¢ÐÂ×Ô¼º³ðºÞ¶ÈÁÐ±í  | 
|     curNPCControl.RefreshAngryList(tick)  | 
|     curAngry = curNPCControl.GetMaxAngryTag()  | 
|       | 
|     if curAngry == None:  | 
|         curNPCAction = curNPC.GetCurAction()  | 
|         #³ðºÞ¶ÈÁбíÖеÄÈËΪ¿Õ  | 
|         if curNPCAction == IPY_GameWorld.laNPCMove:  | 
|             #ÒÆ¶¯ÖÐ, ÔÝʱ²»´¦Àí  | 
|             pass  | 
|         elif curNPCAction == IPY_GameWorld.laNPCNull:  | 
|             #¿ÕÏÐ״̬,ÐèÒª¸úËæÖ÷ÈËÒÆ¶¯  | 
|             __SummonMove(curNPC, curNPCOwner)  | 
|         elif curNPCAction == IPY_GameWorld.laNPCAttack:  | 
|             #Èç¹û¹¥»÷״̬,ÉèÖÃΪ¿ÕÏÐ״̬  | 
|             curNPC.SetCurAction(IPY_GameWorld.laNPCNull)  | 
|         return  | 
|       | 
|     __NPCFight(curNPC, curAngry.GetObjID(), curAngry.GetObjType(), tick)  | 
|   | 
|   | 
| ## Õ½¶·  | 
| #  @param curNPC ÊµÀý  | 
| #  @param tagID ¹¥»÷Ä¿±êID  | 
| #  @param tagType ¹¥»÷Ä¿±êÀàÐÍ  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def __NPCFight(curNPC, tagID, tagType, tick):  | 
|     curNPCControl = NPCCommon.NPCControl(curNPC)  | 
|       | 
|     #×·»÷·µ»Ø  | 
|     if __SummonOutRefreshArea(curNPC, curNPCControl):  | 
|         return  | 
|       | 
|     #¿ªÊ¼¹¥»÷  | 
|     curTag = GameWorld.GetObj(tagID, tagType)  | 
|       | 
|     if curTag == None or GameObj.GetHP(curTag) <= 0:  | 
|         return  | 
|       | 
|     tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY())  | 
|       | 
|   | 
|     #---ÓÅÏÈÊͷż¼ÄÜ---  | 
|     if AICommon.DoAutoUseSkill(curNPC, curTag, tagDist, tick):  | 
|         return  | 
|   | 
|     #---ÊÍ·ÅÆÕͨ¹¥»÷---  | 
|     if tagDist > curNPC.GetAtkDist():  | 
|         curNPCControl.MoveToObj_Detel(curTag)  | 
|         return  | 
|       | 
|     #¹¥»÷Âß¼  | 
|     if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():  | 
|         #¹¥»÷¼ä¸ôûÓе½, ·µ»Ø  | 
|         return  | 
|       | 
|     if curNPCControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()):  | 
|         #ÐÞÕýÕâ¸öNPCµÄÕ¾Á¢Î»Öà  | 
|         return  | 
|       | 
|     #ÆÕͨ¹¥»÷  | 
|     BaseAttack.Attack(curNPC, curTag, None, tick)  | 
|       | 
|     return  | 
|   | 
|   | 
| ## ÕÙ»½ÊÞÒÆ¶¯  | 
| #  @param curNPC ÊµÀý  | 
| #  @return None  | 
| def __SummonMove(curNPC, curPlayer):  | 
|     npcControl = NPCCommon.NPCControl(curNPC)  | 
|     dist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curPlayer.GetPosX(), curPlayer.GetPosY())  | 
|     #Í£Ö¹¾àÀë  | 
|     stopDist = 3  | 
|     #¸úËæ¾àÀë  | 
|     followDist = ChConfig.Def_Screen_Area  | 
|       | 
|     if dist < stopDist:  | 
|         pass  | 
|     elif dist < followDist:  | 
|         npcControl.MoveToObj_Detel(curPlayer)  | 
|     else:  | 
|         #˲¼äÒÆ¶¯  | 
|         __SummonResetPos(curNPC, curPlayer, npcControl)  | 
|       | 
|     return  | 
|   | 
|   | 
| ##ÕÙ»½ÊÞ³¬¹ýÇø¼ä  | 
| #  @param curNPC ÊµÀý  | 
| #  @return None  | 
| def __SummonOutRefreshArea(curNPC, npcControl):  | 
|     curPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curNPC)  | 
|     if curPlayer == None:  | 
|         return  | 
|       | 
|     dist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curPlayer.GetPosX(), curPlayer.GetPosY())  | 
|       | 
|     if dist < ChConfig.Def_PlayerSight_Default:  | 
|         return  | 
|       | 
|     #ÖØÖÃλÖà  | 
|     __SummonResetPos(curNPC, curPlayer, npcControl)  | 
|     return True  | 
|   | 
|   | 
| ##ÖØÖÃλÖà  | 
| #  @param curNPC ÊµÀý  | 
| #  @return None  | 
| def __SummonResetPos(curNPC, curPlayer, npcControl):  | 
|     #Çå¿Õ³ðºÞ,Çå¿ÕÉËѪÁÐ±í  | 
|     npcControl.ClearNPCAngry()  | 
|     npcControl.ClearNPCHurtList()  | 
|     moveDestX, moveDestY = npcControl.GetMoveNearPos(curPlayer.GetPosX(), curPlayer.GetPosY(),   | 
|                                                      ChConfig.Def_PlayerTurckBeginMoveDist)  | 
|     curNPC.ResetPos(moveDestX, moveDestY)  | 
|     #ÖØÖÃNPCΪ¿ÕÏÐ״̬  | 
|     curNPC.SetCurAction(IPY_GameWorld.laNPCNull)  | 
|     return  | 
|   | 
|   |