Files
Endfield-Data/LuaScripts/UI/Widgets/CashShopItem.lua
2026-01-31 21:42:01 +07:00

355 lines
14 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 UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
CashShopItem = HL.Class('CashShopItem', UIWidgetBase)
CashShopItem.m_info = HL.Field(HL.Any)
CashShopItem.m_isBox = HL.Field(HL.Boolean) << false
CashShopItem.m_hideRemainCount = HL.Field(HL.Boolean) << false
CashShopItem.m_hideNew = HL.Field(HL.Boolean) << false
CashShopItem._OnFirstTimeInit = HL.Override() << function(self)
self.view.click.onClick:AddListener(function()
if self.m_isBox then
if not PhaseManager:CheckCanOpenPhase(PhaseId.GachaWeaponPool, {goodsData = self.m_info}, true) then
logger.info("CashShopItem: CheckCanOpenPhase(PhaseId.GachaWeaponPool) false")
return
end
PhaseManager:OpenPhase(PhaseId.GachaWeaponPool, {goodsData = self.m_info})
else
local uiCtrl = self:GetUICtrl()
CashShopUtils.OpenShopDetailPanel(self.m_info, uiCtrl)
end
end)
self:RegisterMessage(MessageConst.ON_WALLET_CHANGED, function(msgArg)
self:UpdateMoney()
end)
self:RegisterMessage(MessageConst.ON_ITEM_COUNT_CHANGED, function(msgArg)
self:UpdateMoney()
end)
self:RegisterMessage(MessageConst.ON_SHOP_FREQUENCY_LIMIT_CHANGE, function(msgArg)
self:UpdateMoney()
end)
self:RegisterMessage(MessageConst.ON_GACHA_POOL_ROLE_DATA_CHANGED, function(msgArg)
self:_UpdateGuarantee()
end)
self:RegisterMessage(MessageConst.ON_SHOP_GOODS_SEE_GOODS_INFO_CHANGE, function(msgArg)
self:_RefreshTag()
end)
end
CashShopItem.UpdateMoney = HL.Method(HL.Opt(HL.Any)) << function(self, arg)
local goodsTableData = Tables.shopGoodsTable[self.m_info.goodsTemplateId]
local moneyId = goodsTableData.moneyId
local haveMoney = Utils.getItemCount(moneyId)
local info = self.m_info
local realPrice = 0
local gachaWeaponGoodsCostInfo = CashShopUtils.TryGetBuyGachaWeaponGoodsCostInfo(info.shopId, info.goodsTemplateId)
if gachaWeaponGoodsCostInfo and gachaWeaponGoodsCostInfo.ticketEnough then
if not self.view.originalCostNode then
logger.error("商品类型为为武器卡池但ui prefab缺少originalPriceNode组件将导致无法正确显示消耗抽卡券")
else
self.view.originalCostNode.gameObject:SetActive(true)
if self.view.moneyDecPriceItem then
self.view.moneyDecPriceItem.gameObject:SetActive(false)
end
self.view.iconMoneyImg:LoadSprite(UIConst.UI_SPRITE_WALLET, gachaWeaponGoodsCostInfo.costTicketId)
self.view.numberMoneyTxt.text = math.floor(gachaWeaponGoodsCostInfo.costTicketCount)
self.view.numberMoneyTxt.color = self.view.config.WHITE_COLOR
self.view.originalCostNode.originalCostImg:LoadSprite(UIConst.UI_SPRITE_WALLET, gachaWeaponGoodsCostInfo.costMoneyId)
self.view.originalCostNode.originalCostNumTxt.text = gachaWeaponGoodsCostInfo.costMoneyCount
self.view.moneyPriceMultiplyTxt.gameObject:SetActive(true)
end
else
if gachaWeaponGoodsCostInfo and gachaWeaponGoodsCostInfo.costTicketId then
self.view.iconMoneyImg:LoadSprite(UIConst.UI_SPRITE_WALLET, gachaWeaponGoodsCostInfo.costMoneyId)
end
if self.view.originalCostNode then
self.view.originalCostNode.gameObject:SetActive(false)
end
if self.view.moneyPriceMultiplyTxt then
self.view.moneyPriceMultiplyTxt.gameObject:SetActive(false)
end
if info.discount and info.discount < 1 then
if self.view.moneyDecPriceItem then
self.view.moneyDecPriceItem.gameObject:SetActive(true)
end
if self.view.bottomLayout then
self.view.bottomLayout:SetState("Price")
elseif self.view.numberMoneyGreyTxt then
self.view.numberMoneyGreyTxt.gameObject:SetActiveIfNecessary(true)
end
realPrice = CashShopUtils.GetDisplayPrice(goodsTableData.price, info.discount)
self.view.numberMoneyTxt.text = realPrice
if self.view.numberMoneyGreyTxt then
self.view.numberMoneyGreyTxt.text = goodsTableData.price
end
if self.view.deco then
self.view.deco.gameObject:SetActive(false)
end
else
if self.view.moneyDecPriceItem then
self.view.moneyDecPriceItem.gameObject:SetActive(false)
end
if self.view.bottomLayout then
self.view.bottomLayout:SetState("empty")
elseif self.view.numberMoneyGreyTxt then
self.view.numberMoneyGreyTxt.gameObject:SetActiveIfNecessary(false)
end
self.view.numberMoneyTxt.text = goodsTableData.price
realPrice = goodsTableData.price
if self.view.deco then
self.view.deco.gameObject:SetActive(true)
end
end
if realPrice > haveMoney then
self.view.numberMoneyTxt.color = self.view.config.RED_COLOR
else
self.view.numberMoneyTxt.color = self.view.config.WHITE_COLOR
end
end
local shopSystem = GameInstance.player.shopSystem
local remainCount = shopSystem:GetRemainCountByGoodsId(info.shopId, info.goodsId)
if self.view.stateController then
if remainCount == 0 then
self.view.stateController:SetState("SoldOutNode")
else
self.view.stateController:SetState("Normal")
end
elseif self.view.soldOutNode then
self.view.soldOutNode.gameObject:SetActive(remainCount == 0)
end
self:_RefreshTag()
end
CashShopItem.InitCashShopItem = HL.Method(HL.Any, HL.Opt(HL.Boolean, HL.Boolean))
<< function(self, info, hideRemainCount, hideNew)
self.m_info = info
self:_FirstTimeInit()
local shopSystem = GameInstance.player.shopSystem
self.m_hideRemainCount = hideRemainCount or false
self.m_hideNew = hideNew or false
self:_RefreshTag()
local goodsId = info.goodsId
local goodsTableData = Tables.shopGoodsTable[info.goodsTemplateId]
local moneyId = goodsTableData.moneyId
local gachaWeaponGoodsCostInfo = CashShopUtils.TryGetBuyGachaWeaponGoodsCostInfo(info.shopId, info.goodsTemplateId)
if gachaWeaponGoodsCostInfo and gachaWeaponGoodsCostInfo.ticketEnough then
if not self.view.originalCostNode then
logger.error("商品类型为为武器卡池但ui prefab缺少originalPriceNode组件将导致无法正确显示消耗抽卡券")
else
self.view.originalCostNode.gameObject:SetActive(true)
if self.view.moneyDecPriceItem then
self.view.moneyDecPriceItem.gameObject:SetActive(false)
end
self.view.iconMoneyImg:LoadSprite(UIConst.UI_SPRITE_WALLET, gachaWeaponGoodsCostInfo.costTicketId)
self.view.numberMoneyTxt.text = math.floor(gachaWeaponGoodsCostInfo.costTicketCount)
self.view.numberMoneyTxt.color = self.view.config.WHITE_COLOR
self.view.originalCostNode.originalCostImg:LoadSprite(UIConst.UI_SPRITE_WALLET, gachaWeaponGoodsCostInfo.costMoneyId)
self.view.originalCostNode.originalCostNumTxt.text = gachaWeaponGoodsCostInfo.costMoneyCount
self.view.moneyPriceMultiplyTxt.gameObject:SetActive(true)
end
else
if self.view.originalCostNode then
self.view.originalCostNode.gameObject:SetActive(false)
end
if self.view.moneyPriceMultiplyTxt then
self.view.moneyPriceMultiplyTxt.gameObject:SetActive(false)
end
local haveMoney = Utils.getItemCount(moneyId)
local realPrice = 0
if info.discount and info.discount < 1 then
if self.view.moneyDecPriceItem then
self.view.moneyDecPriceItem.gameObject:SetActive(true)
end
if self.view.bottomLayout then
self.view.bottomLayout:SetState("Price")
elseif self.view.numberMoneyGreyTxt then
self.view.numberMoneyGreyTxt.gameObject:SetActiveIfNecessary(true)
end
realPrice = CashShopUtils.GetDisplayPrice(goodsTableData.price, info.discount)
self.view.numberMoneyTxt.text = realPrice
if self.view.numberMoneyGreyTxt then
self.view.numberMoneyGreyTxt.text = goodsTableData.price
end
if self.view.deco then
self.view.deco.gameObject:SetActive(false)
end
else
if self.view.moneyDecPriceItem then
self.view.moneyDecPriceItem.gameObject:SetActive(false)
end
if self.view.bottomLayout then
self.view.bottomLayout:SetState("empty")
elseif self.view.numberMoneyGreyTxt then
self.view.numberMoneyGreyTxt.gameObject:SetActiveIfNecessary(false)
end
self.view.numberMoneyTxt.text = goodsTableData.price
realPrice = goodsTableData.price
if self.view.deco then
self.view.deco.gameObject:SetActive(true)
end
end
if realPrice > haveMoney then
self.view.numberMoneyTxt.color = self.view.config.RED_COLOR
else
self.view.numberMoneyTxt.color = self.view.config.WHITE_COLOR
end
local moneyItemData = Tables.itemTable:GetValue(moneyId)
self.view.iconMoneyImg:LoadSprite(UIConst.UI_SPRITE_WALLET, moneyItemData.iconId)
end
local remainCount = shopSystem:GetRemainCountByGoodsId(info.shopId, goodsId)
local itemId = nil
local count = 0
local itemData
if string.isEmpty(goodsTableData.rewardId) then
local weaponPool = Tables.gachaWeaponPoolTable[goodsTableData.weaponGachaPoolId]
local weaponId = weaponPool.upWeaponIds[0]
local _, weaponItemCfg = Tables.itemTable:TryGetValue(weaponId)
itemId = weaponId
if self.view.titleTxt then
self.view.titleTxt.text = string.format(Language.LUA_SHOP_WEAPON_UP_TITLE,weaponItemCfg.name)
end
itemData = weaponItemCfg
count = 1
local rarity = weaponItemCfg.rarity
if self.view.randomWeaponsTxt then
self.view.randomWeaponsTxt.text = weaponPool.name
end
if self.view.itemIcon then
self.view.itemIcon.icon:LoadSprite(UIConst.UI_SPRITE_ITEM_BIG, weaponPool.upWeaponIcon)
end
if self.view.multipleNumTxt then
self.view.multipleNumTxt.text = 10
end
if self.view.weaponLevelLayout then
UIUtils.childrenArrayActive(self.view.weaponLevelLayout, rarity)
end
self.m_isBox = true
self:_UpdateGuarantee()
else
local displayItem = UIUtils.getRewardFirstItem(goodsTableData.rewardId)
itemId = displayItem.id
count = displayItem.count
local unlock = shopSystem:CheckGoodsUnlocked(goodsId)
local stateCtrl = self.view.stateController
if stateCtrl then
if not unlock then
stateCtrl:SetState("LockNode")
elseif remainCount == 0 then
stateCtrl:SetState("SoldOutNode")
else
stateCtrl:SetState("Normal")
end
elseif self.view.soldOutNode then
self.view.soldOutNode.gameObject:SetActive(remainCount == 0)
end
_, itemData = Tables.itemTable:TryGetValue(itemId)
if itemData == nil then
logger.error(string.format("商店 %s 商品 %s 对应物品 %s 不存在", goodsTableData.shopId, goodsId, itemId))
return
end
if self.view.rarityLineImg then
UIUtils.setItemRarityImage(self.view.rarityLineImg, itemData.rarity)
UIUtils.setItemRarityImage(self.view.rarityLineImg02, itemData.rarity)
end
self.view.image:LoadSprite(UIConst.UI_SPRITE_ITEM_BIG, itemData.iconId)
self.view.randomWeaponsTxt.text = itemData.name
if self.view.rarityLineImg then
UIUtils.setItemRarityImage(self.view.rarityLineImg, itemData.rarity)
UIUtils.setItemRarityImage(self.view.rarityLineImg02, itemData.rarity)
end
end
if count ~= nil and count > 1 and self.view.numberTxt then
self.view.numberTxt.text = "× " .. count
self.view.number.gameObject:SetActiveIfNecessary(true)
elseif self.view.numberTxt then
self.view.number.gameObject:SetActiveIfNecessary(false)
end
if self.view.weaponDeco and itemData then
self.view.weaponDeco.gameObject:SetActive(itemData.type == GEnums.ItemType.Weapon)
end
end
CashShopItem._UpdateGuarantee = HL.Method() << function(self)
if not self.m_isBox then
return
end
local goodsTableData = Tables.shopGoodsTable[self.m_info.goodsTemplateId]
local remainMustUp = CashShopUtils.GetRemainPoolGotCount(goodsTableData.weaponGachaPoolId)
if self.view.guaranteeTextLayout then
local text = string.format("<color=#FEF000>%d</color> ", remainMustUp) .. Language.ui_shop_entry_weapon_shop_numbers_1
self.view.guaranteeTextLayout.guaranteeTxt.text = text
self.view.guaranteeTextLayout.guaranteeTxt.gameObject:SetActive(remainMustUp > 0)
self.view.guaranteeTextLayout.restrictNode.gameObject:SetActive(remainMustUp > 0)
end
end
CashShopItem._RefreshTag = HL.Method() << function(self)
if self.view.cashShopItemTag then
self.view.cashShopItemTag:InitCashShopItemTag({
isShop = true,
goodsData = self.m_info,
hideRemainCount = self.m_hideRemainCount,
hideNew = self.m_hideNew,
})
end
end
HL.Commit(CashShopItem)
return CashShopItem