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/GameWorldLogic/FBLogic.py                        |   15 
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py                                             |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py                                   |   19 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py                               |   19 +
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py                                                        |   19 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                             |  124 +++-----
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                                                    |   19 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py             |   18 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py   |   22 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py   |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                                 |   70 ++--
 ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py                                                           |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Adventure.py  |   62 ++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py |  301 ++--------------------
 PySysDB/PySysDBPY.h                                                                                                  |   27 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                                      |   11 
 16 files changed, 300 insertions(+), 440 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 7fd35b8..54cb5e7 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -635,6 +635,10 @@
 	DWORD		AtkBackDefRate;	//抗反击概率
 	DWORD		SuckHPPer;	//吸血比率
 	DWORD		SuckHPDefPer;	//抗吸血比率
+	dict		SpecAttrInfo;	//特殊属性信息 {"属性ID":值, ...}
+	list		PetNPCIDList;	//回合战斗灵宠NPCID列表
+	list		ElfSkillIDList;	//回合战斗精怪技能ID列表
+	list		STSkillIDList;	//回合战斗神通技能ID列表
 };
 
 //成长型境界怪物表
@@ -833,6 +837,15 @@
 	dict		SweepGoodDrop;	//扫荡珍稀符印
 };
 
+//冒险关卡表
+
+struct tagAdventure
+{
+	WORD		_LineID;	//功能线路ID
+	DWORD		NPCID;	//NPCID
+	list		AwardItemList;	//过关奖励列表[[物品ID,个数,是否拍品], ...]
+};
+
 //地图表格
 
 struct tagChinMap
@@ -883,20 +896,6 @@
 	eval		RefreshNPC;	//标试点刷怪配置
 	eval		GradeInfo;	//评级规则
 	eval		RewardInfo;	//奖励信息
-};
-
-//副本回合制表
-
-struct tagFBTurn
-{
-	DWORD		_DataMapID;	//数据地图ID
-	WORD		_LineID;	//功能线路ID
-	DWORD		NPCID;	//NPCID
-	list		PetNPCIDList;	//灵宠NPCID列表
-	list		ElfSkillIDList;	//精怪技能ID列表
-	list		STSkillIDList;	//神通技能ID列表
-	list		AwardItemListFirst;	//首次过关奖励列表[[物品ID,个数,是否拍品], ...]
-	list		AwardItemList;	//再次过关奖励列表[[物品ID,个数,是否拍品], ...]
 };
 
 //副本助战表
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index 8b88d59..e41ded3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -709,9 +709,7 @@
 Def_FBMapID_Love = 31300
 
 #回合战斗自定义地图ID
-TurnFightMapIDList = (
-Def_TFMapID_MineArea, # 福地 1
-) = range(1, 1 + 1)
+Def_TFMapID_MineArea = 1 # 福地 1
 
 #需要刷世界BOSS的副本
 WorldBossFBMapIDList = [Def_FBMapID_SealDemon, Def_FBMapID_ZhuXianBoss, Def_FBMapID_DemonKing]
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
index 57a4778..5e54f8c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -20950,7 +20950,8 @@
     Head = tagHead()
     MapID = 0    #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
     FuncLineID = 0    #(WORD FuncLineID)
-    PlayerID = 0    #(DWORD PlayerID)// 战斗目标玩家ID,可为0,某些功能可能有用,如竞技场
+    TagType = 0    #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
+    TagID = 0    #(DWORD TagID)// 战斗目标类型对应的ID
     ValueCount = 0    #(BYTE ValueCount)
     ValueList = list()    #(vector<DWORD> ValueList)// 附加值列表,可选,具体含义由MapID决定
     data = None
@@ -20966,7 +20967,8 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.ValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.ValueCount):
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
@@ -20980,7 +20982,8 @@
         self.Head.SubCmd = 0x10
         self.MapID = 0
         self.FuncLineID = 0
-        self.PlayerID = 0
+        self.TagType = 0
+        self.TagID = 0
         self.ValueCount = 0
         self.ValueList = list()
         return
@@ -20990,6 +20993,7 @@
         length += self.Head.GetLength()
         length += 4
         length += 2
+        length += 1
         length += 4
         length += 1
         length += 4 * self.ValueCount
@@ -21001,7 +21005,8 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteDWORD(data, self.MapID)
         data = CommFunc.WriteWORD(data, self.FuncLineID)
-        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.TagType)
+        data = CommFunc.WriteDWORD(data, self.TagID)
         data = CommFunc.WriteBYTE(data, self.ValueCount)
         for i in range(self.ValueCount):
             data = CommFunc.WriteDWORD(data, self.ValueList[i])
@@ -21012,7 +21017,8 @@
                                 Head:%s,
                                 MapID:%d,
                                 FuncLineID:%d,
-                                PlayerID:%d,
+                                TagType:%d,
+                                TagID:%d,
                                 ValueCount:%d,
                                 ValueList:%s
                                 '''\
@@ -21020,7 +21026,8 @@
                                 self.Head.OutputString(),
                                 self.MapID,
                                 self.FuncLineID,
-                                self.PlayerID,
+                                self.TagType,
+                                self.TagID,
                                 self.ValueCount,
                                 "..."
                                 )
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index 78040d1..fed3780 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -48463,7 +48463,8 @@
     Head = tagHead()
     MapID = 0    #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
     FuncLineID = 0    #(WORD FuncLineID)
-    PlayerID = 0    #(DWORD PlayerID)// 对应玩家ID,可为0,某些功能可能有用,如竞技场
+    TagType = 0    #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
+    TagID = 0    #(DWORD TagID)// 战斗目标类型对应的ID
     State = 0    #(BYTE State)// 0-起始状态标记;1-准备完毕;2-战斗中;3-战斗结束;4-结算奖励;5-结束状态标记
     TurnNum = 0    #(BYTE TurnNum)// 当前轮次
     TurnMax = 0    #(BYTE TurnMax)// 最大轮次
@@ -48482,7 +48483,8 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.TurnNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.TurnMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -48497,7 +48499,8 @@
         self.Head.SubCmd = 0x20
         self.MapID = 0
         self.FuncLineID = 0
-        self.PlayerID = 0
+        self.TagType = 0
+        self.TagID = 0
         self.State = 0
         self.TurnNum = 0
         self.TurnMax = 0
@@ -48510,6 +48513,7 @@
         length += self.Head.GetLength()
         length += 4
         length += 2
+        length += 1
         length += 4
         length += 1
         length += 1
@@ -48524,7 +48528,8 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteDWORD(data, self.MapID)
         data = CommFunc.WriteWORD(data, self.FuncLineID)
-        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.TagType)
+        data = CommFunc.WriteDWORD(data, self.TagID)
         data = CommFunc.WriteBYTE(data, self.State)
         data = CommFunc.WriteBYTE(data, self.TurnNum)
         data = CommFunc.WriteBYTE(data, self.TurnMax)
@@ -48537,7 +48542,8 @@
                                 Head:%s,
                                 MapID:%d,
                                 FuncLineID:%d,
-                                PlayerID:%d,
+                                TagType:%d,
+                                TagID:%d,
                                 State:%d,
                                 TurnNum:%d,
                                 TurnMax:%d,
@@ -48548,7 +48554,8 @@
                                 self.Head.OutputString(),
                                 self.MapID,
                                 self.FuncLineID,
-                                self.PlayerID,
+                                self.TagType,
+                                self.TagID,
                                 self.State,
                                 self.TurnNum,
                                 self.TurnMax,
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py
index ffe290e..dd1dd52 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerTurnFight.py
@@ -43,19 +43,19 @@
     ## 回合战斗请求
     # @return: None-不允许战斗;非None-允许战斗,具体返回内容功能自己决定
     
-    mapID, funcLineID, tagPlayerID, valueList = dataMsg
+    mapID, funcLineID, tagType, tagID, valueList = dataMsg
     if mapID == ChConfig.Def_TFMapID_MineArea:
-        return GameWorldMineArea.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList)
+        return GameWorldMineArea.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagID, valueList)
     
     return
 
 def __OnTurnFightOver(curPlayer, dataMsg):
     ## 回合战斗结束
     
-    mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList = dataMsg
+    mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList = dataMsg
     
     if mapID == ChConfig.Def_TFMapID_MineArea:
-        return GameWorldMineArea.OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList)
+        return GameWorldMineArea.OnTurnFightOver(curPlayer, mapID, funcLineID, tagID, valueList, fightRet, awardItemList)
         
     return
 
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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index fab0924..0f059cf 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1881,9 +1881,8 @@
 Def_FBMapID_Love = 31300
 
 #回合战斗自定义地图ID
-TurnFightMapIDList = (
-Def_TFMapID_MineArea, # 福地 1
-) = range(1, 1 + 1)
+Def_TFMapID_MineArea = 1 # 福地 1
+Def_TFMapID_Adventure = 5000 # 冒险
 
 #回合战斗自定义地图需要发送GameServer的列表
 Def_TFMapID_SendToGameServer = [Def_TFMapID_MineArea]
@@ -2019,6 +2018,7 @@
                 'Love':[Def_FBMapID_Love],#情缘副本
                 'CrossBattlefield':[Def_FBMapID_CrossBattlefield], #跨服战场
                 'MineArea':[Def_TFMapID_MineArea], #福地
+                'Adventure':[Def_TFMapID_Adventure], #冒险
                 }
 
 #特殊副本ID, 由系统分配, 进入时候不验证IsMapCopyFull
@@ -3093,6 +3093,11 @@
 
 Def_PerTurnTick = 1000 # 每回合等同于常规tick时长
 
+# 回合战斗目标类型
+TurnBattle_TagType_NPC = 0
+TurnBattle_TagType_Player = 1
+TurnBattle_TagType_Team = 2
+
 #---Obj字典-------
 Def_Obj_Dict_Faction = 'Faction' # 所属阵营
 Def_Obj_Dict_TurnFightID = 'TurnFightID' # 回合制战斗所属玩家ID
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 57a4778..5e54f8c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -20950,7 +20950,8 @@
     Head = tagHead()
     MapID = 0    #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
     FuncLineID = 0    #(WORD FuncLineID)
-    PlayerID = 0    #(DWORD PlayerID)// 战斗目标玩家ID,可为0,某些功能可能有用,如竞技场
+    TagType = 0    #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
+    TagID = 0    #(DWORD TagID)// 战斗目标类型对应的ID
     ValueCount = 0    #(BYTE ValueCount)
     ValueList = list()    #(vector<DWORD> ValueList)// 附加值列表,可选,具体含义由MapID决定
     data = None
@@ -20966,7 +20967,8 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.ValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         for i in range(self.ValueCount):
             value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
@@ -20980,7 +20982,8 @@
         self.Head.SubCmd = 0x10
         self.MapID = 0
         self.FuncLineID = 0
-        self.PlayerID = 0
+        self.TagType = 0
+        self.TagID = 0
         self.ValueCount = 0
         self.ValueList = list()
         return
@@ -20990,6 +20993,7 @@
         length += self.Head.GetLength()
         length += 4
         length += 2
+        length += 1
         length += 4
         length += 1
         length += 4 * self.ValueCount
@@ -21001,7 +21005,8 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteDWORD(data, self.MapID)
         data = CommFunc.WriteWORD(data, self.FuncLineID)
-        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.TagType)
+        data = CommFunc.WriteDWORD(data, self.TagID)
         data = CommFunc.WriteBYTE(data, self.ValueCount)
         for i in range(self.ValueCount):
             data = CommFunc.WriteDWORD(data, self.ValueList[i])
@@ -21012,7 +21017,8 @@
                                 Head:%s,
                                 MapID:%d,
                                 FuncLineID:%d,
-                                PlayerID:%d,
+                                TagType:%d,
+                                TagID:%d,
                                 ValueCount:%d,
                                 ValueList:%s
                                 '''\
@@ -21020,7 +21026,8 @@
                                 self.Head.OutputString(),
                                 self.MapID,
                                 self.FuncLineID,
-                                self.PlayerID,
+                                self.TagType,
+                                self.TagID,
                                 self.ValueCount,
                                 "..."
                                 )
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index 78040d1..fed3780 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -48463,7 +48463,8 @@
     Head = tagHead()
     MapID = 0    #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
     FuncLineID = 0    #(WORD FuncLineID)
-    PlayerID = 0    #(DWORD PlayerID)// 对应玩家ID,可为0,某些功能可能有用,如竞技场
+    TagType = 0    #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
+    TagID = 0    #(DWORD TagID)// 战斗目标类型对应的ID
     State = 0    #(BYTE State)// 0-起始状态标记;1-准备完毕;2-战斗中;3-战斗结束;4-结算奖励;5-结束状态标记
     TurnNum = 0    #(BYTE TurnNum)// 当前轮次
     TurnMax = 0    #(BYTE TurnMax)// 最大轮次
@@ -48482,7 +48483,8 @@
         _pos = self.Head.ReadData(_lpData, _pos)
         self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
-        self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
+        self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
         self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.TurnNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
         self.TurnMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
@@ -48497,7 +48499,8 @@
         self.Head.SubCmd = 0x20
         self.MapID = 0
         self.FuncLineID = 0
-        self.PlayerID = 0
+        self.TagType = 0
+        self.TagID = 0
         self.State = 0
         self.TurnNum = 0
         self.TurnMax = 0
@@ -48510,6 +48513,7 @@
         length += self.Head.GetLength()
         length += 4
         length += 2
+        length += 1
         length += 4
         length += 1
         length += 1
@@ -48524,7 +48528,8 @@
         data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
         data = CommFunc.WriteDWORD(data, self.MapID)
         data = CommFunc.WriteWORD(data, self.FuncLineID)
-        data = CommFunc.WriteDWORD(data, self.PlayerID)
+        data = CommFunc.WriteBYTE(data, self.TagType)
+        data = CommFunc.WriteDWORD(data, self.TagID)
         data = CommFunc.WriteBYTE(data, self.State)
         data = CommFunc.WriteBYTE(data, self.TurnNum)
         data = CommFunc.WriteBYTE(data, self.TurnMax)
@@ -48537,7 +48542,8 @@
                                 Head:%s,
                                 MapID:%d,
                                 FuncLineID:%d,
-                                PlayerID:%d,
+                                TagType:%d,
+                                TagID:%d,
                                 State:%d,
                                 TurnNum:%d,
                                 TurnMax:%d,
@@ -48548,7 +48554,8 @@
                                 self.Head.OutputString(),
                                 self.MapID,
                                 self.FuncLineID,
-                                self.PlayerID,
+                                self.TagType,
+                                self.TagID,
                                 self.State,
                                 self.TurnNum,
                                 self.TurnMax,
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
index ca0555f..3422f9a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -2424,7 +2424,7 @@
         return False
     return callFunc(curPlayer)
 
-def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
+def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
     ## 回合战斗请求 - 地图验证
     # @return: 是否允许
     do_FBLogic_ID = __GetFBLogic_MapID(mapID)
@@ -2435,12 +2435,11 @@
         # 默认不限制
         return True
     
-    return callFunc(curPlayer, mapID, funcLineID, tagPlayerID, valueList)
+    return callFunc(curPlayer, mapID, funcLineID, tagType, tagID, valueList)
 
-def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet):
+def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
     ## 回合战斗结束
-    # @return: 是否需要同步GameServer, 奖励列表, 发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
-    # @return: None - 无结算逻辑,可走TurnAttack模块通用逻辑
+    # @return: 是否需要同步GameServer, 奖励列表
     
     do_FBLogic_ID = __GetFBLogic_MapID(mapID)
     
@@ -2449,9 +2448,9 @@
     if callFunc == None:
         return
     
-    return callFunc(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet)
+    return callFunc(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet)
 
-def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret):
+def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret):
     ## 回合战斗结束 - GameServer处理完毕返回
     
     do_FBLogic_ID = __GetFBLogic_MapID(mapID)
@@ -2461,6 +2460,6 @@
     if callFunc == None:
         return
     
-    return callFunc(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret)
+    return callFunc(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret)
 
     
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
index ca6d134..eab588f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -33,6 +33,7 @@
 import ItemControler
 import PlayerSuccess
 import GameFuncComm
+import PlayerTask
 import PyGameData
 import PlayerVip
 import GameObj
@@ -1719,6 +1720,23 @@
     NotifyFBCntRegainInfo(curPlayer, [mapID])
     return
 
+def OnFBOver(curPlayer, mapID, funcLineID, isWin, awardItemList):
+    ## 副本结束通用逻辑
+    
+    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID])
+    if not isWin:
+        return
+    
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
+    Sync_FBPlayerFBInfoData(curPlayer, mapID)
+    
+    GameWorld.DebugLog("奖励物品: %s" % awardItemList)
+    if awardItemList:
+        ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FBPass_%s" % mapID, False, {"mapID":mapID, "funcLineID":funcLineID}])
+    return
+
 def RegainFBCntProcess(curPlayer):
     ## 按时间恢复副本次数
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Adventure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Adventure.py
new file mode 100644
index 0000000..b7867c0
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Adventure.py
@@ -0,0 +1,62 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GameWorldLogic.FBProcess.GameLogic_Adventure
+#
+# @todo:冒险关卡
+# @author hxp
+# @date 2024-05-10
+# @version 1.0
+#
+# 详细描述: 冒险关卡
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2024-05-10 17:00"""
+#-------------------------------------------------------------------------------
+
+import ChConfig
+import IpyGameDataPY
+import GameWorld
+import FBCommon
+
+def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
+    ## 回合战斗请求 - 地图验证
+    
+    # 只能一关关挑战
+    passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
+    if funcLineID != passLineID + 1:
+        GameWorld.ErrLog("冒险关卡只能挑战下一关! funcLineID=%s,passLineID=%s,nextLineID=%s" 
+                         % (funcLineID, passLineID, passLineID + 1), curPlayer.GetPlayerID())
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("Adventure", funcLineID)
+    if not ipyData:
+        return
+    
+    bossID = ipyData.GetNPCID()
+    if tagID != bossID or tagType != ChConfig.TurnBattle_TagType_NPC:
+        GameWorld.ErrLog("冒险关卡目标bossID错误,无法挑战! funcLineID=%s,bossID=%s,tagType=%s,tagID=%s" 
+                         % (funcLineID, bossID, tagType, tagID), curPlayer.GetPlayerID())
+        return
+    
+    return True
+
+def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
+    ## 回合战斗结束
+    # @return: 是否需要同步GameServer, 奖励列表
+    needSendGameServer = False
+    awardItemList = []
+    isWin = fightRet[0]
+    
+    GameWorld.DebugLog("冒险关卡结算: funcLineID=%s,isWin=%s" % (funcLineID, isWin))
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("Adventure", funcLineID)
+    if not ipyData:
+        return needSendGameServer, awardItemList
+    
+    if isWin:
+        awardItemList = ipyData.GetAwardItemList()
+        
+    FBCommon.OnFBOver(curPlayer, mapID, funcLineID, isWin, awardItemList)
+    return needSendGameServer, awardItemList
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py
index 33397f8..8de5fbc 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MineArea.py
@@ -21,12 +21,16 @@
 import PlayerControl
 import GameWorld
 
-def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
+def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
     ## 回合战斗请求 - 地图验证
+    
+    if tagType != ChConfig.TurnBattle_TagType_Player:
+        GameWorld.DebugLog("请求回合战斗目标异常! mapID=%s,tagType=%s,tagID=%s" % (mapID, tagType, tagID), curPlayer.GetPlayerID())
+        return
     
     # 摇人帮助
     if funcLineID == 0:
-        if not tagPlayerID:
+        if not tagID:
             return
         awardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHelpAwardCount)
         awardCountMax = IpyGameDataPY.GetFuncCfg("MineAreaHelp", 1)
@@ -42,27 +46,29 @@
     
     return True
 
-def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet):
+def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
     ## 回合战斗结束
-    # @return: 是否需要同步GameServer, 奖励列表, 发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
+    # @return: 是否需要同步GameServer, 奖励列表
+    needSendGameServer = True
+    awardItemList = []
     
     # 摇人帮助
     if funcLineID == 0:
         # 无论胜负都要同步GameServer汇报结果
         isWin = fightRet[0]
         if not isWin:
-            return True, [], 0
+            return needSendGameServer, awardItemList
         
         awardItemList = IpyGameDataPY.GetFuncEvalCfg("MineAreaHelp", 2)
-        return True, awardItemList, 2
+        return needSendGameServer, awardItemList
     
     # 自己驱赶
     elif funcLineID == 1:
-        return True, [], 0
+        return needSendGameServer, awardItemList
     
     return
 
-def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret):
+def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret):
     ## 回合战斗结束 - GameServer处理完毕返回
     
     # 摇人帮助
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
index 7625b6d..e4658f8 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
@@ -368,8 +368,6 @@
         return
     
     if ipyData.GetIsNotify():
-        #IPY_Data = IpyGameDataPY.IPY_Data()
-        #maxLevel = IPY_Data.GetRuneTowerByIndex(IPY_Data.GetRuneTowerCount()-1).GetID()
         sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172'
         PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID])
     #更新关卡
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py
index 2a292a0..efd989d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_TrialTower.py
@@ -44,32 +44,6 @@
 import math
 
 g_runeTypeDict = {}
-FBDict_Level = 'FBDict_Level'   # 副本关卡
-
-
-# 副本通用配置
-(
-Def_PrepareTime, # 每关准备时间,秒
-Def_FightTime, # 每关战斗时间,秒
-Def_ExitTime, # 退出时间, 秒
-Def_DayPrizeMaxCnt, #每日奖励最多累积几天(配0则无限)
-) = range(4)
-
-
-
-
-# 副本状态
-(
-FB_State_Open, # 副本开启
-FB_State_FightPrepare, # 战斗准备时间
-FB_State_Fighting, # 战斗
-FB_State_FreeTime, # 活动结束准备(胜利/失败)
-FB_State_Close, # 关闭副本
-) = range(5)
-
-
-## 符印塔配置
-def __GetTrialCfg(): return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_TrialTower)
 
 def GetTowerIpyData(level):
     return IpyGameDataPY.GetIpyGameData('RuneTower', level)
@@ -110,99 +84,6 @@
     GameWorld.DebugLog(' 更新符印塔已通关数 %s' % passlv)
     return
 
-## 是否可进入
-#  @param curPlayer
-#  @param mapID 地图ID
-#  @param lineId 分线ID
-#  @param tick
-#  @return 是否可进入
-def OnEnterFBEvent(curPlayer, mapID, lineId, tick):    
-    return True
-
-
-## 检查可否进行挑战
-def __CheckCanChallenge(curPlayer, fbLevel):
-    playerID = curPlayer.GetPlayerID()
-    ipyData = GetTowerIpyData(fbLevel)
-    
-    if not ipyData:
-        GameWorld.ErrLog("符印塔关卡(%s)不存在" % (fbLevel), playerID)
-        return False
-    
-    # 是否已过关
-    if fbLevel <= __GetTrialLevelCurPassLV(curPlayer):
-        GameWorld.DebugLog("符印塔本关(%s)已过关, 无法挑战!" % fbLevel, playerID)
-        return False
-    
-    return True
-
-
-##副本玩家进入点
-# @param curPlayer 玩家实例
-# @param mapID 地图ID
-# @param lineId 分线ID
-# @param ipyEnterPosInfo 功能线路IPY配置坐标信息
-# @param tick 时间戳
-# @return posX, posY, 随机半径(可选)
-def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
-    return ipyEnterPosInfo
-
-
-## 是否可以进入
-#  @param ask 请求信息
-#  @param tick
-#  @return 回复是否通过请求
-def OnChangeMapAsk(ask, tick):
-    return IPY_GameWorld.cmeAccept
-
-## 进副本
-#  @param curPlayer
-#  @param tick
-#  @return None
-def DoEnterFB(curPlayer, tick):
-    # 不做处理,有副本行为客户端发包选择挑战关卡
-    EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_TrialTower, 0, ChConfig.CME_Log_Start)
-    return
-
-
-## 副本时间到关闭
-#  @param tick 当前时间
-#  @return None
-#  @remarks 函数详细说明.
-def OnCloseFB(tick):
-    return
-
-
-##玩家退出副本.
-# @param curPlayer 玩家实例
-# @param tick 时间戳
-# @return 返回值无意义
-# @remarks 玩家主动离开副本.
-def DoExitFB(curPlayer, tick):
-    # 玩家退出默认关闭副本
-    #GameWorldProcess.CloseFB(tick)
-    return
-
-
-##副本总逻辑计时器
-# @param tick 时间戳
-# @return 无意义
-# @remarks 副本总逻辑计时器
-def OnProcess(tick):
-    gameFB = GameWorld.GetGameFB()
-    fbStep = gameFB.GetFBStep()
-    
-    if fbStep == FB_State_FightPrepare:
-        __DoLogic_FightPrepare(tick)
-    elif fbStep == FB_State_Fighting:
-        __DoLogic_Fighting(tick)
-    elif fbStep == FB_State_FreeTime:
-        __DoLogic_FreeTime(tick)
-    elif fbStep == FB_State_Close:
-        pass
-    
-    return
-
 ## 获取BossID
 def __GetTrialBossID(fbLevel= -1):
     gameFB = GameWorld.GetGameFB()
@@ -215,92 +96,6 @@
         return 0
     return ipyData.GetNPCID()
 
-##战斗准备时间
-# @param tick  时钟
-# @return 无意义
-def __DoLogic_FightPrepare(tick):
-    gameFB = GameWorld.GetGameFB()
-    
-    trialCfg = __GetTrialCfg()
-    if tick - gameFB.GetFBStepTick() < trialCfg[Def_PrepareTime] * 1000:
-        return
-    
-    bossID = __GetTrialBossID()
-    if not bossID:
-        FBCommon.DoLogic_FBKickAllPlayer()
-        return
-    
-    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, trialCfg[Def_FightTime] * 1000)
-    
-    NPCCustomRefresh.SetNPCRefresh(FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_TrialTower, 0), [bossID])
-    
-    #转入战斗
-    FBCommon.SetFBStep(FB_State_Fighting, tick)
-    return
-
-## 开始副本关卡
-def StartFBLevel(curPlayer, fbLevel, tick):
-    
-    if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
-        GameWorld.DebugLog("复活玩家...", curPlayer.GetPlayerID())
-        ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_City, tick)
-    GameObj.SetHPFull(curPlayer)
-    FBCommon.ClearFBNPC()
-    
-    gameFB = GameWorld.GetGameFB()
-    gameFB.SetGameFBDict(FBDict_Level, fbLevel)
-    
-    prepareTick = __GetTrialCfg()[Def_PrepareTime] * 1000
-    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttAddUpTime, prepareTick)
-    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick)
-    FBCommon.SetFBStep(FB_State_FightPrepare, tick)
-    helpDict = {FBCommon.Help_wheel:fbLevel}
-    FBCommon.Notify_FBHelp(curPlayer, helpDict)
-    GameWorld.DebugLog("StartFBLevel, fbLevel=%s, helpDict=%s" 
-                       % (fbLevel, str(helpDict)), curPlayer.GetPlayerID())
-    return
-
-
-##战斗时间
-# @param tick  时钟
-# @return 无意义
-def __DoLogic_Fighting(tick):
-    gameFB = GameWorld.GetGameFB()
-    
-    #判断时间结束
-    if tick - gameFB.GetFBStepTick() < __GetTrialCfg()[Def_FightTime] * 1000:
-        return
-    
-    fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
-    playerManager = GameWorld.GetMapCopyPlayerManager()
-    for index in xrange(playerManager.GetPlayerCount()):
-        curPlayer = playerManager.GetPlayerByIndex(index)
-        if not curPlayer:
-            continue
-        __SendTrialTowerOverInfo(curPlayer, fbLevel, False)
-    
-    #游戏结束
-    __SetFBToFreeTime(tick)
-    return
-
-##设置副本进入离开状态
-# @param tick  时钟
-# @return 无意义
-def __SetFBToFreeTime(tick):
-    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, __GetTrialCfg()[Def_ExitTime] * 1000)
-    FBCommon.SetFBStep(FB_State_FreeTime, tick)
-    return
-
-##比赛结束的空闲时间
-# @param tick  时钟
-# @return 无意义
-# @remarks 比赛结束的空闲时间
-def __DoLogic_FreeTime(tick):
-    if tick - GameWorld.GetGameFB().GetFBStepTick() < __GetTrialCfg()[Def_ExitTime] * 1000:
-        return
-    
-    #FBCommon.DoLogic_FBKickAllPlayer()
-    return
 
 ## 杀怪
 #  @param curPlayer
@@ -473,64 +268,6 @@
     FBCommon.Notify_FB_Over(curPlayer, overDict)
     return
 
-
-## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
-#  @param attacker 攻击方
-#  @param defender 防守方
-#  @return bool
-def CheckCanAttackTagObjInFB(attacker, defender):
-    gameFB = GameWorld.GetGameFB()
-    if gameFB.GetFBStep() != FB_State_Fighting:
-        return False
-    return True
-
-##玩家死亡.
-# @param curPlayer:死亡的玩家 
-# @param tick 时间戳
-# @return 返回值无意义
-# @remarks 玩家主动离开副本.
-def DoPlayerDead(curPlayer):
-    gameFB = GameWorld.GetGameFB()
-    fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
-    __SendTrialTowerOverInfo(curPlayer, fbLevel, False)
-    tick = GameWorld.GetGameWorld().GetTick()
-    #游戏结束
-    __SetFBToFreeTime(tick)
-    return
-
-## 是否副本复活
-#  @param None
-#  @return 是否副本复活
-def OnPlayerReborn():
-    return True
-
-## 副本行为
-#  @param curPlayer 玩家
-#  @param actionType 行为类型
-#  @param actionInfo 行为信息
-#  @param tick 当前时间
-#  @return None
-def DoFBAction(curPlayer, actionType, actionInfo, tick):
-    # 默认为选择关卡,由客户端决定,进场及副本选关通用此行为
-    if actionInfo <= 0:
-        return
-    
-    gameFB = GameWorld.GetGameFB()
-    fbStep = gameFB.GetFBStep()
-    
-    if fbStep in [FB_State_FightPrepare, FB_State_Fighting]:
-        GameWorld.DebugLog("准备或战斗中, 无法变更关卡!")
-        return
-    
-    fbLevel = actionInfo
-    if not __CheckCanChallenge(curPlayer, fbLevel):
-        FBCommon.DoLogic_FBKickAllPlayer()
-        return
-    
-    StartFBLevel(curPlayer, fbLevel, tick)
-    return
-
-
 def GetRuneTypeByTowerLV(towerLV):
     #获取关卡可掉落符印类型
     towerRuneTypeDict = IpyGameDataPY.GetFuncEvalCfg('TowerRuneType')
@@ -659,4 +396,40 @@
     #BOSS复活活动
     PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_TowerSweep, 1)
     PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_TowerSweep, 1)
-    return True
\ No newline at end of file
+    return True
+
+
+def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
+    ## 回合战斗请求 - 地图验证
+    
+    playerID = curPlayer.GetPlayerID()
+    ipyData = GetTowerIpyData(funcLineID)
+    
+    if not ipyData:
+        GameWorld.ErrLog("符印塔关卡不存在: funcLineID=%s" % (funcLineID), playerID)
+        return False
+    
+    # 是否已过关
+    if funcLineID <= __GetTrialLevelCurPassLV(curPlayer):
+        GameWorld.DebugLog("符印塔本关已过关, 无法挑战! funcLineID=%s" % funcLineID, playerID)
+        return False
+    
+    return True
+
+def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet):
+    ## 回合战斗结束
+    # @return: 是否需要同步GameServer, 奖励列表, 发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
+    
+    needSendGameServer = False
+    awardItemList = []
+    awardWay = 2
+    
+    isWin = fightRet[0]
+    if not isWin:
+        return needSendGameServer, awardItemList, awardWay
+    
+    return needSendGameServer, awardItemList, awardWay
+
+    
+    return
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 414765e..f823162 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -522,6 +522,10 @@
                         ("DWORD", "AtkBackDefRate", 0),
                         ("DWORD", "SuckHPPer", 0),
                         ("DWORD", "SuckHPDefPer", 0),
+                        ("dict", "SpecAttrInfo", 0),
+                        ("list", "PetNPCIDList", 0),
+                        ("list", "ElfSkillIDList", 0),
+                        ("list", "STSkillIDList", 0),
                         ),
 
                 "NPCRealmStrengthen":(
@@ -689,6 +693,12 @@
                         ("dict", "SweepGoodDrop", 0),
                         ),
 
+                "Adventure":(
+                        ("WORD", "LineID", 1),
+                        ("DWORD", "NPCID", 0),
+                        ("list", "AwardItemList", 0),
+                        ),
+
                 "ChinMap":(
                         ("DWORD", "MapID", 1),
                         ("BYTE", "CanRide", 0),
@@ -730,17 +740,6 @@
                         ("eval", "RefreshNPC", 0),
                         ("eval", "GradeInfo", 0),
                         ("eval", "RewardInfo", 0),
-                        ),
-
-                "FBTurn":(
-                        ("DWORD", "DataMapID", 1),
-                        ("WORD", "LineID", 1),
-                        ("DWORD", "NPCID", 0),
-                        ("list", "PetNPCIDList", 0),
-                        ("list", "ElfSkillIDList", 0),
-                        ("list", "STSkillIDList", 0),
-                        ("list", "AwardItemListFirst", 0),
-                        ("list", "AwardItemList", 0),
                         ),
 
                 "FBHelpBattle":(
@@ -3010,7 +3009,11 @@
     def GetAtkBackRate(self): return self.attrTuple[16] # 反击概率 DWORD
     def GetAtkBackDefRate(self): return self.attrTuple[17] # 抗反击概率 DWORD
     def GetSuckHPPer(self): return self.attrTuple[18] # 吸血比率 DWORD
-    def GetSuckHPDefPer(self): return self.attrTuple[19] # 抗吸血比率 DWORD
+    def GetSuckHPDefPer(self): return self.attrTuple[19] # 抗吸血比率 DWORD
+    def GetSpecAttrInfo(self): return self.attrTuple[20] # 特殊属性信息 {"属性ID":值, ...} dict
+    def GetPetNPCIDList(self): return self.attrTuple[21] # 回合战斗灵宠NPCID列表 list
+    def GetElfSkillIDList(self): return self.attrTuple[22] # 回合战斗精怪技能ID列表 list
+    def GetSTSkillIDList(self): return self.attrTuple[23] # 回合战斗神通技能ID列表 list
 
 # 成长型境界怪物表
 class IPY_NPCRealmStrengthen():
@@ -3227,6 +3230,17 @@
     def GetSweepYsog(self): return self.attrTuple[8] # 扫荡魔精 DWORD
     def GetSweepGoodDrop(self): return self.attrTuple[9] # 扫荡珍稀符印 dict
 
+# 冒险关卡表
+class IPY_Adventure():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetLineID(self): return self.attrTuple[0] # 功能线路ID WORD
+    def GetNPCID(self): return self.attrTuple[1] # NPCID DWORD
+    def GetAwardItemList(self): return self.attrTuple[2] # 过关奖励列表[[物品ID,个数,是否拍品], ...] list
+
 # 地图表格
 class IPY_ChinMap():
     
@@ -3284,22 +3298,6 @@
     def GetRefreshNPC(self): return self.attrTuple[13] # 标试点刷怪配置 eval
     def GetGradeInfo(self): return self.attrTuple[14] # 评级规则 eval
     def GetRewardInfo(self): return self.attrTuple[15] # 奖励信息 eval
-
-# 副本回合制表
-class IPY_FBTurn():
-    
-    def __init__(self):
-        self.attrTuple = None
-        return
-        
-    def GetDataMapID(self): return self.attrTuple[0] # 数据地图ID DWORD
-    def GetLineID(self): return self.attrTuple[1] # 功能线路ID WORD
-    def GetNPCID(self): return self.attrTuple[2] # NPCID DWORD
-    def GetPetNPCIDList(self): return self.attrTuple[3] # 灵宠NPCID列表 list
-    def GetElfSkillIDList(self): return self.attrTuple[4] # 精怪技能ID列表 list
-    def GetSTSkillIDList(self): return self.attrTuple[5] # 神通技能ID列表 list
-    def GetAwardItemListFirst(self): return self.attrTuple[6] # 首次过关奖励列表[[物品ID,个数,是否拍品], ...] list
-    def GetAwardItemList(self): return self.attrTuple[7] # 再次过关奖励列表[[物品ID,个数,是否拍品], ...] list
 
 # 副本助战表
 class IPY_FBHelpBattle():
@@ -5789,10 +5787,10 @@
         self.__LoadFileData("FightPowerParam", onlyCheck)
         self.__LoadFileData("NPCDropItem", onlyCheck)
         self.__LoadFileData("RuneTower", onlyCheck)
+        self.__LoadFileData("Adventure", onlyCheck)
         self.__LoadFileData("ChinMap", onlyCheck)
         self.__LoadFileData("FBFunc", onlyCheck)
         self.__LoadFileData("FBLine", onlyCheck)
-        self.__LoadFileData("FBTurn", onlyCheck)
         self.__LoadFileData("FBHelpBattle", onlyCheck)
         self.__LoadFileData("NPCCustomRefresh", onlyCheck)
         self.__LoadFileData("DailyAction", onlyCheck)
@@ -6564,6 +6562,13 @@
         self.CheckLoadData("RuneTower")
         return self.ipyRuneTowerCache[index]
 
+    def GetAdventureCount(self):
+        self.CheckLoadData("Adventure")
+        return self.ipyAdventureLen
+    def GetAdventureByIndex(self, index):
+        self.CheckLoadData("Adventure")
+        return self.ipyAdventureCache[index]
+
     def GetChinMapCount(self):
         self.CheckLoadData("ChinMap")
         return self.ipyChinMapLen
@@ -6584,13 +6589,6 @@
     def GetFBLineByIndex(self, index):
         self.CheckLoadData("FBLine")
         return self.ipyFBLineCache[index]
-
-    def GetFBTurnCount(self):
-        self.CheckLoadData("FBTurn")
-        return self.ipyFBTurnLen
-    def GetFBTurnByIndex(self, index):
-        self.CheckLoadData("FBTurn")
-        return self.ipyFBTurnCache[index]
 
     def GetFBHelpBattleCount(self):
         self.CheckLoadData("FBHelpBattle")

--
Gitblit v1.8.0