_showCardMoveAndReveal(cardId, sourceScreenPosition, targetScreenPosition, delay, zOrder) {
    if (delay == null) { delay = 0.0; }
    if (zOrder == null) { zOrder = this.zOrderCard; }

    return new Promise((resolve, reject) => {
      const cardDisc = BaseSprite.create(RSX.booster_glowing_disc.img);
      cardDisc.setAnchorPoint(0.5, 0.5);
      cardDisc.setPosition(sourceScreenPosition);
      this.addChild(cardDisc, zOrder);

      const particles = new BaseParticleSystem(RSX.booster_pack_center_particles.plist);
      particles.setAnchorPoint(0.5, 0.5);
      particles.setPosition(sourceScreenPosition);
      this.addChild(particles, zOrder);

      const zodiac = new ZodiacNode({
        width: 80,
        height: 80,
        lineWidth: 1,
        duration: 1.0,
      });
      const zodiacEnergyParticles = cc.ParticleSystem.create(RSX.zodiac_appear_001.plist);
      const zodiacFragmentParticles = cc.ParticleSystem.create(RSX.zodiac_appear_002.plist);

      const maxDuration = 2.0;
      const duration = maxDuration / 2 + maxDuration / 2 * Math.random();
      const delayScaleDown = maxDuration - duration - 1.0;

      // move particles
      particles.runAction(cc.moveTo(duration, targetScreenPosition).easing(cc.easeExponentialOut()));

      // move disc
      cardDisc.runAction(cc.sequence(
        cc.moveTo(duration, targetScreenPosition).easing(cc.easeExponentialOut()),
        cc.delayTime(delayScaleDown),
        cc.callFunc(() => {
          particles.stopSystem();
        }),
        cc.scaleTo(0.5, 0.25).easing(cc.easeExponentialOut()),
        cc.callFunc(() => {
          const discPosition = cardDisc.getPosition();

          // show zodiac
          zodiac.setAnchorPoint(0.5, 0.5);
          zodiac.setPosition(
            discPosition.x - 40.0,
            discPosition.y - 40.0,
          );
          this.addChild(zodiac, zOrder);

          zodiacEnergyParticles.setAnchorPoint(0.5, 0.5);
          zodiacEnergyParticles.setPosition(discPosition);
          this.addChild(zodiacEnergyParticles, zOrder);

          zodiacFragmentParticles.setAnchorPoint(0.5, 0.5);
          zodiacFragmentParticles.setPosition(discPosition);
          this.addChild(zodiacFragmentParticles, zOrder);
        }),
        cc.fadeOut(0.1),
        cc.delayTime(delay),
        cc.callFunc(() => {
          // destroy zodiac
          zodiac.destroy();

          // show card reveal and resolve
          this._showCardReveal(cardId, targetScreenPosition, zOrder).then(() => {
            resolve();
          });
        }),
      ));
    });
  }
Shows a card unlocking and returns a promise that resolves when the card has been revealed.
@param {String|Number} cardId
@param {cc.Point} sourceScreenPosition
@param {cc.Point} targetScreenPosition
@param {Number} [delay=0.0]
@param {Number} [zOrder=this.zOrderCard]
@returns {Promise}