/// <summary>
        /// Called before each game simulation frame. Performs the dispatching for this simulation phase.
        /// </summary>
        public override void OnBeforeSimulationFrame()
        {
            uint currentFrame = SimulationManager.instance.m_currentFrameIndex;

            Buildings?.ProcessFrame(currentFrame);
            CitizenProcessor?.ProcessFrame(currentFrame);
        }
        /// <summary>
        /// Called before each game simulation tick. A tick contains multiple frames.
        /// Performs the dispatching for this simulation phase.
        /// </summary>
        public override void OnBeforeSimulationTick()
        {
            if (SimulationManager.instance.SimulationPaused || SimulationManager.instance.ForcedSimulationPaused)
            {
                wasPaused = true;
                return;
            }

            WeatherInfo?.Update();

            bool updateFrameLength = TimeAdjustment?.Update(wasPaused) ?? false;

            wasPaused = false;

            if (CitizenProcessor != null)
            {
                if (updateFrameLength)
                {
                    CitizenProcessor.UpdateFrameDuration();
                }

                CitizenProcessor.ProcessTick();
            }

            if (updateFrameLength)
            {
                Buildings?.UpdateFrameDuration();
                Statistics?.RefreshUnits();
                VanillaEvents.ProcessUpdatedTimeSpeed(TimeAdjustment.GetOriginalTime);
            }

            EventManager?.ProcessEvents();

            if (DayTimeSimulation == null || CitizenProcessor == null)
            {
                return;
            }

            DateTime currentDateTime = SimulationManager.instance.m_currentGameTime;

            if (currentDateTime.Hour != lastHandledDate.Hour || lastHandledDate == default)
            {
                int triggerHour = lastHandledDate == default
                    ? 0
                    : currentDateTime.Hour;

                lastHandledDate = currentDateTime;
                CitizenProcessor.TriggerHour(triggerHour);
                if (triggerHour == 0)
                {
                    DayTimeSimulation.Process(currentDateTime);
                    OnNewDay(this);
                }
            }
        }