idirt-1.82d/
idirt-1.82d/bin/
idirt-1.82d/data/LOGS/
idirt-1.82d/data/POLICY/
idirt-1.82d/data/WIZ_ZONES/
idirt-1.82d/doc/
idirt-1.82d/doc/info/
idirt-1.82d/doc/manual/
idirt-1.82d/src/Ident/
idirt-1.82d/src/utils/
idirt-1.82d/utils/
#include <stdlib.h>
#include <unistd.h>
#include "kernel.h"
#include "locations.h"
#include "objects.h"
#include "mobiles.h"
#include "sflags.h"
#include "pflags.h"
#include "oflags.h"
#include "lflags.h"
#include "cflags.h"
#include "eflags.h"
#include "mflags.h"
#include "quests.h"
#include "sendsys.h"
#include "levels.h"
#include "commands.h"
#include "rooms.h"
#include "objsys.h"
#include "mobile.h"
#include "flags.h"
#include "bprintf.h"
#include "parse.h"
#include "uaf.h"
#include "clone.h"
#include "acct.h"
#include "mud.h"
#include "nflags.h"
#include "fight.h"
#include "zones.h"
#include "log.h"
#include "reboot.h"
#include "wizlist.h"
#include "climate.h"
#include "mailer.h"
#include "mud.h"
#include "timing.h"

extern char *WizLevels[];
extern char *MLevels[];
extern char *FLevels[];

void
lookcom (void)
{
  int a;

  if (brkword () == -1) {
    lookin (ploc (mynum), SHOW_LONG);
  } else {
    if (EQ (wordbuf, "at")) {
      strcpy (item1, item2);
      ob1 = ob2;
      examcom ();
    } else if (!EQ (wordbuf, "in") && !EQ (wordbuf, "into")) {
      bprintf ("I don't understand.  Are you trying to LOOK, LOOK AT, "
	       "or LOOK IN something?\n");
    } else if (EMPTY (item2)) {
      bprintf ("In what?\n");
    } else if ((a = ob2) == -1) {
      bprintf ("What?\n");
    } else if (a == OBJ_BLIZZARD_TUBE ||
	       a == OBJ_TREEHOUSE_BEDDING ||
	       a == OBJ_ORCHOLD_TOPCOVER) {
      strcpy (item1, item2);
      ob1 = ob2;
      examcom ();
    } else if (!otstbit (a, OFL_CONTAINER)) {
      bprintf ("That isn't a container.\n");
    } else if (otstbit (a, OFL_OPENABLE) && state (a) != 0) {
      bprintf ("It's closed!\n");
    } else {
      bprintf ("The %s contains:\n", oname (a));
      aobjsat (a, IN_CONTAINER, 8);
    }
  }
}

void
wherecom (void)
{
  int cha, rnd, num_obj_found = 0, num_chars_found = 0;

  if (plev (mynum) < LVL_WIZARD && pstr (mynum) < 10) {
    bprintf ("You're too weak to cast any spells.\n");
    return;
  }
  if (ltstflg (ploc (mynum), LFL_NO_MAGIC) && plev (mynum) < LVL_WIZARD) {
    bprintf ("Something about this location has drained your mana.\n");
    return;
  }
  if (plev (mynum) < LVL_WIZARD)
    setpmagic (mynum, pmagic (mynum) - 2);

  rnd = randperc ();
  cha = 6 * plev (mynum);

  if (carries_obj_type (mynum, OBJ_BLIZZARD_POWERSTONE) > -1 ||
      carries_obj_type (mynum, OBJ_BLIZZARD_POWERSTONE1) > -1 ||
      carries_obj_type (mynum, OBJ_BLIZZARD_POWERSTONE2) > -1 ||
      carries_obj_type (mynum, OBJ_FANTASY_MANA) > -1 ||
      plev (mynum) >= LVL_LEGEND)
    cha = 100;

  if (rnd > cha) {
    bprintf ("Your spell fails.\n");
    return;
  }
  if (!item1[0]) {
    bprintf ("What's that?\n");
    return;
  }
  for (cha = 0; cha < numobs; cha++) {

    if (cha == num_const_obs && plev (mynum) < LVL_WIZARD)
      break;

    if (EQ (oname (cha), item1)
	|| (plev (mynum) >= LVL_WIZARD && EQ (oaltname (cha), item1))) {
      if (ovis (cha) <= plev (mynum)) {
	num_obj_found++;
	if (plev (mynum) >= LVL_WIZARD)
	  bprintf ("[%3d] ", cha);
	bprintf ("%16.16s - ", oname (cha));
	if (plev (mynum) < LVL_WIZARD && ospare (cha) == -1)
	  bprintf ("Nowhere.\n");
	else
	  desloc (oloc (cha), ocarrf (cha));
      }
    }
  }

  for (cha = 0; cha < numchars; cha++) {

    if (cha == num_const_chars && plev (mynum) < LVL_WIZARD)
      break;

    if (EQ (xname (pname (cha)), item1) && (pvis (cha) <= plev (mynum))) {

      num_chars_found++;

      if (plev (mynum) >= LVL_WIZARD)
	bprintf ("[%d]", GLOBAL_MAX_OBJS + cha);

      bprintf ("%16.16s - ", pname (cha));
      desloc (ploc (cha), 0);
    }
  }

  if (num_obj_found == 0 && num_chars_found == 0)
    bprintf ("I don't know what that is.\n");
}

static Boolean
find_stuff (int s, int o, char *t)
{
  if (odamage (s) == 0) {
    osetdamage (s, 1);
    bprintf (t);
    create (o);
    setoloc (o, ploc (mynum), IN_ROOM);
    return True;
  }
  return False;
}

void
examcom (void)
{
  int a, foo, z;
  FILE *x;
  char ch;
  char *t;
  char text[80];

  if (!item1[0]) {
    bprintf ("Examine what?\n");
    return;
  }
  if ((a = fpbn (item1)) != -1 && ploc (a) == ploc (mynum)) {
    if (pstr (a) < 1) {
      bprintf ("You see the worm-infested corpse of %s.\n", pname (a));
      return;
    }
    if (a >= max_players && (t = pexam (a)) != NULL) {
      bprintf ("%s\n", t);
    } else {

      if (a != mynum) {
	sendf (a, "%s examines you closely.\n", pname (mynum));
      }
      sprintf (text, "%s/%s", DESC_DIR, pname (a));
      if ((x = fopen (text, "r")) == NULL) {	/*ACCESS! */
	bprintf ("A typical, run of the mill %s.\n", pname (a));
	return;
      }
      fclose (x);
      bprintf ("\001f%s\003", text);
    }
    return;
  }
  if ((a = ob1) == -1) {
    bprintf ("You see nothing special.\n");
    return;
  }
  send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY,
	    "%s examines the %s closely.\n", pname (mynum), oname (a));

  switch (onum (a)) {

#ifdef LOCMIN_ANCIENT

  case OBJ_ANCIENT_SKYMAP:
    if (ploc (mynum) == LOC_ANCIENT_ANC53) {
      bprintf ("You feel like you are flying....\n"
	       "     ....and land on a desolate planet,"
	       "obviously far from the sun.\n\n\n");
      trapch (LOC_ANCIENT_ANC56);
    } else {
      bprintf ("You ain't lost, Mac... yet!\n");
    }
    break;

  case OBJ_ANCIENT_LBOOK:
    if (oarmor (a) > 0) {
      bprintf ("The Book contains old writings. You can make out\n"
	       "the names of old mages like 'Elmo' and 'Infidel'.\n");
    } else {
      bprintf ("Ancient wisdom fills your head, you feel much more capable...\n");
      osetarmor (a, 1);
    }
    break;
#endif

#ifdef LOCMIN_EFOREST
  case OBJ_EFOREST_TREE:
    if (odamage (a) == 0) {
      osetdamage (a, 1);
      bprintf ("You find a door in the tree.\n");
      setobjstate (a, 0);
      return;
    }
    break;
  case OBJ_EFOREST_DESK:
    if (find_stuff (OBJ_EFOREST_DESK, OBJ_EFOREST_BUTTON,
		    "You find a button hidden in a recess of the desk.\n"))
      return;
    break;
  case OBJ_EFOREST_THRONE_WOOD:
    if (find_stuff (OBJ_EFOREST_THRONE_WOOD, OBJ_EFOREST_CROWN,
		    "You find a crown hidden under the throne.\n"))
      return;
    break;
  case OBJ_EFOREST_COAT:
    if (find_stuff (OBJ_EFOREST_COAT, OBJ_EFOREST_COIN,
		    "You find a coin in the pocket.\n"))
      return;
    break;
  case OBJ_EFOREST_TABLE:
    if (find_stuff (OBJ_EFOREST_TABLE, OBJ_EFOREST_GAUNTLETS,
		    "You find some gauntlets admidst the rubble "
		    "of this table.\n"))	/* ; */
      return;
    break;
  case OBJ_EFOREST_PAINTING:
    if (find_stuff (OBJ_EFOREST_PAINTING, OBJ_EFOREST_NOTE,
		    "There was a note behind the painting.\n"))
      return;
    break;
  case OBJ_EFOREST_CHAIR:
    if (find_stuff (OBJ_EFOREST_CHAIR, OBJ_EFOREST_RING,
		    "A ring was between the cushions of that chair!\n"))
      return;
    break;
  case OBJ_EFOREST_RACK:
    if (find_stuff (OBJ_EFOREST_RACK, OBJ_EFOREST_SCARAB,
		    "You found a scarab in the rack.\n"))
      return;
    break;
  case OBJ_EFOREST_PAPERS:
    if (find_stuff (OBJ_EFOREST_PAPERS, OBJ_EFOREST_TREATY,
		    "Among the papers, you find a treaty.\n"))
      return;
    break;
  case OBJ_EFOREST_DESK_LICH:
    if (find_stuff (OBJ_EFOREST_DESK_LICH, OBJ_EFOREST_EMERALD,
		    "Inside the desk is a beautiful emerald.\n"))
      return;
    break;
  case OBJ_EFOREST_ALTAR:
    if (find_stuff (OBJ_EFOREST_ALTAR, OBJ_EFOREST_STATUE,
		    "Inside the altar is a statue of a dark elven deity.\n"))
      return;
    break;
  case OBJ_EFOREST_MATTRESS:
    if (find_stuff (OBJ_EFOREST_MATTRESS, OBJ_EFOREST_PURSE,
		    "Hidden under the mattress is a purse.\n"))
      return;
    break;
  case OBJ_EFOREST_TRASH:
    if (find_stuff (OBJ_EFOREST_TRASH, OBJ_EFOREST_TRASH_COIN,
		    "In the trash is a silver coin.\n"))
      return;
    break;
#endif

  case OBJ_ISLAND_BONE:
    bprintf ("There is a flash and you are teleported...\n");
    setploc (mynum, LOC_LABYRINTH_K);
    lookin (ploc (mynum), 0);
    return;
    break;

  case OBJ_BLIZZARD_PLATFORM_ALTAR:
    if (state (OBJ_BLIZZARD_ALTAR) == 1) {
      bprintf ("You see nothing special.\n");
      return;
    } else {
      break;
    }

  case OBJ_BLIZZARD_BRICK:
    if (state (OBJ_BLIZZARD_ALTAR) == 1) {
      bprintf ("You see nothing special.\n");
      return;
    } else {
      break;
    }

  case OBJ_RUINS_SCROLL:
    if (state (OBJ_RUINS_SCROLL) == 2) {
      bprintf ("Try moving the crown first!\n");
      return;
    }
    bprintf ("The scroll speaks of how to cast the aid spell.\n");
    if (!etstflg (mynum, EFL_AID)) {
      bprintf ("\nYou learn the Aid spell!\n");
      bprintf ("The scroll crumbles to dust.\n");
      esetflg (mynum, EFL_AID);
      destroy (a);
      return;
    } else {
      return;
    }

  case OBJ_BLIZZARD_LITTABLET:
    bprintf ("The tablet speaks of how to cast the light spell.\n");
    if (!etstflg (mynum, EFL_LIGHT)) {
      bprintf ("\nYou learn the Light spell! Use LIT to use the spell.\n");
      bprintf ("The stone tablet crumbles to dust.\n");
      esetflg (mynum, EFL_LIGHT);
      destroy (a);
      return;
    } else {
      return;
    }

  case OBJ_RUINS_RUNES:
    if (!iswornby (OBJ_RUINS_TALISMAN, mynum)) {
      bprintf ("The runes make no sense to you.\n");
      return;
    } else {
      bprintf ("As you examine the inscription you come to understand "
	       "what they mean.\nThey speak of how to cast the Burning "
	       "Hands spell!\n");
      if (!etstflg (mynum, EFL_BHANDS)) {
	bprintf ("You learn the Burning Hands spell!\n");
	esetflg (mynum, EFL_BHANDS);
	return;
      } else {
	return;
      }
    }

  case OBJ_RUINS_DAMAGERUNES:
    if (!iswornby (OBJ_RUINS_AMULET, mynum)) {
      bprintf ("The runes make no sense to you.\n");
      return;
    } else {
      bprintf ("As you examine the inscription you come to understand what "
	       "they mean.\nThey speak of how to cast the Damage spell!\n");
      if (!etstflg (mynum, EFL_DAMAGE)) {
	bprintf ("You learn the Damage spell!\n");
	esetflg (mynum, EFL_DAMAGE);
	return;
      } else {
	return;
      }
    }

  case OBJ_PLAYHOUSE_TOILET:
    if (state (OBJ_PLAYHOUSE_TOILET) == 0)
      bprintf ("It has clean &+Bblue &*water inside of it.\n");
    else
      bprintf ("Woah! Look at the size of that! Just flush the thing!\n");
    break;

  case OBJ_BLIZZARD_TUBE:
    if (oarmor (a) == 0) {
      int obj = clone_object (OBJ_BLIZZARD_SCROLL, -1, NULL);

      if (obj >= 0) {
	osetarmor (a, 1);
	bprintf ("You take a scroll from the tube.\n");
	setoloc (obj, mynum, CARRIED_BY);
	return;
      }
    }
    break;

  case OBJ_BLIZZARD_SCROLL:
    if (iscarrby (OBJ_CATACOMB_CUPSERAPH, mynum)) {
      bprintf ("Funny, I thought this was a teleport scroll, but "
	       "nothing happened.\n");
      return;
    }
    bprintf ("As you read the scroll you are teleported!\n");
    destroy (a);
    teletrap (LOC_BLIZZARD_PENTACLE);
    return;

  case OBJ_BLIZZARD_BLACKROBE:
    if (oarmor (a) == 0) {
      int obj = clone_object (OBJ_BLIZZARD_KEY, -1, NULL);

      if (obj >= 0) {
	bprintf ("You take a key from one pocket.\n");
	osetarmor (a, 1);
	setoloc (obj, mynum, CARRIED_BY);
	return;
      }
    }
    break;

  case OBJ_TOWER_WAND:
    if (oarmor (a) != 0) {
      bprintf ("It seems to be charged.\n");
      return;
    }
    break;

  case OBJ_BLIZZARD_BALL:
    setobjstate (a, randperc () % 3 + 1);
    switch (state (a)) {
    case 1:
      bprintf ("It glows red.");
      break;
    case 2:
      bprintf ("It glows blue.");
      break;
    case 3:
      bprintf ("It glows green.");
      break;
    }
    bprintf ("\n");
    return;

  case OBJ_TOWER_SCROLL:
    foo = carries_obj_type (mynum, OBJ_BLIZZARD_BALL);
    if (foo < 0)
      foo = OBJ_BLIZZARD_BALL;

    if (((z = carries_obj_type (mynum, OBJ_TOWER_RED_CANDLE)) > -1 &&
	 state (foo) == 1 &&
	 otstbit (z, OFL_LIT)) ||

	((z = carries_obj_type (mynum, OBJ_TOWER_BLUE_CANDLE)) > -1 &&
	 state (foo) == 2 &&
	 otstbit (z, OFL_LIT)) ||

	((z = carries_obj_type (mynum, OBJ_TOWER_GREEN_CANDLE)) > -1 &&
	 state (foo) == 3 &&
	 otstbit (z, OFL_LIT))) {

      bprintf ("Everything shimmers and then solidifies into a different "
	       "view!\n");
      destroy (a);
      teletrap (LOC_TOWER_POTION);
      return;
    }
    break;

  case OBJ_VALLEY_BED:
    if (!odamage (a)) {
      int c = clone_object (OBJ_VALLEY_LOAF, -1, NULL);
      int b = clone_object (OBJ_VALLEY_PIE, -1, NULL);

      if (c >= 0 && b >= 0) {
	bprintf ("Aha!  Under the bed you find a loaf and a "
		 "rabbit pie.\n");
	setoloc (c, ploc (mynum), IN_ROOM);
	setoloc (b, ploc (mynum), IN_ROOM);
	osetdamage (a, 1);
	return;
      }
    }
    break;

#ifdef LOCMIN_ORCHOLD
  case OBJ_ORCHOLD_GARBAGE:
    if (state (a) == 0) {

      int x = clone_mobile (max_players + MOB_ORCHOLD_MAGGOT, -1, NULL);

      if (x >= 0) {

	bprintf ("In the garbage you find a gold plate... "
		 "with a maggot on it!\n");

	sillycom ("\001s%s\003A maggot leaps out of the garbage "
		  "onto %s!\n\003");

	setploc (x, ploc (mynum));

	/* Make sure maggot attacks the right person. */
	hit_player (x, mynum, -1);

	setobjstate (a, 1);
      } else {
	bprintf ("In the garbage you find a gold plate with some "
		 "slime on it.\n");
      }

      if ((x = clone_object (OBJ_ORCHOLD_ORCGOLD, -1, NULL)) > -1) {

	setoloc (x, ploc (mynum), IN_ROOM);
	setobjstate (a, 1);
      }
      return;
    }
    break;
#endif

#ifdef LOCMIN_TALON
  case OBJ_TALON_DESK:
    if (otstbit (OBJ_TALON_RUBY, OFL_DESTROYED) &&
	oloc (OBJ_TALON_RUBY) == LOC_TALON_TALON4) {
      create (OBJ_TALON_RUBY);
      bprintf ("You find a large, fiery ruby in one of the drawers.\n");
      send_msg (ploc (mynum), MODE_NOBLIND, pvis (mynum), LVL_MAX,
		mynum, NOBODY, "%s rummages around in the desk and turns up "
		"a large, fiery ruby.\n", pname (mynum));
      return;
    }
    break;
#endif

  case OBJ_TREEHOUSE_BEDDING:
    if (a != OBJ_TREEHOUSE_BEDDING)
      break;

    if (!odamage (OBJ_TREEHOUSE_AMULET)) {
      create (OBJ_TREEHOUSE_AMULET);
      bprintf ("You pull an amulet from the bedding.\n");
      osetdamage (OBJ_TREEHOUSE_AMULET, 1);
      return;
    }
    break;

  case OBJ_OAKTREE_BOARSKIN:
    if (a != OBJ_OAKTREE_BOARSKIN)
      break;

    if (!odamage (OBJ_OAKTREE_WHISTLE)) {
      create (OBJ_OAKTREE_WHISTLE);
      bprintf ("Under the boarskin you find a silver whistle.\n");
      osetdamage (OBJ_OAKTREE_WHISTLE, 1);
      return;
    }
    break;
  }

  if (oexam_text (a) != NULL) {
    bprintf ("%s", oexam_text (a));
  } else if (oexamine (a) != 0 && (x = fopen (OBJECTS, "r")) != NULL) {

    fseek (x, oexamine (a), 0);
    while ((ch = fgetc (x)) != '^')
      bprintf ("%c", ch);
    fclose (x);
  } else {
    bprintf ("You see nothing special.\n");
    return;
  }
}

void
incom (Boolean inv)
{
  int x, y;
  char st[MAX_COM_LEN];

  if (!ptstflg (mynum, PFL_GOTO)) {
    /* Mortals who doesn't have goto will assume that in = inventory... */
    /* Thus hiding the fact that there IS a command called in... */
    /* Must fix it so that at this should only be the case when IN is used */
    /* and not when AT is used */

    /* old: erreval(); */

    if (inv)
      inventory ();
    else
      bprintf ("Pardon?\n");
    return;
  }
  if ((x = getroomnum ()) == 0 || !exists (x)) {
    bprintf ("Unknown Player Or Room\n");
    return;
  }
  getreinput (st);
  if (EQ (st, "!")) {
    bprintf ("What exactly do you want to do?\n");
    return;
  }
  if (ltstflg (x, LFL_NOAT) && !ptstflg (mynum, PFL_IGNORENOAT)) {
    bprintf ("Something won't let you do that in that location.\n");
    return;
  }
  y = ploc (mynum);
  setploc (mynum, x);
  gamecom (st, False);
  setploc (mynum, y);
}

/* Hit the reset-stone.
 */
void
sys_reset (void)
{
  int i;
  int time = RESET_IDLE;

  for (i = 0; i < max_players; i++) {
    if (is_in_game (i) && plev (i) < LVL_WIZARD && ploc (i) != ploc (mynum) &&
	global_clock > plast_cmd (i) - time) {
      bprintf ("There are other players on who are not at this location,"
	       " so it won't work.\n");
      return;
    }
  }

  if (last_reset < global_clock && global_clock < last_reset + 3600) {
    bprintf ("Sorry, at least an hour must pass between resets.\n");
    return;
  }
  resetcom (0);
}


/* The RESET command.
 */
void
resetcom (int flags)
{
  if ((flags & RES_TEST) != 0 && !ptstflg (mynum, PFL_RESET)) {
    erreval ();
    return;
  }
  if (brkword () != -1 && plev (mynum) >= LVL_WIZARD) {
    int zone, r_locs, r_mobs, r_objs, nlocs, nmobs, nobjs, d_locs, d_mobs,
      d_objs;

    if ((zone = get_zone_by_name (wordbuf)) == -1) {
      bprintf ("&*No such zone: &+W%s\n", wordbuf);
      return;
    }
    send_msg (DEST_ALL, 0, LVL_WIZARD, LVL_MAX, mynum, NOBODY,
	      "&+C[&+W\001p%s\003 &+whas reset zone &+W%s&+C]\n",
	      pname (mynum), zname (zone));

    mudlog ("RESET: Reset by %s (Zone: %s)", pname (mynum), zname (zone));

    nlocs = znumloc (zone);
    nobjs = znumobs (zone);
    nmobs = znumchars (zone);

    reset_zone (zone, &global_clock, &d_locs, &d_mobs, &d_objs,
		&r_locs, &r_mobs, &r_objs);

    if (!ztemporary (zone)) {
      bprintf ("&*Zone &+W%s&*: Reset Completed.\n", zname (zone));

      bprintf ("\n&+C%3d &*(from &+C%d&*) "
	       "Room(s) were successfully reset.\n",
	       r_locs, nlocs - d_locs);

      bprintf ("&+C%3d &*(from &+C%d&*) "
	       "Object(s) were successfully reset.\n",
	       r_objs, nobjs - d_objs);

      bprintf ("&+C%3d &*(from &+C%d&*) "
	       "Mobile(s) were successfully reset.\n",
	       r_mobs, nmobs - d_mobs);
    } else {
      bprintf ("&*Zone &+W%s&*:\n\n"
	       "&+C%d &*Room(s) destroyed.\n"
	       "&+C%d &*Objects(s) destroyed.\n"
	       "&+C%d &*Mobiles(s) destroyed.\n",
	       zname (zone),
	       nlocs, nobjs, nmobs);
    }
  } else {
    int i;

    last_reset = global_clock;
    setqdflags (0);

    send_msg (DEST_ALL, 0, LVL_WIZARD, LVL_MAX, NOBODY, NOBODY,
	      "&+C[&+wReset Called by &+W\001p%s\003&+C]\n", pname (mynum));

    send_msg (DEST_ALL, 0, LVL_MIN, LVL_WIZARD - 1, NOBODY, NOBODY,
	      "&+C[&+wReset Called&+C]\n");

    if (breset) {
      broad ("&+C[&+wSystem has been marked for Reboot, rebooting&+C]\n");
      run_reboot (False, False);
    }
    mudlog ("RESET: Reset by %s", pname (mynum));

    for (i = 0; i < numzon; i++) {
      reset_zone (i, &global_clock, NULL, NULL, NULL, NULL, NULL, NULL);
    }

    ++numresets;
    move_pouncie ();
    broad ("&+C[&+wReset Completed&+C]\n");
  }
}

void
unveilcom (char *unv_pass)
{
  int lev;

  if (!cur_player->isawiz) {
    erreval ();
    return;
  }
  if (unv_pass == NULL) {
    if (brkword () == -1) {
      cur_player->work = OPERATOR (pname (mynum)) ? LVL_MASTER : LVL_GOD;
    } else {
      cur_player->work = atoi (wordbuf);
    }
    strcpy (cur_player->cprompt, "Magic Word: ");

    /* IAC WILL ECHO */
    bprintf ("\n\377\373\001\001Magic Word: ");

    cur_player->no_echo = True;
    push_input_handler (unveilcom);
  } else {
    bprintf ("\377\374\001\001");
    cur_player->no_echo = False;
    pop_input_handler ();
    if (!EQ (unv_pass, UNVEIL_PASS)) {
      bprintf ("Eek!  Go away!&#\n");
      mudlog ("UNVEIL: (Incorrect Password) %s", pname (mynum));
    } else {
      lev = cur_player->work;
      if ((OPERATOR (pname (mynum)) && lev >= LVL_MAX) ||
	  (!OPERATOR (pname (mynum)) && lev >= LVL_MASTER)) {
	mudlog ("UNVEIL: (Level too High) %s to %d", pname (mynum), plev (mynum));
	bprintf ("The maximum level is %d.\n", OPERATOR (pname (mynum)) ?
		 LVL_MAX - 1 : LVL_MASTER - 1);
      } else {
	set_xpflags (lev, &pflags (mynum), &pmask (mynum));
	setplev (mynum, lev);
	update_wizlist (pname (mynum), wlevel (lev));
	mudlog ("UNVEIL: %s to %d", pname (mynum), plev (mynum));
	bprintf ("Certainly, master!\n");
      }
    }
    get_command (NULL);
  }
}


void
posecom (void)
{
  char x[128];
  int n;
  int m = 0;

  char *POSE[] =
  {"gestures", "fireball", "hamster",
   "sizzle", "crackle", TABLE_END};

  if (plev (mynum) < LVL_MAGICIAN) {
    bprintf ("You're not up to this yet.\n");
    return;
  }
  if (brkword () != -1) {
    if (plev (mynum) < LVL_WIZARD) {
      bprintf ("Usage: POSE\n");
      return;
    }
    if (((n = atoi (wordbuf)) > 5 || n < 1) &&
	(m = tlookup (wordbuf, POSE)) == -1) {
      bprintf ("Usage: POSE <gestures/fireball/hamster/sizzle/crackle>\n");
      return;
    }
    if (m != -1)
      n = m;
    else
      --n;
  } else
    n = randperc () % 5;

  switch (n) {
  case 0:
    sprintf (x, "\001s%%s\003%%s raises %s arms in mighty magical "
	     "invocations.\n\003", his_or_her (mynum));
    sillycom (x);
    bprintf ("You make mighty magical gestures.\n");
    break;
  case 1:
    sillycom ("\001s%s\003%s throws out one arm and sends a huge bolt of "
	      "fire high into the sky.\n\003");
    bprintf ("You toss a fireball high into the sky.\n");
    broad ("\001cA massive ball of fire explodes high up in the sky.\n\003");
    break;
  case 2:
    sillycom ("\001s%s\003%s turns casually into a hamster before resuming "
	      "normal shape.\n\003");
    bprintf ("You casually turn into a hamster before resuming normal "
	     "shape.\n");
    break;
  case 3:
    sillycom ("\001s%s\003%s starts sizzling with magical energy.\n\003");
    bprintf ("You sizzle with magical energy.\n");
    break;
  case 4:
    sillycom ("\001s%s\003%s begins to crackle with magical fire.\n\003");
    bprintf ("You crackle with magical fire.\n");
    break;
  }
}

/* Brian Preble -- shows current set*in/set*out settings.
 * (Improved by Alf. Extended to include other players setins by Nicknack.)
 */
void
reviewcom (void)
{
  char xx[SETIN_MAX + 200];
  SETIN_REC s;
  PERSONA p;
  int x;
  Boolean me = False;
  PLAYER_REC *v = NULL;
  char *in_ms, *out_ms, *min_ms, *mout_ms;
  char *vin_ms, *vout_ms, *qin_ms, *qout_ms;
  char *sit_ms, *sta_ms, *sum_ms, *sin_ms, *sout_ms;
  char *pro;
  char *name;

  if (brkword () == -1 || EQ (wordbuf, pname (mynum))) {
    me = True;
    v = cur_player;
    x = mynum;
  } else if (plev (mynum) < LVL_WIZARD) {
    erreval ();
    return;
  } else if ((x = fpbns (wordbuf)) >= 0 && x < max_players &&
	     plev (x) >= LVL_WIZARD) {
    v = players + x;
  } else if (!getuaf (wordbuf, &p) || p.p_level < LVL_WIZARD) {
    bprintf ("I know no wizard with the name '%s'.\n", wordbuf);
    return;
  } else if (!getsetins (wordbuf, &s)) {
    bprintf ("%s has no non-standard travel-messages.\n", p.p_name);
    return;
  }
  if (v != NULL) {
    in_ms = v->setin;
    out_ms = v->setout;
    min_ms = v->setmin;
    mout_ms = v->setmout;
    vin_ms = v->setvin;
    vout_ms = v->setvout;
    qin_ms = v->setqin;
    qout_ms = v->setqout;
    pro = v->prompt;
    sit_ms = v->setsit;
    sta_ms = v->setstand;
    sum_ms = v->setsum;
    sin_ms = v->setsumin;
    sout_ms = v->setsumout;
    name = pname (x);
  } else {
    in_ms = s.setin;
    out_ms = s.setout;
    min_ms = s.setmin;
    mout_ms = s.setmout;
    vin_ms = s.setvin;
    vout_ms = s.setvout;
    qin_ms = s.setqin;
    qout_ms = s.setqout;
    pro = s.prompt;
    sit_ms = s.setsit;
    sta_ms = s.setstand;
    sum_ms = s.setsum;
    sin_ms = s.setsumin;
    sout_ms = s.setsumout;
    name = p.p_name;
  }

  bprintf ("Current travel messages");
  if (!me)
    bprintf (" for %s", name);
  bprintf (":\n------------------------\n");
  bprintf ("SETIN     : %s\n", build_setin (xx, in_ms, name, NULL, NULL));
  bprintf ("SETOUT    : %s\n", build_setin (xx, out_ms, name, "<dir>", NULL));
  bprintf ("SETMIN    : %s\n", build_setin (xx, min_ms, name, NULL, NULL));
  bprintf ("SETMOUT   : %s\n", build_setin (xx, mout_ms, name, NULL, NULL));
  bprintf ("SETVIN    : %s\n", build_setin (xx, vin_ms, name, NULL, NULL));
  bprintf ("SETVOUT   : %s\n", build_setin (xx, vout_ms, name, NULL, NULL));
  bprintf ("SETQIN    : %s\n", build_setin (xx, qin_ms, name, NULL, NULL));
  bprintf ("SETQOUT   : %s\n", build_setin (xx, qout_ms, name, NULL, NULL));
  bprintf ("SETSIT    : %s\n", build_setin (xx, sit_ms, name, NULL, NULL));
  bprintf ("SETSTND   : %s\n", build_setin (xx, sta_ms, name, NULL, NULL));
  bprintf ("SETSUM    : %s\n", build_setin (xx, sum_ms, name, NULL, NULL));
  bprintf ("SETSIN    : %s\n", build_setin (xx, sin_ms, name, NULL, "<victim>"));
  bprintf ("SETSOUT   : %s\n", build_setin (xx, sout_ms, name, NULL, "<victim>"));
  bprintf ("PROMPT    : %s\n", pro);
}

void
scorecom (void)
{
  int plx = mynum;

  if (brkword () != -1) {
    if ((plx = fpbn (wordbuf)) < 0) {
      bprintf ("Who?\n");
      return;
    }
    if (plev (mynum) < LVL_WIZARD) {
      bprintf ("That is beyond your powers.\n");
      return;
    }
  }
  bprintf ("%s%s Statistics:\n", (plx == mynum) ? "Your" : pname (plx),
	   (plx == mynum) ? "" : "'s");

  if (plx < max_players) {
    bprintf ("&+w---------------------------------------------------------\n");
    bprintf ("&+wScore:    &+W%d\n", pscore (plx));

    if (plev (plx) < LVL_WIZARD) {
      if (pscore (plx) < levels[LVL_WIZARD]) {
	bprintf ("&+wNext Lvl: &+W%d\n", (levels[plev (plx) + 1] - pscore (plx)));
      } else {
	bprintf ("&+wNext Lvl: &+WNo Points Needed\n");
      }
    }

    bprintf ("&+wHealth:   %s%d&+w/&+W%d\n", str_color (plx), pstr (plx), maxstrength (plx));
    bprintf ("&+wMana:     %s%d&+w/&+W%d\n", mag_color (plx), pmagic (plx), maxmagic (plx));
    bprintf ("&+wDamage:   &+W%d\n", player_damage (plx));
    bprintf ("&+wArmor:    &+W%d&+w/&+W%d\n", player_armor (plx), MAXARMOR);
    bprintf ("&+wKills:    &+W%d\n", pkilled (plx));
    bprintf ("&+wDeaths:   &+W%d\n", pdied (plx));
    bprintf ("&+wRank:     &+W%s\n", make_rank (plx));
    bprintf ("&+w---------------------------------------------------------\n");
  } else {
    bprintf ("&+w---------------------------------------------------------\n");
    if (pstr (plx) <= 0)
      bprintf ("&+wHealth: &+RDead\n");
    else
      bprintf ("&+wHealth: %s%d&+w/&+W%d\n", str_color (plx), pstr (plx), pstr_reset (plx));
    bprintf ("&+wDamage: &+W%d\n", player_damage (plx));
    bprintf ("&+wArmor:  &+W%d\n", player_armor (plx));
    bprintf ("&+w---------------------------------------------------------\n");
  }
}

void
sitcom (void)
{
  if (psitting (mynum)) {
    bprintf ("You're already sitting.\n");
    return;
  } else if (pfighting (mynum) >= 0) {
    bprintf ("You want to sit down while fighting?  Do you have a death "
	     "wish or something?\n");
    return;
  }
#ifdef LOCMIN_PLAYHOUSE
  if (ploc (mynum) == oloc (OBJ_PLAYHOUSE_TOILET)) {
    bprintf ("You sit down upon the Porcelain Throne.\n");
    send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY,
	      "%s sits upon the Porcelain Throne.\n", pname (mynum));
    setpsitting (mynum, 1);
    return;
  }
#endif
  if (ploc (mynum) == LOC_ICECAVE_THRONE) {
    if (oloc (OBJ_ICECAVE_WESTICETHRONE)) {
      bprintf ("The throne collapses under your weight, revealing a "
	       "passage east.\n");
      setobjstate (OBJ_ICECAVE_WESTICETHRONE, 0);
      return;
    }
  }
  bprintf ("You assume the lotus position.\n");
  send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY,
	    "%s sits down.\n", pname (mynum));
  setpsitting (mynum, 1);
}

void
standcom (int player)
{
  if (!psitting (player)) {
    sendf (player, "You're already standing.\n");
    return;
  } else {
    sendf (player, "You clamber to your feet.\n");
    send_msg (ploc (player), 0, pvis (player), LVL_MAX, player, NOBODY,
	  "%s clambers to %s feet.\n", pname (player), his_or_her (player));
    setpsitting (player, 0);
  }
}

void
pncom (void)
{
  int plx = real_mynum;
  char *p;

  if (brkword () == -1 || (plx = fpbn (wordbuf)) == -1 ||
      plx >= max_players || (plx != mynum && plev (mynum) < LVL_WIZARD)) {
    plx = real_mynum;
  }
  if (plx == real_mynum) {
    bprintf ("Current pronouns are:\n");
  } else {
    bprintf ("Current pronouns for %s are:\n", pname (plx));
  }
  bprintf ("Me    : %s\n", pname (plx));
  bprintf ("It    : %s\n", (p = players[plx].wd_it) == NULL ? "<none>" : p);
  bprintf ("Him   : %s\n", (p = players[plx].wd_him) == NULL ? "<none>" : p);
  bprintf ("Her   : %s\n", (p = players[plx].wd_her) == NULL ? "<none>" : p);
  bprintf ("Them  : %s\n", (p = players[plx].wd_them) == NULL ? "<none>" : p);
}

void
bugcom (void)
{
  char x[MAX_COM_LEN];

  getreinput (x);
  if (EMPTY (txt1)) {
    bprintf ("What do you want to bug me about?\n");
  } else {
    mudlog ("BUG: %s - %s", pname (mynum), x);
    bprintf ("Ok.\n");
  }
}

void
typocom (void)
{
  int l = ploc (mynum);
  char x[MAX_COM_LEN];

  getreinput (x);
  if (EMPTY (x)) {
    bprintf ("What typo do you wish to inform me of?\n");
  } else {
    mudlog ("TYPO: %s (%s): %s", pname (mynum), showname (l), x);
    bprintf ("Ok.\n");
  }
}

void
helpcom (void)
{
  int a, b;

  if (item1[0] != 0) {
    if (showhelp (item1) < 0)
      return;
    if ((a = vichere ()) < 0)
      return;
    if ((b = phelping (mynum)) >= 0) {
      sillytp (b, "stopped helping you.");
      bprintf ("Stopped helping \001p%s\003.\n", pname (b));
    }
    if (a == mynum) {
      bprintf ("You are beyond help.\n");
      return;
    }
    setphelping (mynum, a);
    sillytp (a, "has offered to help you.");
    bprintf ("Started helping \001p%s\003.\n", pname (phelping (mynum)));
    return;
  }
  bprintf ("\001f%s/%s\003", HELP_DIR, HELP1);
  if (plev (mynum) < LVL_WIZARD) {
    return;
  }
  bprintf (qwait);
  replace_input_handler (help2);
}

void
help2 (char *cont)
{
  if (cont[0] == 'q') {
    get_command (NULL);
  } else {
    bprintf ("\001f%s/%s\003", HELP_DIR, HELP2);
    bprintf ("\n");
    if (plev (mynum) < LVL_PROPHET) {
      get_command (NULL);
    } else {
      bprintf (qwait);
      replace_input_handler (help3);
    }
  }
}

void
help3 (char *cont)
{
  if (cont[0] == 'q') {
    get_command (NULL);
  } else {
    bprintf ("\001f%s/%s\003", HELP_DIR, HELP3);
    bprintf ("\n");
    if (plev (mynum) < LVL_ARCHWIZARD) {
      get_command (NULL);
    } else {
      bprintf (qwait);
      replace_input_handler (help4);
    }
  }
}

void
help4 (char *cont)
{
  if (cont[0] == 'q') {
    get_command (NULL);
  } else {
    bprintf ("\001f%s/%s\003", HELP_DIR, HELP4);
    bprintf ("\n");
    if (plev (mynum) < LVL_ADVISOR) {
      get_command (NULL);
    } else {
      bprintf (qwait);
      replace_input_handler (help5);
    }
  }
}

void
help5 (char *cont)
{
  if (cont[0] == 'q') {
    get_command (NULL);
  } else {
    bprintf ("\001f%s/%s\003", HELP_DIR, HELP5);
    bprintf ("\n");
    if (plev (mynum) < LVL_AVATAR) {
      get_command (NULL);
    } else {
      bprintf (qwait);
      replace_input_handler (help6);
    }
  }
}

void
help6 (char *cont)
{
  if (cont[0] == 'q') {
    get_command (NULL);
  } else {
    bprintf ("\001f%s/%s\003", HELP_DIR, HELP6);
    bprintf ("\n");
    if (plev (mynum) < LVL_GOD) {
      get_command (NULL);
    } else {
      bprintf (qwait);
      replace_input_handler (help7);
    }
  }
}

void
help7 (char *cont)
{
  if (cont[0] == 'q') {
    get_command (NULL);
  } else {
    bprintf ("\001f%s/%s\003", HELP_DIR, HELP7);
    bprintf ("\n");
    get_command (NULL);
  }
}

int
showhelp (char *verb)
{
  char file[130];
  char line[80];
  int scanreturn = EOF;
  int v;
  FILE *fp;

  sprintf (file, "../bin/pfilter %d 0x%08lx:0x%08lx:0x%08lx 0x%08lx:0x%08lx:0x%08lx "
	   HELP_DIR "/" FULLHELP, plev (mynum), pflags (mynum).u,
	   pflags (mynum).h, pflags (mynum).l, pmask (mynum).u,
	   pmask (mynum).h, pmask (mynum).l);

  if ((fp = popen (file, "r")) == NULL) {
    bprintf ("Someone's editing the help file.\n");
    return -1;
  }
  ssetflg (mynum, SFL_BUSY);
  pbfr ();
  v = strlen (verb);
  while (True) {
    if (fgets (line, sizeof (line), fp) == NULL) {
      scanreturn = EOF;
      break;
    }
    if ((scanreturn = strncasecmp (line, verb, v)) == 0)
      break;
    do {
      if (fgets (line, sizeof (line), fp) == NULL) {
	scanreturn = EOF;
	break;
      }
    }
    while (strcmp (line, "^\n") != 0);
  }

  if (scanreturn != 0) {	/* command not found in extern list */
    pclose (fp);
    sclrflg (mynum, SFL_BUSY);
    return 0;
  }
  bprintf ("\nUsage: %s\n", line);
  while (fgets (line, sizeof (line), fp) && strcmp (line, "^\n") != 0) {
    bprintf ("%s", line);
  }
  bprintf ("\n");

  pclose (fp);
  sclrflg (mynum, SFL_BUSY);
  return -1;
}




/* The QUESTS-Command. Mortals may find out which quests they have
 * comleted and which are left. Arch-Wizards may in addition set or
 * clear quests for a mortal, Wizards only for themselves.
 * Usage: QUESTS <player> <questname> <true/false>
 */
void
questcom (void)
{
  int a, b, c, l;
  char *n;
  Boolean f, all;
  QFLAGS q, *p;
  PERSONA d;

  f = False;

  if (brkword () == -1) {
    a = mynum;
    p = &(qflags (a));
    n = pname (a);
    l = plev (a);
  } else if ((a = fpbn (wordbuf)) != -1) {
    if (a != mynum && plev (mynum) < LVL_WIZARD) {
      bprintf ("You can only check your own Quest-stats.\n");
      return;
    }
    p = &(qflags (a));
    n = pname (a);
    l = plev (a);
  } else if (!getuaf (wordbuf, &d)) {
    bprintf ("No such persona in system.\n");
    return;
  } else if (plev (mynum) < LVL_WIZARD) {
    bprintf ("You can only check your own Quest-stats.\n");
    return;
  } else {
    f = True;
    p = &(d.p_quests);
    n = d.p_name;
    l = d.p_level;
  }

  if (brkword () == -1) {
    bprintf ("\nPlayer: %s\n\n", n);

    all = False;
    bprintf ("Completed Quests:\n");
    if ((*p & Q_ALL) == Q_ALL) {
      bprintf ("All!\n");
      all = True;
    } else if ((*p & Q_ALL) != 0) {
      show_bits ((int *) p, sizeof (QFLAGS) / sizeof (int), Quests);
    } else {
      bprintf ("None!\n");
    }
    if (!all) {
      bprintf ("\nStill to do:\n");
      q = (~*p & Q_ALL);
      show_bits ((int *) &q, sizeof (QFLAGS) / sizeof (int), Quests);
    }
    return;
  } else if ((b = tlookup (wordbuf, Quests)) == -1) {
    bprintf ("%s: No such Quest.\n", wordbuf);
    return;
  } else if (brkword () == -1 || plev (mynum) < LVL_WIZARD) {
    c = xtstbit (*p, b) ? 1 : 0;
    bprintf ("Value of %s is %s\n", Quests[b], TF[c]);
    return;
  } else if (plev (mynum) < LVL_ARCHWIZARD && !EQ (n, pname (mynum))) {
    bprintf ("You can't change other players Quest-stats.\n");
    return;
  } else if ((c = tlookup (wordbuf, TF)) == -1) {
    bprintf ("Value must be True or False.\n");
    return;
  }
  mudlog ("QUEST: %s by %s, %s = %s", n, pname (mynum), Quests[b], TF[c]);

  if (c == 0) {
    xclrbit (*p, b);
  } else {
    xsetbit (*p, b);
  }
  if (f) {
    putuaf (&d);
  }
}

/* The INFO command.
 */
void
infocom (void)
{
  char file[100];

  if (brkword () == -1) {
    strcpy (file, INFO_DIR "/" INFO);
  } else {
    if (strlen (wordbuf) >= (sizeof (file) - 10)) {
      bprintf ("No info available on that topic.\n");
      return;
    }
    sprintf (file, "%s/%s.i", INFO_DIR, lowercase (wordbuf));
    if (access (file, R_OK) < 0) {
      bprintf ("No info available on that topic.\n");
      return;
    }
  }

  file_pager (file);
}

/* The POLICY command.
 */
void
policycom (void)
{
  char file[100];

  if (brkword () == -1) {
    strcpy (file, POLICY_DIR "/" POLICY);
  } else {
    if (strlen (wordbuf) >= (sizeof (file) - 10)) {
      bprintf ("No info available on that topic.\n");
      return;
    }
    sprintf (file, "%s/%s.p", POLICY_DIR, lowercase (wordbuf));
    if (access (file, R_OK) < 0) {
      bprintf ("No such policy exists.\n");
      return;
    }
  }
  file_pager (file);
}

/* The GLOBAL command.
 */
void
globalcom (void)
{
  char buff[80];

  if (plev (mynum) < LVL_WIZARD) {
    erreval ();
    return;
  } else if (plev (mynum) >= LVL_GOD && dump_pflags ())
    return;

  bprintf ("&+CGlobal Settings:\n");
  bprintf ("&+B---------------------------------------------------------------------------\n");
  bprintf ("&+WWeather (Season)  : &+C%s (%s)\n",
	   weather_desc (the_climate->weather),
	   season_name (the_climate->season));
  bprintf ("&+WLock-status       : &+C%slocked\n",
	   lev2s (buff, the_world->w_lock));
  bprintf ("&+WNoRun Status      : &+C%s\n", norun ? "Enabled" : "Disabled");
  bprintf ("&+WMobiles           : &+C%s\n",
	   (the_world->w_mob_stop) ? "Stopped" : "Started");
  bprintf ("&+WWar/Peace         : &+C%s\n",
	   (the_world->w_peace) ? "Peace" : "War");
  bprintf ("&+WTournament-Mode   : &+C%s\n",
	   (the_world->w_tournament) ? "On" : "Off");
  bprintf ("&+WReboot on Reset   : &+C%s\n", breset ? "Yes" : "No");
  bprintf ("&+WMax. Users        : &+C%d\n", max_players);
  bprintf ("&+WNumber of Rooms   : "
     "&+C%4d &*permanent +&+C%4d &*wiz-made = &+C%4d &*(&+WMax: &+C%d&*)\n",
	   num_const_locs, numloc - num_const_locs, numloc, GLOBAL_MAX_LOCS);
  bprintf ("&+WNumber of Mobiles : "
     "&+C%4d &*permanent +&+C%4d &*wiz-made = &+C%4d &*(&+WMax: &+C%d&*)\n",
	   num_const_chars - max_players, numchars - num_const_chars,
	   numchars - max_players, GLOBAL_MAX_MOBS);
  bprintf ("&+WNumber of Objects : "
     "&+C%4d &*permanent +&+C%4d &*wiz-made = &+C%4d &*(&+WMax: &+C%d&*)\n",
	   num_const_obs, numobs - num_const_obs, numobs, GLOBAL_MAX_OBJS);
  bprintf ("&+B---------------------------------------------------------------------------\n");

}

static void
do_pretend (int plx)
{
  int p;

  if ((p = cur_player->pretend) >= 0) {
    /* We are someone else, unalias him */
    sclrflg (p, SFL_OCCUPIED);
    mynum = real_mynum;
    cur_player->pretend = -1;
  }
  if (plx < 0) {
    /* Back to ourselves */
    if (p < 0)
      return;			/* we already are ourselves */

    strcpy (cur_player->setin, cur_player->o_setin);
    strcpy (cur_player->setout, cur_player->o_setout);
  } else {
    /* We will pretend to be plx from now */
    mynum = plx;
    cur_player->pretend = plx;
    ssetflg (plx, SFL_OCCUPIED);
    if (p < 0) {
      strcpy (cur_player->o_setin, cur_player->setin);
      strcpy (cur_player->o_setout, cur_player->setout);
    }
    if (plx >= max_players) {
      strcpy (cur_player->setin, "%n has arrived.");
      strcpy (cur_player->setout, "%n has gone %d.");
    } else {
      strcpy (cur_player->setin, players[plx].setin);
      strcpy (cur_player->setout, players[plx].setout);
    }
  }
}

int
find_pretender (int plx)
{
  int p;

  if (ststflg (plx, SFL_OCCUPIED)) {
    for (p = 0; p < max_players; p++) {
      if (players[p].pretend == plx && is_in_game (p)) {
	return p;
      }
    }
  }
  return -1;
}

void
aliascom (void)
{
  if (pl1 == -1) {
    if (ptstflg (mynum, PFL_ALIAS) || ptstflg (mynum, PFL_ALIASP)) {
      bprintf ("Who?\n");
    } else {
      erreval ();
    }
    return;
  }
  if (cur_player->polymorphed >= 0) {
    bprintf ("A mysterious force stops you.\n");
    return;
  }
  if (ststflg (pl1, SFL_OCCUPIED)) {
    bprintf ("Already occupied!\n");
    return;
  }
  if (pl1 < max_players) {
    if (!ptstflg (mynum, PFL_ALIASP)) {
      bprintf ("You can't become another player!\n");
      return;
    }
    if (!do_okay (mynum, pl1, PFL_NOALIAS)) {
      if (players[pl1].asmortal > 0 && plev (mynum) <= LVL_WIZARD)
	bprintf ("Already occupied!\n");
      else
	bprintf ("They don't want to be aliased!\n");
      return;
    }
  } else if (!ptstflg (mynum, PFL_ALIAS)) {
    bprintf ("You can't become a mobile!\n");
    return;
  }
  cur_player->aliased = True;
  cur_player->aliasto = pl1;
  do_pretend (pl1);
  bprintf ("Aliased to %s.\n", pname (pl1));
}

void
polymorph (int plx, int turns)
{
  /* Polymorph to PLX for TURNS turns. */
  if (plx < 0 || turns < 0) {
    unpolymorph (real_mynum);
    return;
  }
  do_pretend (plx);
  cur_player->polymorphed = turns;
  bprintf ("You pass out.....\n..... and wake up.\n");
}


void
unalias (int pl)
{
  int me = real_mynum;

  setup_globals (pl);
  if (cur_player->aliased) {
    do_pretend (-1);
    cur_player->aliased = False;
    bprintf ("Back to good old %s....\n", pname (mynum));
  }
  setup_globals (me);
}

void
unpolymorph (int pl)
{
  int me = real_mynum;

  setup_globals (pl);
  if (cur_player->polymorphed >= 0) {
    do_pretend (-1);
    cur_player->polymorphed = -1;
    setpfighting (mynum, -1);
    bprintf ("Suddenly you awake... were you dreaming or what?\n");
  }
  setup_globals (me);
}



Boolean
disp_file (char *fname, FILE * f)
{
  char buff[BUFSIZ];

  if (f == NULL && (f = fopen (fname, "r")) == NULL) {
    return False;
  }
  while (fgets (buff, BUFSIZ, f) != NULL) {
    bprintf ("%s", buff);
  }
  fclose (f);
  return True;
}




void
becom (char *passwd)
{
  char x[128];
  PERSONA p;

  if (passwd == NULL) {

    if (cur_player->polymorphed != -1 || cur_player->aliased) {
      bprintf ("Not when aliased.");
      return;
    }
    if (cur_player->writer != NULL) {
      bprintf ("Finish whatever you're writing first!\n");
      return;
    }
    if (pfighting (mynum) != -1) {
      bprintf ("Not while fighting!\n");
      return;
    }
    if (brkword () == -1) {
      bprintf ("Become what?  Inebriated?\n");
      return;
    }
    strcpy (cur_player->work2, wordbuf);
    strcpy (cur_player->cprompt, "Password: ");
    cur_player->no_echo = True;

    bprintf ("\n\377\373\001\001Password: ");
    push_input_handler (becom);
  } else {
    bprintf ("\377\374\001\001");
    cur_player->no_echo = False;
    pop_input_handler ();

    if (!getuaf (cur_player->work2, &p)) {
      bprintf ("No such player.\n");
    } else if (!EQ (p.p_passwd, my_crypt (x, passwd, strlen (p.p_passwd) + 1))) {
      bprintf ("Incorrect password!\n");
    } else if (fpbns (cur_player->work2) >= 0) {
      bprintf ("That player is allready on the game.\n");
    } else {
      close_plr_log ();
      saveme ();
      remove_entry (mob_id (mynum), &id_table);

      pers2player (&p, mynum);
      strcpy (cur_player->cprompt, cur_player->prompt);
      mudlog ("SYSTEM: %s has BECOME %s", pname (mynum), p.p_name);

      send_msg (DEST_ALL, MODE_QUIET, max (LVL_WIZARD, pvis (mynum)), LVL_MAX,
		mynum, NOBODY, "&+B[&+W%s &*has &+CBECOME &+W%s&+B]\n", pname (mynum), p.p_name);
      send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY,
		"%s disintegrates, and reappears as %s.\n",
		pname (mynum), p.p_name);

      setpname (mynum, p.p_name);
      fetchprmpt (mynum);
      insert_entry (mob_id (mynum), mynum, &id_table);

      bprintf ("You are now %s.\n", pname (mynum));
      check_files ();

      if (privileged_user (pname (mynum)))
	cur_player->isawiz = True;

      if (is_monitored (pname (mynum))) {
	open_plr_log ();
      }
    }
    get_command (NULL);
  }
}

void
dircom (void)
{
  int a, c, oc = 0;
  char b[40], d[40];

  if (plev (mynum) < LVL_WIZARD) {
    erreval ();
    return;
  }
  for (a = 0; a < numobs; a++) {
    oc++;
    c = findzone (oloc (a), b);
    sprintf (d, "%s%d", b, c);
    if (ocarrf (a) >= CARRIED_BY)
      strcpy (d, "Carried");
    else if (ocarrf (a) == IN_CONTAINER)
      strcpy (d, "In item");
    bprintf ("%-13s%-13s", oname (a), d);
    if (a % 3 == 2)
      bprintf ("\n");
  }
  bprintf ("\nTotal of %d objects.\n", oc);
}


void
treasurecom (void)
{
  int a, c, tc = 0;
  char b[40], d[40];

  if (plev (mynum) < LVL_WIZARD) {
    erreval ();
    return;
  }
  for (a = 0; a < numobs; a++) {
    if (!oflannel (a) && !otstbit (a, OFL_DESTROYED) && ocarrf (a) == IN_ROOM) {
      tc++;
      c = findzone (oloc (a), b);
      sprintf (d, "%s%d", b, c);
      bprintf ("%-13s%-13s", oname (a), d);
      if (tc % 3 == 0)
	bprintf ("\n");
      if (tc % 18 == 17)
	pbfr ();
    }
  }
  bprintf ("\nApproximately %d treasures remain.\n", tc);
}



/* The LEVELS command. Display the number of points required to reach each
 * new level together with the corresponding male and female titles.
 */
void
levelscom (void)
{
  int i;

  bprintf ("Level   Points        Male                    Female\n");
  bprintf ("=====   ======        ====                    ======\n");

  for (i = 1; i <= LVL_WIZARD; i++) {

    bprintf ("%-5d   %6d        the %-17s   the %-20s\n",
	     i, levels[i], MLevels[i], FLevels[i]);
  }
  bprintf ("\n");
}


void
promptcom (void)
{
  char buff[MAX_COM_LEN];

  getreinput (buff);
  if (strlen (buff) > PROMPT_LEN) {
    bprintf ("Max. prompt length is %d.\n", PROMPT_LEN);
    return;
  }
  strcpy (cur_player->prompt, buff);
  bprintf ("Ok\n");

}

void
followcom (void)
{
  if (cur_player->i_follow >= 0) {
    bprintf ("Stopped following \001P%s\003.\n", pname (cur_player->i_follow));
    sendf (cur_player->i_follow, "\001p%s\003 has stopped following you.\n", pname (mynum));
    cur_player->i_follow = -1;
    return;
  }
  if (pfighting (mynum) != -1) {
    bprintf ("Not in a fight!\n");
    return;
  }
  if (EMPTY (item1)) {
    bprintf ("Who?\n");
    return;
  }
  if (pl1 == -1) {
    bprintf ("Who?\n");
    return;
  }
  if (ploc (pl1) != ploc (mynum)) {
    bprintf ("They aren't here.\n");
    return;
  }
  if (mynum == pl1) {
    bprintf ("You run round in circles!\n");
    return;
  }
  sendf (pl1, "%s is following you.\n", see_name (pl1, mynum));
  cur_player->i_follow = pl1;
  bprintf ("Ok\n");
}

void
losecom (void)
{
  if (cur_player->i_follow == -1) {
    bprintf ("You aren't following anyone.\n");
    return;
  }
  sendf (cur_player->i_follow, "\001p%s\003 has stopped following you.\n", pname (mynum));
  cur_player->i_follow = -1;
  bprintf ("Ok\n");
}

void
togglecom (int flg, char on[80], char off[80])
{
  Boolean away = (flg == SFL_AWAY);
  char buffer[MAX_COM_LEN];
  int size = sizeof (cur_player->awaymsg);

  if ((flg == SFL_QUIET || flg == SFL_ALOOF) && (plev (mynum) < LVL_WIZARD)) {
    erreval ();
    return;
  }
  if (!ststflg (mynum, flg)) {
    ssetflg (mynum, flg);
    bprintf ("%s\n", on);

    if (away) {
      if (EMPTY (txt1))
	sprintf (buffer, "No particular reason.");
      else
	getreinput (buffer);

      sprintf (cur_player->awaymsg, "%.*s", size, buffer);
      send_msg (DEST_ALL, 0, pvis (mynum), LVL_MAX, mynum, NOBODY,
		"&+G[&+W%s &*has walked away from %s keyboard&+G]\n",
		pname (mynum), his_or_her (mynum));
      send_msg (DEST_ALL, 0, pvis (mynum), LVL_MAX, mynum, NOBODY,
		"&+G[&+WReason: &*%s&+G]\n", cur_player->awaymsg);
      bprintf ("Reason: %s\n", cur_player->awaymsg);
    }
  } else {
    sclrflg (mynum, flg);
    bprintf ("%s\n", off);

    if (away) {
      send_msg (DEST_ALL, 0, pvis (mynum), LVL_MAX, mynum, NOBODY,
		"&+G[&+W%s &*has returned to %s keyboard&+G]\n",
		pname (mynum), his_or_her (mynum));
    }
  }
}

/* QDONE: Shows quests done so far during the current reset.
 * 1995 by Illusion
 */
void
qdonecom ()
{
  int i;

  bprintf ("&+WQuest Status For This Reset:\n");
  bprintf ("&+B---------------------------------------------------\n");
  for (i = 0; i <= Q_LAST_QUEST; ++i)
    bprintf ("&+w%-30s &+W%20s\n", Quests[i],
	     qdtstflg (i) ? "Done" : "Not Completed");
  bprintf ("&+B---------------------------------------------------\n");
}

void
beepcom (void)
{
  int a;

  if (brkword () == -1) {
    bprintf ("Who do you want to beep?\n");
    return;
  }
  if ((a = fpbn (wordbuf)) == -1) {
    bprintf ("I can't seem to find that player.\n");
    return;
  }
  if (a >= max_players) {
    bprintf ("Beep a mobile? Why?\n");
    return;
  }
  if (a == mynum) {
    bprintf ("You want to beep yourself? Ok then!&#&#\n");
    return;
  }
  if (check_forget (a, mynum)) {
    bprintf ("&+W%s &*has forgotten you and will not receive your beeps.\n", pname (a));
    return;
  }
  if (ltstflg (ploc (a), LFL_SOUNDPROOF)) {
    bprintf ("%s seems to be in a soundproof room.\n", pname (a));
    return;
  }
  bprintf ("Beeping %s.\n", pname (a));
  sendf (a, "\001p%s\003 is trying to get your attention!&#&#\n", pname (mynum));
}

void
togglefinger (void)
{
  if (!ststflg (mynum, SFL_NOFINGER)) {
    ssetflg (mynum, SFL_NOFINGER);
    bprintf ("You can no longer be checked on by other users.\n");
  } else {
    sclrflg (mynum, SFL_NOFINGER);
    bprintf ("You can now be checked on by other users.\n");
  }
}

void
fingercom (void)
{
  int c, b;
  PERSONA p;
  SFLAGS *s;

  if (brkword () == -1) {
    togglefinger ();
    return;
  }
  if ((b = fpbns (wordbuf)) != -1 && seeplayer (b)) {
    if (b >= max_players)
      bprintf ("Why would you want to check the last time a mobile logged in?\n");
    else
      bprintf ("They are currently online.\n");

    return;
  }
  if (!getuaf (wordbuf, &p)) {
    bprintf ("Person not found in system.\n");
    return;
  }
  s = &(p.p_sflags);
  c = tst_bit (s, SFL_NOFINGER) ? 1 : 0;

  if (c && plev (mynum) < LVL_AVATAR) {
    bprintf ("That player cannot be finger'd.\n");
    return;
  }
  bprintf ("&+wPlayer: &+C%s\n", p.p_name);
  bprintf ("&+wLast Login: &+C%s\n", time2ascii (p.p_last_on));

  if (ptstflg (mynum, PFL_SHUSER))
    bprintf ("&+wFrom Host: &+C%s\n", !ptstflg (mynum, PFL_SEEUSER) ?
	     p.p_last_host : p.p_usrname);

  bprintf ("\n");
  check_mail (p.p_name);
}

void
setpager (void)
{
  int new;

  if (brkword () == -1) {
    bprintf ("&+wPager is currently set to &+C%d &+wlines.\n", ppager (mynum));
    return;
  }
  new = atoi (wordbuf);

  if (new > 200) {
    bprintf ("Do you really need the pager set that high?\n");
    return;
  }
  if (new < 0) {
    bprintf ("Do you really need the pager set that low?\n");
    return;
  }
  setppager (mynum, new);

  if (new) {
    bprintf ("&+wSetting pager to &+C%d &+wlines.\n", new);
  } else {
    bprintf ("&+wTurning pager &+COff&+w.\n");
  }
}

void
optionscom (void)
{
  char pager[20], chan[20], wimpy[20];

  sprintf (pager, "&+C%d Lines", ppager (mynum));
  sprintf (chan, "&+C%d", pchannel (mynum));
  sprintf (wimpy, "&+C%d", pwimpy (mynum));

  bprintf ("&+WYour current game options:\n");
  bprintf ("&+B---------------------------------------------------------\n");
  bprintf ("&+wColor          %-11s       &+wNewStyle       %-11s\n",
	   ststflg (mynum, SFL_COLOR) ? "&+CEnabled" : "&+cDisabled",
	   ststflg (mynum, SFL_NEWSTYLE) ? "&+CEnabled" : "&+cDisabled");
  bprintf ("&+wBrief          %-11s       &+wAway           %-11s\n",
	   ststflg (mynum, SFL_BRIEF) ? "&+CEnabled" : "&+cDisabled",
	   ststflg (mynum, SFL_AWAY) ? "&+CEnabled" : "&+cDisabled");
  bprintf ("&+wBusy           %-11s       &+wNoFight        %-11s\n",
	   ststflg (mynum, SFL_BUSY) ? "&+CEnabled" : "&+cDisabled",
	   ststflg (mynum, SFL_NOFIGHT) ? "&+CEnabled" : "&+cDisabled");
  bprintf ("&+wAutoExit       %-11s       &+wNoFinger       %-11s\n",
	   ststflg (mynum, SFL_AUTOEXIT) ? "&+CEnabled" : "&+cDisabled",
	   ststflg (mynum, SFL_NOFINGER) ? "&+CEnabled" : "&+cDisabled");
  bprintf ("&+wNoInventory    %-11s       &+wNoBeep         %-11s\n",
	   ststflg (mynum, SFL_NOINV) ? "&+CEnabled" : "&+cDisabled",
	   ststflg (mynum, SFL_NOBEEP) ? "&+CEnabled" : "&+cDisabled");
  bprintf ("&+wHearBack       %-11s       &+wNoBlink        %-11s\n",
	   ststflg (mynum, SFL_HEARBACK) ? "&+CEnabled" : "&+cDisabled",
	   ststflg (mynum, SFL_NOBLINK) ? "&+CEnabled" : "&+cDisabled");
  bprintf ("&+wNoFlag         %-11s       &+wNoOracle       %-11s\n",
	   ststflg (mynum, SFL_NOFLAG) ? "&+CEnabled" : "&+cDisabled",
	   ststflg (mynum, SFL_NOORACLE) ? "&+CEnabled" : "&+cDisabled");
  bprintf ("&+wNoWeather      %-11s       &+wWimpy          %-11s\n",
	   ststflg (mynum, SFL_NOWET) ? "&+CEnabled" : "&+cDisabled",
	   pwimpy (mynum) == 0 ? "&+cDisabled" : wimpy);
  bprintf ("&+wChat Channel   %-11s       &+wPager          %-11s\n",
	   chan, ppager (mynum) == 0 ? "&+cDisabled" : pager);

  if (plev (mynum) >= LVL_WIZARD) {
    bprintf ("&+wQuiet          %-11s       &+wAloof          %-11s\n",
	     ststflg (mynum, SFL_QUIET) ? "&+CEnabled" : "&+cDisabled",
	     ststflg (mynum, SFL_ALOOF) ? "&+CEnabled" : "&+cDisabled");
    bprintf ("&+wNoWish         %-11s       &+wSeeExtended    %-11s\n",
	     ststflg (mynum, SFL_NOWISH) ? "&+CEnabled" : "&+cDisabled",
	     ststflg (mynum, SFL_SEEEXT) ? "&+CEnabled" : "&+cDisabled");
    bprintf ("&+wNoSlain        %-11s       &+wLit            %-11s\n",
	     ststflg (mynum, SFL_NOSLAIN) ? "&+CEnabled" : "&+cDisabled",
	     ststflg (mynum, SFL_LIT) ? "&+CEnabled" : "&+cDisabled");
  }
  if (plev (mynum) >= LVL_GOD) {
    bprintf ("&+wSilent Entry   %-11s       &+wCoding         %-11s\n",
	     ststflg (mynum, SFL_SILENT) ? "&+CEnabled" : "&+cDisabled",
	     ststflg (mynum, SFL_CODING) ? "&+CEnabled" : "&+cDisabled");
    bprintf ("&+wIdle           %-11s       &+wSeeIdle        %-11s\n",
	     ptstflg (mynum, PFL_IDLE) ? "&+CEnabled" : "&+cDisabled",
	     ptstflg (mynum, PFL_SEEIDLE) ? "&+CEnabled" : "&+cDisabled");
    bprintf ("&+wSeeSocket      %-11s\n",
	     ptstflg (mynum, PFL_SEESOCKET) ? "&+CEnabled" : "&+cDisabled");
  }
  bprintf ("&+B---------------------------------------------------------\n");
}

void
klockcom (char *passwd)
{
  char pass[sizeof (cur_player->passwd)];

  if (passwd == NULL) {
    if (phandler (mynum) != get_command) {
      bprintf ("You can only lock the keyboard from the command prompt.\n");
      return;
    }
    bprintf ("Locking Keyboard With Login Password.\n");
    bprintf ("\377\373\001\001Enter Keyboard Password: ");
    cur_player->no_echo = True;
    replace_input_handler (klockcom);
  } else {
    my_crypt (pass, passwd, sizeof (pass));
    if (strcmp (cur_player->passwd, pass) == 0) {
      bprintf ("\377\374\001\001\nPassword Correct, Keyboard Unlocked.\n");
      cur_player->no_echo = False;
      bprintf ("%s", cur_player->cprompt);
      replace_input_handler (get_command);
      return;
    } else {
      bprintf ("\377\373\001\001\nEnter Keyboard Password: ");
      return;
    }
  }
}

/* Compares two objects that are weapon or armor and tells which object
 * has the better DP/AC.
 */
void
comparecom ()
{
  int a, b;			/* Objects */
  int adata, bdata, data;	/* DP/AC and compared data for object */

  /* If there is an empty parameter, quit */
  if (EMPTY (item1) || EMPTY (item2)) {
    bprintf ("Compare what?\n");
    return;
  }
  if (plev (mynum) < LVL_WIZARD) {
    if ((a = ob1) == -1 && (b = ob2) == -1) {
      bprintf ("You don't have those objects!\n");
      return;
    }
    if ((a = ob1) == -1) {
      bprintf ("You don't have the first object!\n");
      return;
    }
    if ((b = ob2) == -1) {
      bprintf ("You don't have the second object!\n");
      return;
    }
  } else {
    /* Check to make sure that objects exist */
    if ((a = fobn (item1)) == -1 && (a = fobn (item2)) == -1) {
      bprintf ("Neither object exists!\n");
      return;
    }
    if ((a = fobn (item1)) == -1) {
      bprintf ("Object does not exist! (First one)\n");
      return;
    }
    if ((b = fobn (item2)) == -1) {
      bprintf ("Object does not exist! (Second one)\n");
      return;
    }
  }
  /* Check to see if objects are weapons, if so compare them */
  if (otstbit (a, OFL_WEAPON) && otstbit (b, OFL_WEAPON)) {
    adata = odamage (a);
    bdata = odamage (b);
    if (adata > bdata) {
      data = adata - bdata;
      bprintf ("The %s (%d) is stronger than the %s (%d) by %d DP.\n",
	       oname (a), a, oname (b), b, data);
    }
    if (adata < bdata) {
      data = bdata - adata;
      bprintf ("The %s (%d) is stronger than the %s (%d) by %d DP.\n",
	       oname (b), b, oname (a), a, data);
    }
    if (adata == bdata) {
      bprintf ("The %s (%d) has the same DP has the %s (%d).\n",
	       oname (a), a, oname (b), b);
    }
  } else
    /* Check to see if objects are armor, if so compare them */
  if (otstbit (a, OFL_ARMOR) && otstbit (b, OFL_ARMOR)) {
    adata = oarmor (a);
    bdata = oarmor (b);
    if (adata > bdata) {
      data = adata - bdata;
      bprintf ("The %s (%d) is stronger than the %s (%d) by %d AC.\n",
	       oname (a), a, oname (b), b, data);
    }
    if (adata < bdata) {
      data = bdata - adata;
      bprintf ("The %s (%d) is stronger than the %s (%d) by %d AC.\n",
	       oname (b), b, oname (a), a, data);
    }
    if (adata == bdata) {
      bprintf ("The %s (%d) has the same AC has the %s (%d).\n",
	       oname (a), a, oname (b), b);
    }
  } else {
    /* Objects are not the same, or are not weapons/armor */
    bprintf ("Both objects must be either weapons, armor, shields, or masks.\n");
  }
}

void
judgecom (void)
{
  int plr, maxstr;

  if ((plr = pl1) == -1) {
    bprintf ("Judge who?\n");
    return;
  }
  if (ploc (plr) != ploc (mynum)) {
    bprintf ("They aren't here.\n");
    return;
  }
  if (plr < max_players && !the_world->w_tournament) {
    bprintf ("Let's not plan on starting any fights, ok?\n");
    return;
  }
  maxstr = plr >= max_players ? pstr_reset (plr) : maxstrength (plr);
  if (pstr (plr) >= maxstr)
    bprintf ("They look to be in perfect health.\n");
  else if (pstr (plr) >= (maxstr * 0.90))
    bprintf ("They look to have taken a little damage.\n");
  else if (pstr (plr) >= (maxstr * 0.70))
    bprintf ("They look to have taken more then a little damage.\n");
  else if (pstr (plr) >= (maxstr * 0.50))
    bprintf ("They look like they have taken quite a bit of damage.\n");
  else if (pstr (plr) >= (maxstr * 0.30))
    bprintf ("They look like they may not be around too much longer.\n");
  else if (pstr (plr) >= (maxstr * 0.10))
    bprintf ("They look like they have been beaten almost to death.\n");
  else
    bprintf ("Put them out of their misery..\n");
}

/************************************************************************
 * The Bulletin Commands                                                *
 * 1995 by Illusion                                                     *
 ************************************************************************/

/* Mortal Bulletins */
void
mbullcom (void)
{
  bprintf ("\001f%s\003", BULL_DIR "/" BULLETIN1);
}

/* Wizard Bulletins */
void
wbullcom (void)
{
  if (plev (mynum) < LVL_WIZARD)
    erreval ();
  else
    bprintf ("\001f%s\003", BULL_DIR "/" BULLETIN2);
}

/* ArchWizard/Advisor Bulletins */
void
abullcom (void)
{
  if (plev (mynum) < LVL_ARCHWIZARD)
    erreval ();
  else
    bprintf ("\001f%s\003", BULL_DIR "/" BULLETIN3);
}

/*  Avatar/God/Master User Bulletins */
void
ubullcom (void)
{
  if (plev (mynum) < LVL_AVATAR)
    erreval ();
  else
    bprintf ("\001f%s\003", BULL_DIR "/" BULLETIN4);
}