/* (non-Javadoc) Methode überschrieben
   * @see org.d3s.alricg.charKomponenten.sonderregeln.SonderregelInterface#finalizeSonderregel(org.d3s.alricg.charKomponenten.links.Link)
   */
  public void finalizeSonderregel(Link link) {
    CharElement element;
    GeneratorLink tmpLink, modiLink;

    assert link.getZweitZiel() != null;

    // Auslesen des gewünschten Links
    element = link.getZweitZiel();
    tmpLink = (GeneratorLink) prozessor.getElementBox().getObjectById(element);

    // Suche und entferne den Link aus dem Element
    tmpLink.removeLinkByQuelle(this);
    eigen = null;
  }
  /* (non-Javadoc) Methode überschrieben
   * @see org.d3s.alricg.charKomponenten.sonderregeln.SonderregelInterface#canAddSelf(org.d3s.alricg.held.box.HeldProzessor, boolean, org.d3s.alricg.charKomponenten.links.Link)
   *
   * - Das Ziel dieser Sonderregel (also die Eigenschaft) wird aus dem
   * 	 srLink ausgelesen und ist das "zweitZiel".
   * - Es darf keine Eigenschaft die SF "Herausragende Eigenschaft" bekommen, die
   *   durch die Herkunft gesenkt wurde.
   */
  public boolean canAddSelf(Held held, boolean ok, Link srlink) {
    Eigenschaft element;
    Link tmpLink;

    // Auslesen des gewünschten Links
    element = (Eigenschaft) srlink.getZweitZiel();
    tmpLink =
        ((LinkProzessor<Eigenschaft, HeldenLink>) held.getProzessor(CharKomponente.eigenschaft))
            .getElementBox()
            .getObjectById(element);

    // Überprüfung ob die Modis durch die Herkunft u.ä. negativ sind,
    // dann dürfte diese SR nicht gewählt werden
    if (((GeneratorLink) tmpLink).getWertModis() < 0) {
      return false;
    }

    // Die Sonderregel darf nur einmal zu einem ELement existieren
    if (held.getSonderregelAdmin().hasSonderregel(this.getId(), null, element)) {
      return false;
    }

    // Prüfen ob "Stubenhocker" --> Nicht erlaubt mit KK, KO und GE!
    if (element.getEigenschaftEnum().equals(EigenschaftEnum.GE)
        || element.getEigenschaftEnum().equals(EigenschaftEnum.KK)
        || element.getEigenschaftEnum().equals(EigenschaftEnum.KO)) {
      if (held.getSonderregelAdmin().hasSonderregel("SR-Stubenhocker", null, null)) {
        return false;
      }
    }

    return ok;
  }
  /* (non-Javadoc) Methode überschrieben
   * @see org.d3s.alricg.charKomponenten.sonderregeln.SonderregelInterface#changeMinStufe(int, org.d3s.alricg.charKomponenten.links.Link)
   * - Da eine Herausragende Eigenschaft nicht gesenkt werden kann gilt:
   *  Minimale Stufe = Maximale Stufe.
   */
  public int changeMinWert(int minStufe, Link link) {

    if (eigen.equals(link.getZiel())) {
      // Der Wert kann nicht mehr gesenkt werden!
      return prozessor.getMaxWert(link);
    }

    return minStufe;
  }
  /* (non-Javadoc) Methode überschrieben
   * @see org.d3s.alricg.charKomponenten.sonderregeln.SonderregelInterface#changeCanAddElement(boolean, org.d3s.alricg.charKomponenten.links.Link)
   *
   * - Es kann keine Rasse oder Kultur hinzugefügt werden, die einen Eigenschaft
   *  mit "Herausragender Eigenschaft" erniedrigt
   */
  public boolean changeCanAddElement(boolean ok, Link tmpLink) {
    CharElement element = tmpLink.getZiel();

    if (element instanceof Rasse) {
      //			TODO Es darf keine Eigenschaft gesenkt werden, die "Herausragende Eigenschaft" ist
    } else if (element instanceof Kultur) {
      //			TODO Es darf keine Eigenschaft gesenkt werden, die "Herausragende Eigenschaft" ist
    } else if (element instanceof Profession) {
      //			TODO Es darf keine Eigenschaft gesenkt werden, die "Herausragende Eigenschaft" ist
    }

    return ok;
  }
  /* (non-Javadoc) Methode überschrieben
   * @see org.d3s.alricg.charKomponenten.sonderregeln.SonderregelInterface#initSonderregel(org.d3s.alricg.held.box.HeldProzessor, org.d3s.alricg.charKomponenten.links.Link)
   *
   * - Das Ziel dieser Sonderregel (also die Eigenschaft) wird aus dem
   * 	 srElementlink ausgelesen und ist das "zweitZiel".
   *  - Die betreffende Eigenschaft wird auf das Maximum gesetzt und um den
   *    Wert in "link" erhöht.
   */
  public void initSonderregel(Held held, Link srLink) {
    GeneratorLink tmpLink;
    IdLink modiLink;

    assert srLink.getZweitZiel() != null;

    this.prozessor = held.getProzessor(CharKomponente.eigenschaft);

    // Auslesen des gewünschten Links
    eigen = (Eigenschaft) srLink.getZweitZiel();
    tmpLink = (GeneratorLink) prozessor.getElementBox().getObjectById(eigen);

    // Link erstellen der die Eigenschaft um den gewünschten Wert erhöht
    modiLink = new IdLink(this, null);
    modiLink.setWert(srLink.getWert());

    // Neuen Link hinzufügen,
    tmpLink.addLink(modiLink);

    // Eigenschaft auf den Maximalen Wert setzen
    tmpLink.setUserGesamtWert(prozessor.getMaxWert(tmpLink));
  }