parseSetupShot (shot) {
    const commands = []

    const addMoveCharacterCommand = (side, resource, enterOnStart, thang) => {
      const characterMoveTime = enterOnStart ? 1000 : 0

      const lastResource = this.commandParsingState.lanks[side]

      const moveLank = this.moveLankCommand({ key: side, resource, thang, ms: characterMoveTime })
      moveLank.undoCommandFactory = () => {
        if (lastResource) {
          return this.moveLankCommand({ key: side, resource: lastResource.slug, thang: lastResource.thang, ms: 0 })
        }
        // There was nothing before this so remove last moved.
        return new SyncFunction(() => this.removeLankResource(resource))
      }

      commands.push(moveLank)
    }

    const background = getBackground(shot)
    if (background) {
      const lastResource = _.cloneDeep(this.commandParsingState.lanks[BACKGROUND])
      const backgroundCommand = this.setBackgroundCommand(background)

      backgroundCommand.undoCommandFactory = () => {
        if (lastResource) {
          return this.setBackgroundCommand(lastResource)
        }
      }

      commands.push(backgroundCommand)
      this.preRasterLank(background.slug, background.thang, BACKGROUND_LAYER)
    }

    const lHero = getLeftHero(shot)
    const rHero = getRightHero(shot)

    const original = (me.get('ozariaUserOptions') || {}).cinematicThangTypeOriginal || HERO_THANG_ID
    const avatar = (store.getters['me/getCh1Avatar'] || {}).cinematicThangTypeId || AVATAR_THANG_ID
    const avatarPet = (store.getters['me/getCh1Avatar'] || {}).cinematicPetThangId || PET_AVATAR_THANG_ID

    const heroPet = getHeroPet(shot)
    // We tie the pet to the right hand hero, and therefore only create the command
    // if there is a right hero command as well.
    if (heroPet && rHero) {
      const { slug, thang } = heroPet
      thang.rotation = RIGHT
      this.heroPetOffset = thang.pos
      const lastResource = _.cloneDeep(this.commandParsingState.lanks[HERO_PET])
      const placePet = this.moveLankCommand({
        key: HERO_PET,
        resource: (rHero || {}).type !== 'avatar' ? slug : avatarPet,
        thang,
        ms: 0
      })

      placePet.undoCommandFactory = () => {
        if (lastResource) {
          return this.moveLankCommand({ key: HERO_PET, resource: lastResource.slug, thang: lastResource.thang, ms: 0 })
        }
        return new SyncFunction(() => this.removeLankResource((rHero || {}).type !== 'avatar' ? slug : avatarPet))
      }

      this.preRasterLank((rHero || {}).type !== 'avatar' ? slug : avatarPet, thang, lankLayer[HERO_PET])
      commands.push(placePet)
    }

    if (lHero) {
      const { enterOnStart, thang, type } = lHero
      addMoveCharacterCommand(LEFT_LANK_KEY, type === 'hero' ? original : avatar, enterOnStart, thang)
      this.preRasterLank(type === 'hero' ? original : avatar)
    }

    if (rHero) {
      const { enterOnStart, thang, type } = rHero
      addMoveCharacterCommand(RIGHT_LANK_KEY, type === 'hero' ? original : avatar, enterOnStart, thang)
      this.preRasterLank(type === 'hero' ? original : avatar)
    }

    const leftCharSlug = getLeftCharacterThangTypeSlug(shot)
    if (leftCharSlug) {
      const { slug, enterOnStart, thang } = leftCharSlug
      addMoveCharacterCommand(LEFT_LANK_KEY, slug, enterOnStart, thang)
      this.preRasterLank(slug, thang)
    }

    const rightCharSlug = getRightCharacterThangTypeSlug(shot)
    if (rightCharSlug) {
      // Remove the hero pet if not a hero being added to the right.
      commands.push(new SyncFunction(() => this.removeLank(HERO_PET)))
      const { slug, enterOnStart, thang } = rightCharSlug
      addMoveCharacterCommand(RIGHT_LANK_KEY, slug, enterOnStart, thang)
      this.preRasterLank(slug, thang)
    }

    return commands
  }
Returns a list of commands that correctly set up the shot.
@param {Shot} shot - the cinematic shot data.