Files
StellaSora_DataLua/lua/game/ui/shopex/shopctrl.lua
T
SL1900 35c8d87e86 Update - 1.4.0.73
EN: 1.4.0.73
CN: 1.4.0.74
JP: 1.4.0.77
KR: 1.4.0.80
2025-12-25 19:00:00 +09:00

333 lines
10 KiB
Lua

local ShopCtrl = class("ShopCtrl", BaseCtrl)
local LocalSettingData = require("GameCore.Data.LocalSettingData")
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local BubbleVoiceManager = require("Game.Actor2D.BubbleVoiceManager")
local PlayerVoiceData = PlayerData.Voice
ShopCtrl._mapNodeConfig = {
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
rawImgActor2D = {
sNodeName = "----Actor2D----",
sComponentName = "RawImage"
},
trActor2D_PNG = {
sNodeName = "----Actor2D_PNG----",
sComponentName = "Transform"
},
aniRoot = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "Animator"
},
btnActor2D = {
sComponentName = "Button",
callback = "OnBtnClick_Actor2D"
},
svTog = {
sComponentName = "LoopScrollView"
},
trSvTog = {sNodeName = "svTog", sComponentName = "Transform"},
goRefresh = {},
txtRefreshCn = {sComponentName = "TMP_Text"},
txtRefreshTime = {sComponentName = "TMP_Text"},
Goods = {
sNodeName = "---Goods---",
sCtrlName = "Game.UI.ShopEx.ShopGoodsCtrl"
},
btnDailyGift = {
sComponentName = "UIButton",
callback = "OnBtnClick_DailyGift"
},
txtGiftOff = {sComponentName = "TMP_Text"},
txtDailyGift = {
sComponentName = "TMP_Text",
sLanguageId = "Shop_DailyGift"
},
goGiftOn = {},
goGiftOff = {},
reddotGift = {},
goBubbleRoot = {
sNodeName = "----fixed_bubble----"
}
}
ShopCtrl._mapEventConfig = {
ShopTimeRefresh = "OnEvent_TimeRefresh",
[EventId.IsNewDay] = "RefreshDailyGift",
[EventId.NewFuncUnlockWorldClass] = "OnEvent_NewFuncUnlockWorldClass",
[EventId.ShowBubbleVoiceText] = "OnEvent_ShowBubbleVoiceText",
ShopBuyVoice = "PlayBuyVoice",
[EventId.UIBackConfirm] = "OnEvent_UIBack",
[EventId.UIHomeConfirm] = "OnEvent_Home"
}
ShopCtrl._mapRedDotConfig = {
[RedDotDefine.Shop_Daily] = {sNodeName = "reddotGift"}
}
local npcId = 9131
function ShopCtrl:CheckShopData()
EventManager.Hit("ShopCloseDetail")
PlayerData.Shop:CheckShopData(function()
self:RefreshData()
self:RefreshTog()
self:SetTimer()
self:SwitchTog()
end)
self:RefreshNPC2D()
end
function ShopCtrl:RefreshData()
self.tbShops = PlayerData.Shop:GetShopList()
self.nShopCount = #self.tbShops
self.ctrlTog = {}
if self.nCurTog == nil then
self.nCurTog = 1
if self._panel.nDefaultId then
for k, v in ipairs(self.tbShops) do
if v.nId == self._panel.nDefaultId then
self.nCurTog = k
break
end
end
end
end
if not self.tbShops[self.nCurTog] or self.nSelectShop and self.tbShops[self.nCurTog].nId ~= self.nSelectShop then
self.nCurTog = 1
end
self.nSelectShop = self.tbShops[self.nCurTog].nId
end
function ShopCtrl:RefreshTog()
if self.nShopCount > 0 then
self._mapNode.svTog.gameObject:SetActive(true)
for nInstanceID, objCtrl in pairs(self.ctrlTog) do
self:UnbindCtrlByNode(objCtrl)
self.ctrlTog[nInstanceID] = nil
end
self._mapNode.svTog:Init(self.nShopCount, self, self.OnGridRefresh, self.OnGridBtnClick)
else
self._mapNode.svTog.gameObject:SetActive(false)
end
end
function ShopCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceID = goGrid:GetInstanceID()
if not self.ctrlTog[nInstanceID] then
self.ctrlTog[nInstanceID] = self:BindCtrlByNode(goGrid, "Game.UI.TemplateEx.TemplateToggleCtrl")
end
self.ctrlTog[nInstanceID]:SetText(self.tbShops[nIndex].sName)
self.ctrlTog[nInstanceID]:SetDefault(nIndex == self.nCurTog)
end
function ShopCtrl:OnGridBtnClick(goGrid, gridIndex)
local nIndex = gridIndex + 1
local nInstanceID = goGrid:GetInstanceID()
if nIndex == self.nCurTog then
return
end
self.ctrlTog[nInstanceID]:SetTrigger(true)
if self.nCurTog then
local goSelect = self._mapNode.trSvTog:Find("Viewport/Content/" .. self.nCurTog - 1)
if goSelect then
self.ctrlTog[goSelect.gameObject:GetInstanceID()]:SetTrigger(false)
end
end
self.nCurTog = nIndex
self.nSelectShop = self.tbShops[self.nCurTog].nId
self:SwitchTog()
self._mapNode.aniRoot:Play("ShopPanel_in")
self:PlaySwitchTogVoice()
end
function ShopCtrl:SetTimer()
if self.timer ~= nil then
self.timer:Cancel(false)
self.timer = nil
end
local nTime = PlayerData.Shop:GetShopAutoUpdateTime()
if 0 < nTime then
self.timer = self:AddTimer(1, nTime, function()
self:CheckShopData()
EventManager.Hit(EventId.CloseMessageBox)
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Shop_ShopRefresh"))
end, true, true, false)
end
end
function ShopCtrl:SwitchTog()
local mapShop = self.tbShops[self.nCurTog]
self._mapNode.TopBar:CreateCoin(mapShop.tbShopCoin)
self._mapNode.Goods:Open(mapShop.nId, mapShop.nNextRefreshTime)
self.nRemainTime = mapShop.nNextRefreshTime == 0 and 0 or mapShop.nNextRefreshTime - CS.ClientManager.Instance.serverTimeStamp
if self.timerCountDown == nil then
self.timerCountDown = self:AddTimer(0, 1, "RefreshTime", false, true, false)
end
if self.nRemainTime > 0 then
self._mapNode.goRefresh:SetActive(true)
self:RefreshTime()
self.timerCountDown:Pause(false)
else
self._mapNode.goRefresh:SetActive(false)
self.timerCountDown:Pause(true)
end
end
function ShopCtrl:RefreshTime()
self.nRemainTime = self.nRemainTime - 1
if self.nRemainTime > 0 then
local mapShop = self.tbShops[self.nCurTog]
NovaAPI.SetTMPText(self._mapNode.txtRefreshCn, mapShop.nNextRefreshTime == mapShop.nCloseTime and ConfigTable.GetUIText("Shop_NextClose") or ConfigTable.GetUIText("Shop_NextRefresh"))
local sTime = ""
if self.nRemainTime <= 60 then
local sec = math.floor(self.nRemainTime)
sTime = orderedFormat(ConfigTable.GetUIText("Shop_NextRefresh_Sec"), sec)
elseif self.nRemainTime > 60 and self.nRemainTime <= 3600 then
local min = math.floor(self.nRemainTime / 60)
local sec = math.floor(self.nRemainTime - min * 60)
if sec == 0 then
min = min - 1
sec = 60
end
sTime = orderedFormat(ConfigTable.GetUIText("Shop_NextRefresh_Min"), min, sec)
elseif self.nRemainTime > 3600 and self.nRemainTime <= 86400 then
local hour = math.floor(self.nRemainTime / 3600)
local min = math.floor((self.nRemainTime - hour * 3600) / 60)
if min == 0 then
hour = hour - 1
min = 60
end
sTime = orderedFormat(ConfigTable.GetUIText("Shop_NextRefresh_Hour"), hour, min)
elseif self.nRemainTime > 86400 then
local day = math.floor(self.nRemainTime / 86400)
local hour = math.floor((self.nRemainTime - day * 86400) / 3600)
if hour == 0 then
day = day - 1
hour = 24
end
sTime = orderedFormat(ConfigTable.GetUIText("Shop_NextRefresh_Day"), day, hour)
end
NovaAPI.SetTMPText(self._mapNode.txtRefreshTime, sTime)
else
self.timerCountDown:Pause(true)
end
end
function ShopCtrl:RefreshNPC2D()
local bUseL2D = LocalSettingData.mapData.UseLive2D
self._mapNode.rawImgActor2D.transform.localScale = bUseL2D == true and Vector3.one or Vector3.zero
self._mapNode.trActor2D_PNG.localScale = bUseL2D == true and Vector3.zero or Vector3.one
if bUseL2D == true then
Actor2DManager.SetBoardNPC2D(self:GetPanelId(), self._mapNode.rawImgActor2D, npcId)
else
Actor2DManager.SetBoardNPC2D_PNG(self._mapNode.trActor2D_PNG, self:GetPanelId(), npcId)
end
end
function ShopCtrl:RefreshDailyGift()
local bUnlock = PlayerData.Base:CheckFunctionUnlock(GameEnum.OpenFuncType.DailyReward)
NovaAPI.SetTMPText(self._mapNode.txtGiftOff, bUnlock and ConfigTable.GetUIText("Shop_Received") or ConfigTable.GetUIText("Shop_DailyGift_Locked"))
if bUnlock then
local bActive = PlayerData.Shop:GetDailyShopReward()
self._mapNode.goGiftOff:SetActive(not bActive)
self._mapNode.goGiftOn:SetActive(bActive)
else
self._mapNode.goGiftOff:SetActive(true)
self._mapNode.goGiftOn:SetActive(false)
end
end
function ShopCtrl:PlayEnterVoice()
local bFirst = PlayerData.Shop:GetShopFirstIn()
local sTimeVoice = PlayerData.Voice:GetNPCGreetTimeVoiceKey()
if bFirst then
PlayerData.Voice:PlayCharVoice(sTimeVoice, npcId, nil, true)
else
local nIndex = math.random(1, 2)
local sVoice = nIndex == 1 and sTimeVoice or "greet_npc"
PlayerData.Voice:PlayCharVoice(sVoice, npcId, nil, true)
end
end
function ShopCtrl:PlayBuyVoice(bSale, bLimit)
local sVoice = ""
if bSale then
sVoice = "onsale"
elseif bLimit then
sVoice = "limited"
else
sVoice = "thank_npc"
end
PlayerData.Voice:PlayCharVoice(sVoice, npcId, nil, true)
end
function ShopCtrl:PlaySwitchTogVoice()
PlayerData.Voice:PlayCharVoice("Tab", npcId, nil, true)
end
function ShopCtrl:PlayDailyGiftVoice()
PlayerData.Voice:PlayCharVoice("thanksp", npcId, nil, true)
end
function ShopCtrl:FadeIn(bPlayFadeIn)
EventManager.Hit(EventId.SetTransition)
self._mapNode.aniRoot:Play("ShopPanel_in")
end
function ShopCtrl:Awake()
self.nCurTog = nil
end
function ShopCtrl:OnEnable()
PlayerVoiceData:StartBoardFreeTimer(npcId)
self:PlayEnterVoice()
self:RefreshDailyGift()
self:CheckShopData()
end
function ShopCtrl:OnDisable()
if self.ctrlTog then
for nInstanceId, objCtrl in pairs(self.ctrlTog) do
self:UnbindCtrlByNode(objCtrl)
self.ctrlTog[nInstanceId] = nil
end
self.ctrlTog = {}
end
Actor2DManager.UnsetBoardNPC2D()
BubbleVoiceManager.StopBubbleAnim()
PlayerVoiceData:ClearTimer()
PlayerVoiceData:StopCharVoice()
end
function ShopCtrl:OnDestroy()
end
function ShopCtrl:OnBtnClick_Actor2D()
PlayerVoiceData:PlayBoardNPCClickVoice(npcId)
end
function ShopCtrl:OnBtnClick_DailyGift()
local checkcallback = function()
local bActive = PlayerData.Shop:GetDailyShopReward()
if not bActive then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("Shop_DailyGift_Received"))
return
end
local callback = function()
self:RefreshDailyGift()
self:PlayDailyGiftVoice()
end
PlayerData.Shop:SendDailyShopRewardReceiveReq(callback)
end
PlayerData.Base:CheckFunctionBtn(GameEnum.OpenFuncType.DailyReward, checkcallback, "ui_systerm_locked")
end
function ShopCtrl:OnEvent_TimeRefresh()
self:CheckShopData()
end
function ShopCtrl:OnEvent_NewFuncUnlockWorldClass(nId)
if nId == GameEnum.OpenFuncType.DailyReward then
self:RefreshDailyGift()
end
end
function ShopCtrl:OnEvent_ShowBubbleVoiceText(nNpcId, nId)
if nNpcId ~= npcId then
return
end
local mapVoDirectoryData = ConfigTable.GetData("VoDirectory", nId)
if mapVoDirectoryData == nil then
printError("VoDirectory未找到数据id:" .. nId)
return
end
BubbleVoiceManager.PlayFixedBubbleAnim(self._mapNode.goBubbleRoot, mapVoDirectoryData.voResource)
end
function ShopCtrl:OnEvent_UIBack(nPanelId)
if PanelId.DiscSample ~= nPanelId or PanelId.CharBgTrialPanel ~= nPanelId then
PlayerVoiceData:StartBoardFreeTimer(npcId)
end
end
function ShopCtrl:OnEvent_Home(nPanelId)
if PanelId.DiscSample ~= nPanelId or PanelId.CharBgTrialPanel ~= nPanelId then
PlayerVoiceData:StartBoardFreeTimer(npcId)
end
end
return ShopCtrl