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