blob: 4da1508751ac0cd72d1835d2f67be45b1f7f6199 [file] [log] [blame]
// MorgenGrauen MUDlib
//
// orakel.c -- Der Raum, in dem man sich neue ZT-Sprueche holen kann
//
// $Id: orakel.c 9371 2015-10-22 19:01:48Z Zesstra $
#define TIPS(x) "/secure/ARCH/ZT/"+x
#define POTIONMASTER "/secure/potionmaster"
inherit "/std/room";
#include <properties.h>
// WANNWIEVIEL zeigt an, mit wieviel Stufenpunkten man wieviele Zaubertraenke
// haben kann, so ist zum Beispiel an fuenfter Stelle die Zahl 25 einge-
// tragen, also kann man mit 25 Stufenpunkten 5 Zaubertraenke bekommen.
#define WANNWIEVIEL ({ 0, 0, 0, 0,\
25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300, 325, 350, 375,\
400, 425, 450, 475, 500, 525, 550, 575, 600, 625, 650, 675, 700, 725,\
750,\
790, 830, 870, 910, 950, 990, 1030, 1070, 1110, 1150, 1190, 1230, 1270,\
1310, 1350, 1390, 1430, 1470, 1510, 1550, 1590, 1630, 1670, 1710, 1750,\
1790,\
1860, 1930, 2000, 2070, 2140, 2210, 2280, 2350, 2420, 2490,\
2590, 2690, 2790, 2890, 2990, 3090, 3190, 3290, 3390, 3490 })
#define KEINTIPTEXT "Der Nebel ueber der Kugel ruehrt sich nicht.\n"
protected void create()
{
::create();
SetProp(P_INDOORS, 1);
SetProp(P_LIGHT, 1);
SetProp(P_INT_SHORT, "Das heilige Orakel von Tingan");
SetProp(P_INT_LONG,
"Du befindest Dich in einer mittelgrossen Hoehle, die sich halbkugel-\n"+
"foermig ueber Deinem Kopf erhebt. Die Hoehle wird fast komplett vom\n"+
"gruenlich schimmernden Quellsee des Osterbachs ausgefuellt. Ueber dem\n"+
"See schwebt eingehuellt in langsam ziehende Nebelschwaden eine magisch\n"+
"leuchtende Kugel, das heilige Orakel von Tingan. Im Osten fliesst das\n"+
"Wasser des Sees durch einen schmalen Gang ab, dem Du folgen koenntest.\n");
AddDetail("boden", "Der Boden ist groesstenteils mit Wasser bedeckt.\n");
AddDetail("decke", "Die Decke ist aus massivem Felsgestein, Du willst gar nicht wissen,\nwieviele Tonnen davon ueber Deinem Kopf lasten.\n");
AddDetail(({"fels", "gestein", "felsgestein"}), "Sowas ist im Gebirge recht haeufig.\n");
AddDetail(({"wand", "waende"}), "Die Waende sind feucht.\n");
AddDetail(({"quellsee", "see"}), "Er ist die Quelle des Osterbachs.\n");
AddDetail("quelle", "Das heisst, der Bach entspringt hier.\n");
AddDetail(({"bach", "osterbach"}), "Er fliesst nach Osten ab.\n");
AddDetail("wasser", "Es ist klar und frisch.\n");
AddDetail("gang", "Er fuehrt nach Osten.\n");
AddDetail("orakel", "Du fuehlst grosses Wissen in Deiner Umgebung.\n");
AddDetail("umgebung", "Die Umgebung ist das, was Dich umgibt.\n");
AddDetail("wissen", "Vielleicht nuetzt es Dir ja was.\n");
AddDetail(({"nebel", "schwaden", "nebelschwaden"}), "Sie ziehen langsam ueber den See.\n");
AddDetail("kugel", "Die Kugel leuchtet in magischem Licht und laedt Dich fast zum Meditieren ein.\n");
AddDetail("licht", "Magisches Licht erhellt den Raum.\n");
AddDetail("raum", "Schau Dich einfach mal um.\n");
AddDetail("hoehle", "Du befindest Dich tatsaechlich in einer Hoehle.\n");
AddDetail("kopf", "Das anzuschauen duerfte Dir schwer fallen.\n");
AddCmd(({"trink", "trinke"}), "trinken");
AddCmd("meditiere", "meditieren");
AddCmd(({"wirf", "werfe"}), "werfen");
AddExit("osten", "/players/boing/orakel/organg2");
}
// Es wird berechnet ob der Spieler einen neuen Tip bekommen kann.
int NeuerTip()
{
mapping platt; // Attributmapping des Spielers
int summe; // Summe der Attribute des Spielers + der noch zu findenen
// aber bekannten Zaubertrankstellen
int sps; // Stufenpunkte des Spielers
platt = this_player()->QueryProp(P_ATTRIBUTES);
summe = (int)platt["int"] + (int)platt["con"] +
(int)platt["dex"] + (int)platt["str"] - 4;
summe += sizeof(this_player()->QueryProp(P_KNOWN_POTIONROOMS));
sps = this_player()->QueryProp(P_LEP);
// Wenn genug Stufenpunkte da sind, dann wird 1 zurueckgegeben, sonst 0
if (summe>79)
return 0;
if (sps > WANNWIEVIEL[summe])
return 1;
return 0;
}
// Gibt die Nummer des ausgewaehlten Zaubertranks zurueck oder 0, wenn keiner
// mehr uebrig ist.
int ZTAuswahl()
{
int* pllist;
int pllsize;
int i;
mixed sorted_list; // ({ ({liste1}), ({liste2}), ..., ({liste8}) })
// Initialisierung
sorted_list = ({ ({ }), ({ }), ({ }), ({ }), ({ }), ({ }), ({ }), ({ }) });
pllist = this_player()->QueryProp(P_POTIONROOMS);
pllsize = sizeof(pllist);
// Zaubertraenke werden gemaess ihrer Liste in den neuen Array eingetragen.
for (i=0; i<pllsize; i++)
sorted_list[POTIONMASTER->GetListByNumber(pllist[i])] += ({ pllist[i] });
// Alle Unterarrays werden aneinandergehaengt.
pllist = ({ });
for (i=0; i<8; i++)
pllist += sorted_list[i];
pllist -= this_player()->QueryProp(P_KNOWN_POTIONROOMS);
// Jetzt sind alle Zaubertraenke wieder in der Liste, sortiert nach dem
// Schwierigkeitsgrad, bis auf die Zaubertraenke, die der Spieler bereits
// kennt (d.h. wo er schon den Tip bekommen hat, sie aber noch nicht
// gefunden hat).
// Einer der leichtesten Zaubertraenke wird ausgewaehlt und zurueckgegeben.
pllsize = sizeof(pllist);
if (!pllsize)
return -1;
if (pllsize>10)
return pllist[random(10)];
else
return pllist[random(pllsize)];
}
string Vision()
{
int nr;
string* text;
int* liste;
if (!NeuerTip())
return KEINTIPTEXT + "Du hast wahrscheinlich zu wenig Stufenpunkte.\n";
nr = ZTAuswahl();
if (nr == -1)
return KEINTIPTEXT + "Du hast schon alle Zaubertraenke gefunden.\n";
text = POTIONMASTER->TipLesen(nr);
// Das Folgende kann passieren, wenn entweder die Datei zu einem ZT nicht
// existiert oder das Einlesen sonstwie fehlschlaegt. Zur Behebung des
// Fehlers sollte man sich als erstes die Datei <nr>.zt anschauen.
if (intp(text) || !sizeof(text))
return
"Ploetzlich wird es totenstill im Raum, die Nebelschwaden beginnen sich\n"+
"um die Kugel zu drehen. Immer schneller wird der wirbelnde Tanz, bis\n"+
"sich das Ganze unmerklich zu einer Schrift formt:\n"+
" Fehler im Raum-Zeit-Gefuege, bitte wende Dich an Rikus\n"+
" und melde ihm die Zahl '"+nr+"'!\n"+
"Dann zerfliesst der Nebel und alles ist beim Alten.\n";
liste = this_player()->QueryProp(P_KNOWN_POTIONROOMS);
this_player()->AddKnownPotion(nr);
//bis nach Reboot noetig!!! Rikus
// "/players/boing/orakel/orakel"->AddKnownPotion(nr);
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))];
}
string TipListe()
{
int* pll;
string* tip;
string ret;
int plsize, i;
ret = "";
pll = this_interactive()->QueryProp(P_KNOWN_POTIONROOMS);
plsize = sizeof(pll);
for (i=0; i<plsize; i++)
{
tip = POTIONMASTER->TipLesen(pll[i]);
if (sizeof(tip))
{
ret += tip[random(sizeof(tip))];
ret += "--------------------------------------------------------------------------\n";
}
}
if (ret=="")
return "Du kennst momentan keine Tips zu Zaubertraenken.\n";
else
return "--------------------------------------------------------------------------\n"+ret;
}
int trinken(string str)
{
notify_fail("Was moechtest Du trinken?\n");
if (!str || str=="") return 0;
notify_fail("Das kannst Du hier nicht trinken!\n");
if (str!="wasser")
return 0;
write("Du trinkst einen Schluck Quellwasser und fuehlst Dich koestlich erfrischt.\n");
return 1;
}
meditieren()
{
write(
"Du sammelst Deine geistigen Kraefte und verfaellst schon schnell in einen\n"+
"tranceartigen Zustand. Eine Vision eines Helden, der eine Muenze in den\n"+
"See wirft erscheint vor Deinen Augen, verschwindet aber schon schnell\n"+
"wieder. Als Du wieder aufwachst, ist alles wie vorher.\n");
return 1;
}
int werfen(string str)
{
if (str=="muenze in see" || str=="muenze in wasser" ||
str=="muenze in quellsee")
{
if (this_player()->QueryMoney()<1)
{
write("Du hast keine Muenze.\n");
return 1;
}
this_player()->AddMoney(-1);
write("Du wirfst eine Muenze ins Wasser.\n");
say(capitalize(this_player()->name())+" wirft eine Muenze ins Wasser.\n");
write(Vision());
return 1;
}
return 0;
}