
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
