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
---------

.. code-block:: pike

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

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

.. code-block:: pike

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

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

.. code-block:: pike

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

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

.. code-block:: pike

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

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

.. code-block:: pike

    // (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");
    }

.. code-block:: pike

    // (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:
     :doc:`RemoveExtraLook`, :doc:`../props/P_INTERNAL_EXTRA_LOOK`, :doc:`../lfun/HasExtraLook`
   Sonstiges:
     :doc:`../sefun/replace_personal`, :doc:`../sefun/break_string`
   Fuer Spielerobjekte:
     :doc:`../props/P_EXTRA_LOOK`


Letzte Aenderung: 21.09.2022, Bugfix