diff --git a/doc/sphinx/lfun/Pacify.rst b/doc/sphinx/lfun/Pacify.rst
index 8a68c42..495f6c1 100644
--- a/doc/sphinx/lfun/Pacify.rst
+++ b/doc/sphinx/lfun/Pacify.rst
@@ -17,20 +17,20 @@
 ------------
 ::
 
-	Diese Funktion versucht, ein Lebewesen zu befrieden.
+  Diese Funktion versucht, ein Lebewesen zu befrieden.
   Will eine Gilde ein Lebewesen befrieden, muss sie hierfuer diese Funktion
   in dem Lebewesen aufrufen.
 
-  Ein immer befriedbarer NPC kann durch das Setzen von P_ACCEPT_PEACE in einem
-  Lebewesen realisiert werden.
+  Ein immer befriedbarer NPC kann durch das Setzen von P_ACCEPT_PEACE in 
+  einem Lebewesen realisiert werden.
 
-	Standardmaessig funktioniert die Funktion wie folgt:
+  Standardmaessig funktioniert die Funktion wie folgt:
+
   * Kommt der Versuch vom Spellcaster selbst, ist er immer erfolgreich.
   * Kommt der Versuch von einem Teamkollegen, ist er immer erfolgreich.
   * Hat das Lebewesen keine Gegner, ist der Versuch immer erfolglos.
-  In diesen Faellen erfolgt auch keine Erhoehung des Befriedezaehlers.
 
-  
+  In diesen Faellen erfolgt auch keine Erhoehung des Befriedezaehlers.
 
   In anderen Faellen wird die in P_PEACE_HISTORY fuer die Gilde des Casters
   abgelegte Zahl erfolgreicher Befriedungen (ANZ), die Intelligenz des
@@ -38,12 +38,8 @@
   ermittelt.
   Anschliessend wird eine Wahrscheinlichkeit w ausgerechnet:
 
-  
-
     w = (INT_CASTER + 10 - ANZ*4) / (INT_ME + 10)
 
-  
-
   Hierbei gibt w die Chance auf eine erfolgreiche Befriedung an. Mittels einer
   Zufallszahl wird bestimmt, ob der aktuelle Versuch erfolgreich ist. Falls
   ja, wird der Zaehler fuer die Gilde des Casters in P_PEACE_HISTORY erhoeht.
@@ -53,9 +49,8 @@
 
 BEMERKUNGEN
 -----------
-::
 
-  *	Die Funktion kann auch ueberschrieben werden, um ein vom Magier
+  * Die Funktion kann auch ueberschrieben werden, um ein vom Magier
     gewuenschtes Verhalten zu realisieren. Ein komplettes Abhaengen von
     Befriedungen sollte dabei aber die Ausnahme sein!
   * Diese Funktion verwaltet auch das P_PEACE_HISTORY, speziell die Reduktion
@@ -68,17 +63,17 @@
 
     1 - das Lebewesen wurde erfolgreich befriedet..
     0 - der Befriedeversuch ist gescheitert.
-
     
 
 BEISPIELE
 ---------
 ::
 
-    Angenommen, der Caster hat eine Intelligenz von 22. Die folgende Tabelle
-    gibt dann die Wahrscheinlichkeiten fuer eine erfolgreiche Befriedung an:
-    (in Abhaengigkeit von eigener Intelligenz und vergangener erfolgreicher
-     Versuche)
+  Angenommen, der Caster hat eine Intelligenz von 22. Die folgende Tabelle
+  gibt dann die Wahrscheinlichkeiten fuer eine erfolgreiche Befriedung an:
+  (in Abhaengigkeit von NPC-Intelligenz INT_ME und vergangener erfolgreicher
+  Versuche).
+
  INT_ME  Erfolgswahrscheinlichkeiten je nach Anzahl erfolgreicher Versuche
               1       2       3       4       5       6       7       8
       0     280     240     200     160     120      80      40       0
@@ -142,7 +137,5 @@
 
 LETZTE AENDERUNG
 ----------------
-::
-
 07.06.2008, Zesstra
 
diff --git a/doc/sphinx/props/P_GUILD_RATING.rst b/doc/sphinx/props/P_GUILD_RATING.rst
index b752e00..aa6862d 100644
--- a/doc/sphinx/props/P_GUILD_RATING.rst
+++ b/doc/sphinx/props/P_GUILD_RATING.rst
@@ -26,9 +26,16 @@
 -----------
 ::
 
-	Der Wert muss von der Gilde ermittelt werden! Meist setzt er sich
-	aus den Faehigkeiten des Mitglieds zusammen und mitunter fliessen
-	auch Gildenquests oder aehnliches mit ein.
+  Der Wert muss von der Gilde ermittelt werden! Meist setzt er sich
+  aus den Faehigkeiten des Mitglieds zusammen und mitunter fliessen
+  auch Gildenquests oder aehnliches mit ein.
+
+  Spieler erhalten 1 Stufenpunkt fuer je 25 Punkte Gildenrating, d.h.
+  400 Stufenpunkte bei Max-Rating. Gildenmagier sollten sich daher gut
+  ueberlegen, ob sie bei der Berechnung des Ratings eine Formel zugrunde
+  legen wollen, die verhindert, dass Spieler ein Max-Rating erreichen
+  koennen.
+
 
 SIEHE AUCH
 ----------
@@ -37,5 +44,5 @@
     P_NEWSKILLS, GuildRating
 
 
-Last modified: Wed Jan 14 19:17:06 1998 by Patryn
+Last modified: 2021-01-10, Arathorn 
 
diff --git a/doc/sphinx/props/obsolete/P_TMP_DEFEND_HOOK.rst b/doc/sphinx/props/obsolete/P_TMP_DEFEND_HOOK.rst
index 5d9ae39..5074ab0 100644
--- a/doc/sphinx/props/obsolete/P_TMP_DEFEND_HOOK.rst
+++ b/doc/sphinx/props/obsolete/P_TMP_DEFEND_HOOK.rst
@@ -26,12 +26,14 @@
      veraendert werden.
 
      Es wird an dem Living die Property als mindestens 3-elementiges Array
-     ({zeitpunkt, objekt, methode, ...})
+
+        ({int zeitpunkt, object objekt, string methode, ...})
+
      gesetzt und die Methode 'methode' wird dann waehrend des Defend() des
      Lebewesens in 'objekt' aufgerufen, solange time()<'zeitpunkt'.
 
      Der Methode werden die Parameter der Defend() uebergeben:
-     int dam, mixed dam_type, mixed spell, object enemy
+     int dam, string* dam_type, int|mapping spell, object enemy
      - spell ist definitiv ein Mapping - ein an Defend() uebergebener
        int-Wert wurde aequivalent umgesetzt.
      - dam_type ist definitiv ein Array von Schadenswerten oder einem Wert
@@ -39,10 +41,10 @@
      Zudem findet der Aufruf der Methode nach dem Abarbeiten der P_DEFENDERS
      statt, diese koennen also weitere Modifikationen vorgenommen haben.
 
-     Gibt die Funktion:
+     Gibt die Methode:
      - 0 zurueck, wird Defend() abgebrochen (und damit der Schaden voellig
        abgefangen) - nur noch die Flucht wird geprueft
-     - ein 3-elementiges Array ({schaden, schadenstypen, spell}) zurueck,
+     - ein 3-elementiges Array ({dam, dam_type, spell}) zurueck,
        werden diese Werte in der Defend() an Stelle der uebergebenen Werte
        verwendet
      - weder noch zurueck, wird das Ergebnis ignoriert und die Defend laeuft
@@ -53,79 +55,88 @@
 ::
 
      - Bitte das neuere Hooksystem (s. Manpage std/hooks) benutzen.
-     - falls die Zeit abgelaufen oder das Objekt zerstoert ist, wird die
-       Property auf 0 gesetzt
-     - vor dem Setzen immer auf die Existenz eines gueltigen Hooks
+     - Der korrekte Union-Datentyp fuer die Property ist
+       <int|object|string>* fuer die normale Nutzung mit 3 Elementen.
+       Ein weit verbreiteter Anwendungsfall verwendet 2 weitere Elemente,
+       die vom Typ int und string|string* sind. Alle Stellen, die die Property
+       abfragen, sollten daher den Union-Datentyp <int|object|string|string*>*
+       verwenden. Das Beispiel beruecksichtigt diesen Fall bereits.
+     - Falls die Zeit abgelaufen oder das Objekt zerstoert ist, wird die
+       Property auf 0 gesetzt.
+     - Vor dem Setzen immer auf die Existenz eines gueltigen Hooks
        pruefen, einfaches Ueberschreiben fuehrt einerseits zu Fehlern
-       im Code anderer und ist andererseits unfair gegenueber ihnen
+       im Code anderer und ist andererseits unfair gegenueber ihnen.
 
 BEISPIEL
 --------
 ::
 
      *** ein gruener Schutzzauber ***
-     // Setzen der Prop
-     ...
-     tmp=TP->QueryProp(P_TMP_DEFEND_HOOK);
+     // Vor dem Setzen der Prop pruefen, ob schon ein Hook gesetzt ist.
 
-     // ein etwas ausfuehrlicher Check, ob wir ueberschreiben koennen,
-     // Existenz && Gueltigkeit
-     if(pointerp(tmp) && sizeof(tmp) && intp(tmp[0]) && (time()<tmp[0]))
-      write("Der Zauber klappt nicht!\n");
+     <int|object|string|string*>* tmp = TP->QueryProp(P_TMP_DEFEND_HOOK);
+
+     // Ein etwas ausfuehrlicherer Check, ob wir ueberschreiben koennen,
+     // Existenz && noch nicht abgelaufen?
+     if(sizeof(tmp) && intp(tmp[0]) && time() < tmp[0]) {
+       write("Der Zauber klappt nicht!\n");
+     }
      else {
-      // der Zauber gilt eine Stunde
-      TP->SetProp(P_TMP_DEFEND_HOOK,({time()+3600,TO,"abwehrfun");
-      write("Ein Zauber legt sich auf dich.\n");
+       // der Zauber gilt eine Stunde
+       TP->SetProp(P_TMP_DEFEND_HOOK,({time()+3600,TO,"abwehrfun");
+       write("Ein Zauber legt sich auf Dich.\n");
      }
      ...
 
      // die gerufene Methode
-     mixed abwehrfun(int dam, string* dam_type, mapping spell, object en) {
-      // keine rekursiven Schaeden abfangen ... mindestens ein magischer
-      // muss auch dabei sein
-      if((!mappingp(spell) || !spell[SP_RECURSIVE]) &&
-         sizeof(filter(dam_type,MAGICAL_DAMAGE_TYPES))) {
+     int|<int|string*|mapping>* abwehrfun(int dam, string* dam_type,
+                                      mapping spell, object en)
+     {
+       // keine rekursiven Schaeden abfangen ... mindestens ein magischer
+       // muss auch dabei sein
+       if(!spell[SP_RECURSIVE] &&
+          sizeof(filter(dam_type,MAGICAL_DAMAGE_TYPES))) {
+         // mit 10% Whkeit schuetzt der Zauber total
+         if(!random(10)) {
+           tell_object(previous_object(),
+             "Dein Zauber gleisst rund um Dich gruen auf.\n");
+           tell_room(environment(previous_object()), break_string(
+             previous_object()->Name(WESSEN)+" Haut gleisst rund um "+
+             previous_object()->QueryPronoun(WEN)+" gruen auf.",78),
+             ({previous_object()}));
 
-       // mit 10% Whkeit schuetzt der Zauber total
-       if(!random(10)) {
-        tell_object(previous_object(),
-          "Dein Zauber gleisst rund um dich gruen auf.\n");
-        tell_room(environment(previous_object()), break_string(
-          previous_object()->Name(WESSEN)+" Haut gleisst rund um "+
-          previous_object()->QueryPronoun(WEN)+" gruen auf.",78),
-          ({previous_object()}));
+           // manchmal geht der Zauber dabei endgueltig kaputt
+           if(!random(10))
+             previous_object()->SetProp(P_TMP_DEFEND_HOOK, 0);
 
-        // manchmal geht der Zauber dabei endgueltig kaputt
-        if(!random(10)) previous_object()->SetProp(P_TMP_DEFEND_HOOK, 0);
+           return 0;			// volles Abfangen des Angriffs
+         }
 
-        return 0;			// volles Abfangen des Angriffs
+         // der Zauber schuetzt auf jeden Fall immer ein bischen
+         tell_object(previous_object(),
+           "Dein Zauber flackert rund um dich gruen auf.\n");
+         tell_room(environment(previous_object()), break_string(
+           previous_object()->Name(WESSEN)+" Haut flackert rund um "+
+           previous_object()->QueryPronoun(WEN)+" gruen auf.",78),
+           ({previous_object()}));
+         dam = (7+random(2))*dam/10;	// Schaden reduzieren
+
+         return(({dam, dam_type, spell}));
        }
 
-       // der Zauber schuetzt auf jeden Fall immer ein bischen
-       tell_object(previous_object(),
-         "Dein Zauber flackert rund um dich gruen auf.\n");
-       tell_room(environment(previous_object()), break_string(
-         previous_object()->Name(WESSEN)+" Haut flackert rund um "+
-         previous_object()->QueryPronoun(WEN)+" gruen auf.",78),
-         ({previous_object()}));
-       dam=(7+random(2))*dam/10;	// Schaden reduzieren
-
-       return(({dam, dam_type, spell}));
-      }
-
-      // der Zauber schuetzt dann gar nicht ...
-      return 1;
+       // der Zauber schuetzt dann gar nicht ...
+       return 1;
      }
 
 SIEHE AUCH
 ----------
 ::
 
-     Angriff:	Attack(L)
-     Schutz:    Defend(L)
-     Verwandt:	InternalModifyDefend(L), P_TMP_ATTACK_MOD
-     Hooks:	P_TMP_DIE_HOOK, P_TMP_MOVE_HOOK, P_TMP_ATTACK_HOOK
+     Angriff:	   Attack(L)
+     Schutz:     Defend(L)
+     Verwandt:	 InternalModifyDefend(L), P_TMP_ATTACK_MOD
+     Hooks:	     P_TMP_DIE_HOOK, P_TMP_MOVE_HOOK, P_TMP_ATTACK_HOOK
      neue Hooks: std/hooks
 
-08.12.2008, Zesstra
+29.12.2020, Arathorn
 
