PGRData/Script/matrix/xmanager/XDoubleTowersManager.lua

661 lines
24 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

XDoubleTowersManagerCreator = function()
local math = math
local BaseInfo = require("XEntity/XDoubleTowers/XDoubleTowersInfo").New()
local _DoubleTowerRankData = require("XEntity/XDoubleTowers/XDoubleTowerRankData").New()
local StageState = XDoubleTowersConfigs.StageState
local _CurSelectModuleType = XDoubleTowersConfigs.ModuleType.Role
local _ModuleType2StrKey = {
[XDoubleTowersConfigs.ModuleType.Role] = "Role",
[XDoubleTowersConfigs.ModuleType.Guard] = "Guard"
}
---@class XDoubleTowersManager
local XDoubleTowersManager = {}
--region local variable
--==============================
---@desc 本地缓存key
---@key 目的
---@return string 构造的key
--==============================
local GetCookiesKey = function(key)
return "XDoubleTowersManager_" .. XPlayer.Id .. "_" .. BaseInfo:GetActivityId() .. "_" .. key .. "_End"
end
--==============================
---@desc 检查角色插槽
---@return boolean
--==============================
local CheckRoleSlotUnlock = function(index)
local key = GetCookiesKey(_ModuleType2StrKey[XDoubleTowersConfigs.ModuleType.Role])
local data = XSaveTool.GetData(key)
if not data then
XSaveTool.SaveData(key, {[1] = true})
return false
else
if index then
return not data[index]
else
local count = XDoubleTowersConfigs.GetRolePluginMaxCount()
-- 不检查第一个插槽
for idx = 2, count do
local preStageId = XDoubleTowersConfigs.GetSlotPreStageId(idx, XDoubleTowersConfigs.ModuleType.Role)
local isUnLock = not XTool.IsNumberValid(preStageId) and true or BaseInfo:IsStagePassed(preStageId)
if not data[idx] and isUnLock then
return true
end
end
end
end
return false
end
--==============================
---@desc 检查守卫插槽
---@return boolean
--==============================
local CheckGuardSlotUnlock = function(index)
local key = GetCookiesKey(_ModuleType2StrKey[XDoubleTowersConfigs.ModuleType.Guard])
local data = XSaveTool.GetData(key)
if not data then
XSaveTool.SaveData(key, {[1] = true})
return false
else
if index then
return not data[index]
else
local count = XDoubleTowersConfigs.GetGuardPluginMaxCount()
-- 不检查第一个插槽
for idx = 2, count do
local preStageId = XDoubleTowersConfigs.GetSlotPreStageId(idx, XDoubleTowersConfigs.ModuleType.Guard)
local isUnLock = not XTool.IsNumberValid(preStageId) and true or BaseInfo:IsStagePassed(preStageId)
if not data[idx] and isUnLock then
return true
end
end
end
end
return false
end
--endregion
--region global variable
--显示装备与卸载提示
XDoubleTowersManager.ShowEquipTips = nil
--endregion
XDoubleTowersManager.IsOpen = function()
return XDoubleTowersManager.IsFunctionOpen() and XDoubleTowersManager.IsActivityOpen()
end
XDoubleTowersManager.IsFunctionOpen = function()
local FunctionId = XFunctionManager.FunctionName.DoubleTowers
return XFunctionManager.JudgeCanOpen(FunctionId)
end
XDoubleTowersManager.IsActivityOpen = function()
return XFunctionManager.CheckInTimeByTimeId(XDoubleTowersManager.GetTimeLimitId())
end
XDoubleTowersManager.GetActivityChapters = function()
local chapters = {}
if XDoubleTowersManager.IsActivityOpen() then
local temp = {}
temp.Id = BaseInfo:GetActivityId()
temp.Name = XDoubleTowersManager.GetActivityName()
temp.BannerBg = XDoubleTowersConfigs.GetActivityBackground(BaseInfo:GetActivityId())
temp.Type = XDataCenter.FubenManager.ChapterType.DoubleTowers
table.insert(chapters, temp)
end
return chapters
end
XDoubleTowersManager.GetActivityStartTime = function()
local timeId = XDoubleTowersConfigs.GetTimeLimitId(BaseInfo:GetActivityId())
return XFunctionManager.GetStartTimeByTimeId(timeId)
end
XDoubleTowersManager.GetActivityEndTime = function()
local timeId = XDoubleTowersConfigs.GetTimeLimitId(BaseInfo:GetActivityId())
return XFunctionManager.GetEndTimeByTimeId(timeId)
end
XDoubleTowersManager.GetTimeLimitId = function()
return XDoubleTowersConfigs.GetTimeLimitId(BaseInfo:GetActivityId())
end
XDoubleTowersManager.GetActivityName = function()
return XDoubleTowersConfigs.GetTitleName(BaseInfo:GetActivityId())
end
XDoubleTowersManager.GetActivityRemainTime = function()
local currentTime = XTime.GetServerNowTimestamp()
return math.max(0, XFunctionManager.GetEndTimeByTimeId(XDoubleTowersManager.GetTimeLimitId()) - currentTime)
end
XDoubleTowersManager.NotifyDoubleTowersData = function(data)
BaseInfo:UpdateData(data)
end
---@return number@收菜货币的id
XDoubleTowersManager.GetCoinItemId = function()
return XDoubleTowersConfigs.GetCoinItemId(BaseInfo:GetActivityId())
end
---@return number@距离下次收菜的剩余时间
XDoubleTowersManager.GetGatherRemainTime = function()
local lastGatherTime = BaseInfo:GetLastGatherTime()
local currentTime = XTime.GetServerNowTimestamp()
local passedTime = currentTime - lastGatherTime
passedTime = math.max(passedTime, 0)
local gatherInterval = XDoubleTowersConfigs.GetGatherInterval(BaseInfo:GetActivityId())
if passedTime == 0 then
return gatherInterval, gatherInterval
end
return gatherInterval - passedTime % gatherInterval, gatherInterval
end
---@return number@最大储存代币数量
XDoubleTowersManager.GetMaxCoinAmount = function()
return XDoubleTowersConfigs.GetMaxCoins(BaseInfo:GetActivityId())
end
---@return number@一次收集的代币数量
XDoubleTowersManager.GetOnceGatherCoins = function()
return XDoubleTowersConfigs.GetGatherCoins(BaseInfo:GetActivityId())
end
---@return number@当前能收集的代币数量
XDoubleTowersManager.GetCanGatherCoins = function()
local lastGatherTime = BaseInfo:GetLastGatherTime()
local currentTime = XTime.GetServerNowTimestamp()
local passedTime = currentTime - lastGatherTime
passedTime = math.max(passedTime, 0)
local gatherInterval = XDoubleTowersConfigs.GetGatherInterval(BaseInfo:GetActivityId())
local onceCoins = XDataCenter.DoubleTowersManager.GetOnceGatherCoins()
-- 随时间增加的 + 已存储的
local canGatherCoins = math.floor(passedTime / gatherInterval) * onceCoins + BaseInfo:GetCacheCoin()
return math.min(canGatherCoins, XDoubleTowersManager.GetMaxCoinAmount())
end
XDoubleTowersManager.IsCoinFull = function()
return XDoubleTowersManager.GetCanGatherCoins() >= XDoubleTowersManager.GetMaxCoinAmount()
end
XDoubleTowersManager.GetHelpKey = function()
return XDoubleTowersConfigs.GetHelpKey(BaseInfo:GetActivityId())
end
XDoubleTowersManager.IsStageCanChallenge = function(stageId)
if not stageId then
return false
end
return XDoubleTowersManager.GetStageState(stageId) ~= StageState.Lock
end
XDoubleTowersManager.GetStageState = function(stageId)
-- 已通关
if BaseInfo:IsStagePassed(stageId) then
return StageState.Clear
end
-- 未到开放时间
local groupId = XDoubleTowersConfigs.GetGroupIdByStageId(stageId)
if XDoubleTowersManager.IsGroupLocked4TimeLimit(groupId) then
return StageState.Lock
end
-- 前置关卡未通关
local preconditionStageId = XDoubleTowersConfigs.GetPreconditionStage(stageId)
if not XDoubleTowersManager.IsStageClear(preconditionStageId) then
return StageState.Lock
end
-- 默认可挑战
return StageState.NotClear
end
-- 这个方法与GetStageState部分重复
XDoubleTowersManager.GetGroupLockReason = function(groupId)
local preconditionStageId = XDoubleTowersConfigs.GetGroupPreconditionStage(groupId)
if not XDoubleTowersManager.IsStageClear(preconditionStageId) then
return XDoubleTowersConfigs.ReasonOfLockGroup.PreconditionStageNotClear
end
if XDoubleTowersManager.IsGroupLocked4TimeLimit(groupId) then
return XDoubleTowersConfigs.ReasonOfLockGroup.TimeLimit
end
return XDoubleTowersConfigs.ReasonOfLockGroup.None
end
XDoubleTowersManager.IsStageClear = function(stageId)
-- 默认true
if not stageId or stageId <= 0 then
return true
end
return XDoubleTowersManager.GetStageState(stageId) == StageState.Clear
end
-- 关卡组 未到开放时间
XDoubleTowersManager.IsGroupLocked4TimeLimit = function(groupId)
local timelimitID = XDoubleTowersConfigs.GetGroupTimeLimitId(groupId)
return timelimitID and timelimitID >= 0 and not XFunctionManager.CheckInTimeByTimeId(timelimitID, true)
end
XDoubleTowersManager.GetGroupState = function(groupId)
if XDoubleTowersManager.IsGroupLocked4TimeLimit(groupId) then
return StageState.Lock
end
local preconditionStageId = XDoubleTowersConfigs.GetGroupPreconditionStage(groupId)
if not XDoubleTowersManager.IsStageClear(preconditionStageId) then
return StageState.Lock
end
local group = XDoubleTowersManager.GetGroup(groupId)
local clearAmount, lockAmount = 0, 0
local stageAmount = #group
-- 1关都每配显示lock
if stageAmount == 0 then
return StageState.Lock
end
for stageIndex = 1, stageAmount do
local stageId = group[stageIndex]
local state = XDoubleTowersManager.GetStageState(stageId)
-- 有任意关可挑战
if state == StageState.NotClear then
return StageState.NotClear
end
if state == StageState.Lock then
lockAmount = lockAmount + 1
elseif state == StageState.Clear then
clearAmount = clearAmount + 1
end
end
-- 所有关卡都clear
if clearAmount == stageAmount then
return StageState.Clear
end
-- 所有关卡都lock
if lockAmount == stageAmount then
return StageState.Lock
end
-- 默认lock有可能是关卡组解锁了但是没有一关可挑战
XLog.Warning("XDoubleTowersManager 未定义的group state", ";通关数", clearAmount, ";未解锁数", lockAmount, ";关卡数量", #group)
return StageState.Lock
end
XDoubleTowersManager.GetGroupOpenRemainTime = function(group)
local timelimitID = XDoubleTowersConfigs.GetGroupTimeLimitId(group)
if not timelimitID or timelimitID == 0 then
return 0
end
local endTime = XFunctionManager.GetStartTimeByTimeId(timelimitID)
local currentTime = XTime.GetServerNowTimestamp()
local remainTime = endTime - currentTime
return math.max(remainTime, 0)
end
XDoubleTowersManager.GetSpecialStageWinCount = function()
return BaseInfo:GetSpecialStageWinCount()
end
-- 特殊关卡,不可选择,只能挑战下一关
XDoubleTowersManager.GetSpecialStageId = function()
local groupId = XDoubleTowersManager.GetSpecialGroupId()
local group = XDoubleTowersManager.GetGroup(groupId)
local isAllPassed = true
for i = 1, #group do
local stageId = group[i]
if XDoubleTowersManager.GetStageState(stageId) ~= StageState.Clear then
isAllPassed = false
break
end
end
if isAllPassed then
return group[#group]
end
for i = 1, #group do
local stageId = group[i]
if XDoubleTowersManager.GetStageState(stageId) == StageState.NotClear then
return stageId
end
end
return group[1]
end
XDoubleTowersManager.IsSpecialStage = function(stageId)
local groupId = XDoubleTowersConfigs.GetGroupIdByStageId(stageId)
return XDoubleTowersManager.IsSpecialGroup(groupId)
end
---@return XTeam
XDoubleTowersManager.GetXTeam = function()
---@type XTeam
local team = XDataCenter.TeamManager.GetXTeam(XDoubleTowersConfigs.TeamId)
if not team then
team = XDataCenter.TeamManager.GetXTeamByTypeId(XDoubleTowersConfigs.TeamTypeId)
-- 去掉请求服务端的callback即可
team:UpdateSaveCallback(false)
team.EntitiyIds[team.CaptainPos] = BaseInfo:GetTeamDb():GetRoleId()
end
return team
end
XDoubleTowersManager.OnOpenMain = function()
if not XDoubleTowersManager.IsOpen() then
XUiManager.TipText("FestivalActivityNotInActivityTime")
return
end
XLuaUiManager.Open("UiDoubleTowers")
end
function XDoubleTowersManager.GetBaseInfo()
return BaseInfo
end
function XDoubleTowersManager.GetActivityId()
return XDoubleTowersManager.GetBaseInfo():GetActivityId()
end
function XDoubleTowersManager.GetNextStageId(stageId)
local groupId = XDoubleTowersConfigs.GetGroupIdByStageId(stageId)
local group = XDoubleTowersManager.GetGroup(groupId)
local nextStageIndex = false
for i = 1, #group do
local id = group[i]
if id == stageId then
nextStageIndex = i
break
end
end
local nextStageId = false
if nextStageIndex then
nextStageId = group[nextStageIndex + 1]
end
if not nextStageId then
local groupIndex = XDoubleTowersConfigs.GetGroupIndexByStageId(stageId)
local nextGroupIndex = groupIndex + 1
local nextGroupId = XDoubleTowersManager.GetGroupId(nextGroupIndex)
local nextGroup = XDoubleTowersManager.GetGroup(nextGroupId)
if nextGroup then
nextStageId = nextGroup[1]
end
end
return nextStageId
end
function XDoubleTowersManager.GetGroupId(groupIndex)
return XDoubleTowersConfigs.GetGroupId(BaseInfo:GetActivityId(), groupIndex)
end
function XDoubleTowersManager.IsSpecialGroupUnlock()
return XDoubleTowersManager.GetGroupState(XDoubleTowersManager.GetSpecialGroupId()) ~=
XDoubleTowersConfigs.StageState.Lock
end
function XDoubleTowersManager.GetGroup(groupId)
return XDoubleTowersConfigs.GetGroup(BaseInfo:GetActivityId(), groupId)
end
function XDoubleTowersManager.GetSpecialGroupId()
return XDoubleTowersConfigs.GetSpecialGroupId(BaseInfo:GetActivityId())
end
function XDoubleTowersManager.IsSpecialGroup(groupId)
return groupId == XDoubleTowersManager.GetSpecialGroupId()
end
function XDoubleTowersManager.GetStageId(groupId, stageIndex)
return XDoubleTowersConfigs.GetStageId(BaseInfo:GetActivityId(), groupId, stageIndex)
end
--==============================
---@desc 排行榜数据
--==============================
function XDoubleTowersManager.GetRankData()
return _DoubleTowerRankData
end
--==============================
---@desc 活动结束回调
--==============================
function XDoubleTowersManager.HandleActivityEndTime()
XLuaUiManager.RunMain()
XUiManager.TipText("ActivityAlreadyOver")
end
--==============================
---@desc 排行榜活动倒计时
--==============================
function XDoubleTowersManager.GetRankCountDownTime()
return CSXTextManagerGetText(
"DoubleTowersRankCountDown",
XUiHelper.GetTime(XDoubleTowersManager.GetActivityRemainTime(), XUiHelper.TimeFormatType.DOUBLE_TOWER)
)
end
--==============================
---@desc 设置当前的部署类型(仅能用于部署界面)
--==============================
function XDoubleTowersManager.RefreshSelectModuleType(moduleType)
_CurSelectModuleType = moduleType
end
--==============================
---@desc 获取当前部署类型(仅能用于部署界面)
--==============================
function XDoubleTowersManager.GetSelectModuleType()
return _CurSelectModuleType
end
-- 胜利 & 奖励界面
function XDoubleTowersManager.ShowReward(winData)
local stageId = winData.StageId
if stageId then
BaseInfo:IncreaseWinCount(stageId)
BaseInfo:SetJustPassedStage(stageId)
end
XLuaUiManager.Open("UiDoubleTowersSettlement", winData)
end
function XDoubleTowersManager.GetJustPassedStage()
return BaseInfo:GetJustPassedStage()
end
function XDoubleTowersManager.InitStageInfo()
for _, cfg in pairs(XDoubleTowersConfigs.GetAllStageConfigs()) do
local stageInfo = XDataCenter.FubenManager.GetStageInfo(cfg.Id)
stageInfo.Type = XDataCenter.FubenManager.StageType.DoubleTowers
end
end
function XDoubleTowersManager.GetTotalNormalStageAmount()
return XDoubleTowersConfigs.GetTotalNormalStageAmount(BaseInfo:GetActivityId())
end
function XDoubleTowersManager.GetPassedNormalStageAmount()
local passedAmount = 0
local activityId = BaseInfo:GetActivityId()
local allGroup = XDoubleTowersConfigs.GetGroupConfigs()
for groupId, groupCfg in pairs(allGroup) do
if groupCfg.ActivityId == activityId and not groupCfg.IsSpecial then
local group = XDoubleTowersManager.GetGroup(groupId)
for i = 1, #group do
local stageId = group[i]
if XDoubleTowersManager.GetStageState(stageId) == XDoubleTowersConfigs.StageState.Clear then
passedAmount = passedAmount + 1
end
end
end
end
return passedAmount
end
function XDoubleTowersManager.SetRoleId(roleId)
BaseInfo:GetTeamDb():SetRoleId(roleId)
end
--==============================
---@desc 红点检测 -- 是否有新的插槽解锁
---@moduleType 插件类型
---@return boolean
--==============================
function XDoubleTowersManager.CheckSlotUnlocked(args)
local moduleType
local index
if args then
moduleType = args.ModuleType
index = args.Index
end
if moduleType then
if moduleType == XDoubleTowersConfigs.ModuleType.Role then
return CheckRoleSlotUnlock(index)
elseif moduleType == XDoubleTowersConfigs.ModuleType.Guard then
return CheckGuardSlotUnlock(index)
end
return false
else
if CheckRoleSlotUnlock() or CheckGuardSlotUnlock() then
return true
end
return false
end
end
--==============================
---@desc 更新本地解锁插槽数缓存
---@moduleType 插件类型
--==============================
function XDoubleTowersManager.RefreshUnlockSlotByModuleType(moduleType, index)
if not moduleType then
return
end
if not index then
return
end
local key = GetCookiesKey(_ModuleType2StrKey[moduleType])
local data = XSaveTool.GetData(key)
if not data then
data = {}
end
if not data[index] then
data[index] = true
XSaveTool.SaveData(key, data)
end
end
--region request
XDoubleTowersManager.RequestGatherCoins = function()
XNetwork.CallWithAutoHandleErrorCode(
"DoubleTowerTakeCacheCoinRequest",
{},
function(result)
if result.Code ~= XCode.Success then
return
end
-- 更新时间
local lastGatherTime = BaseInfo:GetLastGatherTime()
local currentTime = XTime.GetServerNowTimestamp()
local passedTime = currentTime - lastGatherTime
passedTime = math.max(passedTime, 0)
local gatherInterval = XDoubleTowersConfigs.GetGatherInterval(BaseInfo:GetActivityId())
local addTime = math.floor(passedTime / gatherInterval) * gatherInterval
BaseInfo:SetLastGatherTime(BaseInfo:GetLastGatherTime() + addTime)
local cacheCoin = result.CacheCoin
BaseInfo:SetCacheCoin(cacheCoin)
XUiManager.TipText("DoubleTowersGatherSuccess")
-- 需要立刻刷新界面
XEventManager.DispatchEvent(XEventId.EVENT_DOUBLE_TOWERS_UPDATE_GATHER)
end
)
end
--请求升级插件
function XDoubleTowersManager.RequestDoubleTowerUpgradePlugin(pluginId, cb)
local req = {
PluginId = pluginId --插件Id
}
XNetwork.CallWithAutoHandleErrorCode(
"DoubleTowerUpgradePluginRequest",
req,
function(res)
BaseInfo:UpdatePluginDb(res.PluginDb)
if cb then
cb(pluginId)
end
end
)
end
--请求设置插件
-- req = {
-- RoleId角色配置Id
-- RoleBasePluginIdSelectPluginType为0时传PluginLevelId否则传PluginId
-- RolePluginListPluginId列表
-- GuardId守卫配置Id
-- GuardBasePluginIdSelectPluginType为0时传PluginLevelId否则传PluginId
-- GuardPluginListPluginId列表
-- }
function XDoubleTowersManager.RequestDoubleTowerSetTeam(cb)
local teamDb = XDoubleTowersManager.GetBaseInfo():GetTeamDb()
local req = teamDb:GetRequestDoubleTowerSetTeam()
XNetwork.CallWithAutoHandleErrorCode(
"DoubleTowerSetTeamRequest",
req,
function(res)
if cb then
cb(res)
end
end
)
end
--请求排行榜数据
function XDoubleTowersManager.RequestDoubleTowerGetRank(cb)
local req = {ActivityId = XDoubleTowersManager.GetBaseInfo():GetActivityId()}
XNetwork.CallWithAutoHandleErrorCode(
"DoubleTowerGetRankRequest",
req,
function(res)
_DoubleTowerRankData:UpdateData(res)
if cb then
cb()
end
end
)
end
--重置插件
function XDoubleTowersManager.RequestDoubleTowerResetPlugin(pluginIdList, cb)
local pluginCount = #pluginIdList
for _, pluginId in ipairs(pluginIdList) do
XNetwork.CallWithAutoHandleErrorCode(
"DoubleTowerResetPluginRequest",
{PluginId = pluginId},
function(res)
XDoubleTowersManager.GetBaseInfo():ResetPlugin(pluginId, res.Level)
if cb then
cb()
end
end
)
end
end
--endregion
return XDoubleTowersManager
end
--region Notify
XRpc.NotifyDoubleTowerActivity = function(data)
XDataCenter.DoubleTowersManager.NotifyDoubleTowersData(data.ActivityDb)
end
--endregion