setSdkCard(sdkCard, cardFadeDuration) {
    if (this.sdkCard !== sdkCard) {
      // destroy previous card
      if (this.sdkCard != null) {
        this._usable = null;

        if (!sdkCard) {
          this.manaCostLabel.setString('', true);
        }

        if (this.cardSprite != null) {
          this.cardSprite.destroy(cardFadeDuration);
          this.cardSprite = null;
        }
        this.shadowSprite.fadeToInvisible(cardFadeDuration);
        this.manaCostLabel.fadeToInvisible(cardFadeDuration);

        this.stopShowingPrismatic(cardFadeDuration);
      }

      // update card after resetting last and before showing new
      this._super(sdkCard);

      // setup new card
      if (this.sdkCard != null) {
        const contentSize = this.getContentSize();

        // card options
        const cardOptions = _.extend({}, sdkCard.getCardOptions());
        cardOptions.spriteIdentifier = sdkCard.getBaseAnimResource() && sdkCard.getBaseAnimResource().idle;
        cardOptions.antiAlias = false;
        if (cardOptions.scale == null) {
          cardOptions.scale = CONFIG.SCALE;
        }

        // reposition shadow
        if (this.sdkCard instanceof SDK.Unit) {
          this.shadowSprite.setPosition(cc.p(contentSize.width * 0.5, contentSize.height * 0.5 - CONFIG.DEPTH_OFFSET));
        } else {
          this.shadowSprite.setPosition(cc.p(contentSize.width * 0.5, contentSize.height * 0.5 - 25.0));
        }

        // when load completes
        this.whenResourcesReady(this.getCardResourceRequestId()).then((cardResourceRequestId) => {
          if (!this.getAreResourcesValid(cardResourceRequestId)) return; // card has changed

          // card sprite
          this.cardSprite = GlowSprite.create(cardOptions);
          this.cardSprite.setOpacity(0.0);

          // position card sprite
          const cardSpritePosition = this.cardSprite.getPosition();
          cardSpritePosition.x += contentSize.width * 0.5 + ((cardOptions.offset && cardOptions.offset.x) || 0);
          cardSpritePosition.y += ((cardOptions.offset && cardOptions.offset.y) || 0);

          if (sdkCard instanceof SDK.Unit) {
            this.cardSprite.setAnchorPoint(0.5, 0.0);
            cardSpritePosition.y += contentSize.height * 0.25 - 20.0;
            if (sdkCard.isOwnedByPlayer2()) {
              this.cardSprite.setFlippedX(true);
            }
          } else {
            this.cardSprite.setAnchorPoint(0.5, 0.5);
            cardSpritePosition.y += contentSize.height * 0.5 + 5.0;
          }

          this.cardSprite.setPosition(cardSpritePosition);
          this._containerNode.addChild(this.cardSprite, -1);

          // fade card sprites
          this.cardSprite.fadeTo(cardFadeDuration, 255.0);
          this.manaCostLabel.fadeTo(cardFadeDuration, 255.0);
          this.shadowSprite.fadeTo(cardFadeDuration, (SDK.Cards.getIsPrismaticCardId(this.sdkCard.getId()) ? 200.0 : 150.0));
        });

        if (!CONFIG.SHOW_PRISMATIC_ONLY_ON_INSPECT
          && !(this.sdkCard instanceof SDK.Tile)
          && SDK.Cards.getIsPrismaticCardId(this.sdkCard.getId())) {
          this.showPrismatic(cardFadeDuration);
        }
      }

      this.resetHighlightAndSelection();
      this.showInactiveAnimState();
    }
  }
Bottom deck card nodes should always use card inspect resource packages.
@see SdkNode.getCardResourcePackageId