Files
Endfield-Data/LuaScripts/UI/Panels/ShopWeapon/ShopWeaponCtrl.lua
2026-01-31 21:42:01 +07:00

1128 lines
36 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.ShopWeapon
local PHASE_ID = PhaseId.ShopWeapon
local PERMANENT_BOX_CELL_REFRESH_WAIT_TIME = 0.3
local PERMANENT_BOX_CELL_ROW_REFRESH_WAIT_TIME = 0.05
local PERMANENT_GOODS_CELL_REFRESH_WAIT_TIME = 0.05
ShopWeaponCtrl = HL.Class('ShopWeaponCtrl', uiCtrl.UICtrl)
ShopWeaponCtrl.m_shopSystem = HL.Field(HL.Any)
ShopWeaponCtrl.m_smallUpWeaponCache = HL.Field(HL.Forward("UIListCache"))
ShopWeaponCtrl.m_permanentBoxCell = HL.Field(HL.Forward("UIListCache"))
ShopWeaponCtrl.m_permanentBoxSubBoxCellDict = HL.Field(HL.Table)
ShopWeaponCtrl.m_permanentBoxSubGoodsCellDict = HL.Field(HL.Table)
ShopWeaponCtrl.m_permanentGoodsCell = HL.Field(HL.Forward("UIListCache"))
ShopWeaponCtrl.m_firstNaviData = HL.Field(HL.Any)
ShopWeaponCtrl.m_currNaviData = HL.Field(HL.Any)
ShopWeaponCtrl.m_naviCellTable = HL.Field(HL.Table)
ShopWeaponCtrl.m_currNaviRow = HL.Field(HL.Int) << 1
ShopWeaponCtrl.m_currNaviCol = HL.Field(HL.Int) << 1
ShopWeaponCtrl.m_haveSeenLines = HL.Field(HL.Table)
ShopWeaponCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_SHOP_REFRESH] = '_OnShopRefresh',
[MessageConst.ON_SHOP_JUMP_EVENT] = '_OnShopJumpEvent',
[MessageConst.ON_SHOP_GOODS_CONDITION_REFRESH] = '_OnShopRefresh',
[MessageConst.ON_GACHA_POOL_INFO_CHANGED] = 'OnGachaPoolInfoChanged',
[MessageConst.ON_GACHA_POOL_ROLE_DATA_CHANGED] = 'OnGachaPoolRoleDataChanged',
}
ShopWeaponCtrl.m_normalGoods = HL.Field(HL.Any)
ShopWeaponCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_phase = arg.phase
self:_InitShortCut()
self.m_shopSystem = GameInstance.player.shopSystem
self.m_smallUpWeaponCache = UIUtils.genCellCache(self.view.smallUpWeaponsRoot.shopWeaponBagSmallCell)
self.m_permanentBoxCell = UIUtils.genCellCache(self.view.commonWeapons.weaponCase)
self.m_permanentGoodsCell = UIUtils.genCellCache(self.view.commonWeapons.shopWeaponCell)
self.m_permanentBoxSubBoxCellDict = {}
self.m_permanentBoxSubGoodsCellDict = {}
self.m_naviCellTable = {}
self.m_haveSeenLines = {}
self:UpdateUpWeapon()
self:UpdateTimeLimitWeapons()
self:UpdatePermanentWeapon()
self.view.scroll.onValueChanged:AddListener(function(data)
self:_ComputeSeeGoods()
local show = (self.view.scroll.normalizedPosition.y) > 0.05
if self.view.upWeaponNextPage.gameObject.activeSelf == show then
return
end
if show then
self.view.upWeaponNextPage.gameObject:SetActive(true)
else
self.view.upWeaponNextPage.gameObject:SetActive(false)
end
end)
self:_CustomNaviTarget(self.m_firstNaviData)
local cashShopCtrl = self.m_phase.cashShopCtrl
if cashShopCtrl == nil then
cashShopCtrl = self.m_phase.m_panel2Item[PanelId.CashShop].uiCtrl
end
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({
self.view.inputGroup.groupId,
cashShopCtrl.view.inputGroup.groupId,
})
self.m_phase:HidePsStore()
self:_ProcessArg(arg)
end
ShopWeaponCtrl.OnShow = HL.Override() << function(self)
Notify(MessageConst.CASH_SHOP_SHOW_WALLET_BAR, {
moneyIds = {Tables.CashShopConst.WeaponTabMoneyId},
})
if self.m_phase.m_needGameEvent then
self.m_phase.m_needGameEvent = false
EventLogManagerInst:GameEvent_ShopEnter(
self.m_phase.m_enterButton,
self.m_phase.m_enterPanel,
"",
CashShopConst.CashShopCategoryType.Weapon,
""
)
end
CashShopUtils.TryOpenSpecialGiftPopup()
CashShopUtils.TryFadeSpecialGiftPopup()
end
ShopWeaponCtrl.OnClose = HL.Override() << function(self)
self.m_permanentGoodsCell:OnClose()
self.m_permanentBoxCell:OnClose()
for _, boxCellCache in ipairs(self.m_permanentBoxSubBoxCellDict) do
boxCellCache:OnClose()
end
for _, goodsCellCache in ipairs(self.m_permanentBoxSubGoodsCellDict) do
goodsCellCache:OnClose()
end
local goodsIds = {}
for _, lineNumber in ipairs(self.m_haveSeenLines) do
local lineData = self.m_naviCellTable[lineNumber]
if lineData then
for _, data in ipairs(lineData) do
local goodsId = data.goodsId
if goodsId then
table.insert(goodsIds, goodsId)
end
end
end
end
if #goodsIds > 0 then
for _, goodsId in ipairs(goodsIds) do
if GameInstance.player.shopSystem:IsNewGoodsId(goodsId) then
GameInstance.player.shopSystem:RecordSeeGoodsId(goodsId)
end
end
GameInstance.player.shopSystem:SetGoodsIdSee()
end
end
ShopWeaponCtrl.UpdateUpWeapon = HL.Method() << function(self)
local _, box, goods = self.m_shopSystem:GetNowUpWeaponData()
local upBoxList = {}
local downBoxList = {}
local tmpBoxList = {}
local count = box == nil and 0 or box.Count
for i = 0, count - 1 do
local goodsData = box[i]
local goodsId = goodsData.goodsTemplateId
local _, goodsCfg = Tables.shopGoodsTable:TryGetValue(goodsId);
local hasGachaCfg, weaponGachaCfg = Tables.gachaWeaponPoolTable:TryGetValue(goodsCfg.weaponGachaPoolId)
local clientTopTimeId = weaponGachaCfg.clientTopTimeId
local isTop = Utils.isCurTimeInTimeIdRange(clientTopTimeId)
local tmpData = {
goodsData = goodsData,
isTop = isTop,
index = weaponGachaCfg.index,
sortId = weaponGachaCfg.sortId
}
table.insert(tmpBoxList, tmpData)
end
table.sort(tmpBoxList, Utils.genSortFunction({ "index", "sortId" }, false))
for idx, tmpData in ipairs(tmpBoxList) do
if tmpData.isTop then
table.insert(upBoxList, tmpData)
else
table.insert(downBoxList, tmpData)
end
end
local singleWeaponCase = self.view.randomWeaponsCase
local singleWeaponCaseCell = singleWeaponCase.shopWeaponCaseCell
local doubleWeaponCase = self.view.doubleRandomWeaponsCase
if #upBoxList == 0 then
doubleWeaponCase.gameObject:SetActive(false)
singleWeaponCase.gameObject:SetActive(true)
singleWeaponCase.stayTunedNode.gameObject:SetActive(true)
singleWeaponCaseCell.gameObject:SetActive(false)
local data = { length = 6, cell = singleWeaponCase.inputBindingGroupNaviDecorator, naviNode = singleWeaponCase.naviNode }
self.m_firstNaviData = data
table.insert(self.m_naviCellTable, { data })
end
if #upBoxList == 1 then
local boxData = upBoxList[1].goodsData
singleWeaponCase.gameObject:SetActive(true)
doubleWeaponCase.gameObject:SetActive(false)
singleWeaponCaseCell.gameObject:SetActive(true)
singleWeaponCase.stayTunedNode.gameObject:SetActive(false)
local data = { length = 6,
cell = singleWeaponCase.inputBindingGroupNaviDecorator,
naviNode = singleWeaponCase.naviNode,
goodsId = boxData.goodsId }
self.m_firstNaviData = data
table.insert(self.m_naviCellTable, { data })
self:_UpdateSingleLimitedWeapon(singleWeaponCaseCell, boxData, false)
local poolId = Tables.shopGoodsTable[boxData.goodsTemplateId].weaponGachaPoolId
local isRealTime, closeTimeDesc= CashShopUtils.GetGachaWeaponPoolCloseTimeShowDesc(poolId)
local poolTimeNode = singleWeaponCaseCell.view.poolTimeNode
poolTimeNode.endTimeTxt.text = closeTimeDesc
poolTimeNode.endingTxt.gameObject:SetActive(isRealTime)
end
if #upBoxList >= 2 then
local boxData1 = upBoxList[1].goodsData
local boxData2 = upBoxList[2].goodsData
singleWeaponCase.gameObject:SetActive(false)
doubleWeaponCase.gameObject:SetActive(true)
local weaponCaseCell1 = doubleWeaponCase.shopWeaponCaseCell1
local weaponCaseCell2 = doubleWeaponCase.shopWeaponCaseCell2
local data1 = { length = 3, cell = weaponCaseCell1.view.inputBindingGroupNaviDecorator, naviNode = weaponCaseCell1.view.naviNode, goodsId = boxData1.goodsId }
local data2 = { length = 3, cell = weaponCaseCell2.view.inputBindingGroupNaviDecorator, naviNode = weaponCaseCell2.view.naviNode, goodsId = boxData2.goodsId }
self.m_firstNaviData = data1
table.insert(self.m_naviCellTable, { data1, data2 })
self:_UpdateSingleLimitedWeapon(weaponCaseCell1, boxData1, true)
self:_UpdateSingleLimitedWeapon(weaponCaseCell2, boxData2, true)
local poolId1 = Tables.shopGoodsTable[boxData1.goodsTemplateId].weaponGachaPoolId
local isRealTime1, closeTimeDesc1 = CashShopUtils.GetGachaWeaponPoolCloseTimeShowDesc(poolId1)
weaponCaseCell1.view.poolTimeNode.endTimeTxt:SetAndResolveTextStyle(closeTimeDesc1)
weaponCaseCell1.view.poolTimeNode.endingTxt.gameObject:SetActive(isRealTime1)
local poolId2 = Tables.shopGoodsTable[boxData2.goodsTemplateId].weaponGachaPoolId
local isRealTime2, closeTimeDesc2 = CashShopUtils.GetGachaWeaponPoolCloseTimeShowDesc(poolId2)
weaponCaseCell2.view.poolTimeNode.endTimeTxt:SetAndResolveTextStyle(closeTimeDesc2)
weaponCaseCell2.view.poolTimeNode.endingTxt.gameObject:SetActive(isRealTime2)
end
if #downBoxList == 0 then
self.view.smallUpWeaponsRoot.gameObject:SetActive(false)
else
self.view.smallUpWeaponsRoot.gameObject:SetActive(true)
local downBoxShowCount = #downBoxList
local lastIsEmpty = false
if downBoxShowCount % 2 > 0 then
downBoxShowCount = downBoxShowCount + 1
lastIsEmpty = true
end
local naviLine = {}
self.m_smallUpWeaponCache:Refresh(downBoxShowCount, function(cell, index)
local goodsId = nil
if index == downBoxShowCount and lastIsEmpty then
cell.view.activateNode.gameObject:SetActive(false)
cell.view.nullNode.gameObject:SetActive(true)
else
cell.view.activateNode.gameObject:SetActive(true)
cell.view.nullNode.gameObject:SetActive(false)
local goodsData = downBoxList[index].goodsData
self:_SetupViewSmallUpWeaponCell(cell, goodsData)
goodsId = goodsData.goodsId
end
table.insert(naviLine, {
length = 3,
cell = cell.view.inputBindingGroupNaviDecorator,
goodsId = goodsId
})
if index % 2 == 0 then
table.insert(self.m_naviCellTable, naviLine)
naviLine = {}
end
end)
end
end
ShopWeaponCtrl._getGachaTimeByGoodsData = HL.Method(HL.Any).Return(HL.Number, HL.Number)
<< function(self, goodsData)
local goodsCfg = Tables.shopGoodsTable[goodsData.goodsTemplateId]
local poolId = goodsCfg.weaponGachaPoolId
local _, poolInfo = GameInstance.player.gacha.poolInfos:TryGetValue(poolId)
local openTime = poolInfo.openTime
local closeTime = poolInfo.closeTime
return openTime, closeTime
end
ShopWeaponCtrl._SetupViewSmallUpWeaponCell = HL.Method(HL.Any, HL.Any) << function(self, cell, goodsData)
cell:InitCashShopItem(goodsData, true)
local goodsCfg = Tables.shopGoodsTable[goodsData.goodsTemplateId]
local poolId = goodsCfg.weaponGachaPoolId
local weaponPoolCfg = Tables.gachaWeaponPoolTable[poolId]
local gachaTypeCfg = Tables.gachaWeaponPoolTypeTable[weaponPoolCfg.type]
local _, poolInfo = GameInstance.player.gacha.poolInfos:TryGetValue(poolId)
local showHardGuarantee = poolInfo.upGotCount <= 0
local guaranteeNode = cell.view.guaranteeTextStateLayout
if showHardGuarantee then
guaranteeNode.gameObject:SetActive(true)
guaranteeNode.stateController:SetState("OnlyOne")
local remainNum = math.ceil((gachaTypeCfg.hardGuarantee - poolInfo.hardGuaranteeProgress) / 10)
guaranteeNode.guaranteeGetTxt.text = string.format("<color=#FEF000>%d</color> ", remainNum) .. Language.ui_shop_entry_weapon_shop_numbers_1
else
guaranteeNode.stateController:SetState("Again")
local loopRewardInfos = CashShopUtils.GetGachaWeaponLoopRewardInfo(poolId)
if not loopRewardInfos then
guaranteeNode.gameObject:SetActive(false)
return
else
guaranteeNode.gameObject:SetActive(true)
table.sort(loopRewardInfos, function(a, b)
return a.remainNeedPullCount < b.remainNeedPullCount
end)
local info = loopRewardInfos[1]
local name = info.name
local number = info.remainNeedPullCount
guaranteeNode.guaranteeGetTxt.text = string.format(Language.LUA_CASH_SHOP_SMALL_UP_WEAPON_REPEAT_GUARANTEE_TEXT, number, name)
end
end
local isRealTime, closeTimeDesc = CashShopUtils.GetGachaWeaponPoolCloseTimeShowDesc(poolId)
cell.view.poolTimeNode.endTimeTxt.text = closeTimeDesc
cell.view.poolTimeNode.endingTxt.gameObject:SetActive(isRealTime)
cell.view.weaponsBagNameTxt.text = weaponPoolCfg.name
local icon = weaponPoolCfg.smallPoolIcon
local iconFar = weaponPoolCfg.smallPoolIconFar
cell.view.iconWeaponBag:LoadSprite(UIConst.UI_SPRITE_SHOP_WEAPON_BOX, icon)
if string.isEmpty(iconFar) then
cell.view.iconWeaponBagFar.gameObject:SetActive(false)
else
cell.view.iconWeaponBagFar.gameObject:SetActive(true)
cell.view.iconWeaponBagFar:LoadSprite(UIConst.UI_SPRITE_SHOP_WEAPON_BOX, iconFar)
end
end
ShopWeaponCtrl._UpdateSingleLimitedWeapon = HL.Method(HL.Any, HL.Any, HL.Boolean) << function(self, weaponCaseCell, boxData, isDoublePool)
local csGachaSys = GameInstance.player.gacha
local goodsCfg = Tables.shopGoodsTable[boxData.goodsTemplateId]
weaponCaseCell:InitCashShopItem(boxData, true)
local poolId = goodsCfg.weaponGachaPoolId
local _, poolInfo = csGachaSys.poolInfos:TryGetValue(poolId)
if poolInfo == nil then
logger.error("卡池信息不存在卡池id" .. poolId)
return
end
local weaponPoolCfg = Tables.gachaWeaponPoolTable[poolId]
local gachaTypeCfg = Tables.gachaWeaponPoolTypeTable[weaponPoolCfg.type]
weaponCaseCell.view.poolNameTxt.text = weaponPoolCfg.name
local uiPrefabName = isDoublePool and weaponPoolCfg.doublePoolNodeUIPrefab or weaponPoolCfg.poolNodeUIPrefab
if weaponCaseCell.view.uiPrefabName ~= uiPrefabName then
if weaponCaseCell.view.node then
GameObject.Destroy(weaponCaseCell.view.node)
end
local path = string.format("Assets/Beyond/DynamicAssets/Gameplay/UI/Prefabs/CashShop/Widgets/WeaponPoolNode/%s.prefab", uiPrefabName)
local prefab = self.loader:LoadGameObject(path)
local obj = CSUtils.CreateObject(prefab, weaponCaseCell.view.weaponPoolNodeRoot)
obj.name = weaponPoolCfg.id
weaponCaseCell.view.uiPrefabName = uiPrefabName
weaponCaseCell.view.node = obj
end
local showHardGuarantee = poolInfo.upGotCount <= 0
local guaranteeNode = weaponCaseCell.view.guaranteeNode
if showHardGuarantee then
local upWeaponId = weaponPoolCfg.upWeaponIds[0]
local weaponItemCfg = Tables.itemTable[upWeaponId]
local weaponCfg = Tables.weaponBasicTable[upWeaponId]
local weaponTypeIconName = UIConst.WEAPON_EXHIBIT_WEAPON_TYPE_ICON_PREFIX .. weaponCfg.weaponType:ToInt()
guaranteeNode.stateController:SetState("HardGuarantee")
guaranteeNode.itemIcon:InitItemIcon(upWeaponId)
guaranteeNode.rewardNameTxt.text = weaponItemCfg.name
guaranteeNode.weaponTypeIcon:LoadSprite(UIConst.UI_SPRITE_WEAPON_EXHIBIT, weaponTypeIconName)
local remainNum = math.ceil((gachaTypeCfg.hardGuarantee - poolInfo.hardGuaranteeProgress) / 10)
guaranteeNode.guaranteeTxt.text = string.format("<color=#FEF000>%d</color> ", remainNum) .. Language.ui_shop_entry_weapon_shop_numbers_1
guaranteeNode.btn.onClick:RemoveAllListeners()
guaranteeNode.btn.onClick:AddListener(function()
CashShopUtils.ShowWikiWeaponPreview(poolId, upWeaponId)
end)
else
guaranteeNode.stateController:SetState("LoopReward")
local loopRewardInfos = CashShopUtils.GetGachaWeaponLoopRewardInfo(poolId)
if not loopRewardInfos then
guaranteeNode.gameObject:SetActive(false)
return
else
guaranteeNode.gameObject:SetActive(true)
table.sort(loopRewardInfos, function(a, b)
return a.remainNeedPullCount < b.remainNeedPullCount
end)
local info = loopRewardInfos[1]
guaranteeNode.itemIcon:InitItemIcon(info.itemId)
guaranteeNode.rewardNameTxt.text = info.name
guaranteeNode.guaranteeTxt.text = string.format("%d ", info.remainNeedPullCount) .. Language.ui_shop_entry_weapon_shop_numbers_2
guaranteeNode.btn.onClick:RemoveAllListeners()
guaranteeNode.btn.onClick:AddListener(function()
logger.info("武器卡池up武器预览或宝箱预览")
if info.isWeaponItemCase then
UIManager:Open(PanelId.BattlePassWeaponCase, { itemId = info.itemId, isPreview = true })
else
CashShopUtils.ShowWikiWeaponPreview(poolId, info.itemId)
end
end)
end
end
end
ShopWeaponCtrl.UpdateTimeLimitWeapons = HL.Method() << function(self)
local now = CS.Beyond.DateTimeUtils.GetCurrentTimestampBySeconds()
local _, weeklyBox, weeklyGoods = self.m_shopSystem:GetWeeklyWeaponData()
local _, dailyBox, dailyGoods = self.m_shopSystem:GetDailyWeaponData()
local weeklyCell = self.view.timeLimitWeapons.weeklyLimitWeapons
local dailyCell = self.view.timeLimitWeapons.dailyLimitWeapons
local naviDataLine = { }
if weeklyGoods ~= nil then
local weeklyGoodsInfo = {}
for _, weeklyGood in pairs(weeklyGoods) do
local goodsTableData = Tables.shopGoodsTable:GetValue(weeklyGood.goodsId)
local displayItem = UIUtils.getRewardFirstItem(goodsTableData.rewardId)
local itemId = displayItem.id
local itemData = Tables.itemTable[itemId]
table.insert(weeklyGoodsInfo, {
goodsData = weeklyGood,
rarity = itemData.rarity
})
end
table.sort(weeklyGoodsInfo, Utils.genSortFunction({"rarity"}, false))
weeklyCell.shopWeaponCell.gameObject:SetActive(weeklyGoods.Count >= 1)
if weeklyGoods.Count >= 1 then
weeklyCell.shopWeaponCell.gameObject:SetActive(true)
weeklyCell.shopWeaponCell:InitCashShopItem(weeklyGoodsInfo[1].goodsData)
table.insert(naviDataLine, {
length = 2,
cell = weeklyCell.shopWeaponCell.view.inputBindingGroupNaviDecorator,
goodsId = weeklyGoodsInfo[1].goodsData.goodsId
})
end
weeklyCell.shopWeaponCell02.gameObject:SetActive(weeklyGoods.Count >= 2)
if weeklyGoods.Count >= 2 then
weeklyCell.shopWeaponCell02.gameObject:SetActive(true)
weeklyCell.shopWeaponCell02:InitCashShopItem(weeklyGoodsInfo[2].goodsData)
table.insert(naviDataLine, {
length = 1,
cell = weeklyCell.shopWeaponCell02.view.inputBindingGroupNaviDecorator,
goodsId = weeklyGoodsInfo[2].goodsData.goodsId
})
end
local weeklyTime = weeklyCell.timeLimitTitleText
local weeklyEndTime = GameInstance.player.shopSystem:GetWeaponGoodsTimeLimit(weeklyGoods[0]) + 1
if weeklyEndTime == 0 then
weeklyEndTime = weeklyGoods[0].closeTimeStamp - DateTimeUtils.GetCurrentTimestampBySeconds() + 1
end
weeklyTime.text = string.format(Language.LUA_SHOP_WEAPON_WEEKLY_TIME_LIMIT,
Utils.appendUTC(Utils.timestampToDateYMDHM(weeklyEndTime + now)))
else
weeklyCell.shopWeaponCell.gameObject:SetActive(false)
weeklyCell.shopWeaponCell02.gameObject:SetActive(false)
table.insert(naviDataLine, {
length = 3,
cell = weeklyCell.expectLayout.expectLayout,
goodsId = nil
})
end
weeklyCell.expectLayout.gameObject:SetActive(weeklyGoods == nil)
weeklyCell.timeLimitNode.gameObject:SetActive(weeklyGoods ~= nil)
if dailyGoods ~= nil then
GameInstance.player.shopSystem:SortGoodsList(dailyGoods)
for i = 1, 3 do
local goodsCell = dailyCell["shopWeaponCell0" .. i]
goodsCell.gameObject:SetActive(dailyGoods.Count >= i)
if dailyGoods.Count >= i then
goodsCell:InitCashShopItem(dailyGoods[i - 1])
table.insert(naviDataLine, {
length = 1,
cell = goodsCell.view.inputBindingGroupNaviDecorator,
goodsId = dailyGoods[i-1].goodsId
})
end
end
local dailyTime = dailyCell.timeLimitTitleText
local dailyEndTime = GameInstance.player.shopSystem:GetWeaponGoodsTimeLimit(dailyGoods[0]) + 1
dailyTime.text = string.format(Language.LUA_SHOP_WEAPON_DAILY_TIME_LIMIT,
Utils.appendUTC(Utils.timestampToDateYMDHM(dailyEndTime + now)))
else
for i = 1, 3 do
local goodsCell = dailyCell["shopWeaponCell0" .. i]
goodsCell.gameObject:SetActive(false)
end
table.insert(naviDataLine, {
length = 3,
cell = dailyCell.expectLayout.expectLayout,
goodsId = nil
})
end
dailyCell.expectLayout.gameObject:SetActive(dailyGoods == nil)
dailyCell.timeLimitNode.gameObject:SetActive(dailyGoods ~= nil)
table.insert(self.m_naviCellTable, naviDataLine)
end
ShopWeaponCtrl.UpdatePermanentWeapon = HL.Method() << function(self)
local _, box, goods = self.m_shopSystem:GetPermanentWeaponShopData()
self.m_shopSystem:SortGoodsList(box)
self.m_shopSystem:SortGoodsList(goods)
local boxList = self:_GetGoodsDataInfoList(box)
local goodsList = self:_GetGoodsDataInfoList(goods)
local rowCount = (#boxList % 3 > 0) and (math.floor(#boxList / 3) + 1) or math.floor(#boxList / 3)
local useGoodsNumber = (rowCount * 3 - #boxList) * 2
if useGoodsNumber > #goodsList then
useGoodsNumber = #goodsList
end
local function setupGoodsFunc()
if #goodsList > useGoodsNumber then
local naviDataLine = {}
local countPerLine = self.view.commonWeapons.container.constraintCount
self.m_permanentGoodsCell:GraduallyRefresh(
#goodsList - useGoodsNumber,
PERMANENT_GOODS_CELL_REFRESH_WAIT_TIME,
function(cell, index)
cell.gameObject.name = tostring(index)
local trueIndex = index + useGoodsNumber
cell:InitCashShopItem(goodsList[trueIndex])
table.insert(naviDataLine, {
length = 1,
cell = cell.view.inputBindingGroupNaviDecorator,
goodsId = goodsList[trueIndex].goodsId
})
if index % countPerLine == 0 or index == #goodsList - useGoodsNumber then
table.insert(self.m_naviCellTable, naviDataLine)
naviDataLine = {}
end
end)
else
self.m_permanentGoodsCell:Refresh(0, function(cell, index) end)
end
end
local sharedDataList = {}
self.m_permanentBoxCell:GraduallyRefresh(rowCount, PERMANENT_BOX_CELL_REFRESH_WAIT_TIME, function(cell, index)
cell.gameObject.name = tostring(index)
cell.transform:SetSiblingIndex(index - 1)
self:_SetupPermanentBoxCell(cell, index, rowCount, useGoodsNumber, boxList, goodsList, setupGoodsFunc, sharedDataList)
end)
end
ShopWeaponCtrl._SetupPermanentBoxCell = HL.Method(HL.Any, HL.Number, HL.Number, HL.Number, HL.Table, HL.Table, HL.Function, HL.Table)
<< function(self, cell, index, rowCount, useGoodsNumber, boxList, goodsList, callback, sharedDataList)
local lastRowIndex = index - 1
local lastRowIsFinish = false
if lastRowIndex == 0 or (sharedDataList[lastRowIndex] and sharedDataList[lastRowIndex].isFinish) then
lastRowIsFinish = true
end
local setupFunc = function()
local naviDataLine = {}
local boxCellCache = nil
local goodsCellCache = nil
if self.m_permanentBoxSubBoxCellDict[index] then
boxCellCache = self.m_permanentBoxSubBoxCellDict[index]
else
boxCellCache = UIUtils.genCellCache(cell.shopWeaponSuperiorCell)
self.m_permanentBoxSubBoxCellDict[index] = boxCellCache
end
if self.m_permanentBoxSubGoodsCellDict[index] then
goodsCellCache = self.m_permanentBoxSubGoodsCellDict[index]
else
goodsCellCache = UIUtils.genCellCache(cell.shopWeaponCell)
self.m_permanentBoxSubGoodsCellDict[index] = goodsCellCache
end
local setupGoodsFunc = function()
local rowEndCallback = function()
table.insert(self.m_naviCellTable, naviDataLine)
local nextRowIndex = index + 1
if sharedDataList[nextRowIndex] and sharedDataList[nextRowIndex].setupFunc then
sharedDataList[nextRowIndex].setupFunc()
end
if index == rowCount then
callback()
end
end
if index == rowCount and useGoodsNumber > 0 then
goodsCellCache:GraduallyRefresh(
useGoodsNumber,
PERMANENT_BOX_CELL_ROW_REFRESH_WAIT_TIME,
function(goodsCell, goodsIndex)
goodsCell.gameObject.name = "goodsCell" .. tostring(goodsIndex)
goodsCell:InitCashShopItem(goodsList[goodsIndex])
table.insert(naviDataLine, {
length = 1,
cell = goodsCell.view.inputBindingGroupNaviDecorator,
goodsId = goodsList[goodsIndex].goodsId })
if goodsIndex == useGoodsNumber then
rowEndCallback()
end
end
)
else
goodsCellCache:Refresh(0, nil)
rowEndCallback()
end
end
local startBoxIndex = 3 * (index - 1) + 1
local endBoxIndex = (3 * index <= #boxList) and (3 * index) or #boxList
boxCellCache:GraduallyRefresh(
endBoxIndex - startBoxIndex + 1,
PERMANENT_BOX_CELL_ROW_REFRESH_WAIT_TIME,
function(boxCell, boxIndex)
boxCell.gameObject.name = "boxCell" .. tostring(boxIndex)
local trueIndex = startBoxIndex + boxIndex - 1
boxCell:InitCashShopItem(boxList[trueIndex])
boxCell.view.cashShopItemTag.gameObject:SetActive(false)
table.insert(naviDataLine, {
length = 2,
cell = boxCell.view.inputBindingGroupNaviDecorator,
goodsId = boxList[trueIndex].goodsId })
if boxIndex == endBoxIndex - startBoxIndex + 1 then
setupGoodsFunc()
end
end
)
end
if lastRowIsFinish then
setupFunc()
sharedDataList[index] = {
isFinish = true,
setupFunc = nil,
}
else
sharedDataList[index] = {
isFinish = false,
setupFunc = setupFunc
}
end
end
ShopWeaponCtrl._OnShopRefresh = HL.Method() << function(self)
local isOpen, shopDetailCtrl = UIManager:IsOpen(PanelId.ShopDetail)
if isOpen then
shopDetailCtrl:TryClose()
end
self:UpdateAll()
end
ShopWeaponCtrl._OnShopJumpEvent = HL.Method() << function(self)
self:OnClickGoods()
end
ShopWeaponCtrl.OnGachaPoolInfoChanged = HL.Method() << function(self)
self:UpdateUpWeapon()
self:UpdateTimeLimitWeapons()
end
ShopWeaponCtrl.OnGachaPoolRoleDataChanged = HL.Method() << function(self)
self:UpdateUpWeapon()
self:UpdateTimeLimitWeapons()
end
ShopWeaponCtrl.ChooseLimitedWeaponPool = HL.Method(HL.Any) << function(self, boxData)
PhaseManager:OpenPhase(PhaseId.GachaWeaponPool, { goodsData = boxData })
end
ShopWeaponCtrl.UpdateAll = HL.Method() << function(self)
self.m_naviCellTable = {}
self:UpdateUpWeapon()
self:UpdateTimeLimitWeapons()
self:UpdatePermanentWeapon()
self.m_currNaviRow = math.min(self.m_currNaviRow, #self.m_naviCellTable)
local currRow = self.m_naviCellTable[self.m_currNaviRow]
self.m_currNaviCol = math.min(self.m_currNaviCol, #currRow)
local data = currRow[self.m_currNaviCol]
self:_CustomNaviTarget(data)
end
ShopWeaponCtrl.OnClickGoods = HL.Method(HL.Opt(HL.Table)) << function(self, arg)
local goodsId = arg.goods
if goodsId then
local goods = Tables.shopGoodsTable[goodsId]
local shopId = goods.shopId
local goodsData = self.m_shopSystem:GetShopGoodsData(shopId, goodsId)
if goodsData == nil then
logger.error(ELogChannel.UI, "商店商品数据为空")
return
end
local isBox = string.isEmpty(goods.rewardId)
if isBox then
PhaseManager:OpenPhase(PhaseId.GachaWeaponPool, {goodsData = goodsData})
else
UIManager:Open(PanelId.ShopDetail, goodsData)
end
return
end
if arg.sourceId and arg.targetId then
PhaseManager:OpenPhase(PhaseId.CommonMoneyExchange, {sourceId = arg.sourceId, targetId = arg.targetId})
end
end
ShopWeaponCtrl._ProcessArg = HL.Method(HL.Any) << function(self, arg)
if arg == nil or string.isEmpty(arg.goodsId) then
return
end
local goodsId = arg.goodsId
arg.goodsId = nil
local goods = Tables.shopGoodsTable[goodsId]
local shopId = goods.shopId
local goodsData = self.m_shopSystem:GetShopGoodsData(shopId, goodsId)
if goodsData == nil then
logger.error(ELogChannel.UI, "商店商品数据为空")
return
end
local isBox = string.isEmpty(goods.rewardId)
if isBox then
PhaseManager:OpenPhase(PhaseId.GachaWeaponPool, {goodsData = goodsData}, nil, true)
else
self:_StartCoroutine(function()
UIManager:Open(PanelId.ShopDetail, goodsData)
end)
end
return
end
ShopWeaponCtrl._GetGoodsDataInfoList = HL.Method(HL.Userdata).Return(HL.Table) << function(self, goodsDataList)
local list = {}
for i = 0, goodsDataList.Count - 1 do
local goodsData = goodsDataList[i]
table.insert(list, goodsData)
end
return list
end
ShopWeaponCtrl._InitShortCut = HL.Method() << function(self)
if not DeviceInfo.usingController then
return
end
self:BindInputPlayerAction("cashshop_navigation_4_dir_left", function()
self:_OnGoLeft()
end)
self:BindInputPlayerAction("cashshop_navigation_4_dir_up", function()
self:_OnGoUp()
end)
self:BindInputPlayerAction("cashshop_navigation_4_dir_right", function()
self:_OnGoRight()
end)
self:BindInputPlayerAction("cashshop_navigation_4_dir_down", function()
self:_OnGoDown()
end)
end
ShopWeaponCtrl._OnGoLeft = HL.Method() << function(self)
if self.m_currNaviCol == 1 then
return
end
local table = self.m_naviCellTable[self.m_currNaviRow][self.m_currNaviCol - 1]
self:_CustomNaviTarget(table)
self.m_currNaviCol = self.m_currNaviCol - 1
end
ShopWeaponCtrl._OnGoUp = HL.Method() << function(self)
if self.m_currNaviRow == 1 then
return
end
local leftLength = self:_GetCurrLeftLength()
local index, data = self:_FindCellByLeftLength(self.m_currNaviRow - 1, leftLength)
if data then
self:_CustomNaviTarget(data)
self.m_currNaviRow = self.m_currNaviRow - 1
self.m_currNaviCol = index
end
end
ShopWeaponCtrl._OnGoRight = HL.Method() << function(self)
local currRow = self.m_naviCellTable[self.m_currNaviRow]
if self.m_currNaviCol == #currRow then
return
end
local table = currRow[self.m_currNaviCol + 1]
self:_CustomNaviTarget(table)
self.m_currNaviCol = self.m_currNaviCol + 1
end
ShopWeaponCtrl._OnGoDown = HL.Method() << function(self)
logger.info("ShopWeaponCtrl._OnGoDown")
if self.m_currNaviRow == #self.m_naviCellTable then
return
end
local leftLength = self:_GetCurrLeftLength()
local index, data = self:_FindCellByLeftLength(self.m_currNaviRow + 1, leftLength)
if data then
self:_CustomNaviTarget(data)
self.m_currNaviRow = self.m_currNaviRow + 1
self.m_currNaviCol = index
end
end
ShopWeaponCtrl._CustomNaviTarget = HL.Method(HL.Any) << function(self, data)
if data == nil then
return
end
if self.m_currNaviData and self.m_currNaviData.naviNode and DeviceInfo.usingController then
self.m_currNaviData.naviNode.gameObject:SetActive(false)
end
if data.cell then
UIUtils.setAsNaviTarget(data.cell)
end
if data.naviNode and DeviceInfo.usingController then
data.naviNode.gameObject:SetActive(true)
end
self.m_currNaviData = data
end
ShopWeaponCtrl._GetCurrLeftLength = HL.Method().Return(HL.Int) << function(self)
local currRow = self.m_naviCellTable[self.m_currNaviRow]
local leftLength = 0
for i = 1, self.m_currNaviCol - 1 do
local length = currRow[i].length
leftLength = leftLength + length
end
return leftLength
end
ShopWeaponCtrl._FindCellByLeftLength = HL.Method(HL.Int, HL.Int).Return(HL.Any, HL.Any)
<< function(self, row, leftLength)
local currRow = self.m_naviCellTable[row]
local sum = 0
for i = 1, #currRow do
local left = sum
local right = sum + currRow[i].length
if leftLength >= left and leftLength < right then
return i, currRow[i]
end
sum = right
end
return nil, nil
end
ShopWeaponCtrl._ComputeSeeGoods = HL.Method() << function(self)
local viewPortRect = self.view.scroll.viewport
for idx, line in ipairs(self.m_naviCellTable) do
local firstCell = line[1].cell
local vectorArray = CS.System.Array.CreateInstance(typeof(Vector3), 4)
firstCell.gameObject:GetComponent("RectTransform"):GetWorldCorners(vectorArray)
local leftUp = vectorArray[0]
local leftDown = vectorArray[3]
local leftUpLocalPos = viewPortRect.transform:InverseTransformPoint(leftUp)
local leftDownLocalPos = viewPortRect.transform:InverseTransformPoint(leftDown)
local leftUpVisible = viewPortRect.rect:Contains(leftUpLocalPos)
local leftDownVisible = viewPortRect.rect:Contains(leftDownLocalPos)
if leftUpVisible or leftDownVisible then
if lume.find(self.m_haveSeenLines, idx) == nil then
table.insert(self.m_haveSeenLines, idx)
end
end
end
end
HL.Commit(ShopWeaponCtrl)