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