AddTouchDetail()
****************


FUNKTION
========

   void AddTouchDetail(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 (ab)tastbare bzw. fuehlbare Details realisiert werden:
   Die Beschreibung der Details <keys> wird gesetzt. Wie die Details
   beim (Ab)Tasten 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 fuehlbare Details koennen Forscherpunkte eingetragen werden.

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

   Spielerkommandos: "taste"


BEISPIELE
=========

   Ein kleines Beispiel fuer rassenabhaengige, fuehlbare Details mit Closures:
     string strafe(string key);
     ...
     AddTouchDetail(SENSE_DEFAULT, "Du fuehlst einige Knollen\n");
     AddTouchDetail(({"knollen"}),
                    ([0:       "Sie fuehlen sich an wie Knoblauchknollen. "
                               "Riech doch mal daran.\n",
                      "vampir": #'strafe]));

     string strafe(string key) {
       this_player()->reduce_hit_points(100);
       return "Au! Das waren ja Knoblauchknollen!\n";
     }


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

   Setzen:    AddDetail(), AddReadDetail(), AddSmells(), AddSounds()
   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
