blob: 9de7bd20674b50edc585aaf5a0716b8857e32828 [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
55 Die Strings von 'silent' und 'meldung' werden geparsed. Dabei werden die
56 Schluesselworte @WER, @WESSEN, @WEM, @WEN durch TP->Name(..) ersetzt und
57 @CAP_WER, @CAP_WESSEN, @CAP_WEM, @CAP_WEN durch capitalize(TP-Name(..)).
58
59 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
60 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
61 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
62 SetProp(P_DEFAULT_INFO, <text>) ab).
63
64BEISPIELE:
65 ### eine Standardantwort setzen ###
66 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
67 // identisch zu
68 SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
69
70 ### einfache Beispiele, auch mit casebased ###
71 AddInfo(({"knete","kohle"}),
72 "sagt: ich habe so etwas nicht.\n");
73 AddInfo("geld",
74 "Ich habe zwar kein Geld, aber ... blablabla ...",
75 "sagt: " );
76 AddInfo("muenzen",
77 "fluestert: Du willst Geld?\n",
78 0,
79 "fluestert @WEM etwas zu.\n");
80
81 // "frage monster nach geld": alle im Raum hoeren
82 // Das Monster sagt: Ich habe zwar kein Geld, aber ...
83 // Das Monster sagt: ... blablabla ...
84
85 // "frage monster nach muenzen":
86 // - der Fragensteller hoert:
87 // "Das Monster fluestert: Du willst Geld?"
88 // - alle andere hoeren:
89 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
90
91 ### dynamisch ###
92 // ein Prototyp, damit wir die Methode bekannt machen
93 static string query_kekse();
94 ...
95 AddInfo(({"keks","kekse"}),
96 #'query_kekse, // ein Verweis auf die Funktion
97 "sagt: ");
98 ...
99 static string query_kekse() {
100 if(present("keks"))
101 return("Ich hab noch welche. Aetsch!");
102 return("Menno. Keine mehr da!");
103 }
104
105 // "frage monster nach keks":
106 // - wenn es noch Kekse hat, hoeren alle:
107 // "Das Monster sagt: Ich hab noch welche. Aetsch!
108 // - sonst:
109 // "Das Monster sagt: "Menno. Keine mehr da!
110
111 ### dynamischer ###
112 // ein Prototyp, damit wir die Methode bekannt machen
113 static string query_kekse();
114 static mixed case_fighting();
115 ...
116 AddInfo(({"keks","kekse"}),
117 #'query_kekse," // ein Verweis auf die Funktion
118 sagt: ",
119 0, // nicht silent :)
120 #'case_fighting); // noch ein Funktionsverweis
121 ...
122 static string query_kekse() {
123 if(present("keks"))
124 return("Ich hab noch welche. Aetsch!");
125 return("Menno. Keine mehr da!");
126 }
127
128 static mixed case_fighting() {
129 if(InFight())
130 return("Keine Zeit fuer Kekse. Muss kaempfen.");
131 return 0;
132 }
133
134 // "frage monster nach keks":
135 // - wenn es kaempft, hoeren alle:
136 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
137 // - sonst, wenn es noch Kekse hat, hoeren alle:
138 // "Das Monster sagt: Ich hab noch welche. Aetsch!
139 // - sonst:
140 // "Das Monster sagt: "Menno. Keine mehr da!
141
142
143 ### dynamisch und komplex ###
144 // ein Prototyp, damit wir die Methode bekannt machen
145 static string question_gold();
146 ...
147
148 // "gold" wird eine Closure auf die Methode question_gold()
149 // zugewiesen, ausserdem soll es still bleiben (wir informieren
150 // den Restraum selbst)
151 AddInfo("gold",#'question_gold,"murmelt: ",1);
152 ...
153
154 // los gehts, wir generieren unsere Antwort selbst
155 static string question_gold() {
156 int money;
157 string *y, objstr;
158 object o;
159 // wieviel Kohle hat der Spieler
160 money=this_player()->QueryMoney();
161 y=allocate(0);
162 // und jetzt suchen wir die Dinge aus Gold
163 o=first_inventory(this_player());
164 while(o) {
165 if(o->QueryMaterial(MAT_GOLD)>0 &&
166 strstr(object_name(o),"/obj/money"))
167 y+=({o->name(WER,1)});
168 o=next_inventory(o);
169 }
170
171 // das geht an alle anderen im Raum, silent bietet sich hier
172 // nicht an, weil es mehrere Moeglichkeiten gibt
173 say(break_string(
174 Name(WER,1)+" murmelt "+
175 this_player()->name(WEM,1)+
176 " etwas zu"+
177 ((money || sizeof(y))?
178 " und glotzt "+
179 this_player()->QueryPronoun(WEN)+" gierig an.":
180 "."),78),({this_player()}));
181
182 // und hier die Antwort an den Spieler selbst, mit vielen
183 // Verzweigungen fuer dessen Besitztum
184 return("Ich hab kein Gold bei mir."+
185 ((money || sizeof(y))?
186 " Aber du "+
187 (money?"hast ja jede Menge Kohle bei dir, so etwa "+money+
188 " Muenzen."+
189 (sizeof(y)?
190 " Ausserdem "+
191 ((sizeof(y)==1)?"ist":"sind")+
192 " auch noch "+CountUp(y)+" aus Gold.":
193 ""):
194 (sizeof(y)?" Aber was du so bei dir hast: "+
195 CountUp(y)+
196 (sizeof(y)==1?" ist":" sind")+
197 " aus Gold.":"")):
198 ""));
199 }
200
201 // "frage monster nach gold"
202 // - der Fragesteller hoert zB:
203 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber du hast ja
204 // Das Monster murmelt: jede Menge Kohle bei dir, so etwas <number>
205 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
206 // Das Monster murmelt: und <object2> aus Gold."
207 // - die Umstehenden hoeren:
208 // "Das Monster murmelt @WEM etwas zu."
209 // oder
210 // "Das Monster murmelt @WEM etwas zu und glotzt ihn/sie gierig an."
211
212SIEHE AUCH:
213 Verwandt: AddSpecialInfo(L), RemoveInfo(L)
214 Props: P_PRE_INFO, P_DEFAULT_INFO
215 Files: /std/npc/info.c
216 Loggen: P_LOG_INFO
217 Interna: GetInfoArr, do_frage
218
2197.Apr 2004 Gloinson