PGRData/Script/matrix/xmanager/XDoomsdayManager.lua

1252 lines
44 KiB
Lua
Raw Permalink Normal View History

XDoomsdayManagerCreator = function()
local tableInsert = table.insert
local pairs = pairs
local tonumber = tonumber
local stringFormat = string.format
local tableUnpack = table.unpack
local IsTableEmpty = XTool.IsTableEmpty
local IsNumberValid = XTool.IsNumberValid
local XDoomsdayManager = {}
-----------------活动入口 begin----------------
local _ActivityId = XDoomsdayConfigs.GetDefaultActivityId() --当前开放活动Id
local _IsOpening = false --活动是否开启中根据服务端下发活动有效Id判断
local _ActivityEnd = false --活动是否结束
local function UpdateActivityId(activityId)
XCountDown.RemoveTimer(XCountDown.GTimerName.Doomsday)
if not IsNumberValid(activityId) then
_ActivityId = XDoomsdayConfigs.GetDefaultActivityId()
return
end
_ActivityId = activityId
local nowTime = XTime.GetServerNowTimestamp()
local leftTime = XDoomsdayManager.GetEndTime() - nowTime
if leftTime > 0 then
XCountDown.CreateTimer(XCountDown.GTimerName.Doomsday, leftTime)
end
2024-09-01 20:49:41 +00:00
if IsNumberValid(_ActivityId) and leftTime > 0 then
XDoomsdayManager.ClearActivityEnd()
end
_IsOpening = true
end
function XDoomsdayManager.GetActivityStageIds()
if not XDoomsdayManager.IsOpen() then
return
end
local stageIds = {}
for _, stageId in ipairs(XDoomsdayConfigs.ActivityConfig:GetProperty(_ActivityId, "StageId")) do
if IsNumberValid(stageId) then
tableInsert(stageIds, stageId)
end
end
return stageIds
end
function XDoomsdayManager.IsOpen()
if not IsNumberValid(_ActivityId) then
return false
end
if not _IsOpening then
return false
end
local nowTime = XTime.GetServerNowTimestamp()
local beginTime = XDoomsdayManager.GetStartTime()
local endTime = XDoomsdayManager.GetEndTime()
return beginTime <= nowTime and nowTime < endTime
end
function XDoomsdayManager.GetStartTime()
return XFunctionManager.GetStartTimeByTimeId(
XDoomsdayConfigs.ActivityConfig:GetProperty(_ActivityId, "OpenTimeId")
) or 0
end
function XDoomsdayManager.GetEndTime()
return XFunctionManager.GetEndTimeByTimeId(
XDoomsdayConfigs.ActivityConfig:GetProperty(_ActivityId, "OpenTimeId")
) or 0
end
function XDoomsdayManager.SetActivityEnd()
_ActivityEnd = true
CsXGameEventManager.Instance:Notify(XEventId.EVENT_DOOMSDAY_ACTIVITY_END)
end
function XDoomsdayManager.ClearActivityEnd()
_ActivityEnd = nil
end
function XDoomsdayManager.OnActivityEnd()
if not _ActivityEnd then
return false
end
if
CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") or XLuaUiManager.IsUiLoad("UiSettleLose") or
XLuaUiManager.IsUiLoad("UiSettleWin")
then
return false
end
--延迟是为了防止打断UI动画
XScheduleManager.ScheduleOnce(
function()
XLuaUiManager.RunMain()
XUiManager.TipText("DoomsdayActivityEnd")
end,
1000
)
XDoomsdayManager.ClearActivityEnd()
return true
end
--任务分组1.普通任务2.日记碎片)
local function GetTaskGroupId(index)
if index == 1 then
return XDoomsdayConfigs.ActivityConfig:GetProperty(_ActivityId, "TaskGroupId")
elseif index == 2 then
return XDoomsdayConfigs.ActivityConfig:GetProperty(_ActivityId, "DiaryTaskGroupId")
end
end
--根据index获取分组任务
function XDoomsdayManager.GetGroupTasksByIndex(index)
return XDataCenter.TaskManager.GetTaskList(TaskType.Doomsday, GetTaskGroupId(index))
end
function XDoomsdayManager.CheckTaskRewardToGet(index)
return XDataCenter.TaskManager.GetIsRewardForEx(TaskType.Doomsday, GetTaskGroupId(index))
end
--请求打开活动主界面
function XDoomsdayManager.EnterUiMain()
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.Doomsday) then
return
end
if not XDoomsdayManager.IsOpen() then
XUiManager.TipText("DoomsdayActivityNotOpen")
return
end
XLuaUiManager.Open("UiDoomsdayChapter")
end
2024-09-01 20:49:41 +00:00
function XDoomsdayManager.GetActivityChapters()
local chapters = {}
if not IsNumberValid(_ActivityId)
or not XFunctionManager.CheckInTimeByTimeId(XDoomsdayConfigs.ActivityConfig:GetProperty(_ActivityId, "OpenTimeId")) then
return chapters
end
table.insert(chapters, {
Id = _ActivityId,
Type = XDataCenter.FubenManager.ChapterType.Doomsday,
BannerBg = XDoomsdayConfigs.ActivityConfig:GetProperty(_ActivityId, "BannerBg"),
Name = XDoomsdayConfigs.ActivityConfig:GetProperty(_ActivityId, "Name")
})
return chapters
end
-----------------活动入口 end------------------
-----------------玩法战斗相关(单局生存解谜) begin------------------
local XDoomsdayStage = require("XEntity/XDoomsday/XDoomsdayStage")
local _StageDataDic = {} --每一关战斗数据
local _HistoryStageDataDic = {} --每一关历史战斗数据(只记录前一天)
local _StageFinishedMainTargetDic = {} --每一关通关后达成的主目标(主目标全部达成后算作通关)
local _StageFinishedSubTargetDic = {} --每一关通关后达成的子目标
2024-09-01 20:49:41 +00:00
local _StageFinishedEndingIds = {} --每一关达成的结局Id
local function GetStageData(stageId)
if not IsNumberValid(stageId) then
XLog.Error("XDoomsdayManager GetStageData error: Invalid stageId: ", stageId)
return
end
local stageData = _StageDataDic[stageId]
if not stageData then
stageData = XDoomsdayStage.New(stageId)
_StageDataDic[stageId] = stageData
end
return stageData
end
XDoomsdayManager.GetStageData = GetStageData
local function ResetStageData(stageId)
_StageDataDic[stageId]:Reset()
XDoomsdayManager.UpdateStageState(stageId)
_HistoryStageDataDic[stageId] = nil
end
local function RecordHistoryStageData(stageId, data)
if not IsNumberValid(stageId) then
return
end
local stageData = XDoomsdayStage.New(stageId)
stageData:UpdateData(data)
_HistoryStageDataDic[stageId] = stageData
end
local function GetHistoryStageData(stageId)
if not IsNumberValid(stageId) then
XLog.Error("XDoomsdayManager GetHistoryStageData error: Invalid stageId: ", stageId)
return
end
return _HistoryStageDataDic[stageId]
end
XDoomsdayManager.GetHistoryStageData = GetHistoryStageData
local function UpdateStageData(data)
if XTool.IsTableEmpty(data) then
return
end
GetStageData(data.Id):UpdateData(data)
2024-09-01 20:49:41 +00:00
--XDoomsdayManager.CheckSettle(data.Id)
end
local function UpdateStageDataEx(data)
local stageId = data.Id
2024-09-01 20:49:41 +00:00
--更新已经达成的结局
XDoomsdayManager.UpdateStageFinishedEndingIds(stageId, data.HistoryEndingIds)
--更新关卡信息
local stageInfo = data.Cur
if not IsTableEmpty(stageInfo) then
UpdateStageData(stageInfo)
end
local lastDayData = data.LastDay
if not XTool.IsTableEmpty(lastDayData) then
if lastDayData.DayCount + 1 == stageInfo.DayCount then
RecordHistoryStageData(stageId, lastDayData)
end
end
XDoomsdayManager.UpdateStageFinishedMainTargetDic(stageId, {data.MainTaskId}, data.SubTaskId)
end
--更新已完成关卡主目标/子目标
function XDoomsdayManager.UpdateStageFinishedMainTargetDic(stageId, targetIds, subTargetIds)
local targetDic = _StageFinishedMainTargetDic[stageId]
if not targetDic then
targetDic = {}
_StageFinishedMainTargetDic[stageId] = targetDic
end
for _, targetId in pairs(targetIds) do
if XTool.IsNumberValid(targetId) then
targetDic[targetId] = targetId
end
end
targetDic = _StageFinishedSubTargetDic[stageId]
if not targetDic then
targetDic = {}
_StageFinishedSubTargetDic[stageId] = targetDic
end
for _, targetId in pairs(subTargetIds) do
if XTool.IsNumberValid(targetId) then
targetDic[targetId] = targetId
end
end
XDoomsdayManager.UpdateStageState(stageId)
end
2024-09-01 20:49:41 +00:00
--更新关卡的结局Id
function XDoomsdayManager.UpdateStageFinishedEndingIds(stageId, endingIds)
_StageFinishedEndingIds[stageId] = endingIds
end
--检查关卡开放
local function CheckStageOpening()
for _, stageId in pairs(XDoomsdayManager.GetActivityStageIds(_ActivityId) or {}) do
GetStageData(stageId):SetProperty("_Opening", XDoomsdayManager.IsStageOpening(stageId))
end
end
function XDoomsdayManager.CheckHasStageIncomplete()
for _, stageId in pairs(XDoomsdayManager.GetActivityStageIds(_ActivityId) or {}) do
if XDoomsdayManager.IsStageOpening(stageId) and (not XDoomsdayManager.IsStagePassed(stageId)) then
return true
end
end
return false
end
--更新关卡已通关状态
function XDoomsdayManager.UpdateStageState(stageId)
local stageData = GetStageData(stageId)
stageData:SetProperty("_Star", XTool.GetTableCount(_StageFinishedSubTargetDic[stageId]))
2024-09-01 20:49:41 +00:00
--local passed = not IsTableEmpty(_StageFinishedMainTargetDic[stageId])
local passed = XDoomsdayManager.IsStagePassed(stageId)
stageData:SetProperty("_Passed", passed)
CheckStageOpening()
end
--关卡是否开放
function XDoomsdayManager.IsStageOpening(stageId)
local preStageId = XDoomsdayConfigs.StageConfig:GetProperty(stageId, "PreStage")
if not IsNumberValid(preStageId) then
return true
end
return XDoomsdayManager.IsStagePassed(preStageId)
end
--关卡是否通关
function XDoomsdayManager.IsStagePassed(stageId)
2024-09-01 20:49:41 +00:00
--return _StageFinishedMainTargetDic[stageId] and not IsTableEmpty(_StageFinishedMainTargetDic[stageId]) or false
local endingIds = _StageFinishedEndingIds[stageId]
if XTool.IsTableEmpty(endingIds) then
return false
end
for _, endingId in ipairs(endingIds) do
local passed = XDoomsdayConfigs.StageEndingConfig:GetProperty(endingId, "IsSuccess")
if passed then
return true
end
end
return false
end
--关卡子目标是否达成
function XDoomsdayManager.IsStageSubTargetFinished(stageId, targetId)
return _StageFinishedSubTargetDic[stageId] and IsNumberValid(_StageFinishedSubTargetDic[stageId][targetId]) or
false
end
--获取指定关卡通关星数(达成目标数量),总星数(总目标数量)
function XDoomsdayManager.GetStageStarProgress(stageId)
local finisedCount, totalCount = 0, 0
local totalTargetIds = XDoomsdayConfigs.StageConfig:GetProperty(stageId, "SubTaskId")
for _, targetId in pairs(totalTargetIds) do
if IsNumberValid(targetId) then
if XDoomsdayManager.IsStageSubTargetFinished(stageId, targetId) then
finisedCount = finisedCount + 1
end
totalCount = totalCount + 1
end
end
return finisedCount, totalCount
end
--获取当天居民死亡人数
function XDoomsdayManager.GetInhabitantDeadCount(stageId)
return GetStageData(stageId):GetProperty("_CurDeathCount")
end
--获取和前一天历史数据对比: 居民死亡人数文本描述
function XDoomsdayManager.GetInhabitantDeadCountText(stageId)
local str = ""
local num = XDoomsdayManager.GetInhabitantDeadCount(stageId)
if num > 0 then
2024-09-01 20:49:41 +00:00
str = XDoomsdayConfigs.GetNumberText(-num, false, false, true)
end
return str
end
2024-09-01 20:49:41 +00:00
--获取和前一天历史数据对比:居民人数变化
function XDoomsdayManager.GetInhabitantCountChangeText(stageId)
local str = ""
local today = GetStageData(stageId):GetProperty("_InhabitantCount") or 0
local yesterdayStage = GetHistoryStageData(stageId)
local yesterday = yesterdayStage and yesterdayStage:GetProperty("_InhabitantCount") or 0
local num = today - yesterday
if num ~= 0 then
str = XDoomsdayConfigs.GetNumberText(num, false, false, true)
end
return str
end
--获取和前一天历史数据对比: 居民平均属性文本描述
function XDoomsdayManager.GetAverageInhabitantAttrValueText(stageId, attrType)
local str = ""
local history = GetHistoryStageData(stageId)
if not history then
return str
end
local num =
GetStageData(stageId):GetAverageInhabitantAttr(attrType):GetProperty("_Value") -
history:GetAverageInhabitantAttr(attrType):GetProperty("_Value")
if num > 0 then
2024-09-01 20:49:41 +00:00
str = XDoomsdayConfigs.GetNumberText(num, false, false, true)
end
return str
end
--获取和前一天历史数据对比: 异常状态居民数量变化记录列表
function XDoomsdayManager.GetUnhealthyInhabitantChangeCountList(stageId)
local list = {}
local history = GetHistoryStageData(stageId)
if not history then
return {}
end
local tmpDic = {}
for _, info in pairs(history:GetProperty("_UnhealthyInhabitantInfoList")) do
tmpDic[info.AttrType] = info.Count
end
for _, info in pairs(GetStageData(stageId):GetProperty("_UnhealthyInhabitantInfoList")) do
local oldCount = tmpDic[info.AttrType] or 0
tableInsert(
list,
{
AttrType = info.AttrType,
Count = info.Count,
ChangeCount = info.Count - oldCount
}
)
end
return list
end
--获取和前一天历史数据对比: 居民属性变化记录列表
function XDoomsdayManager.GetInhabitantAttrChangeList(stageId)
local list = {}
local history = GetHistoryStageData(stageId)
if not history then
return {}
end
local stageData = GetStageData(stageId)
local oldInfoList = history:GetProperty("_AverageInhabitantAttrList")
local newInfoList = stageData:GetProperty("_AverageInhabitantAttrList")
for index, info in pairs(newInfoList) do
if oldInfoList[index] then
tableInsert(
list,
{
AttrType = info._Type,
Count = info._Value,
ChangeCount = info._Value - oldInfoList[index]._Value
}
)
end
end
return list
end
--生成资源报告
local ResourceReportIds = {
XDoomsdayConfigs.REPORT_ID.BUILDING_ADD, --营地增加资源
XDoomsdayConfigs.REPORT_ID.TEAM_ADD --探索小队增加资源/居民数量
}
function XDoomsdayManager.GenerateResourceReports(stageId)
local reports = {}
local stageData = XDoomsdayManager.GetStageData(stageId)
for _, reportId in ipairs(ResourceReportIds) do
local addResourceDic = {}
local addInhabitantCount = 0
if reportId == XDoomsdayConfigs.REPORT_ID.BUILDING_ADD then
addResourceDic = stageData:GetProperty("_BuildingHistoryResourceDic")
elseif reportId == XDoomsdayConfigs.REPORT_ID.TEAM_ADD then
addResourceDic = stageData:GetProperty("_TeamHistoryResourceDic")
addInhabitantCount = stageData:GetProperty("_TeamHistoryAddInhabitant")
end
local report = XDoomsdayConfigs.GetRandomReportTextFix(reportId, addResourceDic, addInhabitantCount)
if not string.IsNilOrEmpty(report) then
table.insert(reports, report)
end
end
return reports
end
--生成居民报告
local InHabitantReportIds = {
XDoomsdayConfigs.REPORT_ID.DEAD, --死去居民文本显示
XDoomsdayConfigs.REPORT_ID.HOMELESS, --不良状态随机文本(无家可归)
XDoomsdayConfigs.REPORT_ID.UNHEALTHY, --不良状态随机文本(不健康)
XDoomsdayConfigs.REPORT_ID.HUNGER, --不良状态随机文本(饥饿)
XDoomsdayConfigs.REPORT_ID.LOW_SAN --不良状态随机文本(精神值过低)
}
function XDoomsdayManager.GenerateInhabitantReports(stageId)
local reports = {}
local stageData = XDoomsdayManager.GetStageData(stageId)
2024-09-01 20:49:41 +00:00
local finishEndingId = stageData:GetProperty("_FinishEndingId")
local isFinishEnd = XTool.IsNumberValid(finishEndingId)
--达成失败结局
if isFinishEnd and not stageData:IsWin() then
local desc = XDoomsdayConfigs.StageEndingConfig:GetProperty(finishEndingId, "Desc")
tableInsert(reports, desc)
return reports
end
for _, reportId in ipairs(InHabitantReportIds) do
local addInhabitantCount = 0
if reportId == XDoomsdayConfigs.REPORT_ID.DEAD then
addInhabitantCount = XDataCenter.DoomsdayManager.GetInhabitantDeadCount(stageId)
if not XTool.IsNumberValid(addInhabitantCount) then
reportId = nil
end
elseif reportId == XDoomsdayConfigs.REPORT_ID.HOMELESS then
if not stageData:CheckInhabitantAttrBad(XDoomsdayConfigs.HOMELESS_ATTR_TYPE) then
reportId = XDoomsdayConfigs.REPORT_ID.HOMELESS_RT
end
elseif reportId == XDoomsdayConfigs.REPORT_ID.UNHEALTHY then
if not stageData:CheckInhabitantAttrBad(XDoomsdayConfigs.ATTRUBUTE_TYPE.HEALTH) then
reportId = XDoomsdayConfigs.REPORT_ID.UNHEALTHY_RT
end
elseif reportId == XDoomsdayConfigs.REPORT_ID.HUNGER then
if not stageData:CheckInhabitantAttrBad(XDoomsdayConfigs.ATTRUBUTE_TYPE.HUNGER) then
reportId = XDoomsdayConfigs.REPORT_ID.HUNGER_RT
end
elseif reportId == XDoomsdayConfigs.REPORT_ID.LOW_SAN then
if not stageData:CheckInhabitantAttrBad(XDoomsdayConfigs.ATTRUBUTE_TYPE.SAN) then
reportId = XDoomsdayConfigs.REPORT_ID.LOW_SAN_RT
end
end
local report = reportId and XDoomsdayConfigs.GetRandomReportTextBad(reportId, addInhabitantCount) or nil
if not string.IsNilOrEmpty(report) then
table.insert(reports, report)
end
end
return reports
end
2024-09-01 20:49:41 +00:00
--获取和前一天历史数据对比,资源产/消
function XDoomsdayManager.GetResourceChangeCountList(stageId)
local list = {}
local history = GetHistoryStageData(stageId)
if not history then
return list
end
local tmpDic = {}
local resourceIds = XDoomsdayConfigs.GetResourceIds()
for _, rId in ipairs(resourceIds) do
local lastResource = history:GetResource(rId)
local curResource = GetStageData(stageId):GetResource(rId)
local curCount = curResource:GetProperty("_Count")
local lastCount = lastResource:GetProperty("_Count")
tableInsert(list, {
Id = rId,
CurCount = curCount,
LastCount = lastCount,
ChangeCount = curCount - lastCount
})
end
return list
end
--==============================
---@desc 往播报队列内插入数据
---@stageId 关卡Id
---@type 播报类型
---@count 数量,目前只有死亡播报需要数量
--==============================
function XDoomsdayManager.UpdateBroadcast(stageId, type, count)
local stageData = XDoomsdayManager.GetStageData(stageId)
if not stageData then
return
end
stageData:PushBroadcast(type, count)
end
--请求进入战斗
local function DoomsdayEnterStageRequest(stageId, cb)
local req = {StageId = stageId}
XNetwork.Call(
"DoomsdayEnterStageRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
UpdateStageData(res.StageDb)
if cb then
cb()
end
end
)
end
--请求重新开始
local function DoomsdayResetStageRequest(stageId, cb)
local req = {StageId = stageId}
XNetwork.Call(
"DoomsdayResetStageRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
ResetStageData(stageId)
UpdateStageData(res.StageDb)
if cb then
cb()
end
end
)
end
2024-09-01 20:49:41 +00:00
--进入关卡界面
function XDoomsdayManager.EnterFight(stageId, restart)
local stageData = XDoomsdayManager.GetStageData(stageId)
local asynReqEnter = asynTask(DoomsdayEnterStageRequest)
local asynReqRestart = asynTask(DoomsdayResetStageRequest)
local asynOpen = asynTask(XLuaUiManager.Open)
local asynEnterEventUI = asynTask(XDoomsdayManager.EnterEventUiPurely)
RunAsyn(
function()
if restart then
asynReqRestart(stageId)
else
asynReqEnter(stageId)
end
2024-09-01 20:49:41 +00:00
--清除已弹出事件
stageData:ClearPoppedEvent()
XLuaUiManager.Open("UiDoomsdayFubenMainGameMovie", stageId) --黑幕弹窗
2024-09-01 20:49:41 +00:00
asynWaitSecond(XDoomsdayConfigs.BLACK_MASK_DURATION)
XLuaUiManager.Close("UiDoomsdayFubenMainGameMovie") --黑幕弹窗关闭
XLuaUiManager.Open("UiDoomsdayFubenMain", stageId) --玩法主UI
--存在自动弹出事件时全部按顺序自动弹出(进入关卡/下一天/完成上一个事件之后检查)
2024-09-01 20:49:41 +00:00
--local popedEventIdDic = {}
--while true do
-- --if XDoomsdayManager.CheckSettle(stageId) then
-- -- return
-- --end
--
-- local autoEvent = stageData:GetNextPopupEvent(popedEventIdDic)
-- if XTool.IsTableEmpty(autoEvent) then
-- break
-- end
--
-- asynEnterEventUI(stageId, autoEvent)
--end
local autoEvent = stageData:GetNextPopupEvent()
if autoEvent then
asynEnterEventUI(stageId, autoEvent)
end
2024-09-01 20:49:41 +00:00
--asynOpen("UiDoomsdayAllot", stageId) --资源分配弹窗
end
)
end
--请求进入下一天
local function DoomsdayNextDayRequest(stageId, cb)
local req = {StageId = stageId}
XNetwork.Call(
"DoomsdayNextDayRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
UpdateStageDataEx(res.StageDbExt)
local stageData = GetStageData(stageId)
stageData:UpdateBuildingHistoryResource(res.BuildingAddResource)
stageData:UpdateTeamHistoryResource(res.TeamAddResource)
stageData:SetProperty("_IsLastDay", res.IsEnd)
2024-09-01 20:49:41 +00:00
local curDeathCount = res.DeathCount or 0
stageData:SetProperty("_CurDeathCount", curDeathCount)
if cb then
cb()
end
end
)
end
--开始下一天
function XDoomsdayManager.EnterNextDay(stageId)
local stageData = GetStageData(stageId)
--检查主要事件是否完成
if not stageData:IsEventsFinished(XDoomsdayConfigs.EVENT_TYPE.MAIN) then
XUiManager.TipText("DoomsdayMainEventNotFinish")
return
end
local asynReq = asynTask(DoomsdayNextDayRequest)
local asynOpen = asynTask(XLuaUiManager.Open)
local asynEnterEventUI = asynTask(XDoomsdayManager.EnterEventUiPurely)
2024-09-01 20:49:41 +00:00
local asyncBroadcast = asynTask(stageData.DispatchBroadcast)
RunAsyn(
function()
asynReq(stageId)
2024-09-01 20:49:41 +00:00
--if XDoomsdayManager.CheckSettle(stageId) then
-- return
--end
XLuaUiManager.Open("UiDoomsdayFubenMainGameMovie", stageId) --黑幕弹窗
2024-09-01 20:49:41 +00:00
asynWaitSecond(XDoomsdayConfigs.BLACK_MASK_DURATION)
XLuaUiManager.Close("UiDoomsdayFubenMainGameMovie")
asynOpen("UidoomsdayReport", stageId) --结算报告
--存在自动弹出事件时全部按顺序自动弹出(进入关卡/下一天/完成上一个事件之后检查)
2024-09-01 20:49:41 +00:00
--local popedEventIdDic = {}
--while true do
-- --if XDoomsdayManager.CheckSettle(stageId) then
-- -- return
-- --end
-- local autoEvent = stageData:GetNextPopupEvent(popedEventIdDic)
-- if XTool.IsTableEmpty(autoEvent) then
-- break
-- end
-- asynEnterEventUI(stageId, autoEvent)
--end
local autoEvent = stageData:GetNextPopupEvent()
if autoEvent then
asynEnterEventUI(stageId, autoEvent)
end
2024-09-01 20:49:41 +00:00
asyncBroadcast(stageData)
--asynOpen("UiDoomsdayAllot", stageId) --资源分配弹窗
end
)
end
2024-09-01 20:49:41 +00:00
--检查结算(失败结局直接弹结算)
local Settling = false --结算UI展示中
function XDoomsdayManager.CheckSettle(stageId)
if Settling then
return true
end
local stageData = GetStageData(stageId)
if not stageData:GetProperty("_Fighting") then
return false
end
--仅在强制失败/正常到达最后一天时进行结算流程
if not stageData:GetProperty("_ForceLose") and not stageData:GetProperty("_IsLastDay") then
return false
end
if not XLuaUiManager.IsUiLoad("UiDoomsdayFubenMain") then
return false
end
2024-09-01 20:49:41 +00:00
local finishEndingId = stageData:GetProperty("_FinishEndingId")
local isFinishEnd = XTool.IsNumberValid(finishEndingId)
--未达成任何结局
if not isFinishEnd then
return false
end
--达成成功结局,结算权交给玩家
if isFinishEnd and stageData:IsWin() then
return false
end
local asynOpen = asynTask(XLuaUiManager.Open)
RunAsyn(
function()
Settling = true
2024-09-01 20:49:41 +00:00
--达成结局,但是失败结局
XLuaUiManager.Open("UiDoomsdayFubenMainGameMovie", stageId, true) --黑幕弹窗
asynWaitSecond(XDoomsdayConfigs.BLACK_MASK_DURATION)
XLuaUiManager.Close("UiDoomsdayFubenMainGameMovie")
XLuaUiManager.Remove("UidoomsdayEvent") --关闭玩法事件UI
XLuaUiManager.Remove("UiDoomsdayFubenMain") --关闭玩法主UI
XLuaUiManager.Remove("UiDoomsdayExplore") --关闭玩法探索UI
asynOpen("UiDoomsdaySettle", stageId) --副本结算UI
ResetStageData(stageId)
Settling = false
end
)
return true
end
2024-09-01 20:49:41 +00:00
--请求结束关卡
local function DoomsdayStageFinishRequest(stageId, cb)
XNetwork.Call("DoomsdayStageFinishRequest", {}, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
UpdateStageDataEx(res.StageDbExt)
if cb then cb() end
end)
end
--结束本关
function XDoomsdayManager.FinishStage(stageId)
local stageData = GetStageData(stageId)
--检查主要事件是否完成
if not stageData:CheckEndEventFinish() then
XUiManager.TipText("DoomsdayMainEventNotFinish")
return
end
local asyncReq = asynTask(DoomsdayStageFinishRequest)
local asyncOpen = asynTask(XLuaUiManager.Open)
RunAsyn(function()
--请求结束关卡
asyncReq(stageId)
--结算黑幕
XLuaUiManager.Open("UiDoomsdayFubenMainGameMovie", stageId, true)
asynWaitSecond(XDoomsdayConfigs.BLACK_MASK_DURATION)
XLuaUiManager.Close("UiDoomsdayFubenMainGameMovie")
--移除UI
XLuaUiManager.Remove("UidoomsdayEvent") --关闭玩法事件UI
XLuaUiManager.Remove("UiDoomsdayFubenMain") --关闭玩法主UI
XLuaUiManager.Remove("UiDoomsdayExplore") --关闭玩法探索UI
--副本结算
asyncOpen("UiDoomsdaySettle", stageId) --副本结算UI
--重置副本数据
ResetStageData(stageId)
end)
end
--打开事件弹窗/跳转到事件指定UI
function XDoomsdayManager.EnterEventUi(stageId, event, closeCb)
local stageData = GetStageData(stageId)
local placeId = stageData:GetEventPlaceId(event._Id)
if XTool.IsNumberValid(placeId) then
if not XLuaUiManager.IsUiShow("UiDoomsdayExplore") then
XLuaUiManager.Open("UiDoomsdayExplore", stageId, placeId)
end
end
XLuaUiManager.Open("UidoomsdayEvent", stageId, event, closeCb)
end
--仅打开事件弹窗
function XDoomsdayManager.EnterEventUiPurely(stageId, event, closeCb)
XLuaUiManager.Open("UidoomsdayEvent", stageId, event, closeCb)
end
--请求创建探索队伍
function XDoomsdayManager.DoomsdayCreateTeamRequest(stageId, teamIndex, cb)
local stageData = GetStageData(stageId)
local inhabitantIds =
stageData:GetSortedIdleInhabitantIdsByCount(
XDoomsdayConfigs.CreatTeamConfig:GetProperty(teamIndex, "CostInhabitantCount"),
nil,
true
)
local req = {MemberIdList = inhabitantIds}
XNetwork.Call(
"DoomsdayCreateTeamRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
stageData:AddTeam(teamIndex, res.TeamDb)
stageData:UpdateInhabitants(res.PeopleDbs)
stageData:UpdateResourceList(res.ResourceList)
stageData:UpdateTargets(res.TaskDbList)
if cb then
cb()
end
end
)
end
--请求使用指定队伍探索地点
function XDoomsdayManager.DoomsdayTargetPlaceRequest(stageId, teamIndex, placeId, cb)
local stageData = GetStageData(stageId)
local team = stageData:GetTeam(teamIndex)
if team:IsEmpty() then
XLog.Error(
"XDoomsdayManager.DoomsdayCreateTeamRequest error: team not exist, teamIndex: ",
teamIndex,
stageData
)
return
end
local req = {TeamId = team:GetProperty("_Id"), PlaceId = placeId}
XNetwork.Call(
"DoomsdayTargetPlaceRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
team:Explore(placeId)
stageData:UpdateTeamState()
XUiManager.TipMsg(
CsXTextManagerGetText(
"DoomsdayExploreTarget",
XDoomsdayConfigs.PlaceConfig:GetProperty(placeId, "Name")
)
)
if cb then
cb()
end
end
)
end
--请求完成事件
function XDoomsdayManager.DoomsdayDoEventRequest(stageId, eventId, selectIndex, cb)
--SelectIndex从0开始
local req = {EventId = eventId, SelectIndex = selectIndex - 1}
XNetwork.Call(
2024-09-01 20:49:41 +00:00
"DoomsdayDoEventRequest", req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
2024-09-01 20:49:41 +00:00
UpdateStageData(res.StageDb)
2024-09-01 20:49:41 +00:00
if cb then cb() end
XDoomsdayManager.CheckSettle(stageId)
local stageData = XDoomsdayManager.GetStageData(stageId)
local autoEvent = stageData:GetNextPopupEvent()
if autoEvent then
XDoomsdayManager.EnterEventUiPurely(stageId, autoEvent)
end
end
)
end
--请求放弃关卡目标
function XDoomsdayManager.DoomsdayGiveUpTargetRequest(stageId, taskId, cb)
local req = {TaskId = taskId}
XNetwork.Call(
"DoomsdayDiveupTaskRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
UpdateStageData(res.StageDb)
if cb then
cb()
end
end
)
end
--请求分配居民
function XDoomsdayManager.DoomsdayOpPeopleRequest(stageId, buildingIndex, inhabitantCount, isReplace, cb)
local stageData = GetStageData(stageId)
local tmpInhabitantIdDic = isReplace and stageData:GetBuildingWorkingInhabitantIdDic(buildingIndex) or {} --临时撤下的居民Id字典
local inhabitantIds = stageData:GetSortedIdleInhabitantIdsByCount(inhabitantCount, tmpInhabitantIdDic)
local buildingId = stageData:GetBuilding(buildingIndex):GetProperty("_Id")
local req = {BuildingId = buildingId, Ids = inhabitantIds}
XNetwork.Call(
"DoomsdayOpPeopleRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
stageData:AllocateInhabitants(inhabitantIds, buildingIndex)
if cb then
cb()
end
end
)
end
--请求撤回已分配居民
function XDoomsdayManager.ZeroDoomsdayOpPeopleRequest(stageId, buildingIndex, cb)
local inhabitantIds = XDoomsdayManager.GetStageData(stageId):GetBuildingWorkingInhabitantIds(buildingIndex)
local req = {BuildingId = 0, Ids = inhabitantIds}
XNetwork.Call(
"DoomsdayOpPeopleRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
GetStageData(stageId):RecallInhabitants(inhabitantIds)
if cb then
cb()
end
end
)
end
--请求建造建筑
function XDoomsdayManager.DoomsdayAddBuildingRequest(
stageId,
buildingIndex,
buildingCfgId,
inhabitantCount,
isReplace,
cb)
local tmpInhabitantIdDic =
isReplace and GetStageData(stageId):GetBuildingWorkingInhabitantIdDic(buildingIndex) or {} --临时撤下的居民Id字典
local inhabitantIds =
XDoomsdayManager.GetStageData(stageId):GetSortedIdleInhabitantIdsByCount(
inhabitantCount,
tmpInhabitantIdDic
)
local req = {BuildingCfgId = buildingCfgId, Pos = buildingIndex - 1, PeopleIds = inhabitantIds}
XNetwork.Call(
"DoomsdayAddBuildingRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
UpdateStageData(res.StageDb)
if cb then
cb()
end
end
)
end
--请求拆除建筑
function XDoomsdayManager.DoomsdayRemoveBuildingRequest(stageId, buildingIndex, cb)
local stageData = GetStageData(stageId)
local buildingId = stageData:GetBuilding(buildingIndex):GetProperty("_Id")
local req = {BuildingId = buildingId}
XNetwork.Call(
"DoomsdayRemoveBuildingRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
stageData:DeleteBuilding(buildingIndex)
2024-09-01 20:49:41 +00:00
stageData:UpdateInhabitants(res.PeopleList)
stageData:UpdateResourceList(res.ResourceList)
stageData:SetProperty("_UnlockTeamCount", res.UnlockTeamCount)
if cb then
cb()
end
end
)
end
--请求分配资源
function XDoomsdayManager.DoomsdayOpResourceRequest(stageId, allocations, cb)
local req = {Ops = {}} --服务端请求协议格式
local result = {} --分配操作结果缓存
local alloated = false --是否进行了分配操作
for _, allocation in pairs(allocations) do
local resourceId = allocation.ResourceId
local allocationInfo = result[resourceId]
if not allocationInfo then
allocationInfo = {}
result[resourceId] = allocationInfo
end
local stageData = GetStageData(stageId)
allocationInfo.AllocatedCount, allocationInfo.InhabitantResourceDic =
stageData[allocation.AllocationType](stageData, allocation.ResourceId)
--是否进行分配操作
if
not (XTool.IsTableEmpty(allocationInfo.InhabitantResourceDic) or
not XTool.IsNumberValid(allocationInfo.AllocatedCount))
then
alloated = true
end
--重组协议格式
if not XTool.IsTableEmpty(allocationInfo.InhabitantResourceDic) then
local data = {
Id = resourceId,
TargetList = {}
}
for inhabitantId, resourceCount in pairs(allocationInfo.InhabitantResourceDic) do
tableInsert(
data.TargetList,
{
Type = 0,
Id = inhabitantId,
Count = resourceCount
}
)
end
tableInsert(req.Ops, data)
end
end
if not alloated then
if cb then
cb()
end
return
end
XNetwork.Call(
"DoomsdayOpResourceRequest",
req,
function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
--扣除已分配资源
local addResourceDic = {}
for resourceId, allocationInfo in pairs(result) do
addResourceDic[resourceId] = -allocationInfo.AllocatedCount
end
GetStageData(stageId):AddResource(addResourceDic)
if cb then
cb()
end
end
)
end
-----------------玩法战斗相关(单局生存解谜) end------------------
-----------------Cookie begin------------------
function XDoomsdayManager.GetCookieKey(keyStr)
if not keyStr then
return
end
if not IsNumberValid(_ActivityId) then
return
end
return stringFormat("XDoomsdayManager_%d_%d_%s", XPlayer.Id, _ActivityId, keyStr)
end
--检查Cookie是否存在
function XDoomsdayManager.CheckCookieExist(keyStr)
return XDoomsdayManager.GetCookie(keyStr) and true or false
end
--获取Cookie
function XDoomsdayManager.GetCookie(keyStr)
local key = XDoomsdayManager.GetCookieKey(keyStr)
if not key then
return
end
return XSaveTool.GetData(key)
end
--设置Cookie
function XDoomsdayManager.SetCookie(keyStr, value)
local key = XDoomsdayManager.GetCookieKey(keyStr)
if not key then
return
end
value = value or 1
XSaveTool.SaveData(key, value)
end
-----------------Cookie end------------------
local function ResetData()
XDoomsdayManager.SetActivityEnd()
_ActivityId = 0 --当前开放活动Id
_IsOpening = false -- 活动是否开启中根据服务端下发活动有效Id判断
_StageDataDic = {} --每一关战斗数据
_HistoryStageDataDic = {} --每一关历史战斗数据(只记录前一天)
_StageFinishedMainTargetDic = {} --每一关通关后达成的主目标(主目标全部达成后算作通关)
_StageFinishedSubTargetDic = {} --每一关通关后达成的子目标
end
local function UpdateActivityData(data)
for _, info in pairs(data or {}) do
UpdateStageDataEx(info)
end
--检查关卡开放
CheckStageOpening()
end
--登录下发
function XDoomsdayManager.NotifyDoomsdayDbChange(data)
local aData = data.ActivityDb
local activityId = aData.ActivityId
if IsNumberValid(_ActivityId) and activityId ~= _ActivityId then
ResetData()
end
UpdateActivityId(activityId)
UpdateActivityData(aData.StageDbExtList)
end
function XDoomsdayManager.NotifyDoomsdayStageChange(data)
UpdateStageData(data.StageDb)
end
2024-09-01 20:49:41 +00:00
--播报更新
function XDoomsdayManager.NotifyDoomsdayBroadcastAction(data)
local action = data.Action
local stageId = action.StageId
XDoomsdayManager.UpdateBroadcast(stageId, action.ActionType, action.DeathCount)
end
return XDoomsdayManager
end
---------------------Notify begin------------------
XRpc.NotifyDoomsdayDbChange = function(data)
XDataCenter.DoomsdayManager.NotifyDoomsdayDbChange(data)
end
XRpc.NotifyDoomsdayStageChange = function(data)
XDataCenter.DoomsdayManager.NotifyDoomsdayStageChange(data)
end
2024-09-01 20:49:41 +00:00
XRpc.NotifyDoomsdayBroadcastAction = function(data)
XDataCenter.DoomsdayManager.NotifyDoomsdayBroadcastAction(data)
end
---------------------Notify end------------------