| add_action(E) |
| FUNKTION: |
| void add_action(string fun, string cmd) |
| void add_action(string fun, string cmd, int flag) |
| |
| ARGUMENTE: |
| fun |
| gerufene Methode |
| cmd |
| ausloesendes Verb |
| flag |
| Flag fuer unscharfe Interpretation |
| |
| BESCHREIBUNG: |
| Generell: Das Verhalten dieser efun wird durch AddCmd aus |
| /std/thing/commands.c komfortabler widergespiegelt. |
| Darauf sollte man zurueckgreifen. |
| |
| Legt fuer "cmd" (ein Kommandoverb) eine im entsprechenden Objekt |
| zu rufende Methode fest. |
| |
| Diese Methode bekommt die Argumente als String uebergeben und |
| muss 0 (fuer einen Fehler) oder 1 (fuer Erfolg) zurueckgeben. |
| |
| Der Parser durchsucht bei einer Spielereingabe die Liste der |
| eingetragenen Kommandos nach passenden Kommandos und ruft die |
| zugehoerigen Methoden in den Objekten bis eine der Methoden |
| 1 zurueckgibt oder die Liste durchlaufen wurde. In dem Fall |
| kommt die Fehlermeldung (notify_fail()) zum Einsatz. |
| |
| Mit Werten != 0 fuer "flag" legt man eine unscharfe Auswertung |
| fest, im Beispiel: Die Methode "action_fun" bei einem |
| add_action("action_fun", "hops", 1); |
| wird sowohl beim Kommando "hops" als auch bei Kommandos wie |
| "hopse", "hopseblub", ... gerufen werden. |
| Dieses Flag sollte vorsichtig verwendet werden. |
| |
| Es gibt drei moegliche Verhaltensweise, die per "flag" eingeschaltet |
| werden koennen: |
| Wenn das Argument <flag> AA_SHORT (d.h. 1) ist, koennen Argumente von |
| cmd ohne einen Leerschlag an cmd angehaengt sein. An die Funktion fun |
| werden alle Zeichen nach dem ersten Leerschlag als Argument |
| uebergeben. |
| |
| Wenn <flag> AA_NOSPACE (d.h. 2) ist, koennen die Argumente wiederum |
| ohne Leerschlag ans Verb angehaengt sein. Im Unterschied zu AA_SHORT |
| werden alle Zeichen nach dem Verb als Argument an die Funktion |
| uebergeben. Die Zeichen, welche nicht durch einen Leerschlag vom |
| Verb getrennt sind, werden ZUSAETZLICH von query_verb() zurueck |
| gegeben. |
| |
| Wenn <flag> AA_IMM_ARGS (3) ist, werden alle Zeichen nach dem Verb |
| als Argument uebergeben, nicht aber von query_verb() beruecksichtigt. |
| |
| |
| BEMERKUNGEN: |
| (1) add_action() sollte immer innerhalb von init() benutzt werden |
| (2) das definierende Objekt muss im inventory des Spielers oder |
| environment() des kommandogebenden Lebewesens sein |
| (3) im init() spaeter eingetragene Kommandos oder spaeter hinzu- |
| kommende Objekte werden bei der Kommandoauswertung VOR den |
| alten beruecksichtigt |
| (Daher bewegt sich das Xtool der Magier regelmaessing neu in |
| das Inventory, um immer "erstes" Objekt zu sein.) |
| |
| BEISPIELE: |
| // ein Kommando in einem Schirm |
| void init() { |
| ::init(); |
| add_action("action_oeffne", "oeffne"); |
| } |
| |
| int action_oeffne(string str) { |
| if(stringp(str) && id(str)) // Argument da und bin ich gemeint? |
| write("Du oeffnest den Schirm.\n"); |
| say(break_string(this_player()->Name(WER)+" oeffnet einen Schirm.",78)); |
| return 1; |
| } |
| notify_fail("Was willst Du oeffnen?\n"); |
| return 0; |
| } |
| |
| // frueher beliebt um Spieler lahmzulegen, da es _alle_ Kommandos |
| // triggert -> siehe heute jedoch dafuer eher P_DISABLE_COMMANDS |
| // Achtung: siehe Implikation von (3) |
| add_action("action_nothing", "",1 ); |
| ... |
| int action_nothing(string str) { |
| write("Dir sind die Haende gebunden.\n"); |
| return 1; |
| } |
| |
| Beispiele fuer die Verwendung des Argumentes "flag": |
| add_action("disfunc", "disconnect", AA_NOSPACE); |
| |
| Die Funktion disfunc() wird aufgerufen, wenn der Spieler "disconnect" |
| oder eine Abkuerzung davon (zum Beispiel "di" oder "discon") eingibt. |
| Laengere Worte (zum Beispiel "disconnecting") werden NICHT erkannt. |
| Um rauszufinden, was der Spieler tatsaechlich eingegeben hat, muss |
| query_verb() aufgerufen werden. |
| |
| add_action("fun", "cmd"); |
| add_action("fun", "scmd", AA_SHORT); |
| add_action("fun", "ncmd", AA_NOSPACE); |
| add_action("fun", "icmd", AA_IMM_ARGS); |
| |
| Die folgende Tabelle zeigt, was die oben aufgefuehrten Kommandos bzw. |
| <flag> fuer Werte an query_verb() und als Argumente an die Funktion |
| fun uebergeben: |
| |-------------------|--------------|----------------------------| |
| | Eingabe | query_verb() | Argument der Funktion fun | |
| |-------------------|--------------|----------------------------| |
| | "cmd" | "cmd" | 0 | |
| | "cmd bla fasel" | "cmd" | "bla fasel" | |
| |-------------------|--------------|----------------------------| |
| | "scmd" | "scmd" | 0 | |
| | "scmd bla" | "scmd" | "bla" | |
| | "scmdbla" | "scmdbla" | 0 | |
| | "scmd bla fasel" | "scmd" | "bla fasel" | |
| | "scmdbla fasel" | "scmdbla" | "fasel" | |
| |-------------------|--------------|----------------------------| |
| | "ncmd" | "ncmd" | 0 | |
| | "ncmd bla" | "ncmd" | " bla" | |
| | "ncmdbla" | "ncmdbla" | "bla" | |
| | "ncmd bla fasel" | "ncmd" | " bla fasel" | |
| | "ncmdbla fasel" | "ncmdbla" | "bla fasel" | |
| |-------------------|--------------|----------------------------| |
| | "icmd" | "icmd" | 0 | |
| | "icmd bla" | "icmd" | " bla" | |
| | "icmdbla" | "icmd" | "bla" | |
| | "icmd bla fasel" | "icmd" | " bla fasel" | |
| | "icmdbla fasel" | "icmd" | "bla fasel" | |
| |-------------------|--------------|----------------------------| |
| |
| |
| GESCHICHTE |
| Das Argument <flag> < 0 wird seit 3.2@127 unterstuetzt, aber erst ab |
| LDMud 3.2.8 richtig implementiert. LDMud 3.2.9 fuehrte das AA_IMM_ARGS |
| Flag ein. Ab LDMud 3.5 kann man Closures als Funktionen uebergeben. |
| |
| SIEHE AUCH: |
| remove_action(E), init(E), enable_commands(E) |
| Fehlermeldung: notify_fail(E), _notify_fail(E) |
| Argumentstring: query_verb(E), _unparsed_args(L) |
| obsolet: add_verb(E), add_xverb(E) |
| alternativ: AddAction(L), AddCmd(L) |
| P_DISABLE_COMMANDS |
| |
| 24. Maerz 2004 Gloinson@MG |