blob: 2a7928a7ea9ff12fb549690ef75fc41469751070 [file] [log] [blame]
Zesstra18626972017-01-31 10:38:27 +01001AddInfo()
2=========
3
4FUNKTION
5--------
6::
7
8 varargs void AddInfo( frage, meldung
9 [, indent [, [silent [, casebased] ] ] );
10
11DEFINIERT IN
12------------
13::
14
15 /std/npc/info.c
16
17ARGUMENTE
18---------
19::
20
21 string/string* frage
22 Schluesseltext(e) auf die Informationen gegeben werden sollen.
23 string/closure meldung
24 Information, die gegeben werden soll/Closure
25 string indent
26 Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
27 int/string silent
28 Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
29 string/closure casebased
30 Closure mit Returnwert string oder int.
31
32BESCHREIBUNG
33------------
34::
35
36 Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>" nach
37 einer Information mit dem Schluessel 'frage' fragt, so wird die
38 entsprechende 'meldung' ausgegeben (oder die Closure in 'meldung'
39 gerufen und der zurueckgegebene Text ausgegeben). Der Meldung wird
40 der Name des Monsters vorangestellt.
41
42 Frage:
43 Schluessel muessen kleingeschrieben sein, koennen aber Leerzeichen
44 enthalten.
45
46 Meldung:
47 Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
48 umbrechen.
49
50 Indent:
51 Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
52 Monsternamen noch das 'indent' vorangesetzt. Zusaetzlich wird
53 'meldung' auf jeden Fall sauber umgebrochen.
54 Ein typisches indent ist "sagt: ".
55
56 Silent:
57 Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im Raum,
58 ist 'silent' ein String, so wird jener an alle anderen Spieler ausser
59 dem Fragesteller im Raum ausgegeben.
60
61 Casebased:
62 Die als Closure angegebene Methode entscheidet, ob oder wie der NPC
63 auf diese Frage antworten soll:
64 - return 0: normale Antwort mit "meldung"
65 - return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
66 - return string: Antwort mit string unter Beruecksichtigung eines
67 indent
68
69 Die Strings von 'silent' und 'meldung' werden geparsed.
70 Dabei koennen die @...-Tags von replace_personal() verwendet werden,
71 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---------
83::
84
85 ### eine Standardantwort setzen ###
86 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
87 // identisch zu
88 SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
89
90 ### einfache Beispiele, auch mit casebased ###
91 AddInfo(({"knete","kohle"}),
92 "sagt: ich habe so etwas nicht.\n");
93 AddInfo("geld",
94 "Ich habe zwar kein Geld, aber ... blablabla ...",
95 "sagt: " );
96 AddInfo("muenzen",
97 "fluestert: Du willst Geld?\n",
98 0,
99 "fluestert @WEM etwas zu.\n");
100
101 // "frage monster nach geld": alle im Raum hoeren
102 // Das Monster sagt: Ich habe zwar kein Geld, aber ...
103 // Das Monster sagt: ... blablabla ...
104
105 // "frage monster nach muenzen":
106 // - der Fragensteller hoert:
107 // "Das Monster fluestert: Du willst Geld?"
108 // - alle andere hoeren:
109 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
110
111 ### dynamisch ###
112 // ein Prototyp, damit wir die Methode bekannt machen
113 static string query_kekse();
114 ...
115 AddInfo(({"keks","kekse"}),
116 #'query_kekse, // ein Verweis auf die Funktion
117 "sagt: ");
118 ...
119 static string query_kekse() {
120 if(present("keks"))
121 return("Ich hab noch welche. Aetsch!");
122 return("Menno. Keine mehr da!");
123 }
124
125 // "frage monster nach keks":
126 // - wenn es noch Kekse hat, hoeren alle:
127 // "Das Monster sagt: Ich hab noch welche. Aetsch!
128 // - sonst:
129 // "Das Monster sagt: "Menno. Keine mehr da!
130
131 ### dynamischer ###
132 // ein Prototyp, damit wir die Methode bekannt machen
133 static string query_kekse();
134 static mixed case_fighting();
135 ...
136 AddInfo(({"keks","kekse"}),
137 #'query_kekse," // ein Verweis auf die Funktion
138 sagt: ",
139 0, // nicht silent :)
140 #'case_fighting); // noch ein Funktionsverweis
141 ...
142 static string query_kekse() {
143 if(present("keks"))
144 return("Ich hab noch welche. Aetsch!");
145 return("Menno. Keine mehr da!");
146 }
147
148 static mixed case_fighting() {
149 if(InFight())
150 return("Keine Zeit fuer Kekse. Muss kaempfen.");
151 return 0;
152 }
153
154 // "frage monster nach keks":
155 // - wenn es kaempft, hoeren alle:
156 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
157 // - sonst, wenn es noch Kekse hat, hoeren alle:
158 // "Das Monster sagt: Ich hab noch welche. Aetsch!
159 // - sonst:
160 // "Das Monster sagt: "Menno. Keine mehr da!
161
162
163 ### dynamisch und komplex ###
164 // ein Prototyp, damit wir die Methode bekannt machen
165 static string question_gold();
166 ...
167
168 // "gold" wird eine Closure auf die Methode question_gold()
169 // zugewiesen, ausserdem soll es still bleiben (wir informieren
170 // den Restraum selbst)
171 AddInfo("gold",#'question_gold,"murmelt: ",1);
172 ...
173
174 // los gehts, wir generieren unsere Antwort selbst
175 static string question_gold() {
176 int money;
177 string *y, objstr;
178 object o;
179 // wieviel Kohle hat der Spieler
180 money=this_player()->QueryMoney();
181 y=allocate(0);
182 // und jetzt suchen wir die Dinge aus Gold
183 o=first_inventory(this_player());
184 while(o) {
185 if(o->QueryMaterial(MAT_GOLD)>0 &&
186 strstr(object_name(o),"/obj/money"))
187 y+=({o->name(WER,1)});
188 o=next_inventory(o);
189 }
190
191 // das geht an alle anderen im Raum, silent bietet sich hier
192 // nicht an, weil es mehrere Moeglichkeiten gibt
193 say(break_string(
194 Name(WER,1)+" murmelt "+
195 this_player()->name(WEM,1)+
196 " etwas zu"+
197 ((money || sizeof(y))?
198 " und glotzt "+
199 this_player()->QueryPronoun(WEN)+" gierig an.":
200 "."),78),({this_player()}));
201
202 // und hier die Antwort an den Spieler selbst, mit vielen
203 // Verzweigungen fuer dessen Besitztum
204 return("Ich hab kein Gold bei mir."+
205 ((money || sizeof(y))?
206 " Aber du "+
207 (money?"hast ja jede Menge Kohle bei dir, so etwa "+money+
208 " Muenzen."+
209 (sizeof(y)?
210 " Ausserdem "+
211 ((sizeof(y)==1)?"ist":"sind")+
212 " auch noch "+CountUp(y)+" aus Gold.":
213 ""):
214 (sizeof(y)?" Aber was du so bei dir hast: "+
215 CountUp(y)+
216 (sizeof(y)==1?" ist":" sind")+
217 " aus Gold.":"")):
218 ""));
219 }
220
221 // "frage monster nach gold"
222 // - der Fragesteller hoert zB:
223 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber du hast ja
224 // Das Monster murmelt: jede Menge Kohle bei dir, so etwas <number>
225 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
226 // Das Monster murmelt: und <object2> aus Gold."
227 // - die Umstehenden hoeren:
228 // "Das Monster murmelt @WEM etwas zu."
229 // oder
230 // "Das Monster murmelt @WEM etwas zu und glotzt ihn/sie gierig an."
231
232SIEHE AUCH
233----------
234::
235
236 Verwandt: AddSpecialInfo(L), RemoveInfo(L)
237 Props: P_PRE_INFO, P_DEFAULT_INFO
238 Files: /std/npc/info.c
239 Loggen: P_LOG_INFO
240 Interna: GetInfoArr, do_frage
241
2427.Apr 2004 Gloinson
243