Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/secure/master/destruct.c b/secure/master/destruct.c
new file mode 100644
index 0000000..7e76a11
--- /dev/null
+++ b/secure/master/destruct.c
@@ -0,0 +1,105 @@
+// MorgenGrauen MUDlib
+//
+// secure/master/destruct.inc -- module of the master object: stuff for destruct.
+//
+// $Id: master.c 7041 2008-10-13 18:18:27Z Zesstra $
+
+#include "/sys/object_info.h"
+
+// privilegierte Objekte, die das destruct() abbrechen duerfen (root objekte
+// duerfen auch ohne, dass sie in dieser Liste erfasst sind):
+private nosave string *deny_destruct_list = ({
+    "/obj/shut", "/room/void", "/room/netztot", "/room/jail" });
+
+// Helferfunktion fuer prepare_destruct()
+private void recursive_remove(object ob, int immediate_destruct) {
+
+  if (efun::object_info(ob, OI_ONCE_INTERACTIVE)) {
+    // Spieler werden ins Void bewegt.
+    int res;
+    tell_object(ob, "Ploetzlich loest sich deine Welt in ihre " +
+                  "Bestandteile auf. Zum Glueck wirst\nDu irgendwo " +
+                  "hin geschleudert ...\n");
+    // wenn Bewegung buggt oder nicht funktioniert und ob noch existiert,
+    // rekursiv zerstoeren.
+    object oldenv=environment(ob);
+    if ( (catch(res=(int)ob->move("/room/void",M_TPORT|M_NOCHECK,0,"faellt");
+           publish) || (ob && environment(ob) == oldenv) )
+          && ob) {
+            // Spieler speichern, dann erst Inventar entleeren, dann remove() und
+        // und destruct() anwenden.
+        catch(ob->save_me(1); publish);
+        filter(all_inventory(ob), #'recursive_remove, immediate_destruct);
+        if (!immediate_destruct) 
+          catch(ob->remove(0);publish);
+        if (ob) 
+          destruct(ob);
+    }
+  }
+  else {
+    // kein Spieler. Rekursiv entfernen. Hierbei _zuerst_ rekursiv das
+    // Inventar entfernen und dann ob selber, damit nicht erst das Inventar in
+    // das Environment bewegt wird (soll ja eh zerstoert werden).
+    filter(all_inventory(ob), #'recursive_remove, immediate_destruct);
+    // ggf. zuerst remove versuchen
+    if (!immediate_destruct)
+      catch(ob->remove(1);publish);
+    if (ob)
+      destruct(ob);
+  }
+}
+
+// Zerstoerung von ob vorbereiten
+protected mixed prepare_destruct(object ob)
+{
+  object old_env,env,item;
+  mixed res;
+
+  // zuerst das notify_destruct() rufen und ggf. abbrechen, falls ob
+  // privilegiert ist.
+  catch(res = (mixed)ob->NotifyDestruct(previous_object()); publish);
+  if (res &&
+      (getuid(ob) == ROOTID ||
+       (IS_ARCH(ob)) ||
+       member(deny_destruct_list, object_name(ob)) >= 0)) {
+    if (stringp(res) && sizeof(res))
+      return res;
+    else
+      return sprintf("%O verweigert die Zerstoerung mittels destruct(). "
+          "Fehlende Rechte von %O?\n",ob, previous_object());
+  }
+  
+  env = environment(ob);
+
+  // Objekt hat kein Env: Alles zerstoeren, Spieler ins Void
+  if (!env) {
+    filter(all_inventory(ob), #'recursive_remove, 1);
+  }
+  else {
+    // Ansonsten alles ins Environment 
+    foreach(item : all_inventory(ob))
+    {
+      old_env=environment(item);
+      // M_MOVE_ALL, falls item nen Unitobjekt ist. Sonst clonen die u.U. noch
+      // wieder nen neues Objekt im alten Env.
+      if(catch(item->move(env, M_NOCHECK|M_MOVE_ALL);publish))
+        recursive_remove(item, 1);
+      else if (item && environment(item) == old_env)
+        recursive_remove(item, 1);
+    }
+  }
+
+  return 0; // Erfolg
+}
+
+// Anmerkung: liefert 0 zurueck, wenn die sefuns gerade geladen werden.
+string NotifyDestruct(object caller) {
+  // Nicht jeder Magier muss den Master entsorgen koennen.
+  if ((caller != this_object() && 
+        call_sefun("secure_level") < ARCH_LVL)
+      || call_sefun("process_call") ) {
+    return "Du darfst den Mudlib-Master nicht zerstoeren!\n";
+  }
+  return 0;
+}
+