| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #  | 
| #---------------------------------------------------------------------  | 
| ##@package AIType_60  | 
| # @todo: ÍòÄê±ùÀεÚÒ»¹ØBossÕÙ»½ÊÞAI (Êͷż¼ÄÜ£¬±»Íæ¼Ò´òËÀºó´¥·¢¶ÔBossÊͷż¼ÄÜ)  | 
| #  | 
| # @author zhangd  | 
| # @date 2011-07-18 12:00  | 
| # @version 1.2  | 
| #  | 
| # @note:   | 
| # @change: "2011-07-19 11:20" Alee Êä³ö×¢ÊÍÐÞ¸Ä  | 
| # @change: "2011-07-19 21:00" zhangd ÐÞ¸Äbuff²»Ë¢ÐÂbug  | 
| #------------------------------------------------------------------------------   | 
| """Version = 2011-07-19 21:00"""  | 
| #---------------------------------------------------------------------  | 
| #µ¼Èë  | 
| import ChConfig  | 
| import IPY_GameWorld  | 
| import GameWorld  | 
| import NPCCommon  | 
| import BaseAttack  | 
| import ChConfig  | 
| import SkillShell  | 
| import FBDefenseCommon  | 
| import GameObj  | 
| #---------------------------------------------------------------------  | 
|   | 
| #---------------------------------------------------------------------  | 
| ## ³õʼ»¯  | 
| #  @param curNPC µ±Ç°npc  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def DoInit(curNPC):  | 
|     curNPC.GetNPCAngry().Init(ChConfig.Def_NormalNPCAngryCount)  | 
|     curNPC.SetIsNeedProcess(True)  | 
|     return  | 
|   | 
|   | 
| ## Ö´ÐÐAI  | 
| #  @param curNPC µ±Ç°npc  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def ProcessAI(curNPC, tick):  | 
|       | 
|     #NPCÒÑËÀÍö£¬Ìø³ö  | 
|     if curNPC.IsAlive() != True:  | 
|         return  | 
|       | 
|     npcControl = NPCCommon.NPCControl(curNPC)  | 
|       | 
|     #ÕÙ»½ÊÞ³¬¹ý´æ»îʱ¼ä, ÉèÖÃËÀÍö  | 
|     if curNPC.GetLastTime() != 0 and tick - curNPC.GetBornTime() >= curNPC.GetLastTime():  | 
|         npcControl.SetKilled()  | 
|         return  | 
|   | 
|     #Ë¢ÐÂ×Ô¼ºµÄbuff  | 
|     npcControl.RefreshBuffState(tick)    | 
|     if GameObj.GetHP(curNPC) == 0 :  | 
|         # BUFFË¢ÐÂÖпÉÄܻᵼÖÂNPCËÀÍö  | 
|         return     | 
|     #---¹¥»÷Âß¼---  | 
|       | 
|     #ʹÓü¼Äܳɹ¦  | 
|     if __NPCUseSkill(curNPC, tick):  | 
|         return   | 
|       | 
|     curNPCControl = NPCCommon.NPCControl(curNPC)  | 
|     npcControl.RefreshAngryList(tick)  | 
|     curAngry = npcControl.GetMaxAngryTag()  | 
|       | 
|     if not curAngry:  | 
|         return  | 
|       | 
|     #³ðºÞ¶ÔÏóÀàÐÍ,³ðºÞ¶ÔÏóID  | 
|     curNPCAngryType = curAngry.GetObjType()  | 
|     curNPCAngryID = curAngry.GetObjID()  | 
|       | 
|     curTag = GameWorld.GetObj(curNPCAngryID, curNPCAngryType)  | 
|       | 
|     if curTag == None or GameObj.GetHP(curTag) <= 0:  | 
|         return  | 
|       | 
|     tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY())  | 
|       | 
|     #ʹÓÃÆÕͨ¹¥»÷  | 
|     if tagDist > curNPC.GetAtkDist():  | 
|         curNPCControl.MoveToObj_Detel(curTag)  | 
|         return  | 
|       | 
|     #ÅжϹ«¹²CD  | 
|     if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():  | 
|         #¹¥»÷¼ä¸ôûÓе½, ·µ»Ø  | 
|         return  | 
|       | 
|     if curNPCControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()):  | 
|         #ÐÞÕýÕâ¸öNPCµÄÕ¾Á¢Î»Öà  | 
|         return  | 
|       | 
|     #ÆÕͨ¹¥»÷  | 
|     BaseAttack.Attack(curNPC, curTag, None, tick)  | 
|       | 
|     return  | 
|           | 
|   | 
| ## npcʹÓü¼ÄÜÂß¼  | 
| #  @param curNPC µ±Ç°npc  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return ÊÇ·ñÊͷųɹ¦  | 
| #  @remarks npcʹÓü¼ÄÜÂß¼£¨ÓÐÄ¿±êµÄ£©  | 
| def __NPCUseSkill(curNPC, tick):  | 
|   | 
|     curTag = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotNPC, curNPC)  | 
|       | 
|     if not curTag:  | 
|         #GameWorld.Log("AIType_60£¬curNpcID=%s, ÕÙ»½ÊÞÖ÷ÈËÒÑËÀ,ÕÙ»½ÊÞÈ´»î×Å,ÎÞ·¨¶ÔBossÊͷż¼ÄÜ"%curNPC.GetNPCID())  | 
|         return  | 
|       | 
|     #»ñµÃ¼¼ÄܹÜÀíÆ÷  | 
|     skillManager = curNPC.GetSkillManager()  | 
|      | 
|     curSkill = skillManager.GetSkillByIndex(0)  | 
|       | 
|     if curSkill == None:  | 
|         GameWorld.ErrLog("Êý¾Ý¿âÎÞ·¨²éÕÒ NPC = %s µÄµÚ1¸ö¼¼ÄÜ"%curNPC.GetNPCID())  | 
|         return  | 
|       | 
|     #¼¼ÄÜCDδµ½  | 
|     if tick - curSkill.GetLastUseTick() < curSkill.GetCoolDownTime():  | 
|         return  | 
|       | 
|     #²»ÔÚ¼¼ÄܵĹ¥»÷¾àÀëÄÚ  | 
|     tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY())  | 
|     if tagDist > curSkill.GetAtkDist():  | 
|         curNPCControl = NPCCommon.NPCControl(curNPC)  | 
|         curNPCControl.MoveToObj_Detel(curTag)  | 
|         return  | 
|       | 
|     #ʹÓü¼ÄÜ  | 
|     result = SkillShell.NPCUseSkillTag(curNPC, curTag, curSkill, tick)  | 
|       | 
|     return result      | 
|   | 
|   | 
| ## ÕÙ»½ÊÞ±»Íæ¼Ò´òËÀ´¥·¢»Ö¸´BossѪÁ¿¼¼ÄÜ  | 
| #  @param curNPC µ±Ç°npc  | 
| #  @param curPlayer É˺¦ÕßÍæ¼Ò  | 
| #  @param skill É˺¦Ê¹Óü¼ÄÜ  | 
| #  @return None  | 
| #  @remarks º¯ÊýÏêϸ˵Ã÷.  | 
| def OnAttackDieByPlayer(curNPC, curPlayer, skill):  | 
|     GameObj.SetHP(curNPC, 1)  | 
|     #»ñµÃ¼¼ÄܹÜÀíÆ÷  | 
|     skillManager = curNPC.GetSkillManager()  | 
|     curSkill = skillManager.GetSkillByIndex(1)  | 
|     if not curSkill:  | 
|         return  | 
|       | 
|     curTag = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotNPC, curNPC)  | 
|     if not curTag:  | 
|         return  | 
|       | 
|     tick = GameWorld.GetGameWorld().GetTick()  | 
|     result = SkillShell.NPCUseSkillTag(curNPC, curTag, curSkill, tick)  | 
|     GameObj.SetHP(curNPC, 0)  | 
|     return  |