diff --git a/doc/props/P_GUILD_RATING b/doc/props/P_GUILD_RATING
index af9c24e..8fb181e 100644
--- a/doc/props/P_GUILD_RATING
+++ b/doc/props/P_GUILD_RATING
@@ -31,10 +31,16 @@
    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
 ==========
 
    P_NEWSKILLS, GuildRating
 
-Last modified: Wed Jan 14 19:17:06 1998 by Patryn
+Last modified: 2021-01-10, Arathorn
diff --git a/doc/props/obsolete/P_TMP_DEFEND_HOOK b/doc/props/obsolete/P_TMP_DEFEND_HOOK
index f29d342..144f7a4 100644
--- a/doc/props/obsolete/P_TMP_DEFEND_HOOK
+++ b/doc/props/obsolete/P_TMP_DEFEND_HOOK
@@ -27,12 +27,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
@@ -40,10 +42,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
@@ -54,78 +56,87 @@
 ===========
 
    - 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
