Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/p/daemon/objectd.c b/p/daemon/objectd.c
new file mode 100644
index 0000000..1b5d821
--- /dev/null
+++ b/p/daemon/objectd.c
@@ -0,0 +1,150 @@
+// MorgenGrauen MUDlib
+//
+// OBJECTD.C -- object daemon
+//
+// $Date: 1995/04/03 14:47:02 $
+// $Revision: 9510 $
+/* $Log: objectd.c,v $
+ * Revision 1.2  1995/04/03 14:47:02  Wargon
+ * QueryObject() verwendet bei BluePrints jetzt auch AddItem.
+ *
+ * Revision 1.1  1995/03/31  13:30:33  Hate
+ * Initial revision
+ *
+ */
+
+#pragma strong_types,save_types,rtt_checks
+#pragma no_clone, no_shadow
+
+#include <rooms.h>
+#include <properties.h>
+#include <defines.h>
+#include <daemon.h>
+
+mapping objects = ([]);
+private nosave int do_save;
+
+#define CLASS   0
+#define DATA    1
+
+protected void create()
+{
+  seteuid(getuid(ME));
+  restore_object(OBJECTD_SAVE);
+}
+
+protected void reset() {
+  if (do_save)
+  {
+    save_object(OBJECTD_SAVE);
+    do_save=0;
+  }
+}
+
+string AddObject(object obj, string env)
+{
+  if(!obj || !env || !objectp(obj) || !stringp(env))
+    return 0;
+
+  // save information
+  if(!member(objects, env))
+    objects[env] = ({ ({  object_name(obj), obj->QueryProp(P_AUTOLOAD) }) });
+  else
+    objects[env] += ({ ({ object_name(obj), obj->QueryProp(P_AUTOLOAD) }) });
+
+  do_save=1;
+  return env;
+}
+
+int RemoveObject(object|string obj, string env)
+{
+  if(!obj || !env || !stringp(env))
+    return 0;
+
+  // save information
+  if(member(objects, env))
+  {
+    mixed oblist = objects[env];
+    foreach(mixed arr: &oblist)
+    {
+      if (load_name(arr[CLASS]) == load_name(obj))
+      {
+        arr = 0;
+        // nur eins Austragen, nicht alle, falls mehr als einmal angemeldet
+        break;
+      }
+    }
+    objects[env] = oblist - ({0});
+  }
+  if(!sizeof(objects[env]))
+    m_delete(objects, env);
+
+  do_save=1;
+  return 1;
+}
+
+// Fragt nicht wirklich ab, sondern erstellt die angemeldeten Objekt in env.
+// Wenn kein env, wird previous_object() genommen.
+varargs void QueryObject(string envname)
+{
+  object env;
+  // take the caller as the questioning object
+  if(!envname || !stringp(envname))
+    env = previous_object();
+  else
+    env = find_object(envname);
+
+  // target must be a blueprint
+  if(IS_CLONE(env)) return 0;
+
+  envname=object_name(env);
+  if(member(objects, envname))
+  {
+    mixed oblist = objects[envname];
+    foreach(mixed arr : &oblist)
+    {
+       // Wir muessen unterscheiden, ob ein Clone angemeldete wurde oder eine
+       // Blueprint.
+       object o;
+       string *n = explode(arr[CLASS], "#");
+       if (sizeof(n) > 1 && sizeof(n[1]) > 0)
+         o = env->AddItem(n[0], REFRESH_DESTRUCT);
+       else
+         o = env->AddItem(n[0], REFRESH_DESTRUCT, 1);
+       o->SetProp(P_AUTOLOAD, arr[DATA]);
+       // Und das neue Objekt merken (ne Verwendung hat das zur Zeit aber
+       // nicht)
+       arr[CLASS] = object_name(o);
+    }
+  }
+}
+
+// Liefert eine Liste der in env angemeldeten Objekte. Wenn kein env, wird
+// previous_object() genommen.
+public varargs string QueryObjects(string envname)
+{
+  object env;
+  // take the caller as the questioning object
+  if(!envname || !stringp(envname))
+    env = previous_object();
+  else
+    env = find_object(envname);
+
+  // target must be a blueprint
+  if(IS_CLONE(env)) return 0;
+
+  mixed arrarr = objects[object_name(env)];
+  if (arrarr)
+  {
+    return CountUp(map(arrarr, #'[, CLASS),", ",", ");
+  }
+  return 0;
+}
+
+public varargs int remove(int silent)
+{
+  save_object(OBJECTD_SAVE);
+  destruct(ME);
+  return 1;
+}
+