From 330c5a30027fd33e2f77643f4c3c2f77b4d91a0f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 10 五月 2024 16:42:13 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(回合战斗NPC相关属性统一调整到NPC扩展表;去除副本回合制表,新增冒险关卡表;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py |  124 ++++++++++++++++------------------------
 1 files changed, 50 insertions(+), 74 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index 828d3f5..b20f460 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -33,11 +33,9 @@
 import SkillShell
 import BuffSkill
 import FBCommon
-import ItemControler
 import PassiveBuffEffMng
 import FBLogic
 import ShareDefine
-import PlayerTask
 
 # 回合战斗流程状态
 (
@@ -72,7 +70,8 @@
 #    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决定
 #};
@@ -80,12 +79,13 @@
     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
         
@@ -95,15 +95,16 @@
         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=""):
@@ -121,105 +122,79 @@
         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):
@@ -236,7 +211,7 @@
             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的扩展
@@ -308,12 +283,12 @@
             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:
@@ -388,7 +363,7 @@
     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)
@@ -1186,14 +1161,15 @@
             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

--
Gitblit v1.8.0