#!/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 = GameObj.GetHP(rolePet) maxHP = GameObj.GetMaxHP(rolePet) 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