c1_lua/lua/app/userdata/task/daily_task_data.lua
2025-08-21 16:00:11 +08:00

477 lines
12 KiB
Lua

local DailyTaskData = class("DailyTaskData", BaseData)
local TaskDailyCfg = ConfigManager:getConfig("task_daily")
local TaskDailyStageCfg = ConfigManager:getConfig("task_daily_stage")
local TaskAchievementCfg = ConfigManager:getConfig("task_achievement")
function DailyTaskData:ctor()
self.data.isDirty = false
end
function DailyTaskData:clear()
DataManager:unregisterCrossDayFunc("DailyTaskData")
ModuleManager.TaskManager:unRegisterAllModuleTask("DailyTaskData")
end
function DailyTaskData:setDirty()
self.data.isDirty = not self.data.isDirty
end
function DailyTaskData:init(daily, achievement)
daily = daily or {}
achievement = achievement or {}
self:initDaily(daily)
self:initAchievement(achievement)
-- 监听任务
for id, info in pairs(TaskDailyCfg) do
ModuleManager.TaskManager:registerTask("DailyTaskData", info.task_type, function(count)
self.dailyRedState = nil
self:addTaskProgress(info.task_type, count)
end)
end
for id, info in pairs(TaskAchievementCfg) do
ModuleManager.TaskManager:registerTask("DailyTaskData", info.type, function(count)
self.achievementRedState = nil
self:addTaskProgress(info.type, count)
end)
end
-- 跨天
DataManager:registerCrossDayFunc("DailyTaskData", function()
-- 重置任务数据
for id, data in pairs(self.dailyTaskData) do
data.claimed = 0
data.progress = 0
end
-- 重置进度奖励数据
for id, claimed in pairs(self.progRewardData) do
self.progRewardData[id] = false
end
self.dayPoint = 0
self:setDirty()
end)
self.dailyRedState = nil
self.achievementRedState = nil
self:showRedPoint()
end
function DailyTaskData:initDaily(daily)
daily = daily or {}
--任务领取状态&进度
self.dailyTaskData = daily.tasks or {}
-- 活跃度
self.dayPoint = daily.point or 0
-- 活跃度领奖
self.progRewardData = daily.stage_reward_claimed or {}
-- 任务配置
self.dailyTaskIds = {}
for id, info in pairs(TaskDailyCfg) do
table.insert(self.dailyTaskIds, id)
end
table.sort(self.dailyTaskIds)
-- 阶段配置
self.dailyStageIds = {}
for id, info in pairs(TaskDailyStageCfg) do
table.insert(self.dailyStageIds, id)
end
table.sort(self.dailyStageIds)
self.dailyRedState = nil
self:showRedPoint()
end
function DailyTaskData:initAchievement(achievement)
achievement = achievement or {}
-- 成就任务
self.achievementData = achievement.tasks or {}
self.achievementRedState = nil
self:showRedPoint()
end
function DailyTaskData:getIsOpen(showToast)
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.TASK, not showToast) then
return false
end
return true
end
function DailyTaskData:showRedPoint()
if self.dailyRedState == nil and self.achievementRedState == nil then
return self:showDailyRedPoint() or self:showAchievementRedPoint()
end
return self.dailyRedState or self.achievementRedState
end
function DailyTaskData:showDailyRedPoint()
if not self.dailyTaskData then
return
end
if self.dailyRedState ~= nil then
return self.dailyRedState
end
for idx, id in pairs(self.dailyTaskIds) do
if self:canClaimTask(id) then
self.dailyRedState = true
return true
end
end
for idx, id in pairs(self.dailyStageIds) do
if self:canClaimStage(id) then
self.dailyRedState = true
return true
end
end
self.dailyRedState = false
return false
end
function DailyTaskData:showAchievementRedPoint()
if not self.achievementData then
return
end
if self.achievementRedState ~= nil then
return self.achievementRedState
end
for id, info in pairs(TaskAchievementCfg) do
for stage = 1, self:getAchievementTotalStage(id) do
if self:canClaimAchievement(id, stage) then
self.achievementRedState = true
return true
end
end
end
self.achievementRedState = false
return false
end
-- 是否完成全部每日任务
function DailyTaskData:isAllDailyTaskFinished()
for idx, id in pairs(self.dailyTaskIds) do
if not self:isTaskReceived(id) then
return false
end
end
for idx, id in pairs(self.dailyStageIds) do
if not self:isStageReceived(id) then
return false
end
end
return true
end
-- 任务 -----------------------------------------------------------------------------------------------------------------------------------------
-- 任务是否开启
function DailyTaskData:isTaskOpen(taskId)
if TaskDailyCfg[taskId].func_open == nil then
return true
end
return ModuleManager:getIsOpen(TaskDailyCfg[taskId].func_open, true)
end
-- 获取任务类型
function DailyTaskData:getTaskType(taskId)
return TaskDailyCfg[taskId].task_type
end
-- 获取任务循环类型
function DailyTaskData:getTaskRoutineType(taskId)
return TaskDailyCfg[taskId].routine_type
end
-- 获取任务目标
function DailyTaskData:getTaskTarget(taskId)
return TaskDailyCfg[taskId].number
end
-- 获取任务奖励点数
function DailyTaskData:getTaskPoint(taskId)
return TaskDailyCfg[taskId].value
end
-- 获取任务当前进度
function DailyTaskData:getTaskProg(taskId)
taskId = tonumber(taskId)
return self.dailyTaskData[taskId] and self.dailyTaskData[taskId].progress or 0
end
-- 任务是否已领取
function DailyTaskData:isTaskReceived(taskId)
taskId = tonumber(taskId)
return self.dailyTaskData[taskId] and self.dailyTaskData[taskId].claimed and self.dailyTaskData[taskId].claimed > 0
end
-- 任务是否已完成
function DailyTaskData:isTaskFinished(taskId)
return self:getTaskProg(taskId) >= self:getTaskTarget(taskId)
end
-- 任务是否可领取
function DailyTaskData:canClaimTask(taskId)
return self:isTaskFinished(taskId) and not self:isTaskReceived(taskId)
end
-- 获取可领奖的所有任务id
function DailyTaskData:getCanClaimTaskIds()
local ids = {}
for idx, taskId in pairs(self.dailyTaskIds) do
if self:canClaimTask(taskId) then
table.insert(ids, taskId)
end
end
return ids
end
-- 获取可展示的每日任务id列表
function DailyTaskData:getTaskIdsSort()
local taskids = self.dailyTaskIds or {}
local temp = {}
for i, id in ipairs(taskids) do
if self:isTaskOpen(id) then
local info = {id = id, sort = id}
if self:canClaimTask(id) then
info.sort = info.sort - 10000
end
if self:isTaskReceived(id) then
info.sort = info.sort + 10000
end
table.insert(temp, info)
end
end
table.sort(temp, function(a, b)
return a.sort < b.sort
end)
local ids = {}
for i, data in ipairs(temp) do
table.insert(ids, data.id)
end
return ids
end
-- 任务进度变化
function DailyTaskData:addTaskProgress(taskType, count)
for taskId, info in pairs(TaskDailyCfg) do
if self:getTaskType(taskId) == taskType then
self.dailyTaskData[taskId] = self.dailyTaskData[taskId] or {}
if not self:isTaskFinished(taskId) then
self.dailyTaskData[taskId].progress = (self.dailyTaskData[taskId].progress or 0) + count
end
end
end
for achievementId, info in pairs(TaskAchievementCfg) do
if self:getTaskTypeByAchievementId(achievementId) == taskType then
self.achievementData[achievementId] = self.achievementData[achievementId] or {}
if not self:isAchievementFinished(achievementId, self:getAchievementTotalStage(achievementId)) then
self.achievementData[achievementId].progress = (self.achievementData[achievementId].progress or 0) + count
end
end
end
self.dailyRedState = nil
self.achievementRedState = nil
self:setDirty()
end
-- 领奖成功
function DailyTaskData:onTaskClaimed(dayPoint)
self.dayPoint = dayPoint or self.dayPoint
for idx, taskId in pairs(self:getCanClaimTaskIds()) do
self.dailyTaskData[taskId].claimed = 1
end
self.dailyRedState = nil
self:setDirty()
end
-- 阶段 -----------------------------------------------------------------------------------------------------------------------------------------
-- 领取条件
function DailyTaskData:getStageCondition(stageId)
return TaskDailyStageCfg[stageId].point
end
-- 获取奖励
function DailyTaskData:getStageReward(stageId)
return TaskDailyStageCfg[stageId].reward
end
-- 获取循环类型
function DailyTaskData:getStageRoutineType(stageId)
return TaskDailyStageCfg[stageId].routine_type
end
-- 获取阶段id列表
function DailyTaskData:getStageIds()
return self.dailyStageIds
end
-- 获取阶段奖励目标list
function DailyTaskData:getStageTargetList()
local targetList = {}
for i, id in ipairs(self.dailyStageIds) do
table.insert(targetList, self:getStageCondition(id))
end
table.sort(targetList, function(a, b)
return a < b
end)
return targetList
end
-- 获取当前活跃积分
function DailyTaskData:getCurStageScore()
return self.dayPoint
end
-- 是否已领奖
function DailyTaskData:isStageReceived(stageId)
stageId = tonumber(stageId)
return self.progRewardData[stageId] or false
end
-- 是否可领奖
function DailyTaskData:canClaimStage(stageId)
return self:getCurStageScore() >= self:getStageCondition(stageId) and not self:isStageReceived(stageId)
end
-- 领奖成功
function DailyTaskData:onStageClaimed(type, stageId)
if type and stageId == 0 then
for k, id in pairs(self:getStageIdsByType(type)) do
if self:canClaimStage(id) then
self.progRewardData[id] = true
end
end
else
self.progRewardData[stageId] = true
end
self.dailyRedState = nil
self:setDirty()
end
-- 成就 ---------------------------------------------------------------------------------------------------------------------------------------
-- 获取领奖条件
function DailyTaskData:getAchievementCondition(achievementId, stage)
return TaskAchievementCfg[achievementId].number[stage]
end
-- 获取奖励
function DailyTaskData:getAchievementReward(achievementId, stage)
return TaskAchievementCfg[achievementId].reward[stage]
end
function DailyTaskData:getTaskTypeByAchievementId(achievementId)
return TaskAchievementCfg[achievementId].type
end
-- 获取当前进度
function DailyTaskData:getAchievementProg(achievementId)
return self.achievementData[achievementId] and self.achievementData[achievementId].progress or 0
end
-- 获取任务总共阶段
function DailyTaskData:getAchievementTotalStage(achievementId)
return #TaskAchievementCfg[achievementId].number
end
-- 当前所处阶段
function DailyTaskData:getAchievementStage(achievementId)
local cfg = TaskAchievementCfg[achievementId]
local stageNum = #cfg.number
for stage = 1, stageNum do
if self:canClaimAchievement(achievementId, stage) then
return stage
end
if not self:isAchievementFinished(achievementId, stage) then
return stage
end
end
return stageNum
end
-- 是否已完成
function DailyTaskData:isAchievementFinished(achievementId, stage)
return self:getAchievementProg(achievementId) >= self:getAchievementCondition(achievementId, stage)
end
-- 是否已领奖
function DailyTaskData:isAchievementReceived(achievementId, stage)
achievementId = tonumber(achievementId)
self.achievementData[achievementId] = self.achievementData[achievementId] or {}
return self.achievementData[achievementId].claimed and self.achievementData[achievementId].claimed >= stage or false
end
-- 是否可领奖
function DailyTaskData:canClaimAchievement(achievementId, stage)
if self:isAchievementReceived(achievementId, stage) then
return false
end
if not self:isAchievementFinished(achievementId, stage) then
return false
end
return true
end
function DailyTaskData:getAchievementIdsSort()
local temp = {}
for id, info in ipairs(TaskAchievementCfg) do
local info = {id = id, sort = id}
local stage = self:getAchievementStage(id)
if self:canClaimAchievement(id, stage) then
info.sort = info.sort - 10000
end
if self:isAchievementReceived(id, stage) then
info.sort = info.sort + 10000
end
table.insert(temp, info)
end
table.sort(temp, function(a, b)
return a.sort < b.sort
end)
local ids = {}
for i, data in ipairs(temp) do
table.insert(ids, data.id)
end
return ids
end
-- 领奖成功
function DailyTaskData:onAchievementClaimed(achievementId, stage)
if achievementId == nil or stage == nil then
-- 一键领取
for achievementId, info in ipairs(TaskAchievementCfg) do
for stage = self:getAchievementStage(achievementId), self:getAchievementTotalStage(achievementId) do
if self:canClaimAchievement(achievementId, stage) then
self.achievementData[achievementId] = self.achievementData[achievementId] or {}
self.achievementData[achievementId].claimed = stage
end
end
end
else
self.achievementData[achievementId] = self.achievementData[achievementId] or {}
self.achievementData[achievementId].claimed = stage
end
self.achievementRedState = nil
self:setDirty()
end
return DailyTaskData