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