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

533 lines
18 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.WorldEnergyPointEntry
local PHASE_ID = PhaseId.WorldEnergyPointEntry
local WORLD_ENERGY_POINT_WEAK_INSTRUCTION_ID = "world_energy_point_weak"
local SERIALIZED_CATEGORY = "WEP"
local WEP_STAMINA_LACK_START_CONFIRM_HINT_KEY = "wep_stamina_lack_start_confirm_hint"
local WEP_GEM_CUSTOM_ITEM_LACK_CONFIRM_HINT_KEY = "wep_gem_custom_item_lack_confirm_hint"
local WEP_NOT_GEM_CUSTOM_CONFIRM_HINT_KEY = "wep_not_gem_custom_confirm_hint"
WorldEnergyPointEntryCtrl = HL.Class('WorldEnergyPointEntryCtrl', uiCtrl.UICtrl)
WorldEnergyPointEntryCtrl.m_rewardCellCache = HL.Field(HL.Forward("UIListCache"))
WorldEnergyPointEntryCtrl.m_gameGroupId = HL.Field(HL.String) << ""
WorldEnergyPointEntryCtrl.m_gameId = HL.Field(HL.String) << ""
WorldEnergyPointEntryCtrl.m_entityLid = HL.Field(HL.Number) << -1
WorldEnergyPointEntryCtrl.m_isFull = HL.Field(HL.Boolean) << false
WorldEnergyPointEntryCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_WORLD_ENERGY_POINT_SELECT_TERMS_CHANGED] = 'OnWEPSelectTermsChanged',
[MessageConst.ON_STAMINA_CHANGED] = 'OnStaminaChanged',
}
WorldEnergyPointEntryCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.view.btnClose.onClick:AddListener(function()
self:_OnClickBtnClose()
end)
self.view.gemOverviewBtn.onClick:AddListener(function()
self:_OnClickGemOverviewBtn()
end)
self.view.btnEnemyDetails.onClick:AddListener(function()
self:_OnClickEnemyInfoBtn()
end)
self.view.btnRewardDetails.onClick:AddListener(function()
self:_OnClickBtnRewardDetails()
end)
self.view.gemCustomBtn.onClick:AddListener(function()
self:_OnClickGemCustomBtn()
end)
self.view.weakNode.onClick:AddListener(function()
self:_OnClickWeakInfoBtn()
end)
self.view.weakTipsBtn.onClick:AddListener(function()
self:_OnClickWeakInfoBtn()
end)
self.view.btnGameStart.onClick:AddListener(function()
self:_OnClickBtnGameStartBtn()
end)
self.m_rewardCellCache = UIUtils.genCellCache(self.view.rewardCell)
self:_InitData(arg)
self:_InitView()
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputGroup.groupId })
end
WorldEnergyPointEntryCtrl._InitData = HL.Method(HL.Table) << function(self, arg)
local gameGroupId, _, entityLid = unpack(arg)
self.m_gameGroupId = gameGroupId
self.m_entityLid = entityLid
self.m_gameId = GameInstance.player.worldEnergyPointSystem:GetCurSubGameId(gameGroupId)
self.m_isFull = GameInstance.player.worldEnergyPointSystem.isFull
end
WorldEnergyPointEntryCtrl._InitView = HL.Method() << function(self)
self:_InitBasicView()
self:_RefreshRewards()
self:_RefreshSelectTerms()
self:_RefreshCostStaminaNode()
end
WorldEnergyPointEntryCtrl._InitBasicView = HL.Method() << function(self)
local worldEnergyPointCfg = Tables.worldEnergyPointTable[self.m_gameId]
local wepGroupCfg = Tables.worldEnergyPointGroupTable[self.m_gameGroupId]
self.view.gemPreNode.gameObject:SetActive(self.m_isFull)
self.view.worldEnergyPointTitleTxt.text = worldEnergyPointCfg.gameName
self.view.locationTxt.text = DungeonUtils.getEntryLocation(worldEnergyPointCfg.levelId, false)
self.view.recommendLvTxt.text = string.format(Language.LUA_WEP_RECOMMEND_LV_FORMAT, worldEnergyPointCfg.recommendLv)
self.view.descTxt.text = worldEnergyPointCfg.desc
if self.m_isFull then
local doubleTicket = Tables.dungeonConst.doubleStaminaTicketItemId
local hasGot = GameInstance.player.inventory:IsItemGot(doubleTicket)
local ids = { wepGroupCfg.gemCustomItemId, Tables.dungeonConst.staminaItemId }
local cellPreferredWidths = {}
cellPreferredWidths[wepGroupCfg.gemCustomItemId] = self.view.config.MONEY_CELL_PREFERRED_WIDTH
if hasGot then
table.insert(ids, 2, doubleTicket)
cellPreferredWidths[doubleTicket] = self.view.config.MONEY_CELL_PREFERRED_WIDTH
end
self.view.walletBarPlaceholder:InitWalletBarPlaceholder(ids, false, false, false, cellPreferredWidths)
end
local succ, wepGroupRecord = GameInstance.player.worldEnergyPointSystem:TryGetWorldEnergyPointGroupRecord(self.m_gameGroupId)
self.view.weakNode.gameObject:SetActive(succ and wepGroupRecord.isWeak)
end
WorldEnergyPointEntryCtrl._RefreshRewards = HL.Method() << function(self)
local rewards = {}
local wepGroupCfg = Tables.worldEnergyPointGroupTable[self.m_gameGroupId]
local wepCfg = Tables.worldEnergyPointTable[self.m_gameId]
local firstRewardGained = GameInstance.player.worldEnergyPointSystem:IsGameGroupFirstPassRewardGained(self.m_gameGroupId)
local rewardCfg = Tables.rewardTable[wepGroupCfg.firstPassRewardId]
for _, itemBundle in pairs(rewardCfg.itemBundles) do
local reward = self:_GenRewardInfo(DungeonConst.DUNGEON_REWARD_TAG_STATE.First, -1, -1, firstRewardGained,
itemBundle.id, itemBundle.count)
table.insert(rewards, reward)
end
if self.m_isFull then
for i = 0, wepCfg.regularItemIds.Count - 1 do
local itemId = wepCfg.regularItemIds[i]
local itemCount = i < wepCfg.regularItemCount.Count and wepCfg.regularItemCount[i] or 0
local reward = self:_GenRewardInfo(DungeonConst.DUNGEON_REWARD_TAG_STATE.Regular, -2, -2, false, itemId, itemCount)
table.insert(rewards, reward)
end
local probGemItems = wepCfg.probGemItemIds
for i = 0, probGemItems.Count - 1 do
local itemId = probGemItems[i]
local reward = self:_GenRewardInfo(DungeonConst.DUNGEON_REWARD_TAG_STATE.Random, -2, -3, false, itemId)
table.insert(rewards, reward)
end
end
local sortKeys = UIConst.COMMON_ITEM_SORT_KEYS
table.insert(sortKeys, 1, "rewardTypeSortId")
table.insert(sortKeys, 1, "gainedSortId")
table.sort(rewards, Utils.genSortFunction(sortKeys))
local groupId
self.m_rewardCellCache:Refresh(#rewards, function(cell, luaIndex)
local reward = rewards[luaIndex]
cell.itemSmall:InitItem(reward, true)
cell.getNode.gameObject:SetActive(reward.gained == true)
cell.lockNode.gameObject:SetActive(reward.locked == true)
cell.lineNode.gameObject:SetActive(reward.groupId ~= groupId)
groupId = reward.groupId
cell.extraTag.gameObject:SetActive(reward.gained ~= true)
cell.extraTag:SetState(reward.tagState)
end)
self.view.rewardNode.gameObject:SetActive(#rewards > 0)
LayoutRebuilder.ForceRebuildLayoutImmediate(self.view.container)
self.view.rewardList.normalizedPosition = Vector2(0, 0)
end
WorldEnergyPointEntryCtrl._GenRewardInfo = HL.Method(HL.String, HL.Number, HL.Number, HL.Boolean, HL.String, HL.Opt(HL.Number)).Return(HL.Table)
<< function(self, tagState, groupId, rewardTypeSortId, gained, itemId, itemCount)
local itemCfg = Tables.itemTable[itemId]
return {
id = itemId,
count = itemCount,
gained = gained,
tagState = tagState,
groupId = groupId,
gainedSortId = gained and 0 or 1,
rewardTypeSortId = rewardTypeSortId,
sortId1 = itemCfg.sortId1,
sortId2 = itemCfg.sortId2,
}
end
WorldEnergyPointEntryCtrl._RefreshSelectTerms = HL.Method() << function(self)
self.view.gemCustomNode.gameObject:SetActive(self.m_isFull)
self.view.gemCustomLockNode.gameObject:SetActive(not self.m_isFull)
if self.m_isFull then
local succ, wepGroupRecord = GameInstance.player.worldEnergyPointSystem:TryGetWorldEnergyPointGroupRecord(self.m_gameGroupId)
local selectTerms = succ and wepGroupRecord.selectTerms
local hasSelectTerms = succ and selectTerms.Count > 0
self.view.nonCustomNode.gameObject:SetActive(not hasSelectTerms)
self.view.customResultNode.gameObject:SetActive(hasSelectTerms)
if hasSelectTerms then
local primAtrri = {}
local secondPartAtrriName
for i = 0 , selectTerms.Count - 1 do
local selectTermId = selectTerms[i]
local termCfg = Tables.gemTable[selectTermId]
if termCfg.termType == GEnums.GemTermType.PrimAttrTerm then
table.insert(primAtrri, {
tagName = termCfg.tagName,
sortId = termCfg.sortOrder,
})
else
secondPartAtrriName = termCfg.tagName
end
end
table.sort(primAtrri, Utils.genSortFunction({ "sortId" }))
if #primAtrri == 3 and not string.isEmpty(secondPartAtrriName) then
self.view.attri1Txt.text = string.format(Language.LUA_WEP_GEM_CUSTOM_PRIM_ATTRI_FORMAT,
primAtrri[1].tagName,
primAtrri[2].tagName,
primAtrri[3].tagName)
self.view.attri2Txt.text = secondPartAtrriName
end
end
end
end
WorldEnergyPointEntryCtrl._RefreshCostStaminaNode = HL.Method() << function(self)
local worldEnergyPointCfg = Tables.worldEnergyPointTable[self.m_gameId]
local activityInfo = ActivityUtils.getStaminaReduceInfo()
local canReduceStamina = ActivityUtils.hasStaminaReduceCount()
UIUtils.updateStaminaNode(self.view.staminaNode, {
costStamina = ActivityUtils.getRealStaminaCost(worldEnergyPointCfg.costStamina),
descStamina = Language["ui_dungeon_details_ap_reuse"],
delStamina = canReduceStamina and worldEnergyPointCfg.costStamina or nil
})
self.view.staminaNode.gameObject:SetActive(self.m_isFull)
self.view.laveNumTxt.text = string.format("%d/%d", activityInfo.totalCount - activityInfo.usedCount,
activityInfo.totalCount)
self.view.staminaLaveNode.gameObject:SetActive(self.m_isFull and canReduceStamina)
end
WorldEnergyPointEntryCtrl._OnClickBtnClose = HL.Method() << function(self)
PhaseManager:PopPhase(PHASE_ID)
end
WorldEnergyPointEntryCtrl._OnClickGemOverviewBtn = HL.Method() << function(self)
UIManager:Open(PanelId.GemTermOverviewPopup, self.m_gameGroupId)
end
WorldEnergyPointEntryCtrl._OnClickEnemyInfoBtn = HL.Method() << function(self)
local worldEnergyPointCfg = Tables.worldEnergyPointTable[self.m_gameId]
UIManager:AutoOpen(PanelId.CommonEnemyPopup, { title = Language.LUA_WEP_ENEMY_INFO_TITLE,
enemyListTitle = Language["ui_dungeon_enemy_popup_info_list"],
enemyInfoTitle = Language["ui_dungeon_enemy_popup_info_desc"],
enemyIds = worldEnergyPointCfg.enemyIds,
enemyLevels = worldEnergyPointCfg.enemyLevels })
end
WorldEnergyPointEntryCtrl._OnClickBtnRewardDetails = HL.Method() << function(self)
local wepGroupCfg = Tables.worldEnergyPointGroupTable[self.m_gameGroupId]
local wepCfg = Tables.worldEnergyPointTable[self.m_gameId]
local rewardArgs = {}
local firstPartRewards = {}
rewardArgs.firstPartRewardsTitle = Language.LUA_WEP_FIRST_PART_REWARD_TITLE
rewardArgs.firstPartRewards = firstPartRewards
local firstRewardGained = GameInstance.player.worldEnergyPointSystem:IsGameGroupFirstPassRewardGained(self.m_gameGroupId)
local rewardCfg = Tables.rewardTable[wepGroupCfg.firstPassRewardId]
for _, itemBundle in pairs(rewardCfg.itemBundles) do
local reward = self:_GenRewardInfo(DungeonConst.DUNGEON_REWARD_TAG_STATE.First, -1, -1, firstRewardGained,
itemBundle.id, itemBundle.count)
table.insert(firstPartRewards, reward)
end
table.sort(firstPartRewards, Utils.genSortFunction(UIConst.COMMON_ITEM_SORT_KEYS))
if self.m_isFull then
local secondPartRewards = {}
rewardArgs.secondPartRewardsTitle = Language.LUA_WEP_SECOND_PART_REWARD_TITLE
rewardArgs.secondPartRewards = secondPartRewards
for i = 0, wepCfg.regularItemIds.Count - 1 do
local itemId = wepCfg.regularItemIds[i]
local itemCount = i < wepCfg.regularItemCount.Count and wepCfg.regularItemCount[i] or 0
local reward = self:_GenRewardInfo(DungeonConst.DUNGEON_REWARD_TAG_STATE.Regular, -2, -2, false, itemId, itemCount)
table.insert(secondPartRewards, reward)
end
for i = 0, wepCfg.probGemItemIds.Count - 1 do
local itemId = wepCfg.probGemItemIds[i]
local reward = self:_GenRewardInfo(DungeonConst.DUNGEON_REWARD_TAG_STATE.Random, -2, -3, false, itemId)
table.insert(secondPartRewards, reward)
end
local sortIds = UIConst.COMMON_ITEM_SORT_KEYS
table.insert(sortIds, 1, "rewardTypeSortId")
table.sort(secondPartRewards, Utils.genSortFunction(UIConst.COMMON_ITEM_SORT_KEYS))
end
UIManager:AutoOpen(PanelId.CommonRewardDetailsPopup, rewardArgs)
end
WorldEnergyPointEntryCtrl._OnClickGemCustomBtn = HL.Method() << function(self)
PhaseManager:OpenPhase(PhaseId.GemCustomization, self.m_gameGroupId)
end
WorldEnergyPointEntryCtrl._OnClickWeakInfoBtn = HL.Method() << function(self)
UIManager:Open(PanelId.InstructionBook, WORLD_ENERGY_POINT_WEAK_INSTRUCTION_ID)
end
WorldEnergyPointEntryCtrl._OnClickBtnGameStartBtn = HL.Method() << function(self)
if self.m_isFull then
local succ, wepGroupRecord = GameInstance.player.worldEnergyPointSystem:TryGetWorldEnergyPointGroupRecord(self.m_gameGroupId)
local hasSelectTerms = succ and wepGroupRecord.hasSelectTerms
if hasSelectTerms then
local wepGroupCfg = Tables.worldEnergyPointGroupTable[self.m_gameGroupId]
local gemCustomItemId = wepGroupCfg.gemCustomItemId
local count = Utils.getItemCount(gemCustomItemId)
if count > 0 then
self:_StartStaminaCheck()
else
self:_ShowGemCustomItemLackPopup()
end
else
self:_ShowNotGemCustomPopup()
end
else
GameInstance.player.worldEnergyPointSystem:SendReqStartWorldEnergyPoint(self.m_gameId, self.m_entityLid)
end
end
WorldEnergyPointEntryCtrl._StartStaminaCheck = HL.Method() << function(self)
local wepGameCfg = Tables.worldEnergyPointTable[self.m_gameId]
local curStamina = GameInstance.player.inventory.curStamina
local realCost = ActivityUtils.getRealStaminaCost(wepGameCfg.costStamina)
if curStamina >= realCost then
GameInstance.player.worldEnergyPointSystem:SendReqStartWorldEnergyPoint(self.m_gameId, self.m_entityLid)
else
local firstPassRewardGained = GameInstance.player.worldEnergyPointSystem:IsGameGroupFirstPassRewardGained(self.m_gameGroupId)
local hint = firstPassRewardGained and Language.LUA_WEP_STAMINA_LACK_START_WITHOUT_FIRST_PASS_REWARD_CONFIRM_HINT or
Language.LUA_WEP_STAMINA_LACK_START_CONFIRM_HINT
self:_TryShowSerializedPopup(hint, WEP_STAMINA_LACK_START_CONFIRM_HINT_KEY, function()
GameInstance.player.worldEnergyPointSystem:SendReqStartWorldEnergyPoint(self.m_gameId,
self.m_entityLid)
end)
end
end
WorldEnergyPointEntryCtrl._ShowGemCustomItemLackPopup = HL.Method() << function(self)
self:_TryShowSerializedPopup(Language.LUA_WEP_GEM_CUSTOM_ITEM_LACK_CONFIRM_HINT,
WEP_GEM_CUSTOM_ITEM_LACK_CONFIRM_HINT_KEY, function()
self:_StartStaminaCheck()
end)
end
WorldEnergyPointEntryCtrl._ShowNotGemCustomPopup = HL.Method() << function(self)
self:_TryShowSerializedPopup(Language.LUA_WEP_NOT_GEM_CUSTOM_CONFIRM_HINT,
WEP_NOT_GEM_CUSTOM_CONFIRM_HINT_KEY, function()
self:_StartStaminaCheck()
end)
end
WorldEnergyPointEntryCtrl._TryShowSerializedPopup = HL.Method(HL.String, HL.String, HL.Function)
<< function(self, content, serializeKey, onConfirm)
local suuc, ignoreHint = ClientDataManagerInst:GetBool(serializeKey, false, false, SERIALIZED_CATEGORY)
if ignoreHint then
onConfirm()
else
local closuresIsOn = false
Notify(MessageConst.SHOW_POP_UP, {
toggle = {
onValueChanged = function(isOn)
closuresIsOn = isOn
end,
toggleText = Language.LUA_WEP_NO_HINT_TODAY_HINT,
isOn = false,
},
content = content,
onConfirm = function()
ClientDataManagerInst:SetBool(serializeKey,
closuresIsOn, false,
SERIALIZED_CATEGORY, true,
EClientDataTimeValidType.CurrentDay)
onConfirm()
end,
})
end
end
WorldEnergyPointEntryCtrl.OnWEPSelectTermsChanged = HL.Method(HL.Table) << function(self, args)
local gameGroupId = unpack(args)
if self.m_gameGroupId ~= gameGroupId then
return
end
self:_RefreshSelectTerms()
end
WorldEnergyPointEntryCtrl.OnStaminaChanged = HL.Method() << function(self)
self:_RefreshCostStaminaNode()
end
HL.Commit(WorldEnergyPointEntryCtrl)