ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -21,6 +21,7 @@
import ChConfig
import PlayerTask
import PlayerActivity
import PlayerViewCache
import ChPyNetSendPack
import NetPackCommon
@@ -217,7 +218,7 @@
    #def setPVPTeam(self):
    #    return
    
    def nextTurnFight(self, msgDict={}, resetByNextTeam=False):
    def nextTurnFight(self, msgDict={}):
        ## 一般用于玩家发起的战斗,在需要保留玩家阵容属性及状态的情况下,重置回合进入下一场战斗
        self.turnNum = 1
        self.enterLogic = False
@@ -227,8 +228,7 @@
        self.timeline = 0
        self.startTime = time.time()
        self.costTime = 0
        if resetByNextTeam:
            ResetByNextTeam(self)
        ResetByNextTeam(self)
        return
    
    def haveNextLineup(self):
@@ -459,6 +459,7 @@
    ## 回合战斗管理器
    
    def __init__(self):
        self.lastRequestTick = 0
        self.turnFightDict = {} # {guid:TurnFight, ...}
        return
    
@@ -546,8 +547,8 @@
    ## 获取玩家阵容
    olPlayer = PlayerOnline.GetOnlinePlayer(curPlayer)
    lineup = olPlayer.GetLineup(lineupID)
    if not lineup.lineupHeroDict:
        # 为空时默认取主阵容
    if lineup.IsEmpty():
        GameWorld.DebugLog("玩家没有目标阵容默认取主阵容! lineupID=%s" % lineupID)
        lineup = olPlayer.GetLineup(ShareDefine.Lineup_Main)
    return lineup
@@ -558,12 +559,12 @@
    
    playerID = curPlayer.GetPlayerID()
    lineup = GetPlayerLineup(curPlayer, lineupID)
    if not lineup.lineupHeroDict:
    if lineup.IsEmpty():
        return {}
    
    heroDict = {}
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
    for posNum in lineup.lineupHeroDict.keys():
    for posNum in lineup.GetPosNumList():
        hero = lineup.GetLineupHero(posNum)
        heroID = hero.heroID
        itemIndex = hero.itemIndex
@@ -864,6 +865,30 @@
        
    return
def CheckFightCD(curPlayer, tick, selfKey):
    ## 是否战斗请求CD中
    # 所有玩家公共CD,待扩展
    tfMgr = GetTurnFightMgr()
    pubCD = IpyGameDataPY.GetFuncCfg("TurnFightCD", 1)
    if pubCD:
        if tfMgr.lastRequestTick and tick - tfMgr.lastRequestTick <= pubCD:
            GameWorld.DebugLog("回合制战斗请求服务器公共CD中!")
            PlayerControl.NotifyCode(curPlayer, "BattleCoolDown")
            return True
    # 个人CD
    selfCD = IpyGameDataPY.GetFuncCfg("TurnFightCD", 2)
    lastTick = curPlayer.GetDictByKey(selfKey)
    if selfCD and lastTick and tick - lastTick <= selfCD:
        GameWorld.DebugLog("回合制战斗请求CD中: %s" % selfKey)
        PlayerControl.NotifyCode(curPlayer, "BattleCoolDown")
        return True
    tfMgr.lastRequestTick = tick
    curPlayer.SetDict(selfKey, tick)
    return False
#// B4 10 回合制战斗 #tagCMTurnFight
#
#struct    tagCMTurnFight
@@ -886,8 +911,13 @@
    tagID = clientData.TagID
    valueList = clientData.ValueList
    
    GameWorld.DebugLog("回合制战斗请求: mapID=%s,funcLineID=%s,tagType=%s,tagID=%s,valueList=%s"
    GameWorld.DebugLog("----- 回合制战斗请求: mapID=%s,funcLineID=%s,tagType=%s,tagID=%s,valueList=%s"
                       % (mapID, funcLineID, tagType, tagID, valueList), curPlayer.GetPlayerID())
    reqRet = FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList)
    if not reqRet:
        return
    funcLineID = reqRet[1] if len(reqRet) > 1 else funcLineID
    
    fbIpyData = FBCommon.GetFBIpyData(mapID)
    fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, funcLineID, False)
@@ -898,13 +928,12 @@
        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
    # 攻防方所使用的阵容ID
    atkLineupID, defLineupID = FBLogic.GetFBPlayerLineupID(curPlayer, mapID, funcLineID)
    if atkLineupID not in ShareDefine.LineupList or defLineupID not in ShareDefine.LineupList:
        return
    if CheckFightCD(curPlayer, tick, "TurnFightReqTick"):
        return
    
    # 玩家
@@ -960,7 +989,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()
@@ -1039,7 +1068,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) # 标记开始
@@ -1153,12 +1182,8 @@
    
    # 限制请求CD
    if tick:
        key = "MainFightReqTick"
        lastTick = curPlayer.GetDictByKey(key)
        if lastTick and tick - lastTick <= 1000:
            GameWorld.DebugLog("主线战斗请求CD中")
        if CheckFightCD(curPlayer, tick, "MainFightReqTick"):
            return
        curPlayer.SetDict(key, tick)
        
    mainFightMgr = GetMainFightMgr(curPlayer)
    turnFight = mainFightMgr.turnFight
@@ -1178,7 +1203,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()
@@ -1206,6 +1231,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()
        
@@ -1230,13 +1257,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)
@@ -1275,6 +1302,9 @@
            else:
                turnFight.actionIndex += 1
                
        if turnFight.winFaction:
            break
        # 回合结束
        curTimeline = turnFight.setTimeline(curTimeline + 1) # 每回合结束算一个时间节点
        for faction, num in turnFight.actionSortList:
@@ -1285,9 +1315,6 @@
                batObj = batObjMgr.getBatObj(objID)
                TurnFightPerTurnBigEnd(turnFight, batObj, turnNum)
                
        if turnFight.checkOverByKilled():
            break
    if not turnFight.winFaction:
        OnTurnAllOver(turnFight.guid)
        
@@ -1301,6 +1328,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) # 本回合起始时间节点
@@ -1322,13 +1351,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)
@@ -1352,6 +1381,9 @@
            else:
                turnFight.actionIndex += 1
                
        if turnFight.winFaction:
            break
        # 回合结束
        curTimeline = turnFight.setTimeline(curTimeline + 1) # 每回合结束算一个时间节点
        for faction, num in turnFight.actionSortList:
@@ -1362,9 +1394,6 @@
                batObj = batObjMgr.getBatObj(objID)
                TurnFightPerTurnBigEnd(turnFight, batObj, turnNum)
                
        if turnFight.checkOverByKilled():
            break
    if not turnFight.winFaction:
        OnTurnAllOver(turnFight.guid)
    return
@@ -1649,7 +1678,8 @@
    
    # 暂时只算主线小怪
    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)
        PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_KillNPC, 1)
    return True
def OnTurnAllOver(guid):