
AddSmells()
***********


FUNKTION
========

   void AddSmells(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
============

   Diese Funktion entspricht dem AddDetail() fuer Standarddetails, nur
   koennen hiermit Gerueche realisiert werden:
   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 Geruchsdetails koennen Forscherpunkte eingetragen werden.

   Gerueche koennen allgemein einen Raum oder Objekt zugeordnet werden:
   dafuer muss man als <key> SENSE_DEFAULT uebergeben.



   Spielerkommandos: "riech", "rieche", "schnupper", "schnuppere"


BEISPIELE
=========

   Ein kleines Beispiel fuer rassenabhaengige Gerueche mit Closures:
     string strafe(string key);
     ...
     AddSmells(SENSE_DEFAULT,
       "Der Geruch von Knoblauch ist ueberwaeltigend!\n");
     AddSmells(({"knoblauch","geruch"}),
               ([0:        "Puhh, das stinkt!\n",
                 "vampir": #'strafe]));
     ...
     string strafe(string key) {
       this_player()->reduce_hit_points(100);
       return "Der Knoblauch schmerzt dich furchtbar!\n";
     }


SIEHE AUCH
==========

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

20.01.2015, Zesstra
