From 067c557365c6a749f6f41f5d8cad8ce9e941c80f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 14 十月 2025 18:07:18 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_ServerCode

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py |  103 ++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 80 insertions(+), 23 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 06c2a8d..53167bd 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -36,6 +36,7 @@
 import TurnPassive
 import TurnSkill
 import TurnBuff
+import FBCommon
 import CommFunc
 import ObjPool
 import FBLogic
@@ -73,6 +74,7 @@
         self.lingshouObjIDDict = {} # 灵兽战斗单位 {位置编号:batObjID, ...}
         self.beautyObjIDDict = {} # 红颜战斗单位 {位置编号:batObjID, ...}
         self.actionNum = ActionNumStart # 行动位置,从1开始
+        self.totalHurt = 0 # 阵容总输出
         return
     
     def getPlayerID(self): return self.turnFight.playerID # 发起的玩家ID
@@ -102,6 +104,7 @@
         self.lingshouObjIDDict = {}
         self.beautyObjIDDict = {}
         self.fightPower = 0
+        self.totalHurt = 0
         return
     
 class BatFaction():
@@ -111,6 +114,7 @@
         self.turnFight = turnFight # TurnFight
         self.faction = faction
         self.lineupDict = {} # 该阵营所有阵容信息 {编号:BatLineup, ...}
+        self.totalHurt = 0 # 阵营总输出
         return
     
     def getBatlineup(self, num=1):
@@ -122,6 +126,8 @@
             lineup = BatLineup(self.faction, num, self.turnFight)
             self.lineupDict[num] = lineup
         return lineup
+    
+    def getTotalHurt(self): return self.totalHurt # 阵营总输出
     
     def clearLineups(self):
         ## 清除所有战斗阵容
@@ -155,6 +161,7 @@
         self.batBuffer = "" # 战报buffer,战报暂时只保留最后一个小队的
         self.isNeedReport = isNeedReport # 是否需要战报
         self.msgDict = {} # 扩展信息字典,一般由MapID绑定的功能决定信息内容  {k:v, ...}
+        self._kvDict = {} # 自定义信息字典,不会被重置  {k:v, ...}
         
         self.factionDict = {} # 战斗阵营 {faction:BatFaction, ...},一般是只有两个阵营,faction为1或2,每个阵营支持多个阵容
         self.actionSortList = [] # 阵容行动顺序 [[faction, num], ...]
@@ -184,6 +191,7 @@
         self.setPVE()
         self.setPVP()
         self.msgDict = {}
+        self._kvDict = {}
         self.nextTurnFight(msgDict)
         return
     
@@ -199,10 +207,17 @@
         self.tagViewCache = tagViewCache
         return
     
+    def isFBMap(self):
+        ## 是否副本地图中,非主线的均视为副本
+        return self.mapID not in [ChConfig.Def_FBMapID_Main, ChConfig.Def_FBMapID_MainBoss]
+    
+    def GetDictByKey(self, key): return self._kvDict.get(key, 0)
+    def SetDict(self, key, value): self._kvDict[key] = value
+    
     #def setPVPTeam(self):
     #    return
     
-    def nextTurnFight(self, msgDict={}, resetByNextTeam=False):
+    def nextTurnFight(self, msgDict={}):
         ## 一般用于玩家发起的战斗,在需要保留玩家阵容属性及状态的情况下,重置回合进入下一场战斗
         self.turnNum = 1
         self.enterLogic = False
@@ -212,8 +227,7 @@
         self.timeline = 0
         self.startTime = time.time()
         self.costTime = 0
-        if resetByNextTeam:
-            ResetByNextTeam(self)
+        ResetByNextTeam(self)
         return
     
     def haveNextLineup(self):
@@ -381,6 +395,11 @@
             clientPack.FactionList.append(tfFaction)
         clientPack.FactionCnt = len(clientPack.FactionList)
         self.addBatPack(clientPack)
+        return
+    
+    def syncHelp(self, msgDict):
+        ## 通知帮助信息,一般是副本用
+        self.syncState(self.state, msgDict)
         return
     
     def syncState(self, state, msgDict={}):
@@ -732,7 +751,8 @@
         if not curPlayer:
             return
         
-    tfGUID = batLineup.turnFight.guid
+    turnFight = batLineup.turnFight
+    tfGUID = turnFight.guid
     lineupPlayerID = lineupInfo.get("PlayerID", 0) # 阵容所属玩家ID
     heroDict = lineupInfo.get("Hero", {})
     
@@ -800,6 +820,12 @@
             
         batLineup.posObjIDDict[posNum] = objID
         GameWorld.DebugLog("AddBatObj %s,skill=%s" % (GetObjName(batObj), skillManager.GetSkillIDList()))
+        if npcID:
+            #副本指定NPC属性
+            fbNPCInitAttrDict = FBLogic.GetFBNPCInitAttr(curPlayer, turnFight, batObj)
+            if fbNPCInitAttrDict:
+                GameWorld.DebugLog("副本指定NPC初始化属性: npcID=%s, %s" % (npcID, fbNPCInitAttrDict))
+                attrDict = {str(k):v for k, v in fbNPCInitAttrDict.items()} # 统一格式
         batObj.InitBatAttr({int(k):v for k, v in attrDict.items()}, initXP)
         
     return
@@ -862,6 +888,15 @@
     GameWorld.DebugLog("回合制战斗请求: mapID=%s,funcLineID=%s,tagType=%s,tagID=%s,valueList=%s" 
                        % (mapID, funcLineID, tagType, tagID, valueList), curPlayer.GetPlayerID())
     
+    fbIpyData = FBCommon.GetFBIpyData(mapID)
+    fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, funcLineID, False)
+    if fbIpyData:
+        if not fbLineIpyData:
+            GameWorld.DebugLog("不存在该副本功能线路! mapID=%s,funcLineID=%s" % (mapID, funcLineID))
+            return
+        if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, funcLineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK:
+            return
+        
     reqRet = FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList)
     if not reqRet:
         return
@@ -877,10 +912,17 @@
         
     # NPC
     else:
-        ret = FBLogic.GetFBNPCLineupInfo(curPlayer, mapID, funcLineID)
-        if not ret:
-            return
-        npcLineupIDList, strongerLV, difficulty = ret
+        npcLineupIDList, strongerLV, difficulty = [], 0, 0
+        if fbLineIpyData:
+            npcLineupIDList = fbLineIpyData.GetLineupIDList()
+            strongerLV = fbLineIpyData.GetNPCLV()
+            difficulty = fbLineIpyData.GetDifficulty()
+            
+        if not npcLineupIDList:
+            ret = FBLogic.GetFBNPCLineupInfo(curPlayer, mapID, funcLineID)
+            if not ret:
+                return
+            npcLineupIDList, strongerLV, difficulty = ret
         OnTurnFightVSNPC(curPlayer, mapID, funcLineID, atkLineupID, npcLineupIDList, strongerLV, difficulty)
         
     return
@@ -917,7 +959,7 @@
         turnFight.lineupIndex = index
         GameWorld.DebugLog("对战NPC阵容: index=%s, lineupID=%s" % (index, lineupID))
         if index > 0:
-            turnFight.nextTurnFight(resetByNextTeam=True)
+            turnFight.nextTurnFight()
         turnFight.setFactionLineup(ChConfig.Def_FactionB, {1:GetNPCLineupInfo(lineupID, strongerLV, difficulty)})
         turnFight.sortActionQueue()
         turnFight.startFight()
@@ -996,7 +1038,7 @@
         __doSetFightPoint(curPlayer, reqValue)
         return
     
-    GameWorld.DebugLog("主线战斗请求: reqType=%s" % reqType, curPlayer.GetPlayerID())
+    GameWorld.DebugLog("------------------- 主线战斗请求: reqType=%s" % reqType, curPlayer.GetPlayerID())
     clientPack = ChPyNetSendPack.tagSCTurnFightReportSign()
     clientPack.Sign = 0
     NetPackCommon.SendFakePack(curPlayer, clientPack) # 标记开始
@@ -1135,7 +1177,7 @@
         if nextLineupID:
             GameWorld.DebugLog("---开始进入下一小队: lineupIndex=%s,nextLineupID=%s,%s" % (turnFight.lineupIndex, nextLineupID, turnFight.lineupIDList))
             
-            turnFight.nextTurnFight(resetByNextTeam=True)
+            turnFight.nextTurnFight()
             # 切换小队时,玩家阵容不需要处理,保留状态
             turnFight.setFactionLineup(ChConfig.Def_FactionB, {1:GetNPCLineupInfo(nextLineupID, turnFight.strongerLV, turnFight.difficulty)})
             turnFight.sortActionQueue()
@@ -1163,6 +1205,8 @@
     turnNum = turnFight.turnNum
     turnMax = turnFight.turnMax
     for turnNum in range(turnNum, turnMax + 1):
+        if turnFight.winFaction:
+            break
         turnTimeline = turnFight.getTurnNumStartTimelin(turnNum) # 本回合起始时间节点
         curTimeline = turnFight.getTimeline()
         
@@ -1187,13 +1231,13 @@
         # 红颜
         # 灵兽
         
-        if turnFight.checkOverByKilled():
+        if turnFight.winFaction:
             break
         
         # 武将
         doMax = PosNumMax * len(turnFight.actionSortList)
         doCnt = 0
-        while doCnt < doMax and turnFight.actionIndex < len(turnFight.actionSortList):
+        while doCnt < doMax and turnFight.actionIndex < len(turnFight.actionSortList) and not turnFight.winFaction:
             doCnt += 1
             faction, num = turnFight.actionSortList[turnFight.actionIndex]
             batFaction = turnFight.getBatFaction(faction)
@@ -1232,6 +1276,9 @@
             else:
                 turnFight.actionIndex += 1
                 
+        if turnFight.winFaction:
+            break
+        
         # 回合结束
         curTimeline = turnFight.setTimeline(curTimeline + 1) # 每回合结束算一个时间节点
         for faction, num in turnFight.actionSortList:
@@ -1242,9 +1289,6 @@
                 batObj = batObjMgr.getBatObj(objID)
                 TurnFightPerTurnBigEnd(turnFight, batObj, turnNum)
                 
-        if turnFight.checkOverByKilled():
-            break
-        
     if not turnFight.winFaction:
         OnTurnAllOver(turnFight.guid)
         
@@ -1258,6 +1302,8 @@
     EntryLogic(turnFight)
     batObjMgr = BattleObj.GetBatObjMgr()
     for turnNum in range(1, turnMax + 1):
+        if turnFight.winFaction:
+            break
         turnFight.turnNum = turnNum
         GameWorld.DebugLog("【----- 回合制战斗轮次: %s -----】" % turnNum)
         curTimeline = turnFight.getTurnNumStartTimelin(turnNum) # 本回合起始时间节点
@@ -1279,13 +1325,13 @@
         # 红颜
         # 灵兽
             
-        if turnFight.checkOverByKilled():
+        if turnFight.winFaction:
             break
         
         # 武将
         doMax = PosNumMax * len(turnFight.actionSortList)
         doCnt = 0
-        while doCnt < doMax and turnFight.actionIndex < len(turnFight.actionSortList):
+        while doCnt < doMax and turnFight.actionIndex < len(turnFight.actionSortList) and not turnFight.winFaction:
             doCnt += 1
             faction, num = turnFight.actionSortList[turnFight.actionIndex]
             batFaction = turnFight.getBatFaction(faction)
@@ -1309,6 +1355,9 @@
             else:
                 turnFight.actionIndex += 1
                 
+        if turnFight.winFaction:
+            break
+        
         # 回合结束
         curTimeline = turnFight.setTimeline(curTimeline + 1) # 每回合结束算一个时间节点
         for faction, num in turnFight.actionSortList:
@@ -1319,9 +1368,6 @@
                 batObj = batObjMgr.getBatObj(objID)
                 TurnFightPerTurnBigEnd(turnFight, batObj, turnNum)
                 
-        if turnFight.checkOverByKilled():
-            break
-        
     if not turnFight.winFaction:
         OnTurnAllOver(turnFight.guid)
     return
@@ -1584,6 +1630,14 @@
     return True
 
 def SetObjKilled(turnFight, gameObj, killer=None, useSkill=None):
+    curPlayer = turnFight.curPlayer
+    npcID = gameObj.GetNPCID()
+    
+    # 非主线的PVE目标怪物
+    if npcID and curPlayer and turnFight.isFBMap() and gameObj.GetFaction() != ChConfig.Def_FactionA:
+        if not FBLogic.OnFBNPCKilledBefore(curPlayer, turnFight, gameObj, killer):
+            return
+        
     objID = gameObj.GetID()
     killerObjID = killer.GetID() if killer else 0
     skillID = useSkill.GetSkillID() if useSkill else 0
@@ -1596,10 +1650,9 @@
     clientPack.SkillID = skillID
     turnFight.addBatPack(clientPack)
     
-    curPlayer = turnFight.curPlayer
     # 暂时只算主线小怪
     if curPlayer and turnFight.mapID == ChConfig.Def_FBMapID_Main and gameObj.GetFaction() != ChConfig.Def_FactionA:
-        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_KillNPC, 1)    
+        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_KillNPC, 1)  
     return True
 
 def OnTurnAllOver(guid):
@@ -1642,11 +1695,13 @@
             statInfo[str(faction)] = {}
         facStatInfo = statInfo[str(faction)]
         batFaction = turnFight.getBatFaction(faction)
+        batFaction.totalHurt = 0
         for num in batFaction.lineupDict.keys():
             if str(num) not in facStatInfo:
                 facStatInfo[str(num)] = {}
             lineupStatInfo = facStatInfo[str(num)]
             batLineup = batFaction.getBatlineup(num)
+            batLineup.totalHurt = 0
             GameWorld.DebugLog("阵容明细: faction=%s,num=%s" % (faction, num))
             for posNum, objID in batLineup.posObjIDDict.items():
                 batObj = batObjMgr.getBatObj(objID)
@@ -1658,6 +1713,8 @@
                 atkHurt = batObj.hurtStat
                 defHurt = batObj.defStat
                 cureHP = batObj.cureStat
+                batLineup.totalHurt += atkHurt
+                batFaction.totalHurt += atkHurt
                 GameWorld.DebugLog("    Pos:%s ID=%s,npcID=%s,heroID=%s,HP=%s/%s, 输出=%s,承伤=%s,治疗=%s" 
                                    % (posNum, objID, npcID, heroID, batObj.GetHP(), batObj.GetMaxHP(), atkHurt, defHurt, cureHP))
                 lineupStatInfo[str(posNum)] = {"ObjID":objID, "HeroID":heroID, "NPCID":npcID, "AtkHurt":atkHurt, "DefHurt":defHurt, "CureHP":cureHP}

--
Gitblit v1.8.0