_animateGainingRank() {
    return new Promise((resolve) => {
      // play rank change
      audio_engine.current().play_effect(RSX.sfx_unit_deploy_3.audio, false);

      this._currentShownRank -= 1;
      this._currentShownStars = 0;

      const oldRankLabel = this._currentRankLabel;

      this._currentRankLabel = new cc.LabelTTF(`${this._currentShownRank}`, RSX.font_bold.name, 50, cc.size(1200, 50), cc.TEXT_ALIGNMENT_CENTER);
      this._currentRankLabel.setFontFillColor(CONFIG.POST_GAME_RANK_PRIMARY_COLOR);
      this.addChild(this._currentRankLabel);
      this._currentRankLabel.setPositionBelowSprite(oldRankLabel);

      // movement distance for rank labels
      const moveDistance = cc.p(
        oldRankLabel.getPositionX() - this._currentRankLabel.getPositionX(),
        oldRankLabel.getPositionY() - this._currentRankLabel.getPositionY(),
      );
      const animateOutOldRankAction = cc.targetedAction(oldRankLabel, cc.sequence(
        cc.spawn(
          cc.fadeOut(CONFIG.ANIMATE_MEDIUM_DURATION),
          cc.moveBy(CONFIG.ANIMATE_MEDIUM_DURATION, moveDistance).easing(cc.easeExponentialOut()),
        ),
        cc.removeSelf(),
      ));
      const animateInNewRankAction = cc.targetedAction(this._currentRankLabel, cc.spawn(
        cc.fadeIn(CONFIG.ANIMATE_MEDIUM_DURATION),
        cc.moveBy(CONFIG.ANIMATE_MEDIUM_DURATION, moveDistance).easing(cc.easeExponentialOut()),
      ));

      this.runAction(cc.sequence(
        cc.spawn(
          animateOutOldRankAction,
          animateInNewRankAction,
        ),
        cc.callFunc(() => {
          resolve();
        }),
      ));
    }).then(() => {
      if (SDK.RankFactory.rankedDivisionAssetNameForRank(this._currentShownRank) == this._currentShownDivisionKey) {
        return Promise.resolve();
      }
      return this._animateDivisionIncrease();
    }).then(() =>
    // Replace old filled chevrons with new cheons
      this._animateInChevronSprites(SDK.RankFactory.starsNeededToAdvanceRank(this._currentShownRank), 0));
  }
Animate completing a rank
@private
@param integer newRank - Players new rank
@return {Promise} A promise which resolves when animation is complete