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

658 lines
21 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.WeaponExhibitPotential
WeaponExhibitPotentialCtrl = HL.Class('WeaponExhibitPotentialCtrl', uiCtrl.UICtrl)
WeaponExhibitPotentialCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_WEAPON_REFINE] = 'OnWeaponRefine',
[MessageConst.ON_GEM_DETACH] = 'OnGemDetach',
[MessageConst.ON_ITEM_LOCKED_STATE_CHANGED] = 'OnItemLockedStateChanged',
}
WeaponExhibitPotentialCtrl.m_weaponInfo = HL.Field(HL.Table)
WeaponExhibitPotentialCtrl.m_bottomWeaponCellCache =HL.Field(HL.Forward("UIListCache"))
WeaponExhibitPotentialCtrl.m_lastClickItemId = HL.Field(HL.Any)
WeaponExhibitPotentialCtrl.m_lastClickItemInfo = HL.Field(HL.Table)
WeaponExhibitPotentialCtrl.m_costItemInfoDict = HL.Field(HL.Table)
WeaponExhibitPotentialCtrl.m_isFocusJump = HL.Field(HL.Boolean) << false
WeaponExhibitPotentialCtrl.m_effectCor = HL.Field(HL.Thread)
WeaponExhibitPotentialCtrl.m_selectMaterialsInputBindingId = HL.Field(HL.Number) << -1
WeaponExhibitPotentialCtrl.m_materialsDecreaseCountInputBindingId = HL.Field(HL.Number) << -1
WeaponExhibitPotentialCtrl.m_naviMaterialCell = HL.Field(HL.Any)
WeaponExhibitPotentialCtrl.m_naviMaterialItemInfo = HL.Field(HL.Table)
WeaponExhibitPotentialCtrl.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
local costItemInfoDict = self.m_costItemInfoDict
if costItemInfoDict[instId] ~= nil then
Notify(MessageConst.SHOW_TOAST, Language.LUA_WEAPON_EXHIBIT_ITEM_LOCK_TOAST)
self:_RemoveFromCostItemDict(costItemInfoDict[instId])
end
end
WeaponExhibitPotentialCtrl.OnGemDetach = HL.Method(HL.Table) << function(self, arg)
self.view.commonWeaponList:RefreshAllCells()
end
WeaponExhibitPotentialCtrl.OnWeaponRefine = HL.Method(HL.Table) << function(self, arg)
local weaponInfo = self.m_weaponInfo
local weaponInst = CharInfoUtils.getWeaponByInstId(weaponInfo.weaponInstId)
local maxRefineLv = CS.Beyond.Gameplay.WeaponUtil.GetWeaponMaxRefineLv(weaponInfo.weaponTemplateId)
local weaponExhibitInfo = CharInfoUtils.getWeaponExhibitBasicInfo(weaponInfo.weaponTemplateId, weaponInfo.weaponInstId)
self.m_costItemInfoDict = {}
self:_ToggleExpandNode(false, true)
if weaponInst.refineLv >= maxRefineLv then
AudioAdapter.PostEvent("Au_UI_Event_WeaponPotentialLevelMax")
self.m_effectCor = self:_ClearCoroutine(self.m_effectCor)
self.m_effectCor = self:_StartCoroutine(function()
self:_RefreshPotentialPanelBasic(weaponExhibitInfo)
self.view.weaponSkillNodeBefore.gameObject:SetActive(false)
self.view.potentialNode:Play("weaponpotential_fullfinsh_in")
coroutine.wait(0.3)
self:_RefreshWeaponPotentialStar(weaponExhibitInfo.weaponInst.templateId, weaponExhibitInfo.weaponInst.instId)
end)
else
AudioAdapter.PostEvent("Au_UI_Event_WeaponPotentialLevelUp")
self.m_effectCor = self:_StartCoroutine(function()
self.view.potentialAfter.view.animation:Play("weaponexhibitpotential_finishglow_break")
self:_RefreshPotentialPanelBasic(weaponExhibitInfo)
self.view.potentialAfter:InitWeaponPotentialStar(weaponInst.refineLv, {
showMaxPotentialHint = false,
fromLv = weaponInst.refineLv
})
coroutine.wait(0.2)
self.view.potentialBefore:InitWeaponPotentialStar(weaponInst.refineLv, {
showCurLevelTransition = true,
showMaxPotentialHint = false,
fromLv = weaponInst.refineLv
})
end)
end
end
WeaponExhibitPotentialCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self:_InitActionEvent()
self.m_weaponInfo = arg.weaponInfo
self.m_isFocusJump = arg.isFocusJump == true
end
WeaponExhibitPotentialCtrl._InitActionEvent = HL.Method() << function(self)
self.view.m_bottomWeaponCellCache = UIUtils.genCellCache(self.view.listCellWeaponUpgrade)
self.view.btnBack.onClick:AddListener(function()
if UIManager:IsShow(PanelId.ItemTips) then
Notify(MessageConst.HIDE_ITEM_TIPS)
end
if self.m_isFocusJump then
Notify(MessageConst.WEAPON_EXHIBIT_BLEND_EXIT, {
finishCallback = function()
PhaseManager:ExitPhaseFast(PhaseId.WeaponInfo)
end
})
self:PlayAnimationOut()
return
end
self:Notify(MessageConst.WEAPON_EXHIBIT_PAGE_CHANGE, {
pageType = UIConst.WEAPON_EXHIBIT_PAGE_TYPE.OVERVIEW,
})
end)
self.view.btnEmpty.onClick:AddListener(function()
self:_ToggleExpandNode(false, DeviceInfo.usingController)
end)
self.view.btnLevelUp.onClick:AddListener(function()
if not self.m_costItemInfoDict or lume.count(self.m_costItemInfoDict) == 0 then
self:Notify(MessageConst.SHOW_TOAST, Language.LUA_WEAPON_EXHIBIT_POTENTIAL_EMPTY_INGREDIENT)
return
end
local costWeapons = {}
local costItem2Count = {}
for i, costItemInfo in pairs(self.m_costItemInfoDict) do
if costItemInfo.isWeapon then
table.insert(costWeapons, costItemInfo.itemInst.instId)
else
local itemId = costItemInfo.id
costItem2Count[itemId] = (costItem2Count[itemId] or 0) + costItemInfo.count
end
end
local addRefineLv = self:_GetCurAddRefineLv()
local weaponInst = CharInfoUtils.getWeaponByInstId(self.m_weaponInfo.weaponInstId)
GameInstance.player.charBag:WeaponRefine(self.m_weaponInfo.weaponInstId, weaponInst.refineLv + addRefineLv, costItem2Count, costWeapons)
end)
self.m_selectMaterialsInputBindingId = self:BindInputPlayerAction("char_info_weapon_select_materials", function()
self:_ToggleExpandNode(true)
end, self.view.leftNodeInputGroup.groupId)
self.m_materialsDecreaseCountInputBindingId = self:BindInputPlayerAction("char_info_weapon_materials_decrease_count", function()
self:_OnItemBtnMinusClicked(self.m_naviMaterialCell, self.m_naviMaterialItemInfo)
end)
InputManagerInst:ToggleBinding(self.m_materialsDecreaseCountInputBindingId, false)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({self.view.inputGroup.groupId})
UIUtils.bindHyperlinkPopup(self, "WeaponSkill", self.view.leftNodeInputGroup.groupId)
end
WeaponExhibitPotentialCtrl.OnShow = HL.Override() << function(self)
local weaponInfo = self.m_weaponInfo
local weaponExhibitInfo = CharInfoUtils.getWeaponExhibitBasicInfo(weaponInfo.weaponTemplateId, weaponInfo.weaponInstId)
self.m_costItemInfoDict = {}
self:_RefreshPotentialPanelBasic(weaponExhibitInfo, true)
self:_RefreshWeaponPotentialStar(weaponExhibitInfo.weaponInst.templateId, weaponExhibitInfo.weaponInst.instId)
end
WeaponExhibitPotentialCtrl._RefreshPotentialPanelBasic = HL.Method(HL.Table, HL.Opt(HL.Boolean)) << function(self, weaponExhibitInfo, isInit)
self.view.title.text = string.format(Language.LUA_WEAPON_EXHIBIT_POTENTIAL_TITLE, weaponExhibitInfo.itemCfg.name)
self.view.expandNode.gameObject:SetActive(false)
self:_RefreshSkillNode(weaponExhibitInfo.weaponInst.templateId, weaponExhibitInfo.weaponInst.instId, isInit == true)
self:_RefreshButtonNode(weaponExhibitInfo)
self:_RefreshCommonItemList(weaponExhibitInfo)
end
WeaponExhibitPotentialCtrl._RefreshButtonNode = HL.Method(HL.Table) << function(self, weaponExhibitInfo)
local isMaxPotential = weaponExhibitInfo.weaponInst.refineLv >= UIConst.CHAR_MAX_POTENTIAL
if isMaxPotential then
self.view.btnLevelUp.gameObject:SetActive(false)
self.view.upgradeNode.gameObject:SetActive(false)
return
end
end
WeaponExhibitPotentialCtrl._RefreshCommonItemList = HL.Method(HL.Table) << function(self, weaponExhibitInfo)
self.view.commonWeaponList:InitCommonItemList({
listType = UIConst.COMMON_ITEM_LIST_TYPE.WEAPON_EXHIBIT_POTENTIAL,
filter_templateId = weaponExhibitInfo.weaponInst.templateId,
filter_not_instId = weaponExhibitInfo.weaponInst.instId,
filter_not_equipped = true,
filter_not_maxPotential = true,
onClickItem = function(args)
local itemInfo = args.itemInfo
local curCell = args.curCell
local nextCell = args.nextCell
self:_OnClickExpandCostItemCell(itemInfo, args.realClick)
if curCell then
end
if nextCell then
self:_RefreshWeaponCellAddOn(nextCell, itemInfo)
end
end,
refreshItemAddOn = function(cell, itemInfo)
self:_RefreshWeaponCellAddOn(cell, itemInfo)
end,
onItemIsNaviTargetChanged = function(cell, itemInfo, isTarget)
self:_OnItemIsNaviTargetChanged(cell, itemInfo, isTarget)
end,
clickItemControllerHintText = Language.ui_weapon_controller_Increase_materials,
})
end
WeaponExhibitPotentialCtrl._RefreshWeaponCellAddOn = HL.Method(HL.Any, HL.Opt(HL.Table)) << function(self, cell, itemInfo)
cell.emptyNode.onClick:RemoveAllListeners()
cell.emptyNode.onClick:AddListener(function()
self:_ToggleExpandNode(true)
end)
if itemInfo == nil then
cell.selectNode.gameObject:SetActive(false)
cell.multiSelectNode.gameObject:SetActive(false)
cell.emptyNode.gameObject:SetActive(true)
return
end
cell.btnMinus.onClick:RemoveAllListeners()
cell.btnMinus.onClick:AddListener(function()
self:_OnItemBtnMinusClicked(cell, itemInfo)
end)
cell.emptyNode.gameObject:SetActive(false)
cell.selectNode.gameObject:SetActive(itemInfo.count ~= nil and itemInfo.count > 0)
cell.multiSelectNode.gameObject:SetActive(not itemInfo.isWeapon)
cell.selectCount.text = itemInfo.count
if cell == self.m_naviMaterialCell then
InputManagerInst:ToggleBinding(self.m_materialsDecreaseCountInputBindingId, itemInfo.count and itemInfo.count > 0)
end
end
WeaponExhibitPotentialCtrl._OnItemBtnMinusClicked = HL.Method(HL.Any, HL.Table) << function(self, cell, itemInfo)
self:_RefreshWeaponCellAddOn(cell, itemInfo)
self:_RemoveFromCostItemDict(itemInfo, 1)
end
WeaponExhibitPotentialCtrl._OnItemIsNaviTargetChanged = HL.Method(HL.Any, HL.Table, HL.Boolean) << function(self, cell, itemInfo, isTarget)
if isTarget and cell.gameObject.activeSelf then
InputManagerInst:ToggleBinding(self.m_materialsDecreaseCountInputBindingId, itemInfo.count and itemInfo.count > 0)
self.m_naviMaterialCell = cell
self.m_naviMaterialItemInfo = itemInfo
Notify(MessageConst.SHOW_ITEM_TIPS, {
transform = self.view.expandNode.tipPos,
itemId = itemInfo.itemCfg.id,
instId = itemInfo.indexId,
noJump = true,
autoClose = false,
isSideTips = true,
posType = UIConst.UI_TIPS_POS_TYPE.RightMid,
})
end
end
WeaponExhibitPotentialCtrl._OnClickExpandCostItemCell = HL.Method(HL.Table, HL.Boolean) << function(self, costItemInfo, realClick)
if not realClick then
return
end
if self.m_lastClickItemId ~= costItemInfo.indexId and not DeviceInfo.usingController then
Notify(MessageConst.SHOW_ITEM_TIPS, {
transform = self.view.expandNode.tipPos,
itemId = costItemInfo.itemCfg.id,
instId = costItemInfo.instId,
noJump = true,
autoClose = false,
isSideTips = true,
posType = UIConst.UI_TIPS_POS_TYPE.RightMid,
})
end
self.m_lastClickItemId = costItemInfo.indexId
self.m_lastClickItemInfo = costItemInfo
self:_AddIntoCostItemDict(costItemInfo, 1)
end
WeaponExhibitPotentialCtrl._AddIntoCostItemDict = HL.Method(HL.Table, HL.Number) << function(self, itemInfo, count)
local weaponInfo = self.m_weaponInfo
self:_TryAddIntoCostItemDict(itemInfo, count)
self:_RefreshBottomCostItem(true)
self:_RefreshSkillNode(weaponInfo.weaponTemplateId, weaponInfo.weaponInstId)
self:_RefreshWeaponPotentialStar(weaponInfo.weaponTemplateId, weaponInfo.weaponInstId)
end
WeaponExhibitPotentialCtrl._RemoveFromCostItemDict = HL.Method(HL.Table, HL.Opt(HL.Number)) << function(self, itemInfo, count)
local costItemInfoDict = self.m_costItemInfoDict
local weaponInfo = self.m_weaponInfo
local id = itemInfo.indexId
itemInfo.count = 0
if costItemInfoDict[id] and itemInfo.count <= 0 then
costItemInfoDict[id] = nil
end
self:_RefreshBottomCostItem(true)
self:_RefreshSkillNode(weaponInfo.weaponTemplateId, weaponInfo.weaponInstId)
self:_RefreshWeaponPotentialStar(weaponInfo.weaponTemplateId, weaponInfo.weaponInstId)
self.view.commonWeaponList:RefreshCellById(itemInfo.indexId)
end
WeaponExhibitPotentialCtrl._TryAddIntoCostItemDict = HL.Method(HL.Table, HL.Number) << function(self, itemInfo, count)
local curCount = itemInfo.count or 0
local nextCount = curCount + count
if count <= 0 then
return nextCount
end
local isLock = itemInfo.isWeapon and
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 addRefineLv
if itemInfo.isWeapon then
local addRefineWeaponInst = CharInfoUtils.getWeaponByInstId(itemInfo.instId)
addRefineLv = addRefineWeaponInst.refineLv + 1
else
addRefineLv = 1
end
local refineWeaponInst = CharInfoUtils.getWeaponByInstId(self.m_weaponInfo.weaponInstId)
local maxRefineLv = CS.Beyond.Gameplay.WeaponUtil.GetWeaponMaxRefineLv(refineWeaponInst.templateId)
local costItemInfoDict = self.m_costItemInfoDict
local alreadyAddRefineLv = self:_GetCurAddRefineLv()
if alreadyAddRefineLv == maxRefineLv - refineWeaponInst.refineLv then
self:Notify(MessageConst.SHOW_TOAST, Language.LUA_WEAPON_EXHIBIT_POTENTIAL_MAX_TOAST)
return
end
local newRefineLv = refineWeaponInst.refineLv + addRefineLv + alreadyAddRefineLv
if newRefineLv > maxRefineLv then
self:Notify(MessageConst.SHOW_TOAST, Language.LUA_WEAPON_REFINE_OVERFLOW)
return
end
local hasGemAttached = itemInfo.isWeapon and itemInfo.itemInst.attachedGemInstId > 0
if hasGemAttached then
local gemInst = CharInfoUtils.getGemByInstId(itemInfo.itemInst.attachedGemInstId)
local gemItemCfg = Tables.itemTable:GetValue(gemInst.templateId)
Notify(MessageConst.SHOW_POP_UP, {
content = string.format(Language.LUA_WEAPON_EXHIBIT_UPGRADE_GEM_EQUIPPED, gemItemCfg.name),
onConfirm = function()
GameInstance.player.charBag:DetachGem(itemInfo.itemInst.instId)
end,
onCancel = function()
end
})
return
end
if itemInfo.inventoryCount ~= 0 and nextCount > itemInfo.inventoryCount then
if not itemInfo.isWeapon then
self:Notify(MessageConst.SHOW_TOAST, Language.LUA_WEAPON_EXHIBIT_UPGRADE_MAX_ITEM_COUNT)
end
nextCount = itemInfo.inventoryCount
elseif itemInfo.inventoryCount == 0 then
nextCount = 0
end
itemInfo.count = nextCount
if itemInfo.count > 0 then
local indexId = itemInfo.indexId
costItemInfoDict[indexId] = itemInfo
end
end
WeaponExhibitPotentialCtrl._GetCurAddRefineLv = HL.Method().Return(HL.Number) << function(self)
local addRefineLv = 0
for i, itemInfo in pairs(self.m_costItemInfoDict) do
if itemInfo.isWeapon then
local weaponInst = CharInfoUtils.getWeaponByInstId(itemInfo.indexId)
addRefineLv = addRefineLv + weaponInst.refineLv + 1
else
addRefineLv = addRefineLv + 1 * itemInfo.count
end
end
return addRefineLv
end
WeaponExhibitPotentialCtrl._RefreshBottomCostItem = HL.Method(HL.Opt(HL.Boolean)) << function(self, skipGraduallyShow)
local costItemInfoList = self:_CollectCostItemInfoList()
local costCellCount = math.max(#costItemInfoList, UIConst.WEAPON_EXHIBIT_UPGRADE_MIN_SLOT_NUM)
self.view.m_bottomWeaponCellCache:Refresh(costCellCount, function(cell, index)
local costItemInfo = costItemInfoList[index]
cell.emptyNode.gameObject:SetActive(costItemInfo == nil)
cell.item.gameObject:SetActive(costItemInfo ~= nil)
self:_RefreshWeaponCellAddOn(cell, costItemInfo)
cell.btnMinus.onClick:AddListener(function()
self:_RemoveFromCostItemDict(costItemInfo, 1)
end)
if costItemInfo then
cell.item:InitItem({
id = costItemInfo.itemCfg.id,
instId = costItemInfo.isWeapon and costItemInfo.indexId or 0,
}, function()
self:_ToggleExpandNode(true)
end)
end
end)
end
WeaponExhibitPotentialCtrl._ToggleExpandNode = HL.Method(HL.Boolean, HL.Opt(HL.Boolean)) << function(self, isOn, closeAll)
self.m_lastClickItemId = nil
self.m_lastClickItemInfo = nil
if UIManager:IsShow(PanelId.ItemTips) then
Notify(MessageConst.HIDE_ITEM_TIPS)
if not closeAll then
return
end
end
if isOn then
UIUtils.PlayAnimationAndToggleActive(self.view.commonWeaponList.view.animationWrapper, true)
self.view.expandNode.gameObject:SetActive(true)
if DeviceInfo.usingController then
self.view.commonWeaponList:PlayGraduallyShow(1, false)
else
self.view.commonWeaponList:PlayGraduallyShow()
end
else
UIUtils.PlayAnimationAndToggleActive(self.view.commonWeaponList.view.animationWrapper, false, function()
self.view.expandNode.gameObject:SetActive(false)
end)
InputManagerInst:ToggleBinding(self.m_materialsDecreaseCountInputBindingId, false)
end
InputManagerInst:ToggleGroup(self.view.leftNodeInputGroup.groupId, not isOn)
if DeviceInfo.usingController then
InputManagerInst:ToggleGroup(self.view.btnLevelUp.groupId, not isOn)
else
InputManagerInst:ToggleGroup(self.view.btnLevelUp.groupId, true)
end
end
WeaponExhibitPotentialCtrl._RefreshWeaponPotentialStar = HL.Method(HL.String, HL.Number, HL.Opt(HL.Boolean)) << function(self, templateId, instId)
local weaponInst = CharInfoUtils.getWeaponByInstId(instId)
local addRefineLv = self:_GetCurAddRefineLv()
local isMaxPotential = weaponInst.refineLv >= UIConst.CHAR_MAX_POTENTIAL
if isMaxPotential then
self.view.arrowNode.gameObject:SetActive(false)
self.view.maxPotentialNode.gameObject:SetActive(true)
self.view.potentialBefore.gameObject:SetActive(false)
self.view.potentialAfter.gameObject:SetActive(false)
else
self.view.potentialBefore:InitWeaponPotentialStar(weaponInst.refineLv)
self.view.potentialAfter:InitWeaponPotentialStar(weaponInst.refineLv + addRefineLv, {
showMaxPotentialHint = false,
fromLv = weaponInst.refineLv
})
end
end
WeaponExhibitPotentialCtrl._RefreshSkillNode = HL.Method(HL.String, HL.Number, HL.Opt(HL.Boolean)) << function(self, templateId, instId, isInit)
local weaponInst = CharInfoUtils.getWeaponByInstId(instId)
local addRefineLv = self:_GetCurAddRefineLv()
local maxRefineLv = CS.Beyond.Gameplay.WeaponUtil.GetWeaponMaxRefineLv(templateId)
local isMaxRefineLv = weaponInst.refineLv >= maxRefineLv
self.view.weaponSkillNodeBefore.gameObject:SetActive(not isMaxRefineLv)
self:_RefreshBottomCostItem()
if not isMaxRefineLv then
self.view.weaponSkillNodeBefore:InitWeaponSkillNode(instId, {
tryGemInstId = weaponInst.attachedGemInstId,
tryBreakthroughLv = weaponInst.breakthroughLv,
tryRefineLv = weaponInst.refineLv,
onlyPotentialSkill = true,
})
end
self.view.weaponSkillNodeAfter:InitWeaponSkillNode(instId, {
tryGemInstId = weaponInst.attachedGemInstId,
tryBreakthroughLv = weaponInst.breakthroughLv,
tryRefineLv = weaponInst.refineLv + addRefineLv,
onlyPotentialSkill = true,
})
self.view.weaponIntroduction:InitWeaponIntroduction(templateId, instId)
end
WeaponExhibitPotentialCtrl._CollectCostItemInfoList = HL.Method().Return(HL.Table) << function(self)
local costItemList = {}
for i, itemInfo in pairs(self.m_costItemInfoDict) do
table.insert(costItemList, itemInfo)
end
return costItemList
end
HL.Commit(WeaponExhibitPotentialCtrl)