EmlenMud2005-2006LOC/
EmlenMud2005-2006LOC/world/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <malloc.h>

#ifndef WINDOWS
#include <sys/errno.h>
#include <signal.h>
#endif


#include "emlen.h"
extern int _filbuf (FILE *);

#define MAX_NESTING 100
static SINGLE_OBJECT *rgObjNest[MAX_NESTING];
void fwrite_char (CHAR_DATA * ch, FILE * fp);
void fwrite_storage_objs (CHAR_DATA * ch, FILE * fp);
void fwrite_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj, FILE * fp, int iNest);
void fread_char (CHAR_DATA * ch, FILE * fp);
void fread_obj (CHAR_DATA * ch, FILE * fp, int storage);

void 
natural_mana (CHAR_DATA * ch)
{
  int base;
  char buffer[500];

  if (IS_MOB (ch))
    return;
  base = get_curr_int(ch) + 2 + get_curr_wis(ch) +
    (((LEVEL (ch) / 3) * (get_curr_int (ch) +
			  get_curr_wis (ch))) / 9);
  if (IS_AUGMENTED(ch, AUG_MANA_BOOST))
    base = (12*base)/10;
  base = (base * (race_info[ch->pcdata->race].mana_percent + align_info[ch->pcdata->alignment].mana_percent))/100;

  ch->pcdata->n_max_mana = base; 

  //sprintf(buffer,"\x1B[1;30m-->\x1B[1;37mYou now have \x1B[1;34m%d max mana\x1B[0;37m\n\r",base);
  //send_to_char(buffer,ch);

  return;
}

void 
write_fixed_values (SINGLE_OBJECT * obj, FILE * fp)
{
  int val[10];
  int i;
  for (i = 0; i < 10; i++)
    val[i] = obj->pIndexData->value[i];
  if (obj->pIndexData->item_type == ITEM_REPELLANT)
    {
      I_SPRAY *sp = (I_SPRAY *) obj->more;
      val[0] = sp->sprays;
    }
  else if (obj->pIndexData->item_type == ITEM_ARMOR)
    {
      I_ARMOR *arm = (I_ARMOR *) obj->more;
      val[7] = arm->condition_now;
      val[6] = arm->max_condition;
      val[0] = arm->protects_legs;
      val[1] = arm->protects_body;
      val[2] = arm->protects_head;
      val[3] = arm->protects_arms;
    }
  else if (obj->pIndexData->item_type == ITEM_WEAPON)
    {
      I_WEAPON *wep = (I_WEAPON *) obj->more;
      val[0] = wep->damage_p;
      val[1] = wep->strength;
      val[7] = wep->firstdice;
      val[2] = wep->seconddice;
      val[4] = wep->ammo_type;
    }
  else if (obj->pIndexData->item_type == ITEM_DRINK_CON)
    {
      I_DRINK *dr = (I_DRINK *) obj->more;
      val[0] = dr->liquid_now;
      val[2] = dr->liquid_type;
      val[3] = dr->not_poison;
    }
  else if (obj->pIndexData->item_type == ITEM_LIGHT)
    {
      I_LIGHT *lg = (I_LIGHT *) obj->more;
      val[3] = lg->light_lit;
      val[0] = lg->light_now;
    }
  else if (obj->pIndexData->item_type == ITEM_TOOL)
    {
      I_TOOL *tl = (I_TOOL *) obj->more;
      val[1] = tl->uses;
    }
  else if (obj->pIndexData->item_type == ITEM_GEM)
    {
      I_GEM *gem = (I_GEM *) obj->more;
      val[0] = gem->gem_type;
      val[1] = gem->mana_now;
      val[2] = gem->max_mana;
      val[3] = gem->max_level;
    }
  else if (obj->pIndexData->item_type == ITEM_WAND)
    {
      I_WAND *wnd = (I_WAND *) obj->more;
      val[2] = wnd->current_charges;
    }
  else if (obj->pIndexData->item_type == ITEM_STAFF)
    {
      I_WAND *stf = (I_WAND *) obj->more;
      val[2] = stf->current_charges;
    }
  else if (obj->pIndexData->item_type == ITEM_CONTAINER)
    {
      I_CONTAINER *cnt = (I_CONTAINER *) obj->more;
      val[1] = cnt->flags;
      val[8] = cnt->money;
    }
  else if (obj->pIndexData->item_type == ITEM_POTION || obj->pIndexData->item_type == ITEM_SCROLL || obj->pIndexData->item_type == ITEM_PILL)
    {
      I_POTION *pot = (I_POTION *) obj->more;
      val[0] = pot->spell_level;
      val[1] = pot->spells[0];
      val[2] = pot->spells[1];
      val[3] = pot->spells[2];
    }
  
  fprintf (fp, "%d %d %d %d %d %d %d %d %d %d ",
	   val[0], val[1], val[2], val[3],
	   val[4], val[5], val[6], val[7],
	   val[8], val[9]);
  return;
}

void 
conv_height (CHAR_DATA * ch)
{
  if (ch->height > 0)
    return;			/*Only find heights for those who have -1 and 0 height */
  if (IS_PLAYER (ch))		/*If the player is a character */
    {
      ch->height = number_range (race_info[ch->pcdata->race].height_min, race_info[ch->pcdata->race].height_max);
      return;
    }
  switch (ch->pIndexData->mobtype)
    {
    case MOB_HUMAN:
      ch->height = number_range (53, 81);
      break;
    case MOB_ELF:
      ch->height = number_range (58, 88);
      break;
    case MOB_DWARF:
      ch->height = number_range (41, 66);
      break;
    case MOB_GNOME:
      ch->height = number_range (38, 58);
      break;
    case MOB_GIANT:
      ch->height = number_range (86, 150);
      break;
    case MOB_DRAGON:
      ch->height = number_range (178, 408);
      break;
    case MOB_CANINE:
      ch->height = number_range (23, 48);
      break;
    case MOB_RODENT:
      ch->height = number_range (12, 30);
      break;
    case MOB_INSECT:
      ch->height = number_range (12, 30);
      break;
    case MOB_UNDEAD:
    case MOB_GNOLL:
    case MOB_BUGBEAR:
    case MOB_TROGLODYTE:
      ch->height = number_range (47, 89);
      break;
    case MOB_GOLEM:
    case MOB_OGRE:
      ch->height = number_range (77, 145);
      break;
    case MOB_DEMON:
      ch->height = number_range (60, 95);
      break;
    case MOB_TROLL:
      ch->height = number_range (65, 120);
      break;
    case MOB_BIRD:
      ch->height = number_range (20, 40);
      break;
    case MOB_FISH:
      ch->height = number_range (12, 38);
      break;
    case MOB_STATUE:
      ch->height = number_range (50, 100);
      break;
    case MOB_FELINE:
      ch->height = number_range (23, 48);
      break;
    case MOB_PLANT:
      ch->height = number_range (60, 150);
      break;
    case MOB_GENERAL_ANIMAL:
      ch->height = number_range (14, 35);
      break;
    case MOB_FAERIE:
      ch->height = number_range (6, 20);
      break;
    case MOB_REPTILE:
      ch->height = number_range (8, 30);
      break;
    case MOB_GHOST:
      ch->height = number_range (53, 80);
      break;
    case MOB_OTHER:
      ch->height = number_range (53, 81);
      break;
    
    
    case MOB_ORC:
      ch->height = number_range (52, 71);
      break;
  
    case MOB_DUMMY:
      ch->height = number_range (51, 70);
      break;
    case MAX_MOB_TYPE:
      ch->height = number_range (51, 75);
      break;
    }
  return;
}


void 
load_corpse (CHAR_DATA * real_ch)
{
  char strsave[SML_LENGTH];
  CHAR_DATA *ch;
  FILE *fp;
  bool found;
  char buffy[500];
  SINGLE_OBJECT *corpsecheck;
/*Scan world if corpse already exists */
  sprintf (buffy, "corpse of %s", NAME (real_ch));
  for (corpsecheck = object_list; corpsecheck && corpsecheck != NULL; corpsecheck = corpsecheck->next)
    {
      if (!str_suffix (buffy, STRR (corpsecheck, short_descr)) ||
	  !str_suffix (STRR (corpsecheck, short_descr), buffy))
	return;
    }
/*Okay, if it existed, function would have returned */
  found = FALSE;
#ifndef WINDOWS
//  fclose (fpReserve);
#endif
  sprintf (strsave, "%s%s.cor", PLAYER_DIR,
	   capitalize (real_ch->pcdata->name));
  if ((fp = fopen (strsave, "r")) == NULL)
    {
      sprintf (strsave, "%s%s.cor", PLAYER_DIR,
	       capitalize (real_ch->pcdata->name));
    }
  else
    {
      fclose (fp);
    }
  if ((fp = fopen (strsave, "r")) == NULL)
    return;
  else
    {
      int iNest;
      ch = new_char ();
      ch->pcdata = new_pc ();
      ch->desc = NULL;
      free_string (ch->pcdata->name);
      ch->pcdata->name = str_dup (NAME (real_ch));
      for (iNest = 0; iNest < MAX_NESTING; 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);
	      break;
	    }
	  word = fread_word (fp);
	  if (!str_cmp (word, "PLAYER"))
	    fread_char (ch, fp);
	  else if (!str_cmp (word, "OBJECT"))
	    fread_obj (ch, fp, 0);
	  else if (!str_cmp (word, "END"))
	    break;
	  else
	    {
	      bug ("Load_char_obj: bad section.", 0);
	      break;
	    }
	}
      
      fclose (fp);
    }
#ifndef WINDOWS
//  fpReserve = fopen (NULL_FILE, "r");
#endif
  if (ch->pcdata->temp_room == NULL)
    ch->pcdata->temp_room = get_room_index(ch->pcdata->alignment +100);
  char_to_room (ch, ch->pcdata->temp_room);
  make_corpse (ch);
  extract_char (ch, TRUE);
  return;
}

void 
save_corpse (CHAR_DATA * ch)
{
  char strsave[SML_LENGTH];
  FILE *corpsefile;
  if (IN_BATTLE (ch))
    return;
  if (IS_MOB (ch) || LEVEL (ch) < 1)
    return;
  sprintf (strsave, "%s%s.cor", PLAYER_DIR,
	   capitalize (ch->pcdata->name));
  if ((corpsefile = fopen (strsave, "w")) == NULL)
    {
      bug ("Save_char_obj: fopen", 0);
      perror (strsave);
    }
  else
    {
      fwrite_char (ch, corpsefile);
      if (ch->carrying != NULL)
	fwrite_obj (ch, ch->carrying, corpsefile, 0);
      fprintf (corpsefile, "#END\n");
    }
  fclose (corpsefile);
  return;
}




CHAR_DATA *chCorrupt=NULL;
FILE *f=NULL;

void segfault_handler();

static void segfault_save_handler() {
  CHAR_DATA *ch = chCorrupt;
  char strsave[SML_LENGTH];
    char szBuf[512];
    FILE *fp;
  fclose(f);
    sprintf(szBuf,"%s%s.bak", PLAYER_DIR, capitalize(ch->pcdata->name));
#ifdef ENCRYPT_PFILES
  sprintf (strsave, "%s%s.u", PLAYER_DIR, capitalize (ch->pcdata->name));
#else
  sprintf (strsave, "%s%s", PLAYER_DIR, capitalize (ch->pcdata->name));
#endif
  if ( (fp=fopen(szBuf, "r")) != NULL ) {
    FILE *fp2;
    if ( (fp2=fopen(strsave,"w")) != NULL ) {
        int a;
	while (!feof(fp)) {
	  a=fgetc(fp);
	  fputc(a, fp2);
        }
	fclose(fp2);
    }
    fclose(fp);
  } 
  
  fprintf(stderr,"FUCK!  Caught corruption of pfile %s!  Restored from .bak\n", ch->pcdata->name);
  exit(5); 
}

void 
save_char_obj (CHAR_DATA * ch)
{
  char strsave[SML_LENGTH];
  FILE *fp;
  chCorrupt=ch;
#ifndef WINDOWS
  signal(SIGSEGV, segfault_save_handler);
#endif

  if (IN_BATTLE (ch) == TRUE)
    return;
  if (ch->in_room && ch->in_room->vnum > 449 && ch->in_room->vnum < 500)
    return;
  if (IS_MOB (ch) || LEVEL (ch) < 0)
    return;
  if (ch->desc != NULL && ch->desc->original != NULL)
    ch = ch->desc->original;
#ifndef WINDOWS
//  fclose (fpReserve);
#endif
#ifdef ENCRYPT_PFILES
  sprintf (strsave, "%s%s.u", PLAYER_DIR, capitalize (ch->pcdata->name));
#else
  sprintf (strsave, "%s%s", PLAYER_DIR, capitalize (ch->pcdata->name));
#endif
  if ( (fp=fopen(strsave, "r")) != NULL ) {
    FILE *fp2;
    char szBuf[512];
    sprintf(szBuf,"%s%s.bak", PLAYER_DIR, capitalize(ch->pcdata->name));
    if ( (fp2=fopen(szBuf,"w")) != NULL ) {
        int a;
	while (!feof(fp)) {
	  a=fgetc(fp);
	  fputc(a, fp2);
        }
	fclose(fp2);
    }
    fclose(fp);
  }
  if ((fp = fopen (strsave, "w")) == NULL)
    {
      bug ("Save_char_obj: fopen", 0);
      perror (strsave);
    }
  else
    {
      f=fp;
      fwrite_char (ch, fp);
      if (ch->carrying != NULL)
	fwrite_obj (ch, ch->carrying, fp, 0);
      fwrite_storage_objs (ch, fp);
      fprintf (fp, "#END\n");
    }
  f=NULL;
  fclose (fp);
#ifdef ENCRYPT_PFILES
  jumble (capitalize (ch->name));
  sprintf (buft, "rm %s &", strsave);
  system (buft);
#endif
#ifndef WINDOWS
//  fpReserve = fopen (NULL_FILE, "r");
  signal(SIGSEGV, segfault_handler);
#endif
  
  chCorrupt=NULL;
  return;
}


void 
fwrite_char (CHAR_DATA * ch, FILE * fp)
{
  AFFECT_DATA *paf;
  CHANNEL *c;
  int i = 0;
  int sn, k;
  ROOM_DATA *tr;
  char sss[500];
  SPELL_DATA *spell;
  check_ced (ch);
  check_fgt (ch);
  tr = ch->in_room;

  ch->pcdata->played+=(int)(current_time - ch->pcdata->logon);

  ch->pcdata->logon=current_time;
  ch->pcdata->new_exp = TRUE;
  sprintf (sss, "%s%s", PLAYER_DIR, capitalize (NAME (ch)));
  fprintf (fp, "#%s\n", IS_MOB (ch) ? "MOB" : "PLAYER");
  if (ch->pcdata->email[0] != '\0')
    fprintf (fp, "NEmail %s~\n", fix_string (ch->pcdata->email));

  if (ch->pcdata->short_descr && ch->pcdata->short_descr[0] != '\0' &&
strlen(ch->pcdata->short_descr) > 2)
    fprintf (fp, "ShDesc %s~\n", ch->pcdata->short_descr);
  if (ch->pcdata->long_descr && ch->pcdata->long_descr[0] != '\0' &&
strlen(ch->pcdata->long_descr) > 2)
    fprintf (fp, "LoDesc %s~\n", fix_string (ch->pcdata->long_descr));
  fprintf (fp, "Descr %s~\n", fix_string (ch->pcdata->description));
  fprintf (fp, "Sex %d\n", SEX (ch));

  for (c = chan_first; c != NULL; c = c->next)
    {
      fprintf (fp, "LCcol %d %s\n", i, ch->pcdata->chan_color[i]);
      i++;
    }
  fprintf (fp, "LCign %d\n", ch->pcdata->chan_ignore);

  fprintf (fp, "TtlKils .%o\n", ch->pcdata->totalkills);
  fprintf (fp, "NAn %d\n", ch->pcdata->show_lev);
  fprintf (fp, "Killpt .%o\n", ch->pcdata->killpoints);
  fprintf (fp, "Deaths %d\n", ch->pcdata->deaths);
  fprintf (fp, "DPray %d\n", ch->pcdata->pray_points);
  fprintf (fp, "DCoins %d %d %d %d %d\n", 0, 0, ch->gold, 0, ch->copper);

  for (k = 0; k < MAX_SCRIPT_FLAGS; k++)
    {
      if (ch->pcdata->script_flags[k] && ch->pcdata->script_flags[k][0] != '\0')
	{
	  fprintf (fp, "Sf %s~\n", ch->pcdata->script_flags[k]);
	}
    }
  fprintf (fp, "Nexp %d\n", ch->pcdata->new_exp);
  fprintf (fp, "Nospam %d\n", ch->pcdata->no_spam);
  if (ch->height != -1)
    fprintf (fp, "NHeight %d\n", ch->height);
  fprintf (fp, "NDon %d\n", ch->pcdata->donated);
  fprintf (fp, "NQuest %d\n", ch->pcdata->questflag);
  fprintf (fp, "NatArm .%o\n", ch->pcdata->nat_armor);
  fprintf (fp, "NatAbil %d\n", ch->pcdata->nat_abilities);
  fprintf (fp, "NatAbilT %d\n", ch->pcdata->nat_abilities2);
  if (ch->ced && ch->ced->wasroom != 0)
    {
   /*   fprintf (fp, "NWasrm %d\n", ch->ced->wasroom); */
    }
  if (ch->pcdata->challenge_on)
    fprintf (fp, "NChon %d\n", ch->pcdata->challenge_on);
  if (ch->pcdata->remort_times)
    fprintf (fp, "NRemort %d\n", ch->pcdata->remort_times);
  fprintf (fp, "NAMsg %d\n", ch->pcdata->arena_msg);
  if (ch->fgt->challenge)
    fprintf (fp, "NChal %d\n", ch->fgt->challenge);
  if (ch->pcdata->guilds)
    fprintf (fp, "NGldBt %d\n", ch->pcdata->guilds);
  fprintf (fp, "NWPS %ld\n", ch->pcdata->warpoints);
  fprintf (fp, "NMana .%o\n", ch->pcdata->n_mana);

  fprintf (fp, "Race %d\n", ch->pcdata->race);
  fprintf (fp, "Level .%o\n", ch->pcdata->level);
  fprintf (fp, "SCool %d\n", ch->pcdata->cool_skills);
  if (ch->pcdata->level > 100)
    {
      fprintf (fp, "Winv %d\n", ch->pcdata->wizinvis);
      fprintf (fp, "Secrty %d\n", ch->pcdata->security);
    }
  fprintf (fp, "Clan %d\n", ch->pcdata->clan);
  fprintf (fp, "Clan2 %d\n", ch->pcdata->clan2);
  
  fprintf (fp, "Played %ld\n", ch->pcdata->played);
  fprintf (fp, "Note %ld\n", ch->pcdata->last_note);
  fprintf (fp, "Room %d\n", (ch->in_room ? ch->in_room->vnum :100+ch->pcdata->alignment));
  fprintf (fp, "HpMove .%lo .%lo .%o .%o\n", ch->hit, ch->max_hit,
	   ch->move, ch->max_move);
  fprintf (fp, "EFight %d\n", ch->ced->fight_ops);
  fprintf (fp, "Exp %ld\n", ch->exp);
  fprintf (fp, "Act %d\n", ch->act);
  fprintf (fp, "Act2 %d\n", ch->pcdata->act2);
  if (ch->pcdata->act3 != 0)
    fprintf (fp, "Act3 %d\n", ch->pcdata->act3);
  fprintf (fp, "AffTWO %d\n", ch->more_affected_by);
  fprintf (fp, "AffBy %d\n", ch->affected_by);
  fprintf (fp, "Positn %d\n",
      ch->position == POSITION_FIGHTING ? POSITION_STANDING : ch->position);
  fprintf (fp, "Learn .%o\n", ch->pcdata->learn);
  fprintf (fp, "Practc .%o\n", ch->pcdata->practice);

  if (ch->pcdata->saving_throw)
    fprintf (fp, "SvngTh %d\n", ch->pcdata->saving_throw);

  fprintf (fp, "Alignmt %d\n", ch->pcdata->alignment);
  fprintf (fp, "NRat %ld\n", ch->max_hit + ch->max_move + ch->exp - ch->hitroll - ch->damroll);
  fprintf (fp, "Hitrl .%o\n", ch->hitroll);
  fprintf (fp, "Damrl .%o\n", ch->damroll);
  fprintf (fp, "Armor .%o\n", ch->armor);
  if (ch->pcdata->deaf)
    fprintf (fp, "Deaf %d\n", ch->pcdata->deaf);

  fprintf (fp, "Wimpy %d\n", ch->ced->wimpy);
  fprintf (fp, "TotWps %ld\n", ch->pcdata->total_wps);
  fprintf (fp, "PkLevs %ld\n", ch->pcdata->pklevels);
  fprintf (fp, "Pkhelp %ld\n", ch->pcdata->pkhelpers);
  fprintf (fp, "Pkills %d\n", ch->pcdata->pkills);
  fprintf (fp, "Pkilled %d\n", ch->pcdata->pkilled);
  fprintf (fp, "Pkers %ld\n", ch->pcdata->pkers);
  fprintf (fp, "Warmth %ld\n", ch->pcdata->warmth);
  fprintf (fp, "Hardpk %d\n", ch->pcdata->hard_pkills);
  fprintf (fp, "Created %ld\n", ch->pcdata->created);
  fprintf (fp, "ManaShield %d\n", ch->pcdata->mana_shield_strength);
  fprintf (fp, "Elemental %d\n", ch->pcdata->elemental_alignment);
  if (IS_MOB (ch))
    {
      fprintf (fp, "Vnum %d\n", ch->pIndexData->vnum);
    }
  else
    {
      int i; 
      fprintf (fp, "Password %s~\n", ch->pcdata->pwd);
      fprintf (fp, "RealPassword %s~\n", ch->pcdata->rpwd);
      if (ch->pcdata->rprompt)
	fprintf (fp, "Promptr %s~\n", fix_string (ch->pcdata->rprompt));
      fprintf (fp, "Pagelen %d\n", ch->pcdata->pagelen);
      fprintf (fp, "PImplO %d\n", ch->pcdata->augments);
      if (LEVEL (ch) > 99)
	{
	  fprintf (fp, "Bamfin %s~\n", ch->pcdata->beamin);
	  fprintf (fp, "Bamfout %s~\n", ch->pcdata->beamout);
	}
      if (ch->pcdata->bank > 0)
	fprintf (fp, "Bank %ld\n", ch->pcdata->bank);

      fprintf (fp, "Title %s~\n", ch->pcdata->title);
      fprintf (fp, "AttrPerm ");
      for (i = 0; i < NUM_STATS; i++)
	{
	  fprintf(fp, ".%o ", ch->pcdata->stat[i]);
	}
      fprintf(fp, "\n");
      fprintf (fp, "AttrMod ");
      for (i = 0; i < NUM_STATS; i++)
	{
	  fprintf(fp, "%d ", ch->pcdata->stat_mod[i]);
	}
	  fprintf(fp, "\n");
	  fprintf (fp, "StartAttr ");
	  for (i = 0; i < NUM_STATS; i++)
	{
	  fprintf(fp, "%d ", ch->pcdata->start_stat[i]);
	}
      fprintf(fp, "\n");
      fprintf (fp, "Condition %d %d %d\n",
	       ch->pcdata->condition[0],
	       ch->pcdata->condition[1],
	       ch->pcdata->condition[2]);
      fprintf (fp, "Colors %d %d %d %d %d %d %d %d %d %d\n",
	       ch->pcdata->colors[0],
	       ch->pcdata->colors[1],
	       ch->pcdata->colors[2],
	       ch->pcdata->colors[3],
	       ch->pcdata->colors[4],
	       ch->pcdata->colors[5],
	       ch->pcdata->colors[6],
	       ch->pcdata->colors[7],
	       ch->pcdata->colors[8],
	       ch->pcdata->colors[9]);
    fprintf (fp, "Stance %d\n", ch->pcdata->stance);
      for (k = 0; k < MAX_TROPHY; k++)
	{
	  if (ch->pcdata->trophy_name[k][0] != '\0')
	    {
	      fprintf (fp, "NTro %s \n", ch->pcdata->trophy_name[k]);
	      fprintf (fp, "TTro %d\n", ch->pcdata->trophy_times[k]);
	      fprintf (fp, "LTro %d\n", ch->pcdata->trophy_level[k]);
	    }
	}
      fprintf(fp, "Faction ");
      for (k=0; k < MAX_MOB_TYPE; k++)
	fprintf(fp, "%d ", ch->pcdata->faction[k]);
      fprintf(fp, "\n");
      
      for (k = 0; k < MAX_IGNORE; k++)
	{
	  if (ch->pcdata->ignore[k])
	    fprintf (fp, "Ignore %s\n", ch->pcdata->ignore[k]);
	}
      for (k = 0; k < MAXALIAS; k++)
	{
	  if (ch->pcdata->aliasname[k] &&
	      ch->pcdata->aliasname[k][0] != '\0' &&
	      ch->pcdata->alias[k] &&
	      ch->pcdata->alias[k][0] != '\0')
	    {
	      char *msk;
	      for (msk = ch->pcdata->alias[k]; *msk != '\0'; msk++)
		if (*msk == '~')
		  *msk = '*';
	      fprintf (fp, "Alias %s\n", ch->pcdata->aliasname[k]);
	      fprintf (fp, "AlCt %s~\n",
		       fix_string (ch->pcdata->alias[k]));
	      for (msk = ch->pcdata->alias[k]; *msk != '\0'; msk++)
		if (*msk == '*')
		  *msk = '~';
	    }
	}
      
      for (sn = 0; sn < SKILL_COUNT; sn++)
	{
	  if ((spell = skill_lookup (NULL, sn)) == NULL)
	    continue;
	  if (ch->pcdata->learned[sn] > 0)
	    {
	      fprintf (fp, "Skill %d '%s'\n",
		       ch->pcdata->learned[sn], spell->spell_funky_name);
	    }
	}
    }
  for (paf = ch->affected; paf && paf != NULL; paf = paf->next)
    {
      if (paf->type < 0 || paf->type >= SKILL_COUNT)
	continue;
      spell = skill_lookup (NULL, paf->type);
      if (spell == NULL)
	continue;
      fprintf (fp, "AffectData '%s' %3d %3d %3d %10d %10d\n",
	       spell->spell_funky_name,
	       paf->duration,
	       paf->modifier,
	       paf->location,
	       paf->bitvector,
	       paf->bitvector2
	);
    }
  fprintf (fp, "End\n\n");
  return;
}

void 
fwrite_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj, FILE * fp, int iNest)
{
  AFFECT_DATA *paf;
  if (obj->next_content != NULL)
    fwrite_obj (ch, obj->next_content, fp, iNest);
  if (IS_SET (obj->extra_flags, ITEM_NOSAVE))
    {
      return;
    }
  fprintf (fp, "#OBJECT\n");
  fprintf (fp, "Nest %d\n", iNest);
  if (TRUE || !str_cmp (obj->short_descr, obj->pIndexData->short_descr))
    {
      fprintf (fp, "AOVN %d ", obj->pIndexData->vnum);
      write_fixed_values (obj, fp);
      fprintf (fp, "%d ", obj->wear_loc);
      fprintf (fp, "%d ", obj->size);
      fprintf (fp, "%d\n", obj->timer);
      for ( paf = obj->affected; paf && paf != NULL; paf = paf->next )
	{
	  fprintf( fp, "AffectData %d %d %d %d %d\n",  paf->duration,  paf->modifier,  paf->location, paf->bitvector, paf->bitvector2 
);
	}
    }
  fprintf (fp, "End\n\n");
  if (obj->contains != NULL)
    fwrite_obj (ch, obj->contains, fp, iNest + 1);
  return;
}


void 
fread_clan_storage (int clan_num)
{
  char clan_fname[100];
  FILE *fp;
  int k;
  CLAN_DATA *clan;
  if ((clan = get_clan_index (clan_num)) == NULL)
    {
      fprintf (stderr, "Ack! Bad clan number passed to fread_clan_storage!\n");
      return;
    }
  for (k = 0; k < MAX_CLAN_STORAGE; k++)
    {
      clan->storage[k] = NULL;
    }
  sprintf (clan_fname, "clan%d.sto", clan_num);
  if ((fp = fopen (clan_fname, "r")) == NULL)
    {
      return;
    }
  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);
	  break;
	}
      word = fread_word (fp);
      if (!str_cmp (word, "STORAGE"))
	fread_obj (NULL, fp, clan_num + 1);
      else if (!str_cmp (word, "END"))
	break;
      else
	{
	  bug ("Load_clan_storage: bad section.", 0);
	  break;
	}
    }
  fclose (fp);
  return;
}

void 
fwrite_clan_storage (int clan_num)
{
  FILE *fp;
  CLAN_DATA *clan;
  char clan_fname[500];
  bool foundy;
  SINGLE_OBJECT *obj;
  AFFECT_DATA *paf;
  int k;
  if ((clan = get_clan_index (clan_num)) == NULL)
    {
      fprintf (stderr, "Null Clan Index for fwrite_clan_storage.\n");
      return;
    }
  foundy = FALSE;
  for (k = 0; k < MAX_CLAN_STORAGE; k++)
    {
      if (clan->storage[k] != NULL)
	foundy = TRUE;
    }
  if (!foundy)
    return;
  sprintf (clan_fname, "clan%d.sto", clan_num);
  if ((fp = fopen (clan_fname, "w")) == NULL)
    {
      bug ("Save_clan_storage: fopen", 0);
      perror (clan_fname);
    }
  for (k = 0; k < MAX_CLAN_STORAGE; k++)
    {
      if (clan->storage[k] == NULL || IS_SET (clan->storage[k]->extra_flags, ITEM_NOSAVE))
	continue;
      else
	obj = clan->storage[k];
      fprintf (fp, "#STORAGE\n");
      fprintf (fp, "Nest 0\n");
      fprintf (fp, "AOVN %d ", obj->pIndexData->vnum);
      write_fixed_values (obj, fp);
      fprintf (fp, "%d ", obj->wear_loc);
      fprintf (fp, "%d ", obj->size);
      fprintf (fp, "%d\n", obj->timer);
      for ( paf = obj->affected; paf && paf != NULL; paf = paf->next )
	{
	  fprintf( fp, "AffectData %d %d %d %d %d\n",
		   paf->duration,
		   paf->modifier,
		   paf->location,
		   paf->bitvector,
		   paf->bitvector2
		   );
	}
      fprintf (fp, "End\n\n");
    }
  fprintf (fp, "#END\n\n");
  fclose (fp);
  return;
}


void 
fread_clan_bank (int clan_num)
{
  char clan_fname[100];
  FILE *fp;
  CLAN_DATA *clan;
  if ((clan = get_clan_index (clan_num)) == NULL)
    {
      fprintf (stderr, "Ack! Bad clan number passed to fread_clan_bank!\n");
      return;
    }
  
  sprintf (clan_fname, "clan%d.bnk", clan_num);
  if ((fp = fopen (clan_fname, "r")) == NULL)
    {
      return;
    }
  clan_bank[clan_num].warpoints = fread_number(fp);
  clan_bank[clan_num].gold = fread_number (fp);
  fclose (fp);
  return;
}





void 
fwrite_clan_bank (int clan_num)
{
  FILE *fp;
  CLAN_DATA *clan;
  char clan_fname[500];
  if ((clan = get_clan_index (clan_num)) == NULL)
    {
      fprintf (stderr, "Null Clan Index for fwrite_clan_bank.\n");
      return;
    }
  sprintf (clan_fname, "clan%d.bnk", clan_num);
  if ((fp = fopen (clan_fname, "w")) == NULL)
    {
      bug ("Save_clan_bank: fopen", 0);
      perror (clan_fname);
    }
  fprintf (fp, "%d\n", clan_bank[clan_num].warpoints);
  fprintf (fp, "%d\n", clan_bank[clan_num].gold);
  fclose (fp);
  return;
}

void 
fwrite_align_bank (int align_num)
{
  FILE *fp;
  char align_fname[200];
  if (align_num < 0 || align_num >= NUM_ALIGN)
    {
      fprintf (stderr, "Bad number for fwrite_align_bank.\n");
      return;
    }
  sprintf(align_fname, "align%d.bnk", align_num);
  if ((fp = fopen (align_fname, "w")) == NULL)
    {
      bug ("Save_align_bank: fopen", 0);
      perror (align_fname);
    }
  fprintf (fp, "%d\n", align_bank[align_num].warpoints);
  fprintf (fp, "%d\n", align_bank[align_num].gold);
  fclose (fp);
  return;
}

void 
fwrite_alliance_data (void)
{
  int i; 
  int j;
  char alliance_fname[100];
  FILE *fp;
  sprintf(alliance_fname, "alliance.dat");
  if ((fp = fopen (alliance_fname, "w")) == NULL)
    {
      fprintf(stderr, "BAD WRITE ON ALLIANCE DATA!\n");
      perror(alliance_fname);
    }
  for (i = 0; i < NUM_ALIGN; i++)
    {
      for (j = 0; j < NUM_ALIGN; j++)
	{
	  fprintf(fp, "%d\n", alliance[i][j]);
	}
      alliance[i][i]= TRUE;
    }
  
  
  fclose (fp);
  return;
}


void 
fread_alliance_data (void)
{
  int i; 
  int j;
  char alliance_fname[100];
  FILE *fp;
  sprintf(alliance_fname, "alliance.dat");
  for (i = 0; i < NUM_ALIGN; i++)
    {
      for (j = 0; j < NUM_ALIGN; j++)
	{
	  if (i == j)
	    alliance[i][j] = TRUE;
	  else
	    alliance[i][j] = FALSE;
	  
	}
    }
  if ((fp = fopen (alliance_fname, "r")) == NULL)
    {
      fprintf(stderr, "BAD READ ON ALLIANCE DATA!\n");
      fwrite_alliance_data();
      return;
    }
  for (i = 0; i < NUM_ALIGN; i++)
    {
      for (j = 0; j < NUM_ALIGN; j++)
	{
	  alliance[i][j] = fread_number(fp);
	}
    }
  
  
  fclose (fp);
  fwrite_alliance_data();
  return;
}
void 
fread_align_bank (int align_num)
{
  char align_fname[100];
  FILE *fp;
  if (align_num < 0 || align_num >= NUM_ALIGN)
    {
      fprintf (stderr, "Ack! Bad align number sent to fread_align_bank!\n");
      return;
    }
  sprintf(align_fname, "align%d.bnk", align_num);
  if ((fp = fopen (align_fname, "r")) == NULL)
    {
      return;
    }
  align_bank[align_num].warpoints = fread_number(fp);
  align_bank[align_num].gold = fread_number (fp);
  fclose (fp);
  return;
}






void 
fwrite_storage_objs (CHAR_DATA * ch, FILE * fp)
{
  SINGLE_OBJECT *obj;
  AFFECT_DATA *paf;
  int k;
  if (IS_MOB (ch))
    return;
  for (k = 0; k < MAXST; k++)
    {
      if (ch->pcdata->storage[k] == NULL || IS_SET (ch->pcdata->storage[k]->extra_flags, ITEM_NOSAVE))
	continue;
      else
	obj = ch->pcdata->storage[k];
      fprintf (fp, "#STORAGE\n");
      fprintf (fp, "Nest %d\n", 0);
      if (TRUE || !str_cmp (obj->short_descr, obj->pIndexData->short_descr))
	{
	  fprintf (fp, "AOVN %d ", obj->pIndexData->vnum);
	  write_fixed_values (obj, fp);
	  fprintf (fp, "-1 ");
	  fprintf (fp, "%d ", obj->size);
	  fprintf (fp, "%d\n", obj->timer);
	  for ( paf = obj->affected; paf && paf != NULL; paf = paf->next )
	    {
	      fprintf( fp, "AffectData %d %d %d %d\n",
		       paf->duration,
		       paf->modifier,
		       paf->location,
		       paf->bitvector,
		       paf->bitvector2
		       );
	    } 
	}
      fprintf (fp, "End\n\n");
    }
  return;
}

/*
   * Load a char and inventory into a new ch structure.
 */
bool 
load_char_obj (DESCRIPTOR_DATA * d, char *name, bool ped)
{
  char strsave[SML_LENGTH];
  char strsave2[SML_LENGTH];
  CHAR_DATA *ch;
  CHAR_DATA *tch;
  char *tt;
  FILE *fp;
  bool found;
  char arg1[900];
  char arg2[900];
  arg1[0] = '\0';
  arg2[0] = '\0';
  for (tt = name + 1; *tt != '\0'; tt++)
    {
      if (*tt < 'a')
	*tt = LOWER (*tt);
    }
  
 
  strcpy (arg2, name);
  strcpy (arg2, one_argy (name, arg1));
  if (arg2 == "" || arg2[0] == '\0')
    {
      arg1[0] = '\0';
    }
  else
    {
      char tbuff[900];
      strcpy (tbuff, arg2);
      strcpy (arg2, arg1);
      strcpy (arg1, tbuff);
    }
  if (arg1[0] == '\0')
    strcpy (arg2, name);
  name[0] = UPPER (name[0]);
  if (!ped)
    {
      for (tch = char_list; tch != NULL; tch = tch->next)
	{
	  if (IS_PLAYER (tch) && tch->desc != NULL && !str_cmp (tch->pcdata->name, arg2))
	    {
	      if (!str_cmp(arg1,tch->pcdata->rpwd))
		{
		  tch->desc->connected = CON_PLAYING;
		  close_socket (tch->desc);
		  tch->desc = d;
		  d->character = tch;
		  d->connected = CON_PLAYING;
		  d->repeat = -5;
		  return TRUE;
		} 
	      /* JRAJRA */
	      fprintf (stderr, "%s was online and %s@%s attempted to log in.\n", NAME (tch),   (tch->desc ? tch->desc->username : "nodesc"),
		       (tch->desc ? tch->desc->host : "nodesc"));
	      write_to_descriptor2 (d, "\n\rAlready playing! Type <name> <password> all on one line to break in.\n\r", 0);
	      d->character = tch;
	      tch->pcdata->new_exp = TRUE;
	      return FALSE;
	    }
	  if (IS_PLAYER (tch) && tch->desc == NULL && !strcmp(tch->pcdata->name, arg2))
	    {
	      tch->desc = d;
	      d->character = tch;
	      /*Char used a previously existing char in the game to reconnect. */
	      d->connected = CON_PLAYING;
	      return TRUE;
	    }
	}
    }
  ch = new_char ();
  ch->pcdata = new_pc ();
  if (!ped)
    d->character = ch;
  ch->next = NULL;
  if (!ped)
    ch->desc = d;
  else
    ch->desc = NULL;
  free_string (ch->pcdata->name);
  ch->pcdata->name = str_dup (name);
  ch->pcdata->temp = NULL;
  check_ced (ch);
  check_fgt (ch);
  found = FALSE;
#ifndef WINDOWS
//  fclose (fpReserve);
#endif
#ifdef ENCRYPT_PFILES
  unjumble (capitalize (name), FALSE);
  sprintf (strsave, "%s%s.u", PLAYER_DIR, capitalize (name));
  sprintf (strsave2, "%s%s", PLAYER_DIR, capitalize (name));
#else
  sprintf (strsave, "%s%s", PLAYER_DIR, capitalize (name));
  sprintf (strsave2, "%s%s.u", PLAYER_DIR, capitalize (name));
#endif
  if ((fp = fopen (strsave, "r")) != NULL
      || (fp = fopen (strsave2, "r")) != NULL)
    {
      int iNest;
      for (iNest = 0; iNest < MAX_NESTING; 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);
	      break;
	    }
	  word = fread_word (fp);
	  if (!str_cmp (word, "PLAYER"))
	    {
	      fread_char (ch, fp);
	    }
	  else if (!str_cmp (word, "OBJECT"))
	    {
	      if (is_equipwipe)
		break;
	      fread_obj (ch, fp, 0);
	    }
	  else if (!str_cmp (word, "STORAGE"))
	    {
	      if (is_equipwipe)
		break;
	      fread_obj (ch, fp, 1);
	    }
	  else if (!str_cmp (word, "END"))
	    break;
	  else
	    {
	      bug ("Load_char_obj: bad section.", 0);
	      break;
	    }
	}
      fclose (fp);
    }
#ifndef WINDOWS
//  fpReserve = fopen (NULL_FILE, "r");
#endif
  if (found)
    {
      pedit_found = ch;
      conv_height (ch);
      fix_char (ch);
    }
#ifdef ENCRYPT_PFILES
  sprintf (buf, "rm %s &", strsave);
  system (buf);
#endif

  return found;
}

/*
   * Read in a char.
 */
#if defined(SKEY)
#undef SKEY
#endif
#define SKEY( literal, field, value )  if ( !str_cmp(word,(literal))) {(field)=str_dup((value));fMatch=TRUE;break;}
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value )  if ( !str_cmp(word,(literal))) {(field)=(value);fMatch=TRUE;break;}


void 
fread_rest (CHAR_DATA * ch)
{
  char *word;
  bool fMatch;
  int dummy;
  int i;
  int k;
  FILE *fpt;
  char bufh[100];
  char sss[500];
  check_ced (ch);
  check_fgt (ch);
  sprintf (sss, "%s%s", PLAYER_DIR, (capitalize (NAME (ch))));
  if ((fpt = fopen (sss, "r")) == NULL)
    {
      return;
    }
  for (;;)
    {
      word = feof (fpt) ? "End" : fread_word (fpt);
      fMatch = FALSE;
      switch (UPPER (word[0]))
	{
	case '*':
	  fMatch = TRUE;
	  fread_to_eol (fpt);
	  break;
	case 'A':
	  if (!str_cmp(word, "Act"))
	    {
	      ch->act = fread_number(fpt);
	      fMatch = TRUE;
	      if (IS_SET(ch->act, ACT_CRASHER))
		{
		  if(ch->desc)
		    SET_BIT(ch->desc->act, DESC_CRASHER);
		}
	    }
	  KEY ("Act2", ch->pcdata->act2, fread_number (fpt));
	  KEY ("Act3", ch->pcdata->act3, fread_number (fpt));
	  KEY ("AffBy", ch->affected_by, fread_number (fpt));
	  KEY ("AffTWO", ch->more_affected_by, fread_number (fpt));
	  if (!str_cmp(word, "Alignmt"))
	    {
	      ch->pcdata->alignment = fread_number(fpt);
	      if (ch->pcdata->alignment < 0) ch->pcdata->alignment = 1;
	      if (ch->pcdata->alignment >= NUM_ALIGN) ch->pcdata->alignment = 2;
	      fMatch = TRUE;
	    }
	  KEY ("Armor", ch->armor, fread_number (fpt));
	  if (!str_cmp (word, "Alias"))
	    {
	      char *msk;
	      for (k = 0; k < MAXALIAS; k++)
		{
		  if (!ch->pcdata->aliasname[k] ||
		      ch->pcdata->aliasname[k][0] == '\0' ||
		      !ch->pcdata->alias[k] ||
		      ch->pcdata->alias[k][0] == '\0')
		    {
		      break;
		    }
		}
	      ch->pcdata->aliasname[k] = str_dup (fread_word (fpt));
	      fread_word (fpt);
	      ch->pcdata->alias[k] = str_dup (fread_string2 (fpt, NULL));
	      for (msk = ch->pcdata->alias[k]; *msk != '\0'; msk++)
		if (*msk == '*')
		  *msk = '~';
	      fMatch = TRUE;
	    }
	  if (!str_cmp (word, "AffectData"))
	    {
	      AFFECT_DATA *paf;
	      if (affect_free == NULL)
		{
		  paf = mem_alloc (sizeof (*paf));
		}
	      else
		{
		  paf = affect_free;
		  affect_free = affect_free->next;
		}
	      if (!str_cmp (word, "Affect"))
		{
		  /* Obsolete 2.0 form. */
		  paf->type = fread_number (fpt);
		}
	      else
		{
		  int sn;
		  sn = lookup_gsn (fread_word (fpt));
		  if (sn < 0)
		    bug ("Fread_char: unknown skill.", 0);
		  else
		    paf->type = sn;
		}
	      paf->duration = fread_number (fpt);
	      paf->modifier = fread_number (fpt);
	      paf->location = fread_number (fpt);
	      paf->bitvector = fread_number (fpt);
	      paf->bitvector2 = fread_number (fpt);
	      paf->next = ch->affected;
	      ch->affected = paf;
	      fMatch = TRUE;
              /* ------------------------------ */
              /*         Restore affect         */
	      /* ------------------------------ */
	      if(paf->type == gsn_manashield)
                renew_affect(ch,paf);
	      else if (paf->type == gsn_fireshield)
                renew_affect(ch,paf);

	      break;
	    }
	  if (!str_cmp (word, "AttrMod"))
	    {
	      int i;
	      for (i = 0; i < NUM_STATS; i++)
		ch->pcdata->stat_mod[i] = fread_number(fpt);
	      fMatch = TRUE;
	      break;
	    }
	  if (!str_cmp (word, "AttrPerm"))
	    {
	      int i;
	      for (i = 0; i < NUM_STATS; i++)
		ch->pcdata->stat[i] = fread_number(fpt);
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'B':
	  if (!str_cmp (word, "Bank"))
	    {
	      ch->pcdata->bank = fread_number (fpt);
	      fMatch = TRUE;
	    }
	  SKEY ("Bamfin", ch->pcdata->beamin, fread_string2 (fpt, NULL));
	  SKEY ("Bamfout", ch->pcdata->beamout, fread_string2 (fpt, NULL));
	
	  break;
	case 'C':
	  KEY ("Clan", ch->pcdata->clan, fread_number(fpt));
	   KEY ("Clan2", ch->pcdata->clan2, fread_number(fpt));
	  
	    
	  KEY ("Class", dummy, fread_number (fpt));
	  KEY ("Created", ch->pcdata->created, fread_number(fpt));
	  if (!str_cmp (word, "Condition"))
	    {
	      ch->pcdata->condition[0] = fread_number (fpt);
	      ch->pcdata->condition[1] = fread_number (fpt);
	      ch->pcdata->condition[2] = fread_number (fpt);
	      fMatch = TRUE;
	      break;
	    }
	  if (!str_cmp (word, "Colors"))
	    {
	      ch->pcdata->colors[0] = fread_number (fpt);
	      ch->pcdata->colors[1] = fread_number (fpt);
	      ch->pcdata->colors[2] = fread_number (fpt);
	      ch->pcdata->colors[3] = fread_number (fpt);
	      ch->pcdata->colors[4] = fread_number (fpt);
	      ch->pcdata->colors[5] = fread_number (fpt);
	      ch->pcdata->colors[6] = fread_number (fpt);
	      ch->pcdata->colors[7] = fread_number (fpt);
	      ch->pcdata->colors[8] = fread_number (fpt);
	      ch->pcdata->colors[9] = fread_number (fpt);
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'D':
	  KEY ("Damrl", ch->damroll, fread_number (fpt));
	  KEY ("Deaths", ch->pcdata->deaths, fread_number (fpt));
	  KEY ("DPray", ch->pcdata->pray_points, fread_number (fpt));
	  if (!str_cmp (word, "DCoins"))
	    {
	      int cns;
	      ch->gold = 0;
	      ch->copper = 0;
	      cns = fread_number (fpt);
	      ch->gold = cns * 100;
	      cns = fread_number (fpt);
	      ch->gold += (cns * 10);
	      ch->gold += fread_number (fpt);
	      cns = fread_number (fpt);
	      ch->copper = cns * 10;
	      ch->copper += fread_number (fpt);
	      fMatch = TRUE;
	    }
	  KEY ("Deaf", ch->pcdata->deaf, fread_number (fpt));
	  SKEY ("Descr", ch->pcdata->description, fread_string2 (fpt, NULL));
	  break;
	case 'E':
	  KEY ("Elemental", ch->pcdata->elemental_alignment, fread_number (fpt));
	  if (!str_cmp (word, "End"))
	    {
	      if (ch->pcdata->level > MAX_LEVEL)
		ch->pcdata->level = MAX_LEVEL;
	      return;
	    }
	  KEY ("EFight", ch->ced->fight_ops, fread_number (fpt));
	  KEY ("Exp", ch->exp, fread_number (fpt));
	  break;
	case 'F':
	  if (!str_cmp(word, "Faction"))
	    {
	      for (i = 0; i < MAX_MOB_TYPE; i++)
		ch->pcdata->faction[i] = fread_number(fpt);
	      fMatch = TRUE;
	    }
	  break;
	case 'G':
	  if (!str_cmp (word, "Gold"))
	    {
	      fread_to_eol (fpt);
	      fMatch = TRUE;
	    }
	  break;
	case 'H':
	  KEY ("Hitrl", ch->hitroll, fread_number (fpt));
	  if (!str_cmp (word, "HpMove"))
	    {
	      ch->hit = fread_number (fpt);
	      ch->max_hit = fread_number (fpt);
	      ch->move = fread_number (fpt);
	      ch->max_move = fread_number (fpt);
	      fMatch = TRUE;
	      break;
	    }
	  KEY ("Hardpk", ch->pcdata->hard_pkills, fread_number (fpt));
	  break;
	case 'I':
	  if (!str_cmp (word, "Ignore"))
	    {
	      for (i = 0; i < MAX_IGNORE; i++)
		{
		  if (!ch->pcdata->ignore[i])
		    break;
		}
	      ch->pcdata->ignore[i] = str_dup (fread_word (fpt));
	      fMatch = TRUE;
	    }
	case 'K':
	  KEY ("Killpt", ch->pcdata->killpoints, fread_number (fpt));
	  break;
	case 'L':
	 
	  KEY ("Level", ch->pcdata->level, fread_number (fpt));
	  KEY ("Learn", ch->pcdata->learn, fread_number (fpt));
	  SKEY ("LoDesc", ch->pcdata->long_descr, fread_string2 (fpt, NULL));
	  if (!str_cmp (word, "LCcol"))
	    {
	      int tt;
	      tt = fread_number (fpt);
	      strcpy (ch->pcdata->chan_color[tt], fread_word (fpt));
	      fMatch = TRUE;
	    }
	  KEY ("LCign", ch->pcdata->chan_ignore, fread_number (fpt));


	  if (!str_cmp (word, "LTro"))
	    {
	      for (i = 0; i < MAX_TROPHY; i++)
		{
		  if (ch->pcdata->trophy_level[i] == 0)
		    break;
		}
	      ch->pcdata->trophy_level[i] = fread_number (fpt);
	      fMatch = TRUE;
	    }
	  break;
        case 'M':
	  KEY ("ManaShield", ch->pcdata->mana_shield_strength, fread_number (fpt));
	  break;
	case 'N':
	  KEY ("NAn", ch->pcdata->show_lev, fread_number (fpt));
	  KEY ("NPR", dummy, fread_number (fpt));
	  KEY ("NHeight", ch->height, fread_number (fpt));
	  KEY ("Nospam", ch->pcdata->no_spam, fread_number (fpt));
	  KEY ("NDon", ch->pcdata->donated, fread_number (fpt));
	  KEY ("Nexp", ch->pcdata->new_exp, fread_number (fpt));
	  KEY ("NQuest", ch->pcdata->questflag, fread_number (fpt));
	  KEY ("NatArm", ch->pcdata->nat_armor, fread_number (fpt));
	  KEY ("NatAbil", ch->pcdata->nat_abilities, fread_number (fpt));
	  KEY ("NatAbilT", ch->pcdata->nat_abilities2, fread_number (fpt));
/*	  KEY ("NWasrm", ch->ced->wasroom, fread_number (fpt)); */
	  KEY ("NChal", ch->fgt->challenge, fread_number (fpt));
	  KEY ("NChon", ch->pcdata->challenge_on, fread_number (fpt));
	  KEY ("NRemort", ch->pcdata->remort_times, fread_number (fpt));
	  KEY ("NAMsg", ch->pcdata->arena_msg, fread_number (fpt));
	  KEY ("NWPS", ch->pcdata->warpoints, fread_number (fpt));
	  KEY ("NMana", ch->pcdata->n_mana, fread_number (fpt));
	  KEY ("NGldBt", ch->pcdata->guilds, fread_number (fpt));
	 
	  if (!str_cmp (word, "NTro"))
	    {
	      for (i = 0; i < MAX_TROPHY; i++)
		{
		  if (ch->pcdata->trophy_name[i][0] == '\0')
		    break;
		}
	      strcpy (ch->pcdata->trophy_name[i], fread_word (fpt));
	      fMatch = TRUE;
	    }
	  if (!str_cmp (word, "NEmail"))
	    {
	      strcpy (ch->pcdata->email, fread_string2 (fpt, NULL));
	      fMatch = TRUE;
	    }
	  if (!str_cmp (word, "Name"))
	    {
	      /*
	         * Name already set externally.
	       */
	      fread_to_eol (fpt);
	      fMatch = TRUE;
	      break;
	    }
	  KEY ("Note", ch->pcdata->last_note, fread_number (fpt));
	  break;
	case 'P':
	  SKEY ("Promptr", ch->pcdata->rprompt, fread_string2 (fpt, NULL));
	  SKEY ("Password", ch->pcdata->pwd, fread_string2 (fpt, NULL));
         
	  KEY ("Played", ch->pcdata->played, fread_number (fpt));
	  KEY ("Pagelen", ch->pcdata->pagelen, fread_number (fpt));
	  KEY ("PImplO", ch->pcdata->augments, fread_number (fpt));
	  KEY ("Positn", ch->position, fread_number (fpt));
	  KEY ("Practc", ch->pcdata->practice, fread_number (fpt));
	  KEY ("Pklevs", ch->pcdata->pklevels, fread_number (fpt));
	  KEY ("Pkhelp", ch->pcdata->pkhelpers, fread_number (fpt));
	  KEY ("Pkills", ch->pcdata->pkills, fread_number (fpt));
	  KEY ("Pkilled", ch->pcdata->pkilled, fread_number (fpt));
	  KEY ("Pkers", ch->pcdata->pkers, fread_number (fpt));
	  break;
	  if (ch->position == POSITION_FIGHTING)
	    NEW_POSITION(ch, POSITION_STANDING);
	  break;
	case 'R':
	  if (!str_cmp (word, "Race"))
	    {
	      ch->pcdata->race = fread_number (fpt);
	      fMatch = TRUE;
	    }
	  SKEY ("RealPassword", ch->pcdata->rpwd, fread_string2 (fpt,NULL));
	  if (!str_cmp (word, "Room"))
	    {
	      ch->in_room = NULL;
	      ch->pcdata->temp_room = get_room_index (fread_number (fpt));
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'S':
	  KEY ("SvngTh", ch->pcdata->saving_throw, fread_number (fpt));
	  KEY ("Sex", ch->pcdata->sex, fread_number (fpt));
	  SKEY ("ShDesc", ch->pcdata->short_descr, fread_string2 (fpt, NULL));
	  KEY ("SCool", ch->pcdata->cool_skills, fread_number (fpt));
	  KEY ("Secrty", ch->pcdata->security, fread_number (fpt));
	  KEY ("Stance", ch->pcdata->stance, fread_number (fpt));
	  if (!str_cmp (word, "Skill"))
	    {
	      int sn;
	      int value;
	      value = fread_number (fpt);
	      sn = lookup_gsn (fread_word (fpt));
	      if (sn > 0)
		ch->pcdata->learned[sn] = value;
	      fMatch = TRUE;
	    }
	  break;
	case 'T':
	  if (!str_cmp (word, "TTro"))
	    {
	      for (i = 0; i < MAX_TROPHY; i++)
		{
		  if (ch->pcdata->trophy_times[i] == 0)
		    break;
		}
	      ch->pcdata->trophy_times[i] = fread_number (fpt);
	      fMatch = TRUE;
	    }
	  KEY ("TtlKils", ch->pcdata->totalkills, fread_number (fpt));
	  if (!str_cmp (word, "Title"))
	    {
	      ch->pcdata->title = str_dup (fread_string2 (fpt, NULL));
	      fMatch = TRUE;
	      break;
	    }
	  KEY ("TotWps", ch->pcdata->total_wps, fread_number(fpt));
	  break;
	case 'V':
	  if (!str_cmp (word, "Vnum"))
	    {
	      ch->pIndexData = get_mob_index (fread_number (fpt));
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'W':
	  KEY ("Winv", ch->pcdata->wizinvis, fread_number (fpt));
	  KEY ("Wimpy", ch->ced->wimpy, fread_number (fpt));
	  KEY ("Warmth", ch->pcdata->warmth, fread_number (fpt));
	  break;
	}
      if (!fMatch)
	{
	  sprintf(bufh, "Character Data Load Complete. Loading Player.", NAME(ch), word);
	  bug (bufh, 0);
	  if (!feof (fpt))
	    fread_to_eol (fpt);
	}
    }
  if (ch->pcdata->temp_room == NULL)
    ch->pcdata->temp_room = get_room_index(ch->pcdata->alignment +100);

  fclose (fpt);
  return;
}




void 
fread_char (CHAR_DATA * ch, FILE * fp)
{
  char *word;
  bool fMatch;
  long nRat;
  int i;
  int dummy;
  int lnn;
 
  char bufh[100]; 
  int csf = 0;
  nRat = 0;
  lnn = 0;
  check_ced (ch);
  check_fgt (ch);
  for (;;)
    {
      lnn++;
      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, "APet"))
	    {
	      int kl;
	      for (kl = 0; kl < 20; kl++)
		{
		  if (ch->pcdata->pet_temp[kl] == 0)
		    {
		      ch->pcdata->pet_temp[kl] = fread_number (fp);
		      ch->pcdata->pet_hps[kl] = fread_number (fp);
		      ch->pcdata->pet_move[kl] = fread_number (fp);
		      break;
		    }
		}
	      fMatch = TRUE;
	    }
	  if (!str_cmp (word, "Act") )
	    {
	      ch->act = fread_number(fp);
	      fMatch = TRUE;
	      if (IS_SET(ch->act, ACT_CRASHER))
		{
		  if (ch->desc)
		    SET_BIT(ch->desc->act, DESC_CRASHER);
		}
	    }
	  KEY ("Act2", ch->pcdata->act2, fread_number (fp));
	  KEY ("Act3", ch->pcdata->act3, fread_number (fp));
	  KEY ("AffBy", ch->affected_by, fread_number (fp));
	  KEY ("AffTWO", ch->more_affected_by, fread_number (fp));
	  if (!str_cmp(word, "Alignmt"))
	    {
	      ch->pcdata->alignment = fread_number(fp);
	      if (ch->pcdata->alignment < 0) ch->pcdata->alignment = 1;
	      if (ch->pcdata->alignment >= NUM_ALIGN) ch->pcdata->alignment = 2;
              fMatch = TRUE;
	    }
	  KEY ("Armor", ch->armor, fread_number (fp));
	  if (!str_cmp (word, "Alias"))
	    {
	      int k;
	      char *msk;
	      for (k = 0; k < MAXALIAS; k++)
		{
		  if (!ch->pcdata->aliasname[k] ||
		      ch->pcdata->aliasname[k][0] == '\0' ||
		      !ch->pcdata->alias[k] ||
		      ch->pcdata->alias[k][0] == '\0')
		    {
		      break;
		    }
		}
	      ch->pcdata->aliasname[k] = str_dup (fread_word (fp));
	      fread_word (fp);
	      ch->pcdata->alias[k] = str_dup (fread_string2 (fp, NULL));
	      for (msk = ch->pcdata->alias[k]; *msk != '\0'; msk++)
		if (*msk == '*')
		  *msk = '~';
	      fMatch = TRUE;
	    }
	  if (!str_cmp (word, "AffectData"))
	    {
	      AFFECT_DATA *paf;
	      if (affect_free == NULL)
		{
		  paf = mem_alloc (sizeof (*paf));
		}
	      else
		{
		  paf = affect_free;
		  affect_free = affect_free->next;
		}
	      if (!str_cmp (word, "Affect"))
		{
		  paf->type = fread_number (fp);
		}
	      else
		{
		  int sn;
		  sn = lookup_gsn (fread_word (fp));
		  if (sn < 0)
		    bug ("Fread_char: unknown skill.", 0);
		  else
		    paf->type = sn;
		}
	      paf->duration = fread_number (fp);
	      paf->modifier = fread_number (fp);
	      paf->location = fread_number (fp);
	      paf->bitvector = fread_number (fp);
              paf->bitvector2 = fread_number (fp);
	      paf->next = ch->affected;
	      ch->affected = paf;
	      fMatch = TRUE;
              /* ------------------------------ */
              /*         Restore affect         */
	      /* ------------------------------ */
	      if(paf->type == gsn_manashield)
                renew_affect(ch,paf);
	      else if (paf->type == gsn_fireshield)
                renew_affect(ch,paf);

	      break;
	    }
	  if (!str_cmp (word, "AttrMod"))
	    {
	      int i;
	      for (i = 0; i < NUM_STATS; i++)
		ch->pcdata->stat_mod[i] = fread_number(fp);
	      fMatch = TRUE;
	      break;
	    }
	  if (!str_cmp (word, "AttrPerm"))
	    {
	      int i;
	      for (i = 0; i < NUM_STATS; i++)
		ch->pcdata->stat[i] = fread_number(fp);
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'B':
	  if (!str_cmp (word, "Bank"))
	    {
	      ch->pcdata->bank = fread_number (fp);
	      fMatch = TRUE;
	    }
	  SKEY ("Bamfin", ch->pcdata->beamin, fread_string2 (fp, NULL));
	  SKEY ("Bamfout", ch->pcdata->beamout, fread_string2 (fp, NULL));
	
	  break;
	case 'C':
	  KEY ("Class", dummy, fread_number (fp));
	  KEY ("Created", ch->pcdata->created, fread_number(fp));
	  KEY ("Clan", ch->pcdata->clan, fread_number(fp));
	   KEY ("Clan2", ch->pcdata->clan2, fread_number(fp));
	  
	  if (!str_cmp (word, "Condition"))
	    {
	      ch->pcdata->condition[0] = fread_number (fp);
	      ch->pcdata->condition[1] = fread_number (fp);
	      ch->pcdata->condition[2] = fread_number (fp);
	      fMatch = TRUE;
	      break;
	    }
	  if (!str_cmp (word, "Colors"))
	    {
	      ch->pcdata->colors[0] = fread_number (fp);
	      ch->pcdata->colors[1] = fread_number (fp);
	      ch->pcdata->colors[2] = fread_number (fp);
	      ch->pcdata->colors[3] = fread_number (fp);
	      ch->pcdata->colors[4] = fread_number (fp);
	      ch->pcdata->colors[5] = fread_number (fp);
	      ch->pcdata->colors[6] = fread_number (fp);
	      ch->pcdata->colors[7] = fread_number (fp);
	      ch->pcdata->colors[8] = fread_number (fp);
	      ch->pcdata->colors[9] = fread_number (fp);
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'D':
	  KEY ("Damrl", ch->damroll, fread_number (fp));
	  KEY ("Deaths", ch->pcdata->deaths, fread_number (fp));
	  KEY ("DPray", ch->pcdata->pray_points, fread_number (fp));
	  if (!str_cmp (word, "DCoins"))
	    {
	      int cns;
	      ch->gold = 0;
	      ch->copper = 0;
	      cns = fread_number (fp);
	      ch->gold = cns * 100;
	      cns = fread_number (fp);
	      ch->gold += (cns * 10);
	      ch->gold += fread_number (fp);
	      cns = fread_number (fp);
	      ch->copper = cns * 10;
	      ch->copper += fread_number (fp);
	      fMatch = TRUE;
	    }
	  KEY ("Deaf", ch->pcdata->deaf, fread_number (fp));
	  SKEY ("Descr", ch->pcdata->description, fread_string2 (fp, NULL));
	  break;
	case 'E':
	  KEY ("Elemental", ch->pcdata->elemental_alignment, fread_number (fp));

	  if (!str_cmp (word, "End"))
	      return;
	  KEY ("EFight", ch->ced->fight_ops, fread_number (fp));
	  KEY ("Exp", ch->exp, fread_number (fp));
	  break;
	 case 'F':
	   if (!str_cmp(word, "Faction"))
	     {
	       for (i = 0; i < MAX_MOB_TYPE; i++)
		 ch->pcdata->faction[i] = fread_number(fp);
	       fMatch = TRUE;
	     }
	   break; 
	case 'G':
	  if (!str_cmp (word, "Gold"))
	    {
	      fread_to_eol (fp);
	      fMatch = TRUE;
	    }
	  break;
	case 'H':
	  KEY ("Hitrl", ch->hitroll, fread_number (fp));
	  if (!str_cmp (word, "HpMove"))
	    {
	      ch->hit = fread_number (fp);
	      ch->max_hit = fread_number (fp);
	      ch->move = fread_number (fp);
	      ch->max_move = fread_number (fp);
	      fMatch = TRUE;
	      break;
	    }
	  KEY ("Hardpk", ch->pcdata->hard_pkills, fread_number (fp));
	  break;
	case 'I':
	  if (!str_cmp (word, "Ignore"))
	    {
	      for (i = 0; i < MAX_IGNORE; i++)
		{
		  if (!ch->pcdata->ignore[i])
		    break;
		}
	      ch->pcdata->ignore[i] = str_dup (fread_word (fp));
	      fMatch = TRUE;
	    }
	case 'K':
	  KEY ("Killpt", ch->pcdata->killpoints, fread_number (fp));
	  break;
	case 'L':
	 
	  KEY ("Level", ch->pcdata->level, fread_number (fp));
	  KEY ("Learn", ch->pcdata->learn, fread_number (fp));
	  SKEY ("LoDesc", ch->pcdata->long_descr, fread_string2 (fp, NULL));
	  if (!str_cmp (word, "LCcol"))
	    {
	      int tt;
	      tt = fread_number (fp);
	      strcpy (ch->pcdata->chan_color[tt], fread_word (fp));
	      fMatch = TRUE;
	    }
	  KEY ("LCign", ch->pcdata->chan_ignore, fread_number (fp));



	  if (!str_cmp (word, "LTro"))
	    {
	      for (i = 0; i < MAX_TROPHY; i++)
		{
		  if (ch->pcdata->trophy_level[i] == 0)
		    break;
		}
	      ch->pcdata->trophy_level[i] = fread_number (fp);
	      fMatch = TRUE;
	    }
	  break;
        case 'M':
	  KEY ("ManaShield", ch->pcdata->mana_shield_strength, fread_number (fp));
	  break;
	case 'N':
	
	  KEY ("NAn", ch->pcdata->show_lev, fread_number (fp));
	  KEY ("NPR", dummy, fread_number (fp));
	  KEY ("Nospam", ch->pcdata->no_spam, fread_number (fp));
	  KEY ("NHeight", ch->height, fread_number (fp));
	  KEY ("NDon", ch->pcdata->donated, fread_number (fp));
	  KEY ("Nexp", ch->pcdata->new_exp, fread_number (fp));
	  KEY ("NQuest", ch->pcdata->questflag, fread_number (fp));
	  KEY ("NRat", nRat, fread_number (fp));
	  KEY ("NatArm", ch->pcdata->nat_armor, fread_number (fp));
	  KEY ("NatAbil", ch->pcdata->nat_abilities, fread_number (fp));
	  KEY ("NatAbilT", ch->pcdata->nat_abilities2, fread_number (fp));
/*	  KEY ("NWasrm", ch->ced->wasroom, fread_number (fp)); */
	  KEY ("NChal", ch->fgt->challenge, fread_number (fp));
	  KEY ("NChon", ch->pcdata->challenge_on, fread_number (fp));
	  KEY ("NRemort", ch->pcdata->remort_times, fread_number (fp));
	  KEY ("NAMsg", ch->pcdata->arena_msg, fread_number (fp));
	  KEY ("NWPS", ch->pcdata->warpoints, fread_number (fp));
	  KEY ("NMana", ch->pcdata->n_mana, fread_number (fp));
	  KEY ("NGldBt", ch->pcdata->guilds, fread_number (fp));
	
	  if (!str_cmp (word, "NTro"))
	    {
	      for (i = 0; i < MAX_TROPHY; i++)
		{
		  if (ch->pcdata->trophy_name[i][0] == '\0')
		    break;
		}
	      strcpy (ch->pcdata->trophy_name[i], fread_word (fp));
	      fMatch = TRUE;
	    }
	  if (!str_cmp (word, "NEmail"))
	    {
	      strcpy (ch->pcdata->email, fread_string2 (fp, NULL));
	      fMatch = TRUE;
	    }
	  if (!str_cmp (word, "Name"))
	    {
	      /*
	         * Name already set externally.
	       */
	      fread_to_eol (fp);
	      fMatch = TRUE;
	      break;
	    }
	  KEY ("Note", ch->pcdata->last_note, fread_number (fp));
	  break;
	case 'P':
	  SKEY ("Promptr", ch->pcdata->rprompt, fread_string2 (fp, NULL));
	  SKEY ("Password", ch->pcdata->pwd, fread_string2 (fp, NULL));
	  KEY ("Played", ch->pcdata->played, fread_number (fp));
	  KEY ("Pagelen", ch->pcdata->pagelen, fread_number (fp));
	  KEY ("PImplO", ch->pcdata->augments, fread_number (fp));
	  KEY ("Positn", ch->position, fread_number (fp));
	  KEY ("Practc", ch->pcdata->practice, fread_number (fp));
	  KEY ("Pklevs", ch->pcdata->pklevels, fread_number (fp));
	  KEY ("Pkhelp", ch->pcdata->pkhelpers, fread_number (fp));
	  KEY ("Pkills", ch->pcdata->pkills, fread_number (fp));
	  KEY ("Pkilled", ch->pcdata->pkilled, fread_number (fp));
	  KEY ("Pkers", ch->pcdata->pkers, fread_number (fp));
	  break;
	case 'R':
	  if (!str_cmp (word, "Race"))
	    {
	      ch->pcdata->race = fread_number (fp);
	      fMatch = TRUE;
	    }
	  SKEY ("RealPassword", ch->pcdata->rpwd, fread_string2 (fp,NULL));
	  if (!str_cmp (word, "Room"))
	    {
	      ch->pcdata->temp_room = get_room_index (fread_number (fp));
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'S':
	  KEY ("SvngTh", ch->pcdata->saving_throw, fread_number (fp));
	  KEY ("Sex", ch->pcdata->sex, fread_number (fp));
	  SKEY ("ShDesc", ch->pcdata->short_descr, fread_string2 (fp, NULL));
	  KEY ("SCool", ch->pcdata->cool_skills, fread_number (fp));
	  KEY ("Secrty", ch->pcdata->security, fread_number (fp));
	  KEY ("Stance", ch->pcdata->stance, fread_number (fp));
	  if (!str_cmp (word, "Sf"))
	    {
	      ch->pcdata->script_flags[csf] = str_dup (fread_string2 (fp, NULL));
	      csf++;
	      fMatch = TRUE;
	    }

	  if (!str_cmp (word, "Skill"))
	    {
	      int sn;
	      int value;
	      value = fread_number (fp);
	      sn = lookup_gsn (fread_word (fp));
	      if (sn >= 0)
		ch->pcdata->learned[sn] = value;
	      fMatch = TRUE;
	    }
	  if (!str_cmp (word, "StartAttr"))
	    {
	      int i;
	      for (i = 0; i < NUM_STATS; i++)
		ch->pcdata->start_stat[i] = fread_number(fp);
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'T':
	  if (!str_cmp (word, "TTro"))
	    {
	      for (i = 0; i < MAX_TROPHY; i++)
		{
		  if (ch->pcdata->trophy_times[i] == 0)
		    break;
		}
	      ch->pcdata->trophy_times[i] = fread_number (fp);
	      fMatch = TRUE;
	    }
	  KEY ("TtlKils", ch->pcdata->totalkills, fread_number (fp));
	  if (!str_cmp (word, "Title"))
	    {
	      ch->pcdata->title = str_dup (fread_string2 (fp, NULL));
	      fMatch = TRUE;
	      break;
	    }
	  KEY ("TotWps", ch->pcdata->total_wps, fread_number (fp));
	  break;
	case 'V':
	  if (!str_cmp (word, "Vnum"))
	    {
	      ch->pIndexData = get_mob_index (fread_number (fp));
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'W':
	  KEY ("Winv", ch->pcdata->wizinvis, fread_number (fp));
	  KEY ("Wimpy", ch->ced->wimpy, fread_number (fp));
	  KEY ("Warmth", ch->pcdata->warmth, fread_number (fp));  
	  break;
	}
      if (!fMatch)
	{
	  sprintf(bufh, "Character Load Successful! Loading characters current state.", NAME(ch), word);
	  bug(bufh, 0);
	  if (!feof (fp))
	    fread_to_eol (fp);
	}
    }
  return;
}

int 
free_clan_storage (CLAN_DATA * clan)
{
  int k;
  for (k = 0; k < MAX_CLAN_STORAGE; k++)
    {
      if (clan->storage[k] == NULL)
	return k;
    }
  return -1;
}

int 
free_storage (CHAR_DATA * ch)
{
  int k;
  if (IS_MOB (ch))
    {
      fprintf (stderr, "FREE STORAGE ERROR CALLED BY NPC!\n");
      exit (1);
    }
  for (k = 0; k < MAXST; k++)
    {
      if (ch->pcdata->storage[k] == NULL)
	return k;
    }
  return -1;
}


void 
fread_obj (CHAR_DATA * ch, FILE * fp, int storage)
{
  SINGLE_OBJECT *obj;
  char *word;
  int iNest;
  bool fMatch;
  bool fNest;
  bool fVnum;
  obj = new_obj ();

  obj->short_descr = NULL;
  obj->description = NULL;
  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, "AOVN"))
	    {
	      int vnum;
	      int value[10];
	      OBJ_PROTOTYPE *pObjIndex;
	      vnum = fread_number (fp);
	      if ((obj->pIndexData = get_obj_index (vnum)) == NULL)
		obj->pIndexData = get_obj_index (37);
	      fVnum = TRUE;
	      pObjIndex = obj->pIndexData;
	      obj->extra_flags = pObjIndex->extra_flags;
	      obj->timer = pObjIndex->timer;
	      if (pObjIndex->cost != 0)
		obj->cost = pObjIndex->cost;
	      if (pObjIndex->cost != 0 && obj->cost == 0)
		obj->cost = 1;
	      value[0] = fread_number (fp);
	      value[1] = fread_number (fp);
	      value[2] = fread_number (fp);
	      value[3] = fread_number (fp);
	      value[4] = fread_number (fp);
	      value[5] = fread_number (fp);
	      value[6] = fread_number (fp);
	      value[7] = fread_number (fp);
	      value[8] = fread_number (fp);
	      value[9] = fread_number (fp);
	      obj->wear_loc = fread_number (fp);
	      obj->size = fread_number (fp);
	      obj->timer = fread_number (fp);
	      allocate_correct_datatype (obj, value);
	      fMatch = TRUE;
	      if (obj->wear_loc == WEAR_HOLD_1)
		ch->hold1 = obj;
	      if (obj->wear_loc == WEAR_HOLD_2)
		ch->hold2 = obj;
	      if (ch != NULL && IS_PLAYER(ch))
		{
		  if (obj->wear_loc == WEAR_FEET)
		    SET_BIT(ch->act, PLR_HAS_SHOES);
		  if (obj->wear_loc == WEAR_SHIELD)
		    SET_BIT(ch->act, PLR_HAS_SHIELD);
		  if (obj->pIndexData->item_type == ITEM_VEHICLE)
		    {
		      I_VEHICLE *veh = (I_VEHICLE *) obj->more;
		      if (veh->sector_use == SECT_SNOW && obj->wear_loc > WEAR_NONE)
			SET_BIT(ch->act, PLR_HAS_SNOWSHOES);
		      if (veh->sector_use == SECT_UNDERWATER && obj->wear_loc > WEAR_NONE)
			SET_BIT(ch->act, PLR_HAS_SCUBA);
		      if (veh->sector_use == SECT_MOUNTAIN && obj->wear_loc > WEAR_NONE) 
			SET_BIT(ch->act, PLR_HAS_MTN_BOOTS);
		    }  
		  if (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT(obj) && obj->wear_loc > WEAR_NONE)
		    ch->pcdata->light++;
		  if(IS_OBJ_STAT(obj, ITEM_COMMANDSCRIPT))
		    ch->pcdata->command_objs++;
		}
	    }
	  
	  if (!str_cmp( word, "AffectData" ))
	    {
	      AFFECT_DATA *paf;
	      if ( affect_free == NULL )
		{
		  paf = mem_alloc( sizeof(*paf) );
		}
	      else
		{
		  paf = affect_free;
		  affect_free = affect_free->next;
		}
	      paf->duration = fread_number( fp );
	      paf->modifier = fread_number( fp );
	      paf->location = fread_number( fp );
	      paf->bitvector = fread_number( fp );
	      paf->bitvector2 = fread_number(fp);
	      paf->next = obj->affected;
	      obj->affected = paf;
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'C':
	  KEY ("Cost", obj->cost, fread_number (fp));
	  break;
	case 'D':
	  SKEY ("Description", obj->description, fread_string2 (fp, ch));
	  break;
	case 'E':
	  KEY ("ExtraFlags", obj->extra_flags, fread_number (fp));
	  if (!str_cmp (word, "End"))
	    {
	      if (!fNest || !fVnum)
		{
		  bug ("Fread_obj: incomplete object.", 0);
		  if (obj->description)
		    free_string (obj->description);
		  if (obj->short_descr)
		    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 (storage > 1)
		    {
		      CLAN_DATA *clan;
		      if ((clan = get_clan_index (storage - 1)) == NULL)
			{
			  fprintf (stderr, "Bummer. Bad clan attached to storage file.\n");
			  return;
			}
		      clan->storage[free_clan_storage (clan)] = obj;
		    }
		  else if (storage == 1)
		    {
		      ch->pcdata->storage[free_storage (ch)] = obj;
		    }
		  else
		    {
		      got = FALSE;
		      if (iNest == 0 || rgObjNest[iNest] == NULL)
			obj_to (obj, ch);
		      else
			obj_to (obj, rgObjNest[iNest - 1]);
		      got = TRUE;
		    }
		  return;
		}
	    }
	  break;
	case 'N':
	  if (!str_cmp (word, "Nest"))
	    {
	      iNest = fread_number (fp);
	      if (iNest < 0 || iNest >= MAX_NESTING)
		{
		  bug ("Fread_obj: bad nest %d.", iNest);
		}
	      else
		{
		  rgObjNest[iNest] = obj;
		  fNest = TRUE;
		}
	      fMatch = TRUE;
	    }
	  break;
	case 'S':
	  if (!str_cmp (word, "ShortDescr"))
	    {
	      obj->short_descr = NULL;
	      fMatch = TRUE;
	    }
/*          if ( !str_cmp( word, "Spell" ) )
   {
   int iValue;
   int sn;
   iValue = fread_number( fp );
   sn = lookup_gsn( 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':
	  KEY ("Timer", obj->timer, fread_number (fp));
	  break;
	case 'V':
	  if (!str_cmp (word, "Vnum"))
	    {
	      int vnum;
	      vnum = fread_number (fp);
	      if ((obj->pIndexData = get_obj_index (vnum)) == NULL)
		obj->pIndexData = get_obj_index (1002);
	      fVnum = TRUE;
	      fMatch = TRUE;
	      break;
	    }
	  break;
	case 'W':
	  KEY ("WearLoc", obj->wear_loc, fread_number (fp));
	  break;
	}
      if (!fMatch)
	{
	  bug ("Fread_obj: no match.", 0);
	  fread_to_eol (fp);
	}
    }
}