blob: 730c26f97afde82787bed040c1edaf1bd6babac2 [file] [log] [blame]
Zesstra953f9972017-02-18 15:37:36 +01001
MG Mud User88f12472016-06-24 23:31:02 +02002AddInfo()
Zesstra953f9972017-02-18 15:37:36 +01003*********
MG Mud User88f12472016-06-24 23:31:02 +02004
5
Zesstra953f9972017-02-18 15:37:36 +01006FUNKTION
7========
MG Mud User88f12472016-06-24 23:31:02 +02008
Arathorn49ecb072021-09-06 16:35:13 +02009 public varargs void AddInfo(string|string* key, string|closure
10 info,
11 string indent, int|string silent, string|closure casebased);
MG Mud User88f12472016-06-24 23:31:02 +020012
MG Mud User88f12472016-06-24 23:31:02 +020013
Zesstra953f9972017-02-18 15:37:36 +010014DEFINIERT IN
15============
MG Mud User88f12472016-06-24 23:31:02 +020016
Zesstra953f9972017-02-18 15:37:36 +010017 /std/npc/info.c
MG Mud User88f12472016-06-24 23:31:02 +020018
MG Mud User88f12472016-06-24 23:31:02 +020019
Zesstra953f9972017-02-18 15:37:36 +010020ARGUMENTE
21=========
22
Arathorn41004de2020-10-18 22:03:28 +020023 string|string* frage
Arathorn49ecb072021-09-06 16:35:13 +020024 Schluesselphrase(n), fuer die der NPC eine Antwort geben soll,
Arathorn41004de2020-10-18 22:03:28 +020025 wenn man ihn danach fragt
Zesstra0c1a85a2018-02-07 23:46:50 +010026
Arathorn41004de2020-10-18 22:03:28 +020027 string|closure meldung
Zesstraa1e601e2019-08-08 21:09:32 +020028 Information, die gegeben werden soll; wenn 'meldung' eine
Arathorn49ecb072021-09-06 16:35:13 +020029 Closure ist, wird der gerufenen Funktion die vom Spieler
30 gefragte Schluesselphrase uebergeben.
Zesstra0c1a85a2018-02-07 23:46:50 +010031
Arathorn41004de2020-10-18 22:03:28 +020032 string indent (optional)
Zesstra953f9972017-02-18 15:37:36 +010033 Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
Zesstra0c1a85a2018-02-07 23:46:50 +010034
Arathorn41004de2020-10-18 22:03:28 +020035 int|string silent (optional)
Zesstra953f9972017-02-18 15:37:36 +010036 Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
Zesstra0c1a85a2018-02-07 23:46:50 +010037
Arathorn41004de2020-10-18 22:03:28 +020038 string|closure casebased (optional)
Arathorn49ecb072021-09-06 16:35:13 +020039 Closure mit Returnwert string oder int. Der Funktion wird die
40 vom Spieler gefragte Schluesselphrase uebergeben.
Zesstra953f9972017-02-18 15:37:36 +010041
42
43BESCHREIBUNG
44============
45
Zesstra0c1a85a2018-02-07 23:46:50 +010046 Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>"
47 nach einer Information mit dem Schluessel 'frage' fragt, so wird
48 die entsprechende 'meldung' ausgegeben (oder die Closure in
49 'meldung' gerufen und der zurueckgegebene Text ausgegeben). Der
50 Meldung wird der Name des Monsters vorangestellt.
Zesstra953f9972017-02-18 15:37:36 +010051
52 Frage:
Arathorn49ecb072021-09-06 16:35:13 +020053 Schluesselphrasen muessen kleingeschrieben sein, koennen aber
Zesstra0c1a85a2018-02-07 23:46:50 +010054 Leerzeichen enthalten.
Zesstra953f9972017-02-18 15:37:36 +010055
56 Meldung:
Zesstra0c1a85a2018-02-07 23:46:50 +010057 Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
58 umbrechen.
Zesstra953f9972017-02-18 15:37:36 +010059
60 Indent:
Zesstra0c1a85a2018-02-07 23:46:50 +010061 Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
62 Monsternamen noch das 'indent' vorangesetzt. Ein typisches
63 indent ist "sagt: ".
Zesstra953f9972017-02-18 15:37:36 +010064
65 Silent:
Zesstra0c1a85a2018-02-07 23:46:50 +010066 Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im
67 Raum, ist 'silent' ein String, so wird jener an alle anderen
Zesstraa1e601e2019-08-08 21:09:32 +020068 Spieler ausser dem Fragesteller im Raum ausgegeben. Dem
69 ausgegebenen Text wird der Name des NPCs als Indent
70 vorangestellt.
Zesstra953f9972017-02-18 15:37:36 +010071
72 Casebased:
Zesstra0c1a85a2018-02-07 23:46:50 +010073 Die als Closure angegebene Methode entscheidet, ob oder wie der
74 NPC auf diese Frage antworten soll:
Zesstra953f9972017-02-18 15:37:36 +010075
Zesstra0c1a85a2018-02-07 23:46:50 +010076 # return 0: normale Antwort mit "meldung"
77
78 # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
79
80 # return string: Antwort mit string unter Beruecksichtigung
81 eines indent
82
83 Die Strings von 'silent' und 'meldung' werden geparsed. Dabei
84 koennen die @[...]-Tags von replace_personal() verwendet werden,
Arathorn41004de2020-10-18 22:03:28 +020085 Objekt 1 ist this_player(). Ersetzte Strings am Satzanfang werden
Zesstra0c1a85a2018-02-07 23:46:50 +010086 automatisch gross geschrieben. AddInfo() konvertiert die alten
87 Schluesselworte @WER, @WESSEN, @WEM, @WEN zu denen von
88 replace_personal(), jedoch nicht in den Rueckgabe- werten von
89 Closures.
Zesstra953f9972017-02-18 15:37:36 +010090
91 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
92 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
93 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
94 SetProp(P_DEFAULT_INFO, <text>) ab).
95
96
97BEISPIELE
98=========
99
Zesstra0c1a85a2018-02-07 23:46:50 +0100100 Siehe auch: /doc/beispiele/AddInfo/
101
102 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra953f9972017-02-18 15:37:36 +0100103 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
104 // identisch zu
Zesstra0c1a85a2018-02-07 23:46:50 +0100105 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra953f9972017-02-18 15:37:36 +0100106
Zesstra0c1a85a2018-02-07 23:46:50 +0100107 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra953f9972017-02-18 15:37:36 +0100108 AddInfo(({"knete","kohle"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100109 "sagt: ich habe so etwas nicht.\n");
Zesstra953f9972017-02-18 15:37:36 +0100110 AddInfo("geld",
Zesstra0c1a85a2018-02-07 23:46:50 +0100111 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
112 "sagt: ");
Zesstra953f9972017-02-18 15:37:36 +0100113 AddInfo("muenzen",
Zesstraa1e601e2019-08-08 21:09:32 +0200114 "fluestert: Du willst Geld?\n",
Zesstra0c1a85a2018-02-07 23:46:50 +0100115 0,
Zesstraa1e601e2019-08-08 21:09:32 +0200116 "fluestert @WEM1 etwas zu.\n");
Zesstra953f9972017-02-18 15:37:36 +0100117
118 // "frage monster nach geld": alle im Raum hoeren
Zesstra0c1a85a2018-02-07 23:46:50 +0100119 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
120 // Das Monster sagt: [...] blablabla [...]
Zesstra953f9972017-02-18 15:37:36 +0100121
122 // "frage monster nach muenzen":
123 // - der Fragensteller hoert:
124 // "Das Monster fluestert: Du willst Geld?"
125 // - alle andere hoeren:
126 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
127
Zesstra0c1a85a2018-02-07 23:46:50 +0100128 // Beispiel 3: dynamisch
Zesstra953f9972017-02-18 15:37:36 +0100129 // ein Prototyp, damit wir die Methode bekannt machen
Arathorn49ecb072021-09-06 16:35:13 +0200130 protected string query_kekse(string key);
Zesstra953f9972017-02-18 15:37:36 +0100131
Zesstra0c1a85a2018-02-07 23:46:50 +0100132 AddInfo(({"keks","kekse"}),
133 #'query_kekse, // ein Verweis auf die Funktion
134 "sagt: ");
135
Arathorn49ecb072021-09-06 16:35:13 +0200136 protected string query_kekse(string key) {
Zesstra0c1a85a2018-02-07 23:46:50 +0100137 if(present("keks", this_object()))
138 return("Ich hab noch welche. Aetsch!");
139 else if(present("keks", environment()))
140 return("Da liegt einer!");
141 return("Menno. Keine mehr da!");
142 }
Zesstra953f9972017-02-18 15:37:36 +0100143 // "frage monster nach keks":
144 // - wenn es noch Kekse hat, hoeren alle:
145 // "Das Monster sagt: Ich hab noch welche. Aetsch!
146 // - sonst:
147 // "Das Monster sagt: "Menno. Keine mehr da!
148
Zesstra0c1a85a2018-02-07 23:46:50 +0100149 // Beispiel 4: dynamischer
Zesstra953f9972017-02-18 15:37:36 +0100150 // ein Prototyp, damit wir die Methode bekannt machen
Arathorn49ecb072021-09-06 16:35:13 +0200151 protected string query_kekse(string key);
152 protected mixed case_fighting(string key);
Zesstra0c1a85a2018-02-07 23:46:50 +0100153
Zesstra953f9972017-02-18 15:37:36 +0100154 AddInfo(({"keks","kekse"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100155 #'query_kekse," // ein Verweis auf die Funktion
Zesstraa1e601e2019-08-08 21:09:32 +0200156 "sagt: ",
Zesstra0c1a85a2018-02-07 23:46:50 +0100157 0, // nicht silent :)
158 #'case_fighting); // noch ein Funktionsverweis
159
Arathorn49ecb072021-09-06 16:35:13 +0200160 protected string query_kekse(string key) {
Zesstra0c1a85a2018-02-07 23:46:50 +0100161 if(present("keks"))
162 return("Ich hab noch welche. Aetsch!");
163 return("Menno. Keine mehr da!");
Zesstra953f9972017-02-18 15:37:36 +0100164 }
165
Arathorn49ecb072021-09-06 16:35:13 +0200166 protected mixed case_fighting(string key) {
Zesstra0c1a85a2018-02-07 23:46:50 +0100167 if(InFight())
168 return("Keine Zeit fuer Kekse. Muss kaempfen.");
169 return 0;
Zesstra953f9972017-02-18 15:37:36 +0100170 }
171
172 // "frage monster nach keks":
173 // - wenn es kaempft, hoeren alle:
174 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
175 // - sonst, wenn es noch Kekse hat, hoeren alle:
176 // "Das Monster sagt: Ich hab noch welche. Aetsch!
177 // - sonst:
178 // "Das Monster sagt: "Menno. Keine mehr da!
179
Zesstra0c1a85a2018-02-07 23:46:50 +0100180 // Beispiel 5: ### dynamisch und komplex ###
Zesstra953f9972017-02-18 15:37:36 +0100181 // ein Prototyp, damit wir die Methode bekannt machen
Arathorn49ecb072021-09-06 16:35:13 +0200182 protected string question_gold(string key);
Zesstra953f9972017-02-18 15:37:36 +0100183
184 // "gold" wird eine Closure auf die Methode question_gold()
185 // zugewiesen, ausserdem soll es still bleiben (wir informieren
186 // den Restraum selbst)
Zesstra0c1a85a2018-02-07 23:46:50 +0100187 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra953f9972017-02-18 15:37:36 +0100188
189 // los gehts, wir generieren unsere Antwort selbst
Arathorn49ecb072021-09-06 16:35:13 +0200190 protected string question_gold(string key) {
Zesstra0c1a85a2018-02-07 23:46:50 +0100191 // wieviel Kohle hat der Spieler
192 int money = this_player()->QueryMoney();
Zesstraa1e601e2019-08-08 21:09:32 +0200193 string* valuables = ({});
194
195 // Wertgegenstaende suchen, d.h. Material kein Gold,
196 // Objekt kein Geld, und auch nicht unsichtbar
197 foreach(object o : deep_inventory(this_player()))
198 {
199 if ( o->QueryMaterial(MAT_GOLD)>0 &&
200 load_name(o) != "/items/money" &&
201 o->QueryProp(P_SHORT) &&
202 !o->QueryProp(P_INVIS) )
203 {
204 valuables += ({o->Name(WER,1)});
205 }
206 }
Zesstra953f9972017-02-18 15:37:36 +0100207
Zesstra0c1a85a2018-02-07 23:46:50 +0100208 // das geht an alle anderen im Raum, silent bietet sich hier
209 // nicht an, weil es mehrere Moeglichkeiten gibt
210 send_room(environment(),
Zesstraa1e601e2019-08-08 21:09:32 +0200211 sprintf("%s murmelt %s etwas zu%s.",
212 Name(WER,1),
213 this_player()->name(WEM,1),
214 (money || sizeof(valuables))?
215 " und glotzt "+this_player()->QueryPronoun(WEN)+
216 " gierig an" : ""),
Zesstra0c1a85a2018-02-07 23:46:50 +0100217 MT_LOOK|MT_LISTEN,
218 MA_EMOTE, 0, ({this_player()}));
219
Zesstraa1e601e2019-08-08 21:09:32 +0200220 // Und hier die Antwort an den Spieler selbst, mit diversen
221 // Verzweigungen fuer dessen Besitztum.
222 string reply = "Ich hab kein Gold bei mir.";
223 string verb = sizeof(valuables) ? "ist" : "sind";
224 if ( money )
225 {
226 reply += " Aber Du hast ja jede Menge Kohle bei dir, so etwa "+
227 money+" Muenzen.";
228 if ( sizeof(valuables) )
229 reply += sprintf(" Ausserdem %s auch noch %s aus Gold.",
230 verb, CountUp(valuables));
231 }
232 else if ( sizeof(valuables) )
233 {
234 reply += sprintf(
235 " Aber Du hast ja ein paar Wertsachen dabei: %s %s aus Gold.",
236 CountUp(valuables), verb);
237 }
238 return reply;
Zesstra953f9972017-02-18 15:37:36 +0100239 }
240
241 // "frage monster nach gold"
242 // - der Fragesteller hoert zB:
Zesstraa1e601e2019-08-08 21:09:32 +0200243 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber Du hast ja
244 // Das Monster murmelt: jede Menge Kohle bei Dir, so etwa <number>
Zesstra953f9972017-02-18 15:37:36 +0100245 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
246 // Das Monster murmelt: und <object2> aus Gold."
247 // - die Umstehenden hoeren:
Zesstrabfab6ac2018-08-29 22:36:57 +0200248 // "Das Monster murmelt @WEM1 etwas zu."
Zesstra953f9972017-02-18 15:37:36 +0100249 // oder
Zesstrabfab6ac2018-08-29 22:36:57 +0200250 // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
Zesstra953f9972017-02-18 15:37:36 +0100251
252
253SIEHE AUCH
254==========
255
Zesstra0c1a85a2018-02-07 23:46:50 +0100256 Verwandt:
Zesstra6cadc1b2018-11-15 22:27:32 +0100257 AddSpecialInfo(), RemoveInfo()
MG Mud User88f12472016-06-24 23:31:02 +0200258
Zesstra0c1a85a2018-02-07 23:46:50 +0100259 Props:
Zesstra6cadc1b2018-11-15 22:27:32 +0100260 P_PRE_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100261
262 Files:
263 /std/npc/info.c
264
265 Loggen:
Zesstra6cadc1b2018-11-15 22:27:32 +0100266 P_LOG_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100267
268 Interna:
Zesstra6cadc1b2018-11-15 22:27:32 +0100269 GetInfoArr() , do_frage()
Zesstra0c1a85a2018-02-07 23:46:50 +0100270
Arathorn49ecb072021-09-06 16:35:13 +020027109.08.2021, Zesstra