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

        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 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      :"Eine 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()

20.01.2015, Zesstra

