Files
Endfield-Data/LuaScripts/UI/Panels/ActivityCharacterTrial/ActivityCharacterTrialCtrl.lua
2025-12-02 20:37:18 +07:00

318 lines
10 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.ActivityCharacterTrial
local activitySystem = GameInstance.player.activitySystem
local CharacterTrialStatus = CS.Beyond.Gameplay.ActivitySystem.CharacterTrialStatus
ActivityCharacterTrialCtrl = HL.Class('ActivityCharacterTrialCtrl', uiCtrl.UICtrl)
ActivityCharacterTrialCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_CHARACTER_TRIAL_INFO_CHANGE] = 'OnCharacterTrialInfoChange',
}
ActivityCharacterTrialCtrl.m_activityId = HL.Field(HL.String) << ''
ActivityCharacterTrialCtrl.m_csIndex2HeadCell = HL.Field(HL.Table)
ActivityCharacterTrialCtrl.m_csIndex2dungeonId = HL.Field(HL.Table)
ActivityCharacterTrialCtrl.m_trialDataList = HL.Field(HL.Table)
ActivityCharacterTrialCtrl.m_selectedCsIndex = HL.Field(HL.Number) << -1
ActivityCharacterTrialCtrl.m_headNum = HL.Field(HL.Number) << 0
ActivityCharacterTrialCtrl.m_dungeonCount = HL.Field(HL.Number) << 0
ActivityCharacterTrialCtrl.m_headCells = HL.Field(HL.Forward("UIListCache"))
local HEAD_ICON_SMALL = "_s"
local BG_IMAGE_FOLDER = "Activity"
ActivityCharacterTrialCtrl.OnCreate = HL.Override(HL.Any) << function(self, args)
self.m_activityId = args.activityId
self.view.activityCommonInfo:InitActivityCommonInfo(args)
self.view.btnSmallest.onClick:AddListener(function()
ActivityUtils.GameEventLogActivityVisit(self.m_activityId, "gotoGachaButton", "vist_gacha")
if self.m_selectedCsIndex == -1 then
return
end
local dungeonId = self.m_csIndex2dungeonId[self.m_selectedCsIndex]
local charTrial = Tables.activityCharTrial[dungeonId]
if Utils.canJumpToSystem(charTrial.jumpId) then
Utils.jumpToSystem(charTrial.jumpId)
end
end)
self.view.btnGoto.onClick:AddListener(function()
ActivityUtils.GameEventLogActivityVisit(self.m_activityId, "gotoActivityHudButton", "vist_activity")
self:ClickGotoBtn()
end)
self.view.btnReward.onClick:AddListener(function()
ActivityUtils.GameEventLogActivityVisit(self.m_activityId, "gotoActivityHudButton", "vist_activity")
self:ClickGotoBtn()
end)
self.m_headCells = UIUtils.genCellCache(self.view.headCell)
self.m_trialDataList = {}
for dungeonId, trialData in pairs(Tables.activityCharTrial) do
if trialData.activityId == self.m_activityId then
local trialTable = {
dungeonId = dungeonId,
activityId = trialData.activityId,
dungeonBgPath = trialData.dungeonBgPath,
sortId = trialData.sortId,
}
table.insert(self.m_trialDataList, trialTable)
end
end
table.sort(self.m_trialDataList, Utils.genSortFunction({ "sortId" }, true))
self.m_csIndex2dungeonId = {}
self.m_csIndex2HeadCell = {}
local lastSelectedCsIndex = 0
for luaIndex, trialData in pairs(self.m_trialDataList) do
local dungeonId = trialData.dungeonId
self.m_csIndex2dungeonId[CSIndex(luaIndex)] = dungeonId
if args.dungeonId == dungeonId then
lastSelectedCsIndex = CSIndex(luaIndex)
end
end
self.m_dungeonCount = #self.m_trialDataList
if self.m_dungeonCount > 0 then
if self.m_dungeonCount > 1 then
self.view.prevKeyHint.gameObject:SetActive(true)
self.view.nextKeyHint.gameObject:SetActive(true)
else
self.view.prevKeyHint.gameObject:SetActive(false)
self.view.nextKeyHint.gameObject:SetActive(false)
end
self.m_headCells:Refresh(self.m_dungeonCount, function(cell, luaIndex)
self:_OnUpdateHeadCell(cell, luaIndex)
end)
self:_SelectHead(lastSelectedCsIndex)
end
self:BindInputPlayerAction("char_trial_select_prev", function()
self:_SelectPrev()
end)
self:BindInputPlayerAction("char_trial_select_next", function()
self:_SelectNext()
end)
end
ActivityCharacterTrialCtrl._SelectPrev = HL.Method() << function(self)
if self.m_selectedCsIndex == 0 then
return
end
self:_SelectHead(self.m_selectedCsIndex - 1)
end
ActivityCharacterTrialCtrl._SelectNext = HL.Method() << function(self)
if self.m_selectedCsIndex == self.m_dungeonCount - 1 then
return
end
self:_SelectHead(self.m_selectedCsIndex + 1)
end
ActivityCharacterTrialCtrl._OnUpdateHeadCell = HL.Method(HL.Table, HL.Number) << function(self, cell, luaIndex)
local csIndex = CSIndex(luaIndex)
local dungeonId = self.m_csIndex2dungeonId[csIndex]
local dungeonCfg = Tables.dungeonTable[dungeonId]
local charId = dungeonCfg.relatedCharId
local success, charData = Tables.characterTable:TryGetValue(charId)
if charData then
local professionCfg = Tables.charProfessionTable[charData.profession]
local iconName = professionCfg.iconId .. HEAD_ICON_SMALL
cell.selectedIconImg:LoadSprite(UIConst.UI_SPRITE_HOR_CHAR_HEAD, charId)
cell.normalIconImg:LoadSprite(UIConst.UI_SPRITE_HOR_CHAR_HEAD, charId)
cell.charNameTxt.text = charData.name
cell.professionIconImg:LoadSprite(UIConst.UI_SPRITE_CHAR_PROFESSION, iconName)
end
cell.redDotNormal:InitRedDot("ActivityCharTrialGetReward", {activityId=self.m_activityId, dungeonId=dungeonId})
cell.redDotSelected:InitRedDot("ActivityCharTrialGetReward", {activityId=self.m_activityId, dungeonId=dungeonId})
local trialStatus = GameInstance.player.activitySystem:CheckCharacterTrial(self.m_activityId, dungeonId)
if trialStatus == CharacterTrialStatus.GotReward then
cell.redDotNormalImage.gameObject:SetActive(false)
cell.redDotSelectedImage.gameObject:SetActive(true)
else
cell.redDotNormalImage.gameObject:SetActive(false)
cell.redDotSelectedImage.gameObject:SetActive(false)
end
self.m_csIndex2HeadCell[csIndex] = cell
cell.headNormal.onClick:RemoveAllListeners()
cell.headNormal.onClick:AddListener(function()
self:_SelectHead(csIndex)
end)
end
ActivityCharacterTrialCtrl.OnCharacterTrialInfoChange = HL.Method(HL.Any) << function(self, args)
self:_UpdateHeadInfo(self.m_selectedCsIndex)
local newRewardDungeonId = unpack(args)
if not string.isEmpty(newRewardDungeonId) and #newRewardDungeonId > 0 then
local success, charTrial = Tables.activityCharTrial:TryGetValue(newRewardDungeonId)
if success then
local rewardData = Tables.RewardTable[charTrial.rewardId]
Notify(MessageConst.SHOW_SYSTEM_REWARDS, {
title = Language.LUA_ACTIVITY_CHARACTER_TRIAL_GET_REWARD_TITLE,
items = rewardData.itemBundles,
})
end
end
end
ActivityCharacterTrialCtrl._SelectHead = HL.Method(HL.Number) << function(self, csIndex)
if self.m_selectedCsIndex == csIndex then
return
end
self:_UpdateHeadInfo(csIndex)
end
ActivityCharacterTrialCtrl._UpdateHeadInfo = HL.Method(HL.Number) << function(self, csIndex)
for key, cell in pairs(self.m_csIndex2HeadCell) do
if key == csIndex then
cell.headNormal.gameObject:SetActive(false)
cell.headSelected.gameObject:SetActive(true)
else
cell.headNormal.gameObject:SetActive(true)
cell.headSelected.gameObject:SetActive(false)
end
end
self.m_selectedCsIndex = csIndex
local dungeonId = self.m_csIndex2dungeonId[csIndex]
local charTrial = Tables.activityCharTrial[dungeonId]
local trialStatus = GameInstance.player.activitySystem:CheckCharacterTrial(self.m_activityId, dungeonId)
if trialStatus == CharacterTrialStatus.CanTrial then
self.view.btnGoto.gameObject:SetActive(true)
self.view.btnReward.gameObject:SetActive(false)
self.view.activityCommonInfo:UpdateRewardInfo(charTrial.rewardId)
elseif trialStatus == CharacterTrialStatus.CanGetReward then
self.view.btnGoto.gameObject:SetActive(false)
self.view.btnReward.gameObject:SetActive(true)
self.view.activityCommonInfo:UpdateRewardInfo(charTrial.rewardId)
elseif trialStatus == CharacterTrialStatus.GotReward then
self.view.btnGoto.gameObject:SetActive(true)
self.view.btnReward.gameObject:SetActive(false)
self.view.activityCommonInfo:UpdateRewardInfo(charTrial.rewardId)
end
self.view.activityCommonInfo:UpdateDescTxt(charTrial.desc)
self.view.bgImg:LoadSprite(BG_IMAGE_FOLDER, charTrial.dungeonBgPath)
self.view.roleImg:LoadSprite(BG_IMAGE_FOLDER, charTrial.bgRolePath)
end
ActivityCharacterTrialCtrl.ClickGotoBtn = HL.Method() << function(self)
if self.m_selectedCsIndex == -1 then
return
end
local dungeonId = self.m_csIndex2dungeonId[self.m_selectedCsIndex]
local trialStatus = GameInstance.player.activitySystem:CheckCharacterTrial(self.m_activityId, dungeonId)
if trialStatus == CharacterTrialStatus.CanGetReward then
GameInstance.player.activitySystem:GetCharTrialReward(self.m_activityId, dungeonId)
else
self:JumpToDungeon()
end
end
ActivityCharacterTrialCtrl.JumpToDungeon = HL.Method() << function(self)
if self.m_selectedCsIndex == -1 then
return
end
local dungeonId = self.m_csIndex2dungeonId[self.m_selectedCsIndex]
local dungeonCfg = Tables.dungeonTable[dungeonId]
local lockedTeamData = CharInfoUtils.getLockedFormationData(dungeonCfg.previewCharTeamId, true)
local charInfos = {}
for _, charInfo in ipairs(lockedTeamData.chars) do
table.insert(charInfos, CharInfoUtils.getPlayerCharInfoByInstId(charInfo.charInstId))
end
if DungeonUtils.tryEnterDungeon(dungeonId, charInfos) then
local activityId = self.m_activityId
LuaSystemManager.uiRestoreSystem:AddRequest(dungeonId, function()
PhaseManager:OpenPhaseFast(PhaseId.ActivityCenter, {
activityId = activityId,
gotoCenter = true,
})
end)
end
GameInstance.player.charBag:ClearAllClientCharAndItemData()
end
HL.Commit(ActivityCharacterTrialCtrl)