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

