Files
StellaSora_DataLua/lua/game/ui/activity/mathparkour/mathparkourctrl.lua
T
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

616 lines
21 KiB
Lua

local MathParkourCtrl = class("MathParkourCtrl", BaseCtrl)
local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
local WwiseAudioMgr = CS.WwiseAudioManager.Instance
MathParkourCtrl._mapNodeConfig = {
rtBuff = {
nCount = 5,
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourBuffCtrl"
},
txt_newScore = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_NewScore"
},
txt_targetScore = {sComponentName = "TMP_Text"},
imgActProgress = {sComponentName = "Image"},
StarItem = {nCount = 3},
obj_Time = {},
btnPause = {
sComponentName = "NaviButton",
callback = "OnBtnClick_Pause",
sAction = "MathParkour_Pause"
},
goChallenge = {
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourResultSuccessCtrl"
},
goFailure = {
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourResultFailCtrl"
},
goPause = {
sNodeName = "MathParkourPause",
sCtrlName = "Game.UI.Activity.MathParkour.MathParkourPauseCtrl"
},
btn_qte = {
sComponentName = "NaviButton",
callback = "OnBtnClick_QTE",
sAction = "MathParkour_QTE",
sActionIconType = "Dark"
},
goSmash = {},
imgSmasProgress = {sComponentName = "Image"},
txt_SmashScore = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_SmashScore"
},
btnClearthescene = {
sComponentName = "NaviButton",
callback = "OnBtnClick_ClearTheScene",
sAction = "MathParkour_Boom"
},
txt_Clearthescene = {
sComponentName = "TMP_Text",
nCount = 2,
sLanguageId = "MathParkour_Clearthescene"
},
imgProgress = {sComponentName = "Image"},
txt_Score1 = {
sComponentName = "TMP_Text",
sLanguageId = "MathParkour_Text_Score1"
},
txt_Score = {sComponentName = "TMP_Text"},
canvasGroup = {
sNodeName = "----SafeAreaRoot---",
sComponentName = "CanvasGroup"
}
}
MathParkourCtrl._mapEventConfig = {
MathParkour_AddScore = "OnEvent_AddScore",
MathParkour_BuffItemCollected = "OnEvent_AddBuff",
MathParkour_UseBuff = "OnEvent_UseBuff",
MathParkour_BuffConsumed = "OnEvent_BuffConsumed",
MathParkour_BoomTime = "OnEvent_BoomTime",
MathParkour_LevelEnd = "OnEvent_LevelEnd",
MathParkour_BossEncountered = "OnEvent_BossEncountered",
MathParkour_Confirm = "OnEvent_Confirm",
MathParkour_Again = "OnEvent_Again",
MathParkour_NextLevel = "OnEvent_GoNextLevel",
MathParkour_BuffTimeOut = "OnEvent_BuffTimeOut",
MathParkour_Exit_OnClick = "OnEvent_Exit",
MathParkour_Restart_OnClick = "OnEvent_Restart",
MathParkour_Continue_OnClick = "OnEvent_Continue",
MathParkour_EnterLevel = "OnEvent_EnterLevel",
MathParkour_BlockInput = "OnEvent_BlockInput",
MathParkour_GMRemoveBuff = "OnEvent_GMRemoveBuff",
MathParkour_GM_ToggleBuffOverlay = "OnEvent_GMToggleBuffOverlay",
MathParkour_GM_Pause = "OnEvent_GMPause"
}
MathParkourCtrl._mapRedDotConfig = {}
function MathParkourCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.nActId = param[1]
self.nLevelId = param[2]
end
self.tbGamepadUINode = self:GetGamepadUINode()
GamepadUIManager.AddGamepadUINode("MathParkourCtrl", self.tbGamepadUINode)
self:InitData()
self:UpdatePanelData()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 0)
end
function MathParkourCtrl:OnDestroy()
self:ClearGMBuffOverlay()
end
function MathParkourCtrl:InitData()
self.bPause = true
self.levelCfg = ConfigTable.GetData("MathParkourLevel", self.nLevelId)
self.cfg = ConfigTable.GetData("MathParkourConfig", self.levelCfg.ConfigId)
self.actData = PlayerData.Activity:GetActivityDataById(self.nActId)
self.CurLevelData = self.actData:GetLevelData(self.nLevelId)
self.nCurScore = 0
self.nStar = 0
self.bInResult = false
self:UpdateScore(0)
self.nAddBuffCount = 0
self.tbUsedBuffItem = {}
self.tbBuffItem = {}
self.bBossEncountered = false
for i = 1, 5 do
self.tbBuffItem[i] = self._mapNode.rtBuff[i]
self.tbBuffItem[i].gameObject:SetActive(false)
end
end
function MathParkourCtrl:UpdatePanelData()
self._mapNode.btnClearthescene.gameObject:SetActive(false)
self._mapNode.goChallenge:HidePanel()
self._mapNode.goFailure:HidePanel()
self._mapNode.obj_Time:SetActive(true)
local timeOutGo = self._mapNode.obj_Time.transform:Find("AnimRoot")
timeOutGo.gameObject:SetActive(false)
self:InitQTE()
self._mapNode.txt_Score1.gameObject:SetActive(self.bBossEncountered)
self._mapNode.txt_Score.gameObject:SetActive(self.bBossEncountered)
end
function MathParkourCtrl:InitQTE()
self._mapNode.goSmash.gameObject:SetActive(false)
self._mapNode.btn_qte.gameObject:SetActive(false)
if self.qteTimer ~= nil then
self.qteTimer:Cancel()
self.qteTimer = nil
end
self.nQte = 0
end
function MathParkourCtrl:StartGame()
local bNewLevel = self.actData:GetLevelIsNew(self.nLevelId)
if bNewLevel and self.levelCfg.DicId ~= 0 then
self.actData:EnterLevel(self.nLevelId)
EventManager.Hit(EventId.OpenPanel, PanelId.DictionaryEntry, self.levelCfg.DicId, true, function()
WwiseAudioMgr:PostEvent("Mode_400018_start")
self:AddTimer(1, 0.5, function()
local timeOutGo = self._mapNode.obj_Time.transform:Find("AnimRoot")
timeOutGo.gameObject:SetActive(true)
NovaAPI.DispatchEventWithData("MATHPARKOUR_STARTLEVEL", nil, nil)
EventManager.Hit(EventId.BlockInput, true)
self:AddTimer(1, 3.5, function()
self._mapNode.obj_Time:SetActive(false)
self.bPause = false
EventManager.Hit(EventId.BlockInput, false)
NovaAPI.DispatchEventWithData("MATHPARKOUR_START", nil, nil)
end, true, true, true)
end, true, true, true)
end)
else
EventManager.Hit(EventId.BlockInput, true)
WwiseAudioMgr:PostEvent("Mode_400018_start")
self:AddTimer(1, 0.5, function()
local timeOutGo = self._mapNode.obj_Time.transform:Find("AnimRoot")
timeOutGo.gameObject:SetActive(true)
NovaAPI.DispatchEventWithData("MATHPARKOUR_STARTLEVEL", nil, nil)
self:AddTimer(1, 3.5, function()
self._mapNode.obj_Time:SetActive(false)
self.bPause = false
EventManager.Hit(EventId.BlockInput, false)
NovaAPI.DispatchEventWithData("MATHPARKOUR_START", nil, nil)
end, true, true, true)
end, true, true, true)
self.actData:EnterLevel(self.nLevelId)
end
end
function MathParkourCtrl:ShowQTE()
NovaAPI.SetImageFillAmount(self._mapNode.imgSmasProgress, 0)
self._mapNode.goSmash.gameObject:SetActive(true)
self._mapNode.btn_qte.gameObject:SetActive(true)
self.qteTimer = self:AddTimer(0, 1, function()
self.nQte = self.nQte - self.cfg.QteProgressDeduction
self.nQte = math.max(self.nQte, 0)
NovaAPI.SetImageFillAmount(self._mapNode.imgSmasProgress, self.nQte / self.cfg.QteProgressLimit)
NovaAPI.DispatchEventWithData("MathParkour_SetQteSpeed", nil, {
self.nQte * self.cfg.QteSpeedFactor
})
end, true, true, true)
end
function MathParkourCtrl:RemoveBuff(nBuffId)
if self.tbUsedBuffItem[nBuffId] ~= nil then
local buffItem = self.tbUsedBuffItem[nBuffId]
table.insert(self.tbBuffItem, buffItem)
buffItem.gameObject:SetActive(false)
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", nBuffId)
if buffCfg.ObjType == GameEnum.MathParkourBuffType.Boom then
self._mapNode.btnClearthescene.gameObject:SetActive(false)
end
self.tbUsedBuffItem[nBuffId] = nil
NovaAPI.DispatchEventWithData("MathParkour_BuffRemoved", nil, {nBuffId})
end
end
function MathParkourCtrl:Remap(nValue, nInMin, nInMax, nOutMin, nOutMax)
if nInMax == nInMin then
return nOutMin
end
return nOutMin + (nValue - nInMin) / (nInMax - nInMin) * (nOutMax - nOutMin)
end
function MathParkourCtrl:UpdateScore(nAddScore)
self.nCurScore = math.max(self.nCurScore + nAddScore, 0)
NovaAPI.SetTMPText(self._mapNode.txt_targetScore, self.nCurScore)
self._mapNode.txt_newScore.gameObject:SetActive(self.nCurScore > self.CurLevelData.nScore)
local nStar = 0
if self.nCurScore >= self.levelCfg.Reward3Condition then
NovaAPI.SetImageFillAmount(self._mapNode.imgActProgress, 1)
nStar = 3
elseif self.nCurScore >= self.levelCfg.Reward2Condition then
local nTempScore = self.nCurScore - self.levelCfg.Reward2Condition
local amount = self:Remap(nTempScore / (self.levelCfg.Reward3Condition - self.levelCfg.Reward2Condition), 0, 1, 0, 0.33) + 0.66
NovaAPI.SetImageFillAmount(self._mapNode.imgActProgress, amount)
nStar = 2
elseif self.nCurScore >= self.levelCfg.Reward1Condition then
local nTempScore = self.nCurScore - self.levelCfg.Reward1Condition
local amount = self:Remap(nTempScore / (self.levelCfg.Reward2Condition - self.levelCfg.Reward1Condition), 0, 1, 0, 0.33) + 0.33
NovaAPI.SetImageFillAmount(self._mapNode.imgActProgress, amount)
nStar = 1
else
local amount = self:Remap(self.nCurScore / self.levelCfg.Reward1Condition, 0, 1, 0, 0.33)
NovaAPI.SetImageFillAmount(self._mapNode.imgActProgress, amount)
nStar = 0
end
for i = 1, 3 do
local star = self._mapNode.StarItem[i].transform:Find("ImgStarGray")
star.gameObject:SetActive(i > nStar)
end
self.nStar = nStar
end
function MathParkourCtrl:ApplyLogicPause(bPause)
if bPause then
NovaAPI.DispatchEventWithData("MATHPARKOUR_PAUSE_STATE_CHANGED", nil, {1})
EventManager.Hit("MathParkour_CastAssistSkillPause", true)
if self.tbUsedBuffItem ~= nil then
for _, v in pairs(self.tbUsedBuffItem) do
v:Pause(true)
end
end
WwiseAudioMgr:PostEvent("Mode_400018_all_pasue")
else
NovaAPI.DispatchEventWithData("MATHPARKOUR_PAUSE_STATE_CHANGED", nil, {0})
EventManager.Hit("MathParkour_CastAssistSkillPause", false)
if self.tbUsedBuffItem ~= nil then
for _, v in pairs(self.tbUsedBuffItem) do
v:Pause(false)
end
end
WwiseAudioMgr:PostEvent("Mode_400018_all_resume")
end
end
function MathParkourCtrl:IsLogicPaused()
return self.bPause == true or self.bGMPaused == true
end
function MathParkourCtrl:OnEvent_GMPause(bPause)
if bPause then
if self:IsLogicPaused() then
return
end
self.bGMPaused = true
self:ApplyLogicPause(true)
return
end
if not self.bGMPaused then
return
end
self.bGMPaused = false
if self:IsLogicPaused() then
return
end
self:ApplyLogicPause(false)
end
function MathParkourCtrl:OnBtnClick_Pause()
if self.bInResult then
return
end
self.bPause = true
self:ApplyLogicPause(true)
self._mapNode.goPause:Open(self.levelCfg.DicId)
end
function MathParkourCtrl:OnBtnClick_Start()
end
function MathParkourCtrl:OnBtnClick_ClearTheScene()
if self.tempClearSceneBuffId ~= nil and self.tbUsedBuffItem[self.tempClearSceneBuffId] ~= nil then
NovaAPI.DispatchEventWithData("MATHPARKOUR_CLEAR_THE_SCENE", nil, {
self.tempClearSceneBuffId
})
end
if self.tbUsedBuffItem[self.tempClearSceneBuffId] ~= nil then
local buffItem = self.tbUsedBuffItem[self.tempClearSceneBuffId]
table.insert(self.tbBuffItem, buffItem)
buffItem.gameObject:SetActive(false)
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", self.tempClearSceneBuffId)
if buffCfg.ObjType == GameEnum.MathParkourBuffType.Boom then
self._mapNode.btnClearthescene.gameObject:SetActive(false)
end
self.tbUsedBuffItem[self.tempClearSceneBuffId] = nil
end
end
function MathParkourCtrl:OnBtnClick_QTE()
self.nQte = self.nQte + self.cfg.QteProgressPerClick
self.nQte = math.min(self.nQte, self.cfg.QteProgressLimit)
NovaAPI.SetImageFillAmount(self._mapNode.imgSmasProgress, self.nQte / self.cfg.QteProgressLimit)
NovaAPI.DispatchEventWithData("MathParkour_SetQteSpeed", nil, {
self.nQte * self.cfg.QteSpeedFactor
})
end
function MathParkourCtrl:OnEvent_AddScore(nAddScore)
self:UpdateScore(nAddScore)
if self.bBossEncountered then
self.nBossScore = self.nBossScore + nAddScore
NovaAPI.SetTMPText(self._mapNode.txt_Score, "+" .. tostring(self.nBossScore))
end
end
function MathParkourCtrl:OnEvent_AddBuff(nBuffId)
self.nAddBuffCount = self.nAddBuffCount + 1
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", nBuffId)
if NovaAPI.IsEditorPlatform() then
print("MathParkourCtrl:OnEvent_AddBuff nBuffId=" .. tostring(nBuffId) .. "=====" .. buffCfg.Name)
end
if buffCfg.ObjType == GameEnum.MathParkourBuffType.Rocket then
NovaAPI.DispatchEventWithData("MathParkour_BuffAdded", nil, {nBuffId})
NovaAPI.DispatchEventWithData("MathParkour_BuffRemoved", nil, {nBuffId})
return
end
if self.tbUsedBuffItem[nBuffId] == nil then
local buffItem = self.tbBuffItem[1]
buffItem.gameObject:SetActive(true)
buffItem:ShowBuff(nBuffId, self:IsLogicPaused())
self.tbUsedBuffItem[nBuffId] = buffItem
if buffCfg.ObjType == GameEnum.MathParkourBuffType.Boom then
self._mapNode.btnClearthescene.gameObject:SetActive(true)
self.tempClearSceneBuffId = nBuffId
end
table.remove(self.tbBuffItem, 1)
NovaAPI.DispatchEventWithData("MathParkour_BuffAdded", nil, {nBuffId})
else
self.tbUsedBuffItem[nBuffId]:ShowBuff(nBuffId, self:IsLogicPaused())
end
end
function MathParkourCtrl:OnEvent_BuffTimeOut(nBuffId)
local cfg = ConfigTable.GetData("MathParkourBuffItem", nBuffId)
if cfg.ObjType == GameEnum.MathParkourBuffType.Boom then
self:OnBtnClick_ClearTheScene()
end
self:RemoveBuff(nBuffId)
end
function MathParkourCtrl:OnEvent_UseBuff(nBuffId)
self:RemoveBuff(nBuffId)
end
function MathParkourCtrl:OnEvent_BuffConsumed(nBuffId)
self:RemoveBuff(nBuffId)
end
function MathParkourCtrl:OnEvent_BoomTime(fTime)
NovaAPI.SetImageFillAmount(self._mapNode.imgProgress, fTime)
end
function MathParkourCtrl:OnEvent_LevelEnd(bResult)
self:ClearGMBuffOverlay()
self.bInResult = true
if bResult then
local nNextLevelId = self.actData:GetNextLevelId(self.nLevelId)
self._mapNode.goChallenge:ShowPanel(self.nCurScore, self.nCurScore > self.CurLevelData.nScore, self.nStar, nNextLevelId ~= nil, self.nActId)
else
self._mapNode.goFailure:ShowPanel(self.nCurScore)
end
self.actData:DoResult(self.nLevelId, bResult, self.nCurScore, self.nStar, self.nAddBuffCount)
end
function MathParkourCtrl:OnEvent_BossEncountered()
EventManager.Hit(EventId.TemporaryBlockInput, 1.6)
EventManager.Hit("MathParkour_CastAssistSkill", 140, 14001)
self:AddTimer(1, 1.66, function()
self.bBossEncountered = true
self:ShowQTE()
self._mapNode.txt_Score1.gameObject:SetActive(self.bBossEncountered)
self._mapNode.txt_Score.gameObject:SetActive(self.bBossEncountered)
self.nBossScore = 0
NovaAPI.SetTMPText(self._mapNode.txt_Score, "+" .. tostring(self.nBossScore))
end, true, true, true)
end
function MathParkourCtrl:OnEvent_Confirm()
if NovaAPI.GetCurrentModuleName() == "MainMenuModuleScene" then
CS.AdventureModuleHelper.LevelStateChanged(true, 0, false)
EventManager.Hit(EventId.CloesCurPanel)
PlayerData.Base:OnBackToMainMenuModule()
else
NovaAPI.EnterModule("MainMenuModuleScene", true)
end
end
function MathParkourCtrl:OnEvent_Again()
NovaAPI.DispatchEventWithData("MathParkour_Restart", nil, nil)
self:InitData()
self:UpdatePanelData()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 0)
end
function MathParkourCtrl:OnEvent_GoNextLevel()
local nNextLevelId = self.actData:GetNextLevelId(self.nLevelId)
if nNextLevelId == nil then
return
end
WwiseAudioMgr:PostEvent("Mode_400018_all_stop")
self.nLevelId = nNextLevelId
self:AddTimer(1, 0.1, function()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 0)
end, true, true, true)
self:InitData()
self:UpdatePanelData()
local param = {}
table.insert(param, tostring(self.nActId))
table.insert(param, tostring(self.CurLevelData.nId))
table.insert(param, tostring(0))
CS.MiniGameHelper.SetMiniGameData(param)
NovaAPI.DispatchEventWithData("MathParkour_NextLevel", nil, nil)
end
function MathParkourCtrl:OnEvent_Exit()
WwiseAudioMgr:PostEvent("Mode_400018_all_stop")
if NovaAPI.GetCurrentModuleName() == "MainMenuModuleScene" then
CS.AdventureModuleHelper.LevelStateChanged(true, 0, false)
EventManager.Hit(EventId.CloesCurPanel)
PlayerData.Base:OnBackToMainMenuModule()
else
NovaAPI.EnterModule("MainMenuModuleScene", true)
end
end
function MathParkourCtrl:OnEvent_Restart()
WwiseAudioMgr:PostEvent("Mode_400018_all_stop")
self._mapNode.goPause:Close()
NovaAPI.DispatchEventWithData("MathParkour_Restart", nil, nil)
self:AddTimer(1, 0.1, function()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 0)
end, true, true, true)
self:InitData()
self:UpdatePanelData()
end
function MathParkourCtrl:OnEvent_Continue()
self._mapNode.goPause:Close()
self.bPause = false
if self:IsLogicPaused() then
return
end
self:ApplyLogicPause(false)
end
function MathParkourCtrl:OnEvent_EnterLevel()
local animator = self.gameObject:GetComponent("Animator")
if animator ~= nil then
animator:Play("MathParkourPanel_in")
end
NovaAPI.SetCanvasGroupAlpha(self._mapNode.canvasGroup, 1)
self:StartGame()
end
function MathParkourCtrl:OnEvent_BlockInput(bBlock)
EventManager.Hit(EventId.BlockInput, bBlock)
end
function MathParkourCtrl:OnEvent_GMRemoveBuff(nBuffId)
self:RemoveBuff(nBuffId)
end
function MathParkourCtrl:OnEvent_GMToggleBuffOverlay()
self.bGMBuffOverlay = not self.bGMBuffOverlay
if self.bGMBuffOverlay then
self:EnsureGMBuffOverlay()
self:RefreshGMBuffOverlay()
if self.gmOverlayTimer == nil then
self.gmOverlayTimer = self:AddTimer(0, 0.5, function()
if self.bGMBuffOverlay then
self:RefreshGMBuffOverlay()
end
end, true, true, true)
else
self.gmOverlayTimer:Pause(false)
end
else
if self.goGMBuffOverlay ~= nil and not self.goGMBuffOverlay:IsNull() then
self.goGMBuffOverlay:SetActive(false)
end
if self.gmOverlayTimer ~= nil then
self.gmOverlayTimer:Pause(true)
end
end
end
local GM_OVERLAY_COL_MAX = 4
local GetGMOverlayFont = function(trParent)
local srcTxt = trParent:GetComponentInChildren(typeof(CS.UnityEngine.UI.Text))
if srcTxt ~= nil and srcTxt.font ~= nil then
return srcTxt.font
end
local ok, builtinFont = pcall(function()
return CS.UnityEngine.Resources.GetBuiltinResource(typeof(CS.UnityEngine.Font), "LegacyRuntime.ttf")
end)
if ok then
return builtinFont
end
return nil
end
local CreateGMOverlayText = function(goParent, sName, font)
local go = CS.UnityEngine.GameObject(sName, typeof(CS.UnityEngine.RectTransform))
go.layer = goParent.layer
go.transform:SetParent(goParent.transform, false)
local txt = go:AddComponent(typeof(CS.UnityEngine.UI.Text))
txt.fontSize = 22
txt.color = CS.UnityEngine.Color.black
txt.alignment = CS.UnityEngine.TextAnchor.UpperLeft
txt.horizontalOverflow = CS.UnityEngine.HorizontalWrapMode.Overflow
txt.verticalOverflow = CS.UnityEngine.VerticalWrapMode.Overflow
txt.raycastTarget = false
if font ~= nil then
txt.font = font
end
return txt
end
local StretchGMOverlayText = function(txt, nAnchorMinX, nAnchorMaxX)
local rt = txt:GetComponent("RectTransform")
rt.anchorMin = Vector2(nAnchorMinX, 0)
rt.anchorMax = Vector2(nAnchorMaxX, 1)
rt.pivot = Vector2(0.5, 1)
rt.offsetMin = Vector2(8, 0)
rt.offsetMax = Vector2(-8, 0)
end
function MathParkourCtrl:EnsureGMBuffOverlay()
if self.goGMBuffOverlay ~= nil and not self.goGMBuffOverlay:IsNull() and self.txtGMBuffOverlayRight ~= nil then
self.goGMBuffOverlay:SetActive(true)
return
end
if self.goGMBuffOverlay ~= nil and not self.goGMBuffOverlay:IsNull() then
destroy(self.goGMBuffOverlay)
end
local parent = self._mapNode.canvasGroup.transform
local go = CS.UnityEngine.GameObject("GMBuffOverlay", typeof(CS.UnityEngine.RectTransform))
go.layer = parent.gameObject.layer
go.transform:SetParent(parent, false)
local rt = go:GetComponent("RectTransform")
rt.anchorMin = Vector2(0.5, 0.5)
rt.anchorMax = Vector2(0.5, 0.5)
rt.pivot = Vector2(0.5, 1)
rt.anchoredPosition = Vector2(0, -90)
rt.sizeDelta = Vector2(560, 180)
local font = GetGMOverlayFont(parent)
local txtLeft = CreateGMOverlayText(go, "txtLeft", font)
local txtRight = CreateGMOverlayText(go, "txtRight", font)
StretchGMOverlayText(txtLeft, 0, 1)
StretchGMOverlayText(txtRight, 0.5, 1)
txtRight.gameObject:SetActive(false)
self.goGMBuffOverlay = go
self.txtGMBuffOverlay = txtLeft
self.txtGMBuffOverlayRight = txtRight
end
function MathParkourCtrl:RefreshGMBuffOverlay()
if self.txtGMBuffOverlay == nil then
return
end
local tbLines = {}
for nBuffId, buffCtrl in pairs(self.tbUsedBuffItem) do
local buffCfg = ConfigTable.GetData("MathParkourBuffItem", nBuffId)
local sName = buffCfg ~= nil and buffCfg.Name or tostring(nBuffId)
local nTime = buffCtrl.nCurTime or 0
table.insert(tbLines, {
nId = nBuffId,
sText = string.format("%s %02d:%02d", sName, math.floor(nTime / 60), nTime % 60)
})
end
table.sort(tbLines, function(a, b)
return a.nId < b.nId
end)
local JoinLines = function(nFrom, nTo)
local s = "当前效果:\n"
if nTo < nFrom then
return s .. "(无)"
end
for i = nFrom, nTo do
s = s .. tbLines[i].sText .. "\n"
end
return s
end
local nCount = #tbLines
local bTwoCol = nCount > GM_OVERLAY_COL_MAX
if not bTwoCol then
StretchGMOverlayText(self.txtGMBuffOverlay, 0, 1)
self.txtGMBuffOverlay.alignment = CS.UnityEngine.TextAnchor.UpperCenter
NovaAPI.SetText(self.txtGMBuffOverlay, JoinLines(1, nCount))
if self.txtGMBuffOverlayRight ~= nil then
self.txtGMBuffOverlayRight.gameObject:SetActive(false)
end
return
end
local nLeft = math.ceil(nCount / 2)
StretchGMOverlayText(self.txtGMBuffOverlay, 0, 0.5)
self.txtGMBuffOverlay.alignment = CS.UnityEngine.TextAnchor.UpperLeft
NovaAPI.SetText(self.txtGMBuffOverlay, JoinLines(1, nLeft))
self.txtGMBuffOverlayRight.gameObject:SetActive(true)
self.txtGMBuffOverlayRight.alignment = CS.UnityEngine.TextAnchor.UpperLeft
local sRight = ""
for i = nLeft + 1, nCount do
sRight = sRight .. tbLines[i].sText .. "\n"
end
NovaAPI.SetText(self.txtGMBuffOverlayRight, "\n" .. sRight)
end
function MathParkourCtrl:ClearGMBuffOverlay()
self.bGMBuffOverlay = false
if self.gmOverlayTimer ~= nil then
self.gmOverlayTimer:Cancel()
self.gmOverlayTimer = nil
end
if self.goGMBuffOverlay ~= nil and not self.goGMBuffOverlay:IsNull() then
destroy(self.goGMBuffOverlay)
end
self.goGMBuffOverlay = nil
self.txtGMBuffOverlay = nil
self.txtGMBuffOverlayRight = nil
end
return MathParkourCtrl