#!/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  
 |