Files
SL1900 08b515afd9 Major Update - 2.0.0.143
EN: 2.0.0.143
CN: 2.0.0.142
JP: 2.0.0.145
KR: 2.0.0.150
2026-10-20 13:00:00 +09:00

464 lines
17 KiB
Lua

local ReengagementMallCtrl = class("ReengagementMallCtrl", BaseCtrl)
local JumpUtil = require("Game.Common.Utils.JumpUtil")
local SDKManager = CS.SDKManager.Instance
ReengagementMallCtrl._mapNodeConfig = {
txtReMallEndTip = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_Mall_EndTip"
},
txtLabelValue = {sComponentName = "TMP_Text"},
txtRemainDay = {sComponentName = "TMP_Text"},
txtWeeklyCardName = {sComponentName = "TMP_Text"},
txtWeeklyCardDesc = {sComponentName = "TMP_Text"},
txtGetNow = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_GetNow"
},
txtGetDaily = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_GetDaily"
},
btnBuyWeeklyCard = {
sComponentName = "UIButton",
callback = "OnBtnClick_BuyWeeklyCard"
},
txtBtnBuy = {sComponentName = "TMP_Text"},
txtBtnReceiveWeeklyCard = {
sComponentName = "TMP_Text",
sLanguageId = "Quest_Receive_Btn_Text"
},
txtAlreadyReceived = {
sComponentName = "TMP_Text",
sLanguageId = "CharPlot_Task_Received"
},
btnReceiveWeeklyCard = {
sComponentName = "UIButton",
callback = "OnBtnClick_ReceiveWeeklyCard"
},
btnAlreadyReceived = {
sComponentName = "UIButton",
callback = "OnBtnClick_AlreadyReceived"
},
MallItem = {
nCount = 3,
sCtrlName = "Game.UI.TemplateEx.TemplateItemCtrl"
},
btnMallItem = {nCount = 3, sComponentName = "UIButton"},
txtBannerTitle = {
sComponentName = "TMP_Text",
sLanguageId = "Reengagement_Mall_BannerTitle"
},
goActivityBanner = {},
goActBannerList = {
sComponentName = "RectTransform"
},
btnActBanner = {
sNodeName = "goActBannerList",
sComponentName = "UIButton",
callback = "OnBtnClick_btnActBanner"
},
eventActBannerDrag = {
sNodeName = "goActBannerList",
sComponentName = "UIDrag",
callback = "OnDrag_ActBanner"
},
activityBannerItem = {
nCount = 3,
sComponentName = "RectTransform"
},
imgActBanner = {nCount = 3, sComponentName = "Image"},
goBannerDot = {
sComponentName = "RectTransform"
},
imgPointBg = {nCount = 10},
PkgItem = {
nCount = 3,
sCtrlName = "Game.UI.Activity.Reengagement.ReengagementMallPackageItemCtrl"
}
}
ReengagementMallCtrl._mapEventConfig = {
MallOrderClear = "OnEvent_MallOrderClear",
RefreshReengagementWeeklyCard = "OnEvent_RefreshReengagementWeeklyCard"
}
function ReengagementMallCtrl:OnEnable()
self.tbPackagePage = {}
self.tbBannerInitPos = {}
for _, v in ipairs(self._mapNode.activityBannerItem) do
self.nBannerWidth = v.sizeDelta.x
table.insert(self.tbBannerInitPos, v.anchoredPosition)
end
self.nBannerInterval = ConfigTable.GetConfigNumber("Activity_Banner_Interval_Time")
end
function ReengagementMallCtrl:OnDisable()
self._mapNode.btnMallItem[1].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[2].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[3].onClick:RemoveAllListeners()
self:ResetTimer()
end
function ReengagementMallCtrl:Refresh(nCurTog)
if nCurTog ~= AllEnum.ReengagementTog.ShopMall then
return
end
self:SetBanner()
self:RefreshWeeklyCard()
self:RefreshPkgItem()
end
function ReengagementMallCtrl:RefreshWeeklyCard()
local mapWeeklyCard = PlayerData.Reengagement:GetWeeklyCardData()
local nActId = PlayerData.Reengagement:GetActId()
local bHasWeeklyCard = mapWeeklyCard.Id ~= nil and mapWeeklyCard.Id ~= ""
local foreach = function(mapData)
if mapData ~= nil and mapData.ReturneeId == nActId then
self.mapCurWeeklyCard = mapData
end
end
ForEachTableLine(ConfigTable.Get("ActivityReturneeCard"), foreach)
local sCanBuy = ConfigTable.GetUIText("Mall_Package_LimitTitle") .. ":1/1"
local sOut = ConfigTable.GetUIText("Mall_Package_SoldOut")
local bDisabled = mapWeeklyCard.Received or mapWeeklyCard.Remaining <= 0
NovaAPI.SetTMPText(self._mapNode.txtLabelValue, bHasWeeklyCard and sOut or sCanBuy)
NovaAPI.SetTMPText(self._mapNode.txtWeeklyCardDesc, self.mapCurWeeklyCard.Desc)
NovaAPI.SetTMPText(self._mapNode.txtWeeklyCardName, self.mapCurWeeklyCard.Name)
self._mapNode.btnReceiveWeeklyCard.gameObject:SetActive(not bDisabled and bHasWeeklyCard)
self._mapNode.btnAlreadyReceived.gameObject:SetActive(bDisabled and bHasWeeklyCard)
self._mapNode.btnBuyWeeklyCard.gameObject:SetActive(not bHasWeeklyCard)
NovaAPI.SetTMPText(self._mapNode.txtBtnBuy, self.mapCurWeeklyCard.ShowPrice)
if bHasWeeklyCard then
local sRemain = orderedFormat(ConfigTable.GetUIText("Mall_MonthlyCard_RemainDay") or "", mapWeeklyCard.Remaining)
local sReceived = ""
if mapWeeklyCard.Received then
sReceived = ConfigTable.GetUIText("Mall_MonthlyCard_Received")
else
sReceived = ConfigTable.GetUIText("Mall_MonthlyCard_Unreceived")
end
local sToday = "<color=#08D3D4>" .. sReceived .. "</color>"
if mapWeeklyCard.Remaining > 0 then
sRemain = sRemain .. " " .. sToday
end
NovaAPI.SetTMPText(self._mapNode.txtRemainDay, sRemain)
end
self._mapNode.txtRemainDay.gameObject:SetActive(bHasWeeklyCard)
self._mapNode.MallItem[1]:SetItem(self.mapCurWeeklyCard.BaseItemId, nil, self.mapCurWeeklyCard.BaseItemQty)
self._mapNode.MallItem[2]:SetItem(self.mapCurWeeklyCard.DailyItemId1, nil, self.mapCurWeeklyCard.DailyItemQty1)
self._mapNode.MallItem[3]:SetItem(self.mapCurWeeklyCard.DailyItemId2, nil, self.mapCurWeeklyCard.DailyItemQty2)
self._mapNode.btnMallItem[1].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[2].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[3].onClick:RemoveAllListeners()
self._mapNode.btnMallItem[1].onClick:AddListener(function()
UTILS.ClickItemGridWithTips(self.mapCurWeeklyCard.BaseItemId, self._mapNode.btnMallItem[1].transform, true, true, false)
end)
self._mapNode.btnMallItem[2].onClick:AddListener(function()
UTILS.ClickItemGridWithTips(self.mapCurWeeklyCard.DailyItemId1, self._mapNode.btnMallItem[2].transform, true, true, false)
end)
self._mapNode.btnMallItem[3].onClick:AddListener(function()
UTILS.ClickItemGridWithTips(self.mapCurWeeklyCard.DailyItemId2, self._mapNode.btnMallItem[3].transform, true, true, false)
end)
end
function ReengagementMallCtrl:RefreshPkgItem()
local nActId = PlayerData.Reengagement:GetActId()
self.tbPackagePage = {}
local foreach = function(mapData)
if mapData ~= nil and mapData.ReturneeId == nActId then
table.insert(self.tbPackagePage, mapData)
end
end
ForEachTableLine(ConfigTable.Get("ActivityReturneePack"), foreach)
table.sort(self.tbPackagePage, function(a, b)
return a.Sort < b.Sort
end)
local tbPurchasedBundles = PlayerData.Reengagement:GetPurchasedBundles()
for i = 1, 3 do
local mapData = self.tbPackagePage[i]
if mapData ~= nil then
local bPurchased = table.indexof(tbPurchasedBundles, mapData.Id) > 0
self._mapNode.PkgItem[i].gameObject:SetActive(true)
self._mapNode.PkgItem[i]:RefreshReengagement(mapData, bPurchased)
else
self._mapNode.PkgItem[i].gameObject:SetActive(false)
end
end
end
function ReengagementMallCtrl:SetBanner()
self.bannerRefreshTimer = nil
self.tbBannerList = {}
self:AddGachaBanner()
if nil == self.tbBannerList or nil == next(self.tbBannerList) then
self._mapNode.goActivityBanner.gameObject:SetActive(false)
else
self._mapNode.goActivityBanner:SetActive(true)
for _, v in ipairs(self._mapNode.imgPointBg) do
v.gameObject:SetActive(false)
end
for k, v in pairs(self.tbBannerList) do
if nil ~= self._mapNode.imgPointBg[k] then
self._mapNode.imgPointBg[k]:SetActive(true)
self._mapNode.imgPointBg[k].transform:Find("imgPoint").gameObject:SetActive(false)
end
end
self.nActBannerIdx = 1
self.nLastActBannerIdx = 1
self:RefreshActivityBanner()
end
self:StartActBannerTimer()
self._mapNode.eventActBannerDrag.enabled = #self.tbBannerList > 1
end
function ReengagementMallCtrl:AddGachaBanner()
local tbOpenedPool = PlayerData.Gacha:GetOpenedPool()
local comp = function(a, b)
local mapGachaA = ConfigTable.GetData("Gacha", a)
local mapGachaB = ConfigTable.GetData("Gacha", b)
return mapGachaA.Sort < mapGachaB.Sort
end
table.sort(tbOpenedPool, comp)
for _, nPoolId in ipairs(tbOpenedPool) do
local mapPoolCfgData = ConfigTable.GetData("Gacha", nPoolId)
if mapPoolCfgData ~= nil and mapPoolCfgData.BannerRes ~= nil and mapPoolCfgData.BannerRes ~= "" then
table.insert(self.tbBannerList, {
nId = nPoolId,
nType = GameEnum.bannerType.Gacha,
sBanner = mapPoolCfgData.BannerRes,
nJumpTo = nPoolId,
nFuncType = GameEnum.OpenFuncType.Gacha
})
end
end
end
function ReengagementMallCtrl:RefreshActivityBanner()
local lastIndex = self.nActBannerIdx - 1 <= 0 and #self.tbBannerList or self.nActBannerIdx - 1
local nextIndex = self.nActBannerIdx + 1 > #self.tbBannerList and 1 or self.nActBannerIdx + 1
local tbCurBannerList = {}
table.insert(tbCurBannerList, self.tbBannerList[lastIndex])
table.insert(tbCurBannerList, self.tbBannerList[self.nActBannerIdx])
table.insert(tbCurBannerList, self.tbBannerList[nextIndex])
for k, v in ipairs(self._mapNode.imgActBanner) do
local bannerData = tbCurBannerList[k]
if bannerData ~= nil then
if bannerData.nType == GameEnum.bannerType.Activity then
if nil ~= bannerData.actData then
self:SetPngSprite(v, "Icon/Banner/" .. bannerData.actData:GetBannerPng())
end
else
self:SetPngSprite(v, "Icon/Banner/" .. bannerData.sBanner)
end
end
end
self._mapNode.imgPointBg[self.nLastActBannerIdx].transform:Find("imgPoint").gameObject:SetActive(false)
self.nLastActBannerIdx = self.nActBannerIdx
self._mapNode.imgPointBg[self.nActBannerIdx].transform:Find("imgPoint").gameObject:SetActive(true)
end
function ReengagementMallCtrl:StartActBannerTimer()
if nil == self.actBannerTimer and #self.tbBannerList > 1 then
self.actBannerTimer = self:AddTimer(0, self.nBannerInterval, "PlayActBannerAnim", true, true, false)
end
end
function ReengagementMallCtrl:ResetActBannerTimer()
if nil ~= self.actBannerTimer then
self.actBannerTimer:Cancel(false)
end
self.actBannerTimer = nil
end
function ReengagementMallCtrl:PlayActBannerAnim()
local onCompleteCb = function()
self:BannerTweenerEnd()
end
for k, v in ipairs(self._mapNode.activityBannerItem) do
if k == #self._mapNode.activityBannerItem then
v:DOAnchorPosX(self.tbBannerInitPos[k].x - self.nBannerWidth, 0.5):SetUpdate(true):OnComplete(onCompleteCb)
else
v:DOAnchorPosX(self.tbBannerInitPos[k].x - self.nBannerWidth, 0.5):SetUpdate(true)
end
end
end
function ReengagementMallCtrl:BannerTweenerEnd()
for k, v in ipairs(self._mapNode.activityBannerItem) do
v.anchoredPosition = self.tbBannerInitPos[k]
end
self.nActBannerIdx = self.nActBannerIdx + 1
if self.nActBannerIdx > #self.tbBannerList then
self.nActBannerIdx = 1
end
self:RefreshActivityBanner()
end
function ReengagementMallCtrl:OnBtnClick_btnActBanner()
local bannerData = self.tbBannerList[self.nActBannerIdx]
if bannerData.nType == GameEnum.bannerType.Activity then
local openCallback = function()
if nil ~= bannerData.actData then
PlayerData.Activity:OpenActivityPanel(bannerData.actData:GetActId())
end
end
PlayerData.Base:CheckFunctionBtn(bannerData.nFuncType, openCallback)
elseif bannerData.nType == GameEnum.bannerType.OpenFunc or bannerData.nType == GameEnum.bannerType.TimeLimit_Func then
local openCallback = function()
JumpUtil.JumpTo(bannerData.nJumpTo)
end
PlayerData.Base:CheckFunctionBtn(bannerData.nFuncType, openCallback)
elseif bannerData.nType == GameEnum.bannerType.Gacha then
local openCallback = function()
local getInfoCallback = function()
local func = function()
EventManager.Hit(EventId.OpenPanel, PanelId.GachaSpin, bannerData.nJumpTo)
end
EventManager.Hit(EventId.SetTransition, 6, func, AllEnum.MainViewCorner.Recruit)
end
PlayerData.Gacha:GetGachaInfomation(getInfoCallback)
end
PlayerData.Base:CheckFunctionBtn(bannerData.nFuncType, openCallback)
elseif bannerData.nType == GameEnum.bannerType.Community then
local clientPublishRegion = CS.ClientConfig.ClientPublishRegion
local channelName = CS.ClientConfig.ClientPublishChannelName
if SDKManager:IsSDKInit() and clientPublishRegion == CS.ClientPublishRegion.CN and (channelName == "Official" or channelName == "TEST_1" or channelName == "Taptap") then
local hasUrl, url = UTILS.GetBBSUrl()
if hasUrl then
local bbsTitle = ConfigTable.GetUIText("BBSTitle")
SDKManager:ShowBBS(false, bbsTitle, url, "CN-BBS", false, 2)
else
printLog(NovaAPI.GetClientChannel() .. "——平台取不到地址")
end
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Function_NotAvailable"))
end
elseif bannerData.nType == GameEnum.bannerType.Payment then
local clientPublishRegion = CS.ClientConfig.ClientPublishRegion
local channelName = CS.ClientConfig.ClientPublishChannelName
if SDKManager:IsSDKInit() and clientPublishRegion == CS.ClientPublishRegion.CN and (channelName == "Official" or channelName == "TEST_1" or channelName == "Taptap" or channelName == "TEST_2") then
SDKManager:ShowWebView(false, "", "https://payment.yostar.cn/", 1, 1, false, "CN-PAYMENT")
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Function_NotAvailable"))
end
elseif bannerData.nType == GameEnum.bannerType.Mall then
local nJumpId = tonumber(bannerData.sParam)
JumpUtil.JumpTo(nJumpId)
elseif bannerData.nType == GameEnum.bannerType.MallSkin then
local sMallPackageId = bannerData.sParam
local mapCfg = ConfigTable.GetData("MallPackage", sMallPackageId)
if mapCfg == nil then
return
end
local callback = function(tbList, nTime)
local bInMall = false
for _, v in ipairs(tbList) do
if v.sId == sMallPackageId then
bInMall = true
break
end
end
if not bInMall then
return
end
local tbMallList = {}
table.insert(tbMallList, {sId = sMallPackageId})
local func = function()
EventManager.Hit(EventId.OpenPanel, PanelId.MallSkinPreview, tbMallList)
end
EventManager.Hit(EventId.SetTransition, 5, func)
end
PlayerData.Mall:SendMallPackageListReq(callback)
elseif bannerData.nType == GameEnum.bannerType.JumpToUrl then
local sUrl = bannerData.sUrl
local bInside = bannerData.bInside
local bUseOpenUrl = bannerData.bUseOpenUrl
if bUseOpenUrl then
NovaAPI.OpenURL(sUrl)
elseif SDKManager:IsSDKInit() then
if bInside then
SDKManager:ShowWebView(false, "", sUrl, 1, 0, true)
else
SDKManager:ShowWebView(false, "", sUrl, 1, 1, true)
end
else
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Function_NotAvailable"))
end
elseif bannerData.nType == GameEnum.bannerType.SeaPayment then
local sUrl = bannerData.sUrl
local bInside = bannerData.bInside
local sPid = bannerData.sPid
if SDKManager:IsSDKInit() then
if bInside then
SDKManager:ShowWebView(false, "", sUrl, 1, 0, false, sPid)
else
SDKManager:ShowWebView(false, "", sUrl, 1, 1, false, sPid)
end
end
end
local tab = {}
table.insert(tab, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tab, {
"banner_type",
tostring(bannerData.nType)
})
table.insert(tab, {
"banner_id",
tostring(bannerData.nId)
})
NovaAPI.UserEventUpload("scrolling_banner_click", tab)
end
function ReengagementMallCtrl:OnDrag_ActBanner(mDrag)
if mDrag.DragEventType == AllEnum.UIDragType.DragStart then
self.nBannerDragPosX = 0
self:ResetActBannerTimer()
elseif mDrag.DragEventType == AllEnum.UIDragType.Drag then
self.nBannerDragPosX = self.nBannerDragPosX + mDrag.EventData.delta.x
for k, v in ipairs(self._mapNode.activityBannerItem) do
v.anchoredPosition = Vector2(self.tbBannerInitPos[k].x + self.nBannerDragPosX, self.tbBannerInitPos[k].y)
end
elseif mDrag.DragEventType == AllEnum.UIDragType.DragEnd then
local nPos = 0
if self.nBannerDragPosX > 0 then
nPos = self.nBannerWidth
self.nActBannerIdx = 0 >= self.nActBannerIdx - 1 and #self.tbBannerList or self.nActBannerIdx - 1
elseif self.nBannerDragPosX < 0 then
nPos = -self.nBannerWidth
self.nActBannerIdx = self.nActBannerIdx + 1 > #self.tbBannerList and 1 or self.nActBannerIdx + 1
end
local tweener
for k, v in ipairs(self._mapNode.activityBannerItem) do
tweener = v:DOAnchorPosX(self.tbBannerInitPos[k].x + nPos, 0.5):SetUpdate(true)
end
local _cb = function()
for k, v in ipairs(self._mapNode.activityBannerItem) do
v.anchoredPosition = self.tbBannerInitPos[k]
end
self:RefreshActivityBanner()
self:StartActBannerTimer()
end
tweener.onComplete = dotween_callback_handler(self, _cb)
self.nBannerDragPosX = 0
end
end
function ReengagementMallCtrl:ResetTimer()
if self.actBannerTimer ~= nil then
self.actBannerTimer:Cancel(false)
self.actBannerTimer = nil
end
if self.actBannerRefreshTimer ~= nil then
self.actBannerRefreshTimer:Cancel(false)
self.actBannerRefreshTimer = nil
end
if self.bannerRefreshTimer ~= nil then
self.bannerRefreshTimer:Cancel(false)
self.bannerRefreshTimer = nil
end
end
function ReengagementMallCtrl:OnBtnClick_BuyWeeklyCard()
PlayerData.Reengagement:BuyWeeklyCard(self.mapCurWeeklyCard.Id, self.mapCurWeeklyCard.StatisticalGroup)
end
function ReengagementMallCtrl:OnBtnClick_ReceiveWeeklyCard()
PlayerData.Reengagement:RequestReceiveWeeklyCard()
end
function ReengagementMallCtrl:OnEvent_RefreshReengagementWeeklyCard()
self:RefreshWeeklyCard()
end
function ReengagementMallCtrl:OnBtnClick_AlreadyReceived()
end
function ReengagementMallCtrl:OnEvent_MallOrderClear()
PlayerData.Reengagement:RequestReengagementInfo(function()
self:RefreshWeeklyCard()
self:RefreshPkgItem()
end)
end
return ReengagementMallCtrl