#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package NPCAI.AIType_20 # # @todo:ÖúÕ½»úÆ÷ÈË # @author hxp # @date 2018-11-24 # @version 1.0 # # ÏêϸÃèÊö: ÖúÕ½»úÆ÷ÈË # Íæ¼ÒÕýÔÚ¹¥»÷µÄÄ¿±ê£¨±äÏà¸úËæÍæ¼Ò£©, Íæ¼ÒÎÞ¹¥»÷Ä¿±êʱ£¬»úÆ÷È˹¥»÷×ÔÉíÊÓÒ°Öпɹ¥»÷Ä¿±ê # Èç¹û¶¼Ã»ÓÐÄ¿±ê£¬¸úËæÍæ¼Ò # Íæ¼ÒµôÏߣ¬»úÆ÷È˲»ÔÙ¹¥»÷ # ÖúÕ½»úÆ÷ÈËÓÀÔ¶²»ËÀ£¬ÑªÁ¿µÍÓÚ50%×Ô¶¯»ØÑª£¬ºó¶Ë×Ô¶¨ #------------------------------------------------------------------------------- #"""Version = 2018-11-24 22:30""" #------------------------------------------------------------------------------- import NPCCommon import ChConfig import GameWorld import GameObj import BaseAttack import FBCommon import AICommon import GameMap import random ## ³õʼ»¯ # @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): curHP = GameObj.GetHP(curNPC) protectHP = GameObj.GetMaxHP(curNPC) / 2 # ±£Ö¤ÑªÁ¿²»µÍÓÚÒ»°ë if curHP <= protectHP: GameObj.SetHP(curNPC, curHP + random.randint(protectHP / 3, protectHP)) GameWorld.DebugLog("»úÆ÷ÈË»ØÑª!objID=%s" % curNPC.GetID()) fbPlayer = FBCommon.GetCurSingleFBPlayer() if not fbPlayer: # ¸±±¾ÖÐûÓÐÍæ¼ÒÔò²»´¦Àí GameWorld.DebugLog("¸±±¾ÖÐûÓÐÍæ¼ÒÔò²»´¦Àí!objID=%s" % curNPC.GetID()) return curTag = None playerAtkObjID = fbPlayer.GetDictByKey(ChConfig.Def_PlayerKey_LastHurtNPCObjID) if playerAtkObjID: curTag = GameWorld.FindNPCByID(playerAtkObjID) npcControl = NPCCommon.NPCControl(curNPC) npcControl.RefreshBuffState(tick) # ûÓÐÍæ¼ÒÕýÔÚ¹¥»÷µÄÄ¿±êÔòÈ¡×ÔÉíµÄ³ðºÞÁбí if not curTag: #GameWorld.DebugLog("ûÓÐÍæ¼ÒÕýÔÚ¹¥»÷µÄÄ¿±ê£¬Ë¢ÐÂ×ÔÉí³ðºÞÄ¿±ê!objID=%s,maxHP=%s" % (curNPC.GetID(), GameObj.GetMaxHP(curNPC))) npcControl.RefreshAngryList(tick) curNPCAngry = npcControl.GetMaxAngryTag() if curNPCAngry: curNPCAngryType = curNPCAngry.GetObjType() curNPCAngryID = curNPCAngry.GetObjID() curTag = GameWorld.GetObj(curNPCAngryID, curNPCAngryType) # ûÓй¥»÷Ä¿±êÔò¸úËæÍæ¼Ò if not curTag: #GameWorld.DebugLog("ûÓй¥»÷Ä¿±ê£¬¸úËæÍæ¼Ò£¡objID=%s" % curNPC.GetID()) dist = GameWorld.GetDist(fbPlayer.GetPosX(), fbPlayer.GetPosY(), curNPC.GetPosX(), curNPC.GetPosY()) if dist > 12: resultPos = GameMap.GetEmptyPlaceInArea(fbPlayer.GetPosX(), fbPlayer.GetPosY(), 3) curNPC.ResetPos(resultPos.GetPosX(), resultPos.GetPosY()) elif dist > 3: npcControl.MoveToObj_Detel(fbPlayer, 3) return __NPCFight(npcControl, curNPC, curTag, tick) return def __NPCFight(npcControl, curNPC, curTag, tick): #ÉèÖýøÈëÕ½¶·×´Ì¬ NPCCommon.SetNPCInBattleState(curNPC) #¿ªÊ¼¹¥»÷ if curTag == None or GameObj.GetHP(curTag) <= 0: return tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY()) GameWorld.DebugLog(" ÓëÄ¿±ê¾àÀë: %s" % tagDist) # if tagDist > 20: # resultPos = GameMap.GetEmptyPlaceInArea(curTag.GetPosX(), curTag.GetPosY(), 3) # curNPC.ResetPos(resultPos.GetPosX(), resultPos.GetPosY()) # tagDist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(), curTag.GetPosX(), curTag.GetPosY()) delayTick = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkDelayTick) if delayTick: startAtkTick = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_AtkStartTick) if not startAtkTick: curNPC.SetDict(ChConfig.Def_NPC_Dict_AtkStartTick, tick) startAtkTick = tick if tick - startAtkTick < delayTick: GameWorld.DebugLog("δµ½¹¥»÷ʱ¼ä£¬Ôݲ»´¦Àí£¡objID=%s" % curNPC.GetID()) return #---ÓÅÏÈÊͷż¼ÄÜ--- if AICommon.DoAutoUseSkill(curNPC, curTag, tagDist, tick): return #---ÊÍ·ÅÆÕͨ¹¥»÷--- #³¬¹ý¹¥»÷¾àÀë,ÒÆ¶¯¹ýÈ¥ if tagDist > curNPC.GetAtkDist(): npcControl.MoveToObj_Detel(curTag) return if tick - curNPC.GetAttackTick() < curNPC.GetAtkInterval(): #¹¥»÷¼ä¸ôûÓе½, ·µ»Ø return if npcControl.FixTagPos(curTag.GetPosX(), curTag.GetPosY()): #ÐÞÕýÕâ¸öNPCµÄÕ¾Á¢Î»Öà return #ÆÕͨ¹¥»÷ BaseAttack.Attack(curNPC, curTag, None, tick) return def OnCheckCanDie(atkObj, curNPC, skill, tick): ## ¼ì²éNPCÊÇ·ñ¿ÉËÀÍö GameObj.SetHP(curNPC, GameObj.GetMaxHP(curNPC) / 2) # »ØÒ»°ëѪ GameWorld.ErrLog("¸ÃNPC²»¿ÉÒÔËÀÍö£¡npcID=%s,curHP=%s" % (curNPC.GetNPCID(), GameObj.GetHP(curNPC))) return False