#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
  
 | 
##@package AIType_1  
 | 
#ÆÕͨNPC(½üÕ½, Ð¡¹Ö)µÄAIÂß¼, °´¸ÅÂʾö¶¨ÊÇ·ñ×·»÷,  
 | 
## ´ËAIʹÓÃÂÊ×î¸ß£¬Í¨¹ýÔÚÏßÓû§¾ö¶¨AIÖ´ÐÐÆµÂÊ£¬²»È»»á¿¨ËÀ  
 | 
#  
 | 
# @author eggxp  
 | 
# @date 2010-4-23  
 | 
# @version 1.8  
 | 
#  
 | 
  
 | 
#------------------------------------------------------------------------------   
 | 
"""Version = 2017-03-25 17:39"""  
 | 
#---------------------------------------------------------------------  
 | 
import IPY_GameWorld  
 | 
import GameWorld  
 | 
import NPCCommon  
 | 
import BaseAttack  
 | 
import ChConfig  
 | 
import AICommon  
 | 
import random  
 | 
import GameObj  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
Def_LastAI1ProTick = "LastAI1ProTick" # ×îºóÒ»´ÎÖ´ÐÐtick  
 | 
Def_AI1ProcessTick = "AI1Process"   # Ö´ÐÐÆµÂÊ ºÁÃë  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## ³õʼ»¯  
 | 
#  @param curNPC µ±Ç°npc  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def DoInit(curNPC):  
 | 
    curNPC.GetNPCAngry().Init(ChConfig.Def_NormalNPCAngryCount)  
 | 
    return  
 | 
  
 | 
## Ö´ÐÐAI  
 | 
#  @param curNPC µ±Ç°npc  
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def ProcessAI(curNPC, tick):  
 | 
    npcControl = NPCCommon.NPCControl(curNPC)  
 | 
    if curNPC.GetCurAction() == IPY_GameWorld.laNPCDie or not curNPC.IsAlive():  
 | 
        #NPCËÀÍö, ½øÈëËÀÍöµ¹¼ÆÊ±  
 | 
        if npcControl.DieTick(tick) == 0:  
 | 
            return  
 | 
      
 | 
    ## Ö´ÐÐÆµÂÊ, Ã¿10ÈËÑÓ³¤1ÃëÖ´ÐÐÆµÂÊ---------------------------  
 | 
    if tick - curNPC.GetDictByKey(Def_LastAI1ProTick) < curNPC.GetDictByKey(Def_AI1ProcessTick):  
 | 
        return  
 | 
    playerCount = GameWorld.GetPlayerManager().OnlineCount()  
 | 
    delayTime = max(playerCount/10-3, 0) * 1000  
 | 
    curNPC.SetDict(Def_AI1ProcessTick, delayTime)  
 | 
    curNPC.SetDict(Def_LastAI1ProTick, tick)  
 | 
    #-------------------------------------------------------  
 | 
  
 | 
  
 | 
    #Ë¢ÐÂ×Ô¼ºµÄbuff  
 | 
    npcControl.RefreshBuffState(tick)  
 | 
    if GameObj.GetHP(curNPC) == 0 :  
 | 
        # BUFFË¢ÐÂÖпÉÄܻᵼÖÂNPCËÀÍö  
 | 
        return  
 | 
      
 | 
  
 | 
#    #ÅжÏÒ쳣״̬  
 | 
#    if curNPC.GetAbnormalState() == IPY_GameWorld.sctFaint:  
 | 
#        return   
 | 
      
 | 
    curNPCAction = curNPC.GetCurAction()  
 | 
    #NPC¿ìËÙ±¼ÅÜÖÐ, ´¦Àí  
 | 
    if curNPCAction == IPY_GameWorld.laNPCMove and curNPC.GetCurMoveType() == IPY_GameWorld.mtRun :  
 | 
        AICommon.NormalNPCFast_Move(curNPC, tick)  
 | 
        return  
 | 
      
 | 
    #Ë¢ÐÂ×Ô¼º³ðºÞ¶ÈÁÐ±í  
 | 
    npcControl.RefreshAngryList(tick)  
 | 
      
 | 
    if not curNPC.GetIsNeedProcess():  
 | 
        AICommon.NormalNPCFree_Move(curNPC, tick)  
 | 
        return  
 | 
      
 | 
    curNPCAngry = npcControl.GetMaxAngryTag()  
 | 
      
 | 
    #³ðºÞ¶ÈÁбíÖеÄÈËΪ¿Õ  
 | 
    if curNPCAngry == None :  
 | 
        AICommon.NormalNPCFree_Move(curNPC, tick)  
 | 
        return  
 | 
  
 | 
    #³ðºÞ¶ÔÏóÀàÐÍ,³ðºÞ¶ÔÏóID  
 | 
    curNPCAngryType = curNPCAngry.GetObjType()  
 | 
    curNPCAngryID = curNPCAngry.GetObjID()  
 | 
    #Õ½¶·ÖлØÑª  
 | 
    npcControl.ProcessBattleHPRestore(tick)  
 | 
    #Ö´Ðй¥»÷Âß¼  
 | 
    __NPCFight(curNPC, curNPCAngryID, curNPCAngryType, tick)  
 | 
  
 | 
  
 | 
## npc¹¥»÷Âß¼  
 | 
#  @param curNPC µ±Ç°npc  
 | 
#  @param tagID curNPCAngryID  
 | 
#  @param tagType curNPCAngryType   
 | 
#  @param tick µ±Ç°Ê±¼ä  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def __NPCFight(curNPC, tagID, tagType, tick):  
 | 
    #ÉèÖýøÈëÕ½¶·×´Ì¬  
 | 
    NPCCommon.SetNPCInBattleState(curNPC)  
 | 
    npcControl = NPCCommon.NPCControl(curNPC)  
 | 
      
 | 
    #ÊÇ·ñÔÚÒÆ¶¯·¶Î§ÄÚ  
 | 
    if not npcControl.IsInRefreshArea():  
 | 
        #×·»÷·µ»Ø  
 | 
        npcControl.MoveBack()  
 | 
        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 tagDist > curNPC.GetAtkDist() :  
 | 
        if __CheckNPCBeAttackCanMove(curNPC, tick):  
 | 
            destDist = GameWorld.GetDist(curNPC.GetDestPosX() , curNPC.GetDestPosY(), curTag.GetPosX(), curTag.GetPosY())  
 | 
            if destDist <= curNPC.GetAtkDist() and curNPC.GetCurAction() == IPY_GameWorld.laNPCMove:  
 | 
                # Ä¿±êÔÚÒÆ¶¯µÄ¹¥»÷·¶Î§ÄÚ£¬²»¸Ä±äÄ¿±êµã  
 | 
                return  
 | 
            npcControl.MoveToObj_Detel(curTag)  
 | 
        return  
 | 
    else:  
 | 
        curNPC.StopMove()  
 | 
          
 | 
    if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():  
 | 
        #¹¥»÷¼ä¸ôûÓе½, ·µ»Ø  
 | 
        return  
 | 
      
 | 
    if __CheckNPCBeAttackCanMove(curNPC, tick):  
 | 
        if npcControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()):  
 | 
            #ÐÞÕýÕâ¸öNPCµÄÕ¾Á¢Î»Öà  
 | 
            return  
 | 
      
 | 
    curNPCAction = curNPC.GetCurAction()  
 | 
    if curNPCAction == IPY_GameWorld.laNPCMove:  
 | 
        return  
 | 
      
 | 
    #ÆÕͨ¹¥»÷  
 | 
    BaseAttack.Attack( curNPC, curTag, None, tick )  
 | 
    return  
 | 
          
 | 
  
 | 
# 2017-11-21 ÐÂÐèÇóС¹ÖAI1±»»÷²»×öÒÆ¶¯´¦Àí  
 | 
def __CheckNPCBeAttackCanMove(curNPC, tick):  
 | 
    if curNPC.GetIsBoss():  
 | 
        return True  
 | 
      
 | 
    if tick - curNPC.GetDictByKey("NPCBeAttackedAI1") > 300:  
 | 
        return True  
 | 
      
 | 
    return False  
 | 
      
 |