
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", ...]).

       Die Rassenstrings muessen hierbei klein geschrieben werden, anders
       als in P_RACE und P_REAL_RACE.

       Falls fuer die Rasse des Spielers, der das Detail untersucht, ein
       Eintrag im Mapping existiert, wird der entsprechende Text
       zurueckgegeben, ansonsten der Defaulttext. Auf diese Weise sind
       rassenabhaengige Details moeglich.
     <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      :"Ein 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()

11.04.2020, Arathorn
