vw/doc/
vw/player/J/
/***************************************************************************
*  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
*  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
*
*  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
*  Chastain, Michael Quan, and Mitchell Tse.                              *
*                                                                         *
*  In order to use any part of this Merc Diku Mud, you must comply with   *
*  both the original Diku license in 'license.doc' as well the Merc       *
*  license in 'license.txt'.  In particular, you may not remove either of *
*  these copyright notices.                                               *
*                                                                         *
*  Much time and thought has gone into this software and you are          *
*  benefitting.  We hope that you share your changes too.  What goes      *
*  around, comes around.                                                  *
***************************************************************************/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "merc.h"

struct clan_info clan_infotable[MAX_CLAN];
struct league_info league_infotable[MAX_PLAYERS];

#if !defined(macintosh)
extern	int	_filbuf		args( (FILE *) );
#endif



/*
* Array of containers read for proper re-nesting of objects.
*/
#define MAX_NEST	100
static	OBJ_DATA *	rgObjNest	[MAX_NEST];



/*
* Local functions.
*/
void	fwrite_char	args( ( CHAR_DATA *ch,  FILE *fp ) );
void	fwrite_obj	args( ( CHAR_DATA *ch,  OBJ_DATA  *obj,
					FILE *fp, int iNest ) );
void	fread_char	args( ( CHAR_DATA *ch,  FILE *fp ) );
void	fread_obj	args( ( CHAR_DATA *ch,  FILE *fp ) );


char *initial( const char *str )
{
    static char strint [MAX_STRING_LENGTH];
    strint[0] = UPPER( str[0] );
    return strint;
}

/*
* Save a character and inventory.
* Would be cool to save NPC's too for quest purposes,
*   some of the infrastructure is provided.
*/
void save_char_obj( CHAR_DATA *ch )
{
    char chlevel [15];
    char buf [MAX_INPUT_LENGTH];
    char strsave[MAX_INPUT_LENGTH];
    char temp[MAX_INPUT_LENGTH]; 
    FILE *fp;
    
    if ( IS_NPC(ch) || ch->level < 2 )
	   return;
    
    if ( ch->desc != NULL && ch->desc->original != NULL )
	   ch = ch->desc->original;
    
    ch->save_time = current_time;
    fclose( fpReserve );
    
#if !defined( macintosh) && !defined(MSDOS)
    snprintf( temp, MAX_INPUT_LENGTH, "%s%s%s%s", PLAYER_DIR, initial( ch->name ), "/", capitalize( ch->name) );
    snprintf( strsave, MAX_INPUT_LENGTH, "tmp.file");
#else	
    snprintf( temp, MAX_INPUT_LENGTH, "%s%s", PLAYER_DIR, capitalize( ch->name ) );
    snprintf( strsave, MAX_INPUT_LENGTH, "tmp.file");
#endif
    
    
    if ( ( fp = fopen( strsave, "w" ) ) == NULL )
    {
	   bug( "Save_char_obj: fopen", 0 );
	   perror( strsave );
    }
    else
    {
	   fwrite_char( ch, fp );
	   if ( ch->carrying != NULL )
		  fwrite_obj( ch, ch->carrying, fp, 0 );
	   fprintf( fp, "#END\n" );
	   if      (ch->level >= 9) snprintf(chlevel,15,"<CODER>");
	   else if (ch->level == 8) snprintf(chlevel,15,"<GOD>");
	   else if (ch->level == 7) snprintf(chlevel,15,"<DEMIGOD>");
	   else if (ch->level == 6) snprintf(chlevel,15,"<DEITY>");
	   else if (ch->level == 5) snprintf(chlevel,15,"<Elder>");
	   else if (ch->level == 4) snprintf(chlevel,15,"<Builder>");
	   else if (ch->level == 3) snprintf(chlevel,15,"<Avatar>");
	   else                     snprintf(chlevel,15,"<Mortal>");
	   if (strlen(ch->lasttime) > 1)
		  snprintf(buf,MAX_INPUT_LENGTH, "%s Last logged in on %s", chlevel, ch->lasttime);
	   else
		  snprintf(buf,MAX_INPUT_LENGTH, "%s New player logged in on %s", chlevel, ch->createtime);
	   fprintf( fp, buf);
    }
    fclose( fp );
    
    fpReserve = fopen( NULL_FILE, "r" );
    /*    sprintf(temp, "cp %s%s%s%s %s%s%s%s\n\r" ,PLAYER_DIR, initial(ch->name),"/",  capitalize(ch->name), BACKUP_DIR,initial(ch->name), "/", capitalize(ch->name));
    system( temp );
    send_to_char( temp, ch);*/
    rename( strsave, temp );
    return;
}



/*
* Write the char.
*/
void fwrite_char( CHAR_DATA *ch, FILE *fp )
{
    AFFECT_DATA *paf;
    int sn;
    
    fprintf( fp, "#%s\n", IS_NPC(ch) ? "MOB" : "PLAYER"		);
    
    fprintf( fp, "Name         %s~\n",	ch->name		);
    fprintf( fp, "ShortDescr   %s~\n",	ch->short_descr		);
    fprintf( fp, "LongDescr    %s~\n",	ch->long_descr		);
    fprintf( fp, "Description  %s~\n",	ch->description		);
    fprintf( fp, "Lord         %s~\n",	ch->lord		);
    fprintf( fp, "Clan         %s~\n",	ch->clan		);
    fprintf( fp, "Morph        %s~\n",	ch->morph		);
    fprintf( fp, "Createtime   %s~\n",	ch->createtime		);
    fprintf( fp, "Lasttime     %s~\n",	ch->lasttime		);
    fprintf( fp, "Lasthost     %s~\n",	ch->lasthost		);
    fprintf( fp, "Poweraction  %s~\n",	ch->poweraction		);
    fprintf( fp, "Powertype    %s~\n",	ch->powertype		);
    fprintf( fp, "Sex          %d\n",	ch->sex			);
    fprintf( fp, "Class        %d\n",	ch->class		);
    fprintf( fp, "Race         %d\n",	ch->race		);
    fprintf( fp, "Immune       %ld\n",   ch->immune              );
    fprintf( fp, "Polyaff      %d\n",	ch->polyaff		);
    fprintf( fp, "Itemaffect   %d\n",	ch->itemaffect		);
    fprintf( fp, "Vampaff      %ld\n",   ch->vampaff             );
    fprintf( fp, "Vamppass     %ld\n",   ch->vamppass            );
    fprintf( fp, "Form         %d\n",	ch->form		);
    fprintf( fp, "Beast        %d\n",	ch->beast		);
    fprintf( fp, "Vampgen      %d\n",	ch->vampgen		);
    fprintf( fp, "Spectype     %d\n",	ch->spectype		);
    fprintf( fp, "Specpower    %d\n",	ch->specpower		);
    fprintf( fp, "Home         %ld\n",   ch->home                );
    fprintf( fp, "Level        %d\n",	ch->level		);
    fprintf( fp, "Trust        %d\n",	ch->trust		);
           fprintf( fp, "Played       %ld\n",
	   ch->played + (int) (current_time - ch->logon)		);
    fprintf( fp, "Room         %ld\n",
	   (  ch->in_room == get_room_index( ROOM_VNUM_LIMBO )
	   && ch->was_in_room != NULL )
	   ? ch->was_in_room->vnum
	   : ch->in_room->vnum );
    
    fprintf( fp, "PkPdMkMd     %d %d %ld %d\n",
	   ch->pkill, ch->pdeath, ch->mkill, ch->mdeath );
    
    fprintf( fp, "Weapons      %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
	   ch->wpn[0], ch->wpn[1], ch->wpn[2], ch->wpn[3], ch->wpn[4], 
	   ch->wpn[5], ch->wpn[6], ch->wpn[7], ch->wpn[8], ch->wpn[9], 
	   ch->wpn[10], ch->wpn[11], ch->wpn[12] );
    fprintf( fp, "Spells       %d %d %d %d %d\n",
	   ch->spl[0], ch->spl[1], ch->spl[2], ch->spl[3], ch->spl[4] );
    fprintf( fp, "Combat       %d %d %d %d %d %d %d %d\n",
	   ch->cmbt[0], ch->cmbt[1], ch->cmbt[2], ch->cmbt[3],
	   ch->cmbt[4], ch->cmbt[5], ch->cmbt[6], ch->cmbt[7] );
    fprintf( fp, "Stance       %d %d %d %d %d %d %d %d %d %d %d\n",
	   ch->stance[0], ch->stance[1], ch->stance[2], ch->stance[3],
	   ch->stance[4], ch->stance[5], ch->stance[6], ch->stance[7],
	   ch->stance[8], ch->stance[9], ch->stance[10] );
    fprintf( fp, "Locationhp   %d %d %d %d %d %d %d\n",
	   ch->loc_hp[0], ch->loc_hp[1], ch->loc_hp[2], ch->loc_hp[3],
	   ch->loc_hp[4], ch->loc_hp[5], ch->loc_hp[6] );
    fprintf( fp, "HpManaMove   %d %d %d %d %d %d\n",
	   ch->hit, ch->max_hit, ch->mana, ch->max_mana, ch->move, ch->max_move );
    fprintf( fp, "Gold         %ld\n",   ch->gold                );
    fprintf( fp, "Bank         %ld\n",   ch->bank                );
    fprintf( fp, "Exp          %ld\n",   ch->exp                 );
    fprintf( fp, "Act          %ld\n",   ch->act                 );
    fprintf( fp, "Extra        %d\n",   ch->extra		);
    fprintf( fp, "AffectedBy   %ld\n",   ch->affected_by         );
    /* Bug fix from Alander */
    fprintf( fp, "Position     %d\n",
        ch->position == POS_FIGHTING ? POS_STANDING : ch->position );
    
    fprintf( fp, "Practice     %d\n",	ch->practice		);
    fprintf( fp, "SavingThrow  %d\n",	ch->saving_throw	);
    fprintf( fp, "Alignment    %d\n",	ch->alignment		);
    fprintf( fp, "Hitroll      %d\n",	ch->hitroll		);
    fprintf( fp, "Damroll      %d\n",	ch->damroll		);
    fprintf( fp, "Armor        %d\n",	ch->armor		);
    fprintf( fp, "Wimpy        %d\n",	ch->wimpy		);
    fprintf( fp, "Deaf         %ld\n",	ch->deaf		);
    fprintf( fp, "LagPenalty   %d\n",   ch->lagpenalty          );    
 
    if ( IS_NPC(ch) )
    {
           fprintf( fp, "Vnum         %ld\n",    ch->pIndexData->vnum    );
    }
    else
    {
	   fprintf( fp, "Password     %s~\n",	ch->pcdata->pwd		);
	   fprintf( fp, "Email        %s~\n",      ch->pcdata->email       );
	   fprintf( fp, "Bamfin       %s~\n",	ch->pcdata->bamfin	);
	   fprintf( fp, "Bamfout      %s~\n",	ch->pcdata->bamfout	);
	   fprintf( fp, "Title        %s~\n",	ch->pcdata->title	);
	   fprintf( fp, "AttrPerm     %d %d %d %d %d\n",
		  ch->pcdata->perm_str,
		  ch->pcdata->perm_int,
		  ch->pcdata->perm_wis,
		  ch->pcdata->perm_dex,
		  ch->pcdata->perm_con );
	   
	   fprintf( fp, "AttrMod      %d %d %d %d %d\n",
		  ch->pcdata->mod_str, 
		  ch->pcdata->mod_int, 
		  ch->pcdata->mod_wis,
		  ch->pcdata->mod_dex, 
		  ch->pcdata->mod_con );
	   
	   fprintf( fp, "Quest        %d\n", ch->pcdata->quest );
	   
	   if (ch->pcdata->obj_vnum != 0)
		  fprintf( fp, "Objvnum      %d\n", ch->pcdata->obj_vnum );
	   
	   fprintf( fp, "Condition    %d %d %d\n",
		  ch->pcdata->condition[0],
		  ch->pcdata->condition[1],
		  ch->pcdata->condition[2] );
	   
	   for ( sn = 0; sn < MAX_SKILL; sn++ )
	   {
		  if ( skill_table[sn].name != NULL && ch->pcdata->learned[sn] > 0 )
		  {
			 fprintf( fp, "Skill        %d '%s'\n",
				ch->pcdata->learned[sn], skill_table[sn].name );
		  }
	   }
    }
    
    for ( paf = ch->affected; paf != NULL; paf = paf->next )
    {
	   /* Thx Alander */
	   if ( paf->type < 0 || paf->type >= MAX_SKILL )
		  continue;
	   
	   fprintf( fp, "AffectData   '%s' %3d %3d %3d %10d\n",
		  skill_table[paf->type].name,
		  paf->duration,
		  paf->modifier,
		  paf->location,
		  paf->bitvector
		  );
    }
    
    fprintf( fp, "End\n\n" );
    return;
}



/*
* Write an object and its contents.
*/
void fwrite_obj( CHAR_DATA *ch, OBJ_DATA *obj, FILE *fp, int iNest )
{
    EXTRA_DESCR_DATA *ed;
    AFFECT_DATA *paf;
    
    /*
    * Slick recursion to write lists backwards,
    *   so loading them will load in forwards order.
    */
    if ( obj->next_content != NULL )
	   fwrite_obj( ch, obj->next_content, fp, iNest );
    
	   /*
	   * Castrate storage characters.
    */
    if ( (obj->chobj != NULL && !IS_NPC(obj->chobj) &&
	   obj->chobj->pcdata->obj_vnum != 0) || obj->item_type == ITEM_KEY 
         /*  || obj->item_type == ITEM_PILL
           || obj->item_type == ITEM_SCROLL
           || obj->item_type == ITEM_POTION
           || obj->item_type == ITEM_WAND
           || obj->item_type == ITEM_STAFF*/)
	   return;
    fprintf( fp, "#OBJECT\n" );
    fprintf( fp, "Nest         %d\n",	iNest			     );
    fprintf( fp, "Name         %s~\n",	obj->name		     );
    fprintf( fp, "ShortDescr   %s~\n",	obj->short_descr	     );
    fprintf( fp, "Description  %s~\n",	obj->description	     );
    if (obj->chpoweron != NULL && str_cmp(obj->chpoweron,"(null)") && str_cmp(obj->chpoweron,""))
	   fprintf( fp, "Poweronch    %s~\n",	obj->chpoweron	     );
    if (obj->chpoweroff != NULL && str_cmp(obj->chpoweroff,"(null)") && str_cmp(obj->chpoweroff,""))
	   fprintf( fp, "Poweroffch   %s~\n",	obj->chpoweroff      );
    if (obj->chpoweruse != NULL && str_cmp(obj->chpoweruse,"(null)") && str_cmp(obj->chpoweruse,""))
	   fprintf( fp, "Powerusech   %s~\n",	obj->chpoweruse      );
    if (obj->victpoweron != NULL && str_cmp(obj->victpoweron,"(null)") && str_cmp(obj->victpoweron,""))
	   fprintf( fp, "Poweronvict  %s~\n",	obj->victpoweron     );
    if (obj->victpoweroff != NULL && str_cmp(obj->victpoweroff,"(null)") && str_cmp(obj->victpoweroff,""))
	   fprintf( fp, "Poweroffvict %s~\n",	obj->victpoweroff    );
    if (obj->victpoweruse != NULL && str_cmp(obj->victpoweruse,"(null)") && str_cmp(obj->victpoweruse,""))
	   fprintf( fp, "Powerusevict %s~\n",	obj->victpoweruse    );
    if (obj->questmaker != NULL && strlen(obj->questmaker) > 1)
	   fprintf( fp, "Questmaker   %s~\n",	obj->questmaker      );
    if (obj->questowner != NULL && strlen(obj->questowner) > 1)
	   fprintf( fp, "Questowner   %s~\n",	obj->questowner      );
    fprintf( fp, "Vnum         %ld\n",   obj->pIndexData->vnum        );
    fprintf( fp, "ExtraFlags   %ld\n",   obj->extra_flags             );
    fprintf( fp, "WearFlags    %ld\n",   obj->wear_flags              );
    fprintf( fp, "WearLoc      %d\n",	obj->wear_loc		     );
    fprintf( fp, "ItemType     %d\n",	obj->item_type		     );
    fprintf( fp, "Weight       %ld\n",   obj->weight                  );
    if (obj->spectype != 0)
	   fprintf( fp, "Spectype     %d\n",	obj->spectype	     );
    if (obj->specpower != 0)
	   fprintf( fp, "Specpower    %d\n",	obj->specpower	     );
    fprintf( fp, "Condition    %d\n",	obj->condition		     );
    fprintf( fp, "Toughness    %d\n",	obj->toughness		     );
    fprintf( fp, "Resistance   %d\n",	obj->resistance		     );
    if (obj->quest != 0)
           fprintf( fp, "Quest        %ld\n",    obj->quest           );
    if (obj->points != 0)
           fprintf( fp, "Points       %ld\n",    obj->points          );
    fprintf( fp, "Level        %d\n",	obj->level		     );
    fprintf( fp, "Timer        %d\n",	obj->timer		     );
    fprintf( fp, "Cost         %ld\n",   obj->cost                    );
    fprintf( fp, "Values       %d %d %d %d\n",
	   obj->value[0], obj->value[1], obj->value[2], obj->value[3]	     );
    
    switch ( obj->item_type )
    {
    case ITEM_POTION:
	   if ( obj->value[1] > 0 )
	   {
		  fprintf( fp, "Spell 1      '%s'\n", 
			 skill_table[obj->value[1]].name );
	   }
	   
	   if ( obj->value[2] > 0 )
	   {
		  fprintf( fp, "Spell 2      '%s'\n", 
			 skill_table[obj->value[2]].name );
	   }
	   
	   if ( obj->value[3] > 0 )
	   {
		  fprintf( fp, "Spell 3      '%s'\n", 
			 skill_table[obj->value[3]].name );
	   }
	   
	   break;
	   
    case ITEM_SCROLL:
	   if ( obj->value[1] > 0 )
	   {
		  fprintf( fp, "Spell 1      '%s'\n", 
			 skill_table[obj->value[1]].name );
	   }
	   
	   if ( obj->value[2] > 0 )
	   {
		  fprintf( fp, "Spell 2      '%s'\n", 
			 skill_table[obj->value[2]].name );
	   }
	   
	   if ( obj->value[3] > 0 )
	   {
		  fprintf( fp, "Spell 3      '%s'\n", 
			 skill_table[obj->value[3]].name );
	   }
	   
	   break;
	   
    case ITEM_PILL:
    case ITEM_STAFF:
    case ITEM_WAND:
	   if ( obj->value[3] > 0 )
	   {
		  fprintf( fp, "Spell 3      '%s'\n", 
			 skill_table[obj->value[3]].name );
	   }
	   
	   break;
    }
    
    for ( paf = obj->affected; paf != NULL; paf = paf->next )
    {
	   fprintf( fp, "AffectData   %d %d %d\n",
		  paf->duration,
		  paf->modifier,
		  paf->location
		  );
    }
    
    for ( ed = obj->extra_descr; ed != NULL; ed = ed->next )
    {
	   fprintf( fp, "ExtraDescr   %s~ %s~\n",
		  ed->keyword, ed->description );
    }
    
    fprintf( fp, "End\n\n" );
    
    if ( obj->contains != NULL )
	   fwrite_obj( ch, obj->contains, fp, iNest + 1 );
    
    return;
}



/*
* Load a char and inventory into a new ch structure.
*/
bool load_char_obj( DESCRIPTOR_DATA *d, char *name )
{
    static PC_DATA pcdata_zero;
    char strsave[MAX_INPUT_LENGTH];
    CHAR_DATA *ch;
    FILE *fp;
    bool found;
    char buf[MAX_STRING_LENGTH];
    int i;
    
    
    
    if ( char_free == NULL )
    {
	   ch				= alloc_perm( sizeof(*ch) );
    }
    else
    {
	   ch				= char_free;
	   char_free			= char_free->next;
    }
    clear_char( ch );
    
    if ( pcdata_free == NULL )
    {
	   ch->pcdata			= alloc_perm( sizeof(*ch->pcdata) );
    }
    else
    {
	   ch->pcdata			= pcdata_free;
	   pcdata_free			= pcdata_free->next;
    }
    *ch->pcdata				= pcdata_zero;
    
    d->character			= ch;
    ch->desc				= d;
    ch->host_ip				= d->host_ip;
    ch->name				= str_dup( name );
    ch->act				= PLR_BLANK
	   | PLR_COMBINE
	   | PLR_PROMPT;
    ch->extra				= 0;
    ch->pcdata->pwd			= str_dup( "" );
    ch->pcdata->email			= str_dup( "" );
    ch->pcdata->hunting                 = str_dup( "" ); 
    ch->pcdata->bamfin			= str_dup( "" );
    ch->pcdata->bamfout			= str_dup( "" );
    ch->pcdata->title			= str_dup( "" );
    for ( i=0; i < TELL_HISTORY_SIZE; ++i )
    {
    	ch->pcdata->tell_history[i] = str_dup( "" );
    }
    ch->pcdata->tell_history_pos = 0;
    ch->lord				= str_dup( "" );
    ch->clan				= str_dup( "" );
    ch->morph				= str_dup( "" );
    ch->pload				= str_dup( "" );
    ch->createtime			= str_dup( ctime( &current_time ) );
    ch->lasttime			= str_dup( "" );
    ch->lasthost			= str_dup( "" );
    ch->poweraction			= str_dup( "" );
    ch->powertype			= str_dup( "" );
    ch->spectype			= 0;
    ch->specpower			= 0;
    ch->mounted				= 0;
    ch->home				= 3001;
    ch->vampgen				= 0;
    ch->vampaff				= 0;
    ch->itemaffect			= 0;
    ch->vamppass			= -1;
    ch->polyaff				= 0;
    ch->immune				= 0;
    ch->form				= 32767;
    ch->beast				= 50;
    ch->loc_hp[0]			= 0;
    ch->loc_hp[1]			= 0;
    ch->loc_hp[2]			= 0;
    ch->loc_hp[3]			= 0;
    ch->loc_hp[4]			= 0;
    ch->loc_hp[5]			= 0;
    ch->loc_hp[6]			= 0;
    ch->wpn[0]				= 0;
    ch->wpn[1]				= 0;
    ch->wpn[2]				= 0;
    ch->wpn[3]				= 0;
    ch->wpn[4]				= 0;
    ch->wpn[5]				= 0;
    ch->wpn[6]				= 0;
    ch->wpn[7]				= 0;
    ch->wpn[8]				= 0;
    ch->wpn[9]				= 0;
    ch->wpn[10]				= 0;
    ch->wpn[11]				= 0;
    ch->wpn[12]				= 0;
    ch->spl[0]				= 4;
    ch->spl[1]				= 4;
    ch->spl[2]				= 4;
    ch->spl[3]				= 4;
    ch->spl[4]				= 4;
    ch->cmbt[0]				= 0;
    ch->cmbt[1]				= 0;
    ch->cmbt[2]				= 0;
    ch->cmbt[3]				= 0;
    ch->cmbt[4]				= 0;
    ch->cmbt[5]				= 0;
    ch->cmbt[6]				= 0;
    ch->cmbt[7]				= 0;
    ch->stance[0]			= 0;
    ch->stance[1]			= 0;
    ch->stance[2]			= 0;
    ch->stance[3]			= 0;
    ch->stance[4]			= 0;
    ch->stance[5]			= 0;
    ch->stance[6]			= 0;
    ch->stance[7]			= 0;
    ch->stance[8]			= 0;
    ch->stance[9]			= 0;
    ch->stance[10]			= 0;
    ch->pkill				= 0;
    ch->pdeath				= 0;
    ch->mkill				= 0;
    ch->mdeath				= 0;
    ch->pcdata->perm_str		= 13;
    ch->pcdata->perm_int		= 13; 
    ch->pcdata->perm_wis		= 13;
    ch->pcdata->perm_dex		= 13;
    ch->pcdata->perm_con		= 13;
    ch->pcdata->quest			= 0;
    ch->pcdata->obj_vnum		= 0;
    ch->pcdata->condition[COND_THIRST]	= 48;
    ch->pcdata->condition[COND_FULL]	= 48;
    ch->gold				= 0;
    ch->bank				= 0;
    ch->choke_dam_message               = 0;
    
    found = FALSE;
    fclose( fpReserve );
#if !defined( macintosh) && !defined( MSDOS ) 
    snprintf( strsave, MAX_INPUT_LENGTH, "%s%s%s%s%s", PLAYER_DIR, initial( ch->name ), 
	   "/", capitalize( ch->name ), ".gz");
    if( (fp = fopen( strsave, "r") ) )
    {
	   fclose( fp );
	   snprintf( buf, MAX_INPUT_LENGTH, "gzip -dfq %s", strsave);
	   system( buf );
    }
#endif
    
#if !defined( macintosh ) && !defined( MSDOS )
    snprintf( strsave, MAX_INPUT_LENGTH, "%s%s%s%s", PLAYER_DIR, initial( ch->name ), "/", capitalize( ch->name) );
#else
    snprintf( strsave, MAX_INPUT_LENGTH, "%s%s", PLAYER_DIR, capitalize( name ) );
#endif
    
    if ( ( fp = fopen( strsave, "r" ) ) != NULL )
    {
	   int iNest;
	   
	   for ( iNest = 0; iNest < MAX_NEST; iNest++ )
		  rgObjNest[iNest] = NULL;
	   
	   found = TRUE;
	   for ( ; ; )
	   {
		  char letter;
		  char *word;
		  
		  letter = fread_letter( fp );
		  if ( letter == '*' )
		  {
			 fread_to_eol( fp );
			 continue;
		  }
		  
		  if ( letter != '#' )
		  {
			 bug( "Load_char_obj: # not found.", 0 );
			 return FALSE;
			 break;
		  }
		  
		  word = fread_word( fp );
		  if      ( !str_cmp( word, "PLAYER" ) ) fread_char ( ch, fp );
		  else if ( !str_cmp( word, "OBJECT" ) ) fread_obj  ( ch, fp );
		  else if ( !str_cmp( word, "END"    ) ) break;
		  else
		  {
			 bug( "Load_char_obj: bad section.", 0 );
			 return FALSE;
			 break;
		  }
	   }
	   fclose( fp );
    }
    
    fpReserve = fopen( NULL_FILE, "r" );
    return found;
}



/*
* Read in a char.
*/

#if defined(KEY)
#undef KEY
#endif 
/* 
#define KEY( literal, field, value, ROE, default )   	\				
if ( !str_cmp( word, literal ) )	       	\	
{			 				 	\	
fMatch = TRUE;						\		
field  = value;						\
break;							\
	} */
	
#define KEY( literal, field, value, ROE, default )					\
				if ( !str_cmp( word, literal ) )	\
				{					\
				field  = value;			\
				fMatch = TRUE;                      \
				break;				\
}
	/*
	int validate_number(int value,int ROE,int default)
	{
	
	  if( value == ROE)
	  {
	  errordetect = TRUE;
	  return default;
	  }
	  fMatch = TRUE;
	  return value;
	  }
	  */
#define KEYS( literal, field, value )					\
				if ( !str_cmp( word, literal ) )	\
				{					\
				field  = value;			\
				fMatch = TRUE;                      \
				break;				\
}
	  
	  void fread_char( CHAR_DATA *ch, FILE *fp )
	  {
		 char buf[MAX_STRING_LENGTH];
		 char errormess[MAX_STRING_LENGTH];
		 char *word;
		 bool fMatch;
		 bool errordetect=FALSE;
		 
		 for ( ; ; )
		 {
			word   = feof( fp ) ? "End" : fread_word( fp );
			fMatch = FALSE;
			
			
			switch ( UPPER(word[0]) )
			{
			case '*':
			    fMatch = TRUE;
			    fread_to_eol( fp );
			    break;
			    
			case 'A':
			    if ( !str_cmp( word, "Act"))
			    {
				   ch->act = fread_number( fp, -999);
				   if(ch->act == -999) 
				   {
					  errordetect = TRUE;
					  snprintf( errormess, MAX_STRING_LENGTH, "Error in Act \n\r");
					  ch->act = PLR_BLANK|PLR_COMBINE|PLR_PROMPT;
				   }
				   fMatch = TRUE;
				   break;
			    }	
			    
			    if( !str_cmp( word, "AffectedBy"))
			    {
				   ch->affected_by = fread_number( fp, -999);
				   if( ch->affected_by == -999)
				   {
					  errordetect = TRUE;
					  ch->affected_by = 0;
					  snprintf( errormess, MAX_STRING_LENGTH, "Error in Act \n\r");
				   }
				   fMatch = TRUE;
				   break;
			    }
			    
			    if( !str_cmp( word, "Alignment"))
			    {
				   ch->alignment = fread_number(fp, -9999);
				   if( ch->alignment < -1000 || ch->alignment > 1000)
				   {
					  errordetect = TRUE;
					  snprintf( errormess, MAX_STRING_LENGTH, "Error in Alignment \n\r");
					  ch->alignment = 0;
				   }
				   fMatch = TRUE;
				   break;
			    }		
			    
			    
			    if( !str_cmp( word, "Armor"))
			    {	
				   ch->armor = fread_number( fp, -9999);
				   if( ch->armor == -9999)
				   {
					  errordetect = TRUE;
					  snprintf( errormess, MAX_STRING_LENGTH, "Error in Armor \n\r");
					  ch->armor = 100;
				   }
				   fMatch = TRUE;
				   break;
			    }
			    
			    if ( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
			    {
				   AFFECT_DATA *paf;
				   
				   if ( affect_free == NULL )
				   {
					  paf		= alloc_perm( sizeof(*paf) );
				   }
				   else
				   {
					  paf		= affect_free;
					  affect_free	= affect_free->next;
				   }
				   
				   if ( !str_cmp( word, "Affect" ) )
				   {
					  /* Obsolete 2.0 form. */
					  paf->type	= fread_number( fp, -9999 );
					  if( paf->type == -9999) errordetect = TRUE;
				   }
				   else
				   {
					  int sn;
					  
					  sn = skill_lookup( fread_word( fp ) );
					  if ( sn < 0 )
						 bug( "Fread_char: unknown skill.", 0 );
					  else
						 paf->type = sn;
				   }
				   
				   paf->duration	= fread_number( fp, -9999 );
				   if( paf->duration == -9999)
				   { errordetect = TRUE; paf->duration = 1; }
				   paf->modifier	= fread_number( fp, -9999 );
				   if( paf->modifier == -9999)
				   { errordetect = TRUE; paf->modifier = 0; } 
				   paf->location	= fread_number( fp, -9999 );
				   if( paf->location == -9999)
				   { errordetect = TRUE; paf->location = 1; }
				   paf->bitvector	= fread_number( fp, -9999 );
				   if( paf->bitvector == -9999)
				   { errordetect = TRUE; paf->bitvector = 0; }
				   paf->next	= ch->affected;
				   ch->affected	= paf;
				   if (errordetect)
						snprintf( errormess,  MAX_STRING_LENGTH, "Error in Affect(Data) \n\r");
				   fMatch = TRUE;
				   break;
			    }
			    
			    if ( !str_cmp( word, "AttrMod"  ) )
			    {
				   ch->pcdata->mod_str  = fread_number( fp, -999 );
				   if( ch->pcdata->mod_str == -999) 
				   { errordetect = TRUE; ch->pcdata->mod_str = 0; }
				   ch->pcdata->mod_int  = fread_number( fp, -999 );
				   if( ch->pcdata->mod_int == -999) 
				   { errordetect = TRUE; ch->pcdata->mod_int = 0; }
				   ch->pcdata->mod_wis  = fread_number( fp, -999 );
				   if( ch->pcdata->mod_wis == -999)
				   { errordetect = TRUE; ch->pcdata->mod_wis = 0; }
				   ch->pcdata->mod_dex  = fread_number( fp, -999 );
				   if( ch->pcdata->mod_dex == -999)
				   { errordetect = TRUE; ch->pcdata->mod_dex = 0; }
				   ch->pcdata->mod_con  = fread_number( fp, -999 );
				   if( ch->pcdata->mod_con == -999) 
				   { errordetect = TRUE; ch->pcdata->mod_con = 0; }
				   if (errordetect)
						snprintf( errormess,  MAX_STRING_LENGTH, "Error in AttrMod \n\r");
				   fMatch = TRUE;
				   break;
			    }
			    
			    if ( !str_cmp( word, "AttrPerm" ) )
			    {
				   ch->pcdata->perm_str = fread_number( fp, -999 );
				   if( ch->pcdata->perm_str == -999)
				   { errordetect = TRUE; ch->pcdata->perm_str = 13; }
				   ch->pcdata->perm_int = fread_number( fp, -999 );
				   if( ch->pcdata->perm_int == -999) 
				   { errordetect = TRUE; ch->pcdata->perm_int = 13; }
				   ch->pcdata->perm_wis = fread_number( fp, -999 );
				   if( ch->pcdata->perm_wis == -999) 
				   { errordetect = TRUE; ch->pcdata->perm_wis = 13; }
				   ch->pcdata->perm_dex = fread_number( fp, -999 );
				   if( ch->pcdata->perm_dex == -999)
				   { errordetect = TRUE; ch->pcdata->perm_dex = 13; }
				   ch->pcdata->perm_con = fread_number( fp, -999 );
				   if( ch->pcdata->perm_con == -999)
				   { errordetect = TRUE; ch->pcdata->perm_con = 13; }
				   if (errordetect)
						snprintf( errormess,  MAX_STRING_LENGTH, "Error in AttrPerm \n\r");
				   fMatch = TRUE;
				   break;
			    }
			    break;
			    
	case 'B':
	    KEYS( "Bamfin",	ch->pcdata->bamfin,	fread_string( fp ) );
	    KEYS( "Bamfout",	ch->pcdata->bamfout,	fread_string( fp ) );
	    if( !str_cmp( word, "Bank"))
	    {
		   ch->bank = fread_number( fp, -999);
		   if(ch->bank == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Bank \n\r");
			  ch->bank = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Beast"))
	    {
		   ch->beast = fread_number(fp, -999);
		   if(ch->beast > 100 || ch->beast < 0)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Beast \n\r");
			  bug( errormess , 0 );
			  ch->beast = 50;
		   }
		   fMatch = TRUE;
		   break;
	    }	
	    break;
	    
	case 'C':
	    KEYS( "Clan",	ch->clan,		fread_string( fp ) );
	    
	    if( !str_cmp( word, "Class"))
	    {
		   ch->class = fread_number( fp, -999);
		   if( ch->class == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Class \n\r");
			  ch->class = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }	
	    
	    if ( !str_cmp( word, "Combat" ) )
	    {
		   ch->cmbt[0]	= fread_number( fp, -999 );
		   if( ch->cmbt[0] < 0 || ch->cmbt[0] > 200) 
		   { errordetect = TRUE; ch->cmbt[0] = 0; }
		   ch->cmbt[1]	= fread_number( fp, -999 );
		   if( ch->cmbt[1] < 0 || ch->cmbt[1] > 200) 
		   { errordetect = TRUE; ch->cmbt[1] = 0; }
		   ch->cmbt[2]	= fread_number( fp, -999 );
		   if( ch->cmbt[2] < 0 || ch->cmbt[2] > 200) 
		   { errordetect = TRUE; ch->cmbt[2] = 0; }
		   ch->cmbt[3]	= fread_number( fp, -999 );
		   if( ch->cmbt[3] < 0 || ch->cmbt[3] > 200) 
		   { errordetect = TRUE; ch->cmbt[3] = 0; }
		   ch->cmbt[4]	= fread_number( fp, -999 );
		   if( ch->cmbt[4] < 0 || ch->cmbt[4] > 200) 
		   { errordetect = TRUE; ch->cmbt[4] = 0; }
		   ch->cmbt[5]	= fread_number( fp, -999 );
		   if( ch->cmbt[5] < 0 || ch->cmbt[5] > 200) 
		   { errordetect = TRUE; ch->cmbt[5] = 0; }
		   ch->cmbt[6]	= fread_number( fp, -999 );
		   if( ch->cmbt[6] < 0 || ch->cmbt[6] > 200) 
		   { errordetect = TRUE; ch->cmbt[6] = 0; }
		   ch->cmbt[7]	= fread_number( fp, -999 );
		   if( ch->cmbt[7] < 0 || ch->cmbt[7] > 200) 
		   { errordetect = TRUE; ch->cmbt[7] = 0; }
		   if (errordetect)
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Combat \n\r");
		   fMatch = TRUE;
		   break;
	    }
	    
	    if ( !str_cmp( word, "Condition" ) )
	    {
		   ch->pcdata->condition[0] = fread_number( fp, -999 );
		   if( ch->pcdata->condition[0] > 100 || ch->pcdata->condition[0] < 0)
		   { errordetect = TRUE; ch->pcdata->condition[0] = 48; }
		   ch->pcdata->condition[1] = fread_number( fp, -999 );
		   if( ch->pcdata->condition[1] > 100 || ch->pcdata->condition[1] < 0)
		   { errordetect = TRUE; ch->pcdata->condition[1] = 48; }
		   ch->pcdata->condition[2] = fread_number( fp, -999 );
		   if( ch->pcdata->condition[2] > 100 || ch->pcdata->condition[2] < 0)
		   { errordetect = TRUE; ch->pcdata->condition[2] = 48; }
		   if (errordetect)
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Condition \n\r");
		   fMatch = TRUE;
		   break;
	    }
	    if ( !str_cmp( word, "Createtime"))
	    {
	       char *str_old;
	       int len;

	       ch->createtime = fread_string( fp );

	       /* strip off all carriage returns from the creation time */
	       len = strlen( ch->createtime);
           str_old = ch->createtime;
           strtok( str_old, "\n\r");
           ch->createtime = str_dup( str_old);
           free_mem( str_old, len + 1);

	       /* needed to use free_mem() directly because strtok() overwrites 
	          the original string with nulls, making strlen() and therefore 
	          also free_string() screw up.
	       */

	       fMatch = TRUE;
	       break;
	    }
	    break;
	    
	case 'D':
	    if( !str_cmp( word, "Damroll"))
	    {
		   ch->damroll = fread_number( fp, -999);
		   if(ch->damroll == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Damroll \n\r");
			  ch->damroll = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    
	    if( !str_cmp( word, "Deaf"))
	    {
		   ch->deaf = fread_number( fp, -999);
	               
     	           if(ch->deaf == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Deaf \n\r");
			  ch->deaf = 0;
		   }
		   if(ch->deaf < 0) ch->deaf=0;
                   fMatch = TRUE;
		   break;
	    }
	    KEYS( "Description",	ch->description,	fread_string( fp ) );
	    break;
	    
	case 'E':
	    if ( !str_cmp( word, "End" ) )
		   return;
	    if( !str_cmp( word, "Exp"))
	    {
		   ch->exp = fread_number( fp, -999);
		   if(ch->exp == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Exp \n\r");
			  ch->exp = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Extra"))
	    {
		   ch->extra = fread_number( fp, -999);
		   if(ch->extra == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Extra \n\r");
			  ch->extra = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    
	    if( !str_cmp(word, "Email" ) ) 
	    {	
		   ch->pcdata->email = fread_string( fp ); 	
		   fMatch = TRUE;
		   break;
	    }
	    break;
	    
	case 'F':
	    if( !str_cmp( word, "Form"))
	    {
		   ch->form = fread_number( fp, -999);
		   if(ch->form == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Form \n\r");
			  ch->form = 32767;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    break;
	    
	case 'G':
	    if( !str_cmp( word, "Gold"))
	    {
		   ch->gold = fread_number( fp, -999);
		   if(ch->gold == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Gold \n\r");
			  ch->gold = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    break;
	    
	case 'H':
	    if( !str_cmp( word, "Hitroll"))
	    {
		   ch->hitroll = fread_number( fp, -999);
		   if(ch->hitroll == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Hitroll \n\r");
			  ch->hitroll = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Home"))
	    {
		   ch->home = fread_number( fp, -999);
		   if(ch->home == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Home \n\r");
			  ch->home = 3001;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    
	    if ( !str_cmp( word, "HpManaMove" ) )
	    {
		   ch->hit		= fread_number( fp, -999 );
		   if( ch->hit == -999 ) { errordetect = TRUE; ch->hit = 20;}
		   ch->max_hit	= fread_number( fp, -999 );
		   if( ch->max_hit == -999) { errordetect = TRUE; ch->max_hit = 20;}
		   ch->mana	= fread_number( fp, -999 );
		   if( ch->mana == -999) { errordetect = TRUE; ch->mana = 100;}
		   ch->max_mana	= fread_number( fp, -999 );
		   if( ch->max_mana == -999) { errordetect = TRUE; ch->max_mana = 100;}
		   ch->move	= fread_number( fp, -999 );
		   if( ch->move == -999) { errordetect = TRUE; ch->move = 100;}
		   ch->max_move	= fread_number( fp, -999 );
		   if( ch->max_move == -999) { errordetect = TRUE; ch->max_move = 100;}
		   if(errordetect)
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in HpManaMove \n\r");
		   fMatch = TRUE;
		   break;
	    }
	    break;
	    
	case 'I':
	    if( !str_cmp( word, "Immune"))
	    {
		   ch->immune = fread_number( fp, -999);
		   if(ch->immune == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Immune \n\r");
			  ch->immune = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    
	    if( !str_cmp( word, "Itemaffect"))
	    {
		   ch->itemaffect = fread_number( fp, -999);
		   if(ch->itemaffect == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Itemaffect \n\r");
			  ch->itemaffect = 3001;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    break;
	    
	case 'L':
	    KEYS( "Lasthost",	ch->lasthost,		fread_string( fp ) );
	    KEYS( "Lasttime",	ch->lasttime,		fread_string( fp ) );
	    if( !str_cmp( word, "Level"))
	    {
		   ch->level = fread_number( fp, -999);
		   if(ch->level == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess, MAX_STRING_LENGTH, "Error in Level \n\r");
			  ch->level = 1;
		   }
/*		   if ( ch->level == 9 &&
			  ( (str_cmp( ch->name, "Joker" )) &&
			  (str_cmp( ch->name, "Archon")) &&
			  (str_cmp( ch->name, "Genghis")) &&
			  (str_cmp( ch->name, "Dirge"))))
		   {
			  ch->level = 1;
		   }*/
		   fMatch = TRUE;
		   break;
	    }
	    if ( !str_cmp( word, "Locationhp" ) )
	    {
		   ch->loc_hp[0]	= fread_number( fp, -999 );
		   if( ch->loc_hp[0] == -999) { errordetect = TRUE; ch->loc_hp[0] = 0; }
		   ch->loc_hp[1]	= fread_number( fp, -999 );
		   if( ch->loc_hp[1] == -999) { errordetect = TRUE; ch->loc_hp[1] = 0; }
		   ch->loc_hp[2]	= fread_number( fp, -999 );
		   if( ch->loc_hp[2] == -999) { errordetect = TRUE; ch->loc_hp[2] = 0; }
		   ch->loc_hp[3]	= fread_number( fp, -999 );
		   if( ch->loc_hp[3] == -999) { errordetect = TRUE; ch->loc_hp[3] = 0; }
		   ch->loc_hp[4]	= fread_number( fp, -999 );
		   if( ch->loc_hp[4] == -999) { errordetect = TRUE; ch->loc_hp[4] = 0; }
		   ch->loc_hp[5]	= fread_number( fp, -999 );
		   if( ch->loc_hp[5] == -999) { errordetect = TRUE; ch->loc_hp[5] = 0; }
		   ch->loc_hp[6]	= fread_number( fp, -999 );
		   if( ch->loc_hp[6] == -999) { errordetect = TRUE; ch->loc_hp[6] = 0; }
		   if (errordetect)
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Locationhp \n\r");
		   fMatch = TRUE;
		   break;
	    }
	    KEYS( "LongDescr",	ch->long_descr,		fread_string( fp )  );
	    KEYS( "Lord",	ch->lord,		fread_string( fp )  );
            KEYS( "LagPenalty", ch->lagpenalty,         fread_number( fp, -999));
            if( ch->lagpenalty == -999) { errordetect = TRUE; ch->lagpenalty = 0; }
	    break;
	    
	case 'M':
	    KEYS( "Morph",	ch->morph,		fread_string( fp ) );
	    break;
	    
	case 'N':
	    if ( !str_cmp( word, "Name" ) )
	    {
	    /*
	    * Name already set externally.
		   */
		   fread_to_eol( fp );
		   fMatch = TRUE;
		   break;
	    }
	    
	    break;
	    
	case 'O':
	    if( !str_cmp( word, "Objvnum"))
	    {
		   ch->pcdata->obj_vnum = fread_number( fp, -999);
		   if(ch->pcdata->obj_vnum == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Objvnum \n\r");
			  ch->pcdata->obj_vnum = 24000;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    break;
	    
	case 'P':
	    KEYS( "Password",	ch->pcdata->pwd,	fread_string( fp ) );
	    if( !str_cmp( word, "Played"))
	    {
		   ch->played = fread_number( fp, -999);
		   if(ch->played == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Played \n\r");
			  ch->played = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Polyaff"))
	    {
		   ch->polyaff = fread_number( fp, -999);
		   if(ch->polyaff == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Polyaff \n\r");
			  ch->polyaff = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    KEYS( "Poweraction",	ch->poweraction,	fread_string( fp ) );
	    KEYS( "Powertype",	ch->powertype,		fread_string( fp ) );
	    if( !str_cmp( word, "Position"))
	    {
		   ch->position = fread_number( fp, -999);
		   if(ch->position == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Position \n\r");
			  ch->position = 7;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Practice"))
	    {
		   ch->practice = fread_number( fp, -999);
		   if(ch->practice == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Practice \n\r");
			  ch->practice = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if ( !str_cmp( word, "PkPdMkMd" ) )
	    {
		   ch->pkill	= fread_number( fp, -999 );
		   if( ch->pkill == -999) { errordetect = TRUE; ch->pkill = 0; }
		   ch->pdeath	= fread_number( fp, -999 );
		   if( ch->pdeath == -999) { errordetect = TRUE; ch->pdeath = 0; }
		   ch->mkill	= fread_number( fp, -999 );
		   if( ch->mkill == -999) { errordetect = TRUE; ch->mkill = 0; }
		   ch->mdeath	= fread_number( fp, -999 );
		   if( ch->mdeath == -999) { errordetect = TRUE; ch->mdeath = 0; }
		   if (errordetect)
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in PkPdMkMd \n\r");
		   fMatch = TRUE;
		   break;
	    }
	    break;
	    
	case 'Q':
	    if( !str_cmp( word, "Quest"))
	    {
		   ch->pcdata->quest = fread_number( fp, -999);
		   if(ch->pcdata->quest == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Quest \n\r");
			  ch->pcdata->quest = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    break;
	    
	case 'R':
	    if( !str_cmp( word, "Race"))
	    {
		   ch->race = fread_number( fp, -999);
		   if(ch->race == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Race \n\r");
			  ch->race = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    
	    if ( !str_cmp( word, "Room" ) )
	    {
	    /*	int jkrtemp=0;
	    jkrtemp = fread_number( fp, -999);
		   if( jkrtemp == -999) {errordetect = TRUE; jkrtemp = 3001;} */
		   ch->in_room = get_room_index( fread_number( fp, -999 ) );
		   if ( ch->in_room == NULL )
			  ch->in_room = get_room_index( ROOM_VNUM_LIMBO );
		   fMatch = TRUE;
		   break;
	    }
	    
	    break;
	    
	case 'S':
	    if( !str_cmp( word, "SavingThrow"))
	    {
		   ch->saving_throw = fread_number( fp, -999);
		   if(ch->saving_throw == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in SavingThrow \n\r");
			  ch->saving_throw = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Sex"))
	    {
		   ch->sex = fread_number( fp, -999);
		   if(ch->sex > 2 || ch->sex < 0)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Sex \n\r");
			  ch->sex = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    KEYS( "ShortDescr",	ch->short_descr,	fread_string( fp ) );
	    
	    if ( !str_cmp( word, "Skill" ) )
	    {
		   int sn;
		   int value;
		   
		   value = fread_number( fp, -999 );
		   if( value == -999) { errordetect = TRUE; value = 0; }
		   sn    = skill_lookup( fread_word( fp ) );
		   /*
		   if ( sn < 0 )
		   bug( "Fread_char: unknown skill.", 0 );
		   else
		   ch->pcdata->learned[sn] = value;
		   */
		   if ( sn >= 0 )
			  ch->pcdata->learned[sn] = value;
		   fMatch = TRUE;
	    }
	    
	    if( !str_cmp( word, "Specpower"))
	    {
		   ch->specpower = fread_number( fp, -999);
		   if(ch->specpower == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Specpower \n\r");
			  ch->specpower = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Spectype"))
	    {
		   ch->spectype = fread_number( fp, -999);
		   if(ch->spectype == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Spectype \n\r");
			  ch->spectype = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    
	    if ( !str_cmp( word, "Spells" ) )
	    {
		   ch->spl[0]	= fread_number( fp, -999 );
		   if( ch->spl[0] == -999) {errordetect = TRUE; ch->spl[0] = 0;}
		   ch->spl[1]	= fread_number( fp, -999 );
		   if( ch->spl[1] == -999) {errordetect = TRUE; ch->spl[1] = 0;}
		   ch->spl[2]	= fread_number( fp, -999 );
		   if( ch->spl[2] == -999) {errordetect = TRUE; ch->spl[2] = 0;}
		   ch->spl[3]	= fread_number( fp, -999 );
		   if( ch->spl[3] == -999) {errordetect = TRUE; ch->spl[3] = 0;}
		   ch->spl[4]	= fread_number( fp, -999 );
		   if( ch->spl[4] == -999) {errordetect = TRUE; ch->spl[4] = 0;}
		   if (errordetect)
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Spells \n\r");
		   fMatch = TRUE;
		   break;
	    }
	    
	    if ( !str_cmp( word, "Stance" ) )
	    {
		   ch->stance[0]	= fread_number( fp, -999 );
		   if(ch->stance[0] == -999) errordetect = TRUE;
		   if(ch->stance[0] > 200 || ch->stance[0] < -1) 
		   { ch->stance[0] = 200; }
		   ch->stance[1]	= fread_number( fp, -999 );
		   if(ch->stance[1] == -999) errordetect = TRUE;
		   if(ch->stance[1] > 200 || ch->stance[1] < 0) 
		   { ch->stance[1] = 200; }
		   ch->stance[2]	= fread_number( fp, -999 );
		   if(ch->stance[2] == -999) errordetect = TRUE;
		   if(ch->stance[2] > 200 || ch->stance[2] < 0) 
		   { ch->stance[2] = 200; }
		   ch->stance[3]	= fread_number( fp, -999 );
		   if(ch->stance[3] == -999) errordetect = TRUE;
		   if(ch->stance[3] > 200 || ch->stance[3] < 0) 
		   { ch->stance[3] = 200; }
		   ch->stance[4]	= fread_number( fp, -999 );
		   if(ch->stance[4] == -999) errordetect = TRUE;
		   if(ch->stance[4] > 200 || ch->stance[4] < 0) 
		   { ch->stance[4] = 200; }
		   ch->stance[5]	= fread_number( fp, -999 );
		   if(ch->stance[5] == -999) errordetect = TRUE;
		   if(ch->stance[5] > 200 || ch->stance[5] < 0) 
		   { ch->stance[5] = 200; }
		   ch->stance[6]	= fread_number( fp, -999 );
		   if(ch->stance[6] == -999) errordetect = TRUE;
		   if(ch->stance[6] > 200 || ch->stance[6] < 0) 
		   { ch->stance[6] = 200; }
		   ch->stance[7]	= fread_number( fp, -999 );
		   if(ch->stance[7] == -999) errordetect = TRUE;
		   if(ch->stance[7] > 200 || ch->stance[7] < 0) 
		   { ch->stance[7] = 200; }
		   ch->stance[8]	= fread_number( fp, -999 );
		   if(ch->stance[8] == -999) errordetect = TRUE;
		   if(ch->stance[8] > 200 || ch->stance[8] < 0) 
		   { ch->stance[8] = 200; }
		   ch->stance[9]	= fread_number( fp, -999 );
		   if(ch->stance[9] == -999) errordetect = TRUE;
		   if(ch->stance[9] > 200 || ch->stance[9] < 0) 
		   { ch->stance[9] = 200; }
		   ch->stance[10]	= fread_number( fp, -999 );
		   if(ch->stance[10] == -999) errordetect = TRUE;
		   if(ch->stance[10] > 200 || ch->stance[10] < 0) 
		   { ch->stance[10] = 200; }
		   if (errordetect)
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Stance \n\r");
		   fMatch = TRUE;
		   break;
	    }
	    
	    break;
	    
	case 'T':
	    if( !str_cmp( word, "Trust"))
	    {
		   ch->trust = fread_number( fp, -999);
/*		   if( ch->trust == 9 &&
			  ( str_cmp( ch->name, "Joker") &&
			  str_cmp( ch->name, "Archon") &&
			  str_cmp( ch->name, "Genghis") &&
			  str_cmp( ch->name, "Dirge") ) )
		   { 
			  ch->trust = 0;
		   }*/
		   if(ch->trust == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Trust \n\r");
			  ch->trust = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    
	    if ( !str_cmp( word, "Title" ) )
	    {
		   ch->pcdata->title = fread_string( fp );
		   if ( isalpha(ch->pcdata->title[0])
			  ||   isdigit(ch->pcdata->title[0]) )
		   {
			  snprintf( buf,  MAX_STRING_LENGTH, " %s", ch->pcdata->title );
			  free_string( ch->pcdata->title );
			  ch->pcdata->title = str_dup( buf );
		   }
		   fMatch = TRUE;
		   break;
	    }
	    
	    break;
	    
	case 'V':
	    if( !str_cmp( word, "Vampaff"))
	    {
		   ch->vampaff = fread_number( fp, -999);
		   if(ch->vampaff == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Vampaff \n\r");
			  ch->vampaff = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Vampgen"))
	    {
		   ch->vampgen = fread_number( fp, -999);
		   if(ch->vampgen == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Vampgen \n\r");
			  ch->vampgen = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Vamppass"))
	    {
		   ch->vamppass = fread_number( fp, -999);
		   if(ch->vamppass == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Vamppass \n\r");
			  ch->vamppass = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    if ( !str_cmp( word, "Vnum" ) )
	    {
		   int jkrtemp=0;
		   jkrtemp = fread_number( fp, -999);
		   if( jkrtemp == -999) {errordetect = TRUE; jkrtemp = 24000; snprintf( errormess,  MAX_STRING_LENGTH, "Error in Vnum \n\r");}
		   ch->pIndexData = get_mob_index( jkrtemp );
		   fMatch = TRUE;
		   break;
	    }
	    break;
	    
	case 'W':
	    if ( !str_cmp( word, "Weapons" ) )
	    {
		   ch->wpn[0]	= fread_number( fp, -999 );
		   if( ch->wpn[0] < 0 || ch->wpn[0] > 200 ) {errordetect=TRUE;ch->wpn[0]=0;}
		   ch->wpn[1]	= fread_number( fp, -999 );
		   if( ch->wpn[1] < 0 || ch->wpn[1] > 200 ) {errordetect=TRUE;ch->wpn[1]=0;}
		   ch->wpn[2]	= fread_number( fp, -999 );
		   if( ch->wpn[2] < 0 || ch->wpn[2] > 200 ) {errordetect=TRUE;ch->wpn[2]=0;}
		   ch->wpn[3]	= fread_number( fp, -999 );
		   if( ch->wpn[3] < 0 || ch->wpn[3] > 200 ) {errordetect=TRUE;ch->wpn[3]=0;}
		   ch->wpn[4]	= fread_number( fp, -999 );
		   if( ch->wpn[4] < 0 || ch->wpn[4] > 200 ) {errordetect=TRUE;ch->wpn[4]=0;}
		   ch->wpn[5]	= fread_number( fp, -999 );
		   if( ch->wpn[5] < 0 || ch->wpn[5] > 200 ) {errordetect=TRUE;ch->wpn[5]=0;}
		   ch->wpn[6]	= fread_number( fp, -999 );
		   if( ch->wpn[6] < 0 || ch->wpn[6] > 200 ) {errordetect=TRUE;ch->wpn[6]=0;}
		   ch->wpn[7]	= fread_number( fp, -999 );
		   if( ch->wpn[7] < 0 || ch->wpn[7] > 200 ) {errordetect=TRUE;ch->wpn[7]=0;}
		   ch->wpn[8]	= fread_number( fp, -999 );
		   if( ch->wpn[8] < 0 || ch->wpn[8] > 200 ) {errordetect=TRUE;ch->wpn[8]=0;}
		   ch->wpn[9]	= fread_number( fp, -999 );
		   if( ch->wpn[9] < 0 || ch->wpn[9] > 200 ) {errordetect=TRUE;ch->wpn[9]=0;}
		   ch->wpn[10]	= fread_number( fp, -999 );
		   if( ch->wpn[10] < 0 || ch->wpn[10] > 200 ) {errordetect=TRUE;ch->wpn[10]=0;}
		   ch->wpn[11]	= fread_number( fp, -999 );
		   if( ch->wpn[11] < 0 || ch->wpn[11] > 200 ) {errordetect=TRUE;ch->wpn[11]=0;}
		   ch->wpn[12]	= fread_number( fp, -999 );
		   if( ch->wpn[12] < 0 || ch->wpn[12] > 200 ) {errordetect=TRUE;ch->wpn[12]=0;}
			if (errordetect)
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Weapon\n\r");
		   fMatch = TRUE;
		   break;
	    }
	    if( !str_cmp( word, "Wimpy"))
	    {
		   ch->wimpy = fread_number( fp, -999);
		   if(ch->wimpy == -999)
		   {
			  errordetect = TRUE;
			  snprintf( errormess,  MAX_STRING_LENGTH, "Error in Wimpy \n\r");
			  ch->wimpy = 0;
		   }
		   fMatch = TRUE;
		   break;
	    }
	    break;
	}
	
	if( errordetect == TRUE )
	{
	    
	    char joker[MAX_INPUT_LENGTH];
	    send_to_char( "ERROR DETECTED! \n\r Your pfile is buggered please contact a CODER and do NOT log this char in again untill told to do so.\n\r", ch); 	
	    bug( "ERROR DETECTED! Shagged pfile!! during fread_char load.", 0 );
	    snprintf( joker,  MAX_INPUT_LENGTH, "%s has a shagged pfile(ERROR DETECTED!), please inform a CODER!\n\r", ch->name);
	    do_info(ch, joker);
	    bug( joker , 0);
	    bug( errormess, 0);
	    do_info(ch, errormess);
	    close_socket( ch->desc ); 
	    errordetect = FALSE;
	    /*    	    strcpy( errormess, "");	*/
	    return;
	}	
	
	if ( !fMatch )
	{         
	    bug( "Fread_char: no match (!fMatch)Char field error.", 0 );
	    if( !strcmp( word, "SHAGGED"))
	    {
		   char joker[MAX_INPUT_LENGTH];
		   send_to_char( "Your pfile is buggered please contact a CODER and do NOT use this char again until told to do so. \n\r",ch); 	
		   bug( "Shagged pfile!! during fread_char load.", 0 );
		   snprintf( joker,  MAX_INPUT_LENGTH, "%s has a shagged pfile, please inform a CODER!\n\r", ch->name);
		   do_info(ch, joker);
		   bug( joker , 0);
		   bug( errormess , 0);
		   close_socket( ch->desc );
		   return;
	    }
	    else 
		   fread_to_eol( fp );	
	}
    }
}



void fread_obj( CHAR_DATA *ch, FILE *fp )
{
    static OBJ_DATA obj_zero;
    OBJ_DATA *obj;
    char *word;
    int iNest;
    bool fMatch;
    bool fNest;
    bool fVnum;
    bool errordetect = FALSE;
    char errormess[MAX_INPUT_LENGTH];
    
    if ( obj_free == NULL )
    {
	   obj		= alloc_perm( sizeof(*obj) );
    }
    else
    {
	   obj		= obj_free;
	   obj_free	= obj_free->next;
    }
    
    *obj		= obj_zero;
    obj->name		= str_dup( "" );
    obj->short_descr	= str_dup( "" );
    obj->description	= str_dup( "" );
    obj->chpoweron	= str_dup( "(null)" );
    obj->chpoweroff	= str_dup( "(null)" );
    obj->chpoweruse	= str_dup( "(null)" );
    obj->victpoweron	= str_dup( "(null)" );
    obj->victpoweroff	= str_dup( "(null)" );
    obj->victpoweruse	= str_dup( "(null)" );
    obj->questmaker	= str_dup( "" );
    obj->questowner	= str_dup( "" );
    obj->spectype	= 0;
    obj->specpower	= 0;
    obj->condition	= 100;
    obj->toughness	= 0;
    obj->resistance	= 100;
    obj->quest		= 0;
    obj->points		= 0;
    
    fNest		= FALSE;
    fVnum		= TRUE;
    iNest		= 0;
    
    for ( ; ; )
    {
	   word   = feof( fp ) ? "End" : fread_word( fp );
	   fMatch = FALSE;
	   
	   switch ( UPPER(word[0]) )
	   {
	   case '*':
		  fMatch = TRUE;
		  fread_to_eol( fp );
		  break;
		  
	   case 'A':
		  if ( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
		  {
			 AFFECT_DATA *paf;
			 
			 if ( affect_free == NULL )
			 {
				paf		= alloc_perm( sizeof(*paf) );
			 }
			 else
			 {
				paf		= affect_free;
				affect_free	= affect_free->next;
			 }
			 
			 paf->duration	= fread_number( fp, -999 );
			 paf->modifier	= fread_number( fp, -999 );
			 paf->location	= fread_number( fp, -999 );
			 paf->next	= obj->affected;
			 obj->affected	= paf;
			 fMatch		= TRUE;
			 break;
		  }
		  break;
		  
	   case 'C':
		  if( !str_cmp( word, "Condition"))
		  {
			 obj->condition = fread_number( fp, -999);
			 if(obj->condition == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Condition \n\r");
				obj->condition = 100;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  
		  if( !str_cmp( word, "Cost"))
		  {
			 obj->cost = fread_number( fp, -999);
			 if(obj->cost == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Cost \n\r");
				obj->cost = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  break;
		  
	   case 'D':
		  KEYS( "Description",	obj->description,	fread_string( fp ) );
		  break;
		  
	   case 'E':
		  if( !str_cmp( word, "ExtraFlags"))
		  {
			 obj->extra_flags = fread_number( fp, -999);
			 if(obj->extra_flags == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in ExtraFlags \n\r");
				obj->extra_flags = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  
		  if ( !str_cmp( word, "ExtraDescr" ) )
		  {
			 EXTRA_DESCR_DATA *ed;
			 
			 if ( extra_descr_free == NULL )
			 {
				ed			= alloc_perm( sizeof(*ed) );
			 }
			 else
			 {
				ed			= extra_descr_free;
				extra_descr_free	= extra_descr_free->next;
			 }
			 
			 ed->keyword		= fread_string( fp );
			 ed->description		= fread_string( fp );
			 ed->next		= obj->extra_descr;
			 obj->extra_descr	= ed;
			 fMatch = TRUE;
		  }
		  
		  if ( !str_cmp( word, "End" ) )
		  {
			 if ( !fNest || !fVnum )
			 {
				bug( "Fread_obj: incomplete object.", 0 );
				free_string( obj->name        );
				free_string( obj->description );
				free_string( obj->short_descr );
				obj->next = obj_free;
				obj_free  = obj;
				return;
			 }
			 else
			 {
				obj->next	= object_list;
				object_list	= obj;
				obj->pIndexData->count++;
				if ( iNest == 0 || rgObjNest[iNest] == NULL )
				    obj_to_char( obj, ch );
				else
				    obj_to_obj( obj, rgObjNest[iNest-1] );
				return;
			 }
		  }
		  break;
		  
	   case 'I':
		  if( !str_cmp( word, "ItemType"))
		  {
			 obj->item_type = fread_number( fp, -999);
			 if(obj->item_type == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in ItemType \n\r");
				obj->item_type = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  break;
		  
	   case 'L':
		  if( !str_cmp( word, "Level"))
		  {
			 obj->level = fread_number( fp, -999);
			 if(obj->level == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Level \n\r");
				obj->level = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  break;
		  
	   case 'N':
		  KEYS( "Name",	obj->name,		fread_string( fp ) );
		  
		  if ( !str_cmp( word, "Nest" ) )
		  {
			 iNest = fread_number( fp, -999 );
			 if ( iNest < 0 || iNest >= MAX_NEST )
			 {
				bug( "Fread_obj: bad nest %d.", iNest );
			 }
			 else
			 {
				rgObjNest[iNest] = obj;
				fNest = TRUE;
			 }
			 fMatch = TRUE;
		  }
		  break;
		  
	   case 'P':
		  if( !str_cmp( word, "Points"))
		  {
			 obj->points = fread_number( fp, -999);
			 if(obj->points == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Points \n\r");
				obj->points = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  KEYS( "Poweronch",	obj->chpoweron,		fread_string( fp ) );
		  KEYS( "Poweroffch",	obj->chpoweroff,	fread_string( fp ) );
		  KEYS( "Powerusech",	obj->chpoweruse,	fread_string( fp ) );
		  KEYS( "Poweronvict",	obj->victpoweron,	fread_string( fp ) );
		  KEYS( "Poweroffvict",obj->victpoweroff,	fread_string( fp ) );
		  KEYS( "Powerusevict",obj->victpoweruse,	fread_string( fp ) );
		  break;
		  
	   case 'Q':
		  if( !str_cmp( word, "Quest"))
		  {
			 obj->quest = fread_number( fp, -999);
			 if(obj->quest == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Quest \n\r");
				obj->quest = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  KEYS( "Questmaker",	obj->questmaker,	fread_string( fp ) );
		  KEYS( "Questowner",	obj->questowner,	fread_string( fp ) );
		  break;
		  
	   case 'R':
		  if( !str_cmp( word, "Resistance"))
		  {
			 obj->resistance = fread_number( fp, -999);
			 if(obj->resistance == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Resistance \n\r");
				obj->resistance = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  break;
		  
	   case 'S':
		  KEYS( "ShortDescr",	obj->short_descr,	fread_string( fp ) );
		  if( !str_cmp( word, "Spectype"))
		  {
			 obj->spectype = fread_number( fp, -999);
			 if(obj->spectype == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Spectype \n\r");
				obj->spectype = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  
		  if( !str_cmp( word, "Specpower"))
		  {
			 obj->specpower = fread_number( fp, -999);
			 if(obj->specpower == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Specpower \n\r");
				obj->specpower = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  
		  if ( !str_cmp( word, "Spell" ) )
		  {
			 int iValue;
			 int sn;
			 
			 iValue = fread_number( fp, -999 );
			 sn     = skill_lookup( fread_word( fp ) );
			 if ( iValue < 0 || iValue > 3 )
			 {
				bug( "Fread_obj: bad iValue %d.", iValue );
			 }
			 else if ( sn < 0 )
			 {
				bug( "Fread_obj: unknown skill.", 0 );
			 }
			 else
			 {
				obj->value[iValue] = sn;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  break;
		  
	   case 'T':
		  if( !str_cmp( word, "Timer"))
		  {
			 obj->timer = fread_number( fp, -999);
			 if(obj->timer == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Timer \n\r");
				obj->timer = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  
		  if( !str_cmp( word, "Toughness"))
		  {
			 obj->toughness = fread_number( fp, -999);
			 if(obj->toughness == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Toughness \n\r");
				obj->toughness = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }	
		  break;
		  
	   case 'V':
		  if ( !str_cmp( word, "Values" ) )
		  {
			 obj->value[0] = 0;
			 obj->value[1] = 0;
			 obj->value[2] = 0;
			 obj->value[3] = 0;
			 obj->value[0]	= fread_number( fp, -999 );
			 obj->value[1]	= fread_number( fp, -999 );
			 obj->value[2]	= fread_number( fp, -999 );
			 obj->value[3]	= fread_number( fp, -999 );
			 fMatch		= TRUE;
			 break;
		  }
		  
		  if ( !str_cmp( word, "Vnum" ) )
		  {
			 int vnum;
			 
			 vnum = fread_number( fp, -999 );
			 if ( ( obj->pIndexData = get_obj_index( vnum ) ) == NULL )
				bug( "Fread_obj: bad vnum %d.", vnum );
			 else
				fVnum = TRUE;
			 fMatch = TRUE;
			 break;
		  }
		  break;
		  
	   case 'W':
		  if( !str_cmp( word, "WearFlags"))
		  {
			 obj->wear_flags = fread_number( fp, -999);
			 if(obj->wear_flags == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in WearFlags \n\r");
				obj->wear_flags = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  
		  if( !str_cmp( word, "WearLoc"))
		  {
			 obj->wear_loc = fread_number( fp, -999);
			 if(obj->wear_loc == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in WearLoc \n\r");
				obj->wear_loc = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }
		  
		  if( !str_cmp( word, "Weight"))
		  {
			 obj->weight = fread_number( fp, -999);
			 if(obj->weight == -999)
			 {
				errordetect = TRUE;
				snprintf( errormess,  MAX_STRING_LENGTH, "Error in Weight \n\r");
				obj->weight = 0;
			 }
			 fMatch = TRUE;
			 break;
		  }	
		  break;
		  
	}
	
	if( errordetect == TRUE )
	{
	    
	    char joker[MAX_INPUT_LENGTH];
	    send_to_char( "ERROR DETECTED! Your pfile is buggered please contact a CODER and do NOT use this char again until told to do so.\n\r",ch); 	
	    bug( "ERROR DETECTED! Shagged pfile!! during fread_char load.", 0 );
	    bug( errormess, 0);
	    snprintf( joker,  MAX_INPUT_LENGTH, "%s has a shagged pfile(ERROR DETECTED!), please inform a CODER!\n\r", ch->name);
	    do_info(ch, joker);
	    do_info(ch, errormess);
	    bug( joker , 0);
	    bug( errormess , 0);
	    close_socket( ch->desc );
	    errordetect = FALSE;
	    return;
	}	
	
	if ( !fMatch )
	{
	    
	    char joker[MAX_INPUT_LENGTH];
	    
	    bug( "Fread_obj: no match.error 2 (valis)", 0 );
	    bug (joker, 0);
	    if( !strcmp(word, "SHAGGED")) 
	    {
		   char joker[MAX_INPUT_LENGTH];
		   send_to_char( "Your pfile is buggered please contact a CODER and do NOT use this char again until told to do so\n\r",ch); 	
		   bug( "Shagged pfile!! during fread_obj load.", 0 );
		   snprintf( joker,  MAX_INPUT_LENGTH, "%s has a shagged pfile, please inform a CODER!\n\r", ch->name);
		   do_info(ch, joker);
		   bug( joker , 0);
		   bug( errormess , 0);
		   close_socket( ch->desc );
		   return;
	    }	
	    else	
		   fread_to_eol(fp);
	}
    }
}
BAN_DATA *     ban_list;

void save_siteban_info( void )
{
    BAN_DATA *pban;
    FILE *fp;
    char buf[MAX_STRING_LENGTH];
    char strsave[MAX_INPUT_LENGTH];
    int num;
    
    num = 0;
    fclose(fpReserve);
    strncpy(strsave, SITEBAN_FILE,strlen(SITEBAN_FILE));
    
    if ( !( fp=fopen( strsave,"w")))
    {
	   snprintf(buf,  MAX_STRING_LENGTH, "Save_siteban:fopen %s:", strsave);
	   bug( buf, 0 );
	   perror(strsave);
	   return;
    }
    else
    {
	   for ( pban = ban_list; pban != NULL; pban = pban->next )
	   {
		  num++;
	   }
	   fprintf(fp, "%d\n", num);
	   
	   for ( pban = ban_list; pban != NULL; pban = pban->next )
	   {
		  fprintf(fp, "%s\n", pban->name);
	   }
	   
	   fprintf(fp, "#END");
	   fclose(fp);
	   fpReserve = fopen(NULL_FILE, "r");
	   return;
    }
}

void read_siteban_info( void )
{
    BAN_DATA *pban;
    FILE *fp;
    int j,num;
    char strsave[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    
    fclose(fpReserve);
    strncpy(strsave, SITEBAN_FILE, MAX_INPUT_LENGTH);
    
    if ( !( fp=fopen( strsave,"r")))
    {
	   snprintf(buf,  MAX_STRING_LENGTH, "Save_siteban:fopen %s:", strsave);
	   bug( buf, 0 );
	   perror(strsave);
	   return;
    }
    
    num = fread_number(fp, -999);
    
    for(j=1; j<=num; j++)
    {
	   if ( ban_free == NULL )
	   {
		  pban     = alloc_perm( sizeof(*pban) );
	   }
	   else
	   {
		  pban     = ban_free;
		  ban_free = ban_free->next;
	   }
	   
	   pban->name = str_dup( fread_word( fp ) );
	   pban->next = ban_list;
	   ban_list   = pban;
    }
    
    
}

void save_claninfo( void )
{
    FILE *fp;
    char buf[MAX_STRING_LENGTH];
    char strsave[MAX_INPUT_LENGTH];
    
    fclose(fpReserve);
    strncpy(strsave, CLAN_FILE, MAX_INPUT_LENGTH);
    if( !( fp=fopen( strsave, "w")))
    {
	   snprintf(buf,  MAX_STRING_LENGTH, "Save_claninfo: fopen %s: ", strsave);
	   bug( buf, 0);
	   perror(strsave);
	   return;
    }
    else
    {
	   int temp;
	   int temp2;
	   fprintf(fp, "%d\n", MAX_CLAN);
	   for(temp=1;temp<MAX_CLAN;temp++)
	   {
		  fprintf(fp,"%ld\n", clan_infotable[temp].members);
		  for(temp2=1;temp2<MAX_CLAN;temp2++)
			 fprintf(fp,"%d\n",clan_infotable[temp].pkills[temp2]);
		  
		  for(temp2=1;temp2<MAX_CLAN;temp2++)
			 fprintf(fp,"%d\n",clan_infotable[temp].pkilled[temp2]);
		  
		  fprintf(fp, "%ld\n", clan_infotable[temp].mkills);
		  fprintf(fp, "%d\n", clan_infotable[temp].mkilled);
	   }
    }
    fclose(fp);
    fpReserve = fopen(NULL_FILE, "r");
    return;
}

void read_claninfo( void )
{
    int iClan=0;
    int temp2;
    FILE *fp;
    char buf[MAX_STRING_LENGTH];
    char strsave[MAX_INPUT_LENGTH];
    int num = MAX_CLAN-1;
    
    fclose(fpReserve);
    strncpy( strsave, CLAN_FILE, MAX_INPUT_LENGTH);
    if(!(fp = fopen(strsave, "r")))
    {
	   snprintf(buf,  MAX_STRING_LENGTH, "Read_claninfo: fopen %s: ", strsave);
	   bug(buf, 0);
	   perror(strsave);
	   
	   for(iClan=1; iClan<num ; iClan++)
	   {
		  clan_infotable[iClan].members=0; 
		  clan_infotable[iClan].mkills=0;
		  clan_infotable[iClan].mkilled=0;
		  for(temp2=1; temp2<num; temp2++)
		  {
			 (clan_infotable[iClan].pkills[temp2]=0);
			 (clan_infotable[iClan].pkilled[temp2]=0);
		  }
	   }
	   save_claninfo();
	   return;
    }
    else
	   num = fread_number(fp, -999);
    for(iClan=1; iClan<num; iClan++)
    {
	   clan_infotable[iClan].members = fread_number(fp, -999);
	   for(temp2=1; temp2<num; temp2++)
		  clan_infotable[iClan].pkills[temp2] = fread_number(fp, -999);
	   for(temp2=1; temp2<num; temp2++)
		  clan_infotable[iClan].pkilled[temp2] = fread_number(fp, -999);
	   clan_infotable[iClan].mkills = fread_number(fp, -999);
	   clan_infotable[iClan].mkilled = fread_number(fp, -999);
    }
}




void do_updateleague( CHAR_DATA *ch, char *argument)
{
    FILE *fp;
    char buf[MAX_STRING_LENGTH];
    char strsave[MAX_INPUT_LENGTH];
    
    int n=0;
    int m=0; 
    char *tester=0;
    int maxplayers=0;
    
    fclose(fpReserve);
    strncpy( strsave, LEAGUE_FILE, MAX_INPUT_LENGTH);
    if(!(fp = fopen(strsave, "r")))
    {
	   snprintf(buf,  MAX_STRING_LENGTH, "Read_leagueinfo: fopen %s: ", strsave);
	   bug(buf, 0);
	   perror(strsave);
	   return;
    }
    else
    {  
	   for( n=1; !(EOF==(int)tester) ; n++)
	   {
		  ungetc((int)tester,fp);	
		  league_infotable[n].name = fread_jword(fp);
		  fread_word(fp);
		  league_infotable[n].Pk   = fread_number(fp, -999);
		  league_infotable[n].Pd   = fread_number(fp, -999);
		  league_infotable[n].Mk   = fread_number(fp, -999);
		  league_infotable[n].Md   = fread_number(fp, -999);
		  fread_to_eol(fp);
		  (int)tester=getc(fp);
		  snprintf(buf,  MAX_STRING_LENGTH, "name %s \n\r", league_infotable[n].name);
		  send_to_char(buf,ch); 
	   }
	   maxplayers = n;		
    }
    
    
    for (m=1; m<maxplayers; m++)
    {
           snprintf( buf,  MAX_STRING_LENGTH, "%d => %s Pk:%d Pd:%d Mk:%ld Md:%d\n\r", m,
		  league_infotable[m].name,league_infotable[m].Pk,
		  league_infotable[m].Pd,league_infotable[m].Mk,
		  league_infotable[m].Md);
	   send_to_char(buf,ch);
    }
    
    
}