blob: 8b0f778c2e473afebe30db4e4fea3c37ba409cb4 [file] [log] [blame]
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