blob: 5db8beff56310f442e278ab1ec6b998536aeaf12 [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
Zesstraffa10352019-08-08 21:08:44 +020021 Information, die gegeben werden soll; wenn 'meldung' eine Closure
22 ist, wird der gerufenen Funktion 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
Zesstraffa10352019-08-08 21:08:44 +020026 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.
Zesstraffa10352019-08-08 21:08:44 +020057 Dem ausgegebenen Text wird der Name des NPCs als Indent vorangestellt.
Zesstra18626972017-01-31 10:38:27 +010058
59 Casebased:
60 Die als Closure angegebene Methode entscheidet, ob oder wie der NPC
61 auf diese Frage antworten soll:
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010062
63 # return 0: normale Antwort mit "meldung"
64
65 # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
66
67 # return string: Antwort mit string unter Beruecksichtigung eines indent
68
Zesstra18626972017-01-31 10:38:27 +010069
70 Die Strings von 'silent' und 'meldung' werden geparsed.
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010071 Dabei koennen die @[...]-Tags von replace_personal() verwendet werden,
Zesstra18626972017-01-31 10:38:27 +010072 Objekt 1 ist this_player(). Ersetzte String am Satzanfang werden
73 automatisch gross geschrieben.
74 AddInfo() konvertiert die alten Schluesselworte @WER, @WESSEN, @WEM,
Zesstrad59c00c2018-01-10 20:48:15 +010075 @WEN zu denen von replace_personal(), jedoch nicht in den Rueckgabe-
76 werten von Closures.
Zesstra18626972017-01-31 10:38:27 +010077
78 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
79 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
80 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
81 SetProp(P_DEFAULT_INFO, <text>) ab).
82
83BEISPIELE
84---------
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010085 Siehe auch: /doc/beispiele/AddInfo/
Zesstra18626972017-01-31 10:38:27 +010086
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010087.. code-block:: pike
88
89 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra18626972017-01-31 10:38:27 +010090 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
91 // identisch zu
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010092 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra18626972017-01-31 10:38:27 +010093
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010094.. code-block:: pike
95
96 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra18626972017-01-31 10:38:27 +010097 AddInfo(({"knete","kohle"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +010098 "sagt: ich habe so etwas nicht.\n");
Zesstra18626972017-01-31 10:38:27 +010099 AddInfo("geld",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100100 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
101 "sagt: ");
Zesstra18626972017-01-31 10:38:27 +0100102 AddInfo("muenzen",
Zesstraffa10352019-08-08 21:08:44 +0200103 "fluestert: Du willst Geld?\n",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100104 0,
Zesstraffa10352019-08-08 21:08:44 +0200105 "fluestert @WEM1 etwas zu.\n");
Zesstra18626972017-01-31 10:38:27 +0100106
107 // "frage monster nach geld": alle im Raum hoeren
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100108 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
109 // Das Monster sagt: [...] blablabla [...]
Zesstra18626972017-01-31 10:38:27 +0100110
111 // "frage monster nach muenzen":
112 // - der Fragensteller hoert:
113 // "Das Monster fluestert: Du willst Geld?"
114 // - alle andere hoeren:
115 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
116
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100117.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100118
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100119 // Beispiel 3: dynamisch
120 // ein Prototyp, damit wir die Methode bekannt machen
121 protected string query_kekse();
122
123 AddInfo(({"keks","kekse"}),
124 #'query_kekse, // ein Verweis auf die Funktion
125 "sagt: ");
126
127 protected string query_kekse() {
128 if(present("keks", this_object()))
129 return("Ich hab noch welche. Aetsch!");
130 else if(present("keks", environment()))
131 return("Da liegt einer!");
132 return("Menno. Keine mehr da!");
133 }
Zesstra18626972017-01-31 10:38:27 +0100134 // "frage monster nach keks":
135 // - wenn es noch Kekse hat, hoeren alle:
136 // "Das Monster sagt: Ich hab noch welche. Aetsch!
137 // - sonst:
138 // "Das Monster sagt: "Menno. Keine mehr da!
139
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100140.. code-block:: pike
141
142 // Beispiel 4: dynamischer
Zesstra18626972017-01-31 10:38:27 +0100143 // ein Prototyp, damit wir die Methode bekannt machen
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100144 protected string query_kekse();
145 protected mixed case_fighting();
146
Zesstra18626972017-01-31 10:38:27 +0100147 AddInfo(({"keks","kekse"}),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100148 #'query_kekse," // ein Verweis auf die Funktion
Zesstraffa10352019-08-08 21:08:44 +0200149 "sagt: ",
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100150 0, // nicht silent :)
151 #'case_fighting); // noch ein Funktionsverweis
152
153 protected string query_kekse() {
154 if(present("keks"))
155 return("Ich hab noch welche. Aetsch!");
156 return("Menno. Keine mehr da!");
Zesstra18626972017-01-31 10:38:27 +0100157 }
158
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100159 protected mixed case_fighting() {
160 if(InFight())
161 return("Keine Zeit fuer Kekse. Muss kaempfen.");
162 return 0;
Zesstra18626972017-01-31 10:38:27 +0100163 }
164
165 // "frage monster nach keks":
166 // - wenn es kaempft, hoeren alle:
167 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
168 // - sonst, wenn es noch Kekse hat, hoeren alle:
169 // "Das Monster sagt: Ich hab noch welche. Aetsch!
170 // - sonst:
171 // "Das Monster sagt: "Menno. Keine mehr da!
172
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100173.. code-block:: pike
Zesstra18626972017-01-31 10:38:27 +0100174
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100175 // Beispiel 5: ### dynamisch und komplex ###
Zesstra18626972017-01-31 10:38:27 +0100176 // ein Prototyp, damit wir die Methode bekannt machen
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100177 protected string question_gold();
Zesstra18626972017-01-31 10:38:27 +0100178
179 // "gold" wird eine Closure auf die Methode question_gold()
180 // zugewiesen, ausserdem soll es still bleiben (wir informieren
181 // den Restraum selbst)
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100182 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra18626972017-01-31 10:38:27 +0100183
184 // los gehts, wir generieren unsere Antwort selbst
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100185 protected string question_gold() {
186 // wieviel Kohle hat der Spieler
187 int money = this_player()->QueryMoney();
Zesstraffa10352019-08-08 21:08:44 +0200188 string* valuables = ({});
189
190 // Wertgegenstaende suchen, d.h. Material kein Gold,
191 // Objekt kein Geld, und auch nicht unsichtbar
192 foreach(object o : deep_inventory(this_player()))
193 {
194 if ( o->QueryMaterial(MAT_GOLD)>0 &&
195 load_name(o) != "/items/money" &&
196 o->QueryProp(P_SHORT) &&
197 !o->QueryProp(P_INVIS) )
198 {
199 valuables += ({o->Name(WER,1)});
200 }
201 }
Zesstra18626972017-01-31 10:38:27 +0100202
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100203 // das geht an alle anderen im Raum, silent bietet sich hier
204 // nicht an, weil es mehrere Moeglichkeiten gibt
205 send_room(environment(),
Zesstraffa10352019-08-08 21:08:44 +0200206 sprintf("%s murmelt %s etwas zu%s.",
207 Name(WER,1),
208 this_player()->name(WEM,1),
209 (money || sizeof(valuables))?
210 " und glotzt "+this_player()->QueryPronoun(WEN)+
211 " gierig an" : ""),
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100212 MT_LOOK|MT_LISTEN,
213 MA_EMOTE, 0, ({this_player()}));
214
Zesstraffa10352019-08-08 21:08:44 +0200215 // Und hier die Antwort an den Spieler selbst, mit diversen
216 // Verzweigungen fuer dessen Besitztum.
217 string reply = "Ich hab kein Gold bei mir.";
218 string verb = sizeof(valuables) ? "ist" : "sind";
219 if ( money )
220 {
221 reply += " Aber Du hast ja jede Menge Kohle bei dir, so etwa "+
222 money+" Muenzen.";
223 if ( sizeof(valuables) )
224 reply += sprintf(" Ausserdem %s auch noch %s aus Gold.",
225 verb, CountUp(valuables));
226 }
227 else if ( sizeof(valuables) )
228 {
229 reply += sprintf(
230 " Aber Du hast ja ein paar Wertsachen dabei: %s %s aus Gold.",
231 CountUp(valuables), verb);
232 }
233 return reply;
Zesstra18626972017-01-31 10:38:27 +0100234 }
235
236 // "frage monster nach gold"
237 // - der Fragesteller hoert zB:
Zesstraffa10352019-08-08 21:08:44 +0200238 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber Du hast ja
239 // Das Monster murmelt: jede Menge Kohle bei Dir, so etwa <number>
Zesstra18626972017-01-31 10:38:27 +0100240 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
241 // Das Monster murmelt: und <object2> aus Gold."
242 // - die Umstehenden hoeren:
Zesstra7626ddd2018-02-21 19:27:44 +0100243 // "Das Monster murmelt @WEM1 etwas zu."
Zesstra18626972017-01-31 10:38:27 +0100244 // oder
Zesstra7626ddd2018-02-21 19:27:44 +0100245 // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
Zesstra18626972017-01-31 10:38:27 +0100246
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100247
Zesstra18626972017-01-31 10:38:27 +0100248SIEHE AUCH
249----------
Zesstra18626972017-01-31 10:38:27 +0100250
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100251 Verwandt:
252 :doc:`AddSpecialInfo`, :doc:`RemoveInfo`
253 Props:
254 :doc:`../props/P_PRE_INFO`
255 Files:
256 /std/npc/info.c
257 Loggen:
Zesstra362c7372018-02-05 00:02:24 +0100258 :doc:`../props/P_LOG_INFO`
Christian Georg Beckera38b32f2017-03-07 23:12:05 +0100259 Interna:
260 :doc:`GetInfoArr` , :doc:`do_frage`
Zesstra18626972017-01-31 10:38:27 +0100261
Christian Georg Beckera38b32f2017-03-07 23:12:05 +01002627. Mar 2017 Gloinson