Files
StellaSora_DataLua/lua/game/ui/play_cookie/cookieboardctrl.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

1468 lines
48 KiB
Lua

local GamepadUIManager = require("GameCore.Module.GamepadUIManager")
local CookieBoardCtrl = class("CookieBoardCtrl", BaseCtrl)
CookieBoardCtrl._mapNodeConfig = {
goBlur = {},
ScoreBoardRhythm = {
sCtrlName = "Game.UI.Play_Cookie.CookieScoreBoardCtrl"
},
ScoreBoardOther = {
sCtrlName = "Game.UI.Play_Cookie.CookieScoreBoardCtrl"
},
btnBackReal = {sComponentName = "NaviButton", callback = "OnBtn_Back"},
btnPauseReal = {sComponentName = "NaviButton", callback = "OnBtn_Back"},
txtTotalScore = {sComponentName = "TMP_Text"},
txtTimerResume = {sNodeName = "txtTime", sComponentName = "TMP_Text"},
txtAddTime = {sComponentName = "TMP_Text"},
txtScoreCalculator = {sComponentName = "TMP_Text"},
animScoreCalculator = {
sNodeName = "imgScoreCalculator",
sComponentName = "Animator"
},
imgScoreCalculatorFiller = {
sComponentName = "RectTransform"
},
animScoreCalculatorFiller = {
sNodeName = "imgScoreCalculatorFiller",
sComponentName = "Animator"
},
imgFillerLight = {},
btnConfirmScore = {
sComponentName = "UIButton",
callback = "OnBtn_ConfirmGameOver"
},
btnShortcutConfirmScore = {
sComponentName = "NaviButton",
callback = "OnBtn_ConfirmGameOver",
sAction = "Confirm"
},
goResult = {},
animResult = {sNodeName = "goResult", sComponentName = "Animator"},
goCookieGridList = {
sComponentName = "RectTransform"
},
CookieGameBoard3x3 = {},
CookieGameBoard4x4 = {},
goNextBoard4 = {},
goNextBoard3 = {},
goNextTwoBoard4 = {},
goNextTwoBoard3 = {},
txtTimer = {sComponentName = "TMP_Text"},
btnA = {
sComponentName = "NaviButton",
callback = "OnBtn_A",
sAction = "CookieLeft"
},
btnB = {
sComponentName = "NaviButton",
callback = "OnBtn_B",
sAction = "CookieUp"
},
btnC = {
sComponentName = "NaviButton",
callback = "OnBtn_C",
sAction = "CookieRight"
},
btnStart = {
sNodeName = "txtStart",
sComponentName = "NaviButton",
callback = "OnBtn_GameStart",
sAction = "Confirm"
},
txtStartTip = {
sComponentName = "TMP_Text",
sLanguageId = "Cookie_Act_Start_Tip"
},
txtStartTMP = {
sComponentName = "TMP_Text",
sLanguageId = "Cookie_Act_GameStart"
},
txtRhythmStart = {
sComponentName = "TMP_Text",
sLanguageId = "Cookie_Act_Rhythm_Tip"
},
goHitEffect = {},
animCriticalPerfectEff = {
sNodeName = "imgCriticalPerfectEff",
sComponentName = "Animator"
},
animPerfectEff = {
sNodeName = "imgPerfectEff",
sComponentName = "Animator"
},
animExcellentEff = {
sNodeName = "imgExcellentEff",
sComponentName = "Animator"
},
animMissEff = {sNodeName = "imgMissEff", sComponentName = "Animator"},
txtPerfectCombo = {sComponentName = "TMP_Text"},
goBlurRes = {},
imgScoreNMBg = {},
imgScoreNormalBg = {},
txtMissCount = {
sComponentName = "TMP_Text",
sLanguageId = "Cookie_Act_Miss_Count"
},
txtBoxCount = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Cookie_Act_Box_Count"
},
txtBoxCountNumNM = {sComponentName = "TMP_Text"},
txtBoxCountNumNormal = {sComponentName = "TMP_Text"},
txtCookieCount = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Cookie_Act_Cookie_Count"
},
txtCookieCountNumNM = {sComponentName = "TMP_Text"},
txtCookieCountNumNormal = {sComponentName = "TMP_Text"},
txtTips = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "Tips_Continue"
},
txtClickPre = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Click_Pre"
},
txtClickSuf = {
nCount = 2,
sComponentName = "TMP_Text",
sLanguageId = "StarTower_Click_Suf"
},
goRhythmDots = {},
imgDotInner = {nCount = 4},
imgLight = {nCount = 4},
animRoot = {
sNodeName = "----SafeAreaRoot----",
sComponentName = "Animator"
},
animHeart = {
nCount = 5,
sNodeName = "imgHeartHealth",
sComponentName = "Animator"
},
animTime = {sNodeName = "imgTimeBg", sComponentName = "Animator"},
goNoteIndicator = {},
imgIndicatorPerfect = {},
imgIndicatorGreat = {},
imgIndicatorMiss = {}
}
CookieBoardCtrl._mapEventConfig = {
CookieRequestCtrl = "OnEvent_CookieRequestCtrl"
}
local nPerfectTiming = 1.067
local sDefaultStartAnim = "CookieBoard_in"
local nPreMusicTime = 4
local nFillerMinSize = 25
local nFillerMaxSize = 527.5
local tbResultAnim = {
[GameEnum.CookiePackModel.CookiePackNormalModel] = "CookieBoard_OtherResult",
[GameEnum.CookiePackModel.CookiePackPathsModel] = "CookieBoard_OtherResult",
[GameEnum.CookiePackModel.CookiePackRhythmlModel] = "CookieBoard_RhythmResult",
[GameEnum.CookiePackModel.CookiePackComplexModel] = "CookieBoard_RhythmResult"
}
function CookieBoardCtrl:GameInit()
self._mapNode.txtTimer.gameObject:SetActive(true)
self.nTimeCount = 0.0
self.nFixedTimer = 0.0
self.nBeatsTimer = 0.0
self.nDisposalBeatTimer = 0.0
self.nNextHaloAnim = 0.0
self.nWaitingNextBeat = 0
self.nCurrGridIndex = 1
self.nCurrBoardIndex = 1
self.nCurrLevelConfigIdx = 1
self.nCurrGird = {1, 1}
self.nScore = 0
self.nCompBoxCount = 0
self.nCompCookieCount = 0
self.bFullCombo = true
self.bAllPerfect = true
self.bPressed = false
self.nCurHealth = 0
self:UpdateActiveButtons()
self:ApplyButtonActivation()
if self.nPackModel == GameEnum.CookiePackModel.CookiePackPathsModel or self.nPackModel == GameEnum.CookiePackModel.CookiePackComplexModel then
self.nPathGroupId = self.tbFloor[self.nCurrLevelConfigIdx].PackagePathsGroupId
end
if self.nPackModel == GameEnum.CookiePackModel.CookiePackRhythmlModel or self.nPackModel == GameEnum.CookiePackModel.CookiePackComplexModel then
self.nHitThreshold = self.tbFloor[self.nCurrLevelConfigIdx].PreRange / 100
self.nBeatInterval = 60 / self.tbFloor[self.nCurrLevelConfigIdx].RhythmlTime
end
self:GetScoreFactors()
self:RefreshCountDownTimer()
self.bPaused = false
self.nPerfectCount = 0
self.nPerfectCombo = 0
self.nPerfectTemp = 0
self.nCriticalPerfectCount = 0
self.nGoodCount = 0
self.nMissCount = 0
self.bCurrNoteHit = false
self.bMissSwitch = false
self.bShowBeatLight = false
self.bNewBeat = true
self.nBoardSize = self.tbFloor[self.nCurrLevelConfigIdx].Size
self:RoundStart()
self:RefreshNextBoards()
end
function CookieBoardCtrl:UpdateActiveButtons()
local tbButtonsConfig = self.tbFloor[self.nCurrLevelConfigIdx].Buttons
self.tbActiveCookieTypes = {}
self.tbActiveButtonNames = {}
if tbButtonsConfig == nil or #tbButtonsConfig == 0 then
self.tbActiveCookieTypes = {
1,
2,
3
}
self.tbActiveButtonNames = {
"A",
"B",
"C"
}
else
for _, nCookieType in ipairs(tbButtonsConfig) do
table.insert(self.tbActiveCookieTypes, nCookieType)
if nCookieType == 1 then
table.insert(self.tbActiveButtonNames, "A")
elseif nCookieType == 2 then
table.insert(self.tbActiveButtonNames, "B")
elseif nCookieType == 3 then
table.insert(self.tbActiveButtonNames, "C")
end
end
end
end
function CookieBoardCtrl:ApplyButtonActivation()
local IsButtonActive = function(sButtonName)
for _, name in ipairs(self.tbActiveButtonNames) do
if name == sButtonName then
return true
end
end
return false
end
self._mapNode.btnA.gameObject:SetActive(IsButtonActive("A"))
self._mapNode.btnB.gameObject:SetActive(IsButtonActive("B"))
self._mapNode.btnC.gameObject:SetActive(IsButtonActive("C"))
end
function CookieBoardCtrl:RoundStart()
if nil ~= self.CookieGameBoard then
self.CookieGameBoard:SetActive(false)
end
self:GetBoardData()
if nil ~= self.CookieGameBoard then
self.CookieGameBoard:SetActive(true)
self.goCookieGridList = self.CookieGameBoard.transform:Find("goCookieGridList")
self.trBoardersVertical = self.CookieGameBoard.transform:Find("goBoardersVertical").transform
self.trBoardersHorizontal = self.CookieGameBoard.transform:Find("goBoardersHorizontal").transform
end
for i = 1, #self._mapNode.imgDotInner do
local imgDot = self._mapNode.imgDotInner[i]
if imgDot ~= nil then
imgDot.gameObject:SetActive(false)
end
end
for i = 1, #self._mapNode.imgLight do
local imgDot = self._mapNode.imgLight[i]
if imgDot ~= nil then
imgDot.gameObject:SetActive(false)
end
end
self:RefreshBoard()
end
function CookieBoardCtrl:GetBoardData()
local nGoalBoxNum = 0
if self.nCurrLevelConfigIdx + 1 <= #self.tbFloor then
nGoalBoxNum = self.tbFloor[self.nCurrLevelConfigIdx + 1].PackageNum
else
nGoalBoxNum = self.nCurrBoardIndex
end
if self.nCurrLevelConfigIdx < #self.tbFloor and nGoalBoxNum < self.nCurrBoardIndex then
self.nCurrLevelConfigIdx = self.nCurrLevelConfigIdx + 1
self.nBoardSize = self.tbFloor[self.nCurrLevelConfigIdx].Size
if self.nPackModel == GameEnum.CookiePackModel.CookiePackPathsModel or self.nPackModel == GameEnum.CookiePackModel.CookiePackComplexModel then
self.nPathGroupId = self.tbFloor[self.nCurrLevelConfigIdx].PackagePathsGroupId
end
if self.nPackModel == GameEnum.CookiePackModel.CookiePackRhythmlModel or self.nPackModel == GameEnum.CookiePackModel.CookiePackComplexModel then
self.nHitThreshold = self.tbFloor[self.nCurrLevelConfigIdx].PreRange / 100
local nPrevBeat = self.nBeatInterval
self.nBeatInterval = 60 / self.tbFloor[self.nCurrLevelConfigIdx].RhythmlTime
if nPrevBeat ~= self.nBeatInterval then
self.bShowBeatLight = true
end
end
self:UpdateActiveButtons()
self:ApplyButtonActivation()
end
self.tbGrid, self.tbPath = self:GenerateBoard(not self.bPipelineMode)
self.CookieGameBoard = self.nBoardSize == 3 and self._mapNode.CookieGameBoard3x3 or self._mapNode.CookieGameBoard4x4
end
function CookieBoardCtrl:RefreshBoard()
self:ResetEff()
self:UnbindGridCtrl()
if self.trBoardersVertical ~= nil then
for i = 0, self.trBoardersVertical.childCount - 1 do
local child = self.trBoardersVertical:GetChild(i)
if child ~= nil then
child.gameObject:SetActive(false)
end
end
end
if self.trBoardersHorizontal ~= nil then
for i = 0, self.trBoardersHorizontal.childCount - 1 do
local child = self.trBoardersHorizontal:GetChild(i)
if child ~= nil then
child.gameObject:SetActive(false)
end
end
end
local nGridNum = self.nBoardSize * self.nBoardSize
for i = 1, nGridNum do
local m = self.tbPath[i][1]
local n = self.tbPath[i][2]
local nTbIndex = (m - 1) * self.nBoardSize + n
local goGrid = self.goCookieGridList:GetChild(nTbIndex - 1)
goGrid.gameObject:SetActive(true)
local currCtrl = self:BindCtrlByNode(goGrid, "Game.UI.Play_Cookie.CookieGridCtrl")
self.tbGridCtrl[nTbIndex] = currCtrl
self.tbGridCtrl[nTbIndex]:Init(self.tbGrid[m][n], self.nHitThreshold, self.nPerfectThreshold)
if self.bPipelineMode then
local tbBorders = {
true,
true,
true,
true
}
local nNext = i + 1
if nGridNum >= nNext then
local j = self.tbPath[nNext][1]
local k = self.tbPath[nNext][2]
if j == m + 1 and k == n then
tbBorders[2] = false
end
if j == m - 1 and k == n then
tbBorders[1] = false
end
if k == n + 1 and j == m then
tbBorders[4] = false
end
if k == n - 1 and j == m then
tbBorders[3] = false
end
end
local nPrev = i - 1
if 1 <= nPrev then
local j = self.tbPath[nPrev][1]
local k = self.tbPath[nPrev][2]
if j + 1 == m and k == n then
tbBorders[1] = false
end
if j - 1 == m and k == n then
tbBorders[2] = false
end
if k + 1 == n and j == m then
tbBorders[3] = false
end
if k - 1 == n and j == m then
tbBorders[4] = false
end
end
local tbBoarderGo = self:GetGridBorders(m, n)
for idx, bActive in ipairs(tbBorders) do
local goBoarder = tbBoarderGo[idx]
if goBoarder ~= nil then
goBoarder.gameObject:SetActive(bActive)
end
end
end
end
self.nextCtrl = self.tbGridCtrl[1]
self.currCtrl = self.tbGridCtrl[1]
end
function CookieBoardCtrl:GetGridBorders(m, n)
local up, down, left, right
local size = self.nBoardSize or 0
if size <= 0 or self.trBoardersHorizontal == nil or self.trBoardersVertical == nil then
return {
up,
down,
left,
right
}
end
local getHorizontal = function(rowIndex, colIndex)
if rowIndex < 1 or rowIndex > size then
return nil
end
if colIndex < 1 or colIndex > size then
return nil
end
local boarder = self.trBoardersHorizontal:Find("boarder" .. rowIndex .. "_" .. colIndex)
return boarder
end
local getVertical = function(rowIndex, colIndex)
if colIndex < 1 or colIndex > size then
return nil
end
if rowIndex < 1 or rowIndex > size then
return nil
end
local boarder = self.trBoardersVertical:Find("boarder" .. rowIndex .. "_" .. colIndex)
return boarder
end
up = getVertical(m - 1, n)
down = getVertical(m, n)
left = getHorizontal(m, n - 1)
right = getHorizontal(m, n)
return {
up,
down,
left,
right
}
end
function CookieBoardCtrl:GetScoreFactors()
self.nCriticalPerfectFactorA = 0
self.nCriticalPerfectFactorB = 0.0
self.nPerfectFactorA = 0
self.nPerfectFactorB = 0.0
self.nGoodFactorA = 0
self.nGoodFactorB = 0.0
local mapCPF = ConfigTable.GetData("CookieRhythmlResult", GameEnum.CookieRhythmlResult.Excellent)
if mapCPF ~= nil then
if mapCPF.AddScoreType == 1 then
self.nCriticalPerfectFactorA = mapCPF.AddScore
else
self.nCriticalPerfectFactorB = mapCPF.AddScore / 100
end
end
local mapPF = ConfigTable.GetData("CookieRhythmlResult", GameEnum.CookieRhythmlResult.Perfect)
if mapPF ~= nil then
if mapPF.AddScoreType == 1 then
self.nPerfectFactorA = mapPF.AddScore
else
self.nPerfectFactorB = mapPF.AddScore / 100
end
end
local mapGF = ConfigTable.GetData("CookieRhythmlResult", GameEnum.CookieRhythmlResult.Good)
if mapGF ~= nil then
if mapGF.AddScoreType == 1 then
self.nGoodFactorA = mapGF.AddScore
else
self.nGoodFactorB = mapGF.AddScore / 100
end
end
end
function CookieBoardCtrl:RefreshNextBoards()
local nGoalBoxNum = 0
if self.nCurrLevelConfigIdx + 1 <= #self.tbFloor then
nGoalBoxNum = self.tbFloor[self.nCurrLevelConfigIdx + 1].PackageNum
else
nGoalBoxNum = self.nCurrBoardIndex
end
self._mapNode.goNextBoard4:SetActive(false)
self._mapNode.goNextBoard3:SetActive(false)
self._mapNode.goNextTwoBoard4:SetActive(false)
self._mapNode.goNextTwoBoard3:SetActive(false)
local nNextBoardSize = 3
local nNextTwoBoardSize = 3
local nLevelConfigIdx = self.nCurrLevelConfigIdx < #self.tbFloor and self.nCurrLevelConfigIdx + 1 or self.nCurrLevelConfigIdx
if nGoalBoxNum <= self.nCurrBoardIndex then
nNextBoardSize = self.tbFloor[nLevelConfigIdx].Size
nNextTwoBoardSize = self.tbFloor[nLevelConfigIdx].Size
elseif nGoalBoxNum <= self.nCurrBoardIndex + 1 then
nNextTwoBoardSize = self.tbFloor[nLevelConfigIdx].Size
end
if nNextBoardSize == 3 then
self._mapNode.goNextBoard3:SetActive(true)
else
self._mapNode.goNextBoard4:SetActive(true)
end
if nNextTwoBoardSize == 3 then
self._mapNode.goNextTwoBoard3:SetActive(true)
else
self._mapNode.goNextTwoBoard4:SetActive(true)
end
end
function CookieBoardCtrl:SelectionForward()
self.nCurrGridIndex = self.nCurrGridIndex + 1
if self.nCurrGridIndex > #self.tbPath then
self.nCompBoxCount = self.nCompBoxCount + 1
self:CalculateScore()
self.nCurrGridIndex = 1
self.nCurrGird = {1, 1}
self.nextCtrl = nil
if self.bRhythmMode then
self.nWaitingNextBeat = 2
self:PauseGameCtrl()
else
self:NextBox()
end
return
end
self.nCurrGird = self.tbPath[self.nCurrGridIndex]
nTbIndex = (self.nCurrGird[1] - 1) * self.nBoardSize + self.nCurrGird[2]
local nextCtrl = self.tbGridCtrl[nTbIndex]
if nil ~= nextCtrl then
nextCtrl:SetSelect(true)
self.nextCtrl = nextCtrl
end
end
function CookieBoardCtrl:NextBox()
self.nCurrBoardIndex = self.nCurrBoardIndex + 1
NovaAPI.SetTMPText(self._mapNode.txtBoxCountNumNM, self.nCompBoxCount)
NovaAPI.SetTMPText(self._mapNode.txtBoxCountNumNormal, self.nCompBoxCount)
NovaAPI.CtrlDotweenAnimation(self._mapNode.txtBoxCountNumNM.gameObject, 2)
NovaAPI.CtrlDotweenAnimation(self._mapNode.txtBoxCountNumNM.gameObject, 1)
NovaAPI.CtrlDotweenAnimation(self._mapNode.txtBoxCountNumNormal.gameObject, 2)
NovaAPI.CtrlDotweenAnimation(self._mapNode.txtBoxCountNumNormal.gameObject, 1)
self:SetEnvironmentBeat(false)
self:DisableGrids()
self:PauseGameCtrl()
self.bBlockInput = true
EventManager.Hit(EventId.BlockInput, true)
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animRoot, {
"CookieBoard_next"
})
self:AddTimer(1, nAnimLength, function()
self:RefreshNextBoards()
self:RoundStart()
end, true, true, true)
if self.bRhythmMode then
local nBeat = self.nBeatInterval or 0
if 0 < nBeat then
nAnimLength = math.ceil(nAnimLength / nBeat) * nBeat
end
end
self._mapNode.animRoot:Play("CookieBoard_next", 0, 0)
if self.timerNextBox ~= nil then
self.timerNextBox:Cancel()
self.timerNextBox = nil
end
self.timerNextBox = self:AddTimer(1, nAnimLength, function()
local nextboxcb = function()
self.nFixedTimer = 0
self.nBeatsTimer = 0
self.nPrevTime = CS.UnityEngine.Time.time
self.bMissSwitch = false
self.bCurrNoteHit = false
self.bCurrNoteClicked = false
self.bPressed = false
self.bPaused = false
self.bNewBeat = true
self.bBlockInput = false
if self.timerBeat ~= nil then
self.timerBeat:Cancel()
end
self.timerBeat = self:AddTimer(0, self.nBeatInterval, self.OnEvent_Beat, true, true, true)
if self.timerRound ~= nil then
self.timerRound:Cancel()
end
self.timerRound = self:AddTimer(0, 0.034, self.OnEvent_Time, true, true, true)
local sEvent = self:GetSwitchBoxSoundEvent()
CS.WwiseAudioManager.Instance:PostEvent(sEvent)
self:SetEnvironmentBeat(true)
self.tbGridCtrl[1]:SetSelect(true)
EventManager.Hit(EventId.BlockInput, false)
end
if self.bRhythmMode and self.bShowBeatLight then
self.bShowBeatLight = false
self:PlayRhythmStartTip(nextboxcb)
else
nextboxcb()
end
if self.bPipelineMode == true then
self:PlayPathEffect()
end
end, true, true, true)
end
function CookieBoardCtrl:GetSwitchBoxSoundEvent()
local nBPM = self.tbFloor[self.nCurrLevelConfigIdx].RhythmlTime
if nBPM ~= nil and nBPM <= 0 then
return "mode_freeTempo_setState"
end
local sEvent = "mode_" .. nBPM .. "Tempo_setState"
return sEvent
end
function CookieBoardCtrl:GetRhythmSwitchSoundEvent()
if self.bRhythmMode == false then
return
end
local nBPM = self.tbFloor[self.nCurrLevelConfigIdx].RhythmlTime
local sEvent = "mode_cookie_1_pre_" .. tostring(nBPM)
return sEvent
end
function CookieBoardCtrl:FillCurrentGrid(nInputCookie)
local nTbIndex = (self.nCurrGird[1] - 1) * self.nBoardSize + self.nCurrGird[2]
local nCurrShape = self.tbGridCtrl[nTbIndex]:GetGirdShape()
self.bCurrNoteClicked = true
if nCurrShape == nInputCookie then
if self.bRhythmMode then
self:NoteCheck()
else
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_putin")
self:FillSuccess()
end
else
self:FillFail(self.tbGridCtrl[nTbIndex])
end
self.bPressed = false
end
function CookieBoardCtrl:FillSuccess()
self.nCompCookieCount = self.nCompCookieCount + 1
self:CalculateScore()
NovaAPI.SetTMPText(self._mapNode.txtCookieCountNumNM, self.nCompCookieCount)
NovaAPI.SetTMPText(self._mapNode.txtCookieCountNumNormal, self.nCompCookieCount)
NovaAPI.CtrlDotweenAnimation(self._mapNode.txtCookieCountNumNM.gameObject, 2)
NovaAPI.CtrlDotweenAnimation(self._mapNode.txtCookieCountNumNM.gameObject, 1)
NovaAPI.CtrlDotweenAnimation(self._mapNode.txtCookieCountNumNormal.gameObject, 2)
NovaAPI.CtrlDotweenAnimation(self._mapNode.txtCookieCountNumNormal.gameObject, 1)
self.nCurrGird = self.tbPath[self.nCurrGridIndex]
local nTbIndex = (self.nCurrGird[1] - 1) * self.nBoardSize + self.nCurrGird[2]
self.currCtrl = self.tbGridCtrl[nTbIndex]
if nil ~= self.currCtrl then
self.currCtrl:SetSelect(false)
self.currCtrl:SetFilled()
end
if self.bRhythmMode then
self.bWaitingNextBeatNote = true
if self.nCurrGridIndex + 1 > #self.tbPath then
self.bBlockInput = true
EventManager.Hit(EventId.BlockInput, true)
end
else
self:SelectionForward()
end
end
function CookieBoardCtrl:FillFail(objCtrl)
local nBlockTime = ConfigTable.GetConfigNumber("Cookie_ErrorTime") or 0.5
if objCtrl ~= nil then
objCtrl:PlayWrongAnim(nBlockTime, self.bRhythmMode and self.bPipelineMode)
end
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_error")
if self.bRhythmMode then
self.nMissCount = self.nMissCount + 1
self.nHitType = GameEnum.CookieRhythmlResult.Miss
self.nPerfectTemp = 0
self.nPerfectCombo = 0
self.bFullCombo = false
self.bAllPerfect = false
if self.bPipelineMode then
self:LoseHeart()
end
else
EventManager.Hit(EventId.TemporaryBlockInput, nBlockTime)
end
self:CalculateScore()
end
function CookieBoardCtrl:LoseHeart()
self.nCurHealth = self.nCurHealth + 1
self._mapNode.animHeart[self.nCurHealth]:Play("CookieBoard_Heart_Lose")
if self.nCurHealth >= 5 then
self:LevelEnd()
return
end
end
function CookieBoardCtrl:PauseGameCtrl()
self.bPaused = true
end
function CookieBoardCtrl:ResumeGameCtrl()
self.bBlockInput = true
EventManager.Hit(EventId.BlockInput, true)
self._mapNode.animRoot:Play("CookieBoard_restart", 0, 0)
NovaAPI.SetTMPText(self._mapNode.txtTimerResume, self.nReturnCd)
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_countdown")
self.nTimeResume = 0
self.timerPause = self:AddTimer(0, 1, self.OnEvent_PauseResume, true, true, true)
end
function CookieBoardCtrl:GenerateBoard(bFixedPath)
if not bFixedPath then
self.tbCurrPath = {}
if self.nOverridePathId == 0 then
local tbRandom = {}
for k, v in pairs(self.tbPathGroup) do
if v.PathGroupId == self.nPathGroupId then
table.insert(tbRandom, v.Id)
end
end
local nRandomIdx = math.random(1, #tbRandom)
while tbRandom[nRandomIdx] == self.nLastPath do
nRandomIdx = math.random(1, #tbRandom)
end
self.nLastPath = tbRandom[nRandomIdx]
self.tbCurrPath = decodeJson(self.tbPathGroup[tbRandom[nRandomIdx]].PackagePathsResource)
else
local bFind = false
for k, v in pairs(self.tbPathGroup) do
if v.Id == self.nOverridePathId then
bFind = true
self.tbCurrPath = decodeJson(v.PackagePathsResource)
break
end
end
if not bFind then
self.tbCurrPath = decodeJson(self.tbPathGroup[1].PackagePathsResource)
self.nOverridePathId = 0
end
self.nBoardSize = math.floor(math.sqrt(#self.tbCurrPath))
end
else
self.tbCurrPath = {}
for i = 1, self.nBoardSize do
for j = 1, self.nBoardSize do
table.insert(self.tbCurrPath, {i, j})
end
end
end
if nil == self.tbCurrPath then
return
end
local tbGrid = {}
for i = 1, self.nBoardSize do
tbGrid[i] = {}
for j = 1, self.nBoardSize do
tbGrid[i][j] = 0
end
end
local tbPrev = {0, 0}
for k, v in pairs(self.tbCurrPath) do
local nActiveCookieCount = #self.tbActiveCookieTypes
local nRandomIndex = math.random(1, nActiveCookieCount)
local nCur = self.tbActiveCookieTypes[nRandomIndex]
while nCur == tbPrev[1] and tbPrev[1] == tbPrev[2] and 1 < nActiveCookieCount do
nRandomIndex = math.random(1, nActiveCookieCount)
nCur = self.tbActiveCookieTypes[nRandomIndex]
end
tbGrid[v[1]][v[2]] = nCur
tbPrev[1] = tbPrev[2]
tbPrev[2] = nCur
end
return tbGrid, self.tbCurrPath
end
function CookieBoardCtrl:ResetEff()
self._mapNode.animPerfectEff.transform:SetParent(self._mapNode.goHitEffect.transform, false)
self._mapNode.animExcellentEff.transform:SetParent(self._mapNode.goHitEffect.transform, false)
self._mapNode.animCriticalPerfectEff.transform:SetParent(self._mapNode.goHitEffect.transform, false)
self._mapNode.animMissEff.transform:SetParent(self._mapNode.goHitEffect.transform, false)
self._mapNode.animPerfectEff.gameObject:SetActive(false)
self._mapNode.animExcellentEff.gameObject:SetActive(false)
self._mapNode.animCriticalPerfectEff.gameObject:SetActive(false)
self._mapNode.animMissEff.gameObject:SetActive(false)
end
function CookieBoardCtrl:SetButtonsActive(bActive)
if self.tbActiveButtonNames then
for _, sButtonName in ipairs(self.tbActiveButtonNames) do
if sButtonName == "A" then
self._mapNode.btnA.interactable = bActive
elseif sButtonName == "B" then
self._mapNode.btnB.interactable = bActive
elseif sButtonName == "C" then
self._mapNode.btnC.interactable = bActive
end
end
end
end
function CookieBoardCtrl:CalculateScore()
local nScore = (self.nCompBoxCount * 10 + self.nCompCookieCount + (self.nPerfectCount - self.nMissCount) * 3 + (self.nCriticalPerfectCount * self.nCriticalPerfectFactorA + self.nPerfectCount * self.nPerfectFactorA + self.nGoodCount * self.nGoodFactorA)) * (1 + (self.nCriticalPerfectCount * self.nCriticalPerfectFactorB + self.nPerfectCount * self.nPerfectFactorB + self.nGoodCount * self.nGoodFactorB))
if nScore < 0 then
nScore = 0
end
self.nScore = math.ceil(nScore)
self._mapNode.animScoreCalculator:Play("CookieBoard_ScoreCalculator_up", 0, 0)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
NovaAPI.SetTMPText(self._mapNode.txtScoreCalculator, self.nScore)
local nScorePercentage = self.nScore / (self.nPassScore > 0 and self.nPassScore or 1)
if 1 < nScorePercentage then
nScorePercentage = 1
self._mapNode.animScoreCalculatorFiller:Play("CookieBoard_Bar_Full", 0, 0)
end
local nFillerSize = nScorePercentage * nFillerMaxSize
if nFillerSize < nFillerMinSize and 0 < nFillerSize then
nFillerSize = nFillerMinSize
end
self._mapNode.imgFillerLight:SetActive(0 < nFillerSize)
self._mapNode.imgScoreCalculatorFiller.sizeDelta = Vector2(nFillerSize, self._mapNode.imgScoreCalculatorFiller.sizeDelta.y)
end
cs_coroutine.start(wait)
end
function CookieBoardCtrl:UnbindGridCtrl()
for k, objCtrl in pairs(self.tbGridCtrl) do
if objCtrl ~= nil then
self:UnbindCtrlByNode(objCtrl)
self.tbGridCtrl[k] = nil
end
end
end
function CookieBoardCtrl:DisableGrids()
for i = 1, self.goCookieGridList.childCount do
local goGrid = self.goCookieGridList:GetChild(i - 1)
if goGrid ~= nil then
goGrid.gameObject:SetActive(false)
end
end
end
function CookieBoardCtrl:GetLevelConfig(sTableName)
local tbConfig = {}
local fc = function(tbData)
if self.nLevelId == tbData.PlayGroupId then
table.insert(tbConfig, tbData)
end
end
ForEachTableLine(ConfigTable.Get(sTableName), fc)
return tbConfig
end
function CookieBoardCtrl:GameStart()
if self.bRhythmMode then
self:PlayRhythmStartTip(function()
self:GameTrigger()
end)
else
self:GameTrigger()
end
if self.bPipelineMode == true then
self:PlayPathEffect()
end
end
function CookieBoardCtrl:GameTrigger()
if self.timerRound ~= nil then
self.timerRound:Cancel()
end
if self.timerBeat ~= nil then
self.timerBeat:Cancel()
end
self:SetEnvironmentBeat(true)
self.nPrevTime = CS.UnityEngine.Time.time
self.timerRound = self:AddTimer(0, 0.034, self.OnEvent_Time, true, true, true)
self.timerBeat = self:AddTimer(0, self.nBeatInterval, self.OnEvent_Beat, true, true, true)
local sEvent = self:GetSwitchBoxSoundEvent()
CS.WwiseAudioManager.Instance:PostEvent(sEvent)
self.bGameStarted = true
self._mapNode.btnBackReal.gameObject:SetActive(not self.bGameStarted)
self._mapNode.btnPauseReal.gameObject:SetActive(self.bGameStarted)
self.tbGridCtrl[1]:SetSelect(true)
self:SetButtonsActive(true)
end
function CookieBoardCtrl:PlayRhythmStartTip(callback)
self._mapNode.goRhythmDots:SetActive(true)
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animRoot, {
"CookieBoard_in_Rhythm"
})
self._mapNode.animRoot:Play("CookieBoard_in_Rhythm", 0, 0)
self:AddTimer(1, nAnimLength, function()
self:StartBeatLightLoop(self.nBeatInterval, function()
if callback ~= nil then
callback()
end
end)
end, true, true, true)
end
function CookieBoardCtrl:SetEnvironmentBeat(bPlay)
if bPlay == false then
self.animBtnA:SetFloat("PlaySpeed", 0)
self.animBtnB:SetFloat("PlaySpeed", 0)
self.animBtnC:SetFloat("PlaySpeed", 0)
self._mapNode.animTime:SetFloat("PlaySpeed", 0)
return
end
local nAnimationLength = NovaAPI.GetAnimClipLength(self.animBtnA, {
"CookieBoard_Platebtn_Loop"
})
local nPlaySpeed = nAnimationLength / (self.nBeatInterval or 1)
self.animBtnA:SetFloat("PlaySpeed", nPlaySpeed)
self.animBtnB:SetFloat("PlaySpeed", nPlaySpeed)
self.animBtnC:SetFloat("PlaySpeed", nPlaySpeed)
self._mapNode.animTime:SetFloat("PlaySpeed", nPlaySpeed)
end
function CookieBoardCtrl:NoteCheck()
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
local nNextRes = self.timerBeat:GetRemainInterval()
local nRes = self.nBeatInterval - nNextRes
if math.abs(nNextRes) < math.abs(nRes) then
nRes = nNextRes
end
printLog("判定:当前音符时间差为 " .. nRes .. "\n节拍器时间:" .. self.nBeatsTimer .. "\n时钟时间:" .. self.nFixedTimer)
if nRes > self.nHitThreshold or nRes < -self.nHitThreshold then
return
end
self.bCurrNoteHit = true
self.nHitType = GameEnum.CookieRhythmlResult.Miss
if nRes < self.nPerfectThreshold and nRes > -self.nPerfectThreshold then
self:NotePerfect()
elseif nRes < self.nGoodThreshold and nRes > -self.nGoodThreshold then
self:NoteGood()
else
self.bCurrNoteHit = false
self:NoteMiss()
self:PlayHitEffect(GameEnum.CookieRhythmlResult.Miss)
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_wrong")
printLog("判定:Miss 没有FC了")
return
end
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_test")
self:PlayHitEffect(self.nHitType)
self:FillSuccess()
end
function CookieBoardCtrl:NotePerfect()
printLog("判定:Perfect Critical")
self.nHitType = GameEnum.CookieRhythmlResult.Perfect
self.nPerfectTemp = self.nPerfectTemp + 1
self.nPerfectCount = self.nPerfectCount + 1
self.nPerfectCombo = self.nPerfectCombo + 1
self.nTimeCount = self.nTimeCount - 0.3
NovaAPI.SetTMPText(self._mapNode.txtAddTime, "+0.3s")
self._mapNode.animTime:Play("CookieBoard_AddTime_in", 0, 0)
self:RefreshCountDownTimer()
if self.nPerfectTemp == 3 then
self.nPerfectTemp = 0
self.nCriticalPerfectCount = self.nCriticalPerfectCount + 1
self.nHitType = GameEnum.CookieRhythmlResult.Excellent
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_perfect_ex")
else
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_perfect")
end
end
function CookieBoardCtrl:NoteGood()
printLog("判定:Good 你有一个好")
self.nHitType = GameEnum.CookieRhythmlResult.Good
self.nGoodCount = self.nGoodCount + 1
self.nPerfectTemp = 0
self.nPerfectCombo = 0
self.bAllPerfect = false
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_nice")
end
function CookieBoardCtrl:NoteMiss()
self.nMissCount = self.nMissCount + 1
self.nPerfectTemp = 0
self.nPerfectCombo = 0
self:CalculateScore()
self.bFullCombo = false
self.bAllPerfect = false
if self.bPipelineMode and self.bRhythmMode then
self:LoseHeart()
end
end
function CookieBoardCtrl:PlayPathEffect()
local nCurIndex = 1
local nEffInterval = 0.1
if self.bRhythmMode then
local nGridCount = self.nBoardSize * self.nBoardSize
nEffInterval = self.nBeatInterval / 2.5 / nGridCount
end
self.gridItemAnimTimer = self:AddTimer(0, nEffInterval, function()
nCurIndex = nCurIndex + 1
if nCurIndex > #self.tbGridCtrl and self.gridItemAnimTimer ~= nil then
self.gridItemAnimTimer:Cancel()
self.gridItemAnimTimer = nil
EventManager.Hit(EventId.BlockInput, false)
return
end
local currGrid = self.tbPath[nCurIndex]
if currGrid == nil then
return
end
local m = self.tbPath[nCurIndex][1]
local n = self.tbPath[nCurIndex][2]
local nTbIndex = (m - 1) * self.nBoardSize + n
local currCtrl = self.tbGridCtrl[nTbIndex]
if currCtrl ~= nil then
currCtrl:PlayLightAnim()
end
end, true, true, true)
end
function CookieBoardCtrl:PlayHitEffect(nHitType)
self:ResetEff()
local nAnimLength = 0.75
if nHitType == GameEnum.CookieRhythmlResult.Excellent then
self._mapNode.animCriticalPerfectEff.gameObject:SetActive(true)
self._mapNode.animCriticalPerfectEff.transform:SetParent(self.nextCtrl.gameObject.transform, false)
nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animCriticalPerfectEff, {
"CookieBoard_HitEffect_Criticalperfect"
})
self._mapNode.animCriticalPerfectEff:Play("CookieBoard_HitEffect_Criticalperfect", 0, 0)
elseif nHitType == GameEnum.CookieRhythmlResult.Perfect then
NovaAPI.SetTMPText(self._mapNode.txtPerfectCombo, string.format("x%d", self.nPerfectCombo))
self._mapNode.txtPerfectCombo.gameObject:SetActive(self.nPerfectCombo >= 2)
self._mapNode.animPerfectEff.gameObject:SetActive(true)
self._mapNode.animPerfectEff.transform:SetParent(self.nextCtrl.gameObject.transform, false)
nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animPerfectEff, {
"CookieBoard_HitEffect_perfect"
})
self._mapNode.animPerfectEff:Play("CookieBoard_HitEffect_perfect", 0, 0)
elseif nHitType == GameEnum.CookieRhythmlResult.Good then
self._mapNode.animExcellentEff.gameObject:SetActive(true)
self._mapNode.animExcellentEff.transform:SetParent(self.nextCtrl.gameObject.transform, false)
nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animExcellentEff, {
"CookieBoard_HitEffect_excellent"
})
self._mapNode.animExcellentEff:Play("CookieBoard_HitEffect_excellent", 0, 0)
elseif nHitType == GameEnum.CookieRhythmlResult.Miss then
self._mapNode.animMissEff.gameObject:SetActive(true)
self._mapNode.animMissEff.transform:SetParent(self.nextCtrl.gameObject.transform, false)
nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animMissEff, {
"CookieBoard_HitEffect_mistake"
})
self._mapNode.animMissEff:Play("CookieBoard_HitEffect_mistake", 0, 0)
end
if self.timerEff ~= nil then
self.timerEff:Cancel()
end
self.timerEff = self:AddTimer(1, nAnimLength + 0.15, "ResetEff", true, true, true)
end
function CookieBoardCtrl:StartBeatLightLoop(nInterval, endCallback)
for i = 1, #self._mapNode.imgDotInner do
local imgDot = self._mapNode.imgDotInner[i]
if imgDot ~= nil then
imgDot.gameObject:SetActive(false)
end
end
for i = 1, #self._mapNode.imgLight do
local imgDot = self._mapNode.imgLight[i]
if imgDot ~= nil then
imgDot.gameObject:SetActive(false)
end
end
local bBeatPlayed = false
local sEvent = self:GetRhythmSwitchSoundEvent()
self.nBeatLightIndex = nil
self.nBeatLightCount = 0
self.timerBeatLight = self:AddTimer(0, nInterval, function()
self:BeatLightLoop(true)
if bBeatPlayed == false then
bBeatPlayed = true
CS.WwiseAudioManager.Instance:PostEvent(sEvent)
end
self.nBeatLightCount = self.nBeatLightCount + 1
if self.nBeatLightCount >= 4 then
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animRoot, {
"CookieBoard_out_Rhythm"
})
self._mapNode.animRoot:Play("CookieBoard_out_Rhythm", 0, 0)
if endCallback ~= nil then
endCallback()
end
if self.timerBeatLight ~= nil then
self.timerBeatLight:Cancel()
self.timerBeatLight = nil
end
end
end, true, true, true)
end
function CookieBoardCtrl:BeatLightLoop(bStart)
local tbDots = bStart and self._mapNode.imgLight or self._mapNode.imgDotInner
for i = 1, #tbDots do
local imgDot = tbDots[i]
if imgDot ~= nil then
imgDot.gameObject:SetActive(false)
end
end
if self.nBeatLightIndex == nil then
self.nBeatLightIndex = 1
else
self.nBeatLightIndex = self.nBeatLightIndex + 1
if self.nBeatLightIndex > #tbDots then
self.nBeatLightIndex = 1
end
end
local imgDotLight = tbDots[self.nBeatLightIndex]
if imgDotLight ~= nil then
imgDotLight.gameObject:SetActive(true)
end
end
function CookieBoardCtrl:RefreshCountDownTimer()
local nRemainTime = self.nTimeLimit - self.nTimeCount
local nRemainMin = math.floor(nRemainTime / 60)
local nRemainSec = math.floor(nRemainTime % 60)
local sTime = string.format("%02d:%02d", nRemainMin, nRemainSec)
NovaAPI.SetTMPText(self._mapNode.txtTimer, sTime)
if nRemainTime < 0 then
self:LevelEnd()
end
end
function CookieBoardCtrl:LevelEnd()
self:PauseGameCtrl()
if nil ~= self.CookieGameBoard then
self.CookieGameBoard:SetActive(false)
end
self.bGameStarted = false
self:SetButtonsActive(false)
NovaAPI.SetTMPText(self._mapNode.txtTimer, "00:00")
self:CalculateScore()
self._mapNode.goResult:SetActive(true)
self._mapNode.goBlurRes:SetActive(true)
local bNewRecord = false
local cookieData = PlayerData.Activity:GetActivityDataById(self.nActId)
local levelData = cookieData:GetLevelDataById(self.nLevelId)
if levelData ~= nil and self.nScore > levelData.nMaxScore then
bNewRecord = true
end
if self.bRhythmMode == false then
self.bFullCombo = false
self.bAllPerfect = false
end
if self.timerRound ~= nil then
self.timerRound:Cancel()
end
self:SetEnvironmentBeat(false)
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_complete")
local callback = function()
if bNewRecord and self.bRhythmMode and self.bPipelineMode then
cookieData:SetNMHighScoreDay()
end
end
EventManager.Hit("Cookie_Game_Complete", self.nLevelId, self.nScore, self.nCompBoxCount, self.nCompCookieCount, self.nGoodCount, self.nPerfectCount, self.nCriticalPerfectCount, self.nMissCount, callback)
EventManager.Hit(EventId.TemporaryBlockInput, 2)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.btnConfirmScore.gameObject:SetActive(true)
self._mapNode.btnShortcutConfirmScore.gameObject:SetActive(true)
self.goScoreBoard.gameObject:SetActive(true)
self.goScoreBoard:Init(self.nPackModel, self.nScore, self.nCompCookieCount, self.nCompBoxCount, self.nCriticalPerfectCount, self.nPerfectCount, self.nGoodCount, self.nMissCount, bNewRecord, self.bFullCombo, self.bAllPerfect)
self._mapNode.animResult:Play(tbResultAnim[self.nPackModel], 0, 0)
end
cs_coroutine.start(wait)
end
function CookieBoardCtrl:ResumeTrigger()
self:SetEnvironmentBeat(true)
self.nFixedTimer = 0
self.nBeatsTimer = 0
self.bBlockInput = false
self.bMissSwitch = false
self.bCurrNoteHit = false
self.bCurrNoteClicked = false
self.bPaused = false
self.bPressed = false
self.bNewBeat = true
EventManager.Hit(EventId.BlockInput, false)
if self.bRhythmMode then
EventManager.Hit(EventId.TemporaryBlockInput, 0.1)
end
if self.timerPause ~= nil then
self.timerPause:Cancel()
end
end
function CookieBoardCtrl:OnBtn_A()
if self.bPaused or self.bPressed then
return
end
self.bPressed = true
self.animBtnA:Play("CookieBoard_Platebtn_Hit", 0, 0)
self:FillCurrentGrid(1)
end
function CookieBoardCtrl:OnBtn_B()
if self.bPaused or self.bPressed then
return
end
self.bPressed = true
self.animBtnB:Play("CookieBoard_Platebtn_Hit", 0, 0)
self:FillCurrentGrid(2)
end
function CookieBoardCtrl:OnBtn_C()
if self.bPaused or self.bPressed then
return
end
self.bPressed = true
self.animBtnC:Play("CookieBoard_Platebtn_Hit", 0, 0)
self:FillCurrentGrid(3)
end
function CookieBoardCtrl:OnBtn_ConfirmGameOver()
local closePanel = function()
EventManager.Hit(EventId.ClosePanel, PanelId.CookieBoardPanel)
end
local rewardChangeInfo = self.cookieData:GetLevelReward()
if rewardChangeInfo ~= nil and #rewardChangeInfo.Props > 0 then
self.cookieData:SetLevelReward(nil)
local levelData = ConfigTable.GetData("CookieLevel", self.nLevelId)
if levelData ~= nil then
local tbRewardData = {}
for i = 1, 3 do
local nItemId = levelData["FirstCompletionReward" .. i .. "Tid"]
local nItemCount = levelData["FirstCompletionReward" .. i .. "Qty"]
if nItemId ~= nil and 0 < nItemId then
local tbData = {
Tid = nItemId,
Qty = nItemCount,
rewardType = AllEnum.RewardType.First
}
table.insert(tbRewardData, tbData)
end
end
if tbRewardData ~= nil and 0 < #tbRewardData then
UTILS.OpenReceiveByDisplayItem(tbRewardData or {}, rewardChangeInfo, function()
local nRandom = math.random(28, 29)
EventManager.Hit(EventId.SetTransition, nRandom, closePanel)
end)
return
end
end
end
local nRandom = math.random(28, 29)
EventManager.Hit(EventId.SetTransition, nRandom, closePanel)
end
function CookieBoardCtrl:OnEvent_Time()
if self.bRhythmMode then
local nDeltaTime = 0.034
if self.nPrevTime ~= nil then
nDeltaTime = CS.UnityEngine.Time.time - self.nPrevTime
end
self.nPrevTime = CS.UnityEngine.Time.time
self.nFixedTimer = self.nFixedTimer + nDeltaTime
if self.nWaitingNextBeat > 0 or self.bPaused then
return
end
local nNoteMissTime = self.nBeatsTimer + self.nHitThreshold
if nNoteMissTime < self.nFixedTimer and self.bMissSwitch then
if not self.bCurrNoteClicked then
printLog("判定:Miss,无操作导致的")
self:NoteMiss()
self:PlayHitEffect(GameEnum.CookieRhythmlResult.Miss)
end
self.bMissSwitch = false
self.bCurrNoteHit = false
self.bCurrNoteClicked = false
end
if nNoteMissTime < self.nFixedTimer and self.bWaitingNextBeatNote then
self.bWaitingNextBeatNote = false
self:SelectionForward(true)
end
if self.bNewBeat then
self.bNewBeat = false
self.nNextHaloAnim = self.nBeatsTimer + self.nBeatInterval - self.nHitThreshold
end
if self.nFixedTimer >= self.nNextHaloAnim then
if self.bHaloAnimPlaying == false then
self.bHaloAnimPlaying = true
local nAnimSpeed = math.floor(nPerfectTiming / self.nHitThreshold * 100) / 100
if self.nextCtrl ~= nil then
self.nextCtrl:PlayHaloAnim(nAnimSpeed)
end
end
elseif self.nFixedTimer < self.nNextHaloAnim then
self.bHaloAnimPlaying = false
end
if self.bOverrideMode then
local nNextRes = self.timerBeat:GetRemainInterval()
local nRes = self.nBeatInterval - nNextRes
if math.abs(nNextRes) < math.abs(nRes) then
nRes = nNextRes
end
if nRes < self.nPerfectThreshold and nRes > -self.nPerfectThreshold then
EventManager.Hit("CookieNoteIndicator", GameEnum.CookieRhythmlResult.Perfect)
elseif nRes < self.nGoodThreshold and nRes > -self.nGoodThreshold then
EventManager.Hit("CookieNoteIndicator", GameEnum.CookieRhythmlResult.Good)
else
EventManager.Hit("CookieNoteIndicator", GameEnum.CookieRhythmlResult.Miss)
end
end
end
if self.bPaused then
return
end
self.nTimeCount = self.nTimeCount + 0.034
self:RefreshCountDownTimer()
end
function CookieBoardCtrl:OnEvent_Beat()
self.nBeatsTimer = self.nBeatsTimer + self.nBeatInterval
self.nDisposalBeatTimer = 0
self.bMissSwitch = true
self.bNewBeat = true
if self.bPaused == false then
self:BeatLightLoop(false)
end
if 0 < self.nWaitingNextBeat then
self.nWaitingNextBeat = self.nWaitingNextBeat - 1
if self.nWaitingNextBeat == 0 then
self:NextBox()
end
return
end
if self.bPauseResume then
self:ResumeTrigger()
self.bPauseResume = false
return
end
end
function CookieBoardCtrl:OnEvent_PauseResume()
self.nTimeResume = self.nTimeResume + 1
NovaAPI.SetTMPText(self._mapNode.txtTimerResume, self.nReturnCd - self.nTimeResume)
if self.nTimeResume >= self.nReturnCd then
if self.bRhythmMode then
self.bPauseResume = true
else
self:ResumeTrigger()
end
end
end
function CookieBoardCtrl:OnBtn_Back()
if self.bBlockInput then
return
end
if self.bGameStarted == false then
self:OnBtn_ConfirmGameOver()
return
end
self:PauseGameCtrl()
local confirmCallback = function()
self:OnBtn_ConfirmGameOver()
end
local cancelCallback = function()
self:ResumeGameCtrl()
end
local msg = {
nType = AllEnum.MessageBox.Confirm,
sContent = ConfigTable.GetUIText("Cookie_Act_Exit_Tip"),
callbackConfirm = confirmCallback,
callbackCancel = cancelCallback,
bBlur = true
}
EventManager.Hit(EventId.OpenMessageBox, msg)
end
function CookieBoardCtrl:OnBtn_GameStart()
if self.bGameStartPressed == true then
return
end
self.bGameStartPressed = true
self._mapNode.animRoot:Play("CookieBoard_txt_out", 0, 0)
local nAnimLength = NovaAPI.GetAnimClipLength(self._mapNode.animRoot, {
"CookieBoard_txt_out"
})
self:AddTimer(1, nAnimLength, function()
self:GameInit()
self:GameStart()
end, true, true, true)
end
function CookieBoardCtrl:OnEvent_CookieRequestCtrl()
EventManager.Hit("CookieRequestCtrlReceive", self)
end
function CookieBoardCtrl:Awake()
local param = self:GetPanelParam()
if type(param) == "table" then
self.nLevelId = param[1]
self.bRhythmMode = param[2]
self.bPipelineMode = param[3]
self.nTimeLimit = param[4]
self.nActId = param[5]
self.nPassScore = param[6]
end
self.cookieData = PlayerData.Activity:GetActivityDataById(self.nActId)
self.tbGamepadUINode = self:GetGamepadUINode()
self.nPathGroupId = 0
self.nPackModel = 0
self.nCurrGridIndex = 1
self.nCurrBoardIndex = 1
self.nCurrLevelConfigIdx = 1
self.nTimeCount = 0.0
self.nTimeResume = 0
self.tbNextGrid = {}
self.tbGrid = {}
self.tbPath = {}
self.nLastPath = 0
self.timerRound = nil
self.timerPause = nil
self.bPasued = true
self.nCurrGird = {1, 1}
self.tbGridCtrl = {}
self.nOverridePathId = 0
self.nReturnCd = 3
self.bCurrNoteHit = false
self.bCurrNoteClicked = false
self.bHaloAnimPlaying = false
self.bOverrideMode = false
self._mapNode.goNoteIndicator:SetActive(false)
end
function CookieBoardCtrl:OnEnable()
GamepadUIManager.EnableGamepadUI("CookieBoardCtrl", self.tbGamepadUINode)
self.mapLevelConfig = ConfigTable.GetData("CookieLevel", self.nLevelId)
self.nPackModel = self.mapLevelConfig.PackModel
self.tbFloor = {}
ForEachTableLine(ConfigTable.Get("CookieFloor"), function(tbData)
if tbData.FloorId == self.mapLevelConfig.FloorId then
table.insert(self.tbFloor, tbData)
end
end)
self.tbPathGroup = {}
ForEachTableLine(ConfigTable.Get("CookiePackagePathsGroup"), function(tbData)
table.insert(self.tbPathGroup, tbData)
end)
self.nPerfectThreshold = ConfigTable.GetData("CookieRhythmlResult", 2).Range
self.nGoodThreshold = ConfigTable.GetData("CookieRhythmlResult", 3).Range
local sStartAnim = sDefaultStartAnim
if self.nPackModel == GameEnum.CookiePackModel.CookiePackRhythmlModel or self.nPackModel == GameEnum.CookiePackModel.CookiePackComplexModel then
self.goScoreBoard = self._mapNode.ScoreBoardRhythm
else
self.goScoreBoard = self._mapNode.ScoreBoardOther
end
self.bGameStarted = false
self:SetButtonsActive(false)
NovaAPI.SetTMPText(self._mapNode.txtAddTime, "")
NovaAPI.SetTMPText(self._mapNode.txtScoreCalculator, 0)
self.goScoreBoard.gameObject:SetActive(false)
self._mapNode.btnConfirmScore.gameObject:SetActive(false)
self._mapNode.btnShortcutConfirmScore.gameObject:SetActive(false)
self._mapNode.goBlur:SetActive(false)
self._mapNode.goResult:SetActive(false)
self._mapNode.CookieGameBoard3x3:SetActive(false)
self._mapNode.CookieGameBoard4x4:SetActive(false)
self._mapNode.goBlurRes:SetActive(false)
self._mapNode.btnBackReal.gameObject:SetActive(not self.bGameStarted)
self._mapNode.btnPauseReal.gameObject:SetActive(self.bGameStarted)
self._mapNode.goRhythmDots:SetActive(false)
self._mapNode.imgScoreNMBg:SetActive(self.bRhythmMode and self.bPipelineMode)
self._mapNode.imgScoreNormalBg:SetActive(not self.bRhythmMode or not self.bPipelineMode)
self._mapNode.imgScoreCalculatorFiller.sizeDelta = Vector2(0, self._mapNode.imgScoreCalculatorFiller.sizeDelta.y)
NovaAPI.SetTMPText(self._mapNode.txtCookieCountNumNM, 0)
NovaAPI.SetTMPText(self._mapNode.txtCookieCountNumNormal, 0)
NovaAPI.SetTMPText(self._mapNode.txtBoxCountNumNM, 0)
NovaAPI.SetTMPText(self._mapNode.txtBoxCountNumNormal, 0)
self.animBtnA = self._mapNode.btnA.transform:Find("AnimRoot"):GetComponent("Animator")
self.animBtnB = self._mapNode.btnB.transform:Find("AnimRoot"):GetComponent("Animator")
self.animBtnC = self._mapNode.btnC.transform:Find("AnimRoot"):GetComponent("Animator")
self:SetEnvironmentBeat(false)
self:ResetEff()
NovaAPI.SetCanvasSortingName(self._mapNode.animPerfectEff:GetComponent(typeof(CS.UnityEngine.Canvas)), AllEnum.SortingLayerName.UI)
NovaAPI.SetCanvasSortingName(self._mapNode.animExcellentEff:GetComponent(typeof(CS.UnityEngine.Canvas)), AllEnum.SortingLayerName.UI)
NovaAPI.SetCanvasSortingName(self._mapNode.animCriticalPerfectEff:GetComponent(typeof(CS.UnityEngine.Canvas)), AllEnum.SortingLayerName.UI)
NovaAPI.SetCanvasSortingName(self._mapNode.animMissEff:GetComponent(typeof(CS.UnityEngine.Canvas)), AllEnum.SortingLayerName.UI)
local nSortingOrder = self._panel._nIndex * 100 + 99
NovaAPI.SetCanvasSortingOrder(self._mapNode.animPerfectEff:GetComponent(typeof(CS.UnityEngine.Canvas)), nSortingOrder)
NovaAPI.SetCanvasSortingOrder(self._mapNode.animExcellentEff:GetComponent(typeof(CS.UnityEngine.Canvas)), nSortingOrder)
NovaAPI.SetCanvasSortingOrder(self._mapNode.animCriticalPerfectEff:GetComponent(typeof(CS.UnityEngine.Canvas)), nSortingOrder)
NovaAPI.SetCanvasSortingOrder(self._mapNode.animMissEff:GetComponent(typeof(CS.UnityEngine.Canvas)), nSortingOrder)
self.nBoardSize = self.tbFloor[1].Size
self.CookieGameBoard = self.nBoardSize == 3 and self._mapNode.CookieGameBoard3x3 or self._mapNode.CookieGameBoard4x4
if nil ~= self.CookieGameBoard then
self.CookieGameBoard:SetActive(true)
end
EventManager.Hit(EventId.SetTransition)
CS.WwiseAudioManager.Instance:PlaySound("mode_cookie1_start")
self._mapNode.animRoot:Play(sStartAnim, 0, 0)
EventManager.Hit(EventId.BlockInput, true)
self:AddTimer(1, nPreMusicTime, function()
EventManager.Hit(EventId.BlockInput, false)
end, true, true, true)
end
function CookieBoardCtrl:OnDisable()
GamepadUIManager.DisableGamepadUI("CookieBoardCtrl")
self:UnbindGridCtrl()
if self.timerRound ~= nil then
self.timerRound:Cancel()
end
if self.timerPause ~= nil then
self.timerPause:Cancel()
end
if self.timerEff ~= nil then
self.timerEff:Cancel()
end
if self.timerStart ~= nil then
self.timerStart:Cancel()
end
if self.timerNextBox ~= nil then
self.timerNextBox:Cancel()
end
end
return CookieBoardCtrl