AddExtraLook()
varargs int AddExtraLook(string look, [int duration, string key,
                         string lookende, object ob]);
DEFINIERT IN:
   /std/living/description.c

BESCHREIBUNG:
   Der Extralook erscheint in der Langbeschreibung des Lebewesens.
   Eintraege koennen mit dieser Funktion hinzugefuegt werden. Dies ist der
   bevorzugte Weg, wenn ansonsten extra ein Objekt im Spielerinventar abgelegt
   werden muesste.
   
   Alle Parameter bis auf <look> sind optional.

ARGUMENTE:
  - string look:
    String, der in der Langbeschreibung des Lebewesens zusaetzlich ausgegeben
    wird.
    Kann auch ein Funktionsname sein, wenn <ob> angegeben wird (s.u.).
  - int duration:
    > 0: Wie lang bleibt der Extralook gueltig (in Sekunden)? Anschliessend 
         wird er automatisch geloescht.
    0:   Dieser Eintrag bleibt unbegrenzt gueltig.
    < 0: Dieser Eintrag bleibt bis zum Ende/Reboot bestehen.
  - string key:
    Schluesselwort, unter dem der Eintrag registriert wird und mit dem man ihn
    auch mittels RemoveExtraLook() entfernen kann. Sollte natuerlich
    moeglichst eindeutig sein. ;-) Wenn <key> nicht angeben wird, wird der 
    Objektname (object_name()) benutzt.
  - string lookende:
    String, der an das Lebewesen (nur bei Spielern) ausgegeben wird, wenn der
    eingetragene Extralook abgelaufen ist.
    Kann auch ein Funktionsname sein, wenn <ob> angegeben wird.
  - object ob:
    Wenn hier ein Objekt angegeben wird, werden <look> und <lookende> als
    Funktonsnamen aufgefasst. Diese Funktionen werden in <ob> aufgerufen, wenn
    der Extralook des Lebewesen angezeigt wird bzw. der eingetragene Extralook
    abgelaufen ist. Diese Funktionen bekommen das jeweilige Lebenwesen als
    Objekt uebergeben. Sie muessen einen String zurueckliefern, der ausgegeben
    wird. Dieser String wird direkt so ausgeben, also selber fuer Zeilenumbruch
    etc. sorgen!
    WICHTIG: Das Objekt sollte nach Moeglichkeit eine Blueprint sein, da das
    ganze nix mehr ausgibt, sobald der Clone zerstoert wird, falls hier 
    einer angeben wird. Wenn ihr keine BP uebergebt: Wisst, was ihr tut. ;-)

RUECKGABEWERTE:
  > 0, falls der Eintrag erfolgreich registriert wurde.
  < 0 sonst.
    -1: <key> war nicht gueltig und es konnte keiner ermittelt werden.
    -2: <look> war kein gueltiger String.
    -3: <duration> war kein Integer.
    -4: unter <key> gibt es schon einen Eintrag.

BEMERKUNGEN:
  Die Strings <look> und <lookende> werden vor Ausgabe durch
  replace_personal() geschickt, daher ist die Verwendung von @WER1, @WESSEN1
  usw. moeglich (s. replace_personal). Dies gilt aber _nicht_ fuer den Fall,
  dass die entsprechenden Funktionen in <ob> gerufen werden, dann muessen die
  Funktionen selber umbrechen, etc.
  Nach replace_personal() werden die Strings noch von break_string() auf 78
  Zeilen umgebrochen, allerdings bleiben dabei vorhandene Umbrueche erhalten.
  Die Meldung von <lookende> bzw. der Funktionsaufruf erfolgt, wenn der
  Extralook der Lebewesen das erste Mal nach Ablauf der Gueltigkeit aufgerufen
  wird.

BEISPIELE:
  # einfacher Eintrag, "fuer die Ewigkeit"
  living->AddExtraLook("@WER1 hat den Drachengott der SSP besiegt.");

  # Eintrag der nach 1h automatisch weg ist.
  living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600);
  
  # Eintrag mit bestimmten Schluessel, damit man ihn wieder entfernen kann.
  living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600,
                       "humni_marmeladen_look");
  
  # Mit "Ende"-Meldung, aber kein eigener Schluessel.
  living->AddExtraLook("@WER1 ist patschnass.", 1200, 0,
                       "Du bist endlich wieder trocken. Puuh.");
  
  # Mit Objekt, was 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.

  # Mit Objekt, was den Extralook und die Endemeldung dynamisch erzeugt
  living->AddExtraLook("get_my_special_extralook", 3600, 0,
                       "extralookende", this_object());

SIEHE AUCH:
   RemoveExtraLook(),
   replace_personal(), break_string()
   P_INTERNAL_EXTRA_LOOK

14.05.2007, Zesstra

