blob: 5419a99bfe7407ff16d33e4bae9ca0c5a7334158 [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");
Kebap21427fd2016-07-20 12:54:04 +020045 AddDetail("decke", break_string("Die Decke ist aus massivem Felsgestein, "
46 "Du willst gar nicht wissen, wieviele Tonnen davon ueber "
47 "Deinem Kopf lasten.",78));
MG Mud User88f12472016-06-24 23:31:02 +020048 AddDetail(({"fels", "gestein", "felsgestein"}), "Sowas ist im Gebirge recht haeufig.\n");
49 AddDetail(({"wand", "waende"}), "Die Waende sind feucht.\n");
50 AddDetail(({"quellsee", "see"}), "Er ist die Quelle des Osterbachs.\n");
51 AddDetail("quelle", "Das heisst, der Bach entspringt hier.\n");
52 AddDetail(({"bach", "osterbach"}), "Er fliesst nach Osten ab.\n");
53 AddDetail("wasser", "Es ist klar und frisch.\n");
54 AddDetail("gang", "Er fuehrt nach Osten.\n");
55 AddDetail("orakel", "Du fuehlst grosses Wissen in Deiner Umgebung.\n");
56 AddDetail("umgebung", "Die Umgebung ist das, was Dich umgibt.\n");
57 AddDetail("wissen", "Vielleicht nuetzt es Dir ja was.\n");
58 AddDetail(({"nebel", "schwaden", "nebelschwaden"}), "Sie ziehen langsam ueber den See.\n");
59 AddDetail("kugel", "Die Kugel leuchtet in magischem Licht und laedt Dich fast zum Meditieren ein.\n");
60 AddDetail("licht", "Magisches Licht erhellt den Raum.\n");
61 AddDetail("raum", "Schau Dich einfach mal um.\n");
62 AddDetail("hoehle", "Du befindest Dich tatsaechlich in einer Hoehle.\n");
63 AddDetail("kopf", "Das anzuschauen duerfte Dir schwer fallen.\n");
64 AddCmd(({"trink", "trinke"}), "trinken");
65 AddCmd("meditiere", "meditieren");
66 AddCmd(({"wirf", "werfe"}), "werfen");
bugfix7ee7d932020-04-04 15:13:49 +020067 AddExit("osten", "/d/gebirge/boing/orakel/organg2");
MG Mud User88f12472016-06-24 23:31:02 +020068}
69
70// Es wird berechnet ob der Spieler einen neuen Tip bekommen kann.
71int NeuerTip()
72{
73 mapping platt; // Attributmapping des Spielers
74 int summe; // Summe der Attribute des Spielers + der noch zu findenen
75 // aber bekannten Zaubertrankstellen
76 int sps; // Stufenpunkte des Spielers
77
78 platt = this_player()->QueryProp(P_ATTRIBUTES);
79 summe = (int)platt["int"] + (int)platt["con"] +
80 (int)platt["dex"] + (int)platt["str"] - 4;
81 summe += sizeof(this_player()->QueryProp(P_KNOWN_POTIONROOMS));
82 sps = this_player()->QueryProp(P_LEP);
83
84// Wenn genug Stufenpunkte da sind, dann wird 1 zurueckgegeben, sonst 0
85 if (summe>79)
86 return 0;
87 if (sps > WANNWIEVIEL[summe])
88 return 1;
89 return 0;
90}
91
92// Gibt die Nummer des ausgewaehlten Zaubertranks zurueck oder 0, wenn keiner
93// mehr uebrig ist.
94int ZTAuswahl()
95{
96 int* pllist;
97 int pllsize;
98 int i;
99 mixed sorted_list; // ({ ({liste1}), ({liste2}), ..., ({liste8}) })
100
101// Initialisierung
102 sorted_list = ({ ({ }), ({ }), ({ }), ({ }), ({ }), ({ }), ({ }), ({ }) });
103 pllist = this_player()->QueryProp(P_POTIONROOMS);
104 pllsize = sizeof(pllist);
105
106// Zaubertraenke werden gemaess ihrer Liste in den neuen Array eingetragen.
107 for (i=0; i<pllsize; i++)
108 sorted_list[POTIONMASTER->GetListByNumber(pllist[i])] += ({ pllist[i] });
109
110// Alle Unterarrays werden aneinandergehaengt.
111 pllist = ({ });
112 for (i=0; i<8; i++)
113 pllist += sorted_list[i];
114 pllist -= this_player()->QueryProp(P_KNOWN_POTIONROOMS);
115
116// Jetzt sind alle Zaubertraenke wieder in der Liste, sortiert nach dem
117// Schwierigkeitsgrad, bis auf die Zaubertraenke, die der Spieler bereits
118// kennt (d.h. wo er schon den Tip bekommen hat, sie aber noch nicht
119// gefunden hat).
120
121
122// Einer der leichtesten Zaubertraenke wird ausgewaehlt und zurueckgegeben.
123 pllsize = sizeof(pllist);
124 if (!pllsize)
125 return -1;
126 if (pllsize>10)
127 return pllist[random(10)];
128 else
129 return pllist[random(pllsize)];
130}
131
132
133string Vision()
134{
135 int nr;
136 string* text;
137 int* liste;
138
139 if (!NeuerTip())
140 return KEINTIPTEXT + "Du hast wahrscheinlich zu wenig Stufenpunkte.\n";
141
142 nr = ZTAuswahl();
143 if (nr == -1)
144 return KEINTIPTEXT + "Du hast schon alle Zaubertraenke gefunden.\n";
145
146 text = POTIONMASTER->TipLesen(nr);
147// Das Folgende kann passieren, wenn entweder die Datei zu einem ZT nicht
148// existiert oder das Einlesen sonstwie fehlschlaegt. Zur Behebung des
149// Fehlers sollte man sich als erstes die Datei <nr>.zt anschauen.
150 if (intp(text) || !sizeof(text))
151 return
152 "Ploetzlich wird es totenstill im Raum, die Nebelschwaden beginnen sich\n"+
153 "um die Kugel zu drehen. Immer schneller wird der wirbelnde Tanz, bis\n"+
154 "sich das Ganze unmerklich zu einer Schrift formt:\n"+
155 " Fehler im Raum-Zeit-Gefuege, bitte wende Dich an Rikus\n"+
156 " und melde ihm die Zahl '"+nr+"'!\n"+
157 "Dann zerfliesst der Nebel und alles ist beim Alten.\n";
158
159 liste = this_player()->QueryProp(P_KNOWN_POTIONROOMS);
160 this_player()->AddKnownPotion(nr);
161
162//bis nach Reboot noetig!!! Rikus
163// "/players/boing/orakel/orakel"->AddKnownPotion(nr);
164
Kebap21427fd2016-07-20 12:54:04 +0200165 return
166 "Der Nebel ueber der Kugel beginnt sich zu bewegen, dann hoerst Du eine\n"
167 "tiefe Stimme in Deinem Kopf erklingen:\n\n"
168 + text[random(sizeof(text))];
MG Mud User88f12472016-06-24 23:31:02 +0200169}
170
171string TipListe()
172{
173 int* pll;
174 string* tip;
175 string ret;
176 int plsize, i;
177
178 ret = "";
179 pll = this_interactive()->QueryProp(P_KNOWN_POTIONROOMS);
180 plsize = sizeof(pll);
181
182 for (i=0; i<plsize; i++)
183 {
184 tip = POTIONMASTER->TipLesen(pll[i]);
185 if (sizeof(tip))
186 {
187 ret += tip[random(sizeof(tip))];
188 ret += "--------------------------------------------------------------------------\n";
189 }
190 }
191
192 if (ret=="")
193 return "Du kennst momentan keine Tips zu Zaubertraenken.\n";
194 else
195 return "--------------------------------------------------------------------------\n"+ret;
196}
197
198int trinken(string str)
199{
200 notify_fail("Was moechtest Du trinken?\n");
201 if (!str || str=="") return 0;
202 notify_fail("Das kannst Du hier nicht trinken!\n");
203 if (str!="wasser")
204 return 0;
205 write("Du trinkst einen Schluck Quellwasser und fuehlst Dich koestlich erfrischt.\n");
206 return 1;
207}
208
209meditieren()
210{
211 write(
212 "Du sammelst Deine geistigen Kraefte und verfaellst schon schnell in einen\n"+
213 "tranceartigen Zustand. Eine Vision eines Helden, der eine Muenze in den\n"+
214 "See wirft erscheint vor Deinen Augen, verschwindet aber schon schnell\n"+
215 "wieder. Als Du wieder aufwachst, ist alles wie vorher.\n");
216 return 1;
217}
218
219int werfen(string str)
220{
221 if (str=="muenze in see" || str=="muenze in wasser" ||
222 str=="muenze in quellsee")
223 {
224 if (this_player()->QueryMoney()<1)
225 {
226 write("Du hast keine Muenze.\n");
227 return 1;
228 }
229 this_player()->AddMoney(-1);
230 write("Du wirfst eine Muenze ins Wasser.\n");
231 say(capitalize(this_player()->name())+" wirft eine Muenze ins Wasser.\n");
232 write(Vision());
233 return 1;
234 }
235 return 0;
236}