EotS/
EotS/area/
EotS/player/
EotS/src/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David   *
 *  Love, Guilherme 'Willie' Arnold, and Mitchell Tse.                     *
 *                                                                         *
 *  In order to use any part of this Envy Diku Mud, you must comply with   *
 *  the original Diku license in 'license.doc', the Merc license in        *
 *  'license.txt', as well as the Envy license in 'license.nvy'.           *
 *  In particular, you may not remove either of these copyright notices.   *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/

#define unix 1
#if defined( macintosh )
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
/* local functions */
void ban	args( ( CHAR_DATA *ch, char *argument, char ban_type ) );
bool dxp;

/* Conversion of Immortal powers to Immortal skills done by Thelonius */

extern char * mprog_type_to_name  args ( ( int type ) );
extern bool   can_use_cmd args( ( int cmd, CHAR_DATA *ch, int trust) );
extern void   delete_playerlist   args ( ( char *name ) );

/* Text file output by Thal. Need to change the directories once the mud is open */

void do_ideas( CHAR_DATA *ch, char *argument )
{
  char buf[MAX_STRING_LENGTH];
  FILE *fp;   

  if ( !( fp = fopen( "/home/storm/EOSBUILD/area/ideas.txt", "r" ) ) )
   return;

  while ( fgets( buf, MAX_STRING_LENGTH, fp ) != NULL )
  {
    send_to_char( AT_WHITE, buf, ch );
  }

  fclose (fp);   

}

void do_typos( CHAR_DATA *ch, char *argument )
{
  char buf[MAX_STRING_LENGTH];
  FILE *fp;   

  if ( !( fp = fopen( "/home/storm/EOSBUILD/area/typos.txt", "r" ) ) )
   return;

  while ( fgets( buf, MAX_STRING_LENGTH, fp ) != NULL )
  {
    send_to_char( AT_WHITE, buf, ch );
  }

  fclose (fp);   

}

void do_todo( CHAR_DATA *ch, char *argument )
{
  char buf[MAX_STRING_LENGTH];
  FILE *fp;   

  if ( !( fp = fopen( "/home/storm/todo.lst", "r" ) ) )
   return;

  while ( fgets( buf, MAX_STRING_LENGTH, fp ) != NULL )
  {
    send_to_char( AT_WHITE, buf, ch );
  }

  fclose (fp);   

}
void do_changes( CHAR_DATA *ch, char *argument )
{
  char buf[MAX_STRING_LENGTH];
  FILE *fp;

  if ( !( fp = fopen( "/home/storm/changes.txt", "r" ) ) )
   return;
  
  while ( fgets( buf, MAX_STRING_LENGTH, fp ) != NULL )
  {
    send_to_char( AT_WHITE, buf, ch );  
  }

  fclose (fp);

}

extern bool doubleexp() {
	return dxp;
}

void do_doubleexp( CHAR_DATA *ch, char *argument ) {
	if ( !str_cmp(argument, "off") ) {
		dxp = FALSE;
		send_to_all_char("&BYou sigh as you feel your learning rate return to normal.\n\r");
		return;
	}
	else
	if ( !str_cmp(argument, "on") ) {
		dxp = TRUE;
		send_to_all_char("&BYou feel yourself gaining experience much quicker.\n\r");
		return;
	}
	else {
		send_to_char( AT_WHITE, "Valid options are on or off\n\r", ch );
		return;
	}
}

void do_shieldify ( CHAR_DATA *ch, char *argument ) {
	if ( get_trust( ch ) < L_CON ) {
		send_to_char( C_DEFAULT, "Huh?\n\r", ch );
		return;
	}
	SET_BIT( ch->affected_by, AFF_HASTE );
	SET_BIT( ch->affected_by, AFF_SANCTUARY );
	SET_BIT( ch->affected_by, AFF_INFRARED );
	SET_BIT( ch->affected_by, AFF_VIBRATING );
	SET_BIT( ch->affected_by, AFF_PASS_DOOR );
	SET_BIT( ch->affected_by, AFF_FIRESHIELD );
	SET_BIT( ch->affected_by, AFF_ICESHIELD );
	SET_BIT( ch->affected_by, AFF_SHOCKSHIELD );
	SET_BIT( ch->affected_by, AFF_CHAOS );
	SET_BIT( ch->affected_by, AFF_SCRY );
	SET_BIT( ch->affected_by2, AFF_BLADE );
	SET_BIT( ch->affected_by2, AFF_GOLDEN );
	send_to_char( C_DEFAULT, "You call forth many shields to surround you!\n\r", ch );
	return;
}

void do_empower(CHAR_DATA *ch, char *argument)
{
  char arg[MAX_INPUT_LENGTH];
  char buf[MAX_STRING_LENGTH];
  CHAR_DATA *victim;
  
  argument = one_argument(argument, arg);
  if ( !*arg )
  {
    send_to_char( AT_PINK, "Syntax: empower <victim> [+|-]<cmd> "
                           "[[+|-]cmd [...]]\n\r", ch );
    send_to_char( AT_PINK, "+ will set, - will remove, none will "
                           "toggle.\n\r", ch );
    return;
  }
  if (    !is_name(NULL, "empower", ch->pcdata->empowerments)
       && ch->level != L_IMP                              )
  {
    send_to_char( AT_WHITE, "You are not empowered to empower.\n\r", ch );
    return;
  }  

  if ( !(victim = get_char_world(ch, arg)) )
  {
    send_to_char( AT_PINK, "They arent in the world.\n\r", ch );
    return;
  }
  if ( IS_NPC(victim) )
  {
    send_to_char( AT_PINK, "Not on NPC's.\n\r", ch );
    return;
  }
  for ( argument = one_argument(argument, arg); *arg != '\0';
        argument = one_argument(argument, arg) )
  {
    char *parg = arg;
    char chn;
    int cmd;
    bool has;
    char sarg[MAX_INPUT_LENGTH];
    char *pemp;
    
    if ( *parg == '+' || *parg == '-' )
    {
      chn = *parg;
      parg++;
    }
    else
      chn = ' ';
    for ( cmd = 0; *cmd_table[cmd].name != '\0'; cmd++ )
      if ( !str_prefix(parg, cmd_table[cmd].name) )
        break;
    if ( !*cmd_table[cmd].name )
      sprintf(buf, "%s is not a command.\n\r", cmd_table[cmd].name);
    else
    {
      has = is_name(NULL, cmd_table[cmd].name, victim->pcdata->empowerments);
      switch(chn)
      {
      case '+':
        if ( has )
        {
          sprintf(buf, "They are already empowered with %s.\n\r",
                  cmd_table[cmd].name);
          chn = ' ';
        }
        else if ( is_name(NULL, cmd_table[cmd].name, victim->pcdata->detractments) )
        {
          sprintf(buf, "%s is detracted from them.\n\r", cmd_table[cmd].name);
          chn = ' ';
        }
        break;
      case '-':
        if ( !has )
        {
          sprintf(buf, "They arent empowered with %s.\n\r",
                  cmd_table[cmd].name);
          chn = ' ';
        }
        break;
      default:
        if ( has )
          chn = '-';
        else
          chn = '+';
        break;
      }
      switch(chn)
      {
      case '+':
        if ( !victim->pcdata->empowerments || !*victim->pcdata->empowerments )
          strcpy(buf, cmd_table[cmd].name);
        else
          sprintf(buf, "%s %s", victim->pcdata->empowerments,
                  cmd_table[cmd].name);
        free_string(victim->pcdata->empowerments);
        victim->pcdata->empowerments = str_dup(buf);
        sprintf(buf, "They are now empowered with %s.\n\r",
                cmd_table[cmd].name);
        break;
      case '-':
        buf[0] = '\0';
        for ( pemp = one_argument(victim->pcdata->empowerments, sarg);
              *sarg != '\0'; pemp = one_argument(pemp, sarg) )
          if ( str_cmp(sarg, cmd_table[cmd].name) )
            sprintf(buf+strlen(buf), " %s", sarg);
        free_string(victim->pcdata->empowerments);
        if ( !*buf )
          victim->pcdata->empowerments = str_dup("");
        else
          victim->pcdata->empowerments = str_dup(buf+1);
        sprintf(buf, "They are no longer empowered with %s.\n\r",
                cmd_table[cmd].name);
        break;
      }
      buf[0] = UPPER(buf[0]);
      send_to_char(AT_PINK, buf, ch);
    }
  }
  return;
}

void do_detract(CHAR_DATA *ch, char *argument)
{
  char arg[MAX_INPUT_LENGTH];
  char buf[MAX_STRING_LENGTH];
  CHAR_DATA *victim;
  
  argument = one_argument(argument, arg);
  if ( !*arg )
  {
    send_to_char( AT_PINK, "Syntax: detract <victim> [+|-]<cmd> "
                           "[[+|-]cmd [...]]\n\r", ch );
    send_to_char( AT_PINK, "+ will set, - will remove, none will "
                           "toggle.\n\r", ch );
    return;
  }

  if (    !is_name(NULL, "detract", ch->pcdata->empowerments)
       && ch->level != L_IMP )
  {
    send_to_char( AT_WHITE, "You are note empowered to detract.\n\r", ch );
    return;
  }

  if ( !(victim = get_char_world(ch, arg)) )
  {
    send_to_char( AT_PINK, "They arent in the world.\n\r", ch );
    return;
  }
  if ( IS_NPC(victim) )
  {
    send_to_char( AT_PINK, "Not on NPC's.\n\r", ch );
    return;
  }
  for ( argument = one_argument(argument, arg); *arg != '\0';
        argument = one_argument(argument, arg) )
  {
    char *parg = arg;
    char chn;
    int cmd;
    bool has;
    char sarg[MAX_INPUT_LENGTH];
    char *pdet;
    
    if ( *parg == '+' || *parg == '-' )
    {
      chn = *parg;
      parg++;
    }
    else
      chn = ' ';
    for ( cmd = 0; *cmd_table[cmd].name != '\0'; cmd++ )
      if ( !str_prefix(parg, cmd_table[cmd].name) )
        break;
    if ( !*cmd_table[cmd].name )
      sprintf(buf, "%s is not a command.\n\r", cmd_table[cmd].name);
    else
    {
      has = is_name(NULL, cmd_table[cmd].name, victim->pcdata->detractments);
      switch(chn)
      {
      case '+':
        if ( has )
        {
          sprintf(buf, "%s is already detracted from them.\n\r",
                  cmd_table[cmd].name);
          chn = ' ';
        }
        else if ( is_name(NULL, cmd_table[cmd].name, victim->pcdata->empowerments) )
        {
          sprintf(buf, "They are empowered with %s.\n\r", cmd_table[cmd].name);
          chn = ' ';
        }
        break;
      case '-':
        if ( !has )
        {
          sprintf(buf, "%s isnt detracted from.\n\r",
                  cmd_table[cmd].name);
          chn = ' ';
        }
        break;
      default:
        if ( has )
          chn = '-';
        else
          chn = '+';
        break;
      }
      switch(chn)
      {
      case '+':
        if ( !victim->pcdata->detractments || !*victim->pcdata->detractments )
          strcpy(buf, cmd_table[cmd].name);
        else
          sprintf(buf, "%s %s", victim->pcdata->detractments,
                  cmd_table[cmd].name);
        free_string(victim->pcdata->detractments);
        victim->pcdata->detractments = str_dup(buf);
        sprintf(buf, "%s is now detracted from them.\n\r",
                cmd_table[cmd].name);
        break;
      case '-':
        buf[0] = '\0';
        for ( pdet = one_argument(victim->pcdata->detractments, sarg);
              *sarg != '\0'; pdet = one_argument(pdet, sarg) )
          if ( str_cmp(sarg, cmd_table[cmd].name) )
            sprintf(buf+strlen(buf), " %s", sarg);
        free_string(victim->pcdata->detractments);
        if ( !*buf )
          victim->pcdata->detractments = str_dup("");
        else
          victim->pcdata->detractments = str_dup(buf+1);
        sprintf(buf, "%s is no longer detracted from them.\n\r",
                cmd_table[cmd].name);
        break;
      }
      buf[0] = UPPER(buf[0]);
      send_to_char(AT_PINK, buf, ch);
    }
  }
  return;
}

void do_load(CHAR_DATA *ch, char *argument )
{
   char arg[MAX_INPUT_LENGTH];

    argument = one_argument(argument,arg);

    if (arg[0] == '\0')
    {
	send_to_char(AT_BLUE, "Syntax:\n\r",ch);
	send_to_char(AT_BLUE, "  load mob <vnum>\n\r",ch);
	send_to_char(AT_BLUE, "  load obj <vnum> <level>\n\r",ch);
	return;
    }

    if (!str_cmp(arg,"mob") || !str_cmp(arg,"char"))
    {
	do_mload(ch,argument);
	return;
    }

    if (!str_cmp(arg,"obj"))
    {
	do_oload(ch,argument);
	return;
    }
    /* echo syntax */
    do_load(ch,"");
}

#if 0
/* taken out for lack of use */
void do_vnum(CHAR_DATA *ch, char *argument)
{
    char arg[MAX_INPUT_LENGTH];
    char *string;

    string = one_argument(argument,arg);
 
    if (arg[0] == '\0')
    {
	send_to_char(AT_BLUE, "Syntax:\n\r",ch);
	send_to_char(AT_BLUE, "  vnum obj <name>\n\r",ch);
	send_to_char(AT_BLUE, "  vnum mob <name>\n\r",ch);
	send_to_char(AT_BLUE, "  vnum skill <skill or spell>\n\r",ch);
	return;
    }

    if (!str_cmp(arg,"obj"))
    {
	do_ofind(ch,string);
 	return;
    }

    if (!str_cmp(arg,"mob") || !str_cmp(arg,"char"))
    { 
	do_mfind(ch,string);
	return;
    }

    if (!str_cmp(arg,"skill") || !str_cmp(arg,"spell"))
    {
	do_slookup(ch,string);
	return;
    }
    /* do both */
    do_mfind(ch,argument);
    do_ofind(ch,argument);
}
#endif

void do_wizhelp( CHAR_DATA *ch, char *argument )
{
  char		buf[MAX_STRING_LENGTH];
  int		cmd;
  int		trust;
  int		col = 0;

  trust = get_trust( ch );
  for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
  {
    int clr;
    
    if ( cmd_table[cmd].name[0] == '\0' )
      break;

    if ( cmd_table[cmd].level < LEVEL_HERO ||
        !can_use_cmd(cmd, ch, trust) || 
	(ch->level < cmd_table[cmd].level) )
      continue;

    if ( cmd_table[cmd].level == L_DIR )
      clr = AT_RED;
    else if ( cmd_table[cmd].level > L_DIR )
      clr = AT_BLUE;
    else if ( cmd_table[cmd].level == L_SEN )
      clr = AT_LBLUE;
    else
      clr = AT_GREY;
    sprintf( buf, "%-16s", cmd_table[cmd].name );
    if ( ++col % 5 == 0 )
      strcat( buf, "\n\r" );
    send_to_char(clr, buf, ch);
  }
 
  if ( col % 5 != 0 )
    send_to_char(AT_GREY, "\n\r", ch);
  return;
}
#if 0
/* taken out because it was replaced */
void do_bamfin( CHAR_DATA *ch, char *argument )
{
    if ( !IS_NPC( ch ) )
    {
        if ( longstring( ch, argument ) )
	    return;

	smash_tilde( argument );
	free_string( ch->pcdata->bamfin );
	ch->pcdata->bamfin = str_dup( argument );
	send_to_char(AT_GREY, "Ok.\n\r", ch );
    }
    return;
}
#endif

#if 0
/* Taken out because it was replaced */
void do_bamfout( CHAR_DATA *ch, char *argument )
{
    if ( !IS_NPC( ch ) )
    {
        if ( longstring( ch, argument ) )
	    return;

	smash_tilde( argument );
	free_string( ch->pcdata->bamfout );
	ch->pcdata->bamfout = str_dup( argument );
	send_to_char(C_DEFAULT, "Ok.\n\r", ch );
    }
    return;
}
#endif
void do_slaymes(CHAR_DATA *ch, char *argument )
{
   char arg[MAX_INPUT_LENGTH];   

   argument = one_argument(argument,arg);
      
   if (arg[0] == '\0')
     {
        send_to_char(AT_WHITE, "Syntax:\n\r",ch);
        send_to_char(AT_RED,  "  slaymes usee <string>  (What you see.)\n\r",ch);
        send_to_char(AT_RED,  "  slaymes room <string>  (What everybody else in the room see.)\n\r",ch);
        send_to_char(AT_RED,  "  slaymes vict <string>  (What the victim see.)\n\r",ch);
        return;
     }

   if ( !str_cmp( arg,"usee" ) )
     {
       char         buf  [ MAX_STRING_LENGTH ];

       if (argument[0] == '\0')
         {
           sprintf(buf,"Slayusee: %s\n\r", ch->pcdata->slayusee);
           send_to_char(AT_WHITE, buf, ch);
           return;
         }
     
      
       if ( !IS_NPC( ch ) )
         {
           if ( longstring( ch, argument ) )
	     return;

           smash_tilde( argument );
           ch->pcdata->slayusee = str_dup( argument );
           sprintf(buf,"Slayusee now: %s\n\r",argument);
           send_to_char(AT_WHITE, buf, ch);
         }
       return;

     }

   if ( !str_cmp( arg, "room" ) )
     {
        char         buf  [ MAX_STRING_LENGTH ];

        if (argument[0] == '\0')
          {
            sprintf(buf,"Slayroom: %s\n\r", ch->pcdata->slayroom);
            send_to_char(AT_WHITE, buf, ch);
            return;
          }
      
        if ( !IS_NPC( ch ) )
          {
            if ( longstring( ch, argument ) )
	      return;

	    smash_tilde( argument );
            ch->pcdata->slayroom = str_dup( argument );
            sprintf(buf,"Slayroom now: %s\n\r",argument);
            send_to_char(AT_WHITE, buf, ch);
          }
        return;

     }

   if ( !str_cmp( arg, "vict" ) )
     {
       char         buf  [ MAX_STRING_LENGTH ];

       if (argument[0] == '\0')
         {
           sprintf(buf,"Slayvict: %s\n\r", ch->pcdata->slayvict);
           send_to_char(AT_WHITE, buf, ch);
           return;
         }
     
      
       if ( !IS_NPC( ch ) )
         {
           if ( longstring( ch, argument ) )
	     return;

	   smash_tilde( argument );
           ch->pcdata->slayvict = str_dup( argument );
           sprintf(buf,"Slayvict now: %s\n\r",argument);
           send_to_char(AT_WHITE, buf, ch);
         }
       return;

     }

   /* echo syntax */
   do_slaymes(ch,"");
}

void do_trmes(CHAR_DATA *ch, char *argument )
{
   char arg[MAX_INPUT_LENGTH];
   
   argument = one_argument(argument,arg);
      
   if (arg[0] == '\0')
     {
        send_to_char(AT_WHITE, "Syntax:\n\r",ch);
        send_to_char(AT_RED,  
"  transmes to   <string>  (What the room the victim is trans to see.)\n\r",ch);
        send_to_char(AT_RED,  "  transmes from <string>  (What the room the victim came from see.)\n\r",ch);
        send_to_char(AT_RED,  "  transmes vict <string>  (What the victim see.)\n\r",ch);
        return;
     }

   if ( !str_cmp( arg,"to" ) )
     {
       char         buf  [ MAX_STRING_LENGTH ];

       if (argument[0] == '\0')
         {
           sprintf(buf,"Transto: %s\n\r", ch->pcdata->transto);
           send_to_char(AT_WHITE, buf, ch);
           return;
         }
    
       if ( !IS_NPC( ch ) )
         {
           if ( longstring( ch, argument ) )
	     return;

	   smash_tilde( argument );
           free_string( ch->pcdata->transto );
           ch->pcdata->transto = str_dup( argument );
           sprintf(buf,"Transto now: %s\n\r",argument);
           send_to_char(AT_WHITE, buf, ch);
         }
       return;

     }

   if ( !str_cmp( arg, "from" ) )
     {
       char         buf  [ MAX_STRING_LENGTH ];

       if (argument[0] == '\0')
         {
           sprintf(buf,"Transfrom: %s\n\r", ch->pcdata->transfrom);
           send_to_char(AT_WHITE, buf, ch);
           return;
         }
    
       if ( !IS_NPC( ch ) )
         { 
           if ( longstring( ch, argument ) )
	     return;

           smash_tilde( argument );
           free_string( ch->pcdata->transfrom );
           ch->pcdata->transfrom = str_dup( argument );
           sprintf(buf,"Transfrom now: %s\n\r",argument);
           send_to_char(AT_WHITE, buf, ch);
         }
       return;

     }

   if ( !str_cmp( arg, "vict" ) )
     {
       char         buf  [ MAX_STRING_LENGTH ];

       if (argument[0] == '\0')
         {
           sprintf(buf,"Transvict:%s", ch->pcdata->transvict);
           send_to_char(AT_WHITE, buf, ch);
           return;
         }
    
       if ( !IS_NPC( ch ) )
         {
           if ( longstring( ch, argument ) )
	     return;

	   smash_tilde( argument );
           free_string( ch->pcdata->transvict );
           ch->pcdata->transvict = str_dup( argument );
           sprintf(buf,"Transvict now: %s\n\r",argument);
           send_to_char(AT_WHITE, buf, ch);
         }
       return;
     }

   /* echo syntax */
   do_trmes(ch,"");
}

void do_bamf(CHAR_DATA *ch, char *argument )
{
   char arg[MAX_INPUT_LENGTH];
   
   argument = one_argument(argument,arg);
      
   if (arg[0] == '\0')
     {
        send_to_char(AT_WHITE, "Syntax:\n\r",ch);
        send_to_char(AT_RED,   
"  bamfmes out  <string>  (What everybody in the room you came from see.)\n\r",ch);
        send_to_char(AT_RED,   "  bamfmes in   <string>  (What everybody in the room you goto see.)\n\r",ch);
        send_to_char(AT_RED,   "  bamfmes see  <string>  (What you see.)\n\r",ch);
        return;
     }

   if ( !str_cmp( arg,"out" ) )
     {
       char  arg [ MAX_INPUT_LENGTH ];
       char  buf [ MAX_STRING_LENGTH ];
    
       one_argument( argument, arg );
    
       if ( arg[0] == '\0' )
         {
	   sprintf( buf, "Bamfout: %s\n\r", ch->pcdata->bamfout );
	   send_to_char(AT_WHITE, buf, ch );
	   return;
         }

       if ( !IS_NPC( ch ) )
         {
           if ( longstring( ch, argument ) )
	     return;

	   smash_tilde( argument );
	   free_string( ch->pcdata->bamfout );
	   ch->pcdata->bamfout = str_dup( argument );
	   send_to_char(AT_WHITE, "Bamfout set.\n\r", ch );
         }
       return;

     }

   if ( !str_cmp( arg, "in" ) )
     {
       char  arg [ MAX_INPUT_LENGTH ];
       char  buf [ MAX_STRING_LENGTH ];
    
       one_argument( argument, arg );
    
       if ( arg[0] == '\0' )
         {
	   sprintf( buf, "Bamfin: %s\n\r", ch->pcdata->bamfin );
	   send_to_char(AT_WHITE, buf, ch );
	   return;
         }

       if ( !IS_NPC( ch ) )
        {
          if ( longstring( ch, argument ) )
	    return;

	  smash_tilde( argument );
	  free_string( ch->pcdata->bamfin );
	  ch->pcdata->bamfin = str_dup( argument );
	  send_to_char(AT_WHITE, "Bamfin set.\n\r", ch );
        }
      return;

    }

   if ( !str_cmp( arg, "see" ) )
     {
       char  arg [ MAX_INPUT_LENGTH ];
       char  buf [ MAX_STRING_LENGTH ];
    
       one_argument( argument, arg );
    
       if ( arg[0] == '\0' )
         {
	   sprintf( buf, "Bamfusee: %s\n\r", ch->pcdata->bamfusee );
	   send_to_char(AT_WHITE, buf, ch );
	   return;
         }

       if ( !IS_NPC( ch ) )
        {
          if ( longstring( ch, argument ) )
	    return;

	  smash_tilde( argument );
	  free_string( ch->pcdata->bamfusee );
	  ch->pcdata->bamfusee = str_dup( argument );
	  send_to_char(AT_WHITE, "Bamfusee set.\n\r", ch );
        }
      return;

    }

   /* echo syntax */
   do_bamf( ch, "" );
}

void do_deny( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    
    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char(AT_RED, "Deny whom?\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_RED, "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_RED, "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char(AT_RED, "You failed.\n\r", ch );
	return;
    }

    SET_BIT( victim->act, PLR_DENY );
    send_to_char(AT_RED, "You are denied access!\n\r", victim );
    send_to_char(AT_RED, "OK.\n\r", ch );
    sprintf( buf, "$N has denied %s", victim->name );
    wiznet( buf, ch, NULL, WIZ_PENALTIES, WIZ_SECURE, 0 );
    if ( victim->level < 2 )
     victim->level = 2;
    do_quit( victim, "" );

    return;
}



void do_disconnect( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA       *victim;
    DESCRIPTOR_DATA *d;
    char             arg [ MAX_INPUT_LENGTH ];

    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char(AT_RED, "Disconnect whom?\n\r", ch );
	return;
    }
    if ( is_number( arg ) )
    {
      for ( d = descriptor_list; d; d = d->next )
      {
	if ( d->descriptor == atoi(arg) )
	{
	  close_socket( d );
	  send_to_char( AT_RED, "Ok.\n\r",ch);
	  return;
	}
      }
      send_to_char(AT_RED, "Descriptor not found.\n\r",ch);
      return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_RED, "They aren't here.\n\r", ch );
	return;
    }

    if ( !victim->desc )
    {
	act(AT_RED, "$N doesn't have a descriptor.", ch, NULL, victim, TO_CHAR );
	return;
    }

    for ( d = descriptor_list; d; d = d->next )
    {
	if ( d == victim->desc )
	{
	    close_socket( d );
	    send_to_char(AT_RED, "Ok.\n\r", ch );
	    return;
	}
    }

    bug( "Do_disconnect: desc not found.", 0 );
    send_to_char(AT_RED, "Descriptor not found!\n\r", ch );
    return;
}



void do_pardon( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg1 [ MAX_INPUT_LENGTH ];
    char       arg2 [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( ch->level != L_IMP)
    {
     send_to_char(AT_GREY, "Only an IMP may pardon.\n\r", ch);
     return;
    }

    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char(AT_BLUE, 
             "Syntax: pardon <character> <killer|thief|outcast|pkiller>.\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg1 ) ) )
    {
	send_to_char(AT_BLUE, "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_BLUE, "Not on NPC's.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "killer" ) )
    {
	if ( IS_SET( victim->act, PLR_KILLER ) )
	{
	    REMOVE_BIT( victim->act, PLR_KILLER );
	    send_to_char(AT_BLUE, "Killer flag removed.\n\r",        ch     );
	    send_to_char(AT_BLUE, "You are no longer a KILLER.\n\r", victim );
	    sprintf( buf, "$N removed %s's killer flag.", victim->name );
	    wiznet( buf, ch, NULL, WIZ_GENERAL, 0, 0 );
	}
	return;
    }

	if ( !str_cmp( arg2, "pkiller" ) )
    {
	if ( IS_SET( victim->act, PLR_PKILLER ) )
	{
	    REMOVE_BIT( victim->act, PLR_PKILLER );
	    send_to_char(AT_BLUE, "Player killer flag removed.\n\r", ch );
	    send_to_char(AT_BLUE, "You are no longer a PK.\n\r", victim );
	    sprintf( buf, "$N removed %s's pkiller flag.", victim->name );
	    wiznet( buf, ch, NULL, WIZ_GENERAL, 0, 0 );
	}
	return;
    }

    if ( !str_cmp( arg2, "thief" ) )
    {
	if ( IS_SET( victim->act, PLR_THIEF  ) )
	{
	    REMOVE_BIT( victim->act, PLR_THIEF  );
	    send_to_char(AT_BLUE, "Thief flag removed.\n\r",        ch     );
	    send_to_char(AT_BLUE, "You are no longer a THIEF.\n\r", victim );
	    sprintf( buf, "$N removed %s's thief flag.", victim->name );
	    wiznet( buf, ch, NULL, WIZ_GENERAL, 0, 0 );
	}
	return;
    }

    if ( !str_cmp( arg2, "outcast" ) )
    {
        if ( IS_SET( victim->act, PLR_OUTCAST ) )
        {
            REMOVE_BIT( victim->act, PLR_OUTCAST );
            send_to_char(AT_BLUE, "Outcast flag removed.\n\r", ch );
            send_to_char(AT_BLUE, 
                         "You are no longer an OUTCAST.\n\r", victim );
            sprintf( buf, "$N removed %s's outcast flag.", victim->name );
            wiznet ( buf, ch, NULL, WIZ_GENERAL, 0, 0 );
        }
        return;
    }

    send_to_char(AT_BLUE,
        "Syntax: pardon <character> <killer|thief|outcast|pkiller>.\n\r", ch );
    return;
}



void do_echo( CHAR_DATA *ch, char *argument )
{
    if ( argument[0] == '\0' )
    {
	send_to_char(AT_YELLOW, "Echo what?\n\r", ch );
	return;
    }

    strcat( argument, "\n\r" );
    send_to_all_char( argument );

    return;
}



void do_recho( CHAR_DATA *ch, char *argument )
{
    DESCRIPTOR_DATA *d;
    
    if ( argument[0] == '\0' )
    {
	send_to_char(AT_YELLOW, "Recho what?\n\r", ch );
	return;
    }

    for ( d = descriptor_list; d; d = d->next )
    {
	if ( d->connected == CON_PLAYING
	    && d->character->in_room == ch->in_room )
	{
	    send_to_char(AT_YELLOW, argument, d->character );
	    send_to_char(AT_YELLOW, "\n\r",   d->character );
	}
    }

    return;
}



ROOM_INDEX_DATA *find_location( CHAR_DATA *ch, char *arg )
{
    OBJ_DATA  *obj;
    CHAR_DATA *victim;

    if ( is_number( arg ) )
	return get_room_index( atoi( arg ) );

    if ( ( victim = get_char_world( ch, arg ) ) )
	return victim->in_room;

    if ( ( obj = get_obj_world( ch, arg ) ) )
	return obj->in_room;

    return NULL;
}



void do_transfer( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA       *victim;
    DESCRIPTOR_DATA *d;
    ROOM_INDEX_DATA *location;
    char             arg1 [ MAX_INPUT_LENGTH ];
    char             arg2 [ MAX_INPUT_LENGTH ];	
    char 	     buf [ MAX_STRING_LENGTH ];

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' )
    {
	send_to_char(AT_RED, "Transfer whom (and where)?\n\r", ch );
	return;
    }

    if ( !str_cmp( arg1, "all" ) )
    {
	for ( d = descriptor_list; d; d = d->next )
	{
	    if ( d->connected == CON_PLAYING
		&& d->character != ch
		&& d->character->in_room
		&& can_see( ch, d->character ) )
	    {
		sprintf( buf, "%s %s", d->character->name, arg2 );
		do_transfer( ch, buf );
	    }
	}
	return;
    }

    /*
     * Thanks to Grodyn for the optional location parameter.
     */
    if ( arg2[0] == '\0' )
    {
	location = ch->in_room;
    }
    else
    {
	if ( !( location = find_location( ch, arg2 ) ) )
	{
	    send_to_char(AT_RED, "No such location.\n\r", ch );
	    return;
	}

	if ( room_is_private( location ) )
	{
	    send_to_char(AT_RED, "That room is private right now.\n\r", ch );
	    return;
	}
    }

    if ( !( victim = get_char_world( ch, arg1 ) ) )
    {
	send_to_char(AT_RED, "They aren't here.\n\r", ch );
	return;
    }

    if ( !victim->in_room )
    {
	send_to_char(AT_RED, "They are in limbo.\n\r", ch );
	return;
    }

    if ( location == victim->in_room )
    {
      send_to_char( C_DEFAULT, "They are already there.\n\r",ch);
      return;
    }

    if ( victim->fighting )
	stop_fighting( victim, TRUE );
	sprintf( buf, "$n %s",
            ( ch->pcdata && ch->pcdata->transfrom[0] != '\0' )
            ? ch->pcdata->transfrom : "disappears in a mushroom cloud." );
        act( AT_RED, buf, victim, NULL, NULL, TO_ROOM );

    char_from_room( victim );
    char_to_room( victim, location );
    sprintf( buf, "$n %s",
            ( ch->pcdata && ch->pcdata->transto[0] != '\0' )
            ? ch->pcdata->transto : "arrives from a puff of smoke" );
        act(AT_RED, buf, victim, NULL, NULL, TO_ROOM );

    if ( ch != victim )
    {
        sprintf( buf, "%s %s.", ch->name,
            ( ch->pcdata && ch->pcdata->transvict[0] != '\0' )
            ? ch->pcdata->transvict : "has transferred you" );
	act(AT_RED, buf, ch, NULL, victim, TO_VICT );
    }

    do_look( victim, "auto" );
    send_to_char(AT_RED, "Ok.\n\r", ch );
}



void do_at( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA       *wch;
    ROOM_INDEX_DATA *location;
    ROOM_INDEX_DATA *original;
    char             arg [ MAX_INPUT_LENGTH ];
    
    argument = one_argument( argument, arg );

    if ( arg[0] == '\0' || argument[0] == '\0' )
    {
	send_to_char(AT_RED, "At where what?\n\r", ch );
	return;
    }

    if ( !( location = find_location( ch, arg ) ) )
    {
	send_to_char(AT_RED, "No such location.\n\r", ch );
	return;
    }

    if ( room_is_private( location ) && get_trust(ch) < L_IMP )
    {
	send_to_char(AT_RED, "That room is private right now.\n\r", ch );
	return;
    }

    original = ch->in_room;
    char_from_room( ch );
    char_to_room( ch, location );
    interpret( ch, argument );

    /*
     * See if 'ch' still exists before continuing!
     * Handles 'at XXXX quit' case.
     */
    for ( wch = char_list; wch; wch = wch->next )
    {
	if ( wch == ch )
	{
	    char_from_room( ch );
	    char_to_room( ch, original );
	    break;
	}
    }

    return;
}

void do_goto( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *gch;
    CHAR_DATA *gch_next; /* goto follow - Deck*/
    CHAR_DATA *pet;
    ROOM_INDEX_DATA *location;
    ROOM_INDEX_DATA *startlocation;  /* goto follow - Deck*/
    char             arg [ MAX_INPUT_LENGTH ];
    char buf[MAX_STRING_LENGTH];

    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char(AT_RED, "Goto where?\n\r", ch );
	return;
    }

    if ( !( location = find_location( ch, arg ) ) )
    {
	send_to_char(AT_RED, "No such location.\n\r", ch );
	return;
    }

    if ( room_is_private( location ) && get_trust(ch) < L_IMP )
    {
	send_to_char(AT_RED, "That room is private right now.\n\r", ch );
	return;
    }
    
    for ( pet = ch->in_room->people; pet; pet = pet->next_in_room )
    {
      if ( IS_NPC( pet ) )
        if ( IS_SET( pet->act, ACT_PET ) && ( pet->master == ch ) )
          break;
    }

    if ( ch->fighting )
	stop_fighting( ch, TRUE );
    if ( pet && pet->fighting )
        stop_fighting( pet, TRUE );

    act(AT_RED, "You $T.", ch, NULL, 
        ( ch->pcdata && ch->pcdata->bamfusee[0] != '\0' )
        ? ch->pcdata->bamfusee : "leave in a swirling mist", TO_CHAR);
	
    if ( !IS_SET( ch->act, PLR_WIZINVIS ) )
    {
	act(AT_RED, "$n $T.", ch, NULL,
	    ( ch->pcdata && ch->pcdata->bamfout[0] != '\0' )
	    ? ch->pcdata->bamfout : "leaves in a swirling mist", TO_ROOM );
	if ( pet )
	  act( AT_RED, "$n leaves in a swirling mist.", pet, NULL, NULL, TO_ROOM );
    }
    else
     {
       for ( gch = ch->in_room->people; gch; gch = gch->next_in_room )
       {
           if ( ch != gch )
           if ( get_trust(gch) >= ch->wizinvis )
           {
              sprintf (buf, "%s slightly phased %s.\n\r", ch->name,
                  ( ch->pcdata && ch->pcdata->bamfout[0] != '\0' )
                  ? ch->pcdata->bamfout : "leaves in a swirling mist");
             send_to_char ( AT_RED, buf, gch );
              if ( pet )
                 {
                    sprintf ( buf, "%s leaves in a swirling mist.\n\r",
                      pet->name );
                    send_to_char ( AT_RED, buf, gch );
                 }
           }
       }
     }

    if ( location == ch->in_room )
    {
      send_to_char(C_DEFAULT, "But you are already there!\n\r",ch);
      return;
    }
   
    startlocation = ch->in_room;    
    char_from_room( ch );
    char_to_room( ch, location );
    if ( pet )
    {
      char_from_room( pet );
    }

    if ( !IS_SET( ch->act, PLR_WIZINVIS ) )
    {
	act(AT_RED, "$n $T.", ch, NULL,
	    ( ch->pcdata && ch->pcdata->bamfin[0] != '\0' )
	    ? ch->pcdata->bamfin : "appears in a swirling mist", TO_ROOM );
    }
    else
     {
       for ( gch = ch->in_room->people; gch; gch = gch->next_in_room )
       {
           if ( ch != gch )
           if ( get_trust(gch) >= ch->wizinvis )
	           {
              sprintf( buf, "%s slightly phased %s.\n\r", ch->name,
                 ( ch->pcdata && ch->pcdata->bamfin[0] != '\0' )
                 ? ch->pcdata->bamfin : "appears in a swirling mist" );
              send_to_char ( AT_RED, buf, gch );
           }
       }
     }

    do_look( ch, "auto" );
    if ( pet )
      char_to_room( pet, location );
    if ( pet && !IS_SET( ch->act, PLR_WIZINVIS ) )
      act( AT_RED, "$n appears in a swirling mist.", pet, NULL, NULL, TO_ROOM );
    else if ( pet && IS_SET( ch->act, PLR_WIZINVIS ) )
    {
       for ( gch = ch->in_room->people; gch; gch = gch->next_in_room )
       {
           if ( get_trust(gch) >= ch->wizinvis )
           {
             sprintf( buf, "%s appears in a swirling mist.\n\r", pet->name);
             send_to_char ( AT_RED, buf, gch );
           }
       }
    }      

    /* goto follow -Decklarean */
    for ( gch = startlocation->people; gch; gch = gch_next )
    {
        gch_next = gch->next_in_room;

        if ( gch->deleted )
           continue;

        if (!IS_IMMORTAL( gch ))
           continue;

        if ( gch->master == ch )
        {
           act(AT_GREY, "You follow $N.", gch, NULL, ch, TO_CHAR );
           do_goto( gch, arg );
	}
    }

/*    send_to_char(C_DEFAULT, "\n\r", ch);
    act(C_DEFAULT, "\n\r", ch, NULL, NULL, TO_ROOM);
  */  
    return;
}



void do_rstat( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA        *obj;
    ROOM_INDEX_DATA *location;
    CHAR_DATA *rch;
    char             buf  [ MAX_STRING_LENGTH ];
    char             arg  [ MAX_INPUT_LENGTH  ];
    int              door;

    one_argument( argument, arg );
    location = ( arg[0] == '\0' ) ? ch->in_room : find_location( ch, arg );
    if ( !location )
    {
	send_to_char(AT_RED, "No such location.\n\r", ch );
	return;
    }

    if ( ch->in_room != location && room_is_private( location ) &&
         get_trust(ch) < L_IMP )
    {
	send_to_char(AT_RED, "That room is private right now.\n\r", ch );
	return;
    }


    sprintf( buf, "&WName: [%s&W]\n\rArea: [%s&W]\n\r",
	    location->name,
	    location->area->name );
    send_to_char(AT_RED, buf, ch);

    sprintf( buf,
	    "&WVnum: &R%d  &WSector: &R%d  &WLight: &R%d\n\r",
	    location->vnum,
	    location->sector_type,
	    location->light );
    send_to_char(AT_RED, buf, ch);

    sprintf( buf,
            "&WRoom flags: &W[&G%s&W]\n\r", flag_string( room_flags, location->room_flags ) );
    send_to_char(AT_RED, buf, ch);
     
    sprintf( buf,
	    "&WRoom flags value: &R%d\n\r&WDescription:\n\r&Y%s",
	    location->room_flags,
	    location->description );
    send_to_char(AT_RED, buf, ch);

    if ( location->extra_descr )
    {
	EXTRA_DESCR_DATA *ed;

	send_to_char(AT_RED, "&WExtra description keywords:&W [&R", ch);
	for ( ed = location->extra_descr; ed; ed = ed->next )
	{
	    strcpy( buf, ed->keyword );
	    if ( ed->next )
		strcat( buf, " " );
	    send_to_char(AT_RED, buf, ch);
	}
	send_to_char( AT_RED, "&W]\n\r", ch );
    }

    send_to_char(AT_RED, "&WCharacters: [", ch);

    /* Yes, we are reusing the variable rch.  - Kahn */
    for ( rch = location->people; rch; rch = rch->next_in_room )
    {
	strcpy( buf, " " );
	one_argument( rch->name, buf+1 );
	send_to_char(AT_RED, buf, ch);
    }
    
    send_to_char(AT_RED, "&W ]\n\rObjects:    [", ch);
    for ( obj = location->contents; obj; obj = obj->next_content )
    {
	strcpy( buf, " " );
	one_argument( obj->name, buf+1 );
	send_to_char(AT_RED, buf, ch);
    }
    send_to_char(AT_RED, "&W ]\n\r", ch);

    for ( door = 0; door <= 5; door++ )
    {
	EXIT_DATA *pexit;

	if ( ( pexit = location->exit[door] ) )
	{
	    sprintf( buf,
		    "&WDoor: &G%d  &WTo: &G%d  &WKey: &G%d  &WExit flags: &G%d\n\r",
		    door,
		    pexit->to_room ? pexit->to_room->vnum : 0,
		    pexit->key,
		    pexit->exit_info );
	    send_to_char(AT_RED, buf, ch);
	    sprintf( buf,
		    "&WKeyword: [&R%s&W]  Description: &R%s",
		    pexit->keyword,
		    pexit->description[0] != '\0' ? pexit->description
		                                  : "(none)\n\r" );
	    send_to_char(AT_RED, buf, ch);
	}
    }

    return;
}

void do_astat( CHAR_DATA *ch, char *argument ) 
{
    ROOM_INDEX_DATA    *location;
    AREA_DATA          *pArea;
    char        arg    [ MAX_INPUT_LENGTH ];
    char        buf    [MAX_STRING_LENGTH ];

    one_argument( argument, arg );
    
    pArea = ch->in_room->area;

if ( arg[0] != '\0' )
{   
   if ( is_number( arg ) )
   {
      if ( !( pArea = get_area_data( atoi( arg ) ) ) )
      {
         send_to_char( AT_WHITE, "No such area exists.\n\r", ch ); 
         return;
      }
   }
   else
   {
      location = find_location( ch, arg );
      if ( !location )
      {
         send_to_char( AT_RED, "No such location.\n\r", ch );
         return;
      }
      pArea = location->area;
   }
}        

    sprintf( buf, "&WName:     &z[&W%5d&z] &w%s\n\r",pArea->vnum,pArea->name );
    send_to_char(C_DEFAULT, buf, ch );
    sprintf( buf, "&WLevel:    &z{&W%d&z-&W%d&z}\n\r", pArea->llevel, pArea->ulevel );
    send_to_char(C_DEFAULT, buf, ch );
    sprintf( buf, "&WRecall:   &z[&W%5d&z]&w %s\n\r", pArea->recall,
        get_room_index( pArea->recall )
        ? get_room_index( pArea->recall )->name : "none" );
    send_to_char(C_DEFAULT, buf, ch );

    sprintf( buf, "&WSounds:   &w%s\n\r", pArea->reset_sound?pArea->reset_sound :
                                      "(default)" );
    send_to_char(C_DEFAULT, buf, ch );

    sprintf( buf, "&WFile:     &C%s\n\r", pArea->filename );
    send_to_char(C_DEFAULT, buf, ch );

    sprintf( buf, "&WVnums:    &z[&W%d-%d&z]\n\r", pArea->lvnum,pArea->uvnum );
    send_to_char(C_DEFAULT, buf, ch );

    sprintf( buf, "&WAge:      &z[&W%d&z]\n\r", pArea->age );
    send_to_char(C_DEFAULT, buf, ch );

/* Angi 
    sprintf( buf, "&WColor:    &z[&W%s&z]\n\r", pArea->color );
    send_to_char(C_DEFAULT, buf, ch );  */

    sprintf( buf, "&WPlayers:  &z[&W%d&z]\n\r", pArea->nplayer );
    send_to_char(C_DEFAULT, buf, ch );

    sprintf( buf, "&WSecurity: &z[&W%d&z]\n\r", pArea->security );
    send_to_char(C_DEFAULT, buf, ch );

    sprintf( buf, "&WBuilders: &z[&B%s&z]\n\r", pArea->builders );
    send_to_char(C_DEFAULT, buf, ch );

    sprintf( buf, "&WFlags:    &z[&R%s&z]\n\r", flag_string( area_flags,pArea->area_flags ) );
    send_to_char(C_DEFAULT, buf, ch );

    return;

}

void do_ostat( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA    *obj;
    AFFECT_DATA *paf;
    char         buf  [ MAX_STRING_LENGTH ];
    char         arg  [ MAX_INPUT_LENGTH  ];

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Ostat what?\n\r", ch );
	return;
    }

    if ( !( obj = get_obj_world( ch, arg ) ) )
    {
	send_to_char(AT_WHITE, "Nothing like that in hell, earth, or heaven.\n\r", ch);
	return;
    }

    sprintf( buf, "Name: %s.\n\r",
	    obj->name );
    send_to_char(AT_RED, buf, ch);

    sprintf( buf, "Vnum: %d.  Type: %s.\n\r",
	    obj->pIndexData->vnum, item_type_name( obj ) );
    send_to_char(AT_RED, buf, ch);

    sprintf( buf, "Short description: %s.\n\rLong description: %s\n\r",
	    obj->short_descr, obj->description );
    send_to_char(AT_RED, buf, ch);

    sprintf( buf, "Wear bits name: %s.\n\r", flag_string( wear_flags,
    	obj->wear_flags ) );
    send_to_char(AT_RED, buf, ch);

    sprintf( buf, "Wear bits: %d.  Extra bits: %s.\n\r",
	    obj->wear_flags, extra_bit_name( obj->extra_flags ) );
    send_to_char(AT_RED, buf, ch);
/* FOR NEW FLAGS */
    sprintf( buf, "AntiClass bits: %s.\n\r",
	    anticlass_bit_name( obj->anti_class_flags ) );
    send_to_char(AT_RED, buf, ch );
/*    sprintf( buf, "AntiClass bits: %s.\n\r",
           flag_string( anti_class_flags, obj->anti_class_flags ) );
    send_to_char(AT_BLUE, buf, ch );*/

    sprintf( buf, "AntiRace bits: %s.\n\r",
	    antirace_bit_name( obj->anti_race_flags ) );
    send_to_char(AT_RED, buf, ch );

    sprintf( buf, "Number: %d/%d.  Weight: %d/%d.\n\r",
	    1,           get_obj_number( obj ),
	    obj->weight, get_obj_weight( obj ) );
    send_to_char(AT_RED, buf, ch);
#ifdef NEW_MONEY
    sprintf( buf, "Gold Cost: %d.  Silver Cost: %d.  Copper Cost: %d.\n\r",
	     obj->cost.gold, obj->cost.silver, obj->cost.copper );
    send_to_char( AT_RED, buf, ch );
    sprintf( buf, "Timer: %d.  Level: %d.\n\r", obj->timer, obj->level );
#else
    sprintf( buf, "Cost: %d.  Timer: %d.  Level: %d.\n\r",
	    obj->cost, obj->timer, obj->level );
#endif
    send_to_char(AT_RED, buf, ch);

    sprintf( buf,
	    "In room: %d.  In object: %s.  Carried by: %s.  Stored by: %s.\n\rWear_loc: %d.\n\r",
	    !obj->in_room    ?        0 : obj->in_room->vnum,
	    !obj->in_obj     ? "(none)" : obj->in_obj->short_descr,
	    !obj->carried_by ? "(none)" : obj->carried_by->name,
	    !obj->stored_by  ? "(none)" : obj->stored_by->name,
	    obj->wear_loc );
    send_to_char(AT_RED, buf, ch);
    
    sprintf( buf, "Values: %d %d %d %d.\n\r",
	    obj->value[0], obj->value[1], obj->value[2], obj->value[3] );
    send_to_char(AT_RED, buf, ch);

    if ( obj->extra_descr || obj->pIndexData->extra_descr )
    {
	EXTRA_DESCR_DATA *ed;

	send_to_char(AT_RED, "Extra description keywords: '", ch);

	for ( ed = obj->extra_descr; ed; ed = ed->next )
	{
	    strcpy( buf, ed->keyword );
	    if ( ed->next )
		strcat( buf, " " );
	    send_to_char(AT_RED, buf, ch);
	}

	for ( ed = obj->pIndexData->extra_descr; ed; ed = ed->next )
	{
	    strcpy( buf, ed->keyword );
	    if ( ed->next )
		strcat( buf, " " );
	    send_to_char(AT_RED, buf, ch);
	}

	send_to_char(AT_RED, "'.\n\r", ch);
    }

    for ( paf = obj->affected; paf; paf = paf->next )
    {
	sprintf( buf, "Affects %s by %d.\n\r",
		affect_loc_name( paf->location ), paf->modifier );
	send_to_char(AT_RED, buf, ch);
    }
	for ( paf = obj->pIndexData->affected; paf; paf = paf->next )
    {
	sprintf( buf, "Affects %s by %d.\n\r",
		affect_loc_name( paf->location ), paf->modifier );
	send_to_char(AT_RED, buf, ch);
    }

    return;
}


void do_mstat( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA   *victim;
    AFFECT_DATA *paf;
    char         buf  [ MAX_STRING_LENGTH ];
    char         arg  [ MAX_INPUT_LENGTH  ];
    
    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Mstat whom?\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
    }
send_to_char( AT_WHITE,
"Description&w:&z___________________________________________________\n\r",
	      ch );

    sprintf( buf, "&cName&w: &W%s %s\n\r",
	    victim->name, 
	     ( !IS_NPC( victim ) && victim->pcdata->lname )
	    ? victim->pcdata->lname : "" );
    send_to_char(C_DEFAULT, buf, ch);

    if ( victim->hunting != NULL )
    {
       sprintf( buf, "Tracking victim: %s (%s)\n\r",
                IS_NPC(victim->hunting) ? victim->hunting->short_descr
                                        : victim->hunting->name,
                IS_NPC(victim->hunting) ? "MOB" : "PLAYER" );
       send_to_char(C_DEFAULT, buf, ch);
    }

    
    if ( !IS_NPC( victim )  && victim->desc )
    {
      if ( str_cmp( victim->desc->user, "(unknown)" ) )
      {
        sprintf( buf, "&c    Email&w: &W%s&R@&W%s\n\r",
	      victim->desc->user ? victim->desc->user : "(none)",
	      victim->desc->host );
        send_to_char(C_DEFAULT, buf, ch);
      }
      else send_to_char(C_DEFAULT, "   ", ch);
    }
    else send_to_char(C_DEFAULT, "   ", ch);

    sprintf( buf, "&cGuild&w: &W%s\n\r",
            victim->guild ? victim->guild->name : "NONE");
    send_to_char(C_DEFAULT, buf, ch);
    
    if (!IS_NPC( victim ) )
    {
    CLAN_DATA *pClan = get_clan_index( victim->clan );
    sprintf(buf, "&cClan&w: &R%d &w= &W%s.\n\r",
            victim->clan, pClan->name );
    send_to_char(C_DEFAULT, buf, ch);
    }
    if ( IS_NPC( victim ) )
      {
      sprintf( buf, "Vnum&w: &R%d   ", victim->pIndexData->vnum );
      send_to_char( AT_CYAN, buf, ch );
      }
    sprintf( buf, "Sex&w: &W%s   &cRoom&w: &R%d\n\r",
	    victim->sex == SEX_MALE    ? "male"   :
	    victim->sex == SEX_FEMALE  ? "female" : "neutral",
	    !victim->in_room           ?        0 : victim->in_room->vnum );
    send_to_char(AT_CYAN, buf, ch);
    sprintf( buf, "Age&w: &R%d  &cPlayed&w: &R%d  &cTimer&w: &R%d\n\r",
	    get_age( victim ),
	    (int) victim->played,
	    victim->timer );
    send_to_char(AT_CYAN, buf, ch);
    if ( !IS_NPC( victim ) )
    if (!victim->pcdata->switched)	/* OLC */
    {
	sprintf( buf, "Security&w:&R %d\n\r", victim->pcdata->security );
	send_to_char(AT_CYAN, buf, ch);
    }

    sprintf( buf, "Short description&w:&W %s\n\r&cLong  description&w:&W %s",
	    victim->short_descr,
	    victim->long_descr[0] != '\0' ? victim->long_descr
	                                  : "(none)&w.\n\r" );
    send_to_char(AT_CYAN, buf, ch);
    sprintf( buf, "Act&w:&W %s\n\r", act_bit_name( victim->act ) );
    send_to_char(AT_CYAN, buf, ch);
    if ( IS_NPC( victim ) && victim->spec_fun != 0 )
    {
        sprintf( buf, "Mobile has spec function&w:&W %s\n\r",spec_string(victim->spec_fun) );
	send_to_char(AT_CYAN, buf, ch);
    }
    if ( !IS_NPC( victim ) && get_trust( victim ) > L_APP )
    {
         sprintf( buf, "Bamfin&w:  &W%s\n\r", victim->pcdata->bamfin );
	 send_to_char(AT_CYAN, buf, ch);
         sprintf( buf, "Bamfout&w: &W%s\n\r", victim->pcdata->bamfout );
	 send_to_char(AT_CYAN, buf, ch);
    }
    if ( !IS_NPC( victim ) )
    {
    if ( victim->pcdata->empowerments && *victim->pcdata->empowerments )
      {
      sprintf(buf, "Empowerments&w: &W%s\n\r",victim->pcdata->empowerments);
      send_to_char(AT_CYAN, buf, ch );
      }
    if ( victim->pcdata->detractments && *victim->pcdata->detractments )
      {
      sprintf(buf, "Detractments&w: &W%s\n\r",victim->pcdata->detractments);
      send_to_char(AT_CYAN, buf, ch );
      }
    }
send_to_char(AT_WHITE,
"Statistics&w:&z____________________________________________________\n\r",
	ch );
    sprintf( buf, "Lv&w: &R%d ", victim->level );
    send_to_char( AT_CYAN, buf, ch );
    sprintf( buf, "&cClass&w: &W%s ", class_short( victim ) );
    send_to_char( AT_CYAN, buf, ch );
    sprintf( buf, "&cAlign&w: &R%d ", victim->alignment );
    send_to_char( AT_CYAN, buf, ch );
    sprintf( buf, "&cAC&w: &R%d ", GET_AC( victim ) );
    send_to_char( AT_CYAN, buf, ch );
    sprintf( buf, "&cExp&w: &R%d\n\r", victim->exp );
    send_to_char( AT_CYAN, buf, ch);
    
    if ( !IS_NPC( victim ) )
    {
	sprintf( buf, "Charisma&w: &R%d   &cPage Lines&w: &R%d\n\r",
		victim->charisma, victim->pcdata->pagelen );
	send_to_char(AT_CYAN, buf, ch);
    }
    sprintf( buf, "&cStr&w: &R%2d&w/&R%2d&w(&R%2d&w) "
	      "&cInt&w: &R%2d&w/&R%2d&w(&R%2d&w) "
	      "&cWis&w: &R%2d&w/&R%2d&w(&R%2d&w) "
	      "&cDex&w: &R%2d&w/&R%2d&w(&R%2d&w) "
	      "&cCon&w: &R%2d&w/&R%2d&w(&R%2d&w)\n\r", 
	 IS_NPC( victim ) ? 13 : victim->pcdata->perm_str, 
	 get_curr_str( victim ), 
	 IS_NPC( victim ) ? 0 : victim->pcdata->mod_str,
	 IS_NPC( victim ) ? 13 : victim->pcdata->perm_int, 
	 get_curr_int( victim ),
	 IS_NPC( victim ) ? 0 : victim->pcdata->mod_int,
	 IS_NPC( victim ) ? 13 : victim->pcdata->perm_wis, 
	 get_curr_wis( victim ),
	 IS_NPC( victim ) ? 0 : victim->pcdata->mod_wis,
	 IS_NPC( victim ) ? 13 : victim->pcdata->perm_dex, 
	 get_curr_dex( victim ),
	 IS_NPC( victim ) ? 0 : victim->pcdata->mod_dex,
	 IS_NPC( victim ) ? 13 : victim->pcdata->perm_con,
	 get_curr_con( victim ),
	 IS_NPC( victim ) ? 0 : victim->pcdata->mod_con );
    send_to_char(AT_CYAN, buf, ch);
sprintf( buf, "Hp&w: &R%d&w/&R%d &c%s&w: &R%d&w/&R%d &cMove&w: &R%d&w/&R%d &cPractices&w: &R%d\n\r",
	    victim->hit,         MAX_HIT(victim),
	    is_class( victim, CLASS_VAMPIRE ) ? "Blood" : "Mana",
	    MT( victim ),        MT_MAX(victim), 
	    victim->move,        MAX_MOVE(victim),
	    victim->practice );
    send_to_char( AT_CYAN, buf, ch );

   sprintf( buf, 
"Mod Hp&w: &R%d &cMod Blood&w: &R%d &cMod Mana&w: &R%d &cMod Move&w: &R%d\n\r",
            victim->mod_hit, victim->mod_bp, 
	    victim->mod_mana, victim->mod_move );
 send_to_char(AT_CYAN, buf, ch);
    if ( !IS_NPC( victim ) )
    {
	sprintf( buf,
"Thirst&w: &R%d &cFull&w: &R%d &cDrunk&w: &R%d &cSaving throw&w: &R%d\n\r",
		victim->pcdata->condition[COND_THIRST],
		victim->pcdata->condition[COND_FULL  ],
		victim->pcdata->condition[COND_DRUNK ],
		victim->saving_throw );
	send_to_char(AT_CYAN, buf, ch);
    }
#ifdef NEW_MONEY
    sprintf( buf, "Gold&w: &R%d &cSilver&w: &R%d &cCopper&w: &R%d\n\r",
	     victim->money.gold, victim->money.silver, victim->money.copper );
    send_to_char(AT_CYAN, buf, ch);
    if ( !IS_NPC( victim ) )
    {
    sprintf( buf, "Bank Account&w: &R%d&WGold  &R%d&WSilver &R%d&WCopper\n\r",
	 victim->pcdata->bankaccount.gold, victim->pcdata->bankaccount.silver,
	 victim->pcdata->bankaccount.copper );
    send_to_char(AT_CYAN, buf, ch);
    }
#endif
    sprintf( buf, "Hitroll&w: &R%d &cDamroll&w: &R%d &cPosition&w: &R%d &cWimpy&w:&R%d\n\r",
	    GET_HITROLL( victim ), GET_DAMROLL( victim ),
	    victim->position,      victim->wimpy );
    send_to_char(AT_CYAN, buf, ch);
    sprintf( buf, "Carry number&w: &R%d  &cCarry weight&w: &R%d\n\r",
	    victim->carry_number, victim->carry_weight );
    send_to_char(AT_CYAN, buf, ch);
    sprintf( buf, "Fighting&w: &W%s &cMaster&w:&W %s &cLeader&w: &W%s\n\r",
	    victim->fighting    ? victim->fighting->name : "(none)",
	    victim->master      ? victim->master->name   : "(none)",
	    victim->leader      ? victim->leader->name   : "(none)" );
    send_to_char(AT_CYAN, buf, ch);
    sprintf(buf, "Summon timer&w:&R %d &cCombat timer&w:&R %d &cClan timer&w:&R %d\n\r",
	victim->summon_timer,
	victim->combat_timer,
	victim->ctimer);
    send_to_char(AT_CYAN, buf, ch);

    sprintf(buf, "Stunned&w:&R &cTotal&w:&R %d &cCommand&w:&R %d &cMagic&c:&R %d "
	         "&cNon&w-&cMagic&w:&R %d  &cTo&w-&cStun&w:&R %d\n\r",
	    victim->stunned[STUN_TOTAL], victim->stunned[STUN_COMMAND],
	    victim->stunned[STUN_MAGIC], victim->stunned[STUN_NON_MAGIC],
	    victim->stunned[STUN_TO_STUN]);
    send_to_char(AT_CYAN, buf, ch);

send_to_char(AT_WHITE, 
"Immunities&w:&z____________________________________________________\n\r", ch );
    sprintf( buf, "Immune&w:&W %s\n\r", imm_bit_name(victim->imm_flags));
    send_to_char(AT_CYAN, buf, ch);
    sprintf( buf, "Resist&w:&W %s\n\r", imm_bit_name(victim->res_flags));
    send_to_char(AT_CYAN, buf, ch);
    sprintf( buf, "Vuln&w:&W   %s\n\r", imm_bit_name( victim->res_flags));
    send_to_char(AT_CYAN, buf, ch);
send_to_char(AT_WHITE,
"Spells &w&& &WAffects&w:&z______________________________________________\n\r", ch );
    sprintf( buf, "Affected &w(&W1&w):&W %s\n\r",affect_bit_name(victim->affected_by ) ); 
    send_to_char(AT_CYAN, buf, ch);
    sprintf( buf, "Affected &w(&W2&w):&W %s\n\r",affect_bit_name2(victim->affected_by2 ) );
    send_to_char(AT_CYAN, buf, ch);
   
    for ( paf = victim->affected; paf; paf = paf->next )
    {
        if ( paf->deleted )
	    continue;
	sprintf( buf,
	  "'&W%s&w': &W%s &cby &R%d &cfor &R%d hours&w; &cbits &W%s&w, &clevel &R%d&w.\n\r",
	  skill_table[(int) paf->type].name,
	  affect_loc_name( paf->location ),
	  paf->modifier,
	  paf->duration,
	  affect_bit_name( paf->bitvector ),
	  paf->level );
	send_to_char(C_DEFAULT, buf, ch);
    }
    for ( paf = victim->affected2; paf; paf = paf->next )
    {
        if ( paf->deleted )
	  continue;
	sprintf( buf,
	  "'&W%s&w': &W%s &cby &R%d &cfor &R%d hours&w; &cbits &W%s&w, &clevel &R%d&w.\n\r",
	  skill_table[(int) paf->type].name,
	  affect_loc_name( paf->location ),
	  paf->modifier,
	  paf->duration,
	  affect_bit_name2( paf->bitvector ),
	  paf->level );
	send_to_char(C_DEFAULT, buf, ch);
    }
    return;
}



void do_mfind( CHAR_DATA *ch, char *argument )
{
           MOB_INDEX_DATA *pMobIndex;
           char            buf  [ MAX_STRING_LENGTH   ];
           char            arg  [ MAX_INPUT_LENGTH    ];
    extern int             top_mob_index;
           int             vnum;
	   int             nMatch;
	   bool            fAll;
	   bool            found;

    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Mfind whom?\n\r", ch );
	return;
    }

    fAll    = !str_cmp( arg, "all" );
    found   = FALSE;
    nMatch  = 0;

    /*
     * Yeah, so iterating over all vnum's takes 10,000 loops.
     * Get_mob_index is fast, and I don't feel like threading another link.
     * Do you?
     * -- Furey
     */
    for ( vnum = 0; nMatch < top_mob_index; vnum++ )
    {
	if ( ( pMobIndex = get_mob_index( vnum ) ) )
	{
	    nMatch++;
	    if ( fAll || is_name( ch, arg, pMobIndex->player_name ) )
	    {
		found = TRUE;
		sprintf( buf, "&z[&W%5d&z] &w%s\n\r",
		    pMobIndex->vnum, capitalize( pMobIndex->short_descr ) );
		send_to_char(AT_RED, buf, ch );
	    }
	}
    }

    if ( !found )
    {
	send_to_char(AT_WHITE, "Nothing like that in hell, earth, or heaven.\n\r", ch);
	return;
    }

    return;
}



void do_ofind( CHAR_DATA *ch, char *argument )
{
	   OBJ_INDEX_DATA *pObjIndex;
	   char            buf  [ MAX_STRING_LENGTH   ];
	   char            arg  [ MAX_INPUT_LENGTH    ];
    extern int             top_obj_index;
	   int             vnum;
	   int             nMatch;
	   bool            fAll;
	   bool            found;

    argument = one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Syntax: ofind <name>\n\r", ch );
	send_to_char(AT_WHITE, "        ofind *<type> <sub-type>\n\r", ch );
	send_to_char(AT_WHITE, "&pType being:\n\r", ch );
	send_to_char(AT_WHITE, "  light scroll wand staff weapon\n\r", ch );
	send_to_char(AT_WHITE, "  treasure armor potion noteboard\n\r", ch );
	send_to_char(AT_WHITE, "  furniture trash container\n\r", ch );
	send_to_char(AT_WHITE, "  drink-container blood key food\n\r", ch );
	send_to_char(AT_WHITE, "  money boat fountain\n\r", ch );
	send_to_char(AT_WHITE, "&pSub-Types being:\n\r", ch );
	send_to_char(AT_WHITE, "  armor: a valid wear-loc\n\r", ch );
	send_to_char(AT_WHITE, "  weapon: a valid weapon-type\n\r", ch );
	send_to_char(AT_WHITE, "  invoke: 1 to 5\n\r", ch );
	return;
    }


    fAll    = !str_cmp( arg, "all" );
    found   = FALSE;
    nMatch  = 0;
    if ( arg[0] == '*' )
      {
      extern int flag_lookup args( ( const char *name, const struct flag_type *flag_table ) );
      int type = flag_lookup( (arg+1), type_flags );
      int sub_type = 0;
      char buf2 [MAX_STRING_LENGTH] = {0};

      if ( str_cmp( (arg+1), "invoke" ) )
	{
        if ( type == ITEM_WEAPON || type == ITEM_ARMOR )
	  {
          one_argument( argument, buf2 );
	  if ( type == ITEM_WEAPON )
	    sub_type = flag_lookup( buf2, weapon_flags );
	  else
	    sub_type = flag_lookup( buf2, wear_flags );
	  }
        if ( type == ITEM_ARMOR
	&& sub_type < 1 )
	  {
	  send_to_char(AT_WHITE, "Unknow armor sub-type.\n\r", ch );
	  return;
	  }
        if ( type == ITEM_WEAPON
        && !str_cmp( flag_string( weapon_flags, sub_type ), "none" ) )
	  {
	  send_to_char(AT_WHITE, "Uknown weapon sub-type.\n\r", ch );
	  return;
	  }
	for ( vnum = 0; nMatch < top_obj_index; vnum++ )
	  {
	  if ( ( pObjIndex = get_obj_index( vnum ) ) )
	    {
	    nMatch++;
	    if ( type == ITEM_ARMOR
	    && pObjIndex->item_type == type
	    && CAN_WEAR( pObjIndex, sub_type ) )
	      {
	      found = TRUE;
	      sprintf( buf, "[&W%5d&z] &w%s\n\r",
              pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
	      send_to_char(AT_DGREY, buf, ch );
	      continue;
	      }
	    else if ( type == ITEM_WEAPON
	    && pObjIndex->item_type == type
	    && pObjIndex->value[3] == sub_type )
	      {
	      found = TRUE;
	      sprintf( buf, "[&W%5d&z] &w%s\n\r",
              pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
	      send_to_char(AT_DGREY, buf, ch );
	      continue;
	      }
	    else if ( pObjIndex->item_type == type 
		   && !sub_type )
	      {
	      found = TRUE;
	      sprintf( buf, "[&W%5d&z] &w%s\n\r",
              pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
	      send_to_char(AT_DGREY, buf, ch );
	      }
	    }
	  }
	}
      else
	{
        one_argument( argument, buf2 );
	sub_type = is_number( buf2 ) ? atoi( buf2 ) : 0;
        if ( sub_type < 0 || sub_type > 5 )
	  {
	  send_to_char(AT_WHITE, "Illegal AC_TYPE for search.\n\r", ch );
	  return;
	  }
	for ( vnum = 0; nMatch < top_obj_index; vnum++ )
	  {
	  if ( ( pObjIndex = get_obj_index( vnum ) ) )
	    {
	    nMatch++;
	    if ( pObjIndex->ac_type == sub_type )
	      {
	      found = TRUE;
	      sprintf( buf, "[&W%5d&z] &w%s\n\r",
		pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
	      send_to_char( AT_GREY, buf, ch );
	      }
	    }
	  }
	}
      if ( !found )
	send_to_char(AT_WHITE, "Nothing like that in hell, earth, or heaven.\n\r", ch);
      return;
      } 
    for ( vnum = 0; nMatch < top_obj_index; vnum++ )
    {
	if ( ( pObjIndex = get_obj_index( vnum ) ) )
	{
	    nMatch++;
	    if ( fAll || is_name( ch, arg, pObjIndex->name ) )
	    {
		found = TRUE;
		sprintf( buf, "&z[&W%5d&z] &w%s\n\r",
		    pObjIndex->vnum, capitalize( pObjIndex->short_descr ) );
		send_to_char(AT_RED, buf, ch );
	    }
	}
    }

    if ( !found )
	send_to_char(AT_WHITE, "Nothing like that in hell, earth, or heaven.\n\r", ch);
    return;
}


void do_mwhere( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       buf  [ MAX_STRING_LENGTH   ];
    char       arg  [ MAX_INPUT_LENGTH    ];
    bool       found;

    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Mwhere whom?\n\r", ch );
	return;
    }

    found   = FALSE;
    for ( victim = char_list; victim; victim = victim->next )
    {
	if ( IS_NPC( victim )
	    && victim->in_room
	    && is_name( ch, arg, victim->name ) )
	{
	    found = TRUE;
	    sprintf( buf, "[%5d] %-28s [%5d] %s\n\r",
		    victim->pIndexData->vnum,
		    victim->short_descr,
		    victim->in_room->vnum,
		    victim->in_room->name );
	    send_to_char(AT_RED, buf, ch);
	}
    }

    if ( !found )
    {
	act(AT_WHITE, "You didn't find any $T.", ch, NULL, arg, TO_CHAR );
	return;
    }

    return;
}



void do_reboo( CHAR_DATA *ch, char *argument )
{
    send_to_char(AT_WHITE, "If you want to REBOOT, spell it out.\n\r", ch );
    return;
}



void do_reboot( CHAR_DATA *ch, char *argument )
{
           char       buf [ MAX_STRING_LENGTH ];
    extern bool       merc_down;

 if ( ch )
 {
    sprintf( buf, "Reboot by %s.", ch->name );
    do_echo( ch, buf );
 }
    end_of_game( );

    merc_down = TRUE;
    return;
}



void do_shutdow( CHAR_DATA *ch, char *argument )
{
    send_to_char(AT_WHITE, "If you want to SHUTDOWN, spell it out.\n\r", ch );
    return;
}



void do_shutdown( CHAR_DATA *ch, char *argument )
{
           char       buf [ MAX_STRING_LENGTH ];
    extern bool       merc_down;
/*    if ( !str_cmp( ch->name, "Hannibal" ) )
	sprintf( buf, "Nuclear Meltdown by %s.", ch->name );
    else */

    sprintf( buf, "Shutdown by %s.", ch->name );
    append_file( ch, SHUTDOWN_FILE, buf );
    strcat( buf, "\n\r" );
    do_echo( ch, buf );

    end_of_game( );

    merc_down = TRUE;
    return;
}



void do_snoop( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA       *victim;
    DESCRIPTOR_DATA *d;
    char             arg [ MAX_INPUT_LENGTH ];
    char             buf [ MAX_STRING_LENGTH ];
    
    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Snoop whom?\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
    }

    if ( !victim->desc )
    {
	send_to_char(AT_WHITE, "No descriptor to snoop.\n\r", ch );
	return;
    }

    if ( victim == ch )
    {
	send_to_char(AT_BLUE, "Cancelling all snoops.\n\r", ch );
	wiznet( "$N stops being such a snoop.",
	       ch, NULL, WIZ_SNOOPS, WIZ_SECURE, get_trust( ch ) );
	for ( d = descriptor_list; d; d = d->next )
	{
	    if ( d->snoop_by == ch->desc )
		d->snoop_by = NULL;
	}
	return;
    }

    if ( victim->desc->snoop_by )
    {
	send_to_char(AT_WHITE, "Busy already.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char(AT_WHITE, "You failed.\n\r", ch );
	return;
    }

    if ( ch->desc )
    {
	for ( d = ch->desc->snoop_by; d; d = d->snoop_by )
	{
	    if ( d->character == victim || d->original == victim )
	    {
		send_to_char(AT_WHITE, "No snoop loops.\n\r", ch );
		return;
	    }
	}
    }

    victim->desc->snoop_by = ch->desc;
    sprintf( buf, "$N starts snooping %s.", victim->name );
    wiznet( buf, ch, NULL, WIZ_SNOOPS, WIZ_SECURE, get_trust( ch ) );
    sprintf( buf, "You successfully snoop %s.\n\r", victim->name );
    send_to_char(AT_BLUE, buf, ch );
    return;
}


void do_switch( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    
    one_argument( argument, arg );
    
    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Switch into whom?\n\r", ch );
	return;
    }

    if ( !ch->desc )
	return;
    
    if ( ch->desc->original )
    {
	send_to_char(AT_WHITE, "You are already switched.\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
    }

    if ( victim == ch )
    {
	send_to_char(AT_BLUE, "Ok.\n\r", ch );
	return;
    }

	if ( ch -> desc -> editor != 0 ) {
		send_to_char( C_DEFAULT, "You cannot switch while building.\n\r", ch );
		return;
	}

    /*
     * Pointed out by Da Pub (What Mud)
     */
    if ( !IS_NPC( victim ) )
    {
        send_to_char(AT_WHITE, "You cannot switch into a player!\n\r", ch );
	return;
    }

    if ( victim->desc )
    {
	send_to_char(AT_WHITE, "Character in use.\n\r", ch );
	return;
    }

    sprintf( buf, "$N switches into %s.", victim->short_descr );
    wiznet( buf, ch, NULL, WIZ_SWITCHES, WIZ_SECURE, get_trust( ch ) );
    ch->pcdata->switched  = TRUE;
    ch->desc->character   = victim;
    ch->desc->original    = ch;
    victim->desc          = ch->desc;
    victim->prompt        = ch->prompt;
    victim->deaf          = ch->deaf;
    ch->desc              = NULL;
    sprintf( buf, "You switch into %s successfully.\n\r", victim->short_descr );
    send_to_char(AT_BLUE, buf, victim );
    return;
}



void do_return( CHAR_DATA *ch, char *argument )
{
    char	buf [ MAX_STRING_LENGTH ];
    
    if ( !ch->desc )
	return;

    if ( !ch->desc->original )
    {
	send_to_char(AT_WHITE, "You aren't switched.\n\r", ch );
	return;
    }

    sprintf( buf, "$N returns from %s.", ch->short_descr );
    wiznet( buf, ch->desc->original, NULL, WIZ_SWITCHES, WIZ_SECURE, get_trust( ch ) );
    send_to_char(AT_BLUE, "You return to your original body.\n\r", ch );
    ch->desc->original->pcdata->switched = FALSE;
    ch->desc->character                  = ch->desc->original;
    ch->desc->original                   = NULL;
    ch->desc->character->desc            = ch->desc;
    ch->prompt                           = NULL;
    ch->desc                             = NULL;
    return;
}



void do_mload( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA      *victim;
    MOB_INDEX_DATA *pMobIndex;
    char            arg  [ MAX_INPUT_LENGTH ];
    char            arg1 [ MAX_INPUT_LENGTH ];
    char            buf  [ MAX_STRING_LENGTH ];
    int             num;
    int             vnum;
    int             nMatch = 0;
    int             amt;
    int             count = 0;
    extern int      top_mob_index;
    
    one_argument( argument, arg );
    amt = number_argument( argument, arg1 );
    num = is_number( arg ) ? atoi( arg ) : 0;

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Syntax: mload <vnum>.\n\r", ch );
	return;
    }

    /* so you could mload <name> or <2.name> and it loads the proper one */
    if ( num == 0 )
    {
        for( vnum = 0; nMatch < top_mob_index; vnum++ )
        {
            if( ( pMobIndex = get_mob_index( vnum ) ) )
            {
                nMatch++;
                if( is_name( ch, arg1, pMobIndex->player_name ) )
                {
                    if( ++count == amt )
                    {
                        num = vnum;
                        break;
                    }
                }
            }
        }
    }

    if ( !( pMobIndex = get_mob_index( num ) ) )
    {
	send_to_char(AT_WHITE, "No mob has that vnum.\n\r", ch );
	return;
    }

    victim = create_mobile( pMobIndex );
    char_to_room( victim, ch->in_room );
    sprintf( buf, "$N created %s (mobile)", victim->short_descr );
    wiznet( buf, ch, NULL, WIZ_LOAD, WIZ_SECURE, get_trust( ch ) );
    sprintf( buf, "You have created %s!\n\r", victim->short_descr );    
    send_to_char(AT_RED, buf, ch );
    act(AT_RED, "$n has created $N!\n\r", ch, NULL, victim, TO_ROOM );
    return;
}



void do_oload( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA       *obj;
    OBJ_INDEX_DATA *pObjIndex;
    char            arg1 [ MAX_INPUT_LENGTH ];
    char            arg2 [ MAX_INPUT_LENGTH ];
    char	    arg3 [ MAX_INPUT_LENGTH ];
    char            arg  [ MAX_INPUT_LENGTH ];
    int             noi    = 1;
    int             in     = 1;
    int             num;
    int             level;
    int             vnum;
    int             count = 0;
    int             amt;
    int             nMatch = 0;
    extern int      top_obj_index;
    
    argument = one_argument( argument, arg1 );
    amt = number_argument( arg1, arg );
    argument = one_argument( argument, arg3 );
    argument = one_argument( argument, arg2 );
    noi = is_number( arg3 ) ? atoi( arg3 ) : 1;
    num = is_number( arg1 ) ? atoi( arg1 ) : 0;
 
    if ( arg1[0] == '\0' )
    {
        send_to_char(AT_WHITE, "&RSyntax: &Woload <vnum> [number] [level].\n\r", ch );
        return;
    }
 
    /* so you can oload <name> or <2.name> and it loads the proper one */
    if ( num == 0 )
    { 
        for( vnum = 0; nMatch < top_obj_index; vnum++ )
        {
            if( ( pObjIndex = get_obj_index(vnum) ) )
            {
                nMatch++;
                if ( ( is_name( ch, arg, pObjIndex->name ) ) )
                {
                    if ( ++count == amt )
                    {
                        num = vnum; 
                        break;
                    }
                }
            }
        }
    }

	if ( !str_cmp( arg1, "random" ))
	{
		obj = random_object( ch->level );
		obj_to_char( obj, ch );
		return;
	}

    if ( !( pObjIndex = get_obj_index( num ) ) )
    {
	send_to_char(AT_WHITE, "No object has that vnum.\n\r", ch );
	return;
    }

    if ( arg2[0] == '\0' )
    {
    	level = pObjIndex->level;
	/*level = get_trust( ch ); */
    }
    else
    {
	/*
	 * New feature from Alander.
	 */
        if ( !is_number( arg2 ) )
        {
	    send_to_char(AT_WHITE, "&RSyntax: &Woload <vnum> [number] [level].\n\r", ch );
	    return;
        }
        level = atoi( arg2 );
	if ( level < 0 || level > get_trust( ch ) )
        {
	    send_to_char(AT_WHITE, "Limited to your trust level.\n\r", ch );
	    return;
        }
    }

    for ( in = 1; in <= noi; in++ )
    {
      obj = create_object( pObjIndex, level );
      if ( CAN_WEAR( obj, ITEM_TAKE ) )
      {
  	obj_to_char( obj, ch );
      }
     else
      {
	obj_to_room( obj, ch->in_room );
      }
    }

    obj = create_object( pObjIndex, level );
      
    sprintf( log_buf, "$n has created %d $p%s!\n\r", noi, 
              noi > 1 ? "s" : "" );
	act(AT_RED, log_buf, ch, obj, NULL, TO_ROOM );
    sprintf( log_buf, "$N has created $p (Total: %d) (Object)", noi );
    wiznet( log_buf, ch, obj, WIZ_LOAD, WIZ_SECURE, get_trust( ch ) );
    sprintf( log_buf, "You have created %d %s%s!\n\r", noi,
	     obj->short_descr, noi > 1 ? "s" : "" ); 
    send_to_char(AT_RED, log_buf, ch );
    extract_obj( obj );
    return;
}



void do_purge( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA  *obj;
    CHAR_DATA *victim;
    char       arg [ MAX_INPUT_LENGTH ];

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	/* 'purge' */
        OBJ_DATA  *obj_next;
	CHAR_DATA *vnext;

	for ( victim = ch->in_room->people; victim; victim = vnext )
	{
	    vnext = victim->next_in_room;
	    if ( victim->deleted )
	        continue;

	    if ( IS_NPC( victim ) && victim != ch )
		extract_char( victim, TRUE );
	}

	for ( obj = ch->in_room->contents; obj; obj = obj_next )
	{
	    obj_next = obj->next_content;
	    if ( obj->deleted )
	        continue;
	    extract_obj( obj );
	}

	send_to_char(AT_RED, "Ok.\n\r", ch );
	act(AT_RED, "You purge the room!", ch, NULL, NULL, TO_CHAR);
	act(AT_RED, "$n purges the room!", ch, NULL, NULL, TO_ROOM);
	return;
    }


    if ( !( victim = get_char_room( ch, arg ) ) )
    {
    if ( ( obj = get_obj_list( ch, arg, ch->in_room->contents ) ) )
    {
    	act(AT_RED, "You purge $P.\n\r", ch, NULL, obj, TO_CHAR );
    	act(AT_RED, "$n purges $P.\n\r", ch, NULL, obj, TO_ROOM );
    	extract_obj( obj );
    	return;
    }
      if ( !( victim = get_char_world( ch, arg ) ) )
      {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
      }
    }
    
    if ( !IS_NPC( victim ) )
    {
	send_to_char(AT_WHITE, "Not on PC's.\n\r", ch );
	return;
    }
    
    act(AT_RED, "You purge $N.", ch, NULL, victim, TO_CHAR );
    act(AT_RED, "$n purges $N.", ch, NULL, victim, TO_NOTVICT );
    extract_char( victim, TRUE );
    return;
}



void do_advance( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg1 [ MAX_INPUT_LENGTH ];
    char       arg2 [ MAX_INPUT_LENGTH ];
    int	       classes;
    int        level;
    int        iLevel;
    char       msgbuf [ MAX_STRING_LENGTH ];
       
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
    {
	send_to_char(AT_WHITE, "Syntax: advance <char> <level>.\n\r", ch );
	return;
    }

    if ( !( victim = get_char_room( ch, arg1 ) ) )
    {
	send_to_char(AT_WHITE, "That player is not here.\n\r", ch);
	return;
    }

    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	return;
    }
    
    level = atoi( arg2 );
    classes = number_classes( victim );
    if ( level < 1 || level > MAX_LEVEL )
    {
	char buf [ MAX_STRING_LENGTH ];

	sprintf( buf, "Advance within range 1 to %d.\n\r", MAX_LEVEL );
	send_to_char(AT_WHITE, buf, ch );
	return;
    }

    if ( level > get_trust( ch ) )
    {
	send_to_char(AT_WHITE, "Limited to your trust level.\n\r", ch );
	return;
    }

    /*
     * Lower level:
     *   Reset to level 1.
     *   Then raise again.
     *   Currently, an imp can lower another imp.
     *   -- Swiftest
     */
   if ( level < LEVEL_IMMORTAL )
   {
    if ( level <= victim->level )
    {
	int sn;

        if ( victim->level > LEVEL_MORTAL )
          do_help( victim, "demm_mortal" );
	
	send_to_char(AT_RED, "Lowering a player's level!\n\r", ch );
	sprintf( msgbuf, "$N has demoted %s to level %d!", victim->name,
	         level );
        wiznet( msgbuf, ch, NULL, WIZ_PENALTIES, WIZ_SECURE, 0 );
	send_to_char(AT_RED, "**** ARGHHHHHHHHHHHHHHH ****\n\r",    victim );
	victim->level    = 1;
	victim->exp      = classes == 1 ? 1000 : classes * 2000;
	victim->perm_hit = 10;
	victim->perm_mana = 100;
	victim->perm_bp   = 20;
	victim->perm_move = 100;
	for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ )
	  victim->pcdata->learned[sn] = 0;
	victim->practice = 0;
	victim->hit      = MAX_HIT(victim);
	victim->mana     = MAX_MANA(victim);
	victim->bp       = MAX_BP(victim);
	victim->move     = MAX_MOVE(victim);
	advance_level( victim );
    }
    else
    {
	send_to_char(AT_RED, "Raising a player's level!\n\r", ch );
	sprintf( msgbuf, "$N has promoted %s to level %d!", 
	         victim->name, level );
	wiznet( msgbuf, ch, NULL, WIZ_LEVELS, WIZ_SECURE, 0 );
	send_to_char(AT_RED, "**** OOOOHHHHHHHHHH  YYYYEEEESSS ****\n\r", victim );
    }

    for ( iLevel = victim->level ; iLevel < level; iLevel++ )
    {
	send_to_char(AT_RED, "You raise a level!!  ", victim );
	victim->exp = xp_tolvl( victim );
	victim->level += 1;
	advance_level( victim );
    }
   }
    if ( ( level > 100 ) && ( level > victim->level ) )
    {
      victim->level = level;
      sprintf( log_buf, "advm_%d", level );
      do_help( victim, log_buf );
    }
    if ( ( level > 100 ) && ( level < victim->level ) )
    {
      victim->level = level;
      sprintf( log_buf, "demm_%d", level );
      do_help( victim, log_buf );
    }
    if ( victim->level <= LEVEL_HERO )
	victim->exp = classes == 1 ? 1000 * victim->level
				   : 2000 * classes * victim->level;
    else if ( victim->level <= L_CHAMP3 )
	{
	int base_xp = classes == 1 ? 100000 : 200000;
	int mod = 1;
	switch( victim->level )
	  {
	  case L_CHAMP1: mod = 4; break;
	  case L_CHAMP2: mod = 10; break;
	  case L_CHAMP3: mod = 20; break;
	  }
	victim->exp = base_xp * classes * mod;
	}
    else
	victim->exp = 25000000 + victim->level;
    return;
}



void do_trust( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg1 [ MAX_INPUT_LENGTH ];
    char       arg2 [ MAX_INPUT_LENGTH ];
    int        level;

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) )
    {
	send_to_char(AT_WHITE, "Syntax: trust <char> <level>.\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg1 ) ) )
    {
	send_to_char(AT_WHITE, "That player is not here.\n\r", ch );
	return;
    }

    level = atoi( arg2 );

    if ( level < 0 || level > MAX_LEVEL )
    {
	char buf [ MAX_STRING_LENGTH ];

	sprintf( buf, "Trust within range 0 to %d.\n\r", MAX_LEVEL );
	send_to_char(AT_WHITE, buf, ch );
	return;
    }

    if ( level >= get_trust( ch ) )
    {
	send_to_char(AT_WHITE, "Limited to your trust.\n\r", ch );
	return;
    }

    victim->trust = level;
    return;
}



void do_restore( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    
    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Restore whom?\n\r", ch );
	return;
	 }

	 /* Restore All feature coded by Katrina*/
	 if ( !str_cmp( arg, "all" ) )
	 {
		 for ( victim = char_list; victim; victim = victim->next )
	{
   	  if ( victim->deleted )
	    continue;
	  if ( IS_NPC(victim) )
	   continue;

	  victim->hit  = MAX_HIT(victim);
	  victim->mana = MAX_MANA(victim);
	  victim->bp   = MAX_BP(victim);
	  victim->move = MAX_MOVE(victim);
	  if ( IS_AFFECTED( victim, AFF_BLIND ) )
	     {
	     AFFECT_DATA *paf;
	     for ( paf = victim->affected; paf; paf = paf->next )
	        {
		if ( paf->deleted )
		   continue;
		if ( paf->bitvector == AFF_BLIND )
		   {
		   affect_remove( victim, paf );
		   break;
		   }
	        }
	     }
	  if ( IS_AFFECTED( victim, AFF_POISON ) )
	     {
	     AFFECT_DATA *paf;
	     for ( paf = victim->affected; paf; paf = paf->next )
		{
		if ( paf->deleted )
		   continue;
		if ( paf->bitvector == AFF_POISON )
		   {
		   affect_remove( victim, paf );
		   break;
		   }
		}
	     }
	  update_pos( victim );
	  if(victim && victim->in_room)
	   act(AT_BLUE, "$n has restored you.", ch, NULL, victim, TO_VICT);
	}
       wiznet( "$N has restored everyone!", 
               ch, NULL, WIZ_RESTORE, WIZ_SECURE, get_trust( ch ) );	  
       send_to_char(AT_BLUE, "Everybody has now been restored.\r\n", ch);
    }
    else
    {
	if ( !( victim = get_char_world( ch, arg ) ) )
	  {
		 send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
		 return;
	  }

	victim->hit  = MAX_HIT(victim);
	victim->mana = MAX_MANA(victim);
	victim->bp   = MAX_BP(victim);
	victim->move = MAX_MOVE(victim);
	if ( IS_AFFECTED( victim, AFF_BLIND ) )
	   {
	   AFFECT_DATA *paf;
	   for ( paf = victim->affected; paf; paf = paf->next )
		{
		if ( paf->deleted )
		   continue;
		if ( paf->bitvector == AFF_BLIND )
		   {
		   affect_remove( victim, paf );
		   break;
		   }
		}
	   }
	if ( IS_AFFECTED( victim, AFF_POISON ) )
	   {
	   AFFECT_DATA *paf;
	   for ( paf = victim->affected; paf; paf = paf->next )
		{
		if ( paf->deleted )
		   continue;
		if ( paf->bitvector == AFF_POISON )
		   {
		   affect_remove( victim, paf );
		   break;
		   }
		}
	   }	
	update_pos( victim );
	act(AT_BLUE, "$n has restored you.", ch, NULL, victim, TO_VICT );
	sprintf( buf, "$N restored %s", victim->name );
	wiznet( buf, ch, NULL, WIZ_RESTORE, WIZ_SECURE, get_trust( ch ) );
	sprintf( buf, "You restore %s successfully.\n\r", victim->name );
	send_to_char(AT_BLUE, buf, ch );
    }

    return;
}



void do_freeze( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    
    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Freeze whom?\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char(AT_WHITE, "You failed.\n\r", ch );
	return;
    }

    if ( IS_SET( victim->act, PLR_FREEZE ) )
    {
	REMOVE_BIT( victim->act, PLR_FREEZE );
	sprintf( buf, "$N removes %s's freeze bit.", victim->name );
	wiznet( buf, ch, NULL, WIZ_PENALTIES, WIZ_SECURE, 0 );
        sprintf( buf, "FREEZE removed from %s.\n\r", victim->name );
	send_to_char(AT_LBLUE, buf, ch );
	send_to_char(AT_LBLUE, "You can play again.\n\r", victim );
    }
    else
    {
	SET_BIT(    victim->act, PLR_FREEZE );
	sprintf( buf, "$N freezes %s.", victim->name );
	wiznet( buf, ch, NULL, WIZ_PENALTIES, WIZ_SECURE, 0 );
        sprintf( buf, "FREEZE set on %s.\n\r", victim->name );
	send_to_char(AT_LBLUE, buf, ch );
	send_to_char(AT_LBLUE, "You can't do ANYthing!\n\r", victim );
    }

    save_char_obj( victim, FALSE );

    return;
}



void do_log( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg [ MAX_INPUT_LENGTH ];

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_RED, "Log whom?\n\r", ch );
	return;
    }

    if ( !str_cmp( arg, "all" ) )
    {
	if ( fLogAll )
	{
	    fLogAll = FALSE;
	    send_to_char(AT_RED, "Log ALL off.\n\r", ch );
	}
	else
	{
	    fLogAll = TRUE;
	    send_to_char(AT_RED, "Log ALL on.\n\r",  ch );
	}
	return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	return;
    }

    /*
     * No level check, gods can log anyone.
     */
    if ( IS_SET( victim->act, PLR_LOG ) )
    {
	REMOVE_BIT( victim->act, PLR_LOG );
	send_to_char(AT_WHITE, "LOG removed.\n\r", ch );
    }
    else
    {
	SET_BIT(    victim->act, PLR_LOG );
	send_to_char(AT_WHITE, "LOG set.\n\r",     ch );
    }

    return;
}



void do_noemote( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    
    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Noemote whom?\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char(AT_WHITE, "You failed.\n\r", ch );
	return;
    }

    if ( IS_SET( victim->act, PLR_NO_EMOTE ) )
    {
	REMOVE_BIT( victim->act, PLR_NO_EMOTE );
        sprintf(buf,"$N restores emotes to %s.",victim->name);
        wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	send_to_char(AT_RED, "NO_EMOTE removed.\n\r",    ch     );
	send_to_char(AT_RED, "You can emote again.\n\r", victim );
    }
    else
    {
	SET_BIT(    victim->act, PLR_NO_EMOTE );
        sprintf(buf,"$N revokes %s's emotes.",victim->name);
        wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	send_to_char(AT_RED, "You can't emote!\n\r",    victim );
	send_to_char(AT_RED, "NO_EMOTE set.\n\r",       ch     );
    }

    return;
}



void do_notell( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    
    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Notell whom?\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char(AT_WHITE, "You failed.\n\r", ch );
	return;
    }

    if ( IS_SET( victim->act, PLR_NO_TELL ) )
    {
	REMOVE_BIT( victim->act, PLR_NO_TELL );
        sprintf(buf,"$N restores tells to %s.",victim->name);
        wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
        send_to_char(AT_RED, "NO_TELL removed.\n\r",    ch );
	send_to_char(AT_RED, "You can tell again.\n\r", victim );
    }
    else
    {
	SET_BIT(    victim->act, PLR_NO_TELL );
        sprintf(buf,"$N revokes %s's tells.",victim->name);
        wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	send_to_char(AT_RED, "NO_TELL set.\n\r",        ch     );
	send_to_char(AT_RED, "You can't tell!\n\r",     victim );
    }

    return;
}



void do_silence( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg [ MAX_INPUT_LENGTH ];
    char       buf [ MAX_STRING_LENGTH ];
    
    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Silence whom?\n\r", ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	return;
    }

    if ( get_trust( victim ) >= get_trust( ch ) )
    {
	send_to_char(AT_WHITE, "You failed.\n\r", ch );
	return;
    }

    if ( IS_SET( victim->act, PLR_SILENCE ) )
    {
	REMOVE_BIT( victim->act, PLR_SILENCE );
        sprintf( buf, "%s has unsilenced %s.", ch->name, victim->name );
        wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	send_to_char(AT_RED, "You can use channels again.\n\r", victim );
	send_to_char(AT_RED, "SILENCE removed.\n\r",            ch     );
    }
    else
    {
	SET_BIT(    victim->act, PLR_SILENCE );
        sprintf( buf, "%s has silenced %s!", ch->name, victim->name );
        wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
	send_to_char(AT_RED, "You can't use channels!\n\r",     victim );
	send_to_char(AT_RED, "SILENCE set.\n\r",                ch     );
    }

    return;
}

/*
void do_fighting( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    DESCRIPTOR_DATA *d;

    for ( d = descriptor_list; d != NULL; d = d->next )
    {
	if (d->connected == CON_PLAYING)
	{
		CHAR_DATA *victim;

		victim = d->original ? d->original : d->character;

		sprintf(buf, "%s is fighting: %s\n\r", victim->name,
		    victim->fighting ? victim ->fighting->name : "(none)" );
		send_to_char(AT_WHITE, buf, ch);
	}
   }
}
*/	    
void do_peace( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *rch;
    char       buf [ MAX_STRING_LENGTH ];

    /* Yes, we are reusing rch.  -Kahn */
    if ( argument[0] == '\0' )
    {
      for ( rch = ch->in_room->people; rch; rch = rch->next_in_room )
      {
	if ( rch->fighting )
	    stop_fighting( rch, TRUE );
      }
   
      send_to_char(AT_BLUE, "You bring peace to the room.\n\r", ch );
      return;
    }

    if ( !str_cmp( argument, "world" ) )
    {
      for ( rch = char_list; rch; rch = rch->next )
      {
        if ( ch->desc == NULL || ch->desc->connected != CON_PLAYING )
         continue;

        if ( rch->fighting )
        {
          sprintf( buf, "%s has declared World Peace.\n\r", ch->name );
          send_to_char( AT_BLUE, buf, rch );
          stop_fighting( rch, TRUE );
        }
      }

      send_to_char( AT_BLUE, "You have declared World Peace.\n\r", ch );
      return;
    }                                                                                                                              
    do_help( ch, "peace" );
    return;
}



BAN_DATA *		ban_free;
BAN_DATA *		ban_list;
void do_permban( CHAR_DATA *ch, char *argument )
{
    ban( ch, argument, 'P' );
    return;
}
void do_tempban( CHAR_DATA *ch, char *argument )
{
    ban( ch, argument, 'T' );
    return;
}
void do_newban( CHAR_DATA *ch, char *argument )
{
    ban( ch, argument, 'N' );
    return;
}

void ban( CHAR_DATA *ch, char *argument, char ban_type )
{
    BAN_DATA  *pban;
/*    BAN_DATA  *to_ban;*/
    char       buf [ MAX_STRING_LENGTH ];
    char       arg [ MAX_INPUT_LENGTH  ];
    char       arg1[ MAX_INPUT_LENGTH  ];

    if ( IS_NPC( ch ) )
	return;

    argument = one_argument( argument, arg );
    argument = one_argument( argument, arg1 );

    if ( arg[0] == '\0' )
    {
	sprintf( buf, "%s banned sites and users:\n\r&R",
		 ban_type == 'P' ? "Perm" : ban_type == 'T' ? "Temp"
							    : "Newban" );
	send_to_char(AT_BLOOD, buf, ch );
	for ( pban = ban_list; pban; pban = pban->next )
	{
	    if ( pban->type == ban_type )
		{
                if ( pban->user )
                  sprintf( buf, "-> &R%s&W@&R%s\n\r", pban->user, pban->name );
                else
                  sprintf( buf, "-> &R%s\n\r", pban->name );
                send_to_char(AT_WHITE, buf, ch );
		}
	}
	buf[0] = '\0';
/*	sprintf( buf, "Syntax: %s [username@]site.to.ban\n\r",
		 ban_type == 'P' ? "Permban" : ban_type == 'T'
				 ? "Tempban" : "Newban" ); */
	sprintf( buf, "Syntax: %s site.to.ban [username]\n\r",
		 ban_type == 'P' ? "Permban" : ban_type == 'T'
				 ? "Tempban" : "Newban" ); 
	send_to_char(C_DEFAULT, buf, ch );
	send_to_char(C_DEFAULT, 
	"User being the optional name of a specific person to ban.\n\r", ch );
/*	send_to_char(C_DEFAULT, 
	"You MUST use the @ symbol if you specify a username.\n\r", ch );*/
	return;
    }
/*
    parse_ban( argument, to_ban ); 
    for ( pban = ban_list; pban; pban = pban->next )
	{
	if ( ( to_ban->name == pban->name && !to_ban->user )
	|| ( to_ban->user && pban->user 
			  && to_ban->user == pban->user
			  && to_ban->name == pban->name ) )
	  {
	  if ( to_ban->user )
	    send_to_char( AT_RED, "The user from that site is already banned.\n\r", ch );
	  else
	    send_to_char( AT_RED, "That site is already banned.\n\r", ch );
	  }
	}
*/	    
    for ( pban = ban_list; pban; pban = pban->next )
    {
	if ( ( !str_cmp( arg, pban->name ) && arg1[0] == '\0' ) 
	  || ( arg1[0] != '\0' && pban->user && !str_cmp( arg1, pban->user ) 
	  && !str_cmp( arg, pban->name ) ) )
	{
	    send_to_char(AT_RED, "That site is already banned!\n\r", ch );
	    return;
	}
    }

    if ( !ban_free )
    {
	pban		= alloc_perm( sizeof( *pban ) );
    }
    else
    {
	pban		= ban_free;
	ban_free	= ban_free->next;
    }
    pban->type	= ban_type;
    parse_ban( argument, pban );
    pban->name	= str_dup( arg );
    if ( arg1[0] != '\0' )
      pban->user = str_dup( arg1 );
    pban->next	= ban_list;
    ban_list	= pban;
    save_banlist( ban_list );
    send_to_char(AT_RED, "Ok.\n\r", ch );
    return;
}
void do_banlist( CHAR_DATA *ch, char *argument )
{
	BAN_DATA *pban;
	char buf [ MAX_INPUT_LENGTH ];
	sprintf( buf, "Banned sites and users:\n\r" );
	send_to_char(AT_BLOOD, buf, ch );
	for ( pban = ban_list; pban; pban = pban->next )
	{
                if ( pban->user )
                  sprintf( buf, "Ban type: &R%c&W -> &R%s&W@&R%s\n\r",
                           pban->type, pban->user, pban->name );
                else
                  sprintf( buf, "Ban type: &R%c&W -> &R%s\n\r",
                           pban->type, pban->name );
                send_to_char(AT_GREY, buf, ch );
	}
	return;
}


void do_allow( CHAR_DATA *ch, char *argument )
{
    BAN_DATA  *prev;
    BAN_DATA  *curr;
    char       arg [ MAX_INPUT_LENGTH ];
    char     arg1 [ MAX_INPUT_LENGTH ];

    argument = one_argument( argument, arg );
    argument = one_argument( argument, arg1 );

    if ( arg[0] == '\0' )
    {
	do_banlist( ch, "" );
	send_to_char(AT_RED, "Remove which site or user from the ban list?\n\r", ch );
	send_to_char(C_DEFAULT, "Syntax: Allow banned.site [username]\n\r", ch );
	send_to_char(C_DEFAULT, "Username being the optional banned user (if applicable).\n\r", ch );
	return;
    }

    prev = NULL;
    for ( curr = ban_list; curr; prev = curr, curr = curr->next )
    {
	if ( ( !str_cmp( arg, curr->name ) && !curr->user && 
	   arg1[0] == '\0' ) || 
	( curr->user && !str_cmp( arg, curr->name ) &&
	    !str_cmp( arg1, curr->user ) ) )
	{
	    if ( curr->type == 'P' && get_trust( ch ) < L_IMP )
		{
		send_to_char( AT_RED, "You cannot remove a perm ban.\n\r", ch );
		return;
		}
	    if ( !prev )
		ban_list   = ban_list->next;
	    else
		prev->next = curr->next;

	    free_string( curr->name );
	    if ( curr->user )
	      free_string( curr->user );
/*	    curr->next	= ban_free;
	    ban_free	= curr;*/
	    free_mem( curr, sizeof( *curr ) );
	    save_banlist( ban_list );
	    send_to_char(AT_RED, "Site removed.\n\r", ch );
	    return;
	}
    }

    send_to_char(AT_RED, "That site or user is not banned.\n\r", ch );
    return;
}



void do_wizlock( CHAR_DATA *ch, char *argument )
{
    extern bool       wizlock;

    wizlock = !wizlock;

    if ( wizlock )
	send_to_char(AT_BLUE, "Game wizlocked.\n\r", ch );
    else
	send_to_char(AT_BLUE, "Game un-wizlocked.\n\r", ch );

    return;
}



void do_slookup( CHAR_DATA *ch, char *argument )
{
    char       buf  [ MAX_STRING_LENGTH ];
    char       arg  [ MAX_INPUT_LENGTH ];
    int        sn;

    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Slookup what?\n\r", ch );
	return;
    }

    if ( !str_cmp( arg, "all" ) )
    {
	for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ )
	{
	    if ( !skill_table[sn].name )
		break;
	    sprintf( buf, "Slot: %4d Sn: %4d Skill/spell: '%s'\n\r",
		    skill_table[sn].slot, sn, skill_table[sn].name );
	    send_to_char(AT_WHITE, buf, ch);
	}
    }
    else
    {
        int ccount;

	if ( ( sn = skill_lookup( arg ) ) < 0 )
	{
	    send_to_char(AT_WHITE, "No such skill or spell.\n\r", ch );
	    return;
	}

	sprintf( buf, "Slot: %4d Sn: %4d Skill/spell: '%s'\n\r",
		skill_table[sn].slot, sn, skill_table[sn].name );
	send_to_char(AT_WHITE, buf, ch );
	for ( ccount = 0; ccount < MAX_CLASS; ccount++ )
	{
	  sprintf( buf, "%s: %3d   ", class_table[ccount].who_name,
		  skill_table[sn].skill_level[ccount] );
	  send_to_char(AT_WHITE, buf, ch );
	}
	send_to_char(AT_WHITE, "\n\r", ch );
    }

    return;
}



void do_sset( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg1  [ MAX_INPUT_LENGTH ];
    char       arg2  [ MAX_INPUT_LENGTH ];
    char       arg3  [ MAX_INPUT_LENGTH ];
    int        value;
    int        sn;
    bool       fAll;

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    argument = one_argument( argument, arg3 );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Syntax: sset <victim> <skill> <value>\n\r",	ch );
	send_to_char(AT_WHITE, "or:     sset <victim> all     <value>\n\r",	ch );
	send_to_char(AT_WHITE, "Skill being any skill or spell.\n\r",		ch );
	return;
    }

    if ( !( victim = get_char_world( ch, arg1 ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
    }

    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	return;
    }

    fAll = !str_cmp( arg2, "all" );
    sn   = 0;
    if ( !fAll && ( sn = skill_lookup( arg2 ) ) < 0 )
    {
	send_to_char(AT_WHITE, "No such skill or spell.\n\r", ch );
	return;
    }

    /*
     * Snarf the value.
     */
    if ( !is_number( arg3 ) )
    {
	send_to_char(AT_WHITE, "Value must be numeric.\n\r", ch );
	return;
    }

    value = atoi( arg3 );
    if ( value < 0 || value > 100 )
    {
	send_to_char(AT_WHITE, "Value range is 0 to 100.\n\r", ch );
	return;
    }

    if ( fAll )
    {
        if ( get_trust( ch ) < L_DIR )
	{
	    send_to_char(AT_WHITE, "Only Imps may sset all.\n\r", ch );
	    return;
	}
	for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ )
	{
	    if ( skill_table[sn].name )
	        if ( can_practice_skpell( victim, sn ) )
		    victim->pcdata->learned[sn]	= value;
	}
    }
    else
    {
	victim->pcdata->learned[sn] = value;
    }

    return;
}

void do_cset( CHAR_DATA *ch, char *argument )
{
    CLAN_DATA *pClan;
    CHAR_DATA *victim;
    char       arg1 [ MAX_INPUT_LENGTH  ];
    char       arg2 [ MAX_INPUT_LENGTH  ];
    char       arg3 [ MAX_INPUT_LENGTH  ];
    int        value;

    smash_tilde( argument );
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    strcpy( arg3, argument );
    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
    {
        send_to_char(AT_WHITE, "Syntax: &Bcset <victim> <field>  <value>\n\r", ch );
        send_to_char(AT_WHITE, "\n\r",                                         ch );
        send_to_char(AT_WHITE, "&pField being one of:\n\r",                    ch );
        send_to_char(AT_WHITE, "  clan clvl\n\r",                              ch );
        return;
    }


    if ( !( victim = get_char_room( ch, arg1 ) ) )
    {
      send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
      return;
    }

    value = is_number( arg3 ) ? atoi( arg3 ) : -1;


    if (    !str_cmp( arg2, "clvl" )
         && (    is_name(NULL, "cset", ch->pcdata->empowerments)
              || ch->level == L_IMP                          ) )
    {
       if IS_NPC( victim)
       {
          send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
          return;
       }
       victim->clev = value;
       send_to_char(AT_WHITE, "Ok.\n\r", ch );
       return;
    }
    else if ( !str_cmp( arg2, "clvl" ) )
    {
       send_to_char(AT_WHITE, "You are not empowered to set one's clan level.\n\r", ch );
       return;
    }

    argument = one_argument( argument, arg3 );

    for ( pClan = clan_first->next; pClan; pClan = pClan->next )
    {
        if ( !str_cmp( arg3, strip_color( pClan->name ) ) )
        {
           value = pClan->vnum;
           break;
        }
    }

    if (    !str_cmp( arg2, "clan" ) 
         && (    is_name(NULL, "cset", ch->pcdata->empowerments)
              || ch->level == L_IMP                          ) )
    {
       if IS_NPC( victim )
       {
          send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
          return;
       }
       if ( !get_clan_index(value) )
       {
          send_to_char(AT_WHITE, "Invalid clan.\n\r", ch );
          return;
       }
       victim->clan = value;
       send_to_char(AT_WHITE, "Ok.\n\r", ch );
       return;
    }
    else if ( !str_cmp( arg2, "clan" ) )
    {
       send_to_char(AT_WHITE, "You are not empowered to set one's clan.\n\r", ch);
       return;
    }

 return;
}

void do_mset( CHAR_DATA *ch, char *argument )
{
    MOB_INDEX_DATA *pMob = NULL;
    CHAR_DATA *victim;
    char       buf  [ MAX_STRING_LENGTH ];
    char       arg1 [ MAX_INPUT_LENGTH  ];
    char       arg2 [ MAX_INPUT_LENGTH  ];
    char       arg3 [ MAX_INPUT_LENGTH  ];
    int        value;
    int        max;
    bool       p = FALSE;
#ifdef NEW_MONEY
    char       arg4 [ MAX_STRING_LENGTH ];
#endif
    smash_tilde( argument );
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    if ( !str_cmp( arg2, "bank" ) )
    {
       argument = one_argument( argument, arg3 );
       argument = one_argument( argument, arg4 );
    }
    else
       strcpy( arg3, argument );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Syntax: mset <victim> <field>  <value>\n\r",	 ch );
	send_to_char(AT_WHITE, "or:     mset <victim> <string> <value>\n\r",	 ch );
	send_to_char(AT_WHITE, "or:     mset <victim> class <slot> <value>\n\r", ch );
	send_to_char(AT_WHITE, "\n\r",						 ch );
	send_to_char(AT_WHITE, "&pField being one of:\n\r",			 ch );
	send_to_char(AT_WHITE, "  str int wis dex con level gold silver\n\r",    ch );
	send_to_char(AT_WHITE, "  copper hp mana blood move practice align\n\r", ch );
        send_to_char(AT_WHITE, "  mhp mmana mblood mmove\n\r", 			 ch );
	send_to_char(AT_WHITE, "  thirst drunk full security affected_by2\n\r",	 ch );
	send_to_char(AT_WHITE, "  affected_by act mstr mint mwis\n\r",  	 ch );
	send_to_char(AT_WHITE, "  mdex mcon bank carryn carryw save race\n\r",   ch );
	send_to_char(AT_WHITE, "  lname sex salign\n\r",			 ch );
	send_to_char(AT_WHITE, "&pString being one of:\n\r",			 ch );
	send_to_char(AT_WHITE, "  name short long title spec\n\r",               ch );
	send_to_char(AT_WHITE, "&pSlot being 1-2 class slot.\n\r", ch );
	send_to_char(AT_WHITE, "  example: mset self class 1 warrior\n\r", ch );
	return;
    }

/*    if ( !is_number( arg1 ) )*/
      if ( !( victim = get_char_room( ch, arg1 ) ) )
      {
	send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	return;
      }
/*    else
      if ( !(pMob = get_mob_index( atoi( arg1  )) ) )
      {
         send_to_char(AT_WHITE, "Nothing like that in hell, earth, or heaven.\n\r", ch );
         return;
      }
      else 
      {
         p = TRUE;
         victim = get_char_world( ch, pMob->player_name );
      }*/
     
    /*
     * Snarf the value (which need not be numeric).
     */
    value = is_number( arg3 ) ? atoi( arg3 ) : -1;

    /*
     * Set something.
     */
     if ( !str_cmp( arg2, "qtime1" ) )
	{
	victim->nextquest = value;
	return;
	}
     if ( !str_cmp( arg2, "qtime2" ) )
	{
	victim->countdown = value;
	return;
	}
    if ( !str_cmp( arg2, "sex" ) )
    {
      if ( IS_NPC( victim ) )
	return;
      if ( !str_cmp( arg3, "male" ) )
	value = 1;
      else if ( !str_cmp( arg3, "female" ) )
	value = 2;
      else if ( !str_cmp( arg3, "neutral" ) )
	value = 0;
      else
	{
	send_to_char( AT_WHITE, "Valid sexes are Male, Female & Neutral.\n\r", ch );
	return;
	}
      victim->sex = value;
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      return;
    }
    if ( !str_cmp( arg2, "salign" ) )
    {
      if ( IS_NPC(victim) )
      {
        send_to_char( AT_WHITE, "Not on NPC's.\n\r", ch );
        return;
      }
      if ( !*arg3 )
      {
        send_to_char( AT_WHITE, "Set salign to what?\n\r", ch );
        return;
      }
      if ( !str_prefix(arg3, "good") || !str_prefix(arg3, "neutral") ||
	   !str_prefix(arg3, "evil") )
        victim->start_align = UPPER(*arg3);
      else
      {
        send_to_char( AT_WHITE, "Invalid salign.\n\r"
            "Salign is Good/Neutral/Evil.\n\r", ch );
        return;
      }
      send_to_char( AT_WHITE, "Salign set.\n\r", ch );
      return;
    }
    if ( !str_cmp( arg2, "lname" ) )
    {
      if ( IS_NPC( victim ) )
        return;
      if ( victim->pcdata->lname )
        free_string( victim->pcdata->lname );
      if ( !str_cmp( "none", arg3 ) )
      {
	victim->pcdata->lname = NULL;
        send_to_char( AT_WHITE, "Cleared.\n\r", ch );
        return;
      }
      victim->pcdata->lname = str_dup( arg3 );
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      return;
    }
    
    if ( !str_cmp( arg2, "carryn" ) )
    {
      victim->carry_number = value;
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      return;
    }
    
    if ( !str_cmp( arg2, "carryw" ) )
    {
      victim->carry_weight = value;
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      return;
    }
    
    if ( !str_cmp( arg2, "bank" ) )
    {
      if ( IS_NPC( victim ) )
        return;
#ifdef NEW_MONEY

      if ( is_number( arg4 ) )
      {
        if ( !str_cmp( arg3, "gold" ) )
          victim->pcdata->bankaccount.gold = atoi( arg4 );
	else if ( !str_cmp( arg3, "silver" ) )
	  victim->pcdata->bankaccount.silver = atoi( arg4 );
	else if ( !str_cmp( arg3, "copper" ) )
	  victim->pcdata->bankaccount.copper = atoi( arg4 );
	else
	{
	  send_to_char( AT_WHITE, "Invalid currency type.\n\r", ch );
	  send_to_char( AT_WHITE, "&WSyntax: mset <victim> <bank> <currency_type> <amount>\n\r",
		   ch );
	  return;
	}
      }
      else
      {
	send_to_char( AT_WHITE, "Invalid amount.\n\r", ch );
	send_to_char( AT_WHITE, "&WSyntax: mset &R<victim> <bank> <currency_type> <amount>\n\r", 
                   ch );
	return;
      }
#else
      victim->pcdata->bankaccount = value;
#endif
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      return;
    }

    if ( !str_cmp( arg2, "save" ) )
    {
      if ( IS_NPC( victim ) )
        return;
      victim->saving_throw = value;
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      return;
    }
    if ( !str_cmp( arg2, "mstr" ) )
    {
      if ( IS_NPC( victim ) )
      {
         send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
         return;
      }
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      victim->pcdata->mod_str = value;
      return;
    }
    
    if ( !str_cmp( arg2, "mint" ) )
    {
      if ( IS_NPC( victim ) )
      {
        send_to_char( AT_WHITE, "Not on NPC's.\n\r", ch );
        return;
      }
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      victim->pcdata->mod_int = value;
      return;
    }
    
    if ( !str_cmp( arg2, "mwis" ) )
    {
      if ( IS_NPC( victim ) )
      {
	send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
        return;
      }
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      victim->pcdata->mod_wis = value;
      return;
    }
    
    if ( !str_cmp( arg2, "mdex" ) )
    {
      if ( IS_NPC( victim ) )
      {
        send_to_char(AT_WHITE, "Not on NPCS's\n\r", ch );
        return;
      }
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      victim->pcdata->mod_dex = value;
      return;
    }

    if ( !str_cmp( arg2, "mcon" ) )
    {
      if (IS_NPC( victim ) )
      {
        send_to_char( AT_WHITE, "Not on NPC's\n\r", ch );
        return;
      }
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      victim->pcdata->mod_con = value;
      return;
    }
    
    if ( !str_cmp( arg2, "str" ) )
    {
	if ( IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	    return;
	}

	if ( class_table[prime_class(victim)].attr_prime == APPLY_STR )
	    max = 25;
	else
	    max = 18;

	if ( value < 3 || value > max )
	{
	    sprintf( buf, "Strength range is 3 to %d.\n\r", max );
	    send_to_char(AT_WHITE, buf, ch );
	    return;
	}

	victim->pcdata->perm_str = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "int" ) )
    {
	if ( IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	    return;
	}

	if ( class_table[prime_class(victim)].attr_prime == APPLY_INT )
	    max = 25;
	else
	    max = 18;

	if ( value < 3 || value > max )
	{
	    sprintf( buf, "Intelligence range is 3 to %d.\n\r", max );
	    send_to_char(AT_WHITE, buf, ch );
	    return;
	}

	victim->pcdata->perm_int = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "wis" ) )
    {
	if ( IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	    return;
	}

	if ( class_table[prime_class(victim)].attr_prime == APPLY_WIS )
	    max = 25;
	else
	    max = 18;

	if ( value < 3 || value > max )
	{
	    sprintf( buf, "Wisdom range is 3 to %d.\n\r", max );
	    send_to_char(AT_WHITE, buf, ch );
	    return;
	}

	victim->pcdata->perm_wis = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "dex" ) )
    {
	if ( IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	    return;
	}

	if ( class_table[prime_class(victim)].attr_prime == APPLY_DEX )
	    max = 25;
	else
	    max = 18;

	if ( value < 3 || value > max )
	{
	    sprintf( buf, "Dexterity range is 3 to %d.\n\r", max );
	    send_to_char(AT_WHITE, buf, ch );
	    return;
	}

	victim->pcdata->perm_dex = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "con" ) )
    {
	if ( IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	    return;
	}

	if ( class_table[prime_class(victim)].attr_prime == APPLY_CON )
	    max = 25;
	else
	    max = 18;

	if ( value < 3 || value > max )
	{
	    sprintf( buf, "Constitution range is 3 to %d.\n\r", max );
	    send_to_char(AT_WHITE, buf, ch );
	    return;
	}

	victim->pcdata->perm_con = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
    
/*    if ( !str_cmp( arg2, "clvl" ) && get_trust( ch ) >= L_CON )
    {
       if IS_NPC( victim)
       {
          send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
          return;
       }
       victim->clev = value;
       send_to_char(AT_WHITE, "Ok.\n\r", ch );
       return;
    }
    else if ( !str_cmp( arg2, "clvl" ) && get_trust( ch ) < L_CON )
    {
       send_to_char(AT_WHITE, "You are too low of trust to set one's clan level.\n\r", ch );
       return;
    }
       
    if ( !str_cmp( arg2, "clan" ) && get_trust( ch ) >= L_CON )
    {
       if IS_NPC( victim )
       {
          send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
          return;
       }
*/       /*if ( ( value < 0 ) || ( value > MAX_CLAN ) )*/
/*       if ( !get_clan_index(value) )
       {
          send_to_char(AT_WHITE, "Invalid clan.\n\r", ch );
          return;
       }
       victim->clan = value;
       send_to_char(AT_WHITE, "Ok.\n\r", ch );
       return;
    }
    else if ( !str_cmp( arg2, "clan" ) && get_trust( ch ) < L_CON )
    {
       send_to_char(AT_WHITE, "You are too low of trust to set one's clan.\n\r", ch );
       return;
    }
*/    
    if ( !str_cmp( arg2, "act" ) )
    {   
       if (!IS_NPC( victim ) )
       if ( get_trust( ch ) < L_DIR /*&& !IS_SET( ch->affected_by2, CODER
)*/ )
       {
          send_to_char(AT_WHITE, "You are too low of trust to set ones actflags.\n\r", ch );
          return;
       }
       if (IS_NPC( victim ) )
       {
          if (!str_cmp( arg3, "sentinel" ) || !str_cmp( arg3, "se" ) )
	    value = 2;
          if (!str_cmp( arg3, "scavenger" ) || !str_cmp( arg3, "sc" ) )
            value = 4;
          if (!str_cmp( arg3, "aggressive" ) || !str_cmp( arg3, "ag" ) )
            value = 32;
          if (!str_cmp( arg3, "stayarea" ) || !str_cmp( arg3, "sa" ) )
            value = 64;
          if (!str_cmp( arg3, "wimpy" ) || !str_cmp( arg3, "w" ) )
            value = 128;
          if (!str_cmp( arg3, "pet" ) || !str_cmp( arg3, "pe" ) )
            value = 256;
          if (!str_cmp( arg3, "trainer" ) || !str_cmp( arg3, "t" ) )
            value = 512;
          if (!str_cmp( arg3, "practicer" ) || !str_cmp( arg3, "pr" ) )
            value = 1024;
          if (!str_cmp( arg3, "gambler" ) || !str_cmp( arg3, "g" ) )
            value = 2048;
          if ( (!str_cmp( arg3, "prototype" ) || !str_cmp( arg3, "pro" ) )
            && ( get_trust( ch ) >= L_CON 
		/*|| IS_SET( ch->affected_by2, CODER )*/ ) )
            value = 4096;
       }
       
       if (!IS_NPC( victim ) )
       {
           if (!str_cmp( arg3, "boughtpet" ) || !str_cmp( arg3, "bp" ) )
             value = 2;
           if (!str_cmp( arg3, "autoexit" ) || !str_cmp( arg3, "ae" ) )
             value = 8;
           if (!str_cmp( arg3, "autoloot" ) || !str_cmp( arg3, "al" ) )
             value = 16;
           if (!str_cmp( arg3, "autosac" ) || !str_cmp( arg3, "as" ) )
             value = 32;
           if (!str_cmp( arg3, "blank" ) || !str_cmp( arg3, "bl" ) )
             value = 64;
           if (!str_cmp( arg3, "brief" ) || !str_cmp( arg3, "br" ) )
             value = 128;
           if (!str_cmp( arg3, "combine" ) || !str_cmp( arg3, "c" ) )
	     value = 512;
           if (!str_cmp( arg3, "prompt" ) || !str_cmp( arg3, "p" ) )
             value = 1024;
         if (!str_cmp( arg3, "telnetga" ) || !str_cmp( arg3, "tga" ) )
           value = 2048;
         if (!str_cmp( arg3, "holylight" ) || !str_cmp( arg3, "h" ) )
           value = 4096;
         if (!str_cmp( arg3, "wizinvis" ) || !str_cmp( arg3, "w" ) )
           value = 8192;
         if (!str_cmp( arg3, "cloaked" ) || !str_cmp( arg3, "cl" ) )
           value = BV17;
         if (!str_cmp( arg3, "thief" ) || !str_cmp( arg3, "t" ) )
           value = 4194304;
         if (!str_cmp( arg3, "killer" ) || !str_cmp( arg3, "k" ) )
           value = 8388608;
         if (!str_cmp( arg3, "ansi" ) || !str_cmp( arg3, "a" ) )
           value = 16777216;
         if (!str_cmp( arg3, "autocoins" ) || !str_cmp( arg3, "aco" ) )
           value = 33554432;
	 if (!str_cmp( arg3, "keeptitle" ) || !str_cmp( arg3, "kt" ) )
           value = 67108864;
         if (!str_cmp( arg3, "undead" ) || !str_cmp( arg3, "u" ) )
           value = 134217728;
         if (!str_cmp( arg3, "darkinvis" ) || !str_cmp( arg3, "d" ) )
           value = 268435456;
	 if (!str_cmp( arg3, "pkiller" ) || !str_cmp( arg3, "pk" ) )
	   value = 536870912;
       }
       
       if (IS_NPC( victim ) )
       if ( ( value & ACT_PROTOTYPE ) && ( get_trust( ch ) < L_CON ) )
       {
          send_to_char(AT_WHITE, "You cannot toggle the prototype flag at your current level.\n\r", ch );
          return;
       }
            
     /*  if ( (unsigned) 4294967295 & value ) */
       if ( 0xFFFFFFFF & value )
       {
         if (p) 
         {
           pMob->act ^= value;
           SET_BIT( victim->in_room->area->area_flags, AREA_CHANGED );
         }
          else
         {victim->act ^= value;}
         send_to_char(AT_WHITE, "Ok.\n\r", ch );
         return;
       }
       else
       {
         send_to_char(AT_WHITE, "Invalid bit.", ch );
         return;
       }
    }
    
    if ( !str_cmp( arg2, "affected_by" ) )
    {
       if ( (get_trust( ch ) < L_DIR) && (!IS_NPC( victim )) )
       {
	  send_to_char(AT_WHITE, "You cannot set a player's affected_by from your current level.\n\r", ch );
          return;
       }
       if (p)
       { pMob->affected_by ^= value; }
       else
       { 
       if ( value == 0 ) 
         victim->affected_by = 0;
        else
         victim->affected_by ^= value; 
       }
       send_to_char(AT_WHITE, "Ok.\n\r", ch );
       return;
    }
    
    if ( !str_cmp( arg2, "affected_by2" ) )
    {
       if ( get_trust( ch ) < L_IMP && !IS_NPC( victim ) )
       {
	  send_to_char(AT_WHITE, "You are too low of level to set a player's affected_by2.\n\r", ch );
          return;
       }
       if (p)
       { pMob->affected_by2 ^= value;
         SET_BIT( victim->in_room->area->area_flags, AREA_CHANGED ); }
       else
       { 
       if ( value == 0 )
         victim->affected_by2 = 0;
        else
         victim->affected_by2 ^= value; 
       }
       send_to_char(AT_WHITE, "Ok.\n\r", ch );
       return;
    }

    if ( !str_cmp( arg2, "class" ) )
    {
      char arg4[ MAX_INPUT_LENGTH ];
      char buf [ MAX_STRING_LENGTH ];
      int slot, value, iClass;
      argument = one_argument( argument, arg3 );
      strcpy( arg4, argument );
      slot = ( is_number( arg3 ) ) ? atoi( arg3 ) : -1;
      value = ( is_number( arg4 ) ) ? atoi( arg4 ) : -1;
      if ( value < -1 )
	value = -1;
      if ( slot < 1 || slot > 2 )
	{
	send_to_char( AT_WHITE, "Invalid slot.  Valid slot: 1-2.\n\r", ch );
	return;
	}
      for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
	{
	if ( !str_prefix( arg4, class_table[iClass].who_long )
	|| !str_cmp( arg4, class_table[iClass].who_name ) )
	  {
          value = iClass;
	  break;
	  }
	}
      if ( slot == 1 && value == -1 )
	{
	send_to_char( AT_WHITE, "Cannot turn off 1st Class.\n\r", ch );
	return;
	}
      if ( slot == 2 && value == -1 && victim->class[2] != -1 )
	{
	send_to_char( AT_WHITE, "You must turn off 3rd Class before 2nd.\n\r", ch );
	return;
	}
      if ( slot == 3 && victim->class[1] == -1 )
	{
	act( AT_WHITE,
	     "Cannot set 3rd Class for $N.  Player does not have a 2nd Class.",
	     ch, NULL, victim, TO_CHAR );
	return;
	}
      if ( value < -1 || value > MAX_CLASS )
	{
	    sprintf( buf, "Class range is 0 to %d.\n\r", MAX_CLASS-1 );
	    send_to_char(AT_WHITE, buf, ch );
	    for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
		{
		sprintf( buf, " %2d = %s\n\r", iClass,
			 class_table[iClass].who_long );
		send_to_char( AT_WHITE, buf, ch );
		}
	    send_to_char( AT_WHITE, " -1 = Turns off class.\n\r", ch );
	    return;
	}
	if ( value != -1 && !class_table[value].races[victim->race] )
	  {
	  sprintf( buf, "Player's race (%s) does not allow class %s.\n\r",
	           (get_race_data(victim->race))->race_full,
		   class_table[value].who_long );
	  send_to_char( AT_WHITE, buf, ch );
	  return;
	  }
      if ( value != -1 && is_class( victim, value ) )
	{
	sprintf ( buf, "$N is already %s %s.",
		( victim->class[1] != -1 ) ? "part" : "a",
		class_table[value].who_long );
	act( AT_WHITE, buf, ch, NULL, victim, TO_CHAR );
	return;
	}
	victim->class[slot-1] = value;
	if ( slot == 3 )
	  victim->class[slot] = -1;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "race" ) )
    {
      int iRace;
      RACE_DATA *pRace;
      for ( iRace = 0; iRace < MAX_RACE; iRace++ )
	{
	if ( !str_cmp( arg3, (get_race_data(iRace))->race_full )
	|| !str_cmp( arg3, (get_race_data(iRace))->race_name ) )
	   { 
	   value = iRace; 
	   break; 
	   }
	}
/*
      if ( !str_cmp( arg3, "human" ) || !str_cmp( arg3, "hum" ) )
         value = RACE_HUMAN;
      if ( !str_cmp( arg3, "elf" ) )
         value = RACE_ELF;
      if ( !str_cmp( arg3, "dwarf" ) || !str_cmp( arg3, "dwa" ) )
         value = RACE_DWARF;
      if ( !str_cmp( arg3, "pixie" ) || !str_cmp( arg3, "pix" ) )
         value = RACE_PIXIE;
      if ( !str_cmp( arg3, "halfling" ) || !str_cmp( arg3, "hal" ) )
         value = RACE_HALFLING;
      if ( !str_cmp( arg3, "drow" ) )
         value = RACE_DROW;
      if ( !str_cmp( arg3, "elder" ) || !str_cmp( arg3, "eld" ) )
         value = RACE_ELDER;
      if ( !str_cmp( arg3, "ogre" ) || !str_cmp( arg3, "ogr" ) )
         value = RACE_OGRE;
      if ( !str_cmp( arg3, "lizardman" ) || !str_cmp( arg3, "liz" ) )
         value = RACE_LIZARDMAN;
      if ( !str_cmp( arg3, "demon" ) || !str_cmp( arg3, "dem" ) )
         value = RACE_DEMON;
      if ( !str_cmp( arg3, "ghoul" ) || !str_cmp( arg3, "ghl" ) )
	 value = RACE_GHOUL;
      if ( !str_cmp( arg3, "illithid" ) || !str_cmp( arg3, "ill" ) )
         value = RACE_ILLITHID;
      if ( !str_cmp( arg3, "minotaur" ) || !str_cmp( arg3, "min" ) )
         value = RACE_MINOTAUR;
      if ( !str_cmp( arg3, "troll" ) || !str_cmp( arg3, "tro" ) )
         value = RACE_TROLL;
      if ( !str_cmp( arg3, "shadow" ) || !str_cmp( arg3, "shd" ) )
	 value = RACE_SHADOW;
*/
	if ( value < 0 || value >= MAX_RACE )
	{
	    char buf [ MAX_STRING_LENGTH ];

	    sprintf( buf, "Race range is 0 to %d.\n", MAX_RACE-1 );
	    send_to_char(AT_WHITE, buf, ch );
	    for ( iRace = 0; iRace < MAX_RACE; iRace++ )
		{
		sprintf( buf, " %2d = %s\n\r", iRace,
			 (get_race_data(iRace))->race_full );
		send_to_char( AT_WHITE, buf, ch );
		}
	    return;
	}
	
      pRace = get_race_data(victim->race);
      victim->pcdata->mod_str -= pRace->mstr;
	victim->pcdata->mod_int -= pRace->mint;
	victim->pcdata->mod_wis -= pRace->mwis;
	victim->pcdata->mod_dex -= pRace->mdex;
	victim->pcdata->mod_con -= pRace->mcon;
	if ( victim->race == RACE_GHOUL )
		REMOVE_BIT( victim->act, PLR_UNDEAD );

	victim->race = value;
	if ( victim->race == RACE_GHOUL )
		SET_BIT( victim->act, PLR_UNDEAD );
      pRace = get_race_data(victim->race);
	victim->pcdata->mod_str += pRace->mstr;
	victim->pcdata->mod_int += pRace->mint;
	victim->pcdata->mod_wis += pRace->mwis;
	victim->pcdata->mod_dex += pRace->mdex;
	victim->pcdata->mod_con += pRace->mcon;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "level" ) )
    {
	if ( !IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on PC's.\n\r", ch );
	    return;
	}

	if ( value < 0 || value > 100 )
	{
	    send_to_char(AT_WHITE, "Level range is 0 to 50.\n\r", ch );
	    return;
	}
	victim->level = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
#ifdef NEW_MONEY
    if ( !str_cmp( arg2, "gold" ) )
    {
	victim->money.gold = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
    if ( !str_cmp( arg2, "silver" ) )
    {
	victim->money.silver = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
    if ( !str_cmp( arg2, "copper" ) )
    {
	victim->money.copper = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
#else
    if ( !str_cmp( arg2, "gold" ) )
    {
	victim->gold = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
#endif
    if ( !str_cmp( arg2, "hp" ) )
    {
	if ( value < -10 || value > 30000 )
	{
	    send_to_char(AT_WHITE, "Hp range is -10 to 30,000 hit points.\n\r", ch );
	    return;
	}
	if ( victim->fighting && value < 0 )
	{
	    send_to_char(AT_WHITE, "You cannot set a fighting person's hp below 0.\n\r",
			 ch );
	    return;
	}
	victim->perm_hit = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
    if ( !str_cmp( arg2, "mhp" ) )
    {
	victim->mod_hit = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "mana" ) )
    {
	if ( value < 0 || value > 30000 )
	{
	    send_to_char(AT_WHITE, "Mana range is 0 to 30,000 mana points.\n\r", ch );
	    return;
	}
	victim->perm_mana = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "mmana" ) )
    {
	victim->mod_mana = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "blood" ) )
    {
	if ( value < 0 || value > 30000 )
	{
	    send_to_char(AT_WHITE, "Blood range is 0 to 30,000 mana points.\n\r", ch );
	    return;
	}
	victim->perm_bp = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
    if ( !str_cmp( arg2, "mblood" ) )
    {
	victim->mod_bp = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "move" ) )
    {
	if ( value < 0 || value > 30000 )
	{
	    send_to_char(AT_WHITE, "Move range is 0 to 30,000 move points.\n\r", ch );
	    return;
	}
	victim->perm_move = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "mmove" ) )
    {
	victim->mod_move = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "practice" ) )
    {
	if ( value < 0 || value > 100 )
	{
	    send_to_char(AT_WHITE, "Practice range is 0 to 100 sessions.\n\r", ch );
	    return;
	}
	victim->practice = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "align" ) )
    {
	if ( value < -1000 || value > 1000 )
	{
	    send_to_char(AT_WHITE, "Alignment range is -1000 to 1000.\n\r", ch );
	    return;
	}
	victim->alignment = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "thirst" ) )
    {
	if ( IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	    return;
	}

	if ( ( value < 0 || value > 100 )
	    && get_trust( victim ) < LEVEL_IMMORTAL )
	{
	    send_to_char(AT_WHITE, "Thirst range is 0 to 100.\n\r", ch );
	    return;
	}
	else
	    if ( value < -1 || value > 100 )
	    {
		send_to_char(AT_WHITE, "Thirst range is -1 to 100.\n\r", ch );
		return;
	    }

	victim->pcdata->condition[COND_THIRST] = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "drunk" ) )
    {
	if ( IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	    return;
	}

	if ( value < 0 || value > 100 )
	{
	    send_to_char(AT_WHITE, "Drunk range is 0 to 100.\n\r", ch );
	    return;
	}

	victim->pcdata->condition[COND_DRUNK] = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "full" ) )
    {
	if ( IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	    return;
	}

	if ( ( value < 0 || value > 100 )
	    && get_trust( victim ) < LEVEL_IMMORTAL )
	{
	    send_to_char(AT_WHITE, "Full range is 0 to 100.\n\r", ch );
	    return;
	}
	else
	    if ( value < -1 || value > 100 )
	    {
		send_to_char(AT_WHITE, "Full range is -1 to 100.\n\r", ch );
		return;
	    }

	victim->pcdata->condition[COND_FULL] = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "name" ) )
    {
	if ( !IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on PC's.\n\r", ch );
	    return;
	}

	if ( longstring( ch, arg3 ) )
	    return;

	free_string( victim->name );
	victim->name = str_dup( arg3 );
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "short" ) )
    {
        if ( !IS_NPC(victim) )
	{
	  send_to_char(AT_WHITE, "Not on PC's.\n\r",ch);
	  return;
	}
        if ( longstring( ch, arg3 ) )
	    return;

	free_string( victim->short_descr );
	victim->short_descr = str_dup( arg3 );
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "long" ) )
    {
        if ( !IS_NPC(victim) )
	{
	  send_to_char(AT_WHITE, "Not on PC's.\n\r",ch);
	  return;
	}
        if ( longstring( ch, arg3 ) )
	    return;

	free_string( victim->long_descr );
	strcat( arg3, "\n\r" );
	victim->long_descr = str_dup( arg3 );
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "title" ) )
    {
	if ( IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
	    return;
	}

	set_title( victim, arg3 );
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "spec" ) )
    {
	if ( !IS_NPC( victim ) )
	{
	    send_to_char(AT_WHITE, "Not on PC's.\n\r", ch );
	    return;
	}

	if ( ( victim->spec_fun = spec_lookup( arg3 ) ) == 0 )
	{
	    send_to_char(AT_WHITE, "No such spec fun.\n\r", ch );
	    return;
	}
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "security" ) )	/* OLC */
    {
        if ( IS_NPC( victim ) )
        {
            send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
            return;
        }

	if ( value > ch->pcdata->security || value < 0 )
	{
	    if ( ch->pcdata->security != 0 )
	    {
		sprintf( buf, "Valid security is 0-%d.\n\r",
		    ch->pcdata->security );
		send_to_char(AT_WHITE, buf, ch );
	    }
	    else
	    {
		send_to_char(AT_WHITE, "Valid security is 0 only.\n\r", ch );
	    }
          return;
	}
	victim->pcdata->security = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
/* XOR */
    if(!str_cmp(arg2, "immune"))
    {
      if(!IS_NPC(victim))
      {
        send_to_char(AT_WHITE, "Not on PC's.\n\r", ch );
        return;
      }
      victim->imm_flags ^= value;
      send_to_char(AT_WHITE, "Ok.\n\r", ch );
      return;
    }
/* END */

    /*
     * Generate usage message.
     */
    do_mset( ch, "" );
    return;
}



void do_oset( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA  *obj;
    char       arg1 [ MAX_INPUT_LENGTH ];
    char       arg2 [ MAX_INPUT_LENGTH ];
    char       arg3 [ MAX_INPUT_LENGTH ];
    char       arg4 [ MAX_INPUT_LENGTH ];
    int        value;

    smash_tilde( argument );
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    if ( ( !str_cmp( arg2, "apply" ) ) || ( !str_cmp( arg2, "cost" ) ) )
    {
      argument = one_argument( argument, arg3 );
      argument = one_argument( argument, arg4 );
    }
    else
    strcpy( arg3, argument );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
    {
	send_to_char(AT_WHITE, "&pSyntax: oset <object> <field>  <value>\n\r",	ch );
	send_to_char(AT_WHITE, "&por:     oset <object> <string> <value>\n\r",	ch );
	send_to_char(AT_WHITE, "\n\r",						ch );
	send_to_char(AT_WHITE, "&pField being one of:\n\r",			ch );
	send_to_char(AT_WHITE, "  value0 value1 value2 value3\n\r",		ch );
	send_to_char(AT_WHITE, "  anticlass antirace\n\r",			ch );
	send_to_char(AT_WHITE, "  extra wear level weight cost timer\n\r",	ch );
        send_to_char(AT_WHITE, "  ac_type ac_vnum ac_v1 ac_v2\n\r", ch );
	send_to_char(AT_WHITE, "  apply delapply\n\r", ch );
	send_to_char(AT_WHITE, "\n\r",						ch );
	send_to_char(AT_WHITE, "&pString being one of:\n\r",			ch );
	send_to_char(AT_WHITE, "  name short long ed ac_setspell\n\r",			ch );
	return;
    }

    if ( !( obj = get_obj_here( ch, arg1 ) ) )
    {
	send_to_char(AT_WHITE, 
	"Nothing like that in your inventory or the room.\n\r", ch );
	return;
    }

    /*
     * Snarf the value (which need not be numeric).
     */
    value = is_number( arg3 ) ? atoi( arg3 ) : -1;     
    /*
     * Set something.
     */
    if ( !str_cmp( arg2, "value0" ) || !str_cmp( arg2, "v0" ) )
    {
	obj->value[0] = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "value1" ) || !str_cmp( arg2, "v1" ) )
    {
	obj->value[1] = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "value2" ) || !str_cmp( arg2, "v2" ) )
    {
	obj->value[2] = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "value3" ) || !str_cmp( arg2, "v3" ) )
    {
	obj->value[3] = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "delapply" ) )
    {
      AFFECT_DATA *paf;
      AFFECT_DATA *paf_next;
      int cnt = 0;

      if ( value == -1 )
      {
        send_to_char( AT_WHITE, "&pSyntax: oset object delapply [number]\n\r", ch );
        return;
      }
      
      if ( !( paf = obj->affected ) )
      {
          send_to_char( AT_WHITE, "Non-existant apply.\n\r", ch );
          return;
      }

      
      if ( value == 0 )
      {
	paf = obj->affected;
        obj->affected = paf->next;
        free_affect( paf );
      }
      else
      {
        while ( ( paf_next = paf->next ) && ( ++cnt < value ) )
            paf = paf_next;
            
        if ( paf_next )
        {
           paf->next = paf_next->next;
           free_affect( paf_next );
        }
	else
        {
	   send_to_char( AT_WHITE, "No such affect.\n\r", ch );
           return;
        }
      }      
      return;
    }

    if ( !str_cmp( arg2, "apply" ) )
    {
        AFFECT_DATA *paf;
        
        if ( is_number( arg3 ) || arg4[0] == '\0' || !is_number( arg4 ) )
        {
          send_to_char( AT_WHITE, "&pSyntax: oset object apply type modifier\n\r", ch );
          return;
        }

	paf = new_affect();
	paf->location = flag_value( apply_flags, arg3 );
	paf->modifier = atoi( arg4 );
	paf->type     = skill_lookup(arg3);
	if ( paf->type < 0 )
	  paf->type = 0;
	paf->duration = -1;
	paf->bitvector = 0;
	paf->next = obj->affected;
	obj->affected = paf;        
	
	send_to_char( AT_WHITE, "Apply added.\n\r", ch );
	return;
    }
        
        

    if ( !str_cmp( arg2, "extra" ) )
    {
	if (!str_cmp( arg3, "glow" ) || !str_cmp( arg3, "g" ) )
          value = ITEM_GLOW;
        if (!str_cmp( arg3, "hum" ) || !str_cmp( arg3, "h" ) )
          value = ITEM_HUM;
	if (!str_cmp( arg3, "dark" ) || !str_cmp( arg3, "d" ) )
          value = ITEM_DARK;
        if (!strcmp( arg3, "lock" ) || !str_cmp( arg3, "l" ) )
          value = ITEM_LOCK;
	if (!str_cmp( arg3, "evil" ) || !str_cmp( arg3, "e" ) )
          value = ITEM_EVIL;
        if (!str_cmp( arg3, "invis" ) || !str_cmp( arg3, "i" ) )
          value = ITEM_INVIS;
        if (!str_cmp( arg3, "magic" ) || !str_cmp( arg3, "m" ) )
          value = ITEM_MAGIC;
        if (!str_cmp( arg3, "nodrop" ) || !str_cmp( arg3, "nd" ) )
          value = ITEM_NODROP;
        if (!str_cmp( arg3, "antigood" ) || !str_cmp( arg3, "ag" ) )
          value = ITEM_ANTI_GOOD;
        if (!str_cmp( arg3, "antievil" ) || !str_cmp( arg3, "ae" ) )
	  value = ITEM_ANTI_EVIL;
        if (!str_cmp( arg3, "antineutral" ) || !str_cmp( arg3, "an" ) )
          value = ITEM_ANTI_NEUTRAL;
        if (!str_cmp( arg3, "noremove" ) || !str_cmp( arg3, "nr" ) )
          value = ITEM_NOREMOVE;
	if (!str_cmp( arg3, "poisoned" ) || !str_cmp( arg3, "p" ) )
          value = ITEM_POISONED;
        if (!str_cmp( arg3, "flame" ) || !str_cmp( arg3, "f" ) )
	  value = ITEM_FLAME;
        if (!str_cmp( arg3, "chaos" ) || !str_cmp( arg3, "c" ) )
          value = ITEM_CHAOS;
        if (!str_cmp( arg3, "nolocate" ) || !str_cmp( arg3, "nl" ) )
          value = ITEM_NO_LOCATE;
        if (!str_cmp( arg3, "nodamage" ) || !str_cmp( arg3, "n" ) )
          value = ITEM_NO_DAMAGE;
        if (!str_cmp( arg3, "patched" ) || !str_cmp( arg3, "p" ) )
          value = ITEM_PATCHED;
        if (!str_cmp( arg3, "frosty" ) || !str_cmp( arg3, "f" ) )
          value = ITEM_ICY;

	if ( value == 0 || !str_cmp( arg3, "none" ) )
	{
	   obj->extra_flags = 0;
	   send_to_char(AT_WHITE,"Ok.\n\r", ch );
	   return;
	}
/*	if ( 4294967295 & value ) */
	if ( 0xFFFFFFFF & value )
	{
	  if (value == 0)
	    obj->extra_flags = 0;
	   else
	    obj->extra_flags ^= value;
	  send_to_char(AT_WHITE, "Ok.\n\r", ch );
	  return;
	}
	else
	{
	  send_to_char(AT_WHITE, "Invalid bit.\n\r", ch );
	  return;
	}
    }
/* FOR NEW FLAGS */
    if ( !str_cmp( arg2, "anticlass" ) )
    {
	if (!str_cmp( arg3, "mage" ) || !str_cmp( arg3, "mag" ) )
	  value = ITEM_ANTI_MAGE;
        if (!str_cmp( arg3, "cleric" ) || !str_cmp( arg3, "cle" ) )
          value = ITEM_ANTI_CLERIC;
	if (!str_cmp( arg3, "thief" ) || !str_cmp( arg3, "thi" ) )
	  value = ITEM_ANTI_THIEF;
	if (!str_cmp( arg3, "warrior" ) || !str_cmp( arg3, "war" ) )
	  value = ITEM_ANTI_WARRIOR;
	if (!str_cmp( arg3, "psionisist" ) || !str_cmp( arg3, "psi" ) )
	  value = ITEM_ANTI_PSI;
	if (!str_cmp( arg3, "druid" ) || !str_cmp( arg3, "dru" ) )
	  value = ITEM_ANTI_DRUID;
	if (!str_cmp( arg3, "ranger" ) || !str_cmp( arg3, "ran" ) )
	  value = ITEM_ANTI_RANGER;
	if (!str_cmp( arg3, "paladin" ) || !str_cmp( arg3, "pal" ) )
	  value = ITEM_ANTI_PALADIN;
	if (!str_cmp( arg3, "bard" ) || !str_cmp( arg3, "brd" ) )
	  value = ITEM_ANTI_BARD;
	if (!str_cmp( arg3, "vampire" ) || !str_cmp( arg3, "vam" ) )
	  value = ITEM_ANTI_VAMP;
	if (!str_cmp( arg3, "necromancer" ) || !str_cmp( arg3, "nec" ) )
	  value = ITEM_ANTI_NECRO;
	if (!str_cmp( arg3, "werewolf" ) || !str_cmp( arg3, "wwf" ) )
	  value = ITEM_ANTI_WWF;
	if (!str_cmp( arg3, "monk" ) || !str_cmp( arg3, "mnk" ) )
	  value = ITEM_ANTI_MONK;
	if ( value == 0 || !str_cmp( arg3, "none" ) )
	{
	   obj->anti_class_flags = 0;
	   send_to_char(AT_WHITE,"Ok.\n\r", ch );
	   return;
	}
	if ( 0xFFFFFFFF & value )
	{
	  if (value == 0)
	    obj->anti_class_flags = 0;
	   else
	    obj->anti_class_flags ^= value;
	  send_to_char(AT_WHITE, "Ok.\n\r", ch );
	  return;
	}
	else
	{
	  send_to_char(AT_WHITE, "Invalid bit.\n\r", ch );
	  return;
	}
    }
    if ( !str_cmp( arg2, "antirace" ) )
    {
	if (!str_cmp( arg3, "human" ) || !str_cmp( arg3, "hum" ) )
	  value = ITEM_ANTI_HUMAN;
	if (!str_cmp( arg3, "elf" ) )
	  value = ITEM_ANTI_ELF;
	if (!str_cmp( arg3, "dwarf" ) || !str_cmp( arg3, "dwa" ) )
	  value = ITEM_ANTI_DWARF;
	if (!str_cmp( arg3, "pixie" ) || !str_cmp( arg3, "pix" ) )
	  value = ITEM_ANTI_PIXIE;
	if (!str_cmp( arg3, "halfling" ) || !str_cmp( arg3, "hlf" ) )
	  value = ITEM_ANTI_HALFLING;
	if (!str_cmp( arg3, "drow" ) || !str_cmp( arg3, "drw" ) )
	  value = ITEM_ANTI_DROW;
	if (!str_cmp( arg3, "elder" ) || !str_cmp( arg3, "eld" ) )
	  value = ITEM_ANTI_ELDER;
	if (!str_cmp( arg3, "ogre" ) || !str_cmp( arg3, "ogr" ) )
	  value = ITEM_ANTI_OGRE;
	if (!str_cmp( arg3, "lizardman" ) || !str_cmp( arg3, "liz" ) )
	  value = ITEM_ANTI_LIZARDMAN;
	if (!str_cmp( arg3, "demon" ) || !str_cmp( arg3, "dem" ) )
	  value = ITEM_ANTI_DEMON;
	if (!str_cmp( arg3, "ghoul" ) || !str_cmp( arg3, "ghl" ) )
	  value = ITEM_ANTI_GHOUL;
	if (!str_cmp( arg3, "illithid" ) || !str_cmp( arg3, "ill" ) )
	  value = ITEM_ANTI_ILLITHID;
	if (!str_cmp( arg3, "minotaur" ) || !str_cmp( arg3, "min" ) )
	  value = ITEM_ANTI_MINOTAUR;
	if (!str_cmp( arg3, "troll" ) || !str_cmp( arg3, "tro" ) )
	  value = ITEM_ANTI_TROLL;
	if (!str_cmp( arg3, "shadow" ) || !str_cmp( arg3, "shd" ) )
	  value = ITEM_ANTI_SHADOW;
	if (!str_cmp( arg3, "tabaxi" ) || !str_cmp( arg3, "tbx" ) )
	  value = ITEM_ANTI_TABAXI;

	if ( value == 0 || !str_cmp( arg3, "none" ) )
	{
	   obj->anti_race_flags = 0;
	   send_to_char(AT_WHITE,"Ok.\n\r", ch );
	   return;
	}
	if ( 0xFFFFFFFF & value )
	{
	  if (value == 0)
	    obj->anti_race_flags = 0;
	   else
	    obj->anti_race_flags ^= value;
	  send_to_char(AT_WHITE, "Ok.\n\r", ch );
	  return;
	}
	else
	{
	  send_to_char(AT_WHITE, "Invalid bit.\n\r", ch );
	  return;
	}
    }

    if ( !str_cmp( arg2, "wear" ) )
    {
      if (!str_cmp( arg3, "take" ) )
       value = ITEM_TAKE;
      if (!str_cmp( arg3, "finger" ) )
       value = ITEM_WEAR_FINGER;
      if (!str_cmp( arg3, "neck" ) )
       value = ITEM_WEAR_NECK;
      if (!str_cmp( arg3, "body" ) )
       value = ITEM_WEAR_BODY;
      if (!str_cmp( arg3, "head" ) )
       value = ITEM_WEAR_HEAD;
      if (!str_cmp( arg3, "legs" ) )
       value = ITEM_WEAR_LEGS;
      if (!str_cmp( arg3, "feet" ) )
       value = ITEM_WEAR_FEET;
      if (!str_cmp( arg3, "hands" ) )
       value = ITEM_WEAR_HANDS;
      if (!str_cmp( arg3, "arms" ) )
       value = ITEM_WEAR_ARMS;
      if (!str_cmp( arg3, "shield" ) )
       value = ITEM_WEAR_SHIELD;
      if (!str_cmp( arg3, "about" ) )
       value = ITEM_WEAR_ABOUT;
      if (!str_cmp( arg3, "waist" ) )
       value = ITEM_WEAR_WAIST;
      if (!str_cmp( arg3, "wrist" ) )
       value = ITEM_WEAR_WRIST;
      if (!str_cmp( arg3, "wield" ) )
       value = ITEM_WIELD;
      if (!str_cmp( arg3, "hold" ) )
       value = ITEM_HOLD;
      if (!str_cmp( arg3, "orbit" ) )
       value = ITEM_WEAR_ORBIT;
      if (!str_cmp( arg3, "face" ) )
       value = ITEM_WEAR_FACE;
      if (!str_cmp( arg3, "contact" ) )
       value = ITEM_WEAR_CONTACT;
      if (!str_cmp( arg3, "prototype" ) )
       value = ITEM_PROTOTYPE;
      if (!str_cmp( arg3, "ears" ) )
       value = ITEM_WEAR_EARS;
      if (!str_cmp( arg3, "ankle" ) )
       value = ITEM_WEAR_ANKLE;

      if ( value == 0 || !str_cmp( arg3, "none" ) )
       {
         obj->wear_flags = 0;
         send_to_char(AT_WHITE,"Ok.\n\r", ch);
         return;
       }
 
      obj->wear_flags ^= value;
      send_to_char(AT_WHITE, "Ok.\n\r", ch );
      return;
    }

    if ( !str_cmp( arg2, "level" ) )
    {
	obj->level = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
	
    if ( !str_cmp( arg2, "weight" ) )
    {
	obj->weight = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "cost" ) )
    {
#ifdef NEW_MONEY

	if ( is_number( arg4 ) )
	{
	  if ( !str_cmp( arg3, "gold" ) )
	    obj->cost.gold = atoi( arg4 );
	  else if ( !str_cmp( arg3, "silver" ) )
	    obj->cost.silver = atoi( arg4 );
	  else if ( !str_cmp( arg3, "copper" ) )
	    obj->cost.copper = atoi( arg4 );
	  else
	  {
	    send_to_char( AT_WHITE, "Invaild currency type.\n\r", ch );
	    send_to_char( AT_WHITE, "&WSyntax: oset &Robject <cost> <currency_type> <amount>\n\r",
	        	ch );
	    return;
	  }
	}
	else
	{
	    send_to_char( AT_WHITE, "Invalid amount.\n\r", ch );
	    send_to_char( AT_WHITE, "&WSyntax: oset &Robject <cost> <currency_type> <amount>\n\r",
	 		ch );
	    return;
	}
#else
	obj->cost = value;
#endif
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "timer" ) )
    {
	obj->timer = value;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }
	
    if ( !str_cmp( arg2, "name" ) )
    {
        if ( longstring( ch, arg3 ) )
	    return;

	free_string( obj->name );
	obj->name = str_dup( arg3 );
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "short" ) )
    {
        if ( longstring( ch, arg3 ) )
	    return;

	free_string( obj->short_descr );
	obj->short_descr = str_dup( arg3 );
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "long" ) )
    {
        if ( longstring( ch, arg3 ) )
	    return;

	free_string( obj->description );
	obj->description = str_dup( arg3 );
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "ed" ) )
    {
	EXTRA_DESCR_DATA *ed;

	argument = one_argument( argument, arg3 );
	argument = one_argument( argument, arg4 );
	if ( arg4[0] == '\0' )
	{
	    send_to_char(AT_WHITE, "Syntax: oset <object> ed <keyword> <string>\n\r",
		ch );
	    return;
	}

	if ( !extra_descr_free )
	{
	    ed			= alloc_perm( sizeof( *ed ) );
	}
	else
	{
	    ed			= extra_descr_free;
	    extra_descr_free	= extra_descr_free->next;
	}

	ed->keyword		= str_dup( arg3     );
	ed->description		= str_dup( argument );
	ed->deleted             = FALSE;
	ed->next		= obj->extra_descr;
	obj->extra_descr	= ed;
	send_to_char(AT_WHITE, "Ok.\n\r", ch );
	return;
    }

    if ( !str_cmp( arg2, "ac_type" ) )
    {
	if ( arg3 == '\0' || !is_number( arg3 ) )
	{
	    send_to_char(AT_WHITE, "Syntax: oset ac_type [type #]\n\r", ch );
	    return;
	}

	obj->ac_type = value;

	send_to_char(AT_WHITE, "Invoke type set.\n\r", ch);
	return ;
    }

    if ( !str_cmp( arg2, "ac_vnum" ) )
    {
	if ( arg3 == '\0' || !is_number( arg3 ) )
	{
	    send_to_char(AT_WHITE, "Syntax: oset ac_vnum [ # ]\n\r", ch );
	    return;
	}
	obj->ac_vnum = value;
	send_to_char(AT_WHITE, "Invoke vnum set.\n\r", ch);
	return;
    }

    if ( !str_cmp( arg2, "ac_v1" ) )
    {
       if ( arg3 == '\0' || !is_number( arg3 ) )
       {
	   send_to_char(AT_WHITE, "Syntax: oset ac_v1 [ current charges ]\n\r", ch );
	   return ;
       }

      obj->ac_charge[0] = value;

      send_to_char(AT_WHITE, "Current charge set.\n\r", ch);
      return ;
    }

    if ( !str_cmp( arg2, "ac_v2" ) )
    {
	if ( arg3 == '\0' || !is_number( arg3 ) )
	{
	    send_to_char(AT_WHITE, "Syntax: oset ac_v2 [ max charges (-1 unlimited) ]\n\r", ch );
	    return ;
	}

	obj->ac_charge[1] = value;

	send_to_char(AT_WHITE, "Max Charge set.\n\r", ch);
	return ;
    }


    if ( !str_cmp( arg2, "ac_setspell" ) )
    {
	int            spn;

	spn = skill_lookup( arg3 );

	if ( ( arg3 == '\0' ) || ( spn == -1 ) )
	{
	    send_to_char(AT_WHITE, "Syntax: oset ac_setspell [ valid spell name ]\n\r", ch );
	    return ;
	}

        free_string( obj->ac_spell );
	obj->ac_spell = str_dup(skill_table[spn].name);

	send_to_char(AT_WHITE, "Spell set.\n\r", ch);
	return ;
    }


    /*
     * Generate usage message.
     */
    do_oset( ch, "" );
    return;
}



void do_rset( CHAR_DATA *ch, char *argument )
{
    ROOM_INDEX_DATA *location;
    char             arg1 [ MAX_INPUT_LENGTH ];
    char             arg2 [ MAX_INPUT_LENGTH ];
    char             arg3 [ MAX_INPUT_LENGTH ];
    int              value;

    smash_tilde( argument );
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    strcpy( arg3, argument );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Syntax: rset <location> <field> value\n\r",	ch );
	send_to_char(AT_WHITE, "\n\r",						ch );
	send_to_char(AT_WHITE, "Field being one of:\n\r",			ch );
	send_to_char(AT_WHITE, "  flags sector\n\r",				ch );
	return;
    }

    if ( !( location = find_location( ch, arg1 ) ) )
    {
	send_to_char(AT_WHITE, "No such location.\n\r", ch );
	return;
    }

    /*
     * Snarf the value.
     */
    if ( !is_number( arg3 ) )
    {
	send_to_char(AT_WHITE, "Value must be numeric.\n\r", ch );
	return;
    }
    value = atoi( arg3 );

    /*
     * Set something.
     */
    if ( !str_cmp( arg2, "flags" ) )
    {
	location->room_flags	= value;
	return;
    }

    if ( !str_cmp( arg2, "sector" ) )
    {
	location->sector_type	= value;
	return;
    }

    /*
     * Generate usage message.
     */
    do_rset( ch, "" );
    return;
}


char *con_type_name( int connected )
{
  if ( connected == CON_PLAYING ) return "Playing";
  if ( connected == CON_GET_NAME ) return "Get Name";
  if ( connected == CON_GET_OLD_PASSWORD ) return "Old PW";
  if ( connected == CON_CONFIRM_NEW_NAME ) return "Name Conf";
  if ( connected == CON_GET_NEW_PASSWORD ) return "New PW";
  if ( connected == CON_CONFIRM_NEW_PASSWORD ) return "PW Conf";
  if ( connected == CON_GET_NEW_SEX ) return "New Sex";
  if ( connected == CON_GET_NEW_CLASS ) return "New Class";
  if ( connected == CON_GET_2ND_CLASS ) return "2nd Class";
  if ( connected == CON_CONFIRM_2ND_CLASS ) return "2nd Class Conf";
  if ( connected == CON_GET_3RD_CLASS ) return "3rd Class";
  if ( connected == CON_CONFIRM_3RD_CLASS ) return "3rd Class Conf";
  if ( connected == CON_WANT_MULTI ) return "Multi Conf";
  if ( connected == CON_WANT_MULTI_2 ) return "Multi 2 Conf";
  if ( connected == CON_READ_MOTD ) return "Read MOTD";
  if ( connected == CON_GET_NEW_RACE ) return "New Race";
  if ( connected == CON_CONFIRM_RACE ) return "Race Conf";
  if ( connected == CON_CONFIRM_CLASS ) return "Class Conf";
  if ( connected == CON_GET_ANSI ) return "Get ANSI";
  if ( connected == CON_AUTHORIZE_NAME ) return "Authorize";
  if ( connected == CON_AUTHORIZE_NAME1 ) return "Auth One";
  if ( connected == CON_AUTHORIZE_NAME2 ) return "Auth Two";
  if ( connected == CON_AUTHORIZE_NAME3 ) return "Auth Three";
  if ( connected == CON_AUTHORIZE_LOGOUT ) return "Auth Logout";
  if ( connected == CON_CHATTING ) return "Chatting";
  if ( connected == CON_CHECK_AUTHORIZE ) return "Checking Authorize System";
  return "Unknown";
}

void do_users( CHAR_DATA *ch, char *argument )
{
    DESCRIPTOR_DATA *d;
    char            buf  [ MAX_STRING_LENGTH ];
    int             count;
    char	    arg [ MAX_INPUT_LENGTH ];
    
    argument = one_argument( argument, arg );

    count	= 0;
    buf[0]	= '\0';
    strcpy( buf, "[Desc Connected  ] Name&W!&BUser&W@&GHost&R\n\r" );

    if ( arg[0] == '\0' )
    {
    for ( d = descriptor_list; d; d = d->next )
    {
	if ( d->character && can_see( ch, d->character ) )
	{
	    count++;
	    sprintf( buf + strlen(buf), "[%4d %-11s] %s&W!&B%s&W@&G%s&R\n\r",
		    d->descriptor,
		    con_type_name(d->connected),
		    d->original  ? d->original->name  :
		    d->character ? d->character->name : "(none)",
		    d->user ? d->user : "(none)",
		    d->host );
	}
    }
    }
    else   /* To be able to do "user <name>" -Angi */
    {
     for ( d = descriptor_list; d; d = d->next )
     {
      if ( d->character && can_see( ch, d->character ) )
      {
        if ( !str_cmp( arg, d->original ? d->original->name : d->character
             ? d->character->name : "(none)" ) )
        {
            count++;
            sprintf( buf + strlen(buf), "[%4d %-11s] %s&W!&B%s&W@&G%s&R\n\r",
                    d->descriptor,
                    con_type_name(d->connected),
                    d->original  ? d->original->name  :
                    d->character ? d->character->name : "(none)",
                    d->user ? d->user : "(none)",
                    d->host ); 
        }
      }
     }
    }
    sprintf( buf+strlen(buf), "%d user%s\n\r", count, count == 1 ? "" : "s" );
    send_to_char(AT_RED, buf, ch );
    return;
}



/*
 * Thanks to Grodyn for pointing out bugs in this function.
 */
void do_force( CHAR_DATA *ch, char *argument )
{
    char       arg [ MAX_INPUT_LENGTH ];
    char       arg1[ MAX_INPUT_LENGTH ];
    int        trust;
    int        cmd;
    int        llvlr = 0;
    int        hlvlr = L_IMP;

    argument = one_argument( argument, arg );
    if ( is_number( arg ) )
    {
      llvlr = atoi( arg );
      argument = one_argument( argument, arg1 );
      if ( is_number( arg1 ) )
        hlvlr = atoi( arg1 );
    }

    if ( arg[0] == '\0' || argument[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Force whom to do what?\n\r", ch );
	return;
    }

    /*
     * Look for command in command table.
     */
    trust = get_trust( ch );
    for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
    {
	if ( argument[0] == cmd_table[cmd].name[0]
	    && !str_prefix( argument, cmd_table[cmd].name )
	    && ( cmd_table[cmd].level > trust ) )
	{
	  send_to_char(AT_WHITE, "You can't even do that yourself!\n\r", ch );
	  return;
	}
    }

    if ( !str_cmp( arg, "all" ) || is_number( arg ) )
    {
	CHAR_DATA *vch;

	for ( vch = char_list; vch; vch = vch->next )
	{
	    if ( vch->deleted )
	        continue;

	    if ( !IS_NPC( vch ) && get_trust( vch ) < get_trust( ch ) 
	      && ( vch->level >= llvlr && vch->level <= hlvlr ) )
	    {
	      if ( !is_number( arg ) || ( is_number( arg ) && is_number( arg1 ) ) )
	      {
		act(AT_RED, "$n forces you to '$t'.", ch, argument, vch, TO_VICT );
		interpret( vch, argument );
		continue;
              }
              if ( !is_number( arg1 ) )
              {
                sprintf( log_buf, "%s %s", arg1, argument );
                act( AT_RED, "$n forces you to '$t'.", ch, log_buf, vch, TO_VICT );
                interpret( vch, log_buf );
              }
              
	    }
	}
    }
    else
    {
	CHAR_DATA *victim;

	if ( !( victim = get_char_world( ch, arg ) ) )
	{
	    send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
	    return;
	}

	if ( victim == ch )
	{
	    send_to_char(AT_WHITE, "Aye aye, right away!\n\r", ch );
	    return;
	}

	if ( get_trust( victim ) >= get_trust( ch ) )
	{
	    send_to_char(AT_WHITE, "Do it yourself!\n\r", ch );
	    return;
	}
	if ( ch -> level < 113 )
		act(AT_RED, "$n forces you to '$t'.", ch, argument, victim, TO_VICT );
	interpret( victim, argument );
    }

    send_to_char(AT_WHITE, "Ok.\n\r", ch );
    return;
}

void do_cloak( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    int level;

    if ( IS_NPC(ch) )
        return;

    argument = one_argument( argument, arg );
    if ( arg && arg[0] != '\0' )
    {
        if ( !is_number( arg ) )
        {
           send_to_char( AT_WHITE, "Usage: cloak | cloak <level>\n\r", ch );
           return;
        }
        level = atoi( arg );
        if ( level < 2 || level > get_trust( ch ) )

        {
            send_to_char( AT_WHITE, "Invalid level.\n\r", ch );
            return;
        }
        ch->cloaked = level;
        sprintf( arg, "Cloak level set to %d.\n\r", level );
        send_to_char( AT_WHITE, arg, ch );
        return;
    }

    if ( ch->cloaked < 2 )
      ch->cloaked = ch->level;

    if ( IS_SET(ch->act, PLR_CLOAKED) )
    {
        REMOVE_BIT(ch->act, PLR_CLOAKED);
    act( AT_YELLOW, "$n is no longer cloaked.", ch, NULL, NULL, TO_ROOM );
        send_to_char( AT_WHITE, "You are no longer cloaked.\n\r", ch );
    }
    else
    {
        SET_BIT(ch->act, PLR_CLOAKED);
    act( AT_YELLOW, "$n cloaks $s presence.", ch, NULL, NULL, TO_ROOM );
        send_to_char( AT_WHITE, "You cloak your presence.\n\r", ch );
    }
    return;

}


void do_invis( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    int level; 

    if ( IS_NPC(ch) )
        return; 

    argument = one_argument( argument, arg ); 
    if ( arg && arg[0] != '\0' )
    {
        if ( !is_number( arg ) )
        {
           send_to_char( AT_WHITE, "Usage: invis | invis <level>\n\r", ch ); 
           return; 
        }
        level = atoi( arg ); 
        if ( level < 2 || level > get_trust( ch ) )
        {
            send_to_char( AT_WHITE, "Invalid level.\n\r", ch ); 
            return; 
        }
        ch->wizinvis = level; 
        sprintf( arg, "Wizinvis level set to %d.\n\r", level ); 
        send_to_char( AT_WHITE, arg, ch ); 
        return; 
    }

    if ( ch->wizinvis < 2 )
      ch->wizinvis = ch->level; 

    if ( IS_SET(ch->act, PLR_WIZINVIS) )
    {
        REMOVE_BIT(ch->act, PLR_WIZINVIS); 
    act( AT_YELLOW, "$n slowly fades into existence.", ch, NULL, NULL, TO_ROOM ); 
        send_to_char( AT_WHITE, "You slowly fade back into existence.\n\r", ch ); 
    }
    else
    {
        SET_BIT(ch->act, PLR_WIZINVIS); 
    act( AT_YELLOW, "$n slowly fades into thin air.", ch, NULL, NULL,
TO_ROOM ); 
        send_to_char( AT_WHITE, "You slowly vanish into thin air.\n\r", 
ch ); 
    }
    return; 
 
 
}



void do_holylight( CHAR_DATA *ch, char *argument )
{
    if ( IS_NPC( ch ) )
	return;

    if ( IS_SET( ch->act, PLR_HOLYLIGHT ) )
    {
	REMOVE_BIT( ch->act, PLR_HOLYLIGHT );
	send_to_char(AT_WHITE, "Holy light mode off.\n\r", ch );
    }
    else
    {
	SET_BIT(    ch->act, PLR_HOLYLIGHT );
	send_to_char(AT_WHITE, "Holy light mode on.\n\r", ch );
    }

    return;
}

/* Wizify and Wizbit sent in by M. B. King */

void do_wizify( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char       arg1 [ MAX_INPUT_LENGTH ];
  
    argument = one_argument( argument, arg1  );
    if ( arg1[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Syntax: wizify <name>\n\r" , ch );
	return;
    }
    if ( !( victim = get_char_world( ch, arg1 ) ) )
    {
	send_to_char(AT_WHITE, "They aren't here.\n\r" , ch );
	return;
    }
    if ( IS_NPC( victim ) )
    {
	send_to_char(AT_WHITE, "Not on mobs.\n\r", ch );
	return;
    }
    victim->wizbit = !victim->wizbit;
    if ( victim->wizbit ) 
    {
	act(AT_RED, "$N wizified.",         ch, NULL, victim, TO_CHAR );
	act(AT_RED, "$n has wizified you!", ch, NULL, victim, TO_VICT );
    }
    else
    {
	act(AT_RED, "$N dewizzed.",         ch, NULL, victim, TO_CHAR );
	act(AT_RED, "$n has dewizzed you!", ch, NULL, victim, TO_VICT ); 
    }

    do_save( victim, "");
    return;
}

/* Idea from Talen of Vego's do_where command */

void do_owhere( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA  *obj;
    OBJ_DATA  *in_obj;
    char       buf  [ MAX_STRING_LENGTH   ];
    char       arg  [ MAX_INPUT_LENGTH    ];
    int        obj_counter = 1;
    bool       found = FALSE;

    one_argument( argument, arg );

    if( arg[0] == '\0' )
    {
	send_to_char(AT_WHITE, "Syntax:  owhere <object>.\n\r", ch );
	return;
    }
    else
    {
	for ( obj = object_list; obj; obj = obj->next )
	{
	    if ( !can_see_obj( ch, obj ) || !is_name( ch, arg, obj->name ) )
	        continue;

	    found = TRUE;

	    for ( in_obj = obj; in_obj->in_obj;
		 in_obj = in_obj->in_obj )
	        ;

	    if ( in_obj->carried_by )
	    {
	        if ( !can_see( ch, in_obj->carried_by ) )
		    continue;
		sprintf( buf, "[%2d] %s carried by %s at [%4d].\n\r",
			obj_counter, obj->short_descr,
			PERS( in_obj->carried_by, ch ),
			in_obj->carried_by->in_room->vnum );
	    }
	    else if ( in_obj->stored_by )
	    {
	      sprintf( buf, "[%2d] %s in %s's storage box.\n\r",
		      obj_counter, obj->short_descr,
		      PERS( in_obj->stored_by, ch ) );
	    }
	    else
	    {
		sprintf( buf, "[%2d] %s in %s at [%4d].\n\r", obj_counter,
			obj->short_descr, ( !in_obj->in_room ) ?
			"somewhere" : in_obj->in_room->name,
			( !in_obj->in_room ) ?
			0 : in_obj->in_room->vnum );
	    }
	    
	    obj_counter++;
	    buf[0] = UPPER( buf[0] );
	    send_to_char(AT_GREEN, buf, ch);
	}

    }

    if ( !found )
	send_to_char(AT_WHITE,
		"Nothing like that in hell, earth, or heaven.\n\r" , ch );

    return;


}

void do_numlock( CHAR_DATA *ch, char *argument )  /*By Globi*/
{
	   char       buf  [ MAX_STRING_LENGTH ];
	   char       arg1 [ MAX_INPUT_LENGTH  ];
    extern int        numlock;
           int        temp;

    argument = one_argument( argument, arg1 );
    temp = atoi( arg1 );

    if ( arg1[0] == '\0' ) /* Prints out the current value */
    {
	sprintf( buf, "Current numlock setting is:  %d.\n\r", numlock );
	send_to_char(AT_RED, buf, ch );
	return;
    }

    if ( ( temp < 0 ) || ( temp > LEVEL_HERO ) )
    {
	sprintf( buf, "Level must be between 0 and %d.\n\r", LEVEL_HERO );
	send_to_char(AT_WHITE, buf, ch );
	return;
    }

    numlock = temp;  /* Only set numlock if arg supplied and within range */

    if ( numlock != 0 )
    {
	sprintf( buf, "Game numlocked to levels %d and below.\n\r", numlock );
	send_to_char(AT_RED, buf, ch );
    }
    else
        send_to_char(AT_RED, "Game now open to all levels.\n\r", ch );

    return;

}

void do_newlock( CHAR_DATA *ch, char *argument )
{
    extern int        numlock;
           char       buf [ MAX_STRING_LENGTH ];

    if ( numlock != 0 && get_trust( ch ) < L_SEN )
    {
	send_to_char(AT_WHITE, "You may not change the current numlock setting\n\r",
		     ch );
	sprintf( buf, "Game numlocked to levels %d and below.\n\r", numlock );
	send_to_char(AT_RED, buf, ch );
	return;
    }

    if ( numlock != 0 )
    {
	sprintf( buf, "Game numlocked to levels %d and below.\n\r", numlock );
	send_to_char(AT_RED, buf, ch );
	send_to_char(AT_RED, "Changing to: ", ch );
    }

    numlock = 1;
    send_to_char(AT_RED, "Game locked to new characters.\n\r", ch );
    wiznet( "$N locks out new characters.", ch, NULL, 0, 0, 0 );
    return;

}

bool sreset = TRUE; /*Is it changable anymore?*/
void do_sstime( CHAR_DATA *ch, char *argument )
{
    extern char      *down_time;
    extern char      *warning1;
    extern char      *warning2;
    extern int        stype;
           char       buf  [ MAX_STRING_LENGTH ];
           char       arg1 [ MAX_INPUT_LENGTH  ];
           char       arg2 [ MAX_INPUT_LENGTH  ];

    if ( !sreset )
    {
      sprintf(buf,"%s locked!\n\r\n\r", (stype == 0 ? "Reboot" : "Shutdown"));
      send_to_char(AT_WHITE+AT_BLINK, buf, ch);
      sprintf(buf,
	      "1st warning:  %s\n\r2nd warning:  %s\n\r   Downtime:  %s\n\r",
	      warning1, warning2, down_time );
      send_to_char(AT_RED, buf, ch);
      sprintf(buf, "Sstime type: %s.\n\r", (stype == 0 ? "reboot" : "shutdown"));
      send_to_char(AT_RED, buf, ch);
      return;
    }

    smash_tilde( argument );
    argument = one_argument( argument, arg1 );
    strcpy ( arg2, argument );

    if ( arg1[0] == '\0' || arg2[0] == '\0' ||
       ( strlen( arg2 ) != 8 && str_cmp(arg2, "*") &&
	str_cmp(arg1, "type") ) )
	
      {
	send_to_char(AT_WHITE, "Syntax: sstime <field> <value>\n\r",               ch );
	send_to_char(AT_WHITE, "\n\r",                                             ch );
	send_to_char(AT_WHITE, "Field being one of:\n\r",                          ch );
	send_to_char(AT_WHITE, "  downtime  1warning  2warning  type\n\r",         ch );
	send_to_char(AT_WHITE, "\n\r",                                             ch );
	send_to_char(AT_WHITE, "Value being format of:\n\r",                       ch );
	send_to_char(AT_WHITE, "  hh:mm:ss  (military time) or  *  (for off)\n\r", ch );
	send_to_char(AT_WHITE, "\n\r",                                             ch );
	sprintf( buf,
		"1st warning:  %s\n\r2nd warning:  %s\n\r   Downtime:  %s\n\r",
		warning1, warning2, down_time );
	send_to_char(AT_RED, buf,                                                ch );
	sprintf( buf, "Sstime type: %s.\n\r", ( stype == 0 ? "reboot" : "shutdown" ) );
	send_to_char(AT_RED, buf, ch );
	return;
      }

    /* Set something */

    if ( !str_infix( arg1, "downtime" ) )
      {
	free_string( down_time );
	down_time = str_dup( arg2 );
	sprintf( buf, "Downtime is now set to:  %s\n\r", down_time );
	send_to_char(AT_RED, buf, ch );
	return;
      }
    if ( !str_infix( arg1, "1warning" ) )
      {
	free_string( warning1 );
	warning1 = str_dup( arg2 );
	sprintf( buf, "First warning will be given at:  %s\n\r", warning1 );
	send_to_char(AT_RED, buf, ch );
	return;
      }
    if ( !str_infix( arg1, "2warning" ) )
      {
	free_string( warning2 );
	warning2 = str_dup( arg2 );
	sprintf( buf, "Second warning will be given at:  %s\n\r", warning2 );
	send_to_char(AT_RED, buf, ch );
	return;
      }
    if ( !str_infix( arg1, "type" ) )
    {
      if ( is_number( arg2 ) )
        stype = atoi( arg2 );
      else
       {
         if ( !str_cmp( arg2, "reboot" ) )
           stype = 0;
         else if ( !str_cmp( arg2, "shutdown" ) )
           stype = 1;
         else
           {
             send_to_char( AT_RED, "Invalid sstime type.\n\r", ch );
             return;
           }
       }
       sprintf( buf, "SStype set to: %s.\n\r", ( stype == 0 ? "reboot"
          : "shutdown" ) );
       send_to_char( AT_RED, buf, ch );
       return;
    }

    /* Generate usage mesage */

    do_sstime( ch, "" );
    return;

}


void do_qset( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  char buf[MAX_STRING_LENGTH];
  char arg1[MAX_STRING_LENGTH];
  char arg2[MAX_STRING_LENGTH];
  int value = 0;
  
  if (IS_NPC( ch ) )
    return;
  
  smash_tilde( argument );
  argument = one_argument( argument, arg1 );
  strcpy( arg2, argument );
  value = atoi( arg2 );
  
  if ( arg1[0] == '\0' )
  {
    send_to_char( AT_WHITE, "&pSyntax: qset quest\n\r", ch );
    send_to_char( AT_WHITE, "&pSyntax: qset qmin level\n\r", ch );
    send_to_char( AT_WHITE, "&pSyntax: qset qmax level\n\r", ch );
    send_to_char( AT_WHITE, "&pSyntax: qset player\n\r", ch );
    if (quest)
      send_to_char( AT_WHITE, "There is currently a quest.\n\r", ch );
     else
      send_to_char( AT_WHITE, "There is currently no quest.\n\r", ch );
    sprintf( buf, "&R[&B%3d&R]    &pCurrent Qmin\n\r",  qmin );
    send_to_char( AT_WHITE, buf, ch );
    sprintf( buf, "&R[&B%3d&R]         &pCurrent Qmax\n\r", qmax );
    send_to_char( AT_WHITE, buf, ch );
    return;
  }
  
  if ( !str_cmp( arg1, "quest" ) || !str_cmp( arg1, "QUEST" ) )
  {
    if (quest)
      {
        CHAR_DATA *qch;
        
        quest = FALSE;
        qmin = 0;
        qmax = 100;
        send_to_char( AT_WHITE, "Ok, there is no longer a quest running.\n\r", ch );
        sprintf( buf, "The current quest has now ended." );
	do_echo( ch, buf );
	for ( qch = char_list; qch; qch = qch->next )
	{
	 if (!IS_NPC( qch ) )
	 {
	   if ( IS_SET( qch->act, PLR_QUEST ) )
	     qch->act ^= PLR_QUEST;
	 }
        }
        return;
      }
     else
      {
        quest = TRUE;
        send_to_char( AT_WHITE, "Ok, you have started a quest.\n\r", ch );
        sprintf( buf, "%s has just started a quest.", ch->name );
        do_echo( ch, buf );
        return;
      }
  }
  
  if ( !(victim = get_char_world( ch, arg1 ) ) )
  {
  
    if ( arg2[0] == '\0' ) 
    {
      send_to_char( AT_WHITE, "You must include a level.\n\r", ch );
      return;
    }
  
    if (!is_number( arg2 ) )
    {
      send_to_char( AT_WHITE, "Level must be a number.\n\r", ch );
      return;
    }
 
    if ( ( value < 0 ) || ( value > L_IMP ) )
    {
      send_to_char( AT_WHITE, "Invalid level.\n\r", ch );
      return;
    }
  
    if ( !str_cmp( arg1, "qmin" ) || !str_cmp( arg1, "QMIN" ) )
    {
      qmin = value;
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      return;
    }
  
    if ( !str_cmp( arg1, "qmax" ) || !str_cmp( arg1, "QMAX" ) )
    { 
      qmax = value;
      send_to_char( AT_WHITE, "Ok.\n\r", ch );
      return;
    } 
    return;
  }
  else
  {
    if (!IS_NPC( victim ) )
    {
      REMOVE_BIT( victim->act, PLR_QUEST );
      send_to_char( AT_WHITE, "Quest flag removed.\n\r", ch );
      return;
    }
   else
    {
      send_to_char( AT_WHITE, "Not on PCs.\n\r", ch );
      return;
    }
  }
  return;
}  

void do_pload( CHAR_DATA *ch, char *argument )
{
  char buffer[MAX_STRING_LENGTH];
  char arg[MAX_INPUT_LENGTH];
  char arg2[MAX_INPUT_LENGTH];
  DESCRIPTOR_DATA d;
  CHAR_DATA *vch = NULL;
  int  location;

  argument = one_argument( argument, arg );
  argument = one_argument( argument, arg2 );
  if ( arg[0] == '\0' )
  {
    send_to_char( AT_WHITE, "Load which player?\n\r", ch );
    return;
  }

  for ( vch = char_list; vch != NULL; vch = vch->next )
  {
    if ( vch->deleted )
      continue;
    if ( !IS_NPC( vch ) && !str_cmp( arg, vch->name ) )
    {
      send_to_char( AT_WHITE, "Character is already playing.\n\r", ch );
      return;
    }
  }

  vch = NULL;

  if ( !load_char_obj( &d, arg ) && str_cmp( arg2, "newname" ) )
  {
    free_char( d.character );
    send_to_char( AT_WHITE, "Player does not exist.\n\r", ch );
    return;
  }
  vch = d.character;
  d.character = NULL;
  vch->desc = NULL;
  vch->next = char_list;
  char_list = vch;
  location  = vch->in_room->vnum;
  char_to_room( vch, ch->in_room );
  {
    char buf[MAX_INPUT_LENGTH];

    strcpy( buf, vch->name );
    free_string( vch->name );
    vch->name = str_dup( capitalize( buf ) );
  }
  SET_BIT( vch->affected_by2, AFF_PLOADED );
  sprintf( buffer, "Player loaded.  Was in room vnum %d.\n\r", location );
  send_to_char( AT_WHITE, buffer , ch );
  return;
}

/* -- Altrag */
void do_sstat( CHAR_DATA *ch, char *argument )
{
  char spbuf[MAX_STRING_LENGTH*2];
  char skbuf[MAX_STRING_LENGTH];
  char wzbuf[MAX_STRING_LENGTH];
  char arg[MAX_INPUT_LENGTH];
  char buf[MAX_STRING_LENGTH];
  int sn;
  int spcol = 0;
  int skcol = 0;
  int wzcol = 0;
  CHAR_DATA *victim;

  argument = one_argument( argument, arg ); 

  if ( !( victim = get_char_world( ch, arg ) ) )
  {
    send_to_char(AT_WHITE, "They aren't here.\n\r", ch );
    return;
  }

  if ( IS_NPC( victim ) )
  {
    send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
    return;
  }

strcpy(spbuf,"\n\r");
strcpy(skbuf,"\n\r");
strcpy(wzbuf,"\n\r");
/*  spbuf[0] = '\n'; spbuf[1] = '\r'; spbuf[2] = '\0';
  skbuf[0] = '\n'; skbuf[1] = '\r'; skbuf[2] = '\0';
  wzbuf[0] = '\n'; wzbuf[1] = '\r'; wzbuf[2] = '\0';*/

  /* Use 1 to skip the reserved sn -- Altrag */
  for ( sn = 1; skill_table[sn].name[0] != '\0'; sn++ )
  {
    if ( victim->pcdata->learned[sn] <= 0 &&
	 !can_use_skpell( ch, sn ) )
      continue;
    sprintf( buf, "%-18s %3d%%  ", skill_table[sn].name,
	     victim->pcdata->learned[sn] );
    if ( skill_table[sn].spell_fun != spell_null )
    {
      strcat( spbuf, buf );
      if ( ++spcol % 3 == 0 )
	strcat( spbuf, "\n\r" );
      continue;
    }

    if ( skill_table[sn].minimum_position == POS_DEAD )
    {
      strcat( wzbuf, buf );
      if ( ++wzcol % 3 == 0 )
	strcat( wzbuf, "\n\r" );
      continue;
    }

    strcat( skbuf, buf );
    if ( ++skcol % 3 == 0 )
      strcat( skbuf, "\n\r" );
  }
  if ( spcol % 3 != 0 )
    strcat( spbuf, "\n\r" );
  if ( skcol % 3 != 0 )
    strcat( skbuf, "\n\r" );
  if ( wzcol % 3 != 0 )
    strcat( wzbuf, "\n\r" );
  send_to_char(AT_PINK,
"-----------------=================[Spells]=================-----------------",
	       ch );
  send_to_char(AT_PINK, spbuf, ch );
  send_to_char(AT_PURPLE,
"-----------------=================[Skills]=================-----------------",
	       ch );
  send_to_char(AT_PURPLE, skbuf, ch );
  send_to_char(AT_GREEN,
"-----------------==============[Wiz Commands]==============-----------------",
	       ch );
  send_to_char(AT_GREEN, wzbuf, ch );
}

void do_qecho( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *qch;

  strcat( argument, "\n\r" );
  
  for ( qch = char_list; qch; qch = qch->next )
  {
   if ( !IS_NPC( qch ) )
    if ( IS_SET( qch->act, PLR_QUEST ) )
    {
      send_to_char( AT_WHITE, argument, qch );
    }
  }
  return;
}


void do_mpcommands( CHAR_DATA *ch, char *argument )
{
  char buf[ MAX_STRING_LENGTH ];
  int cmd;
  int col;
  
  col = 0;
  for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
  {
     if ( !str_prefix( "mp", cmd_table[cmd].name ) )
     {
     if ( str_cmp( cmd_table[cmd].name, "mpcommands" ) )
     {
       sprintf( buf, "%-16s", cmd_table[cmd].name );
       if ( ++col % 5 == 0 )
          strcat( buf, "\n\r" );
       send_to_char(C_DEFAULT, buf, ch);
     }
     }
  }
  
  if ( col % 5 != 0 )
     send_to_char( C_DEFAULT, "\n\r", ch );
     
  return;
}

const char * log_list [] = {"normal", "always", "never", "build"};
void do_restrict( CHAR_DATA *ch, char *argument )
{
  char arg[MAX_STRING_LENGTH];
  char arg1[MAX_STRING_LENGTH];
  char arg2[MAX_STRING_LENGTH];
  int cmd;
  int lvl;
  bool log = FALSE;
  
  argument = one_argument( argument, arg );
  argument = one_argument( argument, arg1 );
  argument = one_argument( argument, arg2 );
  
  if ( arg[0] != '\0' && arg1[0] == '\0' )
  {
    char buf[MAX_STRING_LENGTH];

    for ( cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ )
      if ( !str_prefix( cmd_table[cmd].name, arg ) )
	break;
    if ( cmd_table[cmd].name[0] == '\0' || cmd_table[cmd].level > get_trust(ch) )
    {
      do_restrict( ch, "" );
      return;
    }
    sprintf( buf, "Command '%s'.  Level %d.  Logged %s.\n\r",
	     cmd_table[cmd].name, cmd_table[cmd].level,
	     log_list[cmd_table[cmd].log] );
    send_to_char( AT_PURPLE, buf, ch );
    return;
  }

  if ( arg[0] == '\0' || arg1[0] == '\0' || ( !is_number( arg1 ) 
     && ( ( arg2[0] == '\0' ) || !is_number( arg2 ) ) ) )
  {
     send_to_char( AT_PURPLE, "Syntax: restrict [command] [level]\n\r", ch );
     send_to_char( AT_PURPLE, "Syntax: restrict [command] log [logtype]\n\r", ch );
     send_to_char( AT_PURPLE, "Syntax: restrict [command]\n\r\n\r",ch);
     send_to_char( AT_PURPLE, "Logtype being 0-4:\n\r", ch );
     send_to_char( AT_PURPLE, "0 - LOG_NEVER\n\r", ch);
     send_to_char( AT_PURPLE, "1 - LOG_ALWAYS (on God)\n\r", ch);
     send_to_char( AT_PURPLE, "2 - LOG_NORMAL (not logged)\n\r", ch );
     send_to_char( AT_PURPLE, "3 - LOG_BUILD  (logged on build)\n\r", ch );
     return;
  }
  
  if ( arg2[0] != '\0' )
  {
     if ( !str_cmp( "log", arg1 ) )
     {
       lvl = atoi( arg2 );
       log = TRUE;
    }
   else
    lvl = atoi( arg1 );
  }
else
  lvl = atoi( arg1 );
  
  if ( !str_cmp( "all", arg ) )
  {
    int col = 0;
    cmd = 1;
    lvl = 1;
    if ( is_number( arg1 ) )
      cmd = atoi( arg1 );
    if ( is_number( arg2 ) )
      lvl = atoi( arg2 );
      send_to_char( AT_WHITE, "\n\r", ch );
    for ( ; ( cmd <= lvl ) && ( cmd_table[cmd].name[0] != '\0' ); cmd++ )
    {
      if ( get_trust( ch ) >= cmd_table[cmd].level )
      {
        sprintf( log_buf, "%-3d &R%-12s &B(&Y%3d&B)   ", cmd, cmd_table[cmd].name, cmd_table[cmd].level );
        send_to_char( AT_WHITE, log_buf, ch );
      }
      if ( ++col % 3 == 0 )
        send_to_char( AT_WHITE, "\n\r", ch );
    }
    if ( col % 3 != 0 )
      send_to_char( AT_WHITE, "\n\r", ch );
    return;
  }
  
  if ( ( ( lvl < 0 || lvl > L_IMP || lvl > get_trust( ch ) )&& ( arg2[0] == '\0' ) )
   || ( ( arg2[0] != '\0' ) && ( lvl < 0 || lvl > 3 ) ) )
  {
     send_to_char( AT_WHITE, "Invalid level.\n\r", ch );
     return;
  }
  
  for ( cmd = 1; cmd_table[cmd].name != '\0'; cmd++ )
  {
    if ( !str_prefix( arg, cmd_table[cmd].name ) )
    {
      strcpy( arg, cmd_table[cmd].name );
      
      if ( cmd_table[cmd].level > get_trust( ch ) )
      {
        if (log)
        send_to_char( AT_WHITE, "You cannot change the log_type on a command which you do not have.\n\r", ch );
      else
        send_to_char( AT_WHITE, "You cannot restrict a command which you do not have.\n\r", ch );
        return;
      }
      if (log)
        cmd_table[cmd].log = lvl;
      else
      cmd_table[cmd].level = lvl;
      if (log)
        sprintf( log_buf, "%s changing log_type of %s to %d.",
         ch->name, arg, lvl );
      else
        sprintf( log_buf, "%s restricting %s to level %d.",
        ch->name, arg, lvl );
      log_string( log_buf, CHANNEL_GOD, ch->level - 1 );
      if (log)
        sprintf( log_buf, "You change the log_type of %s to %d.\n\r",
        arg, lvl );
      else
        sprintf( log_buf, "You restrict %s to level %d.\n\r",
        arg, lvl );
      send_to_char( AT_WHITE, log_buf, ch );
      break;
    }
    
  }
  if ( cmd_table[cmd].name == '\0' )
  {
     sprintf( log_buf, "There is no %s command.",
       arg );
     send_to_char( AT_WHITE, log_buf, ch );  
  }
  return;
}

void do_wrlist( CHAR_DATA *ch, char *argument )
{
  ROOM_INDEX_DATA *room;
  ROOM_INDEX_DATA *in_room;
  MOB_INDEX_DATA *mob;
  OBJ_INDEX_DATA *obj;
  MPROG_DATA *mprog;
  char arg[MAX_STRING_LENGTH];
  char arg1[MAX_STRING_LENGTH];
  char arg2[MAX_STRING_LENGTH];
  int uvnum;
  int lvnum;
  int MR = 32767;
  int type = -1;
  
  argument = one_argument( argument, arg );
  argument = one_argument( argument, arg1 );
  argument = one_argument( argument, arg2 );
  uvnum = ( is_number( arg2 ) ) ? atoi( arg2 ) : 0;
  lvnum = ( is_number( arg1 ) ) ? atoi( arg1 ) : 0;  

  if ( !str_cmp( arg, "o" ) )
    type = 2;
  if ( !str_cmp( arg, "m" ) )
    type = 1;
  if ( !str_cmp( arg, "r" ) )
    type = 0;
  if ( !str_cmp( arg, "p" ) )
    type = 3;

  if ( ( uvnum - lvnum ) > 200 )
  {
    send_to_char( AT_WHITE, "That range is too large.\n\r", ch );
    return;
  }
  
  if ( ( ( uvnum == 0 ) && ( lvnum == 0 ) ) || ( arg[0] == '\0' ) 
   || ( type == -1 ) )
  {
    send_to_char( AT_PURPLE, "Syntax: wrlist [type] [lvnum] [uvnum]\n\r", ch );
    return;
  }

  if ( uvnum > MR || uvnum < 1 || lvnum > MR || lvnum < 1 || lvnum > uvnum )
  {
    send_to_char( AT_WHITE, "Invalid level(s).\n\r", ch );
    return;
  }

  in_room = ch->in_room;  
  if ( type == 0 )
  {
    char_from_room( ch );
  }
  for ( MR = lvnum; MR <= uvnum; MR++ )
  {
    if ( type == 0 )
    {
      if ( ( room = get_room_index( MR ) ) )
      {
        sprintf( log_buf, "&R%-5d  &w%-20s\n\r", room->vnum, room->name );
        send_to_char( AT_WHITE, log_buf, ch );
        char_to_room( ch, room );
        do_resets( ch, "" );
        char_from_room( ch );
      }
    }
    if ( type == 2 )
    {
      if ( ( obj = get_obj_index( MR ) ) )
      {
        sprintf( log_buf, "&R%-5d  &w%-20s\n\r",  obj->vnum, obj->name );
        send_to_char( AT_WHITE, log_buf, ch );
      }
    }
    if ( type == 1 )
    {
      if ( ( mob = get_mob_index( MR ) ) )
      {
        sprintf( log_buf, "&R%-5d  &w%-20s\n\r", mob->vnum, mob->player_name );
        send_to_char( AT_WHITE, log_buf, ch );
        if ( mob->mobprogs )
          for ( mprog = mob->mobprogs; mprog; mprog = mprog->next )
          {
            sprintf( log_buf, "  :%s  %s\n\r", mprog_type_to_name( mprog->type ),
              mprog->arglist ? mprog->arglist : "(None)" );
            send_to_char( C_DEFAULT, log_buf, ch );
          }
      }
    }
    if ( type == 3 )
    {
      if ( ( mob = get_mob_index( MR ) ) )
      {
        if ( mob->mobprogs )
        {
          sprintf( log_buf, "%d: %s\n\r", mob->vnum, mob->player_name );
          send_to_char( AT_WHITE, log_buf, ch );
          for ( mprog = mob->mobprogs; mprog; mprog = mprog->next )
          {
            sprintf( log_buf, "%s&R:&B %s\n\r&w%s\n\r",
              mprog_type_to_name( mprog->type ),
              mprog->arglist ? mprog->arglist : "(None)",
              mprog->comlist ? mprog->comlist : "(None)"  );
            send_to_char( C_DEFAULT, log_buf, ch );
          }    
        }
      }
  }  
  }
  if ( type == 0 )
    char_to_room( ch, in_room );
  return;
}

void do_vused( CHAR_DATA *ch, char *argument )
{
  char buf1[MAX_STRING_LENGTH];
  int atvnum;
  int freevnum = 0;
  int bstart = -1;
  int bend;
  int col = 0;

  send_to_char(AT_PINK,"Used VNUMs (ignores vnums assigned but not created).\n\r",ch);
  send_to_char(AT_PINK,"Double check free vnums against assigned vnums in &Balist&P.\n\r",ch);

  for ( atvnum = 1; atvnum <= 32767; atvnum++ )
  {
    if ( get_room_index( atvnum ) || get_mob_index(atvnum) || get_obj_index(atvnum))
    {
      if ( bstart == -1 )
        bstart = atvnum;
    }
   else if ( bstart != -1 )
    {
      bend = ( atvnum - 1 ); 
      sprintf( buf1, "%5d&R-&W%5d  ", bstart, bend );
      send_to_char( AT_WHITE,buf1,ch);
      if ( ++col % 6 == 0 )
	send_to_char( AT_WHITE,"\n\r",ch);
      freevnum++;
      bstart = -1; 
    }
   else
     freevnum++;
  }
  if ( col % 6 != 0 )
    send_to_char( AT_WHITE, "\n\r",ch );
  sprintf( buf1, "There are %d free vnums.\n\r", freevnum );
  send_to_char( AT_WHITE, buf1, ch );
  return;
}

void do_hlist( CHAR_DATA *ch, char *argument )
{
  HELP_DATA *pHelp;
  int uvnum;
  int lvnum;
  int atvnum = 1;
  char arg[MAX_STRING_LENGTH];
  char arg1[MAX_STRING_LENGTH];
  
  argument = one_argument( argument, arg );
  argument = one_argument( argument, arg1 );
  lvnum = is_number( arg ) ? atoi( arg ) : 0;
  uvnum = is_number( arg1 ) ? atoi( arg1 ) : 0;
  
  if ( lvnum == 0 || uvnum == 0 || lvnum > uvnum )
  {
    send_to_char( AT_PURPLE, "Syntax: hlist [firsthelp#] [secondhelp#]\n\r",
       ch );
    return;
  }
  
  for ( pHelp = help_first; pHelp; pHelp = pHelp->next, ++atvnum )
  {
    if ( atvnum >= lvnum && atvnum <= uvnum )
    {
      sprintf( arg, "[&R%-3d&B]  &w%s\n\r", atvnum, pHelp->keyword );
      send_to_char( AT_BLUE, arg, ch );
    }
  }
  
  return;
}
    
void do_astrip( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  char arg[MAX_INPUT_LENGTH];
  AFFECT_DATA *paf;
  AFFECT_DATA *paf_next;

  argument = one_argument( argument, arg );

  if ( !(victim = get_char_room(ch, arg ) ) )
  {
    send_to_char(C_DEFAULT, "They aren't here.\n\r",ch);
    return;
  }

  for( paf = victim->affected; paf; paf = paf_next )
  {
    paf_next = paf->next;
    if ( !paf->deleted )
      affect_remove( victim, paf );
  }

  for( paf = victim->affected2; paf; paf = paf_next )
  {
    paf_next = paf->next;
    if ( !paf->deleted )
      affect_remove2( victim, paf );
  }

  victim->affected_by = 0;
  victim->affected_by2 = 0;

  if ( ch != victim )
    send_to_char(C_DEFAULT, "All your affects have been removed.\n\r", victim);
  send_to_char(C_DEFAULT, "Ok.\n\r",ch);
}

void do_bodybag( CHAR_DATA *ch, char *argument )
{
  OBJ_DATA *obj;
  OBJ_DATA *obj_next;
  OBJ_DATA *body = NULL;
  char arg[MAX_INPUT_LENGTH];
  char buf[MAX_STRING_LENGTH];
  int howmany = 0;

  argument = one_argument( argument, arg );

  for ( obj = object_list; obj; obj = obj_next )
  {
    OBJ_DATA *in;
    OBJ_DATA *in_next;

    obj_next = obj->next;
    if ( obj->deleted )
      continue;

    if ( obj->item_type != ITEM_CORPSE_PC )
      continue;
    if ( !obj->in_room )
      continue;
    if ( str_cmp( arg, obj->short_descr + 10 ) )
      continue;

    for ( in = obj->contains; in; in = in_next )
    {
      in_next = in->next_content;

      if ( howmany == 0 )
      {
	char name[MAX_INPUT_LENGTH];

	strcpy(name, obj->short_descr + 10);
	body = create_object(get_obj_index(OBJ_VNUM_CORPSE_PC), 0 );
        sprintf( buf, "bodybag body bag %s", name );
        body->name = str_dup( buf );
	sprintf(buf, "corpse of %s", name );
	body->short_descr = str_dup( buf );
/*	sprintf(buf, "%s'%s bodybag", name,
	       (name[strlen(name)-1] == 's' ? "" : "s") );
	body->short_descr = str_dup(buf); */
	sprintf(buf, "The bodybag of %s.", name);
	body->description = str_dup(buf);
	obj_to_char(body, ch);
      }
      obj_from_obj(in);
      obj_to_obj(in, body);
      howmany++;
    }
    extract_obj(obj);
    body->timer = number_range( 25, 45 );
  }
  return;
}

/* Poor Newbie lost his corpse, let's make him another
 * Bram 5/96
 */
void do_newcorpse( CHAR_DATA *ch, char *argument )
{
    FILE      *fp;
/*  CHAR_DATA *rch; */
    CHAR_DATA *victim;
    OBJ_DATA  *corpse;
    OBJ_DATA  *obj;
    char       strsave [ MAX_INPUT_LENGTH  ];
    char       buf     [ MAX_STRING_LENGTH ];
    char       arg1    [ MAX_INPUT_LENGTH  ];
    char       arg2    [ MAX_INPUT_LENGTH  ];
    int        c, number;
    int        corpse_cont[1024];
    int        item_level[1024];
    int        checksum1, checksum2;

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    /* Show usage */
    if ( arg1[0] == '\0' && arg2[0] == '\0' )
    {
       send_to_char( AT_GREY, "Syntax:  newcorpse <playername>\n\r",            ch );
       send_to_char( AT_GREY, "         newcorpse <playername> <corpse #>\n\r", ch );
       send_to_char( AT_GREY, "Author: Bram    Email: bram@ionet.net\n\r",     ch  );
       return;    
    }   
    if ( !( victim = get_pc_world( ch, arg1 ) ) )
    {
	send_to_char( AT_GREY, "They aren't here.\n\r", ch );
	return;
    }
    if ( victim->pcdata->corpses == 0 )
    {
	send_to_char( AT_GREY, "That player has no corpses on file.\n\r", ch );
	return;
    }
    /* Okay, the victim has a corpse file let's get 'em*/


    fclose( fpReserve );
    
    /* player files parsed directories by Yaz 4th Realm */
#if !defined( macintosh ) && !defined( MSDOS )
    sprintf( strsave, "%s%c/%s.cps", PLAYER_DIR, LOWER(victim->name[0]),
              capitalize( victim->name ) );
#else
    sprintf( strsave, "%s%s.cps", PLAYER_DIR, capitalize( victim->name ) );
#endif

    if ( !( fp = fopen( strsave, "r" ) ) )
    {
        sprintf( buf, "New Corpse: fopen %s: ", victim->name );
	bug( buf, 0 );
	sprintf( buf, "No existing corpse file for %s.\n\r",
		 victim->name );
	send_to_char( AT_WHITE, buf, ch );
	perror( strsave );
	return;
    }
    else
    {
        corpse_cont[0] = fread_number( fp );
        item_level[0]  = fread_number( fp );

        for ( c = 1 ; c < corpse_cont[0]+2 ; c++ )
            {    
            corpse_cont[c] = fread_number ( fp );            
            item_level[c]  = fread_number ( fp );        
            }
    }
    fclose( fp );
    fpReserve = fopen( NULL_FILE, "r" );
  
    /* Ok now we have the data on all the corpses. now what? */
    
    if ( arg2[0] == '\0' ) /* show 'em */
    {
        sprintf( buf, "%s's corpse:\n\r", victim->name );
        send_to_char( AT_GREY, buf, ch );
        send_to_char( AT_GREY, "Corpse    Contents   Flag\n\r", ch   );
        send_to_char( AT_GREY, "---------------------------\n\r", ch );
        sprintf( buf, "  %d          %3d   ", 1, corpse_cont[0] ); 
        send_to_char( AT_GREY, buf, ch );
        checksum1=0;
        checksum2=0;
        for ( c = 1 ; c < corpse_cont[0]+1; c++ )
            {    
            checksum1 += corpse_cont[c];
            checksum2 += item_level[c];             
            }
        if ( checksum1 == corpse_cont[c]             
             && checksum2 == item_level[c] )         
	    send_to_char( AT_GREY, "Valid\n\r", ch );
	else
	    send_to_char( AT_RED, "Invalid\n\r", ch );          
        return;
    }
    
    if (is_number( arg2 ) )               
    {
	number = atoi( arg2 );
        if ( number != 1 )
        {
            send_to_char( AT_GREY, "Corpse number must be 1\n\r", ch );
            return;
        }
        /* Ok now we've done all the checks, let's try making a corpse */

	corpse        = create_object( get_obj_index( OBJ_VNUM_CORPSE_PC ),
				   0 );
	corpse->timer = -1;

        sprintf( buf, corpse->short_descr, victim->name );
        free_string( corpse->short_descr );
        corpse->short_descr = str_dup( buf );
	
        sprintf( buf, corpse->description, victim->name );
        free_string( corpse->description );
        corpse->description = str_dup( buf );

        for ( c = 1 ; c < corpse_cont[0]+1 ; c++ )
        {    
                  
             obj = create_object( get_obj_index( corpse_cont[c] ),
                                  item_level[c] );           
             obj_to_obj( obj, corpse );
        }
        act( AT_GREY, "You create a $p.", ch, corpse, NULL, TO_CHAR );
        act( AT_GREY, "$n has created a $p!", ch, corpse, NULL, TO_ROOM );
        wiznet( "$N has created a $p.", ch, corpse, 
                  WIZ_LOAD, WIZ_SECURE, get_trust( ch ) );
        obj_to_room( corpse , ch->in_room );
        
    }    
    return; 
}       

void do_wiznet( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *rch;
    int flag;
    char buf[MAX_STRING_LENGTH];

    rch = get_char( ch );

    if ( argument[0] == '\0' )
    {
      	if (IS_SET(ch->wiznet,WIZ_ON))
      	{
            send_to_char( AT_RED, "Signing off of Wiznet.\n\r",ch);
            REMOVE_BIT(ch->wiznet,WIZ_ON);
      	}
      	else
      	{
            send_to_char( AT_RED, "Welcome to Wiznet!\n\r",ch);
            SET_BIT(ch->wiznet,WIZ_ON);
      	}
      	return;
    }

    if (!str_prefix(argument,"on"))
    {
	send_to_char( AT_RED, "Welcome to Wiznet!\n\r",ch);
	SET_BIT(ch->wiznet,WIZ_ON);
	return;
    }

    if (!str_prefix(argument,"off"))
    {
	send_to_char( AT_RED, "Signing off of Wiznet.\n\r",ch);
	REMOVE_BIT(ch->wiznet,WIZ_ON);
	return;
    }

    /* show wiznet status */
    if (!str_prefix(argument,"status")) 
    {
	buf[0] = '\0';

	if (!IS_SET(ch->wiznet,WIZ_ON))
	    strcat(buf,"off ");

	for (flag = 0; wiznet_table[flag].name != NULL; flag++)
	    if (IS_SET(ch->wiznet,wiznet_table[flag].flag))
	    {
		strcat(buf,wiznet_table[flag].name);
		strcat(buf," ");
	    }

	strcat(buf,"\n\r");

	send_to_char( AT_RED, "Wiznet status:\n\r",ch);
	send_to_char( AT_RED, buf,ch);
	return;
    }

    if (!str_prefix(argument,"show"))
    /* list of all wiznet options */
    {
	buf[0] = '\0';

	for (flag = 0; wiznet_table[flag].name != NULL; flag++)
	{
	    if (wiznet_table[flag].level <= get_trust(ch))
	    {
	    	strcat(buf,wiznet_table[flag].name);
	    	strcat(buf," ");
	    }
	}

	strcat(buf,"\n\r");

	send_to_char(AT_RED, "Wiznet options available to you are:\n\r",ch);
	send_to_char(AT_RED, buf,ch);
	return;
    }

    if ( !str_cmp( argument, "all" ) )
    {
      if (!IS_SET(ch->wiznet,WIZ_ON))   /* turn all available options on */
      {
        for (flag = 0; wiznet_table[flag].name != NULL; flag++)
        {
            if (wiznet_table[flag].level <= get_trust(ch))
              SET_BIT(ch->wiznet,wiznet_table[flag].flag); 
        }   
	send_to_char( AT_RED, "All available options on.\n\r", ch );
      }
      else   /* turn all available options off */
      {
	for (flag = 0; wiznet_table[flag].name != NULL; flag++ )
	{
	    if (IS_SET(ch->wiznet,wiznet_table[flag].flag))
	      REMOVE_BIT(ch->wiznet,wiznet_table[flag].flag);
	}
	send_to_char( AT_RED, "All available options off.\n\r", ch );
      }
      return;
    }

    flag = wiznet_lookup(argument);

    if (flag == -1 || get_trust(ch) < wiznet_table[flag].level)
    {
	send_to_char(AT_RED,"No such option.\n\r",ch);
	return;
    }
   
    if (IS_SET(ch->wiznet,wiznet_table[flag].flag))
    {
	sprintf(buf,"You will no longer see %s on wiznet.\n\r",
	        wiznet_table[flag].name);
	send_to_char(AT_RED,buf,ch);
	REMOVE_BIT(ch->wiznet,wiznet_table[flag].flag);
    	return;
    }
    else
    {
    	sprintf(buf,"You will now see %s on wiznet.\n\r",
		wiznet_table[flag].name);
	send_to_char(AT_RED,buf,ch);
    	SET_BIT(ch->wiznet,wiznet_table[flag].flag);
	return;
    }

}

void wiznet(char *string, CHAR_DATA *ch, OBJ_DATA *obj,
	    long flag, long flag_skip, int min_level) 
{
    DESCRIPTOR_DATA *d;
    bool oldpos;
    
    for ( d = descriptor_list; d != NULL; d = d->next )
    {
        if (d->connected == CON_PLAYING
	&&  IS_IMMORTAL(d->character) 
	&&  IS_SET(d->character->wiznet,WIZ_ON) 
	&&  (!flag || IS_SET(d->character->wiznet,flag))
	&&  (!flag_skip || !IS_SET(d->character->wiznet,flag_skip))
	&&  get_trust(d->character) >= min_level
	&&  d->character != ch)
        {
	    if (IS_SET(d->character->wiznet,WIZ_PREFIX))
	    {	
	  	send_to_char( AT_RED, "Wiznet> ", d->character);
            }
           oldpos = d->character->position;
           d->character->position = POS_STANDING;
           act( AT_RED, string, d->character, obj, ch, TO_CHAR );
           d->character->position = oldpos;
        }
    }
 
    return;
}

void do_nukerep (CHAR_DATA *ch, char *argument)
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    DESCRIPTOR_DATA *d;

    argument = one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
        for (d = descriptor_list; d != NULL; d = d->next)
        {
            if( ( victim = d->character ) != NULL )
                if( victim->reply == ch )
                    victim->reply = NULL;
        }
        send_to_char( AT_WHITE, "You nuked all replies to you.\r\n", ch );
        return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL
    || ( IS_NPC(victim) ) )
    {
        send_to_char( AT_WHITE, "They aren't here.\n\r", ch );
        return;
    }

    if ( victim->desc == NULL && !IS_NPC(victim))
    {
        act( AT_WHITE, "$N seems to have misplaced $S link...try again later.",
            ch,NULL,victim,TO_CHAR);
        return;
    }
    victim->reply = NULL;

    send_to_char( AT_WHITE, "Reply nuked.\r\n", ch );
    return;
}

void do_seize (CHAR_DATA *ch, char *argument)
{
    CHAR_DATA  *victim;
    OBJ_DATA   *obj;
    char 	arg1 [ MAX_INPUT_LENGTH ];
    char 	arg2 [ MAX_INPUT_LENGTH ];
    char 	arg3 [ MAX_INPUT_LENGTH ];
    char 	buf  [ MAX_STRING_LENGTH];

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    argument = one_argument( argument, arg3 );

    if ( ( arg1[0] == '\0' ) || ( arg2[0] == '\0' ) )
    {
        send_to_char( AT_WHITE, "Syntax : seize <object> <player>\n\r", ch );
        return;
    }

    if ( !( victim = get_char_world( ch, arg2 ) ) )
    {
        send_to_char( AT_WHITE, "They are not here!\n\r", ch );
        return;
    }

    if ( !( obj = get_obj_list( ch, arg1, victim->carrying ) ) )
    {
        send_to_char( AT_WHITE, "They do not have that item.\n\r", ch );
        return;
    }

    if ( victim->level >= ch->level )
    {
        send_to_char( AT_WHITE, "You Failed.\r\n", ch );
        return;
    }

    if ( obj->wear_loc != WEAR_NONE )
        unequip_char( victim, obj );

    obj_from_char( obj );
    obj_to_char( obj, ch );

    act( AT_WHITE, "You seize $p from $N.", ch, obj, victim, TO_CHAR );
    if ( arg3[0] == '\0' 
    	|| !str_cmp( arg3, "yes" ) || !str_cmp( arg3, "true" ) )		
           act( AT_WHITE, "You no longer own $p.", ch, obj, victim, TO_VICT );

    sprintf( buf, "%s seizes %s from %s.", ch->name, obj->short_descr, victim->name);
    wiznet( buf, ch, NULL, WIZ_PENALTIES, WIZ_SECURE, get_trust( ch ) );

    return;
}

/* for clone, to insure that cloning goes many levels deep */
void recursive_clone(CHAR_DATA *ch, OBJ_DATA *obj, OBJ_DATA *clone)
{
    OBJ_DATA *c_obj, *t_obj;


    for (c_obj = obj->contains; c_obj != NULL; c_obj = c_obj->next_content)
    {
	    t_obj = create_object(c_obj->pIndexData,0);
	    clone_object(c_obj,t_obj);
	    obj_to_obj(t_obj,clone);
	    recursive_clone(ch,c_obj,t_obj);
    }
}

/* command that is similar to load */
void do_clone(CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char *rest;
    CHAR_DATA *mob;
    OBJ_DATA  *obj;


    rest = one_argument(argument,arg);

    if (arg[0] == '\0')
    {
	send_to_char(AT_WHITE,"Clone what?\n\r",ch);
	return;
    }

    if (!str_prefix(arg,"object"))
    {
	mob = NULL;
	obj = get_obj_here(ch,rest);
	if (obj == NULL)
	{
	    send_to_char(AT_WHITE,"You don't see that here.\n\r",ch);
	    return;
	}
    }
    else if (!str_prefix(arg,"mobile") || !str_prefix(arg,"character"))
    {
	obj = NULL;
	mob = get_char_room(ch,rest);
	if (mob == NULL)
	{
	    send_to_char(AT_WHITE,"You don't see that here.\n\r",ch);
	    return;
	}
    }
    else /* find both */
    {
	mob = get_char_room(ch,argument);
	obj = get_obj_here(ch,argument);
	if (mob == NULL && obj == NULL)
	{
	    send_to_char(AT_WHITE,"You don't see that here.\n\r",ch);
	    return;
	}
    }

    /* clone an object */
    if (obj != NULL)
    {
	OBJ_DATA *clone;

	clone = create_object(obj->pIndexData,0); 
	clone_object(obj,clone);
	if (obj->carried_by != NULL)
	    obj_to_char(clone,ch);
	else
	    obj_to_room(clone,ch->in_room);
 	recursive_clone(ch,obj,clone);

	act(AT_WHITE,"$n has created $p.",ch,clone,NULL,TO_ROOM);
	act(AT_WHITE,"You clone $p.",ch,clone,NULL,TO_CHAR);
	wiznet("$N clones $p.",ch,clone,WIZ_LOAD,WIZ_SECURE,get_trust(ch));
	return;
    }
    else if (mob != NULL)
    {
	CHAR_DATA *clone;
	OBJ_DATA *new_obj;
	char buf[MAX_STRING_LENGTH];

	if (!IS_NPC(mob))
	{
	    send_to_char(AT_WHITE,"You can only clone mobiles.\n\r",ch);
	    return;
	}

	clone = create_mobile(mob->pIndexData);
	clone_mobile(mob,clone); 
	
	for (obj = mob->carrying; obj != NULL; obj = obj->next_content)
	{
		new_obj = create_object(obj->pIndexData,0);
		clone_object(obj,new_obj);
		recursive_clone(ch,obj,new_obj);
		obj_to_char(new_obj,clone);
		new_obj->wear_loc = obj->wear_loc;
	}
	char_to_room(clone,ch->in_room);
        act(AT_WHITE,"$n has created $N.",ch,NULL,clone,TO_ROOM);
        act(AT_WHITE,"You clone $N.",ch,NULL,clone,TO_CHAR);
	sprintf(buf,"$N clones %s.",clone->short_descr);
	wiznet(buf,ch,NULL,WIZ_LOAD,WIZ_SECURE,get_trust(ch));
        return;
    }
}
void do_whotype( CHAR_DATA *ch, char *argument )
{
  char		buf [ MAX_INPUT_LENGTH ];

  if ( IS_NPC( ch ) || ch->level < LEVEL_IMMORTAL )
	return;
  if ( argument[0] == '\0' )
    {
    send_to_char( C_DEFAULT, "Change your whotype to what?\n\r", ch );
    return;
    }
  if ( strlen_wo_col( argument ) > 11 )
    {
    send_to_char( C_DEFAULT, 
   		  "Maximum whotype length is 11 excluding color codes.\n\r",
		  ch );
    return;
    }
  smash_tilde( argument );

  buf[0] = '\0';
  if ( !str_cmp( "default", argument ) )
	{
	free_string( ch->pcdata->whotype );
	ch->pcdata->whotype = str_dup( "!!!!!!!!!!!!" );
	}
  else
	{
	free_string( ch->pcdata->whotype );
	ch->pcdata->whotype = str_dup( argument );
	}
  send_to_char(C_DEFAULT, "Ok.\n\r", ch );
  return;
}

void do_descript_clean( CHAR_DATA *ch, char *argument )
{
    DESCRIPTOR_DATA *d, *d_next;
    int number = 0;
    
    for ( d = descriptor_list; d != NULL; d = d_next ) 
    {
        d_next = d->next;
	
	/*took out NULL forseen probs with hanging descriptors*/
	
        if( (d->connected == CON_GET_NAME) || (d->connected == CON_GET_ANSI) )
          {
            close_socket(d);
            number++;
          }
    }
    if (number > 0)
    	send_to_char(AT_WHITE, "Descriptors cleaned!\n\r", ch );
    else
	send_to_char(AT_WHITE, "Descriptors OK.\n\r", ch );
    	
    return;
}

/*
 * To allow clan's to have clan quest points,
 *  seperate from normal quests -Angi      */ 
void do_clanquest( CHAR_DATA *ch, char *argument)
{
    CHAR_DATA   *victim;
    char buf    [ MAX_STRING_LENGTH ]; 
    char buf1   [ MAX_STRING_LENGTH ];
    char arg1   [ MAX_INPUT_LENGTH ];
    char arg2   [ MAX_INPUT_LENGTH ];
    char arg3   [ MAX_INPUT_LENGTH ];
    int  value;

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    argument = one_argument( argument, arg3 );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
    {
       send_to_char( AT_WHITE, "&RSyntax: &Wcquest earn  <victim> <amount>\n\r", ch );
       send_to_char( AT_WHITE, "    &Ror: &Wcquest spend <victim> <amount>\n\r", ch );
       return;
    }
  
    value = is_number( arg3 ) ? atoi( arg3 ) : -1;

    if ( ( ch->clan == 0 ) || ( ch->clev < 5 ) )
       return;

    if ( !( victim = get_char_room( ch, arg2 ) ) )
    {
       send_to_char( AT_WHITE, "They aren't here.\n\r", ch );
       return;
    }      
 
    if IS_NPC( victim )
    {
       send_to_char( AT_WHITE, "Not on NPC's.\n\r", ch );
       return;
    }

    if ( !victim->desc )
    {
       send_to_char( AT_WHITE, "Not on link-dead characters.\n\r", ch );
       return;
    }

    if ( victim == ch )
    {
       send_to_char( AT_WHITE, "You are a deity, you cannot gain clan quest points!\n\r", ch );
       return;
    }

    if ( victim->clan != ch->clan )    
    {
       send_to_char( AT_WHITE, "You cannot set the clan quest points of a person outside your clan.\n\r", ch );
       return;
    }

    if ( value < 0 )
    {
       send_to_char( AT_WHITE, "Amount cannot be negative.\n\r", ch );
       return;
    }
   
    if ( !str_cmp( "earn", arg1 ) )
    {
       /* raise victim's clan qp */
 
       sprintf( buf, "&RYou've earned %d Clan Quest points!! Congratulations!!\n\r", value );
       sprintf( buf1, "&RYou reward %s with %d Clan Quest points.\n\r", victim->name, value );
       send_to_char( AT_RED, buf, victim );
       send_to_char( AT_RED, buf1, ch );
       victim->cquestpnts += value;
       sprintf( buf, "&WYou now have %d Clan Quest points.\n\r", victim->cquestpnts );
       sprintf( buf1, "&W%s now has %d Clan Quest points.\n\r", victim->name, victim->cquestpnts );
       send_to_char( AT_WHITE, buf, victim );
       send_to_char( AT_WHITE, buf1, ch );
       return;
    
    }
    else
       if ( !str_cmp( "spend", arg1 ) )
       {
          /* lower victim's clan qp */

          if ( value > victim->cquestpnts )
          {
             if ( victim->cquestpnts > 0 )
                sprintf( buf, "&W%s only has %d Clan Quest points to spend.\n\r", victim->name, victim->cquestpnts );
             else
                sprintf( buf, "&W%s doesn't have any Clan Quest points to spend.\n\r", victim->name );
             send_to_char( AT_WHITE, buf, ch );
             return;
          }

          sprintf( buf, "&WYou spend %d Clan Quest points.\n\r", value );
          sprintf( buf1, "&WYou lower %s's Clan Quest points by %d.\n\r", victim->name, value );
          send_to_char( AT_WHITE, buf, victim );
          send_to_char( AT_WHITE, buf1, ch );
          victim->cquestpnts -= value;
          sprintf( buf, "&WYou now have %d Clan Quest points.\n\r", victim->cquestpnts );
          sprintf( buf1, "&W%s now has %d Clan Quest points.\n\r", victim->name, victim->cquestpnts );
          send_to_char( AT_WHITE, buf, victim );
          send_to_char( AT_WHITE, buf1, ch );
          return;

       }
       else
       {
          send_to_char( AT_WHITE, "&RSyntax: &Wcquest earn <victim> <amount>\n\r", ch );
          send_to_char( AT_WHITE, "    &Ror: &Wcquest spend <victim> <amount>\n\r", ch );
          return;                  
       }
}

void do_rebuild (CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *victim;
    OBJ_DATA  *obj;
    RACE_DATA *pRace;
    char       arg1 [ MAX_INPUT_LENGTH ];
    char       arg2 [ MAX_INPUT_LENGTH ];
    int	       sn;
    int	       level;
    int        iLevel;

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' )
    {
        send_to_char(AT_WHITE, "Syntax: rebuild <char>.\n\r", ch );
        return;
    }

    if ( !( victim = get_char_room( ch, arg1 ) ) )
    {
        send_to_char(AT_WHITE, "That player is not here.\n\r", ch);
        return;
    }

    if ( IS_NPC( victim ) )
    {
        send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch );
        return;
    }

    /* strip them of affects */
    do_astrip( ch, victim->name );

    /* have them remove equipment */
    {
        for ( obj = victim->carrying; obj; obj = obj->next_content )
        {
            if ( obj->wear_loc != WEAR_NONE )
              unequip_char( victim, obj );
        }
    }

    /* reset misc */
    victim->pcdata->condition[COND_THIRST]  =  0;
    victim->pcdata->condition[COND_FULL]    =  0;
    victim->pcdata->condition[COND_DRUNK]    = 0;
    victim->saving_throw = 0;

    /* level one stats */
    victim->perm_hit  = 10;
    victim->mod_hit  = 0;
    victim->perm_mana = 100;
    victim->mod_mana = 0;
    victim->perm_bp   = 20;
    victim->mod_bp = 0;
    victim->perm_move = 100;
    victim->mod_move = 0;
    victim->practice = 21;

    /* set skills and spells to 0 */
    for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ )
     victim->pcdata->learned[sn] = 0;

    /* set stuff to max for purpose of refiguring hp mana move and pracs */
    victim->pcdata->mod_str = 25;
    victim->pcdata->mod_int = 25;
    victim->pcdata->mod_wis = 25;
    victim->pcdata->mod_dex = 25;
    victim->pcdata->mod_con = 25;

    victim->pcdata->perm_str = 18; 
    victim->pcdata->perm_int = 18; 
    victim->pcdata->perm_wis = 18; 
    victim->pcdata->perm_dex = 18; 
    victim->pcdata->perm_con = 18; 

    level = victim->level;
    victim->level = 1;   

    /* refigure hp mana move and pracs */
    for ( iLevel = victim->level ; iLevel < level; iLevel++ )
    {
	send_to_char(AT_RED, "You raise a level!!  ", victim );
	victim->level += 1;
	advance_level( victim );
    }

    /* reset stats to level 1*/
    pRace = get_race_data(victim->race);
    victim->pcdata->mod_str = pRace->mstr;
    victim->pcdata->mod_int = pRace->mint;
    victim->pcdata->mod_wis = pRace->mwis;
    victim->pcdata->mod_dex = pRace->mdex;
    victim->pcdata->mod_con = pRace->mcon;

    victim->pcdata->perm_str = 13; 
    victim->pcdata->perm_int = 13; 
    victim->pcdata->perm_wis = 13; 
    victim->pcdata->perm_dex = 13; 
    victim->pcdata->perm_con = 13; 

    switch ( class_table[prime_class(victim)].attr_prime )
    {
      case APPLY_STR: victim->pcdata->perm_str = 16; break;
      case APPLY_INT: victim->pcdata->perm_int = 16; break;
      case APPLY_WIS: victim->pcdata->perm_wis = 16; break;
      case APPLY_DEX: victim->pcdata->perm_dex = 16; break;
      case APPLY_CON: victim->pcdata->perm_con = 16; break;
    } 

   /* restore */
   victim->hit      = MAX_HIT(victim);
   victim->mana     = MAX_MANA(victim);
   victim->bp       = MAX_BP(victim);
   victim->move     = MAX_MOVE(victim);

   /* save the character */
   save_char_obj( victim, FALSE );

   /* completed message */
   send_to_char( AT_WHITE, "Ok.\n\r", ch );
}
/*
void do_nuke( CHAR_DATA *ch, char *argument )
{
 CHAR_DATA *vch;
 bool playing = FALSE;
  char arg[MAX_INPUT_LENGTH];
  DESCRIPTOR_DATA d;

  argument = one_argument( argument, arg );

 for ( vch = char_list; vch != NULL; vch = vch->next )
 {
   if ( vch->deleted )
     continue;
   if ( !IS_NPC( vch ) && !str_cmp( arg, vch->name ) )
   {
     if ( ch == vch )
     {
       send_to_char( AT_WHITE, "You cannot nuke yourself.\n\r", ch );
       return;
     }
     send_to_char( AT_WHITE, "Character is playing.\n\r", ch );
     playing = TRUE;
     break;
   }
 }

 if (!playing)
 { 
   vch = NULL;

   if ( !load_char_obj( &d, arg ) )
   {
     free_char( d.character );
     send_to_char( AT_WHITE, "Player does not exist.\n\r", ch );
     return;
   }
   vch = d.character;
   d.character = NULL;
   vch->desc = NULL;
   vch->next = char_list;
   char_list = vch;
   char_to_room( vch, ch->in_room );
   {
     char buf[MAX_INPUT_LENGTH];
     strcpy( buf, vch->name );
     free_string( vch->name );
     vch->name = str_dup( capitalize( buf ) );
     act( AT_RED, "$n ghost like form appears in the room.", vch, NULL, NULL, TO_ROOM );
   }
 }

 act( AT_RED, "A rift opens beneath $n, who falls into oblivion.", vch, NULL, NULL, TO_ROOM );
 act( AT_RED, "A rift opens beneath you, you fall into oblivion.", vch, NULL, NULL, TO_VICT );
 
 sprintf(log_buf, "%s%c/%s", PLAYER_DIR, LOWER(vch->name[0]),
     capitalize(vch->name));
 remove(log_buf);
 strcat(log_buf, ".fng");
 remove(log_buf);
 sprintf(log_buf, "%s%c/%s", PLAYER_DIR, LOWER(vch->name[0]),
     capitalize(vch->name));
 strcat(log_buf, ".cps");
 remove(log_buf);

 delete_playerlist( vch->name );

 d = vch->desc;
 extract_char(vch, TRUE);
 if ( d )
  close_socket(d);

 send_to_char( AT_WHITE, "Ok.\n\r", ch );

}

*/