ctor(sdkCard) {
    // initialize properties that may be required in init
    const contentSize = cc.size(CONFIG.ARTIFACT_SIZE, CONFIG.ARTIFACT_SIZE);

    // durability sprites
    this._durabilitySprites = [];
    for (var i = 0, il = CONFIG.MAX_ARTIFACT_DURABILITY; i < il; i++) {
      const durabilitySprite = new BaseSprite(RSX.artifact_durability_point.img);
      durabilitySprite.setVisible(false);
      this._durabilitySprites.push(durabilitySprite);
    }

    // fx hit sprite
    this._fxHitSprite = new BaseSprite(RSX.fxArtifactHit.name);
    this._fxHitSprite.setScale(CONFIG.SCALE);
    this._fxHitSprite.setAntiAlias(false);
    this._fxHitSprite.setAnchorPoint(0.5, 0.5);
    this._fxHitSprite.setPosition(contentSize.width * 0.5, contentSize.height * 0.5);
    this._fxHitSprite.setVisible(false);

    // fx break sprite
    this._fxBreakSprite = new BaseSprite(RSX.fxArtifactBreak.name);
    this._fxBreakSprite.setScale(CONFIG.SCALE);
    this._fxBreakSprite.setAntiAlias(false);
    this._fxBreakSprite.setAnchorPoint(0.5, 0.5);
    this._fxBreakSprite.setPosition(contentSize.width * 0.5, contentSize.height * 0.5);
    this._fxBreakSprite.setVisible(false);

    // do super ctor
    this._super(sdkCard);

    // set content size
    // this must be done after the cocos/super ctor
    this.setContentSize(contentSize);

    // add nodes
    // this must be done after the cocos/super ctor
    for (var i = 0, il = this._durabilitySprites.length; i < il; i++) {
      this.addChild(this._durabilitySprites[i], this._ui_z_order_durability);
    }
    this.addChild(this._fxHitSprite, this._ui_z_order_animations);
    this.addChild(this._fxBreakSprite, this._ui_z_order_animations);

    // layout
    this.updateLayout();
  }
************************************************************************
 ArtifactNode
 var ArtifactNode = SdkNode
 ArtifactNode.create()
 - node used to display artifacts currently active on general
*************************************************************************