local IceCreamTruckGameCtrl = class("IceCreamTruckGameCtrl", BaseCtrl) local ScoreCalculationCtrl = require("Game.UI.Play_IceCreamTruck.Play.ScoreCalculationCtrl") local IceCreamUtils = require("Game.UI.Play_IceCreamTruck.Play.IceCreamUtils") local IceCreamBuffRuntimeCtrl = require("Game.UI.Play_IceCreamTruck.Play.IceCreamBuffRuntimeCtrl") local TimerManager = require("GameCore.Timer.TimerManager") local GamepadUIManager = require("GameCore.Module.GamepadUIManager") local SpineManager = require("Game.Spine.SpineManager") local GameResourceLoader = require("Game.Common.Resource.GameResourceLoader") local ResTypeAny = GameResourceLoader.ResType.Any local PlayerBaseData = PlayerData.Base local WwiseAudioMgr = CS.WwiseAudioManager.Instance IceCreamTruckGameCtrl._mapNodeConfig = { btn_Pause = { sComponentName = "NaviButton", callback = "OnBtnClick_Pause", sAction = "Map" }, PausePanel = { sCtrlName = "Game.UI.Play_IceCreamTruck.Play.IceCreamTruckPauseCtrl" }, ResultPanel = { sCtrlName = "Game.UI.Play_IceCreamTruck.Play.IceCreamResultCtrl" }, IceCreamBackPackPanel = { sCtrlName = "Game.UI.Play_IceCreamTruck.Play.IceCreamBackPackCtrl" }, CustomerQueue = { sCtrlName = "Game.UI.Play_IceCreamTruck.Play.CustomerQueueCtrl" }, txt_LevelScore = {sComponentName = "TMP_Text"}, iconCert = {}, obj_DoubleBg = {}, txt_LevelScoreTitle = {sComponentName = "TMP_Text"}, txt_DoubleTitle = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_DoubleTitle" }, txt_PeopleNum = {sComponentName = "TMP_Text"}, obj_Hp = {}, RedHeart = {nCount = 3}, RedHeartAnimator = { nCount = 3, sNodeName = "RedHeart", sComponentName = "Animator" }, btn_Condiment_A = { sComponentName = "NaviButton", callback = "OnBtn_ClickCondiment", sAction = "IceCream_Condiment1" }, btn_Condiment_S = { sComponentName = "NaviButton", callback = "OnBtn_ClickCondiment", sAction = "IceCream_Condiment2" }, btn_Condiment_D = { sComponentName = "NaviButton", callback = "OnBtn_ClickCondiment", sAction = "IceCream_Condiment3" }, btn_Condiment_F = { sComponentName = "NaviButton", callback = "OnBtn_ClickCondiment", sAction = "IceCream_Condiment4" }, btn_Condiment_H = { sComponentName = "NaviButton", callback = "OnBtn_ClickCondiment", sAction = "IceCream_Condiment5" }, btn_Condiment_J = { sComponentName = "NaviButton", callback = "OnBtn_ClickCondiment", sAction = "IceCream_Condiment6" }, btn_Condiment_K = { sComponentName = "NaviButton", callback = "OnBtn_ClickCondiment", sAction = "IceCream_Condiment7" }, btn_Condiment_L = { sComponentName = "NaviButton", callback = "OnBtn_ClickCondiment", sAction = "IceCream_Condiment8" }, obj_Icon = {nCount = 6}, obj_BadIceCream = {}, NewGuides = {}, tr_Condiment_A = {}, tr_Condiment_S = {}, tr_Condiment_D = {}, tr_Condiment_F = {}, tr_Condiment_H = {}, tr_Condiment_J = {}, tr_Condiment_K = {}, tr_Condiment_L = {}, btn_Garbage = { sComponentName = "NaviButton", callback = "OnBtn_DropGarbage", sAction = "IceCream_Rubbish" }, obj_BuffBag = {}, btn_Bag = { sComponentName = "NaviButton", callback = "OnBtn_OpenBagPanel", sAction = "IceCream_BackPack" }, txt_Bag = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_Bag" }, btn_BuffItem1 = { sComponentName = "NaviButton", callback = "OnBtn_UseBuffItem1", sAction = "IceCream_Buff1" }, btn_BuffItem2 = { sComponentName = "NaviButton", callback = "OnBtn_UseBuffItem2", sAction = "IceCream_Buff2" }, rtBuff = {nCount = 5}, TMPBuffTime = {nCount = 5, sComponentName = "TMP_Text"}, BuffCool = {sNodeName = "imgColor_B"}, BuffDouble = {sNodeName = "imgColor_Y"}, BuffAutomatic = { sNodeName = "rtColorAutomatic" }, txt_Automatic = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_BuffAutomaticTips" }, obj_Fever = {}, img_ProgressBarMask = {sComponentName = "Image"}, img_ProgressBar = {sComponentName = "Image"}, img_ProgressBar1 = { sComponentName = "CanvasGroup" }, obj_FeverSpecial = {}, img_ProgressBarFeverMask = {sComponentName = "Image"}, img_ProgressBarFever = {sComponentName = "Image"}, EffectRootAnim = {sNodeName = "EffectRoot", sComponentName = "Animator"}, spCat = {}, anCutin = {sNodeName = "rtCutin", sComponentName = "Animator"}, imgFemale = {}, imgMale = {}, txt_Fever = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_Fever" }, txt_F = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_F" }, txt_E1 = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_E1" }, txt_V = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_V" }, txt_E2 = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_E2" }, txt_R = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_R" }, txtStartTMP = { sComponentName = "TMP_Text", sLanguageId = "IceCreamTruck_StarOpen" }, obj_Start = {}, ani_Start = {sNodeName = "obj_Start", sComponentName = "Animator"}, btn_Start = { sComponentName = "NaviButton", callback = "OnBtn_Star", sAction = "Confirm" }, obj_Time = {}, ImgTime = {nCount = 3} } IceCreamTruckGameCtrl._mapEventConfig = { Event_GetNewItem = "Event_GetNewItem", Event_CustomerLeave_False = "Event_CustomerLeave_False", Event_FeverModeChanged = "On_FeverModeChanged", Event_SetPause = "Event_SetPause", Event_BagUseItem = "Event_BagUseItem", IceCream_Continue_OnClick = "OnEvent_Continue", IceCream_Restart_OnClick = "OnEvent_Restart", IceCream_Exit_OnClick = "OnEvent_Exit", Event_RestartIceCreamTruckGame = "Event_RestartIceCreamTruckGame", Event_ExitIceCreamTruckGame = "Event_ExitIceCreamTruckGame", IceCream_NextLevel = "IceCream_NextLevel", Event_IceCreamBuffStart = "OnEvent_IceCreamBuffStart", Event_IceCreamBuffTick = "OnEvent_IceCreamBuffTick", Event_IceCreamBuffEnd = "OnEvent_IceCreamBuffEnd", [EventId.ClosePanel] = "OnEvent_CloseDic", GMEvent_GetNewBuffItem = "GM_GetNewBuffItem", GMEvent_ChangeScoreOrder = "GM_ChangeScoreOrder", GMEvent_AddPatienceVal = "GM_AddPatienceVal", GMEvent_ChangeComboNum = "GM_ChangeComboNum", GMEvent_ChangeFeverTime = "GM_ChangeFeverTime", GMEvent_RefreshCustomer = "GM_RefreshCustomer" } function IceCreamTruckGameCtrl:Awake() local param = self:GetPanelParam() if type(param) == "table" then self.nActId = param[1] self.nLevelId = param[2] end self:InitPlayLevel(self.nActId, self.nLevelId) IceCreamUtils.InitIconPath() self.tbGamepadUINode = self:GetGamepadUINode() end function IceCreamTruckGameCtrl:OnEnable() GamepadUIManager.EnterAdventure(true) GamepadUIManager.EnableGamepadUI("IceCreamTruckGameCtrl", self.tbGamepadUINode) IceCreamTruckGameCtrl._instance = self self._nRestartGen = self._nRestartGen or 0 self._bIsExiting = false self:ReInitData() self:RefreshGameplayUI() self.animatorRoot = self.gameObject:GetComponent("Animator") end function IceCreamTruckGameCtrl:OnDisable() GamepadUIManager.DisableGamepadUI("IceCreamTruckGameCtrl") GamepadUIManager.QuitAdventure() if self.BuffRuntime then self.BuffRuntime:Clear() self.BuffRuntime = nil end if IceCreamTruckGameCtrl._instance == self then IceCreamTruckGameCtrl._instance = nil end self:_ClearSafeHitQueue() self:_GuideClear() self._tbGuideObjs = nil self:_GuideClearGarbage() self._goGarbageGuide = nil self:UnregisterCondimentSpines() self:_UnregisterFeverCatSpine() self:_DestroyAllSauceInstances() if self._progressBarTailTweener ~= nil then self._progressBarTailTweener:Kill() self._progressBarTailTweener = nil end self:_KillFeverBarTween() if self.timerFeverCutinHide ~= nil then TimerManager.Remove(self.timerFeverCutinHide) self.timerFeverCutinHide = nil end if self.timerFeverCutinDeactivate ~= nil then TimerManager.Remove(self.timerFeverCutinDeactivate) self.timerFeverCutinDeactivate = nil end self._nRestartGen = (self._nRestartGen or 0) + 1 SpineManager.ClearAll() end function IceCreamTruckGameCtrl:ReInitData() self:InitData() self:GameEnd_Pre(true) self.IceCreamActData.IceCreamLevelData:InitData(self.nLevelId, self.nActId) local nMaxFever = self.IceCreamActData.IceCreamLevelData:GetCurrentLevelFever() local IceCreamFeverTime = ConfigTable.GetConfigNumber("IceCreamFeverTime") self.ScoreCalc = ScoreCalculationCtrl.new() self.ScoreCalc:Init(nMaxFever, false, IceCreamFeverTime) self.BuffRuntime = IceCreamBuffRuntimeCtrl.new() self.BuffRuntime:Init(self:BuildBuffCtrl()) self.bIsOperateMiss = false self._mapNode.obj_BadIceCream:SetActive(self.bIsOperateMiss) self:ClearIceCreamIcon() self:RegisterCondimentSpines() self._fGuideIdleSec = ConfigTable.GetConfigNumber("IceCreamGuidanceDuration") end function IceCreamTruckGameCtrl:RefreshGameplayUI() self:RefreshScoreUI() self:RefreshBuffItems() self:SetBuffBag() self:RefreshBuffRoot() self:SetFeverPattern() self:SetHpPattern() self:SetScoreTarget() self:EnterPreOpenState() end function IceCreamTruckGameCtrl:EnterPreOpenState() self._bIsOpening = false self.bIPause = true self._mapNode.obj_Start:SetActive(true) local imgBlurredBg = self._mapNode.obj_Start.transform:Find("t_fullscreen_blur_black") local Start = self._mapNode.obj_Start.transform:Find("btn_Start") local nGen = self._nRestartGen or 0 local wait = function() coroutine.yield(CS.UnityEngine.WaitForEndOfFrame()) if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then return end Start.gameObject:SetActive(true) end cs_coroutine.start(wait) imgBlurredBg.gameObject:SetActive(true) self._mapNode.obj_Start:SetActive(true) EventManager.Hit("Event_SetPause", true) self:TryOpenDicAfterIntro() end function IceCreamTruckGameCtrl:TryOpenDicAfterIntro() if self.nDicId == nil or self.nDicId == 0 then return end local levelData = self.IceCreamActData and self.IceCreamActData.IceCreamLevelData if levelData == nil then return end if levelData:GetFloorHasOpenDic(self.nLevelId) then return end local nGen = self._nRestartGen or 0 local objStart = self._mapNode.obj_Start local nAnimTime = NovaAPI.GetAnimClipLength(objStart:GetComponent("Animator"), { "btn_Start_in" }) if type(nAnimTime) ~= "number" or nAnimTime <= 0 then nAnimTime = 1.5 end local nDicOpenBuffer = 0.8 EventManager.Hit(EventId.TemporaryBlockInput, nAnimTime + nDicOpenBuffer) local wait = function() local nMax = 120 while not PanelManager.CheckPanelOpen(PanelId.IceCreamTruckGamePanel) do coroutine.yield(CS.UnityEngine.WaitForEndOfFrame()) if IceCreamTruckGameCtrl.GetRestartGen() ~= nGen then return end nMax = nMax - 1 if nMax <= 0 then break end end if IceCreamTruckGameCtrl.GetRestartGen() ~= nGen then return end local animator = objStart and objStart:GetComponent("Animator") or nil if animator ~= nil then local nMax2 = 90 while animator.gameObject ~= nil and animator.gameObject.activeInHierarchy do local info = animator:GetCurrentAnimatorStateInfo(0) if not info:IsName("btn_Start_in") or 1 <= info.normalizedTime then break end coroutine.yield(CS.UnityEngine.WaitForEndOfFrame()) if IceCreamTruckGameCtrl.GetRestartGen() ~= nGen then return end nMax2 = nMax2 - 1 if nMax2 <= 0 then break end end if IceCreamTruckGameCtrl.GetRestartGen() ~= nGen then return end end self:OnEvent_OpenDic() end cs_coroutine.start(wait) end function IceCreamTruckGameCtrl.GetRestartGen() local inst = IceCreamTruckGameCtrl._instance return inst and inst._nRestartGen or 0 end function IceCreamTruckGameCtrl:InitData() self.tbItems = { [1] = 0, [2] = 0 } self.tbCurrentSlots = {} self.CurrentScore = 0 self.NumOrder = 0 self.PropCount = 0 self.MaxStreakCount = 0 self.OrderBaseScore = 100 self.CurrentMaxOrderNum = self.LevelData.CustomerCount self.PeopleNum = self.CurrentMaxOrderNum self.MaxHp = self.LevelData.Health self.CurrentHP = self.MaxHp self.ServeCustomer = nil self.ServeCustomerId = nil self.bIsSpecial = false self.CurrentOrders = nil self.TargetScore = self.LevelData.PassScore self.TargetOrderNum = self.LevelData.OrderNum self.fSpeedScale = 1 self.bFreezePatience = false self.bAutoOrder = false self.nDicId = self.LevelData.DictionaryId if 0 < self.CurrentMaxOrderNum then NovaAPI.SetTMPText(self._mapNode.txt_PeopleNum, self.CurrentMaxOrderNum) else local sTip = ConfigTable.GetUIText("IceCreamTruck_Endless") NovaAPI.SetTMPText(self._mapNode.txt_PeopleNum, sTip) end end function IceCreamTruckGameCtrl:InitPlayLevel(nActId, nLevelId) self.IceCreamActData = PlayerData.Activity:GetActivityDataById(nActId) if self.IceCreamActData == nil then printError("没有冰淇淋活动数据") return end self.IceCreamActData:EnterLevel(nLevelId) self.LevelData = ConfigTable.GetData("ActivityIceCreamLevel", nLevelId) if self.LevelData == nil then printError("关卡ID:" .. nLevelId .. "对应信息不存在") return end end function IceCreamTruckGameCtrl.GetInstance() if IceCreamTruckGameCtrl._instance == nil then printWarn("[IceCream] GameCtrl 单例为空:可能尚未 OnEnable 或已 OnDisable") end return IceCreamTruckGameCtrl._instance end function IceCreamTruckGameCtrl:RecoverPlay() EventManager.Hit("Event_SetPause", true) EventManager.Hit(EventId.BlockInput, true) self._mapNode.obj_Time:SetActive(true) local imgBlurredBg = self._mapNode.obj_Time.transform:Find("t_fullscreen_blur_black") local Times = self._mapNode.obj_Time.transform:Find("AnimRoot") local wait = function() coroutine.yield(CS.UnityEngine.WaitForEndOfFrame()) Times.gameObject:SetActive(true) end cs_coroutine.start(wait) imgBlurredBg.gameObject:SetActive(true) WwiseAudioMgr:PostEvent("mode_400013_count") self.nTimeRecover = 1 self:_RefreshRecoverImage() if self.timerRecover == nil then self.timerRecover = self:AddTimer(0, 1, self.OnEvent_RecoverPlay, true, true, false) end end function IceCreamTruckGameCtrl:_RefreshRecoverImage() for k, _ in ipairs(self._mapNode.ImgTime) do self._mapNode.ImgTime[k]:SetActive(self.nTimeRecover == k) end end function IceCreamTruckGameCtrl:OnEvent_RecoverPlay() self.nTimeRecover = self.nTimeRecover + 1 if self.nTimeRecover > 3 then if self.timerRecover then TimerManager.Remove(self.timerRecover) self.timerRecover = nil end self._mapNode.obj_Time:SetActive(false) local imgBlurredBg = self._mapNode.obj_Time.transform:Find("t_fullscreen_blur_black") local Times = self._mapNode.obj_Time.transform:Find("AnimRoot") Times.gameObject:SetActive(false) imgBlurredBg.gameObject:SetActive(false) EventManager.Hit(EventId.BlockInput, false) EventManager.Hit("Event_SetPause", false) return end self:_RefreshRecoverImage() end local _tbBuffItemId2Slot = { [101] = 1, [102] = 2, [103] = 3, [105] = 4 } function IceCreamTruckGameCtrl:RefreshBuffRoot() for k, _ in ipairs(self._mapNode.rtBuff) do self._mapNode.rtBuff[k].gameObject:SetActive(false) end self._mapNode.obj_DoubleBg:SetActive(false) self._mapNode.BuffCool:SetActive(false) self._mapNode.BuffDouble:SetActive(false) self._mapNode.BuffAutomatic:SetActive(false) end function IceCreamTruckGameCtrl:SetBuffShow(nBuffId, bShow) local nSlot = _tbBuffItemId2Slot[nBuffId] if nSlot == nil then return end self._mapNode.rtBuff[nSlot]:SetActive(bShow) if nBuffId == 103 then self._mapNode.obj_DoubleBg:SetActive(bShow) self._mapNode.BuffDouble:SetActive(bShow) elseif nBuffId == 101 then self._mapNode.BuffCool:SetActive(bShow) elseif nBuffId == 105 then self._mapNode.BuffAutomatic:SetActive(bShow) end end function IceCreamTruckGameCtrl:SetBuffTime(nBuffId, nTime) local nSlot = _tbBuffItemId2Slot[nBuffId] if nSlot == nil then return end local ntime = math.floor(nTime) if ntime < 0 then ntime = 0 end local nMin = math.floor(ntime / 60) local nSec = ntime % 60 NovaAPI.SetTMPText(self._mapNode.TMPBuffTime[nSlot], string.format("%02d:%02d", nMin, nSec)) end function IceCreamTruckGameCtrl:OnEvent_IceCreamBuffStart(nBuffType, nItemId, nDuration) if nDuration == nil or nDuration <= 0 then return end self:SetBuffShow(nItemId, true) self:SetBuffTime(nItemId, nDuration) end function IceCreamTruckGameCtrl:OnEvent_IceCreamBuffTick(nBuffType, nItemId, nLeftSec) self:SetBuffTime(nItemId, nLeftSec or 0) end function IceCreamTruckGameCtrl:OnEvent_IceCreamBuffEnd(nBuffType, nItemId) self:SetBuffShow(nItemId, false) end function IceCreamTruckGameCtrl:SetBuffBag() local bShow = self.LevelData.LevelType ~= GameEnum.ActivityIceCreamLevelType.Teaching self._mapNode.obj_BuffBag:SetActive(bShow) end function IceCreamTruckGameCtrl:IsHaveNewGuide() if self.LevelData == nil then return false end local nLevelType = self.LevelData.LevelType if nLevelType == GameEnum.ActivityIceCreamLevelType.Teaching or nLevelType == GameEnum.ActivityIceCreamLevelType.Common then return true end return false end function IceCreamTruckGameCtrl:GetNewGuideObj(nEnum) self._tbGuideObjs = self._tbGuideObjs or {} local cached = self._tbGuideObjs[nEnum] if cached ~= nil then return cached end local trCondiment = self:GetCondimentTrByEnum(nEnum) if trCondiment == nil then return nil end local trGuide = trCondiment.transform:Find("obj_New") if trGuide == nil or trGuide:IsNull() then return nil end local go = trGuide.gameObject go:SetActive(false) self._tbGuideObjs[nEnum] = go return go end function IceCreamTruckGameCtrl:_GuideArm() if not self:IsHaveNewGuide() then return end if self.bAutoOrder or self._bAutoFinishing then return end if self.bIsOperateMiss then return end if self.CurrentOrders == nil then return end if self.CurrentOrders:GetNextStepIndex() == nil then return end self:_GuideHide() if self.guideTimer ~= nil then self.guideTimer:Reset() else self.guideTimer = self:AddTimer(1, self._fGuideIdleSec, "_GuideShow", true, true) end end function IceCreamTruckGameCtrl:_GuideShow() self.guideTimer = nil if not self:IsHaveNewGuide() then return end if self.bIPause then return end if self.bAutoOrder or self._bAutoFinishing then return end if self.bIsOperateMiss then return end if self.CurrentOrders == nil then return end local nNextStep = self.CurrentOrders:GetNextStepIndex() if nNextStep == nil then return end local nValue = self.tbCurrentSlots and self.tbCurrentSlots[nNextStep] if nValue == nil or nValue == 0 then return end local go = self:GetNewGuideObj(nValue) if go == nil then return end go:SetActive(true) self._nGuideCurEnum = nValue end function IceCreamTruckGameCtrl:_GuideHide() if self._nGuideCurEnum == nil then return end local go = self._tbGuideObjs and self._tbGuideObjs[self._nGuideCurEnum] if go ~= nil then go:SetActive(false) end self._nGuideCurEnum = nil end function IceCreamTruckGameCtrl:_GuideClear() self:_GuideHide() if self.guideTimer ~= nil then TimerManager.Remove(self.guideTimer) self.guideTimer = nil end end function IceCreamTruckGameCtrl:_GetGarbageGuideObj() if self._goGarbageGuide ~= nil then return self._goGarbageGuide end local btn = self._mapNode.btn_Garbage if btn == nil then return nil end local trGuide = btn.gameObject.transform:Find("AnimRoot/obj_New") if trGuide == nil or trGuide:IsNull() then return nil end local go = trGuide.gameObject go:SetActive(false) self._goGarbageGuide = go return go end function IceCreamTruckGameCtrl:_GuideArmGarbage() if not self:IsHaveNewGuide() then return end if not self.bIsOperateMiss then return end self:_GuideHideGarbage() if self.garbageGuideTimer ~= nil then self.garbageGuideTimer:Reset() else self.garbageGuideTimer = self:AddTimer(1, self._fGuideIdleSec, "_GuideShowGarbage", true, true) end end function IceCreamTruckGameCtrl:_GuideShowGarbage() self.garbageGuideTimer = nil if not self:IsHaveNewGuide() then return end if self.bIPause then return end if not self.bIsOperateMiss then return end local go = self:_GetGarbageGuideObj() if go == nil then return end go:SetActive(true) self._bGarbageGuideShow = true end function IceCreamTruckGameCtrl:_GuideHideGarbage() if not self._bGarbageGuideShow then return end if self._goGarbageGuide ~= nil then self._goGarbageGuide:SetActive(false) end self._bGarbageGuideShow = false end function IceCreamTruckGameCtrl:_GuideClearGarbage() self:_GuideHideGarbage() if self.garbageGuideTimer ~= nil then TimerManager.Remove(self.garbageGuideTimer) self.garbageGuideTimer = nil end end function IceCreamTruckGameCtrl:OnBtn_ClickCondiment(_btn) if self.bInIcon1Ani then return end if self._bAutoFinishing then return end local nValue = tonumber(_btn.gameObject.transform:GetChild(0).name) if nValue == nil then printError("没有拿到节点下存放的枚举数字") return end self:_ClickCondiment(nValue) end function IceCreamTruckGameCtrl:OnBtn_Star() if self._bIsOpening then return end self:GameEnd_Pre(false) self._bIsOpening = true self._mapNode.ani_Start:Play("btn_Start_out", 0, 0) EventManager.Hit("Event_SetPause", false) EventManager.Hit("Event_StartBusiness") self.animatorRoot:Play("IceCreamPlayPanel_in", 0, 0) EventManager.Hit(EventId.TemporaryBlockInput, 0.5) local nDur = NovaAPI.GetAnimClipLength(self._mapNode.ani_Start, { "btn_Start_out" }) if type(nDur) ~= "number" or nDur <= 0 then nDur = 1.0 end cs_coroutine.start(function() coroutine.yield(CS.UnityEngine.WaitForSeconds(nDur)) self._mapNode.obj_Start:SetActive(false) end) end function IceCreamTruckGameCtrl:_ClickCondiment(nValue) if self.CurrentOrders == nil then return end if self.bIsOperateMiss then local sTip = ConfigTable.GetUIText("IceCreamTruck_IceCreamBadTips") EventManager.Hit(EventId.OpenMessageBox, sTip) return end self:Cline_Spine(nValue) self:_GuideHide() local nNextStep = self.CurrentOrders:GetNextStepIndex() if nNextStep == nil then return end self.nSlotIndex = nNextStep if self.CurrentOrders:CheckStep(self.nSlotIndex, nValue) then self:CreatIceCreamIcon(self.nSlotIndex, self.tbCurrentSlots[self.nSlotIndex]) if self.CurrentOrders:IsOrderComplete() then local nOrderState = self.CurrentOrders:GetOrderState() local nCharacterId = self.CurrentOrders:GetCharacterId() self:_ScheduleClearIconsDelayed(0.5) self:_GuideClear() self:Event_FinishCurrentOrder(nOrderState, nCharacterId) else self:_GuideArm() end else self.bIsOperateMiss = true self:ClearIceCreamIcon(self.bIsOperateMiss) self._mapNode.obj_BadIceCream:SetActive(self.bIsOperateMiss) self:_GuideClear() self:_GuideArmGarbage() EventManager.Hit("Event_OrderMakeMistake", self.ServeCustomerId) self.ScoreCalc:OnMistake() if self.bInFever then self:_SetProgressBarPercent(self._rtProgressBarFever, self._fProgressBarFeverWidth, self.ScoreCalc:GetFeverPercent()) else self:RefreshFever() end self:RefreshScoreUI() end end function IceCreamTruckGameCtrl:_ScheduleClearIconsDelayed(fDelay) local nGen = self._nRestartGen or 0 cs_coroutine.start(function() coroutine.yield(CS.UnityEngine.WaitForSeconds(fDelay or 0.5)) if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then return end self:ClearIceCreamIcon() end) end function IceCreamTruckGameCtrl:_ScheduleClearAfterFail(fDelay) local nGen = self._nRestartGen or 0 cs_coroutine.start(function() coroutine.yield(CS.UnityEngine.WaitForSeconds(fDelay or 1.0)) if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then return end self:ClearIceCreamIcon() self._mapNode.obj_BadIceCream:SetActive(false) WwiseAudioMgr:PostEvent("mode_400013_rubbish") self._mapNode.btn_Garbage.transform:Find("AnimRoot").gameObject:GetComponent("Animator"):Play("btn_Garbage_in", 0, 0) end) end function IceCreamTruckGameCtrl:OnBtn_DropGarbage(_btn) if not self.bIsOperateMiss then return end WwiseAudioMgr:PostEvent("mode_400013_rubbish") self:_GuideClearGarbage() self.bIsOperateMiss = false self._mapNode.obj_BadIceCream:SetActive(self.bIsOperateMiss) self:ClearIceCreamIcon() self._mapNode.btn_Garbage.transform:Find("AnimRoot").gameObject:GetComponent("Animator"):Play("btn_Garbage_in", 0, 0) self:BeginMakeNewIceCream() end function IceCreamTruckGameCtrl:OnBtn_UseBuffItem1(_btn) local ItemId = tonumber(_btn.gameObject.transform:GetChild(0).name) local nIndex = 1 self:UseBuffItem(ItemId, nIndex) end function IceCreamTruckGameCtrl:OnBtn_UseBuffItem2(_btn) local ItemId = tonumber(_btn.gameObject.transform:GetChild(0).name) local nIndex = 2 self:UseBuffItem(ItemId, nIndex) end function IceCreamTruckGameCtrl:UseBuffItem(ItemId, nIndex) if self.BuffRuntime == nil then if not self._bIsExiting then printError("BuffRuntime 未初始化") end return end local bOk = self.BuffRuntime:TryUseBuff(ItemId) if not bOk then local sTip = ConfigTable.GetUIText("IceCreamTruck_BuffUseTips") EventManager.Hit(EventId.OpenMessageBox, sTip) return end self:OpenTips(ItemId) self.PropCount = self.PropCount + 1 self.IceCreamActData.IceCreamLevelData:UseBuffsItem(ItemId, nIndex) self:RefreshBuffItems(nIndex) end function IceCreamTruckGameCtrl:OpenTips(nBuffId) local sUItextId = "" if nBuffId == 101 then sUItextId = ConfigTable.GetUIText("IceCreamTruck_BuffTips_101") elseif nBuffId == 102 then sUItextId = ConfigTable.GetUIText("IceCreamTruck_BuffTips_102") elseif nBuffId == 103 then sUItextId = ConfigTable.GetUIText("IceCreamTruck_BuffTips_103") elseif nBuffId == 104 then sUItextId = ConfigTable.GetUIText("IceCreamTruck_BuffTips_104") elseif nBuffId == 105 then sUItextId = ConfigTable.GetUIText("IceCreamTruck_BuffTips_105") end if sUItextId == "" then return end EventManager.Hit(EventId.OpenMessageBox, sUItextId) end function IceCreamTruckGameCtrl:BeginMakeNewIceCream() if self.CurrentOrders == nil then printError("BeginMakeNewIceCream: 没有当前订单") return end self.nSlotIndex = 0 self.tbCurrentSlots = self.CurrentOrders:GetSlots() local nFirstStep = self.CurrentOrders:GetNextStepIndex() if nFirstStep == nil then printError("订单是空的") return end self.nSlotIndex = nFirstStep self.CurrentOrders:CheckStep(self.nSlotIndex, self.tbCurrentSlots[self.nSlotIndex]) printLog("生成蛋筒" .. self.tbCurrentSlots[self.nSlotIndex]) self:CreatIceCreamIcon(self.nSlotIndex, self.tbCurrentSlots[self.nSlotIndex]) self._fConePlacedTime = CS.UnityEngine.Time.time self:_GuideArm() end function IceCreamTruckGameCtrl:CreatIceCreamIcon(nStep, CondimentType) if CondimentType == 0 then return end if self.CurrentOrders == nil then return end local nDisplay = self.CurrentOrders:GetDisplayIndex(nStep) if nDisplay == nil then return end local objIcon = self._mapNode.obj_Icon[nDisplay] if objIcon == nil then printError("[IceCream] obj_Icon 节点缺失 display=" .. tostring(nDisplay)) return end local IconPath = IceCreamUtils.SetCondimentIcon(nStep, CondimentType) if IconPath == "" then printError("资源路径是空的 step=" .. tostring(nStep) .. " condiment=" .. tostring(CondimentType)) objIcon:SetActive(false) return end if nDisplay == 1 then self.bInIcon1Ani = true local imgIconBall = objIcon.transform:Find("IconBall"):GetComponent("Image") self:SetActivityAtlasSprite_New(imgIconBall, "_400013/SpriteAtlas/Item", IconPath) objIcon:SetActive(true) local nGen = self._nRestartGen or 0 cs_coroutine.start(function() coroutine.yield(CS.UnityEngine.WaitForSeconds(self:_GetAutoIcon1ClipSec())) if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then return end self.bInIcon1Ani = false end) else objIcon:SetActive(true) self:SetWorkIceBall(nDisplay, nStep, IconPath) end end function IceCreamTruckGameCtrl:SetWorkIceBall(nDisplay, nStep, IconPath) local objIcon = self._mapNode.obj_Icon[nDisplay] if objIcon == nil then return end local trIconBall = objIcon.transform:Find("IconBall") local trIconSauce = objIcon.transform:Find("IconSauce") if trIconBall == nil or trIconSauce == nil then printError("[IceCream] obj_Icon[" .. tostring(nDisplay) .. "] 缺少 IconBall / IconSauce 子节点") return end self:_DestroySauceInstance(nDisplay) if nStep == IceCreamUtils.EnumSlotType.SLOT_TOPPING then trIconBall.gameObject:SetActive(false) trIconSauce.gameObject:SetActive(true) local sPath = "UI_Activity/_400013/" .. IconPath .. ".prefab" local prefab = GameResourceLoader.LoadAsset(ResTypeAny, Settings.AB_ROOT_PATH .. sPath, typeof(Object)) if prefab == nil then printError("[IceCream] 加载淋酱预制体失败 path=" .. sPath) return end local goSauce = instantiate(prefab, trIconSauce) if goSauce == nil then printError("[IceCream] instantiate 淋酱预制体失败 path=" .. sPath) return end self._tbSauceInstance = self._tbSauceInstance or {} self._tbSauceInstance[nDisplay] = goSauce else trIconSauce.gameObject:SetActive(false) trIconBall.gameObject:SetActive(true) local imgIconBall = trIconBall:GetComponent("Image") self:SetActivityAtlasSprite_New(imgIconBall, "_400013/SpriteAtlas/Item", IconPath) end end function IceCreamTruckGameCtrl:ClearIceCreamIcon(bSetBadIceCream) if self._mapNode.obj_Icon == nil then return end for key, objIcon in ipairs(self._mapNode.obj_Icon) do if not bSetBadIceCream or key ~= 1 then if objIcon ~= nil then objIcon:SetActive(false) end self:_DestroySauceInstance(key) end end end function IceCreamTruckGameCtrl:_DestroySauceInstance(nDisplay) if self._tbSauceInstance == nil then return end local go = self._tbSauceInstance[nDisplay] if go ~= nil then destroy(go) self._tbSauceInstance[nDisplay] = nil end end function IceCreamTruckGameCtrl:_DestroyAllSauceInstances() if self._tbSauceInstance == nil then return end for k, go in pairs(self._tbSauceInstance) do if go ~= nil then destroy(go) end self._tbSauceInstance[k] = nil end end function IceCreamTruckGameCtrl:RefreshBuffItems(nIndex) local tbCurrentItems = self.IceCreamActData.IceCreamLevelData:GetCurrentBuffs() if not tbCurrentItems then return end self:RefreshBuffItemSlot(self._mapNode.btn_BuffItem1, tbCurrentItems[1]) self:RefreshBuffItemSlot(self._mapNode.btn_BuffItem2, tbCurrentItems[2]) if nIndex == nil then self:RefreshBuffItemSlot(self._mapNode.btn_BuffItem1, tbCurrentItems[1], true) self:RefreshBuffItemSlot(self._mapNode.btn_BuffItem2, tbCurrentItems[2], true) else self:RefreshBuffItemSlot(self._mapNode.btn_BuffItem1, tbCurrentItems[1], nIndex == 1) self:RefreshBuffItemSlot(self._mapNode.btn_BuffItem2, tbCurrentItems[2], nIndex == 2) end end function IceCreamTruckGameCtrl:RefreshBuffItemSlot(btn_BuffItem, tbCurrentItem, bPlayAni) btn_BuffItem.gameObject:SetActive(tbCurrentItem ~= 0) btn_BuffItem.transform:GetChild(0).name = tostring(tbCurrentItem or 0) if tbCurrentItem ~= 0 then local IconPath = ConfigTable.GetData("IceCreamBuff", tbCurrentItem).Icon if IconPath == nil then btn_BuffItem.gameObject:SetActive(false) printError("道具资源路径为空,ID: " .. tbCurrentItem) else local ItemIcon = btn_BuffItem.transform:Find("imgItem"):GetComponent("Image") if bPlayAni then btn_BuffItem.transform:GetComponent("Animator"):Play("BuffItem_in", 0, 0) end self:SetActivityAtlasSprite_New(ItemIcon, "_400013/SpriteAtlas", IconPath) end end end function IceCreamTruckGameCtrl:OnBtn_OpenBagPanel() if PanelManager.CheckPanelOpen(PanelId.IceCreamBackPackPanel) then return end EventManager.Hit(EventId.TemporaryBlockInput, 0.4) local tbCurrentItems = self.IceCreamActData.IceCreamLevelData:GetCurrentBuffs() self._mapNode.IceCreamBackPackPanel:OpenBackPack(tbCurrentItems) end function IceCreamTruckGameCtrl:BuildBuffCtrl() return { scoreCalc = self.ScoreCalc, getSpeedScale = function() return self.fSpeedScale or 1 end, setSpeedScale = function(f) self.fSpeedScale = f or 1 EventManager.Hit("Event_IceCreamSpeedScaleChanged", self.fSpeedScale) self:_ApplySpeedScaleToLocalTimers(self.fSpeedScale) end, resetCustomerPatience = function() if self.ServeCustomer then self.ServeCustomer.PatienceValue = self.ServeCustomer.MaxPatienceValue end end, freezeCustomerPatience = function(bFreeze) self.bFreezePatience = bFreeze and true or false EventManager.Hit("Event_IceCreamPatienceFreeze", self.bFreezePatience) end, addHp = function(nAdd) self:AddHp(nAdd or 0) end, setAutoOrderMode = function(bOn) self:SetAutoOrderMode(bOn and true or false) end } end function IceCreamTruckGameCtrl:AddHp(nAdd) if nAdd <= 0 then return end if 0 >= self.MaxHp then return end self:RefreshHP(nAdd) end function IceCreamTruckGameCtrl:SetAutoOrderMode(bOn) if bOn then if self.bIsOperateMiss then self:OnBtn_DropGarbage() end self.bAutoOrder = true self:TryAutoFinishCurrentOrder() else self:TryAutoFinishCurrentOrder() self.bAutoOrder = false self:ResyncServeCustomer() self:_GuideArm() end end function IceCreamTruckGameCtrl:TryAutoFinishCurrentOrder() if not self.bAutoOrder then return end if self._bAutoFinishing then return end local orders = self.CurrentOrders local nServeId = self.ServeCustomerId if orders == nil or nServeId == nil then return end if orders:IsFinished() then return end self._bAutoFinishing = true local nLockedServeId = nServeId local nGen = self._nRestartGen or 0 local fStepInterval = 0.25 cs_coroutine.start(function() coroutine.yield(CS.UnityEngine.WaitForEndOfFrame()) local fIcon1 = self:_GetAutoIcon1ClipSec() if 0 < fIcon1 and self._fConePlacedTime ~= nil then local fRemain = self._fConePlacedTime + fIcon1 - CS.UnityEngine.Time.time if 0 < fRemain then coroutine.yield(CS.UnityEngine.WaitForSeconds(fRemain)) end end while true do if self.bIPause then coroutine.yield(CS.UnityEngine.WaitForEndOfFrame()) if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then self._bAutoFinishing = false return end if self.ServeCustomerId ~= nLockedServeId then self._bAutoFinishing = false return end else if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() or self.ServeCustomerId ~= nLockedServeId or self.CurrentOrders == nil or self.bIsOperateMiss then break end local nNextStep = self.CurrentOrders:GetNextStepIndex() if nNextStep == nil then break end local nValue = self.tbCurrentSlots and self.tbCurrentSlots[nNextStep] if nValue == nil or nValue == 0 then break end self:_ClickCondiment(nValue) coroutine.yield(CS.UnityEngine.WaitForSeconds(fStepInterval)) end end self._bAutoFinishing = false end) end function IceCreamTruckGameCtrl:_GetAutoIcon1ClipSec() local fSec = 0 local objIcon = self._mapNode.obj_Icon and self._mapNode.obj_Icon[1] if objIcon ~= nil then if self._fAutoIcon1ClipSec ~= nil then return self._fAutoIcon1ClipSec end local trIconBall = objIcon.transform:Find("IconBall") if trIconBall ~= nil and not trIconBall:IsNull() then local animator = trIconBall:GetComponent("Animator") if animator ~= nil then local fDur = NovaAPI.GetAnimClipLength(animator, { "WorkIceCream_Icon1_in" }) if type(fDur) == "number" and 0 < fDur then fSec = fDur end end end end self._fAutoIcon1ClipSec = fSec return fSec end local tbHitQueue = {} local tbHitWorker = {} function IceCreamTruckGameCtrl:SafeHitNextFrame(sEventId, ...) local q = tbHitQueue[sEventId] if q == nil then q = {} tbHitQueue[sEventId] = q end local pack = { n = select("#", ...), ... } table.insert(q, pack) if tbHitWorker[sEventId] then return end tbHitWorker[sEventId] = true local nGen = self._nRestartGen or 0 cs_coroutine.start(function() while true do coroutine.yield(CS.UnityEngine.WaitForEndOfFrame()) if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then return end local queue = tbHitQueue[sEventId] if queue == nil or #queue == 0 then break end local args = table.remove(queue, 1) local ok, err = pcall(EventManager.Hit, sEventId, table.unpack(args, 1, args.n)) if not ok then printError(string.format("[SafeHitNextFrame] Hit %s 失败:%s", tostring(sEventId), tostring(err))) end end tbHitWorker[sEventId] = nil end) end function IceCreamTruckGameCtrl:Event_BagUseItem(nItemId, nIndex) self:UseBuffItem(nItemId, nIndex) end function IceCreamTruckGameCtrl:Event_GetNewItem(ItemId) local nIndex = self.IceCreamActData.IceCreamLevelData:GetNewBuffItem(ItemId) self:RefreshBuffItems(nIndex) end function IceCreamTruckGameCtrl:Event_CustomerReadyToServe(customerItem) if customerItem == nil then printError("没有顾客就绪") return end if self.ServeCustomer == customerItem then if self.bAutoOrder then self:TryAutoFinishCurrentOrder() end return end self:BindServeCustomer(customerItem) if self.bAutoOrder then self:TryAutoFinishCurrentOrder() end end function IceCreamTruckGameCtrl:BindServeCustomer(customerItem) if customerItem == nil then return end self.ServeCustomer = customerItem self.ServeCustomerId = customerItem:GetCustomerId() self.bIsSpecial = customerItem:IsSpecial() self.CurrentOrders = customerItem:GetOrdersCtrl() if customerItem._SyncGlobalRuntimeState ~= nil then customerItem:_SyncGlobalRuntimeState() else customerItem:FeverModeChanged(self.bInFever) end if self.CurrentOrders and self.CurrentOrders:IsFresh() then self:BeginMakeNewIceCream() else self.tbCurrentSlots = self.CurrentOrders and self.CurrentOrders:GetSlots() or nil self:_GuideArm() end end function IceCreamTruckGameCtrl:ResyncServeCustomer() if self.ServeCustomer ~= nil then return end local queue = self._mapNode and self._mapNode.CustomerQueue if queue == nil then return end local customerItem = queue:GetServingCustomer() if customerItem == nil then return end if not customerItem:IsReadyToServe() then return end self:BindServeCustomer(customerItem) end function IceCreamTruckGameCtrl:Event_FinishCurrentOrder(OrderState, nCharacterId) printLog(string.format("[IceCream] Event_FinishCurrentOrder IN state=%s argId=%s serveId=%s", tostring(OrderState), tostring(nCharacterId), tostring(self.ServeCustomerId))) if self.ServeCustomerId == nil then printLog("[IceCream] Event_FinishCurrentOrder 拦截:ServeCustomerId 为空") return end if nCharacterId ~= nil and nCharacterId ~= self.ServeCustomerId then nCharacterId = self.ServeCustomerId end self:RefreshPeopleNumber() local bSucceed = OrderState ~= IceCreamUtils.EnumOrderState.Lose if bSucceed then local bJustEnteredFever = self.ScoreCalc:OnOrderSuccess(self.bIsSpecial) if not bJustEnteredFever then WwiseAudioMgr:PostEvent("mode_400013_feverup") end self.NumOrder = self.NumOrder + 1 if self.ScoreCalc:GetCombo() > self.MaxStreakCount then self.MaxStreakCount = self.ScoreCalc:GetCombo() end local nScore, tbDetail = self.ScoreCalc:CalcOrderScore(self.OrderBaseScore) self.CurrentScore = self.CurrentScore + nScore self:ShowScorePopup(tbDetail) if bJustEnteredFever then self.bInFever = true EventManager.Hit("Event_FeverModeChanged", true) elseif self.ScoreCalc:HasFever() then if not self.bInFever then self._mapNode.EffectRootAnim:Play("EffectRoot_trail") end self:RefreshFever() end else self.ScoreCalc:OnOrderFail() self:RefreshFever() if self.MaxHp > 0 and 0 < self.CurrentHP then self:RefreshHP(-1) if self.CurrentHP == 0 then self:FeverModeFinish() end end self:_ScheduleClearAfterFail() if self.bIsOperateMiss then self.bIsOperateMiss = false self:_GuideClearGarbage() end end local nLeavingId = self.ServeCustomerId local lastServeCustomer = self.ServeCustomer self.ServeCustomer = nil self.ServeCustomerId = nil self.bIsSpecial = false self.CurrentOrders = nil self.tbCurrentSlots = nil self:SafeHitNextFrame("Event_FirstCustomerLeave", nLeavingId, bSucceed) self:RefreshScoreUI() self.CurrentMaxOrderNum = self.CurrentMaxOrderNum - 1 if self.CurrentMaxOrderNum == 0 then self:GameEnd_Pre(true) local nGen = self._nRestartGen or 0 if lastServeCustomer ~= nil and lastServeCustomer.SetOnOrderOutDone ~= nil then lastServeCustomer:SetOnOrderOutDone(function() if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then return end self:AllCustomersFinish() end) else self:AllCustomersFinish() end end end function IceCreamTruckGameCtrl:Event_CustomerLeave_False(nCharacterId) if self.ServeCustomerId == nil or nCharacterId ~= self.ServeCustomerId then return end self:Event_FinishCurrentOrder(IceCreamUtils.EnumOrderState.Lose, nCharacterId) end function IceCreamTruckGameCtrl:Event_SetPause(bPause) self.bIPause = bPause if self.feverTimer ~= nil then self.feverTimer:Pause(self.bIPause) end if self._feverBarTweener ~= nil then if bPause then self._feverBarTweener:Pause() else self._feverBarTweener:Play() end end if self.guideTimer ~= nil then self.guideTimer:Pause(bPause) end if self.garbageGuideTimer ~= nil then self.garbageGuideTimer:Pause(bPause) end if self.BuffRuntime == nil then if not self._bIsExiting then printError("BuffRuntime 未初始化") end return end self.BuffRuntime:InPause(bPause) if not bPause and self._nGuideCurEnum == nil and self.guideTimer == nil then self:_GuideArm() end if not bPause and self.bIsOperateMiss and not self._bGarbageGuideShow and self.garbageGuideTimer == nil then self:_GuideArmGarbage() end if bPause then WwiseAudioMgr:PostEvent("mode_400013_pause") WwiseAudioMgr:PlaySound("activityMinGame_icecream_allstop_vo", WwiseAudioMgr.AkListener, true) else WwiseAudioMgr:PostEvent("mode_400013_re") end if self.timerFeverCutinHide ~= nil then self.timerFeverCutinHide:Pause(bPause) end if self.timerFeverCutinDeactivate ~= nil then self.timerFeverCutinDeactivate:Pause(bPause) end end function IceCreamTruckGameCtrl:RefreshScoreUI() self._mapNode.txt_LevelScore.gameObject.transform:GetComponent("Animator"):Play("txt_LevelScore_in", 0, 0) if 0 < self.TargetScore and self.CurrentScore >= self.TargetScore then self._mapNode.iconCert:SetActive(true) else self._mapNode.iconCert:SetActive(false) end NovaAPI.SetTMPText(self._mapNode.txt_LevelScore, self.CurrentScore) end function IceCreamTruckGameCtrl:RefreshPeopleNumber() if self.CurrentMaxOrderNum > 0 then self.PeopleNum = self.PeopleNum - 1 NovaAPI.SetTMPText(self._mapNode.txt_PeopleNum, self.PeopleNum) end end function IceCreamTruckGameCtrl:_InitFeverProgressBarWidth() local rtMask = self._mapNode.img_ProgressBarMask.gameObject:GetComponent("RectTransform") self._fProgressBarWidth = rtMask.rect.width self._rtProgressBar = self._mapNode.img_ProgressBar.gameObject:GetComponent("RectTransform") local rtMaskFever = self._mapNode.img_ProgressBarFeverMask.gameObject:GetComponent("RectTransform") self._fProgressBarFeverWidth = rtMaskFever.rect.width self._rtProgressBarFever = self._mapNode.img_ProgressBarFever.gameObject:GetComponent("RectTransform") end function IceCreamTruckGameCtrl:_SetProgressBarPercent(rtBar, fWidth, fPercent) if rtBar == nil or fWidth == nil then return end if rtBar == self._rtProgressBarFever then self:_KillFeverBarTween() end fPercent = math.max(0, math.min(1, fPercent or 0)) local vPos = rtBar.anchoredPosition rtBar.anchoredPosition = Vector2(-fWidth * (1 - fPercent), vPos.y) end function IceCreamTruckGameCtrl:_SetProgressBarPercentSmooth(rtBar, fWidth, fPercent, fDur) if rtBar == nil or fWidth == nil then return end fPercent = math.max(0, math.min(1, fPercent or 0)) fDur = fDur or 1 local fTargetX = -fWidth * (1 - fPercent) self:_KillFeverBarTween() self._feverBarTweener = rtBar:DOAnchorPosX(fTargetX, fDur) if self._feverBarTweener ~= nil then self._feverBarTweener:SetEase(CS.DG.Tweening.Ease.Linear) if self.bIPause then self._feverBarTweener:Pause() end local fScale = self.fSpeedScale or 1 if 0 < fScale and fScale ~= 1 then self._feverBarTweener.timeScale = fScale end end end function IceCreamTruckGameCtrl:_KillFeverBarTween() if self._feverBarTweener ~= nil then self._feverBarTweener:Kill() self._feverBarTweener = nil end end function IceCreamTruckGameCtrl:SetFeverPattern() local bHasFeverMode = self.ScoreCalc:HasFever() self._mapNode.obj_Fever:SetActive(bHasFeverMode) self._mapNode.obj_FeverSpecial:SetActive(bHasFeverMode) self:Fever_ShowSpecialSpine(bHasFeverMode) if bHasFeverMode then self:_InitFeverProgressBarWidth() self:_SetProgressBarPercent(self._rtProgressBar, self._fProgressBarWidth, 0) self:_SetProgressBarPercent(self._rtProgressBarFever, self._fProgressBarFeverWidth, 1) self.bInFever = false self._mapNode.obj_FeverSpecial:SetActive(self.bInFever) self:Fever_ShowSpecialSpine(self.bInFever) end end function IceCreamTruckGameCtrl:SetHpPattern() self._mapNode.obj_Hp:SetActive(self.MaxHp > 0) if self.MaxHp > 0 then for key = 1, self.MaxHp do self._mapNode.RedHeartAnimator[key]:Play("RedHeart_in", 0, 0) end end end function IceCreamTruckGameCtrl:SetScoreTarget() if self.TargetScore <= 0 then self._mapNode.iconCert:SetActive(false) local tips = ConfigTable.GetUIText("IceCreamTruck_AllScore") NovaAPI.SetTMPText(self._mapNode.txt_LevelScoreTitle, tips) else local nScoreTarget = self.TargetScore local scoreTargetTips = orderedFormat(ConfigTable.GetUIText("IceCreamTruck_ScoreTarget") or "", nScoreTarget) NovaAPI.SetTMPText(self._mapNode.txt_LevelScoreTitle, scoreTargetTips) end end function IceCreamTruckGameCtrl:RefreshHP(nAdd) if 0 < nAdd then if self.CurrentHP == self.MaxHp then return end self.CurrentHP = math.min(self.CurrentHP + nAdd, self.MaxHp) self._mapNode.RedHeartAnimator[self.CurrentHP]:Play("RedHeart_in", 0, 0) WwiseAudioMgr:PostEvent("mode_400013_heal") else self._mapNode.RedHeartAnimator[self.CurrentHP]:Play("RedHeart_out", 0, 0) self.CurrentHP = self.CurrentHP - 1 WwiseAudioMgr:PostEvent("mode_400013_pain") end end function IceCreamTruckGameCtrl:_FlashProgressBarTail() local cg = self._mapNode.img_ProgressBar1 if cg == nil then return end if self._progressBarTailTweener ~= nil then self._progressBarTailTweener:Kill() self._progressBarTailTweener = nil end NovaAPI.SetCanvasGroupAlpha(cg, 1) self._progressBarTailTweener = cg:DOFade(0, 1) end function IceCreamTruckGameCtrl:RefreshFever() self:_SetProgressBarPercent(self._rtProgressBar, self._fProgressBarWidth, self.ScoreCalc:GetFeverPercent()) self:_FlashProgressBarTail() end function IceCreamTruckGameCtrl:RefreshFever_Special() self:_SetProgressBarPercentSmooth(self._rtProgressBarFever, self._fProgressBarFeverWidth, self.ScoreCalc:GetFeverPercent(), 1) end function IceCreamTruckGameCtrl:Fever_ShowSpecialSpine(bShow) self._mapNode.spCat:SetActive(bShow) self._mapNode.anCutin.transform.gameObject:SetActive(bShow) if not bShow then return end if self._nFeverCatSpineId == nil then self._nFeverCatSpineId = SpineManager.Bind(self._mapNode.spCat) end if self._nFeverCatSpineId == nil then return end self:SetStatusSwitch(self._nFeverCatSpineId, "in", false, "idle") self._mapNode.imgFemale:SetActive(not PlayerBaseData:GetPlayerSex()) self._mapNode.imgMale:SetActive(PlayerBaseData:GetPlayerSex()) if bShow then self._mapNode.anCutin:Play("rtCutin_in") if self.timerFeverCutinHide ~= nil then TimerManager.Remove(self.timerFeverCutinHide) self.timerFeverCutinHide = nil end self.timerFeverCutinHide = self:AddTimer(1, 3, "Fever_UnShowSpecialAnimator_Cutin", true, true) end end local CAT_OUT_FALLBACK_DURATION = 0.5 function IceCreamTruckGameCtrl:Fever_UnShowSpecialSpine_Cat() local CatSpine = self._mapNode.spCat if CatSpine == nil or CatSpine:IsNull() then return end if self._nFeverCatSpineId == nil then CatSpine:SetActive(false) return end self:SetStatusSwitch(self._nFeverCatSpineId, "out", false, nil) local nGen = self._nRestartGen or 0 local fDur = SpineManager.GetAnimDuration(self._nFeverCatSpineId, "out") if fDur == nil or fDur <= 0 then fDur = CAT_OUT_FALLBACK_DURATION end cs_coroutine.start(function() coroutine.yield(CS.UnityEngine.WaitForSeconds(fDur)) if nGen ~= IceCreamTruckGameCtrl.GetRestartGen() then return end if CatSpine ~= nil and not CatSpine:IsNull() then CatSpine:SetActive(false) end end) end function IceCreamTruckGameCtrl:_UnregisterFeverCatSpine() if self._nFeverCatSpineId ~= nil then SpineManager.Unbind(self._nFeverCatSpineId) self._nFeverCatSpineId = nil end end function IceCreamTruckGameCtrl:Fever_UnShowSpecialAnimator_Cutin() self.timerFeverCutinHide = nil if self._mapNode.anCutin == nil then return end local goAnCutin = self._mapNode.anCutin.transform.gameObject if goAnCutin == nil or goAnCutin:IsNull() then return end if not goAnCutin.activeInHierarchy then return end self._mapNode.anCutin:Play("rtCutin_out") local nDur = NovaAPI.GetAnimClipLength(self._mapNode.anCutin, { "rtCutin_out" }) if type(nDur) ~= "number" or nDur <= 0 then nDur = 1.0 end if self.timerFeverCutinDeactivate ~= nil then TimerManager.Remove(self.timerFeverCutinDeactivate) self.timerFeverCutinDeactivate = nil end self.timerFeverCutinDeactivate = self:AddTimer(1, nDur, "_Fever_HideCutinNode", true, true) end function IceCreamTruckGameCtrl:_Fever_HideCutinNode() self.timerFeverCutinDeactivate = nil if self._mapNode.anCutin == nil then return end local goAnCutin = self._mapNode.anCutin.transform.gameObject if goAnCutin == nil or goAnCutin:IsNull() then return end goAnCutin:SetActive(false) end function IceCreamTruckGameCtrl:ShowScorePopup(tbDetail) if self.ServeCustomer then self.ServeCustomer:ShowCompleteRoot(tbDetail.nBase, tbDetail.fComboMul, tbDetail.fFeverMul, tbDetail.fBuffMul) end end function IceCreamTruckGameCtrl:RefreshInFever() if not self.bInFever then return end local nDeltaTime = 1 local bActive = self.ScoreCalc:UpdateFeverDecay(nDeltaTime) self:RefreshFever_Special() if not bActive then EventManager.Hit("Event_FeverModeChanged", false) self.bInFever = false end end function IceCreamTruckGameCtrl:On_FeverModeChanged(bInFever) self._mapNode.obj_Fever:SetActive(not bInFever) self._mapNode.obj_FeverSpecial:SetActive(bInFever) if bInFever then self:_SetProgressBarPercent(self._rtProgressBarFever, self._fProgressBarFeverWidth, 1) self:Fever_ShowSpecialSpine(true) WwiseAudioMgr:PostEvent("mode_400013_power_lp") else self:_SetProgressBarPercent(self._rtProgressBar, self._fProgressBarWidth, 0) self:Fever_UnShowSpecialSpine_Cat() WwiseAudioMgr:PostEvent("mode_400013_power_lp_stop") end if bInFever then if nil == self.feverTimer then self.feverTimer = self:AddTimer(0, 1, "RefreshInFever", true, true, false) if self.feverTimer ~= nil and (self.fSpeedScale or 1) ~= 1 then self.feverTimer:SetSpeed(self.fSpeedScale) end end elseif self.feverTimer then TimerManager.Remove(self.feverTimer) self.feverTimer = nil end end function IceCreamTruckGameCtrl:_ApplySpeedScaleToLocalTimers(fScale) fScale = fScale or 1 if fScale <= 0 then fScale = 1 end if self.feverTimer ~= nil then self.feverTimer:SetSpeed(fScale) end if self._feverBarTweener ~= nil then self._feverBarTweener.timeScale = fScale end if self.BuffRuntime ~= nil and self.BuffRuntime.SetTimersSpeed ~= nil then self.BuffRuntime:SetTimersSpeed(fScale) end end function IceCreamTruckGameCtrl:OnBtnClick_Pause() if PanelManager.CheckPanelOpen(PanelId.IceCreamPausePanel) then return end EventManager.Hit(EventId.TemporaryBlockInput, 0.4) local nMaxScore = self.IceCreamActData:GetLevelMaxScore(self.nLevelId) local bShowMaxScore = false if self.LevelData.LevelType == GameEnum.ActivityIceCreamLevelType.Advanced then bShowMaxScore = true end self._mapNode.PausePanel:Open(self.LevelData.Name, self.CurrentScore, self.NumOrder, self.MaxStreakCount, nMaxScore, bShowMaxScore, self.nDicId) end function IceCreamTruckGameCtrl:AllCustomersFinish() local bResult = self:IsFinishTarget() self:OnEvent_FinishGame(bResult) end function IceCreamTruckGameCtrl:FeverModeFinish() local bResult = true self:OnEvent_FinishGame(bResult) end function IceCreamTruckGameCtrl:OnEvent_FinishGame(bResult) if self.IceCreamActData == nil then printError("活动数据丢失:", self.nActId) return end self.IceCreamActData:SetLevelMaxScore(self.nLevelId, self.CurrentScore) local callback = function(mapChangeInfo) WwiseAudioMgr:PostEvent("mode_400013_all_stop") NovaAPI.SetCanvasGroupAlpha(self.Canvas, 0) local nMaxScore = self.IceCreamActData:GetLevelMaxScore(self.nLevelId) self._bIsExiting = true self:_TeardownForRestart() self:OpenResultPanel(mapChangeInfo.Passed, nMaxScore, mapChangeInfo) end self.IceCreamActData:SendActivityIceCreamLevelSettleReq(self:BuildFinishData(), bResult, callback) end function IceCreamTruckGameCtrl:OnEvent_Exit() self:ExitGame() end function IceCreamTruckGameCtrl:OpenResultPanel(bResult, nMaxScore, mapChangeInfo) local bShowMaxScore = false if self.LevelData.LevelType == GameEnum.ActivityIceCreamLevelType.Advanced then bShowMaxScore = true end local bNextTimeLock = true local nNextLevel = self.nLevelId + 1 local MaxLevel = ConfigTable.GetConfigNumber("IceCreamMaxLevelId") if nNextLevel <= MaxLevel then bNextTimeLock = self.IceCreamActData:CheckLevelIsLockByTime(nNextLevel) else nNextLevel = nil end self._mapNode.ResultPanel:ShowResultPanel(bResult, self.CurrentScore, self.NumOrder, self.MaxStreakCount, nMaxScore, bShowMaxScore, mapChangeInfo, bNextTimeLock, nNextLevel) end function IceCreamTruckGameCtrl:OnEvent_Restart() self:RestartLevel() end function IceCreamTruckGameCtrl:OnEvent_Continue() self._mapNode.PausePanel:Close() self:RecoverPlay() end function IceCreamTruckGameCtrl:Event_RestartIceCreamTruckGame() self:DoRestart() end function IceCreamTruckGameCtrl:Event_ExitIceCreamTruckGame() self._bIsExiting = true self:_TeardownForRestart() EventManager.Hit(EventId.ClosePanel, PanelId.IceCreamTruckGamePanel) end function IceCreamTruckGameCtrl:IceCream_NextLevel(nNextLevelId) if nNextLevelId == nil then printError("[IceCream] IceCream_NextLevel 缺少 levelId") return end if ConfigTable.GetData("ActivityIceCreamLevel", nNextLevelId) == nil then printError("[IceCream] 下一关配置不存在 levelId=" .. tostring(nNextLevelId)) return end self:_TeardownForRestart() local nActId = self.nActId EventManager.Hit(EventId.ClosePanel, PanelId.IceCreamTruckGamePanel) EventManager.Hit(EventId.OpenPanel, PanelId.IceCreamTruckGamePanel, nActId, nNextLevelId) end function IceCreamTruckGameCtrl:RestartLevel() local sTip = ConfigTable.GetUIText("IceCreamTruck_Re_Confirm") local msg = { nType = AllEnum.MessageBox.Confirm, sContent = sTip, callbackConfirm = function() self:GameEnd_Pre(true) WwiseAudioMgr:PostEvent("mode_400013_all_stop") self._mapNode.PausePanel:Close() local wait = function() coroutine.yield(CS.UnityEngine.WaitForSeconds(0.55)) self:DoRestart() end cs_coroutine.start(wait) end } EventManager.Hit(EventId.OpenMessageBox, msg) end function IceCreamTruckGameCtrl:DoRestart() self:_TeardownForRestart() self:InitPlayLevel(self.nActId, self.nLevelId) self:ReInitData() self:RefreshGameplayUI() if self._mapNode.CustomerQueue and self._mapNode.CustomerQueue.Restart then self._mapNode.CustomerQueue:Restart() end self.animatorRoot:Play("IceCreamPlayPanel_idle", 0, 0) end function IceCreamTruckGameCtrl:_TeardownForRestart() self._nRestartGen = (self._nRestartGen or 0) + 1 if self.feverTimer ~= nil then TimerManager.Remove(self.feverTimer) self.feverTimer = nil end if self.timerFeverCutinHide ~= nil then TimerManager.Remove(self.timerFeverCutinHide) self.timerFeverCutinHide = nil end if self.timerFeverCutinDeactivate ~= nil then TimerManager.Remove(self.timerFeverCutinDeactivate) self.timerFeverCutinDeactivate = nil end if self.BuffRuntime then self.BuffRuntime:Clear() self.BuffRuntime = nil end self.ScoreCalc = nil self.ServeCustomer = nil self.ServeCustomerId = nil self.bIsSpecial = false self.CurrentOrders = nil self.tbCurrentSlots = nil self._bAutoFinishing = false self._bIsOpening = false self.bInFever = false self.bIPause = false self:_ClearSafeHitQueue() self:_GuideClear() self._tbGuideObjs = nil self:_GuideClearGarbage() self._goGarbageGuide = nil self:UnregisterCondimentSpines() self:_UnregisterFeverCatSpine() self:_DestroyAllSauceInstances() end function IceCreamTruckGameCtrl:_ClearSafeHitQueue() for k in pairs(tbHitQueue) do tbHitQueue[k] = nil end for k in pairs(tbHitWorker) do tbHitWorker[k] = nil end end function IceCreamTruckGameCtrl:ExitGame() if self.IceCreamActData == nil then printError("活动数据丢失:", self.nActId) return end local confirmCallback = function() WwiseAudioMgr:PostEvent("mode_400013_all_stop") self._bIsExiting = true self._mapNode.PausePanel:Close() self:_TeardownForRestart() local callback = function(mapChangeInfo) NovaAPI.SetCanvasGroupAlpha(self.Canvas, 0) local nMaxScore = self.IceCreamActData:GetLevelMaxScore(self.nLevelId) self:OpenResultPanel(mapChangeInfo.Passed, nMaxScore, mapChangeInfo) end self.IceCreamActData:SetLevelMaxScore(self.nLevelId, self.CurrentScore) self.IceCreamActData:SendActivityIceCreamLevelSettleReq(self:BuildFinishData(), self:IsFinishTarget(), callback) end local sTip = ConfigTable.GetUIText("IceCreamTruck_Exit_Confirm") local msg = { nType = AllEnum.MessageBox.Confirm, sContent = sTip, callbackConfirmAfterClose = confirmCallback } EventManager.Hit(EventId.OpenMessageBox, msg) end function IceCreamTruckGameCtrl:IsFinishTarget() local nNumOrder = self.NumOrder or 0 local nCurrentScore = self.CurrentScore or 0 local bOrderOk = 0 <= self.TargetOrderNum and nNumOrder >= self.TargetOrderNum local bScoreOk = 0 <= self.TargetScore and nCurrentScore >= self.TargetScore local bFinishTarget = bOrderOk and bScoreOk return bFinishTarget end function IceCreamTruckGameCtrl:BuildFinishData() return { ActivityId = self.nActId, LevelId = self.nLevelId, LevelType = self.LevelData.LevelType, OrderCount = self.NumOrder, TotalScore = self.CurrentScore, StreakCount = self.MaxStreakCount, PropCount = self.PropCount } end IceCreamTruckGameCtrl._tbCondimentBtnKeys = { "btn_Condiment_A", "btn_Condiment_S", "btn_Condiment_D", "btn_Condiment_F", "btn_Condiment_H", "btn_Condiment_J", "btn_Condiment_K", "btn_Condiment_L" } IceCreamTruckGameCtrl._tbCondimentTrKeys = { "tr_Condiment_A", "tr_Condiment_S", "tr_Condiment_D", "tr_Condiment_F", "tr_Condiment_H", "tr_Condiment_J", "tr_Condiment_K", "tr_Condiment_L" } function IceCreamTruckGameCtrl:RegisterCondimentSpines() self.tbCondimentSpineIds = self.tbCondimentSpineIds or {} for _, sBtnKey in ipairs(self._tbCondimentBtnKeys) do local btn = self._mapNode[sBtnKey] if btn ~= nil then local nEnum = tonumber(btn.transform:GetChild(0).name) local trSpine = btn.transform:Find("AnimRoot/Spine_Icon") if nEnum ~= nil and trSpine ~= nil and trSpine:IsNull() == false then if self.tbCondimentSpineIds[nEnum] ~= nil then SpineManager.Unbind(self.tbCondimentSpineIds[nEnum]) end local nId = SpineManager.Bind(trSpine.gameObject) if nId ~= nil then self.tbCondimentSpineIds[nEnum] = nId SpineManager.PlayAnim(nId, "idle", true) end end end end self._tbCondimentTrByEnum = {} for _, sTrKey in ipairs(self._tbCondimentTrKeys) do local tr = self._mapNode[sTrKey] if tr ~= nil then local nEnum = tonumber(tr.transform:GetChild(0).name) if nEnum ~= nil then self._tbCondimentTrByEnum[nEnum] = tr end end end end function IceCreamTruckGameCtrl:GetCondimentTrByEnum(nEnum) return self._tbCondimentTrByEnum and self._tbCondimentTrByEnum[nEnum] or nil end function IceCreamTruckGameCtrl:UnregisterCondimentSpines() if self.tbCondimentSpineIds == nil then return end for _, nId in pairs(self.tbCondimentSpineIds) do SpineManager.Unbind(nId) end self.tbCondimentSpineIds = nil self._tbCondimentTrByEnum = nil end function IceCreamTruckGameCtrl:Cline_Spine(nEnum) if self.tbCondimentSpineIds == nil then return end local nSpineId = self.tbCondimentSpineIds[nEnum] if nSpineId == nil then return end self:SetStatusSwitch(nSpineId, "in", false, "idle") end function IceCreamTruckGameCtrl:SetStatusSwitch(CurSpineId, eState, bLoop, sNextLoop) if not CurSpineId then return end if bLoop == nil then bLoop = true end SpineManager.PlayAnim(CurSpineId, eState, bLoop) if not bLoop and sNextLoop then SpineManager.AddAnim(CurSpineId, sNextLoop, true, 0) end end function IceCreamTruckGameCtrl:OnEvent_OpenDic() if self.nDicId ~= nil and self.nDicId ~= 0 then EventManager.Hit(EventId.OpenPanel, PanelId.DictionaryEntry, self.nDicId, false) end end function IceCreamTruckGameCtrl:OnEvent_CloseDic(panelId) if panelId == PanelId.DictionaryEntry then self.IceCreamActData.IceCreamLevelData:OnEvent_SetFloorHasDic(self.nLevelId) end end function IceCreamTruckGameCtrl:GM_GetNewBuffItem(nBuffId, nIndex) if self.IceCreamActData.IceCreamLevelData then self.IceCreamActData.IceCreamLevelData:GM_GetNewBuffItem(nBuffId, nIndex) self:RefreshBuffItems() end end function IceCreamTruckGameCtrl:GM_ChangeScoreOrder(nScore, nOrder) self.CurrentScore = nScore self.NumOrder = nOrder self:RefreshScoreUI() end function IceCreamTruckGameCtrl:GM_AddPatienceVal(nPatienceVal) if self.ServeCustomer then self.ServeCustomer:AddPatienceVal(nPatienceVal) else local sTip = string.format("当前没有正在服务的顾客") EventManager.Hit(EventId.OpenMessageBox, sTip) end end function IceCreamTruckGameCtrl:GM_ChangeComboNum(nComboNum) if self.ScoreCalc then self.MaxStreakCount = nComboNum self.ScoreCalc:ChangeCombo(nComboNum) end end function IceCreamTruckGameCtrl:GM_ChangeFeverTime(nFeverTime) if self.ScoreCalc then if not self.bInFever then local sTip = string.format("热力模式未开启") EventManager.Hit(EventId.OpenMessageBox, sTip) return end self.ScoreCalc:ChangeFeverTime(nFeverTime) end end function IceCreamTruckGameCtrl:GM_RefreshCustomer(CustomerId) if self.ServeCustomer then self.ServeCustomer:RefreshCurrentCustomer(CustomerId) end end function IceCreamTruckGameCtrl:GameEnd_Pre(bIsEnd) self:ActiveBtn(not bIsEnd) end function IceCreamTruckGameCtrl:ActiveBtn(bEnable) self._mapNode.btn_Pause.interactable = bEnable self._mapNode.btn_Bag.interactable = bEnable self._mapNode.btn_BuffItem1.interactable = bEnable self._mapNode.btn_BuffItem2.interactable = bEnable self._mapNode.btn_Condiment_A.interactable = bEnable self._mapNode.btn_Condiment_S.interactable = bEnable self._mapNode.btn_Condiment_D.interactable = bEnable self._mapNode.btn_Condiment_F.interactable = bEnable self._mapNode.btn_Condiment_H.interactable = bEnable self._mapNode.btn_Condiment_J.interactable = bEnable self._mapNode.btn_Condiment_K.interactable = bEnable self._mapNode.btn_Condiment_L.interactable = bEnable self._mapNode.btn_Garbage.interactable = bEnable end return IceCreamTruckGameCtrl