#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
##@package NPCAI.AIType_198  
 | 
#  
 | 
# @todo:ÅÜÅÜÅÜ-Ëæ»ú  
 | 
# @author hxp  
 | 
# @date 2017-11-27  
 | 
# @version 1.0  
 | 
#  
 | 
# ÏêϸÃèÊö: ÅÜÅÜÅÜ-Ëæ»ú£¬ÌÓÀëÍæ¼ÒAI  
 | 
#  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2017-11-27 16:30"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import ChConfig  
 | 
import GameWorld  
 | 
import IPY_GameWorld  
 | 
import NPCCommon  
 | 
  
 | 
import random  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
## ³õʼ»¯  
 | 
#  @param curNPC µ±Ç°npc  
 | 
#  @return None  
 | 
#  @remarks º¯ÊýÏêϸ˵Ã÷.  
 | 
def DoInit(curNPC):  
 | 
    curNPC.GetNPCAngry().Init(ChConfig.Def_NormalNPCAngryCount)  
 | 
    return  
 | 
  
 | 
def OnNPCReborn(curNPC):  
 | 
    curNPC.SetIsNeedProcess(True)  
 | 
    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  
 | 
      
 | 
    if curNPC.GetCurAction() == IPY_GameWorld.laNPCMove:  
 | 
        #GameWorld.DebugLog("ÒÆ¶¯Öв»´¦Àí£¡(%s,%s)" % (curNPC.GetPosX(), curNPC.GetPosY()))  
 | 
        return  
 | 
      
 | 
    #Ë¢ÐÂ×Ô¼º³ðºÞ¶ÈÁÐ±í  
 | 
    curTag = None  
 | 
    npcControl.RefreshAngryList(tick)  
 | 
    curNPCAngry = npcControl.GetMaxAngryTag()  
 | 
    if curNPCAngry:  
 | 
        #³ðºÞ¶ÔÏóÀàÐÍ,³ðºÞ¶ÔÏóID  
 | 
        curNPCAngryType = curNPCAngry.GetObjType()  
 | 
        curNPCAngryID = curNPCAngry.GetObjID()  
 | 
        curTag = GameWorld.GetObj(curNPCAngryID, curNPCAngryType)  
 | 
          
 | 
    if curTag == None:  
 | 
        # µØÍ¼ÄÚËæ»úÒÆ¶¯  
 | 
        __RandMove(curNPC)  
 | 
    else:  
 | 
        __RunawayFromAngryObj(curNPC, curTag)  
 | 
          
 | 
    return  
 | 
  
 | 
def __RunawayFromAngryObj(curNPC, curNPCAngry):  
 | 
    ## Ô¶Àë³ðºÞÍæ¼Ò  
 | 
    moveArea = curNPC.GetMoveArea() # µ¥´ÎÒÆ¶¯·¶Î§  
 | 
    posX = curNPC.GetPosX()  
 | 
    posY = curNPC.GetPosY()  
 | 
    angryObjPosX, angryObjPosY = curNPCAngry.GetPosX(), curNPCAngry.GetPosY()  
 | 
    diffX, diffY = posX - angryObjPosX, posY - angryObjPosY # Á½Õß×ø±ê²î  
 | 
    dirX = 1 if diffX >= 0 else - 1 # x×ø±ê²î·½Ïò  
 | 
    dirY = 1 if diffY >= 0 else - 1 # y×ø±ê²î·½Ïò  
 | 
      
 | 
    #for _ in xrange(moveArea * moveArea):  
 | 
    randDist = max(3, random.randint(moveArea / 2, moveArea)) # Ëæ»úÒÆ¶¯¾àÀë  
 | 
    distX = randDist * dirX  
 | 
    distY = randDist * dirY  
 | 
      
 | 
    newPosX = posX + distX  
 | 
    newPosY = posY + distY  
 | 
      
 | 
    if (posX == newPosX and posY == newPosY) or not GameWorld.GetMap().CanMove(newPosX, newPosY):  
 | 
        # Á½Õß×ø±ê²îÔÚNPCÒÆ¶¯·¶Î§ÄÚ£¬Ôò³¯³ðºÞÄ¿±êºó·½Òƶ¯, ·ñÔòÔò·´ÏòËæ»úÒÆ¶¯  
 | 
        if abs(diffX) <= 5 and abs(diffY) <= 5:  
 | 
            newPosX = angryObjPosX - 3 * dirX  
 | 
            newPosY = angryObjPosY - 3 * dirY  
 | 
            #GameWorld.DebugLog("³¯Íæ¼Òºó·½Òƶ¯: (%s,%s),angry(%s,%s),diff(%s,%s),dir(%s,%s),moveArea=%s,new(%s,%s)"   
 | 
            #                   % (posX, posY, angryObjPosX, angryObjPosY, diffX, diffY, dirX, dirY, moveArea, newPosX, newPosY))  
 | 
        else:  
 | 
            __RandMove(curNPC)  
 | 
            return  
 | 
              
 | 
    if posX == newPosX or posY == newPosY:  
 | 
        return  
 | 
    #GameWorld.DebugLog("ÌÓÀëÒÆ¶¯: (%s,%s) to (%s,%s)" % (posX, posY, newPosX, newPosY))  
 | 
    curNPC.Move(newPosX, newPosY)  
 | 
    return  
 | 
  
 | 
def __RandMove(curNPC):  
 | 
    ## Ëæ»úÒÆ¶¯  
 | 
    moveArea = curNPC.GetMoveArea()  
 | 
    posX = curNPC.GetPosX()  
 | 
    posY = curNPC.GetPosY()  
 | 
    gameMap = GameWorld.GetMap()  
 | 
      
 | 
    for _ in xrange(moveArea * moveArea):  
 | 
        randX = posX + random.randint(-moveArea, moveArea)  
 | 
        randY = posY + random.randint(-moveArea, moveArea)  
 | 
        if posX == randX and posY == randY:  
 | 
            continue  
 | 
        if gameMap.CanMove(randX, randY):  
 | 
            #GameWorld.DebugLog("Ëæ»úÒÆ¶¯: (%s,%s) to (%s,%s)" % (posX, posY, randX, randY))  
 | 
            curNPC.Move(randX, randY)  
 | 
            return  
 | 
    return  
 | 
  
 |