#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#
|
#
|
##@package AIType_63.py
|
#
|
# @todo:ÕÙ»½ÊÞAI (¹¥»÷5´Î¾Í»á¼ÌÐø·ÖÁÑ)
|
#
|
# @author jiang
|
# @date 2012-07-13
|
# @version 1.0
|
# @note:
|
#
|
#------------------------------------------------------------------------------
|
"""Version = 2012-07-13 15:30"""
|
#------------------------------------------------------------------------------
|
# µ¼Èë
|
import GameWorld
|
import IPY_GameWorld
|
import ChConfig
|
import NPCCommon
|
import SkillShell
|
import BaseAttack
|
import SkillCommon
|
import AICommon
|
import GameObj
|
#------------------------------------------------------------------------------
|
|
Def_AtkCount = "AtkCount" # ¹¥»÷´ÎÊý
|
Def_MaxAtkCountSplit = 5 # ¹¥»÷¶àÉÙ´Î×Ô¶¯·ÖÁÑ
|
Def_SplitSkillID = 33787 # ·ÖÁѼ¼ID
|
#------------------------------------------------------------------------------
|
## ³õʼ»¯
|
# @param curNPC µ±Ç°npc
|
# @return None
|
def DoInit(curNPC):
|
curNPC.GetNPCAngry().Init(ChConfig.Def_SummonNPC_Angry_Count)
|
return
|
|
|
## Ö´ÐÐAI
|
# @param curNPC µ±Ç°npc
|
# @param tick µ±Ç°Ê±¼ä
|
# @return None
|
def ProcessAI(curNPC, tick):
|
|
#NPCÒÑËÀÍö£¬Ìø³ö
|
if curNPC.IsAlive() != True:
|
return
|
|
curNPCAction = curNPC.GetCurAction()
|
#NPC¿ìËÙ±¼ÅÜÖÐ, ´¦Àí
|
if curNPCAction == IPY_GameWorld.laNPCMove and curNPC.GetCurMoveType() == IPY_GameWorld.mtRun:
|
AICommon.NormalNPCFast_Move(curNPC, tick)
|
return
|
|
npcControl = NPCCommon.NPCControl(curNPC)
|
|
#Ë¢ÐÂ×Ô¼º³ðºÞ¶ÈÁбí
|
npcControl.RefreshAngryList(tick)
|
curAngry = npcControl.GetMaxAngryTag()
|
if not curAngry:
|
#ûÓгðºÞ¶ÔÏó
|
AICommon.NormalNPCFree_Move(curNPC, tick)
|
return
|
|
if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():
|
#¹¥»÷¼ä¸ôûÓе½
|
return
|
|
#³ðºÞ¶ÔÏóÀàÐÍ, ³ðºÞ¶ÔÏóID
|
curNPCAngryType = curAngry.GetObjType()
|
curNPCAngryID = curAngry.GetObjID()
|
|
#npc¹¥»÷Âß¼
|
if not __NPCFight(curNPC, curNPCAngryID, curNPCAngryType, tick):
|
return
|
|
#¼Ç¼NPC¹¥»÷´ÎÊý, ²¢·ÖÁÑ
|
__SetAccumulativeAtkCount(curNPC, tick)
|
return
|
|
|
## ¼Ç¼NPC¹¥»÷´ÎÊý, ²¢·ÖÁÑ
|
# @param curNPC: NPCʵÀý
|
# @return:
|
def __SetAccumulativeAtkCount(curNPC, tick):
|
|
#¼Ç¼¹¥»÷´ÎÊý
|
curNPC.SetDict(Def_AtkCount, curNPC.GetDictByKey(Def_AtkCount) + 1)
|
|
atkCount = curNPC.GetDictByKey(Def_AtkCount)
|
if atkCount < Def_MaxAtkCountSplit:
|
#δ´ïµ½¹¥»÷´ÎÊý, ÎÞ·¨·ÖÁÑ
|
return
|
|
curSkill = GameWorld.GetGameData().GetSkillBySkillID(Def_SplitSkillID)
|
if curSkill == None:
|
return
|
|
#Ê©·Å·ÖÁѼ¼ÄÜ, ·ÖÁÑ×Ô¼º
|
curSummonNPCOwner = NPCCommon.GetSummonOwnerDetel(curNPC)
|
if not curSummonNPCOwner:
|
return
|
|
SkillShell.NPCUseSkill(curSummonNPCOwner, curSkill, tick)
|
|
#ÖØÖù¥»÷´ÎÊý
|
curNPC.SetDict(Def_AtkCount, 0)
|
return
|
|
#---------------------------------------------------------------------
|
## npc¹¥»÷Âß¼
|
# @param curNPC µ±Ç°npc
|
# @param tagID curNPCAngryID
|
# @param tagType curNPCAngryType
|
# @param tick µ±Ç°Ê±¼ä
|
# @return ¹¥»÷ÊÇ·ñ³É¹¦
|
def __NPCFight(curNPC, tagID, tagType, tick):
|
#ÉèÖýøÈëÕ½¶·×´Ì¬
|
NPCCommon.SetNPCInBattleState(curNPC)
|
npcControl = NPCCommon.NPCControl(curNPC)
|
|
#ÊÇ·ñÔÚÒÆ¶¯·¶Î§ÄÚ
|
if not npcControl.IsInRefreshArea():
|
#×·»÷·µ»Ø
|
npcControl.MoveBack()
|
return False
|
|
#¿ªÊ¼¹¥»÷
|
curTag = GameWorld.GetObj(tagID, tagType)
|
if curTag == None or GameObj.GetHP(curTag) <= 0:
|
return False
|
|
tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY())
|
|
#---ÓÅÏÈÊͷż¼ÄÜ---
|
if AICommon.DoAutoUseSkill(curNPC, curTag, tagDist, tick):
|
return True
|
|
#---ÊÍ·ÅÆÕͨ¹¥»÷---
|
|
#³¬¹ý¹¥»÷¾àÀë,ÒÆ¶¯¹ýÈ¥
|
if tagDist > curNPC.GetAtkDist():
|
npcControl.MoveToObj_Detel(curTag)
|
return False
|
|
if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval():
|
#¹¥»÷¼ä¸ôûÓе½, ·µ»Ø
|
return False
|
|
if npcControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()):
|
#ÐÞÕýÕâ¸öNPCµÄÕ¾Á¢Î»ÖÃ
|
return False
|
|
#ÆÕͨ¹¥»÷
|
return BaseAttack.Attack(curNPC, curTag, None, tick)
|
|