// 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(object who);
static void give_help(mixed who);
int goto(mixed dest);

nosave string *whitespaces=({",",".","?",";",":","-","!","\n","\t"});
nosave string 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 und in /d/ angekommen ist,
  // weil dann der initiale Scroll abgeklungen ist und der Spieler die
  // Willkommensmeldungen von Merlin und Spielern hoffentlich auch wahrnimmt.
  if (!environment(pl)
      || strstr(object_name(environment(pl)), "/"DOMAINDIR"/") != 0)
  {
    call_out(#'AnnounceNewPlayer,20,pl);
    return;
  }

  if (!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())||ti->QueryProp(P_LEVEL)<19||ti->QueryProp(P_GHOST))
    return;
  tell_object(ti,"Du spuerst einen sengenden Schmerz.\n");
  ti->do_damage( ti->QueryProp(P_HP) / 2 + 5);
  if(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 || !sizeof(name) || !master()->find_userinfo(name))
    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 (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(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: "+who->name(WER)+" ist in den Kreis der Magier "+
              "aufgenommen worden!\n");
    shout("Merlin ruft: "+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" ||
      !(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()),
               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(object player, string plname)
{
  string playername; 
  object faq;
  string text;

  if (!objectp(player) || !interactive(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",
    ((player->QueryProp(P_GENDER))==2?"e":""),
    ((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(object player, string plname)
{
  if (!objectp(player) || !interactive(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 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(object player, string plname)
{
  if (!objectp(player) || !interactive(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, (player->QueryProp(P_GENDER))==1?"Seher":"Seherin"),
              78, "Merlin sagt: "));

  call_out("seer_sequenz2", 4, player, plname);
}

  
static int create_seer(object player)
{
  if (!objectp(player) || !interactive(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()
{
  while (remove_call_out("wandern")>=0);
  call_out("wandern",45+random(100));
  if (busy) return;
  if (delay)
  {
    delay=0;
    return;
  }
  if (!environment())
  {
    move("/gilden/abenteurer",0);
  }
  //ueber Inv iterieren, ob da ein nicht-idelnder Spieler mit genug XP
  //rumhaengt. In diesem Raum bleiben, wenn ja.
  foreach(object ob: all_inventory(environment()))
  {
    if (interactive(ob) && query_idle(ob)<180
        && ob->QueryProp(P_XP)>999999)
      return;
  }
  // Ausgaenge durchsuchen
  mapping ex=({mapping})environment()->QueryProp(P_EXITS);
  if (!mappingp(ex))
    return;
  mapping rooms = m_allocate(sizeof(ex));
  foreach(string cmd, string|closure dest, string msg : ex)
  {
    object ob;
    // nur normale Ausgaenge benutzen
    if (!stringp(dest)
        || dest = object_name(environment()))
      continue;
    rooms += ([dest]);
  }
  if (!sizeof(rooms))
    return;

  // Und nicht zuruecklatschen, wenn moeglich.
  if (prev_room && sizeof(m_indices(rooms))>1)
    rooms-=([prev_room]);
  prev_room=object_name(environment());

  string *raeume=m_indices(rooms);
  move(raeume[sizeof(raeume)],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)
{
  if (busy) {
    write("Merlin mault: Ich bin beschaeftigt.\n");
    return 0;
  }

  str=({string})this_interactive()->_unparsed_args();
  switch (query_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 (query_verb()!="merlin")
    return 0;
  delay=1;
  mapping exits=({mapping})environment()->QueryProp(P_EXITS);
  if (!str||str=="")
  {
    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 = ({string})master()->make_path_absolute(dest);
  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";
}

