blob: 1a057dafcece1d02ebfffc7ccdc37fc2299cd4bb [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001AddInfo()
2=========
3
4FUNKTION
5--------
Zesstra18626972017-01-31 10:38:27 +01006
7 varargs void AddInfo( frage, meldung
Christian Georg Beckera38b32f2017-03-07 23:12:05 +01008 [, indent [, [silent [, 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
18 string/string* frage
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010019 Schluesseltext(e) auf die Informationen gegeben werden sollen.
Zesstra18626972017-01-31 10:38:27 +010020 string/closure meldung
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010021 Information, die gegeben werden soll/Closure
22 Bekommt nichts uebergeben.
Zesstra18626972017-01-31 10:38:27 +010023 string indent
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010024 Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
Zesstra18626972017-01-31 10:38:27 +010025 int/string silent
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010026 Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
Zesstra18626972017-01-31 10:38:27 +010027 string/closure casebased
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010028 Closure mit Returnwert string oder int.
29 Bekommt nichts uebergeben.
Zesstra18626972017-01-31 10:38:27 +010030
31BESCHREIBUNG
32------------
Zesstra18626972017-01-31 10:38:27 +010033
34 Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>" nach
35 einer Information mit dem Schluessel 'frage' fragt, so wird die
36 entsprechende 'meldung' ausgegeben (oder die Closure in 'meldung'
37 gerufen und der zurueckgegebene Text ausgegeben). Der Meldung wird
38 der Name des Monsters vorangestellt.
39
40 Frage:
41 Schluessel muessen kleingeschrieben sein, koennen aber Leerzeichen
42 enthalten.
43
44 Meldung:
45 Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
46 umbrechen.
47
48 Indent:
49 Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010050 Monsternamen noch das 'indent' vorangesetzt.
Zesstra18626972017-01-31 10:38:27 +010051 Ein typisches indent ist "sagt: ".
52
53 Silent:
54 Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im Raum,
55 ist 'silent' ein String, so wird jener an alle anderen Spieler ausser
56 dem Fragesteller im Raum ausgegeben.
57
58 Casebased:
59 Die als Closure angegebene Methode entscheidet, ob oder wie der NPC
60 auf diese Frage antworten soll:
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010061
62 # return 0: normale Antwort mit "meldung"
63
64 # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
65
66 # return string: Antwort mit string unter Beruecksichtigung eines indent
67
Zesstra18626972017-01-31 10:38:27 +010068
69 Die Strings von 'silent' und 'meldung' werden geparsed.
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010070 Dabei koennen die @[...]-Tags von replace_personal() verwendet werden,
Zesstra18626972017-01-31 10:38:27 +010071 Objekt 1 ist this_player(). Ersetzte String am Satzanfang werden
72 automatisch gross geschrieben.
73 AddInfo() konvertiert die alten Schluesselworte @WER, @WESSEN, @WEM,
74 @WEN zu denen von replace_personal().
75
76 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
77 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
78 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
79 SetProp(P_DEFAULT_INFO, <text>) ab).
80
81BEISPIELE
82---------
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010083 Siehe auch: /doc/beispiele/AddInfo/
Zesstra18626972017-01-31 10:38:27 +010084
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010085.. code-block:: pike
86
87 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra18626972017-01-31 10:38:27 +010088 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
89 // identisch zu
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010090 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra18626972017-01-31 10:38:27 +010091
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010092.. code-block:: pike
93
94 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra18626972017-01-31 10:38:27 +010095 AddInfo(({"knete","kohle"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010096 "sagt: ich habe so etwas nicht.\n");
Zesstra18626972017-01-31 10:38:27 +010097 AddInfo("geld",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010098 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
99 "sagt: ");
Zesstra18626972017-01-31 10:38:27 +0100100 AddInfo("muenzen",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100101 "fluestert: Du willst Geld?",
102 0,
103 "fluestert @WEM etwas zu.");
Zesstra18626972017-01-31 10:38:27 +0100104
105 // "frage monster nach geld": alle im Raum hoeren
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100106 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
107 // Das Monster sagt: [...] blablabla [...]
Zesstra18626972017-01-31 10:38:27 +0100108
109 // "frage monster nach muenzen":
110 // - der Fragensteller hoert:
111 // "Das Monster fluestert: Du willst Geld?"
112 // - alle andere hoeren:
113 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
114
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100115.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100116
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100117 // Beispiel 3: dynamisch
118 // ein Prototyp, damit wir die Methode bekannt machen
119 protected string query_kekse();
120
121 AddInfo(({"keks","kekse"}),
122 #'query_kekse, // ein Verweis auf die Funktion
123 "sagt: ");
124
125 protected string query_kekse() {
126 if(present("keks", this_object()))
127 return("Ich hab noch welche. Aetsch!");
128 else if(present("keks", environment()))
129 return("Da liegt einer!");
130 return("Menno. Keine mehr da!");
131 }
Zesstra18626972017-01-31 10:38:27 +0100132 // "frage monster nach keks":
133 // - wenn es noch Kekse hat, hoeren alle:
134 // "Das Monster sagt: Ich hab noch welche. Aetsch!
135 // - sonst:
136 // "Das Monster sagt: "Menno. Keine mehr da!
137
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100138.. code-block:: pike
139
140 // Beispiel 4: dynamischer
Zesstra18626972017-01-31 10:38:27 +0100141 // ein Prototyp, damit wir die Methode bekannt machen
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100142 protected string query_kekse();
143 protected mixed case_fighting();
144
Zesstra18626972017-01-31 10:38:27 +0100145 AddInfo(({"keks","kekse"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100146 #'query_kekse," // ein Verweis auf die Funktion
147 sagt: ",
148 0, // nicht silent :)
149 #'case_fighting); // noch ein Funktionsverweis
150
151 protected string query_kekse() {
152 if(present("keks"))
153 return("Ich hab noch welche. Aetsch!");
154 return("Menno. Keine mehr da!");
Zesstra18626972017-01-31 10:38:27 +0100155 }
156
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100157 protected mixed case_fighting() {
158 if(InFight())
159 return("Keine Zeit fuer Kekse. Muss kaempfen.");
160 return 0;
Zesstra18626972017-01-31 10:38:27 +0100161 }
162
163 // "frage monster nach keks":
164 // - wenn es kaempft, hoeren alle:
165 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
166 // - sonst, wenn es noch Kekse hat, hoeren alle:
167 // "Das Monster sagt: Ich hab noch welche. Aetsch!
168 // - sonst:
169 // "Das Monster sagt: "Menno. Keine mehr da!
170
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100171.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100172
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100173 // Beispiel 5: ### dynamisch und komplex ###
Zesstra18626972017-01-31 10:38:27 +0100174 // ein Prototyp, damit wir die Methode bekannt machen
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100175 protected string question_gold();
Zesstra18626972017-01-31 10:38:27 +0100176
177 // "gold" wird eine Closure auf die Methode question_gold()
178 // zugewiesen, ausserdem soll es still bleiben (wir informieren
179 // den Restraum selbst)
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100180 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra18626972017-01-31 10:38:27 +0100181
182 // los gehts, wir generieren unsere Antwort selbst
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100183 protected string question_gold() {
184 // wieviel Kohle hat der Spieler
185 int money = this_player()->QueryMoney();
186 string *y = map(deep_inventory(this_player()),
187 function string(object o) {
188 if(o->QueryMaterial(MAT_GOLD)>0 &&
189 strstr(object_name(o),"/items/money")<0 &&
190 o->QueryProp(P_NAME))
191 return o->name(WER,1);
192 })-({0});
Zesstra18626972017-01-31 10:38:27 +0100193
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100194 // das geht an alle anderen im Raum, silent bietet sich hier
195 // nicht an, weil es mehrere Moeglichkeiten gibt
196 send_room(environment(),
197 (Name(WER,1)+" murmelt "+
198 this_player()->name(WEM,1)+
199 " etwas zu"+
Zesstra18626972017-01-31 10:38:27 +0100200 ((money || sizeof(y))?
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100201 " und glotzt "+this_player()->QueryPronoun(WEN)+" gierig an.":
202 ".")),
203 MT_LOOK|MT_LISTEN,
204 MA_EMOTE, 0, ({this_player()}));
205
206 // und hier die Antwort an den Spieler selbst, mit vielen
207 // Verzweigungen fuer dessen Besitztum
208 return("Ich hab kein Gold bei mir."+
209 ((money || sizeof(y))?
Zesstra18626972017-01-31 10:38:27 +0100210 " Aber du "+
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100211 (money?
212 "hast ja jede Menge Kohle bei dir, so etwa "+money+
213 " Muenzen."+
214 (sizeof(y)?
215 " Ausserdem "+
216 ((sizeof(y)==1)?"ist":"sind")+
217 " auch noch "+CountUp(y)+" aus Gold.":
218 ""):
219 (sizeof(y)?"hast ja ein paar Wertsachen dabei: "+
Zesstra18626972017-01-31 10:38:27 +0100220 CountUp(y)+
221 (sizeof(y)==1?" ist":" sind")+
222 " aus Gold.":"")):
223 ""));
224 }
225
226 // "frage monster nach gold"
227 // - der Fragesteller hoert zB:
228 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber du hast ja
229 // Das Monster murmelt: jede Menge Kohle bei dir, so etwas <number>
230 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
231 // Das Monster murmelt: und <object2> aus Gold."
232 // - die Umstehenden hoeren:
233 // "Das Monster murmelt @WEM etwas zu."
234 // oder
235 // "Das Monster murmelt @WEM etwas zu und glotzt ihn/sie gierig an."
236
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100237
Zesstra18626972017-01-31 10:38:27 +0100238SIEHE AUCH
239----------
Zesstra18626972017-01-31 10:38:27 +0100240
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100241 Verwandt:
242 :doc:`AddSpecialInfo`, :doc:`RemoveInfo`
243 Props:
244 :doc:`../props/P_PRE_INFO`
245 Files:
246 /std/npc/info.c
247 Loggen:
248 :doc:`P_LOG_INFO`
249 Interna:
250 :doc:`GetInfoArr` , :doc:`do_frage`
Zesstra18626972017-01-31 10:38:27 +0100251
Christian Georg Beckera38b32f2017-03-07 23:12:05 +01002527. Mar 2017 Gloinson