| | |
| | | import FBCommon |
| | | import ItemControler |
| | | import PassiveBuffEffMng |
| | | import FBLogic |
| | | |
| | | # 回合战斗流程状态 |
| | | ( |
| | |
| | | # tagHead Head; |
| | | # DWORD MapID; // 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等) |
| | | # WORD FuncLineID; |
| | | # DWORD PlayerID; // 对应玩家ID,可为0,某些功能可能有用,如竞技场 |
| | | # DWORD PlayerID; // 战斗目标玩家ID,可为0,某些功能可能有用,如竞技场 |
| | | # BYTE ValueCount; |
| | | # DWORD ValueList[ValueCount]; // 附加值列表,可选,具体含义由MapID决定 |
| | | #}; |
| | | def OnTurnFight(index, clientData, tick): |
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) |
| | | mapID = clientData.MapID |
| | | funcLineID = clientData.FuncLineID |
| | | tagPlayerID = clientData.PlayerID |
| | | valueList = clientData.ValueList |
| | | |
| | | playerID = curPlayer.GetPlayerID() |
| | | if tagPlayerID: |
| | | if playerID == tagPlayerID: |
| | | GameWorld.DebugLog("不能打自己!", playerID) |
| | | return |
| | | |
| | | if not FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList): |
| | | return |
| | | |
| | | # 需要发送到GameServer验证 |
| | | if mapID in ChConfig.Def_TFMapID_SendToGameServer: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagPlayerID, valueList]) |
| | | return |
| | | |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | return |
| | | |
| | | def SendToGameServer_TurnFight(curPlayer, msgType, dataMsg=""): |
| | | playerID = curPlayer.GetPlayerID() |
| | | msgList = str([msgType, dataMsg]) |
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "TurnFight", msgList, len(msgList)) |
| | | GameWorld.Log("回合战斗发送GameServer: %s, %s" % (msgType, dataMsg), playerID) |
| | | return |
| | | |
| | | def GameServer_TurnFight_DoResult(curPlayer, msgData, tick): |
| | | |
| | | msgType, dataMsg, ret = msgData |
| | | |
| | | if not ret: |
| | | return |
| | | |
| | | if msgType == "TurnFightRequest": |
| | | mapID, funcLineID, tagPlayerID, valueList = dataMsg |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | |
| | | elif msgType == "TurnFightOver": |
| | | mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList = dataMsg |
| | | FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret) |
| | | |
| | | return |
| | | |
| | | def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick): |
| | | ## 执行回合制战斗的完整流程 |
| | | |
| | | 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) |
| | | PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagPlayerID, DoTrunFightVSPlayer, [mapID, funcLineID, valueList], True) |
| | | return |
| | | |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick) |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) |
| | | return |
| | | |
| | | def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, PropDict): |
| | | mapID, funcLineID = callData |
| | | mapID, funcLineID, valueList = callData |
| | | if PropDict and curPlayer.GetPlayerID() != tagPlayerID: |
| | | tick = GameWorld.GetGameWorld().GetTick() |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick) |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) |
| | | return |
| | | |
| | | def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, tick): |
| | | def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick): |
| | | playerID = curPlayer.GetPlayerID() |
| | | factionInfoA = GetPlayerFactionInfoByCache(playerID) |
| | | ipyData = None |
| | |
| | | skillIDExList.extend(ipyData.GetSTSkillIDList()) |
| | | factionInfoB = {"npcID":npcID, "pet":petCacheInfo, "skillIDExList":skillIDExList} |
| | | |
| | | ret = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer) |
| | | if not ret: |
| | | fightRet = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer) |
| | | if not fightRet: |
| | | return |
| | | isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = ret |
| | | isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = fightRet |
| | | |
| | | # 结算奖励...待扩展 |
| | | awardItemList = [] |
| | | # 结算奖励, awardWay-发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑) |
| | | needSendGameServer, awardItemList, awardWay = False, [], 1 |
| | | overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet) |
| | | if overRet != None: |
| | | needSendGameServer, awardItemList, awardWay = overRet |
| | | |
| | | if isWin and ipyData: |
| | | # 山寨测试先默认都是首次奖励,正式后需删除 |
| | | awardItemList = ipyData.GetAwardItemListFirst() |
| | | if awardWay == 1 and not awardItemList: |
| | | # 山寨测试先默认都是首次奖励,正式后需删除 |
| | | awardItemList = ipyData.GetAwardItemListFirst() |
| | | |
| | | if awardItemList == None: |
| | | awardItemList = [] |
| | | |
| | | GameWorld.DebugLog("奖励物品: %s" % awardItemList) |
| | | ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}]) |
| | | |
| | | if awardWay == 1 and awardItemList: |
| | | ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}]) |
| | | |
| | | if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagPlayerID, 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) |