highlightGenerals() {
    return this.whenStatus(GameLayer.STATUS.NEW).then(() => {
      if (this._highlightingGeneralsPromise == null && !SDK.GameSession.getInstance().isChallenge()) {
        this._highlightingGeneralsPromise = new Promise((resolve, reject) => {
          this.bindSdkPlayers();

          // my player data
          let myPlayerTaunted = false;
          const myPlayer = this._player;
          const myPlayerId = myPlayer.getPlayerId();
          const myGeneralCard = SDK.GameSession.getInstance().getGeneralForPlayerId(myPlayerId);
          const myGeneralId = myGeneralCard.getId();
          const myGeneralNode = this.getNodeForSdkCard(myGeneralCard);
          const myFaction = SDK.FactionFactory.factionForIdentifier(myGeneralCard.getFactionId());

          // opponent player data
          let opponentPlayerTaunted = false;
          const opponentPlayer = this._opponent;
          const opponentPlayerId = opponentPlayer.getPlayerId();
          const opponentGeneralCard = SDK.GameSession.getInstance().getGeneralForPlayerId(opponentPlayerId);
          const opponentGeneralId = opponentGeneralCard.getId();
          const opponentGeneralNode = this.getNodeForSdkCard(opponentGeneralCard);
          const opponentFaction = SDK.FactionFactory.factionForIdentifier(opponentGeneralCard.getFactionId());

          // taunts
          const myTauntText = SDK.FactionFactory.getTauntCallout(myGeneralId, opponentGeneralId);
          const opponentTauntText = SDK.FactionFactory.getTauntResponse(opponentGeneralId, myGeneralId);

          const tryToResolve = function () {
            if (myPlayerTaunted && opponentPlayerTaunted) {
              resolve();
            }
          };

          // start by unhighlighting generals
          myPlayer.unhighlightGeneral();
          opponentPlayer.unhighlightGeneral();

          // create sequence to show generals
          this.runAction(cc.sequence(
            cc.delayTime(CONFIG.HIGHLIGHT_MY_GENERAL_TAUNT_DELAY),
            cc.callFunc(() => {
              // show my general taunting
              myPlayer.highlightGeneral(myGeneralNode);
              this.showSpeechForEntityNode(myGeneralNode, myTauntText, null, CONFIG.HIGHLIGHT_GENERAL_TAUNT_DURATION, true, 0.275);
            }),
            cc.delayTime(CONFIG.DIALOGUE_ENTER_DURATION + CONFIG.HIGHLIGHT_GENERAL_TAUNT_DURATION),
            cc.callFunc(() => {
              // finish my general taunting
              myPlayer.unhighlightGeneral();
            }),
            cc.delayTime(CONFIG.GENERAL_FX_FADE_DURATION),
            cc.callFunc(() => {
              // delay to let fx fade out, then try to resolve
              myPlayerTaunted = true;
              tryToResolve();
            }),
          ));

          this.runAction(cc.sequence(
            cc.delayTime(CONFIG.HIGHLIGHT_OPPONENT_GENERAL_TAUNT_DELAY),
            cc.callFunc(() => {
              // show opponent general taunting
              opponentPlayer.highlightGeneral(opponentGeneralNode);
              this.showSpeechForEntityNode(opponentGeneralNode, opponentTauntText, null, CONFIG.HIGHLIGHT_GENERAL_TAUNT_DURATION, true, 0.275);
            }),
            cc.delayTime(CONFIG.DIALOGUE_ENTER_DURATION + CONFIG.HIGHLIGHT_GENERAL_TAUNT_DURATION),
            cc.callFunc(() => {
              // finish opponent general taunting
              opponentPlayer.unhighlightGeneral();
            }),
            cc.delayTime(CONFIG.GENERAL_FX_FADE_DURATION),
            cc.callFunc(() => {
              // delay to let fx fade out, then try to resolve
              opponentPlayerTaunted = true;
              tryToResolve();
            }),
          ));
        });
      }
      return this._highlightingGeneralsPromise;
    });
  }
Highlights generals starting with my player general and then opponent player general.
@returns {Promise}