blob: 0d22b50cdd613f506e23e500ee6beca99366c9d7 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001AddInfo()
Zesstra953f9972017-02-18 15:37:36 +01002*********
MG Mud User88f12472016-06-24 23:31:02 +02003
4
Zesstra953f9972017-02-18 15:37:36 +01005FUNKTION
6========
MG Mud User88f12472016-06-24 23:31:02 +02007
Arathorn49ecb072021-09-06 16:35:13 +02008 public varargs void AddInfo(string|string* key, string|closure
9 info,
10 string indent, int|string silent, string|closure casebased);
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============
MG Mud User88f12472016-06-24 23:31:02 +020015
Zesstra953f9972017-02-18 15:37:36 +010016 /std/npc/info.c
MG Mud User88f12472016-06-24 23:31:02 +020017
MG Mud User88f12472016-06-24 23:31:02 +020018
Zesstra953f9972017-02-18 15:37:36 +010019ARGUMENTE
20=========
21
Arathorn41004de2020-10-18 22:03:28 +020022 string|string* frage
Arathorn49ecb072021-09-06 16:35:13 +020023 Schluesselphrase(n), fuer die der NPC eine Antwort geben soll,
Arathorn41004de2020-10-18 22:03:28 +020024 wenn man ihn danach fragt
Zesstra0c1a85a2018-02-07 23:46:50 +010025
Arathorn41004de2020-10-18 22:03:28 +020026 string|closure meldung
Zesstraa1e601e2019-08-08 21:09:32 +020027 Information, die gegeben werden soll; wenn 'meldung' eine
Arathorn49ecb072021-09-06 16:35:13 +020028 Closure ist, wird der gerufenen Funktion die vom Spieler
29 gefragte Schluesselphrase uebergeben.
Zesstra0c1a85a2018-02-07 23:46:50 +010030
Arathorn41004de2020-10-18 22:03:28 +020031 string indent (optional)
Zesstra953f9972017-02-18 15:37:36 +010032 Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
Zesstra0c1a85a2018-02-07 23:46:50 +010033
Arathorn41004de2020-10-18 22:03:28 +020034 int|string silent (optional)
Zesstra953f9972017-02-18 15:37:36 +010035 Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
Zesstra0c1a85a2018-02-07 23:46:50 +010036
Arathorn41004de2020-10-18 22:03:28 +020037 string|closure casebased (optional)
Arathorn49ecb072021-09-06 16:35:13 +020038 Closure mit Returnwert string oder int. Der Funktion wird die
39 vom Spieler gefragte Schluesselphrase uebergeben.
Zesstra953f9972017-02-18 15:37:36 +010040
41
42BESCHREIBUNG
43============
44
Zesstra0c1a85a2018-02-07 23:46:50 +010045 Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>"
46 nach einer Information mit dem Schluessel 'frage' fragt, so wird
47 die entsprechende 'meldung' ausgegeben (oder die Closure in
48 'meldung' gerufen und der zurueckgegebene Text ausgegeben). Der
49 Meldung wird der Name des Monsters vorangestellt.
Zesstra953f9972017-02-18 15:37:36 +010050
51 Frage:
Arathorn49ecb072021-09-06 16:35:13 +020052 Schluesselphrasen muessen kleingeschrieben sein, koennen aber
Zesstra0c1a85a2018-02-07 23:46:50 +010053 Leerzeichen enthalten.
Zesstra953f9972017-02-18 15:37:36 +010054
55 Meldung:
Zesstra0c1a85a2018-02-07 23:46:50 +010056 Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
57 umbrechen.
Zesstra953f9972017-02-18 15:37:36 +010058
59 Indent:
Zesstra0c1a85a2018-02-07 23:46:50 +010060 Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
61 Monsternamen noch das 'indent' vorangesetzt. Ein typisches
62 indent ist "sagt: ".
Zesstra953f9972017-02-18 15:37:36 +010063
64 Silent:
Zesstra0c1a85a2018-02-07 23:46:50 +010065 Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im
66 Raum, ist 'silent' ein String, so wird jener an alle anderen
Zesstraa1e601e2019-08-08 21:09:32 +020067 Spieler ausser dem Fragesteller im Raum ausgegeben. Dem
68 ausgegebenen Text wird der Name des NPCs als Indent
69 vorangestellt.
Zesstra953f9972017-02-18 15:37:36 +010070
71 Casebased:
Zesstra0c1a85a2018-02-07 23:46:50 +010072 Die als Closure angegebene Methode entscheidet, ob oder wie der
73 NPC auf diese Frage antworten soll:
Zesstra953f9972017-02-18 15:37:36 +010074
Zesstra0c1a85a2018-02-07 23:46:50 +010075 # return 0: normale Antwort mit "meldung"
76
77 # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
78
79 # return string: Antwort mit string unter Beruecksichtigung
80 eines indent
81
82 Die Strings von 'silent' und 'meldung' werden geparsed. Dabei
83 koennen die @[...]-Tags von replace_personal() verwendet werden,
Arathorn41004de2020-10-18 22:03:28 +020084 Objekt 1 ist this_player(). Ersetzte Strings am Satzanfang werden
Zesstra0c1a85a2018-02-07 23:46:50 +010085 automatisch gross geschrieben. AddInfo() konvertiert die alten
86 Schluesselworte @WER, @WESSEN, @WEM, @WEN zu denen von
87 replace_personal(), jedoch nicht in den Rueckgabe- werten von
88 Closures.
Zesstra953f9972017-02-18 15:37:36 +010089
90 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
91 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
92 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
93 SetProp(P_DEFAULT_INFO, <text>) ab).
94
95
96BEISPIELE
97=========
98
Zesstra0c1a85a2018-02-07 23:46:50 +010099 Siehe auch: /doc/beispiele/AddInfo/
100
101 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra953f9972017-02-18 15:37:36 +0100102 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
103 // identisch zu
Zesstra0c1a85a2018-02-07 23:46:50 +0100104 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra953f9972017-02-18 15:37:36 +0100105
Zesstra0c1a85a2018-02-07 23:46:50 +0100106 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra953f9972017-02-18 15:37:36 +0100107 AddInfo(({"knete","kohle"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100108 "sagt: ich habe so etwas nicht.\n");
Zesstra953f9972017-02-18 15:37:36 +0100109 AddInfo("geld",
Zesstra0c1a85a2018-02-07 23:46:50 +0100110 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
111 "sagt: ");
Zesstra953f9972017-02-18 15:37:36 +0100112 AddInfo("muenzen",
Zesstraa1e601e2019-08-08 21:09:32 +0200113 "fluestert: Du willst Geld?\n",
Zesstra0c1a85a2018-02-07 23:46:50 +0100114 0,
Zesstraa1e601e2019-08-08 21:09:32 +0200115 "fluestert @WEM1 etwas zu.\n");
Zesstra953f9972017-02-18 15:37:36 +0100116
117 // "frage monster nach geld": alle im Raum hoeren
Zesstra0c1a85a2018-02-07 23:46:50 +0100118 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
119 // Das Monster sagt: [...] blablabla [...]
Zesstra953f9972017-02-18 15:37:36 +0100120
121 // "frage monster nach muenzen":
122 // - der Fragensteller hoert:
123 // "Das Monster fluestert: Du willst Geld?"
124 // - alle andere hoeren:
125 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
126
Zesstra0c1a85a2018-02-07 23:46:50 +0100127 // Beispiel 3: dynamisch
Zesstra953f9972017-02-18 15:37:36 +0100128 // ein Prototyp, damit wir die Methode bekannt machen
Arathorn49ecb072021-09-06 16:35:13 +0200129 protected string query_kekse(string key);
Zesstra953f9972017-02-18 15:37:36 +0100130
Zesstra0c1a85a2018-02-07 23:46:50 +0100131 AddInfo(({"keks","kekse"}),
132 #'query_kekse, // ein Verweis auf die Funktion
133 "sagt: ");
134
Arathorn49ecb072021-09-06 16:35:13 +0200135 protected string query_kekse(string key) {
Zesstra0c1a85a2018-02-07 23:46:50 +0100136 if(present("keks", this_object()))
137 return("Ich hab noch welche. Aetsch!");
138 else if(present("keks", environment()))
139 return("Da liegt einer!");
140 return("Menno. Keine mehr da!");
141 }
Zesstra953f9972017-02-18 15:37:36 +0100142 // "frage monster nach keks":
143 // - wenn es noch Kekse hat, hoeren alle:
144 // "Das Monster sagt: Ich hab noch welche. Aetsch!
145 // - sonst:
146 // "Das Monster sagt: "Menno. Keine mehr da!
147
Zesstra0c1a85a2018-02-07 23:46:50 +0100148 // Beispiel 4: dynamischer
Zesstra953f9972017-02-18 15:37:36 +0100149 // ein Prototyp, damit wir die Methode bekannt machen
Arathorn49ecb072021-09-06 16:35:13 +0200150 protected string query_kekse(string key);
151 protected mixed case_fighting(string key);
Zesstra0c1a85a2018-02-07 23:46:50 +0100152
Zesstra953f9972017-02-18 15:37:36 +0100153 AddInfo(({"keks","kekse"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100154 #'query_kekse," // ein Verweis auf die Funktion
Zesstraa1e601e2019-08-08 21:09:32 +0200155 "sagt: ",
Zesstra0c1a85a2018-02-07 23:46:50 +0100156 0, // nicht silent :)
157 #'case_fighting); // noch ein Funktionsverweis
158
Arathorn49ecb072021-09-06 16:35:13 +0200159 protected string query_kekse(string key) {
Zesstra0c1a85a2018-02-07 23:46:50 +0100160 if(present("keks"))
161 return("Ich hab noch welche. Aetsch!");
162 return("Menno. Keine mehr da!");
Zesstra953f9972017-02-18 15:37:36 +0100163 }
164
Arathorn49ecb072021-09-06 16:35:13 +0200165 protected mixed case_fighting(string key) {
Zesstra0c1a85a2018-02-07 23:46:50 +0100166 if(InFight())
167 return("Keine Zeit fuer Kekse. Muss kaempfen.");
168 return 0;
Zesstra953f9972017-02-18 15:37:36 +0100169 }
170
171 // "frage monster nach keks":
172 // - wenn es kaempft, hoeren alle:
173 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
174 // - sonst, wenn es noch Kekse hat, hoeren alle:
175 // "Das Monster sagt: Ich hab noch welche. Aetsch!
176 // - sonst:
177 // "Das Monster sagt: "Menno. Keine mehr da!
178
Zesstra0c1a85a2018-02-07 23:46:50 +0100179 // Beispiel 5: ### dynamisch und komplex ###
Zesstra953f9972017-02-18 15:37:36 +0100180 // ein Prototyp, damit wir die Methode bekannt machen
Arathorn49ecb072021-09-06 16:35:13 +0200181 protected string question_gold(string key);
Zesstra953f9972017-02-18 15:37:36 +0100182
183 // "gold" wird eine Closure auf die Methode question_gold()
184 // zugewiesen, ausserdem soll es still bleiben (wir informieren
185 // den Restraum selbst)
Zesstra0c1a85a2018-02-07 23:46:50 +0100186 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra953f9972017-02-18 15:37:36 +0100187
188 // los gehts, wir generieren unsere Antwort selbst
Arathorn49ecb072021-09-06 16:35:13 +0200189 protected string question_gold(string key) {
Zesstra0c1a85a2018-02-07 23:46:50 +0100190 // wieviel Kohle hat der Spieler
191 int money = this_player()->QueryMoney();
Zesstraa1e601e2019-08-08 21:09:32 +0200192 string* valuables = ({});
193
194 // Wertgegenstaende suchen, d.h. Material kein Gold,
195 // Objekt kein Geld, und auch nicht unsichtbar
196 foreach(object o : deep_inventory(this_player()))
197 {
198 if ( o->QueryMaterial(MAT_GOLD)>0 &&
199 load_name(o) != "/items/money" &&
200 o->QueryProp(P_SHORT) &&
201 !o->QueryProp(P_INVIS) )
202 {
203 valuables += ({o->Name(WER,1)});
204 }
205 }
Zesstra953f9972017-02-18 15:37:36 +0100206
Zesstra0c1a85a2018-02-07 23:46:50 +0100207 // das geht an alle anderen im Raum, silent bietet sich hier
208 // nicht an, weil es mehrere Moeglichkeiten gibt
209 send_room(environment(),
Zesstraa1e601e2019-08-08 21:09:32 +0200210 sprintf("%s murmelt %s etwas zu%s.",
211 Name(WER,1),
212 this_player()->name(WEM,1),
213 (money || sizeof(valuables))?
214 " und glotzt "+this_player()->QueryPronoun(WEN)+
215 " gierig an" : ""),
Zesstra0c1a85a2018-02-07 23:46:50 +0100216 MT_LOOK|MT_LISTEN,
217 MA_EMOTE, 0, ({this_player()}));
218
Zesstraa1e601e2019-08-08 21:09:32 +0200219 // Und hier die Antwort an den Spieler selbst, mit diversen
220 // Verzweigungen fuer dessen Besitztum.
221 string reply = "Ich hab kein Gold bei mir.";
222 string verb = sizeof(valuables) ? "ist" : "sind";
223 if ( money )
224 {
225 reply += " Aber Du hast ja jede Menge Kohle bei dir, so etwa "+
226 money+" Muenzen.";
227 if ( sizeof(valuables) )
228 reply += sprintf(" Ausserdem %s auch noch %s aus Gold.",
229 verb, CountUp(valuables));
230 }
231 else if ( sizeof(valuables) )
232 {
233 reply += sprintf(
234 " Aber Du hast ja ein paar Wertsachen dabei: %s %s aus Gold.",
235 CountUp(valuables), verb);
236 }
237 return reply;
Zesstra953f9972017-02-18 15:37:36 +0100238 }
239
240 // "frage monster nach gold"
241 // - der Fragesteller hoert zB:
Zesstraa1e601e2019-08-08 21:09:32 +0200242 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber Du hast ja
243 // Das Monster murmelt: jede Menge Kohle bei Dir, so etwa <number>
Zesstra953f9972017-02-18 15:37:36 +0100244 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
245 // Das Monster murmelt: und <object2> aus Gold."
246 // - die Umstehenden hoeren:
Zesstrabfab6ac2018-08-29 22:36:57 +0200247 // "Das Monster murmelt @WEM1 etwas zu."
Zesstra953f9972017-02-18 15:37:36 +0100248 // oder
Zesstrabfab6ac2018-08-29 22:36:57 +0200249 // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
Zesstra953f9972017-02-18 15:37:36 +0100250
251
252SIEHE AUCH
253==========
254
Zesstra0c1a85a2018-02-07 23:46:50 +0100255 Verwandt:
Zesstra6cadc1b2018-11-15 22:27:32 +0100256 AddSpecialInfo(), RemoveInfo()
MG Mud User88f12472016-06-24 23:31:02 +0200257
Zesstra0c1a85a2018-02-07 23:46:50 +0100258 Props:
Zesstra6cadc1b2018-11-15 22:27:32 +0100259 P_PRE_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100260
261 Files:
262 /std/npc/info.c
263
264 Loggen:
Zesstra6cadc1b2018-11-15 22:27:32 +0100265 P_LOG_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100266
267 Interna:
Zesstra6cadc1b2018-11-15 22:27:32 +0100268 GetInfoArr() , do_frage()
Zesstra0c1a85a2018-02-07 23:46:50 +0100269
Arathorn49ecb072021-09-06 16:35:13 +020027009.08.2021, Zesstra