blob: 6fb84cf03d79aa361720afc01cf0a0e092f05363 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// gilde.c -- Standardgilde
4//
5// $Id: gilde.c 8388 2013-02-16 17:28:31Z Zesstra $
6#pragma strong_types
7#pragma save_types
8#pragma range_check
9#pragma no_clone
10#pragma pedantic
11
12inherit "/std/room";
13
14#include <properties.h>
15#include <defines.h>
16#include <rooms.h>
17#include <wizlevels.h>
18#include <language.h>
19#include <new_skills.h>
20#include <exploration.h>
21#include <ansi.h>
22#include "/secure/questmaster.h"
23#include "/secure/lepmaster.h"
24#include "/secure/config.h"
25#include <events.h>
26
27#define kosten_0 \
28 ([0: "Bis Du Dich das naechste Mal hier blicken laesst, solltest Du eine Menge Stufenpunkte sammeln. Sonst wird das nix!",\
29 "zauberer": "Jetzt fang hier ja nicht an zu jammern. Du hast doch grade erst erhoeht. Fuer die naechste Stufe musst Du erstmal Leistung zeigen!",\
30 "kaempfer": "Hat grade erst erhoeht und faengt schon an zu jammern wie ein altersschwacher Zauberer. Nimm gefaelligst Haltung an!",\
31 "klerus": "Wer hat Dir denn das Gehirn gelaeutert? Zeig erstmal was von Deinem Koennen, bevor Du schon wieder erhoehen willst!",\
32 "chaos": "So chaotisch kannst Du doch nicht sein zu glauben, dass Du schon wieder erhoehen kannst!",\
33 "karate": "Ruh Deine Knochen erstmal ein bisschen aus. Bis zur naechsten Stufe werden sie noch genug leiden muessen!",\
34 "katzenkrieger": "Da hilft kein Maunzen und kein Schnurren. Du hast grade erst erhoeht und dabei bleibt das!",\
35 "tanjian": "Jetzt schrei nicht gleich nach Siamil. Du musst noch eine Menge leisten bis zur naechsten Stufe!",\
36 "bierschuettler": "Du hast das Bier auf Deinen letzten Erfolg noch nicht einmal ausgetrunken. Werd jetzt ja nicht groessenwahnsinnig!",\
37 "werwoelfe" : "Und wenn Du noch so grimmig guckst und den Mond anheulst. Du hast gerade erst erhoeht. Nun musst Du erstmal wieder etwas tun!",\
38 ])
39#define kosten_20 \
40 ([0: "Da liegt aber noch ein weiter Weg vor Dir. Aber Du schaffst es ganz sicher!",\
41 "zauberer": "Du kannst zwar zaubern, aber nicht hexen. Fuer die naechste Stufe musst Du schon noch einiges tun!",\
42 "kaempfer": "Oh weh, da hast Du aber noch ne Menge vor Dir. Beiss die Zaehne zusammen und los gehts!",\
43 "klerus": "Du wirst bestimmt noch einige Heiltraenke brauchen bis zur naechsten Stufe!",\
44 "chaos": "Hast Du versucht Dein Chaos zu beseitigen, oder was hast Du gemacht? Sehr weit gekommen biste jedenfalls noch nicht. Musst Dich schon ein bisschen anstrengen!",\
45 "karate": "Ganz schoen anstrengend immer nur mit Hand und Fuss zu metzeln, oder? Aber es hat Dich schon etwas naeher an die naechste Stufe rangebracht!",\
46 "katzenkrieger": "Bisschen weniger Fellpflege betreiben, und ein bisschen mehr Stufenpunkte sammeln. Du hast naemlich noch ein gutes Stueck vor Dir!",\
47 "tanjian": "Du hast noch ne Menge zu tun bis zur naechsten Stufe. Sterb nicht so oft, aber sowas tun Tanjian ja eh nicht!",\
48 "bierschuettler": "Bier trinken alleine wird Dich nicht weiter bringen, obwohl Du schon ein Stueck weit gekommen bist!",\
49 "werwoelfe" : "Staerke Deine Willenskraft. Du hast noch einiges vor Dir!",\
50 ])
51#define kosten_40 \
52 ([0: "Also die Haelfte hast Du schon ungefaehr geschafft. Aber ruh Dich jetzt ja nicht darauf aus. Sieh mal zu, dass Du die zweite Haelfte zur naechsten Stufe auch noch schaffst. Auf einem Bein kann man schliesslich nicht lange stehn!",\
53 "zauberer": "Teile Llystrathe mit Hilfe. Och schade scheint nicht zu funktionieren, dann musst Du eben selber noch ne Menge Stufenpunkte sammeln!",\
54 "kaempfer": "Kaempfer schnell an die Waffen! Die Haelfte hast Du ungefaehr geschafft, aber es gibt noch viel zu tun!",\
55 "klerus": "Beile Dich! Das Boese sitzt Dir im Nacken und Du hast noch ungefaehr die Haelfte vor Dir!",\
56 "chaos": "Schnapp Dir Deinen Daemon und teil Dir die zweite Haelfte der Arbeit mit ihm!",\
57 "karate": "Du scheinst eingesehen zu haben, dass hirnloses Draufhauen nix nutzt. Die Haelfte haste ungefaehr schon geschafft!",\
58 "katzenkrieger": "So ungefaehr bis zur Haelfte hast Du Dich schon an die neue Stufe herangeschlichen!",\
59 "tanjian": "Man kann den Wert zwischen den beiden Stufen durchaus als ausgewogen bezeichnen. Trotzdem hast Du noch ein Stueck des Weges vor Dir!",\
60 "bierschuettler": "War das Fass nu halb voll oder halb leer? Jedenfalls biste ungefaehr bei der Haelfte angekommen!",\
61 "werwoelfe" : "Noch einige Gegner werden sich vor Dir fuerchten muessen, obwohl Du schon viel geschafft hast!",\
62 ])
63#define kosten_60 \
64 ([0: "Also ein bisschen was musst Du noch tun, aber es sieht schon ziemlich gut aus!",\
65 "zauberer": "Ein bisschen Wille und Magie und Du schaffst es wieder ein Stueck naeher an die neue Stufe heranzukommen!",\
66 "kaempfer": "Staerke Deinen Kampfwillen. Die groessten Anstrengungen hast Du schon hinter Dir!",\
67 "klerus": "So nah am Ziel wirst Du doch nicht aufgeben wollen. Hol Dir noch ein bisschen goettliche Unterstuetzung und weiter gehts!",\
68 "chaos": "Chaotisch sein alleine hilft nicht. Ein bisschen was musst Du schon noch tun!",\
69 "karate": "Die Handkanten geschaerft, den Gi fest zugebunden. Bald hast Du es geschafft!",\
70 "katzenkrieger": "Auf Samtpfoten schleichst Du mit grossen Schritten ans Ziel heran. Aber ein bisschen fehlt noch!",\
71 "tanjian": "Eine Quest hier, ein paar Monster da. Aber immer schoen ausgeglichen bleiben, dann klappts auch weiterhin!",\
72 "bierschuettler": "Noch ein paar kraeftige Schlucke und Du hast es fast geschafft!",\
73 "werwoelfe" : "Verlass Dein Rudel und zieh hinaus ins Abenteuer. Dann wirst Du bald siegreich heimkehren!",\
74 ])
75#define kosten_80 \
76 ([0: "Huch na sowas, Du hast die naechste Stufe ja schon fast erreicht. Na also! Der Rest ist ja wirklich nur noch Kleinkram!",\
77 "zauberer": "Die paar fehlenden Puenktchen haste Dir doch rasch zusammengezaubert!",\
78 "kaempfer": "Das fehlende bisschen machst Du als gnadenlos guter Kaempfer doch mit Links. Jetzt halt Dich aber mal ran. Oder willst Du Dich auf dem letzten Stueck noch von so einem luschigen Zauberer ueberrunden lassen?",\
79 "klerus": "Bei Saphina, Kandri und Lembold, Du bist fast bei der naechsten Stufe angekommen!",\
80 "chaos": "Boese waehrt am laengsten. Fast hast Du es geschafft!",\
81 "karate": "So viele blaue Flecken wie Du an Armen und Beinen hast, kann die naechste Stufe nicht mehr weit sein!",\
82 "katzenkrieger": "Pass bloss auf, dass Dich auf den letzten Zentimetern nicht noch ein Hund erwischt!",\
83 "tanjian": "Siamil wird stolz auf Dich sein. Du hast Dich gegen Gut und Boese durchgesetzt und das Ziel fast erreicht!",\
84 "bierschuettler": "Lange musst Du nicht mehr warten. Kannst ruhig schon mal ein frisches Bier in Auftrag geben!",\
85 "werwoelfe" : "Noch ein letztes Mal die fuerchterlichen Krallen schaerfen, dann hast Du Deinen neuen Level erreicht!",\
86 ])
87
88void create()
89{
90 if (object_name(this_object()) == __FILE__[0..<3]) {
91 set_next_reset(-1);
92 return;
93 }
94 room::create();
95
96 AddCmd("kosten","kosten");
97 AddCmd("liste","liste");
98 AddCmd("erhoehe","advance");
99 AddCmd(({"treff"}), "GotoMagierTreff");
100 }
101
102void init()
103{
104 int lvl;
105 room::init();
106
107 if (PL && query_once_interactive(PL)
108 && (lvl=PL->QueryProp(P_LEVEL)) <= 6
109 && LEPMASTER->QueryLevel(PL->QueryProp(P_LEP)) > lvl)
110 {
111 tell_object(PL,
112 "\nDu koenntest Deine Stufe mit \"erhoehe spieler\" hier in der Gilde "
113 "erhoehen.\n\n");
114 }
115}
116
117string zeige_reboot()
118{
119 string str;
120 int t,t2;
121
122 t=time()-last_reboot_time();
123 t2=t;
124 str="Seit dem letzten Shutdown sind "+t+" Sekunden vergangen.\n";
125 if (t<60) return str;
126 str+="Das sind ";
127 if (t>=86400)
128 {
129 str+=t/86400+" Tag";
130 if (t>=86400*2)
131 str+="e";
132 str+=", ";
133 t2=t2%86400;
134 }
135 if (t>=3600)
136 {
137 str+=t2/3600+" Stunde";
138 if (t2/3600!=1)
139 str+="n";
140 str+=", ";
141 t2=t2%3600;
142 }
143 if (t>=60)
144 {
145 str+=t2/60+" Minute";
146 if (t2/60!=1)
147 str+="n";
148 str+=" und ";
149 t2=t2%60;
150 }
151 str+=t2+" Sekunde";
152 if (t2!=1)
153 str+="n";
154 str+=".\n";
155 return str;
156}
157
158int seer_cond(int silent)
159{
160 int cond;
161
162 cond=LEPMASTER->QueryReadyForWiz(this_player());
163
164 if (!silent)
165 write(break_string(LEPMASTER->QueryReadyForWizText(this_player()),
166 78, 0, 1));
167
168 return cond;
169}
170
171varargs int kosten(string str)
172{
173 string tmp;
174
175 int lep = PL->QueryProp(P_LEP);
176 int lvl = PL->QueryProp(P_LEVEL);
177 int diff = LEPMASTER->QueryNextLevelLEP(lvl, lep);
178
179 switch ( diff ) {
180 case 101..__INT_MAX__:
181 // Falls mal LEPs abhandengekommen sind...
182 tmp = "Wie bist Du ueberhaupt an Deinen Level gekommen?\n"
183 "Sei froh, dass Du nicht wieder abgestuft wirst.";
184 break;
185
186 case 81..100:
187 tmp=kosten_0[PL->QueryProp(P_GUILD)] || kosten_0[0];
188 break;
189
190 case 61..80:
191 tmp=kosten_20[PL->QueryProp(P_GUILD)] || kosten_20[0];
192 break;
193
194 case 41..60:
195 tmp=kosten_40[PL->QueryProp(P_GUILD)] || kosten_40[0];
196 break;
197
198 case 21..40:
199 tmp=kosten_60[PL->QueryProp(P_GUILD)] || kosten_60[0];
200 break;
201
202 case 1..20:
203 tmp=kosten_80[PL->QueryProp(P_GUILD)] || kosten_80[0];
204 break;
205
206 default:
207 if ( lvl < 9 )
208 tmp = "Probier mal den Befehl 'erhoehe'.";
209 else
210 tmp = "Den Befehl 'erhoehe' kennst Du aber, ja?";
211 break;
212 }
213
214 write( break_string( tmp, 78, 0, BS_LEAVE_MY_LFS ) );
215
216 if (!IS_SEER(this_player())
217 && ( (str == "lang") ||
218 (this_player()->QueryProp(P_LEVEL) > 12 && str != "kurz"))) {
219 seer_cond(0);
220 write (break_string("\nMit 'kosten kurz' kannst Du die Angabe der "
221 "Seher-Anforderungen unterdruecken.", 78,0,1));
222 }
223
224 return 1;
225}
226
227// ermittelt Gildentitel zum Level <lev>.
228// Der letzte verfuegbare Gildentitel wird nur fuer Seher vergeben.
229// TODO: mit dem entsprechenden Code aus gilden_ob.c vereinigen?
230string get_new_title(int lev, object pl)
231{
232 mapping titles;
233
234 if (!pl) return 0;
235
236 if (lev<0) lev=0;
237
238 if (pl->QueryProp(P_GENDER) == MALE)
239 titles=(mapping)QueryProp(P_GUILD_MALE_TITLES);
240 else
241 titles=(mapping)QueryProp(P_GUILD_FEMALE_TITLES);
242
243 if (!mappingp(titles) || !sizeof(titles)) return 0;
244
245 int maxlevel = max(m_indices(titles));
246
247 // Level begrenzen. Max-Level fuer Seher.
248 if (lev >= maxlevel)
249 lev = IS_SEER(pl) ? maxlevel : maxlevel-1;
250
251 return titles[lev];
252}
253
254// versucht das Spielerlevel zu erhoehen. Macht nicht den ganzen Krams
255// drumrum, den advance() aus hysterischen Gruenden tut.
256int try_player_advance(object pl) {
257
258 if (PL->QueryProp(P_KILLS)>0)
259 return -1;
260
261 int level = pl->QueryProp( P_LEVEL );
262 if (level == -1) level = 0;
263
264 if (LEPMASTER->QueryNextLevelLEP(level, pl->QueryProp(P_LEP)) > 0)
265 return 0;
266 else
267 ++level;
268
269 pl->SetProp( P_LEVEL, level );
270
271 // Aufstiegs-Event ausloesen
272 EVENTD->TriggerEvent(EVT_LIB_ADVANCE, ([
273 E_OBJECT: PL, E_PLNAME: getuid(PL),
274 E_ENVIRONMENT: environment(PL),
275 E_GUILDNAME: PL->QueryProp(P_GUILD),
276 P_LEVEL: PL->QueryProp(P_LEVEL),
277 ]) );
278
279 // Falls die konkrete Gilde des Spielern irgedwas mit dem Titel in
280 // ABhaengigkeit des Spielerlevels tun will. Ausnahmsweise per call_other,
281 // die Funktion kommt eigentlich aus /std/gilden_ob.c.
282 string gname=(string)pl->QueryProp(P_GUILD);
283 (GUILD_DIR+"/"+gname)->adjust_title(pl);
284
285 return 1;
286}
287
288// "erhoehe"-Kommando.
289// erhoeht das Spielerlevel, falls moeglich. Setzt den passenden
290// Abenteurergildentitel.
291int advance(string arg)
292{
293
294 if (arg &&
295 arg != "stufe" && arg != "spielerstufe" && arg != "spieler"
296 && arg != "spielerlevel")
297 return 0;
298
299 int res = try_player_advance(PL);
300
301 if (!res)
302 return kosten("kurz");
303 else if (res < 0) {
304 notify_fail(break_string(
305 "Du hast einen Mitspieler umgebracht!\n"+
306 "In diesem Fall kannst Du Deine Stufe nicht erhoehen.\n"+
307 "Bitte wende Dich an den Sheriff (oder einen Erzmagier) und bring "
308 "das in Ordnung.\n",78,BS_LEAVE_MY_LFS));
309 say(break_string(PL->Name(WER)
310 + " hat soeben auf schmerzliche Weise erfahren muessen, dass "
311 "es wirklich nicht foerderlich ist, Mitspieler umzubringen.\n",
312 78), PL);
313 return 0;
314 }
315
316 string name_of_player = PL->name(WER);
317 int level = PL->QueryProp(P_LEVEL);
318 say( name_of_player + " hat jetzt Stufe " + level + " erreicht.\n");
319
320 string title = PL->QueryProp(P_TITLE);
321
322 switch(random(3)) {
323 case 0:
324 write("Du bist jetzt " + name_of_player + " " + title +
325 " (Stufe " + level + ").\n");
326 break;
327
328 case 1:
329 write("Gut gemacht, " + name_of_player + " " + title +
330 " (Stufe " + level + ").\n");
331 break;
332
333 default:
334 write("Willkommen auf Deiner neuen Stufe.\n" +
335 "Du bist jetzt " + name_of_player+" "+ title +
336 " (Stufe " + level + ").\n");
337 break;
338 }
339
340 return 1;
341}
342
343// Spielerkommando fuer Abenteurerliste
344varargs int liste(mixed pl)
345{
346 string str;
347 if (!this_player()) return 0;
348
349 if(!objectp(pl))
350 if(stringp(pl))
351 pl=find_player(pl)||find_netdead(pl);
352 if(!objectp(pl))
353 pl=PL;
354 if (pl != this_player()) {
355 write ("Du kannst Dir nur Deine eigenen Abenteuer ansehen.\n");
356 return 1;
357 }
358
359 str = QM->liste(pl);
360
361 this_player()->More( str, 0 );
362 return 1;
363}
364
365int GotoMagierTreff()
366{
367 if(IS_LEARNER(this_player()))
368 {
369 write("Ein Zauberspruch zieht vor Deinem geistigen Auge vorbei und Du\n"
370 "sprichst ihn nach.\n");
371 say(PL->name()+" murmelt einen geheimen Zauberspruch und schwebt langsam\n"
372 "zur Decke hinauf und verschwindet durch die Wand.\n");
373 write("Du schwebst langsam zur Decke hinauf und als ob diese nicht da\n"
374 "waere mitten hindurch in den Magiertreff.\n");
375 return (PL->move("/secure/merlin", M_TPORT | M_SILENT ) >= 0);
376 }
377 write("Du springst zur Decke hinauf und nix passiert.\n");
378 return 1;
379}
380