#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#
|
#
|
##@package AIType_104
|
# @todo: ³èÎïAI
|
#
|
# @author chenxuewei
|
# @date 2010-06-26
|
# @version 2.2
|
#
|
# @change: "2010-06-28 20:56" panwei ³èÎï¿ÕÏÐʱ°´±í¸ñÊýÖµ»ØÑª
|
# @change: "2010-07-02 13:40" chenxuewei ³èÎï¸úËæÖ÷È˹¥»÷£¬ÔÚ¹¥»÷ǰÇå¿ÕÆä×ÔÉíËùÓгðºÞÖµ¡£
|
# @change: "2010-07-13 19:30" panwei Ð޸ijèÎïAI
|
# @change: "2010-07-14 18:10" panwei Ð޸ijèÎïAI
|
# @change: "2010-07-29 17:00" panwei ³èÎïÑéÖ¤Âß¼Ìáµ½Èë¿Ú´¦
|
|
# @change: "2010-08-04 15:20" panwei ³èÎïÐÂÔö×Ô¶¯Êͷż¼ÄÜÂß¼
|
# @change: "2010-09-02 16:15" panwei ³èÎïÒÆ¶¯·½Ê½ÐÞ¸Ä
|
# @change: "2010-09-09 13:50" panwei ³èÎïÍ£Ö¹½ÃÕý×ø±êº¯ÊýÐÞ¸Ä
|
# @change: "2010-09-26 16:45" panwei ³èÎïÒÆ¶¯Âß¼Åж¨ÐÞ¸Ä
|
# @change: "2010-10-21 17:45" Alee ³èÎïÌí¼ÓAIģʽ£¬¸úËæAI
|
# @change: "2011-07-01 12:40" Alee ·À³ÁÃÔÏÞÖÆ
|
# @change: "2017-02-15 10:00" xdh ºÍÖ÷ÈËÔÚͬһ¸öλÖÃʱ£¬³èÎïÅÜ¿ª
|
#------------------------------------------------------------------------------
|
"""Version = 2017-02-15 10:00"""
|
#---------------------------------------------------------------------
|
#µ¼Èë
|
import IPY_GameWorld
|
import GameWorld
|
import NPCCommon
|
import BaseAttack
|
import ChConfig
|
import AICommon
|
import SkillShell
|
import SkillCommon
|
import PetControl
|
import GameMap
|
import GameObj
|
#---------------------------------------------------------------------
|
## ³õʼ»¯
|
# @param rolePet ³èÎïʵÀý
|
# @return None
|
# @remarks ³õʼ»¯
|
def DoInit(rolePet):
|
rolePet.GetNPCAngry().Init(ChConfig.Def_Pet_Angry_Count)
|
return
|
#---------------------------------------------------------------------
|
## Ö´ÐÐAI
|
# @param rolePet ³èÎïʵÀý
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks Ö´ÐÐAI
|
def ProcessAI(rolePet, tick):
|
#---²éÕÒ³èÎïÖ÷ÈË---
|
curPlayer = NPCCommon.GetSummonNPCOwner(IPY_GameWorld.gotPlayer, rolePet)
|
|
if curPlayer == None:
|
GameWorld.ErrLog('³èÎï = %sÎÞ·¨²éÕÒÖ÷ÈË, AIÖ´ÐÐʧ°Ü'%(rolePet.GetID()))
|
return
|
|
#---ˢгèÎïµÄBuff---
|
rolePetControl = NPCCommon.NPCControl(rolePet)
|
rolePetControl.RefreshBuffState(tick)
|
if GameObj.GetHP(rolePet) == 0 :
|
# BUFFË¢ÐÂÖпÉÄܻᵼÖÂNPCËÀÍö
|
return
|
|
#---³èÎïÒÆ¶¯ÖÐ---
|
if rolePet.GetCurAction() == IPY_GameWorld.laNPCMove and \
|
__SummonOutRefreshArea(curPlayer, rolePet, rolePetControl):
|
return
|
|
#---AIģʽÊÇ Õ½¶·Ä£Ê½---
|
if rolePet.GetAIMode() == IPY_GameWorld.pamAttack:
|
|
#·À³ÁÃÔ
|
if curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_Wallow_LV) > ChConfig.Def_GameWallow_LV_First:
|
return
|
|
#---ÓÅÏȹ¥»÷Ö÷ÈË´òµÄ¶ÔÏó---
|
masterAttackObj = AICommon.PlayerSummonAkObj(rolePet, tick, False)
|
|
if masterAttackObj != None:
|
__NPCFight(curPlayer, rolePet, masterAttackObj.GetID(), masterAttackObj.GetGameObjType(), tick)
|
return
|
|
#---¹¥»÷×Ô¼º³ðºÞÁбíÖеĶÔÏó---
|
#Ë¢ÐÂ×Ô¼º³ðºÞ¶ÈÁбí
|
rolePetControl.RefreshAngryList(tick)
|
|
curAngry = rolePetControl.GetMaxAngryTag()
|
|
if curAngry != None:
|
__NPCFight(curPlayer, rolePet, curAngry.GetObjID(), curAngry.GetObjType(), tick)
|
return
|
|
#---ÎÞ³ðºÞÄ¿±êÂß¼´¦Àí---
|
curNPCAction = rolePet.GetCurAction()
|
|
#¿ÕÏÐ״̬´¦Àí
|
if curNPCAction == IPY_GameWorld.laNPCNull:
|
#³èÎï¿ÕÏÐ״̬Ï»ØÑª
|
RestoreHP(rolePet, tick)
|
|
#Ö´ÐиúËæÒÆ¶¯Âß¼
|
if __SummonMove(curPlayer, rolePet, rolePetControl):
|
return
|
|
#³èÎï²»ÐèÒªÒÆ¶¯, ÐÞÕý³èÎïµÄλÖÃ, ²»ÈÃÖØµþ
|
rolePetControl.FixTagPos(rolePet.GetPosX(), rolePet.GetPosY(), 1)
|
return
|
|
#¹¥»÷״̬´¦Àí
|
if curNPCAction == IPY_GameWorld.laNPCAttack:
|
rolePet.SetCurAction(IPY_GameWorld.laNPCNull)
|
|
return
|
|
#---------------------------------------------------------------------
|
## Õ½¶·
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param rolePet ³èÎïʵÀý
|
# @param tagID ¹¥»÷Ä¿±êID
|
# @param tagType ¹¥»÷Ä¿±êÀàÐÍ
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
# @remarks Õ½¶·
|
def __NPCFight(curPlayer, rolePet, tagID, tagType, tick):
|
rolePetControl = NPCCommon.NPCControl(rolePet)
|
|
#×·»÷·µ»Ø
|
if __SummonOutRefreshArea(curPlayer, rolePet, rolePetControl):
|
return
|
|
#¿ªÊ¼¹¥»÷
|
curTag = GameWorld.GetObj(tagID, tagType)
|
|
if curTag == None or GameObj.GetHP(curTag) <= 0:
|
return
|
|
tagDist = GameWorld.GetDist(rolePet.GetPosX(), rolePet.GetPosY(), curTag.GetPosX(), curTag.GetPosY())
|
|
#---ÓÅÏÈÊͷż¼ÄÜ---
|
if AICommon.DoAutoUseSkill(rolePet, curTag, tagDist, tick):
|
return
|
|
#---ÊÍ·ÅÆÕͨ¹¥»÷---
|
if tagDist > rolePet.GetAtkDist():
|
rolePetControl.MoveToObj_Detel(curTag)
|
return
|
|
#¹¥»÷Âß¼
|
if tick - rolePet.GetAttackTick() < rolePet.GetAtkInterval():
|
#¹¥»÷¼ä¸ôûÓе½, ·µ»Ø
|
return
|
|
if rolePetControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()):
|
#ÐÞÕýÕâ¸öNPCµÄÕ¾Á¢Î»ÖÃ
|
return
|
|
#ÆÕͨ¹¥»÷
|
BaseAttack.Attack(rolePet, curTag, None, tick)
|
return
|
#---------------------------------------------------------------------
|
## ÕÙ»½ÊÞÒÆ¶¯
|
# @param rolePet ³èÎïʵÀý
|
# @param curPlayer µ±Ç°Íæ¼Ò
|
# @param rolePetControl ³èÎï¿ØÖÆÆ÷
|
# @return ²¼¶ûÖµ
|
# @remarks ÕÙ»½ÊÞÒÆ¶¯
|
def __SummonMove(curPlayer, rolePet, rolePetControl):
|
dist = GameWorld.GetDist(rolePet.GetPosX(), rolePet.GetPosY(), curPlayer.GetPosX(), curPlayer.GetPosY())
|
#Í£Ö¹¾àÀë
|
stopDist = 3
|
#¸úËæ¾àÀë
|
followDist = ChConfig.Def_Screen_Area
|
|
if dist <=0: #ºÍÖ÷ÈËÔÚͬһ¸öλÖÃʱ£¬³èÎïÅÜ¿ª
|
resultPos = GameMap.GetEmptyPlaceInArea(rolePet.GetPosX(), rolePet.GetPosY(), 2)
|
moveDestX = resultPos.GetPosX()
|
moveDestY = resultPos.GetPosY()
|
|
if moveDestX != rolePet.GetPosX() or moveDestY != rolePet.GetPosY():
|
#Çл»ÖÁ¿ìËÙÒÆ¶¯×´Ì¬
|
NPCCommon.ChangeNPCMoveType(rolePet, IPY_GameWorld.mtRun)
|
#NPC¿ªÊ¼Òƶ¯
|
rolePet.Move(moveDestX, moveDestY)
|
return True
|
|
if dist < stopDist:
|
return False
|
|
if dist < followDist:
|
rolePetControl.MoveToObj_Detel(curPlayer, 1)
|
else:
|
#˲¼äÒÆ¶¯
|
__SummonResetPos(curPlayer, rolePet, rolePetControl)
|
|
return True
|
#---------------------------------------------------------------------
|
## ÕÙ»½ÊÞ³¬¹ýÇø¼ä
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param rolePet ³èÎïʵÀý
|
# @param npcControl npc¿ØÖÆÀà
|
# @return ²¼¶ûÖµ
|
# @remarks ÕÙ»½ÊÞ³¬¹ýÇø¼ä
|
def __SummonOutRefreshArea(curPlayer, rolePet, npcControl):
|
dist = GameWorld.GetDist(rolePet.GetPosX(), rolePet.GetPosY(), curPlayer.GetPosX(), curPlayer.GetPosY())
|
|
if dist < ChConfig.Def_PlayerSight_Default:
|
return False
|
|
#ÖØÖÃλÖÃ
|
__SummonResetPos(curPlayer, rolePet, npcControl)
|
return True
|
|
#---------------------------------------------------------------------
|
## ÖØÖÃλÖÃ
|
# @param curPlayer µ±Ç°¶ÔÏó
|
# @param rolePet ³èÎïʵÀý
|
# @param rolePetControl ³èÎï¿ØÖÆÆ÷
|
# @return None
|
# @remarks ÖØÖÃλÖÃ
|
def __SummonResetPos(curPlayer, rolePet, rolePetControl):
|
#Çå¿Õ³ðºÞ,Çå¿ÕÉËѪÁбí
|
rolePetControl.ClearNPCAngry()
|
rolePetControl.ClearNPCHurtList()
|
|
#ÖØÖÃ×ø±ê
|
moveDestX, moveDestY = rolePetControl.GetMoveNearPos(curPlayer.GetPosX(), curPlayer.GetPosY(), 1)
|
rolePet.ResetPos(moveDestX, moveDestY)
|
|
#ÖØÖÃNPCΪ¿ÕÏÐ״̬
|
rolePet.SetCurAction(IPY_GameWorld.laNPCNull)
|
return
|
|
#---------------------------------------------------------------------
|
##³èÎï¿ÕÏÐ״̬»ØÑª
|
# @param curNPC NPCʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ³èÎï¿ÕÏÐ״̬»ØÑª
|
def RestoreHP(rolePet, tick):
|
curHP = rolePet.GetHP()
|
maxHP = rolePet.GetMaxHP()
|
|
if curHP == maxHP:
|
#ÂúѪÁË
|
return
|
|
if tick - rolePet.GetRestoreTime() < ChConfig.Def_Pet_ProcessHP_Tick:
|
#»Ö¸´Ê±¼äδµ½
|
return
|
|
#ÉèÖõ±Ç°Ê±¼äΪ»Ö¸´Æðʼʱ¼ä
|
rolePet.SetRestoreTime(tick)
|
|
#--ÉèÖûØÑª
|
hpRestore = rolePet.GetHPRestore()
|
|
if hpRestore == 0:
|
return
|
|
PetControl.AddPetHP(rolePet, hpRestore)
|
return
|
|