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

579 lines
16 KiB
Lua

local GEM_RECAST_TAB_TYPE = {
FORGE = 1,
RECAST = 2,
}
local GEM_RECAST_CTRL_TAB = {
[GEM_RECAST_TAB_TYPE.FORGE] = {
tabName = "tabForge",
nodeName = "forgeNode",
},
[GEM_RECAST_TAB_TYPE.RECAST] = {
tabName = "tabRecast",
nodeName = "recastNode",
}
}
local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.GemRecast
GemRecastCtrl = HL.Class('GemRecastCtrl', uiCtrl.UICtrl)
GemRecastCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_GEM_RECAST] = "OnGemRecast",
[MessageConst.ON_ITEM_LOCKED_STATE_CHANGED] = '_OnItemLockedStateChanged',
[MessageConst.ON_GEM_DETACH] = 'OnGemDetach',
}
GemRecastCtrl.m_curTab = HL.Field(HL.Number) << GEM_RECAST_TAB_TYPE.FORGE
GemRecastCtrl.m_curSelectFormulaIndex = HL.Field(HL.Number) << -1
GemRecastCtrl.m_sortedFormulas = HL.Field(HL.Table)
GemRecastCtrl.m_gemIngredientDict = HL.Field(HL.Table)
GemRecastCtrl.m_gemIngredientList = HL.Field(HL.Table)
GemRecastCtrl.m_starCellCache = HL.Field(HL.Forward("UIListCache"))
GemRecastCtrl.m_rankCellCache = HL.Field(HL.Forward("UIListCache"))
GemRecastCtrl.m_gemCellCache = HL.Field(HL.Forward("UIListCache"))
GemRecastCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_curTab = GEM_RECAST_TAB_TYPE.FORGE
self.view.commonGemList.view.gameObject:SetActive(true)
self.view.commonGemList.view.gameObject:SetActive(false)
self:_InitActionEvent()
end
GemRecastCtrl._InitActionEvent = HL.Method() << function(self)
self.view.btnClose.onClick:AddListener(function()
PhaseManager:PopPhase(PhaseId.GemRecast)
end)
self.view.btnEmpty.onClick:AddListener(function()
self:_ToggleGemList(false)
end)
self.view.tabForge.button.onClick:AddListener(function()
self.m_curSelectFormulaIndex = -1
self:_RefreshMainPanel(GEM_RECAST_TAB_TYPE.FORGE)
end)
self.view.tabRecast.button.onClick:AddListener(function()
self.m_curSelectFormulaIndex = -1
self:_RefreshMainPanel(GEM_RECAST_TAB_TYPE.RECAST)
end)
self.view.btnAutoFill.onClick:AddListener(function()
local curFormula = self.m_sortedFormulas[self.m_curSelectFormulaIndex]
self:_AutoFill(curFormula)
end)
self.view.btnLevelUp.onClick:AddListener(function()
local curFormula = self.m_sortedFormulas[self.m_curSelectFormulaIndex]
local ingredients = {}
for instId, _ in pairs(self.m_gemIngredientDict) do
table.insert(ingredients, instId)
end
if #ingredients <= 0 then
Notify(MessageConst.SHOW_TOAST, Language.LUA_GEM_RECAST_GEM_EMPTY_TOAST)
return
end
if #ingredients < curFormula.costGemNum then
Notify(MessageConst.SHOW_TOAST, Language.LUA_GEM_RECAST_GEM_EMPTY_TOAST)
return
end
if curFormula.costItemNum > 0 then
local inventoryCount = Utils.getItemCount(curFormula.costItemId, true)
if inventoryCount < curFormula.costItemNum then
Notify(MessageConst.SHOW_TOAST, Language.LUA_GEM_RECAST_COST_EMPTY_TOAST)
return
end
end
GameInstance.player.inventory:RecastGem(curFormula.formulaId, 1, ingredients)
end)
self.m_starCellCache = UIUtils.genCellCache(self.view.starCell)
self.m_rankCellCache = UIUtils.genCellCache(self.view.forgeNode.rankCell)
self.m_gemCellCache = UIUtils.genCellCache(self.view.listCellGemRecastSmaller)
end
GemRecastCtrl.OnShow = HL.Override() << function(self)
self:_RefreshMainPanel(self.m_curTab)
end
GemRecastCtrl._RefreshMainPanel = HL.Method(HL.Number) << function(self, curSelectTab)
self.view.btnEmpty.gameObject:SetActive(false)
self.m_curTab = curSelectTab
for tabType, cfg in pairs(GEM_RECAST_CTRL_TAB) do
self.view[cfg.tabName].selected.gameObject:SetActive(tabType == curSelectTab)
self.view[cfg.tabName].default.gameObject:SetActive(tabType ~= curSelectTab)
self.view[cfg.nodeName].gameObject:SetActive(tabType == curSelectTab)
end
self:_InitCommonNode(curSelectTab)
self:_ToggleGemList(false)
end
GemRecastCtrl._InitCommonNode = HL.Method(HL.Number) << function(self, curSelectTab)
local firstUnlockIndex = nil
local sortedFormulas = {}
for i, cfg in pairs(Tables.gemRecastTable) do
if curSelectTab == GEM_RECAST_TAB_TYPE.FORGE then
if cfg.formulaType == GEnums.GemForgeFormulaType.Forge then
table.insert(sortedFormulas, cfg)
end
elseif curSelectTab == GEM_RECAST_TAB_TYPE.RECAST then
if cfg.formulaType == GEnums.GemForgeFormulaType.Recast then
table.insert(sortedFormulas, cfg)
end
end
end
table.sort(sortedFormulas, Utils.genSortFunction({"order"}, true))
for index, cfg in ipairs(sortedFormulas) do
local isLocked = not UIUtils.checkIfReachAdventureLv(cfg.adventureLevel)
if not isLocked and firstUnlockIndex == nil then
firstUnlockIndex = index
end
end
if firstUnlockIndex <= 0 then
logger.error("GemRecast->No recast formula unlocked")
return
end
self.m_sortedFormulas = sortedFormulas
if self.m_curSelectFormulaIndex < 0 then
self.m_curSelectFormulaIndex = firstUnlockIndex
end
self.m_gemIngredientDict = {}
self.m_gemIngredientList = {}
self:_RefreshForgeRankCellCache(sortedFormulas)
self:_RefreshForgeNode(sortedFormulas[self.m_curSelectFormulaIndex])
end
GemRecastCtrl._RefreshForgeRankCellCache = HL.Method(HL.Table) << function(self, sortedFormulas)
self.m_rankCellCache:Refresh(#sortedFormulas, function(cell, index)
local formula = sortedFormulas[index]
local isLocked = not UIUtils.checkIfReachAdventureLv(formula.adventureLevel)
local showProductItemId = formula.showProductItemId
local outputGemItemCfg = Tables.itemTable[showProductItemId]
cell.locked.gameObject:SetActive(isLocked)
local isSelected = index == self.m_curSelectFormulaIndex
cell.default.gameObject:SetActive(not isLocked and not isSelected)
if not isLocked then
if isSelected then
cell.selected.gameObject:SetActive(true)
else
cell.selectedAniWrp:PlayOutAnimation(function()
cell.selected.gameObject:SetActive(false)
end)
end
else
cell.selected.gameObject:SetActive(false)
end
cell.rank.text = outputGemItemCfg.rarity
cell.colorLine.color = UIUtils.getItemRarityColor(outputGemItemCfg.rarity)
cell.button.onClick:RemoveAllListeners()
cell.button.onClick:AddListener(function()
if isLocked then
Notify(MessageConst.SHOW_TOAST, string.format(Language.LUA_GEM_FORMULA_LOCKED_WITH_LV_TOAST, formula.adventureLevel))
return
end
self.m_curSelectFormulaIndex = index
self.m_gemIngredientDict = {}
self.m_gemIngredientList = {}
self:_RefreshForgeNode(formula)
self:_RefreshForgeRankCellCache(self.m_sortedFormulas)
end)
end)
end
GemRecastCtrl._RefreshForgeNode = HL.Method(HL.Userdata) << function(self, formula)
self.view.rightBarAniWrp:PlayInAnimation()
local outputGemId = formula.showProductItemId
local outputGemItemCfg = Tables.itemTable[outputGemId]
self.m_starCellCache:Refresh(outputGemItemCfg.rarity)
self.view.gemName.text = outputGemItemCfg.name
self.view.gemIconColor.color = UIUtils.getItemRarityColor(outputGemItemCfg.rarity)
local hasCostItem = formula.costItemId ~= nil and formula.costItemNum > 0
self.view.itemCostNode.gameObject:SetActive(hasCostItem)
self.view.itemCostNodeEmpty.gameObject:SetActive(not hasCostItem)
self.view.formulaHint:SetAndResolveTextStyle(formula.formulaHint)
self.view.costItem:InitItem({
id = formula.costItemId,
count = formula.costItemNum,
}, true)
local inventoryCount = Utils.getItemCount(formula.costItemId, true)
self.view.storageNode:InitStorageNode(inventoryCount, formula.costItemNum, true)
self.view.commonGemList:InitCommonItemList({
listType = UIConst.COMMON_ITEM_LIST_TYPE.GEM_RECAST,
refreshItemAddOn = function(cell, itemInfo)
self:_RefreshGemRecastCellAddOn(cell, itemInfo)
end,
onClickItem = function(args)
local itemInfo = args.itemInfo
args.nextCell.item:ShowTips()
self:_AddIngredient(itemInfo)
end,
filter_rarity = formula.costGemQuality
})
self:_RefreshGemCellCache(formula)
end
GemRecastCtrl._RefreshCommonNode = HL.Method(HL.Userdata) << function(self, formula)
end
GemRecastCtrl._RefreshGemCellCache = HL.Method(HL.Userdata) << function(self, formula)
self.m_gemCellCache:Refresh(formula.costGemNum, function(cell, index)
local itemInfo = self.m_gemIngredientList[index]
if itemInfo then
local gemInst = CharInfoUtils.getGemByInstId(itemInfo.instId)
cell.item:InitItem({
id = gemInst.templateId,
instId = gemInst.instId,
}, true)
cell.item.view.button.onClick:RemoveAllListeners()
cell.item.view.button.onClick:AddListener(function()
self:_ToggleGemList(true)
end)
end
self:_RefreshGemRecastCellAddOn(cell, itemInfo)
end)
end
GemRecastCtrl._ToggleGemList = HL.Method(HL.Boolean) << function(self, isOn)
if isOn then
self.view.btnEmpty.gameObject:SetActive(true)
self.view.commonGemList.gameObject:SetActive(true)
else
self.view.commonGemList.view.animationWrapper:PlayOutAnimation(function()
self.view.btnEmpty.gameObject:SetActive(false)
self.view.commonGemList.gameObject:SetActive(false)
end)
end
end
GemRecastCtrl._RefreshGemRecastCellAddOn = HL.Method(HL.Table, HL.Opt(HL.Table, HL.Function)) << function(self, cell, itemInfo, onClick)
local isEmpty = itemInfo == nil
cell.btnEmpty.gameObject:SetActive(isEmpty)
cell.item.gameObject:SetActive(not isEmpty)
cell.currentSelected.gameObject:SetActive(not isEmpty)
cell.equipped.gameObject:SetActive(not isEmpty)
cell.btnDelete.gameObject:SetActive(not isEmpty)
cell.disableMask.gameObject:SetActive(false)
cell.btnEmpty.onClick:RemoveAllListeners()
cell.btnEmpty.onClick:AddListener(function()
self:_ToggleGemList(true)
end)
if isEmpty then
return
end
local instId = itemInfo.instId
local gemInst = CharInfoUtils.getGemByInstId(instId)
local isEquipped = gemInst.weaponInstId and gemInst.weaponInstId > 0
cell.equipped.gameObject:SetActive(isEquipped)
cell.btnDelete.onClick:RemoveAllListeners()
cell.btnDelete.onClick:AddListener(function()
self:_RemoveIngredient(itemInfo)
end)
local isSelected = self.m_gemIngredientDict[instId] ~= nil
cell.btnDelete.gameObject:SetActive(isSelected)
cell.currentSelected.gameObject:SetActive(isSelected)
end
GemRecastCtrl._AddIngredient = HL.Method(HL.Table) << function(self, itemInfo)
local instId = itemInfo.instId
local curFormula = self.m_sortedFormulas[self.m_curSelectFormulaIndex]
if #self.m_gemIngredientList >= curFormula.costGemNum then
Notify(MessageConst.SHOW_TOAST, Language.LUA_GEM_FORMULA_ITEM_FULL_TOAST)
return
end
local isLock = GameInstance.player.inventory:IsItemLocked(Utils.getCurrentScope(), itemInfo.itemInst.templateId, itemInfo.itemInst.instId)
if isLock then
self:Notify(MessageConst.SHOW_TOAST, Language.LUA_WEAPON_EXHIBIT_UPGRADE_WEAPON_LOCKED)
return
end
local gemInst = CharInfoUtils.getGemByInstId(instId)
local isEquipped = gemInst.weaponInstId > 0
if isEquipped then
local weaponInst = CharInfoUtils.getWeaponByInstId(gemInst.weaponInstId)
local weaponItemCfg = Tables.itemTable[weaponInst.templateId]
Notify(MessageConst.SHOW_POP_UP, {
content = string.format(Language.LUA_GEM_RECAST_GEM_EQUIPPED, weaponItemCfg.name),
onConfirm = function()
GameInstance.player.charBag:DetachGem(weaponInst.instId)
end,
onCancel = function()
end
})
return
end
self.m_gemIngredientDict[itemInfo.instId] = itemInfo
self.m_gemIngredientList = self:_GenerateIngredientList(self.m_gemIngredientDict)
self.view.commonGemList:RefreshCellById(instId)
self:_RefreshGemCellCache(curFormula)
end
GemRecastCtrl._RemoveIngredient = HL.Method(HL.Table) << function(self, itemInfo)
local instId = itemInfo.instId
local curFormula = self.m_sortedFormulas[self.m_curSelectFormulaIndex]
local newGemList = {}
self.m_gemIngredientDict[instId] = nil
for instId, itemInfo in ipairs(self.m_gemIngredientDict) do
table.insert(newGemList, itemInfo)
end
self.m_gemIngredientList = self:_GenerateIngredientList(self.m_gemIngredientDict)
self.view.commonGemList:RefreshCellById(instId)
self:_RefreshGemCellCache(curFormula)
end
GemRecastCtrl._GenerateIngredientList = HL.Method(HL.Table).Return(HL.Table) << function(self, ingredientDict)
local ingredientList = {}
for instId, itemInfo in pairs(ingredientDict) do
table.insert(ingredientList, itemInfo)
end
local defaultSortKeys = UIConst.WEAPON_GEM_SORT_OPTION[1].keys
table.sort(ingredientList, Utils.genSortFunction(defaultSortKeys))
return ingredientList
end
GemRecastCtrl._AutoFill = HL.Method(HL.Userdata) << function(self, formula)
local newDict = {}
local newList = {}
local depotList = self.view.commonGemList.m_filteredInfoList
local needCount = formula.costGemNum
local collectCount = 0
for _, itemInfo in ipairs(depotList) do
local gemInst = CharInfoUtils.getGemByInstId(itemInfo.instId)
local hadEquipped = gemInst.weaponInstId and gemInst.weaponInstId > 0
local isLock = GameInstance.player.inventory:IsItemLocked(Utils.getCurrentScope(), itemInfo.itemInst.templateId, itemInfo.itemInst.instId)
if (not isLock) and (not hadEquipped) then
newDict[itemInfo.instId] = itemInfo
table.insert(newList, itemInfo)
collectCount = collectCount + 1
end
if collectCount >= needCount then
break
end
end
self.m_gemIngredientDict = newDict
self.m_gemIngredientList = newList
self:_RefreshGemCellCache(formula)
self.view.commonGemList:RefreshAllCells()
end
GemRecastCtrl._OnItemLockedStateChanged = HL.Method(HL.Table) << function(self, arg)
local itemId, instId, isLock = unpack(arg)
if not isLock then
return
end
if not instId or instId <= 0 then
return
end
if self.m_gemIngredientDict[instId] then
Notify(MessageConst.SHOW_TOAST, Language.LUA_WEAPON_EXHIBIT_ITEM_LOCK_TOAST)
self:_RemoveIngredient(self.m_gemIngredientDict[instId])
end
end
GemRecastCtrl.OnGemDetach = HL.Method(HL.Table) << function(self, arg)
self.view.commonGemList:RefreshAllCells()
end
GemRecastCtrl.OnGemRecast = HL.Method(HL.Table) << function(self, arg)
local title
if self.m_curTab == GEM_RECAST_TAB_TYPE.FORGE then
title = Language.LUA_GEM_FORGE_REWARD_TITLE
else
title = Language.LUA_GEM_RECAST_REWARD_TITLE
end
local gemInstIds = unpack(arg)
local items = {}
for _, v in pairs(gemInstIds) do
local gemInst = CharInfoUtils.getGemByInstId(v)
if gemInst ~= nil then
table.insert(items, {
id = gemInst.templateId,
instId = v,
count = 1,
})
end
end
if #items <= 0 then
return
end
Notify(MessageConst.SHOW_SYSTEM_REWARDS, {
title = title,
items = items,
})
self:_RefreshMainPanel(self.m_curTab)
end
HL.Commit(GemRecastCtrl)