2023-07-14 19:35:33 +00:00
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
_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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
-----------------活动入口 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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
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)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function UpdateStageDataEx(data)
|
|
|
|
|
local stageId = data.Id
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--更新已经达成的结局
|
|
|
|
|
XDoomsdayManager.UpdateStageFinishedEndingIds(stageId, data.HistoryEndingIds)
|
|
|
|
|
--更新关卡信息
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
--检查关卡开放
|
|
|
|
|
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)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
--获取和前一天历史数据对比: 居民平均属性文本描述
|
|
|
|
|
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)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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
|
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
--请求进入战斗
|
|
|
|
|
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
|
|
|
|
--进入关卡界面
|
2023-07-14 19:35:33 +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()
|
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
XLuaUiManager.Open("UiDoomsdayFubenMainGameMovie", stageId) --黑幕弹窗
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
asynWaitSecond(XDoomsdayConfigs.BLACK_MASK_DURATION)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
asynEnterEventUI(stageId, autoEvent)
|
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--asynOpen("UiDoomsdayAllot", stageId) --资源分配弹窗
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
RunAsyn(
|
|
|
|
|
function()
|
|
|
|
|
asynReq(stageId)
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--if XDoomsdayManager.CheckSettle(stageId) then
|
|
|
|
|
-- return
|
|
|
|
|
--end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
XLuaUiManager.Open("UiDoomsdayFubenMainGameMovie", stageId) --黑幕弹窗
|
2024-09-01 20:49:41 +00:00
|
|
|
|
asynWaitSecond(XDoomsdayConfigs.BLACK_MASK_DURATION)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
asynEnterEventUI(stageId, autoEvent)
|
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
asyncBroadcast(stageData)
|
|
|
|
|
|
|
|
|
|
--asynOpen("UiDoomsdayAllot", stageId) --资源分配弹窗
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
)
|
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--检查结算(失败结局直接弹结算)
|
2023-07-14 19:35:33 +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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
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")
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
--打开事件弹窗/跳转到事件指定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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
UpdateStageData(res.StageDb)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
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
|
2023-07-14 19:35:33 +00:00
|
|
|
|
---------------------Notify end------------------
|