Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/items/money.c b/items/money.c
new file mode 100644
index 0000000..4a9a5f4
--- /dev/null
+++ b/items/money.c
@@ -0,0 +1,340 @@
+// MorgenGrauen MUDlib
+//
+// money.c -- Unser Geld
+//
+// $Id: money.c 8893 2014-08-04 19:48:56Z Zesstra $
+
+inherit "/std/unit";
+
+#pragma strong_types,rtt_checks
+
+#include <properties.h>
+#include <language.h>
+#include <defines.h>
+#include <unit.h>
+#include <money.h>
+
+// zum debuggen (debugmode kommt aus /std/unit.c
+#include <living/comm.h>
+#define ZDEBUG(x) if (stringp(debugmode) && find_player(debugmode)) \
+  find_player(debugmode)->ReceiveMsg(x,MT_DEBUG,0,object_name()+": ",ME)
+//#define ZDEBUG(x)
+
+protected void NotifyMove(object dest, object oldenv, int method)
+{
+  // Logg-Funktion, um Nicht-Standard-Geldbugs zu finden.
+  // Eingebaut 27.03.2000 - Tiamak
+  // Vor vereinigen mit anderen Geldobjekten in NotifyMove().
+  object moneylog = find_object("/p/daemon/moneylog");
+  if ( (!environment() && previous_object() &&
+        !query_once_interactive(previous_object()) &&
+        load_name(previous_object()) != GELD) &&
+        moneylog)
+      moneylog->AddMoney( previous_object(), Query(U_REQ) );
+
+  // Hier passiert Vereinigung mit anderen Geldobjekten... Etc.
+  ::NotifyMove(dest, oldenv, method);
+
+  // Zu diesem Zeitpunkt sind Vereinigungen mit anderen Geldobjekten in dest
+  // schon gelaufen, hier muessen jetzt noch Geldboersen und Seherkarten
+  // beruecksichtigt werden.
+  // Sollverhalten ist:
+  // Vereinigung mit Boersen+geldkarten nur in Lebewesen.
+  // Ausserdem soll nicht vereinigt werden, wenn man muenzen aus einer Boerse
+  // nimmt. 
+  // A) Betrag ist positiv:
+  // A1) mit der ersten geld-enhaltenen Geldboerse im Inventar vereinigen.
+  //     Gibt es keine geld-gefuellte, wird die erste leere genommen.
+  // B) Betrag ist negativ:
+  //    Es wird versucht, mit geldgefuellten Boersen und aktiven Seherkarten
+  //    (d.h. Karten, diesem Environment gehoeren) zu vereinigen.
+  //    Es wird erst einer Boersen "abgebucht" (falls vorhanden) und dann
+  //    (falls noch noetig) von einer Geldkarte. Ist der Betrag am Ende
+  //    negativ, wird ein Fehler ausgeloest.
+  if (!living(dest))
+    return;
+  // wenn wir aus einer Boerse in diesem Environment kommen, vereinigen wir
+  // uns nicht wieder erneut.
+  if (load_name(oldenv) == BOERSE
+      && environment(oldenv) == environment())
+    return;
+
+  int amount = QueryProp(P_AMOUNT);
+  ZDEBUG(sprintf("NotifyMove 1: amount: %d\n",
+         amount));
+  if (amount > 0)
+  {
+    object boerse = present(GELDBOERSE_MIT_GELD, environment())
+                    || present(BOERSEID, environment());
+    if (boerse)
+    {
+      boerse->MergeMoney(this_object());
+      // Sollten wir jetzt P_AMOUNT == 0 haben, zerstoert uns der Code aus
+      // unit.c spaeter.
+      ZDEBUG(sprintf("NotifyMove nach Boersenvereinigung 1: amount: %d\n",
+             QueryProp(P_AMOUNT)));
+    }
+  }
+  else if (amount < 0)
+  {
+    object boerse = present(GELDBOERSE_MIT_GELD, environment());
+    if (boerse)
+    {
+      boerse->MergeMoney(this_object());
+      ZDEBUG(sprintf("NotifyMove nach Boersenvereinigung 2: amount: %d\n",
+             QueryProp(P_AMOUNT)));
+    }
+    // wenn immer noch was auszugleichen ist, Geldkarte versuchen.
+    if (QueryProp(P_AMOUNT) < 0)
+    {
+      object geldkarte = present(SEHERKARTEID_AKTIV, environment());
+      if (geldkarte)
+      {
+        geldkarte->MergeMoney(this_object());
+        ZDEBUG(sprintf("NotifyMove nach Kartenvereinigung: amount: %d\n",
+               QueryProp(P_AMOUNT)));
+      }
+    }
+    if (QueryProp(P_AMOUNT) < 0)
+      catch(raise_error(sprintf(
+            "Geld mit negativem Betrag immer noch negativ nach "
+            "Vereinigung mit allen Geldquellen im Inventar: %O. Rest: %d\n",
+            environment(), QueryProp(P_AMOUNT))); publish);
+  }
+}
+
+int _set_autoloadobj( mixed args )
+{
+  if (pointerp(args))
+    args=args[0];
+  if (stringp(args))
+    sscanf(args,"%d",args);
+  if (!intp(args))
+    args=0;
+  return SetProp(P_AMOUNT,args);
+}
+
+int _query_autoloadobj()
+{
+  return (int)Query(P_AMOUNT, F_VALUE);
+}
+
+string current_long() {
+ int r;
+ r=Query(U_REQ);
+ return(break_string(
+  ((r==1)?"":"Du betrachtest eine der Muenzen genauer:\n")+
+  "Die Oberflaeche der Goldmuenze ist vom taeglichen Gebrauch ziemlich "
+  "mitgenommen. Kratzer und sogar Bissspuren zieren die Praegemuenze "
+  "zusaetzlich zum Konterfei "+
+  ({"des Jof","der Rumata","des Zook"})[(Query(P_AMOUNT)+r)%3]+
+  ". Der Rand "+
+  ((!(r%2))?"scheint etwas beschaedigt zu sein.":
+            "ist wenigstens unbeschaedigt."),
+  78,0,BS_LEAVE_MY_LFS));
+}
+
+static int action_schnipps(string str) {
+ if(!id(str)) return 0;
+ write(break_string(
+  ((Query(U_REQ)==1)?"Du nimmst die Muenze":
+                     "Du nimmst eine der Muenzen")+
+  " und schnippst sie in die Luft. Sie klingt hell auf. "+
+  ((this_player() && this_player()->QueryAttribute(A_DEX)>10)?
+   "Geschickt faengst Du sie wieder auf.":
+   "Sie plumpst Dir wieder in die Hand und beinahe laesst Du "
+   "sie fallen."),78));
+ if(this_player() && environment(this_player()))
+  tell_room(environment(this_player()),
+            break_string(this_player()->Name()+" schnippt mit hellem "
+                         "Klingen ein Muenze in die Luft und faengt sie "
+                         "wieder.",78),
+            ({this_player()}));
+ return 1;
+}
+
+static int action_pruefe(string str) {
+ if(!id(str)) return 0;
+ write(break_string(
+  ((Query(U_REQ)==1)?"Du nimmst die Muenze":
+                     "Du nimmst eine der Muenzen")+
+  " und beisst vorsichtig hinein. Dein Zahn versinkt tief im reinen Gold, "
+  "und Du bist Dir nun sicher, dass diese Muenze auch wirklich echt ist.",
+  78));
+ if(this_player() && environment(this_player()))
+  tell_room(environment(this_player()),
+            break_string(this_player()->Name()+" beisst in eine Muenze "
+                         "und schaut irgendwie befriedigt drein.",78),
+            ({this_player()}));
+ return 1;
+}
+
+
+static string DetKonterfei() {
+ string m;
+ switch((Query(P_AMOUNT)+Query(U_REQ))%3) {
+  default:
+  case 0:
+        m="Jofs rundes Gesicht grinst Dich vertrauenserweckend und "
+          "freundlich an.";break;
+  case 1:
+        m="Rumata scheint Dir zuzublinzeln.";break;
+  case 2:
+        m="Zooks Gesicht schaut ziemlich frisch gepraegt drein. Wenn "
+          "eine der Muenzen beim Schnippen klingt, dann bestimmt die.";break;
+ }
+ return(break_string(m,78));
+}
+
+
+static string DetRand() {
+ return(break_string(
+  ((!(Query(U_REQ)%2))?
+            "Der Rand der Muenze ist zerklueftet und abgeschabt. Ob "
+            "da jemand versucht hat, das Gold der Muenze abzuschaben, "
+            "um sich etwas nebenher zu verdienen?":
+            "Der Rand ist vollkommen in Ordnung, ein wirklich frische "
+            "Praegung."),78));
+}
+
+
+static int action_wurf(string str)
+{
+  int num, part;
+
+  if (!id(str))
+    return 0;
+
+  num = Query(U_REQ);
+  write (break_string(
+	 ((num==1)?"Du nimmst die Muenze":
+	  sprintf("Du nimmst %d Muenzen", num))+
+	   ", wirfst sie hoch, laesst sie zu Boden prasseln und "
+	   "betrachtest das Ergebnis:", 78));
+  if (this_player() && environment(this_player()))
+    tell_room(environment(this_player()),
+	      break_string(this_player()->Name()+" wirft "+
+         	   ((num==1)?"eine Muenze":
+			   sprintf("%d Muenzen", num))+
+		   " hoch, laesst sie zu Boden prasseln und betrachtet "
+		   +"das Ergebnis:", 78), ({this_player()}));
+
+  if (num == 1) {
+    if (random(1000000) == 123456) {
+      write("   Die Muenze bleibt auf dem Rand stehen.\n");
+      if (this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  "   Die Muenze bleibt auf dem Rand stehen.\n",
+		  ({this_player()}));
+    }
+    else if (random(100) < 50) {
+      write("   Kopf.\n");
+      if (this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  "   Kopf.\n",
+		  ({this_player()}));
+    }
+    else {
+      write("   Zahl.\n");
+      if (this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  "   Zahl.\n",
+		  ({this_player()}));
+    }
+  }
+  else {
+    part = 5*num + random(num+1) - random(num+1) // etwas Gauss-verteilen
+		 + random(num+1) - random(num+1)
+		 + random(num+1) - random(num+1)
+		 + random(num+1) - random(num+1)
+		 + random(num+1) - random(num+1);
+    part = (part+5)/10;
+
+    if (part) {
+      printf("   %dx Kopf", part);
+      if (part != num)
+	printf(" und %dx Zahl", num-part);
+      if(this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  sprintf("   %dx Kopf", part)+
+		  ((part!=num)?sprintf(" und %dx Zahl", num-part):"")+
+		  ".\n",
+		  ({this_player()}));
+    }
+    else {
+      printf("   %dx Zahl", num);
+      if (this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  sprintf("   %dx Zahl.\n", num),
+		  ({this_player()}));
+    }
+    write (".\n");
+  }
+
+  write(break_string(
+	"Schnell sammelst Du "+
+	((num==1)?"Deine Muenze":"Deine Muenzen")+" wieder ein.", 78));
+  if (this_player() && environment(this_player()))
+    tell_room(environment(this_player()),
+	      break_string(this_player()->Name()+ " sammelt schnell "+
+	      ((num==1)?(this_player()->QueryPossPronoun(FEMALE,WEN, SINGULAR)
+			 +" Muenze wieder ein."):
+	       (this_player()->QueryPossPronoun(FEMALE,WEN, PLURAL)+
+		" Muenzen wieder ein."))), ({this_player()}));
+  return 1;
+}
+
+protected void create()
+{
+  mixed plist, i;
+
+  ::create();
+  SetProp(P_NAME,({"Muenze","Muenzen"}));
+  Set(P_LONG,#'current_long);
+  SetProp(P_SHORT,"Geld");
+  SetProp(P_INFO,"Du hast bei diesem Geld ein sicheres Gefuehl.\n");
+  SetProp(P_MATERIAL,([MAT_GOLD:100]));
+  AddSingularId("muenze");
+  AddPluralId("muenzen");
+  AddSingularId("goldstueck");
+  AddPluralId("goldstuecke");
+  AddId(({"geld", GELDID}));
+  SetProp(P_GENDER,FEMALE);
+  SetCoinsPerUnits(1,1);
+  SetGramsPerUnits(1,4);
+
+  if (!clonep(this_object())) {
+    set_next_reset(-1);
+    return;
+  }
+  AddDetail(({"rand","muenzrand"}),#'DetRand);
+  AddDetail(({"oberflaeche","flaeche"}),break_string(
+   "Diese Muenze ist schon durch viele Haende gegangen. Die Kratzer "
+   "zeugen davon, dass sie nicht selten allein getragen wurde und die "
+   "Bissspuren von mangelndem Vertrauen.",78));
+  AddDetail("kratzer",break_string(
+   "Das Konterfei ist schon ganz schoen zerkratzt.",78));
+  AddDetail(({"bissspur","bissspuren"}),break_string(
+   "Da hat doch tatsaechlich jemand so wenig Vertrauen in das Gold "
+   "gezeigt, dass er hineingebissen hat, um es zu pruefen.",78));
+  AddDetail(({"bild","konterfei","praegung"}),#'DetKonterfei);
+  AddDetail("gold","Es glaenzt Dich verheissungsvoll an.\n");
+
+  AddCmd(({"pruef","pruefe","beiss","beisse","test","teste"}),
+         #'action_pruefe);
+  AddCmd(({"schnipp","schnippe","schnipps","schnippse"}),
+         #'action_schnipps);
+
+  AddCmd( ({ "wirf", "werf", "werfe" }), #'action_wurf);
+}
+
+varargs string GetDetail(mixed key,mixed race,int sense) {
+ string m;
+ if(stringp(m=::GetDetail(&key,&race,&sense)) && sizeof(m)) {
+  int r;
+  r=Query(U_REQ);
+  if(r!=1) m=sprintf("Du betrachtest eine der %d Muenzen genauer:\n",r)+m;
+ }
+ return m;
+}
+