Update fuer automatisch erzeugte Files.

Change-Id: I4ca905ed2b82c336aed038d8aa23c9e5e9281e18
diff --git a/doc/lfun-liste b/doc/lfun-liste
index 125719e..e7e21eb 100644
--- a/doc/lfun-liste
+++ b/doc/lfun-liste
@@ -222,6 +222,8 @@
 
 * GetGroupMembers()
 
+* GetHelperObject()
+
 * GetInfoArr()
 
 * GetMatMembership()
diff --git a/doc/lfun/AddInfo b/doc/lfun/AddInfo
index a75a22d..e2774d5 100644
--- a/doc/lfun/AddInfo
+++ b/doc/lfun/AddInfo
@@ -108,7 +108,7 @@
    AddInfo("muenzen",
        "fluestert: Du willst Geld?",
        0,
-       "fluestert @WEM etwas zu.");
+       "fluestert @WEM1 etwas zu.");
 
    // "frage monster nach geld": alle im Raum hoeren
    //  Das Monster sagt: Ich habe zwar kein Geld, aber [...]
@@ -185,7 +185,7 @@
    protected string question_gold() {
      // wieviel Kohle hat der Spieler
      int money = this_player()->QueryMoney();
-     string *y = map(deep_inventory(this_player()),
+     string* y = map(deep_inventory(this_player()),
                    function string(object o) {
                      if(o->QueryMaterial(MAT_GOLD)>0 &&
                         strstr(object_name(o),"/items/money")<0 &&
@@ -232,9 +232,9 @@
    //   Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
    //   Das Monster murmelt: und <object2> aus Gold."
    // - die Umstehenden hoeren:
-   //   "Das Monster murmelt @WEM etwas zu."
+   //   "Das Monster murmelt @WEM1 etwas zu."
    //   oder
-   //   "Das Monster murmelt @WEM etwas zu und glotzt ihn/sie gierig an."
+   //   "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
 
 
 SIEHE AUCH
diff --git a/doc/lfun/AddSpell b/doc/lfun/AddSpell
index 1661f8c..b8175e5 100644
--- a/doc/lfun/AddSpell
+++ b/doc/lfun/AddSpell
@@ -6,9 +6,10 @@
 FUNKTION
 ========
 
-   varargs int AddSpell(int rate, int damage, string TextForEnemy,
-                        string TextForOthers, string|string* dam_type,
-                        string|closure func, int|mapping spellarg)
+   varargs int AddSpell(int rate, int damage,
+      string|<int|spell>* TextForEnemy, string|<int|string>*
+      TextForOthers, string|string* dam_type, string|closure func,
+      int|mapping spellarg)
 
 
 DEFINIERT IN
@@ -21,85 +22,104 @@
 =========
 
    rate          - Relative Haeufigkeit der Anwendung (*),
-                   muss >= 0 sein
+      muss >= 0 sein
+
    damage        - Der Schadenswert fuer Defend(),
-                   muss > 0 sein
+      muss > 0 sein
+
    TextForEnemy  - Text, den der Feind erhalten soll
+      String <text> oder Array der Form ({<text>,<messagetype>})
+      (Siehe ReceiveMsg())
+
    TextForOthers - Text, den andere im Raum erhalten sollen
+      String <text> oder Array der Form ({<text>,<messagetype>})
+      (Siehe ReceiveMsg())
+
    dam_type      - Schadenstyp(en) fuer Defend(),
-                   (Default: ({DT_MAGIC}) )
+      (Default: ({DT_MAGIC}) fuer Magische und ({DT_BLUDGEON}) fuer
+      physikalische Angriffe)
+
    func          - Funktionsname oder Closure, die nach Anwendung
-                   aufgerufen werden soll
-                   (Optional, bekommt als Argumente object enemy,
-                   int real_damage, string* dam_type)
+      aufgerufen werden soll (Optional, bekommt als Argumente object
+      enemy, int real_damage, string* dam_type)
+
    spellarg      - Spell-Argument fuer Defend(), Default ist "1"
 
 
 BESCHREIBUNG
 ============
 
-   Ermoeglicht einfache Angriffs-Zaubersprueche fuer NPCs. Das Ausfuehren von
-   Spells verursacht bei dem NPC keine KP-Kosten.
+   Ermoeglicht einfache Angriffs-Zaubersprueche fuer NPCs. Das
+   Ausfuehren von Spells verursacht bei dem NPC keine KP-Kosten.
 
-   Mit P_SPELLRATE wird die generelle Wahrscheinlichkeit der Ausfuehrung
-   solcher Spells im Heartbeat angegeben, mit 'rate' kann man die relative
-   Wahrscheinlichkeit der Spells untereinander steuern.
+   Mit P_SPELLRATE wird die generelle Wahrscheinlichkeit der
+   Ausfuehrung solcher Spells im Heartbeat angegeben, mit 'rate' kann
+   man die relative Wahrscheinlichkeit der Spells untereinander
+   steuern.
 
    (*) Relative Haeufigkeit heisst, dass sich alle 'rate' der Spells
-   aufaddieren und ein einzelnes 'rate' dann in Relation zur Gesamtsumme
-   steht. D.h. drei Spells mit 80, 10, 10 (Summe 100) haben die selben
-   Aufruf-Wahrscheinlichkeiten wie drei Spells mit 120, 15, 15 oder drei
-   Spells mit 160, 20, 20.
+   aufaddieren und ein einzelnes 'rate' dann in Relation zur
+   Gesamtsumme steht. D.h. drei Spells mit 80, 10, 10 (Summe 100)
+   haben die selben Aufruf-Wahrscheinlichkeiten wie drei Spells mit
+   120, 15, 15 oder drei Spells mit 160, 20, 20.
 
    Ein Spell wird immer in folgender Reihenfolge abgearbeitet:
-    1. Die Texte werden an die Beteiligten ausgegeben.
-    2. Es wird ggf. SpellDefend gerufen (wenn kein SP_PHYSICAL_ATTACK).
-       Abbruch bei Schutz.
-    3. Im Opfer wird Defend() mit den angegebenen Werten aufgerufen.
-       Abbruch bei Tod/Zerstoerung des Opfers.
-    4. Eine Funktion, so definiert, wird ausgefuehrt.
+
+   1. Die Texte werden an die Beteiligten ausgegeben.
+
+   2. Es wird ggf. SpellDefend gerufen (wenn kein
+      SP_PHYSICAL_ATTACK). Abbruch bei Schutz.
+
+   3. Im Opfer wird Defend() mit den angegebenen Werten aufgerufen.
+      Abbruch bei Tod/Zerstoerung des Opfers.
+
+   4. Eine Funktion, so definiert, wird ausgefuehrt.
 
 
 BEMERKUNGEN
 ===========
 
-   TextForOthers wird vor der Ausgabe der Meldung durch replace_personal()
-   geschickt, d.h. es koennen Platzhalter wie @WER1, @WEMQP1 und aehnliche
-   verwendet werden (siehe auch die Manpage von replace_personal()).
-   Da Ersetzungen nur fuer das Gegnerobjekt beruecksichtigt werden, koennen
-   nur Platzhalter mit Endziffer 1 verwendet werden. Die Ersetzungen werden
-   so gesteuert, dass die eingefuegten Namen nach Satzanfaengen automatisch
-   gross geschrieben werden.
-   Frueher wurden statt replace_personal() die Platzhalter @WER, @WESSEN,
-   @WEM, @WEN verwendet. Diese funktionieren weiterhin, sollten aber nicht
-   mehr in neuem Code benutzt werden.
+   TextForOthers wird vor der Ausgabe der Meldung durch
+   replace_personal() geschickt, d.h. es koennen Platzhalter wie
+   @WER1, @WEMQP1 und aehnliche verwendet werden (siehe auch die
+   Manpage von replace_personal()). Da Ersetzungen nur fuer das
+   Gegnerobjekt beruecksichtigt werden, koennen nur Platzhalter mit
+   Endziffer 1 verwendet werden. Die Ersetzungen werden so gesteuert,
+   dass die eingefuegten Namen nach Satzanfaengen automatisch gross
+   geschrieben werden. Frueher wurden statt replace_personal() die
+   Platzhalter @WER, @WESSEN, @WEM, @WEN verwendet. Diese
+   funktionieren weiterhin, sollten aber nicht mehr in neuem Code
+   benutzt werden.
 
    In der von AddSpell gerufenen Methode "func" koennen speziellere
-   Sachen mit dem aktuellen Feind angestellt werden koennen. Die Methode
-   muss im selben Objekt definiert sein, sofern der Funktionsname und
-   keine Closure uebergeben wird.
+   Sachen mit dem aktuellen Feind angestellt werden. Die Methode muss
+   im selben Objekt definiert sein, sofern der Funktionsname und keine
+   Closure uebergeben wird.
 
-   Will man einen physischen Angriff ausloesen, MUSS <spellarg> ein Mapping
-   mit ([SP_PHYSICAL_ATTACK: 1]) sein. Bei Uebergeben einer 0 oder Weglassen
-   des Werts wird an Defend das Default '1' (da es Spells sind) uebergeben.
+   Will man einen physischen Angriff ausloesen, MUSS <spellarg> ein
+   Mapping mit ([SP_PHYSICAL_ATTACK: 1]) sein. Bei Uebergeben einer 0
+   oder Weglassen des Werts wird an Defend das Default '1' (da es
+   Spells sind) uebergeben.
 
-   Wenn damage<=0 oder rate<0 oder keine Meldungen uebergeben werden, wird
-   der Spell NICHT eingetragen, sondern die Funktion bricht mit Rueckgabe
-   von 0 ab.
+   Wenn damage<=0 oder rate<0 oder keine Meldungen uebergeben werden,
+   wird der Spell NICHT eingetragen, sondern die Funktion bricht mit
+   Rueckgabe von 0 ab.
 
 
 BEISPIELE
 =========
 
+code-block:
+
    // #1 Einfacher NPC mit drei Spells, Gesamtrate = 100, also sind die
    //    Raten direkt als Prozent Aufrufwahrscheinlichkeit lesbar.
    AddSpell(80, 400,
             "Der Hexer greift Dich mit einem kleinen Feuerball an.\n",
             "Der Hexer greift @WEN mit einem kleinen Feuerball an.\n",
-            ({DT_FIRE, DT_MAGIC}));
+              ({DT_FIRE, DT_MAGIC}));
    AddSpell(10, 800,
             "Der Hexer greift Dich mit einem riesigen Feuerball an.\n",
-            "Der Hexer greift @WEN mit einem riesigen Feuerball an.\n",
+              "Der Hexer greift @WEN mit einem riesigen Feuerball an.\n",
             ({DT_FIRE, DT_MAGIC}));
    AddSpell(8, 100,
             "Der Hexer piekst Dir in die Augen!",
@@ -108,21 +128,28 @@
    AddSpell(2, 5, (string)0, (string)0, (string*)0, "salto_mortalis");
 
    (Kleiner Feuerball mit 80% Wahrscheinlichkeit, riesiger mit 10%,
-    "augen_stechen" mit 8%, "salto_mortalis" mit 2%)
+   "augen_stechen" mit 8%, "salto_mortalis" mit 2%)
+
+code-block:
 
    // Die Funktion "augen_stechen" kann dann so aussehen:
-   void augen_stechen(object enemy, int damage, mixed dam_types ) {
-     if (damage>10 && !enemy->QueryProp(P_BLIND)) {
+   void augen_stechen(object enemy, int damage, mixed dam_types )
+   {
+     if (damage>10 && !enemy->QueryProp(P_BLIND))
+     {
        enemy->SetProp(P_BLIND, 1);
        if(enemy->QueryProp(P_BLIND))
          tell_object(enemy, "Du bist nun blind!\n");
      }
    }
 
+code-block:
+
    // Zur Funktion "salto_mortalis" gibt es keine Meldungen, dennoch
    // wird Defend mit: enemy->Defend(5, ({DT_MAGIC}), 1, this_object())
    // gerufen!
-   void salto_mortalis(object enemy, int damage, mixed dam_types ) {
+   void salto_mortalis(object enemy, int damage, mixed dam_types )
+   {
      // dem geneigten Leser ueberlassen, den Gegner zu toeten
    }
 
@@ -132,6 +159,7 @@
    //    DefendFuncs() ausgewertet). Es muss auch eine physische Schadensart
    //    enthalten sein!
    //    SpellDefend() wird bei diesem Flag nicht mehr am Gegner gerufen.
+
    AddSpell(100, 200+random(200),
      "Die kleine Ratte beisst Dich!\n",
      "@WER wird von einer kleinen Ratte gebissen!\n",
@@ -153,7 +181,7 @@
      "@WER wird von einer kleinen Ratte in die Wade gebissen!\n",
      ({DT_PIERCE, DT_POISON}), (string)0,
      ([SP_PHYSICAL_ATTACK:1, SP_NO_ACTIVE_DEFENSE:1,
-       SP_REDUCE_ARMOUR: armours]));
+     SP_REDUCE_ARMOUR: armours]));
 
    // SP_NO_ACTIVE_DEFENSE = 1 schaltet aktive Abwehr (Karate/Klerus) ab
    // SP_REDUCE_ARMOUR enthaelt eine Liste von Ruestungstypen mit ihren
@@ -164,10 +192,10 @@
 SIEHE AUCH
 ==========
 
-   Sonstiges:  SpellAttack, SpellDefend, Defend, QueryDefend, SelectEnemy
-               replace_personal
-   Properties: P_DISABLE_ATTACK, P_SPELLRATE, P_AGGRESSIVE
-   Abwehr:     Defend, Defend_bsp, SpellDefend
-   Methoden:   modifiers
+   Sonstiges: *SpellAttack()*, *SpellDefend()*, *Defend()*,
+   *QueryDefend()*, *SelectEnemy()*, *ReceiveMsg()*,
+   *replace_personal()*
 
-Zuletzt geaendert: 20.11.2016, Bugfix
+   Properties: *P_DISABLE_ATTACK*, *P_SPELLRATE*, *P_AGGRESSIVE*
+
+Letzte Aenderung: 15.02.2018, Bugfix
diff --git a/doc/lfun/Defend b/doc/lfun/Defend
index 3e40cfc..dd66fa1 100644
--- a/doc/lfun/Defend
+++ b/doc/lfun/Defend
@@ -40,105 +40,104 @@
 BESCHREIBUNG
 ============
 
-   1. Generell
 
-      Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark
-      die Ruestungen und koerpereigenen Abwehrkraefte sind und die
-      Staerke des Schadens dementsprechend vermindert. Ggf. wird der
-      Schaden zugefuegt und der Feind in  die Liste der Feinde
-      aufgenommen. Der Schaden betraegt: (dam-Summe(Ruestungsstaerken
-      )-random(P_BODY+A_DEX))*CheckResistance/10 aber nicht unter 0.
+Generell
+--------
 
-   2. Der Parameter 'spell'
+   Wenn das Lebewesen angegriffen wird, wird geprueft, wie stark die
+   Ruestungen und koerpereigenen Abwehrkraefte sind und die Staerke
+   des Schadens dementsprechend vermindert. Ggf. wird der Schaden
+   zugefuegt und der Feind in  die Liste der Feinde aufgenommen. Der
+   Schaden betraegt: (dam-
+   Summe(Ruestungsstaerken)-random(P_BODY+A_DEX))*CheckResistance/10
+   aber nicht unter 0.
 
-      Ist 'spell' 0, dann gilt der Angriff als normale physische
-      Attacke Uebergibt man als 'spell'-Parameter ein Mapping, so gibt
-      es dafuer diverse Flags, die das Ergebnis manipulieren (in
-      new_skills.h enthalten). Nichtangabe eines Flags gilt als 0.
 
-      * SP_PHYSICAL_ATTACK ---------- 0/1 1, wenn Ruestungen wirken
-        sollen, 0 sonst -> entspricht !spell, wenn dieses Int ist
+Der Parameter 'spell'
+---------------------
 
-      * SP_NO_ENEMY ----------------- 0/1 1, falls der Angriff nicht
-        toedlich ist, es also keinen echten Gegner gibt -> es wird
-        dann reduce_hit_points() gerufen statt do_damage()
+   Ist 'spell' 0, dann gilt der Angriff als normale physische Attacke
+   Uebergibt man als 'spell'-Parameter ein Mapping, so gibt es dafuer
+   diverse Flags, die das Ergebnis manipulieren (in new_skills.h
+   enthalten). Nichtangabe eines Flags gilt als 0.
 
-      * SP_NO_ACTIVE_DEFENSE -------- 0/1 1, falls aktive Abwehren
-        (wie zurueckschlagende Amulette, Karateabwehren oder
-        Ausweichmanoever) unterbleiben sollen -> zB bei Kratzen durch
-        Dornen oder Fall aus grosser Hoehe ist aktive Abwehr oder
-        Ausweichen unlogisch
+   * SP_PHYSICAL_ATTACK ---------- 0/1 1, wenn Ruestungen wirken
+     sollen, 0 sonst -> entspricht !spell, wenn dieses Int ist
 
-      * SP_RECURSIVE ---------------- 0/1 1, falls der Spell aus
-        einem Defend gerufen wurde (oder einer DefendFunc) ->
-        verhindert Rekursionsprobleme
+   * SP_NO_ENEMY ----------------- 0/1 1, falls der Angriff nicht
+     toedlich ist, es also keinen echten Gegner gibt -> es wird dann
+     reduce_hit_points() gerufen statt do_damage()
 
-      * SP_NAME --------------------- string Name des Spells
+   * SP_NO_ACTIVE_DEFENSE -------- 0/1 1, falls aktive Abwehren (wie
+     zurueckschlagende Amulette, Karateabwehren oder Ausweichmanoever)
+     unterbleiben sollen -> zB bei Kratzen durch Dornen oder Fall aus
+     grosser Hoehe ist aktive Abwehr oder Ausweichen unlogisch
 
-      * SP_GLOBAL_ATTACK ------------ 0/1 1 bei Flaechenspells
+   * SP_RECURSIVE ---------------- 0/1 1, falls der Spell aus einem
+     Defend gerufen wurde (oder einer DefendFunc) -> verhindert
+     Rekursionsprobleme
 
-      * SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY,
-        values int>=0 Die Schutzwirkung durch P_AC/Magie einer
-        Ruestung wird typabhaengig reduziert. Aufbau eines Mappings im
-        Beispiel:
+   * SP_NAME --------------------- string Name des Spells
 
-           ([AT_BOOTS: 0,  // Stiefel schuetzen gar nicht P_BODY:  50,
-           // Koerper zu 50% AT_BELT: 600  // Guertel zu 600% ])
+   * SP_GLOBAL_ATTACK ------------ 0/1 1 bei Flaechenspells
 
-        -> alle 'fehlenden' Eintraege wirken normal
+   * SP_REDUCE_ARMOUR ------------ Mapping: keys AT_X/P_BODY, values
+     int>=0 Die Schutzwirkung durch P_AC/Magie einer Ruestung wird
+     typabhaengig reduziert. Aufbau eines Mappings im Beispiel:
 
-      * SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays 0,
-        fuer keine Treffermeldung, 1 sonst In einem Array koennen
-        Ersatz-Treffermeldungen definiert werden. Format ist:
+     ([AT_BOOTS: 0,  // Stiefel schuetzen gar nicht P_BODY:  50,  //
+     Koerper zu 50% AT_BELT: 600  // Guertel zu 600% ]) -> alle
+     'fehlenden' Eintraege wirken normal
 
-              ({
+   * SP_SHOW_DAMAGE -------------- 0/1 oder Array von Arrays 0, fuer
+     keine Treffermeldung, 1 sonst In einem Array koennen Ersatz-
+     Treffermeldungen definiert werden. Format ist:
 
-           ({ int lphit1, string mess_me, string mess_en, string
-           mess_room }), ({ lphit2, mess_me, mess_en, mess_room }),
-           ... ({ lphitn, mess_me, mess_en, mess_room }), }) wobei
-           lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
-           aufsteigend sortiert.
+        ({ ({ int lphit1, string mess_me, string mess_en, string
+        mess_room }), ({ lphit2, mess_me, mess_en, mess_room }), ...
+        ({ lphitn, mess_me, mess_en, mess_room }), }) wobei
+        lphit1<lphit2<...<lphitn sein muss, d.h. das Array-Array
+        aufsteigend sortiert.
 
-        Ist ein Treffer x LP hart, werden die Meldungen des lphit-
-        Arrays ausgegeben, dessen Wert am naehesten unter dem Schaden
-        liegt.
+     Ist ein Treffer x LP hart, werden die Meldungen des lphit-Arrays
+     ausgegeben, dessen Wert am naehesten unter dem Schaden liegt.
 
-        In den Meldungen mess_me (an den Getroffenen), mess_en (an den
-        Feind), mess_room (an die restlichen Umstehenden) koennen
-        Ersatzstrings wie folgt verwendet werden:
+     In den Meldungen mess_me (an den Getroffenen), mess_en (an den
+     Feind), mess_room (an die restlichen Umstehenden) koennen
+     Ersatzstrings wie folgt verwendet werden:
 
-           @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen
-           (TO) @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes
-           (enemy)
+     @WER1/@WESSEN1/@WEM1/@WEN1 - name(casus) des Getroffenen (TO)
+     @WER2/@WESSEN2/@WEM2/@WEN2 - name(casus) des Feindes (enemy)
 
-      * EINFO_DEFEND ------------ Mapping Dieses Mapping liefert
-        erweiterte Informationen zu dem bisherigen Ablauf des aktiven
-        Attacks. Die verfuegbaren Informationen sind in der Manpage zu
-        DefendInfo festgehalten.
+     EINFO_DEFEND ------------ Mapping Dieses Mapping liefert
+     erweiterte Informationen zu dem bisherigen Ablauf des aktiven
+     Attacks. Die verfuegbaren Informationen sind in der Manpage zu
+     DefendInfo festgehalten.
 
-   3. Reihenfolgen in Defend
 
-      * das Living wird angegriffen, wenn - P_NO_ATTACK != 0 -
-        'enemy' existiert und kein netztoter Spieler ist
+Reihenfolgen in Defend
+----------------------
 
-      * P_DEFENDERS werden durchgegangen (und eventuell
-        benachrichtigt)
+   * das Living wird angegriffen, wenn * P_NO_ATTACK != 0 * 'enemy'
+     existiert und kein netztoter Spieler ist
 
-      * P_TMP_ATTACK_HOOK wird abgefragt
+   * P_DEFENDERS werden durchgegangen (und eventuell benachrichtigt)
 
-      * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
+   * P_TMP_ATTACK_HOOK wird abgefragt
 
-      * magischer Ausweichskill beruecksichtigt
+   * die Ruestungen werden vom Schaden gegebenenfalls abgezogen
 
-      * sensitive Objekte werden ggf. benachrichtigt
+   * magischer Ausweichskill beruecksichtigt
 
-      * InternalModifyDefend wird gerufen
+   * sensitive Objekte werden ggf. benachrichtigt
 
-      * Koerperabwehr abgezogen
+   * InternalModifyDefend wird gerufen
 
-      * der Schaden an do_damage()/reduce_hit_points() uebergeben
+   * Koerperabwehr abgezogen
 
-      * Flucht ueberpruefen mit CheckWimpyAndFlee()
+   * der Schaden an do_damage()/reduce_hit_points() uebergeben
+
+   * Flucht ueberpruefen mit CheckWimpyAndFlee()
 
 
 BEMERKUNGEN
@@ -161,39 +160,38 @@
    Hoehe des tatsaechlichen Schadens. Dies kann mehr sein als die
    Lebenspunkte des Lebewesens.
 
-BEISPIELE (SIEHE AUCH Defend_bsp):
-   // ein simpler Angriff: enem->Defend(100, ({DT_BLUDGEON}),
-   ([SP_PHYSICAL_ATTACK:1]), this_object());
 
-   // ein magischer Angriff (ohne Treffermeldung): enem->Defend(100,
-   ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
+BEISPIELE (SIEHE AUCH Defend_bsp)
+=================================
 
-   // ein magischer Angriff mit Treffermeldung: enem->Defend(100,
-   ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
+   // ein simpler Angriff:
+   enem->Defend(100, ({DT_BLUDGEON}), ([SP_PHYSICAL_ATTACK:1]), this_object());
 
-      this_object());
+   // ein magischer Angriff (ohne Treffermeldung):
+   enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_PHYSICAL_ATTACK:0]), this_object());
+
+   // ein magischer Angriff mit Treffermeldung:
+   enem->Defend(100, ({DT_BLUDGEON, DT_FIRE}), ([SP_SHOW_DAMAGE:1]),
+     this_object());
 
 
 SIEHE AUCH
 ==========
 
-   Angriff: *Attack()*, *P_NO_ATTACK*, *InsertEnemy()* Schaden:
-   *P_ENABLE_IN_ATTACK_OUT*,
+   Angriff: *Attack()*, *P_NO_ATTACK*, *InsertEnemy()*
 
-      *P_LAST_MOVE*, *do_damage()*, *reduce_hit_points()*
+   Schaden:   *P_ENABLE_IN_ATTACK_OUT*, *P_LAST_MOVE*, *do_damage()*,
+   *reduce_hit_points()*
 
-   Schutz:    *P_DEFENDERS*, *InformDefend()*,
-      *DefendOther()*, *P_ARMOURS*, *P_AC*, *P_DEFEND_FUNC*,
-      *QueryDefend()*, *P_BODY*
+   Schutz:    *P_DEFENDERS*, *InformDefend()*, *DefendOther()*,
+   *P_ARMOURS*, *P_AC*, *P_DEFEND_FUNC*, *QueryDefend()*, *P_BODY*
 
-   Daten:     *P_LAST_COMBAT_TIME*,
-      *P_LAST_DAMTYPES*, *P_LAST_DAMTIME*, *P_LAST_DAMAGE*,
-      *P_DAMAGE_MSG*
+   Daten:     *P_LAST_COMBAT_TIME*, *P_LAST_DAMTYPES*,
+   *P_LAST_DAMTIME*, *P_LAST_DAMAGE*, *P_DAMAGE_MSG*
 
-   Resistenz: *P_RESISTANCE_STRENGTHS*,
-      *CheckResistance()*
+   Resistenz: *P_RESISTANCE_STRENGTHS*, *CheckResistance()*
 
-   Sonstiges: *CheckSensitiveAttack()*,
-      *InternalModifyDefend()*, *UseSkill()*, *DefendInfo()*
+   Sonstiges: *CheckSensitiveAttack()*, *InternalModifyDefend()*,
+   *UseSkill()*, *DefendInfo()*
 
 Letzte Aenderung: 29.12.2017, Bugfix
diff --git a/doc/lfun/GetHelperObject b/doc/lfun/GetHelperObject
new file mode 100644
index 0000000..e879129
--- /dev/null
+++ b/doc/lfun/GetHelperObject
@@ -0,0 +1,93 @@
+
+GetHelperObject()
+*****************
+
+
+FUNKTION
+========
+
+   public varargs object GetHelperObject(int type, int|closure
+   strength
+      varargs mixed* extra)
+
+
+DEFINIERT IN
+============
+
+   /std/living/helpers.c
+
+
+ARGUMENTE
+=========
+
+   type:
+      Eine der in helpers.h definierten Konstanten
+
+   strength:
+      minimal geforderte Staerke des Helfers oder Closure zum Filtern
+      der Helferobjekte.
+
+   extra:
+      Beliebige und beliebig viele Argumente, welche an die Closure
+      <strength> weitergegeben werden.
+
+
+BESCHREIBUNG
+============
+
+   Gibt das zuerst gefundene als Helfer registrierte Objekt zurueck,
+   welches die Anforderungen erfuellt.
+
+   Ist <strength> ein int, muss die Staerke/Guete des Helfers
+   (Rueckgabewert der Callback-Methode, siehe
+   *RegisterHelperObject()*) mindestens so gross sein wie der als
+   <strength> uebergebene Wert.
+
+   Ist <strength> eine Closure, wird diese fuer jeden Helfer
+   ausgewertet und entscheidet, ob der Helfer akzeptiert wird. Die
+   Closure bekommt hierbei das Helferobjekt, die vom Helfer angegebene
+   Staerke/Guete und etwaige hier als <extra> uebergebene Argument
+   uebergeben. Ist der Rueckgabewert von <strength> != 0, wird der
+   Helfer akzeptiert und von GetHelperObject zurueckgegeben (ohne
+   weitere Helfer zu pruefen).
+
+
+RUECKGABEWERT
+=============
+
+   Objekt welches den uebergebenen Anforderungen entspricht.
+
+
+BEISPIELE
+=========
+
+   // Es wird ein Helfer zum Tauchen mit der Staerke 4 gesucht
+   PL->GetHelperObject(HELPER_TYPE_AQUATIC, 4);
+
+   // Es wird ein Helfer zum Fliegen mit der Staerke 4 gesucht, welcher aber
+   // mindestens 60 cm gross und maximal 900 g schwer ist.
+   PL->GetHelperObject(HELPER_TYPE_AERIAL, function int (object h, int s)
+         { return s >= 4
+           && h->QueryProp(P_SIZE) >= 60 && h->QueryProp(P_WEIGHT) <= 900;
+         }
+         );
+
+   // Es wird ein Helfer zum Fliegen mit der Staerke 4 gesucht, welcher aber
+   // mindestens 60 cm gross und maximal 900 g schwer ist, aber diese Grenzen
+   // werden nicht in der Funktion festgelegt, sondern als <extra> uebergeben.
+   PL->GetHelperObject(HELPER_TYPE_AERIAL,
+         function int (object h, int s, int min_s, int minsize, int maxweight)
+           { return s >= min_s
+                  && h->QueryProp(P_SIZE) >= minsize
+                  && h->QueryProp(P_WEIGHT) <= maxweight;
+           },
+         4, 60, 900);
+
+
+SIEHE AUCH
+==========
+
+   *RegisterHelperObject()*, *UnregisterHelperObject()*,
+   *P_AERIAL_HELPERS*, *P_AQUATIC_HELPERS*, *P_HELPER_OBJECTS*
+
+Letzte Aenderung: 9.3.2018, Zesstra
diff --git a/doc/lfun/RegisterHelperObject b/doc/lfun/RegisterHelperObject
index af33a5c..21b75f4 100644
--- a/doc/lfun/RegisterHelperObject
+++ b/doc/lfun/RegisterHelperObject
@@ -138,7 +138,7 @@
 SIEHE AUCH
 ==========
 
-   Funktionen:  UnregisterHelperObject()
+   Funktionen:  UnregisterHelperObject(), GetHelperObject()
    Properties:  P_HELPER_OBJECTS, P_AERIAL_HELPERS, P_AQUATIC_HELPERS
    Sonstiges:   /sys/living/helpers.h
 
diff --git a/doc/lfun/init b/doc/lfun/init
index 481eec2..813c8f3 100644
--- a/doc/lfun/init
+++ b/doc/lfun/init
@@ -6,7 +6,7 @@
 FUNKTION
 ========
 
-   void init();
+   public varargs void init(object origin);
 
 
 DEFINIERT IN
@@ -18,7 +18,9 @@
 ARGUMENTE
 =========
 
-   keine
+   object origin
+      Ursprungsumgebung der Bewegung / letzte Umgebung des Lebewesen
+      (sofern existent)
 
 
 BESCHREIBUNG
@@ -32,12 +34,32 @@
    Der Hauptzweck dieser Funktion besteht darin, den Objekten
    untereinander ihre jeweiligen Befehle zugaenglich zu machen.
    Waehrend dies in anderen MudLibs durch eine Reihe von
-   add_action()-Aufrufen im Rumpf von init() geschah, geschieht dies in
-   der MG-MudLib bei Objekten, die /std/thing/commands.c erben
-    (das sind zB. alle Standardobjekte) quasi automatisch
-    (dort werden die Befehle dann per AddCmd() im create() angemeldet,
-     man spart sich die Implementierung von init() und dem Mud somit
-     Speicher). Der andere Weg ist aber natuerlich immer noch moeglich.
+   add_action()-Aufrufen im Rumpf von init() geschah, geschieht dies
+   in der MG-MudLib bei Objekten, die /std/thing/commands.c erben (das
+   sind zB. alle Standardobjekte) quasi automatisch (dort werden die
+   Befehle dann per AddCmd() im create() angemeldet, man spart sich
+   die Implementierung von init(). Der andere Weg ist aber natuerlich
+   immer noch moeglich.
+
+   Der Ablauf der init()-Kette ist wie folgt:
+
+      1. Ist das Objekt X, welches ins Zielobjekt D bewegt wurde,
+         ein Lebewesen, so wird in D init() aufgerufen, wobei
+         this_player() auf X gesetzt ist.
+
+      2. Dann wird fuer jedes Objekt C in D folgendes ausgefuehrt:
+
+         * Ist C ein Lebewesen, dann wird init() in X aufgerufen,
+           wobei this_player() auf C gesetzt ist.
+
+         * Ist X ein Lebewesen, dann wird init() in C aufgerufen,
+           wobei this_player() auf X gesetzt ist.
+
+      3. Schliesslich wird in dem Fall, dass D lebendig ist, in X
+         init() aufgerufen, wobei this_player() auf D gesetzt ist.
+
+   Das Argument <origin> kann genutzt werden, um herauszufinden, wo
+   das Lebewesen nun eigentlich herkam.
 
 
 RUeCKGABEWERT
@@ -49,43 +71,44 @@
 BEMERKUNGEN
 ===========
 
-   Der Ablauf der init()-Kette ist wie folgt:
-   o Ist das Objekt X, welches ins Zielobjekt D bewegt wurde, ein
-     Lebewesen, so wird in D init() aufgerufen, wobei this_player() auf
-     X gesetzt ist.
-   o Dann wird fuer jedes Objekt C in D folgendes ausgefuehrt:
-     + Ist C ein Lebewesen, dann wird init() in X aufgerufen, wobei
-       this_player() auf C gesetzt ist.
-     + Ist X ein Lebewesen, dann wird init() in C aufgerufen, wobei
-     this_player() auf X gesetzt ist.
-   o Schliesslich wird in dem Fall, dass D lebendig ist, in X init()
-     aufgerufen, wobei this_player() auf D gesetzt ist.
+   * Wenn man init() ueberschreibt und vergisst, in etwaigen
+     geerbten Programmen das init() zu rufen, resultiert das in
+     schweren Bugs
+
+   * Das Argument <origin> gab es frueher nicht und es ist
+     weitgehend optional. Die Standardlib uebergibt es, aber nicht
+     alle (speziell) aeltere Programme uebergeben es weiter an ihre
+     geerbten init().
 
 
 BEISPIELE
 =========
 
    D sei ein Raum, in dem sich das Lebewesen L1 sowie die Gegenstaende
-   N1 und N2 befinden.
-   Betritt ein Spieler X diesen Raum, so werden folgende init()s
-   aufgerufen:
+   N1 und N2 befinden. Betritt ein Spieler X diesen Raum, so werden
+   folgende init()s aufgerufen:
 
-     D->init();  // this_player() == X
-     X->init();  // this_player() == L1
-     L1->init(); // this_player() == X
-     N1->init(); // this_player() == X
-     N2->init(); // this_player() == X
+      1. D->init();  // this_player() == X
 
-   Gelangt dagegen ein nichtlebendiges Objekt nach D, so sieht das Ganze
-   wie folgt aus:
+      2. X->init();  // this_player() == L1
 
-     X->init();    // this_player() == L1
+      3. L1->init(); // this_player() == X
+
+      4. N1->init(); // this_player() == X
+
+      5. N2->init(); // this_player() == X
+
+   Gelangt dagegen ein nichtlebendiges Objekt nach D, so sieht das
+   Ganze wie folgt aus:
+
+      1. X->init();    // this_player() == L1
 
 
 SIEHE AUCH
 ==========
 
-         exit(), AddCmd(), add_action(),
-   NotifyInsert()
+   *exit()*, *AddCmd()*, *NotifyInsert()*
 
-Last modified: 04.08.2007, Zesstra
+   add_action(E)
+
+Last modified: 07.03.2018, Zesstra
diff --git a/doc/lfun/remove b/doc/lfun/remove
index 914c1e1..78d8ada 100644
--- a/doc/lfun/remove
+++ b/doc/lfun/remove
@@ -12,27 +12,36 @@
 DEFINIERT IN
 ============
 
-   /std/thing/moving.c
-   /std/living/moving.c
-   /std/room/moving.c
+   /std/thing/moving.c /std/living/moving.c /std/room/moving.c
+   /std/unit.c
 
 
 ARGUMENTE
 =========
 
-   silent
-        Falls ungleich 0, so werden beim Zerstoeren keine Meldungen
-        ausgegeben.
+   * silent: Falls ungleich 0, so werden beim Zerstoeren keine
+     Meldungen ausgegeben.
 
 
 BESCHREIBUNG
 ============
 
-   Beim Aufruf dieser Funktion entfernt sich das Objekt selbst. Durch
-   Ueberladen dieser Funktion kann man diesen Vorgang noch durch die
-   Ausgabe von Meldungen kommentieren, oder irgendwelche Daten
-   abspeichern, oder das Zerstoeren ganz verhindern (auf diesem Weg... Mit
-   destruct() kann das Objekt immer noch direkt zerstoert werden!)
+   Die meisten Objekte zerstoeren sich durch den Aufruf von remove()
+   selbst.
+
+   Unitobjekte reduzieren P_AMOUNT um U_REQ Einheiten. Will man ein
+   Unit- Objekt vollstaendig zerstoeren, ist vor dem Aufruf von
+   remove() U_REQ auf P_AMOUNT zu setzen. Wird durch remove() P_AMOUNT
+   0, wird das Objekt natuerlich zerstoert.
+
+   Durch Ueberladen dieser Funktion kann man diesen Vorgang noch durch
+   die Ausgabe von Meldungen kommentieren, oder irgendwelche Daten
+   abspeichern, oder das Zerstoeren ganz verhindern (auf diesem Weg...
+   Mit destruct() kann das Objekt immer noch direkt zerstoert werden!)
+
+   ACHTUNG: Wenn ein Objekt durch remove() nicht zerstoert wird,
+   koennte das einen Grund haben. Bitte nicht einfach destruct()
+   verwenden, das ist nur fuer Notfaelle wie ein buggendes remove().
 
 
 RUeCKGABEWERT
@@ -44,13 +53,13 @@
 BEMERKUNGEN
 ===========
 
-   Nach einem erfolgreichen ::remove() gelten die selben Einschraenkungen
-   wie nach einem destruct()!
+   Nach einem erfolgreichen ::remove() gelten die selben
+   Einschraenkungen wie nach einem destruct()!
 
 
 SIEHE AUCH
 ==========
 
-   destruct()
+   "../efun/destruct", *U_REQ*, *P_AMOUNT*
 
-Last modified: Wed May 8 10:23:40 1996 by Wargon
+Letzte Aenderung: 24.07.2018, Bugfix
diff --git a/doc/materials/materials/MAT_CHOCOLATE b/doc/materials/materials/MAT_CHOCOLATE
index c5f6ecc..fc699f5 100644
--- a/doc/materials/materials/MAT_CHOCOLATE
+++ b/doc/materials/materials/MAT_CHOCOLATE
@@ -11,11 +11,11 @@
 kakaohaltige Suessspeise mit Extra-Milch
 
 Erkennbarkeit:
-MAT_SHIT:-50
-MAT_MISC_FOOD:-25
+MAT_SHIT:-40
+MAT_WAX: -20
+MAT_MISC_FOOD:5
 MAT_CHOCOLATE
 
 Gruppenzugehoerigkeit:
 MATGROUP_EATABLE:100
-MATGROUP_BIO:100
 MATGROUP_SOLID:100
diff --git a/doc/props/P_WEIGHT b/doc/props/P_WEIGHT
index 4c37e46..a68f580 100644
--- a/doc/props/P_WEIGHT
+++ b/doc/props/P_WEIGHT
@@ -18,26 +18,33 @@
 BESCHREIBUNG
 ============
 
-   - Objekte
-     Das Gewicht eines Objetes in Gramm.
+   * Objekte Das Gewicht eines Objetes in Gramm.
 
-   - Speisen
-     Gewicht einer Portion der Speise.
+   * Speisen Gewicht einer Portion der Speise.
+
+   * Container Das Gewicht des Containers ohne Inhalt
+
+   * Lebewesen Das Gewicht des Lebewesens ohne Inhalt
 
 
 BEMERKUNGEN
 ===========
 
-   In tragbaren Speisen (erben von /std/food) setzt man mit SetProp
-   das Gewicht _einer_ Portion. Per QueryProp erhaelt man aber das
-   Gesamtgewicht der Speise inclusive des eventuell vorhandenen Behaelters.
-   Das Gewicht des Behaelters wird dabei aus P_EMPTY_PROPS[P_WEIGHT]
-   gelesen.
+   Das Gewicht eines Objektes (in Gramm). Bei normalen Objekten ist es
+   das Gesamtgewicht dieses Objektes. Bei Containern (und Lebewesen)
+   ist es das Gewicht des Containers ohne etwaigen Inhalt.
+
+   In tragbaren Speisen (welche von von /std/food erben) setzt man mit
+   SetProp das Gewicht _einer_ Portion. Per QueryProp erhaelt man aber
+   das Gesamtgewicht der Speise inclusive des eventuell vorhandenen
+   Behaelters. Das Gewicht des Behaelters wird dabei aus
+   P_EMPTY_PROPS[P_WEIGHT] gelesen.
 
 
 SIEHE AUCH
 ==========
 
-   Speisen: wiz/food, P_EMPTY_PROPS
+   *P_TOTAL_WEIGHT* *P_EMPTY_PROPS*, *P_WEIGHT_PERCENT*,
+   *P_WEIGHT_PER_UNIT*, zu Speisen: wiz/food
 
-Last modified: Thu Oct 28 12:15:00 2010 by Caldra
+Last modified: 25.07.2018 by Zesstra