#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package TurnAttack # # @todo:»ØºÏÖÆ¹¥»÷Âß¼­ # @author hxp # @date 2023-11-30 # @version 1.0 # # ÏêϸÃèÊö: »ØºÏÖÆ¹¥»÷Âß¼­ # #------------------------------------------------------------------------------- #"""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 ( FightState_Start, FightState_Fighting, FightState_Win, FightState_Fail, FightState_Over, ) = range(5) def GetObjName(gameObj): objName = gameObj.GetName() mirrorPlayerID = gameObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) if mirrorPlayerID: objName = "%s[%s]" % (objName, mirrorPlayerID) faction = GameObj.GetFaction(gameObj) fightPlaceNum = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_FightPetPlaceNum) return "%s%s %s" % ("A" if faction == 1 else "B", fightPlaceNum, objName) #// 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() posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY() GameWorld.DebugLog("===== Ö´ÐлغÏÖÆÕ½¶·: mapID=%s,funcLineID=%s,tagPlayerID=%s" % (mapID, funcLineID, tagPlayerID), playerID) tagObj = None if tagPlayerID: npcID = ChConfig.Def_NPCID_PVP tagObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=playerID, mirrorPlayerID=tagPlayerID) if not tagObj: return PlusData = PlayerViewCacheTube.GetPlayerPropPlusDictByID(playerID)[1] # ´Ó»º´æÖлñÈ¡ petCacheInfo = PlusData.get("Pet") fightPetObjListB = PetControl.CalloutFightPet(tagObj, petCacheInfo) else: ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID) if not ipyData: return npcID = ipyData.GetNPCID() if not npcID: return tagObj = NPCCommon.SummonMapNpc(npcID, posX, posY, sightLevel=playerID) if not tagObj: return petNPCIDList = ipyData.GetPetNPCIDList() petCacheInfo = [] # ´ÓÅä±íÖжÁÈ¡×éºÏ£¬¼¼ÄÜĬÈÏÈ¡NPC±íÅäÖÃµÄ for state, petNPCID in enumerate(petNPCIDList, 1): petCacheInfo.append({"npcID":petNPCID, "state":state, "quality":0}) fightPetObjListB = PetControl.CalloutFightPet(tagObj, petCacheInfo) turnMax = IpyGameDataPY.GetFuncCfg("TurnFight", 1) # ³èÎïÏȹ¥»÷ fightPetObjListA = PetControl.CalloutFightPet(curPlayer) factionListA = fightPetObjListA + [curPlayer] factionListB = fightPetObjListB + [tagObj] atkFactionList = [factionListA, factionListB] # Õ½¶·Ç°³õʼ»¯£¬¿ÉÄÜ»á¸Ä±ä¹¥ËÙ£¬ËùÒÔÏȳõʼ»¯ for faction, factionObjList in enumerate(atkFactionList, 1): for gameObj in factionObjList: TurnFightObjStartInit(gameObj, faction, 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(curPlayer) < GameObj.GetAtkSpeed(tagObj): atkFactionList = [factionListB, factionListA] for i in range(len(factionListA)): for factionObjList in atkFactionList: fightObjList.append(factionObjList[i]) isWin = None for turnNum in range(1, turnMax + 1): GameWorld.DebugLog("¡¾----- »ØºÏÖÆÕ½¶·ÂÖ´Î: %s -----¡¿" % turnNum) SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Fighting, turnNum, turnMax) # »ØºÏ¿ªÊ¼: ×öһЩÿ»ØºÏÖØÖÃÂß¼­»òÕßijЩ¸ù¾Ý»ØºÏ´¥·¢µÄЧ¹ûµÈ for gameObj in fightObjList: TurnFightObjPerTurnStart(gameObj, turnNum, tick) # »ØºÏÕ½¶·£º ÂÖÁ÷ÒÀ´Î¹¥»÷ for gameObj in fightObjList: if not gameObj or GameObj.GetHP(gameObj) <= 0: continue faction = GameObj.GetFaction(gameObj) objType = gameObj.GetGameObjType() objID = gameObj.GetID() objName = GetObjName(gameObj) curHP = GameObj.GetHP(gameObj) tagGameObj = tagObj if faction == 1 else curPlayer tagObjType = tagGameObj.GetGameObjType() tagObjID = tagGameObj.GetID() tagHP = GameObj.GetHP(tagGameObj) GameWorld.DebugLog(" ¡ï»ØºÏ%s %s Ðж¯ : objType-ID-HP(%s-%s-%s), tagType-ID-HP(%s-%s-%s)" % (turnNum, objName, objType, objID, curHP, tagObjType, tagObjID, tagHP)) SyncTurnFightObjAction(curPlayer, turnNum, objType, objID) DoAttack(gameObj, tagGameObj, tick) playerDead = GameObj.GetHP(curPlayer) <= 0 tagObjDead = (not tagObj or GameObj.GetHP(tagObj) <= 0) if not playerDead and not tagObjDead: continue 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) break if isWin != None: break overState = FightState_Win if isWin else FightState_Fail SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, overState, turnNum, turnMax) for gameObj in fightObjList: TurnFightObjOverReset(gameObj) GameWorld.DebugLog("===== »ØºÏÖÆÕ½¶·½áÊø: mapID=%s,funcLineID=%s,tagPlayerID=%s,isWin=%s,overState=%s" % (mapID, funcLineID, tagPlayerID, isWin, overState), playerID) return def TurnFightObjStartInit(gameObj, faction, tick): ## »ØºÏÖÆÕ½¶·ÊµÀý³õʼ»¯ if not gameObj: return gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, 1) GameObj.SetFaction(gameObj, faction) GameObj.SetHPFull(gameObj) 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,HP=%s,Atk=%s,Def=%s" % (objName, BaseAttack.GetObjAttackName(gameObj), gameObj.GetID(), npcID, GameObj.GetAtkSpeed(gameObj), GameObj.GetHP(gameObj), gameObj.GetMaxAtk(), gameObj.GetDef())) 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), )) # ÖØÖü¼ÄÜ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 skillIDList.append(curSkill.GetSkillID()) if fightPlaceNum: # Áé³è¼¼ÄÜ¿ªÊ¼Ê±Ö±½Ó½øÈëCD curSkill.SetLastUseTick(tick) curSkill.SetRemainTime(curSkill.GetCoolDownTime()) GameWorld.DebugLog(" NPC¼¼ÄÜ: npcID=%s,skillIDList=%s" % (npcID, skillIDList)) return def TurnFightObjPerTurnStart(gameObj, turnNum, tick): ## »ØºÏÖÆÕ½¶·ÊµÀý - ÿ»ØºÏ¿ªÊ¼Ê±´¦Àí if not gameObj: return gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, turnNum) # ÖØÖÃÁ¬»÷¡¢·´»÷Êý gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, 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)) if objType == IPY_GameWorld.gotPlayer: gameObj.SetTickByType(ChConfig.TYPE_Player_Tick_Buff, 0) gameObj.SetPersistBuffTick(0) #Ë¢ÐÂÍæ¼ÒBuff reFlashBuff = PlayerState.ProcessRefreshBuffState(gameObj, tick) #Ë¢ÐÂÍæ¼Ò³¡¾°buffЧ¹û PlayerState.ProcessPlayerBuffEffect(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): ## »ØºÏÖÆÕ½¶·ÊµÀý½áÊøÖØÖà if not gameObj: return gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) GameObj.SetFaction(gameObj, 0) objType = gameObj.GetGameObjType() if objType == IPY_GameWorld.gotPlayer: pass elif objType == IPY_GameWorld.gotNPC: RecycleObj(gameObj) return 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 if GameObj.GetHP(gameObj) <= 0: #GameWorld.DebugLog("RecycleObj ÒÑËÀÍö£¬²»ÓÃÖØ¸´»ØÊÕ objID=%s,npcObjType=%s,%s" % (gameObj.GetID(), npcObjType, gameObj.GetNPCID())) return #GameWorld.DebugLog("RecycleObj: objID=%s,npcObjType=%s,%s" % (gameObj.GetID(), npcObjType, gameObj.GetNPCID())) NPCCommon.SetDeadEx(gameObj) return def DoAttack(curObj, tagObj, tick): curID = curObj.GetID() tagID = tagObj.GetID() 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) turnBattleType = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType) curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # ÎÞÂÛ¹¥»÷³É¹¦Óë·ñ¶¼ÖØÖÃÕ½¶·ÀàÐÍ if not atkOK: return if turnBattleType == ChConfig.TurnBattleType_Combo: comboNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) + 1 curObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum) GameWorld.DebugLog(" Á¬»÷: comboID=%s,comboNum=%s" % (curID, comboNum)) elif turnBattleType == ChConfig.TurnBattleType_AtkBack: atkBackNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnAtkBackNum) + 1 curObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum) GameWorld.DebugLog(" ·´»÷: atkBackID=%s,atkBackNum=%s" % (curID, atkBackNum)) 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 # ·´»÷£¬·´»÷¿É´ò¶ÏÁ¬»÷£¬ËùÒÔÓÅÏÈÅÐ¶Ï if CanAtkBack(curObj, tagObj): DoAttack(tagObj, curObj, tick) return # Á¬»÷ if CanCombo(curObj, tagObj): DoAttack(curObj, tagObj, tick) return 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)) defObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_AtkBack) 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)) atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, ChConfig.TurnBattleType_Combo) return True def NPCAttack(curObj, tagObj, tick): ## NPC¹¥»÷ if not curObj: return objName = "¡ñ %s" % GetObjName(curObj) #ÓÐÖµ´ú±íÁé³èÉÏÕóλÖã¬ÅжÏÊÇ·ñÓиÅÂʹ¥»÷ 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(" %s ÆÕͨ¹¥»÷: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK)) else: GameWorld.DebugLog(" %s ¹¥»÷ʧ°Ü: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK)) else: GameWorld.DebugLog(" %s ¼¼Äܹ¥»÷: curID=%s,tagID=%s,atkOK=%s" % (objName, curObj.GetID(), tagObj.GetID(), atkOK)) return atkOK def PlayerMirrorAttack(playerNPC, tagObj, tick): ## Íæ¼Ò¾µÏñ¹¥»÷ playerID = playerNPC.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) objName = "¡ñ %s" % GetObjName(playerNPC) 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): GameWorld.DebugLog(" %s ¼¼Äܹ¥»÷ʧ°Ü: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID)) continue GameWorld.DebugLog(" %s ¼¼Äܹ¥»÷³É¹¦: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID)) return skillID #ÆÕͨ¹¥»÷ atkOK = BaseAttack.Attack(playerNPC, tagObj, None, tick) if atkOK: GameWorld.DebugLog(" %s ÆÕͨ¹¥»÷: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK)) else: GameWorld.DebugLog(" %s ¹¥»÷ʧ°Ü: curID=%s,tagID=%s,atkOK=%s" % (objName, 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() objName = "¡ñ %s" % GetObjName(curPlayer) 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(" %s ¼¼Äܹ¥»÷ʧ°Ü: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID)) continue useSkillResult = True GameWorld.DebugLog(" %s ¼¼Äܹ¥»÷³É¹¦: playerID=%s,tagID=%s,skillID=%s" % (objName, playerID, tagObjID, skillID)) break curPlayer.ClearUseSkillRec() if not useSkillResult: #ÆÕͨ¹¥»÷ atkOK = BaseAttack.Attack(curPlayer, tagObj, None, tick) if atkOK: useSkillResult = True GameWorld.DebugLog(" %s ÆÕͨ¹¥»÷: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK)) else: GameWorld.DebugLog(" %s ¹¥»÷ʧ°Ü: curID=%s,tagID=%s,atkOK=%s" % (objName, playerID, tagObjID, atkOK)) return useSkillResult def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0): clientPack = ChPyNetSendPack.tagMCTurnFightState() clientPack.Clear() clientPack.MapID = mapID clientPack.FuncLineID = funcLineID clientPack.PlayerID = tagPlayerID clientPack.State = state clientPack.TurnNum = turnNum clientPack.TurnMax = turnMax NetPackCommon.SendFakePack(curPlayer, clientPack) return def SyncTurnFightObjAction(curPlayer, turnNum, objType, objID): clientPack = ChPyNetSendPack.tagMCTurnFightObjAction() clientPack.Clear() clientPack.TurnNum = turnNum clientPack.ObjID = objID clientPack.ObjType = objType NetPackCommon.SendFakePack(curPlayer, clientPack) return