blob: 8b0f778c2e473afebe30db4e4fea3c37ba409cb4 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001add_action(E)
2FUNKTION:
3 void add_action(string fun, string cmd)
4 void add_action(string fun, string cmd, int flag)
5
6ARGUMENTE:
7 fun
8 gerufene Methode
9 cmd
10 ausloesendes Verb
11 flag
12 Flag fuer unscharfe Interpretation
13
14BESCHREIBUNG:
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
56BEMERKUNGEN:
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
66BEISPIELE:
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
136GESCHICHTE
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
141SIEHE 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
14924. Maerz 2004 Gloinson@MG