addLank (key, thangType, thang = {}) {
    // Handle a duplicate thangType with the same key.
    let lank = null
    let useCache = false
    if (this.lanks[key] && this.lanks[key].thangType) {
      const original = this.lanks[key].thangType.get('original')
      if (thangType.get('original') === original) {
        // It's the same thangType. Don't add a new Lank, but make sure it is shown.
        lank = this.lankCache[thangType.id]
        lank.show()
        return
      } else {
        // It's a lank we want to replace.
        this.removeLank(key)
      }
    }

    // Use a cached lank
    if (this.lankCache[thangType.id]) {
      lank = this.lankCache[thangType.id]
      useCache = true
    }

    // Initial coordinates for thangs being created offscreen.
    // This feels like it could be refactored to be nicer.
    if (key === RIGHT_LANK_KEY) {
      thang = createThang({
        pos: {
          x: this.stageBounds.bottomRight.x + OFF_CAMERA_OFFSET,
          y: (thang.pos || {}).y || this.stageBounds.bottomRight.y
        },
        rotation: RIGHT,
        scaleFactorX: thang.scaleX || 1,
        scaleFactorY: thang.scaleY || 1,
        action: this.runTimeState.idleAnimation[key] || 'idle'
      })
    } else if (key === LEFT_LANK_KEY) {
      thang = createThang({
        pos: {
          x: this.stageBounds.topLeft.x - OFF_CAMERA_OFFSET,
          y: (thang.pos || {}).y || this.stageBounds.bottomRight.y
        },
        scaleFactorX: thang.scaleX || 1,
        scaleFactorY: thang.scaleY || 1,
        action: this.runTimeState.idleAnimation[key] || 'idle'
      })
    } else if (key === HERO_PET) {
      // Hack to ensure pet renders off screen
      // TODO: Remove when we have a way to make lanks invisible.
      thang.pos = {
        x: this.stageBounds.bottomRight.x * 10,
        y: this.stageBounds.bottomRight.y * 10
      }
    } else if (key === BACKGROUND_OBJECT) {
      thang.action = this.runTimeState.idleAnimation[key] || 'idle'
    }

    lank = lank || new Lank(thangType, {
      preloadSounds: false,
      thang,
      camera: this.camera,
      groundLayer: this.groundLayer,
      isCinematic: true
    })
    lank.setThang(thang)
    lank.show()
    if (!useCache) {
      const layer = lankLayer.get(key) || DEFAULT_LAYER
      this.layerAdapters[layer].addLank(lank)
    }
    this.lanks[key] = lank
  }
Adds a lank to the screen.

If the lank already exists this method is a noop.
Otherwise if there is a conflicting lank it is removed and replaced.
Automatically flips a lank if they key is `right` in order to accomodate for
right hand side characters.

@param {string} key
@param {Object} thangType
@param {Object|undefined} thang?