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 "kernel.h"
#include "condact.h"
#include "verbs.h"
#include "sflags.h"
#include "sendsys.h"
#include "locations.h"
#include "objects.h"
#include "parse.h"
#include "mobile.h"
#include "move.h"
#include "commands.h"
#include "climate.h"
#include "wizard.h"
#include "change.h"
#include "clone.h"
#include "pflags.h"
#include "objsys.h"
#include "bprintf.h"
#include "uaf.h"
#include "actions.h"
#include "spell.h"
#include "flags.h"
#include "viewcom.h"
#include "log.h"
#include "exit.h"
#include "wizlist.h"
#include "timing.h"
#include "frob.h"
#include "acct.h"
#include "zones.h"
#include "magic.h"
#include "reboot.h"
#include "mailer.h"
#include "fight.h"
#include "rooms.h"
#include "comm.h"
#include "main.h"
#include "ver.h"
#include "god.h"

#define NOISECHAR(c)	((c) == ' ' || (c) == '.' || (c) == ',' || (c) == '%')

static void parse_1 (char *itemb, int *pl, int *ob, int *pre);
static char *markpos (void);

static char *preptable[] =
{NULL, "at", "on", "with", "to", "in", "into",
 "from", "out", TABLE_END};

static int
xgamecom (char *str, Boolean savecom)
{
  int a;

  if (str == NULL || *str == 0) {
    return 0;
  } else if (EQ (str, "!")) {
    return gamecom (cur_player->prev_com, False);
  } else {
    if (savecom)
      (void) strcpy (cur_player->prev_com, str);

    a = -1;

    /* Converse Mode */
    if (pconv (real_mynum) != -1 && real_mynum < max_players) {
      if (!is_in_game (pconv (mynum))) {
	bprintf ("The person with you in converse mode has quit.\n");
	bprintf ("Exiting Converse Mode\n\n");
	setpconv (mynum, -1);
	return 0;
      }
      if (str[0] == '*' && str[1] == '*') {
	bprintf ("Exiting Converse Mode\n\n");
	setpconv (mynum, -1);
	return 0;
      } else if (str[0] == '!') {
	strcpy (strbuf, str + 1);
      } else {
	sprintf (strbuf, "tell %s %s", pname (pconv (mynum)), str);
      }
      strcpy (str, strbuf);
    }
    /* Translate Macros */
    if (str[0] == '\"' || str[0] == '\'') {	/* Say          */
      strcpy (strbuf, "say ");
      strcat (strbuf, str + 1);
    } else if (str[0] == ':' || str[0] == ';') {	/* Emote        */
      strcpy (strbuf, "emote ");
      strcat (strbuf, str + 1);
    } else if (str[0] == '1') {	/* Wizard Line  */
      strcpy (strbuf, "wiz ");
      strcat (strbuf, str + 1);
    } else if (str[0] == '2') {	/* Prophet Line */
      strcpy (strbuf, "prophet ");
      strcat (strbuf, str + 1);
    } else if (str[0] == '3') {	/* AWiz Line    */
      strcpy (strbuf, "awiz ");
      strcat (strbuf, str + 1);
    } else if (str[0] == '4') {	/* Advisor Line */
      strcpy (strbuf, "advisor ");
      strcat (strbuf, str + 1);
    } else if (str[0] == '5') {	/* God Line     */
      strcpy (strbuf, "god ");
      strcat (strbuf, str + 1);
    } else if (str[0] == '6') {	/* Upper Line   */
      strcpy (strbuf, "upper ");
      strcat (strbuf, str + 1);
    } else if (str[0] == '[') {	/* Chat Line    */
      strcpy (strbuf, "gchat ");
      strcat (strbuf, str + 1);
    } else {			/* No Match     */
      strcpy (strbuf, str);
    }

    stp = 0;

    if (brkword () == -1) {	/* if line contains nothing but  */
      erreval ();		/* pn's or articles (a, an, the) */
      return -1;
    }
    if ((a = chkverb ()) != -1) {
      doaction (a);
      return 0;
    }
    if (fextern (wordbuf) >= 0) {	/* handle external commands */
      stp = 0;
      return 0;
    }
    stp = 0;
    (void) brkword ();
    if ((a = fpbn (wordbuf)) >= 0) {	/* translate NAME to TELL NAME */
      stp = 0;
      a = VERB_TELL;
      doaction (a);
      return 0;
    }
    bprintf ("Pardon?\n");
    return -1;
  }
}

int
gamecom (char *str, Boolean savecom)
{
  int x;

  x = xgamecom (str, savecom);
  special_events (mynum);
  return x;
}

char *
getreinput (char *b)
{
  while (strbuf[stp] == ' ')
    stp++;
  return b != NULL ? strcpy (b, &strbuf[stp]) : &strbuf[stp];
}

int
my_brkword (void)
{
  static int neword = 0;
  int worp;

  if (stp == 0)
    neword = 0;
  if (neword) {
    neword = 0;
    return 0;
  }
  for (;;) {
    while (NOISECHAR (strbuf[stp]))
      stp++;
    for (worp = 0; strbuf[stp] != 0 && !NOISECHAR (strbuf[stp]);)
      wordbuf[worp++] = strbuf[stp++];
    wordbuf[worp] = 0;
    if (EQ (wordbuf, "the") || EQ (wordbuf, "a") || EQ (wordbuf, "an")
	|| EQ (wordbuf, "of") || EQ (wordbuf, "with"))
      continue;

    if (EQ (wordbuf, "it")) {
      if (cur_player->wd_it == NULL) {
	return -1;
      }
      strcpy (wordbuf, cur_player->wd_it);
    }
    if (EQ (wordbuf, "him")) {
      strcpy (wordbuf, cur_player->wd_him);
    }
    if (EQ (wordbuf, "her")) {
      strcpy (wordbuf, cur_player->wd_her);
    }
    if (EQ (wordbuf, "them")) {
      strcpy (wordbuf, cur_player->wd_them);
    }
    if (EQ (wordbuf, "me")) {
      strcpy (wordbuf, pname (mynum));
    }
    break;
  }

  return (worp ? 0 : -1);
}

int
brkword (void)
{
  static int neword = 0;
  int worp;

  if (stp == 0)
    neword = 0;
  if (neword) {
    neword = 0;
    return 0;
  }
  for (;;) {
    while (NOISECHAR (strbuf[stp]))
      stp++;
    for (worp = 0; strbuf[stp] != 0 && !NOISECHAR (strbuf[stp]);)
      wordbuf[worp++] = strbuf[stp++];
    wordbuf[worp] = 0;
    lowercase (wordbuf);
    if (EQ (wordbuf, "the") || EQ (wordbuf, "a") || EQ (wordbuf, "an")
	|| EQ (wordbuf, "of") || EQ (wordbuf, "with"))
      continue;

    if (EQ (wordbuf, "it")) {
      if (cur_player->wd_it == NULL) {
	return -1;
      }
      strcpy (wordbuf, cur_player->wd_it);
    }
    if (EQ (wordbuf, "him")) {
      strcpy (wordbuf, cur_player->wd_him);
    }
    if (EQ (wordbuf, "her")) {
      strcpy (wordbuf, cur_player->wd_her);
    }
    if (EQ (wordbuf, "them")) {
      strcpy (wordbuf, cur_player->wd_them);
    }
    if (EQ (wordbuf, "me")) {
      strcpy (wordbuf, pname (mynum));
    }
    break;
  }

  return (worp ? 0 : -1);
}



int
chkverb ()
{
  return chklist (wordbuf, verbtxt, verbnum);
}

int
chklist (char *word, char *lista[], int listb[])
{
  int a, b, c;
  int d = -1;

  b = c = 0;
  for (a = 0; lista[a]; a++)
    if ((b = Match (word, lista[a])) > c) {
      c = b;
      d = listb[a];
    }
  return (c < 5 ? -1 : d);
}

int
Match (char *x, char *y)
{
  if (strncasecmp (x, y, strlen (x)) == 0)
    return 10000;
  return 0;
}

void
doaction (int vb)
{
  if (do_tables (vb) == 2)
    return;
  if (vb > 1 && vb < 8) {
    if (cur_player->i_follow >= 0) {
      bprintf ("You stopped following.\n");
      cur_player->i_follow = -1;
    }
    dodirn (vb);
    return;
  }
  if (cur_player->inmailer) {
    switch (vb) {
    case VERB_FROB:
    case VERB_ALIAS:
    case VERB_MAIL:
    case VERB_BECOME:
    case VERB_QUIT:
      bprintf ("You can't do that in the mailer.\n");
      return;
    }
  }
  if (cur_player->isforce) {

    switch (vb) {
    case VERB_QUIT:
    case VERB_FROB:
    case VERB_BECOME:
    case VERB_BUG:
    case VERB_TYPO:
    case VERB_FORCE:
    case VERB_MAIL:
    case VERB_KLOCK:
      bprintf ("You can't be forced to do that.\n");
      return;
    }

  }
  switch (vb) {
  case VERB_GO:
    if (cur_player->i_follow >= 0) {
      bprintf ("You stopped following %s.\n", pname (cur_player->i_follow));
      cur_player->i_follow = -1;
    }
    dogocom ();
    break;

  case VERB_DEBUG:
    /*debugcom ();*/
    break;

  case VERB_ICESTORM:
    spellcom (VERB_ICESTORM);
    break;
  case VERB_NORUN:
    noruncom ();
    break;
  case VERB_REPLY:
    replycom ();
    break;
  case VERB_USOCK:
    usesocketcom ();
    break;
  case VERB_JUDGE:
    judgecom ();
    break;
  case VERB_LEVFORCE:
    levforcecom ();
    break;
  case VERB_RELOADACT:
    reboot_actions ();
    break;
  case VERB_SAYTO:
    saytocom ();
    break;
  case VERB_ROSE:
    rosecom ();
    break;
  case VERB_WIPE:
    wipecom ();
    break;
  case VERB_FLUSH:
    flushcom ();
    break;
  case VERB_USE:
    usecom ();
    break;
  case VERB_UNLOCK:
    unlockcom ();
    break;
  case VERB_LOCK:
    lockcom ();
    break;
  case VERB_CLOSE:
    closecom ();
    break;
  case VERB_OPEN:
    opencom ();
    break;
  case VERB_PROBATION:
    probationcom ();
    break;
  case VERB_LINK:
    linkcom ();
    break;
  case VERB_RING:
    ringcom ();
    break;
  case VERB_SHOUT:
    shoutcom ();
    break;
  case VERB_SAY:
    saycom ();
    break;
  case VERB_TELL:
    tellcom ();
    break;
  case VERB_LOOK:
    lookcom ();
    break;
  case VERB_SCORE:
    scorecom ();
    break;
  case VERB_INVENTORY:
    inventory ();
    break;
  case VERB_TIE:
    tiecom ();
    break;
  case VERB_UNTIE:
    untiecom ();
    break;
  case VERB_DIG:
    digcom ();
    break;
  case VERB_GIVE:
    givecom ();
    break;

  case VERB_VALUE:
    valuecom ();
    break;
  case VERB_COMPARE:
    comparecom ();
    break;
  case VERB_WEARALL:
    wearall ();
    break;
  case VERB_BLUR:
    spellcom (VERB_BLUR);
    break;
  case VERB_BHANDS:
    spellcom (VERB_BHANDS);
    break;
  case VERB_ARMOR:
    spellcom (VERB_ARMOR);
    break;
  case VERB_DAMAGE:
    spellcom (VERB_DAMAGE);
    break;
  case VERB_SPELLS:
    spellscom ();
    break;
  case VERB_PUNTALL:
    puntallcom ();
    break;
  case VERB_FREAQ:
    freaqcom ();
    break;
  case VERB_CONVERSE:
    conversecom ();
    break;
  case VERB_AID:
    spellcom (VERB_AID);
    break;
  case VERB_VTOUCH:
    spellcom (VERB_VTOUCH);
    break;
  case VERB_EFLAGS:
    eflagscom ();
    break;
  case VERB_BANHOST:
    bancom (BAN_HOSTS, BANHOST);
    break;
  case VERB_BANUSER:
    bancom (BAN_CHARS, BANUSER);
    break;
  case VERB_BANLOGIN:
    bancom (BAN_LOGIN, BANLOGIN);
    break;
  case VERB_BANCHECK:
    bancom (BAN_USRHOSTS, BANCHECK);
    break;
  case VERB_WEATHER:
    weathercom ();
    break;
  case VERB_CTIME:
    climatetime ();
    break;
  case VERB_SETTIME:
    settimecom ();
    break;
  case VERB_LSAY:
    lsaycom ();
    break;
  case VERB_LANG:
    langcom ();
    break;
  case VERB_NFLAGS:
    nflagscom ();
    break;
  case VERB_MAXSTATE:
    maxstatecom ();
    break;
  case VERB_LOG:
    writelog ();
    break;
  case VERB_ATVIS:
    atviscom ();
    break;
  case VERB_SIC:
    siccom ();
    break;
  case VERB_POLICY:
    policycom ();
    break;
  case VERB_PLOC:
    ploccom ();
    break;
  case VERB_CFR:
    cfrcom ();
    break;
  case VERB_BURN:
    burncom ();
    break;
  case VERB_SILENT:
    silentcom ();
    break;
  case VERB_WLOAD:
    wloadcom ();
    break;
  case VERB_VIEWCOM:
    viewcom ();
    break;
  case VERB_KLOCK:
    klockcom (NULL);
    break;
  case VERB_OPTIONS:
    optionscom ();
    break;
  case VERB_PAGER:
    setpager ();
    break;
  case VERB_FAKEQUIT:
    fakequitcom ();
    break;
  case VERB_SETIN:
    set_msg (cur_player->setin, False, False);
    break;
  case VERB_SETOUT:
    set_msg (cur_player->setout, True, False);
    break;
  case VERB_SETMIN:
    set_msg (cur_player->setmin, False, False);
    break;
  case VERB_SETMOUT:
    set_msg (cur_player->setmout, False, False);
    break;
  case VERB_SETVIN:
    set_msg (cur_player->setvin, False, False);
    break;
  case VERB_SETVOUT:
    set_msg (cur_player->setvout, False, False);
    break;
  case VERB_SETQIN:
    set_msg (cur_player->setqin, False, False);
    break;
  case VERB_SETQOUT:
    set_msg (cur_player->setqout, False, False);
    break;
  case VERB_SETSIT:
    set_msg (cur_player->setsit, False, False);
    break;
  case VERB_SETSTND:
    set_msg (cur_player->setstand, False, False);
    break;
  case VERB_SETSUM:
    set_msg (cur_player->setsum, False, False);
    break;
  case VERB_SETSIN:
    set_msg (cur_player->setsumin, False, True);
    break;
  case VERB_SETSOUT:
    set_msg (cur_player->setsumout, False, True);
    break;
  case VERB_NOPUNT:
    nopuntcom ();
    break;
  case VERB_FIND:
    findcom ();
    break;
  case VERB_FOLLIST:
    follist ();
    break;
  case VERB_FORCEALL:
    forceallcom ();
    break;
  case VERB_SEEEXT:
    toggleseeext ();
    break;
  case VERB_SIGNAL:
    signalcom ();
    break;
  case VERB_REBOOT:
    rebootcom ();
    break;
  case VERB_UPDATE:
    updatecom ();
    break;
  case VERB_BULL:
    mbullcom ();
    break;
  case VERB_WBULL:
    wbullcom ();
    break;
  case VERB_ABULL:
    abullcom ();
    break;
  case VERB_UBULL:
    ubullcom ();
    break;
  case VERB_CODING:
    togglecoding ();
    break;
  case VERB_SOCKET:
    socketcom ();
    break;
  case VERB_SEESOCKET:
    toggleseesocket ();
    break;
  case VERB_LIT:
    if (plev (mynum) < LVL_WIZARD)
      spellcom (VERB_LIT);
    else
      litcom ();
    break;
  case VERB_UPTIME:
    uptimecom ();
    break;
  case VERB_HEALALL:
    healallcom ();
    break;
  case VERB_SAVEALL:
    saveallcom ();
    break;
  case VERB_SHALL:
    if (plev (mynum) > LVL_WIZARD && ptstflg (mynum, PFL_HEAL)) {
      healallcom ();
      saveallcom ();
    } else {
      erreval ();
    }
    break;
  case VERB_FINGER:
    fingercom ();
    break;
  case VERB_GCHAT:
    chatcom ();
    break;
  case VERB_CHANNEL:
    channelcom ();
    break;
  case VERB_FORGET:
    forgetcom ();
    break;
  case VERB_FLIST:
    forgetlist ();
    break;
  case VERB_WHON:
    whocom (True);
    break;
  case VERB_PZAP:
    pzapcom ();
    break;
  case VERB_BEEP:
    beepcom ();
    break;
  case VERB_SEEIDLE:
    seeidlecom ();
    break;
  case VERB_CLEAR:
    bprintf ("@C");
    break;
  case VERB_LEVECHO:
    levechocom ();
    break;
  case VERB_PUNT:
    puntcom ();
    break;
  case VERB_IDLE:
    idlecom ();
    break;
  case VERB_NOSLAIN:
    noslaincom ();
    break;
  case VERB_NOWISH:
    nowishcom ();
    break;
  case VERB_BRESET:
    bresetcom ();
    break;
  case VERB_TXTRAW:
    textrawcom ();
    break;
  case VERB_SYSTEM:
    systemcom ();
    break;
  case VERB_RAW:
    rawcom ();
    break;
  case VERB_MSTAT:
    mstatcom ();
    break;
  case VERB_ACCT:
    acctcom ();
    break;
  case VERB_OBJECTS:
    objectscom ();
    break;
  case VERB_QDONE:
    qdonecom ();
    break;
  case VERB_NOPUFF:
    togglecom (SFL_NOPUFF, "NoPuff Enabled", "NoPuff Disabled");
    break;
  case VERB_NOBEEP:
    togglecom (SFL_NOBEEP, "NoBeep Enabled", "NoBeep Disabled");
    break;
  case VERB_NOFLAG:
    togglecom (SFL_NOFLAG, "NoFlags Enabled", "NoFlags Disabled");
    break;
  case VERB_NOWET:
    togglecom (SFL_NOWET, "NoWeather Enabled", "NoWeather Disabled");
    break;
  case VERB_NOBLINK:
    togglecom (SFL_NOBLINK, "Blinking Disabled", "Blinking Enabled");
    break;
  case VERB_NEWSTYLE:
    togglecom (SFL_NEWSTYLE, "NewStyle Enabled", "NewStyle Disabled");
    break;
  case VERB_AUTOEXIT:
    togglecom (SFL_AUTOEXIT, "AutoExit Enabled", "AutoExit Disabled");
    break;
  case VERB_HEARBACK:
    togglecom (SFL_HEARBACK, "Hearback Enabled", "Hearback Disabled");
    break;
  case VERB_NOINV:
    togglecom (SFL_NOINV, "NoInventory Enabled", "NoInventory Disabled");
    break;
  case VERB_NOFIGHT:
    togglecom (SFL_NOFIGHT, "NoFight Enabled", "NoFight Disabled");
    break;
  case VERB_AWAY:
    togglecom (SFL_AWAY, "Marking you as away from keyboard.",
	       "Marking you as returned to keyboard.");
    break;
  case VERB_BUSY:
    togglecom (SFL_BUSY, "Marking you as busy to lower levels.",
	       "Marking you as no longer busy.");
    break;
  case VERB_BRIEF:
    togglecom (SFL_BRIEF, "Brief Mode Enabled", "Brief Mode Disabled");
    break;
  case VERB_GOSSIP:
    com_handler ("&*[&+MGossip&*] &+M%n: &*%t", "&+MGossip", LVL_MIN, SFL_NOGOSSIP);
    break;
  case VERB_ANON:
    anoncom ();
    break;
  case VERB_TTY:
    ttycom ();
    break;
  case VERB_NOGOSSIP:
    nolinecom (LVL_MIN, SFL_NOGOSSIP, "&+MGossip");
    break;
  case VERB_NOANON:
    nolinecom (LVL_MIN, SFL_NOANON, "&+WAnon");
    break;
  case VERB_NOWIZ:
    nolinecom (LVL_WIZARD, SFL_NOWIZ, "&+YWizard");
    break;
  case VERB_NOPROPHET:
    nolinecom (LVL_PROPHET, SFL_NOPROPHET, "&+WProphet");
    break;
  case VERB_NOAWIZ:
    nolinecom (LVL_ARCHWIZARD, SFL_NOAWIZ, "&+CArchWizard");
    break;
  case VERB_NOADV:
    nolinecom (LVL_ADVISOR, SFL_NOADV, "&+RAdvisor");
    break;
  case VERB_NOGOD:
    nolinecom (LVL_AVATAR, SFL_NOGOD, "&+BGod");
    break;
  case VERB_NOUPPER:
    nolinecom (LVL_GOD, SFL_NOUPPER, "&+GUpper");
    break;
  case VERB_WIZ:
    com_handler ("&*[&+Y1&*] &+Y%n: &*%t", "&+YWizard", LVL_WIZARD, SFL_NOWIZ);
    break;
  case VERB_PROPHET:
    com_handler ("&*[&+W2&*] &+W%n: &*%t", "&+WProphet", LVL_PROPHET, SFL_NOPROPHET);
    break;
  case VERB_AWIZ:
    com_handler ("&*[&+C3&*] &+C%n: &*%t", "&+CAWiz", LVL_ARCHWIZARD, SFL_NOAWIZ);
    break;
  case VERB_ADVISOR:
    com_handler ("&*[&+R4&*] &+R%n: &*%t", "&+RAdvisor", LVL_ADVISOR, SFL_NOADV);
    break;
  case VERB_GOD:
    com_handler ("&*[&+B5&*] &+B%n: &*%t", "&+BGod", LVL_AVATAR, SFL_NOGOD);
    break;
  case VERB_UPPER:
    com_handler ("&*[&+G6&*] &+G%n: &*%t", "&+GUpper", LVL_GOD, SFL_NOUPPER);
    break;
  case VERB_SFLAGS:
    sflagscom ();
    break;

/********************************************************************/

  case VERB_FLOWERS:
    flowercom ();
    break;
  case VERB_DESCRIPTION:
    change_desc ();
    break;
  case VERB_CLONE:
    clonecom (True);
    break;
  case VERB_DESTRUCT:
    destructcom (NULL);
    break;
  case VERB_LOAD:
    loadcom ();
    break;
  case VERB_STORE:
    storecom ();
    break;
  case VERB_TICKLE:
    ticklecom ();
    break;
  case VERB_PET:
    petcom ();
    break;
  case VERB_QUIT:
    quit_game ();
    break;
  case VERB_SIT:
    sitcom ();
    break;
  case VERB_STAND:
    standcom (mynum);
    break;
  case VERB_GET:
    getcom ();
    break;
  case VERB_DROP:
    dropobj ();
    break;
  case VERB_WHO:
    whocom (False);
    break;
  case VERB_MWHO:
    mwhocom ();
    break;
  case VERB_RESET:
    resetcom (RES_TEST);
    break;
  case VERB_ZAP:
    zapcom ();
    break;
  case VERB_EAT:
    eatcom ();
    break;
  case VERB_SAVE:
    saveother ();
    break;
  case VERB_SAVESET:
    saveset ();
    break;
  case VERB_GLOBAL:
    globalcom ();
    break;
  case VERB_STEAL:
    stealcom ();
    break;
  case VERB_REVIEW:
    reviewcom ();
    break;
  case VERB_LEVELS:
    levelscom ();
    break;
  case VERB_COUPLES:
    file_pager (COUPLES);
    break;
  case VERB_WIZLIST:
    wizlistcom ();
    break;
  case VERB_MAIL:
    mailcom ();
    break;
  case VERB_PROMPT:
    promptcom ();
    break;
  case VERB_TOUT:
    toutcom ();
    break;
  case VERB_INFO:
    infocom ();
    break;
  case VERB_QUESTS:
    questcom ();
    break;
  case VERB_TOURNAMENT:
    tournamentcom ();
    break;
  case VERB_SYSLOG:
    syslogcom ();
    break;
  case VERB_DELETE:
    deletecom ();
    break;
  case VERB_OPENGAME:
    opengamecom ();
    break;
  case VERB_HELP:
    helpcom ();
    break;
  case VERB_STATS:
    showplayer ();
    break;
  case VERB_EXAMINE:
    examcom ();
    break;
  case VERB_EXORCISE:
    exorcom ();
    break;
  case VERB_SUMMON:
    sumcom ();
    break;
  case VERB_WIELD:
    wieldcom ();
    break;
  case VERB_KILL:
    killcom ();
    break;
  case VERB_POSE:
    posecom ();
    break;
  case VERB_SET:
    setcom ();
    break;
  case VERB_PRAY:
    praycom ();
    break;
  case VERB_TIPTOE:
    gotocom (True);
    break;
  case VERB_GOTO:
    gotocom (False);
    break;
  case VERB_WEAR:
    wearcom ();
    break;
  case VERB_REMOVE:
    removecom ();
    break;
  case VERB_PUT:
    putcom ();
    break;
  case VERB_WAVE:
    wavecom ();
    break;
  case VERB_FORCE:
    forcecom ();
    break;
  case VERB_LIGHT:
    lightcom ();
    break;
  case VERB_EXTINGUISH:
    extinguishcom ();
    break;
  case VERB_CRIPPLE:
    cripplecom ();
    break;
  case VERB_CURE:
    curecom ();
    break;
  case VERB_HEAL:
    healcom ();
    break;
  case VERB_MUTE:
    dumbcom ();
    break;
  case VERB_CHANGE:
    changecom ();
    break;
  case VERB_MISSILE:
    spellcom (VERB_MISSILE);
    break;
  case VERB_SHOCK:
    spellcom (VERB_SHOCK);
    break;
  case VERB_FIREBALL:
    spellcom (VERB_FIREBALL);
    break;
  case VERB_FROST:
    spellcom (VERB_FROST);
    break;
  case VERB_BLOW:
    blowcom ();
    break;
  case VERB_EXITS:
    exitcom ();
    break;
  case VERB_PUSH:
    pushcom ();
    break;
  case VERB_IN:
    incom (True);
    break;
  case VERB_AT:
    incom (False);
    break;
  case VERB_INVISIBLE:
    inviscom ();
    break;
  case VERB_VISIBLE:
    viscom ();
    break;
  case VERB_DEAFEN:
    deafcom ();
    break;
  case VERB_RESURRECT:
    resurcom ();
    break;
  case VERB_TITLE:
    change_title ();
    break;
  case VERB_SETSTART:
    setstart ();
    break;
  case VERB_LOCATIONS:
    locationscom ();
    break;
  case VERB_ZONES:
    zonescom ();
    break;
  case VERB_USERS:
    usercom ();
    break;
  case VERB_BECOME:
    becom (NULL);
    break;
  case VERB_SNOOP:
    snoopcom ();
    break;
  case VERB_ROLL:
    rollcom ();
    break;
  case VERB_CREDITS:
    bprintf ("\001f%s\003", CREDITS);
    break;
  case VERB_JUMP:
    jumpcom ();
    break;
  case VERB_WHERE:
    wherecom ();
    break;
  case VERB_FLEE:
    fleecom ();
    break;
  case VERB_BUG:
    bugcom ();
    break;
  case VERB_TYPO:
    typocom ();
    break;
  case VERB_ACTIONS:
    lisextern ();
    break;
  case VERB_PN:
    pncom ();
    break;
  case VERB_BLIND:
    blindcom ();
    break;
  case VERB_MASK:
    maskcom ();
    break;
  case VERB_PFLAGS:
    pflagscom ();
    break;
  case VERB_MFLAGS:
    mflagscom ();
    break;
  case VERB_FROB:
    frobcom (NULL);
    break;
  case VERB_SHUTDOWN:
    shutdowncom (False);
    break;
  case VERB_CRASH:
    shutdowncom (True);
    break;
  case VERB_EMOTE:
    emotecom ();
    break;
  case VERB_EMOTETO:
    emotetocom ();
    break;
  case VERB_EMPTY:
    emptycom ();
    break;
  case VERB_TIME:
    timecom ();
    break;
  case VERB_TREASURES:
    treasurecom ();
    break;
  case VERB_WAR:
    warcom ();
    break;
  case VERB_PEACE:
    peacecom ();
    break;
  case VERB_QUIET:
    togglecom (SFL_QUIET, "Quiet Mode Enabled", "Quiet Mode Disabled");
    break;
  case VERB_NOSHOUT:
    noshoutcom ();
    break;
  case VERB_COLOR:
    if (ststflg (mynum, SFL_COLOR)) {
      bprintf ("Back to black and white.\n");
      sclrflg (mynum, SFL_COLOR);
    } else {
      bprintf ("Welcome to the wonderful world of &+RC&+GO&+YL&+BO&+MR&+C!\n");
      ssetflg (mynum, SFL_COLOR);
    }
    break;
  case VERB_ALOOF:
    togglecom (SFL_ALOOF, "Aloof Enabled", "Aloof Disabled");
    break;
  case VERB_SHOW:
    showitem ();
    break;
  case VERB_WIZLOCK:
    wizlock ();
    break;
  case VERB_FOLLOW:
    followcom ();
    break;
  case VERB_LOSE:
    losecom ();
    break;
  case VERB_ECHO:
    echocom ();
    break;
  case VERB_ECHOALL:
    echoallcom ();
    break;
  case VERB_ECHOTO:
    echotocom ();
    break;
  case VERB_WISH:
    wishcom ();
    break;
  case VERB_TRACE:
    tracecom ();
    break;
  case VERB_START:
    startcom ();
    break;
  case VERB_STOP:
    stopcom ();
    break;
  case VERB_MOBILES:
    mobilecom ();
    break;
  case VERB_UNVEIL:
    unveilcom (NULL);
    break;
  case VERB_BANG:
    if (plev (mynum) < LVL_SORCERER)
      erreval ();
    else
      broad ("\001dA huge crash of thunder echoes through the land.\n\003");
    break;
  case VERB_TRANSLOCATE:
    sumcom ();
    break;
  case VERB_ALIAS:
    aliascom ();
    break;
  case VERB_LFLAGS:
    lflagscom ();
    break;
  case VERB_PRIVS:
    pflagscom ();
    break;
  case VERB_VERSION:
    versioncom ();
    break;
  case VERB_MEDITATE:
    meditatecom ();
    break;
  default:
    mudlog ("PARSER: No match for verb = %d", vb);
    bprintf ("You can't do that now.\n");
    break;
  }
}


void
quit_game (void)
{
  char xx[128];

  if (cur_player->aliased) {
    unalias (real_mynum);
    return;
  }
  if (pfighting (mynum) >= 0) {
    bprintf ("Not in the middle of a fight!\n");
    return;
  }
  if (cur_player->polymorphed >= 0) {
    bprintf ("A mysterious force won't let you quit.\n");
    return;
  }
  bprintf ("Ok");

  send_msg (ploc (mynum), 0, pvis (mynum), LVL_MAX, mynum, NOBODY,
  "%s\n", build_setin (xx, cur_player->setqout, pname (mynum), NULL, NULL));

  send_msg (DEST_ALL, MODE_QUIET, max (pvis (mynum), LVL_WIZARD),
	    LVL_MAX, mynum, NOBODY, "&+B[&+CQuitting Game: &+W%s&+B]\n", pname (mynum));

  crapup ("\001f" GOODBYE "\003", CRAP_SAVE);
}

void
erreval (void)
{
  bprintf ("You can't do that now.\n");
}

Boolean
parse_2 (int vb)
{
  int savestp = stp;
  int ob, pl, pre;

  *item1 = *item2 = '\0';

  if (vb == -1)
    return False;
  ob1 = pl1 = ob2 = pl2 = -1;
  prep = 0;
  txt1 = markpos ();
  txt2 = NULL;
  parse_1 (item1, &pl, &ob, &pre);
  if (pre == 0) {
    ob1 = ob;
    pl1 = pl;
    txt2 = markpos ();
    parse_1 (item2, &pl, &ob, &pre);
  }
  if (pre != 0) {
    prep = pre;
    parse_1 (item2, &pl, &ob, &pre);
  }
#ifdef DEBUG_PARSER
  if (pre != 0) {
    bprintf ("Huh?\n");
    return False;
  } else {
    pl2 = pl;
    ob2 = ob;
  }
#else
  pl2 = pl;
  ob2 = ob;
#endif
  stp = savestp;
  return True;
}

static void
parse_1 (char *itemb, int *pl, int *ob, int *pre)
{
  int o, p;

  *pl = *ob = -1;
  *pre = 0;
  if (brkword () != -1) {
    strcpy (itemb, wordbuf);
    if ((p = findprep (itemb)) != -1) {
      *pre = p;
    } else {
      /* It's not a preposition. */
      if ((p = *pl = fpbn (itemb)) != -1) {
	if (psex (p)) {
	  cur_player->wd_them = strcpy (cur_player->wd_her, pname (p));
	} else {
	  cur_player->wd_them = strcpy (cur_player->wd_him, pname (p));
	}
      }
      if ((o = *ob = fobnc (itemb)) != -1 || (o = *ob = fobna (itemb)) != -1) {
	cur_player->wd_it = oname (o);
      }
    }
  }
}

static char *
markpos (void)
{
  register int c;

  while ((c = strbuf[stp]) == ',' || isspace (c))
    ++stp;
  return strbuf + stp;
}

int
findprep (char *t)
{
  return xlookup (t, preptable);
}

int
prmmod (int p)
{
  switch (p) {
  case FL_PL1:
    return pl1;
  case FL_PL2:
    return pl2;
  case FL_OB1:
    return ob1;
  case FL_OB2:
    return ob2;
  case FL_CURCH:
    return ploc (mynum);
  case FL_PREP:
    return prep;
  case FL_LEV:
    return plev (mynum);
  case FL_STR:
    return pstr (mynum);
  case FL_SEX:
    return psex (mynum);
  case FL_SCORE:
    return pscore (mynum);
  case FL_MYNUM:
    return mynum;
  }

  if (IS_PL (p))
    return p - PL_CODE + max_players;
  return p;
}

/* This function drives the function tables. */
int
do_tables (int a)
{
  if (!parse_2 (a))
    return 2;
  else
    return 1;
}