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