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

1210 lines
39 KiB
Lua
Raw Permalink 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 uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.AdventureDungeon
local SeriesTableFilterItem = {
[GEnums.DungeonCategoryType.BasicResource] = {},
[GEnums.DungeonCategoryType.CharResource] = {},
[GEnums.DungeonCategoryType.BossRush] = {},
[GEnums.DungeonCategoryType.SpecialResource] = {},
}
local IsSeriesTableFiltered = false
local TabDataList = {
{
type = GEnums.DungeonCategoryType.CharResource,
tabName = "ui_AdventureDungeonPanel_title_charmaterial",
imgPath = "deco_adventure_d_material",
},
{
type = GEnums.DungeonCategoryType.BasicResource,
tabName = "ui_AdventureDungeonPanel_title_basematerial",
imgPath = "deco_adventure_d_currency",
},
{
type = GEnums.DungeonCategoryType.BossRush,
tabName = "ui_AdventureDungeonPanel_title_boss",
imgPath = "deco_adventure_d_leaderchallenge",
},
{
type = GEnums.DungeonCategoryType.SpecialResource,
tabName = "ui_AdventureDungeonPanel_title_specialResource",
imgPath = "deco_adventure_d_challengethis",
},
}
AdventureDungeonCtrl = HL.Class('AdventureDungeonCtrl', uiCtrl.UICtrl)
AdventureDungeonCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_SCENE_GRADE_CHANGE_NOTIFY] = '_OnSceneGradeChangeNotify',
[MessageConst.ON_CHANGE_ADVENTURE_DUNGEON_TAB] = '_OnChangeTab',
[MessageConst.ON_ADVENTURE_BOOK_FOCUS_WALLET] = '_OnFocusWallet',
[MessageConst.ON_ADVENTURE_BOOK_NOT_FOCUS_WALLET] = '_OnNotFocusWallet',
[MessageConst.ON_PHASE_ADVENTURE_BOOK_BEHIND] = '_OnPhaseBehind',
}
AdventureDungeonCtrl.m_genTabCells = HL.Field(HL.Forward("UIListCache"))
AdventureDungeonCtrl.m_genCategoryCells = HL.Field(HL.Function)
AdventureDungeonCtrl.m_genSingleCategoryCells = HL.Field(HL.Function)
AdventureDungeonCtrl.m_curTabIndex = HL.Field(HL.Number) << 1
AdventureDungeonCtrl.m_dungeonCategoryInfos = HL.Field(HL.Table)
AdventureDungeonCtrl.m_forbidResetTabIndex = HL.Field(HL.Boolean) << false
AdventureDungeonCtrl.m_onGotoDungeon = HL.Field(HL.Function)
AdventureDungeonCtrl.m_useDungeonList = HL.Field(HL.Boolean) << true
AdventureDungeonCtrl.m_naviOnLeft = HL.Field(HL.Boolean) << true
AdventureDungeonCtrl.m_dropdownDomainIds = HL.Field(HL.Table)
AdventureDungeonCtrl.m_filterdInfos = HL.Field(HL.Table)
AdventureDungeonCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_phase = arg.phase
self:_InitShortCut()
self:_InitData()
self:_UpdateData()
self:_InitUI()
self:_RefreshAllUI()
end
AdventureDungeonCtrl.OnClose = HL.Override() << function(self)
if self.m_curTabIndex > 0 and self.m_curTabIndex <= self.m_genTabCells:GetCount() then
self:_ReadTabRedDot(self.m_curTabIndex)
end
end
AdventureDungeonCtrl._OnChangeTab = HL.Method(HL.Any) << function(self, arg)
local dungeonTab = arg
local index = 1
for _, categoryInfo in pairs(self.m_dungeonCategoryInfos) do
if categoryInfo.tabJumpName == dungeonTab then
break
end
index = index + 1
end
if index > #self.m_dungeonCategoryInfos then
logger.error(ELogChannel.UI, "[AdventureDungeonCtrl._OnChangeTab] 跳转到指定dungeonTab失败可能是没解锁或配置错tabName:" .. dungeonTab)
index = 1
end
self.m_curTabIndex = math.min(index, #self.m_dungeonCategoryInfos)
local cell = self.m_genTabCells:Get(self.m_curTabIndex)
cell.toggle:SetIsOnWithoutNotify(true)
self:_OnClickTabToggle(self.m_curTabIndex, true)
end
AdventureDungeonCtrl._OnFocusWallet = HL.Method(HL.Any) << function(self, arg)
logger.info("[adventure] AdventureDungeonCtrl._OnFocusWallet")
InputManagerInst:ToggleGroup(self.view.slideNodeMonoTarget.groupId, false)
InputManagerInst:ToggleGroup(self.view.tabTogMonoTarget.groupId, false)
end
AdventureDungeonCtrl._OnNotFocusWallet = HL.Method(HL.Any) << function(self, arg)
logger.info("[adventure] AdventureDungeonCtrl._OnNotFocusWallet")
InputManagerInst:ToggleGroup(self.view.slideNodeMonoTarget.groupId, not self.m_naviOnLeft)
InputManagerInst:ToggleGroup(self.view.tabTogMonoTarget.groupId, self.m_naviOnLeft)
end
AdventureDungeonCtrl._InitUI = HL.Method() << function(self)
self.m_genTabCells = UIUtils.genCellCache(self.view.tabTogCell)
self.m_genCategoryCells = UIUtils.genCachedCellFunction(self.view.dungeonCategoryList)
self.view.dungeonCategoryList.onUpdateCell:AddListener(function(obj, csIndex)
local cell = self.m_genCategoryCells(obj)
self:_UpdateDungeonCategory(cell, LuaIndex(csIndex))
end)
self.view.dungeonCategoryListNaviGroup.getDefaultSelectableFunc = function()
local firstCell = self.m_genCategoryCells(1)
if firstCell ~= nil then
return firstCell.view.naviDecorator
end
end
self.m_genSingleCategoryCells = UIUtils.genCachedCellFunction(self.view.singleCategoryNode.singleCategoryList)
self.view.singleCategoryNode.singleCategoryList.onUpdateCell:AddListener(function(obj, csIndex)
local cell = self.m_genSingleCategoryCells(obj)
self:_UpdateSingleDungeonCell(cell, LuaIndex(csIndex))
end)
self.view.singleCategoryNode.naviGroup.getDefaultSelectableFunc = function()
local firstCell = self.m_genSingleCategoryCells(1)
if firstCell ~= nil then
return firstCell.view.naviDecorator
end
end
end
AdventureDungeonCtrl._InitData = HL.Method() << function(self)
if not IsSeriesTableFiltered then
IsSeriesTableFiltered = true
for _, item in pairs(Tables.dungeonSeriesTable) do
local category = item.dungeonCategory
if SeriesTableFilterItem[category] then
table.insert(SeriesTableFilterItem[category], item)
end
end
end
self.m_onGotoDungeon = function()
self.m_forbidResetTabIndex = true
end
self:_HandleStaminaDiscount()
end
AdventureDungeonCtrl.OnShow = HL.Override() << function(self)
self.m_forbidResetTabIndex = false
local cell = self.m_genTabCells:Get(self.m_curTabIndex)
if cell then
InputManagerInst.controllerNaviManager:SetTarget(cell.toggle)
end
if not string.isEmpty(self.m_phase.m_dungeonTab) then
local dungeonTab = self.m_phase.m_dungeonTab
self.m_phase.m_dungeonTab = ""
self:_OnChangeTab(dungeonTab)
end
Notify(MessageConst.HIDE_ITEM_TIPS)
end
AdventureDungeonCtrl.OnHide = HL.Override() << function(self)
if self.m_forbidResetTabIndex then
return
end
local count = self.m_genTabCells:GetCount()
if count > 0 then
local cell = self.m_genTabCells:Get(1)
cell.toggle.isOn = true
end
end
AdventureDungeonCtrl._OnPhaseBehind = HL.Method() << function(self)
if self.view.gameObject.activeSelf then
self.m_forbidResetTabIndex = true
end
end
AdventureDungeonCtrl._UpdateData = HL.Method() << function(self)
self.m_dungeonCategoryInfos = { }
for _, v in pairs(TabDataList) do
self:_InitDataCommonDungeon(v.type, v.tabName, v.imgPath)
end
self:_InitDataMonsterSpawnPoint()
self.m_curTabIndex = math.min(self.m_curTabIndex, #self.m_dungeonCategoryInfos)
end
AdventureDungeonCtrl._RefreshAllUI = HL.Method() << function(self)
self.m_genTabCells:Refresh(#self.m_dungeonCategoryInfos, function(cell, luaIndex)
self:_RefreshUITabCell(cell, luaIndex)
end)
self:_OnClickTabToggle(self.m_curTabIndex, true)
local cell = self.m_genTabCells:Get(1)
if cell then
InputManagerInst.controllerNaviManager:SetTarget(cell.toggle)
end
end
AdventureDungeonCtrl._OnSceneGradeChangeNotify = HL.Method(HL.Table) << function(self, args)
self:_UpdateData()
self:_RefreshAllUI()
end
AdventureDungeonCtrl._InitShortCut = HL.Method() << function(self)
if not DeviceInfo.usingController then
return
end
self:BindInputPlayerAction("adventure_dungeon_right", function()
logger.info("adventure_dungeon_right")
self.m_naviOnLeft = false
InputManagerInst:ToggleGroup(self.view.slideNodeMonoTarget.groupId, true)
InputManagerInst:ToggleGroup(self.view.tabTogMonoTarget.groupId, false)
if self.m_useDungeonList then
self.view.dungeonCategoryListNaviGroup:NaviToThisGroup(true)
else
self.view.singleCategoryNode.naviGroup:NaviToThisGroup(true)
end
end, self.view.tabTogMonoTarget.groupId)
self:BindInputPlayerAction("adventure_dungeon_right_hint", function()
logger.info("adventure_dungeon_right")
self.m_naviOnLeft = false
InputManagerInst:ToggleGroup(self.view.slideNodeMonoTarget.groupId, true)
InputManagerInst:ToggleGroup(self.view.tabTogMonoTarget.groupId, false)
if self.m_useDungeonList then
self.view.dungeonCategoryListNaviGroup:NaviToThisGroup(true)
else
self.view.singleCategoryNode.naviGroup:NaviToThisGroup(true)
end
end, self.view.tabTogMonoTarget.groupId)
self:BindInputPlayerAction("adventure_dungeon_left", function()
logger.info("adventure_dungeon_left")
self.m_naviOnLeft = true
InputManagerInst:ToggleGroup(self.view.slideNodeMonoTarget.groupId, false)
InputManagerInst:ToggleGroup(self.view.tabTogMonoTarget.groupId, true)
self.view.tabNaviGroup:NaviToThisGroup()
end, self.view.slideNodeMonoTarget.groupId)
self:BindInputPlayerAction("adventure_dungeon_left_hint", function()
logger.info("adventure_dungeon_left")
self.m_naviOnLeft = true
InputManagerInst:ToggleGroup(self.view.slideNodeMonoTarget.groupId, false)
InputManagerInst:ToggleGroup(self.view.tabTogMonoTarget.groupId, true)
self.view.tabNaviGroup:NaviToThisGroup()
end, self.view.slideNodeMonoTarget.groupId)
InputManagerInst:ToggleGroup(self.view.slideNodeMonoTarget.groupId, false)
end
AdventureDungeonCtrl._InitDataCommonDungeon = HL.Method(HL.Any, HL.String, HL.String)
<< function(self, categoryType, tabName, tabImg)
local isCategoryUnlocked = GameInstance.player.adventure:IsAdventureDungeonFirCategoryUnlock(categoryType)
if not isCategoryUnlocked then
return
end
local tableDataList = SeriesTableFilterItem[categoryType]
if (#tableDataList <= 0) then
return
end
local newCategoryInfo = {
tabName = tabName,
tabImgPath = tabImg,
tabJumpName = categoryType:ToString(),
dungeonInfosList = {},
subGameIds = {},
showRelief = false,
}
local tempTable = {}
for _, tableData in pairs(tableDataList) do
local isUnlocked = GameInstance.player.adventure:IsAdventureDungeonCategoryTypeUnlocked(tableData.id, tableData.dungeonCategory)
if isUnlocked then
local category2ndType = tableData.dungeonCategory2nd
local infosBundle = tempTable[category2ndType]
if not infosBundle then
local cfgExist, category2ndTypeCfg = Tables.DungeonCategory2ndTable:TryGetValue(category2ndType)
infosBundle = {
category2ndType = category2ndType:GetHashCode(),
name = cfgExist and category2ndTypeCfg.name or "",
infos = {},
}
tempTable[tableData.dungeonCategory2nd] = infosBundle
end
local info = self:_HandleAndCreateSeriesInfo(tableData, newCategoryInfo)
if info then
table.insert(infosBundle.infos, info)
end
if info.costStamina then
newCategoryInfo.showRelief = true
end
end
end
for _, v in pairs(tempTable) do
table.sort(v.infos, Utils.genSortFunction({ "sortId" }, true))
table.insert(newCategoryInfo.dungeonInfosList, v)
end
table.sort(newCategoryInfo.dungeonInfosList, Utils.genSortFunction({ "category2ndType" }, true))
table.insert(self.m_dungeonCategoryInfos, newCategoryInfo)
end
AdventureDungeonCtrl._HandleAndCreateSeriesInfo = HL.Method(HL.Any, HL.Table).Return(HL.Table)
<< function(self, seriesCfg, categoryInfo)
local hasCfg, dungeonTypeCfg = Tables.dungeonTypeTable:TryGetValue(seriesCfg.gameCategory)
if hasCfg then
local dungeonCategory = seriesCfg.dungeonCategory
local seriesId = seriesCfg.id
local isActive = (
(dungeonCategory == GEnums.DungeonCategoryType.CharResource or
dungeonCategory == GEnums.DungeonCategoryType.BasicResource or
dungeonCategory == GEnums.DungeonCategoryType.SpecialResource or
dungeonCategory == GEnums.DungeonCategoryType.BossRush) and
(GameInstance.dungeonManager:IsDungeonInteractiveActive(seriesId) or
dungeonCategory == GEnums.DungeonCategoryType.BossRush)
)
local info = {
seriesId = seriesId,
sortId = seriesCfg.sortId,
mapMarkType = dungeonTypeCfg.mapMarkType,
dungeonImg = self:_GetDungeonImg(seriesCfg.includeDungeonIds),
dungeonRoleImg = seriesCfg.dungeonRoleImg,
dungeonName = seriesCfg.name,
dungeonCategory = dungeonCategory,
staminaTxt = "",
isActive = isActive,
rewardInfos = self:_ProcessDungeonSeriesRewards(seriesId,
(dungeonCategory == GEnums.DungeonCategoryType.CharResource or
dungeonCategory == GEnums.DungeonCategoryType.BasicResource)),
subGameIds = {},
onGotoDungeon = self.m_onGotoDungeon,
costStamina = false,
}
local minStaminaCost = math.maxinteger
local maxStaminaCost = math.mininteger
for _, subGameId in pairs(seriesCfg.includeDungeonIds) do
table.insert(info.subGameIds, subGameId)
table.insert(categoryInfo.subGameIds, subGameId)
local cfg = Utils.tryGetTableCfg(Tables.gameMechanicTable, subGameId)
local isUnlocked = GameInstance.dungeonManager:IsDungeonUnlocked(subGameId)
if cfg and isUnlocked then
minStaminaCost = ActivityUtils.getRealStaminaCost(math.min(minStaminaCost, cfg.costStamina))
maxStaminaCost = ActivityUtils.getRealStaminaCost(math.max(maxStaminaCost, cfg.costStamina))
if cfg.costStamina > 0 then
info.costStamina = true
end
end
end
local count = #info.subGameIds
if count <= 0 or maxStaminaCost <= 0 then
info.staminaTxt = ""
elseif count == 1 then
info.staminaTxt = tostring(maxStaminaCost)
info.staminaMin = maxStaminaCost
info.staminaMax = maxStaminaCost
else
info.staminaMin = minStaminaCost
info.staminaMax = maxStaminaCost
if info.staminaMin ~= info.staminaMax then
info.staminaTxt = info.staminaMin .. "~" .. info.staminaMax
else
info.staminaTxt = info.staminaMin
end
end
if dungeonCategory == GEnums.DungeonCategoryType.BossRush then
self:_ProcessDungeonBossInfo(seriesId, info)
end
if dungeonCategory == GEnums.DungeonCategoryType.SpecialResource then
self:_ProcessDungeonBossInfo(seriesId, info)
info.dungeonImg = seriesCfg.dungeonImg
end
return info
end
return nil
end
AdventureDungeonCtrl._InitDataMonsterSpawnPoint = HL.Method() << function(self)
local newCategoryInfo = {
tabName = "ui_AdventureDungeonPanel_title_enemyspawner",
tabImgPath = "deco_adventure_d_brushingmonsters",
tabJumpName = "EnemySpawner",
dungeonInfosList = {},
subGameIds = {},
showRelief = GameInstance.player.worldEnergyPointSystem.isFull,
}
local infosBundle = {
category2ndType = GEnums.DungeonCategory2ndType.None:GetHashCode(),
name = "",
infos = {},
}
table.insert(newCategoryInfo.dungeonInfosList, infosBundle)
self.m_dropdownDomainIds = { "All" }
for groupId, tableData in pairs(Tables.worldEnergyPointGroupTable) do
local id = GameInstance.player.worldEnergyPointSystem:GetCurSubGameId(groupId)
local canShow = false
if GameInstance.player.subGameSys:IsGameMapMarkUnlock(groupId, GEnums.MarkType.EnemySpawner) and
GameInstance.player.subGameSys:IsGameUnlocked(id) and
AdventureBookUtils.CheckEnemySpawnerCanOpenMap(groupId) then
canShow = true
end
if canShow and id ~= nil then
local hasCfg, gameCfg = Tables.gameMechanicTable:TryGetValue(id)
if hasCfg then
local info = {
seriesId = groupId,
gameGroupId = groupId,
sortId = groupId,
mapMarkType = GEnums.MarkType.EnemySpawner,
dungeonRoleImg = tableData.icon,
dungeonName = gameCfg.gameName,
staminaTxt = gameCfg.costStamina == 0 and
"" or tostring(ActivityUtils.getRealStaminaCost(gameCfg.costStamina)),
isActive = true,
rewardInfos = AdventureDungeonCtrl._ProcessMonsterSpawnRewards(groupId, id),
subGameIds = { id },
onGotoDungeon = self.m_onGotoDungeon,
}
local gemRandId = tableData.gemRandId
local _, domainId = Tables.GemItemDomainTable:TryGetValue(gemRandId)
info.domainId = domainId
table.insert(infosBundle.infos, info)
table.insert(newCategoryInfo.subGameIds, id)
if (lume.find(self.m_dropdownDomainIds, domainId)) == nil then
table.insert(self.m_dropdownDomainIds, domainId)
end
else
logger.error("[Game Mechanic Table] missing, id = " .. id)
end
end
end
if #newCategoryInfo.subGameIds <= 0 then
return
end
table.sort(infosBundle.infos, Utils.genSortFunction({ "sortId" }, true))
table.insert(self.m_dungeonCategoryInfos, newCategoryInfo)
end
AdventureDungeonCtrl._RefreshUITabCell = HL.Method(HL.Table, HL.Number) << function(self, cell, luaIndex)
local tabInfo = self.m_dungeonCategoryInfos[luaIndex]
cell.gameObject.name = luaIndex
cell.tabNameTxt.text = Language[tabInfo.tabName]
cell.tabImg:LoadSprite(UIConst.UI_SPRITE_ADVENTURE, tabInfo.tabImgPath)
cell.toggle.isOn = luaIndex == self.m_curTabIndex
cell.toggle.onValueChanged:RemoveAllListeners()
cell.toggle.onValueChanged:AddListener(function(isOn)
if isOn and self.m_curTabIndex ~= luaIndex then
self:_OnClickTabToggle(luaIndex)
end
end)
cell.toggle.onHoverChange:RemoveAllListeners()
cell.toggle.onHoverChange:AddListener(function(isHover)
if cell.toggle.isOn then
return
end
if isHover then
cell.aniWrap:Play("adventuredungeontabtogcell_hover")
else
cell.aniWrap:Play("adventuredungeontabtogcell_normal")
end
end)
cell.toggle.onIsNaviTargetChanged = function(isTarget, isGroupChanged)
if isTarget then
cell.toggle.isOn = true
end
end
cell.redDot:InitRedDot("AdventureDungeonTab", tabInfo.subGameIds)
cell.reliefTab.gameObject:SetActive(ActivityUtils.hasStaminaReduceCount() and tabInfo.showRelief)
end
AdventureDungeonCtrl._OnClickTabToggle = HL.Method(HL.Number, HL.Opt(HL.Boolean)) << function(self, luaIndex, isInit)
local count = #self.m_dungeonCategoryInfos
if count < luaIndex or luaIndex < 1 then
return
end
self.view.reliefNode.gameObject:SetActive((ActivityUtils.hasStaminaReduceCount() and self.m_dungeonCategoryInfos[luaIndex].showRelief))
local preIndex = self.m_curTabIndex
if (preIndex ~= luaIndex) then
self:_ReadTabRedDot(preIndex)
end
if DeviceInfo.usingController and self.m_curTabIndex ~= luaIndex then
AudioAdapter.PostEvent("Au_UI_Toggle_Common_On")
end
self.m_curTabIndex = luaIndex
local dungeonInfosList = self.m_dungeonCategoryInfos[luaIndex].dungeonInfosList
local listCount = #dungeonInfosList
if listCount > 1 then
self.view.dungeonCategoryList.gameObject:SetActiveIfNecessary(true)
self.view.singleCategoryNode.gameObject:SetActiveIfNecessary(false)
self.view.dungeonCategoryList:UpdateCount(listCount, true)
self.m_useDungeonList = true
elseif listCount == 1 then
local singleCategoryNode = self.view.singleCategoryNode
singleCategoryNode.gameObject:SetActiveIfNecessary(true)
self.view.dungeonCategoryList.gameObject:SetActiveIfNecessary(false)
local infosBundle = dungeonInfosList[1]
infosBundle.hasRead = true
local category2ndType = GEnums.DungeonCategory2ndType.__CastFrom(infosBundle.category2ndType)
if (category2ndType == GEnums.DungeonCategory2ndType.None) then
singleCategoryNode.titleState:SetState("HideTitle")
else
singleCategoryNode.titleState:SetState("ShowTitle")
singleCategoryNode.titleTxt.text = infosBundle.name
end
self.m_filterdInfos = infosBundle.infos
local cellCount = #infosBundle.infos
self.view.singleCategoryNode.singleCategoryList:UpdateCount(cellCount, true)
self.m_useDungeonList = false
end
if listCount > 0 then
local infoBundle = dungeonInfosList[1]
if string.isEmpty(infoBundle.name) then
self.view.titleBgMask.gameObject:SetActiveIfNecessary(true)
else
self.view.titleBgMask.gameObject:SetActiveIfNecessary(false)
end
else
self.view.titleBgMask.gameObject:SetActiveIfNecessary(true)
end
if self.m_dungeonCategoryInfos[luaIndex].tabJumpName == "EnemySpawner" then
self.view.siltationPoint.gameObject:SetActive(true)
self.view.dropDown:ClearComponent()
self.view.dropDown:Init(
function(csIndex, option, _)
local domainId = self.m_dropdownDomainIds[csIndex + 1]
local textId = "LUA_ADVENTURE_DUNGEON_ENEMY_SPAWNER_DROPNDOWN_" .. tostring(domainId)
option:SetText(Language[textId])
end,
function(csIndex)
logger.info("[adventure] dropdown csIndex: " .. tostring(csIndex))
local infos = self.m_dungeonCategoryInfos[self.m_curTabIndex].dungeonInfosList[1].infos
local selectDomainId = self.m_dropdownDomainIds[csIndex + 1]
local filtered = lume.filter(infos, function(x)
if selectDomainId == "All" then
return true
end
return x.domainId == selectDomainId
end)
self.m_filterdInfos = filtered
self.view.singleCategoryNode.singleCategoryList:UpdateCount(#filtered, true)
end
)
self.view.dropDown:Refresh(#self.m_dropdownDomainIds, 0, false)
else
self.view.siltationPoint.gameObject:SetActive(false)
end
if not isInit then
local aniWrapper = self.animationWrapper
aniWrapper:Play("adventuredungeonnode_change")
end
end
AdventureDungeonCtrl._ReadTabRedDot = HL.Method(HL.Number) << function(self, luaIndex)
if luaIndex <= 0 or luaIndex > #self.m_dungeonCategoryInfos then
return
end
local subGameIds = {}
local categoryInfo = self.m_dungeonCategoryInfos[luaIndex]
for _, infosBundle in pairs(categoryInfo.dungeonInfosList) do
if infosBundle.hasRead then
for _, info in pairs(infosBundle.infos) do
if info.hasRead then
for _, id in pairs(info.subGameIds) do
table.insert(subGameIds, id)
end
end
end
end
end
if (#subGameIds) > 0 then
GameInstance.player.subGameSys:SendSubGameListRead(subGameIds)
end
end
AdventureDungeonCtrl._UpdateDungeonCategory = HL.Method(HL.Any, HL.Number) << function(self, cell, luaIndex)
local infosBundle = self.m_dungeonCategoryInfos[self.m_curTabIndex].dungeonInfosList[luaIndex]
cell:InitDungeonCategoryCell(infosBundle)
end
AdventureDungeonCtrl._UpdateSingleDungeonCell = HL.Method(HL.Any, HL.Number) << function(self, cell, luaIndex)
local cellInfo = nil
if self.m_filterdInfos ~= nil then
cellInfo = self.m_filterdInfos[luaIndex]
else
local infosBundle = self.m_dungeonCategoryInfos[self.m_curTabIndex].dungeonInfosList[1]
cellInfo = infosBundle.infos[luaIndex]
end
cell:InitAdventureDungeonCell(cellInfo)
cellInfo.hasRead = true
end
AdventureDungeonCtrl._ProcessDungeonSeriesRewards = HL.Method(HL.String, HL.Boolean).Return(HL.Table) << function(self, seriesId, checkUnlocked)
local dungeonSeriesCfg = Tables.dungeonSeriesTable[seriesId]
if not dungeonSeriesCfg then
return {}
end
local rewardList = {}
if dungeonSeriesCfg.dungeonCategory == GEnums.DungeonCategoryType.Challenge then
for _, v in pairs(dungeonSeriesCfg.includeDungeonIds) do
self:_ProcessDungeonRewardsNoMerge(v, rewardList)
end
elseif dungeonSeriesCfg.dungeonCategory == GEnums.DungeonCategoryType.BossRush or
dungeonSeriesCfg.dungeonCategory == GEnums.DungeonCategoryType.SpecialResource then
local dungeonIds = {}
for _, v in pairs(dungeonSeriesCfg.includeDungeonIds) do
table.insert(dungeonIds, v)
end
self:_ProcessDungeonRewardsBoss(dungeonIds, rewardList)
else
local rewards = {}
for _, v in pairs(dungeonSeriesCfg.includeDungeonIds) do
self:_ProcessDungeonRewards(v, rewards, checkUnlocked)
end
for _, v in pairs(rewards) do
table.insert(rewardList, v)
end
end
table.sort(rewardList, Utils.genSortFunction({ "gainedSortId", "rewardTypeSortId", "rarity", "type" }))
return rewardList
end
AdventureDungeonCtrl._ProcessDungeonRewards = HL.Method(HL.String, HL.Table, HL.Boolean) << function(self, dungeonId, rewards, checkUnlocked)
if checkUnlocked and not GameInstance.dungeonManager:IsDungeonUnlocked(dungeonId) then
logger.info("[dungeon] 跳过了" .. tostring(dungeonId))
return
end
local gameMechanicCfg = Tables.gameMechanicTable[dungeonId]
local hasFirstReward = not string.isEmpty(gameMechanicCfg.firstPassRewardId)
local hasRecycleReward = not string.isEmpty(gameMechanicCfg.rewardId)
local hasExtraReward = not string.isEmpty(gameMechanicCfg.extraRewardId)
if hasFirstReward then
local succ, rewardsCfg = Tables.rewardTable:TryGetValue(gameMechanicCfg.firstPassRewardId)
if succ then
for _, itemBundle in pairs(rewardsCfg.itemBundles) do
local itemId = itemBundle.id
local reward = rewards[itemId]
if not reward then
local itemCfg = Tables.itemTable[itemId]
reward = {
id = itemId,
rarity = itemCfg.rarity,
type = itemCfg.type:ToInt(),
gainedSortId = 1,
rewardTypeSortId = 3,
gained = false,
}
rewards[itemId] = reward
end
end
end
end
if hasRecycleReward then
local hasCfg, rewardsCfg = Tables.rewardTable:TryGetValue(gameMechanicCfg.rewardId)
if hasCfg then
for _, itemBundle in pairs(rewardsCfg.itemBundles) do
local itemId = itemBundle.id
local reward = rewards[itemId]
if not reward then
local itemCfg = Tables.itemTable[itemId]
reward = {
id = itemId,
rarity = itemCfg.rarity,
type = itemCfg.type:ToInt(),
gainedSortId = 1,
rewardTypeSortId = 1,
gained = false,
}
rewards[itemId] = reward
end
end
end
end
if hasExtraReward then
local rewardsCfg = Tables.rewardTable[gameMechanicCfg.extraRewardId]
for _, itemBundle in pairs(rewardsCfg.itemBundles) do
local itemId = itemBundle.id
local reward = rewards[itemId]
if not reward then
local itemCfg = Tables.itemTable[itemId]
reward = {
id = itemId,
rarity = itemCfg.rarity,
type = itemCfg.type:ToInt(),
gainedSortId = 1,
rewardTypeSortId = 2,
gained = false,
}
rewards[itemId] = reward
end
end
end
end
AdventureDungeonCtrl._ProcessDungeonRewardsNoMerge = HL.Method(HL.String, HL.Table) << function(self, dungeonId, rewards)
local dungeonMgr = GameInstance.dungeonManager
local gameMechanicCfg = Tables.gameMechanicTable[dungeonId]
local hasFirstReward = not string.isEmpty(gameMechanicCfg.firstPassRewardId)
local hasRecycleReward = not string.isEmpty(gameMechanicCfg.rewardId)
local hasExtraReward = not string.isEmpty(gameMechanicCfg.extraRewardId)
if hasFirstReward then
local firstRewardGained = dungeonMgr:IsDungeonFirstPassRewardGained(dungeonId)
local hideFirstReward = firstRewardGained and hasRecycleReward
if not hideFirstReward then
local rewardsCfg = Tables.rewardTable[gameMechanicCfg.firstPassRewardId]
for _, itemBundle in pairs(rewardsCfg.itemBundles) do
local itemCfg = Tables.itemTable[itemBundle.id]
local reward = {
id = itemBundle.id,
rarity = itemCfg.rarity,
type = itemCfg.type:ToInt(),
isFirst = true,
isExtra = false,
gainedSortId = firstRewardGained and 1 or 2,
rewardTypeSortId = 3,
gained = firstRewardGained,
}
table.insert(rewards, reward)
end
end
end
if hasRecycleReward then
local rewardsCfg = Tables.rewardTable[gameMechanicCfg.rewardId]
for _, itemBundle in pairs(rewardsCfg.itemBundles) do
local itemCfg = Tables.itemTable[itemBundle.id]
local reward = {
id = itemBundle.id,
rarity = itemCfg.rarity,
type = itemCfg.type:ToInt(),
isFirst = false,
isExtra = false,
gainedSortId = 1,
rewardTypeSortId = 1,
gained = false,
}
table.insert(rewards, reward)
end
end
if hasExtraReward then
local extraRewardGained = dungeonMgr:IsDungeonExtraRewardGained(dungeonId)
local hideExtraReward = extraRewardGained and hasRecycleReward
if not hideExtraReward then
local rewardsCfg = Tables.rewardTable[gameMechanicCfg.extraRewardId]
for _, itemBundle in pairs(rewardsCfg.itemBundles) do
local itemCfg = Tables.itemTable[itemBundle.id]
local reward = {
id = itemBundle.id,
rarity = itemCfg.rarity,
type = itemCfg.type:ToInt(),
isFirst = false,
isExtra = true,
gainedSortId = extraRewardGained and 1 or 2,
rewardTypeSortId = 2,
gained = extraRewardGained,
}
table.insert(rewards, reward)
end
end
end
end
AdventureDungeonCtrl._ProcessDungeonRewardsBoss = HL.Method(HL.Table, HL.Table) << function(self, dungeonIds, rewards)
local dungeonMgr = GameInstance.dungeonManager
local lastUnlockedDungeonId = ""
for _, dungeonId in ipairs(dungeonIds) do
if dungeonMgr:IsDungeonUnlocked(dungeonId) then
lastUnlockedDungeonId = dungeonId
end
end
if (lastUnlockedDungeonId == "") then
return
end
local gameMechanicCfg = Tables.gameMechanicTable[lastUnlockedDungeonId]
local dungeonCfg = Tables.dungeonTable[lastUnlockedDungeonId]
local hasFirstReward = not string.isEmpty(gameMechanicCfg.firstPassRewardId)
local hasHunterReward = not string.isEmpty(gameMechanicCfg.hunterModeRewardId)
if hasFirstReward then
local firstRewardGained = dungeonMgr:IsDungeonFirstPassRewardGained(lastUnlockedDungeonId)
local rewardsCfg = Tables.rewardTable[gameMechanicCfg.firstPassRewardId]
for _, itemBundle in pairs(rewardsCfg.itemBundles) do
local itemCfg = Tables.itemTable[itemBundle.id]
local reward = {
id = itemBundle.id,
rarity = itemCfg.rarity,
type = itemCfg.type:ToInt(),
isFirst = true,
isExtra = false,
gainedSortId = firstRewardGained and 1 or 2,
rewardTypeSortId = 3,
gained = firstRewardGained,
}
table.insert(rewards, reward)
end
end
if hasHunterReward then
local isHunterModeUnlocked = DungeonUtils.isHunterModeUnlocked()
for _, regularItemId in pairs(dungeonCfg.hunterModeRegularRewards) do
local itemCfg = Tables.itemTable[regularItemId]
local reward = {
id = regularItemId,
rarity = itemCfg.rarity,
type = itemCfg.type:ToInt(),
isFirst = false,
isExtra = false,
gainedSortId = 1,
rewardTypeSortId = 1,
gained = false,
}
table.insert(rewards, reward)
end
for _, randomItemId in pairs(dungeonCfg.hunterModeProbRewards) do
local succ, itemCfg = Tables.itemTable:TryGetValue(randomItemId)
if succ then
local reward = {
id = randomItemId,
rarity = itemCfg.rarity,
type = itemCfg.type:ToInt(),
isFirst = false,
isExtra = false,
gainedSortId = 1,
rewardTypeSortId = 1,
gained = false,
}
table.insert(rewards, reward)
end
end
end
end
AdventureDungeonCtrl._ProcessDungeonBossInfo = HL.Method(HL.String, HL.Table) << function(self, seriesId, info)
local dungeonSeriesData = Tables.DungeonSeriesTable[seriesId]
local lastUnlockedDungeonId = ""
for _, dungeonId in pairs(dungeonSeriesData.includeDungeonIds) do
if GameInstance.dungeonManager:IsDungeonUnlocked(dungeonId) then
lastUnlockedDungeonId = dungeonId
end
end
if lastUnlockedDungeonId == "" then
return
end
info.isHunterMode = DungeonUtils.isDungeonHasHunterMode(lastUnlockedDungeonId) and
DungeonUtils.isHunterModeUnlocked()
local dungeonData = Tables.DungeonTable[lastUnlockedDungeonId]
if info.isHunterMode then
info.staminaTxt = tostring(ActivityUtils.getRealStaminaCost(dungeonData.hunterModeCostStamina))
if dungeonData.hunterModeCostStamina > 0 then
info.costStamina = true
end
end
end
AdventureDungeonCtrl._GetDungeonImg = HL.Method(HL.Any).Return(HL.Opt(HL.String)) << function(self, dungeonIds)
local ret = nil
for _, dungeonId in pairs(dungeonIds) do
local unlocked = GameInstance.dungeonManager:IsDungeonUnlocked(dungeonId)
if unlocked then
local _, dungeonCfg = Tables.DungeonTable:TryGetValue(dungeonId)
if dungeonCfg then
ret = dungeonCfg.dungeonImg
end
end
end
return ret
end
AdventureDungeonCtrl._ProcessMonsterSpawnRewards = HL.StaticMethod(HL.String, HL.String).Return(HL.Table) << function(groupId, gameId)
local rewards = {}
local rewardList = {}
local isFull = GameInstance.player.worldEnergyPointSystem.isFull
local wepGroupCfg = Tables.worldEnergyPointGroupTable[groupId]
local wepCfg = Tables.worldEnergyPointTable[gameId]
local firstRewardGained = GameInstance.player.worldEnergyPointSystem:IsGameGroupFirstPassRewardGained(groupId)
if not firstRewardGained or not isFull then
local firstPartRewards = {}
local rewardCfg = Tables.rewardTable[wepGroupCfg.firstPassRewardId]
for _, itemBundle in pairs(rewardCfg.itemBundles) do
local reward = AdventureDungeonCtrl._GenRewardInfo(DungeonConst.DUNGEON_REWARD_TAG_STATE.First, -1, firstRewardGained,
itemBundle.id, itemBundle.count)
table.insert(firstPartRewards, reward)
end
table.sort(firstPartRewards, Utils.genSortFunction(UIConst.COMMON_ITEM_SORT_KEYS))
for _, item in pairs(firstPartRewards) do
item.isFirst = true,
table.insert(rewardList, item)
end
end
if isFull then
local secondPartRewards = {}
for i = 0, wepCfg.probGemItemIds.Count - 1 do
local itemId = wepCfg.probGemItemIds[i]
local reward = AdventureDungeonCtrl._GenRewardInfo(DungeonConst.DUNGEON_REWARD_TAG_STATE.Random, -3, false, itemId)
table.insert(secondPartRewards, reward)
end
table.sort(secondPartRewards, Utils.genSortFunction(UIConst.COMMON_ITEM_SORT_KEYS))
for _, item in pairs(secondPartRewards) do
item.isFirst = false,
table.insert(rewardList, item)
end
end
return rewardList
end
AdventureDungeonCtrl._GenRewardInfo = HL.StaticMethod(HL.String, HL.Number, HL.Boolean, HL.String, HL.Opt(HL.Number)).Return(HL.Table)
<< function(tagState, rewardTypeSortId, gained, itemId, itemCount)
local itemCfg = Tables.itemTable[itemId]
return {
id = itemId,
count = itemCount,
gained = gained,
tagState = tagState,
gainedSortId = gained and 0 or 1,
rewardTypeSortId = rewardTypeSortId,
sortId1 = itemCfg.sortId1,
sortId2 = itemCfg.sortId2,
}
end
AdventureDungeonCtrl.m_discount = HL.Field(HL.Number) << 0
AdventureDungeonCtrl._HandleStaminaDiscount = HL.Method() << function(self)
local totalCount = GameInstance.player.activitySystem.staminaTotalCount
local useCount = GameInstance.player.activitySystem.staminaReduceUsedCount
self.m_discount = GameInstance.player.activitySystem.staminaDiscount
self.view.blackNum.gameObject:SetActive(ActivityUtils.hasStaminaReduceCount())
self.view.blackNum.text = totalCount - useCount
self.view.redNum.gameObject:SetActive(not ActivityUtils.hasStaminaReduceCount())
self.view.redNum.text = totalCount - useCount
self.view.numTxt.text = string.format("/%d", totalCount)
end
HL.Commit(AdventureDungeonCtrl)