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