P_INTERNAL_EXTRA_LOOK-Dokumentation und Konstanten
* Dokumentation ueberarbeitet und praezisiert
* magic numbers fuer Rueckgabewerte und Schluessel durch
  Konstanten in Header/im Code ersetzt

Change-Id: I3d38867f24510ef4fc97d7f3cdf350e169a63ccd
diff --git a/doc/sphinx/lfun/AddExtraLook.rst b/doc/sphinx/lfun/AddExtraLook.rst
index 30b255a..2e90879 100644
--- a/doc/sphinx/lfun/AddExtraLook.rst
+++ b/doc/sphinx/lfun/AddExtraLook.rst
@@ -1,131 +1,169 @@
 AddExtraLook()
 ==============
 
-AddExtraLook()
-varargs int AddExtraLook(string look, [int duration, string key,
-                         string lookende, object ob]);
---------------------------------------------------------------------------------------------------------------------------------------
-::
+FUNKTION
+--------
+
+    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.
+    /std/living/description.c
 
 ARGUMENTE
 ---------
-::
+    string look:
 
-  - 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. ;-)
+      - String, der in der Langbeschreibung des Lebewesens zusaetzlich
+        ausgegeben wird.
+      - zu rufender Funktionsname, wenn 'ob' angegeben ist
 
-RUECKGABEWERTE
---------------
-::
+    int duration:
 
-  > 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.
+      - > 0: Dauer der Gueltigkeit des Extralooks in Sekunden.
+      - 0:   Unbegrenzt gueltiger Eintrag. Rebootfest.
+      - < 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.
+    - Das uebergbene Objekt sollte fuer permanente Eintraege 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 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.
+RUECKGABEWERTE
+--------------
+    Siehe auch /sys/living/description.h fuer Konstanten.
+
+    - 1, 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.
 
 BEISPIELE
 ---------
-::
 
-  # einfacher Eintrag, "fuer die Ewigkeit"
-  living->AddExtraLook("@WER1 hat den Drachengott der SSP besiegt.");
+.. code-block:: pike
 
-  # Eintrag der nach 1h automatisch weg ist.
-  living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600);
+    // (1) einfacher Eintrag, "fuer die Ewigkeit"
+    living->AddExtraLook("@WER1 hat den Drachengott der SSP besiegt.");
 
-  
+.. code-block:: pike
 
-  # Eintrag mit bestimmten Schluessel, damit man ihn wieder entfernen kann.
-  living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600,
-                       "humni_marmeladen_look");
+    // (2) Eintrag der nach 1h automatisch weg ist.
+    living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600);
 
-  
+.. code-block:: pike
 
-  # Mit "Ende"-Meldung, aber kein eigener Schluessel.
-  living->AddExtraLook("@WER1 ist patschnass.", 1200, 0,
-                       "Du bist endlich wieder trocken. Puuh.");
+    // (3) Eintrag mit bestimmten Schluessel, damit man ihn wieder entfernen kann
+    living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600,
+                         "humni_marmeladen_look");
 
-  
+.. code-block:: pike
 
-  # 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.
+    // (4) 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 und die Endemeldung dynamisch erzeugt
-  living->AddExtraLook("get_my_special_extralook", 3600, 0,
-                       "extralookende", this_object());
+.. 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()));
+
+.. code-block:: pike
+
+    // Mit Objekt, was den Extralook und die Endemeldung dynamisch erzeugt
+    // und keine festgelegte Existenzdauer hat, sondern sich aufgrund
+    // eigener Konditionen entsorgt
+    void set_extra_look(object living) {
+      object dyntemplook = clone_object("/path/to/some/object");
+      if(living->AddExtraLook("get_my_special_extralook", 0,
+                              object_name(dyntemplook),
+                              0, dyntemplook) == XL_OK)
+        dyntemplook->SetProp(P_INTERNAL_EXTRA_LOOK, living);
+      else
+        dyntemplook->remove();
+    }
+
+    // entsprechendes Objekt:
+    varargs int remove(int silent) {
+      object ob = QueryProp(P_INTERNAL_EXTRA_LOOK);
+      // wenn der Spieler da ist, entfernen wir den Look regulaer
+      if(objectp(ob))
+        ob->RemoveExtraLook(object_name(this_object()));
+      return ::remove(silent);
+    }
+
+    void reset() {
+      if(!random(10))
+        remove();
+      else
+        ::reset();
+    }
 
 SIEHE AUCH
 ----------
-::
 
-   RemoveExtraLook(),
-   replace_personal(), break_string()
-   P_INTERNAL_EXTRA_LOOK
+   Verwandt:
+     :doc:`RemoveExtraLook`, :doc:`../props/P_INTERNAL_EXTRA_LOOK`
+   Sonstiges:
+     :doc:`../sefun/replace_personal`, :doc:`../sefun/break_string`
+   Fuer Spielerobjekte:
+     :doc:`../props/P_EXTRA_LOOK`
 
-14.05.2007, Zesstra
-
+5. Juni 2017 Gloinson
diff --git a/doc/sphinx/lfun/RemoveExtraLook.rst b/doc/sphinx/lfun/RemoveExtraLook.rst
index 3a81693..ed2c04b 100644
--- a/doc/sphinx/lfun/RemoveExtraLook.rst
+++ b/doc/sphinx/lfun/RemoveExtraLook.rst
@@ -1,66 +1,81 @@
 RemoveExtraLook()
 =================
 
-RemoveExtraLook()
+FUNKTION
+--------
 
 int RemoveExtraLook(string key);
-----------------------------------------------------
-::
 
 DEFINIERT IN
 ------------
-::
-
-  /std/living/description.c
-
-BESCHREIBUNG
-------------
-::
-
-  Der Extralook erscheint in der Langbeschreibung des Lebewesens.
-  Eintraege koennen mit dieser Funktion (vorzeitig) wieder entfernt werden.
+    /std/living/description.c
 
 ARGUMENTE
 ---------
-::
+    - string key:
+      Schluessel, unter dem der Extralook registriert wurde ODER
+      Objektname des registrierenden Objektes
 
-  - string key:
-    Schluesselwort, unter dem der Eintrag, den man entfernen moechte, von
-    AddExtraLook() registriert wurde.
+BESCHREIBUNG
+------------
+    Der Extralook erscheint in der Langbeschreibung des Lebewesens.
 
-RUECKGABEWERTE
---------------
-::
-
-  > 0, falls der Eintrag erfolgreich entfernt wurde.
-  < 0 sonst.
-    -1: keinen (gueltigen) <key> uebergeben.
-    -2: kein Eintrag fuer <key> gefunden.
+    Eintraege koennen mit dieser Funktion (vorzeitig) wieder entfernt
+    werden. Dazu wird entweder der selbst festgelegte Schluessel oder
+    der implizite Schluessel `object_name()` des setzenden Objekts
+    benoetigt.
 
 BEMERKUNGEN
 -----------
-::
+    Beim Entfernen mit dieser Funktion wird die "Endemeldung" des entfernten
+    Eintrages nicht ausgegeben.
 
-  Beim Entfernen mit dieser Funktion wird die "Endemeldung" des entfernten
-  Eintrages nicht ausgegeben.
+RUECKGABEWERTE
+--------------
+    Siehe auch /sys/living/description.h fuer Konstanten.
+
+    - 1, falls der Eintrag erfolgreich entfernt wurde.
+    - < 0 sonst.
+
+      - -1: keinen (gueltigen) <key> uebergeben.
+      - -2: kein Eintrag fuer <key> gefunden.
 
 BEISPIELE
 ---------
-::
 
-  // Extralook registrieren.
-  living->AddExtraLook(
-    "@WER1 wird von einer Horde Daemonen verfolgt.",
-    1800,
-    // Ohne das gehts nicht, sonst gibt es keine ID, die man zum Loeschen
-    // verwenden koennte.
-    "ennox_daemonenhordenverfolgerlook");
-  // Nun kann der Eintrag auch wieder entfernt werden:
-  living->RemoveExtraLook("ennox_daemonenhordenverfolgerlook");
+.. code-block:: pike
+
+    // (1) Loeschen ueber expliziten Key
+    living->AddExtraLook(
+      "@WER1 wird von einer Horde Daemonen verfolgt.",
+      1800, "ennox_daemonenhordenverfolgerlook");
+
+    // Nun kann der Eintrag auch wieder entfernt werden:
+    living->RemoveExtraLook("ennox_daemonenhordenverfolgerlook");
+
+.. code-block:: pike
+
+    // (2) Loeschen ueber impliziten Objektnamen-Schluessel
+    living->AddExtraLook("Eine Sonnenblume ragt aus dem Ohr.")
+    // das ist nur aus dem gleichen Objekt heraus moeglich:
+    living->RemoveExtraLook(0);
+
+.. code-block:: pike
+
+    // (3) Loeschen ueber impliziten Objektnamen-Schluessel
+    string implizite_id = object_name(this_object());
+    living->AddExtraLook("Eine Sonnenblume ragt aus dem Ohr.")
+    // diese ID kann man natuerlich durch die Gegend schicken
+    living->RemoveExtraLook(implizite_id);
 
 SIEHE AUCH
 ----------
 
-  :doc:`AddExtraLook`
-  :doc:`../props/P_INTERNAL_EXTRA_LOOK`
-  :doc:`../props/P_EXTRA_LOOK`
+   Verwandt:
+     :doc:`AddExtraLook`, :doc:`../props/P_INTERNAL_EXTRA_LOOK`
+   Sonstiges:
+     :doc:`../sefun/replace_personal`, :doc:`../sefun/break_string`
+   Fuer Spielerobjekte:
+     :doc:`../props/P_EXTRA_LOOK`
+
+15. Jun 2017 Gloinson
diff --git a/doc/sphinx/props/P_INTERNAL_EXTRA_LOOK.rst b/doc/sphinx/props/P_INTERNAL_EXTRA_LOOK.rst
index bff5353..dd95176 100644
--- a/doc/sphinx/props/P_INTERNAL_EXTRA_LOOK.rst
+++ b/doc/sphinx/props/P_INTERNAL_EXTRA_LOOK.rst
@@ -15,44 +15,55 @@
 BESCHREIBUNG
 ------------
 
-  Diese Property enthaelt ein Mapping, in dem alle einzelnen
-  Extra-Look-Eintraege des Livings enthalten sind. Dabei weden die Daten von
-  AddExtraLook() und RemoveExtraLook() verwaltet. Fragt man diese Prop mit
-  QueryProp() ab, erhaelt man die Ausgabe der gueltigen Extralooks des
-  Livings. Bei Abfrage per Query() erhaelt man ein Mapping mit allen
-  Eintraegen und deren Daten.
-  Der Key ist jeweils die ID des Extralooks, der Value ist erneut ein 
-  Mapping, welches folgende Keys enthalten kann:
-  
-  "xllook":
-    String, der im Extralook des Living angezeigt wird.
-  "xlduration":
-    Zeitstempel (int), der angibt, wie lang der Eintrag gueltig
-    ist. 0 == "Unendlich", negative Zahlen besagen, dass der Eintrag nur 
-    bis Reboot/Ende gueltig sein soll und abs(xlduration) ist der Zeitpunkt
-    des Eintrages dieses Extralooks.
-  "xlende":
-    String, der nach Ablaufen an das Living ausgegeben wird.
-  "xlfun":
-    Funktion, die gerufen wird und den String zurueckliefern muss, der
-    ausgegeben werden soll.
-  "xlendefun":
-    Funktion, die gerufen wird, wenn der Eintrag abgelaufen ist und den
-    String zurueckliefern muss, der dann ans Living ausgegeben wird.
-  "xlobjectname":
-    Objekt, in dem die o.a. Funktionen gerufen werden.
+    Diese Property enthaelt ein Mapping, in dem alle einzelnen
+    Extra-Look-Eintraege des Livings enthalten sind. Dabei weden die Daten von
+    AddExtraLook() und RemoveExtraLook() verwaltet. Fragt man diese Prop mit
+    QueryProp() ab, erhaelt man die Ausgabe der gueltigen Extralooks des
+    Livings. Bei Abfrage per Query() erhaelt man ein Mapping mit allen
+    Eintraegen und deren Daten.
 
-  .. warning::
+    Der Key ist jeweils die ID des Extralooks, der Value ist erneut ein 
+    Mapping, welches folgende Keys enthalten kann:
+
+    - "xllook":
+      String, der im Extralook des Living angezeigt wird.
+    - "xlduration":
+      Zeitstempel (int), der angibt, wie lang der Eintrag gueltig
+      ist.
+
+      - 0  ewig gueltig
+      - <0 gueltig bis Ende/Reboot
+      - >0 Gueltig in Sekunden
+
+    - "xlende":
+      String, der nach Ablaufen an das Living ausgegeben wird.
+    - "xlfun":
+      Funktion, die gerufen wird und den String zurueckliefern muss, der
+      ausgegeben werden soll.
+    - "xlendefun":
+      Funktion, die gerufen wird, wenn der Eintrag abgelaufen ist und den
+      String zurueckliefern muss, der dann ans Living ausgegeben wird.
+    - "xlobjectname":
+      Objekt, in dem die o.a. Funktionen gerufen werden.
+
+BEMERKUNGEN:
+------------
+
+    .. warning::
   
-  DIESE PROPERTY BITTE **NIEMALS** PER HAND MIT Set()/SetProp() AENDERN!
-  Die Daten in dieser Prop werden vom Living selber verwaltet. Extralooks
-  koennen mittel AddExtraLook() eingetragen und mit RemoveExtraLook() entfernt
-  werden.
+      Keine echte Property. Die Methode _query_internal_extralook() in /std/living/description.c stellt die Daten zusammen.
+
+    .. warning::
+
+       ACHTUNG: Bitte nur die bereitgestellten Methoden zur Manipulation benutzen! Setzen als Property hat keinen Effekt.
 
 SIEHE AUCH
 ----------
 
-  - :doc:`../lfun/long`
-  - /std/living/description.c, /std/player/base.c
-  - :doc:`../lfun/AddExtraLook`, :doc:`../lfun/RemoveExtraLook`
+   Verwandt:
+     :doc:`../lfun/AddExtraLook`, :doc:`../lfun/RemoveExtraLook`
+     :doc:`../lfun/long`
+   Fuer Spielerobjekte:
+     :doc:`../props/P_EXTRA_LOOK`
 
+15. Juni 2017 Gloinson