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