#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"

int FORCE_LEVEL;
extern bool noibm;
extern bool kk;
extern bool mb;
extern bool dbs;


ROOM_DATA *find_location (CHAR_DATA * ch, char *arg);
void gotoxy (CHAR_DATA *, int, int);
void strip_all_affects (CHAR_DATA *);





void
flags (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *vict;
  int col = 0;
  int i;
  DEFINE_COMMAND ("flags", flags, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Shows questflags on a given player.")
    hugebuf_o[0] = '\0';
  if ((vict = get_player_world (ch, argy, FALSE)) == NULL)
    {
      send_to_char ("That player was not found or is not online.\n\r", ch);
      return;
    }
  for (i = 0; i < MAX_SCRIPT_FLAGS; i++)
    {
      if (!vict->pcdata->script_flags[i] || vict->pcdata->script_flags[i][0] == '\0')
        continue;
      col++;
      if (col == 8)
        {
          strcat (hugebuf_o, "\n\r");
          col = 1;
        }
      sprintf (hugebuf_o + strlen (hugebuf_o), "%-8s ", vict->pcdata->script_flags[i]);
    }
  strcat (hugebuf_o, "\n\r");
  page_to_char (hugebuf_o, ch);
  return;
}

void
do_unlearn (CHAR_DATA * ch, char *argy)
{
  int i;
  SPELL_DATA *spell;
  char general_use[2500];
  DEFINE_COMMAND ("unlearn", do_unlearn, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Allows you to unlearn a specific spell or skill.")

    if (!argy || argy == "" || argy[0] == '\0')
    {
      send_to_char ("Syntax is: Unlearn skill/spellname.\n\r", ch);
      send_to_char ("Please note you do not get your practices or learns back.\n\r", ch);
      send_to_char ("For a full reset (getting pracs and learns back), type preset.\n\r", ch);
      return;
    }
  spell = skill_lookup (argy, -1);
  if (spell == NULL)
    {
      send_to_char ("That isn't a valid skill or spell, sorry.\n\r", ch);
      return;
    }
  if (ch->pcdata->learned[spell->gsn] == -100)
    {
      send_to_char ("You haven't learned that skill/spell anyway!\n\r", ch);
      send_to_char ("If it registers as a skill, you probably are wearing some +bonus equip.\n\r", ch);
      return;
    }
  for (i = 0; i < SKILL_COUNT; i++)
    {
      SPELL_DATA *spl;
      if ((spl = skill_lookup (NULL, i)) == NULL)
        continue;
      if (ch->pcdata->learned[i] < 0)
        continue;
      if (spl->prereq_1 == NULL)
        continue;
      if (skill_lookup (spl->prereq_1, -1) == spell)
        {
          send_to_char ("You can not unlearn a prerequisite to a spell/skill you already know!\n\r", ch);
          return;
        }
      if (spl->prereq_2 == NULL)
        continue;
      if (skill_lookup (spl->prereq_2, -1) == spell)
        {
          send_to_char ("You can not unlearn a prerequisite to a spell/skill you already know!\n\r", ch);
          return;
        }
    }
  ch->pcdata->learned[spell->gsn] = -100;
  sprintf (general_use, "You have successfully unlearned %s.\n\r",
           capitalize (spell->spell_funky_name));
  send_to_char (general_use, ch);
  return;
}

void
player_preset (CHAR_DATA * ch, char *argy)
{
  int i;

  if (str_cmp (argy, "Zlughlkheyn"))
    {
      send_to_char ("This command wipes all of your skills, and gives you learns and\n\r", ch);
      send_to_char ("practices as if you leveled each level from level 1 again.\n\r", ch);
      send_to_char ("To go ahead with the reset, type preset Zlughlkheyn.\n\r", ch);
      return;
    }
  if (IS_MOB (ch))
    {
      send_to_char ("Not on NPC's.\n\r", ch);
      return;
    }
/*clear all skills/spells */
  for (i = 0; i < SKILL_COUNT; i++)
    {
      ch->pcdata->learned[i] = -100;
    }
  ch->pcdata->practice = (1 + (((LEVEL (ch) - 1) *
                              (wis_app[get_curr_wis (ch)-1].practice))));
  if (LEVEL (ch) < 4)
    ch->pcdata->learn = (LEVEL (ch) * 2);
  else
    ch->pcdata->learn = 6 + (LEVEL (ch) - 3);
  send_to_char ("Your practices and learns have been reset.\n\r", ch);
  return;
}

void
do_preset (CHAR_DATA * ch, char *argy)  /*BY Owen Emlen */
{
  CHAR_DATA *victim;
  char arg1[500];
  int i;
  DEFINE_COMMAND ("preset", do_preset, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command resets all skills and practices of a target character.")
    
    if (LEVEL(ch) < IMM_LEVEL && str_cmp(argy, "Zlughlkheyn"))
      {
        send_to_char("You must type preset Zlughlkheyn in order to preset.\n\r", ch);
        return;
      }
  
  if (!IS_REAL_GOD (ch))
    {
      player_preset (ch, argy);
      return;
    }
  if (argy == "" || argy[0] == '\0')
    {
      send_to_char ("Format is PRESET <player>\n\r", ch);
      return;
    }
  argy = one_argy (argy, arg1);
  if ((victim = get_char_world (ch, arg1)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB(victim)) return;
  /*clear all skills/spells */
  for (i = 0; i < SKILL_COUNT; i++)
    {
      victim->pcdata->learned[i] = -100;
    }
 
  victim->pcdata->practice = (1 + (LEVEL (victim) - 1) *
(wis_app[get_curr_wis (victim)-1].practice));
  if (LEVEL (victim) < 4)
    victim->pcdata->learn = (LEVEL (victim) * 2);
  else
    victim->pcdata->learn = 6 + (LEVEL (victim) - 3);
  send_to_char ("Practices and learns reset.\n\r", ch);
  send_to_char ("Your practices have been reset! :)\n\r", victim);
  return;
}


/* notify stuff partially lifted, so it probalby doens't work 100% - piece o crap */
void
do_notify (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  char buf[SML_LENGTH];
  DEFINE_COMMAND ("notify", do_notify, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Notify HELP for help.  This toggles god/immort notification.")

    if (IS_MOB (ch))
    return;
  smash_tilde (argy);
  argy = one_argy (argy, arg1);
  if (arg1[0] == '\0')
    {
      if (IS_SET (ch->act, WIZ_NOTIFY))
        {
          send_to_char ("Godinfo/Notification is now OFF.\n\r", ch);
          REMOVE_BIT (ch->act, WIZ_NOTIFY);
          return;
        }
      else
        {
          send_to_char ("Godinfo/Notification is now ON.\n\r", ch);
          SET_BIT (ch->act, WIZ_NOTIFY);
          return;
        }
    }
  else if (!str_cmp (arg1, "death")
           || !str_cmp (arg1, "deaths"))
    {
      if (IS_SET (ch->act, WIZ_NOTIFY_DEATH))
        {
          send_to_char ("Death notification is now OFF.\n\r", ch);
          REMOVE_BIT (ch->act, WIZ_NOTIFY_DEATH);
          return;
        }
      else
        {
          send_to_char ("Death notification is now ON.\n\r", ch);
          SET_BIT (ch->act, WIZ_NOTIFY_DEATH);
          return;
        }
    }
  else if (!str_cmp (arg1, "bug")
           || !str_cmp (arg1, "bugs"))
    {
      if (IS_SET (ch->act, WIZ_NOTIFY_BUG))
        {
          send_to_char ("Bug notification is now OFF.\n\r", ch);
          REMOVE_BIT (ch->act, WIZ_NOTIFY_BUG);
          return;
        }
      else
        {
          send_to_char ("Bug notification is now ON.\n\r", ch);
          SET_BIT (ch->act, WIZ_NOTIFY_BUG);
          return;
        }
    }
  else if (!str_cmp (arg1, "log")
           || !str_cmp (arg1, "logs"))
    {
      if (IS_SET (ch->act, WIZ_NOTIFY_LOG))
        {
          send_to_char ("Log notification is now OFF.\n\r", ch);
          REMOVE_BIT (ch->act, WIZ_NOTIFY_LOG);
          return;
        }
      else
        {
          send_to_char ("Log notification is now ON.\n\r", ch);
          SET_BIT (ch->act, WIZ_NOTIFY_LOG);
          if (IS_SET (ch->act, WIZ_NOTIFY_BUG))
            do_notify (ch, "bug");
          return;
        }
    }
  else if (!str_cmp (arg1, "login")
           || !str_cmp (arg1, "logins"))
    {
      if (IS_SET (ch->act, WIZ_NOTIFY_LOGIN))
        {
          send_to_char ("Login notify is now OFF.\n\r", ch);
          REMOVE_BIT (ch->act, WIZ_NOTIFY_LOGIN);
          return;
        }
      else
        {
          send_to_char ("Login notify is now ON.\n\r", ch);
          SET_BIT (ch->act, WIZ_NOTIFY_LOGIN);
          return;
        }
    }
  else if (!str_cmp (arg1, "?")
           || !str_cmp (arg1, "help")
           || !str_cmp (arg1, "list"))
    {
      send_to_char ("Typing NOTIFY <option> toggles the notification on and off.\n\r", ch);
      send_to_char ("NOTIFY alone toggles notification off/on.\n\r", ch);
      send_to_char ("NOTIFY LIST and NOTIFY HELP all list this display.\n\r", ch);
      sprintf (buf, "Login notify : %s\n\r",
               IS_SET (ch->act, WIZ_NOTIFY_LOGIN) ? "ON" : "OFF");
      send_to_char (buf, ch);
      sprintf (buf, "Bugs notify : %s\n\r",
               IS_SET (ch->act, WIZ_NOTIFY_BUG) ? "ON" : "OFF");
      send_to_char (buf, ch);
      sprintf (buf, "Logs notify : %s\n\r",
               IS_SET (ch->act, WIZ_NOTIFY_LOG) ? "ON" : "OFF");
      send_to_char (buf, ch);
      sprintf (buf, "Death notify : %s\n\r",
               IS_SET (ch->act, WIZ_NOTIFY_DEATH) ? "ON" : "OFF");
      send_to_char (buf, ch);
      sprintf (buf, "The notify command is currently %s.\n\r",
               IS_SET (ch->act, WIZ_NOTIFY) ? "active" : "inactive");
      send_to_char (buf, ch);
      return;
    }
  else
    {
      send_to_char ("Huh?\n\r", ch);
      return;
    }
  return;
}

void
do_beamin (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("beamin", do_beamin, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command changes what people see when you trans into the room.")

    if (IS_PLAYER (ch))
    {
      smash_tilde (argy);
      free_string (ch->pcdata->beamin);
      ch->pcdata->beamin = str_dup (argy);
      send_to_char ("Set.\n\r", ch);
    }
  return;
}

void
do_beamout (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("beamout", do_beamout, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command changes what people see when you trans out of the room.")
    if (IS_PLAYER (ch))
    {
      smash_tilde (argy);
      free_string (ch->pcdata->beamout);
      ch->pcdata->beamout = str_dup (argy);
      send_to_char ("Set.\n\r", ch);
    }
  return;
}


void
do_disconnect (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  DESCRIPTOR_DATA *d;
  CHAR_DATA *victim;
  DEFINE_COMMAND ("disconnect", do_disconnect, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This will cause the person to 'drop link'.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Disconnect who?\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  for (d = descriptor_list; d != NULL; d = d->next)
    {
      if (d == victim->desc)
        {
          close_socket (d);
          send_to_char ("Ok.\n\r", ch);
          return;
        }
    }
  return;
}

void
do_echo (CHAR_DATA * ch, char *argy)
{
  DESCRIPTOR_DATA *d;
  DEFINE_COMMAND ("echo", do_echo, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command prints a message to the entire mud.")

    if (argy[0] == '\0')
    {
      send_to_char ("Echo what?\n\r", ch);
      return;
    }
  for (d = descriptor_list; d; d = d->next)
    {
      if ((d->connected == CON_PLAYING || d->connected == CON_MEDITOR ||
           d->connected == CON_OEDITOR || d->connected == CON_REDITOR)
          && d->character)
        {
          send_to_char (anseval (argy, d->character), d->character);
          send_to_char ("\e[0m\n\r", d->character);
        }
    }
  return;
}

void
do_arenaecho (CHAR_DATA * ch, char *argy, bool batspam)
{
  DESCRIPTOR_DATA *d;
  if (argy[0] == '\0')
    {
      send_to_char ("Echo what?\n\r", ch);
      return;
    }
  for (d = descriptor_list; d; d = d->next)
    {
      if (!d->character)
        continue;
      if (IS_MOB (d->character))
        continue;
      if (CHALLENGE (d->character) == 10)
        continue;
      if (d->character && d->character->pcdata->arena_msg == 0)
        continue;
      if (d->character && d->character->pcdata->arena_msg == 2 && batspam == TRUE)
        continue;
      if (d->character->position == POSITION_FIGHTING && number_range (1, 2) == 1)
        continue;
      if (d->connected == CON_PLAYING)
        {
          send_to_char (anseval (argy, d->character), d->character);
          send_to_char ("\e[0m\n\r", d->character);
        }
    }
  return;
}

void
do_recho (CHAR_DATA * ch, char *argy)
{
  DESCRIPTOR_DATA *d;
  DEFINE_COMMAND ("recho", do_recho, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This shows a message to everyone in the room.")

    if (argy[0] == '\0')
    {
      send_to_char ("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 (anseval (argy, d->character), d->character);
          send_to_char ("\e[0m\n\r", d->character);
        }
    }
  return;
}

ROOM_DATA *
find_location (CHAR_DATA * ch, char *arg)
{
  CHAR_DATA *victim;
  SINGLE_OBJECT *obj;
  if (is_number (arg))
    return get_room_index (atoi (arg));
  if ((victim = get_char_world (ch, arg)) != NULL)
    return victim->in_room;
  if ((obj = get_obj_world (ch, arg)) != NULL)
    return obj->in_room;
  return NULL;
}

void
do_transfer (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  CHAR_DATA *t;
  ROOM_DATA *location;
  DESCRIPTOR_DATA *d;
  CHAR_DATA *victim;
  DEFINE_COMMAND ("transfer", do_transfer, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "This transfers someone to a room specified, and more...")

    argy = one_argy (argy, arg1);
  one_argy (argy, arg2);
  if (arg1[0] == '\0')
    {
      send_to_char ("Transfer whom (and where)?\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "all"))
    {
      bool bground;
      bground = FALSE;
      if (UPPER (arg2[0]) == 'B')
        bground = TRUE;
      for (d = descriptor_list; d != NULL; d = d->next)
        {
          if (d->connected == CON_PLAYING
              && d->character->pcdata &&
              IS_PLAYER (d->character) &&
              d->character != ch
              && d->character->in_room != NULL)
            {
              char buf[STD_LENGTH];
              if (bground && d->character->pcdata->level > IMM_LEVEL)
                continue;
              if (!bground)
                {
                  sprintf (buf, "%s %s", NAME (d->character), arg2);
                }
              else
                {
                  char buf2[500];
                  if (!d->character->pcdata->bgf)
                    continue;
                  if (d->character->in_room->vnum < 1000 &&
                      (d->character->in_room->vnum < 100 || 
		       d->character->in_room->vnum > (100+NUM_ALIGN-1)))
                    {
                      send_to_char ("You cannot be in the battleground since you are in an invalid part of the world.\n\r", d->character);
                      continue;
                    }


                  if (LEVEL (d->character) < min_level || LEVEL (d->character) > max_level)
                    continue;
                  d->character->pcdata->bgf = FALSE;
                  if (bg_multiplier && bg_multiplier == 0)
		  sprintf (buf, "%s %d", NAME (d->character),
                           number_range (BATTLEGROUND_START_VNUM, BATTLEGROUND_END_VNUM - 1));
                  else
	          sprintf (buf, "%s %d", NAME (d->character),
			   number_range (BATTLEGROUND_START_VNUM + bg_multiplier, BATTLEGROUND_END_VNUM + bg_multiplier));
		  sprintf (buf2, "%s", NAME (d->character));
                  do_restore (ch, buf2);
                }
              do_transfer (ch, buf);
            }
        }
      return;
    }
  if (!str_cmp (arg1, "all_in_room"))
    {
      for (d = descriptor_list; d != NULL; d = d->next)
        {
          if (d->connected == CON_PLAYING
              && d->character->pcdata &&
              IS_PLAYER (d->character) &&
              d->character != ch
              && d->character->in_room != NULL
              && d->character->in_room == ch->in_room)
            {
              char buf[STD_LENGTH];
              sprintf (buf, "%s %s", NAME (d->character), arg2);
              do_transfer (ch, buf);
            }
        }
      return;
    }
  if (arg2[0] == '\0')
    {
      location = ch->in_room;
    }
  else
    {
      if ((location = find_location (ch, arg2)) == NULL)
        {
          if ((location = find_room_tag (argy)) == NULL)
            {
              send_to_char ("No such location.\n\r", ch);
              return;
            }
        }
    }
  victim = NULL;
  if (allow_anything)
    {
      for (t = char_list; t != NULL; t = t->next)
        {
          if (!str_cmp (RNAME (t), arg1))
            {
              victim = t;
              break;
            }
        }
      if (!victim)
        return;
    }
  else if ((victim = get_char_world_2 (ch, arg1)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }

  if (FIGHTING (victim) != NULL)
    stop_fighting (FIGHTING (victim), TRUE);
  stop_fighting (victim, TRUE);
 /* act ("$n disappears in a cloud of smoke.", victim, NULL, NULL,TO_ROOM); */
  char_from_room (victim);
  char_to_room (victim, location);
 /* act ("$n arrives in a dazzling white flash.", victim, NULL, NULL,TO_ROOM); */
   if (IS_PLAYER (ch) && ch != victim)
    act ("You have been magically transferred.", ch, NULL, victim, TO_VICT); 
  do_look (victim, "auto");
  if (IS_PLAYER (ch) && LEVEL (ch) > IMM_LEVEL)
    send_to_char ("Ok.\n\r", ch);
  return;
}


void
do_mat (CHAR_DATA * ch, char *argy)
{
  int i, j, hash;
  char arg[SML_LENGTH];
  char arg2[SML_LENGTH];
  ROOM_DATA* location;
  ROOM_DATA *original, *roomto;
  DEFINE_COMMAND ("mat", do_mat, POSITION_DEAD, IMM_LEVEL+1, LOG_NORMAL, "This command performs multiple commands at the locations specified.")

    if (IS_MOB (ch))
    return;
  argy = one_argy (argy, arg);
  argy = one_argy (argy, arg2);
  if (arg[0] == '\0' || argy[0] == '\0')
    {
      send_to_char ("At where what?\n\r", ch);
      return;
    }
  if ((location = find_location (ch, arg)) == NULL)
    {
      if ((location = find_room_tag (arg)) == NULL)
        {
          send_to_char ("No such location.\n\r", ch);
          return;
        }
    }

  i = atoi (arg);
  j = atoi (arg2);
  if ((j - i > IMM_LEVEL) || (j - i < 1))
    {
      send_to_char ("Invalid argument range!\n\r", ch);
      return;
    }

  original = ch->in_room;
  for (hash = 0; hash < HASH_MAX; hash++)
    {
      for (roomto = room_hash[hash]; roomto != NULL; roomto = roomto->next)
        {
          if (roomto->vnum <= j && roomto->vnum >= i)
            {
              char_from_room (ch);
              /*u_ */ char_to_room (ch, roomto);
              super_interpret (ch, argy);
            }
        }
    }

  char_from_room (ch);
/*u_ */ char_to_room (ch, original);

  return;
}



void
do_at (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  ROOM_DATA *location;
  ROOM_DATA *original;
  DEFINE_COMMAND ("at", do_at, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "This command performs a command at the location specified.")

    if (IS_MOB (ch))
    return;
  argy = one_argy (argy, arg);
  if (arg[0] == '\0' || argy[0] == '\0')
    {
      send_to_char ("At where what?\n\r", ch);
      return;
    }
  if ((location = find_location (ch, arg)) == NULL)
    {
      if ((location = find_room_tag (arg)) == NULL)
        {
          send_to_char ("No such location.\n\r", ch);
          return;
        }
    }
  original = ch->in_room;
  char_from_room (ch);
/*u_ */ char_to_room (ch, location);
  gotoxy (ch, 1, ch->pcdata->pagelen);
  super_interpret (ch, argy);
  char_from_room (ch);
/*u_ */ char_to_room (ch, original);
  return;
}
 
void
do_goto (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  DEFINE_COMMAND ("goto", do_goto, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command beams you to the location specified.")
    if (argy[0] == '\0')
    {
      send_to_char ("Goto where?\n\r", ch);
      return;
    }
  strcpy (arg, "self ");
  strcat (arg, argy);
  do_transfer (ch, arg);
  return;
}

void
do_rstat (CHAR_DATA * ch, char *argy)
{
  extern char *const dir_name[];
  
 
  int sectr = 0;
  char buf[STD_LENGTH];
  char arg[SML_LENGTH];
  TRACK_DATA *tr;
  bool full = FALSE;
  ROOM_DATA *location;
  int door;
  DEFINE_COMMAND ("rstat", do_rstat, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command shows the 'redit' room stats.")

    if (IS_MOB (ch))
    return;
  if (ch != NULL && ch->in_room != NULL) sectr = ch->in_room->sector_type;
  one_argy (argy, arg);
  location = (arg[0] == '\0') ? ch->in_room : find_location (ch, arg);
  if (!str_prefix ("full", arg))
    {
      location = ch->in_room;
      full = TRUE;
    }
  if (location == NULL)
    {
      send_to_char ("No such location.\n\r", ch);
      return;
    }
  
  sprintf (buf, "Name: '%s'\n\rArea: [%3d] '%s'\n\r",
           location->name,
           location->area->vnum,
           location->area->name);
  send_to_char (buf, ch);
  sprintf (buf,
           "Vnum: %d Sector: (%d) %s - %s\n\rLight:%d. Pcs: %d CmdObj: %d\n\r",
           location->vnum, 
           location->sector_type,
	   sectors[location->sector_type].name_seen, sectors[location->sector_type].desc,
           location->light, (location->more ? location->more->pcs : 0), location->command_objs);
  send_to_char (buf, ch);
  if (location->sector_type == SECT_CAPTURE) {
	  sprintf (buf, "Capture vnum range:        %d - %d\n\r"
			"Current controlling align: %d\n\r"
			"Bonus string for align:    %s\n\r",
			location->cvnuml, location->cvnumh, location->calign, location->cbonusstr);
	  send_to_char (buf, ch);
  }
  if (location->more && IS_SET (location->room_flags2, ROOM2_MOVING))
    {
      sprintf (buf, "Autotransport direction: %s\n\r", dir_name[location->more->move_dir]);
      send_to_char (buf, ch);
      sprintf (buf, "Move message:\n\r%s",
               location->more->move_message);
      send_to_char (buf, ch);
    }
  
  sprintf (buf,
           "Room flags: %s\n\r",
           room_bit_name (location->room_flags));
  send_to_char (buf, ch);
   sprintf (buf,
           "Room flags2: %s\n\r",
           room_bit_name2 (location->room_flags2));
  send_to_char (buf, ch);
  if (location->more && location->more->extra_descr != NULL)
    {
      DESCRIPTION_DATA *ed;
      send_to_char ("Extra description keywords: ", ch);
      for (ed = location->more->extra_descr; ed; ed = ed->next)
        {
          send_to_char ("'", ch);
          send_to_char (ed->keyword, ch);
          send_to_char ("'", ch);
        }
      send_to_char ("\n\r", ch);
    }
  for (door = 0; door <= 5; door++)
    {
      EXIT_DATA *pexit;
      if ((pexit = location->exit[door]) != NULL)
        {
          if (pexit->d_info)
            sprintf (buf,
                     "Door: %5s To: %d Key: %ld Exit flags: %d(%d) '%s'\n\r",
                     dir_name[door],
                     (ROOM_DATA *) pexit->to_room != NULL ? ((ROOM_DATA *) pexit->to_room)->vnum : 0,
                     pexit->d_info->key,
                     pexit->d_info->exit_info, pexit->d_info->rs_flags,
            (pexit->d_info->keyword != NULL) ? pexit->d_info->keyword : "");
          else
            sprintf (buf,
                     "Door: %5s To: %d\n\r",
                     dir_name[door],
                     (ROOM_DATA *) pexit->to_room != NULL ? ((ROOM_DATA *) pexit->to_room)->vnum : 0);
          send_to_char (buf, ch);
          if (pexit->d_info)
            {
              if (pexit->d_info->str != 30 && pexit->d_info->str != 0)
                {
                  sprintf (buf, "\tStr: %d Max Str: %d\n\r",
                           pexit->d_info->str, pexit->d_info->maxstr);
                  send_to_char (buf, ch);
                }
            }
          if (pexit->d_info && pexit->d_info->description != NULL && pexit->d_info->description[0] != '\0')
            send_to_char (pexit->d_info->description, ch);
        }
    }
  if (full)
    {
      for (tr = location->tracks; tr != NULL; tr = tr->next_track_in_room)
        {
          char bugr[500];
          sprintf (bugr, "%s: entered %s, left %s.\n\r",
                   (IS_PLAYER (tr->ch) ? NAME (tr->ch) : tr->ch->pIndexData->short_descr),
                   (tr->dir_came == 10 ? "None" : dir_name[tr->dir_came]),
                   (tr->dir_left == 10 ? "None" : dir_name[tr->dir_left]));
          send_to_char (bugr, ch);
        }
    }
  return;
}

void
do_ostat (CHAR_DATA * ch, char *argy)
{
  char buf[STD_LENGTH];
  char arg[SML_LENGTH];
  AFFECT_DATA *paf;
  SINGLE_OBJECT *obj;
  DEFINE_COMMAND ("ostat", do_ostat, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command shows 'oedit' info on the object specified.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Ostat what?\n\r", ch);
      return;
    }
  if ((obj = get_obj_world (ch, arg)) == NULL)
    {
      send_to_char ("Nothing like that in hell, earth, or heaven.\n\r", ch);
      return;
    }
  if (LEVEL (ch) > IMM_LEVEL && LEVEL (ch) < MAX_LEVEL && obj->pIndexData->area->open != 0)
    {
      send_to_char ("Due to cheating, builders cannot ostat objects in opened areas.\n\r", ch);
      return;
    }
  sprintf (buf, "Name: '%s'.\n\rArea: [%3d] '%s'.\n\rFile: '%s'.\n\r",
           obj->pIndexData->name,
           obj->pIndexData->area->vnum,
           obj->pIndexData->area->name,
           obj->pIndexData->area->filename);
  send_to_char (buf, ch);
  sprintf (buf, "Vnum: %d. Type: %s.\n\r",
           obj->pIndexData->vnum,
           item_type_name (obj->pIndexData->item_type));
  send_to_char (buf, ch);
  sprintf (buf, "Short description: %s\e[0m\n\rLong description: %s\e[0m",
           OOSTR (obj, short_descr), OOSTR (obj, description));
  send_to_char (buf, ch);
  sprintf (buf, "Wear bits: %s.\n\r Extra bits: %s.\n\r",
           wear_bit_name (obj->pIndexData->wear_flags),
           extra_bit_name (obj->pIndexData->extra_flags));
  send_to_char (buf, ch);
  sprintf (buf, "Number: %d/%d. Weight: %d/%d.\n\r",
           1, get_obj_number (obj),
           obj->pIndexData->weight, get_obj_weight (obj));
  send_to_char (buf, ch);
  sprintf (buf, "Cost: %d. Timer: %d.\n\r",
           obj->cost, obj->timer);
  send_to_char (buf, ch);
  sprintf (buf,
           "In room: %d. In object: %s. Carried by: %s. Wear_loc: %s.\n\r",
           obj->in_room == NULL ? 0 : obj->in_room->vnum,
           obj->in_obj == NULL ? "(none)" : OOSTR (obj->in_obj, short_descr),
           obj->carried_by == NULL ? "(none)" : NAME (obj->carried_by),
           wear_loc_name (obj->wear_loc));
  send_to_char (buf, ch);

  if (obj->pIndexData->extra_descr != NULL)
    {
      DESCRIPTION_DATA *ed;
      send_to_char ("Extra description keywords: '", ch);
      for (ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next)
        {
          send_to_char (ed->keyword, ch);
          if (ed->next != NULL)
            send_to_char (" ", ch);
        }
      for (ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next)
        {
          send_to_char (ed->keyword, ch);
          if (ed->next != NULL)
            send_to_char (" ", ch);
        }
      send_to_char ("'.\n\r", ch);
    }

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

void
do_mstat (CHAR_DATA * ch, char *argy)
{
  char buf[STD_LENGTH];
  char arg[SML_LENGTH];
  AFFECT_DATA *paf;
  CHAR_DATA *victim;
  SPELL_DATA *spell;
  DEFINE_COMMAND ("mstat", do_mstat, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Shows a non-floating mob data summary of the vnum specified.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Mstat whom?\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (LEVEL (ch) > IMM_LEVEL && LEVEL (ch) < MAX_LEVEL && victim->in_room && victim->in_room->area->open != 0)
    {
      send_to_char ("Due to cheating, builders cannot mstat mobs in opened areas.\n\r", ch);
      return;
    }
  if (IS_PLAYER (victim))
    {
      send_to_char ("Not on PC's.\n\r", ch);
      return;
    }
  sprintf (buf, "Name: '%s'.\n\rArea: [%3d] '%s'.\n\r",
           RNAME (victim),
           victim->pIndexData->area->vnum,
           victim->pIndexData->area->name);
  send_to_char (buf, ch);
  sprintf (buf, "Height: \x1B[1;37m%d\x1B[37;0m (%d' %d\")\n\r",
           victim->height,
           victim->height / 12,
           victim->height % 12);
  send_to_char (buf, ch);
  sprintf (buf, "Vnum: %d  Sex: %s  In Room: %d  ",
           victim->pIndexData->vnum,
           SEX (victim) == SEX_MALE ? "male" :
           SEX (victim) == SEX_FEMALE ? "female" : "neutral",
           victim->in_room == NULL ? 0 : victim->in_room->vnum);
  send_to_char (buf, ch);
  sprintf (buf, "Hp: %ld/%ld  Moves: %d/%d\n\r",
           victim->hit, victim->max_hit,
           victim->move, victim->max_move);
  send_to_char (buf, ch);
/*sprintf( buf,
   "Str: %d Int: %d Wis: %d Dex: %d Con: %d\n\r",
   get_curr_str( victim ),
   get_curr_int( victim ),
   get_curr_wis( victim ),
   get_curr_dex( victim ),
   get_curr_con( victim ) );
   send_to_char( buf, ch );
 */
  sprintf (buf,
           "Level: %d  Alignment: %d  AC: %d  Coins: %d  Exp: %ld\n\r",
           LEVEL (victim), ALIGN (victim),
           GET_AC (victim), tally_coins (victim), victim->exp);
  send_to_char (buf, ch);
  sprintf (buf, "Hitroll: %d  Damroll: %d  Position: %d\n\r",
           GET_HITROLL (victim) + victim->pIndexData->hitroll, GET_DAMROLL (victim), victim->position);
  send_to_char (buf, ch);
  if (victim->position == POSITION_FIGHTING)
    {
      sprintf (buf, "Fighting: %s.\n\r",
               FIGHTING (victim) ? NAME (victim->fgt->fighting) : "(none)");
      send_to_char (buf, ch);
    }
  sprintf (buf, "Act: \x1B[1;37m%s\x1B[37;0m  Act3: \x1B[1;37m%s\x1B[37;0m\n\r",
      act_bit_name (victim->act), act3_bit_name (victim->pIndexData->act3));
  send_to_char (buf, ch);
  sprintf (buf, "Mobtype: %s  ",
           mob_type_name (victim->pIndexData->mobtype));
  send_to_char (buf, ch);
  if (HUNTING (victim) != NULL)
    {
      sprintf (buf, "Hunting: %s  ", victim->fgt->hunting);
      send_to_char (buf, ch);
    }
  sprintf (buf, "Master: %s  Leader: %s\n\rAffected by: %s%s.\n\r",
           MASTER (victim) ? NAME (victim->fgt->master) : "(none)",
           LEADER (victim) ? NAME (victim->fgt->leader) : "(none)",
           affect_bit_name (victim->affected_by),
           affect_bit_name_two (victim->more_affected_by));
  send_to_char (buf, ch);
  sprintf (buf, "Short description: %s\n\rLong description: %s\n\r",
           SD (victim), LD (victim));
  send_to_char (buf, ch);
  if (victim->pIndexData->spec_fun != NULL)
    {
      sprintf (buf, "Spec fun: %s.\n\r", victim->pIndexData->spec_name);
      send_to_char (buf, ch);
    }
  if (victim->pIndexData->alt_vnum != 0)
    {
      sprintf (buf, "Alter mob vnum: %d.\n\r", victim->pIndexData->alt_vnum);
      send_to_char (buf, ch);
    }
  for (paf = victim->affected; paf != NULL; paf = paf->next)
    {
      spell = skill_lookup (NULL, (int) paf->type);
      if (spell == NULL)
        continue;
      sprintf (buf,
      "Spell: '%s' modifies %s by %d for %d hours with bits %s and %s.\n\r",
               spell->spell_funky_name,
               affect_loc_name (paf->location),
               paf->modifier,
               paf->duration,
               affect_bit_name (paf->bitvector),
               affect_bit_name_two (paf->bitvector2));
      send_to_char (buf, ch);
    }
  return;
}

void
do_mfind (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  char arg3[SML_LENGTH];
  int slen = 0;
  MOB_PROTOTYPE *pMobIndex;
  char oneline[500];
  bool fRange = FALSE;
  bool fArea = FALSE;
  bool fName = FALSE;
  int range1 = 0;
  int range2 = 0;
  AREA_DATA *pArea;
  char name[SML_LENGTH];
  int vnum;
  bool found = FALSE;
  char typename[40];
  DEFINE_COMMAND ("mfind", do_mfind, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Used to find mob prototypes (vnums).")

    pArea = ch->in_room->area;
  hugebuf_o[0] = '\0';
  typename[0] = '\0';
  if (IS_MOB (ch))
    return;
  name[0]='\0';
  argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  argy = one_argy (argy, arg3);
  if (arg1[0] == '\0')
    {
      send_to_char ("Syntax: mfind all\n\r", ch);
      send_to_char (" mfind [name, area] [num1 num2]\n\r", ch);
      return;
    }
  if (is_number (arg1) && is_number (arg2))
    {
      fRange = TRUE;
      range1 = atoi (arg1);
      range2 = atoi (arg2);
      if (!str_cmp (arg3, "area"))
        fArea = TRUE;
      else
        {
          if (!str_cmp (arg3, "all"))
            {
              fRange = FALSE;
              fName = FALSE;
              fArea = FALSE;
            }
          else
            {
              fName = TRUE;
              strcpy (name, arg3);
            }
        }
    }
  else
    {
      if (is_number (arg2) && is_number (arg3))
        {
          fRange = TRUE;
          range1 = atoi (arg2);
          range2 = atoi (arg3);
        }
      if (!str_cmp (arg1, "area"))
        fArea = TRUE;
      else
        {
          if (!str_cmp (arg1, "all"))
            {
              fRange = FALSE;
              fName = FALSE;
              fArea = FALSE;
            }
          else
            {
              fName = TRUE;
              strcpy (name, arg1);
            }
        }
    }
  if (range1 > range2 && fRange)
    {
      vnum = range1;
      range1 = range2;
      range2 = vnum;
    }
  if (range2 > top_vnum_mob || !fRange)
    range2 = top_vnum_mob;
  for (vnum = range1; vnum <= range2; vnum++)
    {
      if ((pMobIndex = get_mob_index (vnum)) != NULL
          && (is_name (name, pMobIndex->name) || !fName)
          && (pMobIndex->area == pArea || !fArea))
        {
          if (pMobIndex->mobtype == -1)
            strcpy (typename, "\e[1mundefined\e[0m");
          else if (pMobIndex->mobtype != MOB_OTHER
                   && mob_type[pMobIndex->mobtype] != NULL)
            strcpy (typename, mob_type[pMobIndex->mobtype]);
          else
            strcpy (typename, "other");
          found = TRUE;
          sprintf (oneline, "[%5d %3d] %-25s%s %-25s %-10s\n\r", vnum, pMobIndex->level,
                   pMobIndex->short_descr,
                   get_ansi_spaces (pMobIndex->short_descr),
                   !fArea ? pMobIndex->name : "", typename);
          sprintf (hugebuf_o + slen, "%s", oneline);
          slen += strlen (oneline);
          if (slen > 69500)
            {
              hugebuf_o[69500] = '\0';
              break;
            }
        }
    }
  if (!found)
    send_to_char ("Nothing like that in hell, earth, or heaven.\n\r", ch);
  if (hugebuf_o[0] != '\0')
    page_to_char (hugebuf_o, ch);
  return;
}

void
do_ofind (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  char arg3[SML_LENGTH];
  OBJ_PROTOTYPE *pObjIndex;
  bool fRange = FALSE;
  bool fArea = FALSE;
  bool fName = FALSE;
  int slen = 0;
  char oneline[500];
  int range1 = 0;
  int range2 = 0;
  AREA_DATA *pArea;
  char name[SML_LENGTH];
  int vnum;
  bool found = FALSE;

  DEFINE_COMMAND ("ofind", do_ofind, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command is used to find object prototypes (vnums).")
    pArea = ch->in_room->area;
  name[0]='\0';
  if (IS_MOB (ch))
    return;
  hugebuf_o[0] = '\0';
  argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  argy = one_argy (argy, arg3);
  if (arg1[0] == '\0')
    {
      send_to_char ("Syntax: ofind all\n\r", ch);
      send_to_char (" ofind [name, area] [num1 num2]\n\r", ch);
      return;
    }
  if (!str_cmp(arg1, "sky") || !str_cmp(arg1, "spiked"))
    {
      send_to_char(" For some reason ofind sky and spiked crash it.\n\r",
ch);
      return;
    }

  if (!str_cmp(arg1,"weapons")) {
        OBJ_PROTOTYPE *op;
        int i;
        int ln;
        sprintf(hugebuf_o,"%5s %-25s  %-6s %-10s %5s %s\n\r",
                "Vnum","Weapon Name","Damage","Type","Cost","MoreAff");
        for (i=0; i<HASH_MAX; i++) {
          for (op=obj_index_hash[i];op!=NULL;op=op->next) {
                if (op->item_type!=ITEM_WEAPON) continue;
                ln=strlen(hugebuf_o);
                if (ln>69500) {
                        goto duinnn;
                        }
                sprintf(hugebuf_o+ln,"%-5d %-25s  %2dd%-2d %-10s %5d %2s\n\r",
                        op->vnum,strip_ansi_codes(op->short_descr), op->value[7],
                        op->value[8],
                        (IS_SET(op->extra_flags,ITEM_CONCUSSION)?"Concussion":
                        (IS_SET(op->extra_flags,ITEM_WHIP)?"Whipping":
                        (IS_SET(op->extra_flags,ITEM_HEAVY_SLASH)?"Hvy_slash":
                        (IS_SET(op->extra_flags,ITEM_LIGHT_SLASH)?"Lgt_slash":
                        (IS_SET(op->extra_flags,ITEM_PIERCE)?"Piercing":
                        (IS_SET(op->extra_flags,ITEM_SLASHING)?"Slashing":
                        "unknown")))))),op->cost,
                        (op->affected?"Y":"N"));
                }
          }
        duinnn:
        page_to_char(hugebuf_o,ch);
        return;
        }

  if (!str_cmp(arg1,"armors")) {
        int ln;
        OBJ_PROTOTYPE *op;
        int i;
        sprintf(hugebuf_o,"%5s %-25s  %-17s %5s %s\n\r",
                "Vnum","Armor Name","L B H A Pd Sr Pr","Cost","MoreAff");
        for (i=0; i<HASH_MAX; i++) {
          for (op=obj_index_hash[i];op!=NULL;op=op->next) {

                if (op->item_type!=ITEM_ARMOR) continue;
                ln=strlen(hugebuf_o);
                if (ln>69500) {
                        goto dunnn;
                        }
                sprintf(hugebuf_o+ln,"%-5d %-25s  %-2d%-2d%-2d%-2d%-3d%-3d%-3d %5d %2s\n\r",
                        op->vnum,strip_ansi_codes(op->short_descr),
                        op->value[0],
                        op->value[1],
                        op->value[2],
                        op->value[3],
                        op->value[4],
                        op->value[5],
                        op->value[8],
                        op->cost,
                        (op->affected?"Y":"N"));
                }
          }
        dunnn:
        page_to_char(hugebuf_o,ch);
        return;
        }
  if (is_number (arg1) && is_number (arg2))
    {
      fRange = TRUE;
      range1 = atoi (arg1);
      range2 = atoi (arg2);
      if (!str_cmp (arg3, "area"))
        fArea = TRUE;
      else
        {
          if (!str_cmp (arg3, "all"))
            {
              fRange = FALSE;
              fName = FALSE;
              fArea = FALSE;
            }
          else
            {
              fName = TRUE;
              strcpy (name, arg3);
            }
        }
    }
  else
    {
      if (is_number (arg2) && is_number (arg3))
        {
          fRange = TRUE;
          range1 = atoi (arg2);
          range2 = atoi (arg3);
        }
      if (!str_cmp (arg1, "area"))
        fArea = TRUE;
      else
        {
          if (!str_cmp (arg1, "all"))
            {
              fRange = FALSE;
              fName = FALSE;
              fArea = FALSE;
            }
          else
            {
              fName = TRUE;
              strcpy (name, arg1);
            }
        }
    }
  if (range1 > range2 && fRange)
    {
      vnum = range1;
      range1 = range2;
      range2 = vnum;
    }
  if (range2 > top_vnum_obj || !fRange)
    range2 = top_vnum_obj;
  for (vnum = range1; vnum <= range2; vnum++)
    {
      if ((pObjIndex = get_obj_index (vnum)) != NULL
          && (is_name (name, pObjIndex->name) || !fName)
          && (pObjIndex->area == pArea || !fArea))
        {
          found = TRUE;
          sprintf (oneline, "[%5d %3d] %-32s\e[0m%s %-28s\n\r", vnum,
                   pObjIndex->item_type,
                   pObjIndex->short_descr,
                   get_ansi_spaces (pObjIndex->short_descr),
                   !fArea ? pObjIndex->name : "");
          sprintf (hugebuf_o + slen, "%s", oneline);
          slen += strlen (oneline);
          if (slen > 69500)
            {
              hugebuf_o[69500] = '\0';
              break;
            }
        }
    }
  if (hugebuf_o[0] != '\0')
    page_to_char (hugebuf_o, ch);
  if (!found)
    send_to_char ("Nothing like that in hell, earth, or heaven.\n\r", ch);
  return;
}

void
do_rfind (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  char arg3[SML_LENGTH];
  ROOM_DATA *oneroom;
  bool fRange = FALSE;
  bool fArea = FALSE;
  bool fName = FALSE;
  int slen = 0;
  char oneline[500];
  int range1 = 0;
  int range2 = 0;
  AREA_DATA *pArea;
  char name[SML_LENGTH];
  int vnum;
  bool found = FALSE;
  DEFINE_COMMAND ("rfind", do_rfind, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command is used to find rooms (vnums).")
    pArea = ch->in_room->area;
  if (IS_MOB (ch))
    return;
  hugebuf_o[0] = '\0';
  argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  argy = one_argy (argy, arg3);
  if (arg1[0] == '\0')
    {
      send_to_char (" rfind [name, area] [num1 num2]\n\r", ch);
      return;
    }
  if (!str_cmp (arg1, "tags"))
    {
      int hash;
      ROOM_DATA *rid;
      for (hash = 0; hash < HASH_MAX; hash++)
        {
          for (rid = room_hash[hash]; rid != NULL; rid = rid->next)
            {
              char *t;
              for (t = rid->name; *t != '\0'; t++)
                {
                  if (*t == ';')
                    {
                      sprintf (oneline, "\x1B[0m[%5d] %s    SectorType> %s\n\r",
rid->vnum, show_room_name (ch, rid->name),(sectors[rid->sector_type].name_seen));
                      sprintf (hugebuf_o + slen, "%s", oneline);
                      slen += strlen (oneline);
                    }
                }
            }
        }
      if (hugebuf_o[0] != '\0')
        page_to_char (hugebuf_o, ch);
      return;
    }
  
  else if (is_number (arg1) && is_number (arg2))
    {
      fRange = TRUE;
      range1 = atoi (arg1);
      range2 = atoi (arg2);
      if (!str_cmp (arg3, "area") || arg3[0] == '\0')
        fArea = TRUE;
      else
        {
          if (!str_cmp (arg3, "all"))
            {
              fRange = FALSE;
              fName = FALSE;
              fArea = FALSE;
            }
          else
            {
              fName = TRUE;
              strcpy (name, arg3);
            }
        }
    }
  else
    {
      if (is_number (arg2) && is_number (arg3))
        {
          fRange = TRUE;
          range1 = atoi (arg2);
          range2 = atoi (arg3);
        }
      if (!str_cmp (arg1, "area"))
        fArea = TRUE;
     
      else
        {
          if (!str_cmp (arg1, "all"))
            {
              fRange = FALSE;
              fName = FALSE;
              fArea = FALSE;
            }
          else
            {
              fName = TRUE;
              strcpy (name, arg1);
            }
        }
    }
  if (range1 > range2 && fRange)
    {
      vnum = range1;
      range1 = range2;
      range2 = vnum;
    }
  if (range2 > top_vnum_room || !fRange)
    range2 = top_vnum_room;
  for (vnum = range1; vnum <= range2; vnum++)
    {
      if ((oneroom = get_room_index (vnum)) != NULL
          && (!fName || is_name (name, oneroom->name))
          && (oneroom->area == pArea || !fArea))
        {
          found = TRUE;
          sprintf (oneline, "[%5d %s] %-20s---%s\n\r", vnum, DESCRIPTED
(oneroom) ? "D" : "-",  oneroom->name,
sectors[oneroom->sector_type].name_seen );
          sprintf (hugebuf_o + slen, "%s", oneline);
          slen += strlen (oneline);
          if (slen > 69500)
            {
              hugebuf_o[69500] = '\0';
              break;
            }
        }
    }
  if (!found)
    send_to_char ("Nothing like that in hell, earth, or heaven.\n\r", ch);
  if (hugebuf_o[0] != '\0')
    page_to_char (hugebuf_o, ch);
  return;
}

void
do_mwhere (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  int slen = 0;
  char oneline[500];
  CHAR_DATA *victim;
  bool found;
  DEFINE_COMMAND ("mwhere", do_mwhere, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "This command is used to find actual mobs in the world.")

    hugebuf_o[0] = '\0';
  if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Mwhere whom?\n\r", ch);
      return;
    }
  found = FALSE;
  for (victim = char_list; victim != NULL; victim = victim->next)
    {
      if (IS_MOB (victim)
          && victim->in_room != NULL
          && is_name (arg, NAME (victim)))
        {
          found = TRUE;
          sprintf (oneline, "[%5d] %-28s%s [%5d] %s\n\r",
                   victim->pIndexData->vnum,
                   SD (victim),
                   get_ansi_spaces (SD (victim)),
                   victim->in_room->vnum,
                   victim->in_room->name);
          sprintf (hugebuf_o + slen, "%s", oneline);
          slen += strlen (oneline);
          if (slen > 69500)
            {
              hugebuf_o[69500] = '\0';
              break;
            }
        }
    }
  if (!found)
    act ("You didn't find any $T.", ch, NULL, arg, TO_CHAR);
  if (hugebuf_o[0] != '\0')
    page_to_char (hugebuf_o, ch);
  return;
}

void
show_guilds (CHAR_DATA * ch, int bit)
{
  if (bit != 0)
    {
      char buf[500];
      int i=0;
      bool prev= FALSE;
      if (IS_MOB(ch)) return;
      sprintf(buf, "Guild(s): ");
      for (i = 0; str_cmp(guild_data[i].what_you_type, "end_of_list"); i++)
	{
	  if (IS_SET(bit,guild_data[i].mob_guildmaster_bit))
	    {
	      if (prev)
		strcat(buf, ",");
	      strcat(buf, guild_data[i].what_you_see);
	      prev = TRUE;
	    }
	}
      
      strcat(buf, ".\n\r");
      send_to_char(buf, ch);
    }
  return;
}

void
do_pstat (CHAR_DATA * ch, char *argy)
{
  char buf[STD_LENGTH];
  char arg[SML_LENGTH];
  AFFECT_DATA *paf;
  CHAR_DATA *victim;
  SPELL_DATA *spell;
  DEFINE_COMMAND ("pstat", do_pstat, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "This command can be used to get stats on a player specified.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Pstat whom?\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    {
      send_to_char ("Not on mobs.\n\r", ch);
      return;
    }
  if (LEVEL (ch) < MAX_LEVEL && LEVEL (victim) < IMM_LEVEL)
    {
      send_to_char ("You are not allowed to look at other players' stats!\n\r", ch);
      return;
    }
  sprintf (buf, "Name: \x1B[1;37m%s  \x1B[37;0mRace: \x1B[1;37m%s (%d)\x1B[37;0m Email: \x1B[1;37m%s\x1B[37;0m.\n\r",
           NAME (victim), race_info[victim->pcdata->race].name,
           victim->pcdata->race, victim->pcdata->email);
  send_to_char (buf, ch);
  sprintf (buf, "Remorts: %d  Natural Armor: %d  Sex: %s  Deaths: %d\n\r",
           victim->pcdata->remort_times, victim->pcdata->nat_armor,
           SEX (victim) == SEX_MALE ? "male" : SEX (victim) == SEX_FEMALE ? "female" : "neutral",
           victim->pcdata->deaths);
  send_to_char (buf, ch);

  if (clan_number (victim) > 0)
    {
      sprintf (buf, "Clan: %s.\n\r", get_clan_index (clan_number (victim))->name);
      send_to_char (buf, ch);
    }
  sprintf (buf, "In Room: #%d  Warpoints: %ld Total Warpoints: %ld \n\r",
           victim->in_room == NULL ? 0 : victim->in_room->vnum,
           victim->pcdata->warpoints, 
	   victim->pcdata->total_wps);
  send_to_char (buf, ch);
  send_to_char ("Natural Abilities: ", ch);
  send_to_char (natural_abilities (victim->pcdata->nat_abilities), ch);
  send_to_char (".\n\r", ch);
  send_to_char ("Natural Abilities2: ", ch);
  send_to_char (natural_abilities2 (victim->pcdata->nat_abilities2), ch);
  send_to_char (".\n\r", ch);
  send_to_char ("Augments: ", ch);
  send_to_char (augmentss (victim->pcdata->augments), ch);
  send_to_char (".\n\r", ch);
  show_guilds (ch, victim->pcdata->guilds);
  sprintf (buf, "Str: %d  Int: %d  Wis: %d  Dex: %d  Con: %d  Bank Account: %ld.\n\r",
           get_curr_str (victim), get_curr_int (victim), get_curr_wis (victim), get_curr_dex (victim), get_curr_con (victim), victim->pcdata->bank);
  send_to_char (buf, ch);
  sprintf (buf, "Hp: %ld/%ld  Move: %d/%d  Pracs: %d  Kills: %d  Killpoints: %d\n\r",
           victim->hit, victim->max_hit,
           victim->move, victim->max_move,
           victim->pcdata->practice, victim->pcdata->totalkills,
           victim->pcdata->killpoints);
  send_to_char (buf, ch);
  sprintf (buf, "Level: %d  Alignment: %d  AC: %d  Exp: %ld  Security: %d\n\r",
           LEVEL (victim), victim->pcdata->alignment, GET_AC (victim), victim->exp, victim->pcdata->security);
  send_to_char (buf, ch);
  sprintf (buf, "Hitroll: %d  Damroll: %d  Position: %d  Learns: %d\n\r",
           GET_HITROLL (victim), GET_DAMROLL (victim),
           victim->position, victim->pcdata->learn);
  send_to_char (buf, ch);
  if (victim->position == POSITION_FIGHTING)
    {
      sprintf (buf, "Fighting: %s.\n\r",
               FIGHTING (victim) ? NAME (victim->fgt->fighting) : "(none)");
      send_to_char (buf, ch);
    }
  sprintf (buf, "Thirst: %d/50  Full: %d/50  Drunk: %d/0  Saving throw: %d\n\r",
           victim->pcdata->condition[COND_THIRST],
           victim->pcdata->condition[COND_FULL],
           victim->pcdata->condition[COND_DRUNK],
           victim->pcdata->saving_throw);
  send_to_char (buf, ch);
  sprintf (buf, "Items Carried: %d  Weight Carried: %d Stones, %d Pebbles\n\r",
           victim->pcdata->carry_number, victim->pcdata->carry_weight/WGT_MULT, victim->pcdata->carry_weight % WGT_MULT);
  send_to_char (buf, ch);
  sprintf (buf, "Age: %d  Seconds Played: %d  Act: %s.\n\r",
           get_age (victim), (int) victim->pcdata->played,
           plr_bit_name (victim->act));
  send_to_char (buf, ch);
  sprintf (buf, "Group Info... Master: %s  Leader: %s\n\rAffected by: %s (and) %s.\n\r",
           MASTER (victim) ? NAME (victim->fgt->master) : "(none)",
           LEADER (victim) ? NAME (victim->fgt->leader) : "(none)",
           affect_bit_name (victim->affected_by),
           affect_bit_name_two (victim->more_affected_by));
  send_to_char (buf, ch);
  sprintf (buf, "Short description: %s.\n\rLong description: %s\n\r",
           SD (victim),
           LD (victim));
  send_to_char (buf, ch);
  for (paf = victim->affected; paf != NULL; paf = paf->next)
    {
      spell = skill_lookup (NULL, (int) paf->type);
      if (spell == NULL)
        continue;
      sprintf (buf,
      "Spell: '%s' modifies %s by %d for %d hours with bits %s and %s.\n\r",
               spell->spell_funky_name,
               affect_loc_name (paf->location),
               paf->modifier,
               paf->duration,
               affect_bit_name (paf->bitvector),
               affect_bit_name_two (paf->bitvector2));
      send_to_char (buf, ch);
    }
  return;
}

void
do_reboo (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("reboo", do_reboo, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Protection against accidentally matching 'reboot'.")

    send_to_char ("If you want to REBOOT, spell it out.\n\r", ch);
  return;
}

void
do_reboot (CHAR_DATA * ch, char *argy)
{
  extern bool aturion_down;
  CHAR_DATA *bah;
  FILE *fpqr;
  AUCTION *auct;
  DEFINE_COMMAND ("reboot", do_reboot, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Always use REBOOT <ticks until reboot>.  Reboot 0 aborts a reboot countdown.")
    if (IS_MOB (ch))
    return;
  if (!IS_REAL_GOD (ch))
    return;

  if (is_number (argy))
    {
      send_to_char ("Ticks to reboot set... set to 0 to abort reboot.\n\r", ch);
      ticks_to_reboot = atoi (argy);
      return;
    }
   for (auct = auction_list; auct != NULL; auct = auct->next)
    {
      if (auct->item)
        {  
          obj_to(auct->item, auct->bychar);
          auct->item = NULL;
        }
    }



  for (bah = char_list; bah != NULL; bah = bah->next)
    {
      if (IS_PLAYER (bah))
        do_save (bah, "xx2xx11");
    };
  fpqr = fopen ("reason.fi", "w+");
  fprintf (fpqr, "Mud-Reboot \n\rEnd~\n\r");
  fclose (fpqr);
  aturion_down = TRUE;
  return;
}

void
do_snoop (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  DESCRIPTOR_DATA *d;
  CHAR_DATA *victim;
  DEFINE_COMMAND ("snoop", do_snoop, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "This command allows you to 'snoop' a player.")

    one_argy (argy, arg);
  if (IS_MOB (ch))
    return;

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

  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim) || victim->desc == NULL)
    {
      send_to_char ("No descriptor to snoop.\n\r", ch);
      return;
    }
  if (victim == ch)
    {
      send_to_char ("Cancelling all snoops.\n\r", ch);
      for (d = descriptor_list; d != NULL; d = d->next)
        {
          if (d->snoop_by == ch->desc)
            d->snoop_by = NULL;
        }
      return;
    }
  if (victim->desc->snoop_by != NULL)
    {
      send_to_char ("Busy already.\n\r", ch);
      return;
    }
  if (LEVEL (victim) > LEVEL (ch))
    {
      send_to_char ("You failed.\n\r", ch);
      return;
    }
  if (ch->desc != NULL)
    {
      for (d = ch->desc->snoop_by; d != NULL; d = d->snoop_by)
        {
          if (d->character == victim || d->original == victim)
            {
              send_to_char ("No snoop loops.\n\r", ch);
              return;
            }
        }
    }
  victim->desc->snoop_by = ch->desc;
  send_to_char ("Ok.\n\r", ch);
  return;
}

void
do_switch (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  CHAR_DATA *victim;
  DEFINE_COMMAND ("switch", do_switch, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command allows you to switch into a mob.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Switch into whom?\n\r", ch);
      return;
    }
  if (IS_MOB (ch) || ch->desc == NULL)
    return;
  if (ch->desc->original != NULL)
    return;

  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (victim == ch)
    {
      send_to_char ("Ok.\n\r", ch);
      return;
    }
  ch->desc->character = victim;
  ch->desc->original = ch;
  victim->desc = ch->desc;
  ch->desc = NULL;
  send_to_char ("Ok.\n\r", victim);
  return;
}
/* Make sure switch is okay.. sorta iffy :) */

void
do_return (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("return", do_return, POSITION_DEAD, 0, LOG_NORMAL, "This command allows you to return from a switch command.")

    if (IS_PLAYER (ch))
    return;
  if (ch->desc == NULL)
    return;
  if (ch->desc->original == NULL)
    {
      send_to_char ("You aren't switched.\n\r", ch);
      return;
    }
  send_to_char ("You return to your original body.\n\r", ch);
  ch->desc->character = ch->desc->original;
  ch->desc->original = NULL;
  ch->desc->character->desc = ch->desc;
  ch->desc = NULL;
  return;
}

void
do_mload (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  MOB_PROTOTYPE *pMobIndex;
  CHAR_DATA *victim;
  char *t;
  DEFINE_COMMAND ("mload", do_mload, POSITION_DEAD, IMM_LEVEL, LOG_ALWAYS, "Syntax: Mload <vnum>, where <vnum> is the mob template vnum of the mob you wish to create.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0' || !is_number (arg))
    {
      send_to_char ("Syntax: mload <vnum>.\n\r", ch);
      return;
    }
  if ((pMobIndex = get_mob_index (atoi (arg))) == NULL)
    {
      send_to_char ("No mob has that vnum.\n\r", ch);
      return;
    }
  for (t = pMobIndex->name; *t != '\0'; t++)
    if (*t == '%')
      {
        send_to_char ("You may not mload this mob... it is meant for internal game use only.\n\r", ch);
        return;
      }
  for (t = pMobIndex->short_descr; *t != '\0'; t++)
    if (*t == '%')
      {
        send_to_char ("You may not mload this mob... it is meant for internal game use only.\n\r", ch);
        return;
      }
  victim = create_mobile (pMobIndex);
  char_to_room (victim, ch->in_room);
  act ("$n has created $N!", ch, NULL, victim, TO_ROOM);
  act ("You create $N!", ch, NULL, victim, TO_CHAR);
  return;
}

void
do_oload (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  OBJ_PROTOTYPE *pObjIndex;
  SINGLE_OBJECT *obj;
  char *t;
  DEFINE_COMMAND ("oload", do_oload, POSITION_DEAD, IMM_LEVEL, LOG_ALWAYS, "Creates an object from the specified object template (vnum).")

    if (IS_MOB (ch))
    return;
  argy = one_argy (argy, arg1);
  if (arg1[0] == '\0' || !is_number (arg1))
    {
      send_to_char ("Syntax: oload <vnum>.\n\r", ch);
      return;
    }
  if ((pObjIndex = get_obj_index (atoi (arg1))) == NULL)
    {
      send_to_char ("No object has that vnum.\n\r", ch);
      return;
    }

  for (t = pObjIndex->name; *t != '\0'; t++)
    if (*t == '%')
      {
        send_to_char ("You may not oload this item... it is meant for internal game use only.\n\r", ch);
        return;
      }
  for (t = pObjIndex->short_descr; *t != '\0'; t++)
    if (*t == '%')
      {
        send_to_char ("You may not oload this item... it is meant for internal game use only.\n\r", ch);
        return;
      }
  obj = create_object (pObjIndex, 1);
  if (CAN_WEAR (obj, ITEM_TAKE))
    {
      obj_to (obj, ch);
    }
  else
    {
      obj_to (obj, ch->in_room);
    }
  act ("$n has created $p!", ch, obj, NULL, TO_ROOM);
  act ("You create $p!", ch, obj, NULL, TO_CHAR);
  return;
}

void
raw_purge (ROOM_DATA * rid)
{
  CHAR_DATA *victim;
  CHAR_DATA *vnext;
  SINGLE_OBJECT *obj;
  SINGLE_OBJECT *obj_next;
  if (!rid->more)
    return;
  for (victim = rid->more->people; victim != NULL; victim = vnext)
    {
      vnext = victim->next_in_room;
      if (IS_MOB (victim) && victim->desc == NULL)
        extract_char (victim, TRUE);
      if (!rid->more)
        return;
    }
  if (!rid->more)
    return;
  rid->more->copper = 0;
  rid->more->gold = 0;
  for (obj = rid->more->contents; obj != NULL; obj = obj_next)
    {
      obj_next = obj->next_content;
      free_it (obj);
      if (!rid->more)
        return;
    }
  return;
}

void
do_purge (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *v;
  DEFINE_COMMAND ("purge", do_purge, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command purges the room of all mobs and objects.")
    if (!ch->in_room->more)
    return;
  if (IS_MOB (ch))
    return;
  raw_purge (ch->in_room);
  for (v = ch->in_room->more->people; v != NULL; v = v->next_in_room)
    {
      if (LEVEL (v) > IMM_LEVEL)
        act ("$n cleanses the room with righteous fire!", ch, NULL, v, TO_VICT);
    }
  send_to_char ("You cleanse the room with righteous fire!\n\r", ch);
  return;
}

void
do_advance (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  CHAR_DATA *victim;
  int level;
  int iLevel;
  DEFINE_COMMAND ("advance", do_advance, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command advances a char's level.  Their experience is set to 0.  Never use this on players.")

    if (IS_MOB (ch))
    return;
  if (!IS_REAL_GOD (ch))
    return;

  argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  if (arg1[0] == '\0' || arg2[0] == '\0' || !is_number (arg2))
    {
      send_to_char ("Syntax: advance <char> <level>.\n\r", ch);
      return;
    }
  if ((victim = get_char_room (ch, arg1)) == NULL)
    {
      send_to_char ("That player is not here.\n\r", ch);
      return;
    }

  if ((level = atoi (arg2)) < 1 || level > TOP_LEVEL)
    {
      char buf[STD_LENGTH];
      sprintf (buf, "Level must be 1 to %d.\n\r", TOP_LEVEL);
      send_to_char (buf, ch);
      return;
    }

  if (level > LEVEL (ch) || IS_MOB (victim))
    return;

  if (level < LEVEL (victim))
    {
      int sn;
      send_to_char ("Lowering a player's level!\n\r", ch);
      victim->pcdata->level = 1;
	victim->exp = FIND_EXP (level - 1, 0);
      victim->max_hit = 25;
      victim->max_move = 70;
      for (sn = 0; sn < SKILL_COUNT; sn++)
        victim->pcdata->learned[sn] = -100;
      victim->pcdata->practice = 0;
      victim->hit = victim->max_hit;
      victim->move = victim->max_move;
      advance_level (victim);
    }
  else
    {
      send_to_char ("Raising a player's level!\n\r", ch);
    }
  for (iLevel = LEVEL (victim); iLevel < level; iLevel++)
    {
      send_to_char ("You raise a level! ", victim);
      victim->pcdata->level += 1;
      advance_level (victim);
    }
    victim->exp = FIND_EXP (LEVEL (victim) - 1, 0);
  return;
}

void
do_restore (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  CHAR_DATA *victim;
  DEFINE_COMMAND ("restore", do_restore, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This restores hps and mps to a specified character or mob.")

/*if (IS_MOB(ch) && ch!=char_list) return; */
    one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Restore whom?\n\r", ch);
      return;
    }
  if ((victim = get_char_world_2 (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }

  MAXHIT(victim);
  MAXMOVE(victim);
  update_pos (victim);
  send_to_char ("Ok.\n\r", ch);
  return;
}

void
do_freeze (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  CHAR_DATA *victim;
  DEFINE_COMMAND ("freeze", do_freeze, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command freezes the specified player; they can't do *anything*.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Freeze whom?\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    return;

  if (LEVEL (victim) >= LEVEL (ch))
    return;

  if (IS_SET (victim->act, PLR_FREEZE))
    {
      REMOVE_BIT (victim->act, PLR_FREEZE);
      send_to_char ("You have been defrosted.\n\r", victim);
      send_to_char ("FREEZE removed.\n\r", ch);
    }
  else
    {
      SET_BIT (victim->act, PLR_FREEZE);
      send_to_char ("You have been frozen!\n\r", victim);
      send_to_char ("FREEZE set.\n\r", ch);
    }
  save_char_obj (victim);
  return;
}
void
do_noclan (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  CHAR_DATA *victim;
  DEFINE_COMMAND ("noclan", do_noclan, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command noclans the specified player; they can't do *anything*.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Noclan whom?\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    return;

  if (LEVEL (victim) >= LEVEL (ch))
    return;

  if (IS_SET (victim->act, PLR_NOCLAN))
    {
      REMOVE_BIT (victim->act, PLR_NOCLAN);
      send_to_char ("You have been defrosted.\n\r", victim);
      send_to_char ("NOCLAN removed.\n\r", ch);
    }
  else
    {
      SET_BIT (victim->act, PLR_NOCLAN);
      send_to_char ("You have been frozen!\n\r", victim);
      send_to_char ("NOCLAN set.\n\r", ch);
    }
  save_char_obj (victim);
  return;
}
void
do_lamer (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  CHAR_DATA *victim;
  DEFINE_COMMAND ("lamer", do_lamer, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command lamers the specified player; they can't do *anything*.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Lamer whom?\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    return;

  if (LEVEL (victim) >= LEVEL (ch))
    return;

  if (IS_SET (victim->act, PLR_LAMER))
    {
      REMOVE_BIT (victim->act, PLR_LAMER);
      send_to_char ("You have been defrosted.\n\r", victim);
      send_to_char ("LAMER removed.\n\r", ch);
    }
  else
    {
      SET_BIT (victim->act, PLR_LAMER);
      send_to_char ("You have been frozen!\n\r", victim);
      send_to_char ("LAMER set.\n\r", ch);
    }
  save_char_obj (victim);
  return;
}
void
do_shitlist (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  CHAR_DATA *victim;
  DEFINE_COMMAND ("shitlist", do_shitlist, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command shitlists the specified player; they can't do *anything*.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Shitlist whom?\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    return;

  if (LEVEL (victim) >= LEVEL (ch))
    return;

  if (IS_SET (victim->act, PLR_FREEZE))
    {
      REMOVE_BIT (victim->act, PLR_FREEZE);
      send_to_char ("You have been defrosted.\n\r", victim);
      send_to_char ("SHITLIST removed.\n\r", ch);
    }
  else
    {
      SET_BIT (victim->act, PLR_FREEZE);
      send_to_char ("You have been frozen!\n\r", victim);
      send_to_char ("SHITLIST set.\n\r", ch);
    }
  save_char_obj (victim);
  return;
}

void
do_log (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  CHAR_DATA *victim;
  DEFINE_COMMAND ("log", do_log, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command can be used to log a player or multiple players.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Log whom?\n\r", ch);
      return;
    }
  if (!str_cmp (arg, "all"))
    {
      if (fLogAll)
        {
          fLogAll = FALSE;
          send_to_char ("Log ALL off.\n\r", ch);
        }
      else
        {
          fLogAll = TRUE;
          send_to_char ("Log ALL on.\n\r", ch);
        }
      return;
    }
  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    return;

  if (IS_SET (victim->act, PLR_LOG))
    {
      REMOVE_BIT (victim->act, PLR_LOG);
      send_to_char ("LOG removed.\n\r", ch);
    }
  else
    {
      SET_BIT (victim->act, PLR_LOG);
      send_to_char ("LOG set.\n\r", ch);
    }
  return;
}

void
do_silence (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  CHAR_DATA *victim;
  DEFINE_COMMAND ("silence", do_silence, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command removes all channel privaledges but 'say' from a specified player.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Silence whom?", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    return;

  if (LEVEL (victim) >= LEVEL (ch))
    {
      send_to_char ("You failed.\n\r", ch);
      return;
    }
  if (IS_SET (victim->pcdata->act2, PLR_SILENCE))
    {
      REMOVE_BIT (victim->pcdata->act2, PLR_SILENCE);
      send_to_char ("SILENCE removed.\n\r", ch);
    }
  else
    {
      SET_BIT (victim->pcdata->act2, PLR_SILENCE);
      send_to_char ("SILENCE set.\n\r", ch);
    }
  return;
}

void
do_peace (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *rch;
  DEFINE_COMMAND ("peace", do_peace, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command stops all the fighting that is going on in the current room.")
    check_room_more (ch->in_room);
  for (rch = ch->in_room->more->people; rch != NULL; rch = rch->next_in_room)
    {
      if (FIGHTING (rch) != NULL)
        {
          rch->fgt->fighting = NULL;
          NEW_POSITION(rch, POSITION_STANDING);
          if (rch->fgt->hunting != NULL)
            {
              free_string (rch->fgt->hunting);
              rch->fgt->hunting = NULL;
            }
	  if (rch->fgt->phunting !=NULL) /* JRAJRA - track stuff */
	    {
	      free_string (rch->fgt->phunting);
	      rch->fgt->phunting = NULL;
	    }
          update_pos (rch);
        }
    }
  return;
}

BAN_DATA *ban_free;
BAN_DATA *ban_list;

void
do_ban (CHAR_DATA * ch, char *argy)
{
  char buf[STD_LENGTH];
  char arg[SML_LENGTH];
  BAN_DATA *pban;
  DEFINE_COMMAND ("siteban", do_ban, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command shows and/or adds ban info.  See nban for marking newbie problem sites.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      strcpy (buf, "Banned sites:\n\r");
      for (pban = ban_list; pban != NULL; pban = pban->next)
        {
          if (pban->newbie)
            strcat (buf, "(\x1B[1;37mN\x1B[37;0m) ");
          else
            strcat (buf, " ");
          strcat (buf, pban->name);
          strcat (buf, "\n\r");
        }
      send_to_char (buf, ch);
      return;
    }
  for (pban = ban_list; pban != NULL; pban = pban->next)
    {
      if (!str_cmp (arg, pban->name))
        {
          send_to_char ("That site is already banned!\n\r", ch);
          return;
        }
    }
  if (ban_free == NULL)
    {
      pban = mem_alloc (sizeof (*pban));
    }
  else
    {
      pban = ban_free;
      ban_free = ban_free->next;
    }
  pban->name = str_dup (arg);
  pban->next = ban_list;
  pban->newbie = FALSE;
  ban_list = pban;
  send_to_char ("Ok.\n\r", ch);
  save_banlist ();
  return;
}

void
bansite (char *argy)
{
  char arg[SML_LENGTH];
  BAN_DATA *pban;
  one_argy (argy, arg);
  for (pban = ban_list; pban != NULL; pban = pban->next)
    {
      if (!str_cmp (arg, pban->name))
        {
          return;
        }
    }
  if (ban_free == NULL)
    {
      pban = mem_alloc (sizeof (*pban));
    }
  else
    {
      pban = ban_free;
      ban_free = ban_free->next;
    }
  pban->name = str_dup (arg);
  pban->next = ban_list;
  pban->newbie = FALSE;
  ban_list = pban;
  return;
}

void
do_nban (CHAR_DATA * ch, char *argy)
{
  char buf[STD_LENGTH];
  char arg[SML_LENGTH];
  BAN_DATA *pban;
  DEFINE_COMMAND ("nban", do_nban, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command marks a site as a newbie problem site.  All new chars from this site must do registration.")
    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      strcpy (buf, "Banned sites:\n\r");
      for (pban = ban_list; pban != NULL; pban = pban->next)
        {
          if (pban->newbie)
            strcat (buf, "(\x1B[1;37mN\x1B[37;0m) ");
          else
            strcat (buf, " ");
          strcat (buf, pban->name);
          strcat (buf, "\n\r");
        }
      send_to_char (buf, ch);
      return;
    }
  for (pban = ban_list; pban != NULL; pban = pban->next)
    {
      if (!str_cmp (arg, pban->name))
        {
          send_to_char ("That site is already banned!\n\r", ch);
          return;
        }
    }
  if (ban_free == NULL)
    {
      pban = mem_alloc (sizeof (*pban));
    }
  else
    {
      pban = ban_free;
      ban_free = ban_free->next;
    }
  pban->name = str_dup (arg);
  pban->next = ban_list;
  pban->newbie = TRUE;
  ban_list = pban;
  send_to_char ("Ok.\n\r", ch);
  save_banlist ();
  return;
}

void
nbansite (char *argy)
{
  char arg[SML_LENGTH];
  BAN_DATA *pban;
  one_argy (argy, arg);
  for (pban = ban_list; pban != NULL; pban = pban->next)
    {
      if (!str_cmp (arg, pban->name))
        {
          return;
        }
    }
  if (ban_free == NULL)
    {
      pban = mem_alloc (sizeof (*pban));
    }
  else
    {
      pban = ban_free;
      ban_free = ban_free->next;
    }
  pban->name = str_dup (arg);
  pban->next = ban_list;
  pban->newbie = TRUE;
  ban_list = pban;
  return;
}

void
do_allow (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  BAN_DATA *prev;
  BAN_DATA *curr;
  DEFINE_COMMAND ("allow", do_allow, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command removes a ban site from the list.")

    if (IS_MOB (ch))
    return;
  one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Remove which site from the ban list?\n\r", ch);
      return;
    }
  prev = NULL;
  for (curr = ban_list; curr != NULL; prev = curr, curr = curr->next)
    {
      if (!str_cmp (arg, curr->name))
        {
          if (prev == NULL)
            ban_list = ban_list->next;
          else
            prev->next = curr->next;
          free_string (curr->name);
          curr->next = ban_free;
          ban_free = curr;
          send_to_char ("Ok.\n\r", ch);
          return;
        }
    }
  save_banlist();
  send_to_char ("Site is not banned.\n\r", ch);
  return;
}

void
do_wizlock (CHAR_DATA * ch, char *argy)
{
  extern bool wizlock;
  DEFINE_COMMAND ("wizlock", do_wizlock, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This makes it so only gods can log in.")

    wizlock = !wizlock;
  if (wizlock)
    send_to_char ("Game wizlocked.\n\r", ch);
  else
    send_to_char ("Game un-wizlocked.\n\r", ch);
  return;
}

void
do_slookup (CHAR_DATA * ch, char *argy)
{
  char buf[STD_LENGTH];
  char arg[SML_LENGTH];
  int sn;
  SPELL_DATA *spell;
  DEFINE_COMMAND ("slookup", do_slookup, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Looks up a skill or spell number, or slookup 'all', or slookup find <snum>.")

    if (IS_MOB (ch))
    return;
  argy = one_argy (argy, arg);
  if (arg[0] == '\0')
    {
      send_to_char ("Slookup what?\n\r", ch);
      return;
    }
  if (is_number (arg))
    {
      sn = atoi (arg);
      if ((spell = skill_lookup (NULL, sn)) == NULL)
        {
          send_to_char ("Invalid Spell/Skill Number.\n\r", ch);
          return;
        }
      sprintf (buf, "Spell/skill number: %4d  Skill/spell: '%s' Aka: '%s'\n\r",
               sn, /*spell->slot,*/ spell->spell_name, spell->spell_funky_name);
      send_to_char (buf, ch);
      return;
    }
  if (!str_cmp (arg, "all"))
    {
      for (sn = 0; sn < SKILL_COUNT; sn++)
        {
          if ((spell = skill_lookup (NULL, sn)) == NULL)
            continue;
          sprintf (buf, "Spell/skill number: %4d  Skill/spell: '%s' Aka: '%s'\n\r",
               sn, /*spell->slot,*/ spell->spell_name, spell->spell_funky_name);
          send_to_char (buf, ch);
        }
    }
  else
    {
      if ((spell = skill_lookup (arg, -1)) == NULL)
        {
          int cntr, subctr;
          char buffy[500];
          SPELL_DATA *spl;
          MOB_PROTOTYPE *mid;
          if (!str_cmp (arg, "find") && is_number (argy))
            {
              if (!IS_REAL_GOD (ch))
                return;
              sn = atoi (argy);
              if ((spl = skill_lookup (NULL, sn)) == NULL)
                {
                  send_to_char ("Invalid!\n\r", ch);
                  return;
                }
              sprintf (buffy, "Mobs that teach sn %d (\x1B[1m%s\x1B[0m)...\n\r", sn, spl->spell_name);
              send_to_char (buffy, ch);
              for (cntr = 1; cntr < top_vnum_mob; cntr++)
                {
                  if ((mid = get_mob_index (cntr)) == NULL || !mid->opt)
                    continue;
                  for (subctr = 0; subctr < 30; subctr++)
                    {
                      if (mid->opt->skltaught[subctr] == sn)
                        {
                          sprintf (buffy, "\x1B[1;37m%-20s\x1B[37;0m vnum \x1B[1;32m%d\x1B[37;0m, teaches this skill/spell.\n\r", mid->short_descr, mid->vnum);
                          send_to_char (buffy, ch);
                        }
                    }
                }
            }
          else
            send_to_char ("No such skill or spell.\n\r", ch);
          return;
        }
      sprintf (buf, "Spell/skill number: %4d  Skill/spell: '%s' Aka: '%s'\n\r",
       spell->gsn, spell->spell_name, spell->spell_funky_name);
      send_to_char (buf, ch);
    }
  return;
}

void
do_award_skill (CHAR_DATA * ch, char *argy)
{
  char arg1[500];
  char arg2[500];
  char arg3[500];
  SPELL_DATA *spl;
  DESCRIPTOR_DATA *dd;
  int amount;
  DEFINE_COMMAND ("awardskill", do_award_skill, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Awards a skill to a player.  Mostly used for quests.")

    argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  argy = one_argy (argy, arg3);
  if ((amount = atoi (arg3)) < 1)
    return;
  if ((spl = skill_lookup (arg2, -1)) == NULL)
    return;
  for (dd = descriptor_list; dd != NULL; dd = dd->next)
    {
      if (!dd->character)
        continue;
      if (!str_cmp (NAME (dd->character), arg1))
        goto found;
    }
  return;
found:
  if (dd->character->pcdata->learned[spl->gsn] < 0)
    dd->character->pcdata->learned[spl->gsn] = 1;
  if (dd->character->pcdata->learned[spl->gsn] > 80)
    amount /= 5;
  else if (dd->character->pcdata->learned[spl->gsn] > 65)
    amount /= 4;
  else if (dd->character->pcdata->learned[spl->gsn] > 50)
    amount /= 3;
  else if (dd->character->pcdata->learned[spl->gsn] > 35)
    amount /= 2;
  dd->character->pcdata->learned[spl->gsn] = UMIN (100, (dd->character->pcdata->learned[spl->gsn] + amount));
  return;
}

void
do_sset (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  char arg3[SML_LENGTH];
  CHAR_DATA *victim;
  int value;
  int sn;
  bool fAll;
  SPELL_DATA *spell;
  DEFINE_COMMAND ("sset", do_sset, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This sets a person's skills/spells (all or specific skill, and amount).")

    if (IS_PLAYER (ch) && LEVEL (ch) < MAX_LEVEL)
    return;
  argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  argy = one_argy (argy, arg3);
  if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
    {
      send_to_char ("Syntax: sset <victim> <skill> <value>\n\r", ch);
      send_to_char ("or: sset <victim> all <value>\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg1)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    {
      send_to_char ("Not on mobs.\n\r", ch);
      return;
    }
  if (LEVEL (victim) < IMM_LEVEL && LEVEL (ch) < MAX_LEVEL)
    {
      send_to_char ("You may not set players' skills!\n\r", ch);
      send_to_char ("Cheat attempt logged!\n\r", ch);
      return;
    }
  fAll = !str_cmp (arg2, "all");
  spell = skill_lookup (arg2, -1);
  sn = 0;
  if (!fAll && spell == NULL)
    {
      send_to_char ("No such skill or spell.\n\r", ch);
      return;
    }
  if (!is_number (arg3))
    {
      send_to_char ("Value must be numeric.\n\r", ch);
      return;
    }
  value = atoi (arg3);
  if (value < 0 || value > 100)
    {
      send_to_char ("Value range is 0 (unlearned) to 100.\n\r", ch);
      return;
    }
  if (fAll)
    {
      for (sn = 0; sn < SKILL_COUNT; sn++)
        {
          if (skill_lookup (NULL, sn) != NULL)
            victim->pcdata->learned[sn] = (value == 0 ? -100 : value);
        }
      return;
    }
  else
    {
      victim->pcdata->learned[spell->gsn] = (value == 0 ? -100 : value);
    }
  return;
}

void
do_mset (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  char arg3[SML_LENGTH];
  CHAR_DATA *victim;
  int value;
  DEFINE_COMMAND ("mset", do_mset, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Sets a specific mob's stats and stuff...")

    if (IS_MOB (ch))
    return;
  if (!IS_REAL_GOD (ch))
    {
      send_to_char ("Command has been removed.\n\r", ch);
      return;
    }
  smash_tilde (argy);
  argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  strcpy (arg3, argy);
  if (arg1[0] == '\0' || arg2[0] == '\0')
    {
      send_to_char ("Syntax: mset <victim> <field> <value>\n\r", ch);
      send_to_char ("or: mset <victim> <string> <value>\n\r", ch);
      send_to_char ("\n\r", ch);
      send_to_char ("Field being one of:\n\r", ch);
      send_to_char (" sex level\n\r", ch);
      send_to_char (" hp move timer\n\r", ch);
      send_to_char (" align master leader practice\n\r", ch);
      send_to_char (" act affect hunting\n\r", ch);
      send_to_char ("\n\r", ch);
      send_to_char ("String being one of:\n\r", ch);
      send_to_char (" name short long description spec\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, arg1)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_PLAYER (victim))
    {
      send_to_char ("Not on players.. only mobs.\n\r", ch);
      return;
    }
  if (LEVEL (ch) < MAX_LEVEL && victim->in_room && victim->in_room->area->open != 0)
    {
      send_to_char ("You cannot set mobs that are in open areas!\n\r", ch);
      send_to_char ("Possible cheat attempt logged.\n\r", ch);
      return;
    }
  value = is_number (arg3) ? atoi (arg3) : -1;
  if (!str_cmp (arg2, "hp") && arg3[0] != '\0')
    {
      if (value < -10 || value > 2000000000)
        {
          send_to_char ("Hp range is -10 to 2,000,000,000 hit points.\n\r", ch);
          return;
        }
      victim->max_hit = value;
      return;
    }
  if (!str_cmp (arg2, "move") && arg3[0] != '\0')
    {
      if (value < 0 || value > 30000)
        {
          send_to_char ("Move range is 0 to 30,000 move points.\n\r", ch);
          return;
        }
      victim->max_move = value;
      return;
    }
  if (!str_cmp (arg2, "timer") && arg3[0] != '\0')
    {
      if (value < 0 || value > 30000)
        {
          send_to_char ("Timer range is 0 to 30,000.\n\r", ch);
          return;
        }
      victim->timer = value;
      return;
    }
  if (!str_cmp (arg2, "practice") && arg3[0] != '\0')
    {
      if (value < 0 || value > 100)
        {
          send_to_char ("Practice range is 0 to 100 sessions.\n\r", ch);
          return;
        }
      victim->pcdata->practice = value;
      return;
    }
  if (!str_cmp (arg2, "hunting") && arg3[0] != '\0' && strlen (arg3) < 16)
    {
      check_fgt (victim);
      if (victim->fgt->hunting != NULL)
        {
          free_string (victim->fgt->hunting);
          victim->fgt->hunting = NULL;
        }
      victim->fgt->hunting = str_dup (arg3);
      send_to_char ("Done.\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "master") && arg3[0] != '\0')
    {
      check_fgt (victim);
      if (!str_cmp (arg3, "none"))
        {
          victim->fgt->master = NULL;
          return;
        }
      if ((get_char_world (ch, arg3)) == NULL)
        {
          send_to_char ("They aren't here.\n\r", ch);
          return;
        }
      victim->fgt->master = get_char_world (ch, arg3);
      return;
    }
  if (!str_cmp (arg2, "leader") && arg3[0] != '\0')
    {
      check_fgt (victim);
      if (!str_cmp (arg3, "none"))
        {
          victim->fgt->leader = NULL;
          return;
        }
      if ((get_char_world (ch, arg3)) == NULL)
        {
          send_to_char ("They aren't here.\n\r", ch);
          return;
        }
      victim->fgt->leader = get_char_world (ch, arg3);
      return;
    }
  if (!str_cmp (arg2, "affect") && arg3[0] != '\0')
    {
      victim->affected_by = value;
      return;
    }
  if (!str_cmp (arg2, "spec") && arg3[0] != '\0')
    {
      if (spec_lookup (arg3) == NULL)
        {
          send_to_char ("No such spec fun.\n\r", ch);
          return;
        }
      victim->pIndexData->spec_fun = spec_lookup (arg3);
      victim->pIndexData->spec_name = str_dup (arg3);
      return;
    }
  do_mset (ch, "");
  return;
}

void
do_oset (CHAR_DATA * ch, char *argy)
{
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  char arg3[SML_LENGTH];
  SINGLE_OBJECT *obj;
  int value;
  DEFINE_COMMAND ("oset", do_oset, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Sets a specific object's stats and stuff...")

    if (IS_MOB (ch))
    return;
  if (LEVEL (ch) < MAX_LEVEL)
    {
      send_to_char ("Command has been removed due to abuse!\n\r", ch);
      return;
    }
  smash_tilde (argy);
  argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  strcpy (arg3, argy);
  if (arg1[0] == '\0' || arg2[0] == '\0')
    {
      send_to_char ("Syntax: oset <object> <field> <value>\n\r", ch);
      send_to_char ("or: oset <object> <string> <value>\n\r", ch);
      send_to_char ("\n\r", ch);
      send_to_char ("Field being one of:\n\r", ch);
      send_to_char (" extra wear level weight\n\r", ch);
      send_to_char (" cost type timer\n\r", ch);
      send_to_char ("\n\r", ch);
      send_to_char ("String being one of:\n\r", ch);
      send_to_char (" name short long ed\n\r", ch);
      return;
    }
  if ((obj = get_obj_world (ch, arg1)) == NULL)
    {
      send_to_char ("Nothing like that in hell, earth, or heaven.\n\r", ch);
      return;
    }
  value = atoi (arg3);

  if (!str_cmp (arg2, "short") && arg3[0] != '\0')
    {
      if (obj->short_descr != NULL)
        free_string (obj->short_descr);
      obj->short_descr = str_dup (arg3);
      return;
    }
  if (!str_cmp (arg2, "long"))
    {
      send_to_char ("Entering line editing mode.\n\r", ch);
      send_to_char ("Terminate with a ~ on a blank line.\n\r", ch);
      ch->desc->pString = &obj->description;
      return;
    }
  if (!str_cmp (arg2, "cost") && arg3[0] != '\0')
    {
      obj->cost = value;
      return;
    }
  if (!str_cmp (arg2, "timer") && arg3[0] != '\0')
    {
      obj->timer = value;
      return;
    }

  do_oset (ch, "");
  return;
}

void
do_pset (CHAR_DATA * ch, char *argy)
{
  bool ad=FALSE;
  bool sb=FALSE;
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  char arg3[SML_LENGTH];
  CHAR_DATA *victim;
  int value;
  DEFINE_COMMAND ("pset", do_pset, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Changes a player's info...")

    smash_tilde (argy);
  argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  strcpy (arg3, argy);
  if (arg1[0] == '\0' || arg2[0] == '\0')
    {
      send_to_char ("Syntax: pset <victim> <field> <value>\n\r", ch);
      send_to_char ("\n\r", ch);
      send_to_char ("Options:\n\r", ch);
      send_to_char (" (Use pedit to set attribs) sex security killpts AC compflag\n\r", ch);
      send_to_char (" hp move practice align race height removexp removetp\n\r", ch);
      send_to_char (" thirst guild drunk full master leader learn addxp addtp\n\r", ch);
      send_to_char (" ipflag tflag warpoints deaths (fly/breath/d_hid/d_invis/infra) tp\n\r", ch);
      send_to_char (" short long description title remort str con dex int wis\n\r", ch);
      send_to_char (" align_fire align_water align_air hardcore\n\r", ch);
      return;
    }
  if ((victim = get_char_world_2 (ch, arg1)) == NULL)
    {
      send_to_char ("They aren't here.\n\r", ch);
      return;
    }
  if (IS_MOB (victim))
    {
      send_to_char ("Not on mobs.\n\r", ch);
      return;
    }
  if (!str_cmp ("scriptflag", arg2))
    {
      int ik;
      argy = one_argy (argy, arg3);
      if (!str_cmp (argy, "off"))
        {
          for (ik = 0; ik < MAX_SCRIPT_FLAGS; ik++)
            {
              if (victim->pcdata->script_flags[ik] && victim->pcdata->script_flags[ik][0] != '\0' &&
                  !str_cmp (victim->pcdata->script_flags[ik], arg3))
                {
                  free_string (victim->pcdata->script_flags[ik]);
                  victim->pcdata->script_flags[ik] = NULL;
                  return;
                }
            }
        }
      if (!str_cmp (argy, "on"))
        {
          for (ik = 0; ik < MAX_SCRIPT_FLAGS; ik++)
            {
              if (!victim->pcdata->script_flags[ik])
                continue;
              if (!str_cmp (victim->pcdata->script_flags[ik], arg3))
                return;
            }
          for (ik = 0; ik < MAX_SCRIPT_FLAGS; ik++)
            {
              if (victim->pcdata->script_flags[ik] && victim->pcdata->script_flags[ik][0] != '\0')
                continue;
              victim->pcdata->script_flags[ik] = str_dup (arg3);
              return;
            }
        }
      return;
    }
  if (arg3[0] == '-') {
    char *rr=arg3;
    value=(0-(atoi((rr+1))));
    sb=TRUE;
    value = atoi (arg3);
    }
  else
  if (arg3[0] == '+') {
        char *rr=arg3;
        ad=TRUE;
        value=atoi((rr+1));
        } else
    value = is_number (arg3) ? atoi (arg3) : -1;

  if (!str_cmp (arg2, "hardcore")) {
    if (IS_MOB (ch))
    return;
    if (IS_SET (victim->pcdata->act2, PLR_HARDCORE))
    {
      REMOVE_BIT (victim->pcdata->act2, PLR_HARDCORE);
      send_to_char ("Hardcore mode off.\n\r", ch);
    }
    else
    {
      SET_BIT (victim->pcdata->act2, PLR_HARDCORE);
      send_to_char ("Hardcore mode on.\n\r", ch);
    }
    return;
  }
  // Set elemental alignment
  if (!str_cmp (arg2, "align_fire")) {

    victim->pcdata->elemental_alignment ^= ELEMENTAL_ALIGN_FIRE;
    send_to_char ("Fire Alignment Toggled\n\r",ch);
    return;
  }
  if (!str_cmp (arg2, "align_water")) {

    victim->pcdata->elemental_alignment ^= ELEMENTAL_ALIGN_WATER;
    send_to_char ("Water Alignment Toggled\n\r",ch);
    return;
  }
  if (!str_cmp (arg2, "align_air")) {

    victim->pcdata->elemental_alignment ^= ELEMENTAL_ALIGN_AIR;
    send_to_char ("Air Alignment Toggled\n\r",ch);
    return;
  }
  if (!str_cmp (arg2, "align_earth")) {

    victim->pcdata->elemental_alignment ^= ELEMENTAL_ALIGN_EARTH;
    send_to_char ("Earth Alignment Toggled\n\r",ch);
    return;
  }
  if (!str_cmp (arg2, "align_good")) {

    victim->pcdata->elemental_alignment ^= ELEMENTAL_ALIGN_GOOD;
    send_to_char ("Good Alignment Toggled\n\r",ch);
    return;
  }
  if (!str_cmp (arg2, "align_evil")) {

    victim->pcdata->elemental_alignment ^= ELEMENTAL_ALIGN_EVIL;
    send_to_char ("Evil Alignment Toggled\n\r",ch);
    return;
  }
 

  if (!str_cmp (arg2, "level"))
    {
      if (value < 1 || value > IMM_LEVEL-1)
        return;
      
      victim->exp = (FIND_EXP ((value - 1), 1));
      send_to_char ("Level set.\n\r", ch);
      send_to_char ("The next mob you hit, you will raise in level.\n\r", victim);
      return;
    }
  

  if (!str_cmp (arg2, "remort"))
    {
      if (is_number(arg3))
	{
	  victim->pcdata->remort_times = UMIN(200, UMAX(0, atoi(arg3)));
	  send_to_char("Ok remort times changed.\n\r", ch);
	  return;
	}
      else
	{
	  send_to_char("pset <name> remort <number>.\n\r", ch);
	  return;
	}
    }
  


  if (!str_cmp (arg2, "str"))
    {
      if (is_number(arg3))
	{
	  victim->pcdata->stat[STR] = UMIN(32, UMAX(3, atoi(arg3)));
	  send_to_char("Ok str changed.\n\r", ch);
	  return;
	}
      else
	{
	  send_to_char("pset <name> str <number>.\n\r", ch);
	  return;
	}
      
    }
  if (!str_cmp (arg2, "int"))
    {
      if (is_number(arg3))
	{
	  victim->pcdata->stat[INT] = UMIN(32, UMAX(3, atoi(arg3)));
	  send_to_char("Ok int changed.\n\r", ch);
	  return;
	}
      else
	{
	  send_to_char("pset <name> int <number>.\n\r", ch);
	  return;
	}
      
    }
if (!str_cmp (arg2, "wis"))
    {
      if (is_number(arg3))
	{
	  victim->pcdata->stat[WIS]= UMIN(32, UMAX(3, atoi(arg3)));
	  send_to_char("Ok wis changed.\n\r", ch);
	  return;
	}
      else
	{
	  send_to_char("pset <name> wis <number>.\n\r", ch);
	  return;
	}
      
    }
if (!str_cmp (arg2, "dex"))
    {
      if (is_number(arg3))
	{
	  victim->pcdata->stat[DEX] = UMIN(32, UMAX(3, atoi(arg3)));
	  send_to_char("Ok dex changed.\n\r", ch);
	  return;
	}
      else
	{
	  send_to_char("pset <name> dex <number>.\n\r", ch);
	  return;
	}
      
    }

if (!str_cmp (arg2, "con"))
    {
      if (is_number(arg3))
	{
	  victim->pcdata->stat[CON] = UMIN(32, UMAX(3, atoi(arg3)));
	  send_to_char("Ok con changed.\n\r", ch);
	  return;
	}
      else
	{
	  send_to_char("pset <name> con <number>.\n\r", ch);
	  return;
	}
      
    }
  if (!str_cmp (arg2, "hitroll") && arg3[0] != '\0')
    {
      if (value < 0 || value > 140)
        {
          send_to_char ("Valid range for hitroll is 0 - 140.\n\r", ch);
          return;
        }
      victim->hitroll = value;
      send_to_char ("Victim base hitroll set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "height") && arg3[0] != '\0')
    {
      if (value < 1 || value > 32000)
        {
          send_to_char ("Valid range for height is 1 - 32000.\n\r", ch);
          return;
        }
      victim->height = value;
      send_to_char ("Victim height set.\n\r", ch);
      return;
    }
  
  if (!str_cmp (arg2, "remove_hp") && arg3[0] != '\0')
    {
      if (value <= 0)
        {
          return;
        }
      victim->hit -= value;
      if (victim->hit < 1)
        victim->hit = 1;
      return;
    }
  if (!str_cmp (arg2, "same_side_pkill"))
    {
      if (IS_SET (victim->act, PLR_SAME_SIDE_PK))
        {
          act ("$N should not same side pk.", ch, NULL, victim, TO_CHAR);
          victim->act -= PLR_SAME_SIDE_PK;
        }
      else
        {
          act ("$N can now same side pk if they want.", ch, NULL, victim, TO_CHAR);
          victim->act += PLR_SAME_SIDE_PK;
        }
      return;
    }
  if (!str_cmp (arg2, "pkilled_this_mort"))
    {
      if (IS_SET (victim->act, PLR_PKED_THIS_MORT))
        {
          act ("$N can not advance without pking.", ch, NULL, victim, TO_CHAR);
          victim->act -= PLR_PKED_THIS_MORT;
        }
      else
        {
          act ("$N can advance this mort without pking now.", ch, NULL, victim, TO_CHAR);
          victim->act += PLR_PKED_THIS_MORT;
        }
      return;
    }
  
  if (!str_cmp (arg2, "removexp") && arg3[0] != '\0')
    {
      char buf[300];
      if (value < 0)
        {
          return;
        }
      victim->exp -= value;
      send_to_char ("Victim xps removed.\n\r", ch);
      sprintf (buf, "%d exp points were removed!\n\r", value);
      send_to_char ("You have been demoted.  ", victim);
      send_to_char (buf, victim);
      return;
    }
  if (!str_cmp (arg2, "addxp") && arg3[0] != '\0')
    {
      if (value < 0)
        {
          return;
        }
      send_to_char ("You feel a bit more experienced!\n\r", victim);
      gain_exp (victim, value);
      send_to_char ("Victim xps awarded.\n\r", ch);
      return;
    }
  
  if (!str_cmp (arg2, "bank") && arg3[0] != '\0')
    {
      if (value < 0 || value > 1000000)
        {
          send_to_char ("Valid range for bank coinage is 0 - 1,000,000.\n\r", ch);
          return;
        }
      victim->pcdata->bank = value;
      send_to_char ("Victim bank coinage set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "damroll") && arg3[0] != '\0')
    {
      if (value < 0 || value > 140)
        {
          send_to_char ("Valid range for damroll is 0 - 140.\n\r", ch);
          return;
        }
      victim->damroll = value;
      send_to_char ("Victim base damroll set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "ac") && arg3[0] != '\0')
    {
      if (value < 0 || value > 140)
        {
          send_to_char ("Valid range for natural armor class is 0 to 140.\n\r", ch);
          return;
        }
      victim->pcdata->nat_armor = value;
      send_to_char ("Natural Armor Class set.\n\r", ch);
      return;
    }

  if (!str_cmp (arg2, "warpoints") && (ad || sb || value!=-1))
    {
      int wp;
      if (ad) wp=victim->pcdata->warpoints+value; else
      if (sb) wp=victim->pcdata->warpoints+value;
      else wp = value;
      victim->pcdata->warpoints = wp;
      send_to_char ("Warpoints set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "total_wps") && (ad || sb || value!=-1))
    {
      int twp;
      if (ad) twp=victim->pcdata->total_wps+value; else
      if (sb) twp=victim->pcdata->total_wps+value;
      else twp = value;
      victim->pcdata->total_wps = twp;
      send_to_char ("Total Warpoints set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "deaths") && is_number (arg3))
    {
      int wp;
      wp = atoi (arg3);
      if (wp < 0)
        return;
      victim->pcdata->deaths = wp;
      send_to_char ("Deaths set.\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "guild") && arg3[0] != '\0')
    {
      
      int i;
      for (i = 0; str_cmp(guild_data[i].what_you_type, "end_of_list"); i++)
	{
	  if (!str_cmp(guild_data[i].what_you_type, arg3))
	    {
	      char buf[100];
	      sprintf(buf, guild_data[i].what_you_see);
	      if (IS_SET(victim->pcdata->guilds,guild_data[i].mob_guildmaster_bit))
		strcat(buf, " Removed.\n\r");
	      else
		strcat(buf, " Added.\n\r");
	      send_to_char(buf, ch);
	      victim->pcdata->guilds ^= guild_data[i].mob_guildmaster_bit;
	      fix_char(victim);
	      return;
	    }
	}
 
      send_to_char ("Unknown guild.\n\r", ch);
      return;
    }
  if (!str_cmp (arg2, "int") && arg3[0] != '\0')
    {
      if (value < 3 || value > 25)
        {
          send_to_char ("Intelligence range is 3 to 25.\n\r", ch);
          return;
        }
      victim->pcdata->stat[INT] = value;
      return;
    }
  if (!str_cmp (arg2, "killpts") && arg3[0] != '\0')
    {
      if (value < 0 || value > 30000)
        {
          send_to_char ("Killpoint range is 0 to 30,000 killpoints.\n\r", ch);
          return;
        }
      victim->pcdata->killpoints = value;
      return;
    }
  if (!str_cmp (arg2, "sex") && arg3[0] != '\0')
    {
      if (value < 0 || value > 2)
        {
          send_to_char ("Sex range is 0 to 2.\n\r", ch);
          return;
        }
      victim->pcdata->sex = value;
      return;
    }
  if (!str_cmp (arg2, "race") && arg3[0] != '\0')
    {
      if (value < 0 || value >= RACE_COUNT)
        {
          char buf[STD_LENGTH];
          sprintf (buf, "Race range is 0 to %d.\n", RACE_COUNT - 1);
          send_to_char (buf, ch);
          return;
        }
      raceswitch(victim, value);
      return;
    }
  if (!str_cmp (arg2, "hp") && arg3[0] != '\0')
    {
      if (value < 1 || value > 2000000000)
        {
          send_to_char ("Hp range is 1 to 2000000000 hit points.\n\r", ch);
          return;
        }
      victim->max_hit = value;
      return;
    }
  if (!str_cmp (arg2, "move") && arg3[0] != '\0')
    {
      if (value < 1 || value > 30000)
        {
          send_to_char ("Move range is 1 to 30,000 move points.\n\r", ch);
          return;
        }
      victim->max_move = value;
      return;
    }
  if (!str_cmp (arg2, "practice") && arg3[0] != '\0')
    {
      if (value < 0 || value > 100)
        {
          send_to_char ("Practice range is 0 to 100 sessions.\n\r", ch);
          return;
        }
      victim->pcdata->practice = value;
      return;
    }
  if (!str_cmp (arg2, "learn") && arg3[0] != '\0')
    {
      if (value < 0 || value > SKILL_COUNT)
        {
          send_to_char ("Practice range is 0 to 100 sessions.\n\r", ch);
          return;
        }
      victim->pcdata->learn = value;
      return;
    }
  
  if ((!str_cmp (arg2, "align") || !str_cmp (arg2, "alignment")) && arg3[0] != '\0')
    {
      if (value < 0 || value > NUM_ALIGN)
        {
          send_to_char ("Alignment range is 0 to 9. (0 = newbie, 1 = evil, 2 = good atm\n\r", ch);
          return;
        }
      alignswitch(victim, value);
      return;
    }
  if (!str_cmp (arg2, "thirst") && arg3[0] != '\0')
    {
      if (value < 0 || value > 100)
        {
          send_to_char ("Thirst range is 0 to 100.\n\r", ch);
          return;
        }
      victim->pcdata->condition[COND_THIRST] = value;
      return;
    }
  if (!str_cmp (arg2, "drunk") && arg3[0] != '\0')
    {
      if (value < 0 || value > 100)
        {
          send_to_char ("Drunk range is 0 to 100.\n\r", ch);
          return;
        }
      victim->pcdata->condition[COND_DRUNK] = value;
      return;
    }
  if (!str_cmp (arg2, "full") && arg3[0] != '\0')
    {
      if (value < 0 || value > 100)
        {
          send_to_char ("Full range is 0 to 100.\n\r", ch);
          return;
        }
      victim->pcdata->condition[COND_FULL] = value;
      return;
    }
  if (!str_cmp (arg2, "master") && arg3[0] != '\0')
    {
      check_fgt (victim);
      if (!str_cmp (arg3, "none"))
        {
          victim->fgt->master = NULL;
          return;
        }
      if ((get_char_world (ch, arg3)) == NULL)
        {
          send_to_char ("They aren't here.\n\r", ch);
          return;
        }
      victim->fgt->master = get_char_world (ch, arg3);
      return;
    }
  if (!str_cmp (arg2, "leader") && arg3[0] != '\0')
    {
      check_fgt (victim);
      if (!str_cmp (arg3, "none"))
        {
          victim->fgt->leader = NULL;
          return;
        }
      if ((get_char_world (ch, arg3)) == NULL)
        {
          send_to_char ("They aren't here.\n\r", ch);
          return;
        }
      victim->fgt->leader = get_char_world (ch, arg3);
      return;
    }
  if (!str_cmp (arg2, "short") && arg3[0] != '\0')
    {
      if (victim->pcdata->short_descr && victim->pcdata->short_descr != NULL)
        free_string (victim->pcdata->short_descr);
      victim->pcdata->short_descr = str_dup (arg3);
      return;
    }
  if (!str_cmp (arg2, "long"))
    {
      send_to_char ("Entering line editing mode.\n\r", ch);
      send_to_char ("Terminate with a ~ on a blank line.\n\r", ch);
      ch->desc->pString = &victim->pcdata->long_descr;
      return;
    }
  if (!str_cmp (arg2, "title") && arg3[0] != '\0')
    {
      set_title (victim, arg3);
      return;
    }
  if (!str_cmp (arg2, "augment"))
    {
      char bufff[200];
      bool isoff = FALSE;
      int num = 0;
      bool found = FALSE;
      int augment = victim->pcdata->augments;
      for (num = 0; str_cmp (augment_flagss[num].what_you_type, "end_of_list") && (!found); num++)
	{
	  if (!str_cmp(arg3, augment_flagss[num].what_you_type ))
	    {
	      found = TRUE;
	      isoff =((IS_SET(augment,augment_flagss[num].flagname))? FALSE : TRUE);
	      sprintf(bufff, " %s bit toggled %s\n\r",augment_flagss[num].what_you_type ,(isoff ? "On" : "Off") );
	      send_to_char(bufff,ch);
	      TOGGLE_BIT(victim->pcdata->augments, augment_flagss[num].flagname);
	    }
	}
      if (!found)
	{
	  sprintf(bufff, "Which augment????\n\r.");
	  send_to_char(bufff, ch);
	}
      else
	return;
    }

  if (!str_cmp (arg2, "affect"))
    {
      char bufff[200];
      bool isoff = FALSE;
      int num = 0;
      bool found = FALSE;
      int affect = victim->pcdata->nat_abilities;
      for (num = 0; str_cmp(affect_flagss[num].what_you_type, "end_of_list") && (!found) ; num++)
	{
	  if (!str_cmp(arg3, affect_flagss[num].what_you_type ))
	    {
	      found = TRUE;
	      isoff =((IS_SET(affect,affect_flagss[num].flagname))? FALSE : TRUE);
	      sprintf(bufff, " %s bit toggled %s\n\r",affect_flagss[num].what_you_type ,(isoff ? "On" : "Off") );
	      TOGGLE_BIT(victim->pcdata->nat_abilities, affect_flagss[num].flagname);
	    }
	}
      if (!found)
	{
	  sprintf(bufff, "Which affect????\n\r.");
	  send_to_char(bufff, ch);
	}
      else
	{
	  send_to_char(bufff, ch);
	  return;
	}
    }
  if (!str_cmp (arg2, "affect2"))
    {
      char bufff[200];
      bool isoff = FALSE;
      int num = 0;
      bool found = FALSE;
      int affect = victim->pcdata->nat_abilities2;
      for (num = 0; str_cmp(affect_flags_2[num].what_you_type, "end_of_list") && (!found); num++)
	{
	  if (!str_cmp(arg3, affect_flags_2[num].what_you_type ))
	    {
	      found = TRUE;
	      isoff =((IS_SET(affect,affect_flags_2[num].flagname))? FALSE : TRUE);
	      sprintf(bufff, " %s bit toggled %s\n\r",affect_flags_2[num].what_you_type ,(isoff ? "On" : "Off") );
	      TOGGLE_BIT(victim->pcdata->nat_abilities2, affect_flags_2[num].flagname);
	    }
	}
      if (!found)
	{
	  sprintf(bufff, "Which affect????\n\r.");
	  send_to_char(bufff, ch);
	}
      else
	{
	  send_to_char(bufff, ch);
	  return;
	}
    }
  do_pset (ch, "");
  return;
}

char *
con_state (DESCRIPTOR_DATA * d)
{
  static char st[30];
  st[0] = '\0';
  if (d->connected == CON_PLAYING)
    strcpy (st, "Playing");
  else if (d->connected == CON_AEDITOR && (AREA_DATA *) d->pEdit != NULL)
    {
      sprintf (st, "Aedit #%d", ((AREA_DATA *) d->pEdit)->vnum);
    }
  else if (d->connected == CON_REDITOR)
    {
      sprintf (st, "Redit #%d", d->character->in_room->vnum);
    }
  else if (d->connected == CON_MEDITOR && (MOB_PROTOTYPE *) d->pEdit != NULL)
    {
      sprintf (st, "Medit #%d", ((MOB_PROTOTYPE *) d->pEdit)->vnum);
    }
  else if (d->connected == CON_OEDITOR && (OBJ_PROTOTYPE *) d->pEdit != NULL)
    {
      sprintf (st, "Oedit #%d", ((OBJ_PROTOTYPE *) d->pEdit)->vnum);
    }
  else if (d->connected == CON_CEDITOR && (CLAN_DATA *) d->pEdit != NULL)
    {
      sprintf (st, "Cedit #%d", ((CLAN_DATA *) d->pEdit)->vnum);
    }
  else if (d->connected == CON_FSEDITOR)
    strcpy (st, "FullScreen");
  else if (d->connected == CON_PEDITOR && (CHAR_DATA *) d->pEdit != NULL)
    {
      sprintf (st, "Pedit %s", ((CHAR_DATA *) d->pEdit)->pcdata->name);
    }
  else if (d->connected == CON_SEDITOR && (SPELL_DATA *) d->pEdit != NULL)
    {
      sprintf (st, "Sedit #%d", ((SPELL_DATA *) d->pEdit)->gsn);
    }
  else if (d->connected == CON_SOCEDIT)
    strcpy (st, "SocEdit");
  else if (d->connected == CON_GET_OLD_PASSWORD)
    strcpy (st, "Asking Passwd");
  else if (d->connected == CON_READ_MOTD)
    strcpy (st, "Welcome Messages");
  else if (d->connected == CON_SHELL)
    strcpy (st, "<SHELL>");
  else
    strcpy (st, "Newbie/Login");
  return st;
}

void
do_users (CHAR_DATA * ch, char *argy)
{
  DESCRIPTOR_DATA *d;
  CHAR_DATA *tch;
  int cc;
  int count;
  int tcount;
  DEFINE_COMMAND ("users", do_users, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Shows a list of all connections and sites.")

    if (IS_MOB (ch))
    return;
  if (ch->pcdata->level > MAX_LEVEL)
    ch->pcdata->level = MAX_LEVEL;
  hugebuf_o[0] = '\0';
  tcount = 0;
  count = 0;
  cc = 0;
  for (tch = char_list; tch != NULL; tch = tch->next)
    {
      if (IS_PLAYER (tch) && tch->desc == NULL)
        cc++;
    }
  for (d = descriptor_list; d != NULL; d = d->next)
    {
      tcount++;
      if (d->character != NULL && can_see (ch, d->character))
        {
          if (d->connected <= 0)
            count++;
          sprintf (hugebuf_o + strlen (hugebuf_o),
                   "%s%-3d \x1B[1;37m%-12s\x1B[37;0m %-17s %-18s \x1B[1;37m%s\x1B[37;0m\n\r",
                   (d->host[29] == 1 ? "*" : "#"), d->descriptor, d->character ? NAME (d->character) : "(none)",
		   d->host, con_state (d), d->username);
	}
    }
  sprintf (hugebuf_o + strlen (hugebuf_o), "-----------------------------------------------------------------------\n\r");
  sprintf (hugebuf_o + strlen (hugebuf_o), "%d Active Player%s, %d Connection%s, and %d Linkless Player%s.\n\r",count, count == 1 ? "" : "s", tcount, tcount == 1 ? "" : "s", cc, cc == 1 ? "" : "s");
  page_to_char (hugebuf_o, ch);
  sprintf (hugebuf_o, "Max # of connections since reboot   [\x1B[34;1m%5d\x1B[37;0m]\n\r", max_connected); send_to_char (hugebuf_o, ch);
  return;
}

void
do_force (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  DEFINE_COMMAND ("force", do_force, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Forces a player/mob to do something.")

    argy = one_argy (argy, arg);
  if (IS_PLAYER (ch) && LEVEL (ch) > MAX_LEVEL)
    ch->pcdata->level = MAX_LEVEL;
  if (arg[0] == '\0' || argy[0] == '\0')
    {
      send_to_char ("Force whom to do what?\n\r", ch);
      return;
    }
  if (!str_cmp (arg, "all") && IS_PLAYER (ch))
    {
      CHAR_DATA *vch;
      CHAR_DATA *vch_next;
      if (LEVEL (ch) < MAX_LEVEL)
        return;
      for (vch = char_list; vch != NULL; vch = vch_next)
        {
          vch_next = vch->next;
          if (IS_PLAYER (vch) && LEVEL (vch) < LEVEL (ch))
            {
              act ("$n forces everyone to '$t'.", ch, argy, vch, TO_VICT);
              if (IS_PLAYER (ch))
                FORCE_LEVEL = LEVEL (ch);
              else
                FORCE_LEVEL = TOP_LEVEL;
              interpret (vch, argy);
            }
        }
    }
  else
    {
      CHAR_DATA *victim;
      if ((victim = get_char_world_2 (ch, arg)) == NULL)
        {
          send_to_char ("They aren't here.\n\r", ch);
          return;
        }
      if (victim == ch)
        {
          send_to_char ("Aye aye, right away!\n\r", ch);
          return;
        }
      if (IS_PLAYER (ch) && victim->in_room->area->open == 1 && !IS_REAL_GOD (ch))
        return;
      if (IS_PLAYER (ch) && LEVEL (victim) >= LEVEL (ch))
        {
          send_to_char ("Do it yourself!\n\r", ch);
          return;
        }
      if (LEVEL (ch) < MAX_LEVEL && IS_PLAYER (victim))
        {
          send_to_char ("You are not allowed to force Players at all!\n\r", ch);
          return;
        }
      act ("$n forces you to '$t'.", ch, argy, victim, TO_VICT);
      if (IS_PLAYER (ch))
        FORCE_LEVEL = LEVEL (ch);
      else
        FORCE_LEVEL = TOP_LEVEL;
      interpret (victim, argy);
    }
  send_to_char ("Ok.\n\r", ch);
  return;
}

void
do_invis (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  int oldinvis;
  DEFINE_COMMAND ("invis", do_invis, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "This command toggles whether an immort is vis to morts or not.")

    one_argy (argy, arg);
  if (IS_MOB (ch))
    return;
  oldinvis = ch->pcdata->wizinvis;
  if (arg[0] == '\0')
    {
      ch->pcdata->wizinvis = ch->pcdata->wizinvis == 0 ? LEVEL (ch) : 0;
    }
  else
    ch->pcdata->wizinvis = atoi (arg);
  ch->pcdata->wizinvis = ch->pcdata->wizinvis <= LEVEL (ch) ? ch->pcdata->wizinvis : LEVEL (ch);
  if (ch->pcdata->wizinvis <= LEVEL_IMMORTAL && ch->pcdata->wizinvis != 0)
    ch->pcdata->wizinvis = 0;
  if (ch->pcdata->wizinvis == oldinvis ||
      (ch->pcdata->wizinvis >= LEVEL_IMMORTAL && oldinvis >= LEVEL_IMMORTAL))
    return;
  if (ch->pcdata->wizinvis < oldinvis && ch->pcdata->wizinvis == 0)
    {
      act ("$n slowly fades into existence.", ch, NULL, NULL, TO_ROOM);
      send_to_char ("You slowly fade back into existence.\n\r", ch);
    }
  else if (ch->pcdata->wizinvis >= LEVEL_IMMORTAL && ch->pcdata->wizinvis > oldinvis)
    {
      act ("$n slowly fades into normal air.", ch, NULL, NULL, TO_ROOM);
      send_to_char ("You slowly vanish into normal air.\n\r", ch);
    }
  return;
}

void
do_holywalk (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("holywalk", do_holywalk, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Toggles holywalk on/off.")

    if (IS_MOB (ch))
    return;
  if (IS_SET (ch->act, PLR_HOLYWALK))
    {
      REMOVE_BIT (ch->act, PLR_HOLYWALK);
      send_to_char ("Holy walk mode off.\n\r", ch);
    }
  else
    {
      SET_BIT (ch->act, PLR_HOLYWALK);
      send_to_char ("Holy walk mode on.\n\r", ch);
    }
  return;
}

void 
do_mapping (CHAR_DATA *ch, char *argy)
{
  DEFINE_COMMAND ("mapping", do_mapping, POSITION_DEAD, 1, LOG_NORMAL, "Toggles mapping on/off.")
    
    if (IS_MOB (ch))
      return;
 /*  if (!is_member(ch, GUILD_RANGER))
    {
	send_to_char ("Only rangers of unsurpassed ability may use mapping.\n\r", ch);
    	return;
    } */
  if (IS_SET (ch->pcdata->act2, PLR_MAPPING) || IS_AFFECTED(ch,AFF_BLIND))
    {
      REMOVE_BIT (ch->pcdata->act2, PLR_MAPPING);
      do_rawclear(ch);
      send_to_char ("Mapping mode off.\n\r", ch);
      
    }
  else
    {
      SET_BIT (ch->pcdata->act2, PLR_MAPPING);
      do_rawclear(ch);
      small_map(ch);
      send_to_char ("Mapping mode on.\n\r", ch);
    }
  return;
}

void 
do_noibm (CHAR_DATA *ch, char *argy)
{
  DEFINE_COMMAND ("noibm", do_noibm, POSITION_DEAD, 1, LOG_NORMAL, "Toggles noibm on/off.")
    
    if (IS_MOB (ch))
      return;
  if (IS_SET (ch->pcdata->act2, PLR_NOIBM))
    {
      REMOVE_BIT (ch->pcdata->act2, PLR_NOIBM);
      send_to_char ("Noibm mode off.\n\r", ch);
    }
  else
    {
      SET_BIT (ch->pcdata->act2, PLR_NOIBM);
      send_to_char ("Noibm mode on.\n\r", ch);
    }
  return;
}
void 
do_mapspam (CHAR_DATA *ch, char *argy)
{
  DEFINE_COMMAND ("mapspam", do_mapspam, POSITION_DEAD, 1, LOG_NORMAL,
"Toggles mapspam on/off.")
    
    if (IS_MOB (ch))
      return;
  if (IS_SET (ch->pcdata->act2, PLR_MAPSPAM))
    {
      REMOVE_BIT (ch->pcdata->act2, PLR_MAPSPAM);
      send_to_char ("Mapspam mode off.\n\r", ch);
    }
  else
    {
      SET_BIT (ch->pcdata->act2, PLR_MAPSPAM);
      send_to_char ("Mapspam mode on.\n\r", ch);
    }
  return;
}
void 
 do_viewmobs (CHAR_DATA *ch, char *argy)
{
  DEFINE_COMMAND ("viewmobs", do_viewmobs, POSITION_DEAD, 1, LOG_NORMAL,
"Toggles viewmobs on/off.")
    
    if (IS_MOB (ch))
      return;
  if (IS_SET (ch->pcdata->act2, PLR_VIEWMOBS))
    {
      REMOVE_BIT (ch->pcdata->act2, PLR_VIEWMOBS);
      send_to_char ("Viewmobs mode off.\n\r", ch);
    }
  else
    {
      SET_BIT (ch->pcdata->act2, PLR_VIEWMOBS);
      send_to_char ("Viewmobs mode on.\n\r", ch);
    }
  return;
} 
void 
do_viewplayers (CHAR_DATA *ch, char *argy)
{
  DEFINE_COMMAND ("viewplayers", do_viewplayers, POSITION_DEAD, 1, LOG_NORMAL, "Toggles viewplayers on/off.")
    
    if (IS_MOB (ch))
      return;
  if (IS_SET (ch->pcdata->act2, PLR_VIEWPLAYERS))
    {
      REMOVE_BIT (ch->pcdata->act2, PLR_VIEWPLAYERS);
      send_to_char ("Viewplayers mode off.\n\r", ch);
    }
  else
    {
      SET_BIT (ch->pcdata->act2, PLR_VIEWPLAYERS);
      send_to_char ("Viewplayers mode on.\n\r", ch);
    }
  return;
}
void
do_holylag (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("holylag", do_holylag, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Toggles holylag on/off.")

    if (IS_MOB (ch))
    return;
  if (IS_SET (ch->pcdata->act2, PLR_HOLYLAG))
    {
      REMOVE_BIT (ch->pcdata->act2, PLR_HOLYLAG);
      send_to_char ("Holy lag mode off.\n\r", ch);
    }
  else
    {
      SET_BIT (ch->pcdata->act2, PLR_HOLYLAG);
      send_to_char ("Holy lag mode on.\n\r", ch);
    }
  return;
}

void
do_holypeace (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("holypeace", do_holypeace, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Toggles holypeace on/off.")

    if (IS_MOB (ch))
    return;
  if (IS_SET (ch->act, PLR_HOLYPEACE))
    {
      REMOVE_BIT (ch->act, PLR_HOLYPEACE);
      send_to_char ("Holy peace mode off.\n\r", ch);
    }
  else
    {
      SET_BIT (ch->act, PLR_HOLYPEACE);
      send_to_char ("Holy peace mode on.\n\r", ch);
    }
  return;
}

void
do_holylight (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("holylight", do_holylight, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Toggles holylight on/off.")

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


void
do_owhere (CHAR_DATA * ch, char *argy)
{
  char arg[SML_LENGTH];
  char oneline[500];
  int slen = 0;
  bool found = FALSE;
  SINGLE_OBJECT *obj;
  SINGLE_OBJECT *in_obj;
  int obj_counter = 1;
  DEFINE_COMMAND ("owhere", do_owhere, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "Allows you to find actual objects in the world.")

    if (IS_MOB (ch))
    return;
  hugebuf_o[0] = '\0';
  one_argy (argy, arg);
  if (!IS_REAL_GOD (ch))
    {
      send_to_char ("Huh?\n\r", ch);
      return;
    }
  if (arg[0] == '\0')
    {
      send_to_char ("Syntax: owhere <object>.\n\r", ch);
      return;
    }
  else
    {
      for (obj = object_list; obj != NULL; obj = obj->next)
        {
          if (!can_see_obj (ch, obj) || !is_name (arg, obj->pIndexData->name))
            continue;
          found = TRUE;
          for (in_obj = obj; in_obj->in_obj != NULL;
               in_obj = in_obj->in_obj)
            ;
          if (in_obj->carried_by != NULL)
            {
              sprintf (oneline, "[%2d] %s carried by %s.\n\r", obj_counter,
                   OOSTR (obj, short_descr), PERS (in_obj->carried_by, ch));
            }
          else
            {
              sprintf (oneline, "[%2d] %s in %s [%d].\n\r", obj_counter,
                       OOSTR (obj, short_descr), (in_obj->in_room == NULL) ?
                       "somewhere" : in_obj->in_room->name, (in_obj->in_room == NULL) ?
                       0 : in_obj->in_room->vnum);
            }
          obj_counter++;
          oneline[0] = UPPER (oneline[0]);
          sprintf (hugebuf_o + slen, "%s", oneline);
          slen += strlen (oneline);
          if (slen > 69500)
            {
              hugebuf_o[69500] = '\0';
              break;
            }
        }
    }
  if (!found)
    send_to_char (
                   "Nothing like that in hell, earth, or heaven.\n\r", ch);
  if (hugebuf_o[0] != '\0')
    page_to_char (hugebuf_o, ch);
  return;
}

void
do_areas (CHAR_DATA * ch, char *argy)
{
  char buf[2048];
  int slen = 0;
  AREA_DATA *pAreat;
  DEFINE_COMMAND ("areas", do_areas, POSITION_DEAD, 0, LOG_NORMAL, "This command shows the current areas that make up the world.")

    if (IS_MOB (ch))
    return;
  hugebuf_o[0] = '\0';
  buf[0] = '\0';
  if (LEVEL (ch) >= IMM_LEVEL)
    {
//Put the name of your mud here when players use the area command.
      sprintf (hugebuf_o, "[%3s] %1s %-24s (%-5s-%5s) %10s %3s [%s]\n\r", "\x1b[1;37m-\x1b[1;30m= \x1b[1;37mThe Lands of Loreia \x1b[1;30m=\x1b[1;37m- \x1b[1;32mNum\x1b[0;37m", "W", "\x1b[1;36mArea Name\x1b[0;37m", "\x1b[1;34mlvnum\x1b[0;37m", "\x1b[1;34muvnum\x1b[0;37m", "\x1b[1;31mFilename\x1b[0;37m", "\x1b[0;30mSec", "\x1b[1;34mBuilders\x1b[0;37m");
      buf[0] = '\0';
      slen = strlen (hugebuf_o);
      for (pAreat = area_first; pAreat != NULL; pAreat = pAreat->next)
        {
          sprintf (buf, "[\x1b[1;32m%3d\x1b[0;37m ] %1s \x1b[1;36m%-24s\x1b[0;37m (\x1b[1;34m%-5d-%5d\x1b[0;37m) \x1b[1;33m%13s %2d \x1b[1;34m[%s]\x1b[0;37m\n\r",
                   pAreat->vnum,
                   (ch->in_room->area == pAreat ? "*" : " "),
                   pAreat->name,
                   pAreat->lvnum,
                   pAreat->uvnum,
                   pAreat->filename,
                   pAreat->security,
                   pAreat->builders);
          sprintf (hugebuf_o + slen, "%s", buf);
          slen += strlen (buf);
          if (slen > 69500)
            {
              hugebuf_o[69500] = '\0';
              break;
            }
        }
    }
  else
    {
      sprintf (hugebuf_o, "[%3s] %1s %-30s [%s]\n\r",
               "\x1b[1;32mNum", "\x1b[1;37mWhere", "\x1b[1;36mArea Name", "\x1b[1;34mBuilders");
      slen = strlen (hugebuf_o);
      buf[0] = '\0';
      for (pAreat = area_first; pAreat != NULL; pAreat = pAreat->next)
        {
          if (!pAreat->open)
            continue;
          sprintf (buf, "\x1b[0;37m[\x1b[1;32m%3d\x1b[0;37m] \x1b[1;37m%1s \x1b[1;36m%-30s \x1b[0;37m[\x1b[1;34m%s\x1b[0;37m]\n\r",
                   pAreat->vnum,
                   (ch->in_room->area == pAreat ? "*" : " "),
                   pAreat->name, pAreat->builders);
          sprintf (hugebuf_o + slen, "%s", buf);
          slen += strlen (buf);
          if (slen > 69500)
            {
              hugebuf_o[69500] = '\0';
              break;
            }
        }
    }
  page_to_char (hugebuf_o, ch);
  return;
}

void
do_count (CHAR_DATA * ch, char *argy)
{
  char arg[STD_LENGTH];
  char arg2[STD_LENGTH];
  char buf[2048];
  AREA_DATA *pArea;
  int tot_room = 0, tot_mob = 0, tot_obj = 0;
  int open_area = 0, open_room = 0, open_mob = 0, open_obj = 0;
  DEFINE_COMMAND ("count", do_count, POSITION_DEAD, IMM_LEVEL, LOG_NORMAL, "Shows area statistics.")

    if (IS_MOB (ch))
    return;
  hugebuf_o[0] = '\0';
  argy = one_argy (argy, arg);
  if (argy[0] != '\0')
    argy = one_argy (argy, arg2);
  if (!str_cmp (arg, "open"))
    {
      sprintf (buf, "[%3s] %-10s (%-5s-%5s) %4s %4s %4s [%12s] %-3s %-4s\n\r",
               "Num", "FileN", "lvnum", "uvnum", "Room", "Mob", "Obj",
               "Builders", "Opn", "Plrs");
      strcpy (hugebuf_o, buf);
      for (pArea = area_first; pArea != NULL; pArea = pArea->next)
        {
          if (pArea->open)
            {
              sprintf (buf, "[%3d] %-10s (%-5d-%5d) %3d/%3d %4d %4d [%12s] %-3s %-4d\n\r",
                       pArea->vnum, pArea->filename,
                       pArea->lvnum, pArea->uvnum, pArea->desc_rooms,
                       pArea->room_count, pArea->mob_count,
                       pArea->obj_count, pArea->builders, pArea->open ? "Yes" : "No", pArea->nplayer);
              strcat (hugebuf_o, buf);
              open_area++;
              open_room += pArea->room_count;
              open_mob += pArea->mob_count;
              open_obj += pArea->obj_count;
            }
          if (strlen (hugebuf_o) > 69500)
            {
              hugebuf_o[69500] = '\0';
              break;
            }
        }
      sprintf (buf, "Open areas: %4d Rooms: %4d Mobs: %4d Objs: %4d\n\r",
               open_area, open_room, open_mob, open_obj);
      strcat (hugebuf_o, buf);
      page_to_char (hugebuf_o, ch);
      return;
    }
  if (arg[0] != '\0')
    {
      sprintf (buf, "[%3s] %-10s (%-5s-%5s) %4s %4s %4s [%12s] %-3s %-4s\n\r",
               "Num", "FileN", "lvnum", "uvnum", "Room", "Mob", "Obj",
               "Builders", "Opn", "Plrs");
      strcpy (hugebuf_o, buf);
      if (is_number (arg))
        {
          int vnum, vnum2 = 0;
          pArea = area_first;
          vnum = atoi (arg);
          if (arg2[0] != '\0' && is_number (arg2))
            vnum2 = atoi (arg2);
          if (vnum2 != 0 && vnum2 < vnum)
            {
              int tmp;
              tmp = vnum;
              vnum = vnum2;
              vnum2 = tmp;
            }
          while (pArea && pArea->vnum != vnum)
            pArea = pArea->next;
          if (!pArea)
            {
              send_to_char ("That area doesn't exist.\n\r", ch);
              return;
            }
          if (vnum2)
            {
              while (pArea && pArea->vnum <= vnum2)
                {
                  if (strlen (hugebuf_o) > 69500)
                    {
                      hugebuf_o[69500] = '\0';
                      break;
                    }
                  sprintf (buf, "[%3d] %-10s (%-5d-%5d) %3d/%3d %4d %4d [%12s] %-3s %-4d\n\r",
                           pArea->vnum, pArea->filename,
                           pArea->lvnum, pArea->uvnum, pArea->desc_rooms,
                           pArea->room_count, pArea->mob_count,
                           pArea->obj_count, pArea->builders, pArea->open ? "Yes" : "No",
                           pArea->nplayer);
                  strcat (hugebuf_o, buf);
                  tot_room += pArea->room_count;
                  tot_mob += pArea->mob_count;
                  tot_obj += pArea->obj_count;
                  if (pArea->open)
                    {
                      open_area++;
                      open_room += pArea->room_count;
                      open_mob += pArea->mob_count;
                      open_obj += pArea->obj_count;
                    }
                  pArea = pArea->next;
                }
            }
          else
            {
              sprintf (buf, "[%3d] %-10s (%-5d-%5d) %3d/%3d %4d %4d [%12s] %-3s %-4d\n\r",
                       pArea->vnum, pArea->filename,
                       pArea->lvnum, pArea->uvnum, pArea->desc_rooms,
                       pArea->room_count, pArea->mob_count,
              pArea->obj_count, pArea->builders, pArea->open ? "Yes" : "No",
                       pArea->nplayer);
              strcat (hugebuf_o, buf);
              tot_room += pArea->room_count;
              tot_mob += pArea->mob_count;
              tot_obj += pArea->obj_count;
              if (pArea->open)
                {
                  open_area++;
                  open_room += pArea->room_count;
                  open_mob += pArea->mob_count;
                  open_obj += pArea->obj_count;
                }
            }
        }
      else
        {
          pArea = area_first;
          while (pArea)
            {
              if (strlen (hugebuf_o) > 69500)
                {
                  hugebuf_o[69500] = '\0';
                  break;
                }
              if (is_name (arg, pArea->builders))
                {
                  sprintf (buf, "[%3d] %-10s (%-5d-%5d) %3d/%3d %4d %4d [%12s] %-3s %-4d\n\r",
                           pArea->vnum, pArea->filename,
                           pArea->lvnum, pArea->uvnum, pArea->desc_rooms,
                           pArea->room_count, pArea->mob_count,
                           pArea->obj_count, pArea->builders, pArea->open ? "Yes" : "No",
                           pArea->nplayer);
                  strcat (hugebuf_o, buf);
                  tot_room += pArea->room_count;
                  tot_mob += pArea->mob_count;
                  tot_obj += pArea->obj_count;
                  if (pArea->open)
                    {
                      open_area++;
                      open_room += pArea->room_count;
                      open_mob += pArea->mob_count;
                      open_obj += pArea->obj_count;
                    }
                }
              pArea = pArea->next;
            }
        }
      sprintf (buf, "Total rooms: %4d Total mobs: %4d Total objs: %4d\n\r",
               tot_room, tot_mob, tot_obj);
      strcat (hugebuf_o, buf);
      sprintf (buf, "Open areas: %4d Rooms: %4d Mobs: %4d Objs: %4d\n\r",
               open_area, open_room, open_mob, open_obj);
      strcat (hugebuf_o, buf);
      page_to_char (hugebuf_o, ch);
      return;
    }
  sprintf (buf, "[%3s] %10s (%-5s-%5s) %4s %4s %4s [%12s] %-3s %-4s\n\r",
           "Num", "Filename", "lvnum", "uvnum", "Room", "Mob", "Obj",
           "Builders", "Opn", "Plrs");
  strcat (hugebuf_o, buf);
  for (pArea = area_first; pArea != NULL; pArea = pArea->next)
    {
      sprintf (buf, "[%3d] %10s (%-5d-%5d) %3d/%3d %4d %4d [%12s] %-3s %-4d\n\r",
               pArea->vnum,
               pArea->filename,
               pArea->lvnum,
               pArea->uvnum,
               pArea->desc_rooms, pArea->room_count,
               pArea->mob_count,
               pArea->obj_count,
               pArea->builders,
               pArea->open ? "Yes" : "No",
               pArea->nplayer);
      strcat (hugebuf_o, buf);
      tot_room += pArea->room_count;
      tot_mob += pArea->mob_count;
      tot_obj += pArea->obj_count;
      if (pArea->open)
        {
          open_area++;
          open_room += pArea->room_count;
          open_mob += pArea->mob_count;
          open_obj += pArea->obj_count;
        }
      if (strlen (hugebuf_o) > 69500)
        {
          hugebuf_o[69500] = '\0';
          break;
        }
    }
  sprintf (buf, "Total rooms: %4d Total mobs: %4d Total objs: %4d\n\r",
           tot_room, tot_mob, tot_obj);
  strcat (hugebuf_o, buf);
  sprintf (buf, "Open areas: %4d Rooms: %4d Mobs: %4d Objs: %4d\n\r",
           open_area, open_room, open_mob, open_obj);
  strcat (hugebuf_o, buf);
  page_to_char (hugebuf_o, ch);
  return;
}

char *
get_ansi_spaces (char *txt)
{
  static char mem[40000];
  char *spaces = mem;
  int ansi = 0, i;
  while (*txt != '\0')
    {
      if (*txt == '\e')
        {
          do
            {
              ansi++;
            }
          while (*txt++ != 'm' && *txt!='\0');
        }
      else
        txt++;
    }
  for (i = 0; i < ansi; i++)
    {
      *spaces = ' ';
      spaces++;
    }
  *spaces = '\0';

  return mem;
}

void
do_noaffect (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *victim;
  DEFINE_COMMAND ("noaffect", do_noaffect, POSITION_DEAD, MAX_LEVEL, LOG_NORMAL, "This command will remove all affects of the character specified.")

    if (IS_MOB (ch))
    return;
  if (argy == "")
    {
      send_to_char ("Syntax is: noaffect <target_char>.\n\r", ch);
      return;
    }
  if ((victim = get_char_world (ch, argy)) == NULL)
    {
      send_to_char ("Could not find that person in the world...\n\r", ch);
      return;
    }
  strip_all_affects (victim);
  send_to_char ("Affects removed.\n\r", ch);
  return;
}