8766830959
EN: 1.8.0.95 CN: 1.8.0.96 JP: 1.8.0.97 KR: 1.8.0.100
267 lines
10 KiB
Lua
267 lines
10 KiB
Lua
local ShopGoodsDetailCtrl = class("ShopGoodsDetailCtrl", BaseCtrl)
|
|
ShopGoodsDetailCtrl._mapNodeConfig = {
|
|
txtWindowTitle = {
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Shop_TitleBuy"
|
|
},
|
|
goItem = {
|
|
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
|
|
},
|
|
goDiscStar = {
|
|
sCtrlName = "Game.UI.TemplateEx.TemplateStarCtrl"
|
|
},
|
|
btnDetail = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_Detail"
|
|
},
|
|
txtName = {sComponentName = "TMP_Text"},
|
|
txtDesc = {sComponentName = "TMP_Text"},
|
|
txtHas = {sComponentName = "TMP_Text"},
|
|
txtPriceCn = {
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Shop_UnitPrice"
|
|
},
|
|
imgCoin = {nCount = 2, sComponentName = "Image"},
|
|
goOrigin = {},
|
|
txtOrigin = {sComponentName = "TMP_Text"},
|
|
txtPrice = {sComponentName = "TMP_Text"},
|
|
imgDiscount = {},
|
|
txtDiscount = {
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Shop_Discount"
|
|
},
|
|
txtStock = {sComponentName = "TMP_Text"},
|
|
goStock = {},
|
|
txtBtnBuy = {
|
|
nCount = 2,
|
|
sComponentName = "TMP_Text",
|
|
sLanguageId = "Shop_Btn_Buy"
|
|
},
|
|
txtCoinCount = {sComponentName = "TMP_Text"},
|
|
btnBuy = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_Buy"
|
|
},
|
|
btnClose = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_Close"
|
|
},
|
|
btnBuy2 = {
|
|
sComponentName = "UIButton",
|
|
callback = "OnBtnClick_Disable"
|
|
},
|
|
txtDisable = {sComponentName = "TMP_Text"},
|
|
goQuantitySelector = {
|
|
sNodeName = "tc_quantity_selector",
|
|
sCtrlName = "Game.UI.TemplateEx.TemplateQuantitySelectorCtrl"
|
|
}
|
|
}
|
|
ShopGoodsDetailCtrl._mapEventConfig = {}
|
|
function ShopGoodsDetailCtrl:Refresh(mapData, nShopId)
|
|
self.mapData = mapData
|
|
self.nShopId = nShopId
|
|
self.bAble = self.mapData.bPurchasTime and self.mapData.bPurchasable and not self.mapData.bSoldOut
|
|
self:PlayInAni()
|
|
self:RefreshInfo(mapData)
|
|
self:RefreshPrice(mapData)
|
|
self:RefreshBuyState()
|
|
self:RefreshBuyCount()
|
|
end
|
|
function ShopGoodsDetailCtrl:RefreshInfo(mapData)
|
|
local mapCfg = ConfigTable.GetData_Item(mapData.nItemId)
|
|
if not mapCfg then
|
|
return
|
|
end
|
|
NovaAPI.SetTMPText(self._mapNode.txtName, mapData.sName)
|
|
self._mapNode.goItem:SetItem(mapData.nItemId, nil, mapData.nItemQuantity, nil, nil, nil, nil, true)
|
|
self._mapNode.goDiscStar.gameObject:SetActive(mapCfg.Type == GameEnum.itemType.Disc)
|
|
if mapCfg.Type == GameEnum.itemType.Disc then
|
|
local nStar = 6 - mapCfg.Rarity
|
|
self._mapNode.goDiscStar:SetStar(nStar, nStar)
|
|
end
|
|
if mapCfg.Type == GameEnum.itemType.Disc or mapCfg.Type == GameEnum.itemType.Char or mapCfg.Type == GameEnum.itemType.CharacterSkin then
|
|
self._mapNode.txtHas.gameObject:SetActive(false)
|
|
else
|
|
self._mapNode.txtHas.gameObject:SetActive(true)
|
|
local nCount = PlayerData.Item:GetItemCountByID(mapData.nItemId)
|
|
if 999999 < nCount then
|
|
local nFloor = math.floor(nCount / 100)
|
|
local nK = string.format("%.0f", nFloor / 10)
|
|
local sCount = nK .. "k"
|
|
NovaAPI.SetTMPText(self._mapNode.txtHas, ConfigTable.GetUIText("Shop_Has") .. sCount)
|
|
else
|
|
NovaAPI.SetTMPText(self._mapNode.txtHas, ConfigTable.GetUIText("Shop_Has") .. nCount)
|
|
end
|
|
end
|
|
NovaAPI.SetTMPText(self._mapNode.txtDesc, mapData.sDesc)
|
|
local bLimit = mapData.nMaximumLimit > 0
|
|
if bLimit then
|
|
local nLeft = mapData.nMaximumLimit - mapData.nBoughtCount
|
|
NovaAPI.SetTMPText(self._mapNode.txtStock, orderedFormat(ConfigTable.GetUIText("Shop_Stock"), nLeft))
|
|
NovaAPI.SetTMPColor(self._mapNode.txtStock, nLeft == 0 and Red_Unable or Blue_Dark)
|
|
else
|
|
NovaAPI.SetTMPText(self._mapNode.txtStock, ConfigTable.GetUIText("Shop_Unlimited"))
|
|
NovaAPI.SetTMPColor(self._mapNode.txtStock, Blue_Dark)
|
|
end
|
|
self._mapNode.btnDetail.interactable = mapCfg and (mapCfg.Stype == GameEnum.itemStype.Disc or mapCfg.Stype == GameEnum.itemStype.Char or mapCfg.Stype == GameEnum.itemStype.RandomPackage or mapCfg.Stype == GameEnum.itemStype.ComCYO or mapCfg.Stype == GameEnum.itemStype.OutfitCYO)
|
|
end
|
|
function ShopGoodsDetailCtrl:RefreshPrice(mapData)
|
|
for i = 1, 2 do
|
|
self:SetSprite_Coin(self._mapNode.imgCoin[i], mapData.nCurrencyItemId)
|
|
end
|
|
NovaAPI.SetTMPText(self._mapNode.txtPrice, mapData.nPrice)
|
|
local bSale = mapData.nOriginalPrice > 0
|
|
self._mapNode.imgDiscount:SetActive(bSale)
|
|
self._mapNode.goOrigin:SetActive(bSale)
|
|
if bSale then
|
|
NovaAPI.SetTMPText(self._mapNode.txtOrigin, mapData.nOriginalPrice)
|
|
end
|
|
end
|
|
function ShopGoodsDetailCtrl:RefreshBuyCount()
|
|
local nCost = self.nBuyCount * self.mapData.nPrice
|
|
NovaAPI.SetTMPText(self._mapNode.txtCoinCount, nCost)
|
|
local nHasCoin = PlayerData.Coin:GetCoinCount(self.mapData.nCurrencyItemId)
|
|
NovaAPI.SetTMPColor(self._mapNode.txtCoinCount, nCost > nHasCoin and Red_Unable or Blue_Normal)
|
|
end
|
|
function ShopGoodsDetailCtrl:RefreshBuyState()
|
|
self._mapNode.btnBuy.gameObject:SetActive(self.bAble)
|
|
self._mapNode.btnBuy2.gameObject:SetActive(not self.bAble)
|
|
self._mapNode.txtDisable.gameObject:SetActive(not self.mapData.bPurchasable or self.mapData.bSoldOut)
|
|
self.nBuyCount = self.bAble and 1 or 0
|
|
local nMax = self:CountMaxBuy()
|
|
local callback = function(nCount)
|
|
self.nBuyCount = nCount
|
|
self:RefreshBuyCount()
|
|
end
|
|
self._mapNode.goQuantitySelector:Init(callback, self.nBuyCount, nMax)
|
|
if self.mapData.bSoldOut then
|
|
NovaAPI.SetTMPText(self._mapNode.txtDisable, ConfigTable.GetUIText("Shop_Cond_SoldOutShort"))
|
|
elseif not self.mapData.bPurchasable then
|
|
if self.mapData.nPurchaseCondType == GameEnum.shopCond.WorldClassSpecific then
|
|
NovaAPI.SetTMPText(self._mapNode.txtDisable, orderedFormat(ConfigTable.GetUIText("Shop_Cond_WorldClassShort"), self.mapData.tbPurchaseCondParams[1]))
|
|
elseif self.mapData.nPurchaseCondType == GameEnum.shopCond.ShopPreGoodsSellOut then
|
|
NovaAPI.SetTMPText(self._mapNode.txtDisable, ConfigTable.GetUIText("Shop_Cond_PreGoodsSellOut"))
|
|
end
|
|
end
|
|
end
|
|
function ShopGoodsDetailCtrl:CountMaxBuy()
|
|
local nHasCoin = PlayerData.Coin:GetCoinCount(self.mapData.nCurrencyItemId)
|
|
local nMax = math.floor(nHasCoin / self.mapData.nPrice)
|
|
if nMax == 0 then
|
|
return 1
|
|
end
|
|
if 0 < self.mapData.nMaximumLimit then
|
|
local nRemain = self.mapData.nMaximumLimit - self.mapData.nBoughtCount
|
|
return nMax > nRemain and nRemain or nMax
|
|
else
|
|
return nMax
|
|
end
|
|
end
|
|
function ShopGoodsDetailCtrl:PlayInAni()
|
|
self.gameObject:SetActive(true)
|
|
self.ani:Play("t_window_04_t_in")
|
|
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
|
|
end
|
|
function ShopGoodsDetailCtrl:PlayOutAni()
|
|
self.ani:Play("t_window_04_t_out")
|
|
self:AddTimer(1, 0.2, "Close", true, true, true)
|
|
end
|
|
function ShopGoodsDetailCtrl:Close()
|
|
self.gameObject:SetActive(false)
|
|
end
|
|
function ShopGoodsDetailCtrl:Awake()
|
|
self.ani = self.gameObject.transform:GetComponent("Animator")
|
|
end
|
|
function ShopGoodsDetailCtrl:OnEnable()
|
|
end
|
|
function ShopGoodsDetailCtrl:OnDisable()
|
|
end
|
|
function ShopGoodsDetailCtrl:OnDestroy()
|
|
end
|
|
function ShopGoodsDetailCtrl:OnBtnClick_Buy()
|
|
local nCost = self.nBuyCount * self.mapData.nPrice
|
|
local nHasCoin = PlayerData.Coin:GetCoinCount(self.mapData.nCurrencyItemId)
|
|
local sName = ConfigTable.GetData_Item(self.mapData.nCurrencyItemId).Title
|
|
if nCost > nHasCoin then
|
|
EventManager.Hit(EventId.OpenMessageBox, orderedFormat(ConfigTable.GetUIText("Shop_NotEnough"), sName))
|
|
return
|
|
end
|
|
local buy = function()
|
|
local callback = function()
|
|
EventManager.Hit("ShopRefreshGoods")
|
|
EventManager.Hit("ShopCloseDetail")
|
|
local bSale = self.mapData.nOriginalPrice > 0
|
|
local bLimit = 0 < self.mapData.nMaximumLimit or 0 < self.mapData.nDownShelfTime
|
|
EventManager.Hit("ShopBuyVoice", bSale, bLimit)
|
|
end
|
|
PlayerData.Shop:SendResidentShopPurchaseReq(self.nShopId, self.mapData.nId, self.nBuyCount, callback)
|
|
end
|
|
local buy_confirm = function()
|
|
local nAll = self.mapData.nItemQuantity * self.nBuyCount
|
|
local sTip = 1 < nAll and orderedFormat(ConfigTable.GetUIText("Shop_MultiBuyComfirm"), nCost, sName, nAll, self.mapData.sName) or orderedFormat(ConfigTable.GetUIText("Shop_BuyComfirm"), nCost, sName, self.mapData.sName)
|
|
local msg = {
|
|
nType = AllEnum.MessageBox.Confirm,
|
|
sContent = sTip,
|
|
callbackConfirm = buy,
|
|
bBlur = false
|
|
}
|
|
EventManager.Hit(EventId.OpenMessageBox, msg)
|
|
end
|
|
local mapCfg = ConfigTable.GetData_Item(self.mapData.nItemId)
|
|
local sTip
|
|
if mapCfg.Type == GameEnum.itemType.Disc then
|
|
sTip = PlayerData.Item:GetDiscHoldingState(self.mapData.nItemId, self.nBuyCount)
|
|
elseif mapCfg.Type == GameEnum.itemType.Char then
|
|
sTip = PlayerData.Item:GetCharHoldingState(self.mapData.nItemId, self.nBuyCount)
|
|
elseif mapCfg.Stype == GameEnum.itemStype.CharShard then
|
|
local nCharId = PlayerData.Talent:GetFragmentsToChar(self.mapData.nItemId)
|
|
sTip = PlayerData.Item:GetCharHoldingState(nCharId, 0, self.nBuyCount)
|
|
end
|
|
if sTip then
|
|
local msg = {
|
|
nType = AllEnum.MessageBox.Confirm,
|
|
sContent = sTip,
|
|
callbackConfirm = buy_confirm,
|
|
bBlur = false
|
|
}
|
|
EventManager.Hit(EventId.OpenMessageBox, msg)
|
|
else
|
|
buy_confirm()
|
|
end
|
|
end
|
|
function ShopGoodsDetailCtrl:OnBtnClick_Close()
|
|
EventManager.Hit("ShopCloseDetail")
|
|
end
|
|
function ShopGoodsDetailCtrl:OnBtnClick_Detail()
|
|
local mapCfg = ConfigTable.GetData_Item(self.mapData.nItemId)
|
|
if not mapCfg then
|
|
return
|
|
end
|
|
if mapCfg.Stype == GameEnum.itemStype.Disc then
|
|
EventManager.Hit(EventId.OpenPanel, PanelId.DiscSample, self.mapData.nItemId)
|
|
elseif mapCfg.Stype == GameEnum.itemStype.Char then
|
|
EventManager.Hit(EventId.OpenPanel, PanelId.CharBgTrialPanel, PanelId.CharInfoTrial, self.mapData.nItemId)
|
|
elseif mapCfg.Stype == GameEnum.itemStype.RandomPackage or mapCfg.Stype == GameEnum.itemStype.ComCYO then
|
|
local tbDetailItem, sDetailTitle = PlayerData.Item:GetCYODisplayItem(self.mapData.nItemId)
|
|
local msg = {
|
|
nType = AllEnum.MessageBox.ItemList,
|
|
tbItem = tbDetailItem,
|
|
sTitle = sDetailTitle,
|
|
bBlur = false
|
|
}
|
|
EventManager.Hit(EventId.OpenMessageBox, msg)
|
|
elseif mapCfg.Stype == GameEnum.itemStype.OutfitCYO then
|
|
EventManager.Hit(EventId.OpenPanel, PanelId.DiscPreview, self.mapData.nItemId)
|
|
end
|
|
end
|
|
function ShopGoodsDetailCtrl:OnBtnClick_Disable()
|
|
if self.mapData.bSoldOut then
|
|
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Shop_GoodsEmpty"))
|
|
elseif not self.mapData.bPurchasable then
|
|
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Shop_Condition"))
|
|
elseif not self.mapData.bPurchasTime then
|
|
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Shop_NotPurchasTime"))
|
|
end
|
|
end
|
|
return ShopGoodsDetailCtrl
|