Files
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

407 lines
16 KiB
Lua

local VampireLevelSelectCtrl = class("VampireLevelSelectCtrl", BaseCtrl)
local Actor2DManager = require("Game.Actor2D.Actor2DManager")
local PlayerBoardData = PlayerData.Board
local LocalSettingData = require("GameCore.Data.LocalSettingData")
local Path = require("path")
local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader")
local ResTypeAny = GameResourceLoader.ResType.Any
local typeof = typeof
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
local BubbleVoiceManager = require("Game.Actor2D.BubbleVoiceManager")
VampireLevelSelectCtrl._mapNodeConfig = {
imgBgTalent = {},
imgBgLevelInfo = {},
TMPScoreTitleQuest = {
sComponentName = "TMP_Text",
sLanguageId = "Vampire_Season_Score"
},
TMPScore = {sComponentName = "TMP_Text"},
TMPRemainTimeQuest = {sComponentName = "TMP_Text"},
rtLevelSelect = {
sCtrlName = "Game.UI.VampireLevelSelect.VampireLevelSelect_levelSelectCtrl"
},
rtLevelInfo = {
sCtrlName = "Game.UI.VampireLevelSelect.VampireLevelSelect_levelInfo"
},
rtTalent = {
sCtrlName = "Game.UI.VampireLevelSelect.VampireLevelSelect_talentCtrl"
},
TopBar = {
sNodeName = "TopBarPanel",
sCtrlName = "Game.UI.TopBarEx.TopBarCtrl"
},
btnTalent = {
sComponentName = "UIButton",
callback = "OnBtnClick_Talent"
},
btnQuest = {
sComponentName = "UIButton",
callback = "OnBtnClick_Quest"
},
btnShop = {
sComponentName = "UIButton",
callback = "OnBtnClick_Shop"
},
btnNote = {
sComponentName = "UIButton",
callback = "OnBtnClick_Note"
},
btnNpc = {
sComponentName = "UIButton",
callback = "OnBtnClick_Npc"
},
btnPassQuest = {
sComponentName = "UIButton",
callback = "OnBtnClick_PassQuest"
},
VampireQuestPanel = {
sCtrlName = "Game.UI.VampireLevelSelect.VampireLevelSelect_questCtrl"
},
goEnemyInfo = {
sCtrlName = "Game.UI.MainlineEx.MainlineMonsterInfoCtrl"
},
imgDisasterEffect = {},
goBubbleRoot = {
sNodeName = "----fixed_bubble----"
},
TMPBtnNote = {
sComponentName = "TMP_Text",
sLanguageId = "Vampire_Talent"
},
TMPBtnShop = {
sComponentName = "TMP_Text",
sLanguageId = "Vampire_Shop"
},
TMPBtnCodex = {
sComponentName = "TMP_Text",
sLanguageId = "Vampire_Book"
},
TMPBtnQuest = {sComponentName = "TMP_Text"},
goImgBgLevelSelect = {
sNodeName = "imgBgLevelSelect"
},
imgBgLevelSelect = {
sNodeName = "----Actor2D----",
sComponentName = "RawImage"
},
trActor2D_PNG = {
sNodeName = "----Actor2D_PNG----",
sComponentName = "Transform"
},
goRedDotQuest = {},
goRedDotTalent = {}
}
VampireLevelSelectCtrl._mapEventConfig = {
VampireLevelSelect_ClickLevelGrid = "OnEvent_ClickLevelGrid",
VampireSurvivorChangeBuild = "OnEvent_VampireSurvivorChangeBuild",
EnterVampireSurvivor = "OnEvent_EnterVampireSurvivor",
VampireQuestTitle = "SetQuestTitle",
VampireToggleChange = "OnEvent_VampireToggleChange",
VampireSeasonRefresh = "OnEvent_VampireSeasonRefresh",
[EventId.UIHomeConfirm] = "OnEvent_Home",
[EventId.UIBackConfirm] = "OnEvent_Back",
[EventId.ShowBubbleVoiceText] = "OnEvent_ShowBubbleVoiceText"
}
VampireLevelSelectCtrl._mapRedDotConfig = {
[RedDotDefine.VampireQuest] = {
sNodeName = "goRedDotQuest"
},
[RedDotDefine.VampireTalent] = {
sNodeName = "goRedDotTalent"
}
}
function VampireLevelSelectCtrl:OnEnable()
EventManager.Hit(EventId.SetTransition)
self.animator = self.gameObject:GetComponent("Animator")
local bUseL2D = LocalSettingData.mapData.UseLive2D
self._mapNode.imgBgLevelSelect.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.imgBgLevelSelect, 910202)
else
Actor2DManager.SetBoardNPC2D_PNG(self._mapNode.trActor2D_PNG, self:GetPanelId(), 910202)
end
local nScore = PlayerData.VampireSurvivor:GetCurScore()
NovaAPI.SetTMPText(self._mapNode.TMPScore, nScore)
NovaAPI.SetTMPText(self._mapNode.TMPRemainTimeQuest, ConfigTable.GetUIText("Vampire_Season_ScoreTime") .. PlayerData.VampireSurvivor:GetRefreshTiem())
self.bRefreshLevelSelect = false
if self._panel.nLevelId ~= nil and self._panel.nLevelId > 0 then
local mapData = ConfigTable.GetData("VampireSurvivor", self._panel.nLevelId)
self._mapNode.rtTalent.gameObject:SetActive(false)
if mapData ~= nil then
self:OnEvent_ClickLevelGrid(mapData, true)
end
elseif self._panel.bTalent then
self:OnBtnClick_Talent()
self._mapNode.rtLevelInfo.gameObject:SetActive(false)
else
self._mapNode.imgBgTalent:SetActive(false)
self._mapNode.rtLevelInfo.gameObject:SetActive(false)
self._mapNode.rtTalent.gameObject:SetActive(false)
self._mapNode.rtLevelSelect.gameObject:SetActive(true)
self._mapNode.goBubbleRoot:SetActive(true)
self._mapNode.rtLevelSelect:Refresh()
self.bRefreshLevelSelect = true
self.animator:Play("VampireLevelSelectPanel_in")
self:NpcVoice()
end
self._mapNode.rtTalent:Refresh()
local nQuestCur, nQuestTotal = PlayerData.VampireSurvivor:GetSeasonQuestCount()
NovaAPI.SetTMPText(self._mapNode.TMPBtnQuest, orderedFormat(ConfigTable.GetUIText("Vampire_Quest_Btn_Title") or "", nQuestCur, nQuestTotal))
local imgBg1 = self.gameObject.transform:Find("imgBgLevelInfo"):GetComponent("Image")
local imgBg2 = self.gameObject.transform:Find("imgBgLevelInfo1"):GetComponent("Image")
local imgBg3 = self.gameObject.transform:Find("imgDisasterEffect/imgBgLevelInfo"):GetComponent("Image")
local imgBg4 = self.gameObject.transform:Find("imgDisasterEffect/imgBgLevelInfo1"):GetComponent("Image")
local imgBg5 = self.gameObject.transform:Find("imgBgTalent"):GetComponent("Image")
self:SetPngSprite(imgBg1, "Image/UIBG/bg_survivor_entrance")
self:SetPngSprite(imgBg2, "Image/UIBG/bg_survivor_entrance_01")
self:SetPngSprite(imgBg3, "Image/UIBG/bg_survivor_entrance_02")
self:SetPngSprite(imgBg4, "Image/UIBG/bg_survivor_entrance_03")
self:SetPngSprite(imgBg5, "Image/UIBG/bg_survivor_talentbg")
end
function VampireLevelSelectCtrl:OnDisable()
Actor2DManager.UnsetBoardNPC2D()
PlayerData.Voice:StopCharVoice()
PlayerData.Voice:ClearTimer()
BubbleVoiceManager.StopBubbleAnim()
end
function VampireLevelSelectCtrl:SetQuestTitle(nHard)
local nQuestCur, nQuestTotal = PlayerData.VampireSurvivor:GetSeasonQuestCount(nHard)
NovaAPI.SetTMPText(self._mapNode.TMPBtnQuest, orderedFormat(ConfigTable.GetUIText("Vampire_Quest_Btn_Title") or "", nQuestCur, nQuestTotal))
end
function VampireLevelSelectCtrl:OnEvent_ClickLevelGrid(mapData, bNoAnim)
local nId = mapData.Id
local cachedBuild = PlayerData.VampireSurvivor:GetCachedBuildId(nId)
local mapBuild1, mapBuild2
local GetBuildCallback = function(tbBuild, mapBuild)
local bDeleteBuild = false
if cachedBuild[1] ~= nil and cachedBuild[1] ~= 0 then
mapBuild1 = mapBuild[cachedBuild[1]]
bDeleteBuild = mapBuild1 == nil
if mapBuild1 == nil then
cachedBuild[1] = 0
end
end
if cachedBuild[2] ~= nil and cachedBuild[2] ~= 0 then
mapBuild2 = mapBuild[cachedBuild[2]]
bDeleteBuild = bDeleteBuild or mapBuild2 == nil
if mapBuild2 == nil then
cachedBuild[2] = 0
end
end
if bDeleteBuild then
local sTip = ConfigTable.GetUIText("RegionBoss_Team_Delete")
EventManager.Hit(EventId.OpenMessageBox, sTip)
end
self._mapNode.rtLevelInfo.gameObject:SetActive(true)
self._mapNode.rtLevelSelect.gameObject:SetActive(false)
self._mapNode.goBubbleRoot:SetActive(false)
BubbleVoiceManager.StopBubbleAnim()
self._panel.nLevelId = nId
self._mapNode.rtLevelInfo:Refresh(nId, mapBuild1, mapBuild2)
if bNoAnim then
self.animator:Play("VampireLevelSelectPanel_loop1")
else
self.animator:Play("VampireLevelSelectPanel_in1")
end
end
if cachedBuild == nil then
self._mapNode.rtLevelInfo.gameObject:SetActive(true)
self._mapNode.rtLevelSelect.gameObject:SetActive(false)
self._mapNode.goBubbleRoot:SetActive(false)
BubbleVoiceManager.StopBubbleAnim()
self._panel.nLevelId = nId
self._mapNode.rtLevelInfo:Refresh(nId, nil, nil)
if bNoAnim then
self.animator:Play("VampireLevelSelectPanel_loop1")
else
self.animator:Play("VampireLevelSelectPanel_in1")
end
else
PlayerData.Build:GetAllBuildBriefData(GetBuildCallback)
end
NovaAPI.SetTMPText(self._mapNode.TMPRemainTimeQuest, ConfigTable.GetUIText("Vampire_Season_ScoreTime") .. PlayerData.VampireSurvivor:GetRefreshTiem())
end
function VampireLevelSelectCtrl:OnEvent_EnterVampireSurvivor()
self._mapNode.goImgBgLevelSelect:SetActive(false)
self._mapNode.goBubbleRoot:SetActive(false)
BubbleVoiceManager.StopBubbleAnim()
end
function VampireLevelSelectCtrl:OnEvent_Back(nPanelId)
if self._panel.nLevelId ~= nil and self._panel.nLevelId > 0 or self._panel.bTalent then
local nCurLevel = self._panel.nLevelId
self._mapNode.imgBgTalent:SetActive(false)
self._mapNode.rtLevelInfo.gameObject:SetActive(false)
self._mapNode.rtTalent.gameObject:SetActive(false)
self._mapNode.rtLevelSelect.gameObject:SetActive(true)
self._mapNode.goBubbleRoot:SetActive(true)
self._panel.nLevelId = 0
self._panel.bTalent = false
self.animator:Play("VampireLevelSelectPanel_in")
self._mapNode.goImgBgLevelSelect:SetActive(true)
local sKey = table.keyof(PanelId, self._panel._nPanelId)
local mapTopBar = ConfigTable.GetData("TopBar", sKey, true)
local sTitle = mapTopBar == nil and "" or mapTopBar.Title
if type(sTitle) == "string" and sTitle ~= "" then
self._mapNode.TopBar:SetTitleTxt(sTitle)
end
if not self.bRefreshLevelSelect then
self._mapNode.rtLevelSelect:RefreshWithPosSet(nCurLevel)
self.bRefreshLevelSelect = true
end
EventManager.Hit(EventId.SetCoinVisible, true)
NovaAPI.SetTMPText(self._mapNode.TMPRemainTimeQuest, ConfigTable.GetUIText("Vampire_Season_ScoreTime") .. PlayerData.VampireSurvivor:GetRefreshTiem())
if PlayerData.VampireSurvivor:CheckBattleSuccess() == true then
self:PlayNpcVoice("clear")
PlayerData.Voice:StartBoardFreeTimer(9102)
end
else
EventManager.Hit(EventId.CloesCurPanel)
end
end
function VampireLevelSelectCtrl:OnEvent_Home(nPanelId)
if self._panel._nPanelId ~= nPanelId then
return
end
PanelManager.Home()
end
function VampireLevelSelectCtrl:OnEvent_VampireSurvivorChangeBuild()
local nId = self._panel.nLevelId
local cachedBuild = PlayerData.VampireSurvivor:GetCachedBuildId(nId)
local mapBuild1, mapBuild2
local GetBuildCallback = function(tbBuild, mapBuild)
if cachedBuild[1] ~= 0 then
mapBuild1 = mapBuild[cachedBuild[1]]
end
if cachedBuild[2] ~= 0 then
mapBuild2 = mapBuild[cachedBuild[2]]
end
self._mapNode.rtLevelInfo.gameObject:SetActive(true)
self._mapNode.rtLevelSelect.gameObject:SetActive(false)
self._mapNode.goBubbleRoot:SetActive(false)
BubbleVoiceManager.StopBubbleAnim()
self._panel.nLevelId = nId
self._mapNode.rtLevelInfo:Refresh(nId, mapBuild1, mapBuild2)
end
if cachedBuild == nil then
self._mapNode.rtLevelInfo.gameObject:SetActive(true)
self._mapNode.rtLevelSelect.gameObject:SetActive(false)
self._mapNode.goBubbleRoot:SetActive(false)
BubbleVoiceManager.StopBubbleAnim()
self._panel.nLevelId = nId
self._mapNode.rtLevelInfo:Refresh(nId, nil, nil)
else
PlayerData.Build:GetAllBuildBriefData(GetBuildCallback)
end
end
function VampireLevelSelectCtrl:OnBtnClick_Talent()
self._panel.bTalent = true
self._mapNode.imgBgTalent:SetActive(true)
self._mapNode.rtLevelSelect.gameObject:SetActive(false)
self._mapNode.goBubbleRoot:SetActive(false)
BubbleVoiceManager.StopBubbleAnim()
self._mapNode.rtTalent.gameObject:SetActive(true)
self.animator:Play("VampireLevelSelectPanel_rtTalent")
local animTime = NovaAPI.GetAnimClipLength(self.animator, {
"VampireLevelSelectPanel_rtTalent"
})
self:AddTimer(1, animTime, function()
local bHint, nCard, nExp = PlayerData.VampireSurvivor:CheckOpenHint()
if bHint then
self._mapNode.rtTalent:OpenHint(nCard, nExp)
end
end, true, true, true)
NovaAPI.SetTMPText(self._mapNode.TMPRemainTimeQuest, ConfigTable.GetUIText("Vampire_Season_ScoreTime") .. PlayerData.VampireSurvivor:GetRefreshTiem())
self._mapNode.TopBar:SetTitleTxt(ConfigTable.GetUIText("Vampire_TalentPanel_Title"))
EventManager.Hit(EventId.SetCoinVisible, false)
end
function VampireLevelSelectCtrl:OnBtnClick_Quest()
NovaAPI.SetTMPText(self._mapNode.TMPRemainTimeQuest, ConfigTable.GetUIText("Vampire_Season_ScoreTime") .. PlayerData.VampireSurvivor:GetRefreshTiem())
self._mapNode.rtLevelInfo:SetRefreshTime()
self._mapNode.VampireQuestPanel:OpenPanel(self._mapNode.rtLevelSelect.curToggle)
end
function VampireLevelSelectCtrl:OnBtnClick_PassQuest()
NovaAPI.SetTMPText(self._mapNode.TMPRemainTimeQuest, ConfigTable.GetUIText("Vampire_Season_ScoreTime") .. PlayerData.VampireSurvivor:GetRefreshTiem())
self._mapNode.rtLevelInfo:SetRefreshTime()
self._mapNode.VampireQuestPanel:OpenPanel(2, self._panel.nLevelId)
end
function VampireLevelSelectCtrl:OnBtnClick_Note()
local callback = function()
EventManager.Hit(EventId.OpenPanel, PanelId.StarTowerBook, AllEnum.StarTowerBookPanelType.FateCard)
end
PlayerData.StarTowerBook:TryGetFateCardBook(callback)
end
function VampireLevelSelectCtrl:OnBtnClick_Shop()
EventManager.Hit(EventId.OpenPanel, PanelId.ShopPanel, 2)
end
function VampireLevelSelectCtrl:OnBtnClick_Npc()
if self.bBlockNpc == true then
return
end
PlayerData.Voice:PlayBoardNPCClickVoice(9102)
end
function VampireLevelSelectCtrl:OnEvent_VampireToggleChange(nIdx)
self._mapNode.imgDisasterEffect:SetActive(nIdx == 3)
end
function VampireLevelSelectCtrl:PlayNpcVoice(sType)
local sVoiceRes = PlayerData.Voice:PlayCharVoice(sType, 9102, nil, true)
end
function VampireLevelSelectCtrl:OnEvent_ShowBubbleVoiceText(nCharId, nId)
if self._panel.nLevelId ~= nil and self._panel.nLevelId > 0 or self._panel.bTalent then
return
end
local mapVoDirectoryData = ConfigTable.GetData("VoDirectory", nId)
if mapVoDirectoryData == nil then
printError("VoDirectory未找到数据id:" .. nId)
return
end
if nil ~= mapVoDirectoryData then
BubbleVoiceManager.PlayFixedBubbleAnim(self._mapNode.goBubbleRoot, mapVoDirectoryData.voResource)
end
end
function VampireLevelSelectCtrl:OnEvent_VampireSeasonRefresh()
local nScore = PlayerData.VampireSurvivor:GetCurScore()
local nQuestCur, nQuestTotal = PlayerData.VampireSurvivor:GetSeasonQuestCount()
self._mapNode.rtLevelSelect:NewSeason()
if self._panel.nLevelId ~= nil and self._panel.nLevelId > 0 then
self._mapNode.imgBgTalent:SetActive(false)
self._mapNode.rtLevelInfo.gameObject:SetActive(false)
self._mapNode.rtTalent.gameObject:SetActive(false)
self._mapNode.rtLevelSelect.gameObject:SetActive(true)
self._mapNode.goBubbleRoot:SetActive(true)
self._panel.nLevelId = 0
self._panel.bTalent = false
self.animator:Play("VampireLevelSelectPanel_in")
self._mapNode.goImgBgLevelSelect:SetActive(true)
self._mapNode.goBubbleRoot:SetActive(true)
local sKey = table.keyof(PanelId, self._panel._nPanelId)
local mapTopBar = ConfigTable.GetData("TopBar", sKey, true)
local sTitle = mapTopBar == nil and "" or mapTopBar.Title
if type(sTitle) == "string" and sTitle ~= "" then
self._mapNode.TopBar:SetTitleTxt(sTitle)
end
EventManager.Hit(EventId.SetCoinVisible, true)
end
end
function VampireLevelSelectCtrl:BlockNpc(nTime)
self.bBlockNpc = true
local unBlockJump = function()
self.bBlockNpc = false
end
self:AddTimer(1, nTime, unBlockJump, true, true, nil, nil)
end
function VampireLevelSelectCtrl:NpcVoice()
local sTimeVoice = PlayerData.Voice:GetNPCGreetTimeVoiceKey()
PlayerData.VampireSurvivor:CheckBattleSuccess()
PlayerData.Voice:StartBoardFreeTimer(9102)
local bFirstIn = PlayerData.VampireSurvivor:GetFirstIn()
if bFirstIn then
self:PlayNpcVoice(sTimeVoice)
else
local nIndex = math.random(1, 2)
local sVoice = nIndex == 1 and sTimeVoice or "greet_npc"
self:PlayNpcVoice(sVoice)
end
end
return VampireLevelSelectCtrl