blob: 193e40793b6bf1b45f0ce0714c2947bef5536558 [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
Zesstra0c1a85a2018-02-07 23:46:50 +010010 [, 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.
Zesstra0c1a85a2018-02-07 23:46:50 +010024
Zesstra953f9972017-02-18 15:37:36 +010025 string/closure meldung
Zesstra0c1a85a2018-02-07 23:46:50 +010026 Information, die gegeben werden soll/Closure Bekommt nichts
27 uebergeben.
28
Zesstra953f9972017-02-18 15:37:36 +010029 string indent
30 Text, der sich bei mehrzeiligen Meldungen wiederholen soll.
Zesstra0c1a85a2018-02-07 23:46:50 +010031
Zesstra953f9972017-02-18 15:37:36 +010032 int/string silent
33 Ist silent gesetzt, so erfolgt Antwort nur an Fragenden.
Zesstra0c1a85a2018-02-07 23:46:50 +010034
Zesstra953f9972017-02-18 15:37:36 +010035 string/closure casebased
Zesstra0c1a85a2018-02-07 23:46:50 +010036 Closure mit Returnwert string oder int. Bekommt nichts
37 uebergeben.
Zesstra953f9972017-02-18 15:37:36 +010038
39
40BESCHREIBUNG
41============
42
Zesstra0c1a85a2018-02-07 23:46:50 +010043 Wenn ein Spieler ein NPC mittels "frage <monstername> nach <frage>"
44 nach einer Information mit dem Schluessel 'frage' fragt, so wird
45 die entsprechende 'meldung' ausgegeben (oder die Closure in
46 'meldung' gerufen und der zurueckgegebene Text ausgegeben). Der
47 Meldung wird der Name des Monsters vorangestellt.
Zesstra953f9972017-02-18 15:37:36 +010048
49 Frage:
Zesstra0c1a85a2018-02-07 23:46:50 +010050 Schluessel muessen kleingeschrieben sein, koennen aber
51 Leerzeichen enthalten.
Zesstra953f9972017-02-18 15:37:36 +010052
53 Meldung:
Zesstra0c1a85a2018-02-07 23:46:50 +010054 Wenn kein 'indent' angegeben ist, muss man die Meldung selbst
55 umbrechen.
Zesstra953f9972017-02-18 15:37:36 +010056
57 Indent:
Zesstra0c1a85a2018-02-07 23:46:50 +010058 Wird ein 'indent' angegeben so wird jeder Zeile hinter dem
59 Monsternamen noch das 'indent' vorangesetzt. Ein typisches
60 indent ist "sagt: ".
Zesstra953f9972017-02-18 15:37:36 +010061
62 Silent:
Zesstra0c1a85a2018-02-07 23:46:50 +010063 Bei 'silent'==1 erfolgt keine Textausgabe der Antwortmeldung im
64 Raum, ist 'silent' ein String, so wird jener an alle anderen
65 Spieler ausser dem Fragesteller im Raum ausgegeben.
Zesstra953f9972017-02-18 15:37:36 +010066
67 Casebased:
Zesstra0c1a85a2018-02-07 23:46:50 +010068 Die als Closure angegebene Methode entscheidet, ob oder wie der
69 NPC auf diese Frage antworten soll:
Zesstra953f9972017-02-18 15:37:36 +010070
Zesstra0c1a85a2018-02-07 23:46:50 +010071 # return 0: normale Antwort mit "meldung"
72
73 # return 1: keine Antwort/Antwort mit DEFAULT_NOINFO
74
75 # return string: Antwort mit string unter Beruecksichtigung
76 eines indent
77
78 Die Strings von 'silent' und 'meldung' werden geparsed. Dabei
79 koennen die @[...]-Tags von replace_personal() verwendet werden,
Zesstra953f9972017-02-18 15:37:36 +010080 Objekt 1 ist this_player(). Ersetzte String am Satzanfang werden
Zesstra0c1a85a2018-02-07 23:46:50 +010081 automatisch gross geschrieben. AddInfo() konvertiert die alten
82 Schluesselworte @WER, @WESSEN, @WEM, @WEN zu denen von
83 replace_personal(), jedoch nicht in den Rueckgabe- werten von
84 Closures.
Zesstra953f9972017-02-18 15:37:36 +010085
86 Mittels der in <npc.h> definierten Frage DEFAULT_INFO kann eine
87 Meldung gesetzt werden, die gegeben werden soll, wenn der Spieler
88 etwas fragt, auf das keine Antwort vorgegeben ist (das loest
89 SetProp(P_DEFAULT_INFO, <text>) ab).
90
91
92BEISPIELE
93=========
94
Zesstra0c1a85a2018-02-07 23:46:50 +010095 Siehe auch: /doc/beispiele/AddInfo/
96
97 // Beispiel 1: ### eine Standardantwort setzen ###
Zesstra953f9972017-02-18 15:37:36 +010098 AddInfo(DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
99 // identisch zu
Zesstra0c1a85a2018-02-07 23:46:50 +0100100 // obsolet: SetProp(P_DEFAULT_INFO, "starrt Dir boese in die Augen.\n");
Zesstra953f9972017-02-18 15:37:36 +0100101
Zesstra0c1a85a2018-02-07 23:46:50 +0100102 // Beispiel 2: einfache Beispiele, auch mit casebased
Zesstra953f9972017-02-18 15:37:36 +0100103 AddInfo(({"knete","kohle"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100104 "sagt: ich habe so etwas nicht.\n");
Zesstra953f9972017-02-18 15:37:36 +0100105 AddInfo("geld",
Zesstra0c1a85a2018-02-07 23:46:50 +0100106 "Ich habe zwar kein Geld, aber [...] blablabla [...]",
107 "sagt: ");
Zesstra953f9972017-02-18 15:37:36 +0100108 AddInfo("muenzen",
Zesstra0c1a85a2018-02-07 23:46:50 +0100109 "fluestert: Du willst Geld?",
110 0,
Zesstrabfab6ac2018-08-29 22:36:57 +0200111 "fluestert @WEM1 etwas zu.");
Zesstra953f9972017-02-18 15:37:36 +0100112
113 // "frage monster nach geld": alle im Raum hoeren
Zesstra0c1a85a2018-02-07 23:46:50 +0100114 // Das Monster sagt: Ich habe zwar kein Geld, aber [...]
115 // Das Monster sagt: [...] blablabla [...]
Zesstra953f9972017-02-18 15:37:36 +0100116
117 // "frage monster nach muenzen":
118 // - der Fragensteller hoert:
119 // "Das Monster fluestert: Du willst Geld?"
120 // - alle andere hoeren:
121 // "Das Monster fluestert <Fragenstellernamen> etwas zu."
122
Zesstra0c1a85a2018-02-07 23:46:50 +0100123 // Beispiel 3: dynamisch
Zesstra953f9972017-02-18 15:37:36 +0100124 // ein Prototyp, damit wir die Methode bekannt machen
Zesstra0c1a85a2018-02-07 23:46:50 +0100125 protected string query_kekse();
Zesstra953f9972017-02-18 15:37:36 +0100126
Zesstra0c1a85a2018-02-07 23:46:50 +0100127 AddInfo(({"keks","kekse"}),
128 #'query_kekse, // ein Verweis auf die Funktion
129 "sagt: ");
130
131 protected string query_kekse() {
132 if(present("keks", this_object()))
133 return("Ich hab noch welche. Aetsch!");
134 else if(present("keks", environment()))
135 return("Da liegt einer!");
136 return("Menno. Keine mehr da!");
137 }
Zesstra953f9972017-02-18 15:37:36 +0100138 // "frage monster nach keks":
139 // - wenn es noch Kekse hat, hoeren alle:
140 // "Das Monster sagt: Ich hab noch welche. Aetsch!
141 // - sonst:
142 // "Das Monster sagt: "Menno. Keine mehr da!
143
Zesstra0c1a85a2018-02-07 23:46:50 +0100144 // Beispiel 4: dynamischer
Zesstra953f9972017-02-18 15:37:36 +0100145 // ein Prototyp, damit wir die Methode bekannt machen
Zesstra0c1a85a2018-02-07 23:46:50 +0100146 protected string query_kekse();
147 protected mixed case_fighting();
148
Zesstra953f9972017-02-18 15:37:36 +0100149 AddInfo(({"keks","kekse"}),
Zesstra0c1a85a2018-02-07 23:46:50 +0100150 #'query_kekse," // ein Verweis auf die Funktion
151 sagt: ",
152 0, // nicht silent :)
153 #'case_fighting); // noch ein Funktionsverweis
154
155 protected string query_kekse() {
156 if(present("keks"))
157 return("Ich hab noch welche. Aetsch!");
158 return("Menno. Keine mehr da!");
Zesstra953f9972017-02-18 15:37:36 +0100159 }
160
Zesstra0c1a85a2018-02-07 23:46:50 +0100161 protected mixed case_fighting() {
162 if(InFight())
163 return("Keine Zeit fuer Kekse. Muss kaempfen.");
164 return 0;
Zesstra953f9972017-02-18 15:37:36 +0100165 }
166
167 // "frage monster nach keks":
168 // - wenn es kaempft, hoeren alle:
169 // "Das Monster sagt: Keine Zeit fuer Kekse. Muss kaempfen.
170 // - sonst, wenn es noch Kekse hat, hoeren alle:
171 // "Das Monster sagt: Ich hab noch welche. Aetsch!
172 // - sonst:
173 // "Das Monster sagt: "Menno. Keine mehr da!
174
Zesstra0c1a85a2018-02-07 23:46:50 +0100175 // Beispiel 5: ### dynamisch und komplex ###
Zesstra953f9972017-02-18 15:37:36 +0100176 // ein Prototyp, damit wir die Methode bekannt machen
Zesstra0c1a85a2018-02-07 23:46:50 +0100177 protected string question_gold();
Zesstra953f9972017-02-18 15:37:36 +0100178
179 // "gold" wird eine Closure auf die Methode question_gold()
180 // zugewiesen, ausserdem soll es still bleiben (wir informieren
181 // den Restraum selbst)
Zesstra0c1a85a2018-02-07 23:46:50 +0100182 AddInfo("gold", #'question_gold, "murmelt: ", 1);
Zesstra953f9972017-02-18 15:37:36 +0100183
184 // los gehts, wir generieren unsere Antwort selbst
Zesstra0c1a85a2018-02-07 23:46:50 +0100185 protected string question_gold() {
186 // wieviel Kohle hat der Spieler
187 int money = this_player()->QueryMoney();
Zesstrabfab6ac2018-08-29 22:36:57 +0200188 string* y = map(deep_inventory(this_player()),
Zesstra0c1a85a2018-02-07 23:46:50 +0100189 function string(object o) {
190 if(o->QueryMaterial(MAT_GOLD)>0 &&
191 strstr(object_name(o),"/items/money")<0 &&
192 o->QueryProp(P_NAME))
193 return o->name(WER,1);
194 })-({0});
Zesstra953f9972017-02-18 15:37:36 +0100195
Zesstra0c1a85a2018-02-07 23:46:50 +0100196 // das geht an alle anderen im Raum, silent bietet sich hier
197 // nicht an, weil es mehrere Moeglichkeiten gibt
198 send_room(environment(),
199 (Name(WER,1)+" murmelt "+
200 this_player()->name(WEM,1)+
201 " etwas zu"+
Zesstra953f9972017-02-18 15:37:36 +0100202 ((money || sizeof(y))?
Zesstra0c1a85a2018-02-07 23:46:50 +0100203 " und glotzt "+this_player()->QueryPronoun(WEN)+" gierig an.":
204 ".")),
205 MT_LOOK|MT_LISTEN,
206 MA_EMOTE, 0, ({this_player()}));
207
208 // und hier die Antwort an den Spieler selbst, mit vielen
209 // Verzweigungen fuer dessen Besitztum
210 return("Ich hab kein Gold bei mir."+
211 ((money || sizeof(y))?
Zesstra953f9972017-02-18 15:37:36 +0100212 " Aber du "+
Zesstra0c1a85a2018-02-07 23:46:50 +0100213 (money?
214 "hast ja jede Menge Kohle bei dir, so etwa "+money+
215 " Muenzen."+
216 (sizeof(y)?
217 " Ausserdem "+
218 ((sizeof(y)==1)?"ist":"sind")+
219 " auch noch "+CountUp(y)+" aus Gold.":
220 ""):
221 (sizeof(y)?"hast ja ein paar Wertsachen dabei: "+
Zesstra953f9972017-02-18 15:37:36 +0100222 CountUp(y)+
223 (sizeof(y)==1?" ist":" sind")+
224 " aus Gold.":"")):
225 ""));
226 }
227
228 // "frage monster nach gold"
229 // - der Fragesteller hoert zB:
230 // Das Monster murmelt: Ich hab kein Gold bei mir. Aber du hast ja
231 // Das Monster murmelt: jede Menge Kohle bei dir, so etwas <number>
232 // Das Monster murmelt: Muenzen. Ausserdem ist/sind noch <object1>
233 // Das Monster murmelt: und <object2> aus Gold."
234 // - die Umstehenden hoeren:
Zesstrabfab6ac2018-08-29 22:36:57 +0200235 // "Das Monster murmelt @WEM1 etwas zu."
Zesstra953f9972017-02-18 15:37:36 +0100236 // oder
Zesstrabfab6ac2018-08-29 22:36:57 +0200237 // "Das Monster murmelt @WEM1 etwas zu und glotzt ihn/sie gierig an."
Zesstra953f9972017-02-18 15:37:36 +0100238
239
240SIEHE AUCH
241==========
242
Zesstra0c1a85a2018-02-07 23:46:50 +0100243 Verwandt:
Zesstra6cadc1b2018-11-15 22:27:32 +0100244 AddSpecialInfo(), RemoveInfo()
MG Mud User88f12472016-06-24 23:31:02 +0200245
Zesstra0c1a85a2018-02-07 23:46:50 +0100246 Props:
Zesstra6cadc1b2018-11-15 22:27:32 +0100247 P_PRE_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100248
249 Files:
250 /std/npc/info.c
251
252 Loggen:
Zesstra6cadc1b2018-11-15 22:27:32 +0100253 P_LOG_INFO
Zesstra0c1a85a2018-02-07 23:46:50 +0100254
255 Interna:
Zesstra6cadc1b2018-11-15 22:27:32 +0100256 GetInfoArr() , do_frage()
Zesstra0c1a85a2018-02-07 23:46:50 +0100257
2587. Mar 2017 Gloinson