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

590 lines
19 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.GemEnhance
GemEnhanceCtrl = HL.Class('GemEnhanceCtrl', uiCtrl.UICtrl)
local ENHANCE_NODE_STATE_NAME = {
GEM = "gem",
MATERIAL = "material",
}
GemEnhanceCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_GEM_ENHANCE] = '_OnGemEnhance',
}
GemEnhanceCtrl.m_args = HL.Field(HL.Table)
GemEnhanceCtrl.m_selectedGemInstId = HL.Field(HL.Number) << -1
GemEnhanceCtrl.m_selectedMaterialGemInstId = HL.Field(HL.Number) << -1
GemEnhanceCtrl.m_selectedTermIndex = HL.Field(HL.Number) << -1
GemEnhanceCtrl.m_isSelectedTermMax = HL.Field(HL.Boolean) << false
GemEnhanceCtrl.m_TermLevelCellCache = HL.Field(HL.Forward("UIListCache"))
GemEnhanceCtrl.m_selectedTermEnhanceData = HL.Field(HL.Any)
GemEnhanceCtrl.m_isCostEnough = HL.Field(HL.Boolean) << false
GemEnhanceCtrl.OnCreate = HL.Override(HL.Any) << function(self, args)
self.m_args = args or {}
self:_InitController()
self.view.btnClose.onClick:AddListener(function()
PhaseManager:PopPhase(PhaseId.GemEnhance)
end)
self.view.btnBack.onClick:AddListener(function()
self:_BackToSelectionMode(true)
end)
self.view.enhancedNode.commonToggle:InitCommonToggle(function(isOn)
if isOn then
if self.view.enhancedNode.stateController.currentStateName == ENHANCE_NODE_STATE_NAME.GEM then
return
end
self.view.enhancedNode.stateController:SetState(ENHANCE_NODE_STATE_NAME.GEM)
self:_RefreshMaterialGemList(DeviceInfo.usingController)
self:_RefreshProb()
self:_RefreshEnhanceBtn()
else
if self.view.enhancedNode.stateController.currentStateName == ENHANCE_NODE_STATE_NAME.MATERIAL then
return
end
self.view.enhancedNode.stateController:SetState(ENHANCE_NODE_STATE_NAME.MATERIAL)
self:_RefreshEnhanceMaterial()
self:_RefreshProb()
self:_RefreshEnhanceBtn()
end
end, false, true)
self:BindInputPlayerAction("weapon_gem_enhance_cost_gem", function()
self.view.enhancedNode.commonToggle:SetValue(true)
self.view.enhancedNode.commonToggle.toggle:PlayAudio()
end)
self:BindInputPlayerAction("weapon_gem_enhance_cost_material", function()
self.view.enhancedNode.commonToggle:SetValue(false)
self.view.enhancedNode.commonToggle.toggle:PlayAudio()
end)
self.view.bottomEnhancedNode.btnConfirm.onClick:AddListener(function()
self:_OnEnhanceConfirmClicked()
end)
self.view.entriesPanNode.preBtn.onClick:AddListener(function()
self:_OnPreTermClicked()
end)
self.view.entriesPanNode.nextBtn.onClick:AddListener(function()
self:_OnNextTermClicked()
end)
self:_EnterSelectionMode()
end
GemEnhanceCtrl._EnterSelectionMode = HL.Method() << function(self)
self.view.lockNaviGroup.enabled = true
self.view.controllerFocusHintNode.gameObject:SetActive(true)
self.view.stateController:SetState("selection")
self:_RefreshLeftGemList()
end
GemEnhanceCtrl._RefreshLeftGemList = HL.Method() << function(self)
self.view.commonItemList:InitCommonItemList({
listType = UIConst.COMMON_ITEM_LIST_TYPE.WEAPON_EXHIBIT_GEM,
onClickItem = function(args)
local itemInfo = args.itemInfo
if not itemInfo then
return
end
self:_OnSelectGem(itemInfo)
end,
refreshItemAddOn = function(cell, itemInfo)
local gemInst = itemInfo.itemInst
local attachedWeaponInstId = gemInst.weaponInstId
cell.equipped.gameObject:SetActive(attachedWeaponInstId and attachedWeaponInstId > 0)
cell.curEquipped.gameObject:SetActive(false)
cell.disableMask.gameObject:SetActive(false)
end,
filter_rarity = Tables.gemConst.enhanceCostGemRarity,
defaultSelectedIndex = 1,
selectedIndexId = self.m_args.gemInstId or self.m_selectedGemInstId,
onFilterNone = function()
self.m_selectedGemInstId = -1
self.view.stateController:SetState("empty")
self:_UpdateSelectedGemSkillInfo()
end
})
self.m_args.selectedTermIdMap = nil
self.m_args.gemInstId = nil
end
GemEnhanceCtrl._OnSelectGem = HL.Method(HL.Table) << function(self, itemInfo)
if self.m_selectedGemInstId == itemInfo.instId then
return
end
self.view.stateController:SetState("selection", false)
self.m_selectedGemInstId = itemInfo.instId
self:_UpdateSelectedGemBasicInfo(itemInfo)
self:_UpdateSelectedGemSkillInfo()
end
GemEnhanceCtrl._UpdateSelectedGemBasicInfo = HL.Method(HL.Table) << function(self, itemInfo)
local gemInst = CharInfoUtils.getGemByInstId(itemInfo.instId)
if not gemInst then
logger.error("GemEnhanceCtrl->Can't get gemInst by instId: " .. itemInfo.instId)
return
end
self.view.infoNode.matrixName.text = UIUtils.getItemName(itemInfo.id, itemInfo.instId)
self.view.infoNode.itemIcon:InitItemIcon(gemInst.templateId, true, gemInst.instId)
self.view.infoNode.lockToggle:InitLockToggle(gemInst.templateId, gemInst.instId)
self.view.infoNode.trashToggle:InitTrashToggle(gemInst.templateId, gemInst.instId)
local _, domainData = Tables.domainDataTable:TryGetValue(gemInst.domainId)
self.view.infoNode.domainNode.gameObject:SetActive(domainData ~= nil)
if domainData then
self.view.infoNode.txtDomainName.text = domainData.domainName
end
CSUtils.UIContainerResize(self.view.infoNode.starInfoNode, itemInfo.rarity)
UIUtils.setItemRarityImage(self.view.infoNode.imgQuality, itemInfo.rarity)
end
GemEnhanceCtrl._UpdateSelectedGemSkillInfo = HL.Method() << function(self)
self.view.entriesGroupNode.animationWrapper:PlayInAnimation()
local gemInstId = self.m_selectedGemInstId
if gemInstId <= 0 then
for i = 1, 3 do
local termCell = self.view.entriesGroupNode[string.format("gemSkillEnhanceCell%d", i)]
termCell:InitGemSkillEnhanceCell(nil)
end
return
end
local gemInst = CharInfoUtils.getGemByInstId(gemInstId)
if not gemInst then
logger.error("GemEnhanceCtrl->Can't get gemInst by instId: " .. tostring(gemInstId))
return
end
for i = 0, gemInst.termList.Count - 1 do
local term = gemInst.termList[i]
local termCell = self.view.entriesGroupNode[string.format("gemSkillEnhanceCell%d", i+1)]
termCell:InitGemSkillEnhanceCell({
termId = term.termId,
termLevel = term.cost,
onClick = function(termId, termLevel)
self.m_selectedTermIndex = i
self:_EnterEnhanceModeWithAnim()
end,
})
end
end
GemEnhanceCtrl._EnterEnhanceModeWithAnim = HL.Method() << function(self)
self.view.commonItemList.view.animationWrapper:PlayOutAnimation()
self.view.entriesGroupNode.animationWrapper:PlayOutAnimation(function()
self:_EnterEnhanceMode()
end)
end
GemEnhanceCtrl._EnterEnhanceMode = HL.Method() << function(self)
self.view.lockNaviGroup.enabled = false
self.view.controllerFocusHintNode.gameObject:SetActive(false)
self.view.stateController:SetState("enhance")
local isOn = self.view.enhancedNode.commonToggle.toggle.isOn
self.view.enhancedNode.commonToggle:SetValue(true)
if isOn then
self:_RefreshMaterialGemList(DeviceInfo.usingController)
end
self:_RefreshEnhanceTerm()
end
GemEnhanceCtrl._BackToSelectionMode = HL.Method(HL.Opt(HL.Boolean)) << function(self, playOutAnim)
if playOutAnim then
self.view.bottomEnhancedNode.animationWrapper:PlayOutAnimation()
self.view.entriesPanNode.animationWrapper:PlayOutAnimation()
self.view.enhancedNode.animationWrapper:PlayOutAnimation(function()
self:_EnterSelectionMode()
end)
else
self:_EnterSelectionMode()
end
end
GemEnhanceCtrl._RefreshEnhanceTerm = HL.Method(HL.Opt(HL.Boolean)) << function(self, playSwitchAnim)
local gemInst = CharInfoUtils.getGemByInstId(self.m_selectedGemInstId)
if not gemInst then
logger.error("GemEnhanceCtrl->Can't get gemInst by instId: " .. tostring(self.m_selectedGemInstId))
return
end
self.view.entriesPanNode.preBtn.gameObject:SetActive(self.m_selectedTermIndex > 0)
self.view.entriesPanNode.nextBtn.gameObject:SetActive(self.m_selectedTermIndex < gemInst.termList.Count - 1)
local term = gemInst.termList[self.m_selectedTermIndex]
local _, termCfg = Tables.gemTable:TryGetValue(term.termId)
if not termCfg then
logger.error("GemEnhanceCtrl->Can't get termCfg by termId: " .. tostring(term.termId))
return
end
local isMax = CharInfoUtils.isGemTermEnhanceMax(term.termId, term.cost)
self.m_isSelectedTermMax = isMax
local nextCost = isMax and term.cost or term.cost + 1
self.view.entriesPanNode.txtAttrName:SetAndResolveTextStyle(string.format(Language.LUA_GEM_CARD_SKILL_ACTIVE, termCfg.tagName))
self.view.entriesPanNode.nowValueTxt.text = string.format(Language.LUA_WEAPON_EXHIBIT_UPGRADE_ADD_FORMAT, term.cost)
self.view.entriesPanNode.newValueTxt.text = string.format(Language.LUA_WEAPON_EXHIBIT_UPGRADE_ADD_FORMAT, nextCost)
self.m_TermLevelCellCache = self.m_TermLevelCellCache or UIUtils.genCellCache(self.view.entriesPanNode.grooveCell)
self.m_TermLevelCellCache:Refresh(nextCost, function(cell, luaIndex)
cell.progress.gameObject:SetActive(luaIndex <= term.cost)
cell.progressAdd.gameObject:SetActive(luaIndex > term.cost)
end)
self.view.entriesPanNode.stateController:SetState(isMax and "max" or "normal")
self:_RefreshProb()
self:_RefreshEnhanceMaterial()
self:_RefreshEnhanceBtn()
if playSwitchAnim then
self.view.entriesPanNode.animationWrapper:Play("gemenhance_entriespan_switch")
end
end
GemEnhanceCtrl._OnPreTermClicked = HL.Method() << function(self)
self.m_selectedTermIndex = math.max(0, self.m_selectedTermIndex - 1)
self:_RefreshEnhanceTerm(true)
end
GemEnhanceCtrl._OnNextTermClicked = HL.Method() << function(self)
local gemInst = CharInfoUtils.getGemByInstId(self.m_selectedGemInstId)
self.m_selectedTermIndex = math.min(gemInst.termList.Count - 1, self.m_selectedTermIndex + 1)
self:_RefreshEnhanceTerm(true)
end
GemEnhanceCtrl._RefreshProb = HL.Method() << function(self)
local stateName = "Empty"
if not self.m_isSelectedTermMax then
if self.view.enhancedNode.stateController.currentStateName == ENHANCE_NODE_STATE_NAME.MATERIAL then
stateName = "Must"
elseif self.m_selectedMaterialGemInstId > 0 then
local gemEnhanceData = self:_GetCurrentGemEnhanceData()
if gemEnhanceData then
if gemEnhanceData.successProbality >= 500 then
stateName = "VeryHigh"
elseif gemEnhanceData.successProbality >= 200 then
stateName = "High"
elseif gemEnhanceData.successProbality >= 100 then
stateName = "Low"
else
stateName = "VeryLow"
end
end
end
end
self.view.bottomEnhancedNode.probStateCtrl:SetState(stateName)
end
GemEnhanceCtrl._GetCurrentGemEnhanceData = HL.Method().Return(HL.Any) << function(self)
local gemInst = CharInfoUtils.getGemByInstId(self.m_selectedGemInstId)
local term = gemInst.termList[self.m_selectedTermIndex]
local _, termCfg = Tables.gemTable:TryGetValue(term.termId)
if not termCfg then
logger.error("GemEnhanceCtrl->Can't get termCfg by termId: " .. tostring(term.termId))
return nil
end
local _, gemEnhanceDataList = Tables.gemEnhanceTable:TryGetValue(termCfg.termType)
if gemEnhanceDataList then
for _, gemEnhanceData in pairs(gemEnhanceDataList.list) do
if gemEnhanceData.termCost == term.cost + 1 then
return gemEnhanceData
end
end
end
return nil
end
GemEnhanceCtrl._RefreshMaterialGemList = HL.Method(HL.Opt(HL.Boolean)) << function(self, isFirstSelected)
self:_OnSelectMaterialGem(nil)
self.view.bottomEnhancedNode.commonGemHorizontalList:InitCommonItemList({
listType = UIConst.COMMON_ITEM_LIST_TYPE.WEAPON_EXHIBIT_GEM,
onClickItem = function(args)
local itemInfo = args.itemInfo
if not itemInfo then
return
end
self:_OnSelectMaterialGem(itemInfo)
end,
refreshItemAddOn = function(cell, itemInfo)
local gemInst = itemInfo.itemInst
local attachedWeaponInstId = gemInst.weaponInstId
cell.equipped.gameObject:SetActive(attachedWeaponInstId and attachedWeaponInstId > 0)
cell.curEquipped.gameObject:SetActive(false)
cell.disableMask.gameObject:SetActive(false)
end,
filter_rarity = Tables.gemConst.enhanceCostGemRarity,
exclusiveInstId = self.m_selectedGemInstId,
onFilterNone = function()
self.m_selectedMaterialGemInstId = -1
self.view.enhancedNode.gemEmptyNode.gameObject:SetActive(true)
self.view.enhancedNode.gemCard.gameObject:SetActive(false)
end,
defaultSelectedIndex = isFirstSelected and 1 or nil,
sortKeys = { "matchWeaponSkillIndex", "enableOnWeaponIndex", "trashIndex", "rarity", "sortId1", "sortId2", "id" }
})
end
GemEnhanceCtrl._OnSelectMaterialGem = HL.Method(HL.Table) << function(self, itemInfo)
local isEmpty = itemInfo == nil
local instId = isEmpty and -1 or itemInfo.instId
if self.m_selectedMaterialGemInstId == instId then
return
end
self.m_selectedMaterialGemInstId = instId
self.view.enhancedNode.gemNodeAnim:PlayInAnimation()
self.view.enhancedNode.gemEmptyNode.gameObject:SetActive(isEmpty)
self.view.enhancedNode.gemCard.gameObject:SetActive(not isEmpty)
if isEmpty then
return
end
self.view.enhancedNode.gemCard:InitGemCard(itemInfo.instId)
self:_RefreshProb()
self:_RefreshEnhanceBtn()
end
GemEnhanceCtrl._RefreshEnhanceMaterial = HL.Method() << function(self)
local gemEnhanceData = self:_GetCurrentGemEnhanceData()
local itemId = Tables.gemConst.gemEnhancementItemId
local costItemCount = gemEnhanceData and gemEnhanceData.costEnhancementItem or 0
self.view.enhancedNode.itemMaterial:InitItem({
id = itemId,
count = costItemCount,
}, true)
local itemCount = Utils.getItemCount(itemId, true, true)
self.view.enhancedNode.commonStorageNode:InitStorageNode(itemCount, costItemCount, true)
self.m_isCostEnough = itemCount >= costItemCount
end
GemEnhanceCtrl._RefreshEnhanceBtn = HL.Method() << function(self)
local isMaterialMode = self.view.enhancedNode.stateController.currentStateName == ENHANCE_NODE_STATE_NAME.MATERIAL
local isAvailable = true
local unavailableTips = ''
if self.m_isSelectedTermMax then
isAvailable = false
unavailableTips = Language.LUA_GEM_ENHANCE_MAX_LEVEL
else
if isMaterialMode then
if not self.m_isCostEnough then
isAvailable = false
unavailableTips = Language.LUA_GEM_ENHANCE_COST_NOT_ENOUGH
end
else
if self.m_selectedMaterialGemInstId <= 0 then
isAvailable = false
unavailableTips = Language.LUA_GEM_ENHANCE_MATERIAL_GEM_NOT_SELECTED
end
end
end
if not isAvailable then
self.view.bottomEnhancedNode.txtUnavaliable.text = unavailableTips
end
self.view.bottomEnhancedNode.btnConfirm.gameObject:SetActive(isAvailable)
self.view.bottomEnhancedNode.limitReachedNode.gameObject:SetActive(not isAvailable)
end
GemEnhanceCtrl._OnEnhanceConfirmClicked = HL.Method() << function(self)
local isMaterial = self.view.enhancedNode.stateController.currentStateName == ENHANCE_NODE_STATE_NAME.MATERIAL
local gemInst = CharInfoUtils.getGemByInstId(self.m_selectedGemInstId, true)
if not gemInst then
return
end
local termId = gemInst.termList[self.m_selectedTermIndex].termId
if isMaterial then
GameInstance.player.inventory:EnhanceGem(self.m_selectedGemInstId, termId, 0, true)
else
local materialGemInst = CharInfoUtils.getGemByInstId(self.m_selectedMaterialGemInstId, true)
if not gemInst then
return
end
if materialGemInst.weaponInstId > 0 then
self:Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_GEM_ENHANCE_MATERIAL_GEM_EQUIP_CONFIRM,
onConfirm = function()
GameInstance.player.inventory:EnhanceGem(self.m_selectedGemInstId, termId, self.m_selectedMaterialGemInstId, false)
end,
weaponInstId = materialGemInst.weaponInstId,
})
else
GameInstance.player.inventory:EnhanceGem(self.m_selectedGemInstId, termId, self.m_selectedMaterialGemInstId, false)
end
end
end
GemEnhanceCtrl._OnGemEnhance = HL.Method(HL.Table) << function(self, args)
local msg = unpack(args)
UIManager:Open(PanelId.GemEnhanceResult, {
isSuccess = msg.IsSuccess,
gemInstId = msg.GemInstId,
termIndex = self.m_selectedTermIndex,
refundItems = msg.refundItems,
onConfirm = function()
if self.view.enhancedNode.stateController.currentStateName == ENHANCE_NODE_STATE_NAME.MATERIAL then
self:_RefreshEnhanceMaterial()
else
self:_RefreshMaterialGemList(true)
end
self:_RefreshEnhanceTerm()
self:_UpdateSelectedGemSkillInfo()
local gemInst = CharInfoUtils.getGemByInstId(self.m_selectedGemInstId)
local term = gemInst.termList[self.m_selectedTermIndex]
local isMax = CharInfoUtils.isGemTermEnhanceMax(term.termId, term.cost)
if isMax then
self:_EnterSelectionMode()
self:_UpdateSelectedGemSkillInfo()
end
end
})
end
GemEnhanceCtrl._InitController = HL.Method() << function(self)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({self.view.inputGroup.groupId})
self.view.lockNaviGroup.onIsTopLayerChanged:AddListener(function(isTopLayer)
self.view.controllerFocusHintNode.gameObject:SetActive(not isTopLayer)
end)
self.view.leftGemNaviGroup.onIsTopLayerChanged:AddListener(function(isTopLayer)
if not DeviceInfo.usingController then
return
end
local selectedCell = self.view.commonItemList:GetCurSelectedItemCell()
if selectedCell then
self.view.commonItemList:SetSelectedAppearance(selectedCell, not isTopLayer)
end
end)
end
HL.Commit(GemEnhanceCtrl)