Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/d/seher/haeuser/special/seherfaq.c b/d/seher/haeuser/special/seherfaq.c
new file mode 100644
index 0000000..9ae96e6
--- /dev/null
+++ b/d/seher/haeuser/special/seherfaq.c
@@ -0,0 +1,247 @@
+inherit "std/thing";
+inherit "std/more";
+inherit "/mail/nedit";
+
+#include <properties.h>
+#include <wizlevels.h>
+#include "../haus.h"
+
+#define FAQ(f) (SPECIALPATH+"faq/"+(f))
+#define FAQUSER ({ "ryne", "toss", "sting" })
+#define IS_USER(pl) (member(FAQUSER, getuid(pl)) >= 0)
+
+static string *seite;
+static string f,*s;
+
+mapping synonym = ([]);
+
+create()
+{
+  ::create();
+  SetProp(P_NAME,"SeherFAQ");
+  SetProp(P_GENDER,FEMALE); 
+  SetProp(P_NOGET,1);
+  AddId( ({"faq","seherfaq","FAQ","SeherFAQ" }) );
+  AddCmd("lies","lesen");
+  AddCmd(({"beschreib","beschreibe"}),"beschreiben");
+  AddCmd("seiten","seiten");
+  AddCmd(({"loesch","loesche"}),"loeschen");
+  AddCmd(({"kopier","kopiere"}),"kopieren");
+  restore_object(FAQ("faq"));
+  seite = get_dir(FAQ("*"))-({".","..","faq.o"});
+}
+
+init()
+{
+  thing::init();
+  if (this_player() && IS_USER(this_player()))
+    nedit::init_rescue();
+}
+
+string
+_query_short()
+{
+  if (this_player() && IS_SEER(this_player()))
+    return "Die SeherFAQ";
+  else
+    return 0;
+}
+
+string 
+_query_long()
+{
+  if (this_player() && IS_SEER(this_player()))
+    return "Dies ist Rynes SeherFAQ.\n\
+Wenn Du weitere Fragen oder Anregungen zu dieser FAQ hast,\n\
+sei so nett und schicke Ryne einen kurzen Brief\n\n\
+Zum Inhalt der FAQ kommst Du mit >lies inhalt<\n";
+  else
+    return 0;
+}
+
+int
+id(string str)
+{
+  if (!IS_SEER(this_player()))
+    return 0;
+  else
+    return ::id(str);
+}
+
+int
+seiten(string str)
+{
+  int i,j;
+  string *syn;
+  closure filter_ldfied;
+
+  if (!IS_USER(this_player()))
+    return 0;
+
+  if(!(i = sizeof(seite)))
+    write("Keine Seiten beschrieben!\n");
+  else {
+    filter_ldfied = lambda(({'ind,'page,'map_ldfied/*'*/}),
+		    ({#'==,'page,({#'[/*]'*/,'map_ldfied,'ind})}));
+    for (str = "",i-=1;i>=0;i--) {
+      syn = m_indices(filter_indices(synonym,filter_ldfied,seite[i],synonym));
+      printf("Seite '%s' - ",seite[i]);
+      if (j=sizeof(syn)) {
+	for(j-=1;j>=0;j--)
+	  printf("'%s' ",syn[j]);
+	write("\n");
+      }
+      else
+	write( "(keine Synonyme definiert)\n");
+    }
+  }
+  return 1;
+}
+
+int
+lesen(string str)
+{
+  if (!IS_SEER(this_player()))
+    return 0;
+
+  if (!str || str == "") {
+    notify_fail("Was willst Du denn lesen?\n");
+    return 0;
+  }
+  str = lower_case(this_player()->_unparsed_args());
+  if (member(seite,str)<0) {
+    if (!member(synonym,str)) {
+      notify_fail("Diese Seite gibt es nicht...\n");
+      return 0;
+    }
+    else 
+      str = synonym[str];
+  }
+  this_player()->More(FAQ(str),1);
+  return 1;
+}
+
+int
+beschreiben(string str)
+{
+  string faq,*desc;
+  int i;
+
+  if (!IS_USER(this_player()))
+    return 0;
+
+  str = lower_case(this_player()->_unparsed_args());
+
+  if (!str || str == "") {
+    notify_fail("Was willst Du denn beschreiben?\n");
+    return 0;
+  }
+  if (sscanf(str,"%s %s",faq,str)!=2 || !id(faq)) {
+    notify_fail("Syntax: beschreibe faq <seite>\n");
+    return 0;
+  }
+  str = implode(old_explode(str," ")-({""}), " ");
+  desc = old_explode(implode(old_explode(str,", "),","),",");
+  f = 0;
+  s = 0;
+
+  for (i=sizeof(desc)-1;i>=0;i--) {
+    if (member(seite,desc[i])>=0) {
+      f = desc[i];
+      s = desc-({desc[i]});
+      break;
+    }
+  }
+  if (!f) {
+    f = desc[0];
+    s = desc[1..];
+  }
+  write("Bitte Beschreibung fuer die FAQ-Seite '"+f+"' angeben\n");
+  nedit("faq");
+  return 1;
+}
+
+static void
+faq(string str)
+{
+  int i;
+  string file;
+
+  if (!str || str == 0) {
+    write("** Abbruch! **\nNichts geaendert!\n");
+    return;
+  }
+  
+  if (file_size(file=FAQ(f))>=0)
+    rm(file);
+  write_file(file, str);
+  if (member(seite,f)==-1)
+    seite += ({f});
+
+  for (i=sizeof(s)-1;i>=0;i--) 
+    synonym += ([ s[i] : f ]);
+
+  save_object(FAQ("faq"));
+}
+
+int
+loeschen(string str)
+{
+  string *syn;
+  int i;
+
+  if(!IS_USER(this_player()))
+    return 0;
+
+  str = lower_case(this_player()->_unparsed_args());
+  if (!str || str == "") {
+    notify_fail("Was willst Du denn loeschen?\n");
+    return 0;
+  }
+  if (member(seite,str)>=0) {
+    syn = m_indices(filter_indices(synonym,
+				 lambda(({'ind,'page,'map_ldfied/*'*/}),
+					({#'==,'page,({#'[/*]'*/,'map_ldfied,'ind})}))
+				 ,seite[i],synonym));
+    rm(FAQ(str));
+    seite -= ({str});
+  }
+  else {
+    str = implode(old_explode(str," ")-({""}), " ");
+    syn = old_explode(implode(old_explode(str,", "),","),",");
+  }
+  for (i=sizeof(syn)-1; i>=0; i--)
+    synonym = filter_indices(synonym,
+                             lambda(({'key,'cmp}),
+				    ({#'!=,'key,'cmp/*'*/})),
+			     syn[i]);
+
+  save_object(FAQ("faq"));
+  write("OK\n");
+  return 1;
+}
+
+int
+kopieren(string str)
+{
+  string *part;
+  int i;
+
+  if (!IS_USER(this_player()))
+    return 0;
+
+  str = lower_case(this_player()->_unparsed_args());
+  part = old_explode(str," ")-({""});
+  if(sizeof(part)<4 || !id(part[0]) || part[2] != "nach" || 
+     member(seite,part[1]) == -1) {
+    notify_fail("kopiere faq <seite> nach <alias>\n");
+    return 0;
+  }
+  str = part[1];
+  part=old_explode(implode(old_explode(implode(part[3..]," "),", "),","),",");
+  for(i=sizeof(part)-1;i>=0;i--)
+    synonym += ([ part[i] : str ]);
+  save_object(FAQ("faq"));
+  write("OK.\n");
+  return 1;
+}