MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // MorgenGrauen MUDlib |
| 2 | // |
| 3 | // orakel.c -- Der Raum, in dem man sich neue ZT-Sprueche holen kann |
| 4 | // |
| 5 | // $Id: orakel.c 9371 2015-10-22 19:01:48Z Zesstra $ |
| 6 | |
| 7 | #define TIPS(x) "/secure/ARCH/ZT/"+x |
| 8 | |
| 9 | #define POTIONMASTER "/secure/potionmaster" |
| 10 | |
| 11 | inherit "/std/room"; |
| 12 | |
| 13 | #include <properties.h> |
| 14 | |
| 15 | // WANNWIEVIEL zeigt an, mit wieviel Stufenpunkten man wieviele Zaubertraenke |
| 16 | // haben kann, so ist zum Beispiel an fuenfter Stelle die Zahl 25 einge- |
| 17 | // tragen, also kann man mit 25 Stufenpunkten 5 Zaubertraenke bekommen. |
| 18 | #define WANNWIEVIEL ({ 0, 0, 0, 0,\ |
| 19 | 25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375,\ |
| 20 | 400, 425, 450, 475, 500, 525, 550, 575, 600, 625, 650, 675, 700, 725,\ |
| 21 | 750,\ |
| 22 | 790, 830, 870, 910, 950, 990, 1030, 1070, 1110, 1150, 1190, 1230, 1270,\ |
| 23 | 1310, 1350, 1390, 1430, 1470, 1510, 1550, 1590, 1630, 1670, 1710, 1750,\ |
| 24 | 1790,\ |
| 25 | 1860, 1930, 2000, 2070, 2140, 2210, 2280, 2350, 2420, 2490,\ |
| 26 | 2590, 2690, 2790, 2890, 2990, 3090, 3190, 3290, 3390, 3490 }) |
| 27 | #define KEINTIPTEXT "Der Nebel ueber der Kugel ruehrt sich nicht.\n" |
| 28 | |
| 29 | |
| 30 | |
| 31 | protected void create() |
| 32 | { |
| 33 | ::create(); |
| 34 | SetProp(P_INDOORS, 1); |
| 35 | SetProp(P_LIGHT, 1); |
| 36 | SetProp(P_INT_SHORT, "Das heilige Orakel von Tingan"); |
| 37 | SetProp(P_INT_LONG, |
| 38 | "Du befindest Dich in einer mittelgrossen Hoehle, die sich halbkugel-\n"+ |
| 39 | "foermig ueber Deinem Kopf erhebt. Die Hoehle wird fast komplett vom\n"+ |
| 40 | "gruenlich schimmernden Quellsee des Osterbachs ausgefuellt. Ueber dem\n"+ |
| 41 | "See schwebt eingehuellt in langsam ziehende Nebelschwaden eine magisch\n"+ |
| 42 | "leuchtende Kugel, das heilige Orakel von Tingan. Im Osten fliesst das\n"+ |
| 43 | "Wasser des Sees durch einen schmalen Gang ab, dem Du folgen koenntest.\n"); |
| 44 | AddDetail("boden", "Der Boden ist groesstenteils mit Wasser bedeckt.\n"); |
| 45 | AddDetail("decke", "Die Decke ist aus massivem Felsgestein, Du willst gar nicht wissen,\nwieviele Tonnen davon ueber Deinem Kopf lasten.\n"); |
| 46 | AddDetail(({"fels", "gestein", "felsgestein"}), "Sowas ist im Gebirge recht haeufig.\n"); |
| 47 | AddDetail(({"wand", "waende"}), "Die Waende sind feucht.\n"); |
| 48 | AddDetail(({"quellsee", "see"}), "Er ist die Quelle des Osterbachs.\n"); |
| 49 | AddDetail("quelle", "Das heisst, der Bach entspringt hier.\n"); |
| 50 | AddDetail(({"bach", "osterbach"}), "Er fliesst nach Osten ab.\n"); |
| 51 | AddDetail("wasser", "Es ist klar und frisch.\n"); |
| 52 | AddDetail("gang", "Er fuehrt nach Osten.\n"); |
| 53 | AddDetail("orakel", "Du fuehlst grosses Wissen in Deiner Umgebung.\n"); |
| 54 | AddDetail("umgebung", "Die Umgebung ist das, was Dich umgibt.\n"); |
| 55 | AddDetail("wissen", "Vielleicht nuetzt es Dir ja was.\n"); |
| 56 | AddDetail(({"nebel", "schwaden", "nebelschwaden"}), "Sie ziehen langsam ueber den See.\n"); |
| 57 | AddDetail("kugel", "Die Kugel leuchtet in magischem Licht und laedt Dich fast zum Meditieren ein.\n"); |
| 58 | AddDetail("licht", "Magisches Licht erhellt den Raum.\n"); |
| 59 | AddDetail("raum", "Schau Dich einfach mal um.\n"); |
| 60 | AddDetail("hoehle", "Du befindest Dich tatsaechlich in einer Hoehle.\n"); |
| 61 | AddDetail("kopf", "Das anzuschauen duerfte Dir schwer fallen.\n"); |
| 62 | AddCmd(({"trink", "trinke"}), "trinken"); |
| 63 | AddCmd("meditiere", "meditieren"); |
| 64 | AddCmd(({"wirf", "werfe"}), "werfen"); |
| 65 | AddExit("osten", "/players/boing/orakel/organg2"); |
| 66 | } |
| 67 | |
| 68 | // Es wird berechnet ob der Spieler einen neuen Tip bekommen kann. |
| 69 | int NeuerTip() |
| 70 | { |
| 71 | mapping platt; // Attributmapping des Spielers |
| 72 | int summe; // Summe der Attribute des Spielers + der noch zu findenen |
| 73 | // aber bekannten Zaubertrankstellen |
| 74 | int sps; // Stufenpunkte des Spielers |
| 75 | |
| 76 | platt = this_player()->QueryProp(P_ATTRIBUTES); |
| 77 | summe = (int)platt["int"] + (int)platt["con"] + |
| 78 | (int)platt["dex"] + (int)platt["str"] - 4; |
| 79 | summe += sizeof(this_player()->QueryProp(P_KNOWN_POTIONROOMS)); |
| 80 | sps = this_player()->QueryProp(P_LEP); |
| 81 | |
| 82 | // Wenn genug Stufenpunkte da sind, dann wird 1 zurueckgegeben, sonst 0 |
| 83 | if (summe>79) |
| 84 | return 0; |
| 85 | if (sps > WANNWIEVIEL[summe]) |
| 86 | return 1; |
| 87 | return 0; |
| 88 | } |
| 89 | |
| 90 | // Gibt die Nummer des ausgewaehlten Zaubertranks zurueck oder 0, wenn keiner |
| 91 | // mehr uebrig ist. |
| 92 | int ZTAuswahl() |
| 93 | { |
| 94 | int* pllist; |
| 95 | int pllsize; |
| 96 | int i; |
| 97 | mixed sorted_list; // ({ ({liste1}), ({liste2}), ..., ({liste8}) }) |
| 98 | |
| 99 | // Initialisierung |
| 100 | sorted_list = ({ ({ }), ({ }), ({ }), ({ }), ({ }), ({ }), ({ }), ({ }) }); |
| 101 | pllist = this_player()->QueryProp(P_POTIONROOMS); |
| 102 | pllsize = sizeof(pllist); |
| 103 | |
| 104 | // Zaubertraenke werden gemaess ihrer Liste in den neuen Array eingetragen. |
| 105 | for (i=0; i<pllsize; i++) |
| 106 | sorted_list[POTIONMASTER->GetListByNumber(pllist[i])] += ({ pllist[i] }); |
| 107 | |
| 108 | // Alle Unterarrays werden aneinandergehaengt. |
| 109 | pllist = ({ }); |
| 110 | for (i=0; i<8; i++) |
| 111 | pllist += sorted_list[i]; |
| 112 | pllist -= this_player()->QueryProp(P_KNOWN_POTIONROOMS); |
| 113 | |
| 114 | // Jetzt sind alle Zaubertraenke wieder in der Liste, sortiert nach dem |
| 115 | // Schwierigkeitsgrad, bis auf die Zaubertraenke, die der Spieler bereits |
| 116 | // kennt (d.h. wo er schon den Tip bekommen hat, sie aber noch nicht |
| 117 | // gefunden hat). |
| 118 | |
| 119 | |
| 120 | // Einer der leichtesten Zaubertraenke wird ausgewaehlt und zurueckgegeben. |
| 121 | pllsize = sizeof(pllist); |
| 122 | if (!pllsize) |
| 123 | return -1; |
| 124 | if (pllsize>10) |
| 125 | return pllist[random(10)]; |
| 126 | else |
| 127 | return pllist[random(pllsize)]; |
| 128 | } |
| 129 | |
| 130 | |
| 131 | string Vision() |
| 132 | { |
| 133 | int nr; |
| 134 | string* text; |
| 135 | int* liste; |
| 136 | |
| 137 | if (!NeuerTip()) |
| 138 | return KEINTIPTEXT + "Du hast wahrscheinlich zu wenig Stufenpunkte.\n"; |
| 139 | |
| 140 | nr = ZTAuswahl(); |
| 141 | if (nr == -1) |
| 142 | return KEINTIPTEXT + "Du hast schon alle Zaubertraenke gefunden.\n"; |
| 143 | |
| 144 | text = POTIONMASTER->TipLesen(nr); |
| 145 | // Das Folgende kann passieren, wenn entweder die Datei zu einem ZT nicht |
| 146 | // existiert oder das Einlesen sonstwie fehlschlaegt. Zur Behebung des |
| 147 | // Fehlers sollte man sich als erstes die Datei <nr>.zt anschauen. |
| 148 | if (intp(text) || !sizeof(text)) |
| 149 | return |
| 150 | "Ploetzlich wird es totenstill im Raum, die Nebelschwaden beginnen sich\n"+ |
| 151 | "um die Kugel zu drehen. Immer schneller wird der wirbelnde Tanz, bis\n"+ |
| 152 | "sich das Ganze unmerklich zu einer Schrift formt:\n"+ |
| 153 | " Fehler im Raum-Zeit-Gefuege, bitte wende Dich an Rikus\n"+ |
| 154 | " und melde ihm die Zahl '"+nr+"'!\n"+ |
| 155 | "Dann zerfliesst der Nebel und alles ist beim Alten.\n"; |
| 156 | |
| 157 | liste = this_player()->QueryProp(P_KNOWN_POTIONROOMS); |
| 158 | this_player()->AddKnownPotion(nr); |
| 159 | |
| 160 | //bis nach Reboot noetig!!! Rikus |
| 161 | // "/players/boing/orakel/orakel"->AddKnownPotion(nr); |
| 162 | |
| 163 | return "Der Nebel ueber der Kugel beginnt sich zu bewegen, dann hoerst Du eine\ntiefe Stimme in Deinem Kopf erklingen:\n\n"+text[random(sizeof(text))]; |
| 164 | } |
| 165 | |
| 166 | string TipListe() |
| 167 | { |
| 168 | int* pll; |
| 169 | string* tip; |
| 170 | string ret; |
| 171 | int plsize, i; |
| 172 | |
| 173 | ret = ""; |
| 174 | pll = this_interactive()->QueryProp(P_KNOWN_POTIONROOMS); |
| 175 | plsize = sizeof(pll); |
| 176 | |
| 177 | for (i=0; i<plsize; i++) |
| 178 | { |
| 179 | tip = POTIONMASTER->TipLesen(pll[i]); |
| 180 | if (sizeof(tip)) |
| 181 | { |
| 182 | ret += tip[random(sizeof(tip))]; |
| 183 | ret += "--------------------------------------------------------------------------\n"; |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | if (ret=="") |
| 188 | return "Du kennst momentan keine Tips zu Zaubertraenken.\n"; |
| 189 | else |
| 190 | return "--------------------------------------------------------------------------\n"+ret; |
| 191 | } |
| 192 | |
| 193 | int trinken(string str) |
| 194 | { |
| 195 | notify_fail("Was moechtest Du trinken?\n"); |
| 196 | if (!str || str=="") return 0; |
| 197 | notify_fail("Das kannst Du hier nicht trinken!\n"); |
| 198 | if (str!="wasser") |
| 199 | return 0; |
| 200 | write("Du trinkst einen Schluck Quellwasser und fuehlst Dich koestlich erfrischt.\n"); |
| 201 | return 1; |
| 202 | } |
| 203 | |
| 204 | meditieren() |
| 205 | { |
| 206 | write( |
| 207 | "Du sammelst Deine geistigen Kraefte und verfaellst schon schnell in einen\n"+ |
| 208 | "tranceartigen Zustand. Eine Vision eines Helden, der eine Muenze in den\n"+ |
| 209 | "See wirft erscheint vor Deinen Augen, verschwindet aber schon schnell\n"+ |
| 210 | "wieder. Als Du wieder aufwachst, ist alles wie vorher.\n"); |
| 211 | return 1; |
| 212 | } |
| 213 | |
| 214 | int werfen(string str) |
| 215 | { |
| 216 | if (str=="muenze in see" || str=="muenze in wasser" || |
| 217 | str=="muenze in quellsee") |
| 218 | { |
| 219 | if (this_player()->QueryMoney()<1) |
| 220 | { |
| 221 | write("Du hast keine Muenze.\n"); |
| 222 | return 1; |
| 223 | } |
| 224 | this_player()->AddMoney(-1); |
| 225 | write("Du wirfst eine Muenze ins Wasser.\n"); |
| 226 | say(capitalize(this_player()->name())+" wirft eine Muenze ins Wasser.\n"); |
| 227 | write(Vision()); |
| 228 | return 1; |
| 229 | } |
| 230 | return 0; |
| 231 | } |