Files
Endfield-Data/LuaScripts/UI/Panels/ActivityWeeklyTask/ActivityWeeklyTaskCtrl.lua
2026-01-31 21:42:01 +07:00

354 lines
11 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.ActivityWeeklyTask
ActivityWeeklyTaskCtrl = HL.Class('ActivityWeeklyTaskCtrl', uiCtrl.UICtrl)
ActivityWeeklyTaskCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_CONDITIONAL_MULTI_STAGE_UPDATE] = 'OnUpdate',
[MessageConst.ON_ACTIVITY_UPDATED] = 'OnUpdate',
[MessageConst.ON_WEEKLY_TASK_CHANGE] = 'OnUpdate',
}
ActivityWeeklyTaskCtrl.m_activityId = HL.Field(HL.String) << ''
ActivityWeeklyTaskCtrl.m_activity = HL.Field(HL.Any)
ActivityWeeklyTaskCtrl.m_tasks = HL.Field(HL.Table)
ActivityWeeklyTaskCtrl.m_mileStones = HL.Field(HL.Table)
ActivityWeeklyTaskCtrl.m_taskCells = HL.Field(HL.Any)
ActivityWeeklyTaskCtrl.m_mileStoneCells = HL.Field(HL.Any)
ActivityWeeklyTaskCtrl.m_maxScore = HL.Field(HL.Number) << 0
ActivityWeeklyTaskCtrl.m_viewBindingId = HL.Field(HL.Number) << 0
ActivityWeeklyTaskCtrl.m_score = HL.Field(HL.Number) << 0
local TaskColorTable = {
[5] = "High",
[2] = "Middle",
[1] = "Low",
}
ActivityWeeklyTaskCtrl.OnCreate = HL.Override(HL.Any) << function(self, args)
self.m_score = -1
self.m_activityId = args.activityId
self.m_activity = GameInstance.player.activitySystem:GetActivity(self.m_activityId)
self.m_taskCells = UIUtils.genCellCache(self.view.taskCell)
self.m_mileStoneCells = UIUtils.genCellCache(self.view.mileStoneCell)
self.view.activityCommonInfo:InitActivityCommonInfo(args)
self.view.activityCommonInfo.view.infoNode.countDownWidget:InitCountDownText(Utils.getNextWeeklyServerRefreshTime())
self.m_viewBindingId = -1
self:_Refresh()
end
ActivityWeeklyTaskCtrl._SetNaviTarget = HL.Method(HL.Number) << function(self, index)
if index == 0 or not DeviceInfo.usingController then
return
end
local cell = self.m_taskCells:Get(index)
if cell then
UIUtils.setAsNaviTarget(cell.naviDecorator)
end
end
ActivityWeeklyTaskCtrl._Refresh = HL.Method() << function(self)
local activityUnlocked = ActivityUtils.isActivityUnlocked(self.m_activityId)
self.view.unlockedNode.gameObject:SetActive(activityUnlocked)
self.view.activityCommonInfo.view.gotoNode.gameObject:SetActive(not activityUnlocked)
if not activityUnlocked then
return
end
self:_GetTaskInfo()
self:_GetMileStoneInfo()
self:_RefreshTaskView()
self:_RefreshMileStoneView()
if DeviceInfo.usingController and self.m_viewBindingId < 0 then
self.m_viewBindingId = self:BindInputPlayerAction("common_view_item", function()
self:_SetNaviTarget(1)
end)
self.view.rightNaviGroup.onIsTopLayerChanged:AddListener(function(active)
InputManagerInst:ToggleBinding(self.m_viewBindingId, not active)
InputManagerInst:ToggleGroup(self.view.enterNode.groupId, not active)
end)
end
end
ActivityWeeklyTaskCtrl._GetTaskInfo = HL.Method() << function(self)
local tasks = {}
for id, task in pairs(self.m_activity.taskInfo) do
local success, taskInfo = Tables.activityWeeklyTaskTable:TryGetValue(id)
local progress = math.floor(task.Item2 * taskInfo.displayFactor + 1e-6)
local progressToCompare = math.floor(taskInfo.progressToCompare * taskInfo.displayFactor + 1e-6)
if success then
local statusSortId = task.Item1 == 2 and -1 or task.Item1
table.insert(tasks, {
taskId = taskInfo.taskId,
score = taskInfo.score,
desc = string.format(taskInfo.desc, progressToCompare),
jumpId = taskInfo.jumpId,
progressToCompare = progressToCompare,
sortId = taskInfo.sortId,
status = task.Item1,
statusSortId = statusSortId,
progress = task.Item1 >= GEnums.ActivityConditionalStageState.Completed:GetHashCode() and progressToCompare or progress,
})
end
end
table.sort(tasks, Utils.genSortFunction({ "statusSortId", "sortId", "taskId" }, true))
self.m_tasks = tasks
end
ActivityWeeklyTaskCtrl._GetMileStoneInfo = HL.Method() << function(self)
self.m_maxScore = 0
local mileStones = {}
for mileStoneId, received in pairs(self.m_activity.mileStoneInfo) do
local success, taskInfo = Tables.activityWeeklyTaskMileStoneTable[self.m_activityId].mileStones:TryGetValue(mileStoneId)
if success then
table.insert(mileStones, {
id = mileStoneId,
received = received,
completed = self.m_activity.score >= taskInfo.score,
score = taskInfo.score,
rewardId = taskInfo.rewardId,
})
self.m_maxScore = math.max(self.m_maxScore, taskInfo.score)
end
end
table.sort(mileStones, Utils.genSortFunction({ "score" }, true))
local playVoice = false
if self.m_mileStones then
for i, mileStone in ipairs(self.m_mileStones) do
if not mileStone.completed and mileStones[i].completed then
playVoice = true
mileStones[i].justComplete = true
end
end
end
if playVoice then
AudioManager.PostEvent("Au_UI_Event_WeekMissionReward")
end
self.m_mileStones = mileStones
if self.m_activity.score > self.m_score and self.m_score >= 0 then
self.view.weeklyStageNode:PlayInAnimation()
AudioManager.PostEvent("Au_UI_Event_WeekMissionLevelUp")
end
self.m_score = self.m_activity.score
end
ActivityWeeklyTaskCtrl._RefreshTaskView = HL.Method() << function(self)
self.m_taskCells:GraduallyRefresh(#self.m_tasks, self.view.config.TASK_CELL_GRADUALLY_SHOW_TIME, function(cell, index)
local task = self.m_tasks[index]
cell.gameObject.name = "TaskCell_" .. index
cell.scoreTxt.text = task.score
cell.progressTxt.text = task.progress .. "/" .. task.progressToCompare
cell.scrollbar.size = lume.clamp(task.progress/task.progressToCompare, 0, 1)
cell.descTxt.text = task.desc
cell.stateController:SetState(task.status == GEnums.ActivityConditionalStageState.Completed:GetHashCode() and "Completed" or "Normal")
cell.stateController:SetState(TaskColorTable[task.score] or "Low")
cell.inProgressNode.gameObject:SetActive(task.status == GEnums.ActivityConditionalStageState.Unlocked:GetHashCode() and string.isEmpty(task.jumpId))
cell.receivedNode.gameObject:SetActive(task.status == GEnums.ActivityConditionalStageState.Rewarded:GetHashCode())
cell.progressNode:SetState(task.status == GEnums.ActivityConditionalStageState.Rewarded:GetHashCode() and "Gray" or "Yellow")
if self.m_activity.score >= self.m_maxScore then
cell.stateController:SetState("Max")
return
else
cell.maxNode.gameObject:SetActive(false)
end
cell.btnGoto.onClick:RemoveAllListeners()
if task.status == GEnums.ActivityConditionalStageState.Unlocked:GetHashCode() and not string.isEmpty(task.jumpId) then
cell.btnGoto.gameObject:SetActive(true)
cell.btnGoto.onClick:AddListener(function()
Utils.jumpToSystem(task.jumpId)
end)
else
cell.btnGoto.gameObject:SetActive(false)
end
cell.btnAvailable.onClick:RemoveAllListeners()
cell.btnAvailable.onClick:AddListener(function()
self:_ReceiveAllTaskReward()
end)
end)
end
ActivityWeeklyTaskCtrl.OnClose = HL.Override() << function(self)
self.m_taskCells:OnClose()
end
ActivityWeeklyTaskCtrl._RefreshMileStoneView = HL.Method() << function(self)
local canReceive = false
local allReceived = true
self.m_mileStoneCells:Refresh(#self.m_mileStones, function(cell, index)
cell.gameObject.name = "MileStoneCell_" .. index
local mileStone = self.m_mileStones[index]
cell.receivedNode.gameObject:SetActive(mileStone.received)
cell.stageNumTxt.text = mileStone.score
local lastMileStone = index > 1 and self.m_mileStones[index - 1]
local canReceiveBoth = lastMileStone and mileStone.completed and not mileStone.received and lastMileStone.completed and not lastMileStone.received
cell.stateController:SetState(index == 1 and "NoLine" or (canReceiveBoth and "DarkLine" or "NormalLine"))
local rewardBundles = UIUtils.getRewardItems(mileStone.rewardId)
for i = 1,2 do
local item = cell["item" .. i]
item:InitItem(rewardBundles[i], function()
if mileStone.completed and not mileStone.received and not DeviceInfo.usingController then
self:_ReceiveAllMileStoneReward()
else
item:ShowTips()
end
end)
item:SetExtraInfo({
tipsPosTransform = item.transform,
isSideTips = true,
})
end
cell.stateController:SetState(mileStone.received and "Received" or (mileStone.completed and "Completed" or "InProgress"))
if mileStone.completed and not mileStone.received then
canReceive = true
end
if not mileStone.received then
allReceived = false
end
if mileStone.received then
cell.lightNodeAnim:ClearTween()
end
if mileStone.justComplete then
cell.animeNode:PlayInAnimation()
mileStone.justComplete = nil
end
end)
self.view.lvTxt.text = self.m_activity.score
self.view.scoreScrollbar.size = lume.clamp(self.m_activity.score/self.m_maxScore, 0, 1)
self.view.levelNode:SetState(self.m_activity.score >= self.m_maxScore and "Max" or (self.m_activity.score == 0 and "Zero" or "Number"))
self.view.mileStoneStateNode.stateController:SetState(allReceived and "Received" or (canReceive and "Completed" or "InProgress"))
self.view.mileStoneStateNode.simpleStateController:SetState(allReceived and "Received" or (canReceive and "Completed" or "InProgress"))
self.view.mileStoneStateNode.button.onClick:RemoveAllListeners()
if canReceive then
self.view.mileStoneStateNode.button.onClick:AddListener(function()
self:_ReceiveAllMileStoneReward()
end)
end
self.view.mileStoneStateNode.button.gameObject:SetActive(canReceive)
end
ActivityWeeklyTaskCtrl._ReceiveAllMileStoneReward = HL.Method() << function(self)
local ids = {}
for _, mileStone in ipairs(self.m_mileStones) do
if mileStone.completed and not mileStone.received then
table.insert(ids, mileStone.id)
end
end
if #ids > 0 then
self.m_activity:GainReward(ids)
end
end
ActivityWeeklyTaskCtrl._ReceiveAllTaskReward = HL.Method() << function(self)
local ids = {}
for _, task in ipairs(self.m_tasks) do
if task.status == GEnums.ActivityConditionalStageState.Completed:GetHashCode() then
table.insert(ids, task.taskId)
end
end
if #ids > 0 then
self.m_activity:CompleteTask(ids)
end
end
ActivityWeeklyTaskCtrl.OnUpdate = HL.Method(HL.Table) << function(self, args)
local id = unpack(args)
if id ~= self.m_activityId then
return
end
self:_Refresh()
end
HL.Commit(ActivityWeeklyTaskCtrl)