wileymud-1.187b/
wileymud-1.187b/attic/
wileymud-1.187b/attic/bin/
wileymud-1.187b/attic/lib/
wileymud-1.187b/attic/lib/adm/
wileymud-1.187b/attic/lib/man/
wileymud-1.187b/attic/lib/new-wld/
wileymud-1.187b/attic/lib/new-wld/default/
wileymud-1.187b/attic/lib/old/
wileymud-1.187b/attic/lib/wld/
wileymud-1.187b/attic/public_html/
wileymud-1.187b/attic/public_html/gfx/
wileymud-1.187b/attic/src/bin/
wileymud-1.187b/attic/src/etc/
wileymud-1.187b/attic/src/libauth-4.0-p5/
wileymud-1.187b/attic/src/sedna/
wileymud-1.187b/backups/
wileymud-1.187b/bin/
wileymud-1.187b/docs/
wileymud-1.187b/etc/
wileymud-1.187b/lib/
wileymud-1.187b/lib/adm/
wileymud-1.187b/lib/boards/
wileymud-1.187b/lib/log/
wileymud-1.187b/lib/man/
wileymud-1.187b/lib/ply/
wileymud-1.187b/lib/ply/a/
wileymud-1.187b/lib/ply/b/
wileymud-1.187b/lib/ply/c/
wileymud-1.187b/lib/ply/d/
wileymud-1.187b/lib/ply/g/
wileymud-1.187b/lib/ply/k/
wileymud-1.187b/lib/ply/m/
wileymud-1.187b/lib/ply/s/
wileymud-1.187b/lib/ply/t/
wileymud-1.187b/public_html/gfx/
wileymud-1.187b/src/bin/
wileymud-1.187b/src/convert/attic/
wileymud-1.187b/src/convert/obj/
wileymud-1.187b/src/convert/perl/
wileymud-1.187b/src/convert/perl/MudConvert/
wileymud-1.187b/src/convert/perl/MudConvert/DUMP/
wileymud-1.187b/src/convert/perl/MudConvert/Report/
wileymud-1.187b/src/convert/perl/MudConvert/WileyMUD/
wileymud-1.187b/src/convert/perl/output/
wileymud-1.187b/src/convert/perl/output/DUMP/
wileymud-1.187b/src/convert/perl/output/Report/
wileymud-1.187b/src/convert/perl/output/WileyMUD/
wileymud-1.187b/src/etc/
wileymud-1.187b/src/etc/init.d/
wileymud-1.187b/src/etc/rc.d/
wileymud-1.187b/src/etc/rc.d/init.d/
wileymud-1.187b/src/lib/
wileymud-1.187b/src/lib/adm/
wileymud-1.187b/src/lib/boards/
wileymud-1.187b/src/lib/log/
wileymud-1.187b/src/lib/man/
wileymud-1.187b/src/lib/ply/
wileymud-1.187b/src/lib/ply/a/
wileymud-1.187b/src/lib/ply/b/
wileymud-1.187b/src/lib/ply/c/
wileymud-1.187b/src/lib/ply/d/
wileymud-1.187b/src/lib/ply/e/
wileymud-1.187b/src/lib/ply/f/
wileymud-1.187b/src/lib/ply/g/
wileymud-1.187b/src/lib/ply/h/
wileymud-1.187b/src/lib/ply/i/
wileymud-1.187b/src/lib/ply/j/
wileymud-1.187b/src/lib/ply/k/
wileymud-1.187b/src/lib/ply/l/
wileymud-1.187b/src/lib/ply/m/
wileymud-1.187b/src/lib/ply/n/
wileymud-1.187b/src/lib/ply/o/
wileymud-1.187b/src/lib/ply/p/
wileymud-1.187b/src/lib/ply/q/
wileymud-1.187b/src/lib/ply/r/
wileymud-1.187b/src/lib/ply/s/
wileymud-1.187b/src/lib/ply/t/
wileymud-1.187b/src/lib/ply/u/
wileymud-1.187b/src/lib/ply/v/
wileymud-1.187b/src/lib/ply/w/
wileymud-1.187b/src/lib/ply/x/
wileymud-1.187b/src/lib/ply/y/
wileymud-1.187b/src/lib/ply/z/
wileymud-1.187b/src/obj/
wileymud-1.187b/src/utils/
wileymud-1.187b/src/utils/mobmaker/
/*
 * file: Interpreter.c , Command interpreter module.      Part of DIKUMUD
 * Usage: Procedures interpreting user command
 * Copyright (C) 1990, 1991 - see 'license.doc' for complete information.
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <ctype.h>
#include <arpa/telnet.h>

#include "global.h"
#include "bug.h"
#include "comm.h"
#include "interpreter.h"
#include "db.h"
#include "utils.h"
#include "limits.h"
#include "race.h"


#define COMMANDO(number,min_pos,pointer,min_level) {      \
                  cmd_info[(number)].command_pointer = (pointer);         \
                    cmd_info[(number)].minimum_position = (min_pos);        \
                cmd_info[(number)].minimum_level = (min_level); }

#define NOT !
#define AND &&
#define OR ||

#define STATE(d) ((d)->connected)
#define MAX_CMD_LIST 288

extern const struct title_type titles[4][ABS_MAX_LVL];
extern char motd[MAX_STRING_LENGTH];
extern char wmotd[MAX_STRING_LENGTH];
extern struct char_data *character_list;
extern struct player_index_element *player_table;
extern int top_of_p_table;
extern struct index_data *mob_index;
extern struct index_data *obj_index;
extern struct hash_header room_db;
extern struct char_data *board_kludge_char;
extern int DEBUG;
extern int DEBUG2;
struct command_info cmd_info[MAX_CMD_LIST];

char echo_on[]  = {
  IAC, WONT, TELOPT_ECHO, '\r', '\n', '\0'};
char echo_off[] = {
  IAC, WILL, TELOPT_ECHO, '\0'};
int WizLock;

/* external fcntls */
int check_exit_alias(struct char_data *ch,char *argument);
void set_title(struct char_data *ch);
void init_char(struct char_data *ch);
void store_to_char(struct char_file_u *st, struct char_data *ch);
int create_entry(char *name);

int GetPasswd( char * tmp_name, char * pwd );
int GetPlayerFile( char * tmp_name, struct char_data * ch );

void log(char *str);

void do_move(struct char_data *ch, char *argument, int cmd);
void do_bandage(struct char_data *ch, char *argument, int cmd);
void do_look(struct char_data *ch, char *argument, int cmd);
void do_read(struct char_data *ch, char *argument, int cmd);
void do_say(struct char_data *ch, char *argument, int cmd);
void do_exit(struct char_data *ch, char *argument, int cmd);
void do_snoop(struct char_data *ch, char *argument, int cmd);
void do_insult(struct char_data *ch, char *argument, int cmd);
void do_quit(struct char_data *ch, char *argument, int cmd);
void do_qui(struct char_data *ch, char *argument, int cmd);
void do_help(struct char_data *ch, char *argument, int cmd);
void do_who(struct char_data *ch, char *argument, int cmd);
void do_emote(struct char_data *ch, char *argument, int cmd);
void do_echo(struct char_data *ch, char *argument, int cmd);
void do_trans(struct char_data *ch, char *argument, int cmd);
void do_kill(struct char_data *ch, char *argument, int cmd);
void do_stand(struct char_data *ch, char *argument, int cmd);
void do_sit(struct char_data *ch, char *argument, int cmd);
void do_rest(struct char_data *ch, char *argument, int cmd);
void do_sleep(struct char_data *ch, char *argument, int cmd);
void do_wake(struct char_data *ch, char *argument, int cmd);
void do_force(struct char_data *ch, char *argument, int cmd);
void do_get(struct char_data *ch, char *argument, int cmd);
void do_drop(struct char_data *ch, char *argument, int cmd);
void do_news(struct char_data *ch, char *argument, int cmd);
void do_score(struct char_data *ch, char *argument, int cmd);
void do_inventory(struct char_data *ch, char *argument, int cmd);
void do_equipment(struct char_data *ch, char *argument, int cmd);
void do_shout(struct char_data *ch, char *argument, int cmd);
void do_not_here(struct char_data *ch, char *argument, int cmd);
void do_tell(struct char_data *ch, char *argument, int cmd);
void do_invis_off(struct char_data *ch, char *argument, int cmd);
void do_group_tell(struct char_data *ch, char *argument, int cmd);
void do_group_report(struct char_data *ch, char *argument, int cmd);
void do_wear(struct char_data *ch, char *argument, int cmd);
void do_wield(struct char_data *ch, char *argument, int cmd);
void do_grab(struct char_data *ch, char *argument, int cmd);
void do_remove(struct char_data *ch, char *argument, int cmd);
void do_put(struct char_data *ch, char *argument, int cmd);
void do_shutdown(struct char_data *ch, char *argument, int cmd);
void do_save(struct char_data *ch, char *argument, int cmd);
void do_hit(struct char_data *ch, char *argument, int cmd);
void do_string(struct char_data *ch, char *arg, int cmd);
void do_give(struct char_data *ch, char *arg, int cmd);
void do_stat(struct char_data *ch, char *arg, int cmd);
void do_guard(struct char_data *ch, char *arg, int cmd);
void do_time(struct char_data *ch, char *arg, int cmd);
void do_weather(struct char_data *ch, char *arg, int cmd);
void do_load(struct char_data *ch, char *arg, int cmd);
void do_purge(struct char_data *ch, char *arg, int cmd);
void do_shutdow(struct char_data *ch, char *arg, int cmd);
void do_idea(struct char_data *ch, char *arg, int cmd);
void do_typo(struct char_data *ch, char *arg, int cmd);
void do_bug(struct char_data *ch, char *arg, int cmd);
void do_whisper(struct char_data *ch, char *arg, int cmd);
void do_cast(struct char_data *ch, char *arg, int cmd);
void do_at(struct char_data *ch, char *arg, int cmd);
void do_goto(struct char_data *ch, char *arg, int cmd);
void do_form(struct char_data *ch, char *arg, int cmd);
void do_ask(struct char_data *ch, char *arg, int cmd);
void do_drink(struct char_data *ch, char *arg, int cmd);
void do_eat(struct char_data *ch, char *arg, int cmd);
void do_pour(struct char_data *ch, char *arg, int cmd);
void do_sip(struct char_data *ch, char *arg, int cmd);
void do_taste(struct char_data *ch, char *arg, int cmd);
void do_order(struct char_data *ch, char *arg, int cmd);
void do_follow(struct char_data *ch, char *arg, int cmd);
void do_rent(struct char_data *ch, char *arg, int cmd);
void do_offer(struct char_data *ch, char *arg, int cmd);
void do_advance(struct char_data *ch, char *arg, int cmd);
void do_close(struct char_data *ch, char *arg, int cmd);
void do_open(struct char_data *ch, char *arg, int cmd);
void do_lock(struct char_data *ch, char *arg, int cmd);
void do_unlock(struct char_data *ch, char *arg, int cmd);
void do_exits(struct char_data *ch, char *arg, int cmd);
void do_enter(struct char_data *ch, char *arg, int cmd);
void do_leave(struct char_data *ch, char *arg, int cmd);
void do_write(struct char_data *ch, char *arg, int cmd);
void do_flee(struct char_data *ch, char *arg, int cmd);
void do_sneak(struct char_data *ch, char *arg, int cmd);
void do_hide(struct char_data *ch, char *arg, int cmd);
void do_backstab(struct char_data *ch, char *arg, int cmd);
void do_pick(struct char_data *ch, char *arg, int cmd);
void do_steal(struct char_data *ch, char *arg, int cmd);
void do_mount(struct char_data *ch, char *arg, int cmd);
void do_land(struct char_data *ch, char *arg, int cmd);
void do_bash(struct char_data *ch, char *arg, int cmd);
void do_doorbash(struct char_data *ch, char *arg, int cmd);
void do_restore_all(struct char_data *ch, char *arg, int cmd);
void do_punch(struct char_data *ch, char *arg, int cmd);
void do_rescue(struct char_data *ch, char *arg, int cmd);
void do_kick(struct char_data *ch, char *arg, int cmd);
void do_examine(struct char_data *ch, char *arg, int cmd);
void do_info(struct char_data *ch, char *arg, int cmd);
void do_users(struct char_data *ch, char *arg, int cmd);
void do_where(struct char_data *ch, char *arg, int cmd);
void do_levels(struct char_data *ch, char *arg, int cmd);
void do_reroll(struct char_data *ch, char *arg, int cmd);
void do_brief(struct char_data *ch, char *arg, int cmd);
void do_wizlist(struct char_data *ch, char *arg, int cmd);
void do_consider(struct char_data *ch, char *arg, int cmd);
void do_group(struct char_data *ch, char *arg, int cmd);
void do_restore(struct char_data *ch, char *arg, int cmd);
void do_return(struct char_data *ch, char *argument, int cmd);
void do_switch(struct char_data *ch, char *argument, int cmd);
void do_quaff(struct char_data *ch, char *argument, int cmd);
void do_recite(struct char_data *ch, char *argument, int cmd);
void do_use(struct char_data *ch, char *argument, int cmd);
void do_pose(struct char_data *ch, char *argument, int cmd);
void do_noshout(struct char_data *ch, char *argument, int cmd);
void do_show_logs(struct char_data *ch, char *argument, int cmd);
void do_plr_noshout(struct char_data *ch, char *argument, int cmd);
void do_plr_notell(struct char_data *ch, char *argument, int cmd);
void do_plr_nosummon(struct char_data *ch, char *argument, int cmd);
void do_plr_noteleport(struct char_data *ch, char *argument, int cmd);
void do_search(struct char_data *ch, char *argument, int cmd);
void do_skills(struct char_data *ch, char *argument, int cmd);
void do_peer(struct char_data *ch, char *argument, int cmd);
void do_wizhelp(struct char_data *ch, char *argument, int cmd);
void do_credits(struct char_data *ch, char *argument, int cmd);
void do_compact(struct char_data *ch, char *argument, int cmd);
void do_wimp(struct char_data *ch, char *argument, int cmd);   /* jdb -8-16 */
void do_commune(struct char_data *ch, char *argument, int cmd); /* jdb - 9-1 */
void do_nohassle(struct char_data *ch, char *argument, int cmd);  /* jdb 9-6 */
void do_system(struct char_data *ch, char *argument, int cmd);  /* jdb 9-16 */
void do_pull(struct char_data *ch, char *argument, int cmd);  /* jdb 9-16 */
void do_stealth(struct char_data *ch, char *argument, int cmd); /* jdb 9-17 */
void do_cust(struct char_data *ch, char *arg, int cmd); /* jdb 9-29 */
void do_set(struct char_data *ch, char *arg, int cmd); /* jdb 9-29 */
void do_rsave(struct char_data *ch, char *arg, int cmd); /* jdb 10-5 */
void do_rload(struct char_data *ch, char *arg, int cmd); /* jdb 10-5 */
void do_wizlock(struct char_data *ch, char *arg, int cmd); /* jdb 10-15 */
void do_highfive(struct char_data *ch, char *arg, int cmd); /* jdb 10-30 */
void do_title(struct char_data *ch, char *arg, int cmd); /* jdb 11-3 */
void do_pretitle(struct char_data *ch, char *arg, int cmd);
void do_uptime(struct char_data *ch, char *arg, int cmd); /* jdb 12-3 */
void do_instazone(struct char_data *ch, char *arg, int cmd); /* jdb 12-3 */
void do_disarm(struct char_data *ch, char *arg, int cmd); /* jdb 12-3 */
void do_junk(struct char_data *ch, char *arg, int cmd); /* jdb 12-17 */
void do_gain(struct char_data *ch, char *arg, int cmd); /* jdb 1-19 */
void do_track(struct char_data *ch, char *arg, int cmd);
void do_swat(struct char_data *ch, char *arg, int cmd);
void do_world(struct char_data *ch, char *arg, int cmd);
void do_spells(struct char_data *ch, char *arg, int cmd);
void do_allcommands(struct char_data *ch, char *arg, int cmd);
void do_action(struct char_data *ch, char *arg, int cmd);
void do_practice(struct char_data *ch, char *arg, int cmd);
void do_assist(struct char_data *ch, char *arg, int cmd);
void do_breath(struct char_data *ch, char *arg, int cmd);
void do_show(struct char_data *ch, char *arg, int cmd);
void do_debug(struct char_data *ch, char *arg, int cmd);
void do_invis(struct char_data *ch, char *arg, int cmd);
void do_pager(struct char_data *ch, char *arg, int cmd);
void do_whod(struct char_data *ch, char *arg, int cmd);
void do_split(struct char_data *ch, char *arg, int cmd);
void do_apraise(struct char_data *ch, char *arg, int cmd);
void do_scribe(struct char_data *ch, char *arg, int cmd);

char *command[]=
{ 
  "north",       /* 1 */
  "east",
  "south",
  "west",
  "up",
  "down",
  "enter",
  "exits",
  "kiss",
  "get",
  "drink",       /* 11 */
  "eat",
  "wear",
  "wield",
  "look",
  "score",
  "say",
  "shout",
  "tell",
  "inventory",
  "qui",         /* 21 */
  "bounce",
  "smile",
  "dance",
  "kill",
  "cackle",
  "laugh",
  "giggle",
  "shake",
  "puke",
  "growl",       /* 31 */
  "scream",
  "insult",
  "comfort",
  "nod",
  "sigh",
  "sulk",
  "help",
  "who",
  "emote",
  "echo",        /* 41 */
  "stand",
  "sit",
  "rest",
  "sleep",
  "wake",
  "force",
  "transfer",
  "hug",
  "snuggle",
  "cuddle",      /* 51 */
  "nuzzle",
  "cry",
  "news",
  "equipment",
  "buy",
  "sell",
  "value",
  "list",
  "drop",
  "goto",        /* 61 */
  "weather",
  "read",
  "pour",
  "grab",
  "remove",
  "put",
  "shutdow",
  "save",
  "hit",
  "string",      /* 71 */
  "give",
  "quit",
  "stat",
  "guard",
  "time",
  "load",
  "purge",
  "shutdown",
  "idea",
  "typo",        /* 81 */
  "bug",
  "whisper",
  "cast",
  "at",
  "ask",
  "order",
  "sip",
  "taste",
  "snoop",
  "follow",      /* 91 */
  "rent",
  "offer",
  "poke",
  "advance",
  "accuse",
  "grin",
  "bow",
  "open",
  "close",
  "lock",        /* 101 */
  "unlock",
  "leave",
  "applaud",
  "blush",
  "burp",
  "chuckle",
  "clap",
  "cough",
  "curtsey",
  "fart",        /* 111 */
  "flip",
  "fondle",
  "frown",
  "gasp",
  "glare",
  "groan",
  "grope",
  "hiccup",
  "lick",
  "love",        /* 121 */
  "moan",
  "nibble",
  "pout",
  "purr",
  "ruffle",
  "shiver",
  "shrug",
  "sing",
  "slap",
  "smirk",       /* 131 */
  "snap",
  "sneeze",
  "snicker",
  "sniff",
  "snore",
  "spit",
  "squeeze",
  "stare",
  "strut",
  "thank",       /* 141 */
  "twiddle",
  "wave",
  "whistle",
  "wiggle",
  "wink",
  "yawn",
  "snowball",
  "write",
  "hold",
  "flee",        /* 151 */
  "sneak",
  "hide",
  "backstab",
  "pick",
  "steal",
  "bash",
  "rescue",
  "kick",
  "french",
  "comb",        /* 161 */
  "massage",
  "tickle",
  "practice",
  "pat",
  "examine",
  "take",
  "info",
  "'",
  "practise",
  "curse",       /* 171 */
  "use",
  "where",
  "levels",
  "reroll",
  "pray",
  ",",
  "beg",
  "bleed",
  "cringe",
  "daydream",    /* 181 */
  "fume",
  "grovel",
  "hop",
  "nudge",
  "peer",
  "point",
  "ponder",
  "punch",
  "snarl",
  "spank",       /* 191 */
  "steam",
  "tackle",
  "taunt",
  "think",
  "whine",
  "worship",
  "yodel",
  "brief",
  "wizlist",
  "consider",    /* 201 */
  "group",
  "restore",
  "return",
  "switch",      /* 205 */
  "quaff",
  "recite",
  "users",
  "pose",
  "noshout",
  "wizhelp",      /* 211 */
  "credits",      /* 212 */
  "compact",      /* 213 */
  ":",            /* emote 214 */
  "hermit",       /*215*/
  "slay",         /* instead of "kill" for immorts (8/16) */ /*216*/ 
  "wimp",         /* 217 */
  "junk",         /* 218 */
  "deposit",      /* 219 */   /* 9 - 4ish */
  "withdraw",     /* 220 */
  "balance",      
  "nohassle",     /* 9 - 6 */
  "system",       /* 9 - 16 */
  "pull",         
  "stealth",      /* 225 */
  "cust",         /* 226 */
  "pset",         /* 227 */
  "sroom",        /* 228 */
  "lroom",        /* 229 */
  "track",        /* 230 */
  "wizlock",      /* 231 */
  "highfive",     /* 232 */
  "title",        /* 233 */
  "whozone",      /* 234 */
  "assist",       /* 235 */
  "swat",         /* 236 */
  "world",        /* 237 */
  "allspells",    /* 238 */
  "breath",       /* 239 */
  "show",         /* 240 */
  "debug",        /* 241 */
  "invisible",    /* 242 */
  "gain",         /* 243 */
  "mkzone",       /* 244 */
  "disarm",       /* 245 */
  "bonk",         /* 246 */
  "wiznet",       /* 247 */
  "form",         /* 248 */
  "gtell",        /* 249 */
  "pretitle",     /* 250 */
  "allcommands",  /* 251 */
  "grep",	  /* 252 */
  "pager",	  /* 253 */
  "appear",	  /* 254 */
  "logs",	  /* 255 */
  "sethome",	  /* 256 */
  "register",	  /* 257 */
  "send",	  /* 258 */
  "whod",	  /* 259 */
  "split",	  /* 260 */
  "notell",	  /* 261 */
  "scribe",	/* 262 */
  "apraise",	/* 263 */
  "bandage",	/* 264 */
  "search",	/* 265 */
  "skills",	/* 266 */
  "doorbash",	/* 267 */
  "restoreall", /* 268 */
  "mount",	/* 269 */
  "dismount",	/* 270 */
  "land",	/* 271 */
  "nosummon",	/* 272 */
  "noteleport", /* 273 */
  "\n"
};


char *fill[]=
{ 
  "in",
  "from",
  "with",
  "the",
  "on",
  "at",
  "to",
  "\n"
};


int search_block(char *arg, char **list, bool exact)
{
  register int i,l;
  /* Make into lower case, and get length of string */
  for(l=0; *(arg+l); l++)
    *(arg+l)=LOWER(*(arg+l));

  if (exact) {
    for(i=0; **(list+i) != '\n'; i++)
      if (!strcmp(arg, *(list+i)))
        return(i);
  } else {
    if (!l)
      l=1; /* Avoid "" to match the first available string */
    for(i=0; **(list+i) != '\n'; i++)
      if (!strncmp(arg, *(list+i), l))
        return(i);
  }
  return(-1);
}


int old_search_block(char *argument,int begin,int length,char **list,int mode)
{
  int guess, found, search;

  /* If the word contain 0 letters, then a match is already found */
  found = (length < 1);

  guess = 0;

  /* Search for a match */

  if(mode)
    while ( NOT found AND *(list[guess]) != '\n' )
    {
      found=(length==strlen(list[guess]));
      for(search=0;( search < length AND found );search++)
        found=(*(argument+begin+search)== *(list[guess]+search));
      guess++;
    } 
  else {
    while ( NOT found AND *(list[guess]) != '\n' ) {
      found=1;
      for(search=0;( search < length AND found );search++)
        found=(*(argument+begin+search)== *(list[guess]+search));
      guess++;
    }
  }

  return ( found ? guess : -1 );
}

void command_interpreter(struct char_data *ch, char *argument)
{
  int look_at, cmd, begin;
  char buf[200];
  extern int no_specials;
  extern struct char_data *board_kludge_char;
  char debug_buf[512];

  REMOVE_BIT(ch->specials.affected_by, AFF_HIDE);

  if (ch == board_kludge_char) {
    board_save_board(FindBoardInRoom(ch->in_room));
    board_kludge_char = 0;
  }

  /* Find first non blank */
  for (begin = 0 ; (*(argument + begin ) == ' ' ) ; begin++ );

  /* Find length of first word */
  for (look_at = 0; *(argument + begin + look_at ) > ' ' ; look_at++)
  {
    /* Make all letters lower case AND find length */
    *(argument + begin + look_at) = LOWER(*(argument + begin + look_at));
  }

  if (*(argument + begin) == '\'')
    look_at = begin+1;

  cmd = old_search_block(argument,begin,look_at,command,0);

  if (!cmd) return;

  if ( cmd>0 && GetMaxLevel(ch)<cmd_info[cmd].minimum_level ) {
    send_to_char("Arglebargle, glop-glyf!?!\n\r", ch);
    return;
  }

  if ( cmd>0 && (cmd_info[cmd].command_pointer != 0)) {
    if ((!IS_AFFECTED(ch, AFF_PARALYSIS)) || (cmd_info[cmd].minimum_position <= POSITION_STUNNED)) {
      if( GET_POS(ch) < cmd_info[cmd].minimum_position ) {
        switch(GET_POS(ch))
        {
        case POSITION_DEAD:
          send_to_char("Lie still; you are DEAD!!! :-( \n\r", ch);
          break;
        case POSITION_INCAP:
        case POSITION_MORTALLYW:
          send_to_char(
              "You are in a pretty bad shape, unable to do anything!\n\r",
              ch);
          break;

        case POSITION_STUNNED:
          send_to_char(
              "All you can do right now, is think about the stars!\n\r", ch);
          break;
        case POSITION_SLEEPING:
          send_to_char("In your dreams, or what?\n\r", ch);
          break;
        case POSITION_RESTING:
          send_to_char("Nah... You feel too relaxed to do that..\n\r",
              ch);
          break;
        case POSITION_SITTING:
          send_to_char("Maybe you should get on your feet first?\n\r",ch);
          break;
        case POSITION_FIGHTING:
          send_to_char("No way! You are fighting for your life!\n\r", ch);
          break;
        }
      } else {

        if (!no_specials && special(ch, cmd, argument + begin + look_at))
          return;

        ((*cmd_info[cmd].command_pointer)(ch,argument+begin+look_at,cmd));

        if ((GetMaxLevel(ch)>=LOW_IMMORTAL)&&(GetMaxLevel(ch)<IMPLEMENTOR)) {
          sprintf(buf,"%s:%s",ch->player.name,argument);
          log(buf);
        }
      }
      return;
    } else {
      send_to_char(" You are paralyzed, you can't do much of anything!\n\r",ch);
      return;
    }
  }

  if(check_exit_alias(ch,argument)) return;

  if ( cmd>0 && (cmd_info[cmd].command_pointer == 0))
    send_to_char("Sorry, that command has yet to be implemented...\n\r", ch);
  else 
    send_to_char("Pardon? \n\r", ch);
}

void argument_interpreter(char *argument,char *first_arg,char *second_arg )
{
  int look_at, found, begin;

  found = begin = 0;

  do
  {
    /* Find first non blank */
    for ( ;*(argument + begin ) == ' ' ; begin++);

    /* Find length of first word */
    for ( look_at=0; *(argument+begin+look_at)> ' ' ; look_at++)

      /* Make all letters lower case,
     AND copy them to first_arg */
      *(first_arg + look_at) =
          LOWER(*(argument + begin + look_at));

    *(first_arg + look_at)='\0';
    begin += look_at;

  }  while( fill_word(first_arg));

  do
  {
    /* Find first non blank */
    for ( ;*(argument + begin ) == ' ' ; begin++);

    /* Find length of first word */
    for ( look_at=0; *(argument+begin+look_at)> ' ' ; look_at++)

      /* Make all letters lower case,
     AND copy them to second_arg */
      *(second_arg + look_at) =
          LOWER(*(argument + begin + look_at));

    *(second_arg + look_at)='\0';
    begin += look_at;

  }  while( fill_word(second_arg));
}

int is_number(char *str)
{
  int look_at;

  if(*str=='\0')
    return(0);

  for(look_at=0;*(str+look_at) != '\0';look_at++)
    if((*(str+look_at)<'0')||(*(str+look_at)>'9'))
      return(0);
  return(1);
}

/*  Quinn substituted a new one-arg for the old one.. I thought returning a 
    char pointer would be neat, and avoiding the func-calls would save a
    little time... If anyone feels pissed, I'm sorry.. Anyhow, the code is
    snatched from the old one, so it outta work..
    
    void one_argument(char *argument,char *first_arg )
    {
    static char dummy[MAX_STRING_LENGTH];
    
    argument_interpreter(argument,first_arg,dummy);
    }
    
    */


/* find the first sub-argument of a string, return pointer to first char in
   primary argument, following the sub-arg                  */
char *one_argument(char *argument, char *first_arg )
{
  int found, begin, look_at;

  found = begin = 0;

  do
  {
    /* Find first non blank */
    for ( ;isspace(*(argument + begin)); begin++);

    /* Find length of first word */
    for (look_at=0; *(argument+begin+look_at) > ' ' ; look_at++)

      /* Make all letters lower case,
     AND copy them to first_arg */
      *(first_arg + look_at) =
          LOWER(*(argument + begin + look_at));

    *(first_arg + look_at)='\0';
    begin += look_at;
  }  while (fill_word(first_arg));

  return(argument+begin);
}



void only_argument(char *argument, char *dest)
{
  while (*argument && isspace(*argument))
    argument++;
  strcpy(dest, argument);
}

int fill_word(char *argument)
{
  return ( search_block(argument,fill,TRUE) >= 0);
}

/* determine if a given string is an abbreviation of another */
int is_abbrev(char *arg1, char *arg2)
{
  if (!*arg1)
    return(0);

  for (; *arg1; arg1++, arg2++)
    if (LOWER(*arg1) != LOWER(*arg2))
      return(0);

  return(1);
}

/* return first 'word' plus trailing substring of input string */
void half_chop(char *string, char *arg1, char *arg2)
{
  for (; isspace(*string); string++);
  for (; !isspace(*arg1 = *string) && *string; string++, arg1++);
  *arg1 = '\0';
  for (; isspace(*string); string++);
  for (; *arg2 = *string; string++, arg2++);
}

int special(struct char_data *ch, int cmd, char *arg)
{
  register struct obj_data *i;
  register struct char_data *k;
  int j, test;

  if (ch->in_room == NOWHERE)
  {
    char_to_room(ch, 3001);
    return;
  }

  /* special in room? */
  if (real_roomp(ch->in_room)->funct)
    if ((*real_roomp(ch->in_room)->funct)(ch, cmd, arg))
      return(1);

  /* special in equipment list? */
  for (j = 0; j <= (MAX_WEAR - 1); j++)
    if (ch->equipment[j] && ch->equipment[j]->item_number>=0)
      if (obj_index[ch->equipment[j]->item_number].func)
        if ((*obj_index[ch->equipment[j]->item_number].func) (ch, cmd, arg))
          return(1);

  test++;
  /* special in inventory? */
  for (i = ch->carrying; i; i = i->next_content)
    if (i->item_number>=0)
      if (obj_index[i->item_number].func)
        if ((*obj_index[i->item_number].func)(ch, cmd, arg))
          return(1);

  test++;

  /* special in mobile present? */
  for (k = real_roomp(ch->in_room)->people; k; k = k->next_in_room)
    if ( IS_MOB(k) )
      if (mob_index[k->nr].func)
        if ((*mob_index[k->nr].func)(ch, cmd, arg))
          return(1);

  test++;

  /* special in object present? */
  for (i = real_roomp(ch->in_room)->contents; i; i = i->next_content)
    if (i->item_number>=0)
      if (obj_index[i->item_number].func)
        if ((*obj_index[i->item_number].func)(ch, cmd, arg))
          return(1);

  test++;

  return(0);
}

void assign_command_pointers ( void )
{
  int position;
  for (position = 0 ; position < MAX_CMD_LIST; position++)
    cmd_info[position].command_pointer = 0;

  COMMANDO(1,POSITION_STANDING,do_move,0);
  COMMANDO(2,POSITION_STANDING,do_move,0);
  COMMANDO(3,POSITION_STANDING,do_move,0);
  COMMANDO(4,POSITION_STANDING,do_move,0);
  COMMANDO(5,POSITION_STANDING,do_move,0);
  COMMANDO(6,POSITION_STANDING,do_move,0);
  COMMANDO(7,POSITION_STANDING,do_enter,0);
  COMMANDO(8,POSITION_RESTING,do_exits,0);
  COMMANDO(9,POSITION_RESTING,do_action,0);
  COMMANDO(10,POSITION_RESTING,do_get,0);
  COMMANDO(11,POSITION_RESTING,do_drink,0);
  COMMANDO(12,POSITION_RESTING,do_eat,0);
  COMMANDO(13,POSITION_RESTING,do_wear,0);
  COMMANDO(14,POSITION_RESTING,do_wield,0);
  COMMANDO(15,POSITION_RESTING,do_look,0);
  COMMANDO(16,POSITION_DEAD,do_score,0);
  COMMANDO(17,POSITION_RESTING,do_say,0);
  COMMANDO(18,POSITION_RESTING,do_shout,0);
  COMMANDO(19,POSITION_DEAD,do_tell,0);
  COMMANDO(20,POSITION_DEAD,do_inventory,0);
  COMMANDO(21,POSITION_DEAD,do_qui,0);
  COMMANDO(22,POSITION_STANDING,do_action,0);
  COMMANDO(23,POSITION_RESTING,do_action,0);
  COMMANDO(24,POSITION_STANDING,do_action,0);
  COMMANDO(25,POSITION_FIGHTING,do_kill,0);
  COMMANDO(26,POSITION_RESTING,do_action,0);
  COMMANDO(27,POSITION_RESTING,do_action,0);
  COMMANDO(28,POSITION_RESTING,do_action,0);
  COMMANDO(29,POSITION_RESTING,do_action,0);
  COMMANDO(30,POSITION_RESTING,do_action,0);
  COMMANDO(31,POSITION_RESTING,do_action,0);
  COMMANDO(32,POSITION_RESTING,do_action,0);
  COMMANDO(33,POSITION_RESTING,do_insult,0);
  COMMANDO(34,POSITION_RESTING,do_action,0);
  COMMANDO(35,POSITION_RESTING,do_action,0);
  COMMANDO(36,POSITION_RESTING,do_action,0);
  COMMANDO(37,POSITION_RESTING,do_action,0);
  COMMANDO(38,POSITION_DEAD,do_help,0);
  COMMANDO(39,POSITION_DEAD,do_who,0);
  COMMANDO(40,POSITION_SLEEPING,do_emote,1);
  COMMANDO(41,POSITION_SLEEPING,do_echo,1);
  COMMANDO(42,POSITION_RESTING,do_stand,0);
  COMMANDO(43,POSITION_RESTING,do_sit,0);
  COMMANDO(44,POSITION_RESTING,do_rest,0);
  COMMANDO(45,POSITION_SLEEPING,do_sleep,0);
  COMMANDO(46,POSITION_SLEEPING,do_wake,0);
  COMMANDO(49,POSITION_RESTING,do_action,0);
  COMMANDO(50,POSITION_RESTING,do_action,0);
  COMMANDO(51,POSITION_RESTING,do_action,0);
  COMMANDO(52,POSITION_RESTING,do_action,0);
  COMMANDO(53,POSITION_RESTING,do_action,0);
  COMMANDO(54,POSITION_SLEEPING,do_news,0);
  COMMANDO(55,POSITION_SLEEPING,do_equipment,0);
  COMMANDO(56,POSITION_STANDING,do_not_here,0);
  COMMANDO(57,POSITION_STANDING,do_not_here,0);
  COMMANDO(58,POSITION_STANDING,do_not_here,0);
  COMMANDO(59,POSITION_STANDING,do_not_here,0);
  COMMANDO(60,POSITION_RESTING,do_drop,0);
  COMMANDO(62,POSITION_RESTING,do_weather,0);
  COMMANDO(63,POSITION_RESTING,do_read,0);
  COMMANDO(64,POSITION_STANDING,do_pour,0);
  COMMANDO(65,POSITION_RESTING,do_grab,0);
  COMMANDO(66,POSITION_RESTING,do_remove,0);
  COMMANDO(67,POSITION_RESTING,do_put,0);
  COMMANDO(69,POSITION_SLEEPING,do_save,0);
  COMMANDO(70,POSITION_FIGHTING,do_hit,0);
  COMMANDO(72,POSITION_RESTING,do_give,0);
  COMMANDO(73,POSITION_DEAD,do_quit,0);
  COMMANDO(75,POSITION_STANDING,do_guard,1);
  COMMANDO(260,POSITION_RESTING,do_split,1);
  COMMANDO(263,POSITION_RESTING,do_apraise,1);
  COMMANDO(264,POSITION_FIGHTING,do_bandage,1);
  COMMANDO(265,POSITION_STANDING,do_search,1);
  COMMANDO(266,POSITION_STANDING,do_skills,1);
  COMMANDO(267,POSITION_STANDING,do_doorbash,1);
  COMMANDO(269,POSITION_STANDING,do_mount,1);
  COMMANDO(270,POSITION_MOUNTED,do_mount,1);
  COMMANDO(271,POSITION_DEAD,do_land,1);
  COMMANDO(186,POSITION_STANDING,do_peer,1);
  COMMANDO(76,POSITION_DEAD,do_time,0);
  COMMANDO(80,POSITION_DEAD,do_idea,0);
  COMMANDO(81,POSITION_DEAD,do_typo,0);
  COMMANDO(82,POSITION_DEAD,do_bug,0);
  COMMANDO(83,POSITION_RESTING,do_whisper,0);
  COMMANDO(84,POSITION_SITTING,do_cast,1);
  COMMANDO(86,POSITION_RESTING,do_ask,0);
  COMMANDO(87,POSITION_RESTING,do_order,1);
  COMMANDO(88,POSITION_RESTING,do_sip,0);
  COMMANDO(89,POSITION_RESTING,do_taste,0);
  COMMANDO(91,POSITION_RESTING,do_follow,0);
  COMMANDO(92,POSITION_STANDING,do_not_here,1);
  COMMANDO(93,POSITION_STANDING,do_not_here,1);
  COMMANDO(94,POSITION_RESTING,do_action,0);
  COMMANDO(256,POSITION_STANDING,do_not_here,1);
  COMMANDO(257,POSITION_STANDING,do_not_here,3);
  COMMANDO(258,POSITION_STANDING,do_not_here,3);
  COMMANDO(96,POSITION_SITTING,do_action,0);
  COMMANDO(97,POSITION_RESTING,do_action,0);
  COMMANDO(98,POSITION_STANDING,do_action,0);
  COMMANDO(99,POSITION_SITTING,do_open,0);
  COMMANDO(100,POSITION_SITTING,do_close,0);
  COMMANDO(101,POSITION_SITTING,do_lock,0);
  COMMANDO(102,POSITION_SITTING,do_unlock,0);
  COMMANDO(103,POSITION_STANDING,do_leave,0);
  COMMANDO(104,POSITION_RESTING,do_action,0);
  COMMANDO(105,POSITION_RESTING,do_action,0);
  COMMANDO(106,POSITION_RESTING,do_action,0);
  COMMANDO(107,POSITION_RESTING,do_action,0);
  COMMANDO(108,POSITION_RESTING,do_action,0);
  COMMANDO(109,POSITION_RESTING,do_action,0);
  COMMANDO(110,POSITION_STANDING,do_action,0);
  COMMANDO(111,POSITION_RESTING,do_action,0);
  COMMANDO(112,POSITION_STANDING,do_action,0);
  COMMANDO(113,POSITION_RESTING,do_action,0);
  COMMANDO(114,POSITION_RESTING,do_action,0);
  COMMANDO(115,POSITION_RESTING,do_action,0);
  COMMANDO(116,POSITION_RESTING,do_action,0);
  COMMANDO(117,POSITION_RESTING,do_action,0);
  COMMANDO(118,POSITION_RESTING,do_action,0);
  COMMANDO(119,POSITION_RESTING,do_action,0);
  COMMANDO(120,POSITION_RESTING,do_action,0);
  COMMANDO(121,POSITION_RESTING,do_action,0);
  COMMANDO(122,POSITION_RESTING,do_action,0);
  COMMANDO(123,POSITION_RESTING,do_action,0);
  COMMANDO(124,POSITION_RESTING,do_action,0);
  COMMANDO(125,POSITION_RESTING,do_action,0);
  COMMANDO(126,POSITION_STANDING,do_action,0);
  COMMANDO(127,POSITION_RESTING,do_action,0);
  COMMANDO(128,POSITION_RESTING,do_action,0);
  COMMANDO(129,POSITION_RESTING,do_action,0);
  COMMANDO(130,POSITION_RESTING,do_action,0);
  COMMANDO(131,POSITION_RESTING,do_action,0);
  COMMANDO(132,POSITION_RESTING,do_action,0);
  COMMANDO(133,POSITION_RESTING,do_action,0);
  COMMANDO(134,POSITION_RESTING,do_action,0);
  COMMANDO(135,POSITION_RESTING,do_action,0);
  COMMANDO(136,POSITION_SLEEPING,do_action,0);
  COMMANDO(137,POSITION_STANDING,do_action,0);
  COMMANDO(138,POSITION_RESTING,do_action,0);
  COMMANDO(139,POSITION_RESTING,do_action,0);
  COMMANDO(140,POSITION_STANDING,do_action,0);
  COMMANDO(141,POSITION_RESTING,do_action,0);
  COMMANDO(142,POSITION_RESTING,do_action,0);
  COMMANDO(143,POSITION_RESTING,do_action,0);
  COMMANDO(144,POSITION_RESTING,do_action,0);
  COMMANDO(145,POSITION_STANDING,do_action,0);
  COMMANDO(146,POSITION_RESTING,do_action,0);
  COMMANDO(147,POSITION_RESTING,do_action,0);
  COMMANDO(149,POSITION_STANDING,do_write,1);
  COMMANDO(150,POSITION_RESTING,do_grab,1);
  COMMANDO(151,POSITION_FIGHTING,do_flee,1);
  COMMANDO(152,POSITION_STANDING,do_sneak,1);
  COMMANDO(153,POSITION_RESTING,do_hide,1);
  COMMANDO(154,POSITION_STANDING,do_backstab,1);
  COMMANDO(155,POSITION_STANDING,do_pick,1);
  COMMANDO(156,POSITION_STANDING,do_steal,1);
  COMMANDO(157,POSITION_FIGHTING,do_bash,1);
  COMMANDO(158,POSITION_FIGHTING,do_rescue,1);
  COMMANDO(159,POSITION_FIGHTING,do_kick,1);
  COMMANDO(160,POSITION_RESTING,do_action,0);
  COMMANDO(161,POSITION_RESTING,do_action,0);
  COMMANDO(162,POSITION_RESTING,do_action,0);
  COMMANDO(163,POSITION_RESTING,do_action,0);
  COMMANDO(164,POSITION_RESTING,do_practice,1);
  COMMANDO(165,POSITION_RESTING,do_action,0);
  COMMANDO(166,POSITION_SITTING,do_examine,0);
  COMMANDO(167,POSITION_RESTING,do_get,0); /* TAKE */
  COMMANDO(168,POSITION_SLEEPING,do_info,0);
  COMMANDO(169,POSITION_RESTING,do_say,0);
  COMMANDO(170,POSITION_RESTING,do_practice,1);
  COMMANDO(171,POSITION_RESTING,do_action,0);
  COMMANDO(172,POSITION_SITTING,do_use,1);
  COMMANDO(173,POSITION_DEAD,do_where,1);
  COMMANDO(174,POSITION_DEAD,do_levels,0);
  COMMANDO(176,POSITION_SITTING,do_action,0);
  COMMANDO(177,POSITION_SLEEPING,do_emote,1);
  COMMANDO(178,POSITION_RESTING,do_action,0);
  COMMANDO(179,POSITION_RESTING,do_not_here,0);
  COMMANDO(180,POSITION_RESTING,do_action,0);
  COMMANDO(181,POSITION_SLEEPING,do_action,0);
  COMMANDO(182,POSITION_RESTING,do_action,0);
  COMMANDO(183,POSITION_RESTING,do_action,0);
  COMMANDO(184,POSITION_RESTING,do_action,0);
  COMMANDO(185,POSITION_RESTING,do_action,0);
  COMMANDO(187,POSITION_RESTING,do_action,0);
  COMMANDO(188,POSITION_RESTING,do_action,0);
  COMMANDO(189,POSITION_FIGHTING,do_punch,1);
  COMMANDO(190,POSITION_RESTING,do_action,0);
  COMMANDO(191,POSITION_RESTING,do_action,0);
  COMMANDO(192,POSITION_RESTING,do_action,0);
  COMMANDO(193,POSITION_RESTING,do_action,0);
  COMMANDO(194,POSITION_RESTING,do_action,0);
  COMMANDO(195,POSITION_RESTING,do_action,0);
  COMMANDO(196,POSITION_RESTING,do_action,0);
  COMMANDO(197,POSITION_RESTING,do_action,0);
  COMMANDO(198,POSITION_RESTING,do_action,0);
  COMMANDO(199,POSITION_DEAD,do_brief,0);
  COMMANDO(200,POSITION_DEAD,do_wizlist,0);
  COMMANDO(201,POSITION_RESTING,do_consider,0);
  COMMANDO(202,POSITION_RESTING,do_group,1);
  COMMANDO(204,POSITION_DEAD,do_return,0);
  COMMANDO(206,POSITION_RESTING,do_quaff,0);
  COMMANDO(207,POSITION_RESTING,do_recite,0);
  COMMANDO(209,POSITION_STANDING,do_pose,0);
  COMMANDO(212,POSITION_DEAD,do_credits,0);
  COMMANDO(213,POSITION_DEAD,do_compact,0);
  COMMANDO(214,POSITION_SLEEPING,do_emote,1);
  COMMANDO(215,POSITION_SLEEPING,do_plr_noshout,1);
  COMMANDO(261,POSITION_SLEEPING,do_plr_notell,1);
  COMMANDO(272,POSITION_SLEEPING,do_plr_nosummon,1);
  COMMANDO(273,POSITION_SLEEPING,do_plr_noteleport,1);
  COMMANDO(217,POSITION_DEAD,do_wimp,1);
  COMMANDO(218,POSITION_RESTING,do_junk,1);
  COMMANDO(219,POSITION_RESTING,do_not_here,1);
  COMMANDO(220,POSITION_RESTING,do_not_here,1);
  COMMANDO(221,POSITION_RESTING,do_not_here,1);
  COMMANDO(224,POSITION_STANDING,do_not_here,1);
  COMMANDO(230,POSITION_DEAD,do_track,1);
  COMMANDO(234,POSITION_DEAD,do_who,0);
  COMMANDO(235,POSITION_FIGHTING,do_assist,0);
  COMMANDO(236,POSITION_DEAD,do_swat,1);
  COMMANDO(239,POSITION_FIGHTING,do_breath,0);
  COMMANDO(243,POSITION_DEAD,do_gain,1);
  COMMANDO(245,POSITION_FIGHTING,do_disarm,1);
  COMMANDO(246,POSITION_SITTING,do_action,1);
  COMMANDO(249,POSITION_DEAD,do_group_tell,1);
  COMMANDO(252,POSITION_DEAD,do_group_report,1);
  COMMANDO(253,POSITION_DEAD,do_pager,1);
  COMMANDO(254,POSITION_DEAD,do_invis_off,1);

  COMMANDO(247,POSITION_DEAD,do_commune,51);
  COMMANDO(61,POSITION_SLEEPING,do_goto,51);
  COMMANDO(208,POSITION_DEAD,do_users,51);
  COMMANDO(211,POSITION_SLEEPING,do_wizhelp,51);
  COMMANDO(148,POSITION_STANDING,do_action,51);
  COMMANDO(237,POSITION_DEAD,do_world,51);
  COMMANDO(233,POSITION_DEAD,do_title,51);

  COMMANDO(210,POSITION_SLEEPING,do_noshout,52);
  COMMANDO(78,POSITION_DEAD,do_purge,52);
  COMMANDO(203,POSITION_DEAD,do_restore,52);
  COMMANDO(48,POSITION_SLEEPING,do_trans,52);
  COMMANDO(242,POSITION_DEAD,do_invis,52);
  COMMANDO(251,POSITION_DEAD,do_allcommands,1);

  COMMANDO(71,POSITION_SLEEPING,do_string,53);
  COMMANDO(85,POSITION_DEAD,do_at,53);
  COMMANDO(231,POSITION_DEAD,do_wizlock,53);
  COMMANDO(238,POSITION_DEAD,do_spells,53);

  COMMANDO(240,POSITION_DEAD,do_show,54);
  COMMANDO(216,POSITION_STANDING,do_kill,54);
  COMMANDO(74,POSITION_DEAD,do_stat,54);
  COMMANDO(222,POSITION_DEAD,do_nohassle,54);

  COMMANDO(205,POSITION_DEAD,do_switch,55);
  COMMANDO(232,POSITION_DEAD,do_highfive,55);
  COMMANDO(223,POSITION_DEAD,do_system,55);
  COMMANDO(47,POSITION_SLEEPING,do_force,55);

  COMMANDO(248,POSITION_DEAD,do_form,56);
  COMMANDO(226,POSITION_DEAD,do_cust,56);
  COMMANDO(229,POSITION_DEAD,do_rload,56);
  COMMANDO(228,POSITION_DEAD,do_rsave,56);

  COMMANDO(244,POSITION_DEAD,do_instazone,57);
  COMMANDO(255,POSITION_DEAD,do_show_logs,57);
  COMMANDO(250,POSITION_DEAD,do_pretitle,57);
  COMMANDO(77,POSITION_DEAD,do_load,57);

  COMMANDO(227,POSITION_DEAD,do_set,58);
  COMMANDO(225,POSITION_DEAD,do_stealth,58);
  COMMANDO(79,POSITION_DEAD,do_shutdown,58);
  COMMANDO(175,POSITION_DEAD,do_reroll,58);
  COMMANDO(68,POSITION_DEAD,do_shutdow,58);

  COMMANDO(95,POSITION_DEAD,do_advance,59);
  COMMANDO(241,POSITION_DEAD,do_debug,59);
  COMMANDO(90,POSITION_DEAD,do_snoop,59);
  COMMANDO(259,POSITION_DEAD,do_whod,59);
  COMMANDO(268,POSITION_DEAD,do_restore_all,59);

} /* 259 - last command number used */

/* *************************************************************************
 *  Stuff for controlling the non-playing sockets (get name, pwd etc)       *
 ************************************************************************* */

/* locate entry in p_table with entry->name == name. -1 mrks failed search */
int find_name(char *name)
{
  int i;

  for (i = 0; i <= top_of_p_table; i++) {
    if (!str_cmp((player_table + i)->name, name))
      return(i);
  }
  return(-1);
}

int _parse_name(char *arg, char *name)
{
  int i;

  /* skip whitespaces */
  for (; isspace(*arg); arg++);
  for (i = 0; *name = *arg; arg++, i++, name++)
    if ((*arg <0) || !isalpha(*arg) || i > 15)
      return(1);

  if (!i)
    return(1);
  return(0);
}

/* deal with newcomers and other non-playing sockets */
void nanny(struct descriptor_data *d, char *arg)
{
  char buf[100];
  int player_i, count=0, oops=FALSE;
  char tmp_name[20];
  struct char_file_u tmp_store;
  struct char_data *tmp_ch;
  struct descriptor_data *k;
  extern struct descriptor_data *descriptor_list;
  extern int WizLock;

  void do_look(struct char_data *ch, char *argument, int cmd);
  void load_char_objs(struct char_data *ch);
  int load_char(char *name, struct char_file_u *char_element);

  write(d->descriptor, echo_on, 6);

  switch(STATE(d)) 
  {
    case CON_NME:
    {
      if(!d->character) 
      {
        CREATE(d->character, struct char_data, 1);
        clear_char(d->character);
        d->character->desc = d;
      }

      for(;isspace(*arg); arg++);
      if (!*arg)
        close_socket(d);
      else 
      {
        if(_parse_name(arg, tmp_name))
        {
          SEND_TO_Q("Illegal name, please try another.", d);
          SEND_TO_Q("Name: ", d);
          return;
        }

        /* Check if already playing */
        for(k=descriptor_list; k; k = k->next)
        {
          if((k->character != d->character) && k->character)
          {
            if(k->original)
            {
              if(GET_NAME(k->original) &&
                  (str_cmp(GET_NAME(k->original), tmp_name) == 0))
              {
                SEND_TO_Q("Already playing, cannot connect\n\r", d);
                SEND_TO_Q("Name: ", d);
                return;
              }
            }
            else
            { 
              if (GET_NAME(k->character) &&
                  (str_cmp(GET_NAME(k->character), tmp_name) == 0))
              {
                SEND_TO_Q("Already playing, cannot connect\n\r", d);
                SEND_TO_Q("Name: ", d);
                return;
              }
            }
          }
        }

        /* GetPasswd gets the passwd entry from the player passwd file */
        if( GetPasswd( tmp_name, d->pwd ) )
        {
          SEND_TO_Q( "Password: ",d );
          write( d->descriptor, echo_off, 4 );
          STATE(d) = CON_PWDNRM ;
          strcpy( d->usr_name, tmp_name );
        }

#if 0
        if ((player_i = load_char(tmp_name, &tmp_store)) > -1)  
        {
          store_to_char(&tmp_store, d->character);
          strcpy(d->pwd, tmp_store.pwd);
          d->pos = player_table[player_i].nr;
          SEND_TO_Q("Password: ", d);
          write(d->descriptor, echo_off, 4);
          STATE(d) = CON_PWDNRM;
        }
#endif

        else
        {
          sprintf(buf,"Please email to wiley@wiley.cs.wmich.edu for information on creation\n\r");
          SEND_TO_Q(buf,d);
          STATE(d) = CON_WIZLOCK;
        }
      }
    }
    break;

    case CON_PWDNRM:
    {
      for(; isspace(*arg); arg++);
      if (!*arg)
        close_socket(d);
      else 
      {
        if(strncmp(arg, d->pwd,10))
        {
          SEND_TO_Q("Wrong password.\n\r", d);
          SEND_TO_Q("Password: ", d);
          write(d->descriptor, echo_off, 4);
          return;
        }

        for(tmp_ch = character_list; tmp_ch; tmp_ch = tmp_ch->next)
          if(
              ((!str_cmp(d->usr_name), GET_NAME(tmp_ch)) &&
              !tmp_ch->desc && !IS_NPC(tmp_ch)) || 
              (IS_NPC(tmp_ch) && tmp_ch->orig && 
              !str_cmp( d->usr_name,GET_NAME(tmp_ch->orig))
              )) 
          {
            write(d->descriptor, echo_on, 6);
            SEND_TO_Q("Reconnecting.\n\r", d);
            free_char(d->character);
            tmp_ch->desc = d;
            d->character = tmp_ch;
            tmp_ch->specials.timer = 0;
            if (tmp_ch->orig)
            {
              tmp_ch->desc->original = tmp_ch->orig;
              tmp_ch->orig = 0;
            }
            STATE(d) = CON_PLYNG;
  
            act("$n has reconnected.", TRUE, tmp_ch, 0, 0, TO_ROOM);
            sprintf(buf, "%s[%s] has reconnected.", GET_NAME(d->character), d->host);
            if(d->character->in_room == NOWHERE)
              char_to_room(d->character,DEFAULT_HOME);
            else
            {
              if(d->character->in_room == 0)
              {
                char_from_room( d->character );
                char_to_room( d->character, DEFAULT_HOME );
              }
            }
            log(buf);
            return;
          }

        /* Get the player record now.... */
        log("Getting PlayerFile");
        GET_NAME(d->character) = (char *) strdup(d->usr_name);
        if(GetPlayerFile( d->usr_name , d->character ) != 0 )
        {
          sprintf(buf, "%s[%s] has connected.", GET_NAME(d->character), d->host);
          log(buf);
          SEND_TO_Q(motd, d);
          if(GetMaxLevel(d->character) > LOW_IMMORTAL)
            SEND_TO_Q(wmotd,d);
          SEND_TO_Q("\n\r\n*** Press Return: ", d);
          STATE(d) = CON_RMOTD;
        }
        else
          SEND_TO_Q("Choose A Race:\n\r", d);
          SEND_TO_Q("G) Gnome\n\rF) Halfling\n\rD) Dwarf\n\rE) Elf\n\rH) Human\n\r",d);
          SEND_TO_Q("For help type '?'. \n\r Race:  ", d);
          STATE(d) = CON_QRACE; 
      }
    }
    break;

    case CON_QRACE:
    {
      for (; isspace(*arg); arg++)  ;
      if (!*arg)
      {
        SEND_TO_Q("Choose A Race:\n\r", d);
        SEND_TO_Q("G) Gnome\n\rF) Halfling\n\rD) Dwarf\n\rE) Elf\n\rH) Human\n\r",d);
        SEND_TO_Q("For help type '?'. \n\r Race:  ", d);
        STATE(d) = CON_QRACE;
      } 
      else 
      {
        switch (*arg)   
        {
          case 'd':
          case 'D': 
          {
            GET_RACE(d->character) = RACE_DWARF;
            SEND_TO_Q("What is your sex (M/F) ? ", d);
            STATE(d) = CON_QSEX;
          } 
          break;

          case 'e':
          case 'E': 
          {
            GET_RACE(d->character) = RACE_ELVEN;
            SEND_TO_Q("What is your sex (M/F) ? ", d);
            STATE(d) = CON_QSEX;
          } 
          break;

          case 'G':
          case 'g': 
          {
            GET_RACE(d->character) = RACE_GNOME;
            SEND_TO_Q("What is your sex (M/F) ? ", d);
            STATE(d) = CON_QSEX;
          } 
          break;

          case 'f':
          case 'F':
          {
            GET_RACE(d->character) = RACE_HALFLING;
            SEND_TO_Q("What is your sex (M/F) ? ", d);
            STATE(d) = CON_QSEX;
          } 
          break;

          case '?': 
          {
            SEND_TO_Q(RACEHELP, d);
            SEND_TO_Q("Choose A Race:\n\r", d);
            SEND_TO_Q("G) Gnome\n\rF) Halfling\n\rD) Dwarf\n\rE) Elf\n\rH) Human\n\r",d);
            SEND_TO_Q("For help type '?'. \n\r Race:  ", d);
            STATE(d) = CON_QRACE;
          } 
          break;

          case 'h':
          case 'H': 
          {
            GET_RACE(d->character) = RACE_HUMAN;
            SEND_TO_Q("What is your sex (M/F) ? ", d);
            STATE(d) = CON_QSEX;
          } 
          break;

          default : 
          {
            SEND_TO_Q("\n\rThat's not a race.\n\rRACE?:", d);
            STATE(d) = CON_QRACE;
          } 
          break;
        }
      }
    }
    break;

  case CON_QSEX:    /* query sex of new user  */
    /* skip whitespaces */
    for (; isspace(*arg); arg++);
    switch (*arg)
    {
    case 'm':
    case 'M':
      /* sex MALE */
      d->character->player.sex = SEX_MALE;
      break;
    case 'f':
    case 'F':
      /* sex FEMALE */
      d->character->player.sex = SEX_FEMALE;
      break;
    default:
      SEND_TO_Q("That's not a sex..\n\r", d);
      SEND_TO_Q("What IS your sex? :", d);
      return;
      break;
    }

    SEND_TO_Q("\n\rSelect a class:\n\r[C] Cleric\n\r[T] Thief\n\r[W] Warrior\n\r[M] Magic-user\n\r[R] Ranger\n\r", d);
    SEND_TO_Q("\n\r", d);
    SEND_TO_Q("\n\rPlease Note:  Rangers may not be multi-class, they may",d);
    SEND_TO_Q("\n\ronly be single class!",d);
    SEND_TO_Q("\n\r\n\rIf you choose to be multi-class, please do so now.", d);
    SEND_TO_Q("\n\rClasses will not be changed within the game.", d);
    SEND_TO_Q("\n\r", d);
    SEND_TO_Q("\n\rUse '/' to sperate your class choices.",d);
    SEND_TO_Q("\n\rEnter W/C or W/M/C (etc) to be multi-classed", d);
    SEND_TO_Q("\n\rClass :", d);
    STATE(d) = CON_QCLASS;
    break;

  case CON_QCLASS : 
    {
      /* skip whitespaces */
      for (; isspace(*arg); arg++);
      d->character->player.class = 0;
      count=0;
      oops=FALSE;
      for (; *arg && count < 3 && !oops; *arg++)
      {
        switch (*arg){
        case 'm':
        case 'M':
          {
            if (!IS_SET(d->character->player.class, CLASS_MAGIC_USER))
              d->character->player.class += CLASS_MAGIC_USER;
            STATE(d) = CON_RMOTD;
            count++;
            break;
          }
        case 'c':
        case 'C':
          {
            if (!IS_SET(d->character->player.class, CLASS_CLERIC))
              d->character->player.class += CLASS_CLERIC;
            STATE(d) = CON_RMOTD;
            count++;
            break;
          }
        case 'f':
        case 'F':
        case 'w':
        case 'W':
          {
            if (!IS_SET(d->character->player.class, CLASS_WARRIOR))
              d->character->player.class += CLASS_WARRIOR;
            STATE(d) = CON_RMOTD;
            count++;
            break;
          }
        case 't':
        case 'T':
          {
            if (!IS_SET(d->character->player.class, CLASS_THIEF))
              d->character->player.class += CLASS_THIEF;
            STATE(d) = CON_RMOTD;
            count++;
            break;
          }
        case 'r':
        case 'R':
          {
            if (!IS_SET(d->character->player.class, CLASS_RANGER))
              d->character->player.class = CLASS_RANGER;
            STATE(d) = CON_RMOTD;
            count++;
            break;
          }
/*
      case 'd':
      case 'D': {
        if (!IS_SET(d->character->player.class, CLASS_DRUID))
        d->character->player.class += CLASS_DRUID;
        STATE(d) = CON_RMOTD;
        count++;
        break;
      }
*/
        case '\\':    /* ignore these */
        case '/':
          break;

        default:
          SEND_TO_Q("I don't recognize that class.\n\r", d);
          STATE(d) = CON_QCLASS;
          oops = TRUE;
          break;
        }

        if ( (count>1)&&IS_SET(d->character->player.class, CLASS_RANGER))
        {
          SEND_TO_Q("Rangers may only be single classed.\n\r",d);
          SEND_TO_Q("Please choose again.\n\r\n\r",d);
          SEND_TO_Q("\n\rSelect a class:\n\r[C] Cleric\n\r[T] Thief\n\r[W] Warrior\n\r[M] Magic-user\n\r[R] Ranger\n\r",
              d);
          SEND_TO_Q("\n\r", d);
          SEND_TO_Q("\n\rPlease Note:  Rangers may not be multi-class, they may",d);
          SEND_TO_Q("\n\ronly be single class!",d);
          SEND_TO_Q("\n\r\n\rIf you choose to be multi-class, please do so now.", d);
          SEND_TO_Q("\n\rClasses will not be changed within the game.", d);
          SEND_TO_Q("\n\r", d);
          SEND_TO_Q("\n\rUse '/' to sperate your class choices.",d);
          SEND_TO_Q("\n\rEnter W/C or W/C/M (etc) to be multi-classed", d);
          SEND_TO_Q("\n\rClass :", d);
          STATE(d) = CON_QCLASS;
          oops = TRUE;
        }
      }

      if (STATE(d) != CON_QCLASS) {
        sprintf(buf, "%s [%s] new player.", GET_NAME(d->character), d->host);
        log(buf);
        /*
       ** now that classes are set, initialize
       */

        init_char(d->character);
        /* create an entry in the file */
        d->pos = create_entry( GET_NAME(d->character) );
        save_char(d->character, NOWHERE);
        SEND_TO_Q(motd, d);
        SEND_TO_Q("\n\r\n*** PRESS RETURN: ", d);
        STATE(d) = CON_RMOTD;
      }
    } 
    break;

  case CON_RMOTD:   /* read CR after printing motd  */
    SEND_TO_Q(MENU, d);
    STATE(d) = CON_SLCT;
    if (WizLock) {
      if (GetMaxLevel(d->character) < LOW_IMMORTAL) {
        sprintf(buf, "Sorry, the game is locked up for repair\n\r");
        SEND_TO_Q(buf,d);
        STATE(d) = CON_WIZLOCK;
      }
    }
    break;

  case CON_WIZLOCK:
    close_socket(d);
    break;

  case CON_SLCT:    /* get selection from main menu */
    /* skip whitespaces */
    for (; isspace(*arg); arg++);
    switch (*arg)   {
    case '0':
      close_socket(d);
      break;

    case '1':
      reset_char(d->character);
      sprintf(buf,"Loading %s's equipment", d->character->player.name);
      log(buf);
      load_char_objs(d->character);
      save_char(d->character, NOWHERE);
      send_to_char(WELC_MESSG, d->character);
      d->character->next = character_list;
      character_list = d->character;
      if (d->character->in_room == NOWHERE)
      {
        if (GetMaxLevel(d->character) >= LOW_IMMORTAL)
        {
          char_to_room(d->character, 1000);
	  GET_HOME(d->character) = 1000;
        }
        else
        {
	  if(!real_roomp(GET_HOME(d->character)))
	    GET_HOME(d->character) = DEFAULT_HOME;
          char_to_room(d->character, GET_HOME(d->character));
        }
      }
      else
      {
        if (real_roomp(d->character->in_room))
        {
          char_to_room(d->character,d->character->in_room);
	  GET_HOME(d->character) = d->character->in_room;
        }
        else 
	{
          char_to_room(d->character, DEFAULT_HOME);
	  GET_HOME(d->character)= DEFAULT_HOME;
        }
      }

      if (GetMaxLevel(d->character)<58)
        act("$n has entered the game.",TRUE,d->character,0,0,TO_ROOM);
      if (GetMaxLevel(d->character)>=58)
        d->character->invis_level = GetMaxLevel(d->character) - 1;

      STATE(d) = CON_PLYNG;
      if (!GetMaxLevel(d->character)) do_start(d->character);
      do_look(d->character, "",15);
      d->prompt_mode = 1;
      break;

    case '2':
      SEND_TO_Q("Enter a text you'd like others to see when they look at you.\n\r", d);
      SEND_TO_Q("Terminate with a '@'.\n\r", d);
      if (d->character->player.description) {
        SEND_TO_Q("Old description :\n\r", d);
        SEND_TO_Q(d->character->player.description, d);
        free(d->character->player.description);
        d->character->player.description = 0;
      }
      d->str = &d->character->player.description;
      d->max_str = 240;
      STATE(d) = CON_EXDSCR;
      break;

    case '3':
      SEND_TO_Q(STORY, d);
      STATE(d) = CON_RMOTD;
      break;
    case '5':
      {
        struct descriptor_data *dd;
        struct char_data *person;
        int count=0;
        SEND_TO_Q("Players Connected.\n\r\n\r",d);
        for(dd=descriptor_list;dd;dd = dd->next)
          if(!dd->connected)
          {
            person = dd->character;
            if(!IS_IMMORTAL(person) || IS_IMMORTAL(d->character))
            {
              count++;
              sprintf(buf,"%s %s %s\n\r",(person->player.pre_title?person->player.pre_title:
                  "")
                  ,GET_NAME(person),person->player.title);
              SEND_TO_Q(buf,d);
            }
          }
        sprintf(buf,"Total Connected %d\n\r",count);
        SEND_TO_Q(buf,d);
        STATE(d) = CON_RMOTD;
        break;
      }
    case '4':
      SEND_TO_Q("Enter a new password: ", d);
/*
  Insert this line before what you don't want to echo
*/
      write(d->descriptor, echo_off, 4);

      STATE(d) = CON_PWDNEW;
      break;
    default:
      SEND_TO_Q("Wrong option.\n\r", d);
      SEND_TO_Q(MENU, d);
      break;
    }
    break;
  case CON_PWDNEW:
    /* skip whitespaces */
    for (; isspace(*arg); arg++);

    if (!*arg || strlen(arg) > 10) 
    {
      write(d->descriptor, echo_on, 6);

      SEND_TO_Q("Illegal password.\n\r", d);
      SEND_TO_Q("Password: ", d);
/*
  Insert this line before what you don't want to echo
*/
      write(d->descriptor, echo_off, 4);
      return;
    }
    strncpy(d->pwd,arg,10);
    *(d->pwd + 10) = '\0';
    /* other */
/*
   When you want echo back on..............
*/
    write(d->descriptor, echo_on, 6);
    SEND_TO_Q("Please retype password: ", d);
    STATE(d) = CON_PWDNCNF;
/*
      Insert this line before what you don't want to echo
*/
    write(d->descriptor, echo_off, 4);
    break;
  case CON_PWDNCNF:
    /* skip whitespaces */
    for (; isspace(*arg); arg++);
    if (strncmp(arg,d->pwd,10))      {
      /* other * /
/*
       When you want echo back on..............
*/
      write(d->descriptor, echo_on, 6);
      SEND_TO_Q("Passwords don't match.\n\r", d);
      SEND_TO_Q("Retype password: ", d);
/*
      Insert this line before what you don't want to echo
*/
      write(d->descriptor, echo_off, 4);

      STATE(d) = CON_PWDNEW;
      return;
    }
    /* other */
/*
      When you want echo back on..............
*/
    write(d->descriptor, echo_on, 6);

    SEND_TO_Q(
        "\n\rDone. You must enter the game to make the change final\n\r",
        d);
    SEND_TO_Q(MENU, d);
    STATE(d) = CON_SLCT;
    break;
  default:
    log("Nanny: illegal state of con'ness");
    abort();
    break;
  }
}

int GetPasswd( char * who, char * pwd )
{
  FILE * pwd_fd;
  char path[256];
  char buf[256];
  char tname[40];
  char * t_ptr;
  char pname[40];
  char passwd[40];

  if( ( pwd_fd = fopen("etc/passwd.dk","r") ) == NULL )
  {
    log("No PASSWD File.\n\r");
    exit(0);
  }

  sprintf(buf,"Searching Passwd for %s",who);
  log(buf);

  strcpy(tname,who);
  t_ptr = tname;

  for(;*t_ptr !='\0';t_ptr++)
    *t_ptr = LOWER(*t_ptr);

  while(fscanf(pwd_fd," %s %s\n",pname,passwd) > 1)
  {
    if(!strcmp(tname,pname))
    {
      sprintf(buf,"Found %s in Passwd File.",tname);
      log(buf);
      strcpy(pwd,passwd);
      return(1);
    }
  }
  return(0);
}

int GetPlayerFile( char * name, struct char_data * where )
{
  struct char_file_u tmp_store;

  if((load_char(name, &tmp_store)) > -1)  
  {
    store_to_char(&tmp_store, where);
    return(1);
  }
  return(0);
}