#!/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 NetPackCommon import PlayerControl import SkillCommon import NPCCommon import GameWorld import GameObj ( FightState_Start, FightState_Fighting, FightState_Win, FightState_Fail, FightState_Over, ) = range(5) #// 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) DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick) SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) return def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick): playerID = curPlayer.GetPlayerID() tagObj = None if tagPlayerID: pass else: ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID) if not ipyData: return npcID = ipyData.GetNPCID() if not npcID: return tagObj = NPCCommon.SummonMapNpc(npcID, curPlayer.GetPosX(), curPlayer.GetPosY(), sightLevel=playerID) if not tagObj: return turnMax = IpyGameDataPY.GetFuncCfg("TurnFight", 1) curPet = curPlayer.GetPetMgr().GetFightPet() tagPet = None GameWorld.DebugLog("Ö´ÐлغÏÖÆÕ½¶·: mapID=%s,funcLineID=%s,tagPlayerID=%s,tagObjID=%s" % (mapID, funcLineID, tagPlayerID, tagObj.GetID()), playerID) GameWorld.DebugLog("curPlayer.GetSightLevel=%s,tagObj.GetSightLevel=%s" % (curPlayer.GetSightLevel(), tagObj.GetSightLevel()), playerID) #Ò»¸ö»ØºÏ¹¥»÷˳Ðò #1. ¿ì·½³èÎï¹¥»÷£¬²»´æÔÚÌø¹ý #2. Âý·½³èÎï¹¥»÷£¬²»´æÔÚÌø¹ý #3. ¿ì·½Ö÷Ìå¹¥»÷ #4. Âý·½Ö÷Ìå¹¥»÷ # Õ½¶·Ç°³õʼ»¯ factionObjMax = 0 # ij¸öÕóÓªµÄ×î´óÕ½¶·ÊµÀýÊý factionObjDict = {1:[curPet, curPlayer], 2:[tagPet, tagObj]} for objList in factionObjDict.values(): if factionObjMax < len(objList): factionObjMax = len(objList) for gameObj in objList: TurnFightObjStartInit(gameObj) curSpeed = 0 tagSpeed = 0 orderList = [1, 2] if curSpeed >= tagSpeed else [2, 1] GameWorld.DebugLog("playerHP=%s,tagHP=%s,curSpeed=%s,tagSpeed=%s" % (GameObj.GetHP(curPlayer), GameObj.GetHP(tagObj), curSpeed, tagSpeed), playerID) isWin = None for turnNum in range(1, turnMax + 1): GameWorld.DebugLog("»ØºÏÖÆÕ½¶·ÂÖ´Î: %s" % turnNum, playerID) SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Fighting, turnNum, turnMax) for index in range(factionObjMax): for faction in orderList: objList = factionObjDict[faction] if index >= len(objList): continue gameObj = objList[index] if not gameObj: continue gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, turnNum) tagGameObj = tagObj if faction == 1 else curPlayer objType = gameObj.GetGameObjType() objID = gameObj.GetID() tagObjType = tagGameObj.GetGameObjType() tagObjID = tagGameObj.GetID() GameWorld.DebugLog(" Ðж¯: turnNum=%s,index=%s,faction=%s,objType=%s,objID=%s,tagObjType=%s,tagObjID=%s" % (turnNum, index, faction, objType, objID, tagObjType, tagObjID), playerID) if objType == IPY_GameWorld.gotPlayer: PlayerAttack(gameObj, tagGameObj, tick) else: NPCAttack(gameObj, tagGameObj, tick) if tagGameObj and GameObj.GetHP(tagGameObj) > 0: GameWorld.DebugLog(" playerHP=%s,tagHP=%s" % (GameObj.GetHP(curPlayer), GameObj.GetHP(tagObj)), playerID) continue isWin = faction == 1 GameWorld.DebugLog(" tagObjType=%s,tagObjID=%s,±»»÷ɱ£¬½áÊøÕ½¶·: isWin=%s" % (tagObjType, tagObjID, isWin), playerID) break if isWin != None: break if isWin != None: break overState = FightState_Win if isWin else FightState_Fail SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, overState, turnNum, turnMax) for objList in factionObjDict.values(): for gameObj in objList: TurnFightObjOverReset(gameObj) GameWorld.DebugLog("»ØºÏÖÆÕ½¶·½áÊø: mapID=%s,funcLineID=%s,tagPlayerID=%s,isWin=%s,overState=%s" % (mapID, funcLineID, tagPlayerID, isWin, overState), playerID) return def TurnFightObjStartInit(gameObj): ## »ØºÏÖÆÕ½¶·ÊµÀý³õʼ»¯ if not gameObj: return gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, 1) GameObj.SetHPFull(gameObj) gameObj.RefreshView() objType = gameObj.GetGameObjType() # ÖØÖü¼ÄÜCD¡¢Õ½¶·buff if objType == IPY_GameWorld.gotPlayer: skillManager = gameObj.GetSkillManager() for i in range(skillManager.GetSkillCount()): skill = skillManager.GetSkillByIndex(i) skill.SetRemainTime(0) elif objType == IPY_GameWorld.gotNPC: pass return def TurnFightObjOverReset(gameObj): ## »ØºÏÖÆÕ½¶·ÊµÀý½áÊøÖØÖà if not gameObj: return gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightNum, 0) objType = gameObj.GetGameObjType() if objType == IPY_GameWorld.gotPlayer: pass elif objType == IPY_GameWorld.gotNPC: npcObjType = gameObj.GetGameNPCObjType() if npcObjType != IPY_GameWorld.gnotPet and GameObj.GetHP(gameObj): NPCCommon.SetDeadEx(gameObj) return def NPCAttack(curObj, tagObj, tick): ## NPC¹¥»÷ if not curObj: return tagDist = 0 #---ÓÅÏÈÊͷż¼ÄÜ--- if not AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick): #ÆÕͨ¹¥»÷ isOK = BaseAttack.Attack(curObj, tagObj, None, tick) GameWorld.DebugLog(" NPCÆÕͨ¹¥»÷: curID=%s,tagID=%s,isOK=%s" % (curObj.GetID(), tagObj.GetID(), isOK)) return def PlayerAttack(curPlayer, tagObj, tick): ## Íæ¼Ò¹¥»÷£¬ ²Î¿¼¼¼ÄÜʹÓà #def UseSkillEx(index, clientData, tick): playerID = curPlayer.GetPlayerID() job = curPlayer.GetJob() jobAutoUseSkillDict = IpyGameDataPY.GetFuncEvalCfg("TurnFight", 2, {}) if job not in jobAutoUseSkillDict: return skillList = jobAutoUseSkillDict[job] 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) skillMgr = curPlayer.GetSkillManager() for skillID in skillList: curSkill = skillMgr.FindSkillBySkillID(skillID) if not curSkill: continue #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" % skillID, playerID) continue GameWorld.DebugLog(" ¼¼Äܹ¥»÷³É¹¦%s" % skillID, playerID) break curPlayer.ClearUseSkillRec() return 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