Files
SL1900 eafd8f4088 Update - 1.9.0.107
EN: 1.9.0.107
CN: 1.9.0.108
JP: 1.9.0.112
KR: 1.9.0.112
2026-05-14 16:00:00 +09:00

492 lines
18 KiB
Lua
Raw Permalink 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 ReceiveSpecialRewardCtrl = class("ReceiveSpecialRewardCtrl", BaseCtrl)
local GachaShowResRoot = "UI/GachaEx/Sprites_Show/"
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
local ResTypeAny = GameResourceLoader.ResType.Any
local ResType = GameResourceLoader.ResType
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local BubbleVoiceManager = require("Game.Actor2D.BubbleVoiceManager")
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
local Offset = CS.Actor2DOffsetData
local typeof = typeof
ReceiveSpecialRewardCtrl._mapNodeConfig = {
animatorRoot = {sNodeName = "GachaShow", sComponentName = "Animator"},
goCharContent = {
sNodeName = "----Char----",
sComponentName = "RectTransform"
},
BgRare = {
sComponentName = "SpriteRenderer"
},
BgRare1 = {
sComponentName = "SpriteRenderer"
},
rImgL2D = {sComponentName = "RawImage"},
OffScreen2DCamera = {
sNodeName = "OffScreen3DCamera",
sComponentName = "Camera"
},
rtSSRWord = {},
animWord = {sNodeName = "rtSSRWord", sComponentName = "Animator"},
TMP_Word1 = {sComponentName = "TMP_Text"},
TMP_Word = {sComponentName = "TMP_Text"},
goInfoContent = {
sNodeName = "----Info----"
},
animInfoContent = {
sNodeName = "----Info----",
sComponentName = "Animator"
},
btnJumpAll = {
sComponentName = "UIButton",
callback = "OnBtnClick_Jump"
},
goOutfitContent = {
sNodeName = "----Outfit----"
},
rtItemTips = {},
imgItemIcon = {sComponentName = "Image"},
TMP_ItemCount = {sComponentName = "TMP_Text"},
TMP_ItemTitle = {
sComponentName = "TMP_Text",
sLanguageId = "GachaItemTIpsTitle"
},
imgBgRare = {sComponentName = "Image"},
imgTitleRare = {sComponentName = "Image"},
imgTitleBg = {sComponentName = "Image"},
imgRareIcon = {sComponentName = "Image"},
TMP_Title = {sComponentName = "TMP_Text"},
ImgNew = {},
imgBgOutfit = {sComponentName = "Image"},
imgOutfit = {sComponentName = "Image"},
imgOutfitRare = {sComponentName = "Image"},
liveDiscCtrl = {
sNodeName = "goLiveDisc",
sCtrlName = "Game.UI.Disc.LiveDiscCtrl"
},
SSROutfitShow = {},
animSSROutfitShow = {
sNodeName = "SSROutfitShow",
sComponentName = "Animator"
},
imgBgOutfitShow = {sComponentName = "Image"},
btnSkipAnim = {
sComponentName = "UIButton",
callback = "OnBtnClick_SkipAnim"
},
imgOutfitMask = {},
goCGInfoContent = {
sNodeName = "----CGInfo----"
},
animCGInfoContent = {
sNodeName = "----CGInfo----",
sComponentName = "Animator"
},
TMP_CGTitle = {sComponentName = "TMP_Text"},
TMP_CGWord = {sComponentName = "TMP_Text"},
rtOffScreen = {
sNodeName = "Live2D_OffScreen_Renderer",
sComponentName = "Transform"
},
TMP_CGNew = {
sComponentName = "TMP_Text",
sLanguageId = "Receive_Reward_CG"
},
actor2dNode = {
sNodeName = "----Actor2D_Node----",
sComponentName = "Transform"
}
}
local mapOutfitAnimName = {
[1] = "GachaShow_Outfit_SSR",
[2] = "GachaShow_Outfit_SR",
[3] = "GachaShow_Outfit_R",
[4] = "GachaShow_Outfit_N",
[5] = "GachaShow_Outfit_N"
}
local mapOutfitAnimTime = {
[1] = 0.6,
[2] = 0.6,
[3] = 0.6,
[4] = 0.6,
[5] = 0.6
}
local cgVoiceKey = "unlockCG"
function ReceiveSpecialRewardCtrl:SetStep(nStep)
self.curStep = nStep
end
function ReceiveSpecialRewardCtrl:ShowReward()
if #self.tbRewardList == 0 then
EventManager.Hit(EventId.ClosePanel, PanelId.ReceiveSpecialReward)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
if self.callBack then
self.callBack()
end
end
cs_coroutine.start(wait)
return
end
self._mapNode.btnSkipAnim.interactable = false
local delayTime = ConfigTable.GetConfigNumber("DelaySkipSpecialRewardTime")
self:AddTimer(1, delayTime, "DelayEnableSkip", true, true, true)
local curReward = self.tbRewardList[1]
self.bCG = curReward.bCG
if self.bCG then
local charCGCfg = ConfigTable.GetData("CharacterCG", curReward.nId)
if charCGCfg == nil then
printError(string.format("读取CharacterCG配置失败!!!id = [%s]", curReward.nId))
else
self:ShowCharCG()
end
table.remove(self.tbRewardList, 1)
return
end
local itemCfg = ConfigTable.GetData_Item(curReward.nId)
self.bNew = curReward.bNew
self.bChar = itemCfg.Type == GameEnum.itemType.Char or itemCfg.Type == GameEnum.itemType.CharacterSkin
if itemCfg.Type == GameEnum.itemType.Char then
local mapCharCfgData = ConfigTable.GetData_Character(curReward.nId)
local nSkinId = mapCharCfgData.DefaultSkinId
self.nId = curReward.nId
self:ShowTitle()
self:ShowCharSkin(nSkinId, self.bNew)
elseif itemCfg.Type == GameEnum.itemType.CharacterSkin then
self.nId = curReward.nId
self:ShowTitle()
self:ShowCharSkin(curReward.nId)
PlayerData.CharSkin:RemoveSkinQueue(curReward.nId)
elseif itemCfg.Type == GameEnum.itemType.Disc then
self.nId = curReward.nId
self:ShowTitle()
self:ShowOutfit(curReward.nId)
end
self:ShowItem(curReward.tbItemList)
table.remove(self.tbRewardList, 1)
end
function ReceiveSpecialRewardCtrl:ShowCharSkin(nSkinId, bGetNew)
self:SetStep(1)
if self.goL2D ~= nil then
Actor2DManager.UnSetActor2DWithRender(self.goL2D)
self.goL2D = nil
end
self.goL2D = {}
self._mapNode.goCharContent.gameObject:SetActive(true)
self._mapNode.goOutfitContent:SetActive(false)
self._mapNode.goInfoContent:SetActive(false)
self._mapNode.goCGInfoContent:SetActive(false)
self._mapNode.btnJumpAll.gameObject:SetActive(false)
self._mapNode.btnSkipAnim.gameObject:SetActive(true)
local mapSkinData = ConfigTable.GetData_CharacterSkin(nSkinId)
self.nCharId = mapSkinData.CharId
NovaAPI.SetSpriteRendererSprite(self._mapNode.BgRare1, self:LoadPngGacha(mapSkinData.Bg))
if mapSkinData.L2D ~= nil and mapSkinData.L2D ~= "" then
local bSetSuccess, nT, nAnimLength, tbRenderer = Actor2DManager.SetActor2DWithRender(PanelId.ReceiveSpecialReward, self._mapNode.rImgL2D, self.nCharId, nSkinId, nil, self._mapNode.actor2dNode)
self.goL2D = tbRenderer
local voice = "unlockLook"
if bGetNew == true then
voice = "gachaNew"
elseif bGetNew == false then
voice = "gacha"
end
self._mapNode.rtSSRWord:SetActive(false)
if mapSkinData.Type ~= GameEnum.skinType.OTHER then
self:ShowSSRWordEnd(0, voice)
else
self:ShowSSRWordEnd(0)
end
if self.goL2D.trL2DIns ~= nil then
Actor2DManager.PlayL2DAnim(self.goL2D.trL2DIns.transform, "idle", true, false)
end
end
end
function ReceiveSpecialRewardCtrl:ShowOutfit(nOutfitTid)
self:SetStep(1)
self._mapNode.goCharContent.gameObject:SetActive(false)
self._mapNode.goOutfitContent:SetActive(true)
self._mapNode.goCGInfoContent:SetActive(false)
self._mapNode.btnSkipAnim.gameObject:SetActive(true)
self._mapNode.btnJumpAll.gameObject:SetActive(false)
local mapItemCfgData = ConfigTable.GetData_Item(nOutfitTid)
local mapOutfitCfgData = ConfigTable.GetData("Disc", nOutfitTid)
self._mapNode.imgOutfitMask:SetActive(false)
self._mapNode.liveDiscCtrl:SetDiscActive(true, mapOutfitCfgData.DiscBg ~= "")
self._mapNode.liveDiscCtrl:SetRawImage(mapOutfitCfgData.DiscBg, mapItemCfgData.Rarity)
if mapItemCfgData.Rarity == GameEnum.itemRarity.SSR then
self:SetPngSprite(self._mapNode.imgBgOutfitShow, mapOutfitCfgData.DiscBg .. AllEnum.DiscBgSurfix.Image)
end
self:SetPngSprite(self._mapNode.imgBgOutfit, mapOutfitCfgData.DiscBg .. AllEnum.DiscBgSurfix.Image)
NovaAPI.SetImageNativeSize(self._mapNode.imgBgOutfit)
self._mapNode.imgBgOutfit.gameObject:SetActive(true)
self._mapNode.goInfoContent:SetActive(false)
if mapItemCfgData.Rarity == GameEnum.itemRarity.SSR and self.bNew then
self:SetStep(2)
self._mapNode.SSROutfitShow:SetActive(true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.animSSROutfitShow:Play("SSROutfitShow_in")
WwiseAudioMgr:PlaySound("ui_recuit_gacha_disk_SSR_glass")
end
cs_coroutine.start(wait)
self.timerStep = self:AddTimer(1, 2.7, "ShowSSRAnimEndOutfit", true, true, nil, mapItemCfgData.Rarity)
else
self:ShowSSRAnimEndOutfit(0, mapItemCfgData.Rarity)
end
end
function ReceiveSpecialRewardCtrl:ShowSSRAnimEndOutfit(_, nRarity)
self:SetStep(3)
self._mapNode.SSROutfitShow:SetActive(false)
self._mapNode.animatorRoot:Play(mapOutfitAnimName[nRarity])
self.timerStep = self:AddTimer(1, mapOutfitAnimTime[nRarity], "ShowSSRAnimEnd", true, true, nil, nil)
if nRarity == GameEnum.itemRarity.SSR then
WwiseAudioMgr:PlaySound("ui_recuit_gacha_disk_SSR_show")
elseif nRarity == GameEnum.itemRarity.SR then
WwiseAudioMgr:PlaySound("ui_recuit_gacha_disk_SR_show")
else
WwiseAudioMgr:PlaySound("ui_recuit_gacha_N")
end
end
function ReceiveSpecialRewardCtrl:ShowCharCG()
self._mapNode.goCharContent.gameObject:SetActive(true)
self._mapNode.rtSSRWord:SetActive(false)
self._mapNode.goOutfitContent:SetActive(false)
self._mapNode.goInfoContent:SetActive(false)
self._mapNode.imgBgRare.gameObject:SetActive(false)
self._mapNode.btnJumpAll.gameObject:SetActive(false)
self._mapNode.btnSkipAnim.gameObject:SetActive(true)
local curReward = self.tbRewardList[1]
self.nCharId = curReward.nCharId
local sAssetPath = ""
local mapCfg = ConfigTable.GetData("CharacterCG", curReward.nId)
if nil == mapCfg then
printError(string.format("读取CharacterCG配置失败!!!id = [%s]", curReward.nId))
else
sAssetPath = mapCfg.FullScreenL2D
end
self.nId = curReward.nId
self.bNew = curReward.bNew
if self.goL2D ~= nil then
Actor2DManager.UnSetActor2DWithRender(self.goL2D)
self.goL2D = nil
end
local bSetSuccess, nT, nAnimLength, tbRenderer = Actor2DManager.SetActor2DWithRender(PanelId.ReceiveSpecialReward, self._mapNode.rImgL2D, self.nCharId, mapCfg.Id, nil, self._mapNode.actor2dNode, AllEnum.Actor2DType.FullScreen)
if bSetSuccess then
self.goL2D = tbRenderer
end
local nDuration = 0
local nId = PlayerData.Voice:PlayCharVoice(cgVoiceKey, curReward.nCharId)
if nId ~= 0 then
local mapVoiceCfg = ConfigTable.GetData("VoDirectory", nId)
if mapVoiceCfg ~= nil then
local dataText = BubbleVoiceManager.GetBubbleText(mapVoiceCfg.voResource)
if dataText ~= nil then
local sContent = dataText[1] .. dataText[2] .. dataText[3] .. dataText[4]
sContent = string.gsub(sContent, "==RT==", "\n")
sContent = string.gsub(sContent, "==PLAYER_NAME==", PlayerData.Base:GetPlayerNickName())
NovaAPI.SetTMPText(self._mapNode.TMP_CGWord, sContent)
end
end
end
if nDuration <= 0 then
if self.goL2D ~= nil and self.goL2D.trL2DIns ~= nil then
Actor2DManager.PlayL2DAnim(self.goL2D.trL2DIns.transform, "idle", true, false)
end
self:ShowCGEnd()
else
self:AddTimer(1, nDuration, "ShowCGEnd", true, true, true)
end
self.callBack = curReward.callBack
end
function ReceiveSpecialRewardCtrl:ShowTitle()
local mapItemCfgData = ConfigTable.GetData_Item(self.nId)
NovaAPI.SetTMPText(self._mapNode.TMP_Title, mapItemCfgData.Title)
local bgSprite = self:LoadPngGacha(GachaShowResRoot .. "bg_gacha_character_" .. AllEnum.FrameColor_New[mapItemCfgData.Rarity])
NovaAPI.SetImageSpriteAsset(self._mapNode.imgBgRare, bgSprite)
NovaAPI.SetSpriteRendererSprite(self._mapNode.BgRare, bgSprite)
NovaAPI.SetImageSpriteAsset(self._mapNode.imgRareIcon, self:LoadPngGacha(GachaShowResRoot .. "rare_character_gacha_" .. AllEnum.FrameColor_New[mapItemCfgData.Rarity]))
NovaAPI.SetImageNativeSize(self._mapNode.imgRareIcon)
self._mapNode.ImgNew:SetActive(self.bNew)
self._mapNode.TMP_Word.gameObject:SetActive(self.bChar)
if self.bChar then
NovaAPI.SetImageSpriteAsset(self._mapNode.imgTitleBg, self:LoadPngGacha(GachaShowResRoot .. "zs_gacha_name"))
NovaAPI.SetImageSpriteAsset(self._mapNode.imgTitleRare, self:LoadPngGacha(GachaShowResRoot .. "zs_gacha_name_" .. AllEnum.FrameColor_New[mapItemCfgData.Rarity]))
else
NovaAPI.SetImageSpriteAsset(self._mapNode.imgTitleBg, self:LoadPngGacha(GachaShowResRoot .. "zs_gacha_name_outfit"))
NovaAPI.SetImageSpriteAsset(self._mapNode.imgTitleRare, self:LoadPngGacha(GachaShowResRoot .. "zs_gacha_name_outfit_" .. AllEnum.FrameColor_New[mapItemCfgData.Rarity]))
end
end
function ReceiveSpecialRewardCtrl:ShowCGTitle()
local mapCGCgfData = ConfigTable.GetData("CharacterCG", self.nId)
if mapCGCgfData == nil then
printError(string.format("读取CharacterCG配置失败!!!id = [%s]", self.nId))
else
NovaAPI.SetTMPText(self._mapNode.TMP_CGTitle, mapCGCgfData.Name)
end
end
function ReceiveSpecialRewardCtrl:ShowSSRWordEnd(_, voice)
self._mapNode.rtSSRWord:SetActive(false)
if self.goL2D.trL2DIns == nil then
self:ShowSSRAnimEnd(_, voice)
return
end
self._mapNode.animatorRoot:Play("GachaShow_SR")
self.timerStep = self:AddTimer(1, 1.2, "ShowSSRAnimEnd", true, true, nil, voice)
local mapCharCfgData = ConfigTable.GetData_Character(self.nCharId)
if mapCharCfgData ~= nil then
if mapCharCfgData.Grade == GameEnum.characterGrade.SSR then
WwiseAudioMgr:PlaySound("ui_recuit_gacha_SSR_show")
else
WwiseAudioMgr:PlaySound("ui_recuit_gacha_SR_long")
end
end
end
function ReceiveSpecialRewardCtrl:ShowSSRAnimEnd(_, voice)
self:SetStep(4)
self._mapNode.TMP_Word.gameObject:SetActive(false)
if voice ~= nil then
local nId = PlayerData.Voice:PlayCharVoice(voice, self.nCharId)
local mapVoiceCfg = ConfigTable.GetData("VoDirectory", nId)
if mapVoiceCfg ~= nil then
local dataText = BubbleVoiceManager.GetBubbleText(mapVoiceCfg.voResource)
if dataText ~= nil then
self._mapNode.TMP_Word.gameObject:SetActive(true)
local sContent = dataText[1] .. dataText[2] .. dataText[3] .. dataText[4]
sContent = string.gsub(sContent, "==RT==", "\n")
sContent = string.gsub(sContent, "==PLAYER_NAME==", PlayerData.Base:GetPlayerNickName())
NovaAPI.SetTMPText(self._mapNode.TMP_Word, sContent)
NovaAPI.SetTMPText(self._mapNode.TMP_Word1, sContent)
end
end
elseif self.bChar then
if CacheTable.Get("_CharGetLinesBySkinId") == nil or next(CacheTable.Get("_CharGetLinesBySkinId")) == nil then
local func_Parse_CharGetLines = function(mapData)
if mapData.SkinId ~= 0 then
CacheTable.SetData("_CharGetLinesBySkinId", mapData.SkinId, mapData)
end
end
ForEachTableLine(DataTable.CharGetLines, func_Parse_CharGetLines)
end
local mapCfg = CacheTable.GetData("_CharGetLinesBySkinId", self.nId)
if mapCfg ~= nil then
self._mapNode.TMP_Word.gameObject:SetActive(true)
local sContent = mapCfg.Lines
sContent = string.gsub(sContent, "==RT==", "\n")
sContent = string.gsub(sContent, "==PLAYER_NAME==", PlayerData.Base:GetPlayerNickName())
NovaAPI.SetTMPText(self._mapNode.TMP_Word, sContent)
NovaAPI.SetTMPText(self._mapNode.TMP_Word1, sContent)
end
end
self._mapNode.goInfoContent:SetActive(true)
self._mapNode.animInfoContent:Play("Info_rtTitle_in")
local animTime = NovaAPI.GetAnimClipLength(self._mapNode.animInfoContent, {
"Info_rtTitle_in"
})
if self.bNew then
self:AddTimer(1, 0.4, function()
WwiseAudioMgr:PlaySound("ui_recuit_gacha_new")
end, true, true, true)
end
self.timerStep = self:AddTimer(1, animTime, "ShowTitleAnimEnd", true, true, true)
end
function ReceiveSpecialRewardCtrl:ShowCGEnd()
self:ShowCGTitle()
self._mapNode.goInfoContent:SetActive(false)
self._mapNode.goCGInfoContent:SetActive(true)
self._mapNode.animCGInfoContent:Play("CGInfo_in", 0, 0)
self.bPlaySkipVoice = false
local animTime = NovaAPI.GetAnimClipLength(self._mapNode.animCGInfoContent, {"CGInfo_in"})
if self.bNew then
self:AddTimer(1, 0.4, function()
WwiseAudioMgr:PlaySound("ui_recuit_gacha_new")
end, true, true, true)
end
self.timerStep = self:AddTimer(1, animTime, "ShowTitleAnimEnd", true, true, true)
end
function ReceiveSpecialRewardCtrl:ShowTitleAnimEnd()
self:SetStep(5)
if self.bSkipedAnim == nil or not self.bSkipedAnim then
self.bSkipedAnim = true
end
end
function ReceiveSpecialRewardCtrl:ShowItem(tbRewardItem)
if tbRewardItem ~= nil and 0 < #tbRewardItem then
local mapRewardItemCfgData = ConfigTable.GetData_Item(tbRewardItem[1].Tid)
if mapRewardItemCfgData == nil then
printError("item ID missing" .. tbRewardItem[1].Tid)
self._mapNode.rtItemTips:SetActive(false)
else
local nRewardItemCount = tbRewardItem[1].Qty
self._mapNode.rtItemTips:SetActive(true)
self:SetPngSprite(self._mapNode.imgItemIcon, mapRewardItemCfgData.Icon)
NovaAPI.SetTMPText(self._mapNode.TMP_ItemCount, string.format("×%d", tostring(nRewardItemCount)))
end
else
self._mapNode.rtItemTips:SetActive(false)
end
end
function ReceiveSpecialRewardCtrl:DelayEnableSkip()
self._mapNode.btnSkipAnim.interactable = true
end
function ReceiveSpecialRewardCtrl:OnEnable()
self._mapNode.rtOffScreen.localScale = Vector3(1 / Settings.CANVAS_SCALE, 1 / Settings.CANVAS_SCALE, 1 / Settings.CANVAS_SCALE)
self.timerStep = nil
self.bPlaySkipVoice = true
self._mapNode.btnSkipAnim.interactable = false
local tbParam = self:GetPanelParam()
if nil == tbParam or nil == tbParam[1] then
return
end
self.tbRewardList = tbParam[1]
self.callBack = tbParam[2]
self:ShowReward()
if GamepadUIManager.GetInputState() then
GamepadUIManager.EnableGamepadUI("ReceiveSpecialRewardCtrl", self:GetGamepadUINode(), nil, true)
end
end
function ReceiveSpecialRewardCtrl:OnDisable()
NovaAPI.SetTexture(self._mapNode.rImgL2D, nil)
if self.goL2D ~= nil then
Actor2DManager.UnSetActor2DWithRender(self.goL2D)
self.goL2D = nil
end
if self.bCG then
EventManager.Hit("Guide_PassiveCheck_Msg", "Guide_ChooseHomePageRole")
end
EventManager.Hit("CharRefreshActor2D")
if GamepadUIManager.GetInputState() then
GamepadUIManager.DisableGamepadUI("ReceiveSpecialRewardCtrl")
end
end
function ReceiveSpecialRewardCtrl:LoadPngGacha(sPath)
return self:LoadAsset(sPath .. ".png", typeof(Sprite))
end
function ReceiveSpecialRewardCtrl:LoadOffset(sPath)
return self:LoadAsset(sPath, typeof(Offset))
end
function ReceiveSpecialRewardCtrl:OnBtnClick_Jump()
WwiseAudioMgr:WwiseVoice_Stop(2)
self._mapNode.animatorRoot.speed = 1
self._mapNode.animInfoContent.speed = 1
self:ShowReward()
end
function ReceiveSpecialRewardCtrl:OnBtnClick_SkipAnim(btn)
if self.bSkipedAnim then
self.bSkipedAnim = false
self:OnBtnClick_Jump()
else
if self.curStep == 4 then
self._mapNode.animatorRoot.speed = 1000
if self.bCG then
self._mapNode.animCGInfoContent.speed = 1000
else
self._mapNode.animInfoContent.speed = 1000
end
end
if self.curStep ~= 5 and self.timerStep ~= nil then
self.timerStep:Cancel(true)
return
end
end
end
return ReceiveSpecialRewardCtrl