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