PGRData/Script/matrix/xmanager/XDoubleTowersManager.lua

662 lines
24 KiB
Lua
Raw Normal View History

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