blob: aeea8db6d9b346767bd5503784d48d83117e60fa [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001AddCmd(L)
2FUNKTION:
3 varargs void AddCmd(mixed cmd, mixed func, [mixed flag, [mixed id]]);
4
5DEFINIERT IN:
6 /std/thing/commands.c
7
8ARGUMENTE:
9 cmd
10 Verben, auf die reagiert werden soll
11 ODER
12 Regel mit Triggerverb und noetigen Keywords/Synonymen
13 func
14 Funktionsname im selben Objekt oder Closure (Funktionspointer)
15 flag (optional)
16 Unscharfe Ausfuehrung == 1
17 ODER
18 Fehlermeldungen bei Nutzung von Regeln
19 id (optional)
20 eine ID, ueber die das Kommando eindeutig wieder geloescht
21 werden kann
22
23BESCHREIBUNG:
24 Wenn ein Spieler im Einflussbereich des Objektes das Verb benutzt,
25 wird die entsprechende Funktion im Objekt aufgerufen:
26 - die Verben sollten Imperative sein
27 - die Funktion muss 1 fuer ERFOLG (und FPs!) und 0 sonst zurueckgeben
28 (sonst werden evtl. weitere Funktionen mit diesem Kommandoverb gerufen)
29 - innerhalb der Funktionen koennen Fehlermeldungen fuer den totalen
30 Misserfolg des Kommandos mit notify_fail gesetzt werden
31 (anstatt "Wie bitte?")
32
33 AddCmd ist ein dynamischer Ersatz fuer add_action - im Gegensatz
34 zu add_action koennen auch ohne erneuten Aufruf der init() neue
35 Kommandos hinzugefuegt werden.
36
37 AddCmd kann das Leben einfacher machen mit:
38 ### REGELN: ###
39 Bei komplexen Syntaxen kann ein String angegeben werden, der die
40 _notwendigen_ (nicht die erlaubten!) Schluesselworte und deren
41 zulaessige Synonyme beschreibt. Damit kann man sich einen grossen
42 Teil eigener Auswertung ersparen.
43
44 Nur wenn in richtiger Reihenfolge aus JEDER der durch & getrennten
45 Synonymgruppen ein Wort im Spielerkommando enthalten ist, wird
46 die zugehoerige Funktion ausgefuehrt.
47
48 Trenner sind: | fuer Alternativen
49 & fuer Konjunktionen
50
51 Beispiel:
52 "ritz|ritze|schnitz|schnitze&mit&messer|schnitzmesser&"
53 "herz|herzchen&rinde|baumrinde"
54 wuerde z.B. durch
55 "ritz mit dem Messer ein Herz in die Rinde des Baumes"
56 "schnitz mit Messer Herzchen Baumrinde"
57 "schnitz mit meinem Messer Herzchen in die harte Baumrinde"
58 erfuellt werden.
59
60 Spezialregelteile sind:
61 - @PRESENT: entspricht einem Objekt in Inv oder Env des Spielers
62 - @ID: entspricht der ID des kommandobesitzenden Objektes
63 (wo die Kommandomethode definiert ist, ist noch unwichtig)
64 - @PUT_GET_DROP, @PUT_GET_TAKE, @PUT_GET_NONE:
65 entsprechend den Filteroptionen fuer find_obs()
66 ACHTUNG: Zusaetzliche Ziffern in Verbindung mit den @-Spezialregeln
67 sind schlecht. @-Regeln versuchen gierig, Objekte exakt im
68 Inventory zu matchen ("objekt 3" anstatt "objekt") und miss-
69 interpretieren daher zB die 4 in "stopf objekt 3 in loch 4" als
70 Teil des Objekt-ID-Strings.
71 Interna: 3 Substrings fuer @PRESENT/@ID ("gruener kristall 2")
72 5 fuer @PUT... ("kristall 2 in beutel 3")
73
74 ### FEHLERMELDUNGEN (bei Anwendung von Regeln): ###
75 Als dritter Parameter koennen auch Fehlermeldungen fuer jeweils
76 fehlende Synonymgruppen (ausser der ersten - den Kommandoverben)
77 angegeben werden. Sie werden in derselben Reihenfolge (!) wie die
78 Synonymgruppen angegeben.
79
80 Mit nicht von Spielern erfuellbaren Regeln und ^-Fehlermeldungen
81 kann man auch ohne Ausfuehrung einer Funktion Texte an Spieler
82 und Umgebung ausgeben. Siehe dazu AddCmd_bsp.
83
84 Trenner sind: | zum Trennen der einzelnen Fehlermeldungen
85 ^ um
86 - die Auswertung (ab dieser Fehlermeldung!) mit
87 "return 1;" zu beenden und
88 - eine write^say-Meldung zu trennen und
89 - (fuer funktionslose AddCmd auch FPs zu vergeben!)
90
91 Beispielfehlermeldungen fuer obige Regel:
92 "Womit willst Du schnitzen?|Was willst Du schnitzen?|"
93 "Wohinein willst Du das schnitzen?"
94
95 Es koennen in den Fehlermeldungen folgende Platzhalter benutzt
96 werden:
97 - @verb (ersetzt durch query_verb() ohne beendendes 'e')
98 - @VERB (ersetzt durch capitalize(query_verb()) ohne beendendes 'e')
99 - @WERx, @WESSENx, @WEMx, @WENx: siehe alles aus replace_personal()
100 - @WE..1 ist immer der aktive Spieler
101 - alle folgenden sind die matchenden Parameter der Spielereingabe
102 - (x-1)<=Fehlermeldung (da x=1 Spieler und
103 (x-1)>Fehlermeldungsobjekt nicht existent)
104
105 Ausfuehrungsbeispiel:
106 AddCmd("ritz|ritze|schnitz|schnitze&mit&messer|schnitzmesser&"
107 "herz|herzchen&rinde|baumrinde",#'fun,
108 "Willst Du mit etwas @verben?|Womit willst du @verben?|"
109 "Was willst du mit dem @WEM3 @verben?|"
110 "Wohinein willst Du das @WEN4 schnitzen?");
111 1. "ritze" == "Willst Du mit etwas ritzen?"
112 2. "schnitz mit" == "Womit willst du schnitzen?"
113 3. "ritz mit messer" == "Was willst du mit dem messer ritzen?"
114 4. "ritze mit dem messer ein herz" ==
115 "Wohinein willst Du das herz schnitzen?"
116 5. "ritze mit dem messer ein herzchen in die baumrinde"
117 == Erfolg!
118
119 ### UNSCHARFER AUSFUEHRUNG: ###
120 Bei unscharfer Ausfuehrung wird die zugehoerige Methode auch dann
121 ausgefuehrt, wenn das verwendete Verb ein Superstring ist und
122 bisher noch nicht behandelt wurde.
123 Dieses Verhalten sollte nur beim generellen Abfangen von
124 Befehlsgruppen benutzt werden und ist ansonsten veraltet. Es
125 entsprich add_action("fun","kommando",1).
126
127
128 Beispiel:
129 1. AddCmd("klett","fun",1);
130 2. AddCmd("kletter|klettere&hoch",#'fun2,"Wohin klettern?");
131
132 a) "klett"
133 b) "kletter"
134 c) "klettere hoch"
135
136 Ausgefuehrte Funktion bei: 1a, 1b, 1c; 2c
137 (1 wuerde also immer ausgefuehrt)
138 Fehlermeldung bei: 2b ("Wohin klettern?")
139
140BEMERKUNGEN:
141 - Methoden der put_and_get (nimm/nehme) sollten so nicht versucht
142 werden zu ueberschreiben - dazu sind invis Container da
143 - benutzt man fuer <function> eine Closure, kann man die Fkt. auch
144 protected oder private deklarieren _und_ sie kann in einem
145 anderen Objekt sein
146 - bei Regeln wird an die ggf. gerufene Methode als zweiter Parameter
147 ein Array der erfuellenden Eingabeteile uebergeben:
148 "steck&@PRESENT&in&loch" bei Erfuellung -> ({<Objekt>,"in","loch})
149 - bei Nutzung von @PUT_GET_XXX koennen die Parameter wiederum
150 Arrays sein ("jede Hose" -> mehrere gueltige Objekte)
151 - juengere AddCmd ueberschreiben aeltere, bzw. werden vor diesen
152 ausgewertet
153 - @PUT_GET_XXX kosten sehr viel Auswertungszeit
154
155BEISPIELE (SIEHE AUCH ADDCMD_BSP):
156 // SIMPEL: ganz simpel, beinahe wie add_action
157 AddCmd("befiehl","action_befehlen");
158 ...
159 int action_befehlen(string str) {
160 if(!str || !strlen(str))
161 // Fehlermeldung, falls gar keine Funktion 1 dafuer zurueckgibt
162 notify_fail("Was willst du befehlen?!\n");
163 else {
164 write("Du befiehlst \""+str+"\", und alle folgen!\n");
165 say(TP->Name(WER)+" befiehlt \""+str+"\", und du folgst!\n");
166 return 1; // ERFOLG - Abbruch der Kommandoauswertung
167 }
168 return 0; // MISSERFOLG - Fehlermeldung oben gesetzt
169 }
170
171 // SIMPEL .. weitere Beispiele
172 AddCmd(({"kletter","klettere"}),"action_klettern" );
173 AddCmd(({"renn","renne"}),#'action_rennen);
174
175 // REGELN: eine komplexere Regel
176 AddCmd("loesch|loesche|ersticke&feuer|brand|flammen&decke|wolldecke",
177 "action_loeschen",
178 "Was willst du loeschen?|Womit willst du loeschen?");
179
180 // REGELN: mit Platzhaltern im Fehlerstring
181 AddCmd("spring|springe|huepf|huepfe&von|vom&baum|ast|eiche",
182 #'action_huepfe,
183 "Willst du von etwas @verben?|Von wo willst du @verben?");
184
185 // SCHLECHT: eine unscharfe Regel - sie sollten eine Ausnahme sein (!)
186 AddCmd("kletter","fun_klettern",1);
187
188 // FALSCH: sehr schlecht, kein Imperativ verwendet
189 // ausserdem sollte man fuer solche Syntaxen AddReadDetail benutzen
190 AddCmd("lese","eval_lesen");
191
192 // SIMPLE REGEL OHNE METHODE
193 // mit Regeln kann man auch Aktivitaeten im Raum erlauben, ohne eine
194 // Funktion aufrufen zu muessen: die letzte Regel ist fuer Spieler
195 // unmoeglich zu erfuellen, die dazugehoerige Fehlermeldung wird mit
196 // dem ^ (write-Flag) versehen und entsprechend an den Spieler
197 // (und den Raum (hinter dem ^)) ausgegeben
198 AddCmd("spring|springe&herunter|runter&\n\bimpossible",0,
199 "Wohin oder wovon willst Du springen?|"
200 "Du springst vom Baum und kommst hart auf.^"
201 "@WER1 springt vom Baum und kommt hart auf.");
202
203SIEHE AUCH:
204 AddCmd_bsp, RemoveCmd(L), init(E)
205 Fehlermeldungen: notify_fail(E), _notify_fail(E)
206 Argumentstring: query_verb(E), _unparsed_args(L)
207 Sonstiges: replace_personal(E), enable_commands(E)
208 Alternativen: AddAction(L), add_action(E)
209
21030. Aug 2013 Gloinson