blob: 4da1508751ac0cd72d1835d2f67be45b1f7f6199 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// 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
11inherit "/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
31protected 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.
69int 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.
92int 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
131string 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
166string 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
193int 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
204meditieren()
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
214int 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}