blob: 4f382c82909e9c93b859b2e1bb7000d5942b14b5 [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001
MG Mud User88f12472016-06-24 23:31:02 +02002ADDCMD() - BEISPIELE
Arathorn655333e2019-11-26 19:20:27 +01003********************
Zesstra953f9972017-02-18 15:37:36 +01004
5
MG Mud User88f12472016-06-24 23:31:02 +02006FUNKTION
Zesstra953f9972017-02-18 15:37:36 +01007========
8
9 varargs void AddCmd(mixed cmd, mixed func, mixed flag);
10
MG Mud User88f12472016-06-24 23:31:02 +020011
12BEMERKUNGEN
Zesstra953f9972017-02-18 15:37:36 +010013===========
14
15 Die hier aufgefuehrten Komplexbeispiele sind zum Verstaendnis gedacht,
16 daher fuehren sie oft Alternativen auf. Die letzte Variante ist dann
17 jeweils diejenige, welche am leichtesten das Problem loesen koennte.
18 Falls die einem zu komplex ist, hilft vielleicht die vorletzte.
19
MG Mud User88f12472016-06-24 23:31:02 +020020
21BEISPIELE
Zesstra953f9972017-02-18 15:37:36 +010022=========
23
Arathorn655333e2019-11-26 19:20:27 +010024
25Einfache Beispiele
26------------------
27
281. SIMPEL: ganz simpel, beinahe wie add_action()
29
Zesstra953f9972017-02-18 15:37:36 +010030 AddCmd("befiehl","action_befehlen");
Arathorn655333e2019-11-26 19:20:27 +010031 // ...
Zesstra953f9972017-02-18 15:37:36 +010032 int action_befehlen(string str) {
Arathorn655333e2019-11-26 19:20:27 +010033 if(!str || !strlen(str))
34 // Fehlermeldung, falls gar keine Funktion 1 dafuer zurueckgibt
35 notify_fail("Was willst du befehlen?!\n");
36 else {
37 write("Du befiehlst \""+str+"\", und alle folgen!\n");
38 say(TP->Name(WER)+" befiehlt \""+str+"\", und du folgst!\n");
39 return 1; // ERFOLG - Abbruch der Kommandoauswertung
40 }
41 return 0; // MISSERFOLG - Fehlermeldung oben gesetzt
Zesstra953f9972017-02-18 15:37:36 +010042 }
MG Mud User88f12472016-06-24 23:31:02 +020043
Arathorn655333e2019-11-26 19:20:27 +0100442. SIMPEL .. weitere Beispiele
45
Zesstra953f9972017-02-18 15:37:36 +010046 AddCmd(({"kletter","klettere"}),"action_klettern" );
47 AddCmd(({"renn","renne"}),#'action_rennen);
MG Mud User88f12472016-06-24 23:31:02 +020048
Arathorn655333e2019-11-26 19:20:27 +0100493. REGELN: eine komplexere Regel
50
Zesstra953f9972017-02-18 15:37:36 +010051 AddCmd("loesch|loesche|ersticke&feuer|brand|flammen&decke|wolldecke",
52 "action_loeschen",
53 "Was willst du loeschen?|Womit willst du loeschen?");
MG Mud User88f12472016-06-24 23:31:02 +020054
Arathorn655333e2019-11-26 19:20:27 +0100554. REGELN: mit Platzhaltern im Fehlerstring
56
Zesstra953f9972017-02-18 15:37:36 +010057 AddCmd("spring|springe|huepf|huepfe&von|vom&baum|ast|eiche",
58 #'action_huepfe,
59 "Willst du von etwas @verben?|Von wo willst du @verben?");
MG Mud User88f12472016-06-24 23:31:02 +020060
Arathorn655333e2019-11-26 19:20:27 +0100615. SCHLECHT: eine unscharfe Regel - sie sollten eine Ausnahme sein
62 (!)
63
Zesstra953f9972017-02-18 15:37:36 +010064 AddCmd("kletter","fun_klettern",1);
MG Mud User88f12472016-06-24 23:31:02 +020065
Arathorn655333e2019-11-26 19:20:27 +0100666. FALSCH: sehr schlecht, kein Imperativ verwendet
67
Zesstra953f9972017-02-18 15:37:36 +010068 AddCmd("lese","eval_lesen");
MG Mud User88f12472016-06-24 23:31:02 +020069
Arathorn655333e2019-11-26 19:20:27 +010070 ausserdem sollte man fuer Lese-Syntaxen AddReadDetail benutzen
71
727. SIMPLE REGEL
73
Zesstra953f9972017-02-18 15:37:36 +010074 static int action_jump(string str); // Prototype (wegen closure)
Arathorn655333e2019-11-26 19:20:27 +010075 // ...
Zesstra953f9972017-02-18 15:37:36 +010076 AddCmd("spring|springe|huepf|huepfe&von&baum|ast",#'action_jump,
77 "Willst Du von etwas @verben?|Wovon willst Du @verben?");
Arathorn655333e2019-11-26 19:20:27 +010078 // ...
Zesstra953f9972017-02-18 15:37:36 +010079 static int action_jump(string str) {
80 write(break_string("Du springst vom Baum und kommst hart auf!",78));
81 this_player()->move((XXXROOM+"boden"), M_GO, 0,
82 "springt unelegant vom Baum","faellt vom Baum");
83 this_player()->Defend(random(100),({DT_BLUDGEON}),([SP_RECURSIVE:1]),
84 this_object());
85 return 1;
86 }
MG Mud User88f12472016-06-24 23:31:02 +020087
Arathorn655333e2019-11-26 19:20:27 +0100888. SIMPLE REGEL OHNE METHODE
89
90 mit Regeln kann man auch Aktivitaeten im Raum erlauben, ohne eine
91 Funktion aufrufen zu muessen: die letzte Regel ist fuer Spieler
92 unmoeglich zu erfuellen, die dazugehoerige Fehlermeldung wird mit
93 dem ^ (write-Flag) versehen und entsprechend an den Spieler (und
94 den Raum (hinter dem ^)) ausgegeben
95
Zesstra953f9972017-02-18 15:37:36 +010096 AddCmd("spring|springe&herunter|runter&\n\bimpossible",0,
97 "Wohin oder wovon willst Du springen?|"
98 "Du springst vom Baum und kommst hart auf.^"
99 "@WER1 springt vom Baum und kommt hart auf.");
MG Mud User88f12472016-06-24 23:31:02 +0200100
MG Mud User88f12472016-06-24 23:31:02 +0200101
Arathorn655333e2019-11-26 19:20:27 +0100102Komplexbeispiel: Regeln mit Fehlermeldungen
103-------------------------------------------
MG Mud User88f12472016-06-24 23:31:02 +0200104
MG Mud User88f12472016-06-24 23:31:02 +0200105
Arathorn655333e2019-11-26 19:20:27 +0100106Variante 1a, OHNE REGELN
107~~~~~~~~~~~~~~~~~~~~~~~~
MG Mud User88f12472016-06-24 23:31:02 +0200108
Arathorn655333e2019-11-26 19:20:27 +0100109 Wenn man keine Regeln verwendet, muss man die Eingabe selbst
110 auswerten.
MG Mud User88f12472016-06-24 23:31:02 +0200111
Arathorn655333e2019-11-26 19:20:27 +0100112 AddCmd(({"bohr","bohre"}),#'action_bohren);
113 // ...
114 private int action_bohren(string str) {
115 string *tmp;
116 notify_fail("Wo willst (etwas) Du bohren?\n");
117 if(!str) return 0; // Tja, keine Argumente ...
118 tmp=explode(str," "); // nach " " in Argument-Array aufspalten
119 if((i=member(tmp,"loch"))>=0) { // aha, ab jetzt uebernehmen wir :)
120 if((j=member(tmp[(i+1)..],"in"))<0 &&
121 (j=member(tmp[(i+1)..],"durch"))<0)
122 write("Willst Du das Loch in etwas bohren?\n");
123 else if((i=member(tmp[(j+1)..],"boden"))<0 &&
124 (i=member(tmp[(j+1)..],"erde"))<0)
125 write("In/Durch was willst du das Loch bohren?\n");
126 else {
127 write("Du bohrst ein Loch in den Boden.\n");
128 say(this_player()->Name(WER)+" bohrt ein Loch in den Boden.\n");
129 }
130 return 1; // "bohre loch" war so eindeutig, dass nur diese
Zesstra953f9972017-02-18 15:37:36 +0100131 // Methode gemeint sein konnte, also brechen wir die
132 // weitere Auswertung auf jeden Fall ab (und geben
133 // eine write-Fehlermeldung)
Arathorn655333e2019-11-26 19:20:27 +0100134 } // end if(..."loch")
135 return 0; // "bohre" allein muss nicht diese Methode meinen,
136 // also nur obige notify_fail()-Meldung, falls
137 // sich nach dieser Methode gar keine sonst
138 // angesprochen fuehlt
139 } // end fun
Zesstra953f9972017-02-18 15:37:36 +0100140
Zesstra953f9972017-02-18 15:37:36 +0100141
Arathorn655333e2019-11-26 19:20:27 +0100142Variante 1b, OHNE REGELN, Alternative
143~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100144
Arathorn655333e2019-11-26 19:20:27 +0100145 prinzipiell koennte die Methode action_bohren() auch so aussehen,
146 ist aber nicht ganz so flexibel:
Zesstra953f9972017-02-18 15:37:36 +0100147
Arathorn655333e2019-11-26 19:20:27 +0100148 private int action_bohren(string str) {
149 string unused;
150 if(!str || (sprintf(str,"loch in erde%s", unused)!=1 &&
151 sprintf(str,"loch durch erde%s", unused)!=1 &&
152 sprintf(str,"loch in boden%s", unused)!=1 &&
153 sprintf(str,"loch durch boden%s", unused)!=1))
154 notify_fail("Willst Du in irgendwas ein Loch bohren?\n");
155 else {
156 // ...
157 return 1;
158 }
159 return 0;
160 }
Zesstra953f9972017-02-18 15:37:36 +0100161
Zesstra953f9972017-02-18 15:37:36 +0100162
Arathorn655333e2019-11-26 19:20:27 +0100163Variante 2, MIT REGEL
164~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100165
Arathorn655333e2019-11-26 19:20:27 +0100166 das gleiche in etwa mal als einfache Regel
Zesstra953f9972017-02-18 15:37:36 +0100167
Arathorn655333e2019-11-26 19:20:27 +0100168 AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
169 "Was willst du (wohin) bohren?|"
170 "Willst du das Loch in etwas bohren?|"
171 "Wohin willst du das Loch bohren?");
172 // ...
173 private int action_bohren(string str, mixed *param) {
174 write("Du bohrst ein Loch in den Boden.\n");
175 say(this_player()->Name(WER)+" bohrt ein Loch in den Boden.\n");
176 // ...
177 return 1;
178 }
Zesstra953f9972017-02-18 15:37:36 +0100179
Zesstra953f9972017-02-18 15:37:36 +0100180
Arathorn655333e2019-11-26 19:20:27 +0100181Variante 3, MIT REGEL UND FEHLERMELDUNG
182~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100183
Arathorn655333e2019-11-26 19:20:27 +0100184 und nun mit Fehlermeldungen mit Ersetzungen, so dass wir mehr auf
185 die Eingaben des Spielers eingehen
Zesstra953f9972017-02-18 15:37:36 +0100186
Arathorn655333e2019-11-26 19:20:27 +0100187 AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
188 "Was willst du (wohin) @verben?|"
189 "Willst du das Loch in etwas @verben?|"
190 "@WER3 was willst du das Loch @verben?");
191 // ...
192 private int action_bohren(string str, mixed *param) // ...
Zesstra953f9972017-02-18 15:37:36 +0100193
Zesstra953f9972017-02-18 15:37:36 +0100194
Arathorn655333e2019-11-26 19:20:27 +0100195Variante 4, MIT REGEL, FEHLERMELDUNG UND RETURN 1
196~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100197
Arathorn655333e2019-11-26 19:20:27 +0100198 In Variante 1 kam sinnvollerweise sehr frueh der Abbruch mit
199 "return 1;" und mit Ausgabe von write-Fehlermeldungen, das koennen
200 wir auch direkt und ohne eigene Methode.
Zesstra953f9972017-02-18 15:37:36 +0100201
Arathorn655333e2019-11-26 19:20:27 +0100202 AddCmd("bohr|bohre&loch&in|durch&erde|boden",#'action_bohren,
203 "Was willst du (wohin) @verben?|"
204 "Willst du das Loch in etwas @verben?^|"
205 "@WER3 was willst du das Loch @verben?^");
206 // ...
207 private int action_bohren(string str, mixed *param) // ...
Zesstra953f9972017-02-18 15:37:36 +0100208
Zesstra953f9972017-02-18 15:37:36 +0100209
Arathorn655333e2019-11-26 19:20:27 +0100210Variante 5, MIT REGEL, FEHLERMELDUNG, RETURN 1, OHNE FUN
211~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100212
Arathorn655333e2019-11-26 19:20:27 +0100213 // und falls in action_bohren() nichts ausser Ausgaben passiert, koennen
214 // wir uns die auch ganz sparen indem wir eine nichterfuellbare Regel
215 // samt Fehlermeldung bauen
216 AddCmd("bohr|bohre&loch&in|durch&erde|boden&\nimpossible",0,
217 "Was willst du (wohin) @verben?|"
218 "Willst du das Loch in etwas @verben?^|"
219 "@WER3 was willst du das Loch @verben?^|"
220 "Du @verbst ein Loch @WER3 den Boden.^@WER1 @verbt "
221 "ein Loch @WER3 den Boden.");
Zesstra953f9972017-02-18 15:37:36 +0100222
Zesstra953f9972017-02-18 15:37:36 +0100223
Arathorn655333e2019-11-26 19:20:27 +0100224Komplexbeispiel: Spezialregeln @PRESENT und @ID
225-----------------------------------------------
Zesstra953f9972017-02-18 15:37:36 +0100226
Zesstra953f9972017-02-18 15:37:36 +0100227
Arathorn655333e2019-11-26 19:20:27 +0100228Variante 1, OHNE REGELN
229~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100230
Arathorn655333e2019-11-26 19:20:27 +0100231 Oft agieren Kommandos auf Objekten im Raum, diese muessen dabei per
232 present() identifiziert werden: Beispiel ist ein Geldautomat
233 (Hinweis: dieses Beispiel dient der Illustration, die
234 Funktionalitaet an sich sollte man besser mit einem Container mit
235 PreventInsert() erzeugen.)
MG Mud User88f12472016-06-24 23:31:02 +0200236
Arathorn655333e2019-11-26 19:20:27 +0100237 AddCmd(({"stopf","stopfe"}),#'action_stopf);
238 // ...
239 private int action_stopf(string str) {
240 string was, unused;
241 if(str && (sprintf("%s in automat%s", was, unused)==2 ||
242 sprintf("%s in geldautomat%s", was, unused)==2 ||
243 sprintf("%s in bankomat%s", was, unused)==2) {
244 object o = present(was, this_player());
245 if(o) {
246 if(o->QueryProp(...)) {
247 write(break_string(
248 "Du stopfst "+o->name(WEN,1)+" in den Automaten.",78));
249 say(...);
250 } else {
251 write(break_string(
252 "Du versuchst "+o->name(WEN,1)+" in den Automaten zu stopfen, "
253 "aber "+o->QueryPronoun(WER)+" passt nicht hinein.",78));
254 say(...);
Zesstra953f9972017-02-18 15:37:36 +0100255 }
Arathorn655333e2019-11-26 19:20:27 +0100256 } else {
257 write("Was willst du in den Automaten stopfen?\n");
258 say(....);
259 }
260 return 1;
261 }
262 notify_fail("Was willst du wohin stecken?\n");
263 return 0;
264 }
Zesstra953f9972017-02-18 15:37:36 +0100265
MG Mud User88f12472016-06-24 23:31:02 +0200266
Arathorn655333e2019-11-26 19:20:27 +0100267Variante 2, MIT REGEL
268~~~~~~~~~~~~~~~~~~~~~
MG Mud User88f12472016-06-24 23:31:02 +0200269
Arathorn655333e2019-11-26 19:20:27 +0100270 einerseits koennen wir auf diese Weise das Finden von Objekten in
271 Inv und Env in die AddCmd()-Regel integrieren und uns andererseits
272 das Aufzaehlen aller IDs des Automaten ersparen.
MG Mud User88f12472016-06-24 23:31:02 +0200273
Arathorn655333e2019-11-26 19:20:27 +0100274 Wie immer werden die gefundenen Matches als Parameterarray an die
275 angegebene Methode uebergeben. Das Array enthaelt die mit @PRESENT
276 und @ID gefundenen Treffer praktischerweise als Objekte.
MG Mud User88f12472016-06-24 23:31:02 +0200277
Arathorn655333e2019-11-26 19:20:27 +0100278 AddCmd("steck|stecke&@PRESENT&in&@ID",#'action_stopf,
279 "Was willst du wohin stopfen?|"
280 "Willst du @WEN2 in etwas stopfen?|"
281 "Wohinein willst du @WEN2 stopfen?");
282 // ...
283 private int action_stopf(string str, mixed *param) {
284 if(param[0]->QueryProp(...)) {
285 write(break_string(
286 "Du stopfst "+param[0]->name(WEN,1)+" in den Automaten.",78));
287 say(...);
288 } else {
289 write(break_string(
290 "Du versuchst "+param[0]->name(WEN,1)+" in den Automaten zu "
291 "stopfen, aber "+param[0]->QueryPronoun(WER)+" passt nicht "
292 "hinein.",78));
293 say(...);
294 }
295 return 1;
296 }
MG Mud User88f12472016-06-24 23:31:02 +0200297
MG Mud User88f12472016-06-24 23:31:02 +0200298
Arathorn655333e2019-11-26 19:20:27 +0100299Komplexbeispiel: gleiches Verb, mehrere Regeln
300----------------------------------------------
MG Mud User88f12472016-06-24 23:31:02 +0200301
Arathorn655333e2019-11-26 19:20:27 +0100302 Das Problem mehrerer Regeln fuer ein Kommandoverb besteht darin,
303 dass letztlich nur eine der Fehlermeldungen zum Tragen kommt -
304 welche genau, ist etwas vage. Dabei kann man sich auf eines
305 verlassen: juengere AddCmd werden zuerst ausgewertet. Wenn sich das
306 aendert, tretet euren EM.
MG Mud User88f12472016-06-24 23:31:02 +0200307
MG Mud User88f12472016-06-24 23:31:02 +0200308
Arathorn655333e2019-11-26 19:20:27 +0100309Problem 1: Mehrere Regeln weil mehrere Zwecke
310---------------------------------------------
MG Mud User88f12472016-06-24 23:31:02 +0200311
MG Mud User88f12472016-06-24 23:31:02 +0200312
Arathorn655333e2019-11-26 19:20:27 +0100313Variante 1 - GLEICHLAUTENDE FEHLERMELDUNG
314~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MG Mud User88f12472016-06-24 23:31:02 +0200315
Arathorn655333e2019-11-26 19:20:27 +0100316 Fuer alles wird eine identische Fehlermeldung gesetzt, das ist
317 natuerlich nicht sehr flexibel oder schoen oder man versucht eine
318 bessere Regel zu schaffen, was hier durch die Moeglichkeit von zwei
319 oder drei Parameter unmoeglich ist
Zesstra953f9972017-02-18 15:37:36 +0100320
Arathorn655333e2019-11-26 19:20:27 +0100321 AddCmd("kriech|krieche&hoch|hinauf|hinaus|heraus|raus",#'result_kriech,
322 "Wohin willst Du kriechen?");
323 AddCmd("kriech|krieche&nach&oben",#'result_kriech,
324 "Wohin willst Du kriechen??|Wohin willst Du kriechen?");
325 AddCmd("kriech|krieche&aus&loch|grube|falle",#'result_kriech);
326 "Wohin willst Du kriechen?|Wohin willst Du kriechen?");
Zesstra953f9972017-02-18 15:37:36 +0100327
Zesstra953f9972017-02-18 15:37:36 +0100328
Arathorn655333e2019-11-26 19:20:27 +0100329Variante 2 - EIGENE AUSWERTUNG
330~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Zesstra953f9972017-02-18 15:37:36 +0100331
Arathorn655333e2019-11-26 19:20:27 +0100332 Statt der Verwendung mehrerer aehnlicher AddCmd() bietet sich die
333 eigene Weiterauswertung an, was durch die Uebergabe der
334 getriggerten Argumente erleichtert wird.
Zesstra953f9972017-02-18 15:37:36 +0100335
Arathorn655333e2019-11-26 19:20:27 +0100336 AddCmd("kriech|krieche&hoch|hinauf|hinaus|heraus|raus|aus|nach",
337 #'result_kriech,
338 "Wohin willst Du kriechen?");
339 // ...
340 private int result_kriech(string str, mixed *extra) {
341 if(member(extra,"aus")>=0 &&
342 !sizeof(({str}),"*.\\<(hoehle|grube|falle)\\>.*"))
343 notify_fail("Woraus willst Du kriechen?\n");
344 else if(member(extra,"nach")>=0 && strstr(str,"oben")<0)
345 notify_fail("In welche Richtung willst Du kriechen?\n");
346 else if(this_player()->QueryAttribute(A_DEX)>10 ||
347 member(holding_root,this_player())) {
348 write("Du kriechst mit Muehe heraus.\n");
349 this_player()->move((XXXROOM+"draussen"), M_GO, 0,
350 "kriecht mit Muehe aus der Grube",
351 "kriecht aus einer Grube");
352 return 1;
353 } else
354 write("Du bist zu ungeschickt, halt Dich irgendwo fest.\n");
355 return 1;
356 }
357 return 0;
358 }
Zesstra953f9972017-02-18 15:37:36 +0100359
Zesstra953f9972017-02-18 15:37:36 +0100360
Arathorn655333e2019-11-26 19:20:27 +0100361Problem 2: mehrere Regeln aufgrund von optionalen Parametern
362------------------------------------------------------------
Zesstra953f9972017-02-18 15:37:36 +0100363
Arathorn655333e2019-11-26 19:20:27 +0100364 Manchmal will man optionale Parameter erlauben, die aber eine
365 Wirkung zeigen sollen. Hierbei ist die Reihenfolge der AddCmd()-
366 Anweisungen und ggf. deren Aufbau entscheidend.
Zesstra953f9972017-02-18 15:37:36 +0100367
Arathorn655333e2019-11-26 19:20:27 +0100368 AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart,
369 "Was oder wen willst du @verben?|"
370 "Wie willst du @WEN2 schlagen?");
371 AddCmd("schlag|schlage&@ID",#'action_schlag,
372 "Was oder wen willst du @verben?");
Zesstra953f9972017-02-18 15:37:36 +0100373
Arathorn655333e2019-11-26 19:20:27 +0100374 Da juengere AddCmd aelteren vorgehen, wird die komplexere Regel samt
375 ihrer Fehlermeldung nie ausgewertet, da ein "schlag ball hart" auch
376 die zweite Regel triggert.
Zesstra953f9972017-02-18 15:37:36 +0100377
Arathorn655333e2019-11-26 19:20:27 +0100378 Anders herum:
Zesstra953f9972017-02-18 15:37:36 +0100379
Arathorn655333e2019-11-26 19:20:27 +0100380 AddCmd("schlag|schlage&@ID",#'action_schlag,
381 "Was oder wen willst du @verben?");
382 AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart,
383 "Was oder wen willst du @verben?|"
384 "Wie willst du @WEN2 schlagen?");
Zesstra953f9972017-02-18 15:37:36 +0100385
Arathorn655333e2019-11-26 19:20:27 +0100386 Jetzt wird die komplexere Regel zuerst ueberprueft und triggert
387 auch die richtige Funktion.
388 Leider kommt die Fehlermeldung nie zum Tragen, denn was durch Regel 2
389 durchfaellt, triggert entweder Regel 1 oder faellt auch durch Regel 1
390 durch und ueberschreibt dabei die Meldung.
Zesstra953f9972017-02-18 15:37:36 +0100391
Arathorn655333e2019-11-26 19:20:27 +0100392 AddCmd("schlag|schlage&@ID",#'action_schlag,
393 "Was oder wen willst du wie @verben?");
394 AddCmd("schlag|schlage&@ID&hart",#'action_schlag_hart);
Zesstra953f9972017-02-18 15:37:36 +0100395
Arathorn655333e2019-11-26 19:20:27 +0100396 Das ist zwar auch nur fast perfekt, besser wird es aber nicht.
Zesstra953f9972017-02-18 15:37:36 +0100397
Arathorn655333e2019-11-26 19:20:27 +0100398Letzte Aenderung: 20.11.2019, Arathorn