 
   shouldDelayRealTimeSimulation: (t) ->
     return false unless @realTime
-    timeSinceStart = t - @worldLoadStartTime
+    timeSinceStart = (t - @worldLoadStartTime) * @realTimeSpeedFactor
     timeLoaded = @frames.length * @dt * 1000
     timeBuffered = timeLoaded - timeSinceStart
-    timeBuffered > REAL_TIME_BUFFER_MAX
+    timeBuffered > REAL_TIME_BUFFER_MAX * @realTimeSpeedFactor
 
   shouldUpdateRealTimePlayback: (t) ->
     return false unless @realTime
     return false if @frames.length * @dt is @lastRealTimeUpdate
     timeLoaded = @frames.length * @dt * 1000
-    timeSinceStart = t - @worldLoadStartTime
+    timeSinceStart = (t - @worldLoadStartTime) * @realTimeSpeedFactor
     remainingBuffer = @lastRealTimeUpdate * 1000 - timeSinceStart
-    remainingBuffer < REAL_TIME_BUFFER_MIN
+    remainingBuffer < REAL_TIME_BUFFER_MIN * @realTimeSpeedFactor
 
   shouldContinueLoading: (t1, loadProgressCallback, skipDeferredLoading, continueLaterFn) ->
     t2 = now()

    continueLaterFn = =>
      @loadFrames(loadedCallback, errorCallback, loadProgressCallback, preloadedCallback, skipDeferredLoading, loadUntilFrame) unless @destroyed
    if @realTime and not @countdownFinished
      return setTimeout @finishCountdown(continueLaterFn), REAL_TIME_COUNTDOWN_DELAY
    t1 = now()
    @t0 ?= t1

    @flagHistory.push flagEvent

  loadFromLevel: (level, willSimulate=true) ->
    if level.slug in ['the-first-kithmaze', 'the-second-kithmaze', 'the-final-kithmaze']
      @realTimeSpeedFactor = 3
    @levelComponents = level.levelComponents
    @thangTypes = level.thangTypes
    @loadSystemsFromLevel level
