     @spriteBoss.updateSounds()
 
   updateState: (frameChanged) ->
-    # world state must have been restored in @updateSpriteSounds
+    # world state must have been restored in @restoreWorldState
     @camera.updateZoom()
     @spriteBoss.update frameChanged unless @casting
     @dimmer?.setSprites @spriteBoss.sprites

    @stage.removeAllEventListeners()
    @stage.enableDOMEvents false
    @stage.enableMouseOver 0
    @playScrubbedSounds = null
    @onMouseMove = null
    @onMouseDown = null
    @tick = null

  tick: (e) =>
    # seems to be a bug where only one object can register with the Ticker...
    oldFrame = @currentFrame
    oldWorldFrame = Math.floor oldFrame
    while true
      Dropper.tick()
      @trailmaster.tick() if @trailmaster
      # Skip some frame updates unless we're playing and not at end (or we haven't drawn much yet)
      frameAdvanced = (@playing and @currentFrame < @world.totalFrames) or @totalFramesDrawn < 2
      @currentFrame += @world.frameRate / @frameRate if frameAdvanced
      newWorldFrame = Math.floor @currentFrame
      worldFrameAdvanced = newWorldFrame isnt oldWorldFrame
      if worldFrameAdvanced
        # Only restore world state when it will correspond to an integer WorldFrame, not interpolated frame.
        @restoreWorldState()
        oldWorldFrame = newWorldFrame
      break unless Dropper.drop()
    if frameAdvanced and not worldFrameAdvanced
      # We didn't end the above loop on an integer frame, so do the world state update.
      @restoreWorldState()

    # these are skipped for dropped frames
    @updateState @currentFrame isnt oldFrame
