ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_SkyTower.py
@@ -18,9 +18,7 @@
import FBCommon
import GameWorld
import IPY_GameWorld
import PlayerControl
import NPCCustomRefresh
import ChPyNetSendPack
import ItemControler
import EventShell
@@ -28,34 +26,9 @@
import ShareDefine
import IpyGameDataPY
import ChConfig
import ChPlayer
import PlayerActivity
import PlayerBillboard
import PlayerSuccess
import GameObj
import GameWorldProcess
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_SkyTower)
def GetTowerIpyData(floor):
    return IpyGameDataPY.GetIpyGameData('SkyTower', floor)
@@ -136,18 +109,10 @@
    GameWorld.DebugLog(' 更新天星塔已通关数 %s' % floorID)
    return
## 是否可进入
#  @param curPlayer
#  @param mapID 地图ID
#  @param lineId 分线ID
#  @param tick
#  @return 是否可进入
def OnEnterFBEvent(curPlayer, mapID, lineId, tick):
    return True
## 检查可否进行挑战
def __CheckCanChallenge(curPlayer, floorID):
def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
    ## 回合战斗请求 - 地图验证
    floorID = funcLineID
    playerID = curPlayer.GetPlayerID()
    ipyData = GetTowerIpyData(floorID)
    
@@ -164,224 +129,44 @@
        GameWorld.DebugLog("天星塔本关  等级不足%s, 无法挑战!" % ipyData.GetNeedLV(), playerID)
        return False
    
    bossID = ipyData.GetBossID()
    if tagID != bossID or tagType != ChConfig.TurnBattle_TagType_NPC:
        GameWorld.ErrLog("目标bossID错误,无法挑战! mapID=%s,funcLineID=%s,bossID=%s,tagType=%s,tagID=%s"
                         % (mapID, funcLineID, bossID, tagType, tagID), curPlayer.GetPlayerID())
        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):
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
    ## 回合战斗结束
    # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
    needSendGameServer = False
    awardItemList = []
    overInfoEx = {}
    
    if fbStep == FB_State_FightPrepare:
        notify_tick = __GetTrialCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
        curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
    elif fbStep == FB_State_Fighting:
        notify_tick = __GetTrialCfg()[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
        curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)
    elif fbStep > FB_State_Fighting:
        PlayerControl.PlayerLeaveFB(curPlayer)
        return
    # 不做处理,有副本行为客户端发包选择挑战关卡
    #EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_SkyTower, 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 __GetSkyTowerBossID(floorID= -1):
    gameFB = GameWorld.GetGameFB()
    if floorID == -1:
        floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
    ipyData = GetTowerIpyData(floorID)
    if not ipyData:
        GameWorld.ErrLog("__GetSkyTowerBossID() can not find %s in SkyTowerNPC.txt" % floorID)
        return 0
    return ipyData.GetBossID()
##战斗准备时间
# @param tick  时钟
# @return 无意义
def __DoLogic_FightPrepare(tick):
    gameFB = GameWorld.GetGameFB()
    trialCfg = __GetTrialCfg()
    if tick - gameFB.GetFBStepTick() < trialCfg[Def_PrepareTime] * 1000:
        return
    bossID = __GetSkyTowerBossID()
    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_SkyTower, 0), [bossID])
    #转入战斗
    FBCommon.SetFBStep(FB_State_Fighting, tick)
    return
## 开始副本关卡
def StartfloorID(curPlayer, floorID, 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, floorID)
    prepareTick = __GetTrialCfg()[Def_PrepareTime] * 1000
    FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick)
    FBCommon.SetFBStep(FB_State_FightPrepare, tick)
    helpDict = {FBCommon.Help_wheel:floorID}
    FBCommon.Notify_FBHelp(curPlayer, helpDict)
    GameWorld.DebugLog("StartfloorID, floorID=%s, helpDict=%s"
                       % (floorID, str(helpDict)), curPlayer.GetPlayerID())
    return
##战斗时间
# @param tick  时钟
# @return 无意义
def __DoLogic_Fighting(tick):
    gameFB = GameWorld.GetGameFB()
    #判断时间结束
    if tick - gameFB.GetFBStepTick() < __GetTrialCfg()[Def_FightTime] * 1000:
        return
    floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
    playerManager = GameWorld.GetMapCopyPlayerManager()
    for index in xrange(playerManager.GetPlayerCount()):
        curPlayer = playerManager.GetPlayerByIndex(index)
        if not curPlayer:
            continue
        __SendSkyTowerOverInfo(curPlayer, floorID, 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
#  @param curNPC 被杀的怪
#  @param tick
#  @return None
def DoFB_Player_KillNPC(curPlayer, curNPC, tick):
    gameFB = GameWorld.GetGameFB()
    if gameFB.GetFBStep() != FB_State_Fighting:
        return
    bossID = __GetSkyTowerBossID()
    if bossID != curNPC.GetNPCID():
        return
    floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
    # 过关全服广播
    floorID = funcLineID
    ipyData = GetTowerIpyData(floorID)
    if not ipyData:
        return
    FBCommon.OnFBJoin(curPlayer, mapID, funcLineID)
    isWin = fightRet[0]
    if not isWin:
        return
    
    if ipyData.GetIsNotify():
        sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172'
        PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID])
    #更新关卡
    SetSkyTowerCurfloorID(curPlayer, floorID)
    # 给过关奖励
    prizeDict = __GiveFBPassPrize(curPlayer, ipyData)
    # 过关时间
    costTime = tick - GameWorld.GetGameFB().GetFBStepTick()
    prizeDict[FBCommon.Over_costTime] = costTime
    __SendSkyTowerOverInfo(curPlayer, floorID, True, prizeDict)
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower)
    
    SyncSkyTowerInfo(curPlayer, 0) # 同步最新关卡信息
    __SetFBToFreeTime(tick)
    
    if floorID >= 10:
        PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_SkyTower, floorID)
@@ -400,9 +185,9 @@
        GameWorld.DebugLog("全服过关信息同步GameServer: %s" % msgInfo, playerID)
        GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))
        
    return
    FBCommon.OnFBPass(curPlayer, mapID, funcLineID)
    overInfoEx.update(prizeDict)
    return needSendGameServer, awardItemList, overInfoEx
## 给过关奖励
def __GiveFBPassPrize(curPlayer, ipyData):
@@ -414,8 +199,6 @@
    prizeDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
    return prizeDict
## 发送挑战结果信息
def __SendSkyTowerOverInfo(curPlayer, floorID, isPass, overDict={}):
    
@@ -424,63 +207,6 @@
    overDict[FBCommon.Over_isPass] = int(isPass)
    GameWorld.DebugLog("__SendSkyTowerOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID())
    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()
    floorID = gameFB.GetGameFBDictByKey(FBDict_Level)
    __SendSkyTowerOverInfo(curPlayer, floorID, 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
    floorID = actionInfo
    if not __CheckCanChallenge(curPlayer, floorID):
        FBCommon.DoLogic_FBKickAllPlayer()
        return
    StartfloorID(curPlayer, floorID, tick)
    return
def OnGetSkyTowerServerChallengeReward(curPlayer, floorID, needPlayerCount):
@@ -565,5 +291,4 @@
        SyncSkyTowerInfo(curPlayer, floorID)
        
    return