Files
StellaSora_DataLua/lua/game/ui/startower/startowermapctrl.lua
T
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

360 lines
12 KiB
Lua

local StarTowerMapCtrl = class("StarTowerMapCtrl", BaseCtrl)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
StarTowerMapCtrl._mapNodeConfig = {
blurBg = {},
sv = {
sComponentName = "LoopScrollView",
callback = "OnScrollRectValueChanged"
},
svGamepad = {
sNodeName = "sv",
sComponentName = "GamepadScroll"
},
safeAreaRoot = {
sNodeName = "----SafeAreaRoot----"
},
Title = {},
txtTitle = {sComponentName = "TMP_Text"},
txtdifficulty = {sComponentName = "TMP_Text"},
btnTempLeave = {
sComponentName = "NaviButton",
callback = "OnBtnClick_Leave"
},
btnBack = {
sComponentName = "NaviButton",
callback = "OnBtnClick_Close"
},
btnGiveUp = {
sComponentName = "NaviButton",
callback = "OnBtnClick_GiveUp"
},
btnResetTop = {
sComponentName = "UIButton",
callback = "OnBtnClick_ResetUp"
},
btnResetBot = {
nCount = 2,
sComponentName = "UIButton",
callback = "OnBtnClick_ResetDown"
},
btnPopSkill = {
sComponentName = "NaviButton",
callback = "OnBtnClick_Skill"
},
btnSettings = {
sComponentName = "NaviButton",
callback = "OnBtnClick_Settings"
},
goHorrorRoom = {},
rtHorrorRoom = {
sNodeName = "goHorrorRoom",
sComponentName = "RectTransform"
},
goRankTime = {},
txtBattleTimeCn = {
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Battle_Time"
},
txtBattleTimeSec = {
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Battle_Time_Sec"
},
txtBattleTime = {sComponentName = "TMP_Text"},
txtBtnGiveup = {
sComponentName = "TMP_Text",
sLanguageId = "StarTowerMap_Btn_GiveUp"
},
txtBtnLeave = {
sComponentName = "TMP_Text",
sLanguageId = "StarTowerMap_Btn_Leave"
},
txtBtnSkill = {
sComponentName = "TMP_Text",
sLanguageId = "StarTowerMap_Btn_Skill"
},
ActionBar = {
sCtrlName = "Game.UI.ActionBar.ActionBarCtrl"
}
}
StarTowerMapCtrl._mapEventConfig = {
OpenStarTowerMap = "OnEvent_OpenStarTowerMap",
RefreshCheckGridStatus = "OnEvent_RefreshCheckGridStatus",
StartClientRankTimer = "OnEvent_StartClientRankTimer",
ResetClientRankTimer = "OnEvent_ResetClientRankTimer",
GamepadUIChange = "OnEvent_GamepadUIChange"
}
function StarTowerMapCtrl:Refresh(tbStageInfo, nCurLayer, nStarTowerId, bHorrorRoom, nTime)
self.nTime = nTime and nTime or 0
self.bRank = nTime ~= nil
if self.bRank then
self._mapNode.goRankTime.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtBattleTime, nTime + self.nClientRankTime)
else
self._mapNode.goRankTime.gameObject:SetActive(false)
end
if nStarTowerId == 999 then
self._mapNode.Title.gameObject:SetActive(false)
else
self._mapNode.Title.gameObject:SetActive(true)
local mapStarTower = ConfigTable.GetData("StarTower", nStarTowerId)
if mapStarTower ~= nil then
NovaAPI.SetTMPText(self._mapNode.txtTitle, mapStarTower.Name)
NovaAPI.SetTMPText(self._mapNode.txtdifficulty, ConfigTable.GetUIText("Diffculty_" .. tostring(mapStarTower.Difficulty)))
else
NovaAPI.SetTMPText(self._mapNode.txtTitle, "")
NovaAPI.SetTMPText(self._mapNode.txtdifficulty, "")
end
end
self.tbStageInfo = tbStageInfo
self.curLayer = nCurLayer
if self.curLayer == nil then
return
end
if bHorrorRoom then
self._mapNode.sv.gameObject:SetActive(false)
self._mapNode.goHorrorRoom.gameObject:SetActive(true)
self:ShowHorrorRoom()
else
self._mapNode.sv.gameObject:SetActive(true)
self._mapNode.goHorrorRoom.gameObject:SetActive(false)
self.nCurCount = #self.tbStageInfo
self._mapNode.sv:Init(self.nCurCount, self, self.OnGridRefresh)
self._mapNode.sv:SetCheckGirdIndex(self.nCurCount - self.curLayer)
if self.curLayer <= 2 then
self._mapNode.sv:SetScrollPos(0)
elseif self.nCurCount - self.curLayer <= 4 then
self._mapNode.sv:SetScrollPos(1)
else
self._mapNode.sv:SetScrollPos(1)
local index = self.nCurCount - self.curLayer
self._mapNode.sv:SetScrollGridPos(index, 0, 0)
end
self.nPos = self._mapNode.sv:GetScrollPos()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self.bVertical = self._mapNode.sv.vertical
if not self.bVertical then
self._mapNode.btnResetTop.gameObject:SetActive(false)
for i = 1, 2 do
self._mapNode.btnResetBot[i].gameObject:SetActive(false)
end
end
end
cs_coroutine.start(wait)
end
end
function StarTowerMapCtrl:OnGridRefresh(goGrid, gridIndex)
local nIndex = gridIndex + 1
nIndex = self.nCurCount - nIndex + 1
local mapData = self.tbStageInfo[nIndex]
local roomType = mapData.RoomType
local rtGrid = goGrid:GetComponent("RectTransform")
NovaAPI.SetCanvasGroupAlpha(rtGrid:GetComponent("CanvasGroup"), 1)
rtGrid:Find("L/Stair").gameObject:SetActive(nIndex ~= 1)
rtGrid:Find("R/Stair").gameObject:SetActive(nIndex ~= 1)
local Node
if nIndex % 2 == 1 then
Node = rtGrid:Find("L"):GetComponent("RectTransform")
Node.gameObject:SetActive(true)
rtGrid:Find("R").gameObject:SetActive(false)
else
Node = rtGrid:Find("R"):GetComponent("RectTransform")
Node.gameObject:SetActive(true)
rtGrid:Find("L").gameObject:SetActive(false)
end
if nIndex == self.curLayer then
Node:GetComponent("RectTransform"):Find("MapNode").gameObject:SetActive(false)
local CurMapNode = Node:Find("CurMapNode"):GetComponent("RectTransform")
CurMapNode.gameObject:SetActive(true)
local txtCurLevel = CurMapNode:Find("imgMapIconBg/txtLevelNum"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtCurLevel, orderedFormat(ConfigTable.GetUIText("StarTower_Level_Title_Layer") or "", tostring(nIndex) .. "/" .. tostring(self.nTotalLevel)))
local txtCurLevelName = CurMapNode:Find("imgMapIconBg/txtLevelName"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtCurLevelName, ConfigTable.GetUIText(AllEnum.StarTowerRoomName[roomType].Language))
local imgMapIcon = CurMapNode:Find("imgMapIconBg/imgMapIcon"):GetComponent("Image")
self:SetAtlasSprite(imgMapIcon, "10_ico", AllEnum.StarTowerRoomName[roomType].Icon)
else
Node:GetComponent("RectTransform"):Find("CurMapNode").gameObject:SetActive(false)
local MapNode = Node:Find("MapNode"):GetComponent("RectTransform")
MapNode.gameObject:SetActive(true)
local imgPlatform = MapNode:Find("imgPlatform"):GetComponent("Image")
local imgMapIcon = MapNode:Find("imgMapIcon"):GetComponent("Image")
local _, color = ColorUtility.TryParseHtmlString(AllEnum.StarTowerRoomName[roomType].Color)
NovaAPI.SetImageColor(imgPlatform, color)
self:SetAtlasSprite(imgMapIcon, "10_ico", AllEnum.StarTowerRoomName[roomType].Icon)
local txtLevel = MapNode:Find("txtLevelNum"):GetComponent("Text")
local txtLevelName = MapNode:Find("txtLevelName"):GetComponent("Text")
if mapData.Floor ~= -1 and mapData.Stage ~= -1 then
NovaAPI.SetText(txtLevel, tostring(mapData.Stage) .. "-" .. tostring(mapData.Floor))
NovaAPI.SetTextColor(txtLevel, color)
NovaAPI.SetText(txtLevelName, ConfigTable.GetUIText(AllEnum.StarTowerRoomName[roomType].Language))
NovaAPI.SetTextColor(txtLevelName, color)
if nIndex < self.curLayer then
NovaAPI.SetCanvasGroupAlpha(rtGrid:GetComponent("CanvasGroup"), 0.5)
end
else
NovaAPI.SetText(txtLevel, "")
NovaAPI.SetText(txtLevelName, "")
end
end
end
function StarTowerMapCtrl:ShowHorrorRoom()
self._mapNode.goHorrorRoom.gameObject:SetActive(true)
local MapNode = self._mapNode.rtHorrorRoom:Find("CurMapNode"):GetComponent("RectTransform")
local imgPlatform = MapNode:Find("imgPlatform"):GetComponent("Image")
local imgMapIcon = MapNode:Find("imgMapIconBg/imgMapIcon"):GetComponent("Image")
self:SetAtlasSprite(imgMapIcon, "10_ico", AllEnum.StarTowerRoomName[GameEnum.starTowerRoomType.HorrorRoom].Icon)
local txtLevel = MapNode:Find("imgMapIconBg/txtLevelNum"):GetComponent("TMP_Text")
local txtLevelName = MapNode:Find("imgMapIconBg/txtLevelName"):GetComponent("TMP_Text")
NovaAPI.SetTMPText(txtLevel, ConfigTable.GetUIText("StarTower_HorrorRoom_Layer"))
NovaAPI.SetTMPText(txtLevelName, ConfigTable.GetUIText("StarTower_Enter_HorrorRoomName"))
end
function StarTowerMapCtrl:RefreshBottomBtn()
local nUIType = GamepadUIManager.GetCurUIType()
if nUIType == AllEnum.GamepadUIType.Other then
self.nBottomIndex = 1
else
self.nBottomIndex = 2
end
self:OnScrollRectValueChanged()
end
function StarTowerMapCtrl:Awake()
self.nTime = 0
self.nClientRankTime = 0
self.nPos = 0
self._mapNode.safeAreaRoot:SetActive(false)
self.tbGamepadUINode = self:GetGamepadUINode()
self.nBottomIndex = 1
local tbConfig = {
{
sAction = "Back",
sLang = "ActionBar_Back"
},
{
sAction = "Giveup",
sLang = "ActionBar_GiveUp"
},
{
sAction = "Leave",
sLang = "ActionBar_Leave"
},
{
sAction = "Skill",
sLang = "ActionBar_Skill"
},
{
sAction = "Settings",
sLang = "ActionBar_Settings"
}
}
self._mapNode.ActionBar:InitActionBar(tbConfig)
end
function StarTowerMapCtrl:OnEnable()
self.tbStageInfo = nil
end
function StarTowerMapCtrl:OnDisable()
end
function StarTowerMapCtrl:OnDestroy()
end
function StarTowerMapCtrl:OnEvent_OpenStarTowerMap(tbStageInfo, nCurLayer, nStarTowerId, tbChar, bHorrorRoom, nTime, mapCharData, nTotalLevel)
PanelManager.InputDisable()
EventManager.Hit("StarTowerSetButtonEnable", false, false)
GamepadUIManager.EnableGamepadUI("StarTowerMapCtrl", self.tbGamepadUINode)
self.tbChar = tbChar
self.mapCharData = mapCharData
self.nTotalLevel = nTotalLevel
self._mapNode.blurBg:SetActive(true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.safeAreaRoot:SetActive(true)
self:Refresh(tbStageInfo, nCurLayer, nStarTowerId, bHorrorRoom, nTime)
self:RefreshBottomBtn()
end
cs_coroutine.start(wait)
end
function StarTowerMapCtrl:OnEvent_RefreshCheckGridStatus(nStatus)
self.nStatus = nStatus
end
function StarTowerMapCtrl:OnBtnClick_Close(btn)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
self:AddTimer(1, 0.2, "OnPanelClose", true, true, true, false)
EventManager.Hit(EventId.BattleDashboardVisible, true)
end
function StarTowerMapCtrl:OnBtnClick_Leave(btn)
EventManager.Hit(EventId.StarTowerLeave)
end
function StarTowerMapCtrl:OnPanelClose(_, bGiveUp)
PanelManager.InputEnable()
EventManager.Hit("StarTowerSetButtonEnable", true, true)
GamepadUIManager.DisableGamepadUI("StarTowerMapCtrl")
self._mapNode.safeAreaRoot:SetActive(false)
self._mapNode.blurBg:SetActive(false)
if bGiveUp then
EventManager.Hit("AbandonStarTower")
end
end
function StarTowerMapCtrl:OnBtnClick_GiveUp(btn)
local sContent
if self.bRank then
sContent = ConfigTable.GetUIText("StarTower_Ranking_Abandon_Tip")
else
sContent = ConfigTable.GetUIText("StarTower_Pause_Tips")
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = sContent or "",
callbackConfirm = function()
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
self:AddTimer(1, 0.2, "OnPanelClose", true, true, true, true)
end
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function StarTowerMapCtrl:OnBtnClick_ResetUp(btn)
self._mapNode.sv:SetScrollPos(1, 0.8)
end
function StarTowerMapCtrl:OnBtnClick_ResetDown(btn)
if self.nStatus == 1 then
self._mapNode.sv:SetScrollPos(self.nPos, 0.8)
end
end
function StarTowerMapCtrl:OnBtnClick_Skill(btn)
EventManager.Hit(EventId.OpenPanel, PanelId.PopupSkillPanel, self.tbChar, false, {}, self.mapCharData)
end
function StarTowerMapCtrl:OnBtnClick_Settings(btn)
EventManager.Hit(EventId.OpenPanel, PanelId.BattleSettings)
end
function StarTowerMapCtrl:OnScrollRectValueChanged()
if self.bVertical == nil then
return
end
local nPos = self._mapNode.sv.verticalNormalizedPosition
self._mapNode.btnResetTop.gameObject:SetActive(nPos < 0.99 and self.bVertical)
for i = 1, 2 do
if i == self.nBottomIndex then
self._mapNode.btnResetBot[i].gameObject:SetActive(nPos > self.nPos and self.bVertical)
else
self._mapNode.btnResetBot[i].gameObject:SetActive(false)
end
end
end
function StarTowerMapCtrl:OnEvent_StartClientRankTimer()
if nil == self.rankTimer then
self.rankTimer = self:AddTimer(0, 1, function()
self.nClientRankTime = self.nClientRankTime + 1
NovaAPI.SetTMPText(self._mapNode.txtBattleTime, self.nTime + self.nClientRankTime)
end, true, true, true)
end
end
function StarTowerMapCtrl:OnEvent_ResetClientRankTimer()
if nil ~= self.rankTimer then
self.rankTimer:Cancel()
end
self.rankTimer = nil
self.nClientRankTime = 0
end
function StarTowerMapCtrl:OnEvent_GamepadUIChange(sName, nBeforeType, nAfterType)
self:RefreshBottomBtn()
end
return StarTowerMapCtrl