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