AddCmd_bsp()
============

ADDCMD() - BEISPIELE
--------------------
::

FUNKTION
--------
::

    varargs void AddCmd(mixed cmd, mixed func, mixed flag);

BEMERKUNGEN
-----------
::

    Die hier aufgefuehrten Komplexbeispiele sind zum Verstaendnis gedacht,
    daher fuehren sie oft Alternativen auf. Die letzte Variante ist dann
    jeweils diejenige, welche am leichtesten das Problem loesen koennte.
    Falls die einem zu komplex ist, hilft vielleicht die vorletzte.

BEISPIELE
---------
::

    // 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
    }

    // SIMPEL .. weitere Beispiele
    AddCmd(({"kletter","klettere"}),"action_klettern" );
    AddCmd(({"renn","renne"}),#'action_rennen);

    // 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
    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 (!)
    AddCmd("kletter","fun_klettern",1);

    // FALSCH: sehr schlecht, kein Imperativ verwendet
    // ausserdem sollte man fuer solche Syntaxen AddReadDetail benutzen
    AddCmd("lese","eval_lesen");

    // 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,
                          "springt unelegant vom Baum","faellt vom Baum");
      this_player()->Defend(random(100),({DT_BLUDGEON}),([SP_RECURSIVE:1]),
                            this_object());
      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
    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 :)
       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

 ## 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) {
     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))
      notify_fail("Willst Du in irgendwas ein Loch bohren?\n");
     else {
      ...
      return 1;
     }
     return 0;
    }

 ## Variante 2, MIT REGEL ##
    // das gleiche in etwa mal als einfache Regel
    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;
    }

 ## 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,
           "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 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,
           "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 ##
    // 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.");

   --- Ende Komplexbeispiel Regeln mit Fehlermeldungen ---

## 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;
    }

   --- 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.

 ## 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|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?");

    // oder man versucht eine bessere Regel zu schaffen, was hier durch
    // die Moeglichkeit von zwei oder drei Parameter unmoeglich ist

    ## 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",
           #'result_kriech,
           "Wohin willst Du kriechen?");
    ...
    static 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;
    }
    // (ob sich der Aufwand fuer diese Beispielsyntax lohnt ist fraglich)

 ## 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,
           "Was oder wen willst du @verben?|"
           "Wie willst du @WEN2 schlagen?");
    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.

    // anders herum:
    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?");

    // 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",#'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

