Files
Endfield-Data/LuaScripts/UI/Widgets/ActivityVersionGuide.lua
2026-01-31 21:42:01 +07:00

463 lines
13 KiB
Lua

local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
ActivityVersionGuide = HL.Class('ActivityVersionGuide', UIWidgetBase)
ActivityVersionGuide.m_activityId = HL.Field(HL.String) << ''
ActivityVersionGuide.m_guideDataList = HL.Field(HL.Table)
ActivityVersionGuide.m_getCell = HL.Field(HL.Function)
ActivityVersionGuide.m_listCells = HL.Field(HL.Table)
ActivityVersionGuide.m_focusIndex = HL.Field(HL.Number) << 1
ActivityVersionGuide.m_genCellFunc = HL.Field(HL.Function)
ActivityVersionGuide.m_taskCells = HL.Field(HL.Any)
ActivityVersionGuide.InitVersionGuide = HL.Method(HL.Any) << function(self, args)
self:RegisterMessage(MessageConst.ON_CONDITIONAL_MULTI_STAGE_UPDATE, function(args)
self:_OnMultiStageUpdate(args)
end)
self:RegisterMessage(MessageConst.ON_ACTIVITY_UPDATED, function(args)
self:_OnActivityUpdate(args)
end)
self.m_activityId = args.activityId
self.view.activityCommonInfo:InitActivityCommonInfo(args)
self.m_taskCells = UIUtils.genCellCache(self.view.missionCell)
self.view.redDotScrollRect.getRedDotStateAt = function(csIndex)
return self:GetRedDotStateAt(csIndex)
end
local status = GameInstance.player.activitySystem:GetActivityStatus(self.m_activityId)
if status == GEnums.ActivityStatus.InProgress or status == GEnums.ActivityStatus.Completed then
self.view.mainStateCtrl:SetState("MissionMode")
self:_RefreshMissionMode()
else
self.view.mainStateCtrl:SetState("PreMode")
end
if DeviceInfo.usingController then
self.view.rightNaviGroup.onIsTopLayerChanged:RemoveAllListeners()
self.view.rightNaviGroup.onIsTopLayerChanged:AddListener(function(isTopLayer)
if isTopLayer then
self:_SetAsNaviTarget(self.m_focusIndex)
end
end)
if ActivityUtils.isActivityUnlocked(self.m_activityId) then
local viewBindingId = self:BindInputPlayerAction("common_view_item", function()
self:_SetAsNaviTarget(self.m_focusIndex)
end)
self.view.rightNaviGroup.onIsTopLayerChanged:AddListener(function(active)
InputManagerInst:ToggleBinding(viewBindingId, not active)
end)
end
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputGroup.groupId })
end
end
ActivityVersionGuide._RefreshMissionMode = HL.Method() << function(self)
self.m_listCells = {}
self:_CollectGuideData()
self:_RefreshGuides()
self:_RefreshTaskCells()
end
ActivityVersionGuide._CollectGuideData = HL.Method() << function(self)
self.m_guideDataList = {}
local activityData = Tables.activityVersionGuideStageTable[self.m_activityId]
local stageListCount = activityData.stageList.Count
for i = 1, stageListCount do
local stageData = activityData.stageList[CSIndex(i)]
local dataRef = {
stageId = stageData.stageId,
stageConfig = stageData,
index = i,
status = nil,
}
table.insert(self.m_guideDataList, dataRef)
end
end
ActivityVersionGuide._SortGuideDataList = HL.Method() << function(self)
for _, guideInfo in ipairs(self.m_guideDataList) do
local status = guideInfo.status
if status == "Available" then
guideInfo._sortPriority = 1
elseif status == "Goto" then
guideInfo._sortPriority = 2
elseif status == "Complete" then
guideInfo._sortPriority = 3
else
guideInfo._sortPriority = 2
end
end
table.sort(self.m_guideDataList, Utils.genSortFunction({ "_sortPriority", "stageConfig.stageId" }, true))
end
ActivityVersionGuide._RefreshTaskCells = HL.Method() << function(self)
self.m_taskCells:Refresh(#self.m_guideDataList, function(cell, index)
self:_OnUpdateCell(cell, index)
end)
end
ActivityVersionGuide._SetAsNaviTarget = 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
ActivityVersionGuide.OnActivityCenterNaviFailed = HL.Method() << function(self)
self.view.scrollRect.verticalNormalizedPosition = 1
self.m_focusIndex = 1
self:_SetAsNaviTarget(self.m_focusIndex)
end
ActivityVersionGuide._OnUpdateCell = HL.Method(HL.Any, HL.Number) << function(self, cell, index)
local guideInfo = self.m_guideDataList[index]
local stageConfig = guideInfo.stageConfig
local stageData = self:_GetStageData(guideInfo.stageId)
local state = self:_GetStageStateString(stageData.Status)
cell.stateController:SetState(state)
if state == "Available" then
local playAfterInAnim = function()
local success, isPlayed = ClientDataManagerInst:GetBool("activity_guide_wuling_stage_complete_anim_played" .. guideInfo.stageId, false)
if not success or not isPlayed then
cell.animationWrapper:Play("activityguidewulingcell_change", function()
cell.animationWrapper:Play("activityguidewulingcellavi_loop")
end)
ClientDataManagerInst:SetBool("activity_guide_wuling_stage_complete_anim_played" .. guideInfo.stageId, true, false, EClientDataTimeValidType.Permanent)
else
cell.animationWrapper:Play("activityguidewulingcellavi_loop")
end
end
if cell.animationWrapper.curState == CS.Beyond.UI.UIConst.AnimationState.In then
cell.animationWrapper:PlayInAnimation(playAfterInAnim)
else
playAfterInAnim()
end
end
local conditionId = stageConfig.conditions.conditionId
local progressToCompare = stageConfig.conditions.progressToCompare
local progressCurrent
if state == "Complete" or state == "Available" then
progressCurrent = progressToCompare
else
local success, progress = stageData.Conditions.Values:TryGetValue(conditionId)
progressCurrent = progress
end
cell.missionTxt.text = stageConfig.desc
local normalizedValue = math.min(progressCurrent / progressToCompare, 1.0)
cell.scrollbar.size = normalizedValue
cell.scrollbar.value = 0
cell.numberTxt.text = string.format("%d/%d", progressCurrent, progressToCompare)
cell.clickBtn.onClick:RemoveAllListeners()
if state == "Available" then
cell.clickBtn.onClick:AddListener(function()
self:_OnReceiveReward(stageConfig)
end)
end
cell.btnGoto.onClick:RemoveAllListeners()
if state == "Goto" then
cell.btnGoto.onClick:AddListener(function()
self:_OnJumpClick(stageConfig, index)
end)
end
cell.redDot:InitRedDot("ActivityGuideWulingStage", { self.m_activityId, stageConfig.stageId }, nil, self.view.redDotScrollRect)
local rewardId = stageConfig.rewardId
local rewardBundles = UIUtils.getRewardItems(rewardId)
cell.cache = cell.cache or UIUtils.genCellCache(cell.reward)
cell.cache:Refresh(#rewardBundles, function(innerCell, innerIndex)
innerCell:InitItem(rewardBundles[innerIndex], function()
innerCell:ShowTips()
end)
innerCell:SetExtraInfo({
tipsPosType = UIConst.UI_TIPS_POS_TYPE.LeftTop,
tipsPosTransform = self.view.controllerHintRect or cell.transform,
isSideTips = true,
})
innerCell.view.getNode.gameObject:SetActive(state == "Complete")
end)
if DeviceInfo.usingController then
cell.focusRect.onClick:RemoveAllListeners()
if state == "Available" then
InputManagerInst:ToggleBinding(cell.focusRect.onClick.bindingId, true)
cell.focusRect.onClick:AddListener(function()
self:_OnReceiveReward(stageConfig)
end)
elseif state == "Goto" then
InputManagerInst:ToggleBinding(cell.focusRect.onClick.bindingId, true)
cell.focusRect.onClick:AddListener(function()
self:_OnJumpClick(stageConfig)
end)
else
InputManagerInst:ToggleBinding(cell.focusRect.onClick.bindingId, false)
end
InputManagerInst:ToggleGroup(cell.reward.groupId,false)
cell.keyHintRewards.gameObject:SetActive(false)
cell.naviDecorator.onIsNaviTargetChanged = function(isTarget)
InputManagerInst:ToggleGroup(cell.reward.groupId,isTarget)
cell.keyHintRewards.gameObject:SetActive(isTarget)
if isTarget then
ActivityUtils.setFalseNewActivityConditionalStage(guideInfo.stageConfig.stageId)
end
end
cell.rewardLayout.onIsFocusedChange:AddListener(function(isFocused)
if isFocused then
self.m_focusIndex = index
else
self:_SetAsNaviTarget(self.m_focusIndex)
Notify(MessageConst.HIDE_ITEM_TIPS)
end
end)
end
end
ActivityVersionGuide._RefreshGuides = HL.Method() << function(self)
for index, guideInfo in ipairs(self.m_guideDataList) do
local stageData = self:_GetStageData(guideInfo.stageConfig.stageId)
guideInfo.status = self:_GetStageStateString(stageData.Status)
end
self:_SortGuideDataList()
if self.m_taskCells then
self.m_taskCells:Refresh(#self.m_guideDataList, function(cell, index)
self:_OnUpdateCell(cell, index)
end)
end
end
ActivityVersionGuide._OnMultiStageUpdate = HL.Method(HL.Table) << function(self, args)
local id = unpack(args)
if id == self.m_activityId and ActivityUtils.isActivityUnlocked(id) then
self:_RefreshGuides()
end
end
ActivityVersionGuide._OnActivityUpdate = HL.Method(HL.Table) << function(self, args)
local id = unpack(args)
if id == self.m_activityId and ActivityUtils.isActivityUnlocked(id) then
self:_RefreshMissionMode()
end
end
ActivityVersionGuide._OnJumpClick = HL.Method(HL.Any, HL.Number) << function(self, guideData, index)
local jumpId = guideData.mapJumpId
local succ, cfg = Tables.systemJumpTable:TryGetValue(jumpId)
ActivityUtils.setFalseNewActivityConditionalStage(guideData.stageId)
if succ then
Utils.jumpToSystem(jumpId)
self.m_focusIndex = index
else
logger.error("ActivityGuideWuling: Invalid jumpId", jumpId)
end
end
ActivityVersionGuide._GetStageData = HL.Method(HL.String).Return(HL.Any) << function(self, stageId)
local activityCS = GameInstance.player.activitySystem:GetActivity(self.m_activityId)
local success, stageData = activityCS.stageDataDict:TryGetValue(stageId)
return stageData
end
ActivityVersionGuide._GetStageStateString = HL.Method(HL.Number).Return(HL.String) << function(self, stageStatus)
if stageStatus == 0 or stageStatus == 1 then
return "Goto"
elseif stageStatus == 2 then
return "Available"
elseif stageStatus == 3 then
return "Complete"
else
return "Goto"
end
end
ActivityVersionGuide._OnReceiveReward = HL.Method(HL.Any) << function(self, guideData)
ActivityUtils.setFalseNewActivityConditionalStage(guideData.stageId)
GameInstance.player.activitySystem:SendReceiveRewardConditionMultiStage(self.m_activityId, guideData.stageId)
self.view.scrollRect.verticalNormalizedPosition = 1
self.m_focusIndex = 1
self:_SetAsNaviTarget(self.m_focusIndex)
end
ActivityVersionGuide.GetRedDotStateAt = HL.Method(HL.Number).Return(HL.Number) << function(self, index)
local luaIndex = LuaIndex(index)
if luaIndex < 1 or luaIndex > #self.m_guideDataList then
return 0
end
local guideInfo = self.m_guideDataList[luaIndex]
if not guideInfo then
return 0
end
local stageId = guideInfo.stageConfig.stageId
local hasRedDot, redDotType = RedDotManager:GetRedDotState("ActivityGuideWulingStage", { self.m_activityId, stageId })
if hasRedDot then
return redDotType or UIConst.RED_DOT_TYPE.Normal
else
return 0
end
end
ActivityVersionGuide._OnDestroy = HL.Override() << function(self)
local status = GameInstance.player.activitySystem:GetActivityStatus(self.m_activityId)
if status == GEnums.ActivityStatus.InProgress or status == GEnums.ActivityStatus.Completed then
for _, guideInfo in ipairs(self.m_guideDataList) do
ActivityUtils.setFalseNewActivityConditionalStage(guideInfo.stageConfig.stageId)
end
end
end
HL.Commit(ActivityVersionGuide)
return ActivityVersionGuide