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

497 lines
15 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.ShopTokenExchangePopUp
ShopTokenExchangePopUpCtrl = HL.Class('ShopTokenExchangePopUpCtrl', uiCtrl.UICtrl)
ShopTokenExchangePopUpCtrl.m_redundantItemInfo = HL.Field(HL.Table)
ShopTokenExchangePopUpCtrl.m_exchangeDatas = HL.Field(HL.Table)
ShopTokenExchangePopUpCtrl.m_getCellFunc = HL.Field(HL.Function)
ShopTokenExchangePopUpCtrl.m_exchangeCells = HL.Field(HL.Any)
ShopTokenExchangePopUpCtrl.m_currLeftNaviIndex = HL.Field(HL.Number) << 1
ShopTokenExchangePopUpCtrl.m_currRightNaviIndex = HL.Field(HL.Number) << 1
ShopTokenExchangePopUpCtrl.m_currNaviIsLeft = HL.Field(HL.Boolean) << false
ShopTokenExchangePopUpCtrl.m_currNaviIsRight = HL.Field(HL.Boolean) << false
ShopTokenExchangePopUpCtrl.m_showItems = HL.Field(HL.Table)
ShopTokenExchangePopUpCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_SC_SHOP_SWAP_CHAR_POTENTIAL_UP] = '_OnReceiveServer',
[MessageConst.ON_CASH_SHOP_OPEN_CATEGORY] = '_OnCashShopOpenCategory',
[MessageConst.ON_SHOP_SHOW_REWARD] = '_OnReceiveReward',
}
ShopTokenExchangePopUpCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.view.closeButton.onClick:AddListener(function()
self:PlayAnimationOut()
end)
self.view.maskBg.onClick:AddListener(function()
self:PlayAnimationOut()
end)
self.view.btnCommon.onClick:AddListener(function()
self:PlayAnimationOut()
end)
self.view.btnCommonYellow.onClick:AddListener(function()
self:_OnClickBtnConfirm()
end)
self.m_showItems = {}
self:_InitShortCut()
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputGroup.groupId })
self.m_getCellFunc = UIUtils.genCachedCellFunction(self.view.scrollList)
self.view.scrollList.onUpdateCell:AddListener(function(obj, index)
local cell = self.m_getCellFunc(obj)
local itemInfo = self.m_redundantItemInfo[LuaIndex(index)]
cell:InitItem({ id = itemInfo.itemId, count = itemInfo.count }, true)
cell:SetExtraInfo({
isSideTips = DeviceInfo.usingController,
})
end)
if DeviceInfo.usingController then
self.view.scrollListSelectableNaviGroup.onIsFocusedChange:AddListener(function(isFocused)
self.m_currNaviIsLeft = isFocused
if not isFocused then
Notify(MessageConst.HIDE_ITEM_TIPS)
end
end)
end
self.m_exchangeCells = UIUtils.genCellCache(self.view.exchangeNode)
self.m_redundantItemInfo = arg.redundantItemInfo
self:_InitExchangeData()
self:_RefreshUI()
end
ShopTokenExchangePopUpCtrl._InitData = HL.Method() << function(self)
self.m_redundantItemInfo = {}
local charList = GameInstance.player.charBag.charList
for _, charInfo in pairs(charList) do
local charInstId = charInfo.instId
local templateId = charInfo.templateId
local currentPotentialLevel = charInfo.potentialLevel
local succ, characterPotentialList = Tables.characterPotentialTable:TryGetValue(templateId)
local maxPotentialLevel = characterPotentialList.potentialUnlockBundle.Count;
local unlockData = characterPotentialList.potentialUnlockBundle[0]
local materialId = unlockData.itemIds[0]
local getCount = Utils.getItemCount(materialId)
local redundant = currentPotentialLevel + getCount - maxPotentialLevel
if redundant > 0 then
logger.info(string.format("%s已满潜,itemID:%s,多出来%s个",
templateId, materialId, redundant))
local getItemDataSucc, itemData = Tables.itemTable:TryGetValue(materialId)
if getItemDataSucc then
table.insert(self.m_redundantItemInfo, {
itemId = materialId,
count = redundant,
rarity = itemData.rarity,
itemData = itemData,
})
else
logger.error("缺少数据 " .. materialId .. " 注意拉新。")
end
end
end
end
ShopTokenExchangePopUpCtrl._InitExchangeData = HL.Method() << function(self)
local rewardItemDict = {}
self.m_exchangeDatas = {}
for _, itemInfo in ipairs(self.m_redundantItemInfo) do
local rarity = itemInfo.rarity
local rewardId = nil
if rarity == 4 then
rewardId = Tables.CashShopConst.star4PotentialupSwapRewardId
end
if rarity == 5 then
rewardId = Tables.CashShopConst.star5PotentialupSwapRewardId
end
if rarity == 6 then
rewardId = Tables.CashShopConst.star6PotentialupSwapRewardId
end
local succ, rewardsCfg = Tables.rewardTable:TryGetValue(rewardId)
if succ then
for _, itemBundle in pairs(rewardsCfg.itemBundles) do
local itemId = itemBundle.id
local count = itemBundle.count * itemInfo.count
if rewardItemDict[itemId] == nil then
rewardItemDict[itemId] = {
count = count,
rarity = rarity,
}
else
rewardItemDict[itemId].count = rewardItemDict[itemId].count + count
end
end
end
end
for itemId, rewardItem in pairs(rewardItemDict) do
table.insert(self.m_exchangeDatas, {
itemId = itemId,
count = rewardItem.count,
rarity = rewardItem.rarity,
})
end
table.sort(self.m_exchangeDatas, Utils.genSortFunction({ "rarity" }, true))
end
ShopTokenExchangePopUpCtrl._RefreshUI = HL.Method() << function(self)
self.view.scrollList:UpdateCount(#self.m_redundantItemInfo)
self.m_exchangeCells:Refresh(#self.m_exchangeDatas, function(cell, index)
local exchangeData = self.m_exchangeDatas[index]
local itemData = Tables.itemTable[exchangeData.itemId]
cell.iconImg:LoadSprite(UIConst.UI_SPRITE_ITEM_BIG, itemData.iconId)
local prevText = cell.costNumTxt
local afterText = cell.exchangeNumTxt
local currHave = Utils.getItemCount(exchangeData.itemId)
prevText.text = currHave
afterText.text = currHave + exchangeData.count
cell.tipsBtn.onClick:AddListener(function()
Notify(MessageConst.SHOW_ITEM_TIPS, {
transform = cell.transform,
posType = UIConst.UI_TIPS_POS_TYPE.LeftMid,
itemId = exchangeData.itemId,
isSideTips = DeviceInfo.usingController,
})
end)
cell.keyHint.gameObject:SetActive(index == 1)
end)
end
ShopTokenExchangePopUpCtrl._OnClickBtnConfirm = HL.Method() << function(self)
local arg1 = {}
local arg2 = {}
for _, itemInfo in ipairs(self.m_redundantItemInfo) do
table.insert(arg1, itemInfo.itemId)
table.insert(arg2, itemInfo.count)
end
GameInstance.player.cashShopSystem:SendPotentialMaterialExchange(arg1, arg2)
end
ShopTokenExchangePopUpCtrl._OnReceiveServer = HL.Method(HL.Table) << function(self, args)
logger.info("ShopTokenExchangePopUpCtrl._OnReceiveServer 显示reward")
table.sort(self.m_showItems, Utils.genSortFunction({"rarity", "type", "id"}, false))
local rewardPanelArgs = {}
rewardPanelArgs.items = self.m_showItems
Notify(MessageConst.SHOW_SYSTEM_REWARDS, rewardPanelArgs)
self:Close()
end
ShopTokenExchangePopUpCtrl._OnReceiveReward = HL.Method(HL.Any) << function(self, args)
logger.info("ShopTokenExchangePopUpCtrl._OnReceiveReward: 暂存reward")
local itemBundleList = unpack(args)
for _, itemBundle in pairs(itemBundleList) do
local _, itemData = Tables.itemTable:TryGetValue(itemBundle.id)
if itemData then
local putInside = false
for i = 1, #self.m_showItems do
if self.m_showItems[i].id == itemData.id and itemBundle.instId == 0 then
self.m_showItems[i].count = self.m_showItems[i].count + itemBundle.count
putInside = true
break
end
end
if not putInside then
table.insert(self.m_showItems, {id = itemBundle.id,
count = itemBundle.count,
instData = itemBundle.instData,
instId = itemBundle.instId,
rarity = itemData.rarity,
type = itemData.type:ToInt()})
end
end
end
end
ShopTokenExchangePopUpCtrl._OnCashShopOpenCategory = HL.Method() << function(self)
self:Close()
end
ShopTokenExchangePopUpCtrl._InitShortCut = HL.Method() << function(self)
if not DeviceInfo.usingController then
return
end
local focusGroupId = InputManagerInst:CreateGroup(self.view.inputGroup.groupId)
InputManagerInst:ToggleGroup(focusGroupId, true)
InputManagerInst:ToggleGroup(self.view.rightNodeInputBindingGroupMonoTarget.groupId, false)
InputManagerInst:ToggleGroup(self.view.buttonLayoutMonoTarget.groupId, true)
self:BindInputPlayerAction("cashshop_token_exchange_focus_left", function()
logger.info("ShopTokenExchangePopUpCtrl:cashshop_token_exchange_focus_left")
InputManagerInst:ToggleGroup(focusGroupId, false)
InputManagerInst:ToggleGroup(self.view.rightNodeInputBindingGroupMonoTarget.groupId, true)
InputManagerInst:ToggleGroup(self.view.buttonLayoutMonoTarget.groupId, false)
self.m_currNaviIsLeft = true
self.m_currNaviIsRight = false
self:_LeftNaviAddCol(0)
end, focusGroupId)
self:BindInputPlayerAction("cashshop_token_exchange_focus_right", function()
logger.info("ShopTokenExchangePopUpCtrl:cashshop_token_exchange_focus_right")
InputManagerInst:ToggleGroup(focusGroupId, false)
InputManagerInst:ToggleGroup(self.view.rightNodeInputBindingGroupMonoTarget.groupId, true)
InputManagerInst:ToggleGroup(self.view.buttonLayoutMonoTarget.groupId, false)
self.m_currNaviIsLeft = false
self.m_currNaviIsRight = true
self.m_currRightNaviIndex = 1
self:_RightNaviAddValue(0)
end, focusGroupId)
self:BindInputPlayerAction("common_cancel_no_hint", function()
self.m_currNaviIsLeft = false
self.m_currNaviIsRight = false
UIUtils.setAsNaviTarget(nil)
Notify(MessageConst.HIDE_ITEM_TIPS)
self.view.scrollListSelectableNaviGroup:ManuallyStopFocus()
self.view.rightNode:ManuallyStopFocus()
InputManagerInst:ToggleGroup(self.view.rightNodeInputBindingGroupMonoTarget.groupId, false)
InputManagerInst:ToggleGroup(focusGroupId, true)
InputManagerInst:ToggleGroup(self.view.buttonLayoutMonoTarget.groupId, true)
end, self.view.rightNodeInputBindingGroupMonoTarget.groupId)
self:BindInputPlayerAction("cashshop_navigation_4_dir_left", function()
self:_OnGoLeft()
end, self.view.rightNodeInputBindingGroupMonoTarget.groupId)
self:BindInputPlayerAction("cashshop_navigation_4_dir_up", function()
self:_OnGoUp()
end, self.view.rightNodeInputBindingGroupMonoTarget.groupId)
self:BindInputPlayerAction("cashshop_navigation_4_dir_right", function()
self:_OnGoRight()
end, self.view.rightNodeInputBindingGroupMonoTarget.groupId)
self:BindInputPlayerAction("cashshop_navigation_4_dir_down", function()
self:_OnGoDown()
end, self.view.rightNodeInputBindingGroupMonoTarget.groupId)
end
ShopTokenExchangePopUpCtrl._OnGoLeft = HL.Method() << function(self)
logger.info("ShopTokenExchangePopUpCtrl._OnGoLeft")
if self.m_currNaviIsLeft then
self:_LeftNaviAddCol(-1)
elseif self.m_currNaviIsRight then
self.m_currNaviIsLeft = true
self.m_currNaviIsRight = false
Notify(MessageConst.HIDE_ITEM_TIPS)
self:_LeftNaviAddCol(0)
end
end
ShopTokenExchangePopUpCtrl._OnGoUp = HL.Method() << function(self)
logger.info("ShopTokenExchangePopUpCtrl._OnGoUp")
if self.m_currNaviIsLeft then
self:_LeftNaviAddRow(-1)
elseif self.m_currNaviIsRight then
self:_RightNaviAddValue(-1)
end
end
ShopTokenExchangePopUpCtrl._OnGoRight = HL.Method() << function(self)
logger.info("ShopTokenExchangePopUpCtrl._OnGoRight")
if self.m_currNaviIsLeft then
local lineCount = self.view.scrollList.countPerLine
if self.m_currLeftNaviIndex % lineCount == 0 or
self.m_currLeftNaviIndex == #self.m_redundantItemInfo then
self.m_currNaviIsLeft = false
self.m_currNaviIsRight = true
Notify(MessageConst.HIDE_ITEM_TIPS)
self:_RightNaviAddValue(0)
else
self:_LeftNaviAddCol(1)
end
elseif self.m_currNaviIsRight then
end
end
ShopTokenExchangePopUpCtrl._OnGoDown = HL.Method() << function(self)
logger.info("ShopTokenExchangePopUpCtrl._OnGoDown")
if self.m_currNaviIsLeft then
self:_LeftNaviAddRow(1)
elseif self.m_currNaviIsRight then
self:_RightNaviAddValue(1)
end
end
ShopTokenExchangePopUpCtrl._LeftNaviAddCol = HL.Method(HL.Number) << function(self, value)
local curr = self.m_currLeftNaviIndex
local new = curr + value
if new <= 0 or new > #self.m_redundantItemInfo then
return
end
local targetCell = self.m_getCellFunc(self.view.scrollList:Get(CSIndex(new)))
UIUtils.setAsNaviTarget(targetCell.view.button)
self.m_currLeftNaviIndex = new
end
ShopTokenExchangePopUpCtrl._LeftNaviAddRow = HL.Method(HL.Number) << function(self, value)
local curr = self.m_currLeftNaviIndex
local lineCount = self.view.scrollList.countPerLine
local new = curr + (value * lineCount)
if new <= 0 or new > #self.m_redundantItemInfo then
return
end
local targetCell = self.m_getCellFunc(self.view.scrollList:Get(CSIndex(new)))
UIUtils.setAsNaviTarget(targetCell.view.button)
self.m_currLeftNaviIndex = new
end
ShopTokenExchangePopUpCtrl._RightNaviAddValue = HL.Method(HL.Number) << function(self, value)
local curr = self.m_currRightNaviIndex
local new = curr + value
if new <= 0 or new > #self.m_exchangeDatas then
return
end
InputManagerInst:ToggleGroup(self.view.rightNodeInputBindingGroupMonoTarget.groupId, true)
local targetCell = self.m_getCellFunc(self.m_exchangeCells:Get(new))
UIUtils.setAsNaviTarget(targetCell.inputBindingGroupNaviDecorator)
self.m_currRightNaviIndex = new
local cell = self.m_exchangeCells:Get(new)
local exchangeData = self.m_exchangeDatas[new]
Notify(MessageConst.SHOW_ITEM_TIPS, {
transform = cell.transform,
posType = UIConst.UI_TIPS_POS_TYPE.LeftMid,
itemId = exchangeData.itemId,
isSideTips = true,
})
end
HL.Commit(ShopTokenExchangePopUpCtrl)