MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // 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 | inherit "/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 | |
| 88 | void 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 | |
| 102 | void 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 | |
| 117 | string 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 | |
| 158 | int 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 | |
| 171 | varargs 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? |
| 230 | string 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. |
| 256 | int 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. |
| 291 | int 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 |
| 344 | varargs 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 | |
| 365 | int 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 | |