AddDetail()
===========

FUNKTION
--------
::

    void AddDetail(string|string* keys,
                   string|string*|mapping|closure desc);

DEFINIERT IN
------------
::

    /std/thing/description.c

ARGUMENTE
---------
::

    keys
      String oder Array von Strings mit den Namen der Details.
    desc
      String, Mapping, String-Array oder Closure mit/zur Beschreibung.

BESCHREIBUNG
------------
::

    Die Beschreibung der Details <keys> wird gesetzt. Wie die Details
    bei der Untersuchung aussehen, haengt im wesentlichen vom Typ der
    Beschreibung <desc> ab:
      <desc> ist ein String.
        Beim Untersuchen wird dieser String zurueckgegeben.
      <desc> ist ein String-Array.
        Beim Untersuchen wird zufaellig einer der Strings zurueckgegeben.
      <desc> ist ein Mapping.
        Das Mapping muss folgenden Aufbau haben:
          ([0:        "Defaulttext",
            "rasse1": "r1text", ...]).

        Falls fuer die Rasse des das Detail untersuchenden Spielers ein
        Eintrag im Mapping existiert, wird der entsprechende Text
        zurueckgegeben, ansonsten der Defaulttext. Auf diese Weise sind
        rassenabhaengige Details moeglich. Siehe auch die Beispiele.
      <desc> ist eine Closure.
        In diesem Fall wird die Closure ausgefuehrt und das Ergebnis
        zurueckgegeben. Die Closure bekommt dabei den Namen des Details
        als Parameter uebergeben.

    Fuer Details koennen Forscherpunkte eingetragen werden.

BEISPIELE
---------
::

    Ein schlichtes Detail:

      AddDetail(({"sofa","couch"}), "Eine kleine Couch.\n");

    Laengere Details sollten hierbei nicht per Hand umgebrochen werden,
    sondern man kann hierzu die Funktion break_string() nutzen:

      AddDetail("detail", break_string(
        "Du wolltest es ja nicht anders, jetzt musst Du Dir dieses "
        "fuerchterlich lange Detail durchlesen!!!", 78));

    Noetige Zeilenumbrueche bei Zeilenlaengen groesser 77 werden so
    automatisch generiert.
    Ein rassenabhaengiges Detail:

      AddDetail(({"bett","bettchen"}),
        ([0      :"Eine kleines Bett.\n", // Der Defaulttext
          "zwerg":                        // Die Rasse klein schreiben
                "Das Bett laedt geradezu zu einem Nickerchen ein.\n"]));

    Und nun ein Detail mit Closure (diese Version ersetzt das Verhalten
     von AddSpecialDetail).

      int hebel_betaetigt;
      ...
      string hebel(string str); // Funktion bekannt machen (Prototyping)
      ...
      AddDetail(({"hebel","schalter"}), #'hebel);
      ...
      string hebel(string key) {
        if(hebel_betaetigt)
          return "Der "+capitalize(key)+" steht auf EIN.\n";
        else
          return "Der "+capitalize(key)+" steht auf AUS.\n";
      }

    Man erhaelt verschiedene Ergebnisse beim Untersuchen, je nachdem
    ob das Flag hebel_betaetigt gesetzt ist oder nicht.

SIEHE AUCH
----------
::

    Setzen:    AddReadDetail(), AddSmells(), AddSounds(),
               AddTouchDetail()
    Loeschen:  RemoveDetail(), RemoveReadDetail(), RemoveSmells(),
               RemoveSounds(), RemoveTouchDetail()
    Daten:     P_DETAILS, P_READ_DETAILS, P_SMELLS, P_SOUNDS,
               P_TOUCH_DETAILS, P_SPECIAL_DETAILS
    Veraltet:  AddSpecialDetail(), RemoveSpecialDetail(), P_READ_MSG
    Sonstiges: GetDetail(), break_string()

20.01.2015, Zesstra

