AddExtraLook()
**************


FUNKTION
========

   varargs int AddExtraLook(string look, [int duration, string key,
   string lookende, object ob]);


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

   /std/living/description.c


ARGUMENTE
=========

   string look:

      * String, der in der Langbeschreibung des Lebewesens zusaetzlich
        ausgegeben wird.

      * zu rufender Funktionsname, wenn 'ob' angegeben ist

   int duration:

      * > 0: Dauer der Gueltigkeit des Extralooks in Sekunden.

      * 0:   Unbegrenzt gueltiger Eintrag. Rebootfest. (Kann nur von
        Blueprints registriert werden.)

      * < 0: Bis Ende/Reboot bestehender Eintrag.

   string key:
      Schluesselwort, unter dem der Eintrag registriert wird und mit
      dem man diesen auch mittels RemoveExtraLook() entfernen kann.
      Sollte eindeutig sein! Ist 'key' nicht angeben, wird der
      Objektname (object_name()) des setzenden Objekts benutzt.

   string lookende:

      * String, der an das Lebewesen (nur bei Spielern) ausgegeben
        wird, wenn der eingetragene Extralook abgelaufen ist.

      * zu rufender Funktionsname, wenn 'ob' angegeben ist

   object ob:
      Ein Objekt, an dem die in 'look' und 'lookende' abgelegten
      Methoden bei Abfrage oder Ablauf aufgerufen werden.


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

   Der Extralook erscheint in der Langbeschreibung des Lebewesens.

   Texte dafuer koennen mit dieser Funktion hinzugefuegt und verwaltet
   werden. Wenn ihr nicht ohnehin unbedingt ein Objekt IM Spieler
   ablegt (wie zB eine Ruestung mit einem Extralook), dann ist diese
   Methode bevorzugt zu verwenden.

   Ueber die Angabe eines 'ob' koennen Looks auch dynamisch erstellt
   werden, dabei werden dann 'look' bzw. 'lookende' als Methoden am
   Objekt gerufen. Die Methoden bekommen das Living uebergeben und
   muessen selbst umgebrochene Strings zurueckgeben. Ein so fuer
   AddExtraLook verwendetes Objekt 'ob' muss nicht wie bisher ueblich
   im Inv des Spieler liegen!

   Direkt angegebene Texte (also nicht von einem Objekt 'ob' bezogen)
   werden durch replace_personal() gefiltert und unter Beibehaltung
   existierender Umbrueche auf 78 Zeichen umgebrochen.


BEMERKUNGEN
===========

   * Die Endemeldung wird nicht genau mit Ablauf der angegebenen Zeit
     ausgegeben, sondern beim ersten Abruf der Langbeschreibung *nach*
     Ablauf der Zeit.

   * Im Fall von permanenten Eintraegen muss das uebergbene Objekt
     eine Blueprint sein, da Clones irgendwann (spaetestens mit
     Reboot) zerstoert werden und der Eintrag dann bei Abfrage
     automatisch geloescht wird. Folgerung: Clones koennen fuer
     kurzlebige Extralooks benutzt werden, deren Ablaufzeit an ein
     Objekt gebunden ist.


RUECKGABEWERTE
==============

   Siehe auch /sys/living/description.h fuer Konstanten.

   * XL_OK: falls der Eintrag erfolgreich registriert wurde.

   * ansonsten:

     * XL_NOKEY: <key> war nicht gueltig und es konnte keiner
       ermittelt werden.

     * XL_INVALIDEXTRALOOK: <look> war kein gueltiger String.

     * XL_KEYDOESNOTEXIST: <duration> war kein Integer.

     * XL_KEYEXISTS: unter <key> gibt es schon einen Eintrag.


BEISPIELE
=========

   // (1) einfacher Eintrag, "fuer die Ewigkeit"

   living->AddExtraLook("@WER1 hat den Drachengott der SSP besiegt.");

   // (2) Eintrag der nach 1h automatisch weg ist.

   living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600);

   // (3) Eintrag mit bestimmtem Schluessel, damit man ihn wieder entfernen
   // kann.

   living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600,
                        "humni_marmeladen_look");

   // (4) Mit "Ende"-Meldung, aber kein eigener Schluessel.

   living->AddExtraLook("@WER1 ist patschnass.", 1200, 0,
                        "Du bist endlich wieder trocken. Puuh.");

   // (5) Mit Objekt, welches den Extralook dynamisch erzeugt.

   living->AddExtraLook("get_my_special_extralook", 3600, 0, 0,
                        this_object());

   public string get_my_special_extralook(object lv)
   {
     return
       lv.Name() + " hat schon " + data[getuuid(lv)] + " mal gewonnen!\n");
   }

   // (6) Mit Objekt, welches den Extralook dynamisch erzeugt
   // Hier wird explizit die Blueprint uebergeben, der Extralook ist also
   // rebootfest.

   living->AddExtraLook("get_my_special_extralook", 3600, 0,
                        "extralookende", blueprint(this_object()));


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

   Verwandt:
      RemoveExtraLook(), P_INTERNAL_EXTRA_LOOK, HasExtraLook()

   Sonstiges:
      replace_personal(), break_string()

   Fuer Spielerobjekte:
      P_EXTRA_LOOK

Letzte Aenderung: 21.09.2022, Bugfix
