diff --git a/secure/merlin.c b/secure/merlin.c
new file mode 100644
index 0000000..3075bec
--- /dev/null
+++ b/secure/merlin.c
@@ -0,0 +1,1345 @@
+// MorgenGrauen MUDlib
+//
+// merlin.c -- Unser geliebter Merlin
+//
+// $Id: merlin.c 9405 2015-12-13 00:22:01Z Zesstra $
+#pragma strict_types
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma verbose_errors
+#pragma combine_strings
+//#pragma pedantic
+//#pragma range_check
+#pragma warn_deprecated
+
+// 2014-Mai-10, Arathorn: Er soll ja weiterhin auf tm reagieren.
+inherit "std/npc/comm.c";
+
+#include <config.h>
+#include <properties.h>
+#include <language.h>
+#include <moving.h>
+#include <defines.h>
+#include <exploration.h>
+#include <news.h>
+#include <exploration.h>
+#include <events.h>
+#include <daemon/channel.h>
+#include "/secure/wizlevels.h"
+#include "/secure/config.h"
+#include "/secure/questmaster.h"
+#include "/secure/lepmaster.h"
+
+#ifndef DEBUG
+#define DEBUG(x) if (find_player("zook")) tell_object(find_player("zook"),x)
+#endif
+
+#define SAVEFILE "/secure/ARCH/merlin"
+#define BS(x) break_string((x),78)
+#define FEHLERTEUFEL "/obj/tools/fehlerteufel"
+
+mixed QueryProp(string prop);
+int move(mixed dest, int method);
+string query_g_suffix(int gen, int casus, int anzahl);
+string make_invlist(object viewer,object *inv);
+static int determine_action(string mess, string name);
+static int create_wizard(mixed who, mixed promoter);
+static int create_seer(mixed who);
+static void give_help(mixed who);
+int goto(mixed dest);
+
+nosave string *whitespaces=({",",".","?",";",":","-","!","\n","\t"});
+nosave object prev_room;
+nosave int delay,maxusers,busy;
+nosave string flag;
+
+mapping MBanishListe;
+
+void create()
+{
+  string s;
+  seteuid(ROOTID);
+  if (file_size("/etc/maxusers")<=0)
+    maxusers=0;
+  else
+  {
+    s=read_file("/etc/maxusers",0,1);
+    sscanf(s,"%d",maxusers);
+  }
+  set_living_name("merlin");
+  enable_commands();
+  call_out("wandern",25);
+  move("/gilden/abenteurer",0);
+  MBanishListe = m_allocate(0,2);
+  restore_object(SAVEFILE);
+  EVENTD->RegisterEvent(EVT_LIB_PLAYER_CREATION, "player_change", ME);
+  EVENTD->RegisterEvent(EVT_LIB_LOGIN, "player_change", ME);
+  // absichtlich kein EVT_LIB_LOGOUT, s. Kommentar zu notify_player_leave().
+}
+
+string _query_kill_name()
+{
+  return "Ein genervter Merlin";
+}
+
+int move(mixed ob,int methods)
+{
+  object tmp;
+
+  if (methods&M_GET)
+    return ME_CANT_BE_TAKEN;
+
+  if (stringp(ob))
+  {
+    if (!(tmp=find_object(ob)))
+    {
+      call_other(ob,"?");
+      tmp=find_object(ob);
+    }
+    ob=tmp;
+  }
+  if (!objectp(ob))
+    return 0;
+  if (environment())
+    tell_room(environment(),"Merlin zieht weiter.\n");
+  tell_room(ob,"Merlin kommt an.\n");
+  move_object(ob);
+  return 1;
+}
+
+mixed QueryProp(string str)
+{
+  if (!stringp(str)||str=="")
+    return 0;
+  return call_other(this_object(),"_query_"+str);
+}
+
+varargs int id(string str)
+{
+  return (str=="merlin");
+}
+
+varargs string name(int casus, int demon)
+{
+  if (casus!=WESSEN)
+    return "Merlin";
+  return "Merlins";
+}
+
+varargs string Name(int casus, int daemon)
+{
+  return name(casus,daemon);
+}
+
+string QueryDu(int casus, int gender, int zahl)
+{
+  return
+    ({ ({ ({ "du", "ihr"}), ({ "du", "ihr"}), ({ "du", "ihr"}) }),
+         ({({"deines","deiner"}),({"deines","deiner"}),({"deiner","deiner"})}),
+         ({({"dir","euch"}),({"dir","euch"}),({"dir","euch"})}),
+         ({({"dich","euch"}),({"dich","euch"}),({"dich","euch"})})
+       })[casus][gender][zahl];
+}
+
+string long()
+{
+  EPMASTER->GiveExplorationPoint("merlin");
+  return break_string(
+      "Merlin - der maechtige Urvater aller Magier - ist ein hagerer "
+      "Mann, der einen blauen, mit Monden und Sternen uebersaeten Umhang "
+      "traegt und sich auf einen knorrigen Stock stuetzt. Sein langer weisser "
+      "Bart reicht ihm fast bis zur Guertelschnalle, sein Haupthaar ist fast "
+      "ebenso lang. Auf seinem Kopf traegt er einen spitzen Hut, der ihn noch "
+      "groesser macht, als er ohnehin schon ist.\nEr ist unangreifbar, denn "
+      "er steht ueber solchen Dingen.",78,BS_LEAVE_MY_LFS);
+}
+
+string GetDetail(string key,mixed race,int sense) {
+  switch( sense ) {
+  case SENSE_SMELL: return 0;
+  case SENSE_SOUND: return 0;
+  }
+  switch( key ) {
+  case "nase": case "nasenhaare": case "hakennase":
+          return BS("Merlin hat eine lange, krumme Hakennase, aus deren Nasenloechern weisse Haare spriessen. Auf seiner Nase sitzt eine Brille mit Glaesern in Form eines Halbmondes.");
+  case "brille": case "glaeser": case "form": case "halbmond":
+          return "Merlins Brille besitzt Glaeser in Form eines Halbmondes.\n";
+  case "bart":
+          return "Merlins Bart ist sehr lang - Er reicht fast bis ueber die Guertelschnalle.\n";
+  case "haare" :
+          return "Sie reichen ihm bis zwischen die Schulterblaetter.\n";
+  case "schulterblaetter": case "schulterblatt":
+          return "Seine langen Haare bedecken die Schulterblaetter.\n";
+  case "gewand": case "robe":
+          return BS("Das Gewand ist blau und mit silbernen Monden und Sternen bestickt. Es ist uralt und schon etwas abgetragen, aber es erfuellt immer noch seinen Zweck.");
+  case "zweck":
+          return BS("Der Zweck des Gewandes besteht darn, Merlin standesgemaess zu bekleiden. Diesem Zweck kommt das Gewand in Vollendung nach.");
+  case "vollendung":
+          return "Nichts ist vollkommen.\n";
+  case "hut":
+          return BS("Ein langer, spitzer Hut, der in der gleichen Weise wie seine Robe mit Monden und Sternen bestickt ist.");
+  case "mond": case "monde": case "stern": case "sterne":
+          return BS("Die Monde und die Sterne sind mit silbrigen Faeden gestickt, die das Licht funkelnd zurueckwerfen.");
+  case "faden": case "faeden":
+          return BS("Schwer zu sagen, woraus die Faeden sind. Mithril? "
+              "Mondsilber?");
+  case "licht": case "mondsilber": case "mithril":
+          return BS("Du streckt schon Deine Hand aus, um Merlins Gewand naeher zu untersuchen, aber da trifft Dich sein strenger Blick. Schuechtern nimmst Du von Deinem Vorhaben Abstand.");
+  case "abstand":
+          return BS("Von so einem Magier sollte man aus Respekt einen Schritt Abstand halten.");
+  case "respekt":
+          return "Du hast sicher mehr Respekt vor Merlin, als er vor Dir.\n";
+  case "schritt":
+          return "Wessen Schritt??\n";
+  case "hand": case "haende":
+          return BS("Merlins Haende haben lange, gichtgeplagte Finger und gelbe lange Fingernaegel. Seine linke Hand stuetzt sich auf seinen knorrigen Gehstock. Die rechte Hand ist unter seinem Gewand verborgen.");
+  case "gichtknoten": case "gicht":
+          return BS("Durch die Gichtknoten sehen seine Haende fast so knorrig wie sein Gehstock aus.");
+  case "finger": case "fingernaegel": case "fingernagel":
+          return BS("Seine Finger sind voller Gichtknoten und seine gelben Fingernaegel koennte Merlin auch mal wieder schneiden.");
+  case "gehstock": case "stock":
+          return BS("Merlin stuetzt sich auf einen Gehstock. Der knorrige Stock scheint schon fast Eins mit seiner gichtknotigen Hand geworden zu sein. Ob es sich bei dem Stock um einen Magierstab handelt?");
+  case "zauberstab": case "magierstab":
+          return BS("Merlin stuetzt sich auf einen knorrigen Gehstock. Das koennte sein Zauberstab sein - aber vielleicht ist es auch nur ein Gehstock.");
+  case "guertel": case "guertelschnalle":
+          return BS("Sein Gewand wird von einem weissen Guertel gehalten. Vorne, unter seinem Bart, kannst Du die Guertelschnalle sehen. Auf der Guertelschnalle steht: 'Ich koennte jederzeit aufhoeren.'");
+  }
+  return 0;
+}
+
+
+string short()
+{
+  return "Merlin, der Urvater aller Magier.\n";
+}
+
+string _query_race()
+{
+  return "Magier";
+}
+
+int _query_gender()
+{
+  return 1;
+}
+
+string QueryPossPronoun( mixed what, int casus, int number )
+{
+  int gen2;
+  gen2 = ( intp( what ) ) ? what : what->QueryProp(P_GENDER);
+  return "sein" + query_g_suffix( gen2, casus, number );
+}
+
+string query_g_suffix( int gen, int casus, int anzahl )
+{
+  return ({ ({ ({"","e"}), ({"es","er"}), ({"em","en"}), ({"","e"}) }),
+              ({ ({"","e"}), ({"es","er"}), ({"em","en"}), ({"en","e"}) }),
+              ({ ({"e","e"}), ({"er","er"}), ({"er","en"}), ({"e","e"}) }) })
+    [gen][casus][anzahl];
+}
+
+string QueryPronoun(int casus)
+{
+  switch(casus) {
+    case WER: return "er";  break;
+    case WEM: return "ihm";
+  }
+  return "ihn";
+}
+
+string _query_short()
+{
+  return short();
+}
+
+string _query_long()
+{
+  return long();
+}
+
+string _query_name()
+{
+  return "Merlin";
+}
+
+int _query_weight()
+{
+  return 75000;
+}
+
+static void PostSeher(string who, int g)
+{
+  mixed *art;
+
+  art=({"stufen","Merlin",0,0,sprintf("%s ist jetzt ein%s Seher%s!",who,(g==2?"e":""),(g==2?"in":"")),sprintf("\nAm %s hat %s die noetigen Bedingungen\nerfuellt und ist vom Spielerstatus zum Seherstatus aufgestiegen. \n\n Herzlichen Glueckwunsch, %s!\n",dtime(time()),who,who)});
+  "/secure/news"->WriteNote(art,1);
+}
+
+static void PostMagier(string who, string prom, int gender)
+{
+  mixed *art;
+
+  art=({"stufen","Merlin",0,0,sprintf("%s ist jetzt ein%s Magier%s!",who,(gender==2?"e":""),(gender==2?"in":"")),sprintf("\nAm %s hat %s %s zu%s Magier%s\nberufen. Herzlichen Glueckwunsch, %s. Glueckwuensche auch an Dich,\n %s, zu Deine%s neuen %s!\n",dtime(time()),prom,who,(gender==2?"r":"m"),(gender==2?"in":""),who,prom,
+(gender==2?"r":"m"),(gender==2?"Tochter":"Sohn"))});
+  "/secure/news"->WriteNote(art,1);
+}
+
+
+private void GibFehlerteufel(object wiz) {
+  if (!objectp(wiz))
+      return;
+
+  clone_object(FEHLERTEUFEL)->move(wiz, M_NOCHECK|M_GET);
+  tell_object(wiz, break_string(
+    "Huhu "+wiz->Name(WER) + "! Ich habe gesehen, dass Du keinen "
+    "Fehlerteufel hast. Dieses Tool ist zum Debuggen von Fehlern im "
+    "Mud sehr praktisch. Bitte schau ihn Dir mal an. :-) Die Hilfe zum "
+    "Fehlerteufel kannst Du mit 'man fehlerteufel' lesen. BTW: Wenn "
+    "Du den Fehlerteufel nicht willst, kannst Du ihn zerstoeren, ich "
+    "werde Dich kein zweites Mal damit belaestigen.",78,
+    "Merlin teilt Dir mit: ")
+    + "Merlin ueberreicht Dir aus der Ferne einen knusprig gebratenen "
+    "Fehlerteufel.\n\n");
+}
+
+private void notify_player_change(string who,int rein)
+{
+  if (!stringp(who))
+    return;
+
+  // Max-user festhalten
+  if (file_size("/etc/maxusers")<=0)
+    maxusers=0;
+  if (sizeof(users())>=maxusers)
+  {
+    maxusers=sizeof(users());
+    write_file("etc/maxusers",sprintf("%d user: %s (%s)\n",
+          maxusers,dtime(time()),query_load_average()),1);
+  }
+
+  // allen Magiern ab Level 20, die keinen Fehlerteufel haben und deren
+  // letzter Logout vor "Die, 17. Mar 2009, 23:40:04" => 1237329604 war,
+  // einen Fehlerteufel clonen und nen Hiwneis mitteilen.
+  object ob = find_player(who);
+  if (ob && rein && IS_WIZARD(ob)
+      && !present_clone(FEHLERTEUFEL,ob)
+      && ob->QueryProp(P_LAST_LOGOUT) < 1237329604 )
+    GibFehlerteufel(ob);
+}
+
+private void AnnounceNewPlayer(object pl) {
+
+  if (!pl || !interactive(pl))
+    return;
+
+  // verzoegern, bis der Spieler wirklich fertig ist.
+  if (pl->QueryProp(P_LEVEL) < 0) {
+    call_out(#'AnnounceNewPlayer,10,pl);
+    return;
+  }
+
+  if (!(int)pl->QueryGuest()) {
+  string plname = (string)pl->Name(WER);
+    CHMASTER->send("Anfaenger", this_object(),
+      sprintf("%s macht nun ebenfalls das Morgengrauen unsicher. "
+              "Herzlich Willkommen %s!", plname, plname)
+      );
+  }
+}
+
+// Kann bei reboot wieder raus... zesstra, 16.03.2007
+#if __BOOT_TIME__ < 1318110723
+#define BUGTIME 1318003200 
+#define BUGFIXTIME 1318109421
+void renew_player(string plname, int force) {
+    object pl;
+    mixed err;
+
+    pl = find_player(plname);
+    if (!objectp(pl) || !query_once_interactive(pl)) return;
+
+    // jung oder alt genug, Abbruch. ;-)
+    if ((object_time(pl) > BUGFIXTIME)
+        || object_time(pl) < BUGTIME)
+        return;
+
+    if (get_eval_cost() < 1000000 || !force ) {
+        call_out("renew_player",8,plname,1);
+        tell_object(pl,break_string(sprintf("Huhu %s, um einen Bug in "
+                "Deinem Spielerobjekt zu beheben, wirst Du in ca. 8s "
+                "neugeladen. Bitte warte bis dahin ab und bleibe, wo "
+                "Du gerade bist.",pl->Name()),78,"Merlin teilt Dir mit: "));
+        return;
+    }
+
+    plname=getuid(pl);
+    tell_object(pl,break_string(sprintf("Huhu %s, um einen Bug in "
+            "Deinem Spielerobjekt zu beheben, wirst Du jetzt "
+            "neugeladen.",pl->Name()),78,"Merlin teilt Dir mit: "));
+
+    if (err=catch(master()->renew_player_object(pl);publish)) {
+        log_file("zesstra/failed_rewew.log",sprintf("%s: Fehler %O beim "
+              "Renew von %s\n",dtime(time()),err,plname));
+        tell_object(pl,break_string("Beim Neuladen Deines Spielerobjekts "
+              "gab es einen Fehler. Bitte wende Dich an einen EM.",78,
+          "Merlin teilt Dir mit: "));
+    }
+    else {
+      log_file("zesstra/renewed.log",sprintf("%s: %s wurde renewed.\n",
+            dtime(time()),plname));
+      if (objectp(find_player(plname)))
+          tell_object(find_player(plname),
+            break_string("Dein Spielerobjekt wurde neugeladen. Du "
+          "kannst jetzt normal weiterspielen. Falls Du etwas ungewoehnliches "
+          "bemerkst, melde Dich bitte bei einem Erzmagier. Viel Spass im "
+          "Spiel!",78, "Merlin teilt Dir mit: "));
+    }
+}
+#endif
+
+void player_change(string eid, object trigob, mixed data) {
+
+  if (!trigob || !interactive(trigob))
+    return;
+
+  switch(eid) {
+    case EVT_LIB_PLAYER_CREATION:
+      call_out(#'AnnounceNewPlayer, 5, trigob);
+      break;
+    case EVT_LIB_LOGIN:
+      notify_player_change(data[E_PLNAME],1);
+#if __BOOT_TIME__ < 1318110723
+      // Spieler evtl. renewen? Bei reboot raus (08.10.2011)
+      renew_player(data[E_PLNAME],0);
+#endif
+      break;
+  }
+}
+
+
+//besser P_NO_ATTACK als Defend()...
+mixed _query_no_attack() {
+  if (!living(PL) || !objectp(environment(PL)) ) return(1);
+
+  tell_room(environment(), "Merlin schimpft: Lass das!!!\n",({PL}));
+  tell_room(environment(),sprintf(
+        "Merlin gibt %s eine schallende Ohrfeige.\n",      
+        capitalize((string)this_player()->name(WEM))), ({this_player()}));
+  return("Merlin schimpft: Lass das!!!\n"
+      "Merlin gibt Dir eine schallende Ohrfeige.\n");
+}
+
+/*
+int Defend(int dam, string dam_type, int spell, object enemy)
+{
+  object en;
+  if (!en=previous_object() || !living(en))
+    en = this_player();
+  tell_room(environment(), "Merlin schimpft: Lass das!!!\n");
+  write("Merlin gibt Dir eine schallende Ohrfeige.\n");
+  say(sprintf("Merlin gibt %s eine schallende Ohrfeige.\n",
+              capitalize((string)this_player()->name(WEM))), this_player());
+  en->StopHuntFor(this_object(), 1);
+}
+*/
+void shoutansw()
+{
+  object env,ti;
+  string *path;
+  string ans;
+
+  if (!(env=environment()))
+    return;
+  if (!(ti=this_interactive())||(int)ti->QueryProp(P_LEVEL)<19||ti->QueryProp(P_GHOST))
+    return;
+  tell_object(ti,"Du spuerst einen sengenden Schmerz.\n");
+  ti->do_damage( ((int)ti->QueryProp(P_HP)) / 2 + 5);
+  if((int)ti->QueryProp(P_GHOST)) return;
+  ans="ich hab nicht die leiseste Idee, wo ich hier bin ...\n";
+  path=old_explode(object_name(env),"/");
+  if (path[0]=="d")
+  {
+    ans="werweisswo ..";
+    switch(path[1])
+    {
+      case "gebirge":
+      case "wald":
+      case "dschungel":
+      ans="im "+capitalize(path[1]);
+      break;
+      case "inseln":
+      ans="auf den Inseln";
+      break;
+      case "polar":
+      ans="im Polargebiet";
+      break;
+      case "unterwelt":
+      case "ebene":
+      case "wueste":
+      ans="in der "+capitalize(path[1]);
+      break;
+      case "vland":
+      ans="im Verlorenen Land";
+      break;
+      case "fernwest":
+      ans="in Fernwest";
+      break;
+    }
+    ans="ich bin "+ans+".\n";
+  }
+  if (path[0]=="players")
+    ans="ich hab mich verlaufen - ich schaetze, "+capitalize(path[1])+
+      " hat was damit zu tun...\n";
+  if (path[0]=="gilden") {
+    switch(path[1]) {
+      case "abenteurer":
+      ans="der Abenteurergilde";
+      break;
+      case "bierschuettler":
+      ans="der Bierschuettlergilde";
+      break;
+      case "chaos":
+      ans="der Gilde der Chaoten";
+      break;
+      case "kaempfer":
+      ans="der Kaempfergilde";
+      break;
+      case "karate":
+      ans="einem Karatedojo";
+      break;
+      case "klerus":
+      ans="einem Tempel der Kleriker";
+      break;
+      case "zauberer":
+      ans="der Akademie der Zauberer";
+      break;
+      default:
+      ans="irgendeiner Gilde";
+    }
+    ans="ich stehe in "+ans+".\n";
+  }
+                if( path[0]=="p" && path[1]=="verein" ) {
+                        ans="ich stehe in Port Vain.";
+                }
+  if (!this_interactive()->QueryProp(P_INVIS))
+    ans=this_interactive()->Name(WER)+", "+ans;
+  else ans=capitalize(ans);
+  call_out("myshout",0,break_string(ans, 78, "Merlin ruft: "));
+}
+
+void myshout(string s)
+{
+  write(s);
+  shout(s);
+}
+
+void catch_tell(string str)
+{
+  string name, dummy; mixed message;
+  int i,s;
+
+  if (!this_player())
+    return;
+
+  if (environment()==environment(this_player()) && previous_object()!=ME)
+    tell_room(this_object(),"*"+str);
+
+  if (this_player() != this_interactive())
+    return;
+
+  if (busy) {
+    tell_object(this_player(), 
+       "Merlin teilt Dir mit: Ich bin beschaeftigt.\n");
+    return;
+  }
+    
+  str=lower_case(str);
+
+  if ((strstr(str, "teilt dir mit:") != -1) 
+      && (strstr(str, "wo bist du") !=-1)) {
+    shoutansw();
+    return;
+  }
+
+  if ((strstr(str, "teilt dir mit:") != -1) && 
+      ((strstr(str, "seher") != -1 || strstr(str, "seherin") != -1)))
+    {
+      create_seer(this_player());
+      return;
+    }
+
+  if (sscanf(str,"%s %s sagt: %s",dummy,name,message)!=3)
+    if (sscanf(str,"%s sagt: %s",name,message)!=2)
+      return;
+
+  if (!name || name=="" ||            
+      catch(s=file_size("save/"+name[0..0]+"/"+name+".o");publish)            
+      || s<=0 )
+    return;
+
+  if (name!=getuid(this_interactive()) && !ARCH_SECURITY)
+  {
+    if (flag==getuid(this_interactive())+"##"+name)
+      return;
+    call_out("do_say",0,"Merlin sagt: "+capitalize(getuid(this_interactive()))+" hat gerade so getan, als wuerde "+capitalize(name)+" etwas sagen!\n");
+    flag=getuid(this_interactive())+"##"+name;
+    call_out("clear_flag",0);
+    return;
+  }
+  flag=0;
+  for (i=0;i<sizeof(whitespaces);i++)
+  {
+    message=old_explode(message,whitespaces[i]);
+    if (!pointerp(message)||sizeof(message)==0)
+      return;
+    message=implode(message," ");
+  }
+
+  message=old_explode(message," ");
+
+  if (!pointerp(message) || !sizeof(message))
+    return;
+
+  message-=({0})-({""});
+
+  if (!message || sizeof(message)==0)
+    return;
+
+  if (member(message, "merlin")==-1)
+    return;
+
+  message-=({"merlin"});
+
+  message=implode(message," ");
+
+  if (!message || message=="")
+    return;
+
+  determine_action(message, name);
+}
+
+static int determine_action(string mess, string name)
+{
+  string str;
+
+  if (mess=="mach mich zum magier" || mess=="mach mich zur magierin")
+    return create_wizard(name,name);
+
+  if (sscanf(mess,"mach %s zum magier",str)==1||sscanf(mess,"mach %s zur magierin",str)==1)
+    return create_wizard(lower_case(str),name);
+
+  give_help(name);
+  return 0;
+}
+
+#define Say(str) say(str,who)
+#define Write(str) tell_object(who,str)
+
+int QueryBedingungen(object pl,string was)
+{
+  int ret,i,gen;
+  string s;
+
+  if (IS_SEER(pl))
+    return 1;
+  
+  if ((int)LEPMASTER->QueryReadyForWiz(pl)==1)
+    return 1;
+
+  s=(string)LEPMASTER->QueryReadyForWizText(pl); 
+
+  tell_object(pl, break_string("Merlin gruebelt ein wenig und teilt Dir "
+                               "nach einigem Ueberlegen mit:\n\n", 78,0,1));
+  
+  tell_object(pl, s+"\n");
+
+  tell_object(pl, break_string("Da ist wohl fuer Dich noch etwas zu tun...",
+                               78, "Merlin teilt Dir mit: "));
+
+  if (environment() == environment(pl))
+    say((string)pl->name(WER)
+        +" erfuellt noch nicht alle Anforderungen fuer den "+was+"status.\n",pl);
+  
+  return 0;
+}
+
+static int create_wizard(mixed who, mixed promoter)
+{
+  mixed *domains;
+  object vertrag;
+  int ret;
+  string gen;
+
+  who=find_player(who);
+  promoter=find_player(promoter);
+  if (!who || !promoter)
+    return 0;
+  //
+  // player not interactive?
+  //
+  if (!interactive(who))
+  {
+    write(capitalize(getuid(who))+" ist nicht aktiv.\n");
+    return 0;
+  }
+  //
+  // player is second?
+  //
+  if (who->QueryProp(P_SECOND))
+  {
+     tell_object(who,"Du bist ein Zweitspieler und kannst als solcher kein Magier werden.\n"
+          +"Versuchs Doch mal mit Deinem Erstie.\n");
+     write("Du kannst "+who->name()+" nicht zum Magier machen. Das geht bei "
+          +"Zweities\nleider nicht. Frag doch mal nach dem Erstie.\n");
+     return 1;
+  }
+  //
+  // wants to advance himself?
+  //
+  if (who==promoter)
+  {
+    write("Du kannst Dich nicht selber befoerdern. Such Dir dazu bitte einen "+
+              "Vollmagier,\nder Dir einen Vertrag gibt.\n");
+    return 1;
+  }
+  //
+  // banished?
+  //
+  if (MBanishListe[who,1])
+  {
+    tell_object(promoter,capitalize(who)+" darf nur von einem Erzmagier zum "+
+                    "Magier gemacht werden.\n");
+    say(promoter->name(WER)+" ist kein Erzmagier und darf "+capitalize(who)+
+            " nicht zum Magier machen.\n");
+    return 1;
+  }
+  //
+  // player has PK?
+  //
+  if (who->QueryProp("playerkills")) {
+     tell_room(environment(who),who->name()+" hat noch einen Playerkill und kann somit kein Magier werden.\n"
+                           "Am besten den Sheriff oder einen Erzmagier verstaendigen.\n");
+         return 1;
+  }
+  //
+  // already dom_member?
+  //
+  if (IS_DOMAINMEMBER(who))
+  {
+    Write("Fuer Dich kann ich nichts mehr tun. Du bist doch schon Magier!\n");
+    return 1;
+  }
+
+  //
+  // "advanced learner"?
+  //
+  if (query_wiz_level(who) == 20)
+  {
+    if (!ARCH_SECURITY) {
+      Write("Dich kann nur ein Erzmagier zum \"richtigen\" Magier machen!\n");
+      Say("Nur ein Erzmagier kann "+who->name(WEN)+" zum \"richtigen\" Magier machen!\n");
+      return 0;
+    }
+    ret=(int)"secure/master"->advance_wizlevel(geteuid(who),21);
+    if (ret<=0)
+    {
+      say("Merlin: error "+ret+"\n");
+      write("Merlin: error "+ret+"\n");
+    }
+    write("Merlin ruft: "+(string)who->name(WER)+" ist in den Kreis der Magier "+
+              "aufgenommen worden!\n");
+    shout("Merlin ruft: "+(string)who->name(WER)+" ist in den Kreis der Magier "+
+              "aufgenommen worden!\n");
+    "secure/master"->renew_player_object(who);
+    return 1;
+  }
+
+  //
+  // already wizard?
+  //
+  if (IS_WIZARD(who))
+  {
+    domains=(string*)"secure/master"->get_domain_homes(getuid(who));
+    if (!domains || !pointerp(domains) || !sizeof(domains))
+    {
+      Say(who->name(WER)+" gehoert noch keiner Region an und kann daher noch "+
+              "kein Voll-\nmagier werden.\n");
+      Write("Du gehoerst noch keiner Region an. Schliess Dich zunaechst einer "+
+                "an und komm\ndann wieder!\n");
+      return 0;
+    }
+    ret=(int)"secure/master"->advance_wizlevel(geteuid(who),25);
+    if(ret>0)
+    {
+      shout(who->name(WER)+" arbeitet jetzt an einer Region mit!\n");
+      "secure/master"->renew_player_object(who);
+      return 1;
+    }
+    write("RETURNVALUE "+ret+"\n");
+    say("RETURNVALUE "+ret+"\n");
+    return 0;
+  }
+
+  //
+  // still learner?
+  //
+  if (IS_LEARNER(who))
+  {
+    if (!ARCH_SECURITY) {
+      Write("Dich kann nur ein Erzmagier zum \"richtigen\" Magier machen!\n");
+      Say("Nur ein Erzmagier kann "+who->name(WEN)+" zum \"richtigen\" Magier machen!\n");
+      return 0;
+    }
+    ret=(int)"secure/master"->advance_wizlevel(geteuid(who),20);
+    if (ret<=0)
+    {
+      say("Merlin: error "+ret+"\n");
+      write("Merlin: error "+ret+"\n");
+    }
+    string wizname = (string)who->query_real_name();
+    "secure/master"->renew_player_object(who);
+    // Fehlerteufel geben
+    call_out(#'GibFehlerteufel,4,find_player(wizname));
+    return 1;
+  }
+
+  //
+  // promoter's level is not >DOMAINMEMBER_LVL+1
+  //
+  if (secure_level()<=DOMAINMEMBER_LVL)
+  {
+    tell_object(promoter,"Du musst derzeit mindestens Level "+
+                    (DOMAINMEMBER_LVL+1)+" haben, um jemanden befoerden zu "+
+                                "koennen.\n");
+    say(promoter->name(WER)+" ist kein Vollmagier und darf daher niemanden "+
+            "zum Vollmagier machen.\n");
+    return 1;
+  }
+
+  // der Check auf den Blutprintnamen ist fast ueberfluessig, aber nur fast.
+  // Er schlaegt fehl, wenn der Vertrag der Clone einer alten BP ist.
+  if (!(vertrag=present_clone("/obj/vertrag",who)) ||
+      object_name(blueprint(vertrag))!="/obj/vertrag" ||
+      !((int)vertrag->is_unterschrieben()) )
+  {
+    Write("Du hast ja gar keinen unterschriebenen Vertrag bei Dir. Besorg Dir "+
+              "einen Ver-\ntrag, unterschreibe ihn und komm dann wieder!\n");
+    Say(who->name(WER)+" hat keinen unterschriebenen Vertrag.\n");
+    return 1;
+  }
+  if (geteuid(vertrag)!=secure_euid())
+  {
+    tell_object(promoter,"Das geht nicht, er hat einen Vertrag von "+
+                    capitalize(geteuid(vertrag))+" bei sich.\n");
+    say(promoter->name(WER)+" versucht, "+who->name(WER)+" zum Magier zu "+
+            "machen, doch "+who->name(WER)+" hat einen Vertrag\nvon "+
+                capitalize(geteuid(vertrag))+" bei sich.\n",promoter);
+    return 0;
+  }
+  if (!QueryBedingungen(who,"Magier"))
+    return 0;
+  ret=(int)"secure/master"->advance_wizlevel(geteuid(who),15);
+  if (ret>0)
+  {
+    PostMagier(capitalize(getuid(who)),
+        capitalize(secure_euid()),(int)who->QueryProp(P_GENDER));
+    write_file("/log/SPONSOR",dtime(time())+": "+capitalize(getuid(promoter))+" macht "+
+             who->name(WER)+" zum Learner.\n");
+    write(who->name(WER)+" ist in den Kreis der Magier aufgenommen worden!\n");
+    shout(who->name(WER)+" ist in den Kreis der Magier aufgenommen worden!\n");
+    if ("secure/master"->set_player_object(geteuid(who),"/std/shells/magier")
+            <=0)
+    {
+      say("MERLIN: konnte Magiershell nicht einstellen.\n");
+      write("MERLIN: konnte Magiershell nicht einstellen.\n");
+    }
+    "secure/master"->renew_player_object(who);
+    return 1;
+  }
+  write(" --RETURNVALUE IS "+ret+"\n");
+  say(" --RETURNVALUE IS "+ret+"\n");
+
+  return(ret); //non-void funktion
+}
+
+void clear_flag()
+{
+  flag=0;
+}
+
+void do_say(string str)
+{
+  say(str);
+}
+
+
+
+void seer_sequenz3(mixed player, string plname)
+{
+  string playername; 
+  object faq;
+  string text;
+
+  if (!objectp(player)) {
+    tell_room(environment(), sprintf("Merlin sagt: Na, wo ist denn %s "
+                                     "hin?\n", plname));
+    busy = 0;
+    return;
+  }
+  if (environment() != environment(player))
+    move(environment(player), M_TPORT);
+  
+  tell_object(player,break_string("\n\nEs macht *PUFF* und eine Schwefelwolke "
+                                  +"steigt um Dich herum auf.\n\nDie Aura "
+                                  +"verschwindet langsam und Du fuehlst Dich "
+                                  +"nun viel erfahrener.", 78,0,1));
+  tell_room(environment(),
+           break_string(sprintf(
+                       "\n\nEs macht *PUFF* und eine Schwefelwolke steigt "
+                       +"um %s herum auf.\n\nDie Aura verschwindet langsam.\n",
+                       plname),78,0,1), ({player}));
+ 
+  if ("secure/master"->advance_wizlevel(geteuid(player),1)<=0)
+  {
+    write("Merlin sagt: Da geht was schief ... sag mal Zook Bescheid.\n");
+    say("Merlin sagt: Da geht was schief ... sag mal Zook Bescheid.\n");
+    busy = 0;
+    return;
+  }
+  playername = geteuid(player);
+  "secure/master"->renew_player_object(player);
+  player = find_player(playername);
+  text = sprintf(" ist jetzt ein%s Seher%s!\n",
+    (((int)player->QueryProp(P_GENDER))==2?"e":""),
+    (((int)player->QueryProp(P_GENDER))==2?"in":""));
+  write("Merlin ruft: "+capitalize(playername)+text);
+  shout("Merlin ruft: "+capitalize(playername)+text);
+  PostSeher(capitalize(playername),(int)player->QueryProp(P_GENDER));
+  if(!catch(
+        faq=clone_object("/d/seher/haeuser/special/seherfaqmobil") ;publish))
+  {
+    faq->move(player,M_NOCHECK);
+    tell_object(player, "Aus dem Nichts erscheint eine kleine Belohnung fuer Dich.\n");
+  }
+  
+  tell_object(player, "\n\nDu laechelst gluecklich in die Runde.\n\n");
+  tell_room(environment(), sprintf("\n\n%s laechelt gluecklich in die Runde.\n\n", plname), ({player}));
+
+ busy=0;
+}
+
+void seer_sequenz2(mixed player, string plname)
+{
+  if (!objectp(player)) {
+    tell_room(environment(), sprintf(
+                                     "Merlin sagt: Na, wo ist denn %s hin?\n", 
+                                     plname));
+    busy = 0;
+    return;
+  }
+  if (environment() != environment(player))
+    move(environment(player), M_TPORT);
+
+  tell_object(player, break_string("\nMerlin hebt die Arme und "
+       +"und macht einige beschwoerende Gesten. Um Dich herum erscheint "
+       +"eine gelbliche Aura, die immer heller wird, bis Du Deine "
+                                   +"Umwelt kaum mehr erkennen kannst.\n\n",
+                                   78,0,1));
+  tell_room(environment(),
+            break_string(sprintf("\nMerlin hebt die Arme und macht einige "
+                         +"beschwoerende Gesten. Um %s erscheint eine "
+                         +"gelbliche Aura, die immer heller wird, bis "
+                                 +"man %s kaum mehr erkennen kann.\n\n", 
+                                 plname, plname),78,0,1), ({player}));
+
+  call_out("seer_sequenz3", 7, player, plname);
+}
+
+void seer_sequenz1(mixed player, string plname)
+{
+  if (!objectp(player))
+    return;
+
+  move(environment(player), M_TPORT);
+
+  tell_room(environment(),
+            break_string(sprintf("Das ist eine grosse Freude. %s hat sich "
+     "tapfer durch das "MUDNAME" geschlagen und mittlerweile alle "
+     "Anforderungen erfuellt, um %s zu werden.",                                  
+     plname, ((int)player->QueryProp(P_GENDER))==1?"Seher":"Seherin"),
+              78, "Merlin sagt: "));
+
+  call_out("seer_sequenz2", 4, player, plname);
+}
+
+  
+static int create_seer(mixed player)
+{
+  if (!objectp(player))
+    return 0;
+  if (IS_SEER(player))
+  {
+    write(break_string("Du bist doch schon kein normaler Spieler mehr, "
+                       +"was soll es also?", 78, "Merlin teilt Dir mit: "));
+    return 1;
+  }
+
+  if (!QueryBedingungen(player,"Seher"))
+    return -1;
+
+
+  write(break_string("Grosse Freude! Du hast alle Anforderungen "
+                                   "erfuellt. Warte einen Moment...", 78,
+                                   "Merlin teilt Dir mit: "));
+  busy=1;
+  call_out("seer_sequenz1",4,player, player->Name());
+  return(0); //non-void funktion
+}
+
+static void give_help(mixed player)
+{
+  if (!objectp(player))
+    return;
+
+  tell_object(player,
+              break_string("Ich weiss nicht, was ich fuer Dich tun kann. "
+                           +"Ich kann Dich zum Seher oder zum Magier "
+                           +"machen, wenn Du mich darum bittest.", 78,
+                           "Merlin teilt Dir mit: "));
+}
+              
+
+void reset()
+{
+}
+
+public int remove(int silent) {
+  EVENTD->UnregisterEvent(EVT_LIB_LOGIN, ME);
+  EVENTD->UnregisterEvent(EVT_LIB_PLAYER_CREATION, ME);
+  destruct(this_object());
+  return 1;
+}
+
+void wandern()
+{
+  mapping ex,rooms;
+  mixed ziel;
+  object *raeume,*laeden,env,ob;
+  string *ind,fn;
+  int i;
+
+  while (remove_call_out("wandern")>=0);
+  call_out("wandern",45+random(100));
+  if (busy) return;
+  if (delay)
+  {
+    delay=0;
+    return;
+  }
+  if (!(env=environment()))
+  {
+    move("/gilden/abenteurer",0);
+        env=environment();
+  }
+  //ueber Inv iterieren, ob da ein nicht-idelnder Spieler mit genug XP
+  //rumhaengt.
+  raeume=all_inventory(env);
+  for(i=sizeof(raeume); i-- ; ) {
+    if (interactive(raeume[i]) && query_idle(raeume[i])<180 &&
+        raeume[i]->QueryProp(P_XP)>999999)
+      return;
+  }
+  ex=(mapping)env->QueryProp(P_EXITS);
+  if (!mappingp(ex))
+    return;
+  ind=m_indices(ex);rooms=([]);laeden=({});
+  for (i=sizeof(ind)-1;i>=0;i--)
+  {
+    if (!stringp(ziel=ex[ind[i]]))
+      continue;
+    if (!ob=find_object(ziel))
+      continue;
+    rooms+=([ob]);
+  }
+  rooms-=([env]);
+  if (prev_room && sizeof(m_indices(rooms))>1)
+    rooms-=([prev_room]);
+  prev_room=env;
+  raeume=m_indices(rooms);
+  if (!i=sizeof(raeume))
+    return;
+  ob=raeume[random(i)];
+  move(ob,0);
+}
+
+string int_short()
+{
+  return "Du bist im allseits beliebten Wizclub \"Zum lustigen Merlin\".\n";
+}
+
+string int_long(object who,mixed where)
+{
+  string descr;
+
+  if( IS_LEARNER(who) && who->QueryProp( P_WANTS_TO_LEARN ) )
+    descr = "[" + object_name(ME) + "]\n";
+  else
+    descr = "";
+  descr+="Du bist im Wizclub 'Zum lustigen Merlin'. Dieser Wizclub ist etwas besonderes -\ner hat keinen festen Standort, sondern wandert im Mud herum. Ausserdem kann er\nSpieler zu Magiern machen - aber nur, wenn man ihn von aussen aus darauf\nanspricht.\n";
+  if ( who->QueryProp(P_SHOW_EXITS) )
+    descr += "Es gibt 2 sichtbare Ausgaenge: raus und gilde.\n";
+  descr += make_invlist(who, all_inventory(ME) - ({ who }));
+  if( environment())
+    descr += "\nAusserhalb siehst Du:\n"
+      + environment()->int_short(who,ME);
+  return descr;
+}
+
+string make_invlist(object viewer,object *inv)
+{
+  int i, iswiz;
+  string descr;
+
+  descr = "";
+  iswiz = IS_LEARNER( viewer ) && viewer->QueryProp(P_WANTS_TO_LEARN);
+
+  for (i = 0; i < sizeof(inv); i++)
+  {
+    string sh;
+    sh = (string)inv[i]->short();
+    if (iswiz)
+    {
+      if (sh) sh = sh[0..<2] + " ["+object_name(inv[i])+"]\n";
+      else sh = "["+object_name(inv[i])+"]\n";
+    }
+    if (sh) descr += sh;
+  }
+  return descr;
+}
+
+void init()
+{
+  if (interactive(this_player()) && environment(this_player())==ME)
+    add_action("gehen","",1);
+  add_action("befoerdere","befoerder",1);
+}
+
+int befoerdere(string str)
+{
+  string wen;
+  int ret,stufe,l;
+
+  if (!LORD_SECURITY) return 0;
+  if (!str||sscanf(str,"%s auf stufe %d",wen,stufe)<2)
+  {
+    notify_fail("Syntax: befoerdere <name> auf stufe <stufe>\n");
+        return 0;
+  }
+  if (stufe>29)
+  {
+    write("Maximum ist Stufe 29!\n");
+        return 1;
+  }
+  l=query_wiz_level(wen);
+  if (l<25)
+  {
+    printf("%s muss mindestens zwecks Weiterbefoerderung mindestens Stufe 25 haben.\n",
+        capitalize(wen));        
+    return 1;
+  }
+  if (l>=stufe)
+  {
+    printf("%s ist schon Stufe %d.\n",capitalize(wen),l);
+        return 1;
+  }
+  ret=(int)"secure/master"->advance_wizlevel(wen,stufe);
+  if (ret<=0)
+    printf("Errorcode %d\n",ret);
+  else
+    write("ok\n");
+  return 1;
+}
+
+int sag(mixed str)
+{
+  int i;
+
+  if (str==0)
+    str="";
+  str = old_explode(break_string(str, 60 ), "\n");
+  if (busy) {
+    tell_room(ME, "Merlin mault: Ich bin beschaeftigt.\n");
+    return 0;
+  }
+  for (i = 0; i < sizeof(str); i++)
+  {
+    if (!str[i])
+      str[i]="";
+    tell_room(environment(),"Merlin sagt: "+str[i]+"\n");
+    tell_room(ME,"*Merlin sagt: "+str[i]+"\n");
+  }
+  return 1;
+}
+
+void show_exits()
+{
+  printf("%s",environment()->GetExits());
+}
+
+int gehen(string str)
+{
+  string verb;
+  int i;
+  mapping exits;
+  string *ex;
+
+  if (busy) {
+    write("Merlin mault: Ich bin beschaeftigt.\n");
+    return 0;
+  }
+
+  verb=query_verb();
+  str=(string)this_interactive()->_unparsed_args();
+  switch (verb)
+  {
+    case "gilde":
+      this_player()->move("/gilden/abenteurer",M_GO,"in die Gilde");
+      return 1;
+    case "raus":
+      this_player()->move(environment(),M_GO,"raus");
+      return 1;
+  }
+  if (!IS_WIZARD(this_interactive()))
+    return 0;
+  if (verb!="merlin")
+    return 0;
+  delay=1;
+  exits=(mapping)environment()->QueryProp(P_EXITS);
+  if (!str||str=="")
+  {
+    ex=m_indices(exits);
+    printf(environment()->int_short(ME,ME));
+    show_exits();
+    return 1;
+  }
+  if (old_explode(str," ")[0]=="sag")
+    return sag(implode(old_explode(str," ")[1..]," "));
+  if (str[0]==';')
+  {
+    tell_room(environment(ME),"Merlins "+str[1..]+"\n");
+    tell_room(ME,"*Merlins "+str[1..]+"\n");
+    return 1;
+  }
+  if (str[0]==':')
+  {
+    tell_room(environment(ME),"Merlin "+str[1..]+"\n");
+    tell_room(ME,"*Merlin "+str[1..]+"\n");
+    return 1;
+  }
+  if (str[0]=='*')
+  {
+    goto(str[1..]);
+    printf(environment()->int_short(ME,ME));
+    show_exits();
+    return 1;
+  }
+  if (!exits[str])
+    return 0;
+  move(exits[str],0);
+  write("Merlin sagt: Jawoll, Chef.\n");
+  printf(environment()->int_short(ME,ME));
+  show_exits();
+  return 1;
+}
+
+int goto(mixed dest)
+{
+  object ob;
+  string path;
+  mixed ret;
+
+  if (busy) {
+    write("Merlin mault: Ich bin beschaeftigt.\n");
+    return 1;
+  }
+
+  if (!dest) {
+    write("Wohin moechtest Du Merlin bringen ?\n");
+    return 1;
+  }
+  ob = find_living(dest);
+  if (ob) {
+    ob = environment(ob);
+    move(object_name(ob),0);
+    return 1;
+  }
+  path=(mixed)"secure/master"->_get_path(dest,getuid(this_player()));
+  ret=catch(load_object(path);publish);
+  if (ret && file_size(path)<0)
+  {
+    dest=match_living(dest,1);
+    if (stringp(dest))
+    {
+      ob = environment(find_living(dest));
+      move(object_name(ob),M_TPORT|M_NOCHECK);
+      return 1;
+    }
+    printf("Fehler beim Teleport nach %O: No such file.\n",path);
+    return 1;
+  }
+  if (ret)
+    printf("Fehler beim Teleport nach %O: %O\n",dest,ret);
+  ret=catch(move(path,M_TPORT|M_NOCHECK);publish);
+  if (stringp(ret))
+    ret=implode(old_explode(ret,"\n"),"");
+  if (ret)
+    printf("Fehler beim Teleport nach %O: %O\n",dest,ret);
+  return 1;
+}
+
+mixed locate_objects(string complex_desc)
+{
+  object ob;
+
+  if (complex_desc=="alles" || complex_desc=="alle")
+    return filter_objects(all_inventory(this_object()),"short");
+  if (ob = present(complex_desc,this_object()) )
+    return ({ ob });
+  return ({}) ;
+}
+
+void MBanishInsert(string name, string grund, object wer)
+{
+  if ( !name || !stringp(name) || !sizeof(name) ||
+       !grund || !stringp(grund) || !sizeof(grund) ||
+       !wer || !objectp(wer) || getuid(wer) != secure_euid() ||
+       !IS_DEPUTY(wer) )
+    return;
+
+  MBanishListe += ([name:grund;getuid(wer)]);
+  save_object(SAVEFILE);
+}
+
+mapping MBanishList()
+{
+    if ( !IS_DEPUTY(secure_euid()) )
+        return 0;
+
+    return deep_copy(MBanishListe);
+}
+
+void MBanishDelete(string name)
+{
+  if ( !name || !stringp(name) || !sizeof(name) || !ARCH_SECURITY )
+    return 0;
+
+  MBanishListe = m_copy_delete( MBanishListe, name );
+  save_object(SAVEFILE);
+}
+
+string _query_noget()
+{
+  return "Merlin mag das nicht!\n";
+}
+
