Doku-Update: AddCmd-Beispiele neu strukturiert
Change-Id: Ib53e87285146fb1fe8da959f9915344068df77b0
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