
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
