PGRData/Script/matrix/xmanager/XDoomsdayManager.lua
2024-09-01 22:49:41 +02:00

1251 lines
44 KiB
Lua
Raw Permalink 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.

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
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
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 = {} --每一关通关后达成的子目标
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)
--XDoomsdayManager.CheckSettle(data.Id)
end
local function UpdateStageDataEx(data)
local stageId = data.Id
--更新已经达成的结局
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
--更新关卡的结局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]))
--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)
--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
str = XDoomsdayConfigs.GetNumberText(-num, false, false, true)
end
return str
end
--获取和前一天历史数据对比:居民人数变化
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
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)
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
--获取和前一天历史数据对比,资源产/消
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
--进入关卡界面
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
--清除已弹出事件
stageData:ClearPoppedEvent()
XLuaUiManager.Open("UiDoomsdayFubenMainGameMovie", stageId) --黑幕弹窗
asynWaitSecond(XDoomsdayConfigs.BLACK_MASK_DURATION)
XLuaUiManager.Close("UiDoomsdayFubenMainGameMovie") --黑幕弹窗关闭
XLuaUiManager.Open("UiDoomsdayFubenMain", stageId) --玩法主UI
--存在自动弹出事件时全部按顺序自动弹出(进入关卡/下一天/完成上一个事件之后检查)
--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
--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)
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)
local asyncBroadcast = asynTask(stageData.DispatchBroadcast)
RunAsyn(
function()
asynReq(stageId)
--if XDoomsdayManager.CheckSettle(stageId) then
-- return
--end
XLuaUiManager.Open("UiDoomsdayFubenMainGameMovie", stageId) --黑幕弹窗
asynWaitSecond(XDoomsdayConfigs.BLACK_MASK_DURATION)
XLuaUiManager.Close("UiDoomsdayFubenMainGameMovie")
asynOpen("UidoomsdayReport", stageId) --结算报告
--存在自动弹出事件时全部按顺序自动弹出(进入关卡/下一天/完成上一个事件之后检查)
--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
asyncBroadcast(stageData)
--asynOpen("UiDoomsdayAllot", stageId) --资源分配弹窗
end
)
end
--检查结算(失败结局直接弹结算)
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
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
--达成结局,但是失败结局
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
--请求结束关卡
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(
"DoomsdayDoEventRequest", req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
UpdateStageData(res.StageDb)
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)
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
--播报更新
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
XRpc.NotifyDoomsdayBroadcastAction = function(data)
XDataCenter.DoomsdayManager.NotifyDoomsdayBroadcastAction(data)
end
---------------------Notify end------------------