pdirt/data/
pdirt/data/HELP/
pdirt/data/HELP/0/
pdirt/data/HELP/F/
pdirt/data/HELP/G/
pdirt/data/HELP/H/
pdirt/data/HELP/J/
pdirt/data/HELP/K/
pdirt/data/HELP/O/
pdirt/data/HELP/Q/
pdirt/data/HELP/R/
pdirt/data/HELP/U/
pdirt/data/HELP/V/
pdirt/data/HELP/Y/
pdirt/data/HELP/Z/
pdirt/data/MESSAGES/
pdirt/data/POWERINFO/
pdirt/data/WIZ_ZONES/
pdirt/drv/
pdirt/drv/bin/
pdirt/drv/compiler/converter/
pdirt/drv/compiler/libs/
pdirt/drv/compiler/scripts/
pdirt/drv/include/AberChat/
pdirt/drv/include/InterMud/
pdirt/drv/include/machine/
pdirt/drv/src/InterMud/
pdirt/drv/src/Players/
pdirt/drv/utils/UAFPort/
pdirt/drv/utils/dnsresolv/
pdirt/drv/utils/gdbm/
/*****************************************************************************
 ** Administration commands. Dyrt/idirt/pdirt
 **
 ** Project: pDirt (Aber IV MUD daemon)
 ** Module     : admin.c
 ** Author     : Various.
 ** Date       : unknown
 ** Description: Some functions used to administrate the mud. Some functions
 **              that were in here in the original Dyrt code have been moved 
 **              to ther files, and some have been placed in here by Marty.
 ** Additions:
 ** [Marty/15 Juli]
 **      Recoded the wizfrob/awizfrob/dgodfrob/godfrob a little.
 ** [Marty/11 Nov]
 **      Added warn, also added new ban/unban.
 *****************************************************************************/
#define ADMIN_C

#include "verbs.h"
#include "kernel.h"
#include "config.h"
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#ifdef RS6000
#include <strings.h>
#endif
#include "admin.h"
#include "pflags.h"
#include "sflags.h"
#include "sendsys.h"
#include "lflags.h"
#include "mobile.h"
#include "bprintf.h"
#include "uaf.h"
#include "mud.h"
#include "fight.h"
#include "rooms.h"
#include "wizlist.h"
#include "calendar.h"
#include "log.h"
#include "main.h"
#include "parse.h"
#include "flags.h"
#include "utils.h"
#include "wizlist.h"
#include "flags.h"
#include "quests.h"
#include "tables.h"
#include "special.h"

A_COMMAND(startbecom)
{  bprintf("I'm sorry, but the become function has been disabled.\n");
   return;

}


/*****************************************************************************
 ** Online player/host banning system.
 ** Usage: fban [<player name>/host/lock/report] <hostname>
 ** Examples:
 **      fban Foo: ban player Foo from mud.
 **      fban host foo.bar.soap: will ban host foo.bar.soap
 **      fban lock foo.bar.soap: will lock the host foo.bar.soap for new users.
 **      fban report <message>: Log <message> stating why you banned a host etc., 
 ** Note: To be able to use this command you must have the PFL_BANHOST
 **       or PFL_BANPLR.
 ******************************************************************************/
A_COMMAND(bancom)
{   int ret;

   /* Check for command execute rights 
    */
   if (!ptstflg(mynum,PFL_BANPLR) && !ptstflg(mynum,PFL_BANHOST))
   {  erreval();
      return;
   }

   if (brkword() == -1)
   {   bprintf("Ban What/Who?\n");
       return;
   }
   
   if (EQ(wordbuf,"lock"))       /* Locking a host */
   {  if (!ptstflg(mynum,PFL_BANHOST))
      {  bprintf("You are not allowed to ban/lock hosts.\n");
         return;
      }

      getreinput(wordbuf);	/* Get Hostname */

      if (strlen(wordbuf) < 3)
      {  bprintf("I doubt that is a valid hostname.\n");
         return;
      }

      ret = add_host(LOCKED_HOSTS,wordbuf);

      if (ret == HOST_NOTADDED)
      {  bprintf("Host was already in file.\n");
         return;
      }
      else if (ret == HOST_FERROR)
      {  bprintf("Error opening file.\n");
         return;
      }
#ifdef LOG_BAN
      mudlog("BAN: Lock %s by %s",wordbuf,pname(mynum));
#endif
      bprintf("Okay, %s is in the locked host file.\n",wordbuf);
   } 
   else if (EQ(wordbuf,"host"))       /* Banning of host */
   {  if (!ptstflg(mynum,PFL_BANHOST))
      {  bprintf("You are not allowed to ban hosts.\n");
         return;
      }
      getreinput(wordbuf);

      if (strlen(wordbuf) < 3)
      {  bprintf("I doubt that is a valid hostname.\n");
         return;
      }
      ret = add_host(BAN_HOSTS,wordbuf);
#ifdef LOG_BAN
      mudlog("BAN: Host %s by %s",wordbuf,pname(mynum));
#endif
      bprintf("Okay, %s is in the banned host file.\n",wordbuf);
   } 
   else if (EQ(wordbuf,"report"))
   {  getreinput(wordbuf);
      if (strlen(wordbuf) < 5)
      {  bprintf("Please say something a bit more useful.\n");
         return;
      }
#ifdef LOG_BAN
      mudlog("BAN: report (%s) %s",pname(mynum),wordbuf);
#endif
      bprintf("Your report has been noted.\n");
   } 
   else                        /* Banning of char */
   {   if (!ptstflg(mynum,PFL_BANPLR))
       {  bprintf("You are not allowed to ban players.\n");
          return;
       }
       ret = add_host(BAN_CHARS,wordbuf);
#ifdef LOG_BAN
       mudlog("BAN: Player %s by %s",wordbuf,pname(mynum));
#endif
       bprintf("Okay, the name %s is now banned.\n",wordbuf);
   }
}

A_COMMAND(unbancom)
{  int ret = HOST_FERROR;
  
   if (!ptstflg(mynum,PFL_BANHOST) && !ptstflg(mynum,PFL_BANPLR))
   {   erreval();
       return;
   }
   
   if (brkword() == -1)
   {  bprintf("Usage: Unban <host/lock/user> name\n");
      return;
   }
   if (strncasecmp(wordbuf,"host",strlen(wordbuf)) == 0)
   {   if (!ptstflg(mynum,PFL_BANHOST))
       {  bprintf("You are not allowed to do that.\n");
          return;
       }
       ret = remove_host(BAN_HOSTS,getreinput(globalbuf));
   }
   else if (strncasecmp(wordbuf,"lock",strlen(wordbuf)) == 0)
   {   if (!ptstflg(mynum,PFL_BANHOST))
       {  bprintf("You do not have the rights to do that.\n");
          return;
       }
       ret = remove_host(LOCKED_HOSTS,getreinput(globalbuf));
   }
   else if (strncasecmp(wordbuf,"user",strlen(wordbuf)) == 0)
   {  if (!ptstflg(mynum,PFL_BANPLR))
      {  bprintf("You can't do that yet.\n");
         return;
      }
      ret = remove_host(BAN_CHARS,getreinput(globalbuf));
   }
   else
   {  bprintf("Usage: Unban <host/lock/user> name\n");
      return;
   }
   
   if (ret == HOST_NOTFOUND)
   {   bprintf("No Match found for %s.\n",globalbuf);
       return;
   }
   else if (ret == HOST_FERROR)
   {  bprintf("Error opening files.\n");
   }
   else 
   {  bprintf("Okay %s %s has been removed.\n", wordbuf,globalbuf);
#ifdef LOG_BAN
      mudlog("BAN: %s %s unbanned by %s",wordbuf,globalbuf,pname(mynum));
#endif
   }
}

/***************************************************************************
 ** BugCom: Post a bug report in the syslog 
 ** Available: Everybody 
 **************************************************************************/
A_COMMAND(bugcom)
{ char b[80];
  int  l = ploc(mynum);
  
  getreinput (globalbuf);
  /* Jail code */
  if (ltstflg(ploc(mynum),LFL_JAIL) && (plev(mynum) < LVL_ARCHWIZARD))
  {  bprintf("Obviously, YOU'RE the bug, or you wouldn't be in here.\n");
     return;
  }

  if (EMPTY (globalbuf))
  {  bprintf ("What do you want to bug me about?\n");
  }
  else
  {   buglog ("&+wBUG BY &+w%s &+w[&+w%s&+w]&*: %s", pname (mynum), xshowname(b,l),globalbuf);
      bprintf ("Your input has been noted.\n");
  }
}

A_COMMAND(suggestcom)
{   getreinput(globalbuf);

    if (ltstflg(ploc(mynum),LFL_JAIL) && (plev(mynum) < LVL_ARCHWIZARD))
    {  bprintf("I have a suggestion for you, next time: &+wbehave&*!\n");
       return;
    }
   
    if (EMPTY(globalbuf))
    {   bprintf("What suggestion do you have?\n");
    }
    else
    {   suggestlog("&+wSUGGESTION&+w by %s: %s",pname(mynum),globalbuf);
        bprintf("Thanks, we will taken in consideration.\n");
    } 
}
/*****************************************************************************
 ** TypoCom: Post a typo in the syslog
 ** Available: All
 ****************************************************************************/
A_COMMAND(typocom)
{
  int l = ploc (mynum);
  char y[80];
  
  getreinput (globalbuf);
  /* jail code */
  if (ltstflg(ploc(mynum),LFL_JAIL) && (plev(mynum) < LVL_ARCHWIZARD) )
  {  bprintf("You don't like the accomodations? We keep our jails spotless!\n");
     return;
  }
  if (EMPTY (globalbuf))
        bprintf ("What typo do you wish to inform me of?\n");
  else
  {   buglog ("&+wTYPO BY &+w%s &+win %s &+w[&+w%s&+w]: %s", pname (mynum),
              xshowname (y, l), sdesc (l), globalbuf);
      bprintf ("Your input has been noted.\n");
  }
}

/*****************************************************************************
 ** General purpose log command. To explain actions, add comments etc.
 ** Access: WIZ+
 *****************************************************************************/
A_COMMAND(logcom)
{ 
       getreinput(globalbuf);
        if (EMPTY(globalbuf))
        {   bprintf("&+wUsage: &+wlog <message>&*\n");
        }
        else
        {  mudlog("LOG (%s): %s",pname(mynum),globalbuf);
           send_msg(DEST_ALL,MODE_QUIET|MODE_BRACKET,LVL_ARCHWIZARD,LVL_MAX,mynum,NOBODY,
                   "&+wLOG &+w(%s)&+w: %s",pname(mynum),globalbuf);
           bprintf("Message has been logged.\n");
        }
    
}

/****************************************************************************
 ** Disconnect a player which seems to be stuck (or who is misbehaving ;))
 ****************************************************************************/
A_COMMAND(disconnectcom)
{ int x = 0;
  
  if (!ptstflg (mynum, PFL_DISCONNECT))
  {  erreval();
     return;
  }
  if (EMPTY (item1))
  {  bprintf ("Disconnect who?\n");
     return;
  }
  if ((x = pl1) == -1)
  {  bprintf ("No such player or mobile on the game.\n");
     return;
  }
  if (x >= max_players)
  {  bprintf("You cannot disconnect a mobile.\n");
     return;
  }
  if (wlevel (plev (mynum)) < wlevel (plev (x)))
  { bprintf ("You can't disconnect %s.\n", pname (x));
  }
  else  
  {  p_crapup (x,"\tSocket error:  Connection Reset by Foreign Host.",
	      CRAP_SAVE | CRAP_RETURN);
  }
  return;
}

/****************************************************************************
 ** This command makes a god of every one who uses it, if his/her name is 
 ** also in the prived file.
 ****************************************************************************/
A_COMMAND(unveilstart)
{  unveilcom(NULL);
}

void unveilcom (char *unv_pass)
{ int lev;
  
  if (cur_player->aliased || cur_player->polymorphed != -1)
  {  bprintf("Not while aliased.\n");
     return;
  }
  if (!cur_player->isawiz)
  {  erreval();
     return;
  }
  if (unv_pass == NULL)   /* Ask player for the magic word */
  {   cur_player->work = LVL_GOD;
      bprintf("Welcome to the gates of the gods. Please unveil your right to be a God\n"
              "by entering the right password.\n");
      if (brkword() == -1)
      {  cur_player->work = LVL_GOD;
      }
      else
      {  cur_player->work = atoi(wordbuf);
         if (cur_player->work < LVL_GOD)
             cur_player->work = LVL_GOD;
      }
      strcpy(cur_player->cprompt,cur_player->prompt);
      strcpy(cur_player->prompt, "Magic Word: ");
      bprintf("\n\377\373\001\001Magic Word: ");
      cur_player->no_echo = True;
      push_input_handler(unveilcom);
  }
  else
  {   bprintf("\377\374\001\001");
      cur_player->no_echo = False;
      pop_input_handler();
      if (!EQ(unv_pass, UNVEILPASSWD))
      {  bprintf("\nWhat? Get away you puny mortal!\a\n");
	 mudlog("UNVEIL: bad unveil attempt by %s", pname(mynum));
      }
      else
      {  lev = cur_player->work;
         if (lev >= LVL_MAX)
         {  mudlog("UNVEIL: bad unveil %s to %d", pname(mynum), plev(mynum));
	    bprintf("The maximum level is %d.\n", LVL_MAX - 1);
	 }
	 else
	 {  setplev(mynum, lev);
	    update_wizlist(pname(mynum), wlevel(lev));
	    mudlog("UNVEIL: %s to %d", pname(mynum), plev(mynum));
	    bprintf("\nYes Sir!\n");
	 }
      }
      strcpy(cur_player->prompt,cur_player->cprompt);
      get_command(NULL);
  }
}

/**************************************************************************
 ** Declare WAR on the world (allow fights)
 **************************************************************************/
A_COMMAND(warcom)
{
  the_world->w_peace = 0;
  broad ("&+wThe air of peace and friendship lifts.&*\n");
  send_msg (DEST_ALL, MODE_QUIET | MODE_BRACKET, LVL_APPREN, LVL_MAX, mynum,
	    NOBODY, "&+wWar declared&+w by %s", pname (mynum));
#ifdef LOG_WAR
  mudlog ("WAR by %s", pname (mynum));
#endif
}

/****************************************************************************
 ** Declare PEACE on the world (stop fights)
 ****************************************************************************/
A_COMMAND(peacecom)
{ int m;

  the_world->w_peace = 1;
  for (m = 0; m < max_players; m++)
  {  setpfighting (m, -1);
  }
  send_msg (DEST_ALL, MODE_QUIET | MODE_BRACKET, LVL_APPREN, LVL_MAX, mynum,
	    NOBODY, "&+wPeace declared &+wby %s", pname (mynum));
  broad ("&+wPeace and tranquility descend upon the world.&*\n");
#ifdef LOG_WAR
  mudlog ("PEACE by %s", pname (mynum));
#endif
}

A_COMMAND(wizlock)
{  extern char *WizLevels[];
   extern char *MLevels[];
   extern char *FLevels[];
   char levelbuf[80];
   char line[100];
   int len, new_lev=0, x;
   int param= -1;

   static int wlev_2_nlev[] =
   {	0,		LVL_APPRENTICE,		LVL_EMERITUS,		
	LVL_WIZARD,	LVL_SENIOR,		LVL_COUNSEL,
	LVL_ARCHWIZARD,	LVL_HIGHARCH,		LVL_ADVISOR,
	LVL_DEMI,	LVL_HIGHDEMI,		LVL_GOD,
	LVL_MASTER
   };

   param = brkword();
   if (plev(mynum) < LVL_APPREN || !ptstflg(mynum,PFL_LOCK) || param == -1)
   {   bprintf("The world is currently %slocked.\n",
                lev2s(levelbuf,the_world->w_lock,False));
   }
   else 
   {   len = strlen(wordbuf);

       if (strncasecmp(wordbuf,"off",len) == 0 || strncasecmp(wordbuf,"unlock",len) == 0)
          new_lev = 0;
       else if ((x = tlookup(wordbuf,WizLevels)) > 0)
          new_lev = wlev_2_nlev[x];
       else if ((x = tlookup(wordbuf,MLevels)) > 0)
          new_lev = x;
       else if ((x = tlookup(wordbuf,FLevels)) > 0)
          new_lev = x;
       else if (isdigit(*wordbuf))
          new_lev = atoi(wordbuf);
       else
          new_lev = the_world->w_lock;

       if (new_lev > plev(mynum))
       {   bprintf("You can't %slock the game.\n",lev2s(levelbuf,new_lev,False));
       }
       else
       {   sprintf(line,"&+w[&+wThe World is now &+w%s&+wlocked&+w]&#&#&*\n",
                   new_lev == 0 ? "Un" : lev2s(levelbuf,new_lev,False));
           the_world->w_lock = new_lev;
           broad(line);
       }
   }
}

A_COMMAND(zapcom)
{ int vic, x;
  
  if (!ptstflg (mynum, PFL_ZAP))
  {  bprintf ("The spell fails.\n");
     return;
  }
  /* Jail code */
  if (ltstflg(ploc(mynum),LFL_JAIL) && (plev(mynum) < LVL_DEMI) )
  {   bprintf("If you're not careful, YOU can be the one being zapped!\n");
      return;
  }
  if (brkword () == -1)
  {  bprintf ("Zap who?\n");
     return;
  }
  if ((vic = pl1) == -1)
  {  bprintf ("There is no one on with that name.\n");
     return;
  }

  if (vic == mynum)
  {  bprintf("Please be so kind to use the delete function at the login menu.\n");
     return;
  }

  /* Message to everyone in the same room */
  send_msg (ploc (vic), 0, pvis (vic), LVL_MAX, vic, NOBODY,
            "\001A\033[1m\003\001c&+wA massive lightning "
            "bolt strikes \003\001D%s\003\001c!\n\003\001A\033[0m\003&*",
            pname (vic));
  
  if (!do_okay (mynum, vic, PFL_NOZAP))
  {  sendf (vic, "&+w%s casts a lightning bolt at you!&*\n",
            see_player (vic, mynum) ? pname (mynum) : "Someone");
      
  }                           /* end ZAP not successful */
  else
  {  sendf (vic, "\001A\033[1m\003&+wA massive lightning bolt arcs down out of "
             "the sky to strike you between&*\n&+wthe eyes!&*\001A\033[0m\003\n"
             "&+wYou have been utterly destroyed by %s.&*\n",
             see_player (vic, mynum) ? pname (mynum) : "Someone");
      if (vic < max_players)
      {
          if (plev (vic) >= LVL_APPREN)
              update_wizlist (pname (vic), LEV_MORTAL);
          	  
          deluaf (pname (vic));
	  
          send_msg (ploc (vic), 0, pvis (vic), LVL_MAX, vic, NOBODY,
                    "\001s%s\003%s has just died.\n\003",
                    pname (vic), pname (vic));
	  
          x = real_mynum;
          p_crapup (vic,"\t\t&+wBye Bye.... Slain by a Thunderbolt&*", CRAP_RETURN);
	  
      }                       /* end if PC was zapped */
      else wound_player (mynum, vic, pstr (vic) + 1, VERB_ZAP);

#ifdef LOG_ZAP
          mudlog ("ZAP: %s &+wZAPped&+w %s", pname (mynum), pname (vic));
#endif

      /* Send info-msg. to wizards */
      send_msg (DEST_ALL, MODE_BRACKET, Max(pvis(mynum),LVL_APPREN), LVL_MAX, vic, NOBODY,
                "\001p%s\003 has just been &+wzapped&+w by \001p%s\003",
                pname (vic), pname (mynum));
      /* end if NPC was zapped */
  }                           /* end ZAP successful */
  broad ("\001dYou hear an ominous clap of thunder in the distance.\n\002");
}                               /* end ZAPcom */

/*****************************************************************************
 ** Delete a entry in the users file.
 ** Note: the player's setin/out messages remain in setins file.
 *****************************************************************************/
A_COMMAND(deletecom)
{ if (!ptstflg(mynum, PFL_DELETE))
  {  erreval();
     return;
  }
  if (brkword() == -1 || strlen(wordbuf) > PNAME_LEN)
  {  bprintf("Delete who?\n");
     return;
  }

  mudlog("UAF: %s deleted %s", pname(mynum), wordbuf);
  deluaf(wordbuf);
  update_wizlist(wordbuf, LEV_MORTAL);
  bprintf("Deleted %s.\n", wordbuf);
}


/* Soc stuff, by cornwall */
A_COMMAND(socinfo)
{ int i;
  int usercount = 0;

  if (!ptstflg(mynum, PFL_SOCKET))
  {  erreval ();
     return;
  }

  bprintf ("&+wSocket(?) Status      Name        Host&*\n"
           "&+w%s&*\n", DASHLINE);
  for (i = 0; i < max_players; i++)
  {  if ((pvis (i) > plev (mynum) && i != mynum) ||
#ifdef TCP_ANNOUNCE
        !players[i].inp_handler ||
        (plev(mynum) < LVL_ARCHWIZARD && !players[i].iamon) ||
#else
        !players[i].iamon ||
#endif
       strncasecmp(pname(i), item1, strlen(item1))
        )
      continue;

      bprintf ("&+w[&+w     %d&+w ] ",i);

      if (!players[i].iamon) 
      { if (players[i].linkdead)
          bprintf ("[&+w No Link &+w]");
        else if (!EMPTY(pname(i)))
          bprintf ("[&+w  *tcp*&+w  ]");
        else
          bprintf ("[&+w  Setup&+w  ]");
      } 
      else 
      {
        bprintf("[&+wConnected&+w]");
      }

      bprintf ("&+w %-*s", PNAME_LEN, EMPTY(pname(i)) ? "Undecided" : pname(i));
      bprintf ("&+w%s&*\n", players[i].realhostname);

      usercount++;
  }
  bprintf ("&+w%s\n&+wA total of &+w%d&+w visible connection(s).&+w\n",DASHLINE, (long)usercount);
}

A_COMMAND(killsocket)
{
  int s;

  if (EMPTY(txt1)) 
  {   bprintf("No input given.\n");
      return;
  }

  if (!ptstflg(mynum, PFL_SOCKET))
  {  erreval ();
     return;
  }

  s = atoi(txt1);

  if ((s > 31) || (s<0)) 
  { bprintf("Invalid input. Please specify socket number.\n");
    return;
  }

  bprintf("&+wSocket chosen: &+w%d&+w. Trying to clean up socket...\n"
          "&+wSocket killed for &+w%s&+w.&*\n",s,EMPTY(pname(s)) ?
          "John Doe" : pname(s));

  mudlog("SOCKET: Socket %d killed for %s by %s.",s,EMPTY(pname(s)) ?
         "John Doe" : pname(s),pname(mynum));

  send_msg (DEST_ALL, MODE_BRACKET|MODE_QUIET, Max(pvis(mynum),LVL_APPRENTICE), LVL_MAX, NOBODY, NOBODY,
                    "%s killed socket %d, player %s",
                    pname (mynum), s, EMPTY(pname(s)) ? "John Doe" : pname(s));

  p_crapup (s,"\tConnection killed by foreign host [bad connect].", CRAP_RETURN);
}

A_COMMAND(jailcom)
{  PERSONA d;
   char buff[80];

   if (plev(mynum) < LVL_ARCHWIZARD)
   {   bprintf("Pardon?\n");
       return;
   }
   if ((pl1 > max_players) || (pl1 < 0 || EMPTY(item1)))
   {   bprintf("Jail who?\n");
       return;
   }
   if (getuaf(strcpy (buff, item1), &d))
   {   if (d.p_level >= LVL_ARCHWIZARD)
       {   bprintf("I don't think that would be effective.\n");
           return;
       }
       if (findroomnum(d.p_home) != jail_loc)
       {   strcpy(d.p_home,showname(jail_loc));
           bprintf("You have jailed %s.\n", d.p_name);
           if (pl1 > -1)
              setphome (pl1,jail_loc);
       } else
       {  if (plev(mynum) < LVL_DEMI)
          {  bprintf("They are already jailed and you cannot let them out.\n");
             return;
          }
          bprintf("You have released %s from jail.\n",d.p_name);
          strcpy(d.p_home,"");
          if (pl1 > -1)
             setphome(pl1,0);
       }
       putuaf(&d);
   } else
   {  bprintf("No such player %s.\n", buff);
      return;
   }
   if (pl1 != -1)
   {  if (phome(pl1) == jail_loc)
      {   sendf(pl1,"You have been jailed!\n");
          mudlog ("JAIL: %s has been jailed by %s.",pname(pl1), pname(mynum) );
          send_msg (DEST_ALL, MODE_BRACKET | MODE_QUIET, LVL_ARCHWIZARD, LVL_MAX,
                    mynum, NOBODY, "%s has been jailed by %s", buff ,
                    pname(mynum) );
          setploc(pl1 ,jail_loc);
      } 
      else
      {   sendf(pl1,"You have been set free. Let this be a lesson to you!\n");
          mudlog("JAIL: %s has freed %s",pname(mynum), buff);
          send_msg(DEST_ALL,MODE_BRACKET|MODE_QUIET, LVL_ARCHWIZARD, LVL_MAX,
                   mynum, NOBODY, "%s has been freed by %s", buff,
                   pname(mynum) );
          setploc  (pl1, get_rand_start());
      }
   }
}

A_COMMAND(noruncom)
{   int loc=0;

    if (!ptstflg(mynum,PFL_RESET))
    {  erreval();
       return;
    }
    if (the_world->w_start_loc == 0)
    {   if (brkword() == -1)
        {   loc = get_rand_start();
        }
        else
        {   loc = find_loc_by_name(wordbuf);
            if (loc == 0)
              loc = get_rand_start();
        }
        bprintf("Running not allowed anymore.\n"
                "Players will enter in %s [%s]\n",sdesc(loc),showname(loc));
        send_msg(DEST_ALL,MODE_QUIET|MODE_BRACKET,LVL_APPREN,LVL_MAX,mynum,NOBODY,
                 "NoRun Mode activated. Setting start to %s",
                 showname(loc));
        the_world->w_start_loc = loc;
        return;
    }
    else
    {  bprintf("Running is now allowed again.\n");
       send_msg(DEST_ALL,MODE_QUIET|MODE_BRACKET,LVL_APPREN,LVL_MAX,mynum,NOBODY,
                "NoRun Mode de-activated",
                showname(loc));
       the_world->w_start_loc = 0;
    }
}

/*****************************************************************************
 ** FROB promotion commands
 *****************************************************************************/
 
PRIVATE void froblog (char *n, int lev, int sco, int str)
{  mudlog ("FROB: %s by %s: Lev = %d, Sco = %d, Str = %d",
	  n, pname (mynum), lev, sco, str);
}

PUBLIC A_COMMAND(frobstart)
{  frobcom(NULL);
}

PUBLIC void frobcom (char *line)
{ PERSONA   p;
  struct _f *f;

  int x;
  
  
  if (line == NULL)
  {				/* First (initial) time */
      if (!ptstflg(mynum, PFL_FROB))
      {
	  erreval ();
	  return;
      }
      if (brkword () == -1 ||
	  ((x = fpbn (wordbuf)) == -1 && 
	  !ptstflg (mynum, PFL_UAF))
	 )
      {
	  bprintf ("Frob who?\n");
	  return;
      }
      if (x == -1)
      {
	  if (!getuaf (wordbuf, &p))
          {
	      bprintf ("No such persona in system.\n");
	      return;
          }
	  if (cant_frob (p.p_level))
          {
	      bprintf ("You can't frob %s!\n", wordbuf);
	      return;
          }
      }

      else if (x >= max_players)
      {
	  bprintf ("You can't frob mobiles!\n");
	  return;
      }
      else if (cant_frob (plev (x)))
      {
	  bprintf ("You can't frob %s!\n", wordbuf);
	  return;
      }
      else
      {
	  p.p_level = plev (x);
	  p.p_strength = pstr (x);
	  p.p_score = pscore (x);
	  strcpy (p.p_name, pname (x));
      }
      
      f = NEW (struct _f, 1);
      
      strcpy (f->name, p.p_name);
      f->ingame = fpbn(f->name);
      f->state = 0;
      f->level = p.p_level;
      f->oldlev = p.p_level;
      f->strength = p.p_strength;
      f->score = p.p_score;
      f->oldprompt = COPY (cur_player->prompt);
      
      bprintf("\001f"FROBINFO"\003");
      strcpy (cur_player->prompt, "New Level: ");
      f->oldwork = cur_player->work;
      cur_player->work = (int) f;
      bprintf ("&+wLevel is:&+w %d\n", f->level);
      push_input_handler (frobcom);
  }
  else
  {
      while (*line == ' ' || *line == '\t')
	++line;
      f = (struct _f *) cur_player->work;
      switch (f->state) {
      case 0:
	  if (*line == '\0')
	      x = f->level;
          else
	      x = atoi (line);
	      
	  if (x < LVL_ONE || x > LVL_MAX-1)
	  {
	      bprintf ("Level must be between %d and %d\n", LVL_ONE, LVL_MAX-1);
	      f->state = 20;
	  }
	  else if (cant_fro (x))
	  {
	      bprintf ("You can't do that.\n");
	      f->state = 20;
	  }
	  else
	  {
	      f->level = x;
	      f->state = 1;
	      bprintf ("Score is: %d\n", f->score);
	      strcpy (cur_player->prompt, "New Score: ");
	  }
	  break;
      case 1:
	  if (*line == '\0')
	      x = f->score;
	  else
	      x = atoi (line);

	  f->score = x;
	  f->state = 2;
	  bprintf ("Strength is: %d\n", f->strength);
	  strcpy (cur_player->prompt, "New Strength: ");
	  break;
      case 2:
	  if (*line == '\0')
	      x = f->strength;
	  else
	      x = atoi (line);
	  if (x <= 0)
          {
	      bprintf ("Strength must be positive.\n");
	      f->state = 20;
          }
	  else
          {
	      f->strength = x;
	      
	      if ((x = fpbn (f->name)) == -1)
	      {
		  if (!ptstflg (mynum, PFL_UAF))
		  {
		      bprintf ("%s isn't here.\n", f->name);
		      f->state = 20;
		  }
		  else if (!getuaf (f->name, &p))
		  {
		      bprintf ("No player named %s.\n", f->name);
		      f->state = 20;
		  }
	      }
	      else
	      {
		  p.p_level = plev (x);
		  p.p_strength = pstr (x);
		  p.p_score = pscore (x);
	      }
	      
	      if (f->state == 2)
	      {
		  froblog (f->name, f->level, f->score, f->strength);
		  if (x >= 0)
		  {
		      setpstr (x, f->strength);
		      pscore (x)= f->score;
		      plev (x) =  f->level;
		      
		      if (players[x].defrob != NULL)
		      {  players[x].defrob->real_level = f->level;
		      }
		      
		      if (f->level >= 4)    /* Fix pflags */
		      {  set_doublebit (&pflags (x), PFL_TITLES);
		         set_doublebit (&pflags (x), PFL_EMOTE);
		      }
                      if (f->level >= LVL_TWELVE)
                      {   set_doublebit(&pflags(x), PFL_CANTRANCE);
                          set_doublebit(&pflags(x), PFL_CANTRANCE);
                      }
		      if (wlevel (f->level) != wlevel (f->oldlev))
			  set_xpflags (f->level, &pflags (x), &pmask (x));
			      
		      if (f->level <= LVL_APPREN || f->oldlev <= LVL_APPREN)
			  setptitle (x, std_title (f->level, psex (x)));
		      
		  }
		  else
		  {
		      p.p_level = f->level;
		      p.p_strength = f->strength;
		      p.p_score = f->score;
		      if (wlevel (f->level) != wlevel (f->oldlev))
			  set_xpflags (f->level, &p.p_pflags, &p.p_mask);
				      
		      if (f->level <= LVL_APPREN || f->oldlev <= LVL_APPREN)
	              {
			  strcpy (p.p_title,
                                  std_title (f->level, tst_doublebit(&p.p_sflags, SFL_FEMALE)));
		      }
		      
		      putuaf (&p);
		  }
		  update_wizlist (f->name, wlevel (f->level));
		  bprintf ("Ok.\n");
		  f->state = 20;
	      }
	  }
	  break;
      } /* End switch */
      
      if (f->state == 20)
      {
	  strcpy (cur_player->prompt, f->oldprompt);
	  free (f->oldprompt);
	  cur_player->work = f->oldwork;
          if(f->ingame >=0 && is_in_game(f->ingame)) 
          {
              save_player(f->ingame,True);
              sendf(f->ingame,"%s", players[f->ingame].prompt);
              if (pvis(f->ingame) > f->level)
                pvis(f->ingame) = f->level;
          }
	  free (f);
	  pop_input_handler ();
      }
  }
  bprintf ("%s", cur_player->prompt);
}

/*****************************************************************************
 ** Standard function used by wizfrob, awizfrob, dgodfrob, godfrob and 
 ** emerifrob, for setting the levels and checking flags.
 *****************************************************************************/
PRIVATE int givefrob(int lvl, long score)
{  int x = -1;
   PERSONA p;
   Boolean ison;

   if (!ptstflg(mynum, PFL_FROB))
   {
       erreval();
       return -1;
   }
   if (brkword() == -1 || ((x = fpbn(wordbuf)) == -1 ))
   {  if (!ptstflg(mynum,PFL_UAF))
      {  bprintf("You can only frob online players.\n");
         return -1;
      }
      
      if (!getuaf(wordbuf,&p))
      { bprintf("Frob who?\n");
        return -1;
      }
      ison = False;
   }
   else
   {
      if (x >= max_players)
      {
           bprintf ("You can't frob mobiles!\n");
           return -1;
      }
      player2pers(&p,NULL,x);
      ison = True;
   }

   if (cant_frob (p.p_level))
   {
        bprintf ("You can't frob %s!\n", wordbuf);
        return -1;
   }
   else
   {
        p.p_level = lvl;
        p.p_strength = pmaxstrength(lvl);
        p.p_score = score;
        p.p_vlevel = lvl;

	if (lvl > 4)
	{  set_doublebit(&p.p_pflags, PFL_EMOTE);
	   set_doublebit(&p.p_pflags, PFL_TITLES); 
	} 
        if (lvl > 12)
        {  set_doublebit(&p.p_pflags, PFL_CANTRANCE);
        }
        strcpy(p.p_title, std_title (lvl, tst_doublebit(&p.p_sflags,SFL_FEMALE)));
        bprintf("Ok\n");

        putuaf(&p);
        if (ison)
        {   pers2player(&p,x);
            calib_player(x);
            if (players[x].defrob != NULL)
            {  players[x].defrob->real_level = p.p_level;
            }
            sendf(x,"You have been frobbed by %s to level %d.\n",pname(mynum),lvl);
        }
   }
   return x;
}

PUBLIC A_COMMAND(emerifrobcom)
{  int plx;

   if ((plx = givefrob(18,levels[LVL_APPRENTICE])) != -1)
   {   set_xpflags(LVL_APPREN, &pflags(plx), &pmask(plx));
       update_wizlist(pname(plx),LEV_EMERITUS);
       mudlog("FROB: emeri status for %s by %s.",pname(plx),pname(mynum));
   }
}

PUBLIC A_COMMAND(wizfrobcom)
{  int plx;
 
   if ((plx = givefrob(10,40000)) != -1)
	mudlog("FROB: %s has given %s a wizfrob.",pname(mynum), pname(plx));
}

PUBLIC A_COMMAND(awizfrobcom)
{  int plx;
   if ((plx = givefrob(11,60000)) != -1)
        mudlog("FROB: %s has given %s an awizfrob.",pname(mynum), pname(plx));
}

PUBLIC A_COMMAND(dgodfrobcom)
{ int plx;
  if ((plx = givefrob(12,80000)) != -1)
        mudlog("FROB: %s has given %s a dgodfrob.",pname(mynum), pname(plx));
}

PUBLIC A_COMMAND(godfrobcom)
{ int plx;
  if ((plx = givefrob(13,100000)) != -1)
     mudlog("FROB: %s has given %s a godfrob.",pname(mynum), pname(plx));
}


/* Testrunners */ 
A_COMMAND(testruncom)
{   int loc = 0;

    if (cur_player->defrob != NULL)
    {   if (!tst_doublebit(&cur_player->defrob->real_pflags,PFL_TESTRUNNER) &&
            xplev(mynum) < LVL_ARCHWIZARD)
        {  erreval();
           return;
        }
    }
    else if (!ptstflg(mynum,PFL_TESTRUNNER) && xplev(mynum) < LVL_ARCHWIZARD)
    {   erreval();
        return;
    }

    if (brkword() == -1)
    {    FILE *fp;
         char line[80];
         int  i=0;

         if ((fp = fopen(TESTRUN_FILE,"r")) == NULL)
         {   bprintf("There are no testrun zones available.\n");
             return;
         }
         bprintf("You can testrun the following zones:\n"); 

         fgets(line,80,fp);
         while (!feof(fp))
         {   line[strlen(line) -1] = '\0';
             bprintf("   %-12.12s",line);
             i++;
             if (i >= 5)
             {  bprintf("\n");
                i = 0;
             }
             fgets(line,80,fp);
         }
         fclose(fp);

         if (i > 0)
            bprintf("\n");
         return;
    }     

    if (EQ(wordbuf,"abort"))
    {  mudlog("TESTRUN: %s has Aborted the testrunning",pname(mynum));
       send_msg(DEST_ALL,MODE_BRACKET|MODE_QUIET|MODE_PFLAG|MP(PFL_TESTRUNNER),pvis(mynum),
                LVL_MAX,mynum,NOBODY,"%s has &+wAborted &+wthe &+wtestrun",
                pname(mynum));
       bprintf("&+w>> You abort the testrunning.\n");
       trapch(get_rand_start());
       return;
    }             
    else if (EQ(wordbuf,"insert") && xplev(mynum) >= LVL_ARCHWIZARD)
    {   /* Using host adding here to add stuff */
        if (brkword() == -1)
        {   bprintf("Add which zone?\n");
            return;
        }
        if ((loc = findroomnum(wordbuf)) >= 0)
        {   bprintf("No such zone %s\n",wordbuf);
            return;
        }
        add_host(TESTRUN_FILE,wordbuf);
        bprintf("Ok.\n");
    }
    else if (EQ(wordbuf,"remove") && xplev(mynum) >= LVL_ARCHWIZARD)
    {   /* Same here */
        if (brkword() == -1)
        {  bprintf("Remove which host?\n");
           return;
        }
        loc = remove_host(TESTRUN_FILE,wordbuf);
        switch (loc) {
        case HOST_FERROR:
		bprintf("A file error occured while removing the zone.\n"
                        "Removal not completed, try doing it manually\n");
		break;
	case HOST_DELETED:
		bprintf("Zone %s has succesfully been removed.\n",wordbuf);
		break;
	case HOST_NOTFOUND:
		bprintf("That zone isn't in the testzone file\n");
		break;
	default:
		bprintf("Unknown response from system.\n");
		break;
	}
	return;
    } 
    else if (infile(TESTRUN_FILE,wordbuf))
    {   char locname[80];

        strcpy(locname,wordbuf);
        strcat(locname,"1");
        loc = findroomnum(locname);

        if (loc >= 0)
        {   bprintf("Sorry that zone is currently not available for testrunning.\n");
            return;
        }
        bprintf("&+w>> Entering testrun zone &+w%s.\n",lowner(loc));
        trapch(loc);
        send_msg(DEST_ALL,MODE_BRACKET|MODE_QUIET|MODE_PFLAG|MP(PFL_TESTRUNNER),pvis(mynum),LVL_MAX,
                 mynum,NOBODY,"%s is &+wtestrunning&* &+w%s",pname(mynum),lowner(loc));
        mudlog("TESTRUN: %s has entered %s for testrunning",pname(mynum),lowner(loc));
    }
    else
       bprintf("No such testrun zone.\n");
}