diff --git a/doc/lfun/AddCmd_bsp b/doc/lfun/AddCmd_bsp
index ec8ff17..4f382c8 100644
--- a/doc/lfun/AddCmd_bsp
+++ b/doc/lfun/AddCmd_bsp
@@ -1,10 +1,6 @@
 
-AddCmd_bsp()
-************
-
-
 ADDCMD() - BEISPIELE
-====================
+********************
 
 
 FUNKTION
@@ -25,48 +21,61 @@
 BEISPIELE
 =========
 
-   // SIMPEL: ganz simpel, beinahe wie add_action
+
+Einfache Beispiele
+------------------
+
+1. SIMPEL: ganz simpel, beinahe wie add_action()
+
    AddCmd("befiehl","action_befehlen");
-   ...
+   // ...
    int action_befehlen(string str) {
-    if(!str || !strlen(str))
-     // Fehlermeldung, falls gar keine Funktion 1 dafuer zurueckgibt
-     notify_fail("Was willst du befehlen?!\n");
-    else {
-     write("Du befiehlst \""+str+"\", und alle folgen!\n");
-     say(TP->Name(WER)+" befiehlt \""+str+"\", und du folgst!\n");
-     return 1;         // ERFOLG - Abbruch der Kommandoauswertung
-    }
-    return 0;          // MISSERFOLG - Fehlermeldung oben gesetzt
+     if(!str || !strlen(str))
+       // Fehlermeldung, falls gar keine Funktion 1 dafuer zurueckgibt
+       notify_fail("Was willst du befehlen?!\n");
+     else {
+       write("Du befiehlst \""+str+"\", und alle folgen!\n");
+       say(TP->Name(WER)+" befiehlt \""+str+"\", und du folgst!\n");
+       return 1;  // ERFOLG - Abbruch der Kommandoauswertung
+     }
+     return 0;    // MISSERFOLG - Fehlermeldung oben gesetzt
    }
 
-   // SIMPEL .. weitere Beispiele
+2. SIMPEL .. weitere Beispiele
+
    AddCmd(({"kletter","klettere"}),"action_klettern" );
    AddCmd(({"renn","renne"}),#'action_rennen);
 
-   // REGELN: eine komplexere Regel
+3. REGELN: eine komplexere Regel
+
    AddCmd("loesch|loesche|ersticke&feuer|brand|flammen&decke|wolldecke",
           "action_loeschen",
           "Was willst du loeschen?|Womit willst du loeschen?");
 
-   // REGELN: mit Platzhaltern im Fehlerstring
+4. REGELN: mit Platzhaltern im Fehlerstring
+
    AddCmd("spring|springe|huepf|huepfe&von|vom&baum|ast|eiche",
           #'action_huepfe,
           "Willst du von etwas @verben?|Von wo willst du @verben?");
 
-   // SCHLECHT: eine unscharfe Regel - sie sollten eine Ausnahme sein (!)
+5. SCHLECHT: eine unscharfe Regel - sie sollten eine Ausnahme sein
+   (!)
+
    AddCmd("kletter","fun_klettern",1);
 
-   // FALSCH: sehr schlecht, kein Imperativ verwendet
-   // ausserdem sollte man fuer solche Syntaxen AddReadDetail benutzen
+6. FALSCH: sehr schlecht, kein Imperativ verwendet
+
    AddCmd("lese","eval_lesen");
 
-   // SIMPLE REGEL
+   ausserdem sollte man fuer Lese-Syntaxen AddReadDetail benutzen
+
+7. SIMPLE REGEL
+
    static int action_jump(string str);        // Prototype (wegen closure)
-   ...
+   // ...
    AddCmd("spring|springe|huepf|huepfe&von&baum|ast",#'action_jump,
           "Willst Du von etwas @verben?|Wovon willst Du @verben?");
-   ...
+   // ...
    static int action_jump(string str) {
      write(break_string("Du springst vom Baum und kommst hart auf!",78));
      this_player()->move((XXXROOM+"boden"), M_GO, 0,
@@ -76,307 +85,314 @@
      return 1;
    }
 
-   // SIMPLE REGEL OHNE METHODE
-   // mit Regeln kann man auch Aktivitaeten im Raum erlauben, ohne eine
-   // Funktion aufrufen zu muessen: die letzte Regel ist fuer Spieler
-   // unmoeglich zu erfuellen, die dazugehoerige Fehlermeldung wird mit
-   // dem ^ (write-Flag) versehen und entsprechend an den Spieler
-   // (und den Raum (hinter dem ^)) ausgegeben
+8. SIMPLE REGEL OHNE METHODE
+
+   mit Regeln kann man auch Aktivitaeten im Raum erlauben, ohne eine
+   Funktion aufrufen zu muessen: die letzte Regel ist fuer Spieler
+   unmoeglich zu erfuellen, die dazugehoerige Fehlermeldung wird mit
+   dem ^ (write-Flag) versehen und entsprechend an den Spieler (und
+   den Raum (hinter dem ^)) ausgegeben
+
    AddCmd("spring|springe&herunter|runter&\n\bimpossible",0,
           "Wohin oder wovon willst Du springen?|"
           "Du springst vom Baum und kommst hart auf.^"
           "@WER1 springt vom Baum und kommt hart auf.");
 
-## Komplexbeispiel: Regeln mit Fehlermeldungen ##
-   ## Variante 1, OHNE REGELN ##
-      // bei Nichtverwendung von Regeln muss man Parameter selbst
-      auswerten AddCmd(({"bohr","bohre"}),#'action_bohren); ...
-      private int action_bohren(string str) {
 
-         string >>*<<tmp; notify_fail("Wo willst (etwas) Du
-         bohren?n"); if(!str) return 0;       // Tja, keine Argumente
-         ... tmp=explode(str," ");    // nach " " in Argument-Array
-         aufspalten if((i=member(tmp,"loch"))>=0) { // aha, ab jetzt
-         uebernehmen wir :)
+Komplexbeispiel: Regeln mit Fehlermeldungen
+-------------------------------------------
 
-            if((j=member(tmp[(i+1)..],"in"))<0 &&
-                     (j=member(tmp[(i+1)..],"durch"))<0)
 
-                  write("Willst Du das Loch in etwas bohren?n");
+Variante 1a, OHNE REGELN
+~~~~~~~~~~~~~~~~~~~~~~~~
 
-               else if((i=member(tmp[(j+1)..],"boden"))<0 &&
-                     (i=member(tmp[(j+1)..],"erde"))<0)
+   Wenn man keine Regeln verwendet, muss man die Eingabe selbst
+   auswerten.
 
-                  write("In/Durch was willst du das Loch bohren?n");
-
-               else {
-                  write("Du bohrst ein Loch in den Boden.n");
-                  say(this_player()->Name(WER)+" bohrt ein Loch in den
-                  Boden.n");
-
-               } return 1;      // "bohre loch" war so eindeutig, dass
-               nur diese
-
+   AddCmd(({"bohr","bohre"}),#'action_bohren);
+   // ...
+   private int action_bohren(string str) {
+     string *tmp;
+     notify_fail("Wo willst (etwas) Du bohren?\n");
+     if(!str) return 0;       // Tja, keine Argumente ...
+     tmp=explode(str," ");    // nach " " in Argument-Array aufspalten
+     if((i=member(tmp,"loch"))>=0) { // aha, ab jetzt uebernehmen wir :)
+       if((j=member(tmp[(i+1)..],"in"))<0 &&
+          (j=member(tmp[(i+1)..],"durch"))<0)
+         write("Willst Du das Loch in etwas bohren?\n");
+       else if((i=member(tmp[(j+1)..],"boden"))<0 &&
+               (i=member(tmp[(j+1)..],"erde"))<0)
+         write("In/Durch was willst du das Loch bohren?\n");
+       else {
+         write("Du bohrst ein Loch in den Boden.\n");
+         say(this_player()->Name(WER)+" bohrt ein Loch in den Boden.\n");
+       }
+       return 1;  // "bohre loch" war so eindeutig, dass nur diese
                   // Methode gemeint sein konnte, also brechen wir die
                   // weitere Auswertung auf jeden Fall ab (und geben
                   // eine write-Fehlermeldung)
+     } // end if(..."loch")
+     return 0;    // "bohre" allein muss nicht diese Methode meinen,
+                  // also nur obige notify_fail()-Meldung, falls
+                  // sich nach dieser Methode gar keine sonst
+                  // angesprochen fuehlt
+   } // end fun
 
-         } // end if(..."loch") return 0;        // "bohre" allein
-         muss nicht diese Methode meinen,
 
-            // also nur obige notify_fail()-Meldung, falls // sich
-            nach dieser Methode gar keine sonst // angesprochen fuehlt
+Variante 1b, OHNE REGELN, Alternative
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-      } // end fun
+   prinzipiell koennte die Methode action_bohren() auch so aussehen,
+   ist aber nicht ganz so flexibel:
 
-   ## Variante 1a, OHNE REGELN ##
-      // prinzipiell koennte die Methode action_bohren auch so //
-      aussehen, ist aber nicht ganz so flexibel: private int
-      action_bohren(string str) {
+   private int action_bohren(string str) {
+     string unused;
+     if(!str || (sprintf(str,"loch in erde%s", unused)!=1 &&
+                 sprintf(str,"loch durch erde%s", unused)!=1 &&
+                 sprintf(str,"loch in boden%s", unused)!=1 &&
+                 sprintf(str,"loch durch boden%s", unused)!=1))
+       notify_fail("Willst Du in irgendwas ein Loch bohren?\n");
+     else {
+       // ...
+       return 1;
+     }
+     return 0;
+   }
 
-         string tmp; if(!str || (sprintf(str,"loch in erde%s",tmp)!=1
-         &&
 
-               sprintf(str,"loch durch erde%s",tmp)!=1 &&
-               sprintf(str,"loch in boden%s",tmp)!=1 &&
-               sprintf(str,"loch durch boden%s",tmp)!=1))
+Variante 2, MIT REGEL
+~~~~~~~~~~~~~~~~~~~~~
 
-            notify_fail("Willst Du in irgendwas ein Loch bohren?n");
+   das gleiche in etwa mal als einfache Regel
 
-         else {
-            ... return 1;
+   AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
+          "Was willst du (wohin) bohren?|"
+          "Willst du das Loch in etwas bohren?|"
+          "Wohin willst du das Loch bohren?");
+   // ...
+   private int action_bohren(string str, mixed *param) {
+     write("Du bohrst ein Loch in den Boden.\n");
+     say(this_player()->Name(WER)+" bohrt ein Loch in den Boden.\n");
+     // ...
+     return 1;
+   }
 
-         } return 0;
 
-      }
+Variante 3, MIT REGEL UND FEHLERMELDUNG
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-   ## Variante 2, MIT REGEL ##
-      // das gleiche in etwa mal als einfache Regel
-      AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
+   und nun mit Fehlermeldungen mit Ersetzungen, so dass wir mehr auf
+   die Eingaben des Spielers eingehen
 
-         "Was willst du (wohin) bohren?|" "Willst du das Loch in etwas
-         bohren?|" "Wohin willst du das Loch bohren?");
+   AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
+          "Was willst du (wohin) @verben?|"
+          "Willst du das Loch in etwas @verben?|"
+          "@WER3 was willst du das Loch @verben?");
+   // ...
+   private int action_bohren(string str, mixed *param) // ...
 
-      ... private int action_bohren(string str, mixed >>*<<param) {
 
-         write("Du bohrst ein Loch in den Boden.n");
-         say(this_player()->Name(WER)+" bohrt ein Loch in den
-         Boden.n"); ... return 1;
+Variante 4, MIT REGEL, FEHLERMELDUNG UND RETURN 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-      }
+   In Variante 1 kam sinnvollerweise sehr frueh der Abbruch mit
+   "return 1;" und mit Ausgabe von write-Fehlermeldungen, das koennen
+   wir auch direkt und ohne eigene Methode.
 
-   ## Variante 3, MIT REGEL UND FEHLERMELDUNG ##
-      // und nun mit Fehlermeldungen mit Ersetzungen, so dass wir mehr
-      // auf die Eingaben des Spielers eingehen
-      AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
+   AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
+          "Was willst du (wohin) @verben?|"
+          "Willst du das Loch in etwas @verben?^|"
+          "@WER3 was willst du das Loch @verben?^");
+    // ...
+    private int action_bohren(string str, mixed *param) // ...
 
-         "Was willst du (wohin) @verben?|" "Willst du das Loch in
-         etwas @verben?|" "@WER3 was willst du das Loch @verben?");
 
-      ... private int action_bohren(string str, mixed >>*<<param) ...
+Variante 5, MIT REGEL, FEHLERMELDUNG, RETURN 1, OHNE FUN
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-   ## Variante 4, MIT REGEL, FEHLERMELDUNG UND RETURN 1 ##
-      // in Variante 1 kam sinnvollerweise sehr frueh der Abbruch mit
-      // "return 1;" und die Ausgabe von write-Fehlermeldungen, // das
-      koennen wir auch
-      AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
+   // und falls in action_bohren() nichts ausser Ausgaben passiert, koennen
+   // wir uns die auch ganz sparen indem wir eine nichterfuellbare Regel
+   // samt Fehlermeldung bauen
+   AddCmd("bohr|bohre&loch&in|durch&erde|boden&\nimpossible",0,
+          "Was willst du (wohin) @verben?|"
+          "Willst du das Loch in etwas @verben?^|"
+          "@WER3 was willst du das Loch @verben?^|"
+          "Du @verbst ein Loch @WER3 den Boden.^@WER1 @verbt "
+          "ein Loch @WER3 den Boden.");
 
-         "Was willst du (wohin) @verben?|" "Willst du das Loch in
-         etwas @verben?^|" "@WER3 was willst du das Loch @verben?^");
 
-      ... private int action_bohren(string str, mixed >>*<<param) ...
+Komplexbeispiel: Spezialregeln @PRESENT und @ID
+-----------------------------------------------
 
-   ## Variante 5, MIT REGEL, FEHLERMELDUNG, RETURN 1, OHNE FUN ##
-         // und falls in action_bohren() nichts ausser Ausgaben
-         passiert, koennen // wir uns die auch ganz sparen indem wir
-         eine nichterfuellbare Regel // samt Fehlermeldung bauen
-         AddCmd("bohr|bohre&loch&in|durch&erde|boden&nimpossible",0,
 
-            "Was willst du (wohin) @verben?|" "Willst du das Loch in
-            etwas @verben?^|" "@WER3 was willst du das Loch
-            @verben?^|" "Du @verbst ein Loch @WER3 den Boden.^@WER1
-            @verbt " "ein Loch @WER3 den Boden.");
+Variante 1, OHNE REGELN
+~~~~~~~~~~~~~~~~~~~~~~~
 
-      --- Ende Komplexbeispiel Regeln mit Fehlermeldungen ---
+   Oft agieren Kommandos auf Objekten im Raum, diese muessen dabei per
+   present() identifiziert werden: Beispiel ist ein Geldautomat
+   (Hinweis: dieses Beispiel dient der Illustration, die
+   Funktionalitaet an sich sollte man besser mit einem Container mit
+   PreventInsert() erzeugen.)
 
-## Komplexbeispiel: Spezialregeln @PRESENT und @ID ##
-   ## Variante 1, OHNE REGELN ##
-      // oft agieren Kommandos auf Objekten im Raum, diese muessen
-      dabei per // present() identifiziert werden: // Beispiel ist ein
-      Geldautomat (den man besser mit einem Container // mit
-      PreventInsert() basteln sollte)
-      AddCmd(({"stopf","stopfe"}),#'action_stopf); ... private int
-      action_stopf(string str) {
-
-         string tmp,tmp2; object o;
-
-         if(str && (sprintf("%s in automat%s",tmp,tmp2)==2 ||
-               sprintf("%s in geldautomat%s",tmp,tmp2)==2 ||
-               sprintf("%s in bankomat%s",tmp,tmp2)==2) {
-
-            o=present(tmp,this_player()); if(o) {
-
-               if(o->QueryProp(...)) {
-                  write(break_string(
-                     "Du stopfst "+o->name(WEN,1)+" in den
-                     Automaten.",78));
-
-                  say(...);
-
-               } else {
-                  write(break_string(
-                     "Du versuchst "+o->name(WEN,1)+" in den Automaten
-                     zu stopfen, " "aber "+o->QueryPronoun(WER)+"
-                     passt nicht hinein.",78));
-
-                  say(...);
-
-               }
-
-            } else {
-               write("Was willst du in den Automaten stopfen?n");
-               say(....);
-
-            } return 1;
-
-         } notify_fail("Was willst du wohin stecken?n"); return 0;
-
-      }
-
-   ## Variante 2, MIT REGEL ##
-         // einerseits koennen wir das Finden von Objekten in Inv und
-         Env // integrieren und uns andererseits das Aufzaehlen aller
-         IDs des // Automaten ersparen
-         AddCmd("steck|stecke&@PRESENT&in&@ID",#'action_stopf,
-
-            "Was willst du wohin stopfen?|" "Willst du @WEN2 in etwas
-            stopfen?|" "Wohinein willst du @WEN2 stopfen?");
-
-         ... // dabei werden wie immer die gefunden Matches als
-         Parameterarray // uebergeben ... und die @PRESENT und @ID als
-         Objekte! private int action_stopf(string str, mixed
-         >>*<<param) {
-
-            if(param[0]->QueryProp(...)) {
-               write(break_string(
-                  "Du stopfst "+param[0]->name(WEN,1)+" in den
-                  Automaten.",78));
-
-               say(...);
-
-            } else {
-               write(break_string(
-                  "Du versuchst "+param[0]->name(WEN,1)+" in den
-                  Automaten zu " "stopfen, aber
-                  "+param[0]->QueryPronoun(WER)+" passt nicht "
-                  "hinein.",78));
-
-               say(...);
-
-            } return 1;
-
+   AddCmd(({"stopf","stopfe"}),#'action_stopf);
+   // ...
+   private int action_stopf(string str) {
+     string was, unused;
+     if(str && (sprintf("%s in automat%s", was, unused)==2 ||
+                sprintf("%s in geldautomat%s", was, unused)==2 ||
+                sprintf("%s in bankomat%s", was, unused)==2) {
+       object o = present(was, this_player());
+       if(o) {
+         if(o->QueryProp(...)) {
+           write(break_string(
+             "Du stopfst "+o->name(WEN,1)+" in den Automaten.",78));
+           say(...);
+         } else {
+           write(break_string(
+             "Du versuchst "+o->name(WEN,1)+" in den Automaten zu stopfen, "
+             "aber "+o->QueryPronoun(WER)+" passt nicht hinein.",78));
+           say(...);
          }
+       } else {
+         write("Was willst du in den Automaten stopfen?\n");
+         say(....);
+       }
+       return 1;
+     }
+     notify_fail("Was willst du wohin stecken?\n");
+     return 0;
+   }
 
-      --- Ende Komplexbeispiel Spezialregeln @PRESENT und @ID  ---
 
-## Komplexbeispiel: gleiches Verb, mehrere Regeln ##
-   // Das Problem mehrerer Regeln fuer ein Kommandoverb besteht darin,
-   dass // letztlich nur eine der Fehlermeldungen zum Tragen kommt -
-   welche // genau ist etwas vage. // Dabei kann man sich auf eines
-   verlassen: juengere AddCmd werden // zuerst ausgewertet. Wenn sich
-   das aendert, tretet euren EM.
+Variante 2, MIT REGEL
+~~~~~~~~~~~~~~~~~~~~~
 
-   ## Problem 1: Mehrere Regeln weil mehrere Zwecke ##
-      ## Variante 1 - GLEICHLAUTENDE FEHLERMELDUNG // fuer alles wird
-      eine identische Fehlermeldung gesetzt, das ist // natuerlich
-      nicht sehr flexibel oder schoen AddCmd("kriech|krieche&hoch|hin
-      auf|hinaus|heraus|raus",#'result_kriech,
+   einerseits koennen wir auf diese Weise das Finden von Objekten in
+   Inv und Env in die AddCmd()-Regel integrieren und uns andererseits
+   das Aufzaehlen aller IDs des Automaten ersparen.
 
-         "Wohin willst Du kriechen?");
+   Wie immer werden die gefundenen Matches als Parameterarray an die
+   angegebene Methode uebergeben. Das Array enthaelt die mit @PRESENT
+   und @ID gefundenen Treffer praktischerweise als Objekte.
 
-      AddCmd("kriech|krieche&nach&oben",#'result_kriech,
-         "Wohin willst Du kriechen??|Wohin willst Du kriechen?");
+   AddCmd("steck|stecke&@PRESENT&in&@ID",#'action_stopf,
+          "Was willst du wohin stopfen?|"
+          "Willst du @WEN2 in etwas stopfen?|"
+          "Wohinein willst du @WEN2 stopfen?");
+   // ...
+   private int action_stopf(string str, mixed *param) {
+     if(param[0]->QueryProp(...)) {
+       write(break_string(
+         "Du stopfst "+param[0]->name(WEN,1)+" in den Automaten.",78));
+       say(...);
+     } else {
+       write(break_string(
+         "Du versuchst "+param[0]->name(WEN,1)+" in den Automaten zu "
+         "stopfen, aber "+param[0]->QueryPronoun(WER)+" passt nicht "
+         "hinein.",78));
+       say(...);
+     }
+     return 1;
+   }
 
-      AddCmd("kriech|krieche&aus&loch|grube|falle",#'result_kriech);
-         "Wohin willst Du kriechen?|Wohin willst Du kriechen?");
 
-      // oder man versucht eine bessere Regel zu schaffen, was hier
-      durch // die Moeglichkeit von zwei oder drei Parameter
-      unmoeglich ist
+Komplexbeispiel: gleiches Verb, mehrere Regeln
+----------------------------------------------
 
-      ## Variante 2 - EIGENE AUSWERTUNG // es bietet sich also eigene
-      Weiterauswertung an, was durch die // Uebergabe der getriggerten
-      Verben erleichtert wird:
-      AddCmd("kriech|krieche&hoch|hinauf|hinaus|heraus|raus|aus|nach",
+   Das Problem mehrerer Regeln fuer ein Kommandoverb besteht darin,
+   dass letztlich nur eine der Fehlermeldungen zum Tragen kommt -
+   welche genau, ist etwas vage. Dabei kann man sich auf eines
+   verlassen: juengere AddCmd werden zuerst ausgewertet. Wenn sich das
+   aendert, tretet euren EM.
 
-         #'result_kriech, "Wohin willst Du kriechen?");
 
-      ... static int result_kriech(string str, mixed >>*<<extra) {
+Problem 1: Mehrere Regeln weil mehrere Zwecke
+---------------------------------------------
 
-         if(member(extra,"aus")>=0 &&
-               !sizeof(({str}),"*.\<(hoehle|grube|falle)\>.*"))
 
-            notify_fail("Woraus willst Du kriechen?n");
+Variante 1 - GLEICHLAUTENDE FEHLERMELDUNG
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-         else if(member(extra,"nach")>=0 && strstr(str,"oben")<0)
-            notify_fail("In welche Richtung willst Du kriechen?n");
+   Fuer alles wird eine identische Fehlermeldung gesetzt, das ist
+   natuerlich nicht sehr flexibel oder schoen oder man versucht eine
+   bessere Regel zu schaffen, was hier durch die Moeglichkeit von zwei
+   oder drei Parameter unmoeglich ist
 
-         else if(this_player()->QueryAttribute(A_DEX)>10 ||
-               member(holding_root,this_player())) {
+   AddCmd("kriech|krieche&hoch|hinauf|hinaus|heraus|raus",#'result_kriech,
+          "Wohin willst Du kriechen?");
+   AddCmd("kriech|krieche&nach&oben",#'result_kriech,
+          "Wohin willst Du kriechen??|Wohin willst Du kriechen?");
+   AddCmd("kriech|krieche&aus&loch|grube|falle",#'result_kriech);
+          "Wohin willst Du kriechen?|Wohin willst Du kriechen?");
 
-            write("Du kriechst mit Muehe heraus.n");
-            this_player()->move((XXXROOM+"draussen"), M_GO, 0,
 
-               "kriecht mit Muehe aus der Grube", "kriecht aus einer
-               Grube");
+Variante 2 - EIGENE AUSWERTUNG
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-            return 1;
+   Statt der Verwendung mehrerer aehnlicher AddCmd() bietet sich die
+   eigene Weiterauswertung an, was durch die Uebergabe der
+   getriggerten Argumente erleichtert wird.
 
-         } else
-            write("Du bist zu ungeschickt, halt Dich irgendwo
-            fest.n"); return 1;
+   AddCmd("kriech|krieche&hoch|hinauf|hinaus|heraus|raus|aus|nach",
+          #'result_kriech,
+          "Wohin willst Du kriechen?");
+   // ...
+   private int result_kriech(string str, mixed *extra) {
+     if(member(extra,"aus")>=0 &&
+        !sizeof(({str}),"*.\\<(hoehle|grube|falle)\\>.*"))
+       notify_fail("Woraus willst Du kriechen?\n");
+     else if(member(extra,"nach")>=0 && strstr(str,"oben")<0)
+       notify_fail("In welche Richtung willst Du kriechen?\n");
+     else if(this_player()->QueryAttribute(A_DEX)>10 ||
+             member(holding_root,this_player())) {
+       write("Du kriechst mit Muehe heraus.\n");
+       this_player()->move((XXXROOM+"draussen"), M_GO, 0,
+                           "kriecht mit Muehe aus der Grube",
+                           "kriecht aus einer Grube");
+       return 1;
+     } else
+       write("Du bist zu ungeschickt, halt Dich irgendwo fest.\n");
+       return 1;
+     }
+     return 0;
+   }
 
-         } return 0;
 
-      } // (ob sich der Aufwand fuer diese Beispielsyntax lohnt ist
-      fraglich)
+Problem 2: mehrere Regeln aufgrund von optionalen Parametern
+------------------------------------------------------------
 
-   ## Problem 2: mehrere Regeln, weil optionale Parameter ##
-      // Manchmal will man optionale Parameter erlauben, die aber eine
-      // Wirkung zeigen sollen:
-      AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart,
+   Manchmal will man optionale Parameter erlauben, die aber eine
+   Wirkung zeigen sollen. Hierbei ist die Reihenfolge der AddCmd()-
+   Anweisungen und ggf. deren Aufbau entscheidend.
 
-         "Was oder wen willst du @verben?|" "Wie willst du @WEN2
-         schlagen?");
+   AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart,
+          "Was oder wen willst du @verben?|"
+          "Wie willst du @WEN2 schlagen?");
+   AddCmd("schlag|schlage&@ID",#'action_schlag,
+          "Was oder wen willst du @verben?");
 
-      AddCmd("schlag|schlage&@ID",#'action_schlag,
-         "Was oder wen willst du @verben?");
+   Da juengere AddCmd aelteren vorgehen, wird die komplexere Regel samt
+   ihrer Fehlermeldung nie ausgewertet, da ein "schlag ball hart" auch
+   die zweite Regel triggert.
 
-      // Da juengere AddCmd aelteren vorgehen, wird die komplexere
-      Regel samt // ihrer Fehlermeldung nie ausgewertet, da ein
-      "schlag ball hart" auch // die zweite Regel triggert.
+   Anders herum:
 
-      // anders herum: AddCmd("schlag|schlage&@ID",#'action_schlag,
+   AddCmd("schlag|schlage&@ID",#'action_schlag,
+          "Was oder wen willst du @verben?");
+   AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart,
+          "Was oder wen willst du @verben?|"
+          "Wie willst du @WEN2 schlagen?");
 
-         "Was oder wen willst du @verben?");
+   Jetzt wird die komplexere Regel zuerst ueberprueft und triggert
+   auch die richtige Funktion.
+   Leider kommt die Fehlermeldung nie zum Tragen, denn was durch Regel 2
+   durchfaellt, triggert entweder Regel 1 oder faellt auch durch Regel 1
+   durch und ueberschreibt dabei die Meldung.
 
-      AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart,
-         "Was oder wen willst du @verben?|" "Wie willst du @WEN2
-         schlagen?");
+   AddCmd("schlag|schlage&@ID",#'action_schlag,
+          "Was oder wen willst du wie @verben?");
+   AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart);
 
-      // Jetzt wird die komplexere Regel zuerst ueberprueft und
-      triggert // auch die richtige Funktion. // Leider kommt die
-      Fehlermeldung nie zum Tragen, denn was durch Regel 2 //
-      durchfaellt, triggert entweder Regel 1 oder faellt auch durch
-      Regel 1 // durch und ueberschreibt dabei die Meldung.
+   Das ist zwar auch nur fast perfekt, besser wird es aber nicht.
 
-      AddCmd("schlag|schlage&@ID",#'action_schlag,
-         "Was oder wen willst du wie @verben?");
-
-      AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart);
-
-      // Fast perfekt. Besser wird es nicht.
-
-      --- Ende Komplexbeispiel mehrere Regeln ---
-
-Letzte Aenderung: 22.12.2016, Bugfix
+Letzte Aenderung: 20.11.2019, Arathorn
