blob: f3d5e03edbbed9be19b1bcbd20b9e23c309a86e9 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001ADDCMD() - BEISPIELE
Arathorn655333e2019-11-26 19:20:27 +01002********************
Zesstra953f9972017-02-18 15:37:36 +01003
4
MG Mud User88f12472016-06-24 23:31:02 +02005FUNKTION
Zesstra953f9972017-02-18 15:37:36 +01006========
7
8 varargs void AddCmd(mixed cmd, mixed func, mixed flag);
9
MG Mud User88f12472016-06-24 23:31:02 +020010
11BEMERKUNGEN
Zesstra953f9972017-02-18 15:37:36 +010012===========
13
14 Die hier aufgefuehrten Komplexbeispiele sind zum Verstaendnis gedacht,
15 daher fuehren sie oft Alternativen auf. Die letzte Variante ist dann
16 jeweils diejenige, welche am leichtesten das Problem loesen koennte.
17 Falls die einem zu komplex ist, hilft vielleicht die vorletzte.
18
MG Mud User88f12472016-06-24 23:31:02 +020019
20BEISPIELE
Zesstra953f9972017-02-18 15:37:36 +010021=========
22
Arathorn655333e2019-11-26 19:20:27 +010023
24Einfache Beispiele
25------------------
26
271. SIMPEL: ganz simpel, beinahe wie add_action()
28
Zesstra953f9972017-02-18 15:37:36 +010029 AddCmd("befiehl","action_befehlen");
Arathorn655333e2019-11-26 19:20:27 +010030 // ...
Zesstra953f9972017-02-18 15:37:36 +010031 int action_befehlen(string str) {
Arathorn655333e2019-11-26 19:20:27 +010032 if(!str || !strlen(str))
33 // Fehlermeldung, falls gar keine Funktion 1 dafuer zurueckgibt
34 notify_fail("Was willst du befehlen?!\n");
35 else {
36 write("Du befiehlst \""+str+"\", und alle folgen!\n");
37 say(TP->Name(WER)+" befiehlt \""+str+"\", und du folgst!\n");
38 return 1; // ERFOLG - Abbruch der Kommandoauswertung
39 }
40 return 0; // MISSERFOLG - Fehlermeldung oben gesetzt
Zesstra953f9972017-02-18 15:37:36 +010041 }
MG Mud User88f12472016-06-24 23:31:02 +020042
Arathorn655333e2019-11-26 19:20:27 +0100432. SIMPEL .. weitere Beispiele
44
Zesstra953f9972017-02-18 15:37:36 +010045 AddCmd(({"kletter","klettere"}),"action_klettern" );
46 AddCmd(({"renn","renne"}),#'action_rennen);
MG Mud User88f12472016-06-24 23:31:02 +020047
Arathorn655333e2019-11-26 19:20:27 +0100483. REGELN: eine komplexere Regel
49
Zesstra953f9972017-02-18 15:37:36 +010050 AddCmd("loesch|loesche|ersticke&feuer|brand|flammen&decke|wolldecke",
51 "action_loeschen",
52 "Was willst du loeschen?|Womit willst du loeschen?");
MG Mud User88f12472016-06-24 23:31:02 +020053
Arathorn655333e2019-11-26 19:20:27 +0100544. REGELN: mit Platzhaltern im Fehlerstring
55
Zesstra953f9972017-02-18 15:37:36 +010056 AddCmd("spring|springe|huepf|huepfe&von|vom&baum|ast|eiche",
57 #'action_huepfe,
58 "Willst du von etwas @verben?|Von wo willst du @verben?");
MG Mud User88f12472016-06-24 23:31:02 +020059
Zesstrae959e722025-07-09 22:11:16 +0200605. SCHLECHT: eine unscharfe Regel - sie sollten eine Ausnahme sein (!)
Arathorn655333e2019-11-26 19:20:27 +010061
Zesstra953f9972017-02-18 15:37:36 +010062 AddCmd("kletter","fun_klettern",1);
MG Mud User88f12472016-06-24 23:31:02 +020063
Arathorn655333e2019-11-26 19:20:27 +0100646. FALSCH: sehr schlecht, kein Imperativ verwendet
65
Zesstra953f9972017-02-18 15:37:36 +010066 AddCmd("lese","eval_lesen");
MG Mud User88f12472016-06-24 23:31:02 +020067
Arathorn655333e2019-11-26 19:20:27 +010068 ausserdem sollte man fuer Lese-Syntaxen AddReadDetail benutzen
69
707. SIMPLE REGEL
71
Zesstra953f9972017-02-18 15:37:36 +010072 static int action_jump(string str); // Prototype (wegen closure)
Arathorn655333e2019-11-26 19:20:27 +010073 // ...
Zesstra953f9972017-02-18 15:37:36 +010074 AddCmd("spring|springe|huepf|huepfe&von&baum|ast",#'action_jump,
75 "Willst Du von etwas @verben?|Wovon willst Du @verben?");
Arathorn655333e2019-11-26 19:20:27 +010076 // ...
Zesstra953f9972017-02-18 15:37:36 +010077 static int action_jump(string str) {
78 write(break_string("Du springst vom Baum und kommst hart auf!",78));
79 this_player()->move((XXXROOM+"boden"), M_GO, 0,
80 "springt unelegant vom Baum","faellt vom Baum");
81 this_player()->Defend(random(100),({DT_BLUDGEON}),([SP_RECURSIVE:1]),
82 this_object());
83 return 1;
84 }
MG Mud User88f12472016-06-24 23:31:02 +020085
Arathorn655333e2019-11-26 19:20:27 +0100868. SIMPLE REGEL OHNE METHODE
87
88 mit Regeln kann man auch Aktivitaeten im Raum erlauben, ohne eine
89 Funktion aufrufen zu muessen: die letzte Regel ist fuer Spieler
90 unmoeglich zu erfuellen, die dazugehoerige Fehlermeldung wird mit
91 dem ^ (write-Flag) versehen und entsprechend an den Spieler (und
92 den Raum (hinter dem ^)) ausgegeben
93
Zesstra953f9972017-02-18 15:37:36 +010094 AddCmd("spring|springe&herunter|runter&\n\bimpossible",0,
95 "Wohin oder wovon willst Du springen?|"
96 "Du springst vom Baum und kommst hart auf.^"
97 "@WER1 springt vom Baum und kommt hart auf.");
MG Mud User88f12472016-06-24 23:31:02 +020098
MG Mud User88f12472016-06-24 23:31:02 +020099
Arathorn655333e2019-11-26 19:20:27 +0100100Komplexbeispiel: Regeln mit Fehlermeldungen
101-------------------------------------------
MG Mud User88f12472016-06-24 23:31:02 +0200102
MG Mud User88f12472016-06-24 23:31:02 +0200103
Arathorn655333e2019-11-26 19:20:27 +0100104Variante 1a, OHNE REGELN
105~~~~~~~~~~~~~~~~~~~~~~~~
MG Mud User88f12472016-06-24 23:31:02 +0200106
Arathorn655333e2019-11-26 19:20:27 +0100107 Wenn man keine Regeln verwendet, muss man die Eingabe selbst
108 auswerten.
MG Mud User88f12472016-06-24 23:31:02 +0200109
Arathorn655333e2019-11-26 19:20:27 +0100110 AddCmd(({"bohr","bohre"}),#'action_bohren);
111 // ...
112 private int action_bohren(string str) {
113 string *tmp;
114 notify_fail("Wo willst (etwas) Du bohren?\n");
115 if(!str) return 0; // Tja, keine Argumente ...
116 tmp=explode(str," "); // nach " " in Argument-Array aufspalten
117 if((i=member(tmp,"loch"))>=0) { // aha, ab jetzt uebernehmen wir :)
118 if((j=member(tmp[(i+1)..],"in"))<0 &&
119 (j=member(tmp[(i+1)..],"durch"))<0)
120 write("Willst Du das Loch in etwas bohren?\n");
121 else if((i=member(tmp[(j+1)..],"boden"))<0 &&
122 (i=member(tmp[(j+1)..],"erde"))<0)
123 write("In/Durch was willst du das Loch bohren?\n");
124 else {
125 write("Du bohrst ein Loch in den Boden.\n");
126 say(this_player()->Name(WER)+" bohrt ein Loch in den Boden.\n");
127 }
128 return 1; // "bohre loch" war so eindeutig, dass nur diese
Zesstra953f9972017-02-18 15:37:36 +0100129 // Methode gemeint sein konnte, also brechen wir die
130 // weitere Auswertung auf jeden Fall ab (und geben
131 // eine write-Fehlermeldung)
Arathorn655333e2019-11-26 19:20:27 +0100132 } // end if(..."loch")
133 return 0; // "bohre" allein muss nicht diese Methode meinen,
134 // also nur obige notify_fail()-Meldung, falls
135 // sich nach dieser Methode gar keine sonst
136 // angesprochen fuehlt
137 } // end fun
Zesstra953f9972017-02-18 15:37:36 +0100138
Zesstra953f9972017-02-18 15:37:36 +0100139
Arathorn655333e2019-11-26 19:20:27 +0100140Variante 1b, OHNE REGELN, Alternative
141~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100142
Arathorn655333e2019-11-26 19:20:27 +0100143 prinzipiell koennte die Methode action_bohren() auch so aussehen,
144 ist aber nicht ganz so flexibel:
Zesstra953f9972017-02-18 15:37:36 +0100145
Arathorn655333e2019-11-26 19:20:27 +0100146 private int action_bohren(string str) {
147 string unused;
148 if(!str || (sprintf(str,"loch in erde%s", unused)!=1 &&
149 sprintf(str,"loch durch erde%s", unused)!=1 &&
150 sprintf(str,"loch in boden%s", unused)!=1 &&
151 sprintf(str,"loch durch boden%s", unused)!=1))
152 notify_fail("Willst Du in irgendwas ein Loch bohren?\n");
153 else {
154 // ...
155 return 1;
156 }
157 return 0;
158 }
Zesstra953f9972017-02-18 15:37:36 +0100159
Zesstra953f9972017-02-18 15:37:36 +0100160
Arathorn655333e2019-11-26 19:20:27 +0100161Variante 2, MIT REGEL
162~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100163
Arathorn655333e2019-11-26 19:20:27 +0100164 das gleiche in etwa mal als einfache Regel
Zesstra953f9972017-02-18 15:37:36 +0100165
Arathorn655333e2019-11-26 19:20:27 +0100166 AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
167 "Was willst du (wohin) bohren?|"
168 "Willst du das Loch in etwas bohren?|"
169 "Wohin willst du das Loch bohren?");
170 // ...
171 private int action_bohren(string str, mixed *param) {
172 write("Du bohrst ein Loch in den Boden.\n");
173 say(this_player()->Name(WER)+" bohrt ein Loch in den Boden.\n");
174 // ...
175 return 1;
176 }
Zesstra953f9972017-02-18 15:37:36 +0100177
Zesstra953f9972017-02-18 15:37:36 +0100178
Arathorn655333e2019-11-26 19:20:27 +0100179Variante 3, MIT REGEL UND FEHLERMELDUNG
180~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100181
Arathorn655333e2019-11-26 19:20:27 +0100182 und nun mit Fehlermeldungen mit Ersetzungen, so dass wir mehr auf
183 die Eingaben des Spielers eingehen
Zesstra953f9972017-02-18 15:37:36 +0100184
Arathorn655333e2019-11-26 19:20:27 +0100185 AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
186 "Was willst du (wohin) @verben?|"
187 "Willst du das Loch in etwas @verben?|"
188 "@WER3 was willst du das Loch @verben?");
189 // ...
190 private int action_bohren(string str, mixed *param) // ...
Zesstra953f9972017-02-18 15:37:36 +0100191
Zesstra953f9972017-02-18 15:37:36 +0100192
Arathorn655333e2019-11-26 19:20:27 +0100193Variante 4, MIT REGEL, FEHLERMELDUNG UND RETURN 1
194~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100195
Arathorn655333e2019-11-26 19:20:27 +0100196 In Variante 1 kam sinnvollerweise sehr frueh der Abbruch mit
197 "return 1;" und mit Ausgabe von write-Fehlermeldungen, das koennen
198 wir auch direkt und ohne eigene Methode.
Zesstra953f9972017-02-18 15:37:36 +0100199
Arathorn655333e2019-11-26 19:20:27 +0100200 AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
201 "Was willst du (wohin) @verben?|"
202 "Willst du das Loch in etwas @verben?^|"
203 "@WER3 was willst du das Loch @verben?^");
204 // ...
205 private int action_bohren(string str, mixed *param) // ...
Zesstra953f9972017-02-18 15:37:36 +0100206
Zesstra953f9972017-02-18 15:37:36 +0100207
Arathorn655333e2019-11-26 19:20:27 +0100208Variante 5, MIT REGEL, FEHLERMELDUNG, RETURN 1, OHNE FUN
209~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100210
Arathorn655333e2019-11-26 19:20:27 +0100211 // und falls in action_bohren() nichts ausser Ausgaben passiert, koennen
212 // wir uns die auch ganz sparen indem wir eine nichterfuellbare Regel
213 // samt Fehlermeldung bauen
214 AddCmd("bohr|bohre&loch&in|durch&erde|boden&\nimpossible",0,
215 "Was willst du (wohin) @verben?|"
216 "Willst du das Loch in etwas @verben?^|"
217 "@WER3 was willst du das Loch @verben?^|"
218 "Du @verbst ein Loch @WER3 den Boden.^@WER1 @verbt "
219 "ein Loch @WER3 den Boden.");
Zesstra953f9972017-02-18 15:37:36 +0100220
Zesstra953f9972017-02-18 15:37:36 +0100221
Arathorn655333e2019-11-26 19:20:27 +0100222Komplexbeispiel: Spezialregeln @PRESENT und @ID
223-----------------------------------------------
Zesstra953f9972017-02-18 15:37:36 +0100224
Zesstra953f9972017-02-18 15:37:36 +0100225
Arathorn655333e2019-11-26 19:20:27 +0100226Variante 1, OHNE REGELN
227~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100228
Arathorn655333e2019-11-26 19:20:27 +0100229 Oft agieren Kommandos auf Objekten im Raum, diese muessen dabei per
230 present() identifiziert werden: Beispiel ist ein Geldautomat
231 (Hinweis: dieses Beispiel dient der Illustration, die
232 Funktionalitaet an sich sollte man besser mit einem Container mit
233 PreventInsert() erzeugen.)
MG Mud User88f12472016-06-24 23:31:02 +0200234
Arathorn655333e2019-11-26 19:20:27 +0100235 AddCmd(({"stopf","stopfe"}),#'action_stopf);
236 // ...
237 private int action_stopf(string str) {
238 string was, unused;
239 if(str && (sprintf("%s in automat%s", was, unused)==2 ||
240 sprintf("%s in geldautomat%s", was, unused)==2 ||
241 sprintf("%s in bankomat%s", was, unused)==2) {
242 object o = present(was, this_player());
243 if(o) {
244 if(o->QueryProp(...)) {
245 write(break_string(
246 "Du stopfst "+o->name(WEN,1)+" in den Automaten.",78));
247 say(...);
248 } else {
249 write(break_string(
250 "Du versuchst "+o->name(WEN,1)+" in den Automaten zu stopfen, "
251 "aber "+o->QueryPronoun(WER)+" passt nicht hinein.",78));
252 say(...);
Zesstra953f9972017-02-18 15:37:36 +0100253 }
Arathorn655333e2019-11-26 19:20:27 +0100254 } else {
255 write("Was willst du in den Automaten stopfen?\n");
256 say(....);
257 }
258 return 1;
259 }
260 notify_fail("Was willst du wohin stecken?\n");
261 return 0;
262 }
Zesstra953f9972017-02-18 15:37:36 +0100263
MG Mud User88f12472016-06-24 23:31:02 +0200264
Arathorn655333e2019-11-26 19:20:27 +0100265Variante 2, MIT REGEL
266~~~~~~~~~~~~~~~~~~~~~
MG Mud User88f12472016-06-24 23:31:02 +0200267
Arathorn655333e2019-11-26 19:20:27 +0100268 einerseits koennen wir auf diese Weise das Finden von Objekten in
269 Inv und Env in die AddCmd()-Regel integrieren und uns andererseits
270 das Aufzaehlen aller IDs des Automaten ersparen.
MG Mud User88f12472016-06-24 23:31:02 +0200271
Arathorn655333e2019-11-26 19:20:27 +0100272 Wie immer werden die gefundenen Matches als Parameterarray an die
273 angegebene Methode uebergeben. Das Array enthaelt die mit @PRESENT
274 und @ID gefundenen Treffer praktischerweise als Objekte.
MG Mud User88f12472016-06-24 23:31:02 +0200275
Arathorn655333e2019-11-26 19:20:27 +0100276 AddCmd("steck|stecke&@PRESENT&in&@ID",#'action_stopf,
277 "Was willst du wohin stopfen?|"
278 "Willst du @WEN2 in etwas stopfen?|"
279 "Wohinein willst du @WEN2 stopfen?");
280 // ...
281 private int action_stopf(string str, mixed *param) {
282 if(param[0]->QueryProp(...)) {
283 write(break_string(
284 "Du stopfst "+param[0]->name(WEN,1)+" in den Automaten.",78));
285 say(...);
286 } else {
287 write(break_string(
288 "Du versuchst "+param[0]->name(WEN,1)+" in den Automaten zu "
289 "stopfen, aber "+param[0]->QueryPronoun(WER)+" passt nicht "
290 "hinein.",78));
291 say(...);
292 }
293 return 1;
294 }
MG Mud User88f12472016-06-24 23:31:02 +0200295
MG Mud User88f12472016-06-24 23:31:02 +0200296
Arathorn655333e2019-11-26 19:20:27 +0100297Komplexbeispiel: gleiches Verb, mehrere Regeln
298----------------------------------------------
MG Mud User88f12472016-06-24 23:31:02 +0200299
Arathorn655333e2019-11-26 19:20:27 +0100300 Das Problem mehrerer Regeln fuer ein Kommandoverb besteht darin,
301 dass letztlich nur eine der Fehlermeldungen zum Tragen kommt -
302 welche genau, ist etwas vage. Dabei kann man sich auf eines
303 verlassen: juengere AddCmd werden zuerst ausgewertet. Wenn sich das
304 aendert, tretet euren EM.
MG Mud User88f12472016-06-24 23:31:02 +0200305
MG Mud User88f12472016-06-24 23:31:02 +0200306
Arathorn655333e2019-11-26 19:20:27 +0100307Problem 1: Mehrere Regeln weil mehrere Zwecke
308---------------------------------------------
MG Mud User88f12472016-06-24 23:31:02 +0200309
MG Mud User88f12472016-06-24 23:31:02 +0200310
Arathorn655333e2019-11-26 19:20:27 +0100311Variante 1 - GLEICHLAUTENDE FEHLERMELDUNG
312~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MG Mud User88f12472016-06-24 23:31:02 +0200313
Arathorn655333e2019-11-26 19:20:27 +0100314 Fuer alles wird eine identische Fehlermeldung gesetzt, das ist
315 natuerlich nicht sehr flexibel oder schoen oder man versucht eine
316 bessere Regel zu schaffen, was hier durch die Moeglichkeit von zwei
317 oder drei Parameter unmoeglich ist
Zesstra953f9972017-02-18 15:37:36 +0100318
Arathorn655333e2019-11-26 19:20:27 +0100319 AddCmd("kriech|krieche&hoch|hinauf|hinaus|heraus|raus",#'result_kriech,
320 "Wohin willst Du kriechen?");
321 AddCmd("kriech|krieche&nach&oben",#'result_kriech,
322 "Wohin willst Du kriechen??|Wohin willst Du kriechen?");
323 AddCmd("kriech|krieche&aus&loch|grube|falle",#'result_kriech);
324 "Wohin willst Du kriechen?|Wohin willst Du kriechen?");
Zesstra953f9972017-02-18 15:37:36 +0100325
Zesstra953f9972017-02-18 15:37:36 +0100326
Arathorn655333e2019-11-26 19:20:27 +0100327Variante 2 - EIGENE AUSWERTUNG
328~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100329
Arathorn655333e2019-11-26 19:20:27 +0100330 Statt der Verwendung mehrerer aehnlicher AddCmd() bietet sich die
331 eigene Weiterauswertung an, was durch die Uebergabe der
332 getriggerten Argumente erleichtert wird.
Zesstra953f9972017-02-18 15:37:36 +0100333
Arathorn655333e2019-11-26 19:20:27 +0100334 AddCmd("kriech|krieche&hoch|hinauf|hinaus|heraus|raus|aus|nach",
335 #'result_kriech,
336 "Wohin willst Du kriechen?");
337 // ...
338 private int result_kriech(string str, mixed *extra) {
339 if(member(extra,"aus")>=0 &&
340 !sizeof(({str}),"*.\\<(hoehle|grube|falle)\\>.*"))
341 notify_fail("Woraus willst Du kriechen?\n");
342 else if(member(extra,"nach")>=0 && strstr(str,"oben")<0)
343 notify_fail("In welche Richtung willst Du kriechen?\n");
344 else if(this_player()->QueryAttribute(A_DEX)>10 ||
345 member(holding_root,this_player())) {
346 write("Du kriechst mit Muehe heraus.\n");
347 this_player()->move((XXXROOM+"draussen"), M_GO, 0,
348 "kriecht mit Muehe aus der Grube",
349 "kriecht aus einer Grube");
350 return 1;
351 } else
352 write("Du bist zu ungeschickt, halt Dich irgendwo fest.\n");
353 return 1;
354 }
355 return 0;
356 }
Zesstra953f9972017-02-18 15:37:36 +0100357
Zesstra953f9972017-02-18 15:37:36 +0100358
Arathorn655333e2019-11-26 19:20:27 +0100359Problem 2: mehrere Regeln aufgrund von optionalen Parametern
360------------------------------------------------------------
Zesstra953f9972017-02-18 15:37:36 +0100361
Arathorn655333e2019-11-26 19:20:27 +0100362 Manchmal will man optionale Parameter erlauben, die aber eine
363 Wirkung zeigen sollen. Hierbei ist die Reihenfolge der AddCmd()-
364 Anweisungen und ggf. deren Aufbau entscheidend.
Zesstra953f9972017-02-18 15:37:36 +0100365
Arathorn655333e2019-11-26 19:20:27 +0100366 AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart,
367 "Was oder wen willst du @verben?|"
368 "Wie willst du @WEN2 schlagen?");
369 AddCmd("schlag|schlage&@ID",#'action_schlag,
370 "Was oder wen willst du @verben?");
Zesstra953f9972017-02-18 15:37:36 +0100371
Arathorn655333e2019-11-26 19:20:27 +0100372 Da juengere AddCmd aelteren vorgehen, wird die komplexere Regel samt
373 ihrer Fehlermeldung nie ausgewertet, da ein "schlag ball hart" auch
374 die zweite Regel triggert.
Zesstra953f9972017-02-18 15:37:36 +0100375
Arathorn655333e2019-11-26 19:20:27 +0100376 Anders herum:
Zesstra953f9972017-02-18 15:37:36 +0100377
Arathorn655333e2019-11-26 19:20:27 +0100378 AddCmd("schlag|schlage&@ID",#'action_schlag,
379 "Was oder wen willst du @verben?");
380 AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart,
381 "Was oder wen willst du @verben?|"
382 "Wie willst du @WEN2 schlagen?");
Zesstra953f9972017-02-18 15:37:36 +0100383
Arathorn655333e2019-11-26 19:20:27 +0100384 Jetzt wird die komplexere Regel zuerst ueberprueft und triggert
385 auch die richtige Funktion.
386 Leider kommt die Fehlermeldung nie zum Tragen, denn was durch Regel 2
387 durchfaellt, triggert entweder Regel 1 oder faellt auch durch Regel 1
388 durch und ueberschreibt dabei die Meldung.
Zesstra953f9972017-02-18 15:37:36 +0100389
Arathorn655333e2019-11-26 19:20:27 +0100390 AddCmd("schlag|schlage&@ID",#'action_schlag,
391 "Was oder wen willst du wie @verben?");
392 AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart);
Zesstra953f9972017-02-18 15:37:36 +0100393
Arathorn655333e2019-11-26 19:20:27 +0100394 Das ist zwar auch nur fast perfekt, besser wird es aber nicht.
Zesstra953f9972017-02-18 15:37:36 +0100395
Arathorn655333e2019-11-26 19:20:27 +0100396Letzte Aenderung: 20.11.2019, Arathorn