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.
      Die Methoden bekommen das Living uebergeben und muessen selbst
      umgebrochene Strings zurueckgeben.

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) (1), 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.
    (1) 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 Meldung von <lookende> bzw. der Funktionsaufruf erfolgt, wenn der
      Extralook der Lebewesen das erste Mal nach Ablauf der Gueltigkeit
      aufgerufen wird.
    - 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: Clone-Objekte koennen fuer selbst beschraenkt temporaere
      Extralooks benutzt werden.
    - Die Endemeldung wird nicht genau mit Ablauf der angegebenen Zeit
      ausgegeben, sondern beim ersten Abruf der Langbeschreibung *nach*
      Ablauf der Zeit.

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());

    // In diesem Fall muss this_object() natuerlich die Funktion
    // "get_my_special_extralook()" definieren, die einen String zurueckgibt.

.. 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: 2021-01-21, Arathorn
