async startUp () {
    const data = await this.systems.loader.loadAssets()
    if (this.destroyed) return

    const speakerToThangTypeSlugMap = {}
    const commands = data.shots
      .map(shot => parseShot(shot, this.systems, this.userOptions, speakerToThangTypeSlugMap))
      .filter(commands => commands.length > 0)
      .reduce((acc, commands) => [...acc, ...commands], [])

    attachListener({ cinematicLankBoss: this.systems.cinematicLankBoss, stage: this.stage })

    this.commands = commands

    await this.systems.cinematicLankBoss.preloaded() // NOTE: This will always complete after about ~2.5 minutes. It has a failsafe.
    if (this.destroyed) return
    for (const preloadedLank of Object.values(this.systems.cinematicLankBoss.lankCache)) {
      preloadedLank.hide()
    }

    // Provide time for the loaded lanks to be hidden. Otherwise there can be a disruptive flash.
    setTimeout(() => {
      if (this.destroyed) return
      this.onLoaded()
    }, 100)
  }
Method that loads and initializes the cinematic.

Finally we run the cinematic runner.