Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/room/orakel.c b/room/orakel.c
new file mode 100644
index 0000000..4da1508
--- /dev/null
+++ b/room/orakel.c
@@ -0,0 +1,231 @@
+// 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;
+}