_animateDivisionIncrease() {
    return new Promise((resolve) => {
      this._currentShownDivisionKey = SDK.RankFactory.rankedDivisionAssetNameForRank(this._currentShownRank);

      const rankMedalResource = RSX[`season_rank_${this._currentShownDivisionKey}`];
      const rankMedalGlowOutlineResource = RSX[`season_rank_${this._currentShownDivisionKey}_glow_outline`];
      const rankRequestId = `season_rank_${this._currentShownDivisionKey}_${UtilsJavascript.generateIncrementalId()}`;
      this.addResourceRequest(rankRequestId, null, [
        rankMedalResource,
        rankMedalGlowOutlineResource,
      ]);

      this.whenResourcesReady(rankRequestId).then((requestId) => {
        if (!this.getAreResourcesValid(requestId)) return; // load invalidated or resources changed

        // Play division increase sfx
        audio_engine.current().play_effect(RSX.sfx_deploy_circle1.audio, false);

        const oldMedalSprite = this._divisionMedalSprite;
        const animateOutOldDivisionAction = cc.targetedAction(oldMedalSprite, cc.sequence(
          cc.spawn(
            cc.fadeOut(CONFIG.ANIMATE_MEDIUM_DURATION),
            cc.scaleBy(CONFIG.ANIMATE_MEDIUM_DURATION, 0.8).easing(cc.easeBackIn()),
          ),
          cc.removeSelf(),
        ));

        // lens flare that highlights from below
        const flare = FXLensFlareSprite.create();
        flare.setBlendFunc(cc.SRC_ALPHA, cc.ONE);
        flare.setScale(4.0);
        flare.setPulseRate(0.0);
        flare.setSpeed(2.0);
        flare.setWispSize(0.3);
        flare.setArmLength(0.2);
        flare.setOpacity(0);
        flare.setPositionCenterOfSprite(oldMedalSprite);
        this.addChild(flare);

        const animateFlareAction = cc.targetedAction(flare, cc.sequence(
          cc.EaseCubicActionIn.create(cc.fadeIn(CONFIG.ANIMATE_MEDIUM_DURATION)),
          cc.delayTime(0.2),
          cc.EaseCubicActionOut.create(cc.fadeOut(0.8)),
          cc.callFunc(() => {
            flare.setVisible(false);
            flare.destroy();
          }),
        ));

        this._divisionMedalSprite = this._createRankMedalSprite(this._currentShownRank);
        this._divisionMedalSprite.setOpacity(0);
        this.addChild(this._divisionMedalSprite);
        const animateInNewDivisionAction = cc.targetedAction(this._divisionMedalSprite, cc.fadeIn(CONFIG.ANIMATE_FAST_DURATION));
        this._divisionMedalSprite.setPositionBelowSprite(this._rankedChevronPlateSprite, null, cc.p(0, 0.4));

        const rankMedalGlowOutlineSprite = new BaseSprite(rankMedalGlowOutlineResource.img);
        rankMedalGlowOutlineSprite.setPositionCenterOfSprite(oldMedalSprite);
        rankMedalGlowOutlineSprite.setBlendFunc(cc.SRC_ALPHA, cc.ONE);
        rankMedalGlowOutlineSprite.setOpacity(0);
        rankMedalGlowOutlineSprite.setScaleX(this._divisionMedalSprite.getScaleX() * 0.8);
        rankMedalGlowOutlineSprite.setScaleY(this._divisionMedalSprite.getScaleY() * 0.8);
        this.addChild(rankMedalGlowOutlineSprite);

        const animateInOutlineAction = cc.targetedAction(rankMedalGlowOutlineSprite, cc.spawn(
          cc.fadeIn(CONFIG.ANIMATE_MEDIUM_DURATION),
          cc.scaleBy(CONFIG.ANIMATE_MEDIUM_DURATION, 1.0 / 0.8).easing(cc.easeBackOut()),
        ));

        const animateOutOutlineAction = cc.targetedAction(rankMedalGlowOutlineSprite, cc.sequence(
          cc.fadeOut(0.6),
          cc.removeSelf(),
        ));

        this.runAction(cc.sequence(
          cc.targetedAction(this._currentDivisionLabel, cc.fadeOut(CONFIG.ANIMATE_FAST_DURATION)),
          animateOutOldDivisionAction,
          animateInOutlineAction,
          cc.spawn(
            animateInNewDivisionAction,
            animateFlareAction,
          ),
          animateOutOutlineAction,
          cc.callFunc(() => {
            this._currentDivisionLabel.setString(SDK.RankFactory.rankedDivisionNameForRank(this._currentShownRank));
            this._currentDivisionLabel.setPositionBelowSprite(this._divisionMedalSprite);
          }),
          cc.spawn(
            cc.targetedAction(this._currentDivisionLabel, cc.fadeIn(CONFIG.ANIMATE_FAST_DURATION)),
          ),
          cc.delayTime(0.2), // To allow for emphasis on rank up
          cc.callFunc(() => {
            resolve();
          }),
        ));
      });
    });
  }
Animate going up a division
@private
@return {Promise} A promise which resolves when animation is complete