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