blob: 0941d762ef4ff53885c96ef4848550a4059de37b [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001AddInfo()
2=========
3
4FUNKTION
5--------
Zesstra18626972017-01-31 10:38:27 +01006
Arathorn41004de2020-10-18 22:03:28 +02007 public varargs void AddInfo(string|string* key, string|closure info,
8 string indent, int|string silent, string|closure casebased);
Zesstra18626972017-01-31 10:38:27 +01009
10DEFINIERT IN
11------------
Zesstra18626972017-01-31 10:38:27 +010012
13 /std/npc/info.c
14
15ARGUMENTE
16---------
Zesstra18626972017-01-31 10:38:27 +010017
Arathorn41004de2020-10-18 22:03:28 +020018 string|string* frage
Zesstrabbb16a72021-08-09 23:58:46 +020019 Schluesselphrase(n), fuer die der NPC eine Antwort geben soll, wenn
Arathorn41004de2020-10-18 22:03:28 +020020 man ihn danach fragt
21
22 string|closure meldung
Zesstrabbb16a72021-08-09 23:58:46 +020023 Information, die gegeben werden soll; wenn 'meldung' eine
24 Closure ist, wird der gerufenen Funktion die vom Spieler gefragte
25 Schluesselphrase uebergeben.
Arathorn41004de2020-10-18 22:03:28 +020026
27 string indent (optional)
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010028 Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
Arathorn41004de2020-10-18 22:03:28 +020029
30 int|string silent (optional)
Zesstraffa10352019-08-08 21:08:44 +020031 Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
Arathorn41004de2020-10-18 22:03:28 +020032
33 string|closure casebased (optional)
Zesstrabbb16a72021-08-09 23:58:46 +020034 Closure mit Returnwert string oder int. Der Funktion wird die vom
35 Spieler gefragte Schluesselphrase uebergeben.
Zesstra18626972017-01-31 10:38:27 +010036
37BESCHREIBUNG
38------------
Zesstra18626972017-01-31 10:38:27 +010039
40 Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>" nach
41 einer Information mit dem Schluessel 'frage' fragt, so wird die
42 entsprechende 'meldung' ausgegeben (oder die Closure in 'meldung'
43 gerufen und der zurueckgegebene Text ausgegeben). Der Meldung wird
44 der Name des Monsters vorangestellt.
45
46 Frage:
Zesstrabbb16a72021-08-09 23:58:46 +020047 Schluesselphrasen muessen kleingeschrieben sein, koennen aber
48 Leerzeichen enthalten.
Zesstra18626972017-01-31 10:38:27 +010049
50 Meldung:
51 Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
52 umbrechen.
53
54 Indent:
55 Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010056 Monsternamen noch das 'indent' vorangesetzt.
Zesstra18626972017-01-31 10:38:27 +010057 Ein typisches indent ist "sagt: ".
58
59 Silent:
60 Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im Raum,
61 ist 'silent' ein String, so wird jener an alle anderen Spieler ausser
62 dem Fragesteller im Raum ausgegeben.
Zesstraffa10352019-08-08 21:08:44 +020063 Dem ausgegebenen Text wird der Name des NPCs als Indent vorangestellt.
Zesstra18626972017-01-31 10:38:27 +010064
65 Casebased:
66 Die als Closure angegebene Methode entscheidet, ob oder wie der NPC
67 auf diese Frage antworten soll:
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010068
69 # return 0: normale Antwort mit "meldung"
70
71 # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
72
73 # return string: Antwort mit string unter Beruecksichtigung eines indent
74
Zesstra18626972017-01-31 10:38:27 +010075
76 Die Strings von 'silent' und 'meldung' werden geparsed.
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010077 Dabei koennen die @[...]-Tags von replace_personal() verwendet werden,
Arathorn41004de2020-10-18 22:03:28 +020078 Objekt 1 ist this_player(). Ersetzte Strings am Satzanfang werden
Zesstra18626972017-01-31 10:38:27 +010079 automatisch gross geschrieben.
80 AddInfo() konvertiert die alten Schluesselworte @WER, @WESSEN, @WEM,
Zesstrad59c00c2018-01-10 20:48:15 +010081 @WEN zu denen von replace_personal(), jedoch nicht in den Rueckgabe-
82 werten von Closures.
Zesstra18626972017-01-31 10:38:27 +010083
84 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
85 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
86 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
87 SetProp(P_DEFAULT_INFO, <text>) ab).
88
89BEISPIELE
90---------
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010091 Siehe auch: /doc/beispiele/AddInfo/
Zesstra18626972017-01-31 10:38:27 +010092
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010093.. code-block:: pike
94
95 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra18626972017-01-31 10:38:27 +010096 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
97 // identisch zu
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010098 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra18626972017-01-31 10:38:27 +010099
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100100.. code-block:: pike
101
102 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra18626972017-01-31 10:38:27 +0100103 AddInfo(({"knete","kohle"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100104 "sagt: ich habe so etwas nicht.\n");
Zesstra18626972017-01-31 10:38:27 +0100105 AddInfo("geld",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100106 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
107 "sagt: ");
Zesstra18626972017-01-31 10:38:27 +0100108 AddInfo("muenzen",
Zesstraffa10352019-08-08 21:08:44 +0200109 "fluestert: Du willst Geld?\n",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100110 0,
Zesstraffa10352019-08-08 21:08:44 +0200111 "fluestert @WEM1 etwas zu.\n");
Zesstra18626972017-01-31 10:38:27 +0100112
113 // "frage monster nach geld": alle im Raum hoeren
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100114 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
115 // Das Monster sagt: [...] blablabla [...]
Zesstra18626972017-01-31 10:38:27 +0100116
117 // "frage monster nach muenzen":
118 // - der Fragensteller hoert:
119 // "Das Monster fluestert: Du willst Geld?"
120 // - alle andere hoeren:
121 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
122
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100123.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100124
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100125 // Beispiel 3: dynamisch
126 // ein Prototyp, damit wir die Methode bekannt machen
Zesstrabbb16a72021-08-09 23:58:46 +0200127 protected string query_kekse(string key);
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100128
129 AddInfo(({"keks","kekse"}),
130 #'query_kekse, // ein Verweis auf die Funktion
131 "sagt: ");
132
Zesstrabbb16a72021-08-09 23:58:46 +0200133 protected string query_kekse(string key) {
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100134 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 }
Zesstra18626972017-01-31 10:38:27 +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
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100146.. code-block:: pike
147
148 // Beispiel 4: dynamischer
Zesstra18626972017-01-31 10:38:27 +0100149 // ein Prototyp, damit wir die Methode bekannt machen
Zesstrabbb16a72021-08-09 23:58:46 +0200150 protected string query_kekse(string key);
151 protected mixed case_fighting(string key);
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100152
Zesstra18626972017-01-31 10:38:27 +0100153 AddInfo(({"keks","kekse"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100154 #'query_kekse," // ein Verweis auf die Funktion
Zesstraffa10352019-08-08 21:08:44 +0200155 "sagt: ",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100156 0, // nicht silent :)
157 #'case_fighting); // noch ein Funktionsverweis
158
Zesstrabbb16a72021-08-09 23:58:46 +0200159 protected string query_kekse(string key) {
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100160 if(present("keks"))
161 return("Ich hab noch welche. Aetsch!");
162 return("Menno. Keine mehr da!");
Zesstra18626972017-01-31 10:38:27 +0100163 }
164
Zesstrabbb16a72021-08-09 23:58:46 +0200165 protected mixed case_fighting(string key) {
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100166 if(InFight())
167 return("Keine Zeit fuer Kekse. Muss kaempfen.");
168 return 0;
Zesstra18626972017-01-31 10:38:27 +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
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100179.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100180
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100181 // Beispiel 5: ### dynamisch und komplex ###
Zesstra18626972017-01-31 10:38:27 +0100182 // ein Prototyp, damit wir die Methode bekannt machen
Zesstrabbb16a72021-08-09 23:58:46 +0200183 protected string question_gold(string key);
Zesstra18626972017-01-31 10:38:27 +0100184
185 // "gold" wird eine Closure auf die Methode question_gold()
186 // zugewiesen, ausserdem soll es still bleiben (wir informieren
187 // den Restraum selbst)
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100188 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra18626972017-01-31 10:38:27 +0100189
190 // los gehts, wir generieren unsere Antwort selbst
Zesstrabbb16a72021-08-09 23:58:46 +0200191 protected string question_gold(string key) {
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100192 // wieviel Kohle hat der Spieler
193 int money = this_player()->QueryMoney();
Zesstraffa10352019-08-08 21:08:44 +0200194 string* valuables = ({});
195
196 // Wertgegenstaende suchen, d.h. Material kein Gold,
197 // Objekt kein Geld, und auch nicht unsichtbar
198 foreach(object o : deep_inventory(this_player()))
199 {
200 if ( o->QueryMaterial(MAT_GOLD)>0 &&
201 load_name(o) != "/items/money" &&
202 o->QueryProp(P_SHORT) &&
203 !o->QueryProp(P_INVIS) )
204 {
205 valuables += ({o->Name(WER,1)});
206 }
207 }
Zesstra18626972017-01-31 10:38:27 +0100208
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100209 // das geht an alle anderen im Raum, silent bietet sich hier
210 // nicht an, weil es mehrere Moeglichkeiten gibt
211 send_room(environment(),
Zesstraffa10352019-08-08 21:08:44 +0200212 sprintf("%s murmelt %s etwas zu%s.",
213 Name(WER,1),
214 this_player()->name(WEM,1),
215 (money || sizeof(valuables))?
216 " und glotzt "+this_player()->QueryPronoun(WEN)+
217 " gierig an" : ""),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100218 MT_LOOK|MT_LISTEN,
219 MA_EMOTE, 0, ({this_player()}));
220
Zesstraffa10352019-08-08 21:08:44 +0200221 // Und hier die Antwort an den Spieler selbst, mit diversen
222 // Verzweigungen fuer dessen Besitztum.
223 string reply = "Ich hab kein Gold bei mir.";
224 string verb = sizeof(valuables) ? "ist" : "sind";
225 if ( money )
226 {
227 reply += " Aber Du hast ja jede Menge Kohle bei dir, so etwa "+
228 money+" Muenzen.";
229 if ( sizeof(valuables) )
230 reply += sprintf(" Ausserdem %s auch noch %s aus Gold.",
231 verb, CountUp(valuables));
232 }
233 else if ( sizeof(valuables) )
234 {
235 reply += sprintf(
236 " Aber Du hast ja ein paar Wertsachen dabei: %s %s aus Gold.",
237 CountUp(valuables), verb);
238 }
239 return reply;
Zesstra18626972017-01-31 10:38:27 +0100240 }
241
242 // "frage monster nach gold"
243 // - der Fragesteller hoert zB:
Zesstraffa10352019-08-08 21:08:44 +0200244 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber Du hast ja
245 // Das Monster murmelt: jede Menge Kohle bei Dir, so etwa <number>
Zesstra18626972017-01-31 10:38:27 +0100246 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
247 // Das Monster murmelt: und <object2> aus Gold."
248 // - die Umstehenden hoeren:
Zesstra7626ddd2018-02-21 19:27:44 +0100249 // "Das Monster murmelt @WEM1 etwas zu."
Zesstra18626972017-01-31 10:38:27 +0100250 // oder
Zesstra7626ddd2018-02-21 19:27:44 +0100251 // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
Zesstra18626972017-01-31 10:38:27 +0100252
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100253
Zesstra18626972017-01-31 10:38:27 +0100254SIEHE AUCH
255----------
Zesstra18626972017-01-31 10:38:27 +0100256
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100257 Verwandt:
258 :doc:`AddSpecialInfo`, :doc:`RemoveInfo`
259 Props:
260 :doc:`../props/P_PRE_INFO`
261 Files:
262 /std/npc/info.c
263 Loggen:
Zesstra362c7372018-02-05 00:02:24 +0100264 :doc:`../props/P_LOG_INFO`
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100265 Interna:
266 :doc:`GetInfoArr` , :doc:`do_frage`
Zesstra18626972017-01-31 10:38:27 +0100267
Zesstrabbb16a72021-08-09 23:58:46 +020026809.08.2021, Zesstra