/
bin/95/
docs/DM/
docs/creatures/
docs/objects/
docs/rooms/
docs/utils/
help/
log/
objmon/ddesc/
player/
post/
rooms/
util/
util/fing/
util/italk/
util/lev-reset/
util/lib/
util/list/
util/msg/
util/tdel/
util/vote/
util/wtfix/
/*
 * DM7.C:
 *
 *  DM functions
 *
 *  Copyright (C) 1995, 1997 Brooke Paul
 *
 */

#include "mstruct.h"
#include "mextern.h"
#ifdef DMALLOC
  #include "/usr/local/include/dmalloc.h"
#endif

/**************************************************************************
 *  dm_save_crt allows a dm to save modified creatures.  
 */

int dm_save_crt(ply_ptr, cmnd)
creature 	*ply_ptr;
cmd		*cmnd;
{
	creature  *crt_ptr;
	ttag      *tp,*tempt;
        char	  file[80];
	int	  fd, ff, n, index, i=0,x,y, bad=0;
	otag	  *op, *otemp;
	ctag	  *fol;
	fd = ply_ptr->fd;

	if(ply_ptr->class < DM)
		return(PROMPT);

	if(cmnd->num < 3) {
		print(fd, "Syntax: *save c [name] [number]\n");
		return(0);
	}
        
       crt_ptr = find_crt(ply_ptr,ply_ptr->parent_rom->first_mon, cmnd->str[2], 1);    
 
       if (!crt_ptr)
       {
         print(fd,"Creature not found.\n");
         return(PROMPT);
       }

       if(cmnd->val[2] < 2 || cmnd->val[2] > CMAX) {
		print(fd, "Index error: creature number invalid.\n");
		return(PROMPT);   
       }
	index = cmnd->val[2];
        tp = crt_ptr->first_tlk;
	while(tp) {
		tempt = tp->next_tag;
		if(tp->key) free(tp->key);
		if(tp->response) free(tp->response);
		if(tp->action) free(tp->action);
		if(tp->target) free(tp->target);
	        free(tp);
		tp = tempt;
	}
        crt_ptr->first_tlk = 0;
	op=crt_ptr->first_obj;
	if(!F_ISSET(crt_ptr, MTRADE)) { 
		while(op) {
			x=find_obj_num(op->obj);
			if(!x) {
			print(fd,"Unique object in inventory not saved.\n");
			op=op->next_tag;
			continue;
			}
			crt_ptr->carry[i]=(long)x;
			i++;
			if(i>9){
			print(fd, "Only first 10 objects in inventory saved.\n");
			break;
			}		
		op=op->next_tag;
		}
	 /*

	else 
		while(op) {
			otemp=op->next_tag;
			x=find_obj_num(op->obj);		
			if(!x) {
                        print(fd,"Unique object in inventory.\n");
			print(fd, "Fix inventory and resave.\n");
			print(fd, "Save Aborted.\n");
			bad=1;
			break;
                        }
			y=0;
			if(otemp)
				y=find_obj_num(otemp->obj);
			if(!y) {
                        print(fd, "Fix inventory and resave.\n");
                        print(fd, "Save Aborted.\n");
                        bad=1;
                        break;
                        }
			crt_ptr->carry[i]=(long)x;
			crt_ptr->carry[i+5]=(long)y;
			i +=2;  
                        if(i>9){
                        print(fd, "Too many items in inventory.\n");
			print(fd, "Fix inventory and resave.\n");
                        print(fd, "Save Aborted.\n");
                        bad=1;
			break;
                        }
		
		op=otemp->next_tag;
		}
		if(bad)
			return(PROMPT); */

		/* clear remaining carry slots */
	        while(i<9) {
                crt_ptr->carry[i]=0;
                i++;
        	}

	}
	/* flush inventory -- dont exactly know why this is necessary... */
	op=crt_ptr->first_obj;
	crt_ptr->first_obj=0;
	while(op) {
		otemp=op->next_tag;
		free_obj(op->obj);
		free(op);
		op=otemp;
	}

	/* clean up possesed before save */
	if(F_ISSET (crt_ptr, MDMFOL)) { /* clear relevant follow lists */
                        F_CLR(crt_ptr->following, PALIAS);
			F_CLR(crt_ptr, MDMFOL);
                        Ply[crt_ptr->following->fd].extr->alias_crt = 0;
                        print (crt_ptr->following->fd, "%1M's soul was saved.\n", crt_ptr);
                        fol = crt_ptr->following->first_fol;
                        if(fol->crt == crt_ptr) {
                                crt_ptr->following->first_fol = fol->next_tag;
                                free(fol);
                        }
	
	 }
	/* Update index */
	sprintf(crt_ptr->password, "%d", index);

	sprintf(file, "%s/m%02d", MONPATH, index/MFILESIZE);
        ff = open(file, O_RDONLY, 0);
        if(ff >= 0)
        {
             print(fd, "Creature #%d might already exist.\n", index);
        }
        close(ff);
       
       sprintf(file, "%s/m%02d", MONPATH, index/MFILESIZE);
       ff = open(file, O_WRONLY | O_CREAT, ACC);
       if(ff == -1) {
		close(ff);
		print(fd, "File open error.\n");
		return(0);
	}
	n = lseek(ff, (long)((index%MFILESIZE)*sizeof(creature)), 0);
     
        n = write(ff, crt_ptr, sizeof(creature));
	if(n < sizeof(creature))
		merror("write_crt", FATAL);
   
	close(ff);
	print(fd, "Creature #%d updated.\n", index);
	return(0);

}

/**********************************************************************/
/*				dm_add_crt			      */
/**********************************************************************/

/* This function creates a generic creature for a DM to work on.       */
/*              						      */

int dm_add_crt(ply_ptr, cmnd)
creature	*ply_ptr;
cmd		*cmnd;
{
	creature  *new_crt;
	int			fd, n;

	fd = ply_ptr->fd;

	if(ply_ptr->class < DM)
		return(PROMPT);

        new_crt = (creature *)malloc(sizeof(creature));
	if(!new_crt) {
		print(fd, "Cannot allocate memory for creature.\n");
		merror("dm_add_crt", NONFATAL);
		return(PROMPT);
	}	       
	zero(new_crt, sizeof(creature));
        
       	strcpy(new_crt->name, "clay form");
       	strcpy(new_crt->description,"An unformed mass of clay is here.");
        strcpy(new_crt->key[0],"form");
        new_crt->level = 1;
        new_crt->type = MONSTER;
        new_crt->strength     = 10;
        new_crt->dexterity    = 10;
        new_crt->constitution = 10;
        new_crt->intelligence = 10;
        new_crt->piety        = 10;
        new_crt->hpmax = new_crt->hpcur = 12;
        new_crt->armor = 100;
        new_crt->thaco = 19;
        new_crt->experience = 10;
        new_crt->ndice = 1;
        new_crt->sdice = 4;
        new_crt->pdice = 1;
        new_crt->first_obj = 0;
	new_crt->first_fol = 0;
	new_crt->first_enm = 0;
	new_crt->first_tlk = 0;
	new_crt->parent_rom = 0;
	new_crt->following = 0;
	for(n=0; n<20; n++)
		new_crt->ready[n] = 0; 

   	add_crt_rom(new_crt, ply_ptr->parent_rom, 1);
	print(fd, "Creature created.\n");
	return(0);

}
/*****************************************************************************
 *  dm_add_obj and dm_save_obj 
 *  Jan 11 1996
 */

int dm_add_obj(ply_ptr,cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
        object    *new_obj;
	int		fd;

	fd = ply_ptr->fd;

	if(ply_ptr->class < DM)
		return(PROMPT);

	if(cmnd->val[1] < 1) {
		print(fd, "Add what?\n");
		return(0);
	}

        new_obj = (object *)malloc(sizeof(object));
	if(!new_obj) {
		merror("dm_add_obj", NONFATAL);
	        print(fd, "Cannot allocate object.\n");
		return(0);
	}
	       
	zero(new_obj, sizeof(object));
        strcpy(new_obj->name,"small clay ball");
        strcpy(new_obj->description,"You see a plain grey ball.  Perhaps you can make something out of it.");
        strcpy(new_obj->key[0],"ball");
	strcpy(new_obj->key[1],"clay");
        strcpy(new_obj->use_output,"You squeeze a clay ball in your hand.");
	new_obj->wearflag = HELD;
	new_obj->type = MISC;
        new_obj->first_obj = 0;
        new_obj->parent_obj = 0;
        new_obj->parent_rom = 0;
        new_obj->parent_crt = 0;
	
	add_obj_crt(new_obj, ply_ptr);
	print(fd, "Generic object added to your inventory.\n");
	return(0);

}


int dm_save_obj(ply_ptr, cmnd)
creature 	*ply_ptr;
cmd		*cmnd;
{
	object    *obj_ptr,*po;
        otag      *fo;
        room      *rom;
        creature  *pc;
        char	  file[80];
	int			fd, ff, n, index;
        
	fd = ply_ptr->fd;

	if(ply_ptr->class < DM)
		return(PROMPT);

	if(cmnd->num < 3) {
		print(fd, "Syntax: *save o [object] [index]\n");
		return(0);
	}
     
        obj_ptr = find_obj(ply_ptr,ply_ptr->parent_rom->first_obj, cmnd->str[2], 1);    
 
        if (!obj_ptr)
		obj_ptr = find_obj(ply_ptr, ply_ptr->first_obj, cmnd->str[2],1);
  
	if (!obj_ptr){
	        print(fd,"Object not found.\n");
         	return(PROMPT);
        }
       
	if(cmnd->val[2] < 2 || cmnd->val[2] > OMAX) {
	  print(fd,"Index error: object number invalid.\n");
          return(PROMPT);  
        }       

       index=cmnd->val[2];
       sprintf(file, "%s/o%02d", OBJPATH, index/OFILESIZE);
       ff = open(file, O_WRONLY, index);
       if(ff >= 0)
             print(fd, "Object might already exist.\n");
       close(ff);     

       sprintf(file, "%s/o%02d", OBJPATH, index/OFILESIZE);
       ff = open(file, O_WRONLY | O_CREAT, ACC);
       if(ff == -1) {
		close(ff);
		print(fd, "File open error.\n");
		return(0);
	}
	n = lseek(ff, (long)((index%OFILESIZE)*sizeof(object)), 0);
     
       rom = obj_ptr->parent_rom;
       po  = obj_ptr->parent_obj;
       fo  = obj_ptr->first_obj;
       pc  = obj_ptr->parent_crt;
       obj_ptr->parent_rom = 0;
       obj_ptr->parent_obj = 0;
       obj_ptr->first_obj = 0;
       obj_ptr->parent_crt = 0;    
   

        n = write(ff, obj_ptr, sizeof(object));
	if(n < sizeof(object))
		merror("write_obj", FATAL);

	close(ff);
	print(fd, "Object #%d updated.\n", index);
       
       obj_ptr->parent_rom = rom;
       obj_ptr->parent_obj = po;
       obj_ptr->first_obj = fo;
       obj_ptr->parent_crt = pc;    

   return(0);  
}



/*****************************************************************************
 * Talk editing functions 
 * 
 */

int dm_add_talk(ply_ptr, cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
  ttag     *talk;
  int      fd;
   
  fd = ply_ptr->fd;
   
  if(ply_ptr->first_tlk)
     {
       print(fd,"You have a talk defined already.\n");
       return(PROMPT);
     }

  talk = (ttag *) malloc(sizeof(ttag));
  if(!talk)
     merror("dm_add_talk", FATAL);   

  talk->next_tag = 0;
  talk->key = 0;
  talk->response = 0;
  talk->type = 0;
  talk->action = 0;
  talk->target = 0;
  ply_ptr->first_tlk = talk;
  print(fd,"Talk ready for input.\n");
   
  return(PROMPT);
}


int dm_add_talk_key(ply_ptr, cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
  int      fd;
  char     *ptr;
   
  fd = ply_ptr->fd;
   
  if(!ply_ptr->first_tlk)
     {
       print(fd,"You must start a talk first.\n");
       return(PROMPT);
     }
   
  if(ply_ptr->first_tlk->key)
   {  
      print(fd,"Keyword replaced.\n");
      free(ply_ptr->first_tlk->key);
   }
   else
      print(fd,"Keyword set\n");

   ptr = cmnd->fullstr;
   for(;*ptr == ' ';ptr++);
   for(;*ptr != ' ' && *ptr;ptr++);
   for(;*ptr == ' ' && *ptr;ptr++);
   if(!*ptr)
     {
       print(fd,"*tkey <keyword [action] [action args]>");
       return 0;
     }
   ply_ptr->first_tlk->key = (char *)malloc(strlen(ptr)+1);
   if(!ply_ptr->first_tlk->key)
     merror("dm_add_talk_key",FATAL);
   strcpy(ply_ptr->first_tlk->key,ptr);
   return(PROMPT);
}

int dm_add_talk_resp(ply_ptr, cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
  int      fd,append;
  char     *ptr;
  char     buf[1024];
   
  fd = ply_ptr->fd;
   
  if(!ply_ptr->first_tlk)
     {
       print(fd,"You must start a talk first.\n");
       return(PROMPT);
     }
  
  ptr = cmnd->fullstr;
  for(;*ptr == ' ';ptr++);
  for(;;ptr++)
     {
       if(!*ptr)
	  {
           print(fd,"*tres +/- <line>\n");
           return(PROMPT);	  
	  }
       if(*ptr == '+')
	 { 
	  append = 1;
          break;
         }
       if(*ptr == '-')
	 { 
	  append = 0;
	  break;
	 }
     }
   
   if(!*(ptr+1))
     return PROMPT;
   
   if(append && ply_ptr->first_tlk->response)
     {
       strcpy(buf,ply_ptr->first_tlk->response);
       free(ply_ptr->first_tlk->response);
       strcat(buf,++ptr);
     }
   else
     {	
        free(ply_ptr->first_tlk->response);
	strcpy(buf,++ptr);
     }
   ply_ptr->first_tlk->response = (char *) malloc(strlen(buf)+1);
   if(!ply_ptr->first_tlk->response)
     merror("dm_add_talk_resp",FATAL);
   strcpy(ply_ptr->first_tlk->response,buf);
   
   return(PROMPT);
}


int dm_add_talk_show(ply_ptr, cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
	int		fd;
   
  fd = ply_ptr->fd;
   
	if(!ply_ptr->first_tlk) {
       print(fd,"You must start a talk first.\n");
       return(PROMPT);
     }

	if(ply_ptr->first_tlk->key) {
	print(fd,"Keyword: ");
        print(fd,ply_ptr->first_tlk->key);
	print(fd,"\n");
     }
	if(ply_ptr->first_tlk->response) {
	print(fd,"Response:\n");
        print(fd,ply_ptr->first_tlk->response);
	print(fd,"\n");
     }
	return(0);
}


int dm_add_talk_save(ply_ptr, cmnd)
creature *ply_ptr;
cmd      *cmnd;
{
  int      fd,i;
  char     file[256];
  char     crt_name[80];
  FILE     *fp;
  creature *crt_ptr;
   
   
  fd = ply_ptr->fd;
   
  if(!ply_ptr->first_tlk)
     {
       print(fd,"You must start a talk first.\n");
       return(PROMPT);
     }
  if(!ply_ptr->first_tlk->key)
     {
       print(fd,"You must define a keyword.\n");
       return(PROMPT);
     }
  if(!ply_ptr->first_tlk->response)
     {
       print(fd,"You must supply a response.\n");
       return(PROMPT);
     }
  cmnd->val[1]= 1;
  crt_ptr = find_crt(ply_ptr,ply_ptr->parent_rom->first_mon, cmnd->str[1],
                           cmnd->val[1]);    
 
  if (!crt_ptr)
   {
     print(fd,"Creature not found in the room.\n");
     return(PROMPT);
   }  

   strcpy(crt_name,crt_ptr->name);
   for(i=0;crt_name[i];i++)
     if(crt_name[i] == ' ')
        crt_name[i] = '_';
  sprintf(file,"%s/talk/%s-%d",MONPATH,crt_name,crt_ptr->level);
  fp = fopen(file,"a");
  fprintf(fp,"%s\n",ply_ptr->first_tlk->key);
  fprintf(fp,"%s\n",ply_ptr->first_tlk->response);
  fclose(fp);
  print(fd,"Talk saved.\n");
  return 0;
   
}

/***************************************************************************
*	This function finds an object or creature number from the
*	database.
*/

int dm_find_db(ply_ptr, cmnd)
creature	*ply_ptr;
cmd		*cmnd;
{
	int fd, n;
	object		*obj_ptr;
	creature	*crt_ptr;

	if(ply_ptr->class < CARETAKER)
		return(PROMPT);

	fd=ply_ptr->fd;

	if(cmnd->num < 3) {
		print(fd, "Syntax: *find o|c name [#]\n");
		return(0);
	}

	switch(low(cmnd->str[1][0])) {
		case 'o':
			obj_ptr=find_obj(ply_ptr, ply_ptr->first_obj, cmnd->str[2], cmnd->val[2]);	
			if(!obj_ptr)
				obj_ptr=find_obj(ply_ptr, ply_ptr->parent_rom->first_obj, cmnd->str[2], cmnd->val[2]);
			if(!obj_ptr) {
				print(fd, "Cannot locate object.\n");
				return(0);
			}
			n=find_obj_num(obj_ptr);
			if(n)
				print(fd, "Object is #%d.\n", n);
			else
				print(fd, "Object is unique.\n");

			break;	
		case 'm':
		case 'c':
			crt_ptr=find_crt(ply_ptr, ply_ptr->parent_rom->first_mon, cmnd->str[2], cmnd->val[2]);
			if(!crt_ptr) {
				print(fd, "Cannot locate creature.\n");
				return(0);
			}
			n=find_crt_num(crt_ptr);
			if(n)
                                print(fd, "Creature is #%d.\n", n);
                        else
                                print(fd, "Creature is unique.\n");
        
                        break;

		default:
			print(fd, "Syntax: *find o|c name [#]\n");
			return(0);
	}
}

/*************************************************************************
*  This function allows the deletion of the database.
*
*/
int dm_delete_db(ply_ptr, cmnd)
creature	*ply_ptr;
cmd		*cmnd;
{
	int 		fd, ff, index,n;
	creature	*crt_ptr;
	object		*obj_ptr;
	char      	file[80];

	if(ply_ptr->class < DM)
		return(PROMPT);

	fd=ply_ptr->fd;

	if(cmnd->num < 2) {
		print(fd, "Syntax: *clear [o|c] [index]\n");
		return(0);
	}

	if(!strcmp(cmnd->str[1], "c") || !strcmp(cmnd->str[1], "m")) {
		if(cmnd->val[1] < 2 || cmnd->val[1] > CMAX) {
                	print(fd, "Index error.\n");
                	return(0);
		}
	
		index = cmnd->val[1];
		
		sprintf(file, "%s/m%02d", MONPATH, index/MFILESIZE);
       		ff = open(file, O_WRONLY | O_BINARY, ACC);
       		if(ff == -1) {
                	close(ff);
                	print(fd, "File open error.\n");
                	return(0);
        	}
        	
		crt_ptr=(creature *)malloc(sizeof(creature));
		zero(crt_ptr, sizeof(creature));
		n = lseek(ff, (long)((index%MFILESIZE)*sizeof(creature)), 0);
        	n = write(ff, crt_ptr, sizeof(creature));
        	if(n < sizeof(creature))
                	merror("dm_delete_db", FATAL);
 
        	close(ff);
		print(fd,"Creature #%d deleted.\n", index);
		return(0);
	}
	else {
		if(strcmp(cmnd->str[1], "o")) {	
                	print(fd, "Syntax: *clear [o|c] [index].\n");
                	return(0);
		        }
		if(cmnd->val[1] < 2 || cmnd->val[1] > OMAX) {
                        print(fd, "Index error.\n");
                        return(0);
                }
	
		index = cmnd->val[1];
                
        sprintf(file, "%s/o%02d", OBJPATH, index/OFILESIZE);
        ff = open(file, O_WRONLY | O_BINARY, ACC);
        if(ff == -1) {
			close(ff);
            print(fd, "File open error.\n");
            return(0);
        }

		obj_ptr=(object *)malloc(sizeof(object));
        zero(obj_ptr, sizeof(object));
        n = lseek(ff, (long)((index%OFILESIZE)*sizeof(object)), 0);
        n = write(ff, obj_ptr, sizeof(object));
        if(n < sizeof(object))
			merror("dm_delete_db", FATAL);
 
        close(ff);
        print(fd, "Object #%d deleted.\n", index);
        return(0);
	}

}

/******************************************************************
*
*	dm_game_status:
*		Show the status of all configurable options in the game.
*
******************************************************************/

int dm_game_status(creature *ply_ptr, cmd *cmnd)
{
	int fd, i;
	char str[80];

	if(ply_ptr->class < CARETAKER) 
		return(PROMPT);

	if(cmnd->num == 2 && !strcmp(cmnd->str[1], "r")) {
		i=readini();
		print(ply_ptr->fd, "Ini Reloaded.\n");
		return(0);
	}
	
	fd=ply_ptr->fd;

	ANSI(fd, BLUE);
	print(fd,"\n\nGame Variable Status\n");
	ANSI(fd, BOLD);
	ANSI(fd, CYAN);
	print(fd,"Game Title: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", title);
	ANSI(fd, CYAN);
	print(fd,"Game Port : ");
	ANSI(fd, WHITE);
	print(fd,"%d\n\n",PORTNUM);
	ANSI(fd, CYAN);
	print(fd,"DMs here are: ");
	ANSI(fd, WHITE);
	print(fd,"%s, %s, %s, %s\n", dmname[0], dmname[1], dmname[2], dmname[3]);
	print(fd,"            : %s, %s, %s\n", dmname[4], dmname[5], dmname[6]);
	ANSI(fd, CYAN);
	print(fd,"Questions email address    : ");
	ANSI(fd, WHITE);
	print(fd,"%s\n", questions_to_email);
	ANSI(fd, CYAN);
	print(fd,"Authorization email address: ");
	ANSI(fd, WHITE);
	print(fd,"%s\n", auth_questions_email);
	ANSI(fd, CYAN);
	print(fd,"Registrations email address: ");
	ANSI(fd, WHITE);
	print(fd,"%s\n", register_questions_email);
	ANSI(fd, CYAN);
	print(fd,"Account exists message: ");
	ANSI(fd, WHITE);
	print(fd,"%s\n", account_exists);
	
	ANSI(fd, NORMAL);
	ANSI(fd, BLUE);
	print(fd, "\nOn/Off Settings (1=On, 0=Off)\n");
	ANSI(fd, BOLD);
	ANSI(fd, CYAN);
	print(fd, "Ansi Bottom Line = ");
	ANSI(fd, WHITE);
	print(fd, "%d",ANSILINE);
	ANSI(fd, CYAN);
	print(fd, ",  AutoShutDown = ");
	ANSI(fd, WHITE);
	print(fd, "%d",AUTOSHUTDOWN);
	ANSI(fd, CYAN);
	print(fd, ",  Checkdouble  = ");
	ANSI(fd, WHITE);
	print(fd, "%d\n",CHECKDOUBLE);
	ANSI(fd, CYAN);
	print(fd, "Crashtrap        = ");
	ANSI(fd, WHITE);
	print(fd, "%d",CRASHTRAP);
	ANSI(fd, CYAN);
	print(fd, ",  EatnDrink    = ");
	ANSI(fd, WHITE);
	print(fd, "%d",EATNDRINK);
	ANSI(fd, CYAN);
	print(fd, ",  GetHostByName= ");
	ANSI(fd, WHITE);
	print(fd, "%d\n",GETHOSTBYNAME);
	ANSI(fd, CYAN);
	print(fd, "Hashrooms        = ");
	ANSI(fd, WHITE);
	print(fd, "%d",HASHROOMS);
	ANSI(fd, CYAN);
	print(fd, ",  Heaven       = ");
	ANSI(fd, WHITE);
	print(fd, "%d",HEAVEN);
	ANSI(fd, CYAN);
	print(fd, ",  Isengard     = ");
	ANSI(fd, WHITE);
	print(fd, "%d\n",ISENGARD);
	ANSI(fd, CYAN);
	print(fd, "LastCommand      = ");
	ANSI(fd, WHITE);
	print(fd, "%d",LASTCOMMAND);
	ANSI(fd, CYAN);
	print(fd, ",  NiceExp      = ");
	ANSI(fd, WHITE);
	print(fd, "%d",NICEEXP);
	ANSI(fd, CYAN);
	print(fd, ",  Paranoid     = ");
	ANSI(fd, WHITE);
	print(fd, "%d\n",PARANOID);
	ANSI(fd, CYAN);
	print(fd, "Record_All       = ");
	ANSI(fd, WHITE);
	print(fd, "%d",RECORD_ALL);
	ANSI(fd, CYAN);
	print(fd, ",  RFC1413      = ");
	ANSI(fd, WHITE);
	print(fd, "%d",RFC1413);
	ANSI(fd, CYAN);
	print(fd, ",  Secure       = ");
	ANSI(fd, WHITE);
	print(fd, "%d\n",SECURE);
	ANSI(fd, CYAN);
	print(fd, "Sched            = ");
	ANSI(fd, WHITE);
	print(fd, "%d",SCHED);
	ANSI(fd, CYAN);
	print(fd, ",  Suicide      = ");
	ANSI(fd, WHITE);
	print(fd, "%d",SUICIDE);
	ANSI(fd, CYAN);
	print(fd, ",  Save_on_drop = ");
	ANSI(fd, WHITE);
	print(fd, "%d\n",SAVEONDROP);
	ANSI(fd, NORMAL);
	ANSI(fd, WHITE);

	F_SET(ply_ptr, PREADI);
	if(ANSILINE)
		ask_for(fd, "[Hit Return, Q to quit]: ");
	else
		print(fd, "[Hit Return, Q to Quit]: ");
	output_buf();
	Ply[fd].io->intrpt &= ~1;
	Ply[fd].io->fn = gamestat2;
	Ply[fd].io->fnparam = 1;
	return(DOPROMPT);

}

void gamestat2(int fd, int param,char *instr)
{

	if(instr[0]) {
		print(fd, "Aborted.\n");
		F_CLR(Ply[fd].ply, PREADI);
		RETURN(fd, command, 1);
	}

	ANSI(fd, BLUE);
	print(fd,"\nSailing Messages\n");
	ANSI(fd, BOLD); ANSI(fd, CYAN);
	print(fd, "TXmesg1: "); ANSI(fd, WHITE);
	print(fd, "%s\n", tx_mesg1); ANSI(fd, CYAN);
	print(fd, "TXmesg2: "); ANSI(fd, WHITE);
	print(fd, "%s\n", tx_mesg2);

	ANSI(fd, BLUE);
	print(fd,"Weather Strings\n");
	ANSI(fd, BOLD);
	ANSI(fd, CYAN);
	print(fd,"Sunrise: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", sunrise);
	ANSI(fd, CYAN);
	print(fd,"Sunset: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", sunset);
	ANSI(fd, CYAN);
	print(fd,"Earth_Trembles: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", earth_trembles);
	ANSI(fd, CYAN);
	print(fd,"Heavy_fog: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", heavy_fog);
	ANSI(fd, CYAN);
	print(fd,"Beautiful_day: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", beautiful_day);
	ANSI(fd, CYAN);
	print(fd,"Bright_sun: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", bright_sun);
	ANSI(fd, CYAN);
	print(fd,"Glaring Sun: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", glaring_sun);
	ANSI(fd, CYAN);
	print(fd,"Heat: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", heat);
	ANSI(fd, CYAN);
	print(fd,"Still: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", still);
	ANSI(fd, CYAN);
	print(fd,"Light_breeze: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", light_breeze);	
	ANSI(fd, CYAN);
	print(fd,"Strong_wind: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", strong_wind);
	ANSI(fd, CYAN);
	print(fd,"Wind_gusts: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", wind_gusts);
	ANSI(fd, CYAN);
	print(fd,"Gale_force: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", gale_force);
	ANSI(fd, CYAN);
	print(fd,"Clear Skies: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", clear_skies);
	ANSI(fd, CYAN);
	print(fd,"Light_clouds: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", light_clouds);
	ANSI(fd, CYAN);
	print(fd,"Thunderheads: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", thunderheads);
	ANSI(fd, CYAN);
	print(fd,"Light_rain : ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", light_rain);
	ANSI(fd, CYAN);
	print(fd,"Heavy_rain: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", heavy_rain);
	ANSI(fd, CYAN);
	print(fd,"Sheets_rain: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", sheets_rain);
	ANSI(fd, CYAN);
	print(fd,"Torrent_rain: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", torrent_rain);
	ANSI(fd, CYAN);
	print(fd,"No_moon: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", no_moon);
	ANSI(fd, CYAN);
	print(fd,"Sliver_moon: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", sliver_moon);
	ANSI(fd, CYAN);
	print(fd,"Half_moon: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", half_moon);
	ANSI(fd, CYAN);
	print(fd,"Waxing_moon: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", waxing_moon);
	ANSI(fd, CYAN);
	print(fd,"Full_moon: ");
	ANSI(fd, WHITE);
	print(fd, "%s\n", full_moon);
	ANSI(fd, NORMAL);
	ANSI(fd, WHITE);

	F_CLR(Ply[fd].ply, PREADI);
	RETURN(fd, command, 1);

}
/************************************************************************/
/*				dm_advance				*/
/************************************************************************/
int dm_advance(ply_ptr, cmnd)
creature	*ply_ptr;
cmd		*cmnd;
{
    	int 		fd, lev, i;
	creature 	*crt_ptr=0;
	 
    	fd = ply_ptr->fd;
 
    	if (ply_ptr->class < DM)
        	return(PROMPT);

    	if (cmnd->num < 2) {
    		print(fd, "Advance who at what level?\n");
    		return(0);
    	}

        cmnd->str[1][0] = up(cmnd->str[1][0]);
        for(i=0; i<Tablesize; i++) {
                if(!Ply[i].ply) continue;
                if(Ply[i].ply->fd == -1) continue;
                if(!strncmp(Ply[i].ply->name, cmnd->str[1], strlen(cmnd->str[1])))
                        crt_ptr = Ply[i].ply;
                if(!strcmp(Ply[i].ply->name, cmnd->str[1]))
                        break;
        }
        if(!crt_ptr) {
                print(fd, "Advance who?\n");
                return(0);
	}
	if(cmnd->val[1] <= 0 || cmnd->val[1] > MAXALVL) {
		print(fd, "Only levels between 1 and 25!\n");
		return(0);
	}
	lev = cmnd->val[1] - crt_ptr->level;
	if(lev == 0) {
		print(fd, "But %M is already level %d!\n", crt_ptr, crt_ptr->level);
		return(0);
	}
	if(lev > 0) {
		for(i=0; i<lev; i++) up_level(crt_ptr);
		print(fd, "%M has been raised to level %d.\n", crt_ptr, crt_ptr->level);
	}
	if(lev < 0) {
		for(i=0; i>lev; i--) down_level(crt_ptr);
		print(fd, "%M has been lowered to level %d.\n", crt_ptr, crt_ptr->level);
	}
}