#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package TurnAttack # # @todo:»ØºÏÖÆ¹¥»÷Âß¼­ # @author hxp # @date 2023-11-30 # @version 1.0 # # ÏêϸÃèÊö: »ØºÏÖÆ¹¥»÷Âß¼­£¬¾ùʹÓÃNPCʵÀý×÷Ϊս¶·Ö÷Ìå # #------------------------------------------------------------------------------- #"""Version = 2023-11-30 15:30""" #------------------------------------------------------------------------------- import ChConfig import AICommon import BaseAttack import PlayerState import IpyGameDataPY import IPY_GameWorld import ChPyNetSendPack import PlayerViewCacheTube import NetPackCommon import PlayerControl import SkillCommon import NPCCommon import GameWorld import GameObj import PetControl import SkillShell import BuffSkill import FBCommon import ItemControler import PassiveBuffEffMng # »ØºÏÕ½¶·Á÷³Ì״̬ ( FightState_Start, # 0 Æðʼ״̬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±í¿ªÊ¼ÁË£¬ÓëOver¶ÔÓ¦ FightState_PrepareOK, # 1 ×¼±¸Íê±Ï£¬°üº¬¶ÔÕ½NPCÕÙ»½OK¡¢ÆäËûµÈ FightState_Fighting, # 2 Õ½¶·ÖÐ FightState_FightEnd, # 3 Õ½¶·½áÊø FightState_Award, # 4 ½áËã½±Àø FightState_Over, # 5 ½áÊø×´Ì¬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±íËùÓд¦Àí½áÊøÁË£¬ÓëStart¶ÔÓ¦ ) = range(6) # »ØºÏÕ½¶·¸´»îÀàÐÍ ( RebornType_PetSkill, RebornType_ElfSkill, ) = range(1, 1 + 2) def GetObjName(gameObj): objName = gameObj.GetName() faction = GameObj.GetFaction(gameObj) fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum) curID = gameObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) if not curID and gameObj.GetGameObjType() == IPY_GameWorld.gotNPC: curID = gameObj.GetNPCID() return "%s%s %s[%s-%s]" % ("A" if faction == 1 else "B", fightPlaceNum, objName, gameObj.GetID(), curID) #// B4 10 »ØºÏÖÆÕ½¶· #tagCMTurnFight # #struct tagCMTurnFight #{ # tagHead Head; # DWORD MapID; // ×Ô¶¨ÒåµØÍ¼ID£¬¿ÉÓÃÓÚ°ó¶¨Õ½¶·³¡¾°¹¦ÄÜ£¨ÈçÒ°Íâ¹Ø¿¨£¬ÅÀËþ¹¦ÄÜ£¬¾º¼¼³¡µÈ£© # WORD FuncLineID; # DWORD PlayerID; // ¶ÔÓ¦Íæ¼ÒID£¬¿ÉΪ0£¬Ä³Ð©¹¦ÄÜ¿ÉÄÜÓÐÓã¬È羺¼¼³¡ #}; def OnTurnFight(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) mapID = clientData.MapID funcLineID = clientData.FuncLineID tagPlayerID = clientData.PlayerID if curPlayer.GetSightLevel() != curPlayer.GetID(): PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Start) if tagPlayerID: PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagPlayerID, DoTrunFightVSPlayer, [mapID, funcLineID], True) return DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick) SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) return def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, PropDict): mapID, funcLineID = callData if PropDict and curPlayer.GetPlayerID() != tagPlayerID: tick = GameWorld.GetGameWorld().GetTick() DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick) SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) return def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick): playerID = curPlayer.GetPlayerID() factionInfoA = GetPlayerFactionInfoByCache(playerID) ipyData = None if tagPlayerID: factionInfoB = GetPlayerFactionInfoByCache(tagPlayerID) else: ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID) if not ipyData: return npcID = ipyData.GetNPCID() if not npcID: return petNPCIDList = ipyData.GetPetNPCIDList() petCacheInfo = [] # ´ÓÅä±íÖжÁÈ¡×éºÏ£¬¼¼ÄÜĬÈÏÈ¡NPC±íÅäÖÃµÄ for state, petNPCID in enumerate(petNPCIDList, 1): petCacheInfo.append({"npcID":petNPCID, "state":state, "quality":0}) skillIDExList = [] # NPCΪ¸½¼Ó¼¼ÄÜ£¬ÒòΪNPC±í±¾Éí¿ÉÄÜÓÐÅäÖü¼ÄÜ skillIDExList.extend(ipyData.GetElfSkillIDList()) skillIDExList.extend(ipyData.GetSTSkillIDList()) factionInfoB = {"npcID":npcID, "pet":petCacheInfo, "skillIDExList":skillIDExList} ret = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer) if not ret: return isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = ret # ½áËã½±Àø...´ýÀ©Õ¹ awardItemList = [] if isWin and ipyData: # ɽկ²âÊÔÏÈĬÈ϶¼ÊÇÊ״ν±Àø£¬ÕýʽºóÐèɾ³ý awardItemList = ipyData.GetAwardItemListFirst() GameWorld.DebugLog("½±ÀøÎïÆ·: %s" % awardItemList) ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}]) overMsg = {"isWin":isWin, "itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)} playbackID and overMsg.update({"playbackID":playbackID}) SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Award, turnNum, turnMax, overMsg) return def GetPlayerFactionInfoByCache(playerID): ## ¸ù¾ÝÍæ¼Ò»º´æÊý¾Ý»ñÈ¡¶ÔÕóÍæ¼ÒÕóÓªÐÅÏ¢×Öµä _, PlusDict = PlayerViewCacheTube.GetPlayerPropPlusDictByID(playerID, True) # ´Ó»º´æÖлñÈ¡£¬Ç¿Ë¢Ò»´Î×îÐÂÊôÐÔ skillIDList = [] SkillInfo = PlusDict.get("SkillInfo", {}) for _, skillLVDict in SkillInfo.items(): for skillID, _ in skillLVDict.items(): skillID = GameWorld.ToIntDef(skillID) skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID) if not skillData: continue skillIDList.append(skillID) return {"playerID":playerID, "pet":PlusDict.get("Pet"), "skillIDList":skillIDList} def ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False): ''' ´¦Àí×Ô¶¯»ØºÏÕ½¶·¹ý³Ì£¬½ö×öÕ½¶·Á÷³Ì´¦Àí£¬²»×ö¼°ÆäËû¹¦ÄÜÂß¼­ @param mapID: ¿ÉÊÓΪ¹¦ÄÜID @param funcLineID: ¶Ô¹¦ÄÜIDµÄÀ©Õ¹ @param factionInfoA: A·½ÕóÓªÐÅÏ¢£¬playerID ºÍ npcID ¶þѡһ {"playerID":Ö÷ÌåÍæ¼Ò¾µÏñID, "npcID":Ö÷ÌåNPCID, "pet":[{³öÕ½Áé³èÐÅÏ¢¼æÈÝÍæ¼Ò»º´æµÄÁé³èÐÅÏ¢k:v, ...}, ...]} @param factionInfoB: B·½ÕóÓªÐÅÏ¢ @param syncPlayer: ÐèҪ֪ͨµÄÍæ¼Ò£¬¿ÉÄÜΪNone£¬×¢Òâ½ö×ö֪ͨÓ㬸ÃÍæ¼Ò¿ÉÄܺÍABÕóÓªÎÞÈκιØÏµ @param isSavePlayback: ÊÇ·ñ±£´æÕ½¶·»Ø·Å @return: None-ÎÞ½á¹û£»»ò (isWin, turnNum, turnMax, factionTotalHurtDict) isWin: ÊÇ·ñ»ñʤ turnNum: ´òÁ˼¸»ØºÏ factionTotalHurtDict: Ë«·½ÉËѪͳ¼Æ ''' if syncPlayer: syncPlayer.SetCanAttack(False) # ¸ÃÍæ¼ÒÉèÖÃΪ²»¿É±»¹¥»÷ playerID = syncPlayer.GetPlayerID() sightLevel, posX, posY = playerID, syncPlayer.GetPosX(), syncPlayer.GetPosY() else: playerID = 0 sightLevel, posX, posY = 99, 192, 109 # ϵͳĬÈÏ´¦ÀíµÄ²ã¼¶¼°×ø±ê factionA, factionB, mainRolePlace = 1, 2, 1 objRetA = __SummonFactionObjs(factionA, mainRolePlace, factionInfoA, sightLevel, posX, posY) objRetB = __SummonFactionObjs(factionB, mainRolePlace, factionInfoB, sightLevel, posX, posY) objA, petObjListA, factionSyncInfoA = objRetA if objRetA else (None, []) objB, petObjListB, factionSyncInfoB = objRetB if objRetB else (None, []) if not objA or not objB: return playerIDA = objA.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # ¿ÉÄÜΪ0£¬·ÇÍæ¼Ò¾µÏñʱΪ0 playerIDB = objB.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # ¿ÉÄÜΪ0£¬·ÇÍæ¼Ò¾µÏñʱΪ0 objNameA = GetObjName(objA) objNameB = GetObjName(objB) GameWorld.DebugLog("===== Ö´ÐлغÏÖÆÕ½¶·: %s VS %s =====" % (objNameA, objNameB)) turnMax = IpyGameDataPY.GetFuncCfg("TurnFight", 1) # ³èÎïÏȹ¥»÷ factionListA = petObjListA + [objA] factionListB = petObjListB + [objB] atkFactionList = [factionListA, factionListB] # ÉèÖÃÕ½¶·Ö÷Ìå objA.SetDict(ChConfig.Def_Obj_Dict_TurnEnemyID, objB.GetID()) objB.SetDict(ChConfig.Def_Obj_Dict_TurnEnemyID, objA.GetID()) # Õ½¶·Ç°³õʼ»¯£¬¿ÉÄÜ»á¸Ä±ä¹¥ËÙ£¬ËùÒÔÏȳõʼ»¯ for factionObjList in atkFactionList: for gameObj in factionObjList: TurnFightObjStartInit(playerID, gameObj, tick) #Ò»¸ö»ØºÏ¹¥»÷˳Ðò£¬ÎªÁ˺óÐøÂß¼­Í³Ò»£¬¶¼ÊÇÏÈÈ·¶¨ºÃ˳Ðò sortType = 2 # ¹¥»÷˳ÐòÅÅÐò·½Ê½ fightObjList = [] #·½Ê½1£º ´¿Óɹ¥»÷ËٶȾö¶¨£¬¹¥ËÙÏàͬÏÂÕóÓª1Ïȹ¥»÷£¬»¹ÏàͬÔòÓÉID¾ö¶¨ if sortType == 1: fightObjList = factionListA + factionListB fightObjList.sort(key=lambda o: (GameObj.GetAtkSpeed(o), (10 - GameObj.GetFaction(o)), o.GetID()), reverse=True) #·½Ê½2£º¸ù¾ÝÕóÓªÖ÷½Ç¹¥ËÙ¾ö¶¨ÏÈÊÖ£¬È»ºóÿ¸öÕóÓªÂÖÁ÷¹Ì¶¨Î»Öù¥»÷ elif sortType == 2: if GameObj.GetAtkSpeed(objA) < GameObj.GetAtkSpeed(objB): atkFactionList = [factionListB, factionListA] for i in range(len(factionListA)): for factionObjList in atkFactionList: fightObjList.append(factionObjList[i]) SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) isWin = None for turnNum in range(1, turnMax + 1): GameWorld.DebugLog("¡¾----- »ØºÏÖÆÕ½¶·ÂÖ´Î: %s -----¡¿" % turnNum) SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_Fighting, turnNum, turnMax) # »ØºÏ¿ªÊ¼: ×öһЩÿ»ØºÏÖØÖÃÂß¼­»òÕßijЩ¸ù¾Ý»ØºÏ´¥·¢µÄЧ¹ûµÈ for gameObj in fightObjList: if not gameObj: continue faction = GameObj.GetFaction(gameObj) tagGameObj = objB if faction == 1 else objA TurnFightObjPerTurnStart(gameObj, tagGameObj, turnNum, tick) isWin = CheckIswin(objA, objB) if isWin != None: break # »ØºÏÕ½¶·£º ÂÖÁ÷ÒÀ´Î¹¥»÷ for actionNum, gameObj in enumerate(fightObjList, 1): if not gameObj: # ûÓжÔÏó¿ÉÊÓΪûÓиýڵã continue for obj in fightObjList: TurnFightObjPerTurnActionnum(turnNum, actionNum, obj, tick) objType = gameObj.GetGameObjType() objID = gameObj.GetID() SyncTurnFightObjAction(syncPlayer, turnNum, objType, objID) if GameObj.GetHP(gameObj) <= 0: # ¸´»îʱ»úÔÚ×Ô¼ºÐж¯½Úµã if not DoReborn(gameObj): continue faction = GameObj.GetFaction(gameObj) objName = GetObjName(gameObj) curHP = GameObj.GetHP(gameObj) tagGameObj = objB if faction == 1 else objA tagObjType = tagGameObj.GetGameObjType() tagObjID = tagGameObj.GetID() tagHP = GameObj.GetHP(tagGameObj) GameWorld.DebugLog("¡ï»ØºÏ%s.%s %s Ðж¯ : objType-ID-HP(%s-%s-%s),curAtk=%s, tagType-ID-HP(%s-%s-%s)" % (turnNum, actionNum, objName, objType, objID, curHP, gameObj.GetMaxAtk(), tagObjType, tagObjID, tagHP)) if not DoAttack(gameObj, tagGameObj, tick, checkUseXP=True): continue isWin = CheckIswin(objA, objB) if isWin != None: break if isWin != None: break GameWorld.DebugLog("--- Õ½¶·½áÊø´¦Àí --- isWin=%s" % isWin) isWin = 1 if isWin else 0 # ͳ¼Æ×ÜÉ˺¦ factionTotalHurtDict = {} for gameObj in fightObjList: if not gameObj: continue faction = GameObj.GetFaction(gameObj) objName = GetObjName(gameObj) objID = gameObj.GetID() totalHurtEx = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue totalHurt = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx factionTotalHurtDict[faction] = factionTotalHurtDict.get(faction, 0) + totalHurt GameWorld.DebugLog("%s objID=%s,faction=%s, ×ÜÊä³ö: %s" % (objName, objID, faction, totalHurt)) for faction, totalHurt in factionTotalHurtDict.items(): GameWorld.DebugLog("faction=%s, ÕóÓª×ÜÊä³ö: %s" % (faction, totalHurt)) GameWorld.DebugLog("AÊ£ÓàѪÁ¿: %s / %s" % (GameObj.GetHP(objA), GameObj.GetMaxHP(objA))) GameWorld.DebugLog("BÊ£ÓàѪÁ¿: %s / %s" % (GameObj.GetHP(objB), GameObj.GetMaxHP(objB))) SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_FightEnd, turnNum, turnMax) for gameObj in fightObjList: TurnFightObjOverReset(gameObj, tick) playbackID = 0 # Õ½¶·»Ø·ÅID£¬¿É¸ù¾Ý¸ÃID²é¿´»Ø·Å #playbackInfo = "" # Õ½¶·»Ø·ÅÐÅÏ¢ if isSavePlayback: pass GameWorld.DebugLog("===== »ØºÏÖÆÕ½¶·½áÊø: mapID=%s,funcLineID=%s,playerIDA=%s,playerIDB=%s,isWin=%s" % (mapID, funcLineID, playerIDA, playerIDB, isWin)) return isWin, turnNum, turnMax, factionTotalHurtDict, playbackID def __SummonFactionObjs(faction, mainRolePlace, objInfo, sightLevel, posX, posY): '''ÕÙ»½ÕóÓªÕ½¶·ÊµÀý @param faction: ËùÊôÕóÓª£¬Ä¿Ç°Ö§³ÖÁ½¸öÕóÓª£¬1»ò2 @param mainRolePlace: Õ½¶·Ö÷ÌåÔÚ¸ÃÕóÓªÉÏÕóλÖã¬1V1ʱĬÈÏ1£¬¶à¶Ô¶àʱ£¬´ú±íËùÔÚÕóӪλÖà @param objInfo: ¸ÃÕ½¶·Ö÷Ìå³öÕ½ÐÅÏ¢ ''' factionSyncInfo = {} # ͬ²½Ç°¶ËµÄÕóÓªÐÅÏ¢£¬°üº¬Ö÷ID¡¢Áé³è¡¢ÆäËûÁéͨµÈ playerID = objInfo.get("playerID") npcID = objInfo.get("npcID") skillIDList = objInfo.get("skillIDList") # ¼¼ÄÜIDÁбí skillIDExList = objInfo.get("skillIDExList") # ¸½¼Ó¼¼ÄÜIDÁбí if playerID: npcID = ChConfig.Def_NPCID_PVP mainObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=sightLevel, mirrorPlayerID=playerID, skillIDList=skillIDList, skillIDExList=skillIDExList) factionSyncInfo["playerID"] = playerID elif npcID: mainObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=sightLevel, skillIDList=skillIDList, skillIDExList=skillIDExList) factionSyncInfo["npcID"] = npcID else: return if not mainObj: return GameObj.SetFaction(mainObj, faction) mainObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightMainRolePlace, mainRolePlace) petObjList = PetControl.CalloutFightPet(mainObj, objInfo.get("pet")) petObjIDList = [] for petObj in petObjList: if petObj: petObjIDList.append(petObj.GetID()) factionSyncInfo.update({"objID":mainObj.GetID(), "petObjIDList":petObjIDList}) return mainObj, petObjList, factionSyncInfo def CheckIswin(curPlayer, tagObj): ## ¼ì²éÊÇ·ñ½áÊø # @return: None-δ½áÊø£»True-»ñʤ£»False-ʧ°Ü playerDead = GameObj.GetHP(curPlayer) <= 0 and GetRebornTypeInfo(curPlayer) == None tagObjDead = (not tagObj or GameObj.GetHP(tagObj) <= 0) and GetRebornTypeInfo(tagObj) == None if not playerDead and not tagObjDead: return isWin = None if playerDead and tagObjDead: isWin = False # ƽ¾ÖËãʧ°Ü GameWorld.DebugLog(" Ë«·½±»»÷ɱ£¬Æ½¾ÖËãʧ°Ü: isWin=%s" % isWin) elif playerDead: isWin = False GameWorld.DebugLog(" Íæ¼Ò±»»÷ɱ£¬Ê§°Ü: isWin=%s" % isWin) elif tagObjDead: isWin = True # ʤÀû GameWorld.DebugLog(" ¶ÔÊÖ±»»÷ɱ£¬Ê¤Àû: isWin=%s" % isWin) return isWin def SetKilled(gameObj, killer=None): if not gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightMainRolePlace): #GameWorld.DebugLog("·Ç»ØºÏÕ½¶·Ö÷Ìå±»»÷ɱ: curID=%s" % gameObj.GetID()) return GameWorld.DebugLog(" %s »ØºÏÕ½¶·Ö÷Ìå±»»÷ɱ: curID=%s" % (GetObjName(gameObj), gameObj.GetID())) GameObj.SetHP(gameObj, 0) playerID = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightID) if not playerID: return curPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(playerID) if not curPlayer: return # ֪ͨǰ¶Ë clientPack = ChPyNetSendPack.tagMCTurnFightObjDead() clientPack.ObjID = gameObj.GetID() clientPack.ObjType = gameObj.GetGameObjType() NetPackCommon.SendFakePack(curPlayer, clientPack) return True def GetEnemyObj(gameObj): ## »ñÈ¡»ØºÏ¶ÔÊÖʵÀý tagID = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnEnemyID) if not tagID: return return GameWorld.FindNPCByID(tagID) def GetEnemyCureDefPer(gameObj): ## »ñÈ¡µÐ¶Ô·½Èõ»¯ÖÎÁÆÖµ tagObj = GetEnemyObj(gameObj) if not tagObj: return 0 cureDefPer = GameObj.GetCureDefPer(tagObj) #ÆäËûµÄ... return cureDefPer def GetRebornTypeInfo(gameObj): ''' »ñÈ¡¿É¸´»îµÄ·½Ê½ÐÅÏ¢ @return: None-´ú±í²»¿É¸´»î ''' if not gameObj: return if not gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightMainRolePlace): # ½öÖ÷Ìå¿É¸´»î return rebornCountMax = 1 curRebornCount = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnRebornCount) if curRebornCount >= rebornCountMax: GameWorld.DebugLog("%s ÒѾ­³¬¹ý¸´»î´ÎÊý£¬²»ÄÜÔÙ¸´»î! curID=%s,curRebornCount=%s" % (GetObjName(gameObj), gameObj.GetID(), curRebornCount)) return # ×Ô¼º¼¼ÄÜ - È羫¹Ö skillManager = gameObj.GetSkillManager() for skillIndex in range(skillManager.GetSkillCount()): skill = skillManager.GetSkillByIndex(skillIndex) if skill.GetSkillType() != ChConfig.Def_SkillType_Revive: continue if skill.GetRemainTime(): continue if skill.GetFuncType() == ChConfig.Def_SkillFuncType_ElfSkill: return RebornType_ElfSkill, skill # ¼ì²éÊÇ·ñÓÐÁé³è¸´»î¼¼ÄÜ for index in range(gameObj.GetSummonCount()): curSummonNPC = gameObj.GetSummonNPCAt(index) if not curSummonNPC: continue if not PetControl.IsPetNPC(curSummonNPC): continue skillManager = curSummonNPC.GetSkillManager() for skillIndex in range(skillManager.GetSkillCount()): skill = skillManager.GetSkillByIndex(skillIndex) if skill.GetSkillType() != ChConfig.Def_SkillType_Revive: continue if not skill.GetRemainTime(): return RebornType_PetSkill, curSummonNPC, skill # ¼ì²éÆäËû¹¦Äܸ´»î£¬´ýÀ©Õ¹... #GameWorld.DebugLog(" ûÓпÉÒÔ¸´»îµÄ·½Ê½!") return def DoReborn(gameObj, hpPer=ChConfig.Def_MaxRateValue): ## Ö´Ðи´»î rebornTypeInfo = GetRebornTypeInfo(gameObj) if rebornTypeInfo == None: return objName = GetObjName(gameObj) objID = gameObj.GetID() objType = gameObj.GetGameObjType() rebornType = rebornTypeInfo[0] rebornValue1, rebornValue2 = 0, 0 if rebornType == RebornType_PetSkill: petNPC, skill = rebornTypeInfo[1:] skill.SetRemainTime(skill.GetCoolDownTime()) hpPer = skill.GetEffect(0).GetEffectValue(0) rebornValue1 = petNPC.GetID() rebornValue2 = skill.GetSkillID() elif rebornType == RebornType_ElfSkill: skill = rebornTypeInfo[1] skill.SetRemainTime(skill.GetCoolDownTime()) hpPer = skill.GetEffect(0).GetEffectValue(0) rebornValue1 = skill.GetSkillID() rebornCount = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnRebornCount) + 1 gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnRebornCount, rebornCount) setHP = int(GameObj.GetMaxHP(gameObj) * hpPer / float(ChConfig.Def_MaxRateValue)) GameObj.SetHP(gameObj, setHP) if objType == IPY_GameWorld.gotPlayer: gameObj.ChangeAction(IPY_GameWorld.paNull) else: gameObj.ChangeAction(IPY_GameWorld.laNPCNull) curHP = GameObj.GetHP(gameObj) GameWorld.DebugLog("¸´»î %s: rebornType=%s,objID=%s,hpPer=%s,curHP=%s,rebornCount=%s,rebornValue1=%s,rebornValue2=%s" % (objName, rebornType, objID, hpPer, curHP, rebornCount, rebornValue1, rebornValue2)) playerID = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightID) if not playerID: return curPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(playerID) if not curPlayer: return # ֪ͨǰ¶Ë clientPack = ChPyNetSendPack.tagMCTurnFightObjReborn() clientPack.ObjID = gameObj.GetID() clientPack.ObjType = gameObj.GetGameObjType() clientPack.HP = curHP % ChConfig.Def_PerPointValue clientPack.HPEx = curHP / ChConfig.Def_PerPointValue clientPack.RebornType = rebornType clientPack.RebornValue1 = rebornValue1 clientPack.RebornValue2 = rebornValue2 NetPackCommon.SendFakePack(curPlayer, clientPack) return True def GetTurnNum(timeline): return timeline / 100 def SetTimeline(gameObj, turnNum, actionNum): '''ÉèÖûغÏÖÆÕ½¶·ËùÔÚʱ¼ä½Úµã @param turnNum: µÚ¼¸»ØºÏ£¬Èç¹ûÔڻغÏÖÆÕ½¶·ÖУ¬Ôò»ØºÏÊýÒ»¶¨´óÓÚ0, @param actionNum: µÚ¼¸¸öÐж¯½Úµã£¬Ã¿»ØºÏµÄÐж¯½Úµã»áÖØÖã¬Ò²¾ÍÊÇ˵Ðж¯½Úµã0¿ÉÊÓΪÿ»ØºÏµÄÆðʼ½Úµã£¬1λµÚÒ»¸öÐж¯Ä¿±ê½Úµã£¬ÒÔ´ËÀàÍÆ ''' gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightTimeline, turnNum * 100 + actionNum) return def TurnFightObjStartInit(playerID, gameObj, tick): ## »ØºÏÖÆÕ½¶·ÊµÀý³õʼ»¯ if not gameObj: return mainRolePlace = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightMainRolePlace) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightID, playerID) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnRebornCount, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, 0) SetTimeline(gameObj, 1, 0) faction = GameObj.GetFaction(gameObj) GameObj.SetHPFull(gameObj, True) gameObj.RefreshView() objType = gameObj.GetGameObjType() npcID = gameObj.GetNPCID() if objType == IPY_GameWorld.gotNPC else 0 objName = GetObjName(gameObj) fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum) GameWorld.DebugLog("¡¾ %s ³õʼ»¯ %s ¡¿ objID=%s,npcID=%s,atkSpeed=%s,faction=%s,mainRolePlace=%s" % (objName, BaseAttack.GetObjAttackName(gameObj), gameObj.GetID(), npcID, GameObj.GetAtkSpeed(gameObj), faction, mainRolePlace)) haveXPSkill = False # ÖØÖü¼ÄÜCD¡¢Õ½¶·buff if objType == IPY_GameWorld.gotPlayer: skillManager = gameObj.GetSkillManager() for i in range(skillManager.GetSkillCount()): curSkill = skillManager.GetSkillByIndex(i) curSkill.SetRemainTime(0) elif objType == IPY_GameWorld.gotNPC: skillIDList = [] skillManager = gameObj.GetSkillManager() for i in range(skillManager.GetSkillCount()): curSkill = skillManager.GetSkillByIndex(i) if not curSkill: continue if mainRolePlace and curSkill.GetXP(): haveXPSkill = True skillIDList.append(curSkill.GetSkillID()) if fightPlaceNum: if curSkill.GetSkillType() != ChConfig.Def_SkillType_Revive: # Áé³è¼¼ÄÜ¿ªÊ¼Ê±Ö±½Ó½øÈëCD curSkill.SetLastUseTick(tick) curSkill.SetRemainTime(curSkill.GetCoolDownTime()) GameWorld.DebugLog(" NPC¼¼ÄÜ: npcID=%s,skillIDList=%s" % (npcID, skillIDList)) if haveXPSkill: GameObj.SetMaxXP(gameObj, IpyGameDataPY.GetFuncCfg("TurnFightXP", 1)) GameObj.SetXP(gameObj, 0) # ½øÐÐÉèÖÃÒ»´Î֪ͨǰ¶Ë£¬ÊÓΪ¸æÖªÇ°¶Ë¸ÃʵÀýÓÐXP gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkAddXPCount, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnXPFullTimeline, 0) __logGameObjAttr(gameObj) return def __logGameObjAttr(gameObj): GameWorld.DebugLog(" HP=%s/%s,atk=%s~%s,Def=%s,atkSpeed=%s,XP=%s/%s" % (GameObj.GetHP(gameObj), GameObj.GetMaxHP(gameObj), gameObj.GetMinAtk(), gameObj.GetMaxAtk(), gameObj.GetDef(), GameObj.GetAtkSpeed(gameObj), GameObj.GetXP(gameObj), GameObj.GetMaxXP(gameObj))) GameWorld.DebugLog(" ÉÁ(%s,%s),±©(%s,%s),ÔÎ(%s,%s),Á¬(%s,%s),·´(%s,%s),Îü(%s,%s)" % (GameObj.GetMissRate(gameObj), GameObj.GetMissDefRate(gameObj), GameObj.GetSuperHitRate(gameObj), GameObj.GetSuperHitRateReduce(gameObj), GameObj.GetFaintRate(gameObj), GameObj.GetFaintDefRate(gameObj), GameObj.GetComboRate(gameObj), GameObj.GetComboDefRate(gameObj), GameObj.GetAtkBackRate(gameObj), GameObj.GetAtkBackDefRate(gameObj), GameObj.GetSuckHPPer(gameObj), GameObj.GetSuckHPDefPer(gameObj), )) return def TurnFightObjPerTurnStart(gameObj, tagObj, turnNum, tick): ## »ØºÏÖÆÕ½¶·ÊµÀý - ÿ»ØºÏ¿ªÊ¼Ê±´¦Àí if not gameObj: return SetTimeline(gameObj, turnNum, 0) # ÖØÖÃÁ¬»÷¡¢·´»÷Êý gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkAddXPCount, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnXPUseState, 0) gameObj.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, 0) # »÷ÔÎCD objType = gameObj.GetGameObjType() objID = gameObj.GetID() objName = GetObjName(gameObj) GameWorld.DebugLog("ObjPerTurnStart: »ØºÏ%s, %s objType-ID-HP(%s-%s-%s)" % (turnNum, objName, objType, objID, GameObj.GetHP(gameObj))) # ÿ»ØºÏ¿ªÊ¼¼õ¼¼ÄÜCD skillManager = gameObj.GetSkillManager() for i in range(skillManager.GetSkillCount()): skill = skillManager.GetSkillByIndex(i) remainTime = skill.GetRemainTime() if not remainTime: continue skillID = skill.GetSkillID() updRemainTime = max(0, remainTime - ChConfig.Def_PerTurnTick) skill.SetRemainTime(updRemainTime) GameWorld.DebugLog(" skillID=%s,remainTime=%s,updRemainTime=%s" % (skillID, remainTime, updRemainTime)) # ˢж¨Ê±´¦ÀíµÄbuffЧ¹û SkillShell.ProcessPersistBuff(gameObj, tick) PassiveBuffEffMng.OnPassiveSkillTrigger(gameObj, tagObj, None, ChConfig.TriggerType_TurnNum, tick) __logGameObjAttr(gameObj) return def TurnFightObjPerTurnActionnum(turnNum, actionNum, gameObj, tick): ## »ØºÏÖÆÕ½¶·ÊµÀý - ÿ¸öÐж¯½Úµã´¦Àí if not gameObj: return SetTimeline(gameObj, turnNum, actionNum) objType = gameObj.GetGameObjType() if objType == IPY_GameWorld.gotPlayer: #Ë¢ÐÂÍæ¼ÒBuffʱ³¤ gameObj.SetTickByType(ChConfig.TYPE_Player_Tick_Buff, 0) reFlashBuff = PlayerState.ProcessRefreshBuffState(gameObj, tick) #SkillShell.ProcessPersistBuff(gameObj, tick) # ¶¨Ê±´¦ÀíµÄÔÚÿ¸öʱ¼ä½ÚµãÓÐÐèÒªÔÙ¿ªÆô£¬Ä¿Ç°Ä¬ÈϻغϿªÊ¼´¦Àí attrBuffResult, actBuffResult = PlayerState.ProcessRefreshActionBuffState(gameObj, tick) playerControl = PlayerControl.PlayerControl(gameObj) if actBuffResult: playerControl.RefreshPlayerActionState() #´Ë´¦²ÅÊÇÕæÕýµÄË¢ÐÂÈËÎïÊôÐÔÖµ£¬ÐèË¢ÊôÐÔÂß¼­Ó¦ÔÚ´ËÐÐǰµ÷Óà if not playerControl.RefreshPlayerAttrStateEx(): if reFlashBuff or attrBuffResult: playerControl.RefreshPlayerAttrByBuff() # ֻˢBUFFÇé¿ö playerControl.RefreshPlayerAttrByBuffEx() elif objType == IPY_GameWorld.gotNPC: gameObj.SetTickByType(ChConfig.TYPE_NPC_Tick_Buff, 0) gameObj.SetTickByType(ChConfig.TYPE_NPC_Tick_Buff_Timely, 0) npcControl = NPCCommon.NPCControl(gameObj) npcControl.RefreshBuffState(tick) return def TurnFightObjOverReset(gameObj, tick): ## »ØºÏÖÆÕ½¶·ÊµÀý½áÊøÖØÖà if not gameObj: return objType = gameObj.GetGameObjType() #NPCÖ±½Ó»ØÊÕ if objType == IPY_GameWorld.gotNPC: RecycleObj(gameObj) return if objType != IPY_GameWorld.gotPlayer: return timeline = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline) isDelRefresh = ClearTurnFightBuff(gameObj, timeline, tick) SetTimeline(gameObj, 0, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) GameObj.SetFaction(gameObj, 0) GameObj.SetHPFull(gameObj) if isDelRefresh: playerControl = PlayerControl.PlayerControl(gameObj) playerControl.RefreshPlayerAttrByBuff() return def ClearTurnFightBuff(gameObj, timeLine, tick): ## Çå³ý»ØºÏÖÆÕ½¶·Ïà¹Øbuff isDelRefresh = False objType = gameObj.GetGameObjType() objID = gameObj.GetID() for buffType in range(IPY_GameWorld.bfBuff, IPY_GameWorld.btBufMax): if objType != IPY_GameWorld.gotPlayer and buffType in ChConfig.Def_BuffType_OnlyPlayer: continue buffTuple = SkillCommon.GetBuffManagerByBuffType(gameObj, buffType) if buffTuple == (): continue buffState = buffTuple[0] for i in range(0, buffState.GetBuffCount())[::-1]: curBuff = buffState.GetBuff(i) curSkill = curBuff.GetSkill() buffSkillID = curSkill.GetSkillID() if not buffSkillID: continue if curBuff.GetCalcStartTick() > timeLine: # »ØºÏÖÆÖвúÉúµÄbuffÊÇÒÔtimeline×÷ΪCalcStartTickµÄ£¬ËùÒÔ³¬¹ýtimelineµÄ¿ÉÊÓΪ·Ç»ØºÏÖÆbuff continue GameWorld.DebugLog(" ɾ³ý»ØºÏÖÆbuff: objID=%s,buffSkillID=%s" % (objID, buffSkillID)) ownerID, ownerType = curBuff.GetOwnerID(), curBuff.GetOwnerType() BuffSkill.DoBuffDisApper(gameObj, curBuff, tick) buffState.DeleteBuffByIndex(i) SkillShell.ClearBuffEffectBySkillID(gameObj, buffSkillID, ownerID, ownerType) #ɾ³ýδ֪BUFF£¬Ë¢ÐÂÊôÐÔ isDelRefresh = True return isDelRefresh def RecycleObj(gameObj): ## ÊͷŻغÏÖÆÕ½¶·¶ÔÏó #Áé³è¸úÕÙ»½ÊÞÓÉÖ÷ÈË»ØÊÕʱ´¥·¢»ØÊÕ£¬²»È»»áµ¼Ö±¨´í npcObjType = gameObj.GetGameNPCObjType() if npcObjType == IPY_GameWorld.gnotPet: #GameWorld.DebugLog("RecycleObj Áé³è²»»ØÊÕ objID=%s,npcObjType=%s,%s" % (gameObj.GetID(), npcObjType, gameObj.GetNPCID())) return if npcObjType == IPY_GameWorld.gnotSummon: curOwner = NPCCommon.GetSummonOwnerDetel(gameObj) if curOwner and curOwner.GetGameObjType() == IPY_GameWorld.gotNPC: #GameWorld.DebugLog("RecycleObj ÕÙ»½ÊÞÖ÷ÈËÊÇNPC²»»ØÊÕ objID=%s,npcObjType=%s,%s,ownerID=%s" % (gameObj.GetID(), npcObjType, gameObj.GetNPCID(), curOwner.GetID())) return #GameWorld.DebugLog("RecycleObj: objID=%s,npcObjType=%s,%s" % (gameObj.GetID(), npcObjType, gameObj.GetNPCID())) NPCCommon.SetDeadEx(gameObj) return def AddTurnObjHurtValue(curObj, tagObj, hurtType, hurtValue, lostHP, curSkill=None): if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline): return skillID = curSkill.GetSkillID() if curSkill else 0 totalHurtEx = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue totalHurt = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx + hurtValue curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, totalHurt % ChConfig.Def_PerPointValue) curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, totalHurt / ChConfig.Def_PerPointValue) GameWorld.DebugLog(" ÉËѪ: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,totalHurt=%s,tagHP=%s" % (curObj.GetID(), tagObj.GetID(), skillID, hurtType, hurtValue, totalHurt, GameObj.GetHP(tagObj))) if lostHP: AddTurnFightXP(tagObj, __GetAddXP_Defender(tagObj, lostHP), "skillID:%s" % skillID) AddTurnFightXP(curObj, __GetAddXP_Attack(curObj, curSkill), "skillID:%s" % skillID) return def __GetAddXP_Attack(attack, curSkill): ## ¹¥»÷·½Ôö¼ÓµÄXPÖµ¸ù¾ÝÖ÷¶¯¹¥»÷´ÎÊý»ñµÃ isAddXPSkill = not curSkill or curSkill.GetSkillType() == ChConfig.Def_SkillType_Atk if not isAddXPSkill: return 0 atkAddXPCount = attack.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkAddXPCount) addXPList = IpyGameDataPY.GetFuncEvalCfg("TurnFightXP", 2) if atkAddXPCount >= len(addXPList): return 0 attack.SetDict(ChConfig.Def_Obj_Dict_TurnAtkAddXPCount, atkAddXPCount + 1) return addXPList[atkAddXPCount] def __GetAddXP_Defender(defender, lostHP): ## µôѪ·½Ôö¼ÓµÄXPÖµ¸ù¾ÝµôѪ°Ù·Ö±È»ñµÃ maxXP = GameObj.GetMaxXP(defender) if not maxXP: return 0 maxHP = GameObj.GetMaxHP(defender) lostHPPer = lostHP / float(maxHP) #GameWorld.DebugLog(" lostHP=%s,lostHPPer=%s" % (lostHP, lostHPPer)) return eval(IpyGameDataPY.GetFuncCompileCfg("TurnFightXP", 3)) def AddTurnFightXP(gameObj, addXP, reason=""): ## »ØºÏÕ½¶·Ôö¼ÓXP if not addXP: #GameWorld.DebugLog(" ûÓÐÔö¼ÓXP! curID=%s" % (gameObj.GetID())) return maxXP = GameObj.GetMaxXP(gameObj) if not maxXP: #GameWorld.DebugLog(" ÎÞ×î´óXPÖµ£¬²»¸üÐÂ! curID=%s" % (gameObj.GetID())) return curXP = GameObj.GetXP(gameObj) if curXP >= maxXP: #GameWorld.DebugLog(" XPÖµÒÑÂú£¬²»¸üÐÂ! curID=%s,curXP=%s" % (gameObj.GetID(), curXP)) return updXP = min(curXP + addXP, maxXP) GameObj.SetXP(gameObj, updXP) GameWorld.DebugLog(" ¸üÐÂXP: curID=%s,curXP=%s,addXP=%s,updXP=%s,reason=%s" % (gameObj.GetID(), curXP, addXP, updXP, reason)) return def __CheckUseXPSkill(curObj, tagObj, tick): ## ʹÓÃXP¼¼ÄÜ - µÀ·¨¼¼ÄÜ maxXP = GameObj.GetMaxXP(curObj) curXP = GameObj.GetXP(curObj) if not maxXP or curXP < maxXP: #GameWorld.DebugLog(" ûÓÐXP»òXPδÂú£¬ÎÞ·¨ÊÍ·ÅXP! curID=%s,curXP=%s" % (curObj.GetID(), curXP)) return turnNum = GetTurnNum(curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline)) xpFullTurnNum = GetTurnNum(curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnXPFullTimeline)) if turnNum <= xpFullTurnNum: #GameWorld.DebugLog(" XP¼¼ÄÜÔÚ±¾»ØºÏÎÞ·¨ÊÍ·Å! curID=%s, turnNum=%s <= %s" % (curObj.GetID(), turnNum, xpFullTurnNum)) return curObj.SetDict(ChConfig.Def_Obj_Dict_TurnXPUseState, 1) # ÉèÖÿÉÓà tagDist = 0 skillManager = curObj.GetSkillManager() for index in range(0, skillManager.GetSkillCount()): curSkill = skillManager.GetSkillByIndex(index) if not curSkill or curSkill.GetSkillTypeID() == 0: break skillID = curSkill.GetSkillID() #±»¶¯¼¼ÄÜÎÞ·¨Ê¹Óà if SkillCommon.isPassiveSkill(curSkill): continue #»¹ÔÚÀäȴʱ¼äÄÚÎÞ·¨ÊÍ·Å if SkillCommon.RefreshSkillRemainTime(curSkill, tick) != 0: continue needXP = curSkill.GetXP() if not needXP or needXP < curXP: continue curID = curObj.GetID() tagID = tagObj.GetID() if not AICommon.DoNPCUseSkill(curObj, tagObj, curSkill, tagDist, tick): GameWorld.DebugLog(" XP¼¼Äܹ¥»÷ʧ°Ü: curID=%s,tagID=%s,skillID=%s" % (curID, tagID, skillID)) continue GameWorld.DebugLog(" XP¼¼Äܹ¥»÷³É¹¦: curID=%s,tagID=%s,skillID=%s" % (curID, tagID, skillID)) curObj.SetDict(ChConfig.Def_Obj_Dict_TurnXPUseState, 2) # ÉèÖÃÒÑÓà return skillID return def DoAttack(curObj, tagObj, tick, turnBattleType=ChConfig.TurnBattleType_Normal, checkUseXP=False): curID = curObj.GetID() tagID = tagObj.GetID() objName = GetObjName(curObj) GameWorld.DebugLog(" ¡ñ %s DoAttack: curID=%s,tagID=%s,turnBattleType=%s" % (objName, curID, tagID, turnBattleType)) if checkUseXP: if __CheckUseXPSkill(curObj, tagObj, tick): return True if turnBattleType == ChConfig.TurnBattleType_AtkBack: PassiveBuffEffMng.OnPassiveSkillTrigger(curObj, tagObj, None, ChConfig.TriggerType_AtkBackBef, tick) curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, turnBattleType) if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer: atkOK = PlayerAttack(curObj, tagObj, tick) elif curObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID): atkOK = PlayerMirrorAttack(curObj, tagObj, tick) else: atkOK = NPCAttack(curObj, tagObj, tick) curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # ÎÞÂÛ¹¥»÷³É¹¦Óë·ñ¶¼ÖØÖÃÕ½¶·ÀàÐÍ if not atkOK: return curHP = GameObj.GetHP(curObj) tagHP = GameObj.GetHP(tagObj) GameWorld.DebugLog(" curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, curHP, tagID, tagHP)) if tagHP <= 0 or curHP <= 0: return True # ·´»÷£¬·´»÷¿É´ò¶ÏÁ¬»÷£¬ËùÒÔÓÅÏÈÅÐ¶Ï if CanAtkBack(curObj, tagObj): DoAttack(tagObj, curObj, tick, ChConfig.TurnBattleType_AtkBack) return True # Á¬»÷ if CanCombo(curObj, tagObj): DoAttack(curObj, tagObj, tick, ChConfig.TurnBattleType_Combo) return True def CanAtkBack(atkObj, defObj): ## ¿É·ñ·´»÷ if atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum) > 0: #GameWorld.DebugLog(" ±»Áé³è¹¥»÷ʱÎÞ·¨´¥·¢·´»÷") return False defAtkBackRate = GameObj.GetAtkBackRate(defObj) # ·À·½·´»÷ÂÊ atkBackNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) # ÒÑ·´»÷´ÎÊý if atkBackNum > 10: # ÄÚÖÃ×î¸ß·´»÷Êý·À·¶ return False if atkBackNum > 0: validPerList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 4) vaildPer = validPerList[atkBackNum - 1] if len(validPerList) >= atkBackNum else 0 defAtkBackRate = int(defAtkBackRate * vaildPer / 100.0) atkAtkBackDefRate = GameObj.GetAtkBackDefRate(atkObj) # ¹¥·½µÖ¿¹·´»÷ÂÊ atkBackRate = max(0, defAtkBackRate - atkAtkBackDefRate) if atkBackRate <= 0 or not GameWorld.CanHappen(atkBackRate): GameWorld.DebugLog(" ÎÞ·¨·´»÷: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)" % (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate)) return False GameWorld.DebugLog(" ¿ÉÒÔ·´»÷: defID=%s,atkBackNum=%s,atkBackRate=%s=(defAtkBackRate=%s - atkAtkBackDefRate=%s)" % (defObj.GetID(), atkBackNum, atkBackRate, defAtkBackRate, atkAtkBackDefRate)) return True def CanCombo(atkObj, defObj): ## ¿É·ñÁ¬»÷ atkComboRate = GameObj.GetComboRate(atkObj) # ¹¥·½Á¬»÷ÂÊ comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) # ÒÑÁ¬»÷´ÎÊý if comboNum > 10: # ÄÚÖÃ×î¸ßÁ¬»÷Êý·À·¶ return False if comboNum > 0: validPerList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 3) vaildPer = validPerList[comboNum - 1] if len(validPerList) >= comboNum else 0 atkComboRate = int(atkComboRate * vaildPer / 100.0) defComboReduce = GameObj.GetComboDefRate(defObj) # ·À·½µÖ¿¹Á¬»÷ÂÊ comboRate = max(0, atkComboRate - defComboReduce) if comboRate <= 0 or not GameWorld.CanHappen(comboRate): GameWorld.DebugLog(" ÎÞ·¨Á¬»÷: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)" % (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce)) return False GameWorld.DebugLog(" ¿ÉÒÔÁ¬»÷: atkID=%s,comboNum=%s,comboRate=%s=(atkComboRate=%s - defComboReduce=%s)" % (atkObj.GetID(), comboNum, comboRate, atkComboRate, defComboReduce)) return True def NPCAttack(curObj, tagObj, tick): ## NPC¹¥»÷ if not curObj: return #ÓÐÖµ´ú±íÁé³èÉÏÕóλÖã¬ÅжÏÊÇ·ñÓиÅÂʹ¥»÷ fightPlaceNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum) if fightPlaceNum > 0: fightRateList = IpyGameDataPY.GetFuncEvalCfg("PetGoOutFight", 2) if fightPlaceNum > len(fightRateList): return fightRatePer = fightRateList[fightPlaceNum - 1] qualityAddRateInfo = IpyGameDataPY.GetFuncEvalCfg("PetGoOutFight", 3, {}) petQuality = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetQuality) qualityAddPer = qualityAddRateInfo.get(str(petQuality), 0) fightRatePer += qualityAddPer if fightRatePer < 100 and not GameWorld.CanHappen(fightRatePer, 100): GameWorld.DebugLog(" Áé³è¸ÅÂʲ»¹¥»÷: curID=%s,fightPlaceNum=%s,petQuality=%s,fightRatePer=%s" % (curObj.GetID(), fightPlaceNum, petQuality, fightRatePer)) return tagDist = 0 atkOK = AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick) #---ÓÅÏÈÊͷż¼ÄÜ--- if not atkOK: if fightPlaceNum: GameWorld.DebugLog(" Áé³è²»¿ÉÆÕͨ¹¥»÷: curID=%s,fightPlaceNum=%s" % (curObj.GetID(), fightPlaceNum)) else: #ÆÕͨ¹¥»÷ atkOK = BaseAttack.Attack(curObj, tagObj, None, tick) if atkOK: GameWorld.DebugLog(" ÆÕͨ¹¥»÷: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK)) else: GameWorld.DebugLog(" ¹¥»÷ʧ°Ü: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK)) else: GameWorld.DebugLog(" ¼¼Äܹ¥»÷: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK)) return atkOK def PlayerMirrorAttack(playerNPC, tagObj, tick): ## Íæ¼Ò¾µÏñ¹¥»÷ playerID = playerNPC.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) tagObjID = tagObj.GetID() autoUseSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {}) tagDist = 0 skillManager = playerNPC.GetSkillManager() for skillTypeID in autoUseSkillTypeIDList: curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID) if not curSkill: continue skillID = curSkill.GetSkillID() #±»¶¯¼¼ÄÜÎÞ·¨Ê¹Óà if SkillCommon.isPassiveSkill(curSkill): continue #»¹ÔÚÀäȴʱ¼äÄÚÎÞ·¨ÊÍ·Å if SkillCommon.RefreshSkillRemainTime(curSkill, tick) != 0: continue if not AICommon.DoNPCUseSkill(playerNPC, tagObj, curSkill, tagDist, tick): continue GameWorld.DebugLog(" ¼¼Äܹ¥»÷³É¹¦: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) return skillID #ÆÕͨ¹¥»÷ atkOK = BaseAttack.Attack(playerNPC, tagObj, None, tick) if atkOK: GameWorld.DebugLog(" ÆÕͨ¹¥»÷: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) else: GameWorld.DebugLog(" ¹¥»÷ʧ°Ü: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) return atkOK def PlayerAttack(curPlayer, tagObj, tick): ## Íæ¼Ò¹¥»÷£¬ ²Î¿¼¼¼ÄÜʹÓà #def UseSkillEx(index, clientData, tick): playerID = curPlayer.GetPlayerID() autoUseSkillTypeIDList = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {}) posX, posY = tagPosX, tagPosY = curPlayer.GetPosX(), curPlayer.GetPosY() tagObjType, tagObjID = tagObj.GetGameObjType(), tagObj.GetID() curPlayer.ClearUseSkillRec() curPlayer.SetAttackTargetPos(posX, posY) curPlayer.SetUseSkillPosX(tagPosX) curPlayer.SetUseSkillPosY(tagPosY) curPlayer.SetUseSkillTagType(tagObjType) curPlayer.SetUseSkillTagID(tagObjID) #PlayerControl.SetIsNeedProcess(curPlayer, True) #PlayerControl.ChangePlayerAction(curPlayer, IPY_GameWorld.paAttack) useSkillResult = False skillMgr = curPlayer.GetSkillManager() for skillTypeID in autoUseSkillTypeIDList: curSkill = skillMgr.FindSkillBySkillTypeID(skillTypeID) if not curSkill: continue skillID = curSkill.GetSkillID() #CheckSkillCondition #±»¶¯¼¼ÄÜÎÞ·¨Ê¹Óà if SkillCommon.isPassiveSkill(curSkill): continue #»¹ÔÚÀäȴʱ¼äÄÚÎÞ·¨ÊÍ·Å if SkillCommon.RefreshSkillRemainTime(curSkill, tick) != 0: continue curPlayer.SetUseSkill(curSkill.GetSkillData()) useSkillData = curPlayer.GetUseSkill() if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick): GameWorld.DebugLog(" ¼¼Äܹ¥»÷ʧ°Ü: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) continue useSkillResult = True GameWorld.DebugLog(" ¼¼Äܹ¥»÷³É¹¦: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID)) break curPlayer.ClearUseSkillRec() if not useSkillResult: #ÆÕͨ¹¥»÷ atkOK = BaseAttack.Attack(curPlayer, tagObj, None, tick) if atkOK: useSkillResult = True GameWorld.DebugLog(" ÆÕͨ¹¥»÷: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) else: GameWorld.DebugLog(" ¹¥»÷ʧ°Ü: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) return useSkillResult def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0, msg=""): if not curPlayer: return clientPack = ChPyNetSendPack.tagMCTurnFightState() clientPack.Clear() clientPack.MapID = mapID clientPack.FuncLineID = funcLineID clientPack.PlayerID = tagPlayerID clientPack.State = state clientPack.TurnNum = turnNum clientPack.TurnMax = turnMax clientPack.Msg = str(msg) clientPack.Len = len(clientPack.Msg) NetPackCommon.SendFakePack(curPlayer, clientPack) return def SyncTurnFightObjAction(curPlayer, turnNum, objType, objID): if not curPlayer: return clientPack = ChPyNetSendPack.tagMCTurnFightObjAction() clientPack.Clear() clientPack.TurnNum = turnNum clientPack.ObjID = objID clientPack.ObjType = objType NetPackCommon.SendFakePack(curPlayer, clientPack) return