MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | add_action(E) |
| 2 | FUNKTION: |
| 3 | void add_action(string fun, string cmd) |
| 4 | void add_action(string fun, string cmd, int flag) |
| 5 | |
| 6 | ARGUMENTE: |
| 7 | fun |
| 8 | gerufene Methode |
| 9 | cmd |
| 10 | ausloesendes Verb |
| 11 | flag |
| 12 | Flag fuer unscharfe Interpretation |
| 13 | |
| 14 | BESCHREIBUNG: |
| 15 | Generell: Das Verhalten dieser efun wird durch AddCmd aus |
| 16 | /std/thing/commands.c komfortabler widergespiegelt. |
| 17 | Darauf sollte man zurueckgreifen. |
| 18 | |
| 19 | Legt fuer "cmd" (ein Kommandoverb) eine im entsprechenden Objekt |
| 20 | zu rufende Methode fest. |
| 21 | |
| 22 | Diese Methode bekommt die Argumente als String uebergeben und |
| 23 | muss 0 (fuer einen Fehler) oder 1 (fuer Erfolg) zurueckgeben. |
| 24 | |
| 25 | Der Parser durchsucht bei einer Spielereingabe die Liste der |
| 26 | eingetragenen Kommandos nach passenden Kommandos und ruft die |
| 27 | zugehoerigen Methoden in den Objekten bis eine der Methoden |
| 28 | 1 zurueckgibt oder die Liste durchlaufen wurde. In dem Fall |
| 29 | kommt die Fehlermeldung (notify_fail()) zum Einsatz. |
| 30 | |
| 31 | Mit Werten != 0 fuer "flag" legt man eine unscharfe Auswertung |
| 32 | fest, im Beispiel: Die Methode "action_fun" bei einem |
| 33 | add_action("action_fun", "hops", 1); |
| 34 | wird sowohl beim Kommando "hops" als auch bei Kommandos wie |
| 35 | "hopse", "hopseblub", ... gerufen werden. |
| 36 | Dieses Flag sollte vorsichtig verwendet werden. |
| 37 | |
| 38 | Es gibt drei moegliche Verhaltensweise, die per "flag" eingeschaltet |
| 39 | werden koennen: |
| 40 | Wenn das Argument <flag> AA_SHORT (d.h. 1) ist, koennen Argumente von |
| 41 | cmd ohne einen Leerschlag an cmd angehaengt sein. An die Funktion fun |
| 42 | werden alle Zeichen nach dem ersten Leerschlag als Argument |
| 43 | uebergeben. |
| 44 | |
| 45 | Wenn <flag> AA_NOSPACE (d.h. 2) ist, koennen die Argumente wiederum |
| 46 | ohne Leerschlag ans Verb angehaengt sein. Im Unterschied zu AA_SHORT |
| 47 | werden alle Zeichen nach dem Verb als Argument an die Funktion |
| 48 | uebergeben. Die Zeichen, welche nicht durch einen Leerschlag vom |
| 49 | Verb getrennt sind, werden ZUSAETZLICH von query_verb() zurueck |
| 50 | gegeben. |
| 51 | |
| 52 | Wenn <flag> AA_IMM_ARGS (3) ist, werden alle Zeichen nach dem Verb |
| 53 | als Argument uebergeben, nicht aber von query_verb() beruecksichtigt. |
| 54 | |
| 55 | |
| 56 | BEMERKUNGEN: |
| 57 | (1) add_action() sollte immer innerhalb von init() benutzt werden |
| 58 | (2) das definierende Objekt muss im inventory des Spielers oder |
| 59 | environment() des kommandogebenden Lebewesens sein |
| 60 | (3) im init() spaeter eingetragene Kommandos oder spaeter hinzu- |
| 61 | kommende Objekte werden bei der Kommandoauswertung VOR den |
| 62 | alten beruecksichtigt |
| 63 | (Daher bewegt sich das Xtool der Magier regelmaessing neu in |
| 64 | das Inventory, um immer "erstes" Objekt zu sein.) |
| 65 | |
| 66 | BEISPIELE: |
| 67 | // ein Kommando in einem Schirm |
| 68 | void init() { |
| 69 | ::init(); |
| 70 | add_action("action_oeffne", "oeffne"); |
| 71 | } |
| 72 | |
| 73 | int action_oeffne(string str) { |
| 74 | if(stringp(str) && id(str)) // Argument da und bin ich gemeint? |
| 75 | write("Du oeffnest den Schirm.\n"); |
| 76 | say(break_string(this_player()->Name(WER)+" oeffnet einen Schirm.",78)); |
| 77 | return 1; |
| 78 | } |
| 79 | notify_fail("Was willst Du oeffnen?\n"); |
| 80 | return 0; |
| 81 | } |
| 82 | |
| 83 | // frueher beliebt um Spieler lahmzulegen, da es _alle_ Kommandos |
| 84 | // triggert -> siehe heute jedoch dafuer eher P_DISABLE_COMMANDS |
| 85 | // Achtung: siehe Implikation von (3) |
| 86 | add_action("action_nothing", "",1 ); |
| 87 | ... |
| 88 | int action_nothing(string str) { |
| 89 | write("Dir sind die Haende gebunden.\n"); |
| 90 | return 1; |
| 91 | } |
| 92 | |
| 93 | Beispiele fuer die Verwendung des Argumentes "flag": |
| 94 | add_action("disfunc", "disconnect", AA_NOSPACE); |
| 95 | |
| 96 | Die Funktion disfunc() wird aufgerufen, wenn der Spieler "disconnect" |
| 97 | oder eine Abkuerzung davon (zum Beispiel "di" oder "discon") eingibt. |
| 98 | Laengere Worte (zum Beispiel "disconnecting") werden NICHT erkannt. |
| 99 | Um rauszufinden, was der Spieler tatsaechlich eingegeben hat, muss |
| 100 | query_verb() aufgerufen werden. |
| 101 | |
| 102 | add_action("fun", "cmd"); |
| 103 | add_action("fun", "scmd", AA_SHORT); |
| 104 | add_action("fun", "ncmd", AA_NOSPACE); |
| 105 | add_action("fun", "icmd", AA_IMM_ARGS); |
| 106 | |
| 107 | Die folgende Tabelle zeigt, was die oben aufgefuehrten Kommandos bzw. |
| 108 | <flag> fuer Werte an query_verb() und als Argumente an die Funktion |
| 109 | fun uebergeben: |
| 110 | |-------------------|--------------|----------------------------| |
| 111 | | Eingabe | query_verb() | Argument der Funktion fun | |
| 112 | |-------------------|--------------|----------------------------| |
| 113 | | "cmd" | "cmd" | 0 | |
| 114 | | "cmd bla fasel" | "cmd" | "bla fasel" | |
| 115 | |-------------------|--------------|----------------------------| |
| 116 | | "scmd" | "scmd" | 0 | |
| 117 | | "scmd bla" | "scmd" | "bla" | |
| 118 | | "scmdbla" | "scmdbla" | 0 | |
| 119 | | "scmd bla fasel" | "scmd" | "bla fasel" | |
| 120 | | "scmdbla fasel" | "scmdbla" | "fasel" | |
| 121 | |-------------------|--------------|----------------------------| |
| 122 | | "ncmd" | "ncmd" | 0 | |
| 123 | | "ncmd bla" | "ncmd" | " bla" | |
| 124 | | "ncmdbla" | "ncmdbla" | "bla" | |
| 125 | | "ncmd bla fasel" | "ncmd" | " bla fasel" | |
| 126 | | "ncmdbla fasel" | "ncmdbla" | "bla fasel" | |
| 127 | |-------------------|--------------|----------------------------| |
| 128 | | "icmd" | "icmd" | 0 | |
| 129 | | "icmd bla" | "icmd" | " bla" | |
| 130 | | "icmdbla" | "icmd" | "bla" | |
| 131 | | "icmd bla fasel" | "icmd" | " bla fasel" | |
| 132 | | "icmdbla fasel" | "icmd" | "bla fasel" | |
| 133 | |-------------------|--------------|----------------------------| |
| 134 | |
| 135 | |
| 136 | GESCHICHTE |
| 137 | Das Argument <flag> < 0 wird seit 3.2@127 unterstuetzt, aber erst ab |
| 138 | LDMud 3.2.8 richtig implementiert. LDMud 3.2.9 fuehrte das AA_IMM_ARGS |
| 139 | Flag ein. Ab LDMud 3.5 kann man Closures als Funktionen uebergeben. |
| 140 | |
| 141 | SIEHE AUCH: |
| 142 | remove_action(E), init(E), enable_commands(E) |
| 143 | Fehlermeldung: notify_fail(E), _notify_fail(E) |
| 144 | Argumentstring: query_verb(E), _unparsed_args(L) |
| 145 | obsolet: add_verb(E), add_xverb(E) |
| 146 | alternativ: AddAction(L), AddCmd(L) |
| 147 | P_DISABLE_COMMANDS |
| 148 | |
| 149 | 24. Maerz 2004 Gloinson@MG |