Files
SL1900 5e0d58cfad Initial version - 1.2.0.60
EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
2025-12-03 01:00:00 +09:00

304 lines
11 KiB
Lua

local MallShopDetailCtrl = class("MallShopDetailCtrl", BaseCtrl)
MallShopDetailCtrl._mapNodeConfig = {
txtWindowTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Shop_TitleBuy"
},
goItem = {
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
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"
}
}
MallShopDetailCtrl._mapEventConfig = {}
function MallShopDetailCtrl:Refresh(mapData, topbar)
self.mapData = mapData
self.mapCfg = ConfigTable.GetData("MallShop", mapData.sId)
self:PlayInAni()
self:RefreshInfo()
self:RefreshPrice()
self:RefreshBuyState()
self:RefreshBuyCount()
self.TopBar = topbar
end
function MallShopDetailCtrl:RefreshInfo()
local mapItemCfg = ConfigTable.GetData_Item(self.mapCfg.ItemId)
if not mapItemCfg then
return
end
NovaAPI.SetTMPText(self._mapNode.txtName, self.mapCfg.Name)
self._mapNode.goItem:SetItem(self.mapCfg.ItemId, nil, self.mapCfg.ItemQty, nil, nil, nil, nil, true)
if mapItemCfg.Type == GameEnum.itemType.Disc or mapItemCfg.Type == GameEnum.itemType.Char or mapItemCfg.Type == GameEnum.itemType.CharacterSkin then
self._mapNode.txtHas.gameObject:SetActive(false)
else
self._mapNode.txtHas.gameObject:SetActive(true)
local nCount = PlayerData.Item:GetItemCountByID(self.mapCfg.ItemId)
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, self.mapCfg.Desc)
local bLimit = self.mapCfg.Stock > 0
if bLimit then
local nLeft = self.mapData.nCurStock
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 = mapItemCfg and (mapItemCfg.Stype == GameEnum.itemStype.Disc or mapItemCfg.Stype == GameEnum.itemStype.Char or mapItemCfg.Stype == GameEnum.itemStype.RandomPackage or mapItemCfg.Stype == GameEnum.itemStype.ComCYO or mapItemCfg.Stype == GameEnum.itemStype.OutfitCYO)
end
function MallShopDetailCtrl:RefreshPrice()
for i = 1, 2 do
self:SetSprite_Coin(self._mapNode.imgCoin[i], self.mapCfg.ExchangeItemId)
end
NovaAPI.SetTMPText(self._mapNode.txtPrice, self.mapCfg.ExchangeItemQty)
end
function MallShopDetailCtrl:RefreshBuyCount()
local nCost = self.nBuyCount * self.mapCfg.ExchangeItemQty
NovaAPI.SetTMPText(self._mapNode.txtCoinCount, nCost)
local nHasCoin = PlayerData.Coin:GetCoinCount(self.mapCfg.ExchangeItemId)
NovaAPI.SetTMPColor(self._mapNode.txtCoinCount, nCost > nHasCoin and Red_Unable or Blue_Normal)
end
function MallShopDetailCtrl:RefreshBuyState()
local tbCond = decodeJson(self.mapCfg.OrderCondParams)
local bPurchaseAble = PlayerData.Shop:CheckShopCond(self.mapCfg.OrderCondType, tbCond)
local bAble = bPurchaseAble and (self.mapData.nCurStock > 0 or self.mapCfg.Stock == 0)
self._mapNode.btnBuy.gameObject:SetActive(bAble)
self._mapNode.btnBuy2.gameObject:SetActive(not bAble)
self._mapNode.txtDisable.gameObject:SetActive(not bAble)
self.nBuyCount = 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)
local sDisable = ""
if not bPurchaseAble then
if self.mapCfg.OrderCondType == GameEnum.shopCond.WorldClassSpecific then
sDisable = orderedFormat(ConfigTable.GetUIText("Shop_Cond_WorldClassShort") or "", tbCond[1])
end
self.sDisableTip = ConfigTable.GetUIText("Shop_Condition")
elseif self.mapData.nCurStock == 0 then
sDisable = ConfigTable.GetUIText("Shop_Cond_SoldOutShort") or ""
self.sDisableTip = ConfigTable.GetUIText("Shop_GoodsEmpty")
end
NovaAPI.SetTMPText(self._mapNode.txtDisable, sDisable)
end
function MallShopDetailCtrl:CountMaxBuy()
local nHasCoin = PlayerData.Coin:GetCoinCount(self.mapCfg.ExchangeItemId)
local nMax = math.floor(nHasCoin / self.mapCfg.ExchangeItemQty)
if nMax == 0 then
return 1
end
if 0 < self.mapCfg.Stock then
local nRemain = self.mapData.nCurStock
return nMax > nRemain and nRemain or nMax
else
return nMax
end
end
function MallShopDetailCtrl:PlayInAni()
self.gameObject:SetActive(true)
self.ani:Play("t_window_04_t_in")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function MallShopDetailCtrl:PlayOutAni()
self.ani:Play("t_window_04_t_out")
self:AddTimer(1, 0.2, "Close", true, true, true)
end
function MallShopDetailCtrl:Close()
self.gameObject:SetActive(false)
end
function MallShopDetailCtrl:Awake()
self.ani = self.gameObject.transform:GetComponent("Animator")
end
function MallShopDetailCtrl:OnEnable()
end
function MallShopDetailCtrl:OnDisable()
end
function MallShopDetailCtrl:OnDestroy()
end
function MallShopDetailCtrl:OnBtnClick_Buy()
local nCost = self.nBuyCount * self.mapCfg.ExchangeItemQty
local nHasCoin = PlayerData.Coin:GetCoinCount(self.mapCfg.ExchangeItemId)
local sName = ConfigTable.GetData_Item(self.mapCfg.ExchangeItemId).Title
if nCost > nHasCoin then
if self.mapCfg.ExchangeItemId == AllEnum.CoinItemId.Jade then
local needCount = nCost - nHasCoin
local sTips1 = orderedFormat(ConfigTable.GetUIText("Recruit_ExchangeGemZero") or "", ConfigTable.GetData_Item(AllEnum.CoinItemId.Jade).Id, needCount, ConfigTable.GetData_Item(AllEnum.CoinItemId.STONE).Id)
local cancelCallback = function()
EventManager.Hit("TopRes", false, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade
}, true)
end
local confirmCallback = function()
local nCurStoneCount = PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.STONE)
nCurStoneCount = nCurStoneCount + PlayerData.Item:GetItemCountByID(AllEnum.CoinItemId.FREESTONE)
if nCurStoneCount >= needCount then
local successCallback = function()
EventManager.Hit("TopRes", false, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade
}, true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self:Refresh(self.mapData)
end
cs_coroutine.start(wait)
end
PlayerData.Coin:SendGemConvertReqReq(needCount, successCallback)
else
local sTips2 = orderedFormat(ConfigTable.GetUIText("Recruit_Charge") or "", ConfigTable.GetData_Item(AllEnum.CoinItemId.STONE).Id)
local confirmCallbackExchange = function()
EventManager.Hit("TopRes", false, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade
})
EventManager.Hit("MallCloseDetail")
EventManager.Hit("OpenMallTog", AllEnum.MallToggle.Gem)
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTips2,
callbackConfirm = confirmCallbackExchange,
callbackCancel = cancelCallback
}
EventManager.Hit(EventId.OpenMessageBox, msg)
EventManager.Hit("TopRes", true, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade,
AllEnum.CoinItemId.STONE
})
end
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTips1,
callbackConfirm = confirmCallback,
callbackCancel = cancelCallback,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
EventManager.Hit("TopRes", true, self.TopBar.gameObject:GetInstanceID(), {
AllEnum.CoinItemId.Jade,
AllEnum.CoinItemId.STONE
})
return
end
EventManager.Hit(EventId.OpenMessageBox, orderedFormat(ConfigTable.GetUIText("Shop_NotEnough") or "", sName))
return
end
local buy = function()
PlayerData.Mall:SendMallShopOrderReq(self.mapData.sId, self.nBuyCount)
end
local buy_confirm = function()
local nAll = self.mapCfg.ItemQty * self.nBuyCount
local sTip = 1 < nAll and orderedFormat(ConfigTable.GetUIText("Shop_MultiBuyComfirm"), nCost, sName, nAll, self.mapCfg.Name) or orderedFormat(ConfigTable.GetUIText("Shop_BuyComfirm"), nCost, sName, self.mapCfg.Name)
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sTip,
callbackConfirm = buy,
bBlur = false
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
local mapCfg = ConfigTable.GetData_Item(self.mapCfg.ItemId)
local sTip
if mapCfg.Type == GameEnum.itemType.Disc then
sTip = PlayerData.Item:GetDiscHoldingState(self.mapCfg.ItemId, self.nBuyCount)
elseif mapCfg.Type == GameEnum.itemType.Char then
sTip = PlayerData.Item:GetCharHoldingState(self.mapCfg.ItemId, self.nBuyCount)
elseif mapCfg.Stype == GameEnum.itemStype.CharShard then
local nCharId = PlayerData.Talent:GetFragmentsToChar(self.mapCfg.ItemId)
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 MallShopDetailCtrl:OnBtnClick_Close()
EventManager.Hit("MallCloseDetail")
end
function MallShopDetailCtrl:OnBtnClick_Detail()
local mapCfg = ConfigTable.GetData_Item(self.mapCfg.ItemId)
if not mapCfg then
return
end
if mapCfg.Stype == GameEnum.itemStype.Disc then
EventManager.Hit(EventId.OpenPanel, PanelId.DiscSample, self.mapCfg.ItemId)
elseif mapCfg.Stype == GameEnum.itemStype.Char then
EventManager.Hit(EventId.OpenPanel, PanelId.CharBgTrialPanel, PanelId.CharInfoTrial, self.mapCfg.ItemId)
elseif mapCfg.Stype == GameEnum.itemStype.RandomPackage or mapCfg.Stype == GameEnum.itemStype.ComCYO then
local tbDetailItem, sDetailTitle = PlayerData.Item:GetCYODisplayItem(self.mapCfg.ItemId)
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.mapCfg.ItemId)
end
end
function MallShopDetailCtrl:OnBtnClick_Disable()
EventManager.Hit(EventId.OpenMessageBox, self.sDisableTip)
end
return MallShopDetailCtrl