blob: c684fe06f7311b01b61ffb218e81ff2eaa16276e [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
Zesstra953f9972017-02-18 15:37:36 +01009 varargs void AddInfo( frage, meldung
Zesstra0c1a85a2018-02-07 23:46:50 +010010 [, indent [, [silent [, 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
22 string/string* frage
23 Schluesseltext(e) auf die Informationen gegeben werden sollen.
Zesstra0c1a85a2018-02-07 23:46:50 +010024
Zesstra953f9972017-02-18 15:37:36 +010025 string/closure meldung
Zesstraa1e601e2019-08-08 21:09:32 +020026 Information, die gegeben werden soll; wenn 'meldung' eine
27 Closure ist, wird der gerufenen Funktion nichts uebergeben.
Zesstra0c1a85a2018-02-07 23:46:50 +010028
Zesstra953f9972017-02-18 15:37:36 +010029 string indent
30 Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
Zesstra0c1a85a2018-02-07 23:46:50 +010031
Zesstra953f9972017-02-18 15:37:36 +010032 int/string silent
33 Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
Zesstra0c1a85a2018-02-07 23:46:50 +010034
Zesstra953f9972017-02-18 15:37:36 +010035 string/closure casebased
Zesstra0c1a85a2018-02-07 23:46:50 +010036 Closure mit Returnwert string oder int. Bekommt nichts
37 uebergeben.
Zesstra953f9972017-02-18 15:37:36 +010038
39
40BESCHREIBUNG
41============
42
Zesstra0c1a85a2018-02-07 23:46:50 +010043 Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>"
44 nach einer Information mit dem Schluessel 'frage' fragt, so wird
45 die entsprechende 'meldung' ausgegeben (oder die Closure in
46 'meldung' gerufen und der zurueckgegebene Text ausgegeben). Der
47 Meldung wird der Name des Monsters vorangestellt.
Zesstra953f9972017-02-18 15:37:36 +010048
49 Frage:
Zesstra0c1a85a2018-02-07 23:46:50 +010050 Schluessel muessen kleingeschrieben sein, koennen aber
51 Leerzeichen enthalten.
Zesstra953f9972017-02-18 15:37:36 +010052
53 Meldung:
Zesstra0c1a85a2018-02-07 23:46:50 +010054 Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
55 umbrechen.
Zesstra953f9972017-02-18 15:37:36 +010056
57 Indent:
Zesstra0c1a85a2018-02-07 23:46:50 +010058 Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
59 Monsternamen noch das 'indent' vorangesetzt. Ein typisches
60 indent ist "sagt: ".
Zesstra953f9972017-02-18 15:37:36 +010061
62 Silent:
Zesstra0c1a85a2018-02-07 23:46:50 +010063 Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im
64 Raum, ist 'silent' ein String, so wird jener an alle anderen
Zesstraa1e601e2019-08-08 21:09:32 +020065 Spieler ausser dem Fragesteller im Raum ausgegeben. Dem
66 ausgegebenen Text wird der Name des NPCs als Indent
67 vorangestellt.
Zesstra953f9972017-02-18 15:37:36 +010068
69 Casebased:
Zesstra0c1a85a2018-02-07 23:46:50 +010070 Die als Closure angegebene Methode entscheidet, ob oder wie der
71 NPC auf diese Frage antworten soll:
Zesstra953f9972017-02-18 15:37:36 +010072
Zesstra0c1a85a2018-02-07 23:46:50 +010073 # return 0: normale Antwort mit "meldung"
74
75 # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
76
77 # return string: Antwort mit string unter Beruecksichtigung
78 eines indent
79
80 Die Strings von 'silent' und 'meldung' werden geparsed. Dabei
81 koennen die @[...]-Tags von replace_personal() verwendet werden,
Zesstra953f9972017-02-18 15:37:36 +010082 Objekt 1 ist this_player(). Ersetzte String am Satzanfang werden
Zesstra0c1a85a2018-02-07 23:46:50 +010083 automatisch gross geschrieben. AddInfo() konvertiert die alten
84 Schluesselworte @WER, @WESSEN, @WEM, @WEN zu denen von
85 replace_personal(), jedoch nicht in den Rueckgabe- werten von
86 Closures.
Zesstra953f9972017-02-18 15:37:36 +010087
88 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
89 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
90 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
91 SetProp(P_DEFAULT_INFO, <text>) ab).
92
93
94BEISPIELE
95=========
96
Zesstra0c1a85a2018-02-07 23:46:50 +010097 Siehe auch: /doc/beispiele/AddInfo/
98
99 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra953f9972017-02-18 15:37:36 +0100100 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
101 // identisch zu
Zesstra0c1a85a2018-02-07 23:46:50 +0100102 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra953f9972017-02-18 15:37:36 +0100103
Zesstra0c1a85a2018-02-07 23:46:50 +0100104 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra953f9972017-02-18 15:37:36 +0100105 AddInfo(({"knete","kohle"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100106 "sagt: ich habe so etwas nicht.\n");
Zesstra953f9972017-02-18 15:37:36 +0100107 AddInfo("geld",
Zesstra0c1a85a2018-02-07 23:46:50 +0100108 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
109 "sagt: ");
Zesstra953f9972017-02-18 15:37:36 +0100110 AddInfo("muenzen",
Zesstraa1e601e2019-08-08 21:09:32 +0200111 "fluestert: Du willst Geld?\n",
Zesstra0c1a85a2018-02-07 23:46:50 +0100112 0,
Zesstraa1e601e2019-08-08 21:09:32 +0200113 "fluestert @WEM1 etwas zu.\n");
Zesstra953f9972017-02-18 15:37:36 +0100114
115 // "frage monster nach geld": alle im Raum hoeren
Zesstra0c1a85a2018-02-07 23:46:50 +0100116 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
117 // Das Monster sagt: [...] blablabla [...]
Zesstra953f9972017-02-18 15:37:36 +0100118
119 // "frage monster nach muenzen":
120 // - der Fragensteller hoert:
121 // "Das Monster fluestert: Du willst Geld?"
122 // - alle andere hoeren:
123 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
124
Zesstra0c1a85a2018-02-07 23:46:50 +0100125 // Beispiel 3: dynamisch
Zesstra953f9972017-02-18 15:37:36 +0100126 // ein Prototyp, damit wir die Methode bekannt machen
Zesstra0c1a85a2018-02-07 23:46:50 +0100127 protected string query_kekse();
Zesstra953f9972017-02-18 15:37:36 +0100128
Zesstra0c1a85a2018-02-07 23:46:50 +0100129 AddInfo(({"keks","kekse"}),
130 #'query_kekse, // ein Verweis auf die Funktion
131 "sagt: ");
132
133 protected string query_kekse() {
134 if(present("keks", this_object()))
135 return("Ich hab noch welche. Aetsch!");
136 else if(present("keks", environment()))
137 return("Da liegt einer!");
138 return("Menno. Keine mehr da!");
139 }
Zesstra953f9972017-02-18 15:37:36 +0100140 // "frage monster nach keks":
141 // - wenn es noch Kekse hat, hoeren alle:
142 // "Das Monster sagt: Ich hab noch welche. Aetsch!
143 // - sonst:
144 // "Das Monster sagt: "Menno. Keine mehr da!
145
Zesstra0c1a85a2018-02-07 23:46:50 +0100146 // Beispiel 4: dynamischer
Zesstra953f9972017-02-18 15:37:36 +0100147 // ein Prototyp, damit wir die Methode bekannt machen
Zesstra0c1a85a2018-02-07 23:46:50 +0100148 protected string query_kekse();
149 protected mixed case_fighting();
150
Zesstra953f9972017-02-18 15:37:36 +0100151 AddInfo(({"keks","kekse"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100152 #'query_kekse," // ein Verweis auf die Funktion
Zesstraa1e601e2019-08-08 21:09:32 +0200153 "sagt: ",
Zesstra0c1a85a2018-02-07 23:46:50 +0100154 0, // nicht silent :)
155 #'case_fighting); // noch ein Funktionsverweis
156
157 protected string query_kekse() {
158 if(present("keks"))
159 return("Ich hab noch welche. Aetsch!");
160 return("Menno. Keine mehr da!");
Zesstra953f9972017-02-18 15:37:36 +0100161 }
162
Zesstra0c1a85a2018-02-07 23:46:50 +0100163 protected mixed case_fighting() {
164 if(InFight())
165 return("Keine Zeit fuer Kekse. Muss kaempfen.");
166 return 0;
Zesstra953f9972017-02-18 15:37:36 +0100167 }
168
169 // "frage monster nach keks":
170 // - wenn es kaempft, hoeren alle:
171 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
172 // - sonst, wenn es noch Kekse hat, hoeren alle:
173 // "Das Monster sagt: Ich hab noch welche. Aetsch!
174 // - sonst:
175 // "Das Monster sagt: "Menno. Keine mehr da!
176
Zesstra0c1a85a2018-02-07 23:46:50 +0100177 // Beispiel 5: ### dynamisch und komplex ###
Zesstra953f9972017-02-18 15:37:36 +0100178 // ein Prototyp, damit wir die Methode bekannt machen
Zesstra0c1a85a2018-02-07 23:46:50 +0100179 protected string question_gold();
Zesstra953f9972017-02-18 15:37:36 +0100180
181 // "gold" wird eine Closure auf die Methode question_gold()
182 // zugewiesen, ausserdem soll es still bleiben (wir informieren
183 // den Restraum selbst)
Zesstra0c1a85a2018-02-07 23:46:50 +0100184 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra953f9972017-02-18 15:37:36 +0100185
186 // los gehts, wir generieren unsere Antwort selbst
Zesstra0c1a85a2018-02-07 23:46:50 +0100187 protected string question_gold() {
188 // wieviel Kohle hat der Spieler
189 int money = this_player()->QueryMoney();
Zesstraa1e601e2019-08-08 21:09:32 +0200190 string* valuables = ({});
191
192 // Wertgegenstaende suchen, d.h. Material kein Gold,
193 // Objekt kein Geld, und auch nicht unsichtbar
194 foreach(object o : deep_inventory(this_player()))
195 {
196 if ( o->QueryMaterial(MAT_GOLD)>0 &&
197 load_name(o) != "/items/money" &&
198 o->QueryProp(P_SHORT) &&
199 !o->QueryProp(P_INVIS) )
200 {
201 valuables += ({o->Name(WER,1)});
202 }
203 }
Zesstra953f9972017-02-18 15:37:36 +0100204
Zesstra0c1a85a2018-02-07 23:46:50 +0100205 // das geht an alle anderen im Raum, silent bietet sich hier
206 // nicht an, weil es mehrere Moeglichkeiten gibt
207 send_room(environment(),
Zesstraa1e601e2019-08-08 21:09:32 +0200208 sprintf("%s murmelt %s etwas zu%s.",
209 Name(WER,1),
210 this_player()->name(WEM,1),
211 (money || sizeof(valuables))?
212 " und glotzt "+this_player()->QueryPronoun(WEN)+
213 " gierig an" : ""),
Zesstra0c1a85a2018-02-07 23:46:50 +0100214 MT_LOOK|MT_LISTEN,
215 MA_EMOTE, 0, ({this_player()}));
216
Zesstraa1e601e2019-08-08 21:09:32 +0200217 // Und hier die Antwort an den Spieler selbst, mit diversen
218 // Verzweigungen fuer dessen Besitztum.
219 string reply = "Ich hab kein Gold bei mir.";
220 string verb = sizeof(valuables) ? "ist" : "sind";
221 if ( money )
222 {
223 reply += " Aber Du hast ja jede Menge Kohle bei dir, so etwa "+
224 money+" Muenzen.";
225 if ( sizeof(valuables) )
226 reply += sprintf(" Ausserdem %s auch noch %s aus Gold.",
227 verb, CountUp(valuables));
228 }
229 else if ( sizeof(valuables) )
230 {
231 reply += sprintf(
232 " Aber Du hast ja ein paar Wertsachen dabei: %s %s aus Gold.",
233 CountUp(valuables), verb);
234 }
235 return reply;
Zesstra953f9972017-02-18 15:37:36 +0100236 }
237
238 // "frage monster nach gold"
239 // - der Fragesteller hoert zB:
Zesstraa1e601e2019-08-08 21:09:32 +0200240 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber Du hast ja
241 // Das Monster murmelt: jede Menge Kohle bei Dir, so etwa <number>
Zesstra953f9972017-02-18 15:37:36 +0100242 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
243 // Das Monster murmelt: und <object2> aus Gold."
244 // - die Umstehenden hoeren:
Zesstrabfab6ac2018-08-29 22:36:57 +0200245 // "Das Monster murmelt @WEM1 etwas zu."
Zesstra953f9972017-02-18 15:37:36 +0100246 // oder
Zesstrabfab6ac2018-08-29 22:36:57 +0200247 // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
Zesstra953f9972017-02-18 15:37:36 +0100248
249
250SIEHE AUCH
251==========
252
Zesstra0c1a85a2018-02-07 23:46:50 +0100253 Verwandt:
Zesstra6cadc1b2018-11-15 22:27:32 +0100254 AddSpecialInfo(), RemoveInfo()
MG Mud User88f12472016-06-24 23:31:02 +0200255
Zesstra0c1a85a2018-02-07 23:46:50 +0100256 Props:
Zesstra6cadc1b2018-11-15 22:27:32 +0100257 P_PRE_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100258
259 Files:
260 /std/npc/info.c
261
262 Loggen:
Zesstra6cadc1b2018-11-15 22:27:32 +0100263 P_LOG_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100264
265 Interna:
Zesstra6cadc1b2018-11-15 22:27:32 +0100266 GetInfoArr() , do_frage()
Zesstra0c1a85a2018-02-07 23:46:50 +0100267
2687. Mar 2017 Gloinson