Update diverser Manpages und Beispiele

Change-Id: I07094305b7697550dac8667a26e150ca23560e41
diff --git a/doc/beispiele/misc/bsptransporter1.c b/doc/beispiele/misc/bsptransporter1.c
index 3e26020..d3c5475 100644
--- a/doc/beispiele/misc/bsptransporter1.c
+++ b/doc/beispiele/misc/bsptransporter1.c
@@ -26,23 +26,24 @@
   SetProp(P_LIGHT, 1 );
   SetProp(P_TRANSPARENT,1);
   // Man soll auf(in) die Wolke und von ihr herunter schauen koennen.
-    
+
   /*** Meldungen, die Transporter geben koennen ***/
-  
+
   SetProp( P_DEPARTMSG, ({
-    "Die Wolke steigt in die Luft.\n", 
+    "Die Wolke steigt in die Luft.\n",
     "Die Wolke fliegt davon.\n"
   }) );
   // Die erste Meldung ist fuer Leute auf der Wolke.
   // Die zweite fuer Leute in dem Raum, in dem die Wolke ankommt.
-      
-  SetProp( P_ARRIVEMSG, ({
-    "Die Wolke naehert sich dem Boden von @@QueryArrived@@.\n",
-    "Eine kleine Wolke schwebt herab.\n"
-  }) );
+
+  Set( P_ARRIVEMSG, function string* () {
+    return ({
+      sprintf("Die Wolke naehert sich dem Boden von %s.\n",QueryArrived()),
+      "Eine kleine Wolke schwebt herab.\n"});
+  }, F_QUERY_METHOD);
   // Die erste Meldung ist fuer Leute auf der Wolke.
   // Die zweite fuer Leute in dem Raum, aus dem die Wolke abreist.
-    
+
   SetProp( P_ENTERMSG, ({
     "steigt auf die Wolke",
     "kommt auf die Wolke"
@@ -50,7 +51,7 @@
   // Die erste Meldung ist fuer den Raum, aus dem der Spieler kommt.
   // (=Raum). Die zweite Meldung ist fuer Spieler in dem Raum, in
   // den der Spieler geht (=Transporter).
-	
+
   SetProp( P_LEAVEMSG, ({
     "steigt von der Wolke",
     "steigt von der Wolke"
@@ -58,7 +59,7 @@
   // Die erste Meldung ist fuer den Raum, aus dem der Spieler kommt.
   // (=Transporter). Die zweite Meldung ist fuer Spieler in dem Raum,
   // in den der Spieler geht (=Raum).
-      
+
   SetProp( P_LEAVEFAIL, "Die Wolke schwebt viel zu hoch" );
   // Meldung, die kommt, wenn ein Spieler den Transporter verlassen
   // will, aber dieser an keinem Raum angelegt hat.
@@ -108,7 +109,7 @@
   AddMsg( "Die Wolke beginnt zu sinken.\n", 10 );
   // Nach dem Letzten Haltepunkt wird der Kurs wieder von vorn
   // befahren.
- 	
+
   Start();
   // Lasse den Transporter am ersten dieser Haltepunkte starten.
 }
@@ -116,7 +117,7 @@
 steige(str)
 {
   string arg, arg2;
-  
+
   if (sscanf( str, "auf %s", arg ) > 0 && id(old_explode(arg," ")[0]))
     return Enter();
   // Wenn sicher ist, dass der Spieler die Wolke BEsteigen will,
@@ -128,5 +129,3 @@
   // Verben sollten nach Enter() oder Leave() keine weiteren Befehle
   // enthalten.
 }
-
-
diff --git a/doc/lfun/AddInfo b/doc/lfun/AddInfo
index c684fe0..76c6e1c 100644
--- a/doc/lfun/AddInfo
+++ b/doc/lfun/AddInfo
@@ -6,8 +6,8 @@
 FUNKTION
 ========
 
-   varargs void AddInfo( frage, meldung
-      [, indent [, [silent [, casebased] ] ] );
+   public varargs void AddInfo(string|string* key, string|closure info,
+                  string indent, int|string silent, string|closure casebased);
 
 
 DEFINIERT IN
@@ -19,22 +19,23 @@
 ARGUMENTE
 =========
 
-   string/string* frage
-      Schluesseltext(e) auf die Informationen gegeben werden sollen.
+   string|string* frage
+      Schluesselwoerter, fuer die der NPC eine Antwort geben soll,
+      wenn man ihn danach fragt
 
-   string/closure meldung
+   string|closure meldung
       Information, die gegeben werden soll; wenn 'meldung' eine
       Closure ist, wird der gerufenen Funktion nichts uebergeben.
 
-   string indent
+   string indent    (optional)
       Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
 
-   int/string silent
+   int|string silent    (optional)
       Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
 
-   string/closure casebased
-      Closure mit Returnwert string oder int. Bekommt nichts
-      uebergeben.
+   string|closure casebased   (optional)
+      Closure mit Returnwert string oder int. Der Funktion werden
+      keine Argumente uebergeben.
 
 
 BESCHREIBUNG
@@ -79,7 +80,7 @@
 
    Die Strings von 'silent' und 'meldung' werden geparsed. Dabei
    koennen die @[...]-Tags von replace_personal() verwendet werden,
-   Objekt 1 ist this_player(). Ersetzte String am Satzanfang werden
+   Objekt 1 ist this_player(). Ersetzte Strings am Satzanfang werden
    automatisch gross geschrieben. AddInfo() konvertiert die alten
    Schluesselworte @WER, @WESSEN, @WEM, @WEN zu denen von
    replace_personal(), jedoch nicht in den Rueckgabe- werten von
@@ -265,4 +266,4 @@
    Interna:
       GetInfoArr() , do_frage()
 
-7. Mar 2017 Gloinson
+24.09.2020, Arathorn
diff --git a/doc/lfun/AddMoney b/doc/lfun/AddMoney
index 8f15cc6..6518215 100644
--- a/doc/lfun/AddMoney
+++ b/doc/lfun/AddMoney
@@ -69,10 +69,10 @@
 BEISPIELE
 =========
 
-   #include <zentralbank.h>
+   #include <bank.h>
 
    // gib ihm Geld
-   int money = ZENTRALBANK->Withdraw(50);
+   int money = ZENTRALBANK->WithDraw(50);
    this_player()->AddMoney(money);
 
    // nimm ihm Geld
@@ -86,9 +86,11 @@
 SIEHE AUCH
 ==========
 
-   Geldhandling:      QueryMoney(L) Zentralbank:       PayIn(L),
-   WithDraw(L) Sonstiges:         move(L), /items/money.c,
-   /sys/moving.h, /sys/money.h, /sys/bank.h
-   /std/container/moneyhandler.c
+   Geldhandling:  QueryMoney(L)
+   Zentralbank:   PayIn(L), WithDraw(L)
+   Sonstiges:     move(L),
+   /items/money.c
+   /sys/moving.h, /std/container/moneyhandler.c
+   /sys/money.h, /sys/bank.h
 
 18.02.2013, Zesstra
diff --git a/doc/lfun/AddRoomMessage b/doc/lfun/AddRoomMessage
index 82c2c99..47e2b60 100644
--- a/doc/lfun/AddRoomMessage
+++ b/doc/lfun/AddRoomMessage
@@ -66,7 +66,7 @@
        verlassen haben
 
      * ist manuell nur ueber Loeschen der Nachrichten umsetzbar,
-       also mit "AddRoomMessage((string)0, 0, (string)0);"
+       also mit "AddRoomMessage(0, 0, 0);"
 
    In Funktionen, die durch AddRoomMessage() ausgeloest werden, darf
    this_player() nicht verwendet werden, da die call_out()-Kette den
@@ -130,7 +130,7 @@
    }
 
    public int action_laerm(string str) {
-     AddRoomMessage((string)0, 0, (string)0);
+     AddRoomMessage(0, 0, 0);
 
      this_player()->ReceiveMsg(
        "Du schreist dir kurz die Seele aus dem Leib. Alle Tiere "
diff --git a/doc/lfun/AddSpecialInfo b/doc/lfun/AddSpecialInfo
index efc3067..be61558 100644
--- a/doc/lfun/AddSpecialInfo
+++ b/doc/lfun/AddSpecialInfo
@@ -6,23 +6,31 @@
 FUNKTION
 ========
 
-   varargs void AddSpecialInfo( frage, meldung
-                         [, indent [, [silent [, casebased] ] ] );
+   public varargs void AddSpecialInfo(string|string* keys, string functionname,
+                  string indent, int|string silent, string|closure  casebased);
 
 
 ARGUMENTE
 =========
 
-   string/string* frage
-      Schluesseltext(e) auf die Informationen gegeben werden sollen.
-   string/closure function
-      Methodenname im NPC/Closure
-   string indent
-      Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
-   int/string silent
-      Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
-   string/closure casebased
-      Funktionsname oder Closure mit Returnwert string oder int.
+   string|string* frage
+     Schluesselwoerter, fuer die der NPC eine Antwort geben soll, wenn
+     man ihn danach fragt
+
+   string functionname
+     Name der Funktion, die gerufen werden soll, um den Informationstext
+     des NPCs zu ermitteln. Der gerufenen Funktion werden keine Argumente
+     uebergeben.
+
+   string indent    (optional)
+     Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
+
+   int|string silent    (optional)
+     Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
+
+   string|closure casebased   (optional)
+     Closure mit Returnwert string oder int.
+     Der Funktion werden keine Argumente uebergeben.
 
 
 DEFINIERT IN
@@ -83,6 +91,19 @@
 SIEHE AUCH
 ==========
 
-   AddInfo(L), RemoveInfo(L)
+   Verwandt:
+      AddInfo(), RemoveInfo()
 
-7.Apr 2004 Gloinson
+   Props:
+      P_PRE_INFO
+
+   Files:
+      /std/npc/info.c
+
+   Loggen:
+      P_LOG_INFO
+
+   Interna:
+      GetInfoArr() , do_frage()
+
+24.09.2020, Arathorn
diff --git a/doc/lfun/Attack b/doc/lfun/Attack
index 08a0c20..1e958de 100644
--- a/doc/lfun/Attack
+++ b/doc/lfun/Attack
@@ -18,8 +18,8 @@
 BESCHREIBUNG
 ============
 
-   Der Feind wird der Staerke der Waffe (bzw. der Haende) entsprechend
-   stark angegriffen.
+   Der Feind wird entsprechend der Angriffsstaerke der Waffe (P_WC) bzw. der
+   Haende (P_HANDS[1]) angegriffen.
 
 
 RUECKGABEWERT
@@ -33,10 +33,10 @@
 
    Diese Funktion gibt die Angriffsmeldung aus.
    Falls mit blossen Haenden angegriffen wird, ist die Staerke
-   (2*Staerke_der_Haende + 10*A_STR)/3
+   (2 * P_HANDS[1] + 10 * A_STR)/3
 
 
 SIEHE AUCH
 ==========
 
-   "Defend", "QueryDamage"
+   Defend(), QueryDamage()
diff --git a/doc/lfun/CheckResistance b/doc/lfun/CheckResistance
index bcf64ca..52bfe23 100644
--- a/doc/lfun/CheckResistance
+++ b/doc/lfun/CheckResistance
@@ -6,7 +6,7 @@
 FUNKTION
 ========
 
-   CheckRessistance(string* dam_type_list)
+   public float CheckResistance(string* dam_type_list)
 
 
 ARGUMENTE
@@ -34,4 +34,4 @@
 SIEHE AUCH
 ==========
 
-   "Defend"
+   Defend(), P_RESISTANCE_STRENGTHS
diff --git a/doc/lfun/DefendFunc b/doc/lfun/DefendFunc
index 5338a9f..00bfc91 100644
--- a/doc/lfun/DefendFunc
+++ b/doc/lfun/DefendFunc
@@ -61,46 +61,43 @@
 BEISPIELE
 =========
 
-   Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke
-   entfaltet und bei Angriffen durch Geister geschwaecht wird:
+   Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke entfaltet
+   und bei Angriffen durch Geister geschwaecht wird:
 
-   protected void create() {
+   protected void create()
+   {
+     ::create();
 
-      ::create();
-
-      SetProp(P_ARMOUR_TYPE, AT_ARMOUR); SetProp(P_AC, 20); ... // Die
-      DefendFunc() ist in der Ruestung selbst definiert
-      SetProp(P_DEFEND_FUNC, this_object());
-
+     SetProp(P_ARMOUR_TYPE, AT_ARMOUR);
+     SetProp(P_AC, 20);
+     ...
+     // Die DefendFunc() ist in der Ruestung selbst definiert
+     SetProp(P_DEFEND_FUNC, this_object());
    }
 
-   public int DefendFunc(string* dtyp, mapping spell, object enemy) {
+   public int DefendFunc(string* dtyp, mapping spell, object enemy)
+   {
+     int prot;
 
-      int prot;
+     // Zuerst fragen wir den Angriff durch Feuer ab:
+     if (member(dtyp, DT_FIRE) >= 0)  // Feuer gehoert zu den Schadenstypen
+       prot = 5 + random(10); // Das ergibt maximal 14. Zusammen mit P_AC
+                              // kommt man also maximal auf 14+20 = 34,
+                              // liegt also unter der fuer AT_ARMOUR
+                              // geltenden Obergrenze
 
-      // Zuerst fragen wir den Angriff durch Feuer ab: if
-      (member(dtyp, DT_FIRE) >= 0)  // Feuer gehoert zu den
-      Schadenstypen
+     // Und jetzt der Geistertest
+     if (enemy->QueryProp(P_RACE) == "Geist" ||
+         enemy->is_class_member(CL_GHOST))
+       prot -= random(10);
 
-         prot = 5 + random(10); // Das ergibt maximal 14. Zusammen mit
-         P_AC
-            // kommt man also maximal auf 14+20 = 34, // liegt also
-            unter der fuer AT_ARMOUR // geltenden Obergrenze
-
-      // Und jetzt der Geistertest if (enemy->QueryProp(P_RACE) ==
-      "Geist" ||
-
-            enemy->is_class_member(CL_GHOST))
-
-         prot -= random(10);
-
-      // Der Rueckgabewert wird auf den aus P_AC errechneten Wert
-      draufgeschlagen return prot;
-
+     // Der Rueckgabewert wird auf den aus P_AC errechneten Wert
+     // draufgeschlagen
+     return prot;
    }
 
 
 SIEHE AUCH
 ==========
 
-   P_DEFEND_FUNC, *QueryDefendd* /std/armour/combat.c
+   P_DEFEND_FUNC, QueryDefend() /std/armour/combat.c
diff --git a/doc/lfun/QueryArmourByType b/doc/lfun/QueryArmourByType
index 20fcab5..5c9da6f 100644
--- a/doc/lfun/QueryArmourByType
+++ b/doc/lfun/QueryArmourByType
@@ -10,7 +10,7 @@
 FUNKTION
 ========
 
-   mixed QueryArmourByType(string type)
+   object|object*|mapping QueryArmourByType(string type)
 
 
 DEFINIERT IN
@@ -31,17 +31,27 @@
 
    Abfrage, ob das Lebewesen eine Ruestung des angegebenen Typs traegt.
 
-   Zurueckgegeben wird je nach Tragestatus und <type>:
-   * 0, falls das Lebewesen die gesuchte Ruestungsart nicht traegt
-   * im Erfolgsfall das Ruestungsobjekt
-   * falls <type> AT_MISC ist:
-     * ({}), wenn es keine AT_MISC-Ruestung traegt
-     * ein Array von AT_MISC-Ruestungen
-   * falls <type> 0 ist: ein Mapping, das diese Informationen mit dem
-     Ruestungstypen als Schluessel enthaelt:
-     ([AT_MISC: ({[object], ...}),
-       AT_...: <object>,
-       ... ])
+
+RUECKGABEWERTE
+==============
+
+   Zurueckgegeben wird abhaengig vom Argument <type> folgendes:
+
+   1) Ist <type> ein Typ, von dem man nur eine Ruestung tragen kann:
+      *  0, falls das Lebewesen die gesuchte Ruestungsart nicht traegt,
+      *  ansonsten das Ruestungsobjekt
+
+   2) Ist <type> AT_MISC:
+      *   ein Array mit allen AT_MISC-Ruestungen
+      *   ({}), wenn das Lebewesen keine AT_MISC-Ruestung traegt
+
+   3) Ist <type> 0:
+      * Ein Mapping mit den Ruestungstypen als Schluessel der folgenden
+      Form:
+         ([AT_MISC:  ({object misc1, ... }),
+           AT_CLOAK: object cloak,
+           AT_...:   object ...,
+           ... ])
 
 
 BEMERKUNG
diff --git a/doc/lfun/create_default_npc b/doc/lfun/create_default_npc
index 09c3a14..fac3fe2 100644
--- a/doc/lfun/create_default_npc
+++ b/doc/lfun/create_default_npc
@@ -47,7 +47,10 @@
    wurden, werden durch die neuen Werte ersetzt.
 
    Ab einem Aufruf mit Level 20 werden P_XP = 202000 gesetzt, also ein
-   Kill-Stup vergeben (siehe P_XP).
+   Kill-Stups vergeben (siehe P_XP).
+
+   P_HP und P_SP werden auf dieselben Werte wie P_MAX_HP bzw. P_MAX_SP
+   eingestellt.
 
 
 BEISPIEL
diff --git a/doc/props/P_MAGIC_RESISTANCE_OFFSET b/doc/props/P_MAGIC_RESISTANCE_OFFSET
index 8d270e3..111b94e 100644
--- a/doc/props/P_MAGIC_RESISTANCE_OFFSET
+++ b/doc/props/P_MAGIC_RESISTANCE_OFFSET
@@ -37,7 +37,7 @@
    // Goblins
    SetProp(P_MAGIC_RESISTANCE_OFFSET,
              ([MT_ANGRIFF:600,         // 6% Resistenz gegen Angriff
-               MT_ILLUSION:500,        // 6% Resistenz gegen Illusionen
+               MT_ILLUSION:500,        // 5% Resistenz gegen Illusionen
                MT_VERWANDLUNG:-300,    // 3% Empfindlichkeit
                MT_HELLSICHT:-750,      // 7.5% Empfindlichkeit
                MT_BEHERRSCHUNG:250])); // 2.5% Resistenz
diff --git a/doc/props/P_MAX_HP b/doc/props/P_MAX_HP
index fcb3cb0..6534adb 100644
--- a/doc/props/P_MAX_HP
+++ b/doc/props/P_MAX_HP
@@ -21,6 +21,13 @@
    Maximale Anzahl der Lebenspunkte.
 
 
+HINWEIS
+=======
+
+   Beim Setzen der Property wird gleichzeitig P_HP auf denselben Wert
+   gesetzt.
+
+
 SIEHE AUCH
 ==========
 
diff --git a/doc/props/P_MAX_SP b/doc/props/P_MAX_SP
index 7f7aa43..84f788c 100644
--- a/doc/props/P_MAX_SP
+++ b/doc/props/P_MAX_SP
@@ -21,6 +21,13 @@
    Maximale Anzahl der Magiepunkte.
 
 
+HINWEIS
+=======
+
+   Beim Setzen der Property wird gleichzeitig P_SP auf denselben Wert
+   gesetzt.
+
+
 SIEHE AUCH
 ==========
 
diff --git a/doc/sefun/process_string b/doc/sefun/process_string
index fbc7018..4d72259 100644
--- a/doc/sefun/process_string
+++ b/doc/sefun/process_string
@@ -8,41 +8,43 @@
 FUNKTION
 ========
 
-   string process_string(string str)
-   string process_string(closure cl)
+   string process_string(string str) string process_string(closure cl)
 
 
 BESCHREIBUNG
 ============
 
-   Durchsucht den String str nach Vorkommnissen von Substrings, die "Wert
-   durch Funktionsaufruf zu ersetzen" andeuten. Die Form ist: @@, gefolgt
-   durch einen impliziten Funktionsaufruf.
+   Beschreibung s. efun/process_string.
 
-   Der zu ersetzenden Substring hat die Form:
-   @@function[:filename][|argument1|argument2]@@
+   Abweichend zu der Beschreibung gibt es im MG folgende wichtige
+   Punkte:
 
-   Die entsprechende Funktion muss einen String zurueckgeben, oder der
-   process_string() uebergebene String str wird nicht modifiziert.
+   * nicht in neuem Code nutzen, aus altem Code ausbauen
 
-   process_string() arbeitet nicht rekursiv, object_name und argument sind
-   optionale Werte.
+   * nicht nutzbar fuer Objekte mit einer UID mit einem Level > 30.
 
-   Falls eine Closure angegeben wurde, wird diese lediglich gerufen
-   und nicht gefiltert.
+   * nicht rufbar durch Magiershells
 
+   * kann Funktionen in anderen Objekten nur rufen, wenn diese zum
+     gleichen Magier gehoeren.
 
-ANMERKUNGEN
-===========
+   Folgendes Properties und Details werden bei der Abfrage ueber
+   process_string() gefiltert:
 
-   - Die Funktion, die gerufen werden soll, _muss_ mit einem Buchstaben
-                 anfangen, '_' ist nicht moeglich!
-   - folgendes Properties und Details werden bei der Abfrage ueber
-     process_string() gefiltert:
-     P_LONG, P_SHORT, P_READ_MSG, AddReadDetail()-Details und NPC-Chats
-     P_INT_LONG ueber int_long(), P_INT_SHORT ueber int_short()
-   - die Nutzung kann zu Sicherheitsproblemen fuehren, siehe auch
-     process_call()
+   * P_LONG
+
+   * P_SHORT
+
+   * Details
+
+   * NPC-Chats
+
+   * P_INT_LONG
+
+   * P_INT_SHORT
+
+   Die Nutzung kann zu Sicherheitsproblemen fuehren, siehe auch
+   process_call().
 
 
 BEISPIEL
@@ -58,7 +60,6 @@
 
    -> bei Abfrage: "Die Beschreibung." oder "Die andere Beschreibung."
 
-
    // Teilersetzung
    SetProp(P_SHORT, "Ein @@farbenfun|huebsch@@ Ding");
    ...
@@ -72,6 +73,6 @@
 SIEHE AUCH
 ==========
 
-   notify_fail(E), process_call(E), replace_personal(E)
+   process_call(), replace_personal()
 
-22. Nov. 2006 Arathorn
+02.09.2020 Zesstra
diff --git a/doc/sefun/replace_personal b/doc/sefun/replace_personal
index 3804be3..a8946e5 100644
--- a/doc/sefun/replace_personal
+++ b/doc/sefun/replace_personal
@@ -47,8 +47,6 @@
 
    x steht fuer die Position des Objekts/Strings in *obs, beginnend bei 1.
 
-
-
    Besonderheiten beim Possessivpronomen (@WERQPPGNx):
    G muss durch das Geschlecht (M, F oder N) und N durch den Numerus (S
    oder P) ersetzt werden.
@@ -62,47 +60,45 @@
 
    durchersetzter String
 
+
 Beispiele
+=========
 
-   replace_personal("@WER1", ({find_player("gloinson")})) ==
-   "Gloinson"
+   replace_personal("@WER1", ({find_player("gloinson")})) ==> "Gloinson"
 
-   replace_personal("@WEMQP1", ({find_player("gloinson")})) == "ihm"
+   replace_personal("@WEMQP1", ({find_player("gloinson")})) ==> "ihm"
 
-   // unbestimmter und bestimmter Artikel: replace_personal("@WER1
-   zueckt @WENU2 und verhaut @WEN3.",
+   // unbestimmter und bestimmter Artikel:
+   replace_personal("@WER1 zueckt @WENU2 und verhaut @WEN3.",
+                    ({find_player("gloinson"),
+                      find_object("/obj/mpa"),
+                      find_object("/obj/wanderer")}))
+   ==> "Gloinson zueckt eine Zeitung und verhaut den Wanderer."
 
-      ({find_player("gloinson"),
-         find_object("/obj/mpa"), find_object("/obj/wanderer")}))
-
-   == "Gloinson zueckt eine Zeitung und verhaut den Wanderer."
-
-   // Beim Possessivpronomen beziehen sich WEN, F und P (Akkusativ, //
-   Femininum, Plural) auf die Taschen, nicht auf Kessa:
+   // Beim Possessivpronomen beziehen sich WEN, F und P (Akkusativ,
+   // Femininum, Plural) auf die Taschen, nicht auf Kessa:
    replace_personal("@WER1 steckt @WESSEN2 Turnschuhe in @WENQPPFP1 "
+                    "Taschen.",
+                    ({find_player("kessa"),
+                      find_player("gloinson")}))
+   ==> "Kessa steckt Gloinsons Turnschuhe in ihre Taschen."
 
-      "Taschen.", ({find_player("kessa"),
-
-         find_player("gloinson")}))
-
-   == "Kessa steckt Gloinsons Turnschuhe in ihre Taschen."
-
-   // Ein Beispiel mit laengerem >>*<<obs: replace_personal("@WER1
-   zieht @WENQPPMP1 neuen Turnschuhe an. @WER2 ist "
-
-      "so beeindruckt, dass @WERQP2 @WEMQP1 @WENU3 auf die " "@WEN4
-      haut und die Schuhe in @WEMQPPFS2 Tasche " "verschwinden laesst.
-      @WERU5 schaut zu und kichert " "irre. Wenn das @WER6 gesehen
-      haette!", ({find_player("gloinson"),
-
-         find_player("kessa"), find_object("/obj/mpa"), "Birne",
-         find_object("/obj/wanderer"), find_netdead("jof")}),1)
-
-   == "Gloinson zieht seine neuen Turnschuhe an. Kessa ist so
-   beeindruckt, "
-      "dass sie ihm eine Zeitung auf die Birne haut und die Schuhe in
-      ihrer " "Tasche verschwinden laesst. Ein Wanderer schaut zu und
-      kichert " "irre. Wenn das Jof gesehen haette!"
+   // Ein Beispiel mit laengerem *obs:
+   replace_personal("@WER1 zieht @WENQPPMP1 neuen Turnschuhe an. @WER2 ist "
+                    "so beeindruckt, dass @WERQP2 @WEMQP1 @WENU3 auf die "
+                    "@WEN4 haut und die Schuhe in @WEMQPPFS2 Tasche "
+                    "verschwinden laesst. @WERU5 schaut zu und kichert "
+                    "irre. Wenn das @WER6 gesehen haette!",
+                    ({find_player("gloinson"),
+                      find_player("kessa"),
+                      find_object("/obj/mpa"),
+                      "Birne",
+                      find_object("/obj/wanderer"),
+                      find_netdead("jof")}),1)
+   ==> "Gloinson zieht seine neuen Turnschuhe an. Kessa ist so "
+       "beeindruckt, dass sie ihm eine Zeitung auf die Birne haut und die "
+       "Schuhe in ihrer Tasche verschwinden laesst. Ein Wanderer schaut "
+       "zu und kichert irre. Wenn das Jof gesehen haette!"
 
 
 SIEHE AUCH
diff --git a/doc/sefun/send_debug b/doc/sefun/send_debug
new file mode 100644
index 0000000..f47b748
--- /dev/null
+++ b/doc/sefun/send_debug
@@ -0,0 +1,45 @@
+
+send_debug()
+************
+
+
+FUNKTION
+========
+
+   varargs void send_debug(object|string wiz, string msg, string
+   msg_prefix)
+
+
+BESCHREIBUNG
+============
+
+   Sendet <msg> via ReceiveMsg() an das Spielerobjekt <wiz> (wenn es
+   als string angegeben wird, wird es per find_player gesucht).
+   Hierbei wird mit dem Nachrichtentyp MT_DEBUG gesendet, d.h. die
+   Meldung wird nur angezeigt, wenn das Spielerobjekt Magier oder
+   Testspieler mit aktiviertem P_WIZ_DEBUG ist.
+
+   Magier koennen P_WIZ_DEBUG mit dem Kommando 'mschau' umschalten,
+   Testspieler benoetigen hierfuer einen Magier.
+
+   Diese Debugmeldungen koennten sehr praktisch sein, aber man sollte
+   es in produktivem Code auch nicht uebertreiben, auch wenn keine
+   Ausgabe an Spieler erfolgt, wird die Zustellung jedoch bei jedem
+   Aufruf zumindest geprueft.
+
+
+BEISPIEL
+========
+
+      send_debug("zesstra", "Verbrauchte evalcosts: 42");
+
+      send_debug(this_player(), "Verbrauchte evalcost: 42",
+                 "Unit-Debug: ");
+
+
+SIEHE AUCH
+==========
+
+   ReceiveMsg()
+
+14.10.2020, Zesstra
diff --git a/doc/sphinx/lfun/AddInfo.rst b/doc/sphinx/lfun/AddInfo.rst
index 5db8bef..8b5914a 100644
--- a/doc/sphinx/lfun/AddInfo.rst
+++ b/doc/sphinx/lfun/AddInfo.rst
@@ -3,9 +3,10 @@
 
 FUNKTION
 --------
+:: 
 
-     varargs void AddInfo( frage, meldung
-               [, indent [, [silent [, casebased] ] ] );
+  public varargs void AddInfo(string|string* key, string|closure info,
+                 string indent, int|string silent, string|closure casebased);
 
 DEFINIERT IN
 ------------
@@ -15,18 +16,23 @@
 ARGUMENTE
 ---------
 
-     string/string* frage
-       Schluesseltext(e) auf die Informationen gegeben werden sollen.
-     string/closure meldung
+     string|string* frage
+       Schluesselwoerter, fuer die der NPC eine Antwort geben soll, wenn
+       man ihn danach fragt
+
+     string|closure meldung
        Information, die gegeben werden soll; wenn 'meldung' eine Closure 
        ist, wird der gerufenen Funktion nichts uebergeben.
-     string indent
+
+     string indent    (optional)
        Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
-     int/string silent
+
+     int|string silent    (optional)
        Ist silent gesetzt, so erfolgt Antwort nur an Fragenden. 
-     string/closure casebased
+
+     string|closure casebased   (optional)
        Closure mit Returnwert string oder int.
-       Bekommt nichts uebergeben.
+       Der Funktion werden keine Argumente uebergeben.
 
 BESCHREIBUNG
 ------------
@@ -69,7 +75,7 @@
 
      Die Strings von 'silent' und 'meldung' werden geparsed.
      Dabei koennen die @[...]-Tags von replace_personal() verwendet werden,
-     Objekt 1 ist this_player(). Ersetzte String am Satzanfang werden
+     Objekt 1 ist this_player(). Ersetzte Strings am Satzanfang werden
      automatisch gross geschrieben.
      AddInfo() konvertiert die alten Schluesselworte @WER, @WESSEN, @WEM,
      @WEN zu denen von replace_personal(), jedoch nicht in den Rueckgabe-
@@ -259,4 +265,4 @@
      Interna:
        :doc:`GetInfoArr` , :doc:`do_frage`
 
-7. Mar 2017 Gloinson
+24.09.2020, Arathorn
diff --git a/doc/sphinx/lfun/AddMoney.rst b/doc/sphinx/lfun/AddMoney.rst
index 416bdee..0868e51 100644
--- a/doc/sphinx/lfun/AddMoney.rst
+++ b/doc/sphinx/lfun/AddMoney.rst
@@ -65,10 +65,10 @@
 
 .. code-block:: pike
 
-     #include <zentralbank.h>
+     #include <bank.h>
      
      // gib ihm Geld
-     int money = ZENTRALBANK->Withdraw(50);
+     int money = ZENTRALBANK->WithDraw(50);
      this_player()->AddMoney(money);
 
      // nimm ihm Geld
@@ -80,12 +80,14 @@
 
 SIEHE AUCH
 ----------
+::
 
-     Geldhandling:	QueryMoney(L)
-     Zentralbank:	PayIn(L), WithDraw(L)
-     Sonstiges:		move(L),
-     /items/money.c, /sys/moving.h, /sys/money.h, /sys/bank.h
-     /std/container/moneyhandler.c
+     Geldhandling:  QueryMoney(L)
+     Zentralbank:   PayIn(L), WithDraw(L)
+     Sonstiges:     move(L),
+     /items/money.c
+     /sys/moving.h, /std/container/moneyhandler.c
+     /sys/money.h, /sys/bank.h 
 
 18.02.2013, Zesstra
 
diff --git a/doc/sphinx/lfun/AddRoomMessage.rst b/doc/sphinx/lfun/AddRoomMessage.rst
index 527ea54..ce325ff 100644
--- a/doc/sphinx/lfun/AddRoomMessage.rst
+++ b/doc/sphinx/lfun/AddRoomMessage.rst
@@ -53,7 +53,7 @@
 
        * passiert automatisch nur, wenn alle Spieler den Raum verlassen haben
        * ist manuell nur ueber Loeschen der Nachrichten umsetzbar, also mit
-         ``AddRoomMessage((string)0, 0, (string)0);``
+         ``AddRoomMessage(0, 0, 0);``
 
      In Funktionen, die durch AddRoomMessage() ausgeloest werden, darf
      this_player() nicht verwendet werden, da die call_out()-Kette den
@@ -122,7 +122,7 @@
      }
 
      public int action_laerm(string str) {
-       AddRoomMessage((string)0, 0, (string)0);
+       AddRoomMessage(0, 0, 0);
 
        this_player()->ReceiveMsg(
          "Du schreist dir kurz die Seele aus dem Leib. Alle Tiere "
diff --git a/doc/sphinx/lfun/AddSpecialInfo.rst b/doc/sphinx/lfun/AddSpecialInfo.rst
index 558b2d2..fd67141 100644
--- a/doc/sphinx/lfun/AddSpecialInfo.rst
+++ b/doc/sphinx/lfun/AddSpecialInfo.rst
@@ -5,23 +5,32 @@
 --------
 ::
 
-     varargs void AddSpecialInfo( frage, meldung
-			   [, indent [, [silent [, casebased] ] ] );
+  public varargs void AddSpecialInfo(string|string* keys, string functionname,
+                 string indent, int|string silent, string|closure  casebased);
+
 
 ARGUMENTE
 ---------
 ::
 
-     string/string* frage
-	Schluesseltext(e) auf die Informationen gegeben werden sollen.
-     string/closure function
-	Methodenname im NPC/Closure
-     string indent
-	Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
-     int/string silent
-	Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
-     string/closure casebased
-	Funktionsname oder Closure mit Returnwert string oder int.
+     string|string* frage
+       Schluesselwoerter, fuer die der NPC eine Antwort geben soll, wenn
+       man ihn danach fragt
+
+     string functionname
+       Name der Funktion, die gerufen werden soll, um den Informationstext
+       des NPCs zu ermitteln. Der gerufenen Funktion werden keine Argumente
+       uebergeben.
+
+     string indent    (optional)
+       Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
+
+     int|string silent    (optional)
+       Ist silent gesetzt, so erfolgt Antwort nur an Fragenden. 
+
+     string|closure casebased   (optional)
+       Closure mit Returnwert string oder int.
+       Der Funktion werden keine Argumente uebergeben.
 
 DEFINIERT IN
 ------------
@@ -80,9 +89,17 @@
 
 SIEHE AUCH
 ----------
-::
 
-     AddInfo(L), RemoveInfo(L)
+     Verwandt:
+       :doc:`AddInfo`, :doc:`RemoveInfo`
+     Props:
+       :doc:`../props/P_PRE_INFO`
+     Files:
+       /std/npc/info.c
+     Loggen:
+       :doc:`../props/P_LOG_INFO`
+     Interna:
+       :doc:`GetInfoArr` , :doc:`do_frage`
 
-7.Apr 2004 Gloinson
+24.09.2020, Arathorn
 
diff --git a/doc/sphinx/lfun/Attack.rst b/doc/sphinx/lfun/Attack.rst
index 9281478..c6357d4 100644
--- a/doc/sphinx/lfun/Attack.rst
+++ b/doc/sphinx/lfun/Attack.rst
@@ -17,8 +17,8 @@
 ------------
 ::
 
-	Der Feind wird der Staerke der Waffe (bzw. der Haende) entsprechend
-	stark angegriffen.
+  Der Feind wird entsprechend der Angriffsstaerke der Waffe (P_WC) bzw. der 
+  Haende (P_HANDS[1]) angegriffen.
 
 RUECKGABEWERT
 -------------
@@ -32,11 +32,10 @@
 
 	Diese Funktion gibt die Angriffsmeldung aus.
 	Falls mit blossen Haenden angegriffen wird, ist die Staerke
-	(2*Staerke_der_Haende + 10*A_STR)/3
+	(2 * P_HANDS[1] + 10 * A_STR)/3
 
 SIEHE AUCH
 ----------
 ::
 
-	"Defend", "QueryDamage"
-
+	Defend(), QueryDamage()
diff --git a/doc/sphinx/lfun/CheckResistance.rst b/doc/sphinx/lfun/CheckResistance.rst
index 7254068..b3a83da 100644
--- a/doc/sphinx/lfun/CheckResistance.rst
+++ b/doc/sphinx/lfun/CheckResistance.rst
@@ -5,7 +5,7 @@
 --------
 ::
 
-	CheckRessistance(string* dam_type_list)
+	public float CheckResistance(string* dam_type_list)
 
 ARGUMENTE
 ---------
@@ -33,5 +33,5 @@
 ----------
 ::
 
-	"Defend"
+	Defend(), P_RESISTANCE_STRENGTHS
 
diff --git a/doc/sphinx/lfun/DefendFunc.rst b/doc/sphinx/lfun/DefendFunc.rst
index 6b86f13..e0a9c78 100644
--- a/doc/sphinx/lfun/DefendFunc.rst
+++ b/doc/sphinx/lfun/DefendFunc.rst
@@ -50,6 +50,7 @@
 
 BEISPIELE
 ---------
+:: 
 
      Eine Ruestung, die bei Angriffen mit Feuer ihre volle Staerke entfaltet
      und bei Angriffen durch Geister geschwaecht wird:
@@ -81,12 +82,13 @@
            enemy->is_class_member(CL_GHOST))
          prot -= random(10);
 
-       // Der Rueckgabewert wird auf den aus P_AC errechneten Wert draufgeschlagen
+       // Der Rueckgabewert wird auf den aus P_AC errechneten Wert 
+       // draufgeschlagen
        return prot;
      }
 
 SIEHE AUCH
 ----------
 
-     :doc:`../props/P_DEFEND_FUNC`, :doc:`QueryDefendd`
+     :doc:`../props/P_DEFEND_FUNC`, :doc:`QueryDefend`
      /std/armour/combat.c
diff --git a/doc/sphinx/lfun/QueryArmourByType.rst b/doc/sphinx/lfun/QueryArmourByType.rst
index 17e6967..c3a126d 100644
--- a/doc/sphinx/lfun/QueryArmourByType.rst
+++ b/doc/sphinx/lfun/QueryArmourByType.rst
@@ -9,7 +9,7 @@
 --------
 ::
 
-     mixed QueryArmourByType(string type)
+     object|object*|mapping QueryArmourByType(string type)
 
 DEFINIERT IN
 ------------
@@ -30,17 +30,28 @@
 
      Abfrage, ob das Lebewesen eine Ruestung des angegebenen Typs traegt.
 
-     Zurueckgegeben wird je nach Tragestatus und <type>:
-     * 0, falls das Lebewesen die gesuchte Ruestungsart nicht traegt
-     * im Erfolgsfall das Ruestungsobjekt
-     * falls <type> AT_MISC ist:
-       * ({}), wenn es keine AT_MISC-Ruestung traegt
-       * ein Array von AT_MISC-Ruestungen
-     * falls <type> 0 ist: ein Mapping, das diese Informationen mit dem
-       Ruestungstypen als Schluessel enthaelt:
-       ([AT_MISC: ({[object], ...}),
-         AT_...: <object>,
-         ... ])
+
+RUECKGABEWERTE
+--------------
+::
+    
+    Zurueckgegeben wird abhaengig vom Argument <type> folgendes:
+
+    1) Ist <type> ein Typ, von dem man nur eine Ruestung tragen kann:
+       *  0, falls das Lebewesen die gesuchte Ruestungsart nicht traegt,
+       *  ansonsten das Ruestungsobjekt
+
+    2) Ist <type> AT_MISC:
+       *   ein Array mit allen AT_MISC-Ruestungen
+       *   ({}), wenn das Lebewesen keine AT_MISC-Ruestung traegt
+
+    3) Ist <type> 0:
+       * Ein Mapping mit den Ruestungstypen als Schluessel der folgenden 
+       Form:
+          ([AT_MISC:  ({object misc1, ... }),
+            AT_CLOAK: object cloak,
+            AT_...:   object ...,
+            ... ])
 
 BEMERKUNG
 ---------
diff --git a/doc/sphinx/lfun/create_default_npc.rst b/doc/sphinx/lfun/create_default_npc.rst
index 8507388..999fee2 100644
--- a/doc/sphinx/lfun/create_default_npc.rst
+++ b/doc/sphinx/lfun/create_default_npc.rst
@@ -46,7 +46,10 @@
      wurden, werden durch die neuen Werte ersetzt.
 
      Ab einem Aufruf mit Level 20 werden P_XP = 202000 gesetzt, also ein
-     Kill-Stup vergeben (siehe P_XP).
+     Kill-Stups vergeben (siehe P_XP).
+
+     P_HP und P_SP werden auf dieselben Werte wie P_MAX_HP bzw. P_MAX_SP 
+     eingestellt.
 
 BEISPIEL
 --------
diff --git a/doc/sphinx/props/P_MAGIC_RESISTANCE_OFFSET.rst b/doc/sphinx/props/P_MAGIC_RESISTANCE_OFFSET.rst
index a1be37e..d87ec69 100644
--- a/doc/sphinx/props/P_MAGIC_RESISTANCE_OFFSET.rst
+++ b/doc/sphinx/props/P_MAGIC_RESISTANCE_OFFSET.rst
@@ -36,7 +36,7 @@
      // Goblins
      SetProp(P_MAGIC_RESISTANCE_OFFSET,
                ([MT_ANGRIFF:600,         // 6% Resistenz gegen Angriff
-	         MT_ILLUSION:500,        // 6% Resistenz gegen Illusionen
+	         MT_ILLUSION:500,        // 5% Resistenz gegen Illusionen
                  MT_VERWANDLUNG:-300,    // 3% Empfindlichkeit
 		 MT_HELLSICHT:-750,      // 7.5% Empfindlichkeit
 		 MT_BEHERRSCHUNG:250])); // 2.5% Resistenz
diff --git a/doc/sphinx/props/P_MAX_HP.rst b/doc/sphinx/props/P_MAX_HP.rst
index 3e23b46..ce7049f 100644
--- a/doc/sphinx/props/P_MAX_HP.rst
+++ b/doc/sphinx/props/P_MAX_HP.rst
@@ -19,6 +19,13 @@
 
      Maximale Anzahl der Lebenspunkte.
 
+HINWEIS
+-------
+:: 
+
+     Beim Setzen der Property wird gleichzeitig P_HP auf denselben Wert 
+     gesetzt.
+
 SIEHE AUCH
 ----------
 ::
diff --git a/doc/sphinx/props/P_MAX_SP.rst b/doc/sphinx/props/P_MAX_SP.rst
index 2269cd2..57ef762 100644
--- a/doc/sphinx/props/P_MAX_SP.rst
+++ b/doc/sphinx/props/P_MAX_SP.rst
@@ -19,6 +19,13 @@
 
      Maximale Anzahl der Magiepunkte.
 
+HINWEIS
+-------
+:: 
+
+      Beim Setzen der Property wird gleichzeitig P_SP auf denselben Wert
+      gesetzt.
+
 SIEHE AUCH
 ----------
 ::
diff --git a/doc/sphinx/sefun/replace_personal.rst b/doc/sphinx/sefun/replace_personal.rst
index ff7c07f..e799ddb 100644
--- a/doc/sphinx/sefun/replace_personal.rst
+++ b/doc/sphinx/sefun/replace_personal.rst
@@ -46,8 +46,6 @@
 
      x steht fuer die Position des Objekts/Strings in *obs, beginnend bei 1.
 
-     
-
      Besonderheiten beim Possessivpronomen (@WERQPPGNx):
      G muss durch das Geschlecht (M, F oder N) und N durch den Numerus (S 
      oder P) ersetzt werden. 
@@ -66,27 +64,19 @@
      
 
 Beispiele
-
-     replace_personal("@WER1", ({find_player("gloinson")}))
-     == "Gloinson"
------------------------------------------------------------------------------------------
+---------
 ::
 
+     replace_personal("@WER1", ({find_player("gloinson")})) ==> "Gloinson"
      
-
-     replace_personal("@WEMQP1", ({find_player("gloinson")}))
-     == "ihm"     
-
-     
+     replace_personal("@WEMQP1", ({find_player("gloinson")})) ==> "ihm"     
 
      // unbestimmter und bestimmter Artikel:
      replace_personal("@WER1 zueckt @WENU2 und verhaut @WEN3.", 
                       ({find_player("gloinson"),
                         find_object("/obj/mpa"), 
                         find_object("/obj/wanderer")}))
-     == "Gloinson zueckt eine Zeitung und verhaut den Wanderer."
-
-     
+     ==> "Gloinson zueckt eine Zeitung und verhaut den Wanderer."
 
      // Beim Possessivpronomen beziehen sich WEN, F und P (Akkusativ,
      // Femininum, Plural) auf die Taschen, nicht auf Kessa:
@@ -94,7 +84,7 @@
                       "Taschen.", 
                       ({find_player("kessa"), 
                         find_player("gloinson")}))
-     == "Kessa steckt Gloinsons Turnschuhe in ihre Taschen."
+     ==> "Kessa steckt Gloinsons Turnschuhe in ihre Taschen."
 
      // Ein Beispiel mit laengerem *obs:
      replace_personal("@WER1 zieht @WENQPPMP1 neuen Turnschuhe an. @WER2 ist "
@@ -108,10 +98,10 @@
                         "Birne",
                         find_object("/obj/wanderer"),
                         find_netdead("jof")}),1)
-     == "Gloinson zieht seine neuen Turnschuhe an. Kessa ist so beeindruckt, "
-        "dass sie ihm eine Zeitung auf die Birne haut und die Schuhe in ihrer "
-        "Tasche verschwinden laesst. Ein Wanderer schaut zu und kichert "
-        "irre. Wenn das Jof gesehen haette!"
+     ==> "Gloinson zieht seine neuen Turnschuhe an. Kessa ist so "
+         "beeindruckt, dass sie ihm eine Zeitung auf die Birne haut und die "
+         "Schuhe in ihrer Tasche verschwinden laesst. Ein Wanderer schaut "
+         "zu und kichert irre. Wenn das Jof gesehen haette!"
 
 SIEHE AUCH
 ----------
diff --git a/doc/sphinx/sefun/set_light.rst b/doc/sphinx/sefun/set_light.rst
deleted file mode 100644
index 99d5bee..0000000
--- a/doc/sphinx/sefun/set_light.rst
+++ /dev/null
@@ -1,32 +0,0 @@
-set_light()
-===========
-
-SYNOPSIS
---------
-::
-
-        int set_light(int n)
-
-DESCRIPTION
------------
-::
-
-        An object is by default dark. It can be set to not dark by
-        calling set_light(1). The environment will then also get this
-        light. The returned value is the total number of lights in
-        this room. So if you call set_light(0) it will return the
-        light level of the current object.
-
-        
-
-        Note that the value of the argument is added to the light of
-        the current object.
-
-BUGS
-----
-::
-
-	This handling of light by the parser is inappropriate for most
-	purposes: If you put a burning candle into a safe, the safe
-	will start to emit light.
-
diff --git a/doc/wiz/regionsleitfaden b/doc/wiz/regionsleitfaden
index 70e491a..45e85f5 100644
--- a/doc/wiz/regionsleitfaden
+++ b/doc/wiz/regionsleitfaden
@@ -44,7 +44,9 @@
    Dateien aus den Verzeichnissen.
 
 o  Speicherung von Daten in secure-Verzeichnissen soll bitte nur sehr
-   sparsam erfolgen und nur in Abstimmung mit dem RM.
+   sparsam erfolgen und nur in Abstimmung mit dem RM. Denkt dabei daran,
+   dass Secure-Verzeichnisse im Zusammenspiel mit Git/Gerrit zusaetzliche
+   Probleme aufwerfen.
 
 o  save_object() bitte sehr sparsam verwenden (nicht bei jeder Daten-
    aenderung, bei Bedarf in reset/remove).
diff --git a/doc/wiz/rm-howto b/doc/wiz/rm-howto
index 63c9a84..a722c8c 100644
--- a/doc/wiz/rm-howto
+++ b/doc/wiz/rm-howto
@@ -4,10 +4,11 @@
 Vorlaeufiges Inhaltsverzeichnis:
 
 1) Allgemeines
+   - Konzepte fuer neue Gebiete
    - Fehlerteufel
-   - Logtool
    - Kommentierung von Aenderungen
    - eigene Anschluesse
+   - "Datenhygiene" im Regionsverzeichnis
 2) Abnahme von Code/Gebieten
    - Balance/Genehmigungen
    - Konzeptionelle Eignung
@@ -32,67 +33,116 @@
 1) Allgemeines
 ==============
 
-o Um stets einen Ueberblick ueber die in Deiner Region (hoffentlich selten)
-  auftretenden Bugs und Warnungen zu behalten, solltest Du einen
-  Fehlerteufel (/obj/tools/fehlerteufel.c) besitzen, bedienen koennen und
-  regelmaessig dessen Listen durchsehen. Deinen Regionsmitarbeitern solltest
-  Du, allein schon, um zusaetzliche Arbeit fuer Dich selbst zu reduzieren,
-  dieses Werkzeug ebenfalls an die Hand geben und sie auffordern, ihren
-  Kram moeglichst umfassend selbst zu reparieren.
-  Neuen Magiern wird dieses Tool uebrigens automatisch von Merlin in die
-  Hand gedrueckt, so dass sie sich vom ersten Tag an daran gewoehnen koennen.
+1a) Konzepte und Dokumentation
 
-o Es ist empfehlenswert, das Logtool zu besitzen (/obj/tools/logtool.c) und
-  in diesem fuer jedes Repfile eines Regionsmitarbeiters einen Eintrag vor-
-  zusehen. Warum das? Es ist bereits vorgekommen, dass Spieler ernsthaft
-  argumentiert haben, sie duerften einen von ihnen entdeckten Bug ausnutzen,
-  weil sie ihn ja gemeldet haetten (im Repfile!), er aber nicht repariert
-  worden sei (was nicht verwundert, da er im Repfile in der Mehrzahl der
-  Faelle weit unterhalb des Wahrnehmungshorizonts der allermeisten
-  Regionsmagier schwebt).
+  o Die Erfahrung zeigt, dass es aus verschiedenen Gruenden wirklich dringend
+    zu empfehlen ist, sich fuer neue Gebiete ein Konzept vorlegen zu lassen,
+    dieses gruendlich zu pruefen und zu durchdenken und mit dem betreffenden
+    Regionsmitarbeiter zu diskutieren. Weiterhin empfiehlt es sich ebenfalls,
+    eine ueber das Konzept erzielte Einigung im Verzeichnis "doc" Deiner
+    Region zu dokumentieren. Hierdurch erreichst Du mehrere Dinge:
+    - Du vermeidest Ueberraschungen ("Hier ist mein neues Gebiet zur Abnahme,
+      sind nur 120 Raeume. Oh, hoppla, hab ich Dir nicht Bescheid gesagt?");
+      auch fuer Deine etwaigen Nachfolger.
+    - Du vermeidest bei absehbaren technischen Schwierigkeiten Frustration
+      beim Deinem Regionsmitarbeiter.
+    - Du erhoehst die Wahrscheinlichkeit, dass das Gebiet tatsaechlich
+      fertiggestellt wird.
+    - Jeder kann weitgehend verbindlich nachlesen, was Du genehmigt hast.
+    - Es ist klar ersichtlich, welche Konzepte bekanntermassen schon in Arbeit
+      sind, so dass inhaltliche Aehnlichkeiten im Vorfeld vermieden werden
+      koennen.
+    
+    Du solltest den betreffenden Regionsmitarbeiter auch darauf hinweisen,
+    dass er Dich informieren moege, wenn er eine groessere konzeptionelle
+    Umstellung des neuen Gebietes durchfuehren will.
 
-o Wenn Du in fremdem Code Aenderungen vornehmen musst, die mehr beruehren
-  als nur ein paar Tippfehler in Details oder Infos, dann kommentiere den
-  defekten Code aus und fuege den reparierten mit Kommentar ein. Es reicht
-  an dieser Stelle aus, Deinen Namen und das Datum zu vermerken. In den
-  Header der Datei solltest Du unbedingt ein Changelog einfuegen, in dem
-  das Datum der Aenderung, der Name des Ausfuehrenden (Deiner) sowie die
-  vorgenommene Aenderung mit Begruendung bzw. u.U. Bug-ID aus dem Fehler-
-  teufel einzutragen ist. Wir haben im MG leider keinen wirkungsvollen
-  Debugger und Bugtracker-Mechanismus, so dass wir zur Erhaltung einer
-  gewissen Code-Hygiene Bugfixes mit Hilfe solcher Eintragungen dokumentieren
-  und rueckverfolgen muessen. Insbesondere ist ein solcher Eintrag wichtig,
-  um im Falle von Folge-Bugs die Ursache schneller zu finden.
+    Welche Kriterien man als RM ansetzt, um ein Gebiet als regionstauglich
+    zu bewerten, liegt in der Entscheidung des RM.
 
-o Willst Du in Deiner eigenen Region ein Gebiet anschliessen, solltest Du
-  diesen vor Anschluss entweder vom Co-RM oder von einem RM einer anderen
-  Region lesen lassen. Auch wenn Du ein guter Programmierer bist, findet ein
-  zweites Paar Augen oft Dinge, an die man nicht gedacht hat.
+  o Wenn ein Konzept fuer ein Gesellenstueck eingereicht wird, und es handelt
+    sich um eine Gemeinschaftsarbeit mehrerer Magier (Kooperation mehrerer
+    Lehrlinge oder Lehrling(e) + erfahrene Magier), UEBERLEGT EUCH GUT, OB
+    IHR DAS ZULASSEN WOLLT! Erfahrungsgemaess laesst sich schwer beurteilen,
+    welcher Teil des Codes von wem ist. Wenn es zugelassen wird, sollten mit
+    den betreffenden Lehrlingen klare Vereinbarungen insbesondere ueber die
+    Trennung des Codes nach Autor getroffen werden.
 
+1b) Fehlerteufel / Abarbeitung von Bugs
+
+  o Um stets einen Ueberblick ueber die in Deiner Region (hoffentlich selten)
+    auftretenden Bugs und Warnungen zu behalten, solltest Du einen
+    Fehlerteufel (/obj/tools/fehlerteufel.c) besitzen, bedienen koennen und
+    regelmaessig dessen Listen durchsehen. Deinen Regionsmitarbeitern solltest
+    Du, allein schon, um zusaetzliche Arbeit fuer Dich selbst zu reduzieren,
+    dieses Werkzeug ebenfalls an die Hand geben und sie auffordern, ihren
+    Kram moeglichst umfassend selbst zu reparieren.
+    Neuen Magiern wird dieses Tool uebrigens automatisch von Merlin in die
+    Hand gedrueckt, so dass sie sich vom ersten Tag an daran gewoehnen 
+    koennen.
+
+  o Wenn Du in fremdem Code Aenderungen vornehmen musst, die mehr beruehren
+    als nur ein paar Tippfehler in Details oder Infos, dann fuege den 
+    reparierten Code mit Kommentar ein. Wenn in Deiner Region git/gerrit zur
+    Codeverwaltung verwendet werden, schreibe eine aussagekraeftige Commit-
+    Message, bei Bedarf ergaenzt durch einen Kommentar im Code.
+
+1c) Anschluss eigener Gebiete in der eigenen Region
+
+  o Willst Du in Deiner eigenen Region ein Gebiet anschliessen, solltest Du
+    diesen vor Anschluss entweder vom Co-RM oder von einem RM einer anderen
+    Region lesen lassen. Auch wenn Du ein guter Programmierer bist, findet ein
+    zweites Paar Augen oft Dinge, an die man nicht gedacht hat.
+
+1d) "Hygiene" in den Regionsverzeichnissen
+
+  o Wenn Du nicht angeschlossene Objekte aus Deiner Region aussortieren
+    moechtest, ist sprich am besten einen EM an, der Dir dabei hilft:
+    Einerseits kann man auf der Shell bequemer herausfinden, ob ein Objekt
+    tatsaechlich nicht verwendet wird. Andererseits soll der ungenutzte
+    Code in das /players-Verzeichnis des Autors verschoben werden, was
+    haeufig ebenfalls EM-Rechte benoetigt.
+
+  o Es wird dringend empfohlen, neuen Regionscode nur noch in /players zu
+    entwickeln.
+
+  o Als Regionsmagier hast Du aufgrund eines EM-Beschlusses die Moeglichkeit,
+    fuer Deine jeweilige(n) Region(en) verbindlich festzulegen, ob es erlaubt
+    ist, die Entwicklung neuer Gebiete im Regionsverzeichnis durchzufuehren.
+    
 
 2) Code wird zur Abnahme vorgelegt
 ==================================
 
-o Bei Waffen und Ruestungen unbedingt auf Einhaltung der Balance-Vorgaben
-  achten.
+o Bei Waffen und Ruestungen unbedingt darauf achten, dass Objekte, die die
+  Genehmigungsgrenzen ueberschreiten, bei der Balance zur Genehmigung 
+  vorgestellt wurden. Fuer alle Objekte mit Balance-relevanten Eigenschaften
+  bitte penibel darauf achten, dass die Balance-Vorgaben eingehalten werden.
+  Jeder Magier kann sich ein Balance-Tool "light" clonen, mit dem er den Text
+  der Genehmigung selbst anschauen kann, um den vorgelegten Code damit zu
+  vergleichen. Nicht genehmigte oder in der Funktion abweichende Objekte
+  duerfen nicht angeschlossen werden. (Bei schon sehr lange angeschlossenen
+  Objekten, deren Abweichung von der Genehmigung erst sehr spaet auffaellt,
+  kann man ggf. auf das temporaere Abhaengen verzichten.)
 
 o Sofern ein Objekt eine Balance-Genehmigung besitzt, muss die BTOP-Nummer,
   die die Balance als eindeutige ID fuer jeden Antrag vergibt, im Header
-  des betreffenden Objektes erkennbar eingetragen sein.
+  des betreffenden Objektes erkennbar eingetragen sein. Bevorzugt traegt
+  man auch die genehmigten Eigenschaften ein.
 
-o Vor Anschluss sollte man Ruecksprache mit verschiedenen Instanzen halten,
-  um sicherzustellen, dass der Magier alle wesentlichen Punkte
-  beruecksichtigt hat:
-  - liegen alle Balance-Genehmigungen vor?
-  - sind die FP eingetragen?
-  - sind die ZTs eingetragen und getestet?
-  - sind Sonder-EK-Stupse genehmigt und eingetragen?
-
-o Fuer neue Gebiete ist eine grundsaetzliche Pruefung des Konzepts auf
-  Regionstauglichkeit sinnvoll, damit nicht alteingesessene Institutionen
-  oder Orte ploetzlich zur zweiten Wahl abgewertet werden - beispielsweise
-  einen grossen, neuen Hauptort in der Ebene anzuschliessen, der Port Vain
-  voraussehbar den Rang ablaufen wuerde.
+o Vor Anschluss sollte man kontrollieren, dass der Magier alle wesentlichen 
+  Punkte beruecksichtigt hat:
+  - Liegen alle Balance-Genehmigungen vor? 
+    BTool light gibt's fuer alle, damit kann jeder fuer Objekte in seinem
+    Zustaendigkeitsbereich die Genehmigungen einsehen.
+  - Sind die FP eingetragen?
+    FP kann der RM fuer das neue Gebiet selbst abfragen. 
+  - Sind die ZTs eingetragen und getestet?
+    Dies laesst sich mit dem Magierkommando "traenke" herausfinden.
+  - Falls Sonder-EK-Stupse vorgesehen sind: sind diese genehmigt?
+    Die Eintragung bzw. Anpassung der Stufenpunkte fuer den Kill wird
+    erledigt, sobald der NPC das erste Mal getoetet wurde, dies muss also nicht
+    ueberprueft werden.
 
 o Alle NPCs sollten vor Anschluss einmal gekillt werden, um sie auf
   grundsaetzliche Kampf-Funktionsfaehigkeit zu pruefen.
@@ -104,24 +154,26 @@
   Formfehler in einem kompletten Verzeichnis ermitteln kann (Umlaute im
   Code, zu lange Zeilen etc.), wobei bezueglich der Formalien auch auf
   den Regionsmitarbeiter-Leitfaden fuer neue Projekte verwiesen werden
-  soll. Das Skript hierzu ist auf Anfrage bei Zesstra erhaeltlich. Der
-  Regionsmagier hat hierbei die Entscheidungsfreiheit, die Berichte dieses
-  Skripts dem Programmierer des neuen Gebiets als Anhaltspunkte zur
-  Verfuegung zu stellen, oder die Abarbeitung der gemeldeten Punkte als
-  Voraussetzung vor dem Anschluss vorzuschreiben, aber auch jede Abstufung
-  dazwischen ist OK. :-)
+  soll. Das Skript liegt im oeffentlichen Git-Repo "static-lpc-check" auf
+  dem MG-Gerrit-Server. Man kann es mit git oder ueber das Webinterface
+  herunterladen. Der Regionsmagier hat hierbei die Entscheidungsfreiheit,
+  die Berichte dieses Skripts dem Programmierer des neuen Gebiets als
+  Anhaltspunkte zur Verfuegung zu stellen, oder die Abarbeitung der 
+  gemeldeten Punkte zur Voraussetzung fuer den Anschluss zu machen, aber
+  auch jede Abstufung dazwischen ist OK. :-)
   Zusaetzlicher Tip: Das Skript differenziert zwischen eigentlich nicht
   akzeptablen Konstrukten und zumindest fragwuerdigen, d.h. man kann diese
   Unterscheidung an den Verantwortlichen mit entsprechenden Forderungen
   weitergeben.
-  Das Skript ist unter ftp://mg.mud.de/Software/src_check/ erhaeltlich.
 
-o Sollte ein zur Abnahme anstehendes Projekt eine (grundsaetzlich
+o Sollte ein zur Abnahme anstehendes Gesellenstueck eine (grundsaetzlich
   selbstverstaendlich zulaessige) Gemeinschaftsarbeit sein, sollte man
-  als Regionsmagier darauf bestehen, eine sauber getrennte Codebasis
-  in unterschiedlichen Verzeichnissen vorgelegt zu bekommen, oder aber
-  eine Auflistung, welcher Beitrag von welchem Magier stammt.
-  Wenn diese Auflistung sich bis auf Funktionsebene erstrecken sollte
+  darauf bestehen, eine sauber getrennte Codebasis in unterschiedlichen
+  Verzeichnissen vorgelegt zu bekommen, oder aber eine Auflistung, welcher
+  Beitrag von welchem Magier stammt. Es sollte klar sein, dass die
+  Beurteilung der Faehigkeiten eines Lehrlings darauf angewiesen ist, dass
+  man den Code richtig zuordnen kann.
+  Wenn eine solche Auflistung sich bis auf Funktionsebene erstreckt
   (z.B. "DoWield() ist von X, Details von Y, DefendFunc von Z"), ist
   das unschoen und an sich abzulehnen.
 
@@ -215,7 +267,7 @@
   {
     pl = find_player(lower_case(name1));
     if (!pl || !living(pl))
-      return 1;
+      return;
     else
       Kill(pl);
   }
@@ -296,13 +348,10 @@
 o for()-Schleifen
   Eigentlich keine Funktion, aber an dieser Stelle doch passend:
   for()-Schleifen sollten generell durch foreach()-Konstruktionen ersetzt
-  werden, da dies signifikant und messbar schneller ist. Die naechst-
-  schnellere Variante waere etwa folgendes, sofern die Reihenfolge der
-  Abarbeitung unerheblich ist (i ist integer, arr ist ein mixed-Array):
-
-  for ( i=sizeof(arr); i--; ) {
-    tu_etwas_mit(arr[i]);
-  }
+  werden, da dies signifikant und messbar schneller ist. Der groesste 
+  Zeit- und Kostenfaktor ist die Verwendung von sizeof() als Abbruchkriterium
+  in einer for()-Schleife. Wenn sich die Schleife also nicht ersetzen laesst,
+  dann nehmt zumindest einen konstanten Wert als Abbruchkriterium.
 
 o write_file()
   Benutzung dieser Funktion nur in begruendeten Ausnahmefaellen abnehmen, da
@@ -311,6 +360,10 @@
   verbrauchen, aber kaum zu ueberschauen sind. Statt write_file() wird in
   den allermeisten Faellen log_file() mit der Standardgroesse von 50 kB fuer
   Logfile und eine ggf. vorhandene Altversion (*.OLD) ausreichend sein.
+  Standardmaessig ist das Schreiben eines Questlog-Eintrages in /log/quest
+  der einzige Einsatzzweck, wo write_file() wirklich notwendig ist.
+  Ansonsten sind Ausnahmen vorstellbar, wenn die neuen Daten die alte Datei
+  komplett ersetzen, d.h. nicht angehaengt werden.
 
 o Verwalten von charakterbezogenen Daten
   Als Beispiel seien hier Statusdaten fuer den Ablauf von Quests genannt,