blob: 076dfd84288be3115c66467436b0cfd3daea444d [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,
Zesstrad59c00c2018-01-10 20:48:15 +010074 @WEN zu denen von replace_personal(), jedoch nicht in den Rueckgabe-
75 werten von Closures.
Zesstra18626972017-01-31 10:38:27 +010076
77 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
78 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
79 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
80 SetProp(P_DEFAULT_INFO, <text>) ab).
81
82BEISPIELE
83---------
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010084 Siehe auch: /doc/beispiele/AddInfo/
Zesstra18626972017-01-31 10:38:27 +010085
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010086.. code-block:: pike
87
88 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra18626972017-01-31 10:38:27 +010089 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
90 // identisch zu
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010091 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra18626972017-01-31 10:38:27 +010092
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010093.. code-block:: pike
94
95 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra18626972017-01-31 10:38:27 +010096 AddInfo(({"knete","kohle"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010097 "sagt: ich habe so etwas nicht.\n");
Zesstra18626972017-01-31 10:38:27 +010098 AddInfo("geld",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010099 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
100 "sagt: ");
Zesstra18626972017-01-31 10:38:27 +0100101 AddInfo("muenzen",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100102 "fluestert: Du willst Geld?",
103 0,
Zesstra7626ddd2018-02-21 19:27:44 +0100104 "fluestert @WEM1 etwas zu.");
Zesstra18626972017-01-31 10:38:27 +0100105
106 // "frage monster nach geld": alle im Raum hoeren
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100107 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
108 // Das Monster sagt: [...] blablabla [...]
Zesstra18626972017-01-31 10:38:27 +0100109
110 // "frage monster nach muenzen":
111 // - der Fragensteller hoert:
112 // "Das Monster fluestert: Du willst Geld?"
113 // - alle andere hoeren:
114 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
115
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100116.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100117
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100118 // Beispiel 3: dynamisch
119 // ein Prototyp, damit wir die Methode bekannt machen
120 protected string query_kekse();
121
122 AddInfo(({"keks","kekse"}),
123 #'query_kekse, // ein Verweis auf die Funktion
124 "sagt: ");
125
126 protected string query_kekse() {
127 if(present("keks", this_object()))
128 return("Ich hab noch welche. Aetsch!");
129 else if(present("keks", environment()))
130 return("Da liegt einer!");
131 return("Menno. Keine mehr da!");
132 }
Zesstra18626972017-01-31 10:38:27 +0100133 // "frage monster nach keks":
134 // - wenn es noch Kekse hat, hoeren alle:
135 // "Das Monster sagt: Ich hab noch welche. Aetsch!
136 // - sonst:
137 // "Das Monster sagt: "Menno. Keine mehr da!
138
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100139.. code-block:: pike
140
141 // Beispiel 4: dynamischer
Zesstra18626972017-01-31 10:38:27 +0100142 // ein Prototyp, damit wir die Methode bekannt machen
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100143 protected string query_kekse();
144 protected mixed case_fighting();
145
Zesstra18626972017-01-31 10:38:27 +0100146 AddInfo(({"keks","kekse"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100147 #'query_kekse," // ein Verweis auf die Funktion
148 sagt: ",
149 0, // nicht silent :)
150 #'case_fighting); // noch ein Funktionsverweis
151
152 protected string query_kekse() {
153 if(present("keks"))
154 return("Ich hab noch welche. Aetsch!");
155 return("Menno. Keine mehr da!");
Zesstra18626972017-01-31 10:38:27 +0100156 }
157
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100158 protected mixed case_fighting() {
159 if(InFight())
160 return("Keine Zeit fuer Kekse. Muss kaempfen.");
161 return 0;
Zesstra18626972017-01-31 10:38:27 +0100162 }
163
164 // "frage monster nach keks":
165 // - wenn es kaempft, hoeren alle:
166 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
167 // - sonst, wenn es noch Kekse hat, hoeren alle:
168 // "Das Monster sagt: Ich hab noch welche. Aetsch!
169 // - sonst:
170 // "Das Monster sagt: "Menno. Keine mehr da!
171
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100172.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100173
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100174 // Beispiel 5: ### dynamisch und komplex ###
Zesstra18626972017-01-31 10:38:27 +0100175 // ein Prototyp, damit wir die Methode bekannt machen
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100176 protected string question_gold();
Zesstra18626972017-01-31 10:38:27 +0100177
178 // "gold" wird eine Closure auf die Methode question_gold()
179 // zugewiesen, ausserdem soll es still bleiben (wir informieren
180 // den Restraum selbst)
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100181 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra18626972017-01-31 10:38:27 +0100182
183 // los gehts, wir generieren unsere Antwort selbst
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100184 protected string question_gold() {
185 // wieviel Kohle hat der Spieler
186 int money = this_player()->QueryMoney();
Zesstra7626ddd2018-02-21 19:27:44 +0100187 string* y = map(deep_inventory(this_player()),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100188 function string(object o) {
189 if(o->QueryMaterial(MAT_GOLD)>0 &&
190 strstr(object_name(o),"/items/money")<0 &&
191 o->QueryProp(P_NAME))
192 return o->name(WER,1);
193 })-({0});
Zesstra18626972017-01-31 10:38:27 +0100194
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100195 // das geht an alle anderen im Raum, silent bietet sich hier
196 // nicht an, weil es mehrere Moeglichkeiten gibt
197 send_room(environment(),
198 (Name(WER,1)+" murmelt "+
199 this_player()->name(WEM,1)+
200 " etwas zu"+
Zesstra18626972017-01-31 10:38:27 +0100201 ((money || sizeof(y))?
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100202 " und glotzt "+this_player()->QueryPronoun(WEN)+" gierig an.":
203 ".")),
204 MT_LOOK|MT_LISTEN,
205 MA_EMOTE, 0, ({this_player()}));
206
207 // und hier die Antwort an den Spieler selbst, mit vielen
208 // Verzweigungen fuer dessen Besitztum
209 return("Ich hab kein Gold bei mir."+
210 ((money || sizeof(y))?
Zesstra18626972017-01-31 10:38:27 +0100211 " Aber du "+
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100212 (money?
213 "hast ja jede Menge Kohle bei dir, so etwa "+money+
214 " Muenzen."+
215 (sizeof(y)?
216 " Ausserdem "+
217 ((sizeof(y)==1)?"ist":"sind")+
218 " auch noch "+CountUp(y)+" aus Gold.":
219 ""):
220 (sizeof(y)?"hast ja ein paar Wertsachen dabei: "+
Zesstra18626972017-01-31 10:38:27 +0100221 CountUp(y)+
222 (sizeof(y)==1?" ist":" sind")+
223 " aus Gold.":"")):
224 ""));
225 }
226
227 // "frage monster nach gold"
228 // - der Fragesteller hoert zB:
229 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber du hast ja
230 // Das Monster murmelt: jede Menge Kohle bei dir, so etwas <number>
231 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
232 // Das Monster murmelt: und <object2> aus Gold."
233 // - die Umstehenden hoeren:
Zesstra7626ddd2018-02-21 19:27:44 +0100234 // "Das Monster murmelt @WEM1 etwas zu."
Zesstra18626972017-01-31 10:38:27 +0100235 // oder
Zesstra7626ddd2018-02-21 19:27:44 +0100236 // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
Zesstra18626972017-01-31 10:38:27 +0100237
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100238
Zesstra18626972017-01-31 10:38:27 +0100239SIEHE AUCH
240----------
Zesstra18626972017-01-31 10:38:27 +0100241
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100242 Verwandt:
243 :doc:`AddSpecialInfo`, :doc:`RemoveInfo`
244 Props:
245 :doc:`../props/P_PRE_INFO`
246 Files:
247 /std/npc/info.c
248 Loggen:
Zesstra362c7372018-02-05 00:02:24 +0100249 :doc:`../props/P_LOG_INFO`
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100250 Interna:
251 :doc:`GetInfoArr` , :doc:`do_frage`
Zesstra18626972017-01-31 10:38:27 +0100252
Christian Georg Beckera38b32f2017-03-07 23:12:05 +01002537. Mar 2017 Gloinson