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