showActionForArtifact(action, showDelay) {
    let showDuration = 0.0;

    if (this.getActionIsForPlayerArtifacts(action)) {
      // add artifacts if not yet shown
      if (action instanceof SDK.ApplyModifierAction) {
        var modifier = action.getModifier();
        const existingArtifactNode = this.getArtifactNodeFromModifier(modifier);
        if (existingArtifactNode == null) {
          // find first empty artifact node
          var artifactNodes = this._artifactNodes;
          var artifactNode;
          for (var i = 0, il = artifactNodes.length; i < il; i++) {
            const emptyArtifactNode = artifactNodes[i];
            if (emptyArtifactNode.getIsEmpty()) {
              artifactNode = emptyArtifactNode;
              break;
            }
          }

          // if no empty artifact nodes found, use last
          if (artifactNode == null) {
            artifactNode = artifactNodes[artifactNodes.length - 1];
          }

          // show application
          showDuration = Math.max(showDuration, artifactNode.showApply(modifier.getSourceCard(), showDelay));

          // update artifact nodes layout immediately
          this._updateArtifactNodesLayout();
        }
      }

      // remove artifact
      if (action instanceof SDK.RemoveModifierAction) {
        var modifier = action.getModifier();
        var artifactNode = this.getArtifactNodeFromModifier(modifier);
        if (artifactNode != null) {
          // show removal
          const removeDuration = artifactNode.showRemove(showDelay, this._updateArtifactNodesLayout.bind(this));
          showDuration = Math.max(showDuration, removeDuration);
        }
      }

      // update artifacts durability
      if (action instanceof SDK.DamageAction || action instanceof SDK.RefreshArtifactChargesAction || action instanceof SDK.RestoreChargeToAllArtifactsAction) {
        var artifactNodes = this._artifactNodes;

        // show durability change
        let durabilityChange = 0;
        if (action instanceof SDK.DamageAction) {
          if (action.getTotalDamageAmount() > 0.0) {
            durabilityChange = -1;
          }
        } else if (action instanceof SDK.RefreshArtifactChargesAction) {
          durabilityChange = CONFIG.MAX_ARTIFACT_DURABILITY;
        } else if (action instanceof SDK.RestoreChargeToAllArtifactsAction) {
          durabilityChange = 1;
        }
        for (var i = 0, il = artifactNodes.length; i < il; i++) {
          showDuration = Math.max(showDuration, artifactNodes[i].showDurabilityChange(durabilityChange, showDelay, this._updateArtifactNodesLayout.bind(this)));
        }
      }
    }

    return showDuration;
  }
Incrementally updates artifacts based on an action.
@param {SDK.Action} action
@param {Number} [showDelay=0.0]
@returns {Number} duration of animations