blob: 533a581114dc1360cb58521ad2eb5e6f5a96c192 [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001AddInfo()
2=========
3
4FUNKTION
5--------
Arathorn41004de2020-10-18 22:03:28 +02006::
Zesstra18626972017-01-31 10:38:27 +01007
Arathorn41004de2020-10-18 22:03:28 +02008 public varargs void AddInfo(string|string* key, string|closure info,
9 string indent, int|string silent, string|closure casebased);
Zesstra18626972017-01-31 10:38:27 +010010
11DEFINIERT IN
12------------
Zesstra18626972017-01-31 10:38:27 +010013
14 /std/npc/info.c
15
16ARGUMENTE
17---------
Zesstra18626972017-01-31 10:38:27 +010018
Arathorn41004de2020-10-18 22:03:28 +020019 string|string* frage
Zesstrabbb16a72021-08-09 23:58:46 +020020 Schluesselphrase(n), fuer die der NPC eine Antwort geben soll, wenn
Arathorn41004de2020-10-18 22:03:28 +020021 man ihn danach fragt
22
23 string|closure meldung
Zesstrabbb16a72021-08-09 23:58:46 +020024 Information, die gegeben werden soll; wenn 'meldung' eine
25 Closure ist, wird der gerufenen Funktion die vom Spieler gefragte
26 Schluesselphrase uebergeben.
Arathorn41004de2020-10-18 22:03:28 +020027
28 string indent (optional)
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010029 Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
Arathorn41004de2020-10-18 22:03:28 +020030
31 int|string silent (optional)
Zesstraffa10352019-08-08 21:08:44 +020032 Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
Arathorn41004de2020-10-18 22:03:28 +020033
34 string|closure casebased (optional)
Zesstrabbb16a72021-08-09 23:58:46 +020035 Closure mit Returnwert string oder int. Der Funktion wird die vom
36 Spieler gefragte Schluesselphrase uebergeben.
Zesstra18626972017-01-31 10:38:27 +010037
38BESCHREIBUNG
39------------
Zesstra18626972017-01-31 10:38:27 +010040
41 Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>" nach
42 einer Information mit dem Schluessel 'frage' fragt, so wird die
43 entsprechende 'meldung' ausgegeben (oder die Closure in 'meldung'
44 gerufen und der zurueckgegebene Text ausgegeben). Der Meldung wird
45 der Name des Monsters vorangestellt.
46
47 Frage:
Zesstrabbb16a72021-08-09 23:58:46 +020048 Schluesselphrasen muessen kleingeschrieben sein, koennen aber
49 Leerzeichen enthalten.
Zesstra18626972017-01-31 10:38:27 +010050
51 Meldung:
52 Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
53 umbrechen.
54
55 Indent:
56 Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010057 Monsternamen noch das 'indent' vorangesetzt.
Zesstra18626972017-01-31 10:38:27 +010058 Ein typisches indent ist "sagt: ".
59
60 Silent:
61 Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im Raum,
62 ist 'silent' ein String, so wird jener an alle anderen Spieler ausser
63 dem Fragesteller im Raum ausgegeben.
Zesstraffa10352019-08-08 21:08:44 +020064 Dem ausgegebenen Text wird der Name des NPCs als Indent vorangestellt.
Zesstra18626972017-01-31 10:38:27 +010065
66 Casebased:
67 Die als Closure angegebene Methode entscheidet, ob oder wie der NPC
68 auf diese Frage antworten soll:
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010069
70 # return 0: normale Antwort mit "meldung"
71
72 # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
73
74 # return string: Antwort mit string unter Beruecksichtigung eines indent
75
Zesstra18626972017-01-31 10:38:27 +010076
77 Die Strings von 'silent' und 'meldung' werden geparsed.
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010078 Dabei koennen die @[...]-Tags von replace_personal() verwendet werden,
Arathorn41004de2020-10-18 22:03:28 +020079 Objekt 1 ist this_player(). Ersetzte Strings am Satzanfang werden
Zesstra18626972017-01-31 10:38:27 +010080 automatisch gross geschrieben.
81 AddInfo() konvertiert die alten Schluesselworte @WER, @WESSEN, @WEM,
Zesstrad59c00c2018-01-10 20:48:15 +010082 @WEN zu denen von replace_personal(), jedoch nicht in den Rueckgabe-
83 werten von Closures.
Zesstra18626972017-01-31 10:38:27 +010084
85 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
86 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
87 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
88 SetProp(P_DEFAULT_INFO, <text>) ab).
89
90BEISPIELE
91---------
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010092 Siehe auch: /doc/beispiele/AddInfo/
Zesstra18626972017-01-31 10:38:27 +010093
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010094.. code-block:: pike
95
96 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra18626972017-01-31 10:38:27 +010097 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
98 // identisch zu
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010099 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra18626972017-01-31 10:38:27 +0100100
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100101.. code-block:: pike
102
103 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra18626972017-01-31 10:38:27 +0100104 AddInfo(({"knete","kohle"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100105 "sagt: ich habe so etwas nicht.\n");
Zesstra18626972017-01-31 10:38:27 +0100106 AddInfo("geld",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100107 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
108 "sagt: ");
Zesstra18626972017-01-31 10:38:27 +0100109 AddInfo("muenzen",
Zesstraffa10352019-08-08 21:08:44 +0200110 "fluestert: Du willst Geld?\n",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100111 0,
Zesstraffa10352019-08-08 21:08:44 +0200112 "fluestert @WEM1 etwas zu.\n");
Zesstra18626972017-01-31 10:38:27 +0100113
114 // "frage monster nach geld": alle im Raum hoeren
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100115 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
116 // Das Monster sagt: [...] blablabla [...]
Zesstra18626972017-01-31 10:38:27 +0100117
118 // "frage monster nach muenzen":
119 // - der Fragensteller hoert:
120 // "Das Monster fluestert: Du willst Geld?"
121 // - alle andere hoeren:
122 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
123
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100124.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100125
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100126 // Beispiel 3: dynamisch
127 // ein Prototyp, damit wir die Methode bekannt machen
Zesstrabbb16a72021-08-09 23:58:46 +0200128 protected string query_kekse(string key);
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100129
130 AddInfo(({"keks","kekse"}),
131 #'query_kekse, // ein Verweis auf die Funktion
132 "sagt: ");
133
Zesstrabbb16a72021-08-09 23:58:46 +0200134 protected string query_kekse(string key) {
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100135 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 }
Zesstra18626972017-01-31 10:38:27 +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
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100147.. code-block:: pike
148
149 // Beispiel 4: dynamischer
Zesstra18626972017-01-31 10:38:27 +0100150 // ein Prototyp, damit wir die Methode bekannt machen
Zesstrabbb16a72021-08-09 23:58:46 +0200151 protected string query_kekse(string key);
152 protected mixed case_fighting(string key);
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100153
Zesstra18626972017-01-31 10:38:27 +0100154 AddInfo(({"keks","kekse"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100155 #'query_kekse," // ein Verweis auf die Funktion
Zesstraffa10352019-08-08 21:08:44 +0200156 "sagt: ",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100157 0, // nicht silent :)
158 #'case_fighting); // noch ein Funktionsverweis
159
Zesstrabbb16a72021-08-09 23:58:46 +0200160 protected string query_kekse(string key) {
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100161 if(present("keks"))
162 return("Ich hab noch welche. Aetsch!");
163 return("Menno. Keine mehr da!");
Zesstra18626972017-01-31 10:38:27 +0100164 }
165
Zesstrabbb16a72021-08-09 23:58:46 +0200166 protected mixed case_fighting(string key) {
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100167 if(InFight())
168 return("Keine Zeit fuer Kekse. Muss kaempfen.");
169 return 0;
Zesstra18626972017-01-31 10:38:27 +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
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100180.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100181
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100182 // Beispiel 5: ### dynamisch und komplex ###
Zesstra18626972017-01-31 10:38:27 +0100183 // ein Prototyp, damit wir die Methode bekannt machen
Zesstrabbb16a72021-08-09 23:58:46 +0200184 protected string question_gold(string key);
Zesstra18626972017-01-31 10:38:27 +0100185
186 // "gold" wird eine Closure auf die Methode question_gold()
187 // zugewiesen, ausserdem soll es still bleiben (wir informieren
188 // den Restraum selbst)
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100189 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra18626972017-01-31 10:38:27 +0100190
191 // los gehts, wir generieren unsere Antwort selbst
Zesstrabbb16a72021-08-09 23:58:46 +0200192 protected string question_gold(string key) {
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100193 // wieviel Kohle hat der Spieler
194 int money = this_player()->QueryMoney();
Zesstraffa10352019-08-08 21:08:44 +0200195 string* valuables = ({});
196
197 // Wertgegenstaende suchen, d.h. Material kein Gold,
198 // Objekt kein Geld, und auch nicht unsichtbar
199 foreach(object o : deep_inventory(this_player()))
200 {
201 if ( o->QueryMaterial(MAT_GOLD)>0 &&
202 load_name(o) != "/items/money" &&
203 o->QueryProp(P_SHORT) &&
204 !o->QueryProp(P_INVIS) )
205 {
206 valuables += ({o->Name(WER,1)});
207 }
208 }
Zesstra18626972017-01-31 10:38:27 +0100209
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100210 // das geht an alle anderen im Raum, silent bietet sich hier
211 // nicht an, weil es mehrere Moeglichkeiten gibt
212 send_room(environment(),
Zesstraffa10352019-08-08 21:08:44 +0200213 sprintf("%s murmelt %s etwas zu%s.",
214 Name(WER,1),
215 this_player()->name(WEM,1),
216 (money || sizeof(valuables))?
217 " und glotzt "+this_player()->QueryPronoun(WEN)+
218 " gierig an" : ""),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100219 MT_LOOK|MT_LISTEN,
220 MA_EMOTE, 0, ({this_player()}));
221
Zesstraffa10352019-08-08 21:08:44 +0200222 // Und hier die Antwort an den Spieler selbst, mit diversen
223 // Verzweigungen fuer dessen Besitztum.
224 string reply = "Ich hab kein Gold bei mir.";
225 string verb = sizeof(valuables) ? "ist" : "sind";
226 if ( money )
227 {
228 reply += " Aber Du hast ja jede Menge Kohle bei dir, so etwa "+
229 money+" Muenzen.";
230 if ( sizeof(valuables) )
231 reply += sprintf(" Ausserdem %s auch noch %s aus Gold.",
232 verb, CountUp(valuables));
233 }
234 else if ( sizeof(valuables) )
235 {
236 reply += sprintf(
237 " Aber Du hast ja ein paar Wertsachen dabei: %s %s aus Gold.",
238 CountUp(valuables), verb);
239 }
240 return reply;
Zesstra18626972017-01-31 10:38:27 +0100241 }
242
243 // "frage monster nach gold"
244 // - der Fragesteller hoert zB:
Zesstraffa10352019-08-08 21:08:44 +0200245 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber Du hast ja
246 // Das Monster murmelt: jede Menge Kohle bei Dir, so etwa <number>
Zesstra18626972017-01-31 10:38:27 +0100247 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
248 // Das Monster murmelt: und <object2> aus Gold."
249 // - die Umstehenden hoeren:
Zesstra7626ddd2018-02-21 19:27:44 +0100250 // "Das Monster murmelt @WEM1 etwas zu."
Zesstra18626972017-01-31 10:38:27 +0100251 // oder
Zesstra7626ddd2018-02-21 19:27:44 +0100252 // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
Zesstra18626972017-01-31 10:38:27 +0100253
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100254
Zesstra18626972017-01-31 10:38:27 +0100255SIEHE AUCH
256----------
Zesstra18626972017-01-31 10:38:27 +0100257
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100258 Verwandt:
259 :doc:`AddSpecialInfo`, :doc:`RemoveInfo`
260 Props:
261 :doc:`../props/P_PRE_INFO`
262 Files:
263 /std/npc/info.c
264 Loggen:
Zesstra362c7372018-02-05 00:02:24 +0100265 :doc:`../props/P_LOG_INFO`
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100266 Interna:
267 :doc:`GetInfoArr` , :doc:`do_frage`
Zesstra18626972017-01-31 10:38:27 +0100268
Zesstrabbb16a72021-08-09 23:58:46 +020026909.08.2021, Zesstra