10156 副本功能玩法关联回合战斗表现(符印塔、天星塔战斗改为回合制,功能玩法不变,配置不变;支持新任务系统中的挑战副本、过关副本;)
| | |
| | | return |
| | | isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = fightRet |
| | | |
| | | needSendGameServer, awardItemList = False, [] |
| | | needSendGameServer, awardItemList, overInfoEx = False, [], {} |
| | | overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet) |
| | | if overRet != None: |
| | | needSendGameServer, awardItemList = overRet |
| | | needSendGameServer, awardItemList, overInfoEx = overRet |
| | | |
| | | if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList]) |
| | | |
| | | overMsg = {"isWin":isWin, "itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)} |
| | | overMsg = {"isWin":isWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)} |
| | | playbackID and overMsg.update({"playbackID":playbackID}) |
| | | overInfoEx and overMsg.update(overInfoEx) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg) |
| | | return |
| | | |
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package GM.Commands.SetFB
|
| | | #
|
| | | # @todo:设置副本相关
|
| | | # @author hxp
|
| | | # @date 2024-05-11
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 设置副本相关
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2024-05-11 12:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import GameWorld
|
| | | import ChConfig
|
| | | import FBCommon
|
| | | import PlayerControl
|
| | | import GameLogic_TrialTower
|
| | | import GameLogic_SkyTower
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | | #逻辑实现
|
| | | ## GM命令执行入口
|
| | | # @param curPlayer 当前玩家
|
| | | # @param paramList 参数列表
|
| | | # @return None
|
| | | # @remarks 函数详细说明.
|
| | | def OnExec(curPlayer, paramList):
|
| | |
|
| | | if not paramList:
|
| | | GameWorld.DebugAnswer(curPlayer, "设置线路: SetFB line 地图ID 已过关到线路")
|
| | | return
|
| | | |
| | | mapID = None
|
| | | value = paramList[0]
|
| | | if value == "line":
|
| | | mapID = paramList[1] if len(paramList) > 1 else 0
|
| | | funcLineID = paramList[2] if len(paramList) > 2 else 0
|
| | | if not mapID:
|
| | | return
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
|
| | | |
| | | if mapID == ChConfig.Def_FBMapID_TrialTower:
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_TrialTower_PassLV, funcLineID)
|
| | | GameLogic_TrialTower.SyncTrialLevelInfo(curPlayer)
|
| | | elif mapID == ChConfig.Def_FBMapID_SkyTower:
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerFloor, funcLineID)
|
| | | GameLogic_SkyTower.SyncSkyTowerInfo(curPlayer)
|
| | | |
| | | GameWorld.DebugAnswer(curPlayer, "设置副本:%s 已过关:%s" % (mapID, funcLineID))
|
| | | else:
|
| | | return
|
| | | |
| | | FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID)
|
| | | return
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
|
| | |
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
|
| | |
| | | NotifyFBCntRegainInfo(curPlayer, [mapID])
|
| | | return
|
| | |
|
| | | def OnFBOver(curPlayer, mapID, funcLineID, isWin, awardItemList):
|
| | | ## 副本结束通用逻辑
|
| | | |
| | | def OnFBJoin(curPlayer, mapID, funcLineID):
|
| | | ## 副本参与通用逻辑
|
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID])
|
| | | if not isWin:
|
| | | return
|
| | | |
| | | PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
|
| | | |
| | | return
|
| | |
|
| | | def OnFBPass(curPlayer, mapID, funcLineID, awardItemList=None):
|
| | | ## 副本过关通用逻辑
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
|
| | | Sync_FBPlayerFBInfoData(curPlayer, mapID)
|
| | |
|
| | | GameWorld.DebugLog("奖励物品: %s" % awardItemList)
|
| | | if awardItemList:
|
| | | GameWorld.DebugLog("给奖励物品: %s" % awardItemList)
|
| | | ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FBPass_%s" % mapID, False, {"mapID":mapID, "funcLineID":funcLineID}])
|
| | | |
| | | PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
|
| | | return
|
| | |
|
| | | def RegainFBCntProcess(curPlayer):
|
| | |
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
|
| | | needSendGameServer = False
|
| | | awardItemList = []
|
| | | overInfoEx = {}
|
| | | isWin = fightRet[0]
|
| | |
|
| | | GameWorld.DebugLog("冒险关卡结算: funcLineID=%s,isWin=%s" % (funcLineID, isWin))
|
| | |
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("Adventure", funcLineID)
|
| | | if not ipyData:
|
| | | return needSendGameServer, awardItemList
|
| | | return
|
| | |
|
| | | if isWin:
|
| | | awardItemList = ipyData.GetAwardItemList()
|
| | | |
| | | FBCommon.OnFBOver(curPlayer, mapID, funcLineID, isWin, awardItemList)
|
| | | return needSendGameServer, awardItemList
|
| | | FBCommon.OnFBJoin(curPlayer, mapID, funcLineID)
|
| | | |
| | | if not isWin:
|
| | | return
|
| | | |
| | | awardItemList = ipyData.GetAwardItemList()
|
| | | FBCommon.OnFBPass(curPlayer, mapID, funcLineID, awardItemList)
|
| | | return needSendGameServer, awardItemList, overInfoEx
|
| | |
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
|
| | | needSendGameServer = True
|
| | | awardItemList = []
|
| | | overInfoEx = {}
|
| | |
|
| | | # 摇人帮助
|
| | | if funcLineID == 0:
|
| | | # 无论胜负都要同步GameServer汇报结果
|
| | | isWin = fightRet[0]
|
| | | if not isWin:
|
| | | return needSendGameServer, awardItemList
|
| | | return needSendGameServer, awardItemList, overInfoEx
|
| | |
|
| | | awardItemList = IpyGameDataPY.GetFuncEvalCfg("MineAreaHelp", 2)
|
| | | return needSendGameServer, awardItemList
|
| | | return needSendGameServer, awardItemList, overInfoEx
|
| | |
|
| | | # 自己驱赶
|
| | | elif funcLineID == 1:
|
| | | return needSendGameServer, awardItemList
|
| | | return needSendGameServer, awardItemList, overInfoEx
|
| | |
|
| | | return
|
| | |
|
| | |
| | |
|
| | | import FBCommon
|
| | | import GameWorld
|
| | | import IPY_GameWorld
|
| | | import PlayerControl
|
| | | import NPCCustomRefresh
|
| | | import ChPyNetSendPack
|
| | | import ItemControler
|
| | | import EventShell
|
| | |
| | | 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)
|
| | |
| | | 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)
|
| | |
|
| | |
| | | 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)
|
| | |
| | | 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):
|
| | |
| | | prizeDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)}
|
| | | return prizeDict
|
| | |
|
| | |
|
| | |
|
| | | ## 发送挑战结果信息
|
| | | def __SendSkyTowerOverInfo(curPlayer, floorID, isPass, overDict={}):
|
| | |
|
| | |
| | | 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):
|
| | |
| | | SyncSkyTowerInfo(curPlayer, floorID)
|
| | |
|
| | | return
|
| | |
|
| | |
|
| | |
| | |
|
| | | import FBCommon
|
| | | import GameWorld
|
| | | import IPY_GameWorld
|
| | | import PlayerControl
|
| | | import NPCCustomRefresh
|
| | | import ChPyNetSendPack
|
| | | import ItemControler
|
| | | import EventShell
|
| | | import NetPackCommon
|
| | | import ShareDefine
|
| | | import IpyGameDataPY
|
| | | import PlayerRune
|
| | | import ItemCommon
|
| | | import ChConfig
|
| | | import ChPlayer
|
| | | import PlayerSuccess
|
| | | import PlayerActivity
|
| | | import PlayerBillboard
|
| | |
| | | import PlayerActLogin
|
| | | import EventReport
|
| | | import PlayerBossReborn
|
| | | import GameObj
|
| | |
|
| | | import random
|
| | | import math
|
| | |
| | | GameWorld.DebugLog(' 更新符印塔已通关数 %s' % passlv)
|
| | | return
|
| | |
|
| | | ## 获取BossID
|
| | | def __GetTrialBossID(fbLevel= -1):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | if fbLevel == -1:
|
| | | fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
|
| | | ipyData = GetTowerIpyData(fbLevel)
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求 - 地图验证
|
| | | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | ipyData = GetTowerIpyData(funcLineID)
|
| | |
|
| | | if not ipyData:
|
| | | GameWorld.ErrLog("__GetTrialBossID() can not find %s in TrialTowerNPC.txt" % fbLevel)
|
| | | return 0
|
| | | return ipyData.GetNPCID()
|
| | |
|
| | |
|
| | | ## 杀怪
|
| | | # @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 = __GetTrialBossID()
|
| | | if bossID != curNPC.GetNPCID():
|
| | | return
|
| | | GameWorld.ErrLog("符印塔关卡不存在: funcLineID=%s" % (funcLineID), playerID)
|
| | | return False
|
| | |
|
| | | # 是否已过关
|
| | | if funcLineID <= __GetTrialLevelCurPassLV(curPlayer):
|
| | | GameWorld.DebugLog("符印塔本关已过关, 无法挑战! funcLineID=%s" % funcLineID, playerID)
|
| | | return False
|
| | |
|
| | | fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
|
| | | |
| | | # 过关全服广播
|
| | | bossID = ipyData.GetNPCID()
|
| | | 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
|
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 同步结果信息
|
| | | needSendGameServer = False
|
| | | awardItemList = []
|
| | | overInfoEx = {}
|
| | | |
| | | fbLevel = funcLineID
|
| | | ipyData = GetTowerIpyData(fbLevel)
|
| | | if not ipyData:
|
| | | return
|
| | | |
| | | FBCommon.OnFBJoin(curPlayer, mapID, funcLineID)
|
| | | isWin = fightRet[0] |
| | | if not isWin:
|
| | | return
|
| | |
|
| | | floorCnt = IpyGameDataPY.GetFuncCfg('TowerRuneType', 2)
|
| | |
| | | # 记录过关
|
| | | EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_TrialTower, 0, ChConfig.CME_Log_End, 0, 1)
|
| | |
|
| | | # 过关全服广播
|
| | | if ipyData.GetIsNotify():
|
| | | IPY_Data = IpyGameDataPY.IPY_Data()
|
| | | maxLevel = IPY_Data.GetRuneTowerByIndex(IPY_Data.GetRuneTowerCount()-1).GetID()
|
| | | sysMark = 'RuneTowerInfo_1' if fbLevel == maxLevel else 'GeRen_liubo_471172'
|
| | | PlayerControl.WorldNotify(0, sysMark,
|
| | | [curPlayer.GetPlayerName(), fbLevel / 100])
|
| | | PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), fbLevel / 100])
|
| | | |
| | | #更新关卡
|
| | | SetTrialLevelCurPassLV(curPlayer, fbLevel)
|
| | | # 给过关奖励
|
| | | prizeDict = __GiveFBPassPrize(curPlayer, fbLevel)
|
| | | # 过关时间
|
| | | costTime = tick - GameWorld.GetGameFB().GetFBStepTick()
|
| | | prizeDict[FBCommon.Over_costTime] = costTime
|
| | | |
| | | __SendTrialTowerOverInfo(curPlayer, fbLevel, True, prizeDict)
|
| | |
|
| | | #任务
|
| | | EventShell.EventRespons_TrialTowerCnt(curPlayer, fbLevel)
|
| | | #EventShell.EventRespons_TrialTowerCnt(curPlayer, fbLevel)
|
| | |
|
| | | SyncTrialLevelInfo(curPlayer) # 同步最新关卡信息
|
| | | __SetFBToFreeTime(tick)
|
| | | |
| | | #每日任务
|
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Tower)
|
| | | return
|
| | |
|
| | |
|
| | | |
| | | FBCommon.OnFBPass(curPlayer, mapID, funcLineID)
|
| | | overInfoEx.update(prizeDict)
|
| | | return needSendGameServer, awardItemList, overInfoEx
|
| | |
|
| | | ## 给过关奖励
|
| | | def __GiveFBPassPrize(curPlayer, fbLevel):
|
| | |
| | | PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_TowerSweep, 1)
|
| | | PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_TowerSweep, 1)
|
| | | 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
|
| | |
|