blob: 76c6e1c06898f338b5eda4f86b69914c7a4ac0f8 [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
Arathorn41004de2020-10-18 22:03:28 +02009 public varargs void AddInfo(string|string* key, string|closure 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
23 Schluesselwoerter, fuer die der NPC eine Antwort geben soll,
24 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
28 Closure ist, wird der gerufenen Funktion nichts uebergeben.
Zesstra0c1a85a2018-02-07 23:46:50 +010029
Arathorn41004de2020-10-18 22:03:28 +020030 string indent (optional)
Zesstra953f9972017-02-18 15:37:36 +010031 Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
Zesstra0c1a85a2018-02-07 23:46:50 +010032
Arathorn41004de2020-10-18 22:03:28 +020033 int|string silent (optional)
Zesstra953f9972017-02-18 15:37:36 +010034 Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
Zesstra0c1a85a2018-02-07 23:46:50 +010035
Arathorn41004de2020-10-18 22:03:28 +020036 string|closure casebased (optional)
37 Closure mit Returnwert string oder int. Der Funktion werden
38 keine Argumente uebergeben.
Zesstra953f9972017-02-18 15:37:36 +010039
40
41BESCHREIBUNG
42============
43
Zesstra0c1a85a2018-02-07 23:46:50 +010044 Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>"
45 nach einer Information mit dem Schluessel 'frage' fragt, so wird
46 die entsprechende 'meldung' ausgegeben (oder die Closure in
47 'meldung' gerufen und der zurueckgegebene Text ausgegeben). Der
48 Meldung wird der Name des Monsters vorangestellt.
Zesstra953f9972017-02-18 15:37:36 +010049
50 Frage:
Zesstra0c1a85a2018-02-07 23:46:50 +010051 Schluessel muessen kleingeschrieben sein, koennen aber
52 Leerzeichen enthalten.
Zesstra953f9972017-02-18 15:37:36 +010053
54 Meldung:
Zesstra0c1a85a2018-02-07 23:46:50 +010055 Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
56 umbrechen.
Zesstra953f9972017-02-18 15:37:36 +010057
58 Indent:
Zesstra0c1a85a2018-02-07 23:46:50 +010059 Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
60 Monsternamen noch das 'indent' vorangesetzt. Ein typisches
61 indent ist "sagt: ".
Zesstra953f9972017-02-18 15:37:36 +010062
63 Silent:
Zesstra0c1a85a2018-02-07 23:46:50 +010064 Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im
65 Raum, ist 'silent' ein String, so wird jener an alle anderen
Zesstraa1e601e2019-08-08 21:09:32 +020066 Spieler ausser dem Fragesteller im Raum ausgegeben. Dem
67 ausgegebenen Text wird der Name des NPCs als Indent
68 vorangestellt.
Zesstra953f9972017-02-18 15:37:36 +010069
70 Casebased:
Zesstra0c1a85a2018-02-07 23:46:50 +010071 Die als Closure angegebene Methode entscheidet, ob oder wie der
72 NPC auf diese Frage antworten soll:
Zesstra953f9972017-02-18 15:37:36 +010073
Zesstra0c1a85a2018-02-07 23:46:50 +010074 # return 0: normale Antwort mit "meldung"
75
76 # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
77
78 # return string: Antwort mit string unter Beruecksichtigung
79 eines indent
80
81 Die Strings von 'silent' und 'meldung' werden geparsed. Dabei
82 koennen die @[...]-Tags von replace_personal() verwendet werden,
Arathorn41004de2020-10-18 22:03:28 +020083 Objekt 1 ist this_player(). Ersetzte Strings am Satzanfang werden
Zesstra0c1a85a2018-02-07 23:46:50 +010084 automatisch gross geschrieben. AddInfo() konvertiert die alten
85 Schluesselworte @WER, @WESSEN, @WEM, @WEN zu denen von
86 replace_personal(), jedoch nicht in den Rueckgabe- werten von
87 Closures.
Zesstra953f9972017-02-18 15:37:36 +010088
89 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
90 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
91 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
92 SetProp(P_DEFAULT_INFO, <text>) ab).
93
94
95BEISPIELE
96=========
97
Zesstra0c1a85a2018-02-07 23:46:50 +010098 Siehe auch: /doc/beispiele/AddInfo/
99
100 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra953f9972017-02-18 15:37:36 +0100101 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
102 // identisch zu
Zesstra0c1a85a2018-02-07 23:46:50 +0100103 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra953f9972017-02-18 15:37:36 +0100104
Zesstra0c1a85a2018-02-07 23:46:50 +0100105 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra953f9972017-02-18 15:37:36 +0100106 AddInfo(({"knete","kohle"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100107 "sagt: ich habe so etwas nicht.\n");
Zesstra953f9972017-02-18 15:37:36 +0100108 AddInfo("geld",
Zesstra0c1a85a2018-02-07 23:46:50 +0100109 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
110 "sagt: ");
Zesstra953f9972017-02-18 15:37:36 +0100111 AddInfo("muenzen",
Zesstraa1e601e2019-08-08 21:09:32 +0200112 "fluestert: Du willst Geld?\n",
Zesstra0c1a85a2018-02-07 23:46:50 +0100113 0,
Zesstraa1e601e2019-08-08 21:09:32 +0200114 "fluestert @WEM1 etwas zu.\n");
Zesstra953f9972017-02-18 15:37:36 +0100115
116 // "frage monster nach geld": alle im Raum hoeren
Zesstra0c1a85a2018-02-07 23:46:50 +0100117 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
118 // Das Monster sagt: [...] blablabla [...]
Zesstra953f9972017-02-18 15:37:36 +0100119
120 // "frage monster nach muenzen":
121 // - der Fragensteller hoert:
122 // "Das Monster fluestert: Du willst Geld?"
123 // - alle andere hoeren:
124 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
125
Zesstra0c1a85a2018-02-07 23:46:50 +0100126 // Beispiel 3: dynamisch
Zesstra953f9972017-02-18 15:37:36 +0100127 // ein Prototyp, damit wir die Methode bekannt machen
Zesstra0c1a85a2018-02-07 23:46:50 +0100128 protected string query_kekse();
Zesstra953f9972017-02-18 15:37:36 +0100129
Zesstra0c1a85a2018-02-07 23:46:50 +0100130 AddInfo(({"keks","kekse"}),
131 #'query_kekse, // ein Verweis auf die Funktion
132 "sagt: ");
133
134 protected string query_kekse() {
135 if(present("keks", this_object()))
136 return("Ich hab noch welche. Aetsch!");
137 else if(present("keks", environment()))
138 return("Da liegt einer!");
139 return("Menno. Keine mehr da!");
140 }
Zesstra953f9972017-02-18 15:37:36 +0100141 // "frage monster nach keks":
142 // - wenn es noch Kekse hat, hoeren alle:
143 // "Das Monster sagt: Ich hab noch welche. Aetsch!
144 // - sonst:
145 // "Das Monster sagt: "Menno. Keine mehr da!
146
Zesstra0c1a85a2018-02-07 23:46:50 +0100147 // Beispiel 4: dynamischer
Zesstra953f9972017-02-18 15:37:36 +0100148 // ein Prototyp, damit wir die Methode bekannt machen
Zesstra0c1a85a2018-02-07 23:46:50 +0100149 protected string query_kekse();
150 protected mixed case_fighting();
151
Zesstra953f9972017-02-18 15:37:36 +0100152 AddInfo(({"keks","kekse"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100153 #'query_kekse," // ein Verweis auf die Funktion
Zesstraa1e601e2019-08-08 21:09:32 +0200154 "sagt: ",
Zesstra0c1a85a2018-02-07 23:46:50 +0100155 0, // nicht silent :)
156 #'case_fighting); // noch ein Funktionsverweis
157
158 protected string query_kekse() {
159 if(present("keks"))
160 return("Ich hab noch welche. Aetsch!");
161 return("Menno. Keine mehr da!");
Zesstra953f9972017-02-18 15:37:36 +0100162 }
163
Zesstra0c1a85a2018-02-07 23:46:50 +0100164 protected mixed case_fighting() {
165 if(InFight())
166 return("Keine Zeit fuer Kekse. Muss kaempfen.");
167 return 0;
Zesstra953f9972017-02-18 15:37:36 +0100168 }
169
170 // "frage monster nach keks":
171 // - wenn es kaempft, hoeren alle:
172 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
173 // - sonst, wenn es noch Kekse hat, hoeren alle:
174 // "Das Monster sagt: Ich hab noch welche. Aetsch!
175 // - sonst:
176 // "Das Monster sagt: "Menno. Keine mehr da!
177
Zesstra0c1a85a2018-02-07 23:46:50 +0100178 // Beispiel 5: ### dynamisch und komplex ###
Zesstra953f9972017-02-18 15:37:36 +0100179 // ein Prototyp, damit wir die Methode bekannt machen
Zesstra0c1a85a2018-02-07 23:46:50 +0100180 protected string question_gold();
Zesstra953f9972017-02-18 15:37:36 +0100181
182 // "gold" wird eine Closure auf die Methode question_gold()
183 // zugewiesen, ausserdem soll es still bleiben (wir informieren
184 // den Restraum selbst)
Zesstra0c1a85a2018-02-07 23:46:50 +0100185 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra953f9972017-02-18 15:37:36 +0100186
187 // los gehts, wir generieren unsere Antwort selbst
Zesstra0c1a85a2018-02-07 23:46:50 +0100188 protected string question_gold() {
189 // wieviel Kohle hat der Spieler
190 int money = this_player()->QueryMoney();
Zesstraa1e601e2019-08-08 21:09:32 +0200191 string* valuables = ({});
192
193 // Wertgegenstaende suchen, d.h. Material kein Gold,
194 // Objekt kein Geld, und auch nicht unsichtbar
195 foreach(object o : deep_inventory(this_player()))
196 {
197 if ( o->QueryMaterial(MAT_GOLD)>0 &&
198 load_name(o) != "/items/money" &&
199 o->QueryProp(P_SHORT) &&
200 !o->QueryProp(P_INVIS) )
201 {
202 valuables += ({o->Name(WER,1)});
203 }
204 }
Zesstra953f9972017-02-18 15:37:36 +0100205
Zesstra0c1a85a2018-02-07 23:46:50 +0100206 // das geht an alle anderen im Raum, silent bietet sich hier
207 // nicht an, weil es mehrere Moeglichkeiten gibt
208 send_room(environment(),
Zesstraa1e601e2019-08-08 21:09:32 +0200209 sprintf("%s murmelt %s etwas zu%s.",
210 Name(WER,1),
211 this_player()->name(WEM,1),
212 (money || sizeof(valuables))?
213 " und glotzt "+this_player()->QueryPronoun(WEN)+
214 " gierig an" : ""),
Zesstra0c1a85a2018-02-07 23:46:50 +0100215 MT_LOOK|MT_LISTEN,
216 MA_EMOTE, 0, ({this_player()}));
217
Zesstraa1e601e2019-08-08 21:09:32 +0200218 // Und hier die Antwort an den Spieler selbst, mit diversen
219 // Verzweigungen fuer dessen Besitztum.
220 string reply = "Ich hab kein Gold bei mir.";
221 string verb = sizeof(valuables) ? "ist" : "sind";
222 if ( money )
223 {
224 reply += " Aber Du hast ja jede Menge Kohle bei dir, so etwa "+
225 money+" Muenzen.";
226 if ( sizeof(valuables) )
227 reply += sprintf(" Ausserdem %s auch noch %s aus Gold.",
228 verb, CountUp(valuables));
229 }
230 else if ( sizeof(valuables) )
231 {
232 reply += sprintf(
233 " Aber Du hast ja ein paar Wertsachen dabei: %s %s aus Gold.",
234 CountUp(valuables), verb);
235 }
236 return reply;
Zesstra953f9972017-02-18 15:37:36 +0100237 }
238
239 // "frage monster nach gold"
240 // - der Fragesteller hoert zB:
Zesstraa1e601e2019-08-08 21:09:32 +0200241 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber Du hast ja
242 // Das Monster murmelt: jede Menge Kohle bei Dir, so etwa <number>
Zesstra953f9972017-02-18 15:37:36 +0100243 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
244 // Das Monster murmelt: und <object2> aus Gold."
245 // - die Umstehenden hoeren:
Zesstrabfab6ac2018-08-29 22:36:57 +0200246 // "Das Monster murmelt @WEM1 etwas zu."
Zesstra953f9972017-02-18 15:37:36 +0100247 // oder
Zesstrabfab6ac2018-08-29 22:36:57 +0200248 // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
Zesstra953f9972017-02-18 15:37:36 +0100249
250
251SIEHE AUCH
252==========
253
Zesstra0c1a85a2018-02-07 23:46:50 +0100254 Verwandt:
Zesstra6cadc1b2018-11-15 22:27:32 +0100255 AddSpecialInfo(), RemoveInfo()
MG Mud User88f12472016-06-24 23:31:02 +0200256
Zesstra0c1a85a2018-02-07 23:46:50 +0100257 Props:
Zesstra6cadc1b2018-11-15 22:27:32 +0100258 P_PRE_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100259
260 Files:
261 /std/npc/info.c
262
263 Loggen:
Zesstra6cadc1b2018-11-15 22:27:32 +0100264 P_LOG_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100265
266 Interna:
Zesstra6cadc1b2018-11-15 22:27:32 +0100267 GetInfoArr() , do_frage()
Zesstra0c1a85a2018-02-07 23:46:50 +0100268
Arathorn41004de2020-10-18 22:03:28 +020026924.09.2020, Arathorn