AddSpecialDetail()
******************


VERALTET AddSpecialDetail()
===========================


FUNKTION
========

   void AddSpecialDetail(string|string* keys, string func);


DEFINIERT IN
============

   /std/thing/description.c


ARGUMENTE
=========

   keys
     String oder Array von Strings mit den Namen der Details.
   func
     String mit dem Namen der Funktion, die zur Auswertung aufgerufen
     wird.


BESCHREIBUNG
============

   Es wird ein Detail hinzugefuegt, dessen Inhalt nicht von vornherein
   feststeht, sondern von aeusseren Bedingungen abhaengt. Zu diesem
   Zweck wird immer, wenn dieses Detail untersucht wird, die Funktion
   func aufgerufen, um den aktuellen Zustand des Details zu bestimmen.
   Der Funktion wird als Parameter das Schluesselwort uebergeben, mit
   dem das Detail untersucht wurde.

   VERALTET: Bitte AddDetail mit Closure benutzen.


BEISPIELE
=========

   Ein zustandsabhaengiges Detail:

     int hebel_betaetigt;
     string hebel(string key);
     ...
     // ALT: AddSpecialDetail( ({ "hebel", "schalter" }), "hebel" );
     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.


BEMERKUNG
=========

   Intern werden Details und SpecialDetails im selben Mapping
   verwaltet.
   Man kann statt dieser Funktion deshalb auch AddDetail mit Closures
   nutzen.


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

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

20.01.2015, Zesstra
