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

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

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

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