_showCardMoveAndReveal(cardId, index) {
    return new Promise((resolve, reject) => {
      const cardDisc = BaseSprite.create(RSX.booster_glowing_disc.img);
      cardDisc.setAnchorPoint(cc.p(0.5, 0.5));
      this.innerLayer.addChild(cardDisc);

      const particles = cc.ParticleSystem.create(RSX.booster_pack_center_particles.plist);
      // var particles = new BaseParticleSystem(RSX.booster_pack_center_particles.plist,{
      //   plistFile: RSX.booster_pack_center_particles.plist,
      //   type: "Particles",
      //   fadeInAtLifePct:0.05,
      //   positionType:cc.ParticleSystem.TYPE_FREE
      // });
      particles.setAnchorPoint(cc.p(0.5, 0.5));
      this.innerLayer.addChild(particles);

      const angle = index * Math.PI / (this._cardCount / 2.0);
      const sourceScreenPosition = cc.p(this.radius * Math.cos(angle), this.radius * Math.sin(angle));
      const maxDuration = 1.5;
      const duration = maxDuration / 2 + maxDuration / 2 * Math.random();
      const delayScaleDown = maxDuration - duration - 1.0;

      // core gem will be initialized during animation
      let coreGem = new CoreGemNode(cardId);
      coreGem.setVisible(false);

      // custom back easing with heavy overshoot
      const customEaseBackOut = {
        easing(time1) {
          const overshoot = 3.70158;
          time1 -= 1;
          return time1 * time1 * ((overshoot + 1) * time1 + overshoot) + 1;
        },
      };

      // get reveal parameters
      const cardContentSize = cc.size(226, 296);
      const cardLayout = this._getLayout();
      const targetScreenPosition = cc.p(
        cardLayout.positionsByIndex[index].x * cardContentSize.width + cardLayout.spacingByIndex[index].x,
        cardLayout.positionsByIndex[index].y * cardContentSize.height + cardLayout.spacingByIndex[index].y,
      );

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

      // move disc
      cardDisc.runAction(cc.sequence(
        cc.moveTo(duration, sourceScreenPosition).easing(cc.easeBackOut()),
        // cc.delayTime(delayScaleDown),
        cc.callFunc(function () {
          this.stopSystem();
        }.bind(particles)),
        cc.scaleTo(0.4, 0.25).easing(cc.easeExponentialOut()),
        cc.callFunc(() => {
          // zodiac symbol that animates from a single point out
          const zodiac = new ZodiacNode({
            width: 80,
            height: 80,
            lineWidth: 1,
            duration: 1.0,
          });
          zodiac.setAnchorPoint(cc.p(0.5, 0.5));
          zodiac.setPosition(cc.p(
            cardDisc.getPosition().x - 40,
            cardDisc.getPosition().y - 40,
          ));
          this.innerLayer.addChild(zodiac);

          // energy particles
          const particles = cc.ParticleSystem.create(RSX.zodiac_appear_001.plist);
          particles.setAnchorPoint(cc.p(0.5, 0.5));
          particles.setPosition(cardDisc.getPosition());
          this.innerLayer.addChild(particles);

          // zodiac fragment particles
          const particles2 = cc.ParticleSystem.create(RSX.zodiac_appear_002.plist);
          particles2.setAnchorPoint(cc.p(0.5, 0.5));
          particles2.setPosition(cardDisc.getPosition());
          this.innerLayer.addChild(particles2);

          cardDisc.zodiac = zodiac;
        }),
        cc.fadeOut(0.1),
        cc.callFunc(() => {
          // construct core gem
          coreGem = new CoreGemNode(cardId);
          coreGem.fadeOutReticle(0.0);
          coreGem.setVisible(true);
          coreGem.setPosition(cardDisc.getPosition());
          this.innerLayer.addChild(coreGem);
          coreGem.transitionIn();
          this.coreGemNodes.push(coreGem);
          // destroy card zodiac
          cardDisc.zodiac.destroy();
          cardDisc.setVisible(false);
        }),
        cc.delayTime((index + 1) * 0.1),
        cc.callFunc(() => {
          const moveToFinalAction = cc.moveTo(0.4, targetScreenPosition).easing(cc.easeExponentialInOut());
          coreGem.runAction(moveToFinalAction);
        }),
        cc.delayTime(0.4),
        cc.callFunc(() => {
          coreGem.fadeInReticle(0.5);
          // destroy card disc
          cardDisc.destroy();
          resolve();
        }),
      ));
    });
  }
Shows a card unlocking and returns a promise that resolves when the card has been revealed.
@param cardId
@param index
@returns {Promise}