c1_lua/lua/app/userdata/activity/activity_data.lua
2023-08-11 15:08:23 +08:00

492 lines
15 KiB
Lua
Raw 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.

local ActivityData = class("ActivityData", BaseData)
-- 活动id目前只有这一个活动
local ACT_ID = 106
local ACT_DAYS = 7
function ActivityData:ctor()
self.data.isDirty = false
end
function ActivityData:init()
self.actData = {}
ModuleManager.ActivityManager:reqSummerData()
self:markGiftPop()
end
function ActivityData:setDirty()
self.data.isDirty = not self.data.isDirty
end
function ActivityData:isOpen()
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.ACTIVITY, true) then
return false
end
if #self:getActiveIdList() <= 0 then
return false
end
return true
end
-- 获取活动时间配置
function ActivityData:getActCfg()
return ConfigManager:getConfig("activity")[ACT_ID]
end
-- 获取活动战令配置
function ActivityData:getBountyCfg()
if self.bountyCfg == nil then
self.bountyCfg = {}
for id, data in pairs(ConfigManager:getConfig("activity_bounty_level")) do
if data.act_id == ACT_ID then
data.id = id
table.insert(self.bountyCfg, data)
end
end
table.sort(self.bountyCfg, function (a, b)
return a.id < b.id
end)
end
return self.bountyCfg
end
-- 获取当前开启的活动id列表
function ActivityData:getActiveIdList()
local result = {}
for id, data in pairs(ConfigManager:getConfig("activity")) do
if self:isInActiveTime() then
table.insert(result, id)
end
end
return result
end
-- 是否在活动时间内
function ActivityData:isInActiveTime()
if self.actData.activated_at == nil or self.actData.activated_at <= 0 then
return false
end
local startTime = Time:getBeginningOfOneDay(self.actData.activated_at // 1000)
local endTime = startTime + ACT_DAYS * 24 * 60 * 60
return Time:getServerTime() >= startTime and Time:getServerTime() <= endTime
end
-- 获取活动开启剩余时间(秒)
function ActivityData:getStartRemainTime()
local startTime = Time:getCertainTimeByStr(self:getActCfg().start_time)
return startTime - Time:getServerTime()
end
-- 获取活动结束剩余时间(秒)
function ActivityData:getEndRemainTime()
local startTime = Time:getBeginningOfOneDay(self.actData.activated_at // 1000)
local endTime = startTime + ACT_DAYS * 24 * 60 * 60
return math.floor(endTime) - Time:getServerTime()
end
-- 当前为活动第几天
function ActivityData:getActDay()
if self.actData == nil then
return 0
end
local days = Time:getDistanceDays(self.actData.activated_at // 1000)
if days < 0 then
days = -days
end
return days + 1
end
-- 获取活动标题
function ActivityData:getActTitle()
return I18N:getGlobalText(I18N.GlobalConst.ACT_DESC_2)
end
-- 获取活动标题背景
function ActivityData:getActTitleBg()
return GConst.ATLAS_PATH.ACT_SUMMER, "act_summer_title_1"
end
-- 是否有入口红点
function ActivityData:hasEntryRedPoint()
return self:hasTaskRedPoint() or self:hasBountyRedPoint() or self:hasSkinRedPoint() or self:hasHeroRedPoint()
end
-- 获取活动数据成功
function ActivityData:onGetActData(data)
self.actData = data
-- 注册任务进度监听
if self:isInActiveTime() then
for id, data in ipairs(ConfigManager:getConfig("activity_bounty_task")) do
ModuleManager.TaskManager:registerTask("ActivityData", data.type, function(count)
self:addTaskProgress(data.type, count)
end)
end
end
if EDITOR_MODE then
Logger.logHighlight("夏日活动:".. self:getActDay())
Logger.printTable(data)
end
ModuleManager.ActivityManager:initSummerTimer()
self:setDirty()
end
-- 任务--------------------------------------------------------------------------------------------------
-- 获取今日任务列表
function ActivityData:getTaskListSort()
local canGet = {}
local unfinish = {}
local result = {}
for index, id in ipairs(table.keys(ConfigManager:getConfig("activity_bounty_task"))) do
if self:canGetTaskReward(id) then
-- 已完成
if self:isReceivedTaskReward(id) then
-- 已领取
table.insert(result, id)
else
-- 未领取
table.insert(canGet, id)
end
else
--未完成
table.insert(unfinish, id)
end
end
unfinish = table.addArray(canGet, unfinish)
result = table.addArray(unfinish, result)
return result
end
-- 获取任务目标
function ActivityData:getTaskTarget(id)
return ConfigManager:getConfig("activity_bounty_task")[id].number[self:getTaskStage(id)]
end
-- 获取任务奖励
function ActivityData:getTaskRewardNum(id)
return ConfigManager:getConfig("activity_bounty_task")[id].reward[self:getTaskStage(id)]
end
-- 获取任务icon
function ActivityData:getTaskIcon(id)
return ConfigManager:getConfig("activity_bounty_task")[id].icon
end
-- 获取任务描述
function ActivityData:getTaskDesc(id)
local cfg = I18N:getConfig("activity_bounty_task")
if cfg == nil then
return GConst.EMPTY_STRING
end
return cfg[id].desc
end
-- 获取任务类型
function ActivityData:getTaskType(id)
return ConfigManager:getConfig("activity_bounty_task")[id].type
end
-- 获取任务总阶段数
function ActivityData:getTaskTotalStageNum(id)
local cfg = ConfigManager:getConfig("activity_bounty_task")[id]
if #cfg.number ~= #cfg.reward then
Logger.logError("活动任务阶段和奖励数量不一致,让策划检查配置!")
end
return #cfg.number
end
-- 获取任务所处阶段
function ActivityData:getTaskStage(id)
local stage = 1
local maxStage = self:getTaskTotalStageNum(id)
stage = self:getTaskClaimedStage(id) + 1
if stage > maxStage then
stage = maxStage
end
return stage
end
-- 获取任务进度
function ActivityData:getTaskProgress(id)
local taskType = self:getTaskType(id)
if self.actData and self.actData.task_info and self.actData.task_info.summer_task and self.actData.task_info.summer_task[taskType] then
return self.actData.task_info.summer_task[taskType]
end
return 0
end
-- 获取任务已领取的最大阶段
function ActivityData:getTaskClaimedStage(id)
local taskType = self:getTaskType(id)
if self.actData and self.actData.task_info and self.actData.task_info.claimed_stage and self.actData.task_info.claimed_stage[taskType] then
return self.actData.task_info.claimed_stage[taskType]
end
return 0
end
-- 任务是否完成
function ActivityData:canGetTaskReward(id)
return self:getTaskProgress(id) >= self:getTaskTarget(id)
end
-- 任务奖励是否已领取
function ActivityData:isReceivedTaskReward(id)
return self:getTaskClaimedStage(id) >= self:getTaskStage(id)
end
-- 是否有任务红点
function ActivityData:hasTaskRedPoint()
for index, id in ipairs(table.keys(ConfigManager:getConfig("activity_bounty_task"))) do
if self:canGetTaskReward(id) and not self:isReceivedTaskReward(id) then
return true
end
end
return false
end
-- 添加任务进度
function ActivityData:addTaskProgress(taskType, count)
if self.actData.task_info.summer_task[taskType] == nil then
self.actData.task_info.summer_task[taskType] = 0
end
self.actData.task_info.summer_task[taskType] = self.actData.task_info.summer_task[taskType] + count
self:setDirty()
end
-- 领取任务奖励成功
function ActivityData:onReceivedTaskReward(id, getMaxStage, level, exp)
local taskType = self:getTaskType(id)
self.actData.task_info.claimed_stage[taskType] = getMaxStage
self.actData.level = level
self.actData.exp = exp
self:setDirty()
end
-- 战令--------------------------------------------------------------------------------------------------
-- 获取战令档位0免费档1、2付费档
function ActivityData:getBountyGrade()
if DataManager.ShopData:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ActivityConst.BOUNTY_GIFT_ID_2) > 0 then
return GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY2
end
if DataManager.ShopData:getGiftBoughtNum(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ActivityConst.BOUNTY_GIFT_ID_1) > 0 then
return GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY1
end
return GConst.ActivityConst.BOUNTY_GRADE_TYPE.FREE
end
-- 获取战令档位礼包配置
function ActivityData:getBountyGradeGiftCfg(gradeType)
if gradeType == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY1 then
return DataManager.ShopData:getActGiftConfig()[GConst.ActivityConst.BOUNTY_GIFT_ID_1]
elseif gradeType == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY2 then
return DataManager.ShopData:getActGiftConfig()[GConst.ActivityConst.BOUNTY_GIFT_ID_2]
end
end
-- 战令最大等级
function ActivityData:getBountyMaxLevel()
return #self:getBountyCfg()
end
-- 获取战令等级
function ActivityData:getBountyLevel()
if self.actData == nil or self.actData.level == nil then
return 1
end
return self.actData.level
end
-- 获取当前等级战令积分
function ActivityData:getBountyLevelScore()
if self.actData == nil or self.actData.exp == nil then
return 0
end
return self.actData.exp
end
-- 获取当前升级所需总积分
function ActivityData:getBountyUpgradeScore()
return self:getBountyCfg()[self:getBountyLevel()].exp
end
-- 是否满足购买战令等级的条件
function ActivityData:canBuyBountyLevel()
return self:getActDay() >= GFunc.getConstIntValue("activity_bounty_day")
end
-- 购买战令等级的消耗
function ActivityData:getBuyBountyLevelCost()
return GFunc.getConstReward("activity_bounty_cost")
end
-- 是否有战令红点
function ActivityData:hasBountyRedPoint()
local curLevel = self:getBountyLevel()
local lv = 0
for idx, data in ipairs(self:getBountyCfg()) do
lv = lv + 1
if lv > curLevel then
break
end
if self:canGetBountyReward(lv, GConst.ActivityConst.BOUNTY_GRADE_TYPE.FREE) then
return true
end
if self:canGetBountyReward(lv, GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY1) then
return true
end
if self:canGetBountyReward(lv, GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY2) then
return true
end
end
return false
end
-- 获取战令档位所有奖励,排序
function ActivityData:getBountyGradeAllRewardSort(grade)
local rewards = {}
for idx, data in ipairs(self:getBountyCfg()) do
if grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.FREE then
table.insert(rewards, data.reward)
elseif grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY1 then
table.insert(rewards, data.reward_pro)
elseif grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY2 then
table.insert(rewards, data.reward_pro_max)
end
end
rewards = GFunc.mergeRewards(rewards)
table.sort(rewards, function(a, b)
return a.id > b.id
end)
return rewards
end
-- 获取战令档位奖励
function ActivityData:getBountyGradeReward(level, grade)
local cfg = self:getBountyCfg()[level]
local result
if cfg ~= nil then
if grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.FREE then
result = cfg.reward
elseif grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY1 then
result = cfg.reward_pro
elseif grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY2 then
result = cfg.reward_pro_max
end
end
return result
end
-- 战令奖励是否满足领取条件
function ActivityData:isReachBountyReward(level, grade)
local curLevel = self:getBountyLevel()
local curGrade = self:getBountyGrade()
if curLevel >= level then
return grade <= curGrade
else
return false
end
end
-- 战令奖励可领取
function ActivityData:canGetBountyReward(level, grade)
return self:isReachBountyReward(level, grade) and not self:isReceivedBountyReward(level, grade)
end
-- 战令奖励是否已领取
function ActivityData:isReceivedBountyReward(level, grade)
local id = self:getBountyCfg()[level].id
if self.actData == nil or self.actData.collected == nil or self.actData.collected[id] == nil then
return false
end
if grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.FREE then
return self.actData.collected[id].normal
elseif grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY1 then
return self.actData.collected[id].superior
elseif grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY2 then
return self.actData.collected[id].superior_max
end
end
-- 战令档位购买成功
function ActivityData:onBuyBountyGrade(giftId)
local grade
if giftId == GConst.ActivityConst.BOUNTY_GIFT_ID_1 then-- 解锁1档
grade = GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY1
elseif giftId == GConst.ActivityConst.BOUNTY_GIFT_ID_2 then-- 解锁2档
grade = GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY2
end
ModuleManager.ActivityManager:reqSummerBountyReward(0, grade)-- 请求档位全部奖励
self:setDirty()
end
-- 战令奖励领取成功
function ActivityData:onReceivedBountyReward(successMap)
for id, grade in pairs(successMap) do
if self.actData.collected[id] == nil then
self.actData.collected[id] = {}
end
if grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.FREE then
self.actData.collected[id].normal = true
elseif grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY1 then
self.actData.collected[id].superior = true
elseif grade == GConst.ActivityConst.BOUNTY_GRADE_TYPE.PAY2 then
self.actData.collected[id].superior_max = true
end
end
self:setDirty()
end
-- 解锁战令等级成功
function ActivityData:onBoughtBountyLevel()
self.actData.level = self.actData.level + 1
self:setDirty()
end
-- 礼包--------------------------------------------------------------------------------------------------
-- 标记礼包弹出状态
function ActivityData:markGiftPop()
if DataManager.ShopData:getGiftRemainBuyNum(GConst.ActivityConst.SKIN_GIFT_ID_1) > 0 then
DataManager.ShopData:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ActivityConst.SKIN_GIFT_ID_1)
elseif DataManager.ShopData:getGiftRemainBuyNum(GConst.ActivityConst.SKIN_GIFT_ID_2) > 0 then
DataManager.ShopData:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ActivityConst.SKIN_GIFT_ID_2)
end
if DataManager.ShopData:getGiftRemainBuyNum(GConst.ActivityConst.HERO_GIFT_ID_1) > 0 then
DataManager.ShopData:markPopUpGift(PayManager.PURCHARSE_TYPE.ACT_GIFT, GConst.ActivityConst.HERO_GIFT_ID_1)
end
end
-- 皮肤礼包是否有红点
function ActivityData:hasSkinRedPoint()
return not LocalData:getTodayActSummerWatchedSkin()
end
-- 英雄礼包是否有红点
function ActivityData:hasHeroRedPoint()
return not LocalData:getTodayActSummerWatchedHero()
end
return ActivityData