Im Homemud Gilden- und Spellbook-Inherits erzeugen

Inherits auf vorandene Repositories koennnen automatisch erzeugt werden.

Change-Id: I2c2606683f0d506425c86b8f6931c6a5440d0382
diff --git a/secure/testmud.c b/secure/testmud.c
index 2cdf469..c9e2e7b 100644
--- a/secure/testmud.c
+++ b/secure/testmud.c
@@ -5,6 +5,7 @@
 
 #include <files.h>
 #include <config.h>
+#include <new_skills.h>
 
 // Variablen fuer das Savefile von Jof, was dieses Objekt schreibt.
 string name = "jof";
@@ -12,6 +13,8 @@
 int level = 100;
 string shell = "/std/shells/magier";
 
+private void generiere_gilden();
+
 public varargs int remove(int s)
 {
   destruct(this_object());
@@ -42,6 +45,91 @@
   {
     load_object("/room/konstrukt");
   }
+  generiere_gilden();
   master()->clear_cache();
   remove();
 }
+
+// Files zum Inherit aus Gilden- bzw. Spellbook-Repositories automatisch 
+// erzeugen.
+private void generiere_gilden()
+{
+  string* dir = get_dir("/gilden/",GETDIR_NAMES);
+  string* search = ({
+    "/gilden/files.%s/%s.c",
+    "/gilden/files.%s/gilde.c",
+    "/gilden/files.%s/room/%s.c",
+    "/gilden/files.%s/room/gilde.c"});
+
+  foreach(string entry : dir)
+  {
+    if(entry[0..4] != "files" || file_size("/gilden/"+entry[6..]+".c") > 0)
+      continue;
+
+    string file = entry[6..];
+    // Zielpfad nullen, damit auffaellt, wenn kein Ziel gefunden wird.
+    string path;
+    foreach(string s : search)
+    {
+      if(file_size(sprintf(s, file, file)) > 0)
+      {
+        path = sprintf(s, file, file);
+        break;
+      }
+    }
+
+    if(sizeof(path))
+    {
+      write_file("/gilden/"+file+".c",
+        "// Automatisch generierter Gilden-Inherit\n"
+        "inherit \""+path+"\";\n\n"
+        "protected void create()\n"
+        "{\n"
+        "  replace_program();\n"
+        "}\n");
+    }
+  }
+
+  // Bei Spellbooks sieht das leider etwas anders aus, daher ist hier eine
+  // Codedoppelung der uebersichtlichere Weg.
+  dir = get_dir("/spellbooks/", GETDIR_NAMES);
+  search = ({
+    "/spellbooks/%s/%s.c",
+    "/spellbooks/%s/spellbook.c"});
+
+  foreach(string entry : dir)
+  {
+    // Die Spellbooks heissen zwar alle unterschiedlich ... aber die Ordner
+    // heissen wie die Gilde. Und die Gilde kennt ihr Spellbook.
+    if(file_size("/spellbooks/"+entry) != FSIZE_DIR || 
+      file_size("/gilden/"+entry+".c") == FSIZE_NOFILE)
+    {
+      continue;
+    }
+
+    string file;
+    catch(file = ("/gilden/"+entry)->QueryProp(P_GUILD_DEFAULT_SPELLBOOK));
+    if(!sizeof(file) || file_size("/spellbooks/"+file+".c") > 0) continue;
+
+    string path;
+    foreach(string s : search)
+    {
+      if(file_size(sprintf(s, entry, file)) > 0)
+      {
+        path = sprintf(s, entry, file);
+        break;
+      }
+    }
+
+    if(sizeof(path))
+    {
+      write_file("/spellbooks/"+file+".c",
+        "// Automatisch generierter Spellbook-Inherit\n"
+        "inherit \""+path+"\";\n\n"
+        "protected void create()\n"
+        "{\n"
+        "  replace_program();\n"
+        "}\n");
+    }
+  }
+}