showRemovedModifier(modifier, action) {
    const showDuration = 0.0;

    if (modifier != null) {
      const modifierLoadId = this.getModifierLoadId(modifier);
      const modifierLoadData = this._modifierLoadDataByLoadId[modifierLoadId];
      if (modifierLoadData == null || !modifierLoadData.valid || !modifierLoadData.promise.isFulfilled()) {
        // invalidate modifier load immediately if removing before load completes
        this.invalidateAndUnloadModifierResources(modifierLoadId);
      } else {
        // wait for resources to load
        Promise.all([
          this.loadModifierResources(modifier),
          this.whenResourcesReady(this.getCardResourceRequestId()),
        ]).spread((modifierLoadId, cardResourceRequestId) => {
          // ensure that modifier load and resources are valid
          if (!this.getAreModifierResourcesValid(modifierLoadId) || !this.getAreResourcesValid(cardResourceRequestId)) return;

          // show one time removed fx for modifier
          this.showFX(DATA.dataForIdentifiersWithFilter(modifier.getFXResource(), SDK.FXType.ModifierRemovedFX));

          // only invalidate and unload resources if we can still change state and this is not a result of a removal action
          // otherwise, this entity is in the process of removing itself and will clean up afterwards
          if (this.canShowModifier(modifier, action) && (action == null || action.getMatchingAncestorAction(SDK.RemoveAction, null, this.getSdkCard()) == null)) {
            // unload modifier resources
            this.invalidateAndUnloadModifierResources(modifierLoadId);
          }
        });
      }
    }

    return showDuration;
  }
Shows the stat changes, one time fx, and removal of continuous fx of a modifier.
@param {SDK.Modifier} modifier
@param {SDK.Action} action
@returns {Number} show duration