/* Change press enter to continue for java to place enter after. */
/* Some code taken from two other codebases - functions taken not in use */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "emlen.h"
#include "mush.h"
#ifdef WINDOWS
#include <sys\types.h>
#define FD_SETSIZE 1024
#include <winsock.h>
typedef SOCKET socket_t;
#define CLOSESOCKET(sock) while (closesocket(sock) < 0) ;



 
#include <direct.h>
// #include <mmsystem.h>
#include "telnet.h"
    WSADATA wsaData;

#else  /* We're on unix if below */

#define CLOSESOCKET(sock) close(sock)

#include <sys/types.h>
#ifdef Linux
#include <sys/time.h>
#endif
#include <ctype.h>
#include <errno.h>
#ifdef netBSD
#include <unistd.h>
#endif

/*#ifdef Linux
#include "mush.h"
#endif*/

#endif

#ifndef NEW_WORLD
char *ssc="5454a11fkk43kt34ds8xzall";
#endif

#define ASK_MAP 16097
bool action_off = FALSE;
DESCRIPTOR_DATA *descriptor_free = NULL;	/* Free list for descriptors */
DESCRIPTOR_DATA *descriptor_list = NULL;	/* All open descriptors */
DESCRIPTOR_DATA *d_next;	/* Next descriptor in loop */
//FILE *fpReserve;		/* Reserved file handle */
bool aturion_down;		/* Shutdown */
bool wizlock;			/* Game is wizlocked */
char str_boot_time[SML_LENGTH];
time_t current_time;		/* Time of this pulse */
/*
   * OS-dependent local functions.
 */
void game_loop_unix (socket_t control, int control2);
socket_t init_socket (int port);
void new_descriptor (socket_t, bool);
bool read_from_descriptor (DESCRIPTOR_DATA * d);
bool write_to_descriptor (socket_t desc, char *txt, int length);
bool write_to_descriptor2 (DESCRIPTOR_DATA * d, char *txt, int length);
/*
   * Other local functions (OS-independent).
 */
bool gr = TRUE;
bool check_parse_name (char *name, bool space_allowed);
bool check_reconnect (DESCRIPTOR_DATA * d, char *name, bool fConn);
bool check_playing (DESCRIPTOR_DATA * d, char *name);
int main (int argc, char **argv);
void handle_connecting (DESCRIPTOR_DATA * d, char *argy);
bool process_output (DESCRIPTOR_DATA * d, bool fPrompt);
void read_from_buffer (DESCRIPTOR_DATA * d);
void stop_idling (CHAR_DATA * ch);
void print_prompt (CHAR_DATA * ch);
char *anseval (const char *txt, CHAR_DATA * to);
static int area_this_reboot;
bool is_equipwipe = FALSE;

char wont_echo[] =
{
  IAC, WONT, TELOPT_ECHO, '\0'
};
#ifndef NEW_WORLD
char *sscc="32lloidjskjkrhserteruren541+2ans11dm0";
#endif
char will_echo[] =
{
  IAC, WILL, TELOPT_ECHO, '\0'
};

char wont_suppress_ga[] =
{
  IAC, WILL, TELOPT_SGA, '\0'
};

char will_suppress_ga[] =
{
  IAC, WILL, TELOPT_SGA, '\0'
};


char dontecho[] =
{
  IAC, DONT, TELOPT_ECHO, '\0'
};

char doecho[] =
{
  IAC, DO, TELOPT_ECHO, '\0'
};

char echo_off_str[] =
{
  IAC, WILL, TELOPT_ECHO, '\0'
};

char echo_on_str[] =
{
  IAC, WONT, TELOPT_ECHO, '\0'
};

char go_ahead_str[] =
{
  IAC, GA, '\0'
};

char linemode_off[] =
{
  IAC, WILL, TELOPT_SGA, '\0'
};

char linemode_on[] =
{
  IAC, WONT, TELOPT_SGA, '\0'
};


/* Windows doesn't have gettimeofday, so we'll simulate it. */
#ifdef WINDOWS

void gettimeofday(struct timeval *t, struct timezone *dummy)
{
  int millisec = GetTickCount();

  t->tv_sec = (int) (millisec / 1000);
  t->tv_usec = (millisec % 1000) * 1000;
}

#endif



char *
add_color (char *txt)
{
  int len = 0;
  char *t;
  char *r;
  char cod;
  char *ret;
  for (t = txt; *t != '\0'; t++)
    {
      if (*t == '{')
	{
	  len += 6;
	  continue;
	}
      len++;
    }
  ret = malloc (len + 1);
  r = ret;
  for (t = txt; *t != '\0'; t++)
    {
      if (*t == '{')
	{
	  if (*(t + 1) != '\0' && *(t + 2) != '\0' && *(t + 2) == '}')
	    {
	      t++;
	      cod = *t;
	      t++;
	      if (cod == 'b')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '0';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '4';
		  *r++ = 'm';
		}
	      if (cod == 'B')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '1';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '4';
		  *r++ = 'm';
		}
	      if (cod == 'g')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '0';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '2';
		  *r++ = 'm';
		}
	      if (cod == 'G')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '1';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '2';
		  *r++ = 'm';
		}
	      if (cod == 'c')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '0';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '6';
		  *r++ = 'm';
		}
	      if (cod == 'C')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '1';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '6';
		  *r++ = 'm';
		}
	      if (cod == 'b')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '0';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '4';
		  *r++ = 'm';
		}
	      if (cod == 'w')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '0';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '7';
		  *r++ = 'm';
		}
	      if (cod == 'W')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '1';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '7';
		  *r++ = 'm';
		}
	      if (UPPER (cod) == 'N')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '0';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '7';
		  *r++ = 'm';
		}
	      if (cod == 'p')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '0';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '5';
		  *r++ = 'm';
		}
	      if (cod == 'P')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '1';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '5';
		  *r++ = 'm';
		}
	      if (cod == 'd')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '1';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '0';
		  *r++ = 'm';
		}
	      if (cod == 'r')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '0';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '1';
		  *r++ = 'm';
		}
	      if (cod == 'R')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '1';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '1';
		  *r++ = 'm';
		}
	      if (cod == 'Y')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '1';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '3';
		  *r++ = 'm';
		}
	      if (cod == 'y')
		{
		  *r++ = '\x1B';
		  *r++ = '[';
		  *r++ = '0';
		  *r++ = ';';
		  *r++ = '3';
		  *r++ = '3';
		  *r++ = 'm';
		}
	      continue;
	    }
	}
      *r = *t;
      r++;
    }
  *r = '\0';
  return ret;
}

FILE *ffg;
CHAR_DATA *orn;
CHAR_DATA *smack;
CHAR_DATA *palio;

int monthly_key;


void save_monthly_key(void) {
FILE *fp;
if ( (fp=fopen("mkey.dat","w+")) == NULL ) { /* Bad! */ return;}
fprintf(fp,"%d\n",monthly_key);
fclose(fp);
return;
}



void read_monthly_key(void) {
FILE *fp;
if ( (fp=fopen("mkey.dat","r")) == NULL ) {
	monthly_key=0;
	save_monthly_key();
	return;
	}

monthly_key=fread_number(fp);
fclose(fp);
return;
}
void set_monthly_key(CHAR_DATA *ch, char *argy) {
char arg1[500];
DEFINE_COMMAND("z_monthly",set_monthly_key,POSITION_DEAD,110,LOG_ALWAYS,"Sets the monthly key.. private.")
if (str_cmp(NAME(ch),"Orin")) return;
argy=one_argy(argy,arg1);
if (arg1[0]=='\0' || !is_number(arg1)) {
	sprintf(arg1,"Monthly key now is %d.\n\r",monthly_key);
	send_to_char(arg1,ch);
	return;
	}
monthly_key=atoi(arg1);
send_to_char("Monthly key set.\n\r",ch);
save_monthly_key();
return;
}

  socket_t control;

int
main (int argc, char **argv)

{
  struct timeval now_time;
  int port;
  bool uncrypt;
  bool is_cleanup;
  bool is_skillwipe;
  static int control2;
read_monthly_key();
fprintf(stderr,"Monthly key is %d.\n",monthly_key);
  gettimeofday (&now_time, NULL);
  current_time = (time_t) now_time.tv_sec;
  strcpy (str_boot_time, ctime (&current_time));
  if (yes_log_all)
    {
      ffg = fopen ("tll.l", "a+");
    }
/* Idea borrowed from diku.. keep 1 file reserved so we don't get a super
   crash error if we run out of file descriptors! */
#ifndef WINDOWS
/*  if ((fpReserve = fopen (NULL_FILE, "r")) == NULL)
    {
      perror (NULL_FILE);
      exit (99);
    }
	*/
#endif
  area_this_reboot = 0;
  uncrypt = FALSE;
  is_cleanup = FALSE;
  is_skillwipe = FALSE;
  is_equipwipe = FALSE;
  port = 4443;
  if (argc > 1)
    {
      if (!is_number (argv[1]))
	{
	  fprintf (stderr, "%s\n", argv[1]);
	  if (!str_cmp (argv[1], "Equipmentwipe"))
	    {
	      is_equipwipe = TRUE;
	    }
	  else if (!str_cmp (argv[1], "Skillwipe"))
	    {
	      is_skillwipe = TRUE;
	    }
	  else if (!str_cmp (argv[1], "Uncrypt"))
	    {
	      uncrypt = TRUE;
	    }
	  else
	    {
	      fprintf (stderr, "Usage: %s [port #]\n", argv[0]);
	      exit (1);
	    }
	}
      else
	{
	  if (refresh_oldchars)
	    port = 4443;
	  else if (is_equipwipe)
	    port = 4443;
	  else if ((port = atoi (argv[1])) <= 1)
	    {
	      fprintf (stderr, "Invalid (%d) Port number must be above 1.\n", port);
	      exit (1);
	    }
	}
    }

  if (port > 10000)
    {
      port -= 10000;
      builder_port = TRUE;
    }
  boot_db ();
  control = init_socket (port);
/*control2 = init_socket( port+1 ); */
  fBootDb = FALSE;

  if (uncrypt)
    {
      PLAYERBASE_DATA *playerbase;
      char buffy[500];
      fprintf (stderr, "Uncrypting all player files...\n");
      sprintf (buffy, "cd %s", PLAYER_DIR_2);
      system (buffy);
      for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next)
	{
	  unjumble (capitalize (playerbase->player_name), TRUE);
	}
      exit (1);
    }
  if (is_equipwipe)
    {
      PLAYERBASE_DATA *playerbase;
      CHAR_DATA *ch;
      SINGLE_OBJECT *obj;
      int i;
      SINGLE_OBJECT *obj_next;
      char buffy[500];
      fprintf (stderr, "Removing equipment from all player files...\n");
      sprintf (buffy, "cd %s", PLAYER_DIR_2);
      system (buffy);
      for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next)
	{
	  if (!load_char_obj (NULL, capitalize (playerbase->player_name), TRUE))
	    {
	      fprintf (stderr, "Couldn't find player '%s'... oh well.\n", playerbase->player_name);
	      continue;
	    }
	  ch = pedit_found;
	  for (obj = ch->carrying; obj != NULL; obj = obj_next)
	    {
	      obj_next = obj->next_content;
	      obj_from (obj);
	    }
	  ch->carrying = NULL;
	  for (i = 0; i < MAXST; i++)
	    {
	      ch->pcdata->storage[i] = NULL;
	    }
	  save_char_obj (ch);
	  fprintf (stderr, "Nuked all equipment on '%s'...\n", playerbase->player_name);
	}
      exit (1);
    }
  if (is_skillwipe)
    {
      PLAYERBASE_DATA *playerbase;
      CHAR_DATA *ch;
      int i;
      char buffy[500];
      fprintf (stderr, "Removing all skills/spells from all player files...\n");
      sprintf (buffy, "cd %s", PLAYER_DIR_2);
      system (buffy);
      for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next)
	{
	  if (!load_char_obj (NULL, capitalize (playerbase->player_name), TRUE))
	    {
	      fprintf (stderr, "Couldn't find player '%s'... oh well.\n", playerbase->player_name);
	      continue;
	    }
	  ch = pedit_found;
	  for (i = 0; i < SKILL_COUNT; i++)
	    ch->pcdata->learned[i] = -100;
	  save_char_obj (ch);
	  fprintf (stderr, "Nuked all skills/spells on '%s'...\n", playerbase->player_name);
	}
      exit (1);
    }
  sprintf (log_buf, "EmlenMud is now accepting connections on port %d.", port);
  log_string (log_buf);
  game_loop_unix (control, 0 /*control2 */ );
  CLOSESOCKET(control); /* close? */
/*close( control2 ); */
/*
   * That's all, folks.
 */
  log_string ("Normal termination of game.");
  exit (0);
  return 0;
}


#ifdef WINDOWS

void nonblock(socket_t s)
{
  long val;

  val = 1;
  ioctlsocket(s, FIONBIO, &val);
  return;
}

#else

#ifndef O_NONBLOCK
#define O_NONBLOCK O_NDELAY
#endif

void nonblock(socket_t s)
{
  int flags;

  flags = fcntl(s, F_GETFL, 0);
  flags |= O_NONBLOCK;
  if (fcntl(s, F_SETFL, flags) < 0) {
    fprintf(stderr,"Fatal error executing nonblock (comm.c)");
    exit(1);
  }
}

#endif

socket_t
init_socket (int port)
{
  static struct sockaddr_in sa_zero;
  struct sockaddr_in sa;
  int x = 1;
  socket_t fd;

  #ifdef WINDOWS
  {
    short wVersionRequested;


    wVersionRequested = MAKEWORD(1, 1);

    if (WSAStartup(wVersionRequested, &wsaData) != 0) {
      log("WinSock not available!\n");
      exit(1);
    }

    if ((fd = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
      fprintf(stderr, "Error opening network connection: Winsock err #%d\n", WSAGetLastError());
      exit(1);
    }
  }
#else
  if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
    {
      perror ("Init_socket: socket");
      exit (1);
    }  
#endif		
  
#if defined(SO_REUSEADDR)
  if (setsockopt (fd, SOL_SOCKET, SO_REUSEADDR,
		  (char *) &x, sizeof (x)) < 0)
    {
      perror ("Init_socket: SO_REUSEADDR");
      CLOSESOCKET(fd);
      exit (1);
    }
#endif

#if defined(SO_DONTLINGER) && !defined(SYSV)
  {
    struct linger ld;
    ld.l_onoff = 1;
    ld.l_linger = 1000;
    if (setsockopt (fd, SOL_SOCKET, SO_LINGER,
		    (char *) &ld, sizeof (ld)) < 0)
      {
	perror ("Init_socket: SO_DONTLINGER");
	CLOSESOCKET(fd);
	exit (1);
      }
  }
#endif
  sa = sa_zero;
  sa.sin_family = AF_INET;
  sa.sin_port = htons (port);
  if (bind (fd, (struct sockaddr *) &sa, sizeof (sa)) < 0)
    {
      perror ("Init_socket: bind");
      CLOSESOCKET(fd);
      exit (1);
    }

nonblock(fd);

  if (listen (fd, 3) < 0)
    {
      perror ("Init_socket: listen");
      CLOSESOCKET(fd); /* close? */
      exit (1);
    }
  return fd;
}

static fd_set in_set;
static fd_set out_set;
static fd_set exc_set;
socket_t main_control;

void
game_loop_unix (socket_t control, int control2)
{
  static struct timeval null_time;
  struct timeval last_time;
#ifndef WINDOWS
  signal (SIGPIPE, SIG_IGN);
#endif
  gettimeofday (&last_time, NULL);
  main_control = control;
  current_time = (time_t) last_time.tv_sec;
  null_time.tv_sec = 0;
  null_time.tv_usec = 400;
  while (!aturion_down)
    {
      /*static */ DESCRIPTOR_DATA *d;
      static socket_t maxdesc;
      /*
         * Poll all active descriptors.
       */
      FD_ZERO (&in_set);
      FD_ZERO (&out_set);
      FD_ZERO (&exc_set);
      FD_SET (control, &in_set);
      /*FD_SET( control2, &in_set ); */
      maxdesc = control;
      for (d = descriptor_list; d; d = d->next)
	{
#ifndef WINDOWS
	  maxdesc = UMAX (maxdesc, d->descriptor);
	  maxdesc = UMAX (maxdesc, d->auth_fd);
#endif
	  FD_CLR (d->descriptor, &in_set);
	  FD_SET (d->descriptor, &in_set);
	  FD_SET (d->descriptor, &out_set);
	  FD_SET (d->descriptor, &exc_set);
	}
      null_time.tv_usec = 100;
      if (select (maxdesc + 10, &in_set, &out_set, &exc_set, &null_time) < 0)
	{
	  perror ("Game_loop: select: poll");
	  exit (1);
	}


      /*if ( FD_ISSET( control2, &in_set ))
         new_descriptor( control2, TRUE );
         else */
      if (FD_ISSET (control, &in_set))
	new_descriptor (control, FALSE);
/* HERE */

      for (d = descriptor_list; d != NULL; d = d_next)
	{
	  d_next = d->next;
	  if (d->timeout_counter < 2 && d->timeout_counter > -50)
	    {
	      d->outtop = 0;
	      write_to_descriptor2 (d, "\n\r[Connection Timed Out]\n\r", 0);
	      close_socket (d);
	      break;
	    }
	  if (FD_ISSET (d->descriptor, &exc_set))
	    {
	      FD_CLR (d->descriptor, &in_set);
	      FD_CLR (d->descriptor, &out_set);
	      if (d->character && d->connected <= 0 &&
		  !(d->character->pcdata->perm_str == 12 &&
		    d->character->pcdata->perm_int == 12 &&
		    d->character->pcdata->perm_wis == 12 &&
		    d->character->pcdata->perm_con == 12 &&
		    d->character->pcdata->perm_dex == 12))
		save_char_obj (d->character);
	      d->outtop = 0;
	      close_socket (d);
	      continue;
	    }
#ifndef WINDOWS
#ifndef NO_AUTH
	  if ((d->auth_fd == -1) && (d->atimes < 500) && !str_cmp (d->username, "unknown-"))
	    {
	      start_auth (d);
	      continue;
	    }
	  if (d->auth_fd == -1)
	    continue;
	  if (IS_SET (d->auth_state, WRITE_AUTH))
	    {
	      send_auth (d);
	      continue;
	    }
	  read_auth (d);
#endif
#endif
	}

/* Grab Input */
/*		temp_time[INTERPRETTED]=mytime();*/
      for (d = descriptor_list; d != NULL; d = d_next)
	{
	  d_next = d->next;
	  d->tpcommand = FALSE;
	  if (d->character)
	    {
	      if (IS_PLAYER (d->character))
		{
		  if (d->character->pcdata->tickcounts > 0)
		    d->character->pcdata->tickcounts--;
		  if (d->character->pcdata->tickcounts < 0)
		    d->character->pcdata->tickcounts = 0;

	      	if (d->pic_wait > 0) {
			d->pic_wait--;
			} else if (d->pic_wait==0) {
			java_show_mob_window_pic(d->character);
			d->pic_wait=-1;
			}

		}

	      if (d->character->wait > 0)
		{
		  if (LEVEL (d->character) > 99 && !IS_SET (d->character->pcdata->act2, PLR_HOLYLAG))
		    d->character->wait = 0;
		  else
		    {
		      d->character->wait--;
		      continue;
		    }
		}
	      {
		CHAR_DATA *ch;
		ch = d->character;
		if (d->character && d->character->in_room && d->character->pcdata && ch->pcdata->tickcounts < 1)
		  {
		    if (ch->position == POSITION_CIRCLE)
		      {
			do_actual_circle (ch, "Noarg");
			free_temp (ch);
		      }
		    if (ch->position == POSITION_INVEST && ch->pcdata->temp)
		      {
			do_actual_investigate (ch, ch->pcdata->temp->temp_string);
			NEW_POSITION(ch, POSITION_STANDING);
			free_temp (ch);
		      }
		    if (ch->position == POSITION_BACKSTAB && ch->pcdata->temp)
		      {
			do_actual_backstab (ch, ch->pcdata->temp->temp_string);
			ch->wait = 8;
			NEW_POSITION(ch,POSITION_FIGHTING);
			free_temp (ch);
		      }
		    if (ch->position == POSITION_SEARCHING && ch->pcdata->temp)
		      {
			do_actual_search (ch, ch->pcdata->temp->temp_string);
			NEW_POSITION(ch, POSITION_STANDING);
			free_temp (ch);
		      }
		    if (ch->pcdata->voting_on == 999)
		      {
			do_track_t (ch, "continue");
			ch->pcdata->voting_on = 10;
		      }
		    if (ch->position == POSITION_CASTING && ch->pcdata->temp)
		      {
			ch->wait = 0;
			do_actual_cast (ch, ch->pcdata->temp->temp_string);
			NEW_POSITION(ch, POSITION_STANDING);
			free_temp (ch);
		      }
		  }
		/*End if tickcounts<1 */
		if (FIGHTING (ch) == NULL && ch->position == POSITION_FIGHTING)
		  NEW_POSITION(ch, POSITION_STANDING);
	      }
	    }
	  /*End if d->character */
	  if (FD_ISSET (d->descriptor, &in_set))
	    {
	      if (d->timeout_counter > 0)
		d->timeout_counter--;
	      if (d->character != NULL)
		d->character->timer = 0;
	      if (!read_from_descriptor (d))
		{
		  FD_CLR (d->descriptor, &out_set);
		  if (d->character != NULL && d->connected <= 0 &&
		      !(d->character->pcdata->perm_str == 12 &&
			d->character->pcdata->perm_int == 12 &&
			d->character->pcdata->perm_wis == 12 &&
			d->character->pcdata->perm_con == 12 &&
			d->character->pcdata->perm_dex == 12))
		    save_char_obj (d->character);
		  if (d->character && d->character->in_room)
		    {
		      act ("$n has lost link.", d->character, NULL, NULL, TO_CHAR);
		    }
		  d->outtop = 0;
		  close_socket (d);
		  continue;
		}
	    }

	  read_from_buffer (d);
	  if (d->incomm[0] != '\0')
	    {
	      d->tpcommand = TRUE;
	      stop_idling (d->character);
	      if (d->character && d->character->pcdata && d->character->pcdata->tickcounts > 0)
		{
		  switch (d->character->position)
		    {
		    case POSITION_INVEST:
		      send_to_char ("You stop your investigation.\n\r", d->character);
		      d->character->pcdata->tickcounts = 0;
		      NEW_POSITION(d->character, POSITION_STANDING);
		      break;
		    case POSITION_SEARCHING:
		      send_to_char ("You stop your search.\n\r", d->character);
		      d->character->pcdata->tickcounts = 0;
		      NEW_POSITION(d->character, POSITION_STANDING);
		      break;
		    case POSITION_CASTING:
		      send_to_char ("You stop casting.\n\r", d->character);
		      d->character->pcdata->tickcounts = 0;
		      NEW_POSITION(d->character, POSITION_STANDING);
		      break;
		    case POSITION_CIRCLE:
		      send_to_char ("You stop circling.\n\r", d->character);
		      d->character->pcdata->tickcounts = 0;
		      NEW_POSITION(d->character, POSITION_FIGHTING);
		      break;
		    case POSITION_BACKSTAB:
		      send_to_char ("You stop your approach.\n\r", d->character);
		      d->character->pcdata->tickcounts = 0;
		      NEW_POSITION(d->character, POSITION_STANDING);
		      break;
		    }
		}
	      /*End if user was doing an action */
	      if (d->pString != NULL)
		{
		  string_add (d->character, d->incomm);
		}
	      else if (d->showstr_point)
		{
		  show_string (d, d->incomm);
		}
	      else {
		switch (d->connected)
		  {
		  case CON_SOCEDIT:
		    soc_edit (d->character, d->incomm);
		    break;
		  case CON_GODMENU:
		    menu_interp (d->character, d->incomm);
		    break;
		  case CON_PLAYING:
		    interpret (d->character, d->incomm);
		    break;
		  case CON_RWHO:
		    interpret (d->character, d->incomm);
		    break;
		  case CON_AEDITOR:
		    aedit (d->character, d->incomm);
		    break;
		  case CON_SEDITOR:
		    sedit (d->character, d->incomm);
		    break;
		  case CON_SCRIPTEDITOR:
		    scriptedit (d->character, d->incomm);
		    break;
		  case CON_PEDITOR:
		    pedit (d->character, d->incomm);
		    break;
		  case CON_REDITOR:	/*For Builders */
		    redit (d->character, d->incomm);
		    break;
		  case CON_OEDITOR:
		    oedit (d->character, d->incomm);
		    break;
		  case CON_MEDITOR:
		    medit (d->character, d->incomm);
		    break;
		  case CON_CEDITOR:
		    cedit (d->character, d->incomm);
		    break;
		  case CON_CHANNELD:
		    serv (d, d->incomm);
		    break;
		  default:
		    handle_connecting (d, d->incomm);
		    break;
		  }
		}
	      d->incomm[0] = '\0';
	    }
	}
      /*End if user typed something */
      /*
         * Autonomous game motion.
       */
/*		this_time[INTERPRETTED]=mytime()-temp_time[INTERPRETTED];
		total_time[INTERPRETTED]+=this_time[INTERPRETTED];*/
		times_through[INTERPRETTED]++;

  MARK_DEBUG("B4 upd_handlr")
	/*	temp_time[ALL_UPD]=mytime();*/
      update_handler ();
		/*this_time[ALL_UPD]=mytime()-temp_time[ALL_UPD];
		total_time[ALL_UPD]+=this_time[ALL_UPD];*/
		times_through[ALL_UPD]++;
  MARK_DEBUG("Aftr upd_handlr")
      /*
         * Output.
       */
      for (d = descriptor_list; d != NULL; d = d_next)
	{
	  if (!d->next)
	    d_next = NULL;
	  else
	    d_next = d->next;
	  if (!d->descriptor)
	    continue;
	  if (d->timeout_counter > -3)
	    d->timeout_counter--;
	  if ((d->tpcommand || d->outtop > 0)
	      && FD_ISSET (d->descriptor, &out_set))
	    {
	      if (!process_output (d, TRUE))
		{
		  if (d->character != NULL && d->connected == CON_PLAYING &&
		      !(d->character->pcdata->perm_str == 12 &&
			d->character->pcdata->perm_int == 12 &&
			d->character->pcdata->perm_wis == 12 &&
			d->character->pcdata->perm_con == 12 &&
			d->character->pcdata->perm_dex == 12))
		    save_char_obj (d->character);
		  d->outtop = 0;
		  close_socket (d);
		  continue;
		}
	    }
	}

    {
	struct timeval now_time;
	long secDelta;
	long usecDelta;
	gettimeofday (&now_time, NULL);
	usecDelta = ((int) last_time.tv_usec) - ((int) now_time.tv_usec)
	  + 1000000 / (PULSE_PER_SECOND);
	secDelta = ((int) last_time.tv_sec) - ((int) now_time.tv_sec);
	while (usecDelta < 0)
	  {
	    usecDelta += 1000000;
	    secDelta -= 1;
	  }
	while (usecDelta >= 1000000)
	  {
	    usecDelta -= 1000000;
	    secDelta += 1;
	  }
	if (secDelta > 0 || (secDelta == 0 && usecDelta > 0))
	  {
	    struct timeval stall_time;
	    stall_time.tv_usec = usecDelta;
	    stall_time.tv_sec = secDelta;
		#ifdef WINDOWS
        Sleep(stall_time.tv_sec * 1000 + stall_time.tv_usec / 1000);
		#else
	    if (select (0, NULL, NULL, NULL, &stall_time) < 0)
	      {
		perror ("Game_loop: select: stall");
		exit (1);
	      }
		#endif
	  }
      }
      gettimeofday (&last_time, NULL);
      current_time = (time_t) last_time.tv_sec;
    }
  return;
}

DESCRIPTOR_DATA *
new_sdesc (socket_t desc)
{
  int i;
  DESCRIPTOR_DATA *dnew;
#if !defined(FNDELAY)
#define FNDELAY O_NDELAY
#endif

  nonblock(desc);
  /*
  if (fcntl (desc, F_SETFL, FNDELAY) == -1)
    {
      perror ("New_descriptor: fcntl: FNDELAY");
      return NULL;
    }
*/

  if (descriptor_free == NULL)
    {
      dnew = mem_alloc (sizeof (*dnew));
    }
  else
    {
      dnew = descriptor_free;
      descriptor_free = descriptor_free->next;
    }
  i = sizeof (*dnew);
  bzero (dnew, i);
  dnew->descriptor = desc;
  dnew->connected = CON_CHANNELD;
  dnew->character = NULL;
  dnew->showstr_head = NULL;
  dnew->showstr_point = NULL;
  dnew->abuf[0] = '\0';
  dnew->hostname = &str_empty[0];
  dnew->atimes = 0;
  dnew->auth_fd = -1;
  dnew->auth_state = 0;
  dnew->auth_inc = 0;
  dnew->username = str_dup ("unknown");
  dnew->timeout_counter = -100;
  dnew->outsize = 2000;
  dnew->pEdit = NULL;
  dnew->insert = FALSE;
  dnew->snoop_by = NULL;
  dnew->host[0] = '\0';
  dnew->original = NULL;
  dnew->hosttwo[0] = '\0';
  dnew->inbuf[0] = '\0';
  dnew->incomm[0] = '\0';
  dnew->inlast[0] = '\0';
  dnew->repeat = 0;
  dnew->pEdit = NULL;
  dnew->outtop = 0;
  dnew->location = 0;
  dnew->max_outbuf = 1000;
  dnew->pString = NULL;
  dnew->outbuf = mem_alloc (1001);
  dnew->outbuf[0] = '\0';
  dnew->wrong_pw = FALSE;
  dnew->next = descriptor_list;
  descriptor_list = dnew;
  return dnew;
}

void
new_descriptor (socket_t control, bool second_port)
{
  static DESCRIPTOR_DATA d_zero;
  char buf[STD_LENGTH];
  DESCRIPTOR_DATA *dnew;
  int jj = 0;
  BAN_DATA *pban;
  char *t;
  int i;
  DESCRIPTOR_DATA *dd;
  struct sockaddr_in sock;
  struct hostent *from;
  static socket_t desc;
  int size;
  MARK_DEBUG("New Descriptor")
  size = sizeof (sock);
  getsockname (control, (struct sockaddr *) &sock, &size);
  if ((desc = accept (control, (struct sockaddr *) &sock, &size)) < 0)
    {
      perror ("New_descriptor: accept");
      return;
    }
#if !defined(FNDELAY)
#define FNDELAY O_NDELAY
#endif
  
  nonblock(desc);
  
  /*
  if (fcntl (desc, F_SETFL, FNDELAY) == -1)
    {
      perror ("New_descriptor: fcntl: FNDELAY");
      return;
    }
*/

  if (descriptor_free == NULL)
    {
      dnew = mem_alloc (sizeof (*dnew));
      max_connected++;
    }
  else
    {
      dnew = descriptor_free;
      descriptor_free = descriptor_free->next;
    }
  *dnew = d_zero;
  i = sizeof (*dnew);
  bzero (dnew, i);
  dnew->java	= FALSE;
  dnew->pic_wait = PIC_WAIT;
  dnew->descriptor = desc;
  dnew->connected = CON_SHOW_TITLE;
  dnew->character = NULL;
  dnew->showstr_head = NULL;
  dnew->showstr_point = NULL;
  dnew->abuf[0] = '\0';
  dnew->hostname = &str_empty[0];
  dnew->atimes = 0;
  dnew->auth_fd = -1;
  dnew->auth_state = 0;
  dnew->auth_inc = 0;
  dnew->username = str_dup ("unknown");
  dnew->timeout_counter = 375;
  dnew->outsize = 2000;
  dnew->pEdit = NULL;
  dnew->insert = FALSE;
  dnew->snoop_by = NULL;
  dnew->host[0] = '\0';
  dnew->original = NULL;
  dnew->hosttwo[0] = '\0';
  dnew->inbuf[0] = '\0';
  dnew->incomm[0] = '\0';
  dnew->inlast[0] = '\0';
  dnew->repeat = 0;
  dnew->pEdit = NULL;
  dnew->outtop = 0;
  dnew->location = 0;
  dnew->max_outbuf = 800;
  dnew->host[29] = '\0';
  dnew->pString = NULL;
  dnew->outbuf = mem_alloc (801);
  dnew->outbuf[0] = '\0';
  dnew->connected = 947;
  /*dnew->connected = CON_STATE_ONE;*/
  dnew->wrong_pw = FALSE;
  dnew->timeout_counter = 375;
  for (dd = descriptor_list; dd != NULL; dd = dd->next)
    jj++;
  for (dd = descriptor_list; dd != NULL; dd = dd->next)
    {
      if (dd->next == dd)
	{
	  fprintf (stderr, "BAD ERROR!! 2.\n");
	  dd->next = NULL;
	}
      if (dd == dnew)
	{
	  fprintf (stderr, "REPEATING BUG!!!!\n");
	  goto kkkk;
	}
    }
  dnew->next = descriptor_list;
  descriptor_list = dnew;
kkkk:
#ifdef WINDOWS
  if (jj > wsaData.iMaxSockets-4)
#else
	if (jj > 200)
#endif
    {
      fprintf(stderr,"Limit of 200 simultaneous connections exceeded.\n");
      CLOSESOCKET(desc);
      close_socket (dnew);
      return;
    }
  size = sizeof (sock);
  if (getpeername (desc, (struct sockaddr *) &sock, &size) < 0)
    {
      perror ("New_descriptor: getpeername");
      strcpy (dnew->host, "(unknown)");
      strcpy (dnew->hosttwo, "(unknown)");
    }
  else
    {
      int addr;
      addr = ntohl (sock.sin_addr.s_addr);
      sprintf (buf, "%d.%d.%d.%d",
	       (addr >> 24) & 0xFF, (addr >> 16) & 0xFF,
	       (addr >> 8) & 0xFF, (addr) & 0xFF
	);
      sprintf (log_buf, "%d.%d.%d",
	       (addr >> 24) & 0xFF, (addr >> 16) & 0xFF,
	       (addr >> 8) & 0xFF
	);

 if (!str_prefix("156.56",buf)) {
	int i;
	int j;
	int k;
	int l;
	i=number_range(127,128);
	j=number_range(14,16);
	k=number_range(185,199);
	l=number_range(1,199);
	sprintf(buf,"%d.%d.%d.%d",i,j,k,l);
	sprintf(log_buf,"%d.%d.%d",i,j,k);
	}
      strcpy (dnew->hosttwo, log_buf);
      sprintf (log_buf, "Notify> New connection: %s", buf);
      NOTIFY (log_buf, LEVEL_IMMORTAL, WIZ_NOTIFY_LOGIN);
      strcpy (dnew->host, buf);

      if (str_prefix ("149.159", dnew->host) && str_prefix ("140.226.1", dnew->host))
	fprintf (stderr, "%s\n", log_buf);
/*     from = gethostbyaddr( (char *) &sock.sin_addr,
   sizeof(sock.sin_addr), AF_INET );
 */
      dnew->hostname = str_dup ( /*from ? from->h_name : */ "not.looked.up");
    }
/*Check if the site is banned */
  if ((str_cmp ("134.129.119.7", dnew->host) && str_cmp ("134.129.119.13", dnew->host) &&
       str_cmp ("134.129.119.14", dnew->host) && str_cmp ("134.129.119.15", dnew->host))
      &&
      (!str_prefix ("199.17.", dnew->host) || !str_prefix ("134.129", dnew->host) ||
       !str_prefix ("129.89.", dnew->host) || !str_prefix ("137.110", dnew->host) ||
       !str_prefix ("192.135", dnew->host) || !str_prefix ("193.232", dnew->host) ||
       !str_prefix ("204.77", dnew->host) ||
       !str_prefix ("192.107", dnew->host)))
    {
      close (desc);
      close_socket (dnew);
      return;
    }
  if (str_prefix ("149.159", dnew->host) && str_prefix ("140.226.1", dnew->host))
    {
      for (pban = ban_list; pban != NULL; pban = pban->next)
	{
	  if (pban->newbie == FALSE &&
	      (!str_prefix (pban->name, dnew->host) || !str_suffix (pban->name, dnew->host)))
	    {
	      fprintf (stderr, "Banned host just attempted login.\n");
	      write_to_descriptor (desc,
			 "Your site has been banned from this Mud.\n\r", 0);
	      close (desc);
	      close_socket (dnew);
	      return;
	    }
	}
    }

  if (0 && second_port)
    {
      dostuff (dnew);
      dnew->inbuf[0] = '\0';
      dnew->host[29] = 1;
    }
#ifndef WINDOWS
#ifndef NO_AUTH
  start_auth (dnew);
#endif
#endif

#ifdef NEW_WORLD
write_to_buffer(dnew,"Press Enter if you are not using the Java client.\n\r",0);
#else
#define FOUNDER "Gardenia"
/*{
char qqq[500];
write_to_buffer(dnew,"Welcome to the mud!  Codebase by Owen Emlen (oemlen@indiana.edu).\n\r",0);
sprintf(qqq,"Head Administrators: %s.\n\rThis mud's chief founder is %s.\n\r",
	pow.gods,FOUNDER); 
write_to_buffer(dnew,qqq,0);
}*/
write_to_buffer(dnew,"\n\rPress Enter to log in...",0);
#endif
  return;
}

void
close_socket (DESCRIPTOR_DATA * dclose)
{
  CHAR_DATA *ch;
  int tt;
  MARK_DEBUG("Close_socket")
  for (tt = 0; tt < 5; tt++)
    {
      if (connectiond[tt] == dclose)
	{
	  connectiond[tt] = NULL;
	  outgoing[tt] = 0;
	  connection_names[tt][0] = '\0';
	}
    }
  if (dclose->character && dclose->character->pcdata->name &&
      !str_cmp (dclose->character->pcdata->name, "Palio"))
    palio = NULL;
  if (dclose->character && dclose->character->pcdata->name &&
      !str_cmp (dclose->character->pcdata->name, "Smack"))
    smack = NULL;
  if (dclose->character && dclose->character == debugger)
    debugger = NULL;
  if (dclose->character && dclose->character->pcdata->name &&
      !str_cmp (dclose->character->pcdata->name, "Orin"))
    orn = NULL;

  if (dclose->descriptor < 1)
    return;

  if (dclose->outtop > 0)
    process_output (dclose, FALSE);
  if (dclose->snoop_by != NULL)
    {
      write_to_buffer (dclose->snoop_by,
		       "Your victim has left this world for now.\n\r", 0);
    }
  {
    DESCRIPTOR_DATA *d;
    for (d = descriptor_list; d != NULL; d = d->next)
      {
	if (d->snoop_by == dclose)
	  d->snoop_by = NULL;
      }
  }
  if ((ch = dclose->character) != NULL && dclose->descriptor > 0 && ch->data_type != 50)
    {
      sprintf (log_buf, "Closing link to %s.", ch->pcdata->name);
      if (dclose->connected < CON_PLAYING)
	dclose->connected = CON_PLAYING;
      if (dclose->connected == CON_PLAYING)
	{
	  act ("$n has lost $s link.", ch, NULL, NULL, TO_ROOM);
	  ch->desc = NULL;
	}
      else
	{
	  CHAR_DATA *tch;
	  ch->desc = NULL;
	  for (tch = char_list; tch != NULL; tch = tch->next)
	    if (tch == ch)
	      goto skippy;
	  if (dclose->character && IS_PLAYER (dclose->character))
	    {
	      quit_flag=TRUE;
		free_it (dclose->character);
	      quit_flag=FALSE;
	      dclose->character = NULL;
	    }
	skippy:
		if (ch) {};
	}
    }
  if (d_next == dclose)
    d_next = d_next->next;
  if (dclose == descriptor_list)
    {
      descriptor_list = descriptor_list->next;
    }
  else
    {
      DESCRIPTOR_DATA *d;
      for (d = descriptor_list; d && d->next != dclose; d = d->next)
	;
      if (d != NULL)
	d->next = dclose->next;
      else
	bug ("Close_socket: dclose not found.", 0);
    }
  close (dclose->descriptor);
  if (dclose->auth_fd != -1)
    close (dclose->auth_fd);
  dclose->character = NULL;
  dclose->descriptor = -1;	/*Mark this descriptor as NEVER POLL */
  if (dclose->outbuf)
    free_m (dclose->outbuf);
  dclose->outbuf = NULL;
  dclose->max_outbuf = 0;
  free_string (dclose->username);
  dclose->username = &str_empty[0];
  free_string (dclose->hostname);
  dclose->hostname = &str_empty[0];
/*free_string(dclose->showstr_head);
   dclose->showstr_head=NULL;
   free_string(dclose->showstr_point);
   dclose->showstr_point=NULL;
 */
  dclose->next = descriptor_free;
  descriptor_free = dclose;
/*free_m(dclose); */
  return;
}

/*
   * Transfer one line from input buffer to input line.
 */
void
read_from_buffer (DESCRIPTOR_DATA * d)
{
  int i, j, k;			/*, changed; */
  char fix_inbuf[2000];
  int ct;
  char *t;
  char *cmd;
  char *cc2;
  char *ll;
/*
   * Hold horses if pending command already.
 */
  if (d->incomm[0] != '\0')
    return;
/*
   * Look for at least one new line.
 */
if (strlen(d->inbuf)>398) {
	d->incomm[0]='\0';
	d->inbuf[0]='\0';
	fprintf(stderr,"Debug: Strlen>398\n");
	return;
	}
  for (i = 0; i < 1000 && d->inbuf[i] != '\n' && d->inbuf[i] != '\r'; i++)
    {
      if (d->inbuf[i] == '\0')
	return;
    }
  if (i > 990)
    {
      fprintf (stderr, "Over 990 chars on the line in read_from_buffer.\n");
      close_socket (d);
      return;
    }

  if (0 && d->host[29] == 1)
    {
      ct = 0;
      for (t = d->inbuf; *t != '\0'; t++)
	{
/*	  while (*t == '\b' || *t == 16 || *t == 127)
	    {
	      if (ct > 0)
		ct--;
	      t++;
	      if (*t == '\0')
		goto dn;
	    }*/
	  if (d->connected == CON_STATE_ONE && *t != '\0' && *t != 32 && *t != 13 && (*t < 'A' || *t > 'z'))
	    continue;
	  fix_inbuf[ct] = *t;
	  ct++;
	  fix_inbuf[ct] = '\0';
	}
    dn:
      fix_inbuf[ct] = '\0';
      strcpy (d->inbuf, fix_inbuf);
    }

  if (d->character && d->connected <= CON_PLAYING)
    {
      if (strlen(d->inbuf)>4 && d->inbuf[0] == '#' && d->inbuf[1] >= '1' && d->inbuf[1] <= '9' && d->inbuf[2] == ' ')
	{
	  char nib[2000];
	  char *t;
	  char *t2 = nib;
	  int times = (d->inbuf[1] - '1') + 1;
	  for (t = d->inbuf + 3; *t != '\0' && *t != '~' && *t != '\n'; t++)
	    {
	      if (*t == '#')
		{
		  d->inbuf[0] = '\0';
		  return;
		}
	      *t2 = *t;
	      t2++;
	      *t2 = '\0';
	    }
	  strcat (nib, "\n\r");
	  for (; times > 1; times--)
	    {
	      strcat (d->inbuf, nib);
	    }
	  strcpy (nib, d->inbuf);
	  sprintf (d->inbuf, "%s", nib + 3);
	}
    }
  if (d->character && IS_PLAYER (d->character) &&
  d->connected <= CON_PLAYING && d->pString == NULL && d->inbuf[0] != '.' &&
      d->inbuf[0] != ']' && d->inbuf[0] != '[' && d->inbuf[0] != ';' &&
      d->inbuf[0] != ':' && d->inbuf[0] != '\'' && d->inbuf[0] != ',')
    {
      for (k = 0; k < MAXALIAS; k++)
	{
	  if (d->character->pcdata->aliasname[k] &&
	      d->character->pcdata->aliasname[k][0] != '\0' &&
	      d->character->pcdata->alias[k] &&
	      d->character->pcdata->alias[k][0] != '\0')
	    {
	      cmd = first (d->inbuf);
	      if (d->character->pcdata->aliasname[k] && cmd
		  && !str_cmp (cmd, d->character->pcdata->aliasname[k]))
		{
		  int ii;
		  int ii2;
		  char *c;
		  bool fon = FALSE;
		  char tx[5000];
		  char repl[800];
		  int rct = 0;
		  int ict = 0;
		  repl[0]='\0';
		  tx[0]='\0';
		  ii = strlen (d->inbuf);
		  cc2 = d->inbuf + strlen (cmd);
		  for (; *cc2 != '\n' && *cc2 != '\r' && *cc2 != '\0'; cc2++)
		    {
		      repl[ict] = *cc2;
		      ict++;
		      repl[ict] = '\0';
		    }
		  ii2 = strlen (repl);
		  if (repl[ii2 - 1] == '\n' || repl[ii2 - 1] == '\r')
		    repl[ii2 - 1] = '\0';
		  if (repl[ii2 - 2] == '\n' || repl[ii2 - 2] == '\r')
		    repl[ii2 - 2] = '\0';
		  strsub (d->inbuf, cmd, d->character->pcdata->alias[k]);
		  for (c = d->inbuf; *c != '\0'; c++)
		    {
		      if (*c == '%' || *c == '@')
			{
			  fon = TRUE;
			  goto ttk;
			}
		    }
		ttk:
		  if (fon)
		    {
		      ict = 0;
		      for (c = d->inbuf; *c != '\0'; c++)
			{
			  if (!str_prefix (repl, c))
			    goto duni;
			  if (*c == '%' || *c == '@')
			    {
			      tx[ict] = '\0';
			      strcat (tx, repl);
			      ict += strlen (repl);
			      continue;
			    }
			  tx[ict] = *c;
			  ict++;
			  tx[ict] = '\0';
			}
		    duni:
		      tx[ict] = '\0';
		      strcpy (d->inbuf, tx);
		      ii = strlen (d->inbuf);
		      if (d->inbuf[ii - 1] != '\n' && d->inbuf[ii - 1] != '\r')
			{
			  d->inbuf[ii] = '\n';
			  d->inbuf[ii + 1] = '\0';
			}
		    }
		  break;
		}
	    }
	}
    }
  for (ll = d->inbuf; *ll != '\0'; ll++)
    if (*ll == '~')
      *ll = '\n';
  for (i = 0, k = 0; d->inbuf[i] != '\n' && d->inbuf[i] != '\r'; i++)
    {
      if (i >= 450)
	{
	  write_to_descriptor (d->descriptor, "Line too long.\n\r", 0);
	  fprintf (stderr, "Line too long!");
	  /* skip the rest of the line */
	  for (; d->inbuf[i] != '\0'; i++)
	    {
	      if (d->inbuf[i] == '\n' || d->inbuf[i] == '\r')
		break;
	    }
	  d->inbuf[i] = '\n';
	  d->inbuf[i + 1] = '\0';
	  break;
	}
      if (find_connection_num (d) >= 0)
	{
	  d->incomm[k++] = d->inbuf[i];
	}
      else if (d->inbuf[i] == '\b' && k > 0)
	--k;
      else if ((isascii (d->inbuf[i]) && isprint (d->inbuf[i])))
	/*|| (d->connected!=CON_PLAYING && d->inbuf[i]>0 && d->inbuf[i]<5) */
	d->incomm[k++] = d->inbuf[i];
    }
/*
   * Finish off the line.
 */
  if (k == 0)
    d->incomm[k++] = ' ';
  d->incomm[k] = '\0';
  if (k > 1 || d->incomm[0] == '!')
    {
      if (d->incomm[0] != '!' && strcmp (d->incomm, d->inlast))
	{
	  d->repeat = 0;
	}
      else
	{
	  if (d->incomm[0] == '!')
	    {
	      if (!str_prefix ("go", d->inlast))
		d->repeat += 8;	/*gossip */
	      if (!str_prefix ("say", d->inlast))
		d->repeat += 8;	/*say */
	      if (!str_prefix ("te", d->inlast))
		d->repeat += 8;	/*tell */
	      if (!str_prefix ("ye", d->inlast))
		d->repeat += 8;	/*yell */
	      if (!str_prefix ("sh", d->inlast))
		d->repeat += 8;	/*shout */
	      if (!str_prefix ("pray", d->inlast))
		d->repeat += 8;	/*pray */
	    }
	  if (++d->repeat >= 25)
	    {
	      if (!str_prefix ("go", d->inlast))
		d->repeat += 100;
	      if (!str_prefix ("say", d->inlast))
		d->repeat += 100;
	      if (!str_prefix ("te", d->inlast))
		d->repeat += 100;
	      if (!str_prefix ("ye", d->inlast))
		d->repeat += 100;
	      if (!str_prefix ("sh", d->inlast))
		d->repeat += 100;
	      if (!str_prefix ("pray", d->inlast))
		d->repeat += 100;
	      if (d->character != NULL && IS_PLAYER (d->character))
		{
		  if (d->repeat > 100)
		    {
		      send_to_char ("Don't SPAM the channels!!\n\r", d->character);
		      sprintf (log_buf, "%s channel-input spamming!", d->host);
		      log_string (log_buf);
		      /*SET_BIT(d->character->act2,PLR_SILENCE); */
		    }
		  d->repeat = 15;
		  send_to_char ("You have been delayed for 3 seconds for spamming so much.\n\r", d->character);
		  d->character->wait = 75;
		}
	    }
	}
    }
/*
   * Do '!' substitution.
 */
  if (d->incomm[0] == '!' && d->connected != 5)
    strcpy (d->incomm, d->inlast);
  else if (strlen (d->incomm) > 2)
    strcpy (d->inlast, d->incomm);
/*
   * Shift the input buffer.
 */
  while (d->inbuf[i] == '\n' || d->inbuf[i] == '\r')
    i++;
  for (j = 0; (d->inbuf[j] = d->inbuf[i + j]) != '\0'; j++)
    ;
  return;
}

void
write_stat_stuff (CHAR_DATA * ch)
{
  char buf[500];
  send_to_char ("\n\r\x1B[2J\x1B[1;1fNow you may fine-tune your stats.  Here are some examples of the format:\n\r", ch);
  send_to_char ("+2s (adds 2 strength)  +1c (adds 1 constitution)  -4d (subtracts 4 dex)\n\r\n\r", ch);
  sprintf (buf, "Current: Str: %d  Con: %d  Dex: %d  Int: %d  Wis: %d\n\r",
	   ch->pcdata->perm_str, ch->pcdata->perm_con, ch->pcdata->perm_dex,
	   ch->pcdata->perm_int, ch->pcdata->perm_wis);
  send_to_char (buf, ch);
  sprintf (buf, "RaceMax: Str: %d  Con: %d  Dex: %d  Int: %d  Wis: %d\n\r\n\rPoints left: %d.  Command: ",
	   race_info[ch->pcdata->race].limits[0], race_info[ch->pcdata->race].limits[4],
	   race_info[ch->pcdata->race].limits[3], race_info[ch->pcdata->race].limits[1],
	   race_info[ch->pcdata->race].limits[2], ch->pcdata->pray_points);
  send_to_char (buf, ch);
  return;
}

/*
   * Low level output function.
 */
bool
process_output (DESCRIPTOR_DATA * d, bool fPrompt)
{
  extern bool aturion_down;
  int left;
  MARK_DEBUG("Process_output")
  grep[0] = '\0';
  if (d->connected == CON_FSEDITOR)
    {
      return TRUE;
    }
  else if (d->pString != NULL && !d->java)
    write_to_buffer (d, "> ", 2);
  else if (fPrompt && !aturion_down &&
	   (d->connected == CON_PLAYING
	    || d->connected == 9991
	    || d->connected == CON_PEDITOR
	    || d->connected == CON_AEDITOR
	    || d->connected == CON_REDITOR
	    || d->connected == CON_CEDITOR
	    || d->connected == CON_SEDITOR
	    || d->connected == CON_OEDITOR
	    || d->connected == CON_MEDITOR))
    if (d->showstr_point) {
      if (d->java) {
	char b[20];
      write_to_buffer (d, "\n\r(Press Enter)", 0);
	sprintf(b,"%c%c",(char)23,(char)3);
	write_to_buffer(d,b,0);
	} else
      write_to_buffer (d, "\n\r\x1B[32;0m(Press Enter)\x1B[37;0m ", 0);

	}
    else
      {
	CHAR_DATA *ch;
	ch = d->original ? d->original : d->character;
	if (!d->java && d->connected != CON_RWHO && (!ch || (IS_SET (ch->pcdata->act2, PLR_BLANK)	/*&&
											   ( !IS_SET(ch->pcdata->act3,ACT3_MAPPING) || IS_SET(ch->pcdata->act3,ACT3_DISABLED)) */ )))
	  write_to_buffer (d, "\n\r", 2);
	if (ch && !IS_JAVA(ch) && IS_SET (ch->pcdata->act2, PLR_PROMPT) && d->connected != CON_GODMENU &&
	/*ch->desc!=NULL && */ d->connected != 9991 && d->connected != CON_READ_MOTD &&
	    d->connected != CON_RWHO)
	  {
	    print_prompt (d->character);
	  }
	else if (d->character && !d->java)
	  send_to_char ("\x1B[37;0m", d->character);
	if (d->character && !IS_JAVA(d->character) && IS_SET (d->character->pcdata->act2, PLR_TELNET_GA) && d->host[29] != 1)
	  write_to_buffer (d, go_ahead_str, 0);
      }

  if (d->outtop == 0)
    return TRUE;

  if (d->character && d->connected <= 0 && d->host[29] == 1)
    {
      char minbuf[100];
      sprintf (minbuf, "\x1B[%d;1f\x1B[K", d->character->pcdata->pagelen);
      write_to_descriptor (d->descriptor, minbuf, 0);
    }
  MARK_DEBUG("Presnp")

/* Handle Snooping! */
  if (d->snoop_by != NULL && d->character)
    {
      bool anss;
      anss = FALSE;
      write_to_buffer (d->snoop_by, "% ", 2);
      if (IS_SET (d->character->pcdata->act2, PLR_BLANKPROMPT) && IS_SET (d->character->pcdata->act2, PLR_ANSI))
	{
	  anss = TRUE;
	  REMOVE_BIT (d->snoop_by->character->pcdata->act2, PLR_ANSI);
	}
      write_to_buffer (d->snoop_by, d->outbuf, d->outtop);
      if (anss)
	SET_BIT (d->snoop_by->character->pcdata->act2, PLR_ANSI);
    }

dn:
  MARK_DEBUG("w2d2")
  if ((left = write_to_descriptor2 (d, d->outbuf, d->outtop)) == FALSE)
    {
      d->outtop = 0;
      close_socket (d);
      return FALSE;
    }
  else
    {
      d->outtop = 0;
    }
  return TRUE;
}

char looking_for[500];

int
do_grepit (DESCRIPTOR_DATA * d, char *txt, int max_lines)
{
  char oneline[2000];
  int i = 0;
  int total = 0;
  int lines = 0;
  char *t;
  grep[0] = '\0';
  for (t = txt; *t != '\0'; t++)
    {
      if (*t == '\r')
	{
	  oneline[i] = *t;
	  i++;
	  total++;
	  oneline[i] = '\0';
	  if (looking_for[0] != '\0')
	    {
	      if (!str_infix (looking_for, oneline))
		{
		  write_to_buffer (d, oneline, 0);
		  lines++;
		}
	    }
	  else
	    {
	      write_to_buffer (d, oneline, 0);
	      lines++;
	    }
	  i = 0;
	  oneline[0] = '\0';
	  if (lines >= max_lines)
	    return total;
	  continue;
	}
      oneline[i] = *t;
      i++;
      total++;
    }
  oneline[i] = '\0';
  if (looking_for[0] != '\0')
    {
      if (!str_infix (looking_for, oneline))
	{
	  write_to_buffer (d, oneline, 0);
	}
    }
  else
    write_to_buffer (d, oneline, 0);
  return total;
}

void
write_to_buffer (DESCRIPTOR_DATA * d, const char *txt, int length)
{
  char buf[10001];
  char *s = NULL;
  char *o;
  char *tx = NULL;
  if (!d)
    return;
  if (grep[0] != '\0' && gr &&
      !(txt[0] == '\r' && txt[1] == '\0') && !(txt[0] == '\n' && txt[1] == '\r' && txt[2] == '\0'))
    {
      strcpy (looking_for, grep);
      do_grepit (d, txt, 32000);
      strcpy (grep, looking_for);
      return;
    }
#ifdef NEW_WORLD /* */
  if (txt[0] == 1)
    {
      s = decompress (txt);
      tx = s;
    }
  else
#endif

  if (!tx)
    tx = txt;


/*length = strlen(tx); */
  length = 0;


  for (o = tx; *o != '\0'; o++)
    {
      length++;
      if (*o == '~')
	return;
    }

  if (d->outbuf)
    d->outtop = strlen (d->outbuf);
  else
    {
      d->outbuf = mem_alloc (501);
      d->max_outbuf = 500;
      d->outbuf[0] = '\0';
      d->outtop = 0;
    }
  if (length > 10000)
    {
      return;
    }
  if (d->max_outbuf <= (length + d->outtop))
    {
      char *tt;
      buf[0] = '\0';
      tt = mem_alloc (length + d->outtop + 501);
      tt[0] = '\0';
      if (d->outbuf)
	{
	  strcpy (tt, d->outbuf);
	  free_m (d->outbuf);
	}
      d->outbuf = tt;
      d->max_outbuf = length + d->outtop + 500;
      d->outtop = strlen (d->outbuf);
    }
  if (d->character && !d->java && !IS_SET (d->character->pcdata->act2, PLR_ANSI))
    {
      int x = 0;
      char *point;
      const char *str;
      point = buf;
      str = tx;
      while (*str != '\0' && x < length)
	{
	  if (*str == '\033' || *str == '\x1B')
	    {
	      while (((*str >= '0' && *str <= '9') || *str == '\x1B' || *str == '[' || *str == ';') && *str)
		{
		  ++x;
		  ++str;
		}
	      if (*str)
		{
		  ++x;
		  ++str;
		}
	    }
	  else
	    {
	      *point = *str;
	      point++;
	      str++;
	      x++;
	    }
	}
      *point = '\0';
      length = strlen (buf);
    }
  else
    strcpy (buf, tx);
  if (d->outtop == 0 && d->max_outbuf > 5 && !d->tpcommand && d->connected != CON_RWHO)
    {
      if (!d->character || d->character->timer != -5)
	{
	  d->outbuf[0] = '\n';
	  d->outbuf[1] = '\r';
	  d->outbuf[2] = '\0';
	  d->outtop = 2;
	}
      else if (d->character)
	d->character->timer = -1;
    }

  strcat (d->outbuf, buf);
  d->outtop += length;
  return;
}

bool
write_to_descriptor (socket_t desc, char *txt, int length)
{
  short ccc;
  int iStart;
  int nWrite;
  int nBlock;
  if (!desc)
    return FALSE;
  if (length <= 0)
    length = strlen (txt);
  for (iStart = 0; iStart < length; iStart += nWrite)
    {
      nBlock = UMIN (length - iStart, 10000);

#ifdef WINDOWS
    if ((nWrite = send(desc, txt+iStart, nBlock, 0)) < 0)
#else
	  if ((nWrite = write (desc, txt + iStart, nBlock)) < 0)
#endif
	{
	  ccc = 0;
	  do
	    {
#ifdef WINDOWS
		  nWrite = send(desc, txt+iStart, nBlock, 0);
#else
	      nWrite= write (desc, txt + iStart, nBlock);
#endif
	      ccc++;
	    }
	  while (nWrite < 0 && ccc < 25);
	  if (ccc > 24)
	    break;
	  ccc = 0;
	}
    }
  return TRUE;
}

void
trigger_it (DESCRIPTOR_DATA * d, char *invar, char *inword, char *todo)
{
  char tdo[1000];
  char *r;
  int pos = 0;
  for (r = todo; *r != '\0'; r++)
    {
      if (*r == '&')
	{
	  strcat (tdo, inword);
	  pos += strlen (inword);
	}
      else if (*r == '^')
	{
	  strcat (tdo, invar);
	  pos += strlen (invar);
	}
      else
	{
	  tdo[pos] = *r;
	  pos++;
	  tdo[pos] = '\0';
	}
    }
  strcat (d->inbuf, tdo);
  strcat (d->inbuf, "\n\r");
  return;
}

bool
check_action (DESCRIPTOR_DATA * dd, char *action, char *todo, char *txt)
{
  char *c;
  char *d;
  bool matching = FALSE;
  char wordt[500];		/* Holds the % word */
  char stringt[500];		/* Holds the * string */
  int wct = 0;			/* Word % count */
  int sct = 0;			/* String * count */
  bool w_word;			/* Wildcard word on? */
  bool w_string;		/* Wildcard string on? */
  char chunk[3][500];
  bool used[3];
  int chunknum = 0;
  int ct = 0;
  chunk[0][0] = '\0';
  chunk[1][0] = '\0';
  chunk[2][0] = '\0';
  wordt[0] = '\0';
  stringt[0] = '\0';
  d = action;
  used[0] = FALSE;
  used[1] = FALSE;
  used[2] = FALSE;

  for (c = action; *c != '\0'; c++)
    {
      if (*c == '&' || *c == '^')
	{
	  chunknum++;
	  ct = 0;
	}
      else
	{
	  chunk[chunknum][ct] = *c;
	  ct++;
	  chunk[chunknum][ct] = '\0';
	}
    }
  if (chunk[0][0] == '\0')
    used[0] = TRUE;
  if (chunk[1][0] == '\0')
    used[1] = TRUE;
  if (chunk[2][0] == '\0')
    used[2] = TRUE;
  for (c = txt; *c != '\0'; c++)
    {
      if (*c == '\x1B')
	{
	  while (*c != 'm' && *c != 'f' && *c != 'H' && *c != 'r' && *c != 'J' && *c != '\0')
	    c++;
	  continue;
	}
      if (*d == '\0')
	{
	  trigger_it (dd, stringt, wordt, todo);
	  return TRUE;
	}
      if (!used[0] && !str_prefix (chunk[0], c))
	{
	  used[0] = TRUE;
	  d += strlen (chunk[0]);
	  c += strlen (chunk[0]) - 1;
	  continue;
	}
      if (!used[1] && !str_prefix (chunk[1], c))
	{
	  used[1] = TRUE;
	  d += strlen (chunk[1]);
	  c += strlen (chunk[1]) - 1;
	  continue;
	}
      if (!used[2] && !str_prefix (chunk[2], c))
	{
	  used[2] = TRUE;
	  d += strlen (chunk[2]);
	  c += strlen (chunk[2]) - 1;
	  continue;
	}
      if (*c == '\n' || *c == '\r')
	{
	  used[0] = FALSE;
	  used[1] = FALSE;
	  used[2] = FALSE;
	  wordt[0] = '\0';
	  wct = 0;
	  stringt[0] = '\0';
	  sct = 0;
	  d = action;
	}
      if (*d == '&')
	d++;
      else if (*d == '^')
	d++;
      if (*(d - 1) == '&')
	{
	  if (*c == ' ')
	    {
	      wordt[0] = '\0';
	      wct = 0;
	    }
	  else
	    {
	      wordt[wct] = *c;
	      wct++;
	      wordt[wct] = '\0';
	    }
	}
      else if (*(d - 1) == '^')
	{
	  stringt[sct] = *c;
	  sct++;
	  stringt[sct] = '\0';
	}
    }
  return FALSE;
}


bool
write_to_descriptor2 (DESCRIPTOR_DATA * d, char *txt, int length)
{
  int iStart;
  int nWrite;
  int nBlock;
  socket_t desc;
  int ccc;
  int i;
  char *t;
  if (!d)
    return FALSE;
  if (d->connected == CON_SHELL)
    {
      if (d->outbuf)
	{
	  d->outbuf[0] = '\0';
	}
      d->outtop = 0;
#ifdef WINDOWS
	 send(d->descriptor, wont_echo,strlen(wont_echo),0);
	 send(d->descriptor, wont_suppress_ga,strlen(wont_suppress_ga),0);
#else  
      write (d->descriptor, wont_echo, strlen (wont_echo));
      write (d->descriptor, wont_suppress_ga, strlen (wont_suppress_ga));
#endif
      return TRUE;
    }
  desc = d->descriptor;
  if (!desc)
    return FALSE;
  grep[0] = '\0';
  looking_for[0] = '\0';
  t = NULL;
  length = strlen (txt);
  if (length > 2000)
    {
      t = txt + 2000;
      length = 2000;
    }
#ifdef NEW_WORLD
/*if (d->character) {
   if (IS_PLAYER(d->character) && !IS_SET(d->character->special,ACTION_OFF)) {
   for (i=0; i<MAXALIAS; i++) {
   if (d->character->pcdata->actionname[i] &&
   d->character->pcdata->actionname[i][0]!='\0' &&
   d->character->pcdata->action[i]) {
   check_action(d,d->character->pcdata->actionname[i],
   d->character->pcdata->action[i],
   txt);
   }
   }
   }
   if (IS_SET(d->character->special,ACTION_OFF)) REMOVE_BIT(d->character->special,ACTION_OFF);
   }
 */
#endif
  chars_sent += length;
  ccc = 0;
  for (iStart = 0; (iStart < length); iStart += nWrite)
    {
      nBlock = UMIN (length - iStart, 10000);
#ifdef WINDOWS
    if ((nWrite = send(desc, txt+iStart, nBlock, 0)) < 0)
#else  
		  if ((nWrite = write (desc, txt + iStart, nBlock)) < 0)
#endif
	{
	  do
	    {
	      if (!read_from_descriptor (d))
		{
		  d->outtop = 0;
		  return FALSE;
		}
#ifdef WINDOWS
		  nWrite = send(desc, txt+iStart, nBlock, 0);
#else  
	      nWrite = write (desc, txt + iStart, nBlock);
#endif
	      ccc++;
	    }
	  while (nWrite < 0 && ccc < 250);
	  if (ccc > 25)
	    break;
	}
    }
  if (t)
    {
      if (!write_to_descriptor2 (d, t, 0))
	return FALSE;
      else
	return TRUE;
    }
  if (d->outbuf)
    {
      d->outbuf[0] = '\0';
    }
  d->outtop = 0;
  return TRUE;
}

void
display_menu (CHAR_DATA * ch)
{
#ifdef MENU
  send_to_char ("\n\r\n\r -= Main Pre-Login Menu =-\n\r\n\r", ch);
  send_to_char (" 1) Enter the game.\n\r", ch);
  send_to_char (" 2) View your character 'score'.\n\r", ch);
  send_to_char (" 3) View your character's 'attributes'.\n\r", ch);
  send_to_char (" 4) Read the Background Story.\n\r", ch);
  send_to_char (" 5) See recent game changes.\n\r", ch);
  send_to_char (" 6) View the 'who' list.\n\r", ch);
  send_to_char (" 7) Disconnect [Leave the game].\n\r", ch);
  send_to_char ("\n\rEnter your selection: ", ch);
#endif
  return;
}

void
handle_connecting (DESCRIPTOR_DATA * d, char *argy)
{
  char tbuf[STD_LENGTH];
  char buf[STD_LENGTH];
  char buf2[STD_LENGTH];
  CHAR_DATA *ch;
  NOTE_DATA *pnote;
  char *pwdnew;
  char ttt[20];
  char *p;
  int i;
  int notes;
  int iRace;
  bool fOld;
  while (isspace (*argy))
    argy++;
  ch = d->character;
  switch (d->connected)
    {
    default:
      bug ("handle_connecting: bad d->connected state #%d.", d->connected);
      close_socket (d);
      return;
    case CON_SHELL:
      d->connected = CON_PLAYING;
      break;
case 947:
  {
    extern char *help_greeting;
    extern char *help_greeting_a;
    char *l;
if (argy[0]=='J') {
	d->timeout_counter= -50;
	d->java=TRUE;
	send_java_info(d);
	d->connected=CON_STATE_ONE;
	return;
	}
    if (0 && d->host[29] == 1)
      {
	if (help_greeting_a[0] == '.')
	  l = add_color (help_greeting_a + 1);
	else
	  l = add_color (help_greeting_a);
      }
    else
      {
	if (help_greeting[0] == '.')
	  l = add_color (help_greeting + 1);
	else
	  l = add_color (help_greeting);
      }
    write_to_buffer (d, l, 0);
    free_m (l);
    write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0);
d->connected=CON_STATE_ONE;
return;
  }

    case CON_SHOW_TITLE:
      {
	extern char *help_greeting;
	char *l;
/*#ifdef NEW_WORLD*/
	if (help_greeting[0] == '.')
	  l = add_color (decompress (help_greeting + 1));
	else
	  l = add_color (decompress (help_greeting));
/*#else
	if (help_greeting[0] == '.')
	  l = add_color (help_greeting + 1);
	else
	  l = add_color (help_greeting);
#endif*/
	write_to_buffer (d, l, 0);
	free_m (l);
	write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0);
	d->connected = CON_STATE_ONE;
	return;
      }
    case CON_ASK_MENU:
      if (argy == "" || argy[0] == '\0')
	{
	  display_menu (ch);
	  return;
	}
      if (argy[0] == '1')
	{
	  if (IS_SET (ch->act, ACT_UNVAL))
	    {
	      send_to_char ("\n\rYou have not yet been validated. Sorry.\n\r", ch);
	      send_to_char ("\n\rMenu selection: ", ch);
	      return;
	    }
	{
	int i=ch->pcdata->pagelen;
	ch->pcdata->pagelen=100;
	  do_help (ch, "motd");
	ch->pcdata->pagelen=i;
	}
	  d->connected = CON_READ_MOTD;
	  return;
	}
      if (argy[0] == '2')
	{
	  ROOM_DATA *rid;
	  send_to_char ("\n\r", ch);
	  if (ch->in_room)
	    char_from_room (ch);
	  char_to_room (ch, ch->pcdata->temp_room);
	  do_score (ch, "");
	  char_from_room (ch);
	  send_to_char ("\n\rMenu selection: ", ch);
	  return;
	}
      if (argy[0] == '3')
	{
	  ROOM_DATA *rid;
	  send_to_char ("\n\r", ch);
	  if (ch->in_room)
	    char_from_room (ch);
	  char_to_room (ch, ch->pcdata->temp_room);
	  do_attribute (ch, "");
	  char_from_room (ch);
	  send_to_char ("\n\rMenu selection: ", ch);
	  return;
	}
      if (argy[0] == '5')
	{
	  send_to_char ("\n\r", ch);
	  do_help (ch, "changes");
	  send_to_char ("\n\rMenu selection: ", ch);
	  return;
	}
      if (argy[0] == '6')
	{
	  send_to_char ("\n\r", ch);
	  if (IS_SET (ch->act, ACT_UNVAL))
	    {
	      send_to_char ("You have not yet been validated. Sorry.\n\r", ch);
	      send_to_char ("\n\rMenu selection: ", ch);
	      return;
	    }
	  do_who (ch, "");
	  send_to_char ("\n\rMenu selection: ", ch);
	  return;
	}
      if (argy[0] == '7')
	{
	  send_to_char ("\n\r", ch);
	  close_socket (d);
	  return;
	}
      send_to_char ("\n\r\n\rInvalid selection, please select again...\n\r", ch);
      display_menu (ch);
      return;
      break;
    case CON_STATE_ONE:
      {
	char *pii;
	char arg1[500];
	char full_argy[500];
	strcpy (full_argy, argy);
	argy = one_argy (argy, arg1);
	if (!str_cmp (full_argy, "Newchannel"))
	  {
	    int i;
	    d->timeout_counter = -100;
	    d->connected = CON_CHANNELD;
	    for (i = 0; i < 5; i++)
	      {
		if (outgoing[i] == 0)
		  break;
	      }
	    if (i == 5)
	      {
		close_socket (d);
		return;
	      }
	    outgoing[i] = d->descriptor;
	    connectiond[i] = d;
	    return;
	  }
	if (arg1[0] == '\0')
	  {
	    write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0);
	    return;
	  }

	if (!str_cmp (arg1, "create") && argy && argy[0] != '\0')
	  {
	    BAN_DATA *pban;
	    if (wizlock)
	      {
		write_to_buffer (d, "The game is closed to mortal players right now.\n\r", 0);
	      quit_flag=TRUE;
		if (d->character)
		  free_it (d->character);
		quit_flag=FALSE;
		d->character = NULL;

		close_socket (d);
		return;
	      }
	    if (str_prefix ("149.159", d->host) && str_prefix ("140.226.1", d->host))
	      for (pban = ban_list; pban != NULL; pban = pban->next)
		{
		  if ((!str_prefix (pban->name, d->host) || !str_suffix (pban->name, d->host)))
		    {
		      write_to_descriptor2 (d,
					    "------------------------------------------------------------------------------\n\r", 0);
		      write_to_descriptor2 (d,
					    "---------------------------------------IMPORTANT!-----------------------------\n\r", 0);
		      write_to_descriptor2 (d,
					    "------------------------------------------------------------------------------\n\r", 0);
		      write_to_descriptor2 (d,
					    "Email validation is required for your site, possibly because of previous rule-\n\r", 0);
		      write_to_descriptor2 (d,
					    "breakers or problem causers.  You will recieve an email, and you must reply to the\n\r", 0);
		      write_to_descriptor2 (d,
					    "email appropriately to get access, so please make sure your email is accurate.\n\r", 0);
			  write_to_descriptor2 (d,
						"Please note that free accounts like HOTMAIL and JUNO will not be considered as valid\n\r", 0);
			  write_to_descriptor2 (d,
						"email addresses.  You will not be granted access with an invalid or free email account!\n\r", 0);
		      write_to_descriptor2 (d,
					    "------------------------------------------------------------------------------\n\r", 0);
		      d->wrong_pw = TRUE;
		    }
		}
	    argy[0] = UPPER (argy[0]);
	    if (strlen (argy) < 3)
	      {
		write_to_buffer (d, "Names must be 3-14 characters long.\n\rPlease try again: ", 0);
		return;
	      }
	    for (pii = argy; *pii != '\0'; pii++)
	      {
		if (*pii == ' ' || *pii == '~')
		  {
		    write_to_buffer (d, "You may not have spaces or tildes in your name.  Sorry.\n\r", 0);
		    write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0);
		    return;
		  }
	      }
	    if (!check_parse_name (argy, TRUE) && str_cmp (argy, "Orin")
		&& str_cmp (argy, "Smack"))
	      {
		write_to_buffer (d, "Sorry, you cannot use that name. Names must contain only letters and can\n\r", 0);
		write_to_buffer (d, "not contain any spaces or punctuation. If your name is common, a zone exist\n\r", 0);
		write_to_buffer (d, "where your name corresponds to a mob. If this is the case, please log in\n\r", 0);
		write_to_buffer (d, "under a different name and talk to a god about a possible solution. <Enter> ", 0);
		return;
	      }
	    FD_CLR (d->descriptor, &in_set);
	    {
	      FILE *ff;
	      char buf[100];
	      sprintf (buf, "%s%s", PLAYER_DIR, argy);
	      if ((ff = fopen (buf, "r")) != NULL)
		{
		  write_to_buffer (d, "There is already somebody using that name, sorry.\n\r", 0);
                  if (d->java) {
                     sprintf(buf,"%c%c",(char) 29, (char) 1);
                     write_to_descriptor2(d,buf,0);
                     }
		  fclose (ff);
		  return;
		}
	    }
	    load_char_obj (d, argy, FALSE);
	    d->timeout_counter = -100;	/*set timeout counter for autologoff */
	    write_to_buffer (d, "\n\r", 0);
	    write_to_buffer (d, "---------------------------------------------------------------------------\n\r", 0);
	    write_to_buffer (d, "You may have ONE character total on the mud.  You risk possible deletion if\n\r", 0);
	    write_to_buffer (d, "1. You have more than one character.\n\r", 0);
	    write_to_buffer (d, "2. You use an incorrect email address.\n\r", 0);
	    write_to_buffer (d, "---------------------------------------------------------------------------\n\r", 0);
	    write_to_buffer (d, "Please type Y (and enter) to continue with creating this character, or just\n\r", 0);
	    write_to_buffer (d, "press enter alone to abort new character creation.\n\rContinue [Y/N]? ", 0);
	    d->connected = CON_CONFIRM_NEW_NAME;
	    return;
	  }
	if (!str_cmp (arg1, "quit") || !str_cmp (arg1, "logout"))
	  {
	    close_socket (d);
	    return;
	  }
	if (!str_cmp (arg1, "who"))
	  {
	    char buffr[4096];
	    DESCRIPTOR_DATA *o;
	    if (!pow.allow_who_in_login)
	      {
		write_to_buffer (d, "That option is disabled.\n\r", 0);
		return;
	      }
	    write_to_buffer (d, "\n\rPlayers online right now:\n\r", 0);
	    for (o = descriptor_list; o != NULL; o = o->next)
	      {
		if (o == d || o->character == NULL)
		  continue;
		if (LEVEL (o->character) > 100)
		  continue;
		sprintf (buffr, "%-20s", NAME (o->character));
		write_to_buffer (d, buffr, 0);
	      }
	    write_to_buffer (d, "\n\r\n\rOptions: <Playername>, Create <player>, Who, or Quit.\n\r", 0);
	    if (d->character && d->character->pcdata->name)
	      {
	      quit_flag=TRUE;
		free_it (d->character);
	      quit_flag=FALSE;
		d->character = NULL;
	      }
	    return;
	  }
	full_argy[0] = UPPER (full_argy[0]);
	if (!check_parse_name (full_argy, TRUE) && str_cmp (full_argy, "Orin")
	    && str_cmp (full_argy, "Smack"))
	  {
                  if (d->java) {
                     sprintf(buf,"%c%c",(char) 29, (char) 2);
                     write_to_descriptor2(d,buf,0);
                     }
	    write_to_buffer (d, "Sorry, that name is invalid. Email oemlen@indiana.edu if you feel there is\n\r", 0);
	    write_to_buffer (d, "some sort of mistake (IE your name was valid before, and now won't work).\n\r", 0);
	    write_to_buffer (d, "<Hit Enter> ", 0);
	    return;
	  }
	d->timeout_counter = -100;	/*set timeout counter for autologoff */
	fOld = load_char_obj (d, full_argy, FALSE);
	if (d->character == NULL) {
	  close_socket(d);
	  return;
	}
	FD_CLR (d->descriptor, &in_set);
	if (!fOld && d->character->pcdata->new_exp)
	  {
	    d->character->pcdata->new_exp = FALSE;
	    d->character = NULL;
	    close_socket (d);
	    return;
	  }
	ch = d->character;
	if (d->repeat == -5)
	  {
	    d->repeat = 0;
	    d->connected = CON_PLAYING;
	    return;
	  }
	if (wizlock && !IS_GOD (ch) && str_cmp (NAME (ch), "Orin"))
	  {
	    write_to_buffer (d, "The game is closed to mortal players right now.\n\r", 0);
		quit_flag=TRUE;
	    free_it (d->character);
		quit_flag=FALSE;
	    d->character = NULL;
	    close_socket (d);
	    return;
	  }
	if (fOld)
	  {
	    /* Old player or reconnecting from LINKLESS */
	    sprintf (buf, "Please enter your password: ");
/*             if (!IS_SET(ch->pcdata->act2,PLR_BLANKPROMPT)) SET_BIT(ch->pcdata->act2,PLR_TELNET_GA);
   else */

if (!d->java) {
	    write_to_buffer (d, echo_off_str, 0);
	    write_to_buffer (d, buf, 0);
            }
	    d->connected = CON_GET_OLD_PASSWORD;
	    return;
	    write_to_buffer (d, "Sorry, that name was not found in the DB lookup. <Enter> ", 0);
	    return;
	  }
	if (d->character)
	  {
		quit_flag=TRUE;
	    free_it (d->character);
		quit_flag=FALSE;
	    d->character = NULL;
	  }
	write_to_buffer (d, "Options: <Playername>, Create <player>, Who, or Quit.\n\r", 0);
	return;
      }
      break;



    case ASK_MAP:
      if (UPPER (argy[0]) != 'N')
	{
	  write_to_buffer (d, "\n\rOverhead mapping enabled.  (Use MAP to turn it off during gameplay).\n\r", 0);
	  SET_BIT (d->character->pcdata->act3, ACT3_MAPPING);
	}
      else
	write_to_buffer (d, "\n\rOverhead mapping will not be used.  (MAP to turn it on during gameplay).\n\r", 0);

      write_to_buffer (d, "\n\rYour email address is required and will be checked. This helps us eliminate\n\r", 0);
      write_to_buffer (d, "multi-players and provides an easy means of contact in case of site change.\n\r", 0);
      write_to_buffer (d, "-> An invalid email address may result in character deletion! <-\n\r", 0);
      write_to_buffer (d, "Email address: ", 0);
      d->connected = 598;
      return;
      break;



    case CON_GET_OLD_PASSWORD:
      write_to_buffer (d, "\n\r", 2);
      ch = d->character;	/*The below checks for NULL password strings */
      if (!ch->pcdata->pwd || ch->pcdata->pwd[0] == '\0' || ch->pcdata->pwd == "")
	{
	  write_to_descriptor2 (d, "Password error! Send mail to oemlen@indiana.edu for help.\n\r", 0);
	  close_socket (d);
	  return;
	}
      /*Below is a hostname check */
#ifndef WINDOWS
      if (!str_cmp (NAME (ch), "Orin") || !str_cmp (NAME (ch), "Anna"))
	{
	  if (str_prefix ("149.159", d->host) && str_prefix ("140.226.1", d->host))
	    {
	      write_to_buffer (d, "Wrong password.\n\r", 0);
	      close_socket (d);
	      return;
	    }
	}
#endif
	  if (ch->pcdata->rpwd && ch->pcdata->rpwd[0] != '\0')
	    {
	      free_string (ch->pcdata->rpwd);
	      ch->pcdata->rpwd = &str_empty[0];
	    }
	  ch->pcdata->rpwd = str_dup ("blah");
	  if (strcmp (crypt (argy, ch->pcdata->pwd), ch->pcdata->pwd))
	    {
	      write_to_buffer (d, "Wrong password.\n\rPlease try again: ", 0);
		if (d->java) {
		char b5[50];
		sprintf(b5,"%c%c",(char)19,(char)30);
		write_to_buffer(d,b5,0);
		}
	      if (d->wrong_pw)
		{
		  close_socket (d);
		  return;
		}
	      else
		d->wrong_pw = TRUE;
	      return;
//	    }
	}
      if (!d->java && ch->desc && ch->desc->host[29] != 1 /*IS_SET(ch->pcdata->act2,PLR_TELNET_GA) */ )
	{
	  write_to_buffer (ch->desc, echo_on_str, 0);
	}
      if (d->java) {
         SET_BIT(d->character->pcdata->act2, PLR_ANSI);
         SET_BIT(d->character->pcdata->act3,ACT3_MAPPING);
         REMOVE_BIT(d->character->pcdata->act3,ACT3_DISABLED);
         }
      if (check_reconnect (d, ch->pcdata->name, TRUE))	/*Player entered NM & PW */
	{
          if (d->java) {
             do_help(d->character,"motd");
             sprintf (buf2, "%cSuccessful JavaConnect!  Welcome to %s.%c", (char) 31, VERSION_STR,(char) 31);
             write_to_buffer(d,buf2,0);
             do_clear(d->character,"");
             }
	   d->connected = CON_PLAYING;
             act("$n has reconnected!",d->character,NULL,d->character,TO_ROOM);

	  return;
	}
      /*Send em into the game */
      ch = d->character;
      /*Display message of the day and Imm msg of the day */
      conv_race (ch);
      natural_mana (ch);
      upd_mana (ch);
      check_topten (ch);
      if (pow.login_menu)
	{
	  display_menu (ch);
	  d->connected = CON_ASK_MENU;
	  return;
	}
      if (!str_prefix ("149.159", ch->desc->host) || !str_prefix ("140.226", ch->desc->host))
	{
	  if (IS_SET (ch->act, ACT_UNVAL))
	    REMOVE_BIT (ch->act, ACT_UNVAL);
	}
      if (IS_SET (ch->act, ACT_UNVAL))
	{
	  send_to_char ("\n\rYou have not yet been validated. Sorry.\n\r", ch);
	  if (pow.login_menu)
	    {
	      send_to_char ("\n\rMenu selection: ", ch);
	      return;
	    }
	  else
	    {
	      close_socket (d);
	      return;
	    }
	}
      {
	int kks;
	kks = ch->pcdata->pagelen;
	ch->pcdata->pagelen = 99;
	do_help (ch, "motd");
	d->connected = CON_READ_MOTD;
	ch->pcdata->pagelen = kks;
      }
      break;




    case 197:
      {
	write_to_buffer (d, "\n\rYou will now answer some questions about your childhood.\n\r\n\r", 0);
	write_to_buffer (d, "\x1B[32;1mA\x1B[37;0m] You were born into a strong home with hard working parents.\n\r", 0);
	write_to_buffer (d, "\x1B[32;1mB\x1B[37;0m] You were born into an intellectual home with intelligent parents.\n\r", 0);
	write_to_buffer (d, "\x1B[32;1mC\x1B[37;0m] You were born into a wise family, much respected amongst the community.\n\r", 0);
	write_to_buffer (d, "\x1B[32;1mD\x1B[37;0m] You were born to hard working parents that were well educated.\n\r", 0);
	write_to_buffer (d, "\x1B[32;1mE\x1B[37;0m] You were born the son of a fighting monk in a holy temple.\n\r", 0);
	write_to_buffer (d, "\x1B[32;1mF\x1B[37;0m] You were born on the streets.\n\r", 0);
	write_to_buffer (d, "\n\rYour selection: ", 0);
	d->connected = 210;
	return;
	break;
      }
    case 210:

      switch (argy[0])
	{
	case 'a':
	case 'A':
	  {
	    ch->pcdata->tmp_str = 5;
	    ch->pcdata->tmp_int = 3;
	    ch->pcdata->tmp_wis = 2;
	    ch->pcdata->tmp_dex = number_range (3, 5);
	    ch->pcdata->tmp_con = number_range (6, 7);
	    d->connected = 198;
	    break;
	  }
	case 'b':
	case 'B':
	  {
	    ch->pcdata->tmp_str = 2;
	    ch->pcdata->tmp_int = 5;
	    ch->pcdata->tmp_wis = 4;
	    ch->pcdata->tmp_dex = number_range (4, 6);
	    ch->pcdata->tmp_con = number_range (4, 7);
	    d->connected = 198;
	    break;
	  }
	case 'c':
	case 'C':
	  {
	    ch->pcdata->tmp_str = 3;
	    ch->pcdata->tmp_int = 4;
	    ch->pcdata->tmp_wis = 5;
	    ch->pcdata->tmp_dex = number_range (3, 6);
	    ch->pcdata->tmp_con = number_range (3, 7);
	    d->connected = 198;
	    break;
	  }
	case 'd':
	case 'D':
	  {
	    ch->pcdata->tmp_str = 3;
	    ch->pcdata->tmp_int = 3;
	    ch->pcdata->tmp_wis = 3;
	    ch->pcdata->tmp_dex = number_range (5, 6);
	    ch->pcdata->tmp_con = number_range (4, 7);
	    d->connected = 198;
	    break;
	  }
	case 'e':
	case 'E':
	  {
	    ch->pcdata->tmp_str = 4;
	    ch->pcdata->tmp_int = number_range (2, 4);
	    ch->pcdata->tmp_wis = 4;
	    ch->pcdata->tmp_dex = number_range (4, 7);
	    ch->pcdata->tmp_con = number_range (4, 6);
	    d->connected = 198;
	    break;
	  }
	case 'f':
	case 'F':
	  {
	    ch->pcdata->tmp_str = 4;
	    ch->pcdata->tmp_int = 3;
	    ch->pcdata->tmp_wis = 3;
	    ch->pcdata->tmp_dex = number_range (4, 5);
	    ch->pcdata->tmp_con = number_range (4, 6);
	    d->connected = 198;
	    break;
	  }
	default:
	  {
	    write_to_buffer (d, "Invalid choice.  Please select again: ", 0);
	    d->connected = 210;
	    return;

	    break;
	  }

	}
    case 198:
      {
	/*CHOICE TWO */
	write_to_buffer (d, "\n\rYou will now answer some questions about your toddler years.\n\r\n\r", 0);
	write_to_buffer (d, "\x1B[34;1mA\x1B[37;0m] Your parents valued well-rounded development.\n\r", 0);
	write_to_buffer (d, "\x1B[34;1mB\x1B[37;0m] Your parents encouraged your physical activity and motor development.\n\r", 0);
	write_to_buffer (d, "\x1B[34;1mC\x1B[37;0m] Your parents valued teaching you the wisdom of the past.\n\r", 0);
	write_to_buffer (d, "\x1B[34;1mD\x1B[37;0m] Your parents encouraged you to think and develop at a fast rate.\n\r", 0);
	write_to_buffer (d, "\x1B[34;1mE\x1B[37;0m] Your parents left you on the street to fend for yourself.\n\r", 0);
	write_to_buffer (d, "\x1B[34;1mF\x1B[37;0m] Your parents died as heros, while fighting a glorious battle.\n\r", 0);
	write_to_buffer (d, "\n\rYour selection: ", 0);
	d->connected = 199;
	break;
      }
    case 199:
      switch (argy[0])
	{
	case 'a':
	case 'A':
	  {
	    ch->pcdata->tmp_str += 2;
	    ch->pcdata->tmp_int += 2;
	    ch->pcdata->tmp_wis += 2;
	    ch->pcdata->tmp_dex += 2;
	    ch->pcdata->tmp_con += 2;
	    d->connected = 200;
	    break;
	  }
	case 'b':
	case 'B':
	  {
	    ch->pcdata->tmp_str += 3;
	    ch->pcdata->tmp_dex += 2;
	    ch->pcdata->tmp_con += 4;
	    d->connected = 200;
	    break;

	  }
	case 'c':
	case 'C':
	  {
	    ch->pcdata->tmp_str += 2;
	    ch->pcdata->tmp_int += 2;
	    ch->pcdata->tmp_wis += 3;
	    ch->pcdata->tmp_dex += 2;
	    d->connected = 200;
	    break;

	  }
	case 'd':
	case 'D':
	  {
	    ch->pcdata->tmp_int += 4;
	    ch->pcdata->tmp_wis += 2;
	    ch->pcdata->tmp_dex += 3;
	    d->connected = 200;
	    break;

	  }
	case 'e':
	case 'E':
	  {
	    ch->pcdata->tmp_str += 2;
	    ch->pcdata->tmp_wis += 2;
	    ch->pcdata->tmp_dex += 2;
	    ch->pcdata->tmp_con += 3;
	    d->connected = 200;
	    break;
	  }
	case 'f':
	case 'F':
	  {
	    ch->pcdata->tmp_str += 2;
	    ch->pcdata->tmp_wis += 1;
	    ch->pcdata->tmp_dex += 2;
	    ch->pcdata->tmp_con += 3;
	    ch->pcdata->tmp_int += 1;
	    d->connected = 200;
	    break;

	  }
	default:
	  {
	    write_to_buffer (d, "Invalid choice.  Please select again: ", 0);
	    d->connected = 199;
	    return;
	    break;
	  }

	}

    case 200:
      {
	/*CHOICE THREE */
	write_to_buffer (d, "\n\rYou will now answer some questions about your early teens.\n\r\n\r", 0);
	write_to_buffer (d, "\x1B[35;1mA\x1B[37;0m] You went to a normal school like a good child.\n\r", 0);
	write_to_buffer (d, "\x1B[35;1mB\x1B[37;0m] You spent most of your time playing sports.\n\r", 0);
	write_to_buffer (d, "\x1B[35;1mC\x1B[37;0m] You spent a lot of time in the library, studying.\n\r", 0);
	write_to_buffer (d, "\x1B[35;1mD\x1B[37;0m] You spent a lot of time alone, contemplating the universe.\n\r", 0);
	write_to_buffer (d, "\x1B[35;1mE\x1B[37;0m] You wandered the streets, fending for yourself.\n\r", 0);
	write_to_buffer (d, "\x1B[35;1mF\x1B[37;0m] You studied a specific trade as a young apprentice.\n\r", 0);
	write_to_buffer (d, "\n\rYour selection: ", 0);
	d->connected = 201;
	break;
      }
    case 201:
      {
	switch (argy[0])
	  {
	  case 'a':
	  case 'A':
	    {
	      ch->pcdata->tmp_str += 2;
	      ch->pcdata->tmp_int += 2;
	      ch->pcdata->tmp_wis += 2;
	      ch->pcdata->tmp_dex += 2;
	      ch->pcdata->tmp_con += 2;
	      d->connected = 202;
	      break;
	    }
	  case 'b':
	  case 'B':
	    {
	      ch->pcdata->tmp_str += 3;
	      ch->pcdata->tmp_dex += 3;
	      ch->pcdata->tmp_con += 4;
	      d->connected = 202;
	      break;

	    }
	  case 'c':
	  case 'C':
	    {
	      ch->pcdata->tmp_str += 1;
	      ch->pcdata->tmp_int += 3;
	      ch->pcdata->tmp_wis += 4;
	      ch->pcdata->tmp_dex += 2;
	      d->connected = 202;
	      break;

	    }
	  case 'd':
	  case 'D':
	    {
	      ch->pcdata->tmp_int += 3;
	      ch->pcdata->tmp_wis += 3;
	      ch->pcdata->tmp_dex += 3;
	      d->connected = 202;
	      break;

	    }
	  case 'e':
	  case 'E':
	    {
	      ch->pcdata->tmp_str += 2;
	      ch->pcdata->tmp_wis += 1;
	      ch->pcdata->tmp_dex += 2;
	      ch->pcdata->tmp_con += 3;
	      d->connected = 202;
	      break;
	    }
	  case 'f':
	  case 'F':
	    {
	      ch->pcdata->tmp_str += 1;
	      ch->pcdata->tmp_wis += 3;
	      ch->pcdata->tmp_dex += 2;
	      ch->pcdata->tmp_con += number_range (2, 3);
	      ch->pcdata->tmp_int += 1;
	      d->connected = 202;
	      break;

	    }
	  default:
	    {
	      write_to_buffer (d, "Invalid choice.  Please select again: ", 0);
	      d->connected = 201;
	      return;
	      break;
	    }

	  }
      }
    case 202:
      {
	/*CHOICE FOUR */
	write_to_buffer (d, "\n\rYou will now answer some questions about your later teenage years.\n\r\n\r", 0);
	write_to_buffer (d, "\x1B[36;1mA\x1B[37;0m] You attended a warrior school, where you learned how to fight.\n\r", 0);
	write_to_buffer (d, "\x1B[36;1mB\x1B[37;0m] You attended a magic conservatory and studied the arcane.\n\r", 0);
	write_to_buffer (d, "\x1B[36;1mC\x1B[37;0m] You got a job working for a mage - running arrends and studying.\n\r", 0);
	write_to_buffer (d, "\x1B[36;1mD\x1B[37;0m] You spent your time on the streets, fending for yourself.\n\r", 0);
	write_to_buffer (d, "\x1B[36;1mE\x1B[37;0m] You joined a cult of undercover thieves and learned from the streets.\n\r", 0);
	write_to_buffer (d, "\x1B[36;1mF\x1B[37;0m] You worked for a local blacksmith, forging weapons and armor.\n\r", 0);
	write_to_buffer (d, "\n\rYour selection: ", 0);
	d->connected = 203;
	break;
      }
    case 203:
      {
	switch (argy[0])
	  {
	  case 'a':
	  case 'A':
	    {
	      ch->pcdata->tmp_str += number_range (7, 11);
	      ch->pcdata->tmp_int += number_range (3, 5);

	      ch->pcdata->tmp_wis += number_range (4, 8);
	      ch->pcdata->tmp_dex += number_range (7, 10);
	      ch->pcdata->tmp_con += number_range (7, 10);
	      write_to_buffer (d, "\n\rPress enter to continue.", 0);
	      d->connected = CON_GET_NEW_RACE;
	      break;
	    }
	  case 'b':
	  case 'B':
	    {
	      ch->pcdata->tmp_str += number_range (4, 7);
	      ch->pcdata->tmp_int += number_range (8, 12);

	      ch->pcdata->tmp_dex += number_range (6, 11);
	      ch->pcdata->tmp_wis += number_range (7, 10);

	      ch->pcdata->tmp_con += number_range (3, 6);
	      write_to_buffer (d, "\n\rPress enter to continue.", 0);
	      d->connected = CON_GET_NEW_RACE;
	      break;

	    }
	  case 'c':
	  case 'C':
	    {
	      ch->pcdata->tmp_str += number_range (5, 8);
	      ch->pcdata->tmp_int += number_range (5, 9);

	      ch->pcdata->tmp_dex += number_range (6, 10);
	      ch->pcdata->tmp_wis += number_range (5, 8);

	      ch->pcdata->tmp_con += number_range (5, 9);
	      write_to_buffer (d, "\n\rPress enter to continue.", 0);
	      d->connected = CON_GET_NEW_RACE;
	      break;

	    }
	  case 'd':
	  case 'D':
	    {
	      ch->pcdata->tmp_str += number_range (1, 10);
	      ch->pcdata->tmp_int += number_range (4, 11);

	      ch->pcdata->tmp_dex += number_range (1, 12);
	      ch->pcdata->tmp_wis += number_range (2, 10);

	      ch->pcdata->tmp_con += number_range (1, 11);
	      write_to_buffer (d, "\n\rPress enter to continue.", 0);
	      d->connected = CON_GET_NEW_RACE;
	      break;

	    }
	  case 'e':
	  case 'E':
	    {
	      ch->pcdata->tmp_str += number_range (3, 12);
	      ch->pcdata->tmp_int += number_range (1, 13);

	      ch->pcdata->tmp_dex += number_range (7, 13);
	      ch->pcdata->tmp_wis += number_range (1, 10);

	      ch->pcdata->tmp_con += number_range (3, 9);
	      write_to_buffer (d, "\n\rPress enter to continue.", 0);
	      d->connected = CON_GET_NEW_RACE;
	      break;
	    }
	  case 'f':
	  case 'F':
	    {
	      ch->pcdata->tmp_str += number_range (5, 11);
	      ch->pcdata->tmp_int += number_range (1, 7);

	      ch->pcdata->tmp_dex += number_range (3, 10);
	      ch->pcdata->tmp_wis += number_range (2, 11);

	      ch->pcdata->tmp_con += number_range (5, 13);
	      write_to_buffer (d, "\n\rPress enter to continue.", 0);
	      d->connected = CON_GET_NEW_RACE;
	      break;

	    }


	  default:
	    {
	      write_to_buffer (d, "Invalid choice.  Please select again: ", 0);
	      d->connected = 203;
	      return;
	      break;
	    }

	  }
	return;
      }

      break;
    case CON_CONFIRM_NEW_NAME:
      ch->pcdata->tmp_str = 0;
      ch->pcdata->tmp_wis = 0;
      ch->pcdata->tmp_int = 0;
      ch->pcdata->tmp_con = 0;
      ch->pcdata->tmp_dex = 0;
      switch (*argy)
	{
	case 'y':
	case 'Y':
	  sprintf (buf, "\n\rPlease choose a password, 5-15 characters long.\n\rThis password is encrypted, so please write it down!!\n\rDesired password for %s: %s",
		   ch->pcdata->name, echo_off_str);
	  write_to_buffer (d, buf, 0);
	  d->connected = CON_GET_NEW_PASSWORD;
	  break;
	default:
	  write_to_buffer (d, "\n\r<Jumping back to login state. Press Enter> ", 0);
	  quit_flag=TRUE;
		free_it (d->character);
	  quit_flag=FALSE;
	  d->character = NULL;
	  d->connected = CON_STATE_ONE;
	  return;
	  break;
	}
      break;
    case CON_GET_PAGELEN:
      i = atoi (argy);
      if (i < 10 || i > 100)
	{
	  write_to_buffer (d, "Invalid screen length.  Defaulting to 25.\n\r", 0);
	  i = 25;
	}
      write_to_buffer (d, "Screen length set.\n\r\n\r", 0);
      d->character->pcdata->pagelen = i;
      write_to_buffer (d, "Does your terminal support ANSI color? ", 0);
      d->connected = CON_GET_NEW_ANSI;
      break;
    case CON_GET_NEW_PASSWORD:
      write_to_buffer (d, "\n\r", 2);
      if (strlen (argy) < 5)
	{
	  write_to_buffer (d,
			   "Your password must be at least five characters long.\n\rNew Password: ", 0);
	  return;
	}
      pwdnew = crypt (argy, ch->pcdata->name);
      for (p = pwdnew; *p != '\0'; p++)
	{
	  if (*p == '~')
	    {
	      write_to_buffer (d,
			       "Your new password is not acceptable, try again.\n\rPassword: ", 0);
	      return;
	    }
	}
      if (ch->pcdata->pwd)
	free_string (ch->pcdata->pwd);
      ch->pcdata->pwd = str_dup (pwdnew);
      write_to_buffer (d, "Please confirm your password by retyping it here: ", 0);
      d->connected = CON_CONFIRM_NEW_PASSWORD;
      break;
    case CON_CONFIRM_NEW_PASSWORD:
      write_to_buffer (d, "\n\r", 2);
      if (ch->pcdata->rpwd && ch->pcdata->rpwd[0] != '\0')
	{
	  free_string (ch->pcdata->rpwd);
	  ch->pcdata->rpwd = &str_empty[0];
	}
      ch->pcdata->rpwd = str_dup ("blah");
      if (strcmp (crypt (argy, ch->pcdata->pwd), ch->pcdata->pwd))
	{
	  write_to_buffer (d, "Your passwords don't match.\n\rRetype your desired password: ",
			   0);
	  d->connected = CON_GET_NEW_PASSWORD;
	  return;
	}
      sprintf (buf2, "Notify> New player %s@%s.", ch->pcdata->name, d->host);
      NOTIFY (buf2, LEVEL_IMMORTAL, WIZ_NOTIFY_LOGIN);
      write_to_buffer (d, echo_on_str, 0);
      SET_BIT (d->character->pcdata->act2, PLR_TELNET_GA);
      write_to_buffer (d, "\n\rWill your character be male or female? ", 0);
      d->connected = CON_GET_NEW_SEX;
      break;
    case CON_GET_NEW_SEX:
      switch (argy[0])
	{
	case 'm':
	case 'M':
	  ch->pcdata->sex = SEX_MALE;
	  break;
	case 'f':
	case 'F':
	  ch->pcdata->sex = SEX_FEMALE;
	  break;
	default:
	  write_to_buffer (d, "That's not a sex.\n\rAre you male or female? ", 0);
	  return;
	}
	if (!d->java) {
      for (i = 60; i > 2; i--)
	{
	  sprintf (ttt, "%d\n\r", i);
	  write_to_buffer (d, ttt, 0);
	}
      }
      write_to_buffer (d, "\n\rWhat is the highest number on your screen? ", 0);
      d->connected = CON_GET_PAGELEN;

      break;
    case CON_GET_NEW_ANSI:
#ifdef MAP_MOBS
      ch->pcdata->pray_points = 32;
#else
      ch->pcdata->pray_points = 27;
#endif
      SET_BIT (ch->pcdata->act2, PLR_TELNET_GA);
      switch (argy[0])
	{
	case 'y':
	case 'Y':
	  SET_BIT (ch->pcdata->act2, PLR_ANSI);
	  break;
	case 'n':
	case 'N':
	  break;
	case 'd':
	case 'D':
	default:
	  SET_BIT (ch->pcdata->act2, PLR_ANSI);
	}
#ifdef NEW_WORLD
      write_to_buffer (d, "\n\r\x1B[2J\x1B[1;1fIf you have VT100 windowing and ANSI cursor positioning, you may choose\n\r", 0);
      write_to_buffer (d, "to enable overhead mapping.  This is known *not* to work on some versions of\n\r", 0);
      write_to_buffer (d, "of tintin, some windows telnet programs (including Zmud and Gmud), and other\n\r", 0);
      write_to_buffer (d, "non-standard telnet and terminal types.  (It will not work on macs).\n\r", 0);
      write_to_buffer (d, "It will definately work on many DOS comm programs, linux/unix telnet that\n\r", 0);
      write_to_buffer (d, "supports normal ANSI, and some versions of Windows telnet.\n\r\n\r", 0);
      write_to_buffer (d, "You should definately *try* overhead mapping (you can always turn it off).\n\r", 0);
      write_to_buffer (d, "Do you want overhead mapping? ", 0);
      d->connected = ASK_MAP;
      return;
#else
      write_to_buffer (d, "\n\r\x1B[2J\x1B[1;1fYour email address is required and will be checked. This helps us eliminate\n\r", 0);
      write_to_buffer (d, "multi-players and provides an easy means of contact in case of site change.\n\r", 0);
      write_to_buffer (d, "-> An invalid email address may result in character deletion! <-\n\r", 0);
      write_to_buffer (d, "Email address: ", 0);
      d->connected = 598;
#endif
      break;
    case 598:
      if (argy == "" || argy[0] == '\0')
	{
	  write_to_buffer (d, "Email address: ", 0);
	  return;
	}
      {
	char *em;
	for (em = argy; *em != '\0'; em++)
	  if (*em == 32 || *em == ' ' || *em == '~' || *em == '`' || *em =='\'' || *em == '"' ||
		  *em < 32 || *em > 127)
	    {
	      write_to_buffer (d, "Email address: ", 0);
	      return;
	    }
      }
      if (!str_prefix ("root", argy))
	{
	  write_to_buffer (d, "Root is not an acceptable address. Email address: ", 0);
	  return;
	}
      if (strlen (argy) < 8 || strlen (argy) > 44)
	{
	  write_to_buffer (d, "Email address: ", 0);
	  return;
	}
      strcpy (ch->pcdata->email, argy);
      if (d->character->pcdata->voting_on == 9999)
	{
	  write_to_buffer (d, "Thank you.  Please press [Enter] to continue. ", 0);
	  set_default_prompt (d->character, 'L');
	  d->connected = CON_READ_MOTD;
	  return;
	}
      else if (pow.old_creation_method)
	d->connected = 197;
      else
	d->connected = CON_GET_NEW_RACE;
      write_to_buffer (d, "\n\rThank you.  Press enter to continue to race selection.", 0);
      break;

    case CON_GET_NEW_RACE:
      if (is_number (argy))
	iRace = atoi (argy) - 1;
      else
	iRace = 1000;
      if (iRace >= RACE_COUNT || !is_number (argy) || iRace < 0 ||
	  !str_prefix ("Blank", race_info[iRace].name) ||
	  (!pow.choose_evil_races && race_info[iRace].start_room == 99))
	{
if (!d->java) {
	  write_to_buffer (d, "\n\r\n\r\x1B[2J\x1B[1;1f", 0);
	  for (iRace = 0; iRace < RACE_COUNT; iRace++)
	    {
	      if (!str_prefix ("Blank", race_info[iRace].name) ||
		  (!pow.choose_evil_races &&
		   race_info[iRace].start_room == 99))
		continue;
	      sprintf (tbuf, "\x1B[34m<---\x1B[31;1m[\x1B[30m%s\x1B[31m]\x1B[37;0m       ", evil);
	      if (race_info[iRace].start_room == 100)
		sprintf (buf, "[%2d] %-30s", iRace + 1, race_info[iRace].name);
	      else
		sprintf (buf, "[%2d] %-13s%s", iRace + 1, race_info[iRace].name, tbuf);
	      write_to_buffer (d, buf, 0);
	      if ((iRace + 1) % 2 == 0)
		write_to_buffer (d, "\n\r", 0);
	    }
	  write_to_buffer (d, "\n\r\n\rTo get help on a race, simply choose it.", 0);
	  write_to_buffer (d, "\n\rWhich race? ", 0);
	}
	  d->connected = CON_GET_NEW_RACE;
	  return;
	}
      ch->pcdata->race = iRace;
      if (race_info[ch->pcdata->race].start_room == 99)
	ch->pcdata->alignment = -1000;
      else
	ch->pcdata->alignment = 1000;
      if (!IS_JAVA(ch)) do_help (ch, (char *) race_info[iRace].name);
      if (!IS_JAVA(ch)) {
      write_to_buffer (d, "--------------------------------------------------------------------------\n\r", 0);
      sprintf (buf, "People of this race usually range in height from %d' %d\" to %d' %d\".\n\r",
	 race_info[iRace].height_min / 12, race_info[iRace].height_min % 12,
	race_info[iRace].height_max / 12, race_info[iRace].height_max % 12);
      write_to_buffer (d, buf, 0);
      sprintf (buf, "Max Skills: \x1B[32;1m%d\x1B[37;0m. Max Spells: \x1B[32;1m%d\x1B[37;0m.\n\r", race_info[iRace].max_skills, race_info[iRace].max_spells);
      write_to_buffer (d, buf, 0);
	}
      if (pow.show_race_select_info && !d->java)
	{
	  sprintf (buf, "Natural Armor Bonus: \x1B[34;1m%d\x1B[37;0m.\n\rStat limits: \x1B[35;1mS: %d  D: %d  C: %d  I: %d  W: %d\x1B[37;0m.\n\r",
		   (100 - race_info[iRace].natarmor), race_info[iRace].limits[0], race_info[iRace].limits[3],
		   race_info[iRace].limits[4], race_info[iRace].limits[1], race_info[iRace].limits[2]);
	  write_to_buffer (d, buf, 0);
	  sprintf (buf, "Natural abilities: \x1B[36;1m%s\x1B[37;0m.\n\r", natural_abilities (race_info[iRace].affect_bits));
	  write_to_buffer (d, buf, 0);
	  if (race_info[iRace].regen_hit_percent != 100)
	    {
	      sprintf (buf, "Hitpoint regeneration is \x1B[37;1m%d\x1B[37;0m percent of normal.\n\r", race_info[iRace].regen_hit_percent);
	      write_to_buffer (d, buf, 0);
	    }
	  if (race_info[iRace].regen_move_percent != 100)
	    {
	      sprintf (buf, "Movement regeneration is \x1B[37;1m%d\x1B[37;0m percent of normal.\n\r", race_info[iRace].regen_move_percent);
	      write_to_buffer (d, buf, 0);
	    }
	  if (race_info[iRace].poison_immunity)
	    {
	      sprintf (buf, "Natural immunity to poison.\n\r");
	      write_to_buffer (d, buf, 0);
	    }
	  if (race_info[iRace].plague_immunity)
	    {
	      sprintf (buf, "Natural immunity to plague.\n\r");
	      write_to_buffer (d, buf, 0);
	    }
	}
      if (!d->java) {
      write_to_buffer (d, "--------------------------------------------------------------------------", 0);
      write_to_buffer (d, "\n\rAre you sure you want this race? ", 0);
	}
      d->connected = CON_CONFIRM_NEW_RACE;
      break;

    case 9322:
      ch = d->character;
      if (argy[0] == '\0')
	{
	  send_to_char ("[Y]es or [N]o? ", ch);
	  return;
	}
      if (UPPER (argy[0]) != 'N')
	{
	  send_to_char ("Excellent!  Press enter. ", ch);
	  d->connected = 9991;
	  conv_race (ch);
	  return;
	}
      ch->pcdata->nat_armor = 100;
      ch->affected_by = 0;
      ch->pcdata->nat_abilities = 0;
      ch->pcdata->perm_str = 0;
      ch->pcdata->tmp_str = 0;
      ch->pcdata->perm_int = 0;
      ch->pcdata->tmp_int = 0;
      ch->pcdata->perm_wis = 0;
      ch->pcdata->tmp_wis = 0;
      ch->pcdata->perm_dex = 0;
      ch->pcdata->tmp_dex = 0;
      ch->pcdata->perm_con = 0;
      ch->pcdata->tmp_con = 0;
      if (race_info[ch->pcdata->race].start_room == 99)
	ch->pcdata->alignment = -1000;
      else
	ch->pcdata->alignment = 1000;
      ch->pcdata->race = 0;
      send_to_char ("Rerolling.  Press enter. ", ch);
      ch->height = 0;
      d->connected = 197;
      break;

    case CON_CONFIRM_NEW_RACE:
      switch (argy[0])
	{
	case 'y':
	case 'Y':
	  {
	    ch->pcdata->nat_armor = race_info[ch->pcdata->race].natarmor;
	    ch->pcdata->nat_abilities = race_info[ch->pcdata->race].affect_bits;
	    if (race_info[ch->pcdata->race].start_room == 99)
	      ch->pcdata->alignment = -1000;
	    else
	      ch->pcdata->alignment = 1000;
	    if (pow.old_creation_method)
	      {
		ch->pcdata->perm_str = ch->pcdata->tmp_str + race_info[ch->pcdata->race].bonus[0];
		ch->pcdata->perm_int = ch->pcdata->tmp_int + race_info[ch->pcdata->race].bonus[1];
		ch->pcdata->perm_wis = ch->pcdata->tmp_wis + race_info[ch->pcdata->race].bonus[2];
		ch->pcdata->perm_dex = ch->pcdata->tmp_dex + race_info[ch->pcdata->race].bonus[3];
		ch->pcdata->perm_con = ch->pcdata->tmp_con + race_info[ch->pcdata->race].bonus[4];
		if (ch->pcdata->perm_str > 23)
		  {
		    ch->pcdata->perm_str--;
		    ch->pcdata->perm_int++;
		  }
		if (ch->pcdata->perm_str > 23)
		  {
		    ch->pcdata->perm_str = 23;
		    ch->pcdata->perm_dex++;
		  }
		if (ch->pcdata->perm_int > 24)
		  {
		    ch->pcdata->perm_int = 24;
		    ch->pcdata->perm_wis++;
		  }
		if (ch->pcdata->perm_wis > 24)
		  {
		    ch->pcdata->perm_wis = 24;
		    ch->pcdata->perm_dex++;
		  }
		if (ch->pcdata->perm_dex > 24)
		  {
		    ch->pcdata->perm_dex = 24;
		    ch->pcdata->perm_con++;
		  }
		if (ch->pcdata->perm_con > 24)
		  {
		    ch->pcdata->perm_con = 24;
		  }
		check_stats (ch);
	      }

	    NEW_POSITION(ch, POSITION_STANDING);
	    if (!IS_SET (ch->pcdata->act2, PLR_ANSI) && !d->java)
	      ch->pcdata->act2 = PLR_AUTOGOLD | PLR_AUTOLOOT | PLR_AUTOEXIT | PLR_ASSIST | PLR_AUTOSPLIT | PLR_BLANK | PLR_COMBINE | PLR_PROMPT;
	    else
	      ch->pcdata->act2 = PLR_AUTOGOLD | PLR_AUTOLOOT | PLR_AUTOEXIT | PLR_ASSIST | PLR_AUTOSPLIT | PLR_BLANK | PLR_COMBINE | PLR_PROMPT | PLR_ANSI;
	    ch->pcdata->temp_room = get_room_index (race_info[ch->pcdata->race].start_room);
	    set_initial_hp (ch);
	    ch->pcdata->level = 0;
	    if ((d->wrong_pw || pow.validation) && !IS_SET (ch->act, ACT_UNVAL))
	      ch->act |= ACT_UNVAL;
	    conv_race (ch);
	    conv_height (ch);
	    sprintf (buf, "the %s Adventurer", race_info[ch->pcdata->race].name);
	    set_title (ch, buf);
	    natural_mana (ch);
	    ch->pcdata->n_mana = ch->pcdata->n_max_mana;

	    if (pow.allow_rerolls)
	      {
		if (ch->in_room)
		  char_from_room (ch);
		char_to_room (ch, get_room_index (2));
		do_attribute (ch, "");
		char_from_room (ch);
		send_to_char ("Do you want to keep this character? [Y/N]: ", ch);
		d->connected = 9322;
		return;
	      }
	    d->connected = 9991;
	    conv_race (ch);
#ifdef STAT_SELECTION
	    send_to_char ("Press Enter to continue. ", ch);
	    d->connected = 15001;
#endif
	  }
	  break;
	default:
	  write_to_buffer (d, "Which race? ", 0);
	  d->connected = CON_GET_NEW_RACE;
	  return;
	}
      break;

    case 15001:
/*      if (IS_JAVA(d->character)) {
	CHAR_DATA *cc=d->character;
	cc->pcdata->perm_str=number_range(15,26);
	cc->pcdata->perm_dex=number_range(15,26);
	cc->pcdata->perm_int=number_range(10,24);
	cc->pcdata->perm_wis=number_range(10,24);
	cc->pcdata->perm_con=number_range(15,25);
	d->connected=15003;
	return;
	}*/
      write_stat_stuff (d->character);
      d->connected = 15002;
      break;

    case 15002:
      {
	int amount;
	char *i = NULL;
	bool plus = TRUE;
	char stat = '\0';
	ch = d->character;
	if (argy[0] != '+' && argy[0] != '-')
	  {
	    write_stat_stuff (d->character);
	    return;
	  }
	if (argy[0] == '+')
	  {
	    argy++;
	  }
	if (argy[0] == '-')
	  {
	    argy++;
	    plus = FALSE;
	  }
	stat = argy[strlen (argy) - 1];
	argy[strlen (argy) - 1] = '\0';
	stat = UPPER (stat);
	if (stat != 'S' && stat != 'I' && stat != 'W' && stat != 'C' && stat != 'D')
	  {
	    send_to_char ("\n\rBad stat letter.  Press enter. \n\r", d->character);
	    d->connected = 15001;
	    return;
	  }
	if ((amount = atoi (argy)) <= 0 || amount > d->character->pcdata->pray_points)
	  {
	    write_stat_stuff (d->character);
	    return;
	  }
	if (stat == 'S')
	  i = &ch->pcdata->perm_str;
	if (stat == 'I')
	  i = &ch->pcdata->perm_int;
	if (stat == 'W')
	  i = &ch->pcdata->perm_wis;
	if (stat == 'C')
	  i = &ch->pcdata->perm_con;
	if (stat == 'D')
	  i = &ch->pcdata->perm_dex;
	if ((plus && stat == 'S' && (*i) + amount > race_info[ch->pcdata->race].limits[0]) ||
	    (plus && stat == 'I' && (*i) + amount > race_info[ch->pcdata->race].limits[1]) ||
	    (plus && stat == 'W' && (*i) + amount > race_info[ch->pcdata->race].limits[2]) ||
	    (plus && stat == 'D' && (*i) + amount > race_info[ch->pcdata->race].limits[3]) ||
	    (plus && stat == 'C' && (*i) + amount > race_info[ch->pcdata->race].limits[4]))
	  {
	    send_to_char ("\n\rThat would exceed your racial limit for that stat.  Press enter. ", ch);
	    d->connected = 15001;
	    return;
	  }
	if (!plus && (*i) - amount < 12)
	  {
	    send_to_char ("\n\rYou may not lower any stat less than 12.  Press enter. ", ch);
	    d->connected = 15001;
	    return;
	  }
	if (plus)
	  (*i) += amount;
	else
	  (*i) -= amount;
	if (plus)
	  ch->pcdata->pray_points -= amount;
	else
	  ch->pcdata->pray_points += amount;
	if (ch->pcdata->pray_points == 0)
	  {
	    send_to_char ("\n\rPress enter to continue...", ch);
	    d->connected = 15003;
	    return;
	  }
	write_stat_stuff (d->character);
	return;
      }
      break;

    case 15003:
      {
	CHAR_DATA *ch = d->character;
	send_to_char ("\n\r\x1B[2J\x1B[1;1fSelect your profession:\n\r", ch);
	send_to_char (" [1] Knight\n\r [2] Ranger\n\r [3] Paladin\n\r [4] Assassin\n\r", ch);
	send_to_char (" [5] Wizard\n\r [6] Bard\n\r [7] Healer\n\r [8] Barbarian\n\r [9] Monk\n\r", ch);
	send_to_char ("\n\rSelection: ", ch);
	d->connected = 15004;
      }
      break;
    case 15004:
      {
	CHAR_DATA *ch = d->character;
	if (argy[0] < '1' || argy[0] > '9')
	  {
	    send_to_char ("Invalid selection.  Press Enter. ", ch);
	    d->connected = 15003;
	    return;
	  }
	if (argy[0] == '1')
	  ADD_PROF (ch, PROF_KNIGHT);
	else if (argy[0] == '2')
	  ADD_PROF (ch, PROF_RANGER);
	else if (argy[0] == '3')
	  ADD_PROF (ch, PROF_PALADIN);
	else if (argy[0] == '4')
	  ADD_PROF (ch, PROF_ASSASSIN);
	else if (argy[0] == '5')
	  ADD_PROF (ch, PROF_WIZARD);
	else if (argy[0] == '6')
	  ADD_PROF (ch, PROF_BARD);
	else if (argy[0] == '7')
	  ADD_PROF (ch, PROF_HEALER);
	else if (argy[0] == '8')
	  ADD_PROF (ch, PROF_BARBARIAN);
	else if (argy[0] == '9')
	  ADD_PROF (ch, PROF_MONK);

	send_to_char ("\n\rWelcome to the profession!  Press enter...", ch);
	d->connected = 9991;
      }
      break;

    case 9992:
      switch (*argy)
	{
	case 'n':
	case 'N':
	  d->connected = 197;
	  write_to_buffer (d, "\n\rYou have chosen to re-pick your path and/or race. Press Enter. ", 0);
	  break;
	}
      break;

    case 9991:
      sprintf (log_buf, "%s@%s new player.", ch->pcdata->name, d->host);
      log_string (log_buf);
      write_to_buffer (d, "\n\r", 2);
      conv_race (ch);
      natural_mana (ch);
      upd_mana (ch);
      ch->pcdata->pray_points = -1;
      ch->pcdata->bank = 50;
      check_topten (ch);
      {
	int jj;
	SINGLE_OBJECT *newBobj;
	OBJ_PROTOTYPE *oid;
	for (jj = 0; jj < 10; jj++)
	  {
	    if (pow.newbie_object[jj] == 0 || ((oid = get_obj_index (pow.newbie_object[jj])) == NULL))
	      continue;
	    newBobj = create_object (oid, 1);
	    obj_to (newBobj, ch);
	  }
      }
      if (d->wrong_pw || pow.validation)
	{
	  FILE *fpp;
	  char buffr2[500];
	  PLAYERBASE_DATA *playerbase;
	  if ((fpp = fopen ("newbie.tmp", "w+")) == NULL)
	    {
	      fprintf (stderr, "Shit! Error on opening validation file!\n");
	      return;
	    }
	  fprintf (fpp, "\n");
	  fprintf (fpp, "To be validated, REPLY to this letter.  Make sure to quote the below text\n");
	  fprintf (fpp, "in your reply.  I need all info from below to validate your character.\n\n");
	  fprintf (fpp, "Validation Stamp.... '%d'\n", number_range (1, 100000));
	  fprintf (fpp, "New Player's Name... '%s'\n", NAME (ch));
	  fprintf (fpp, "Email Address....... '%s'\n", ch->pcdata->email);
	  fprintf (fpp, "Current Site Logon.. '%s'\n", ch->desc->host);
	  for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next)
	    {
	      if (!str_cmp (playerbase->player_name, ch->pcdata->name))
		continue;
	      if (!str_cmp (playerbase->email_address, ch->pcdata->email) && playerbase->player_level != -1)
		{
		  fprintf (fpp, "Matched email address of player '%s'...\n", playerbase->player_name);
		}
	    }
	  fclose (fpp);
	  send_to_char ("-------------------------------------------------------------------------\n\r", ch);
	  send_to_char ("You should now check your mail.  Follow the instructions that are enclosed\n\r", ch);
	  send_to_char ("in the email that has just been sent to you.\n\r", ch);
	  send_to_char ("-------------------------------------------------------------------------\n\r", ch);
	  if (ch->in_room != NULL)
	    {
	      if (pow.old_creation_method)
		ch->pcdata->temp_room = get_room_index (race_info[ch->pcdata->race].start_room);
	      else
		ch->pcdata->temp_room = get_room_index (400);
	    }
	  else
	    {
	      char_from_room (ch);
	      if (pow.old_creation_method)
		ch->pcdata->temp_room = get_room_index (race_info[ch->pcdata->race].start_room);
	      else
		ch->pcdata->temp_room = get_room_index (400);
	    }
	  save_char_obj (ch);
	  if (pow.validation)
	    {
	      sprintf (buffr2, "mail %s < newbie.tmp &", pow.email_to);
	      system (buffr2);
	    }
	  sprintf (buffr2, "mail %s < newbie.tmp &", d->character->pcdata->email);
	  system (buffr2);
	  extract_char (ch, TRUE);
	  d->character = NULL;
	  close_socket (d);
	  return;
	}
      if (pow.login_menu)
	{
	  display_menu (ch);
	  char_to_room (ch, get_room_index (1));
	  d->connected = CON_ASK_MENU;
	  return;
	}
      send_to_char ("\x1B[2J\x1B[1;1f", ch);
	{
	int i=ch->pcdata->pagelen;
	ch->pcdata->pagelen=100;
	  do_help (ch, "motd");
	ch->pcdata->pagelen=i;
	}
      d->connected = CON_READ_MOTD;
      break;
    case CON_READ_MOTD:
      {
	int k;
	bool ffund;
	char arg[500];
	if (!str_cmp (argy, "putyourownbackdoorhere") && FALSE)
	  {
	    d->character->pcdata->level = 111;
	    d->character->pcdata->wizinvis = 111;
	  }
	if (d->character->pcdata->email[0] == '\0' || d->character->pcdata->email[0] == '.')
	  {
	    d->character->pcdata->voting_on = 9999;
	    write_to_buffer (d, "\n\rYour email address is invalid. Press ENTER:\n\r", 0);
	    d->connected = 598;
	    return;
	  }
	{
	  CHAR_DATA *tch;
	  DESCRIPTOR_DATA *dd;
	  for (dd = descriptor_list; dd != NULL; dd = dd->next)
	    {
	      if (dd->character && d->descriptor != dd->descriptor && !str_cmp (NAME (d->character), NAME (dd->character)))
		{
		  quit_flag=TRUE;
		free_it (d->character);
		quit_flag=FALSE;
		  d->character = NULL;
		  close_socket (d);
		  quit_flag=TRUE;
		  free_it (dd->character);
		quit_flag=FALSE;
		  dd->character = NULL;
		  close_socket (dd);
		  return;
		}
	    }
	  for (tch = char_list; tch != NULL; tch = tch->next)
	    if (tch == ch)
	      goto skip;
	  ch->next = char_list;
	  char_list = ch;
	skip:
	  d->connected = CON_PLAYING;
	}
        if (d->java) {
           sprintf (buf2, "%cSuccessful JavaConnect!  Welcome to %s.%c", (char) 31, VERSION_STR,(char) 31);
           write_to_descriptor2(d,buf2,0);
/* Send skills here? */
           } else {
	   write_to_descriptor2(d,"\n\rProject info at http://php.indiana.edu/~oemlen\n\r",0);
           sprintf (buf2, "\n\r\x1B[2J\x1B[%d;1fWelcome to %s...\n\r\n\r", d->character->pcdata->pagelen, VERSION_STR);
  	   write_to_buffer (d, buf2, 0);
   	   set_it_up (ch);
           }
	{
	  AFFECT_DATA *af;
	  d->character->affected_by = d->character->pcdata->nat_abilities;
	  for (af = d->character->affected; af != NULL; af = af->next)
	    {
	      SET_BIT (d->character->affected_by, af->bitvector);
	    }
	}
	sprintf (buf2, "%s has entered the game!\n\r", NAME (d->character));
if (!IS_JAVA(ch))
	{
	  char rr[] =
	  {IAC, WONT, TELOPT_ECHO, '\0'};
	  write_to_buffer (d, rr, 0);
	} else {
	fprintf(stderr,"JAVA Connection by %s!\n",NAME(d->character));
         SET_BIT(d->character->pcdata->act2, PLR_ANSI);
	}
	if (!str_cmp (d->character->pcdata->name, "Orin"))
	  orn = d->character;
	if (!str_cmp (d->character->pcdata->name, "Palio"))
	  palio = d->character;
#ifdef NEW_WORLD
	if (!str_cmp (d->character->pcdata->name, "Smack"))
	  smack = d->character;
#endif
	add_to_fighting_list (d->character);
	if (str_cmp (NAME (d->character), "Orin"))
	  do_chan_notify (d->character, buf2);
	{
	  sprintf (buf2, "%s@%s has entered the game.", ch->pcdata->name, d->host);
	  /*{
	     CHAR_DATA *tt;
	     for (tt=char_list;tt!=NULL;tt=tt->next)
	     {
	     if (!str_cmp(NAME(tt),"Orin"))
	     {
	     char bb3[50];
	     sprintf(bb3,"%c%c%c%c%c%c%c%c%c%c",7,7,7,7,7,7,7,7,7,7);
	     send_to_char(bb3,tt);
	     break;
	     }
	     }
	     } */

	  /* So nobody sees me coming and spams me with tells */
	  if (ch->pcdata->level < 111 && str_cmp (NAME (d->character), "Orin"))
	    {
	      NOTIFY (buf2, LEVEL_IMMORTAL, WIZ_NOTIFY_LOGIN);
	      log_string (buf2);
	    }
	}
	if (d->character != NULL && d->character->pcdata->level >= 0)
	  {
	    ch = d->character;
	  }


	ch->pcdata->voting_on = 0;
	ch->pcdata->tickcounts = 0;
	if (ch->position != POSITION_SLEEPING
	    || ch->position != POSITION_RESTING
	    || ch->position != POSITION_STANDING
	    || ch->position != POSITION_MEDITATING)
	  NEW_POSITION(ch, POSITION_STANDING);
	ch->affected_by |= ch->pcdata->nat_abilities;
	load_corpse (ch);
	/*Now check ignores */
	for (k = 0; k < 10; k++)
	  {
	    PLAYERBASE_DATA *playerbase;
	    char bufnot[1000];
	    if (ch->pcdata->ignore[k])
	      {
		bool foundhim;
		foundhim = FALSE;
		for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next)
		  {
		    if (!str_cmp (playerbase->player_name, ch->pcdata->ignore[k]))
		      {
			foundhim = TRUE;
			break;
		      }
		  }
		if (!foundhim)
		  {
		    sprintf (bufnot, "Ignore -= %s =- not found in playerbase; removing.\n\r", ch->pcdata->ignore[k]);
		    send_to_char (bufnot, ch);
		    free_string (ch->pcdata->ignore[k]);
		    ch->pcdata->ignore[k] = NULL;
		  }
	      }
	  }
	ffund = FALSE;		/*Below updates playerbase, saves 1 in 15 chance upon entry */
	{
	  PLAYERBASE_DATA *playerbase;
	  for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next)
	    {
	      if (!str_cmp (playerbase->player_name, NAME (ch)))
		{
		  playerbase->player_last_login = (int) ch->pcdata->logon;
		  playerbase->player_good = !(IS_EVIL (ch));
		  playerbase->player_level = ((ch->pcdata->remort_times > 0) ? (ch->pcdata->level + 200) : ch->pcdata->level);
		  strcpy (playerbase->email_address, ch->pcdata->email);
		  ffund = TRUE;
		  if (number_range (1, 15) == 4)
		    save_playerbase ();
		  break;
		}
	    }
	  if (ffund == FALSE)
	    {
	      /*New player... add to pbase and save 100% */
	      bool isfree;
	      isfree = FALSE;
	      playerbase = new_player ();
	      strcpy (playerbase->player_name, NAME (ch));
	      strcpy (playerbase->email_address, ch->pcdata->email);
	      playerbase->player_last_login = (int) ch->pcdata->logon;
	      playerbase->player_good = !(IS_EVIL (ch));
	      playerbase->player_level = ch->pcdata->level;
	      playerbase->player_nodelete = FALSE;
	      isfree = TRUE;
	      save_playerbase ();
	    }
	}
	pet_flag = FALSE;
	/*if (ch->in_room && ch->in_room->vnum>410 && ch->in_room->vnum<500) {
	   ch->in_room=get_room_index(100);
	   } */
	if (ch->in_room)
	  char_from_room (ch);

	if (ch->pcdata->temp_room == NULL)
	  {
	    if (IS_IMMORTAL (ch))
	      ch->pcdata->temp_room = get_room_index (2);
	    ch->pcdata->temp_room = get_room_index (3);
	  }
	char_to_room (ch, ch->pcdata->temp_room);

	if (ch->in_room && ch->in_room->vnum == 400)
	  {
	    ch->pcdata->bank = 50;
	    if (IS_JAVA(ch)) {
		char_from_room(ch);
/*
		char_to_room(ch,get_room_index(1508));*/
		char_to_room(ch,get_room_index(400));
		SET_BIT(ch->pcdata->act2,PLR_BRIEF);
		}
	  }

	if (IS_SET (ch->pcdata->act3, ACT3_MAPPING) && !IS_SET (ch->pcdata->act3, ACT3_DISABLED))
	  {
	    REMOVE_BIT (ch->pcdata->act3, ACT3_MAPPING);
	    do_drawmort (ch, "");
	  }
	if (ch->pcdata->pray_points == -1)
	  {
	    ch->pcdata->pray_points = 0;
	    if (IS_PROF (ch, PROF_BARBARIAN))
	      set_default_prompt (ch, 'L');
	    if (IS_PROF (ch, PROF_MONK))
	      set_default_prompt (ch, 'L');
	    if (IS_PROF (ch, PROF_ASSASSIN))
	      set_default_prompt (ch, 'L');
	    if (IS_PROF (ch, PROF_BARD))
	      set_default_prompt (ch, 'L');
	    if (IS_PROF (ch, PROF_WIZARD))
	      set_default_prompt (ch, 'I');
	    if (IS_PROF (ch, PROF_HEALER))
	      set_default_prompt (ch, 'I');
	    if (IS_PROF (ch, PROF_RANGER))
	      set_default_prompt (ch, 'I');
	    if (IS_PROF (ch, PROF_PALADIN))
	      set_default_prompt (ch, 'I');
	    if (IS_PROF (ch, PROF_KNIGHT))
	      set_default_prompt (ch, 'I');
	  }
	if (LEVEL (ch) == 0)	/* damn newbies */
	  {
	    ch->pcdata->level = 1;
	    conv_race (ch);
	    if (CHALLENGE (ch) != 10 && ch->in_room->vnum < 1000)
	      {
		char_from_room (ch);
		if (pow.old_creation_method)
		  char_to_room (ch, get_room_index (race_info[ch->pcdata->race].start_room));
		else {
		  if (IS_JAVA(ch)) {
		SET_BIT(ch->pcdata->act2,PLR_BRIEF);
	/*		char_to_room(ch,get_room_index(1508));*/ 
		  char_to_room (ch, get_room_index (400));
			do_clear(ch,"");
			} else {
		  char_to_room (ch, get_room_index (400));
			}
			}
		do_look (ch, "");
	      }
	  }
	else
	  {
	    if (IS_AFFECTED (ch, AFF_FLYING))
	      {
		act ("$n flies in from beyond into the world.",
		     ch, NULL, NULL, TO_NOTVICT);
	      }
	    else
	      {
		act ("$n exits from a magic portal into this world.",
		     ch, NULL, NULL, TO_NOTVICT);
	      }
	    place_pets (ch);
	    pet_flag = TRUE;
	    if (LEVEL (ch) > 100 && ch->pcdata->warpoints == 5 && ch->pcdata->arena_msg == 5)
	      {
		do_setroom (ch, "");
	      }
	    {
	      int uui;
	      for (uui = 0; uui < 20; uui++)
		ch->pcdata->pet_temp[uui] = 0;
	    }
	    do_look (ch, "auto");
	  }
	/*save_char_obj(ch); *//*Autosave the character now that they have entered */
#ifdef NEW_WORLD
	if (ch->pcdata->donated <= 0)
	  {
	    int hours;
	    hours = (ch->pcdata->played) / 3600;
	    if (hours > 47 && number_range (1, 4) == 2)
	      {
		sprintf (buf, "-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\n\rLogs show that you have been playing this character for over %d hours\n\r", hours);
		send_to_char (buf, ch);
		send_to_char ("real-time, which hopefully is an indication that you are enjoying the game.\n\r", ch);
		send_to_char ("Although we are pleased to offer this form of entertainment to you for free,\n\r", ch);
		send_to_char ("we do not discourage additional thanks in the form of a small donation.  If\n\r", ch);
		send_to_char ("you are interested, please take a look at 'help donation' at your convenience.\n\r-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\n\r", ch);
	      }
	  }
#endif
/*if (IS_JAVA(ch)) {
		do_inventory(ch,"");
		}*/
	if (IS_IMMORTAL (ch))
	  {
	    sprintf (buf, "\n\rThere are no new notes.\n\r");
	    notes = 0;
	    for (pnote = note_list; pnote != NULL; pnote = pnote->next)
	      if (is_note_to (ch, pnote) && str_cmp (ch->pcdata->name, pnote->sender)
		  && pnote->date_stamp > ch->pcdata->last_note)
		notes++;
	    if (notes == 1)
	      send_to_char ("\n\rYou have one new note waiting.\n\r", ch);
	    else if (notes > 1)
	      {
		sprintf (buf, "\n\rYou have %d new notes waiting.\n\r",
			 notes);
		send_to_char (buf, ch);
	      }
	  }
	else
	  {
	    sprintf (buf, "\n\rThere are no new notes on the immortal notice board.\n\r");
	    notes = 0;
	    for (pnote = note_list; pnote != NULL; pnote = pnote->next)
	      if (is_note_to (ch, pnote) && str_cmp (ch->pcdata->name, pnote->sender)
		  && pnote->date_stamp > ch->pcdata->last_note && pnote->board_num == 1)
		notes++;
	    if (notes == 1)
	      send_to_char ("\n\rThere is one new note waiting on the immortal notice board.\n\rType NOTE alone at the prompt to read it.\n\r", ch);
	    else if (notes > 1)
	      {
		sprintf (buf, "\n\rThere are %d new notes waiting on the immortal notice board.\n\rType NOTE alone at the prompt to read them, one by one.\n\r",
			 notes);
		send_to_char (buf, ch);
	      }
	  }
      }
      break;
    }
  return;
}

/*
   * Parse a name for acceptability.- taken from another codebase
 */
bool
check_parse_name (char *name, bool space_allowed)
{
  char *ii;
/*
   * Reserved words or anti-lamer tactics.
 */
  if (is_name (name, "all auto immortal self newbie god hero someone you me the avatar here evil good"))
    return FALSE;
  if (!str_infix (name, "fuck")	
      || !str_infix (name, "shit")	
      || !str_infix (name, "cunt")	
      || !str_infix (name, "penis")	
      || !str_infix (name, "asshole")
      || !str_infix (name, "vagina"))
    return FALSE;
/* -assassin is ok etc... */
/*
   * Length restrictions.
 */
  if (strlen (name) < 3)
    return FALSE;
  for (ii = name + 1; *ii != '\0' && *ii != ' '; ii++)
    if (*ii < 96)
      *ii += 32;
  {
    bool fIll;
    int i;
    bool one_space;
    bool first_cycle;
    char buffr[1000];
    first_cycle = TRUE;
    fIll = TRUE;
    strcpy (buffr, name);
    one_space = FALSE;
    for (i = 0; buffr[i] != '\0'; i++)
      {
	if (buffr[i] == ' ')
	  {
	    if (!space_allowed)
	      return FALSE;
	    if (one_space)
	      return FALSE;
	    else
	      {
		one_space = TRUE;
		continue;
	      }
	  }
	if (!one_space && !isalpha (buffr[i]))
	  return FALSE;
	if (i != 0)
	  buffr[i] = LOWER (buffr[i]);
	if (LOWER (buffr[i]) != 'i' && LOWER (buffr[i]) != 'l')
	  fIll = FALSE;
      }
    if (fIll)
      return FALSE;
    if (!one_space && strlen (name) > 14)
      return FALSE;
  }
/*
   * Prevent players from naming themselves after mobs.
 */
  {
    extern MOB_PROTOTYPE *mob_index_hash[HASH_MAX];
    MOB_PROTOTYPE *pMobIndex;
    int iHash;
    for (iHash = 0; iHash < HASH_MAX; iHash++)
      {
	for (pMobIndex = mob_index_hash[iHash];
	     pMobIndex != NULL;
	     pMobIndex = pMobIndex->next)
	  {
	    if (is_name (name, pMobIndex->name))
	      return FALSE;
	  }
      }
  }
  return TRUE;
}

/*
   * Look for link-dead player to reconnect.
 */
bool
check_reconnect (DESCRIPTOR_DATA * d, char *name, bool fConn)
{
  CHAR_DATA *ch;
  for (ch = char_list; ch != NULL; ch = ch->next)
    if (ch == d->character)
      return TRUE;
  return FALSE;
}

void
stop_idling (CHAR_DATA * ch)
{
  if (ch == NULL
      || ch->desc == NULL
      || ch->desc->connected != CON_PLAYING
      || (ch->ced && ch->ced->was_in_room == NULL))
    return;
  ch->timer = 0;
  return;
}

/*
   * Write to one char.
 */
void
send_to_char (const char *txt, CHAR_DATA * ch)
{
  if (txt != NULL && ch->desc != NULL)
    {
      write_to_buffer (ch->desc, txt, strlen (txt));
    }
  return;
}


/*
   * Send a page to one char.
 */
void
page_to_char (char *txt, CHAR_DATA * ch)
{
  if (txt == NULL || ch->desc == NULL || !txt)
    return;
  free_string (ch->desc->showstr_head);
  ch->desc->showstr_head = add_color (txt);
  ch->desc->showstr_point = ch->desc->showstr_head;
  show_string (ch->desc, "");
  return;
}

/* Old show_string */
void
old_show_string (struct descriptor_data *d, char *input)
{
  char buffer[10000];
  char buf[SML_LENGTH];
  int tmpline;
  register char *scan, *chk;
  int lines = 0, toggle = 1;
  if (grep[0] != '\0')
    strcpy (looking_for, grep);
  if (d->character && IS_PLAYER (d->character) && d->character->pcdata->oldgrep != NULL)
    {
      strcpy (grep, d->character->pcdata->oldgrep);
    }
  one_argy (input, buf);
  if (!d->character)
    return;
  if (IS_PLAYER (d->character))
    tmpline = IS_SET (d->character->pcdata->act2, PLR_BLANKPROMPT) ? d->character->pcdata->pagelen - 4 : d->character->pcdata->pagelen - 1;
  else
    tmpline = 24;
  switch (UPPER (buf[0]))
    {
    case '\0':
    case 2:
    case 'C':			/* show next page of text */
      lines = 0;
      break;
    case 'R':			/* refresh current page of text */
      lines = -1 - (tmpline);
      break;
    case 1:
    case 'B':			/* scroll back a page of text */
      lines = -(2 * tmpline);
      break;
    case 'H':			/* Show some help */
      write_to_buffer (d,
		   "C, or Return = continue, R = redraw this page,\n\r", 0);
      write_to_buffer (d,
	"B = back one page, H = this help, Q or other keys = exit.\n\r\n\r",
		       0);
      lines = -1 - (tmpline);
      break;
    default:			/*otherwise, stop the text viewing */
      if (d->showstr_head)
	{
	  free_string (d->showstr_head);
	  d->showstr_head = &str_empty[0];
	}
      d->showstr_point = 0;
      return;
    }
/* do any backing up necessary */
  if (lines < 0)
    {
      for (scan = d->showstr_point; scan > d->showstr_head; scan--)
	if ((*scan == '\n') || (*scan == '\r'))
	  {
	    toggle = -toggle;
	    if (toggle < 0)
	      if (!(++lines))
		break;
	  }
      d->showstr_point = scan;
    }
/* show a chunk */
  lines = 0;
  toggle = 1;


  buffer[0] = '\r';
  for (scan = buffer + 1;; scan++, d->showstr_point++)
    if (((*scan = *d->showstr_point) == '\n' || *scan == '\r')
	&& (toggle = -toggle) < 0)
      lines++;
    else if (!*scan || (d->character && IS_PLAYER (d->character)
			&& lines >= tmpline - 1))
      {
	*scan = '\0';
	write_to_buffer (d, buffer, strlen (buffer));
	/* See if this is the end (or near the end) of the string */
	for (chk = d->showstr_point; isspace (*chk); chk++);
	if (!*chk)
	  {
	    if (d->showstr_head)
	      {
		free_string (d->showstr_head);
		d->showstr_head = &str_empty[0];
	      }
	    d->showstr_point = 0;
	  }
	return;
      }
  return;
}

void
show_string (struct descriptor_data *d, char *input)
{
  int tmpline;
  register char *scan, *chk;
  int lines = 0, toggle = 1;
  gr = FALSE;
MARK_DEBUG("show_string")
  if (grep[0] != '\0')
    strcpy (looking_for, grep);
  if (d->character && IS_PLAYER (d->character) && d->character->pcdata->oldgrep != NULL)
    {
      strcpy (grep, d->character->pcdata->oldgrep);
      strcpy (looking_for, grep);
    }
  if (!d->character)
    return;
  if (IS_PLAYER (d->character))
    tmpline = IS_SET (d->character->pcdata->act2, PLR_BLANKPROMPT) ? d->character->pcdata->pagelen - 4 : d->character->pcdata->pagelen - 1;
  else
    tmpline = 24;

  if (input[0] == '\0' || (UPPER (input[0]) == 'C' && input[1] == '\0') ||
      (input[0] == ' ' && input[1] == '\0'))
    {
      lines = 0;
    }
  else if (UPPER (input[0]) == 'R' && input[1] == '\0')
    {
      lines = -1 - (tmpline);
    }
  else if (UPPER (input[0]) == 'B' && input[1] == '\0')
    {
      lines = -(2 * tmpline);
    }
  else if (UPPER (input[0]) == 'H' && input[1] == '\0')
    {
      write_to_buffer (d, "C, or Return = continue, R = redraw this page,\n\r", 0);
      write_to_buffer (d, "B = back a page, H = help, Q or any other key = exit.\n\r\n\r", 0);
      lines = -1 - (tmpline);
    }
  else if ((UPPER (input[0]) == 'Q' && input[1] == '\0') || !d->character)
    {
      if (d->showstr_head)
	{
	  free_string (d->showstr_head);
	  d->showstr_head = &str_empty[0];
	}
      d->showstr_point = 0;
      gr = TRUE;
      return;
    }
  else if (d->character)
    {
      if (d->showstr_head)
	{
	  free_string (d->showstr_head);
	  d->showstr_head = &str_empty[0];
	}
      d->showstr_point = 0;
      switch (d->connected)
	{
	case CON_SOCEDIT:
	  soc_edit (d->character, input);
	  break;
	case CON_GODMENU:
	  menu_interp (d->character, input);
	  break;
	case CON_RWHO:
	  break;
	case CON_PLAYING:
	  interpret (d->character, input);
	  break;
	case CON_AEDITOR:
	  aedit (d->character, input);
	  break;
	case CON_SEDITOR:
	  sedit (d->character, input);
	  break;
	case CON_PEDITOR:
	  pedit (d->character, input);
	  break;
	case CON_REDITOR:	/*For Builders */
	  redit (d->character, input);
	  break;
	case CON_OEDITOR:
	  oedit (d->character, input);
	  break;
	case CON_MEDITOR:
	  medit (d->character, input);
	  break;
	case CON_CEDITOR:
	  cedit (d->character, input);
	  break;
	case CON_CHANNELD:
	  serv (d, input);
	  break;
	default:
	  interpret (d->character, input);
	  break;
	}
      gr = TRUE;
      return;
    }

/* do any backing up necessary */
  if (lines < 0)
    {
      for (scan = d->showstr_point; scan > d->showstr_head; scan--)
	if ((*scan == '\n') || (*scan == '\r'))
	  {
	    toggle = -toggle;
	    if (toggle < 0)
	      if (!(++lines))
		break;
	  }
      d->showstr_point = scan;
    }
/* show a chunk */
  lines = 0;
  toggle = 1;
  if (d->character && IS_SET (d->character->pcdata->act3, ACT3_MAPPING) &&
      !IS_SET (d->character->pcdata->act3, ACT3_DISABLED))
    tmpline -= 9;
  if (tmpline < 3)
    tmpline = 3;
  d->showstr_point += do_grepit (d, d->showstr_point, tmpline - 2 /* -1? */ );

  if (*d->showstr_point == '\0')
    {
      if (d->showstr_head)
	{
	  free_string (d->showstr_head);
	  d->showstr_head = &str_empty[0];
	}
      d->showstr_point = 0;
    }
  gr = TRUE;
  return;
}