| | |
| | | import SkillShell |
| | | import BuffSkill |
| | | import FBCommon |
| | | import ItemControler |
| | | import PassiveBuffEffMng |
| | | import FBLogic |
| | | import ShareDefine |
| | | import PlayerTask |
| | | |
| | | # 回合战斗流程状态 |
| | | ( |
| | |
| | | # tagHead Head; |
| | | # DWORD MapID; // 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等) |
| | | # WORD FuncLineID; |
| | | # DWORD PlayerID; // 战斗目标玩家ID,可为0,某些功能可能有用,如竞技场 |
| | | # BYTE TagType; // 战斗目标类型,0-NPC,1-玩家,2-队伍 |
| | | # DWORD TagID; // 战斗目标类型对应的ID |
| | | # BYTE ValueCount; |
| | | # DWORD ValueList[ValueCount]; // 附加值列表,可选,具体含义由MapID决定 |
| | | #}; |
| | |
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) |
| | | mapID = clientData.MapID |
| | | funcLineID = clientData.FuncLineID |
| | | tagPlayerID = clientData.PlayerID |
| | | tagType = clientData.TagType |
| | | tagID = clientData.TagID |
| | | valueList = clientData.ValueList |
| | | |
| | | playerID = curPlayer.GetPlayerID() |
| | | if tagPlayerID: |
| | | if playerID == tagPlayerID: |
| | | if tagType == ChConfig.TurnBattle_TagType_Player: |
| | | if tagID == playerID: |
| | | GameWorld.DebugLog("不能打自己!", playerID) |
| | | return |
| | | |
| | |
| | | if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, funcLineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK: |
| | | return |
| | | |
| | | if not FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList): |
| | | reqRet = FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList) |
| | | if not reqRet: |
| | | return |
| | | |
| | | # 需要发送到GameServer验证 |
| | | if mapID in ChConfig.Def_TFMapID_SendToGameServer: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagPlayerID, valueList]) |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagType, tagID, valueList]) |
| | | return |
| | | |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | return |
| | | |
| | | def SendToGameServer_TurnFight(curPlayer, msgType, dataMsg=""): |
| | |
| | | return |
| | | |
| | | if msgType == "TurnFightRequest": |
| | | mapID, funcLineID, tagPlayerID, valueList = dataMsg |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | mapID, funcLineID, tagType, tagID, valueList = dataMsg |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | |
| | | elif msgType == "TurnFightOver": |
| | | mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList = dataMsg |
| | | FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret) |
| | | mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList = dataMsg |
| | | FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret) |
| | | |
| | | return |
| | | |
| | | def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick): |
| | | def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick): |
| | | ## 执行回合制战斗的完整流程 |
| | | |
| | | if curPlayer.GetSightLevel() != curPlayer.GetID(): |
| | | PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Start) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Start) |
| | | |
| | | if tagPlayerID: |
| | | PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagPlayerID, DoTrunFightVSPlayer, [mapID, funcLineID, valueList], True) |
| | | if tagType == ChConfig.TurnBattle_TagType_Player: |
| | | PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagID, DoTrunFightVSPlayer, [mapID, funcLineID, valueList], True) |
| | | return |
| | | |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) |
| | | return |
| | | |
| | | def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, PropDict): |
| | | tagType = ChConfig.TurnBattle_TagType_Player |
| | | tagID = tagPlayerID |
| | | mapID, funcLineID, valueList = callData |
| | | if PropDict and curPlayer.GetPlayerID() != tagPlayerID: |
| | | tick = GameWorld.GetGameWorld().GetTick() |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) |
| | | return |
| | | |
| | | def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick): |
| | | def DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick): |
| | | if not tagID: |
| | | return |
| | | 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() |
| | | if tagType == ChConfig.TurnBattle_TagType_Player: |
| | | factionInfoB = GetPlayerFactionInfoByCache(tagID) |
| | | elif tagType == ChConfig.TurnBattle_TagType_NPC: |
| | | npcID = tagID |
| | | npcDataEx = NPCCommon.GetNPCDataEx(npcID) |
| | | petNPCIDList = npcDataEx.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()) |
| | | skillIDExList.extend(npcDataEx.GetElfSkillIDList()) |
| | | skillIDExList.extend(npcDataEx.GetSTSkillIDList()) |
| | | factionInfoB = {"npcID":npcID, "pet":petCacheInfo, "skillIDExList":skillIDExList} |
| | | else: |
| | | return |
| | | |
| | | fightRet = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer) |
| | | fightRet = ProcessAutoTurnFight(mapID, funcLineID, tagType, tagID, factionInfoA, factionInfoB, tick, curPlayer) |
| | | if not fightRet: |
| | | return |
| | | isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = fightRet |
| | | |
| | | # 结算奖励, awardWay-发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑) |
| | | needSendGameServer, awardItemList, awardWay = False, [], 1 |
| | | overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet) |
| | | needSendGameServer, awardItemList = False, [] |
| | | overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet) |
| | | if overRet != None: |
| | | needSendGameServer, awardItemList, awardWay = overRet |
| | | |
| | | isFirstPass = None |
| | | if isWin and ipyData: |
| | | passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID) |
| | | if funcLineID == passLineID + 1: |
| | | isFirstPass = True |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID) |
| | | FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID) |
| | | else: |
| | | isFirstPass = False |
| | | |
| | | if awardWay == 1 and not awardItemList: |
| | | # 山寨测试先默认都是首次奖励,正式后需删除 |
| | | awardItemList = ipyData.GetAwardItemListFirst() if isFirstPass else ipyData.GetAwardItemList() |
| | | |
| | | if awardItemList == None: |
| | | awardItemList = [] |
| | | |
| | | GameWorld.DebugLog("奖励物品: %s, isFirstPass=%s" % (awardItemList, isFirstPass)) |
| | | if awardWay == 1 and awardItemList: |
| | | ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}]) |
| | | needSendGameServer, awardItemList = overRet |
| | | |
| | | if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList]) |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList]) |
| | | |
| | | 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) |
| | | |
| | | # 其他... |
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID]) |
| | | if isWin: |
| | | PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg) |
| | | return |
| | | |
| | | def GetPlayerFactionInfoByCache(playerID): |
| | |
| | | skillIDList.append(skillID) |
| | | return {"playerID":playerID, "pet":PlusDict.get("Pet"), "skillIDList":skillIDList} |
| | | |
| | | def ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False): |
| | | def ProcessAutoTurnFight(mapID, funcLineID, tagType, tagID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False): |
| | | ''' 处理自动回合战斗过程,仅做战斗流程处理,不做及其他功能逻辑 |
| | | @param mapID: 可视为功能ID |
| | | @param funcLineID: 对功能ID的扩展 |
| | |
| | | for factionObjList in atkFactionList: |
| | | fightObjList.append(factionObjList[i]) |
| | | |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, 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) |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_Fighting, turnNum, turnMax) |
| | | |
| | | # 回合开始: 做一些每回合重置逻辑或者某些根据回合触发的效果等 |
| | | for gameObj in fightObjList: |
| | |
| | | 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) |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_FightEnd, turnNum, turnMax) |
| | | |
| | | for gameObj in fightObjList: |
| | | TurnFightObjOverReset(gameObj, tick) |
| | |
| | | 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=""): |
| | | def SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, 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.TagType = tagType |
| | | clientPack.TagID = tagID |
| | | clientPack.State = state |
| | | clientPack.TurnNum = turnNum |
| | | clientPack.TurnMax = turnMax |