418 lines
11 KiB
Lua
Executable File
418 lines
11 KiB
Lua
Executable File
local ActTaskData = class("ActTaskData", BaseData)
|
|
|
|
function ActTaskData:setDirty()
|
|
self.data.isDirty = not self.data.isDirty
|
|
end
|
|
|
|
function ActTaskData:ctor()
|
|
end
|
|
|
|
function ActTaskData:clear()
|
|
self.taskData = nil
|
|
self.taskDataScore = nil
|
|
end
|
|
|
|
-- 任务初始化
|
|
function ActTaskData:initTaskData(scoreData, normalData)
|
|
scoreData = scoreData or {}
|
|
normalData = normalData or {}
|
|
if EDITOR_MODE then
|
|
Logger.logHighlight("活动任务数据")
|
|
Logger.printTable(scoreData)
|
|
Logger.printTable(normalData)
|
|
end
|
|
|
|
self.taskData = self.taskData or {}
|
|
self.taskDataScore = self.taskDataScore or {}
|
|
|
|
for i, info in ipairs(normalData.task_data) do
|
|
self.taskData[info.activity_id] = self.taskData[info.activity_id] or {}
|
|
self.taskData[info.activity_id][info.data.id] = info.data
|
|
end
|
|
|
|
for i, info in ipairs(scoreData.task_data) do
|
|
self.taskDataScore[info.activity_id] = self.taskDataScore[info.activity_id] or {}
|
|
self.taskDataScore[info.activity_id] = info
|
|
self.taskDataScore[info.activity_id].claimedMap = {}
|
|
for _, taskId in ipairs(info.claimed) do
|
|
self.taskDataScore[info.activity_id].claimedMap[taskId] = true
|
|
end
|
|
end
|
|
|
|
if not self.isInit then
|
|
self.isInit = true
|
|
-- 监听任务
|
|
for id, info in pairs(self:getTaskConfig()) do
|
|
ModuleManager.TaskManager:registerTask("ActTaskData", info.type, function(count)
|
|
self:addTaskProgressCallback(info.type, count)
|
|
self:addTaskProgressCallbackScore(info.type, count)
|
|
end)
|
|
end
|
|
-- 跨天
|
|
DataManager:registerCrossDayFunc("ActTaskData", function()
|
|
self:setDirty()
|
|
end)
|
|
end
|
|
end
|
|
|
|
--region 普通任务
|
|
function ActTaskData:getTaskIdList(actId)
|
|
local cfg = self:getTaskConfig()
|
|
local actTaskList = {}
|
|
for taskId, info in pairs(cfg) do
|
|
if info.activity == actId and info.display == 2 then
|
|
table.insert(actTaskList, taskId)
|
|
end
|
|
end
|
|
return actTaskList
|
|
end
|
|
|
|
function ActTaskData:addTaskProgressCallback(taskType, count)
|
|
for actId, data in pairs(self.taskData) do
|
|
for i, taskId in ipairs(self:getAllTaskIdsByActId(actId)) do
|
|
if self:getTaskType(taskId) == taskType and self:getTaskDisplay(taskId) == 2 then
|
|
self:addTaskProgress(actId, taskId, count)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 添加任务进度
|
|
function ActTaskData:addTaskProgress(actId, taskId, count)
|
|
if not self:isTaskFinished(actId, taskId) then
|
|
local taskType = self:getTaskType(taskId)
|
|
local data = self:getTaskData(actId, taskId)
|
|
if table.containValue(GConst.TaskConst.RELPACE_TASK_TYPE, taskType) then
|
|
data.progress = math.max(data.progress or 0, count)
|
|
else
|
|
data.progress = (data.progress or 0) + count
|
|
end
|
|
end
|
|
self:setDirty()
|
|
end
|
|
|
|
function ActTaskData:getTaskData(actId, taskId)
|
|
if taskId then
|
|
self.taskData[actId] = self.taskData[actId] or {}
|
|
if self.taskData[actId][taskId] == nil then
|
|
self.taskData[actId][taskId] = {id = taskId, progress = 0, claimed = 0}
|
|
end
|
|
return self.taskData[actId][taskId]
|
|
else
|
|
return self.taskData[actId]
|
|
end
|
|
end
|
|
|
|
-- 获取活动全部任务id
|
|
function ActTaskData:getAllTaskIdsByActId(actId)
|
|
self.taskIds = self.taskIds or {}
|
|
if self.taskIds[actId] == nil then
|
|
self.taskIds[actId] = {}
|
|
for id, info in pairs(self:getTaskConfig()) do
|
|
if self:getActId(id) == actId then
|
|
table.insert(self.taskIds[actId], id)
|
|
end
|
|
end
|
|
table.sort(self.taskIds, function(a, b) return a.id < b.id end)
|
|
end
|
|
|
|
return self.taskIds[actId]
|
|
end
|
|
|
|
-- 获取任务当前进度
|
|
function ActTaskData:getTaskProg(actId, taskId)
|
|
taskId = tonumber(taskId)
|
|
local data = self:getTaskData(actId, taskId)
|
|
return data and data.progress or 0
|
|
end
|
|
|
|
-- 任务是否已领取
|
|
function ActTaskData:isTaskReceived(actId, taskId)
|
|
taskId = tonumber(taskId)
|
|
local data = self:getTaskData(actId, taskId)
|
|
return data and data.claimed and data.claimed > 0
|
|
end
|
|
|
|
-- 任务是否已完成
|
|
function ActTaskData:isTaskFinished(actId, taskId)
|
|
return self:getTaskProg(actId, taskId) >= self:getTaskTarget(taskId)
|
|
end
|
|
|
|
-- 任务是否可领取
|
|
function ActTaskData:canClaimTask(actId, taskId)
|
|
return self:isTaskFinished(actId, taskId) and not self:isTaskReceived(actId, taskId)
|
|
end
|
|
|
|
-- 重置任务数据
|
|
function ActTaskData:resetTaskData(actId)
|
|
for taskId, data in pairs(self:getTaskData(actId)) do
|
|
data.claimed = 0
|
|
data.progress = 0
|
|
end
|
|
self:setDirty()
|
|
end
|
|
|
|
-- 领奖成功
|
|
function ActTaskData:onTaskClaimed(actId, taskId)
|
|
local data = self:getTaskData(actId, taskId)
|
|
data.claimed = 1
|
|
self:setDirty()
|
|
end
|
|
|
|
-- 普通任务列表
|
|
function ActTaskData:getTaskSortList(actId)
|
|
local list = {}
|
|
local cfg = self:getTaskConfig()
|
|
for taskId, info in pairs(cfg) do
|
|
if info.activity == actId and info.display == 2 then
|
|
local info = {}
|
|
info.id = taskId
|
|
info._sort = 1000000 - taskId
|
|
if self:canClaimTask(actId, taskId) then
|
|
info._sort = info._sort + 100000000
|
|
end
|
|
if not self:isTaskFinished(actId, taskId) then
|
|
info._sort = info._sort + 10000000
|
|
end
|
|
table.insert(list, info)
|
|
end
|
|
end
|
|
table.sort(list, function(a, b)
|
|
-- 已完成(可领奖) > 进行中 > 已完成(已领奖) > id
|
|
return a._sort > b._sort
|
|
end)
|
|
|
|
return list
|
|
end
|
|
--endregion
|
|
|
|
--region 积分任务
|
|
function ActTaskData:getTaskIdListScore(actId)
|
|
local cfg = self:getTaskConfig()
|
|
local actTaskList = {}
|
|
for taskId, info in pairs(cfg) do
|
|
if info.activity == actId and info.display == 1 then
|
|
table.insert(actTaskList, taskId)
|
|
end
|
|
end
|
|
return actTaskList
|
|
end
|
|
|
|
function ActTaskData:addTaskProgressCallbackScore(taskType, count)
|
|
for actId, data in pairs(self.taskDataScore) do
|
|
local actTaskList = self:getTaskIdListScore(actId)
|
|
if actTaskList and actTaskList[1] then
|
|
if self:getTaskType(actTaskList[1]) == taskType then
|
|
data.score = (data.score or 0) + count
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 添加任务进度
|
|
function ActTaskData:addTaskProgressScore(actId, taskId, count)
|
|
if not self:isTaskFinishedScore(actId, taskId) then
|
|
self.taskDataScore[actId].score = (self.taskDataScore[actId].score or 0) + count
|
|
end
|
|
self:setDirty()
|
|
end
|
|
|
|
function ActTaskData:getTaskNumScore(actId, actTaskId)
|
|
if self:getTaskDisplay(actTaskId) == 1 then
|
|
return self.taskDataScore[actId].score or 0
|
|
else
|
|
return self.taskData[actTaskId] or 0
|
|
end
|
|
end
|
|
|
|
function ActTaskData:getMaxTurnScore(actId)
|
|
return DataManager.ActivityData:getActRoundLimit(actId)
|
|
end
|
|
|
|
function ActTaskData:getRewardsgetMaxTurnScore(actId)
|
|
return DataManager.ActivityData:getActRoundReward(actId)
|
|
end
|
|
|
|
function ActTaskData:getHasGotTaskRewardScore(actId, actTaskId)
|
|
return self.taskDataScore[actId].round >= self:getMaxTurnScore(actId) or self.taskDataScore[actId].claimedMap[actTaskId]
|
|
end
|
|
|
|
function ActTaskData:getTaskDataScore(actId)
|
|
return self.taskDataScore[actId] or {activity_id = actId, score = 0, total_score = 0, round = 0, round_claimed = 0, claimed = {}, claimedMap = {}}
|
|
end
|
|
|
|
-- 获取任务当前进度
|
|
function ActTaskData:getTaskProgScore(actId)
|
|
local data = self:getTaskDataScore(actId)
|
|
return data and data.score or 0
|
|
end
|
|
|
|
-- 任务是否已完成
|
|
function ActTaskData:isTaskFinishedScore(actId, taskId)
|
|
return self:getTaskProgScore(actId) >= self:getTaskTarget(taskId)
|
|
end
|
|
|
|
function ActTaskData:getTurnLimitScore(actId)
|
|
local scoreLimit = 0
|
|
local list = self:getTaskIdListScore(actId)
|
|
for _, id in ipairs(list) do
|
|
local cfg = self:getTaskConfig(id)
|
|
if cfg then
|
|
if self:getTaskTarget(id) > scoreLimit then
|
|
scoreLimit = self:getTaskTarget(id)
|
|
end
|
|
end
|
|
end
|
|
return scoreLimit
|
|
end
|
|
|
|
-- 特定任务是否可领奖
|
|
function ActTaskData:getCanGetTaskRewardScore(actId, actTaskId)
|
|
if not self:getHasGotTaskRewardScore(actId, actTaskId) and self:getTaskNumScore(actId, actTaskId) >= self:getTaskTarget(actTaskId) then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function ActTaskData:getCanGetTurnRewardScore(actId)
|
|
actId = actId or self.actId
|
|
-- 当前任务全部领取 未领取当前波次奖励
|
|
if (self:getClaimedTurnScore(actId) < self:getTurnScore(actId)) then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- 是否已经领完了全部的轮次奖励
|
|
function ActTaskData:getGotAllTurnRewardScore(actId)
|
|
local claimed = self:getClaimedTurnScore(actId) or 0
|
|
local maxTurn = self:getMaxTurnScore(actId)
|
|
return claimed >= maxTurn
|
|
end
|
|
|
|
function ActTaskData:getTurnScore(actId)
|
|
return self.taskDataScore[actId].round or 0
|
|
end
|
|
|
|
function ActTaskData:getClaimedTurnScore(actId)
|
|
return self.taskDataScore[actId].round_claimed or 0
|
|
end
|
|
|
|
-- 成功领取轮次奖励
|
|
function ActTaskData:onGetTurnRewardScore(actId)
|
|
self.taskDataScore[actId].round_claimed = (self.taskDataScore[actId].round_claimed or 0) + 1
|
|
self:setDirty()
|
|
end
|
|
|
|
function ActTaskData:getCanAnyTaskCanGetRewardScore(actId)
|
|
local taskList = self:getActTaskListScore(actId)
|
|
for _, actTaskId in ipairs(taskList) do
|
|
if self:getCanGetTaskRewardScore(actId, actTaskId) then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- 领取任务成功
|
|
function ActTaskData:onTaskSuccessScore(actId, actTaskId)
|
|
self.taskDataScore[actId] = self.taskDataScore[actId] or {}
|
|
if actTaskId and actTaskId > 0 then
|
|
self.taskDataScore[actId].claimedMap[actTaskId] = true
|
|
else
|
|
local list = self:getTaskIdListScore(actId)
|
|
for _, id in ipairs(list) do
|
|
if self:getCanGetTaskRewardScore(actId, id) then
|
|
self.taskDataScore[actId].claimedMap[id] = true
|
|
end
|
|
end
|
|
end
|
|
-- 如果所有任务都领取了 增加轮次
|
|
local list = self:getTaskIdListScore(actId)
|
|
local isAllGot = true
|
|
for _, id in ipairs(list) do
|
|
if not self:getHasGotTaskRewardScore(actId, id) then
|
|
isAllGot = false
|
|
break
|
|
end
|
|
end
|
|
if isAllGot then
|
|
self.taskDataScore[actId].round = (self.taskDataScore[actId].round or 0) + 1
|
|
self.taskDataScore[actId].claimedMap = {}
|
|
self.taskDataScore[actId].score = self.taskDataScore[actId].score - self:getTurnLimitScore(actId)
|
|
end
|
|
self:setDirty()
|
|
end
|
|
|
|
-- 达标任务列表
|
|
function ActTaskData:getActTaskListScore(actId)
|
|
local list = {}
|
|
local cfg = self:getTaskConfig()
|
|
for taskId, info in pairs(cfg) do
|
|
if info.activity == actId and info.display == 1 then
|
|
table.insert(list, taskId)
|
|
end
|
|
end
|
|
table.sort(list, function(a, b)
|
|
-- 已完成(可领奖) > 进行中 > 已完成(已领奖) > id
|
|
local canGetA = self:getCanGetTaskRewardScore(actId, a)
|
|
local canGetB = self:getCanGetTaskRewardScore(actId, b)
|
|
if canGetA == canGetB then
|
|
local gotA = self:getHasGotTaskRewardScore(actId, a)
|
|
local gotB = self:getHasGotTaskRewardScore(actId, b)
|
|
if gotA == gotB then
|
|
return a < b
|
|
else
|
|
return gotB
|
|
end
|
|
else
|
|
return canGetA
|
|
end
|
|
end)
|
|
|
|
return list
|
|
end
|
|
--endregion
|
|
|
|
--region 任务配置
|
|
function ActTaskData:getTaskConfig(taskId)
|
|
if taskId then
|
|
return ConfigManager:getConfig("act_task")[taskId]
|
|
else
|
|
return ConfigManager:getConfig("act_task")
|
|
end
|
|
end
|
|
|
|
-- 获取任务活动id
|
|
function ActTaskData:getActId(taskId)
|
|
return self:getTaskConfig(taskId).activity
|
|
end
|
|
|
|
-- 获取任务类型
|
|
function ActTaskData:getTaskType(taskId)
|
|
return self:getTaskConfig(taskId).type
|
|
end
|
|
|
|
-- 获取任务目标
|
|
function ActTaskData:getTaskTarget(taskId)
|
|
return self:getTaskConfig(taskId).number_1
|
|
end
|
|
|
|
-- 获取任务奖励
|
|
function ActTaskData:getTaskReward(taskId)
|
|
return self:getTaskConfig(taskId).reward
|
|
end
|
|
|
|
-- 获取任务展示要求
|
|
function ActTaskData:getTaskDisplay(taskId)
|
|
return self:getTaskConfig(taskId).display
|
|
end
|
|
|
|
function ActTaskData:getTaskI18NName(taskId)
|
|
return ConfigManager:getConfig("act_task")[taskId].desc
|
|
end
|
|
--endregion
|
|
|
|
return ActTaskData |