rm6/
rm6/clans/
rm6/councils/
rm6/deity/
rm6/doc/mudprogs/
rm6/exchange/
rm6/gods/
rm6/homes/
rm6/nations/
rm6/player/
rm6/player/a/
rm6/src/RCS/
rm6/src/dmalloc/
rm6/src/dmalloc/bin/
rm6/src/dmalloc/include/
rm6/src/dmalloc/lib/
rm6/src/scripts/
rm6/src/utils/
/****************************************************************************
 * ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh,    *
 * Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith.             *
 * ------------------------------------------------------------------------ *
 * Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain,   *
 * Ohio.    ALL RIGHTS RESERVED    See /doc/RMLicense.txt for more details. *
 ****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "mud.h"
#include "axsmaug.h"

extern MOB_INDEX_DATA *mob_index_hash[];
extern OBJ_INDEX_DATA *obj_index_hash[];
extern ROOM_INDEX_DATA *room_index_hash[];
EXIT_DATA *pExit;
extern char * const ex_flags[];
extern char * const wear_locs[];
extern bool fBootDb;
extern int top_mob_index;
extern int top_obj_index;
extern int top_room;
extern int top_sn;
extern int top_herb;
extern int top_ed;
extern int top_affect;
extern int top_shop;
extern int top_repair;
extern int top_area;

int extmob[500],extobj[500],top_extmob,top_extobj,addmobrange,addobjrange;
int objnew[500],mobnew[500],newrange;
 
extern int 		mprog_name_to_type	args ( ( char* name ) );

struct sub_skill
{
	struct sub_skill *next;
	struct sub_skill *prev;
	char *from;
	char *to;
} *subskill,*firstsubskill,*lastsubskill;

struct sub_spell
{
	struct sub_spell *next;
	struct sub_spell *prev;
	char *from;
	char *to;
} *subspell,*firstsubspell,*lastsubspell;

struct sub_objflag
{
	struct sub_objflag *next;
	struct sub_objflag *prev;
	char *from;
	char *to;
} *subobjflag,*firstsubobjflag,*lastsubobjflag;

struct sub_mflag
{
	struct sub_mflag *next;
	struct sub_mflag *prev;
	char *from;
	char *to;
} *submobflag,*firstsubmobflag,*lastsubmobflag;

struct sub_aflag
{
	struct sub_aflag *next;
	struct sub_aflag *prev;
	char *from;
	char *to;
} *subareaflag,*firstsubareaflag,*lastsubareaflag;

struct sub_affected
{
	struct sub_affected *next;
	struct sub_affected *prev;
	char *from;
	char *to;
} *subaffected,*firstsubaffectedflag,*lastsubaffectedflag;

struct sub_mobrace
{
	struct sub_mobrace *next;
	struct sub_mobrace *prev;
	char *from;
	char *to;
} *submobrace,*firstsubmobrace,*lastsubmobrace;

struct sub_mobclass
{
	struct sub_mobclass *next;
	struct sub_mobclass *prev;
	char *from;
	char *to;
} *submobclass,*firstsubmobclass,*lastsubmobclass;

struct sub_moblang
{
	struct sub_moblang *next;
	struct sub_moblang *prev;
	char *from;
	char *to;
} *submoblang,*firstsubmoblang,*lastsubmoblang;

struct sub_mobpos
{
	struct sub_mobpos *next;
	struct sub_mobpos *prev;
	char *from;
	char *to;
} *submobpos,*firstsubmobpos,*lastsubmobpos;

struct sub_sector
{
	struct sub_sector *next;
	struct sub_sector *prev;
	char *from;
	char *to;
} *subsector,*firstsubsector,*lastsubsector;

struct sub_bodypart
{
	struct sub_bodypart *next;
	struct sub_bodypart *prev;
	char *from;
	char *to;
} *subbodypart,*firstsubbodypart,*lastsubbodypart;

struct sub_risflag
{
	struct sub_risflag *next;
	struct sub_risflag *prev;
	char *from;
	char *to;
} *subrisflag,*firstsubrisflag,*lastsubrisflag;

struct sub_attack
{
	struct sub_attack *next;
	struct sub_attack *prev;
	char *from;
	char *to;
} *subattack,*firstsubattack,*lastsubattack;

struct sub_defense
{
	struct sub_defense *next;
	struct sub_defense *prev;
	char *from;
	char *to;
} *subdefense,*firstsubdefense,*lastsubdefense;

struct sub_objtype
{
	struct sub_objtype *next;
	struct sub_objtype *prev;
	char *from;
	char *to;
} *subobjtype,*firstsubobjtype,*lastsubobjtype;

struct sub_wearflag
{
	struct sub_wearflag *next;
	struct sub_wearflag *prev;
	char *from;
	char *to;
} *subwearflag,*firstsubwearflag,*lastsubwearflag;
struct sub_contflag
{
	struct sub_contflag *next;
	struct sub_contflag *prev;
	char *from;
	char *to;
} *subcontflag,*firstsubcontflag,*lastsubcontflag;

struct sub_wearlayerflag
{
	struct sub_wearlayerflag *next;
	struct sub_wearlayerflag *prev;
	char *from;
	char *to;
} *subwearlayerflag,*firstsubwearlayerflag,*lastsubwearlayerflag;

struct sub_liquid
{
	struct sub_liquid *next;
	struct sub_liquid *prev;
	char *from;
	char *to;
} *subliquid,*firstsubliquid,*lastsubliquid;

struct sub_herb
{
	struct sub_herb *next;
	struct sub_herb *prev;
	char *from;
	char *to;
} *subherb,*firstsubherb,*lastsubherb;

struct sub_trigger
{
	struct sub_trigger *next;
	struct sub_trigger *prev;
	char *from;
	char *to;
} *subtrigger,*firstsubtrigger,*lastsubtrigger;

struct sub_traptype
{
	struct sub_traptype *next;
	struct sub_traptype *prev;
	char *from;
	char *to;
} *subtraptype,*firstsubtraptype,*lastsubtraptype;

struct sub_trapflag
{
	struct sub_trapflag *next;
	struct sub_trapflag *prev;
	char *from;
	char *to;
} *subtrapflag,*firstsubtrapflag,*lastsubtrapflag;

struct sub_weapontype
{
	struct sub_weapontype *next;
	struct sub_weapontype *prev;
	char *from;
	char *to;
} *subweapontype,*firstsubweapontype,*lastsubweapontype;

struct sub_objaffects
{
	struct sub_objaffects *next;
	struct sub_objaffects *prev;
	char *from;
	char *to;
} *subobjaffects,*firstsubobjaffects,*lastsubobjaffects;

struct sub_roomflag
{
	struct sub_roomflag *next;
	struct sub_roomflag *prev;
	char *from;
	char *to;
} *subroomflag,*firstsubroomflag,*lastsubroomflag;

struct sub_exitdir
{
	struct sub_exitdir *next;
	struct sub_exitdir *prev;
	char *from;
	char *to;
} *subexitdir,*firstsubexitdir,*lastsubexitdir;

struct sub_exitflag
{
	struct sub_exitflag *next;
	struct sub_exitflag *prev;
	char *from;
	char *to;
} *subexitflag,*firstsubexitflag,*lastsubexitflag;

struct sub_spec
{
	struct sub_spec *next;
	struct sub_spec *prev;
	char *from;
	char *to;
} *subspec,*firstsubspec,*lastsubspec;

struct sub_wearloc
{
	struct sub_wearloc *next;
	struct sub_wearloc *prev;
	char *from;
	char *to;
} *subwearloc,*firstsubwearloc,*lastsubwearloc;

struct sub_progtrig
{
	struct sub_progtrig *next;
	struct sub_progtrig *prev;
	char *from;
	char *to;
} *subprogtrig,*firstsubprogtrig,*lastsubprogtrig;
struct sub_progcomm
{
	struct sub_progcomm *next;
	struct sub_progcomm *prev;
	char *from;
	char *to;
} *subprogcomm,*firstsubprogcomm,*lastsubprogcomm;

/* externals ... or to be mades */
int	get_areaflag	args( ( char *flag ) );
int	get_actflag	args( ( char *flag ) );
int	get_npc_race	args( ( char *flag ) );
int	get_npc_class	args( ( char *flag ) );
int	get_risflag	args( ( char *flag ) );
int	get_langflag	args( ( char *flag ) );
int	get_partflag	args( ( char *flag ) );
int	get_attackflag	args( ( char *flag ) );
int	get_attackflag2	args( ( char *flag ) );
int	get_defenseflag	args( ( char *flag ) );
int	get_wflag	args( ( char *flag ) );
int	get_mflag	args( ( char *flag ) );
int	get_trigflag	args( ( char *flag ) );
int	get_trapflag	args( ( char *flag ) );
int	get_rflag	args( ( char *flag ) );
int	get_rflag2	args( ( char *flag ) );
int	get_exflag	args( ( char *flag ) );
int	get_wearloc	args( ( char *flag ) );
void mprog_read_programs( FILE *fp, MOB_INDEX_DATA *pMobIndex);
void oprog_read_programs( FILE *fp, OBJ_INDEX_DATA *pObjIndex);
void rprog_read_programs( FILE *fp, ROOM_INDEX_DATA *pRoomIndex);
void fix_exits(void);

/* the good stuff */


/*
 * Pick off one argument from a string and return the rest.
 * Understands quotes. do not mess with case.
 * as opposed to native one_argument which ignores case.
 */
char *One_Argument( char *argument, char *arg_first )
{
    char cEnd;
    sh_int count;

    count = 0;

    while ( isspace(*argument) )
	argument++;

    cEnd = ' ';
    if ( *argument == '\'' || *argument == '"' )
	cEnd = *argument++;

    while ( *argument != '\0' || ++count >= 255 )
    {
	if ( *argument == cEnd )
	{
	    argument++;
	    break;
	}
	*arg_first = (*argument);
	arg_first++;
	argument++;
    }
    *arg_first = '\0';

    while ( isspace(*argument) )
	argument++;

    return argument;
}

char * find_sub(void *sub, char *s)
{
	if(sub == subskill)
	{
		struct sub_skill *subit;
		for(subit = firstsubskill; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subspell)
	{
		struct sub_spell *subit;
		for(subit = firstsubspell; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subobjflag)
	{
		struct sub_objflag *subit;
		for(subit = firstsubobjflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == submobflag)
	{
		struct sub_mflag *subit;
		for(subit = firstsubmobflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subareaflag)
	{
		struct sub_aflag *subit;
		for(subit = firstsubareaflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subaffected)
	{
		struct sub_affected *subit;
		for(subit = firstsubaffectedflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == submobrace)
	{
		struct sub_mobrace *subit;
		for(subit = firstsubmobrace; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == submobclass)
	{
		struct sub_mobclass *subit;
		for(subit = firstsubmobclass; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == submoblang)
	{
		struct sub_moblang *subit;
		for(subit = firstsubmoblang; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == submobpos)
	{
		struct sub_mobpos *subit;
		for(subit = firstsubmobpos; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subsector)
	{
		struct sub_sector *subit;
		for(subit = firstsubsector; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subbodypart)
	{
		struct sub_bodypart *subit;
		for(subit = firstsubbodypart; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subrisflag)
	{
		struct sub_risflag *subit;
		for(subit = firstsubrisflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subattack)
	{
		struct sub_attack *subit;
		for(subit = firstsubattack; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subdefense)
	{
		struct sub_defense *subit;
		for(subit = firstsubdefense; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subobjtype)
	{
		struct sub_objtype *subit;
		for(subit = firstsubobjtype; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subwearflag)
	{
		struct sub_wearflag *subit;
		for(subit = firstsubwearflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subcontflag)
	{
		struct sub_contflag *subit;
		for(subit = firstsubcontflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subwearlayerflag)
	{
		struct sub_wearlayerflag *subit;
		for(subit = firstsubwearlayerflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subliquid)
	{
		struct sub_liquid *subit;
		for(subit = firstsubliquid; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subherb)
	{
		struct sub_herb *subit;
		for(subit = firstsubherb; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subtrigger)
	{
		struct sub_trigger *subit;
		for(subit = firstsubtrigger; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subtraptype)
	{
		struct sub_traptype *subit;
		for(subit = firstsubtraptype; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subtrapflag)
	{
		struct sub_trapflag *subit;
		for(subit = firstsubtrapflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subweapontype)
	{
		struct sub_weapontype *subit;
		for(subit = firstsubweapontype; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subobjaffects)
	{
		struct sub_objaffects *subit;
		for(subit = firstsubobjaffects; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subroomflag)
	{
		struct sub_roomflag *subit;
		for(subit = firstsubroomflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subexitdir)
	{
		struct sub_exitdir *subit;
		for(subit = firstsubexitdir; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subexitflag)
	{
		struct sub_exitflag *subit;
		for(subit = firstsubexitflag; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subspec)
	{
		struct sub_spec *subit;
		for(subit = firstsubspec; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subwearloc)
	{
		struct sub_wearloc *subit;
		for(subit = firstsubwearloc; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subprogtrig)
	{
		struct sub_progtrig *subit;
		for(subit = firstsubprogtrig; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	if(sub == subprogcomm)
	{
		struct sub_progcomm *subit;
		for(subit = firstsubprogcomm; subit; subit=subit->next)
		{
			if(!strcmp(subit->from,s))
			{
				return subit->to;
			}
		}
		return NULL;
	}
	bug("unknown sub array",0);
	return NULL;
}
void clean_subs(void)
{
	struct sub_skill *sub1;
	struct sub_spell *sub2;
	struct sub_objflag *sub3;
	struct sub_mflag *sub4;
	struct sub_aflag *sub5;
	struct sub_affected *sub6;
	struct sub_mobrace *sub7;
	struct sub_mobclass *sub8;
	struct sub_moblang *sub9;
	struct sub_mobpos *sub10;
	struct sub_sector *sub11;
	struct sub_bodypart *sub12;
	struct sub_risflag *sub13;
	struct sub_attack *sub14;
	struct sub_defense *sub15;
	struct sub_objtype *sub16;
	struct sub_wearflag *sub17;
	struct sub_contflag *sub18;
	struct sub_wearlayerflag *sub19;
	struct sub_liquid *sub20;
	struct sub_herb *sub21;
	struct sub_trigger *sub22;
	struct sub_traptype *sub23;
	struct sub_trapflag *sub24;
	struct sub_weapontype *sub25;
	struct sub_objaffects *sub26;
	struct sub_roomflag *sub27;
	struct sub_exitdir *sub28;
	struct sub_exitflag *sub29;
	struct sub_spec *sub30;
	struct sub_wearloc *sub31;
	struct sub_progtrig *sub32;
	struct sub_progcomm *sub33;

	for(sub1=firstsubskill;sub1;sub1=sub1->next)
	{
		STRFREE(sub1->to);
		STRFREE(sub1->from);
	}
	while((sub1=firstsubskill))
	{	
		UNLINK(sub1,firstsubskill,lastsubskill,next,prev);
		DISPOSE(sub1);
	}
	for(sub2=firstsubspell;sub2;sub2=sub2->next)
	{
		STRFREE(sub2->to);
		STRFREE(sub2->from);
	}
	while((sub2=firstsubspell))
	{	
		UNLINK(sub2,firstsubspell,lastsubspell,next,prev);
		DISPOSE(sub2);
	}
	for(sub3=firstsubobjflag;sub3;sub3=sub3->next)
	{
		STRFREE(sub3->to);
		STRFREE(sub3->from);
	}
	while((sub3=firstsubobjflag))
	{	
		UNLINK(sub3,firstsubobjflag,lastsubobjflag,next,prev);
		DISPOSE(sub3);
	}
	for(sub4=firstsubmobflag;sub4;sub4=sub4->next)
	{
		STRFREE(sub4->to);
		STRFREE(sub4->from);
	}
	while((sub4=firstsubmobflag))
	{	
		UNLINK(sub4,firstsubmobflag,lastsubmobflag,next,prev);
		DISPOSE(sub4);
	}
	for(sub5=firstsubareaflag;sub5;sub5=sub5->next)
	{
		STRFREE(sub5->to);
		STRFREE(sub5->from);
	}
	while((sub5=firstsubareaflag))
	{	
		UNLINK(sub5,firstsubareaflag,lastsubareaflag,next,prev);
		DISPOSE(sub5);
	}
	for(sub6=firstsubaffectedflag;sub6;sub6=sub6->next)
	{
		STRFREE(sub6->to);
		STRFREE(sub6->from);
	}
	while((sub6=firstsubaffectedflag))
	{	
		UNLINK(sub6,firstsubaffectedflag,lastsubaffectedflag,next,prev);
		DISPOSE(sub6);
	}
	for(sub7=firstsubmobrace;sub7;sub7=sub7->next)
	{
		STRFREE(sub7->to);
		STRFREE(sub7->from);
	}
	while((sub7=firstsubmobrace))
	{	
		UNLINK(sub7,firstsubmobrace,lastsubmobrace,next,prev);
		DISPOSE(sub7);
	}
	for(sub8=firstsubmobclass;sub8;sub8=sub8->next)
	{
		STRFREE(sub8->to);
		STRFREE(sub8->from);
	}
	while((sub8=firstsubmobclass))
	{	
		UNLINK(sub8,firstsubmobclass,lastsubmobclass,next,prev);
		DISPOSE(sub8);
	}
	for(sub9=firstsubmoblang;sub9;sub9=sub9->next)
	{
		STRFREE(sub9->to);
		STRFREE(sub9->from);
	}
	while((sub9=firstsubmoblang))
	{	
		UNLINK(sub9,firstsubmoblang,lastsubmoblang,next,prev);
		DISPOSE(sub9);
	}
	for(sub10=firstsubmobpos;sub10;sub10=sub10->next)
	{
		STRFREE(sub10->to);
		STRFREE(sub10->from);
	}
	while((sub10=firstsubmobpos))
	{	
		UNLINK(sub10,firstsubmobpos,lastsubmobpos,next,prev);
		DISPOSE(sub10);
	}
	for(sub11=firstsubsector;sub11;sub11=sub11->next)
	{
		STRFREE(sub11->to);
		STRFREE(sub11->from);
	}
	while((sub11=firstsubsector))
	{	
		UNLINK(sub11,firstsubsector,lastsubsector,next,prev);
		DISPOSE(sub11);
	}
	for(sub12=firstsubbodypart;sub12;sub12=sub12->next)
	{
		STRFREE(sub12->to);
		STRFREE(sub12->from);
	}
	while((sub12=firstsubbodypart))
	{	
		UNLINK(sub12,firstsubbodypart,lastsubbodypart,next,prev);
		DISPOSE(sub12);
	}
	for(sub13=firstsubrisflag;sub13;sub13=sub13->next)
	{
		STRFREE(sub13->to);
		STRFREE(sub13->from);
	}
	while((sub13=firstsubrisflag))
	{	
		UNLINK(sub13,firstsubrisflag,lastsubrisflag,next,prev);
		DISPOSE(sub13);
	}
	for(sub14=firstsubattack;sub14;sub14=sub14->next)
	{
		STRFREE(sub14->to);
		STRFREE(sub14->from);
	}
	while((sub14=firstsubattack))
	{	
		UNLINK(sub14,firstsubattack,lastsubattack,next,prev);
		DISPOSE(sub14);
	}
	for(sub15=firstsubdefense;sub15;sub15=sub15->next)
	{
		STRFREE(sub15->to);
		STRFREE(sub15->from);
	}
	while((sub15=firstsubdefense))
	{	
		UNLINK(sub15,firstsubdefense,lastsubdefense,next,prev);
		DISPOSE(sub15);
	}
	for(sub16=firstsubobjtype;sub16;sub16=sub16->next)
	{
		STRFREE(sub16->to);
		STRFREE(sub16->from);
	}
	while((sub16=firstsubobjtype))
	{	
		UNLINK(sub16,firstsubobjtype,lastsubobjtype,next,prev);
		DISPOSE(sub16);
	}
	for(sub17=firstsubwearflag;sub17;sub17=sub17->next)
	{
		STRFREE(sub17->to);
		STRFREE(sub17->from);
	}
	while((sub17=firstsubwearflag))
	{	
		UNLINK(sub17,firstsubwearflag,lastsubwearflag,next,prev);
		DISPOSE(sub17);
	}
	for(sub18=firstsubcontflag;sub18;sub18=sub18->next)
	{
		STRFREE(sub18->to);
		STRFREE(sub18->from);
	}
	while((sub18=firstsubcontflag))
	{	
		UNLINK(sub18,firstsubcontflag,lastsubcontflag,next,prev);
		DISPOSE(sub18);
	}
	for(sub19=firstsubwearlayerflag;sub19;sub19=sub19->next)
	{
		STRFREE(sub19->to);
		STRFREE(sub19->from);
	}
	while((sub19=firstsubwearlayerflag))
	{	
		UNLINK(sub19,firstsubwearlayerflag,lastsubwearlayerflag,next,prev);
		DISPOSE(sub19);
	}
	for(sub20=firstsubliquid;sub20;sub20=sub20->next)
	{
		STRFREE(sub20->to);
		STRFREE(sub20->from);
	}
	while((sub20=firstsubliquid))
	{	
		UNLINK(sub20,firstsubliquid,lastsubliquid,next,prev);
		DISPOSE(sub20);
	}
	for(sub21=firstsubherb;sub21;sub21=sub21->next)
	{
		STRFREE(sub21->to);
		STRFREE(sub21->from);
	}
	while((sub21=firstsubherb))
	{	
		UNLINK(sub21,firstsubherb,lastsubherb,next,prev);
		DISPOSE(sub21);
	}
	for(sub22=firstsubtrigger;sub22;sub22=sub22->next)
	{
		STRFREE(sub22->to);
		STRFREE(sub22->from);
	}
	while((sub22=firstsubtrigger))
	{	
		UNLINK(sub22,firstsubtrigger,lastsubtrigger,next,prev);
		DISPOSE(sub22);
	}
	for(sub23=firstsubtraptype;sub23;sub23=sub23->next)
	{
		STRFREE(sub23->to);
		STRFREE(sub23->from);
	}
	while((sub23=firstsubtraptype))
	{	
		UNLINK(sub23,firstsubtraptype,lastsubtraptype,next,prev);
		DISPOSE(sub23);
	}
	for(sub24=firstsubtrapflag;sub24;sub24=sub24->next)
	{
		STRFREE(sub24->to);
		STRFREE(sub24->from);
	}
	while((sub24=firstsubtrapflag))
	{	
		UNLINK(sub24,firstsubtrapflag,lastsubtrapflag,next,prev);
		DISPOSE(sub24);
	}
	for(sub25=firstsubweapontype;sub25;sub25=sub25->next)
	{
		STRFREE(sub25->to);
		STRFREE(sub25->from);
	}
	while((sub25=firstsubweapontype))
	{	
		UNLINK(sub25,firstsubweapontype,lastsubweapontype,next,prev);
		DISPOSE(sub25);
	}
	for(sub26=firstsubobjaffects;sub26;sub26=sub26->next)
	{
		STRFREE(sub26->to);
		STRFREE(sub26->from);
	}
	while((sub26=firstsubobjaffects))
	{	
		UNLINK(sub26,firstsubobjaffects,lastsubobjaffects,next,prev);
		DISPOSE(sub26);
	}
	for(sub27=firstsubroomflag;sub27;sub27=sub27->next)
	{
		STRFREE(sub27->to);
		STRFREE(sub27->from);
	}
	while((sub27=firstsubroomflag))
	{	
		UNLINK(sub27,firstsubroomflag,lastsubroomflag,next,prev);
		DISPOSE(sub27);
	}
	for(sub28=firstsubexitdir;sub28;sub28=sub28->next)
	{
		STRFREE(sub28->to);
		STRFREE(sub28->from);
	}
	while((sub28=firstsubexitdir))
	{	
		UNLINK(sub28,firstsubexitdir,lastsubexitdir,next,prev);
		DISPOSE(sub28);
	}
	for(sub29=firstsubexitflag;sub29;sub29=sub29->next)
	{
		STRFREE(sub29->to);
		STRFREE(sub29->from);
	}
	while((sub29=firstsubexitflag))
	{	
		UNLINK(sub29,firstsubexitflag,lastsubexitflag,next,prev);
		DISPOSE(sub29);
	}
	for(sub30=firstsubspec;sub30;sub30=sub30->next)
	{
		STRFREE(sub30->to);
		STRFREE(sub30->from);
	}
	while((sub30=firstsubspec))
	{	
		UNLINK(sub30,firstsubspec,lastsubspec,next,prev);
		DISPOSE(sub30);
	}
	for(sub31=firstsubwearloc;sub31;sub31=sub31->next)
	{
		STRFREE(sub31->to);
		STRFREE(sub31->from);
	}
	while((sub31=firstsubwearloc))
	{	
		UNLINK(sub31,firstsubwearloc,lastsubwearloc,next,prev);
		DISPOSE(sub31);
	}
	for(sub32=firstsubprogtrig;sub32;sub32=sub32->next)
	{
		STRFREE(sub32->to);
		STRFREE(sub32->from);
	}
	while((sub32=firstsubprogtrig))
	{	
		UNLINK(sub32,firstsubprogtrig,lastsubprogtrig,next,prev);
		DISPOSE(sub32);
	}
	for(sub33=firstsubprogcomm;sub33;sub33=sub33->next)
	{
		STRFREE(sub33->to);
		STRFREE(sub33->from);
	}
	while((sub33=firstsubprogcomm))
	{	
		UNLINK(sub33,firstsubprogcomm,lastsubprogcomm,next,prev);
		DISPOSE(sub33);
	}
}
void add_sub(void *sub, char *buf)
{
	char arg1[1024];
	char arg2[1024];

	buf=buf=One_Argument(buf,arg1);
	buf=buf=One_Argument(buf,arg2);
	if(!*arg1 || !*arg2) /* probably a blank line */
		return;
	if(sub == subskill)
	{
		struct sub_skill *subit;
		CREATE(subit,struct sub_skill,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubskill,lastsubskill,next,prev);
		return;
	}
	if(sub == subspell)
	{
		struct sub_spell *subit;
		CREATE(subit,struct sub_spell,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubspell,lastsubspell,next,prev);
		return;
	}
	if(sub == subobjflag)
	{
		struct sub_objflag *subit;
		CREATE(subit,struct sub_objflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubobjflag,lastsubobjflag,next,prev);
		return;
	}
	if(sub == submobflag)
	{
		struct sub_mflag *subit;
		CREATE(subit,struct sub_mflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubmobflag,lastsubmobflag,next,prev);
		return;
	}
	if(sub == subareaflag)
	{
		struct sub_aflag *subit;
		CREATE(subit,struct sub_aflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubareaflag,lastsubareaflag,next,prev);
		return;
	}
	if(sub == subaffected)
	{
		struct sub_affected *subit;
		CREATE(subit,struct sub_affected,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubaffectedflag,lastsubaffectedflag,next,prev);
		return;
	}
	if(sub == submobrace)
	{
		struct sub_mobrace *subit;
		CREATE(subit,struct sub_mobrace,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubmobrace,lastsubmobrace,next,prev);
		return;
	}
	if(sub == submobclass)
	{
		struct sub_mobclass *subit;
		CREATE(subit,struct sub_mobclass,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubmobclass,lastsubmobclass,next,prev);
		return;
	}
	if(sub == submobclass)
	{
		struct sub_moblang *subit;
		CREATE(subit,struct sub_moblang,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubmoblang,lastsubmoblang,next,prev);
		return;
	}
	if(sub == submobpos)
	{
		struct sub_mobpos *subit;
		CREATE(subit,struct sub_mobpos,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubmobpos,lastsubmobpos,next,prev);
		return;
	}
	if(sub == subsector)
	{
		struct sub_sector *subit;
		CREATE(subit,struct sub_sector,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubsector,lastsubsector,next,prev);
		return;
	}
	if(sub == subbodypart)
	{
		struct sub_bodypart *subit;
		CREATE(subit,struct sub_bodypart,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubbodypart,lastsubbodypart,next,prev);
		return;
	}
	if(sub == subrisflag)
	{
		struct sub_risflag *subit;
		CREATE(subit,struct sub_risflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubrisflag,lastsubrisflag,next,prev);
		return;
	}
	if(sub == subattack)
	{
		struct sub_attack *subit;
		CREATE(subit,struct sub_attack,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubattack,lastsubattack,next,prev);
		return;
	}
	if(sub == subdefense)
	{
		struct sub_defense *subit;
		CREATE(subit,struct sub_defense,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubdefense,lastsubdefense,next,prev);
		return;
	}
	if(sub == subobjtype)
	{
		struct sub_objtype *subit;
		CREATE(subit,struct sub_objtype,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubobjtype,lastsubobjtype,next,prev);
		return;
	}
	if(sub == subwearflag)
	{
		struct sub_wearflag *subit;
		CREATE(subit,struct sub_wearflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubwearflag,lastsubwearflag,next,prev);
		return;
	}
	if(sub == subcontflag)
	{
		struct sub_contflag *subit;
		CREATE(subit,struct sub_contflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubcontflag,lastsubcontflag,next,prev);
		return;
	}
	if(sub == subwearlayerflag)
	{
		struct sub_wearlayerflag *subit;
		CREATE(subit,struct sub_wearlayerflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubwearlayerflag,lastsubwearlayerflag,next,prev);
		return;
	}
	if(sub == subliquid)
	{
		struct sub_liquid *subit;
		CREATE(subit,struct sub_liquid,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubliquid,lastsubliquid,next,prev);
		return;
	}
	if(sub == subherb)
	{
		struct sub_herb *subit;
		CREATE(subit,struct sub_herb,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubherb,lastsubherb,next,prev);
		return;
	}
	if(sub == subtrigger)
	{
		struct sub_trigger *subit;
		CREATE(subit,struct sub_trigger,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubtrigger,lastsubtrigger,next,prev);
		return;
	}
	if(sub == subtraptype)
	{
		struct sub_traptype *subit;
		CREATE(subit,struct sub_traptype,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubtraptype,lastsubtraptype,next,prev);
		return;
	}
	if(sub == subtrapflag)
	{
		struct sub_trapflag *subit;
		CREATE(subit,struct sub_trapflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubtrapflag,lastsubtrapflag,next,prev);
		return;
	}
	if(sub == subweapontype)
	{
		struct sub_weapontype *subit;
		CREATE(subit,struct sub_weapontype,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubweapontype,lastsubweapontype,next,prev);
		return;
	}
	if(sub == subobjaffects)
	{
		struct sub_objaffects *subit;
		CREATE(subit,struct sub_objaffects,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubobjaffects,lastsubobjaffects,next,prev);
		return;
	}
	if(sub == subroomflag)
	{
		struct sub_roomflag *subit;
		CREATE(subit,struct sub_roomflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubroomflag,lastsubroomflag,next,prev);
		return;
	}
	if(sub == subexitdir)
	{
		struct sub_exitdir *subit;
		CREATE(subit,struct sub_exitdir,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubexitdir,lastsubexitdir,next,prev);
		return;
	}
	if(sub == subexitflag)
	{
		struct sub_exitflag *subit;
		CREATE(subit,struct sub_exitflag,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubexitflag,lastsubexitflag,next,prev);
		return;
	}
	if(sub == subspec)
	{
		struct sub_spec *subit;
		CREATE(subit,struct sub_spec,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubspec,lastsubspec,next,prev);
		return;
	}
	if(sub == subwearloc)
	{
		struct sub_wearloc *subit;
		CREATE(subit,struct sub_wearloc,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubwearloc,lastsubwearloc,next,prev);
		return;
	}
	if(sub == subprogtrig)
	{
		struct sub_progtrig *subit;
		CREATE(subit,struct sub_progtrig,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubprogtrig,lastsubprogtrig,next,prev);
		return;
	}
	if(sub == subprogcomm)
	{
		struct sub_progcomm *subit;
		CREATE(subit,struct sub_progcomm,1);
		subit->from=STRALLOC(arg1);
		subit->to=STRALLOC(arg2);
		LINK(subit,firstsubprogcomm,lastsubprogcomm,next,prev);
		return;
	}
	bug("unknown sub array",0);

}
int getmobext(AREA_DATA *tarea,int vnum)
{
	int i;

	for(i=0;i<top_extmob;i++)
	{
		if(extmob[i]==vnum)
		{
			if(mobnew[i])
				return mobnew[i];
			if(vnum < tarea->low_m_vnum
			|| vnum > tarea->hi_m_vnum)
			{
				mobnew[i]=newrange;
				return newrange++;	
			}
			else
			{
				mobnew[i]=extmob[i];
				return vnum;
			}
		}
	}
	bug("mob %d not found",vnum);
	return 0;
}
int getobjext(AREA_DATA *tarea,int vnum)
{
	int i;

	for(i=0;i<top_extobj;i++)
	{
		if(extobj[i]==vnum)
		{
			if(objnew[i])
				return objnew[i];
			if(vnum < tarea->low_o_vnum
			|| vnum > tarea->hi_o_vnum)
			{
				objnew[i]=newrange;
				return newrange++;	
			}
			else
			{
				objnew[i]=vnum;
				return vnum;
			}
		}
	}
	bug("mob %d not found",vnum);
	return 0;
}
void find_externals(AREA_DATA *tarea)
{
	RESET_DATA *treset;
	MOB_INDEX_DATA *pMobIndex;
	OBJ_INDEX_DATA *pObjIndex;
	int vnum;

	top_extmob=0;
	top_extobj=0;
        addmobrange=0;
        addobjrange=0;

        for(vnum=tarea->low_m_vnum;vnum<= tarea->hi_m_vnum;vnum++)
	{
		if(!(pMobIndex=get_mob_index(vnum)))
		{
			continue;
		}
#ifdef DRAGONBANE
        	if (IS_SET(pMobIndex->act,ACT_DELETED))
	  		continue;
#endif
		mobnew[top_extmob]=0;
		extmob[top_extmob++]=vnum;
	}
        for(vnum=tarea->low_o_vnum;vnum<= tarea->hi_o_vnum;vnum++)
	{
		if(!(pObjIndex=get_obj_index(vnum)))
		{
			continue;
		}
#ifdef DRAGONBANE
        	if (pObjIndex->item_type == ITEM_DELETED)
	  		continue;
#endif
		objnew[top_extmob]=0;
		extobj[top_extobj++]=vnum;
	}

    	for ( treset = tarea->first_reset; treset; treset = treset->next )
    	{
		switch( treset->command ) /* extra arg1 arg2 arg3 */
		{
	  		default: break;
			case 'o': case 'O':
			case 'e': case 'E':
			case 'g': case 'G':
			case 'p': case 'P':
				vnum=treset->arg1;
				if(vnum >= tarea->low_o_vnum
                                && vnum <= tarea->hi_o_vnum)
					break;
				objnew[top_extmob]=0;
				extobj[top_extobj++]=vnum;
				addobjrange++;	
				break;
			case 'm': case 'M':
				vnum=treset->arg1;
				if(vnum >= tarea->low_m_vnum
                                && vnum <= tarea->hi_m_vnum)
					break;
				mobnew[top_extmob]=0;
				extmob[top_extmob++]=vnum;
				addmobrange++;	
				break;
		}
	}
}
static char mudprog[MAX_STRING_LENGTH];
	
char * make_out_prog(char *s)
{
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_STRING_LENGTH];
        char *bptr;

        bptr=buf;
	mudprog[0]=0;

	while(*s)
        {
		if(*s == '\n')	
		{
			s++;
			*bptr=0;
			bptr=buf;
			bptr=one_argument(bptr,arg);
			while(*arg)
			{
				if(!str_prefix(arg,"mpoload"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					sprintf(mudprog + strlen(mudprog),
						"%d ",OUT_VNUM(atoi(arg)));
					bptr=one_argument(bptr,arg);
					if(*arg)
					{
						sprintf(mudprog + strlen(mudprog),
						"%f",OUT_LEVEL(atoi(arg)));
					}
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpmload"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					sprintf(mudprog + strlen(mudprog),
						"%d ",OUT_VNUM(atoi(arg)));
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpat"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
                                        if(isdigit(arg[strlen(arg)-1]))
                                        {
					  sprintf(mudprog + strlen(mudprog),
						"%d %s",OUT_VNUM(atoi(arg)),bptr);
					}
					else
					{
					  sprintf(mudprog + strlen(mudprog),
						"%s %s",arg,bptr);
					}
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpgoto"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					if(isdigit(arg[strlen(arg)-1]))
					{
						sprintf(mudprog + strlen(mudprog),
						"%d ",OUT_VNUM(atoi(arg)));
					}
					else
					{
						sprintf(mudprog + strlen(mudprog),
						"%s ",bptr);
					}
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mptransfer"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					sprintf(mudprog + strlen(mudprog),
						"%s ",arg);
					bptr=one_argument(bptr,arg);
                                        if(*arg)
                                        {
						sprintf(mudprog + strlen(mudprog),
						"%d ",OUT_VNUM(atoi(arg)));
					}
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpopenpassage"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					sprintf(mudprog + strlen(mudprog),
						"%d ",OUT_VNUM(atoi(arg)));
					bptr=one_argument(bptr,arg);
					sprintf(mudprog + strlen(mudprog),
						"%d ",OUT_VNUM(atoi(arg)));
					sprintf(mudprog + strlen(mudprog),
						"%s",bptr);
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpclosepassage"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					sprintf(mudprog + strlen(mudprog),
						"%d ",OUT_VNUM(atoi(arg)));
					sprintf(mudprog + strlen(mudprog),
						"%s",bptr);
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else
				{
					sprintf(mudprog + strlen(mudprog),
					"%s %s\n",arg,bptr);
					*arg=0;
				}
			}
			bptr=buf;
			*bptr=0;
				
		}
		*bptr++ = *s++;
	}
        return mudprog; 
}

char * make_in_prog(char *s,char *name,int its_vnum, int lowvnum, int hivnum,FILE *axlog)
{
	char buf[MAX_STRING_LENGTH];
	char arg[MAX_STRING_LENGTH];
        char *bptr,*word;
        int vnum;

        bptr=buf;
	mudprog[0]=0;

	while(*s)
        {
		if(*s == '\n')	
		{
			s++;
			*bptr=0;
			bptr=buf;
			bptr=one_argument(bptr,arg);
			if((word=find_sub(subprogcomm,arg)))
			{
				strcpy(arg,word);
			}
			if (*arg
			&& strcmp(arg,"if")
			&& strcmp(arg,"endif")
			&& strcmp(arg,"else")
			&& strcmp(arg,"~")
			&& strcmp(arg,"|")
			&& ! find_command(arg)
			&& ! find_social(arg))
			{
				fprintf(axlog,"Uknown Command,%s, in mud program for %s (%d)\n",
					arg,name,its_vnum);		
                        }
			while(*arg)
			{
				if(!str_prefix(arg,"mpoload"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					vnum=IN_VNUM(atoi(arg));
					if(vnum < lowvnum || vnum > hivnum)
						fprintf(axlog,"mpoload references external object for %s (%d)\n",
							name,its_vnum);		
					sprintf(mudprog + strlen(mudprog),
						"%d ",vnum);
					bptr=one_argument(bptr,arg);
					if(*arg)
					{
						sprintf(mudprog + strlen(mudprog),
						"%d",IN_LEVEL(atof(arg)));
					}
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpmload"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					vnum=IN_VNUM(atoi(arg));
					if(vnum < lowvnum || vnum > hivnum)
						fprintf(axlog,"mpmload references external mobile for %s (%d)\n",
							name,its_vnum);		
					sprintf(mudprog + strlen(mudprog),
						"%d ",vnum);
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpat"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					if(isdigit(arg[strlen(arg)-1]))
                                        {
					  vnum=IN_VNUM(atoi(arg));
					  if(vnum < lowvnum || vnum > hivnum)
						fprintf(axlog,"mpat references external room for %s (%d)\n",
							name,its_vnum);		
					  sprintf(mudprog + strlen(mudprog),
						"%d %s",vnum,bptr);
					}
					else
					{
					  sprintf(mudprog + strlen(mudprog),
						"%s %s ",arg,bptr);
					}
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpgoto"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					if(isdigit(arg[strlen(arg)-1]))
					{
					  vnum=IN_VNUM(atoi(arg));
					  if(vnum < lowvnum || vnum > hivnum)
						fprintf(axlog,"mpgoto references external room for %s (%d)\n",
							name,its_vnum);		
						sprintf(mudprog + strlen(mudprog),
						"%d ",vnum);
					}
					else
					{
						sprintf(mudprog + strlen(mudprog),
						"%s %s ",arg,bptr);
					}
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mptransfer"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					sprintf(mudprog + strlen(mudprog),
						"%s ",arg);
					bptr=one_argument(bptr,arg);
                                        if(*arg)
                                        {
					  vnum=IN_VNUM(atoi(arg));
					  if(vnum < lowvnum || vnum > hivnum)
						fprintf(axlog,"mptransfer references external room for %s (%d)\n",
							name,its_vnum);		
					  sprintf(mudprog + strlen(mudprog),
						"%d ",vnum);
					}
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpopenpassage"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					vnum=IN_VNUM(atoi(arg));
					if(vnum < lowvnum || vnum > hivnum)
						fprintf(axlog,"mpopenpassage references external room for %s (%d)\n",
							name,its_vnum);		
					sprintf(mudprog + strlen(mudprog),
						"%d ",vnum);
					bptr=one_argument(bptr,arg);
					vnum=IN_VNUM(atoi(arg));
					if(vnum < lowvnum || vnum > hivnum)
						fprintf(axlog,"mpopenpassage references external room for %s (%d)\n",
							name,its_vnum);		
					sprintf(mudprog + strlen(mudprog),
						"%d ",vnum);
					sprintf(mudprog + strlen(mudprog),
						"%s",bptr);
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else if(!str_prefix(arg,"mpclosepassage"))
				{
					strcat(mudprog,arg);
					strcat(mudprog," ");
					bptr=one_argument(bptr,arg);
					vnum=IN_VNUM(atoi(arg));
					if(vnum < lowvnum || vnum > hivnum)
						fprintf(axlog,"mpclosepassage references external room for %s (%d)\n",
							name,its_vnum);		
					sprintf(mudprog + strlen(mudprog),
						"%d ",vnum);
					sprintf(mudprog + strlen(mudprog),
						"%s",bptr);
					strcat(mudprog,"\n");
					bptr=one_argument(bptr,arg);
					continue;
				}
				else
				{
					sprintf(mudprog + strlen(mudprog),
					"%s %s\n",arg,bptr);
					*arg=0;
				}
			}
			bptr=buf;
			*bptr=0;
				
		}
		*bptr++ = *s++;
	}
        return mudprog; 
}
void do_ax_import(CHAR_DATA *ch, char *argument)
{
	FILE *fp,*axlog;
	char buff[2048];
	char *buf=buff;
	char command[80];
	char word[80];
	char filename[80];
	AREA_DATA *area=NULL,*tarea=NULL;
	char *s;
	int subtype=0,i=0,iHash=0,letter=0,extra=0,arg1=0,arg2=0,arg3=0;
	int buyslot=0;
    	MOB_INDEX_DATA	*pMobIndex=NULL;
    	OBJ_INDEX_DATA	*pObjIndex=NULL;
    	ROOM_INDEX_DATA	*pRoomIndex=NULL;
    	SHOP_DATA	*pShop;
    	REPAIR_DATA	*rShop;
	int 		noextlink=0;

	if(! *argument)
	{
		display(version);
		display("aximport <filename.aex> [newstartvnum] [NOEXTLINK]\n\r");
		return;
	}
	argument=One_Argument(argument,filename);
	argument=One_Argument(argument,word);
        fBootDb=TRUE;
	if(isdigit(*word))
	{ 
		renumber=atoi(word);
		argument=One_Argument(argument,word);
	}
	if(!str_cmp(word,"noextlink"))
	{
		noextlink=1;
	}	
	
	if(strchr(filename,'/'))
	{
		sprintf(buf,"../exchange/%s",filename);
		strcpy(strrchr(buf,'/'),"/axsub.dat");	
	}
	else
	{
		sprintf(buf,"../exchange/axsub.dat");
	}
	if((fp=fopen(buf,"r"))==NULL)
	{
		display("Can't open ");
		display(buf);
		display("\n\r");
		return;	
        }
	while(fgets(buff,1000,fp))
	{
		buf=strip_cr(buff);
		if(strrchr(buf,'\n'))
			*(strrchr(buf,'\n'))=0;
		buf=One_Argument(buf,command);	
		if(!strcmp(command,"#GOLDADJUSTPERCENT"))
                {
			goldadjust=atof(buf);
		}
		if(!strcmp(command,"#SPELLS"))
		{
			subtype=1;
			continue;
		}
		if(!strcmp(command,"#SKILLS"))
		{
			subtype=2;
			continue;
		}
		if(!strcmp(command,"#OBJFLAGS"))
		{
			subtype=3;
			continue;
		}
		if(!strcmp(command,"#MOBFLAGS"))
		{
			subtype=4;
			continue;
		}
		if(!strcmp(command,"#AREAFLAGS"))
		{
			subtype=5;
			continue;
		}
		if(!strcmp(command,"#AFFECTED"))
		{
			subtype=6;
			continue;
		}
		if(!strcmp(command,"#MOBRACE"))
		{
			subtype=7;
			continue;
		}
		if(!strcmp(command,"#MOBCLASS"))
		{
			subtype=8;
			continue;
		}
		if(!strcmp(command,"#MOBLANGUAGES"))
		{
			subtype=9;
			continue;
		}
		if(!strcmp(command,"#MOBPOSITIONS"))
		{
			subtype=10;
			continue;
		}
		if(!strcmp(command,"#SECTORTYPES"))
		{
			subtype=11;
			continue;
		}
		if(!strcmp(command,"#BODYPARTS"))
		{
			subtype=12;
			continue;
		}
		if(!strcmp(command,"#RISFLAGS"))
		{
			subtype=13;
			continue;
		}
		if(!strcmp(command,"#MOBATTACKS"))
		{
			subtype=14;
			continue;
		}
		if(!strcmp(command,"#MOBDEFENSES"))
		{
			subtype=15;
			continue;
		}
		if(!strcmp(command,"#OBJTYPES"))
		{
			subtype=16;
			continue;
		}
		if(!strcmp(command,"#WEARFLAGS"))
		{
			subtype=17;
			continue;
		}
		if(!strcmp(command,"#CONTAINERFLAGS"))
		{
			subtype=18;
			continue;
		}
		if(!strcmp(command,"#OBJWEARLAYERS"))
		{
			subtype=19;
			continue;
		}
		if(!strcmp(command,"#LIQUIDTYPES"))
		{
			subtype=20;
			continue;
		}
		if(!strcmp(command,"#HERBS"))
		{
			subtype=21;
			continue;
		}
		if(!strcmp(command,"#TRAPTRIGGERS"))
		{
			subtype=22;
			continue;
		}
		if(!strcmp(command,"#TRAPTYPES"))
		{
			subtype=23;
			continue;
		}
		if(!strcmp(command,"#TRAPFLAGS"))
		{
			subtype=24;
			continue;
		}
		if(!strcmp(command,"#WEAPONTYPES"))
		{
			subtype=25;
			continue;
		}
		if(!strcmp(command,"#OBJAPPLYTYPES"))
		{
			subtype=26;
			continue;
		}
		if(!strcmp(command,"#ROOMFLAGS"))
		{
			subtype=27;
			continue;
		}
		if(!strcmp(command,"#ROOMEXITDIRS"))
		{
			subtype=28;
			continue;
		}
		if(!strcmp(command,"#ROOMEXITFLAGS"))
		{
			subtype=29;
			continue;
		}
		if(!strcmp(command,"#SPECIALFUNCTIONS"))
		{
			subtype=30;
			continue;
		}
		if(!strcmp(command,"#WEARLOCATIONS"))
		{
			subtype=31;
			continue;
		}
		if(!strcmp(command,"#PROGTRIGGERS"))
		{
			subtype=32;
			continue;
		}
		if(!strcmp(command,"#PROGCOMMANDS"))
		{
			subtype=33;
			continue;
		}
		if(!strcmp(command,"#END"))
		{
			subtype=0;
			break;
		}
		buf=strip_cr(buff);
		if(strrchr(buf,'\n'))
			*(strrchr(buf,'\n'))=0;
		switch(subtype)
		{
			case 0:
				break;
			case 1:
				add_sub(subskill,buf);
				break;
			case 2:
				add_sub(subspell,buf);
				break;
			case 3:
				add_sub(subobjflag,buf);
				break;
			case 4:
				add_sub(submobflag,buf);
				break;
			case 5:
				add_sub(subareaflag,buf);
				break;
			case 6:
				add_sub(subaffected,buf);
				break;
			case 7:
				add_sub(submobrace,buf);
				break;
			case 8:
				add_sub(submobclass,buf);
				break;
			case 9:
				add_sub(submoblang,buf);
				break;
			case 10:
				add_sub(submobpos,buf);
				break;
			case 11:
				add_sub(subsector,buf);
				break;
			case 12:
				add_sub(subbodypart,buf);
				break;
			case 13:
				add_sub(subrisflag,buf);
				break;
			case 14:
				add_sub(subattack,buf);
				break;
			case 15:
				add_sub(subdefense,buf);
				break;
			case 16:
				add_sub(subobjtype,buf);
				break;
			case 17:
				add_sub(subwearflag,buf);
				break;
			case 18: 
				add_sub(subcontflag,buf);
				break;
			case 19:
				add_sub(subwearlayerflag,buf);
				break;
			case 20:
				add_sub(subliquid,buf);
				break;
			case 21:
				add_sub(subherb,buf);
				break;
			case 22:
				add_sub(subtrigger,buf);
				break;
			case 23:
				add_sub(subtraptype,buf);
				break;
			case 24:
				add_sub(subtrapflag,buf);
				break;
			case 25:
				add_sub(subweapontype,buf);
				break;
			case 26:
				add_sub(subobjaffects,buf);
				break;
			case 27:
				add_sub(subroomflag,buf);
				break;
			case 28:
				add_sub(subexitdir,buf);
				break;
			case 29:
				add_sub(subexitflag,buf);
				break;
			case 30:
				add_sub(subspec,buf);
				break;
			case 31:
				add_sub(subwearloc,buf);
				break;
			case 32:
				add_sub(subprogtrig,buf);
				break;
			case 33:
				add_sub(subprogcomm,buf);
				break;
			default:
				sprintf(buf,"Unknow SubType %d\n",subtype);
				bug(buf,0);
				break;
		}
	
	}
	fclose(fp);
	sprintf(buf,"../exchange/%s",filename);
	if((fp=fopen(buf,"r"))==NULL)
	{
		display("Can't open ");
		display(buf);
		display("\n\r");
		return;	
	}
	strcat(buf,".log");
	if((axlog=fopen(buf,"w"))==NULL)
	{
		display("Can't open ");
		display(buf);
		display("\n\r");
		return;	
	}
	while(fgets(buff,2040,fp))
	{
		buf=strip_cr(buff);
		if(strrchr(buf,'\n'))
			*(strrchr(buf,'\n'))=0;
		buf=One_Argument(buf,command);
		if(!strcmp(command,"#EXPORTEDBY"))
                {
			/* documentary */
			continue;
		}
		if(!strcmp(command,"#AREANAME"))
		{
			CREATE(area,AREA_DATA,1);
			LINK( area, first_build, last_build, next, prev );
			top_area++;
			area=last_build;
			area->name=STRALLOC(buf);
			if(strchr(filename,'/'))
			{
				strcpy(filename,strrchr(filename,'/')+1);
			}
			area->filename=STRALLOC(filename);
			continue;	
		}
		if(!strcmp(command,"#STARTVNUM"))
		{
			startvnum = atoi(buf);
			if(renumber < 1)
			{
				renumber=startvnum;
			}
			if(IN_VNUM(0) > MAX_POSSIBLE_VNUM)
			{
				display("Out of range vnum detected, try aiming a little lower\n\r");
				STRFREE(area->filename);
				STRFREE(area->name);
				UNLINK( area, first_build, last_build, next, prev );
				DISPOSE(area);
				top_area--;
				return;
			}
			continue;
		}
		if(!strcmp(command,"#AUTHOR"))
		{
			area->author=STRALLOC(buf);
			continue;	
		}
		if(!strcmp(command,"#SOFTRANGE"))
		{
			buf=One_Argument(buf,word);
			area->low_soft_range=IN_LEVEL(atof(word));
			buf=One_Argument(buf,word);
			area->hi_soft_range=IN_LEVEL(atof(word));
			continue;
		}
		if(!strcmp(command,"#HARDRANGE"))
		{
			buf=One_Argument(buf,word);
			area->low_hard_range=IN_LEVEL(atof(word));
			buf=One_Argument(buf,word);
			area->hi_hard_range=IN_LEVEL(atof(word));
			continue;
		}
		if(!strcmp(command,"#ROOMRANGE"))
		{
			buf=One_Argument(buf,word);
			area->low_r_vnum=IN_VNUM(atoi(word));
			buf=One_Argument(buf,word);
			area->hi_r_vnum=IN_VNUM(atoi(word));
			if(IN_VNUM(atoi(word)) > MAX_POSSIBLE_VNUM)
			{
				display("Out of range vnum detected, try aiming a little lower\n\r");
				STRFREE(area->filename);
				STRFREE(area->name);
				STRFREE(area->author);
				UNLINK( area, first_build, last_build, next, prev );
				DISPOSE(area);
				return;
			}
			for(tarea=first_area;tarea;tarea=tarea->next)
			{
				if(area==tarea)
				{
					continue;
				}
				if((area->low_r_vnum >=tarea->low_r_vnum
					&& area->low_r_vnum <= tarea->hi_r_vnum)
				|| (area->hi_r_vnum >=tarea->low_r_vnum
					&& area->hi_r_vnum <= tarea->hi_r_vnum))
				{
					sprintf(buff,"%s (%d - %d) would overlap %s (%d - %d) rooms\n\r",
						area->name,
						area->low_r_vnum,
						area->hi_r_vnum,
						tarea->name,
						tarea->low_r_vnum,
						tarea->hi_r_vnum);
					display(buff);
					STRFREE(area->filename);
					STRFREE(area->name);
					STRFREE(area->author);
					UNLINK( area, first_build, last_build, next, prev );
					DISPOSE(area);
					return;
				}
			}
			for(tarea=first_build;tarea;tarea=tarea->next)
			{
				if(area==tarea)
				{
					continue;
				}
				if((area->low_r_vnum >=tarea->low_r_vnum
					&& area->low_r_vnum <= tarea->hi_r_vnum)
				|| (area->hi_r_vnum >=tarea->low_r_vnum
					&& area->hi_r_vnum <= tarea->hi_r_vnum))
				{
					sprintf(buff,"%s (%d - %d) would overlap %s (%d - %d) rooms\n\r",
						area->name,
						area->low_r_vnum,
						area->hi_r_vnum,
						tarea->name,
						tarea->low_r_vnum,
						tarea->hi_r_vnum);
					display(buff);
					STRFREE(area->filename);
					STRFREE(area->name);
					STRFREE(area->author);
					UNLINK( area, first_build, last_build, next, prev );
					DISPOSE(area);
					return;
				}
			}
			continue;
		}
		if(!strcmp(command,"#MOBRANGE"))
		{
			buf=One_Argument(buf,word);
			area->low_m_vnum=IN_VNUM(atoi(word));
			buf=One_Argument(buf,word);
			area->hi_m_vnum=IN_VNUM(atoi(word));
			if(IN_VNUM(atoi(word)) > MAX_POSSIBLE_VNUM)
			{
				display("Out of range vnum detected, try aiming a little lower\n\r");
				STRFREE(area->filename);
				STRFREE(area->name);
				STRFREE(area->author);
				UNLINK( area, first_build, last_build, next, prev );
				DISPOSE(area);
				return;
			}
			for(tarea=first_area;tarea;tarea=tarea->next)
			{
				if(area==tarea)
				{
					continue;
				}
				if((area->low_m_vnum >=tarea->low_m_vnum
					&& area->low_m_vnum <= tarea->hi_m_vnum)
				|| (area->hi_m_vnum >=tarea->low_m_vnum
					&& area->hi_m_vnum <= tarea->hi_m_vnum))
				{
					sprintf(buff,"%s (%d - %d) would overlap %s (%d - %d) mobs\n\r",
						area->name,
						area->low_m_vnum,
						area->hi_m_vnum,
						tarea->name,
						tarea->low_m_vnum,
						tarea->hi_m_vnum);
					display(buff);
					STRFREE(area->filename);
					STRFREE(area->name);
					STRFREE(area->author);
					UNLINK( area, first_build, last_build, next, prev );
					DISPOSE(area);
					return;
				}
			}
			for(tarea=first_build;tarea;tarea=tarea->next)
			{
				if(area==tarea)
				{
					continue;
				}
				if((area->low_m_vnum >=tarea->low_m_vnum
					&& area->low_m_vnum <= tarea->hi_m_vnum)
				|| (area->hi_m_vnum >=tarea->low_m_vnum
					&& area->hi_m_vnum <= tarea->hi_m_vnum))
				{
					sprintf(buff,"%s (%d - %d) would overlap %s (%d - %d) mobs\n\r",
						area->name,
						area->low_m_vnum,
						area->hi_m_vnum,
						tarea->name,
						tarea->low_m_vnum,
						tarea->hi_m_vnum);
					display(buff);
					STRFREE(area->filename);
					STRFREE(area->name);
					STRFREE(area->author);
					UNLINK( area, first_build, last_build, next, prev );
					DISPOSE(area);
					return;
				}
			}
			continue;
		}
		if(!strcmp(command,"#OBJRANGE"))
		{
			buf=One_Argument(buf,word);
			area->low_o_vnum=IN_VNUM(atoi(word));
			buf=One_Argument(buf,word);
			area->hi_o_vnum=IN_VNUM(atoi(word));
			if(IN_VNUM(atoi(word)) > MAX_POSSIBLE_VNUM)
			{
				display("Out of range vnum detected, try aiming a little lower\n\r");
				STRFREE(area->filename);
				STRFREE(area->name);
				STRFREE(area->author);
				UNLINK( area, first_build, last_build, next, prev );
				DISPOSE(area);
				return;
			}
			for(tarea=first_area;tarea;tarea=tarea->next)
			{
				if(area==tarea)
				{
					continue;
				}
				if((area->low_o_vnum >=tarea->low_o_vnum
					&& area->low_o_vnum <= tarea->hi_o_vnum)
				|| (area->hi_o_vnum >=tarea->low_o_vnum
					&& area->hi_o_vnum <= tarea->hi_o_vnum))
				{
					sprintf(buff,"%s (%d - %d) would overlap %s (%d - %d) objects\n\r",
						area->name,
						area->low_o_vnum,
						area->hi_o_vnum,
						tarea->name,
						tarea->low_o_vnum,
						tarea->hi_o_vnum);
					display(buff);
					STRFREE(area->filename);
					STRFREE(area->name);
					STRFREE(area->author);
					UNLINK( area, first_build, last_build, next, prev );
					DISPOSE(area);
					return;
				}
			}
			for(tarea=first_build;tarea;tarea=tarea->next)
			{
				if(area==tarea)
				{
					continue;
				}
				if((area->low_o_vnum >=tarea->low_o_vnum
					&& area->low_o_vnum <= tarea->hi_o_vnum)
				|| (area->hi_o_vnum >=tarea->low_o_vnum
					&& area->hi_o_vnum <= tarea->hi_o_vnum))
				{
					sprintf(buff,"%s (%d - %d) would overlap %s (%d - %d) objects\n\r",
						area->name,
						area->low_o_vnum,
						area->hi_o_vnum,
						tarea->name,
						tarea->low_o_vnum,
						tarea->hi_o_vnum);
					display(buff);
					STRFREE(area->filename);
					STRFREE(area->name);
					STRFREE(area->author);
					UNLINK( area, first_build, last_build, next, prev );
					DISPOSE(area);
					return;
				}
			}
			continue;
		}
		if(!strcmp(command,"#RESETMSG"))
		{
			area->resetmsg=STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"#RESETFREQUENCY"))
		{
			area->reset_frequency = atoi(buf);
			continue;
		}
		if(!strcmp(command,"#RECALL"))
		{
			continue;
		}
		if(!strcmp(command,"#AREAFLAGS"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subareaflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_areaflag(word)) > -1)
				{
					SET_BIT(area->flags,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown area flag: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"#ECONOMY"))
		{
			buf=One_Argument(buf,word);
			area->high_economy=atoi(word);
			buf=One_Argument(buf,word);
			area->low_economy=atoi(word);
			continue;
		}
		if(!strcmp(command,"#MOBILES"))
		{
			continue;
		}
		if(!strcmp(command,"!mobvnum"))
		{
			CREATE(pMobIndex,MOB_INDEX_DATA,1);
			pMobIndex->vnum=IN_VNUM(atoi(buf));
			iHash			= pMobIndex->vnum % MAX_KEY_HASH;
			pMobIndex->next		= mob_index_hash[iHash];
			mob_index_hash[iHash]	= pMobIndex;
#ifdef DRAGONBANE
			pMobIndex->talk=STRALLOC("");
#endif
			top_mob_index++;
			continue;
		}
		if(!strcmp(command,"@mobkeywordname"))
		{
			pMobIndex->player_name = STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"@mobactionname"))
		{
			pMobIndex->short_descr = STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"@mobinroomname"))
		{
			strcat(buf,"\n\r");
			pMobIndex->long_descr = STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"@moblookdescription"))
		{
			pMobIndex->description=fread_string(fp);
			continue;
		}
		if(!strcmp(command,"@mobtalkreply"))
		{
#ifdef DRAGONBANE
			pMobIndex->talk=fread_string(fp);
#endif
			continue;
		}
		if(!strcmp(command,"@mobactflags"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(submobflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_actflag(word)) > -1)
				{
#ifdef SMAUG102
					SET_BIT(pMobIndex->act,1 << i);
#endif
#ifdef SMAUG14
					xSET_BIT(pMobIndex->act,i);
#endif
				}
				else
			        {
					fprintf(axlog,"Unknown mobactflag flag: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobaffectedby"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subaffected,word)))
				{
					strcpy(word,s);
				}
				if((i=get_aflag(word)) > -1)
				{
#ifdef SMAUG102
					SET_BIT(pMobIndex->affected_by,1 << i);
#endif
#ifdef SMAUG14
					xSET_BIT(pMobIndex->affected_by,i);
#endif
				}
				else
			        {
					fprintf(axlog,"Unknown mobaffectedby flag: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobalignment"))
                {
			pMobIndex->alignment=(int)(atof(buf) * MAX_ALIGNMENT);
			continue;
		}
		if(!strcmp(command,"@moblevel"))
		{
			pMobIndex->level=IN_LEVEL(atof(buf));
			continue;
		}
		if(!strcmp(command,"@mobthac0"))
		{
			pMobIndex->mobthac0=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobarmorclass"))
		{
			pMobIndex->ac=(int)(atof(buf) * MAX_MOBARMORCLASS);
			continue;
		}
		if(!strcmp(command,"@mobnumberofhitdice"))
		{
			pMobIndex->hitnodice=IN_DICE(atof(buf));
			continue;
		}
		if(!strcmp(command,"@mobsizeofhitdice"))
		{
			pMobIndex->hitsizedice=IN_DICE(atof(buf));
			continue;
		}
		if(!strcmp(command,"@mobplustohitdice"))
		{
			pMobIndex->hitplus=IN_DICE(atof(buf));
			continue;
		}
		if(!strcmp(command,"@mobnumberofdamagedice"))
		{
			pMobIndex->damnodice=IN_DICE(atof(buf));
			continue;
		}
		if(!strcmp(command,"@mobsizeofdamagedice"))
		{
			pMobIndex->damsizedice=IN_DICE(atof(buf));
			continue;
		}
		if(!strcmp(command,"@mobplustodamagedice"))
		{
			pMobIndex->damplus=IN_DICE(atof(buf));
			continue;
		}
		if(!strcmp(command,"@mobgold"))
		{
			pMobIndex->gold= GOLDADJ(atoi(buf));
			continue;
		}
		if(!strcmp(command,"@mobexperience"))
		{
			pMobIndex->exp=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobposition"))
		{
			i=0;
			if((s=find_sub(submobpos,word)))
			{
				strcpy(buf,s);
			}
			while(ax_position[i])
			{
				if(!strcmp(ax_position[i],buf))
				{
					pMobIndex->position=i; 
					break;
				}
				i++;
			}
			if(!ax_position[i])
			{
				fprintf(axlog,"Unknown mobposition %s\n",buf);
			}
			continue;
		}
		if(!strcmp(command,"@mobdefaultposition"))
		{
			i=0;
			if((s=find_sub(submobpos,word)))
			{
				strcpy(buf,s);
			}
			while(ax_position[i])
			{
				if(!strcmp(ax_position[i],buf))
				{
					pMobIndex->defposition=i; 
					break;
				}
				i++;
			}
			if(!ax_position[i])
			{
				fprintf(axlog,"Unknown mobdefaultposition %s\n",buf);
			}
			continue;
		}
		if(!strcmp(command,"@mobsex"))
		{
			i=0;
			while(ax_sex[i])
			{
				if(!strcmp(ax_sex[i],buf))
				{
					pMobIndex->sex=i; 
					break;
				}
				i++;
			}
			if(!ax_sex[i])
			{
				fprintf(axlog,"Unknown mobsex %s\n",buf);
			}
			continue;
		}
		if(!strcmp(command,"@mobstrength"))
		{
			pMobIndex->perm_str = (int) (atof(buf) * MAX_PRIME_ATTRIB);
			continue;
		}
		if(!strcmp(command,"@mobintelligence"))
		{
			pMobIndex->perm_int = (int) (atof(buf) * MAX_PRIME_ATTRIB);
			continue;
		}
		if(!strcmp(command,"@mobwisdom"))
		{
			pMobIndex->perm_wis = (int) (atof(buf) * MAX_PRIME_ATTRIB);
			continue;
		}
		if(!strcmp(command,"@mobdexterity"))
		{
			pMobIndex->perm_dex = (int) (atof(buf) * MAX_PRIME_ATTRIB);
			continue;
		}
		if(!strcmp(command,"@mobconstitution"))
		{
			pMobIndex->perm_con = (int) (atof(buf) * MAX_PRIME_ATTRIB);
			continue;
		}
		if(!strcmp(command,"@mobcharisma"))
		{
			pMobIndex->perm_cha = (int) (atof(buf) * MAX_PRIME_ATTRIB);
			continue;
		}
		if(!strcmp(command,"@mobluck"))
		{
			pMobIndex->perm_lck = (int) (atof(buf) * MAX_PRIME_ATTRIB);
			continue;
		}
		if(!strcmp(command,"@mobsavevspoisondeath"))
		{
			pMobIndex->saving_poison_death=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobsavevswand"))
		{
			pMobIndex->saving_wand=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobsavevsparapetri"))
		{
			pMobIndex->saving_para_petri=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobsavevsbreath"))
		{
			pMobIndex->saving_breath=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobsavevsspellstaff"))
		{
			pMobIndex->saving_spell_staff=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobsavevspsionic"))
		{
#ifdef DRAGONBANE
			pMobIndex->saving_psionics=atoi(buf);
#endif
			continue;
		}
		if(!strcmp(command,"@mobrace"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(submobrace,word)))
				{
					strcpy(word,s);
				}
				if((i=get_npc_race(word)) > -1)
				{
					pMobIndex->race=i;
				}
				else
			        {
					fprintf(axlog,"Unknown mobrace: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobclass"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(submobclass,word)))
				{
					strcpy(word,s);
				}
				if((i=get_npc_class(word)) > -1)
				{
					pMobIndex->class=i;
				}
				else
			        {
					fprintf(axlog,"Unknown mobclass: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobheight"))
		{
			pMobIndex->height=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobweight"))
		{
			pMobIndex->weight=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobspeaks"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(submoblang,word)))
				{
					strcpy(word,s);
				}
				if((i=get_langflag(word)) > -1)
				{
					SET_BIT(pMobIndex->speaks,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown mobspeaks: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobspeaking"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(submoblang,word)))
				{
					strcpy(word,s);
				}
				if((i=get_langflag(word)) > -1)
				{
					SET_BIT(pMobIndex->speaking,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown mobspeaking: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobnumberofattacks"))
		{
			pMobIndex->numattacks=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobhoardroom"))
		{
#ifdef DRAGONBANE
			pMobIndex->hoard=IN_VNUM(atoi(buf));
#endif 
			continue;
		}
		if(!strcmp(command,"@mobstayterraintype"))
		{
#ifdef DRAGONBANE
			i=0;
			if((s=find_sub(subsector,word)))
			{
				strcpy(buf,s);
			}
			while(ax_sector_names[i])
			{
				if(!strcmp(ax_sector_names[i],buf))
				{
					pMobIndex->terrain=i; 
					break;
				}
				i++;
			}
			if(!ax_sector_names[i])
			{
				fprintf(axlog,"Unknown mobstayterraintype %s\n",buf);
			}
#endif
			continue;
		}
		if(!strcmp(command,"@mobhitroll"))
		{
			pMobIndex->hitroll=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobdamageroll"))
		{
			pMobIndex->damroll=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@mobbodyparts"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subbodypart,word)))
				{
					strcpy(word,s);
				}
				if((i=get_partflag(word)) > -1)
				{
					SET_BIT(pMobIndex->xflags,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown mobbodyparts: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobisresistant"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subrisflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_risflag(word)) > -1)
				{
					SET_BIT(pMobIndex->resistant,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown mobisresistant: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobisimmune"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subrisflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_risflag(word)) > -1)
				{
					SET_BIT(pMobIndex->immune,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown mobisimmune: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobissusceptible"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subrisflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_risflag(word)) > -1)
				{
					SET_BIT(pMobIndex->susceptible,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown mobissusceptible: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobattacks"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subattack,word)))
				{
					strcpy(word,s);
				}
				if((i=get_attackflag(word)) > -1)
				{
#ifdef SMAUG102
					SET_BIT(pMobIndex->attacks,1 << i);
#endif
#ifdef SMAUG14
					xSET_BIT(pMobIndex->attacks, i);
#endif
				}/* I have 2 attack bit vectors .. soo */
#ifdef DRAGONBANE
				else if((i=get_attackflag2(word)) > -1) 
				{
					SET_BIT(pMobIndex->attack2,1 << i);
				}
#endif
				else
			        {
					fprintf(axlog,"Unknown mobattacks: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobdefenses"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subdefense,word)))
				{
					strcpy(word,s);
				}
				if((i=get_defenseflag(word)) > -1)
				{
#ifdef SMAUG102
					SET_BIT(pMobIndex->defenses,1 << i);
#endif
#ifdef SMAUG14
					xSET_BIT(pMobIndex->defenses, i);
#endif
				}
				else
			        {
					fprintf(axlog,"Unknown mobdefenses: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@mobspecial"))
		{
			if((s=find_sub(subspec,buf)))
			{
				strcpy(buf,s);
			}
			if(spec_lookup(buf))
			{
				pMobIndex->spec_fun=spec_lookup(buf);
			}
			else
			{
				fprintf(axlog,"Unknown mobspecial: %s\n",buf);
			}
			continue;
			
		}
		if(!strcmp(command,"@mobprograms"))
		{
    			MPROG_DATA	*mprog = NULL;
			char *prog;
			int err=0;
			char progbuf[MAX_STRING_LENGTH];
			
			while(fgets(buff,1000,fp))
			{

				if(strrchr(buff,'\n'))
					*(strrchr(buff,'\n'))=0;
				if(strrchr(buff,'~'))
					*(strrchr(buff,'~'))=0;
				buf=strip_cr(buff);
				buf=One_Argument(buf,word);
				if(!strcmp(word,">"))
				{
					err=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subprogtrig,word)))
					{
						strcpy(word,s);
					}
					i = mprog_name_to_type(word);
					if(i==ERROR_PROG)
					{
						err=1;
						fprintf(axlog,"Unknown mob prog trigger %s\n",word);
						continue;
					}
					if(pMobIndex->mudprogs)
					{
						mprog->comlist=STRALLOC(progbuf);
					   	CREATE( mprog->next, MPROG_DATA, 1 );
					   	mprog = mprog->next;
					}
					else
					{
						CREATE( mprog, MPROG_DATA, 1 ); 
						pMobIndex->mudprogs=mprog;
					}
					progbuf[0]=0;
					mprog->type=i;
#ifdef SMAUG14
					xSET_BIT(pMobIndex->progtypes,mprog->type);
#else
					pMobIndex->progtypes = pMobIndex->progtypes | mprog->type;
#endif
					mprog->arglist=STRALLOC(buf);

				}
				else if(!strcmp(word,"|"))
				{
					mprog->comlist=STRALLOC(progbuf);
					mprog->next = NULL;
					break;
				}
				else
				{
					if(err)
					{
						continue;
					}
					sprintf(progbuf + strlen(progbuf),"%s\n",buff);
				}
			}
	  		for ( mprog = pMobIndex->mudprogs; mprog; mprog = mprog->next )
			{
				prog=make_in_prog(mprog->comlist,
					pMobIndex->player_name,
					pMobIndex->vnum,
					area->low_m_vnum,
					area->hi_m_vnum,
					axlog);
				STRFREE(mprog->comlist);
				mprog->comlist=STRALLOC(prog);
			}
			continue;
		}
		if(!strcmp(command,"#OBJECTS"))
		{
			continue;
		}
		if(!strcmp(command,"!objvnum"))
		{
			CREATE(pObjIndex,OBJ_INDEX_DATA,1);
			pObjIndex->vnum=IN_VNUM(atoi(buf));
			iHash		= pObjIndex->vnum % MAX_KEY_HASH;
			pObjIndex->next	= obj_index_hash[iHash];
			obj_index_hash[iHash]	= pObjIndex;
			top_obj_index++;
			pObjIndex->action_desc = STRALLOC("");
			continue;
		}
		if(!strcmp(command,"@objlevel"))
                {
			pObjIndex->level=IN_VNUM(atoi(buf));
			continue;
		}
		if(!strcmp(command,"@objkeywordname"))
		{
			pObjIndex->name = STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"@objinventoryname"))
		{
			pObjIndex->short_descr = STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"@objinroomname"))
		{
			strcat(buf,"\n\r");
			pObjIndex->description = STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"@objactiondescription"))
		{
			STRFREE(pObjIndex->action_desc);
			pObjIndex->action_desc = STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"@objitemtype"))
		{
			buf=One_Argument(buf,word);
			if((s=find_sub(subobjtype,word)))
			{
				strcpy(word,s);
			}
			if((i=get_otype(word)) > -1)
			{
				pObjIndex->item_type=i;
			}
			else
		        {
				fprintf(axlog,"Unknown objtype: %s\n",word);
			}	
			continue;
		}
		if(!strcmp(command,"@objflags"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subobjflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_oflag(word)) > -1)
				{
#ifdef SMAUG102
					SET_BIT(pObjIndex->extra_flags,1 << i);
#endif
#ifdef SMAUG14
					xSET_BIT(pObjIndex->extra_flags, i);
#endif
				}
				else if((i=get_mflag(word)) > -1)
				{
					SET_BIT(pObjIndex->magic_flags,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown objflag: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@objwearflags"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subwearflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_wflag(word)) > -1)
				{
					SET_BIT(pObjIndex->wear_flags,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown wearflag: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@objwearlayers"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subwearlayerflag,word)))
				{
					strcpy(word,s);
				}
				i=0;
				while(ax_layers[i])
				{
					if(!strcmp(word,ax_layers[i]))
					{
						SET_BIT(pObjIndex->layers,1 << i);
						break;
					}
					i++;
				}
				if(!ax_layers[i])
				{
					fprintf(axlog,"Unknown objwearlayer: %s\n",word);
				}
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if (!strcmp(command,"@objcurrac")
		|| !strcmp(command,"@objorgac")
		|| !strcmp(command,"@objcapacity")
		|| !strcmp(command,"@objcontainerflags")
		|| !strcmp(command,"@objkeyvnum")
		|| !strcmp(command,"@objcontainercondtn")
		|| !strcmp(command,"@objdrinkcapacity")
		|| !strcmp(command,"@objdrinkquantity")
		|| !strcmp(command,"@objliquidtype")
		|| !strcmp(command,"@objliquidpoisonflag")
		|| !strcmp(command,"@objfoodvalue")
		|| !strcmp(command,"@objfoodcondition")
		|| !strcmp(command,"@objfoodpoisonflag")
		|| !strcmp(command,"@objherbdoses")
		|| !strcmp(command,"@objherbname")
		|| !strcmp(command,"@objkeylockvnum")
		|| !strcmp(command,"@objtriggerflags")
		|| !strcmp(command,"@objtrigtoroom")
		|| !strcmp(command,"@objrandomizeroom")
		|| !strcmp(command,"@objtrigfromroom")
		|| !strcmp(command,"@objlighthrsleft")
		|| !strcmp(command,"@objnumbercoins")
		|| !strcmp(command,"@objcointype")
		|| !strcmp(command,"@objspelllevel")
		|| !strcmp(command,"@objspell1")
		|| !strcmp(command,"@objspell2")
		|| !strcmp(command,"@objspell3")
		|| !strcmp(command,"@objmaxcharge")
		|| !strcmp(command,"@objnumcharge")
		|| !strcmp(command,"@objchargedelay")
		|| !strcmp(command,"@objtrapcharges")
		|| !strcmp(command,"@objtraptype")
		|| !strcmp(command,"@objtraplevel")
		|| !strcmp(command,"@objtrapflag")
		|| !strcmp(command,"@objtreasuretype")
		|| !strcmp(command,"@objtreasurecond")
		|| !strcmp(command,"@objweaponcond")
		|| !strcmp(command,"@objweaponnumdice")
		|| !strcmp(command,"@objweaponsizedice")
		|| !strcmp(command,"@objweapontype")
		|| !strcmp(command,"@objpenusesleft"))
		{
		switch ( pObjIndex->item_type )
		{
			case ITEM_ARMOR:
				if(!strcmp(command,"@objcurrac"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				if(!strcmp(command,"@objorgac"))
				{
					pObjIndex->value[1]=atoi(buf);
				}
				break;
			case ITEM_CONTAINER:
				if(!strcmp(command,"@objcapacity"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				if(!strcmp(command,"@objcontainerflags"))
				{
					buf=One_Argument(buf,word);
					while(*word)
					{
						if((s=find_sub(subcontflag,word)))
						{
							strcpy(word,s);
						}

						if((i=get_cont_flag(word)) > -1)
							SET_BIT(pObjIndex->value[1], 1 << i);
						buf=One_Argument(buf,word);
					}
				}
				if(!strcmp(command,"@objkeyvnum"))
				{
					if(!strncmp(buf,"none",4))
					{
						pObjIndex->value[2]= -1;
						continue;
					}
					pObjIndex->value[2]=IN_VNUM(atoi(buf));
					if(pObjIndex->value[2] < area->low_o_vnum 
					|| pObjIndex->value[2] > area->hi_o_vnum)
					{
						if(pObjIndex->value[2] > 0)
							fprintf(axlog,"Key from outside the area for %d\n",
							pObjIndex->vnum);
					}
				}
				if(!strcmp(command,"@objcontainercondtn"))
				{
					pObjIndex->value[3]=atoi(buf);
				}
				break;
			case ITEM_DRINK_CON:
			case ITEM_FOUNTAIN:
				if(!strcmp(command,"@objdrinkcapacity"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				if(!strcmp(command,"@objdrinkquantity"))
				{
					pObjIndex->value[1]=atoi(buf);
				}
				if(!strcmp(command,"@objliquidtype"))
				{
					i=0;
					
					buf=One_Argument(buf,word);
					if((s=find_sub(subliquid,word)))
					{
						strcpy(word,s);
					}
					while(i < LIQ_MAX)
					{
						if(!strcmp(word,liq_table[i].liq_name))
						{
							pObjIndex->value[2]=i;
							break;
						}
						i++;
					}
					if(i == LIQ_MAX)
					{
						fprintf(axlog,"Unknown liquid %s\n",word);
					}
				}
				if(!strcmp(command,"@objliquidpoisonflag"))
				{
					pObjIndex->value[3]=atoi(buf);
				}
				break;
			case ITEM_BLOOD:
				if(!strcmp(command,"@objdrinkcapacity"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				if(!strcmp(command,"@objdrinkquantity"))
				{
					pObjIndex->value[1]=atoi(buf);
				}
				if(!strcmp(command,"@objliquidpoisonflag"))
				{ /* yep its three, not a boo boo */
					pObjIndex->value[3]=atoi(buf);
				}
				break;
			case ITEM_FOOD:
				if(!strcmp(command,"@objfoodvalue"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				if(!strcmp(command,"@objfoodcondition"))
				{
					pObjIndex->value[1]=atoi(buf);
				}
				if(!strcmp(command,"@objfoodpoisonflag"))
				{
					pObjIndex->value[3]=atoi(buf);
				}
				break;
			case ITEM_HERB:
				if(!strcmp(command,"@objherbdoses"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				if(!strcmp(command,"@objherbname"))
				{
					i=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subherb,word)))
					{
						strcpy(word,s);
					}
					while(i < top_herb)
					{
						if(!strcmp(word,herb_table[i]->name))
						{
							pObjIndex->value[2]=i;
							break;
						}
						i++;
					}
					if(i == top_herb)
					{
						fprintf(axlog,"Unknown herb %s\n",buf);
					}
				}
				break;
			case ITEM_KEY:
				if(!strcmp(command,"@objkeylockvnum"))
				{
					pObjIndex->value[0]=IN_VNUM(atoi(buf));
				}
				break;
			case ITEM_LEVER:
			case ITEM_SWITCH:
			case ITEM_BUTTON:
				if(!strcmp(command,"@objtriggerflags"))
				{
					buf=One_Argument(buf,word);
					while(*word)
					{
						if((s=find_sub(subtrigger,word)))
						{
							strcpy(word,s);
						}
						if((i=get_trigflag(word)) > -1)
						{
							SET_BIT(pObjIndex->value[0],1 << i);
						}
						else
			        		{
							fprintf(axlog,"Unknown triggerflag: %s\n",word);
						}	
						buf=One_Argument(buf,word);
					}
					continue;
				}
				if ( IS_SET( pObjIndex->value[0], TRIG_TELEPORT )
				||   IS_SET( pObjIndex->value[0], TRIG_TELEPORTALL )
				||   IS_SET( pObjIndex->value[0], TRIG_TELEPORTPLUS ) )
				{
					if(!strcmp(command,"@objtrigtoroom"))
					{
						pObjIndex->value[1]=IN_VNUM(atoi(buf));
					}
					break;
				}
				if ( IS_SET( pObjIndex->value[0], TRIG_RAND4 )
				    ||	 IS_SET( pObjIndex->value[0], TRIG_RAND6 ) )
				{
					if(!strcmp(command,"@objrandomizeroom"))
					{
						pObjIndex->value[1]=IN_VNUM(atoi(buf));
					}
					break;
				}
				if ( IS_SET( pObjIndex->value[0], TRIG_DOOR ) )
				{
					if(!strcmp(command,"@objtrigfromroom"))
					{
						pObjIndex->value[1]=IN_VNUM(atoi(buf));
					}
					if(!strcmp(command,"@objtrigtoroom"))
					{
						pObjIndex->value[2]=IN_VNUM(atoi(buf));
					}
				}

				break;
			case ITEM_LIGHT:
				if(!strcmp(command,"@objlighthrsleft"))
				{
					pObjIndex->value[2]=IN_VNUM(atoi(buf));
				}
				break;
			case ITEM_GOLD:
				if(!strcmp(command,"@objnumbercoins"))
				{
					pObjIndex->value[1]=GOLDADJ(atoi(buf));
				}
				if(!strcmp(command,"@objcointype"))
				{
					pObjIndex->value[2]=atoi(buf);
				}
				break;
			case ITEM_PILL:
			case ITEM_POTION:
			case ITEM_SCROLL:
				if(!strcmp(command,"@objspelllevel"))
				{
					pObjIndex->value[0]=IN_LEVEL(atof(buf));
				}
				if(!strcmp(command,"@objspell1"))
				{
					i=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subspell,word)))
					{
						strcpy(word,s);
					}
					while(i < top_sn)
					{
						if(!strcmp(word,skill_table[i]->name))
						{
							pObjIndex->value[1]=i;
							break;
						}
						i++;
					}
					if(i == top_sn)
					{
						fprintf(axlog,"Unknown spell %s\n",buf);
					}
				}
				if(!strcmp(command,"@objspell2"))
				{
					i=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subspell,word)))
					{
						strcpy(word,s);
					}
					while(i < top_sn)
					{
						if(!strcmp(word,skill_table[i]->name))
						{
							pObjIndex->value[2]=i;
							break;
						}
						i++;
					}
					if(i == top_sn)
					{
						fprintf(axlog,"Unknown spell %s\n",buf);
					}
				}
				if(!strcmp(command,"@objspell3"))
				{
					i=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subspell,word)))
					{
						strcpy(word,s);
					}
					while(i < top_sn)
					{
						if(!strcmp(word,skill_table[i]->name))
						{
							pObjIndex->value[3]=i;
							break;
						}
						i++;
					}
					if(i == top_sn)
					{
						fprintf(axlog,"Unknown spell %s\n",buf);
					}
				}
	    			break;
			case ITEM_STAFF:
			case ITEM_WAND:
				if(!strcmp(command,"@objspelllevel"))
				{
					pObjIndex->value[0]=IN_LEVEL(atof(buf));
				}
				if(!strcmp(command,"@objmaxcharge"))
				{
					pObjIndex->value[1]=atoi(buf);
				}
				if(!strcmp(command,"@objnumcharge"))
				{
					pObjIndex->value[2]=atoi(buf);
				}
				if(!strcmp(command,"@objspell1"))
				{
					i=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subspell,word)))
					{
						strcpy(word,s);
					}
					while(i < top_sn)
					{
						if(!strcmp(word,skill_table[i]->name))
						{
							pObjIndex->value[3]=i;
							break;
						}
						i++;
					}
					if(i == top_sn)
					{
						fprintf(axlog,"Unknown spell %s\n",buf);
					}
				}
	    			break;
			case ITEM_SALVE:
				if(!strcmp(command,"@objspelllevel"))
				{
					pObjIndex->value[0]=IN_LEVEL(atof(buf));
				}
				if(!strcmp(command,"@objmaxcharge"))
				{
					pObjIndex->value[1]=atoi(buf);
				}
				if(!strcmp(command,"@objnumcharge"))
				{
					pObjIndex->value[2]=atoi(buf);
				}
				if(!strcmp(command,"@objchargedelay"))
				{
					pObjIndex->value[3]=atoi(buf);
				}
				if(!strcmp(command,"@objspell1"))
				{
					i=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subspell,word)))
					{
						strcpy(word,s);
					}
					while(i < top_sn)
					{
						if(!strcmp(word,skill_table[i]->name))
						{
							pObjIndex->value[4]=i;
							break;
						}
						i++;
					}
					if(i == top_sn)
					{
						fprintf(axlog,"Unknown spell %s\n",buf);
					}
				}
				if(!strcmp(command,"@objspell2"))
				{
					i=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subspell,word)))
					{
						strcpy(word,s);
					}
					while(i < top_sn)
					{
						if(!strcmp(word,skill_table[i]->name))
						{
							pObjIndex->value[5]=i;
							break;
						}
						i++;
					}
					if(i == top_sn)
					{
						fprintf(axlog,"Unknown spell %s\n",buf);
					}
				}
	    			break;
			case ITEM_TRAP:
				if(!strcmp(command,"@objtrapcharges"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				if(!strcmp(command,"@objtraptype"))
				{
					i=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subtraptype,word)))
					{
						strcpy(word,s);
					}
					while(ax_traps[i])
					{
						if(!strcmp(word,ax_traps[i]))
						{
							pObjIndex->value[1]=i;
							break;
						}
						i++;
					}
					if(!ax_traps[i])
					{
						fprintf(axlog,"Unknown traptype %s\n",buf);
					}
				}
				if(!strcmp(command,"@objtraplevel"))
				{
					pObjIndex->value[2]=IN_LEVEL(atof(buf));
				}
				if(!strcmp(command,"@objtrapflag"))
				{
					buf=One_Argument(buf,word);
					while(*word)
					{
						if((s=find_sub(subtrapflag,word)))
						{
							strcpy(word,s);
						}
						if((i=get_trapflag(word)) > -1)
						{
							SET_BIT(pObjIndex->value[3],1 << i);
						}
						else
			        		{
							fprintf(axlog,"Unknown trapflag: %s\n",word);
						}	
						buf=One_Argument(buf,word);
					}
					continue;
				}
				break;
			case ITEM_TREASURE:
				if(!strcmp(command,"@objtreasuretype"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				if(!strcmp(command,"@objtreasurecond"))
				{
					pObjIndex->value[1]=atoi(buf);
				}
				break;
			case ITEM_WEAPON:
				if(!strcmp(command,"@objweaponcond"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				if(!strcmp(command,"@objweaponnumdice"))
				{
					pObjIndex->value[1]=IN_DICE(atof(buf));
				}
				if(!strcmp(command,"@objweaponsizedice"))
				{
					pObjIndex->value[2]=IN_DICE(atof(buf));
				}
				if(!strcmp(command,"@objweapontype"))
				{
					i=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subweapontype,word)))
					{
						strcpy(word,s);
					}
					while(i < MAX_WEAPONTYPE)
					{
						if(!strcmp(word,attack_table[i]))
						{
							pObjIndex->value[3]=i;
							break;
						}
						i++;
					}
					if(i == MAX_WEAPONTYPE)
					{
						fprintf(axlog,"Unknown weapontype %s\n",word);
					}
				}
				break;
			case ITEM_PEN:
				if(!strcmp(command,"@objpenusesleft"))
				{
					pObjIndex->value[0]=atoi(buf);
				}
				break;
			case ITEM_FURNITURE:
			case ITEM_TRASH:
			case ITEM_PAPER:
			case ITEM_BOAT:
			case ITEM_FIRE:
			case ITEM_WORN:
			case ITEM_BOOK:
				break;
			default:
                                display(o_types[pObjIndex->item_type]);
				display("-Unknown itemtype for values\n\r");
				fprintf(axlog,"Unknown itemtype in switch\n");
				break;

		}
		continue;
		}

		if(!strcmp(command,"@objweight"))
		{
			pObjIndex->weight=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@objcost"))
		{
			pObjIndex->gold_cost=GOLDADJ(atoi(buf));
			continue;
		}
		if(!strcmp(command,"@objrent"))
		{
			pObjIndex->rent=GOLDADJ(atoi(buf));
			continue;
		}
		if(!strcmp(command,"@objextradesc"))
		{
			EXTRA_DESCR_DATA *ed;

			CREATE( ed, EXTRA_DESCR_DATA, 1 );
			ed->keyword		= STRALLOC(buf);
			ed->description		= fread_string( fp );
			LINK( ed, pObjIndex->first_extradesc, 
				pObjIndex->last_extradesc, next, prev );
			top_ed++;
			continue;
		}

		if(!strcmp(command,"@objaffects"))
		{
			AFFECT_DATA *paf;

			buf=One_Argument(buf,word);
			if((s=find_sub(subobjaffects,word)))
			{
				strcpy(word,s);
			}
			CREATE( paf, AFFECT_DATA, 1 );
			paf->type		= -1;
			paf->duration		= -1;
			i=0;
			while(i < MAX_APPLY_TYPE)
			{
				if(!strcmp(word,a_types[i]))
				{
					paf->location=i;
					break;
				}
				i++;
			}
			if(i == MAX_APPLY_TYPE)
			{
				fprintf(axlog,"Unknown objaffects %s\n",word);
				DISPOSE(paf);
				continue;
			}
#ifdef SMAUG102
			paf->bitvector		= 0;
#endif
#ifdef SMAUG14
			xCLEAR_BITS(paf->bitvector);
#endif
			paf->modifier		= atoi(buf);
			LINK( paf, pObjIndex->first_affect, pObjIndex->last_affect,
			   next, prev );
			top_affect++;
			continue;
		}
		if(!strcmp(command,"@objaffectris"))
		{
			AFFECT_DATA *paf;

			buf=One_Argument(buf,word);
			if((s=find_sub(subobjaffects,word)))
			{
				strcpy(word,s);
			}
			CREATE( paf, AFFECT_DATA, 1 );
			paf->type		= -1;
			paf->duration		= -1;
			i=0;

			while(i < MAX_APPLY_TYPE)
			{
				if(!strcmp(word,a_types[i]))
				{
					paf->location=i;
					break;
				}
				i++;
			}
			if(i == MAX_APPLY_TYPE)
			{
				fprintf(axlog,"Unknown objapplytype %s\n",word);
				DISPOSE(paf);
				continue;
			}
#ifdef SMAUG102
			paf->bitvector		= 0;
#endif
#ifdef SMAUG14
			xCLEAR_BITS(paf->bitvector);
#endif
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subrisflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_risflag(word)) < 0)
				{
					fprintf(axlog,"Unknown objapplyris %s\n",word);
					DISPOSE(paf);
					buf=One_Argument(buf,word);
					continue;
				}
				SET_BIT(paf->modifier,1 << i);
				LINK( paf, pObjIndex->first_affect, 
					pObjIndex->last_affect,
					   next, prev );
				top_affect++;
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@objapplyaffect"))
		{
			AFFECT_DATA *paf;

			buf=One_Argument(buf,word);
			if((s=find_sub(subobjaffects,word)))
			{
				strcpy(word,s);
			}
			CREATE( paf, AFFECT_DATA, 1 );
			paf->type		= -1;
			paf->duration		= -1;
			i=0;

			while(i < MAX_APPLY_TYPE)
			{
				if(!strcmp(word,a_types[i]))
				{
					paf->location=i;
					break;
				}
				i++;
			}
			if(i == MAX_APPLY_TYPE)
			{
				fprintf(axlog,"Unknown objapplytype %s\n",word);
				DISPOSE(paf);
				continue;
			}
#ifdef SMAUG102
			paf->bitvector		= 0;
#endif
#ifdef SMAUG14
			xCLEAR_BITS(paf->bitvector);
#endif
			if((s=find_sub(subaffected,buf)))
			{
				strcpy(buf,s);
			}
			if((i=get_aflag(buf)) < 0)
			{
				fprintf(axlog,"Unknown objapplyaffect %s\n",buf);
				DISPOSE(paf);
				continue;
			}
			SET_BIT(paf->modifier,1 << i);
			LINK( paf, pObjIndex->first_affect, pObjIndex->last_affect,
			   next, prev );
			top_affect++;
			continue;
		}
		if(!strcmp(command,"@objcastspell"))
		{
			AFFECT_DATA *paf;

			buf=One_Argument(buf,word);
			if((s=find_sub(subobjaffects,word)))
			{
				strcpy(word,s);
			}
			CREATE( paf, AFFECT_DATA, 1 );
			paf->type		= -1;
			paf->duration		= -1;
			i=0;

			while(i < MAX_APPLY_TYPE)
			{
				if(!strcmp(word,a_types[i]))
				{
					paf->location=i;
					break;
				}
				i++;
			}
			if(i == MAX_APPLY_TYPE)
			{
				fprintf(axlog,"Unknown objapplytype %s\n",word);
				DISPOSE(paf);
				continue;
			}
#ifdef SMAUG102
			paf->bitvector		= 0;
#endif
#ifdef SMAUG14
			xCLEAR_BITS(paf->bitvector);
#endif
			buf=One_Argument(buf,word);
			if((s=find_sub(subspell,word)))
			{
				strcpy(word,s);
			}
			i=0;
			while(i < top_sn)
			{
				if(!strcmp(word,skill_table[i]->name))
				{
					break;
				}
				i++;
			}
			if(i==top_sn)
			{
				fprintf(axlog,"Unknown objcastspell %s\n",word);
				DISPOSE(paf);
				continue;
			}
			paf->modifier=i;
			LINK( paf, pObjIndex->first_affect, pObjIndex->last_affect,
			   next, prev );
			top_affect++;
			continue;
		}
		if(!strcmp(command,"@objprograms"))
		{
    			MPROG_DATA	*mprog = NULL;
			char *prog;
			int err=0;
			char progbuf[MAX_STRING_LENGTH];
			
			while(fgets(buff,1000,fp))
			{

				if(strrchr(buff,'\n'))
					*(strrchr(buff,'\n'))=0;
				if(strrchr(buff,'~'))
					*(strrchr(buff,'~'))=' ';
				buf=strip_cr(buff);
				buf=One_Argument(buf,word);
				if(!strcmp(word,">"))
				{
					err=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subprogtrig,word)))
					{
						strcpy(word,s);
					}
					i = mprog_name_to_type(word);
					if(i==ERROR_PROG)
					{
						err=1;
						fprintf(axlog,"Unknown obj prog trigger %s\n",word);
						continue;
					}
					if(pObjIndex->mudprogs)
					{
						mprog->comlist=STRALLOC(progbuf);
					   	CREATE( mprog->next, MPROG_DATA, 1 );
					   	mprog = mprog->next;
					}
					else
					{
						CREATE( mprog, MPROG_DATA, 1 ); 
						pObjIndex->mudprogs=mprog;
					}
					progbuf[0]=0;
					mprog->type=i;
#ifdef SMAUG14
					xSET_BIT(pObjIndex->progtypes,mprog->type);
#else
					pObjIndex->progtypes = pObjIndex->progtypes | mprog->type;
#endif
					mprog->arglist=STRALLOC(buf);

				}
				else if(!strcmp(word,"|"))
				{
					mprog->comlist=STRALLOC(progbuf);
					mprog->next = NULL;
					break;
				}
				else
				{
					if(err)
					{
						continue;
					}
					sprintf(progbuf + strlen(progbuf),"%s\n",buff);
				}
			}
	  		for ( mprog = pObjIndex->mudprogs; mprog; mprog = mprog->next )
			{
				prog=make_in_prog(mprog->comlist,
					pObjIndex->name,
					pObjIndex->vnum,
					area->low_o_vnum,
					area->hi_o_vnum,
					axlog);
				STRFREE(mprog->comlist);
				mprog->comlist=STRALLOC(prog);
			}
			continue;
		}
		if(!strcmp(command,"#ROOMS"))
		{
			continue;
		}
		if(!strcmp(command,"!roomvnum"))
		{
			CREATE(pRoomIndex,ROOM_INDEX_DATA,1);
			pRoomIndex->vnum=IN_VNUM(atoi(buf));
			pRoomIndex->area=area;
			iHash			= pRoomIndex->vnum % MAX_KEY_HASH;
			pRoomIndex->next	= room_index_hash[iHash];
			room_index_hash[iHash]	= pRoomIndex;
			top_room++;
			continue;
		}
		if(!strcmp(command,"@roomname"))
		{
			pRoomIndex->name = STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"@roomdescription"))
		{
			pRoomIndex->description=fread_string(fp);
			continue;
		}
		if(!strcmp(command,"@roomflags"))
		{
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subroomflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_rflag(word)) > -1)
				{
					SET_BIT(pRoomIndex->room_flags,1 << i);
				}
#ifdef DRAGONBANE
				else if((i=get_rflag2(word)) > -1)
				{
					SET_BIT(pRoomIndex->room_flag2,1 << i);
				}
#endif
				else
			        {
					fprintf(axlog,"Unknown room flag: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@roomsectortype"))
		{
			i=0;
			if((s=find_sub(subsector,buf)))
			{
				strcpy(buf,s);
			}
			while(ax_sector_names[i])
			{
				if(!strcmp(ax_sector_names[i],buf))
				{
					pRoomIndex->sector_type=i; 
					break;
				}
				i++;
			}
			if(!ax_sector_names[i])
			{
				fprintf(axlog,"Unknown roomsectortype %s\n",buf);
			}
			continue;
		}
		if(!strcmp(command,"@roomteleportdelay"))
		{
			pRoomIndex->tele_delay = atoi(buf);
			continue;
		}
		if(!strcmp(command,"@roomteleportvnum"))
		{
			pRoomIndex->tele_vnum = IN_VNUM(atoi(buf));
			continue;
		}
		if(!strcmp(command,"@roomtunnelcapacity"))
		{
			pRoomIndex->tunnel = atoi(buf);
			continue;
		}
#ifdef USED
		if(!strcmp(command,"@roommanatype"))
		{
			continue;
		}
		if(!strcmp(command,"@roommanaamount"))
		{
			continue;
		}
#endif
		if(!strcmp(command,"^roomexit"))
		{
			if((s=find_sub(subexitdir,buf)))
			{
				strcpy(buf,s);
			}
			if((door=get_dir(buf)) < 0 )
			{
				fprintf(axlog,"Unknown roomexit direction %s\n",buf);
				continue;
			}
			pExit = make_exit( pRoomIndex, NULL, door );
		  	pExit->vdir		= door;
		  	pExit->key		= -1;
			pExit->description = STRALLOC("");
			pExit->keyword = STRALLOC("");
		}
		if(!strcmp(command,"@roomexitdesc"))
		{
			if(door < 0) 
			{
				continue;
			}
			STRFREE(pExit->description);
			pExit->description = fread_string(fp);
			continue;
		}

		if(!strcmp(command,"@roomexitkeyword"))
		{
			if(door < 0) 
			{
				continue;
			}
			STRFREE(pExit->keyword);
			pExit->keyword = STRALLOC(buf);
			continue;
		}
		if(!strcmp(command,"@roomexitexitinfo"))
		{
			if(door < 0) 
			{
				continue;
			}
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subexitflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_exflag(word)) > -1)
				{
					SET_BIT(pExit->exit_info,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown room exitinfo flag: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@roomexitkey"))
		{
			if(door < 0) 
			{
				continue;
			}
			if(!strncmp(buf,"none",4))
                        {
				pExit->key = -1;
				continue;
			}
			pExit->key=IN_VNUM(atoi(buf));
			if(pExit->key < area->low_o_vnum 
			|| pExit->key > area->hi_o_vnum)
			{
				if(pExit->key > 0)
				fprintf(axlog,"Key from outside the area in room %d - exit %s",
					pRoomIndex->vnum,dir_name[door]);
			}
			continue;
		}
		if(!strcmp(command,"@roomexittovnum"))
		{
			if(door < 0) 
			{
				continue;
			}
			pExit->vnum=IN_VNUM(atoi(buf));
			continue;
		}
		if(!strcmp(command,"@roomexitdistance"))
		{
			if(door < 0) 
			{
				continue;
			}
			pExit->distance = atoi(buf);
			continue;
		}
		if(!strcmp(command,"@roomislinktoexternalarea"))
		{
			buf=One_Argument(buf,word);
			fprintf(axlog,"%s ",word);
			buf=One_Argument(buf,word);
			fprintf(axlog,"%d ",IN_VNUM(atoi(word)));
			fprintf(axlog,"%s\n",buf);
			if(noextlink)
			{
				extract_exit(pRoomIndex,pExit);
			}
			continue;
		}
		if(!strcmp(command,"@roomhaslinkfromexternalarea"))
		{
			buf=One_Argument(buf,word);
			fprintf(axlog,"%s ",word);
			buf=One_Argument(buf,word);
			fprintf(axlog,"%d ",IN_VNUM(atoi(word)));
			fprintf(axlog,"%s\n",buf);
			continue;
		}
		if(!strcmp(command,"@roomextradesckeywords"))
		{
			EXTRA_DESCR_DATA *ed;

			CREATE( ed, EXTRA_DESCR_DATA, 1 );
			ed->keyword		= STRALLOC(buf);
			ed->description		= fread_string( fp );
			LINK( ed, pRoomIndex->first_extradesc, 
				pRoomIndex->last_extradesc, next, prev );
			top_ed++;
			continue;
		}
		if(!strcmp(command,"@roomprograms"))
		{
    			MPROG_DATA	*mprog = NULL;
			char *prog;
			int err=0;
			char progbuf[MAX_STRING_LENGTH];
			
			while(fgets(buff,1000,fp))
			{

				if(strrchr(buff,'\n'))
					*(strrchr(buff,'\n'))=0;
				if(strrchr(buff,'~'))
					*(strrchr(buff,'~'))=' ';
				buf=strip_cr(buff);
				buf=One_Argument(buf,word);
				if(!strcmp(word,">"))
				{
					err=0;
					buf=One_Argument(buf,word);
					if((s=find_sub(subprogtrig,word)))
					{
						strcpy(word,s);
					}
					i = mprog_name_to_type(word);
					if(i==ERROR_PROG)
					{
						err=1;
						fprintf(axlog,"Unknown room prog trigger %s\n",word);
						continue;
					}
					if(pRoomIndex->mudprogs)
					{
						mprog->comlist=STRALLOC(progbuf);
					   	CREATE( mprog->next, MPROG_DATA, 1 );
					   	mprog = mprog->next;
					}
					else
					{
						CREATE( mprog, MPROG_DATA, 1 ); 
						pRoomIndex->mudprogs=mprog;
					}
					progbuf[0]=0;
					mprog->type=i;
#ifdef SMAUG14
					xSET_BIT(pRoomIndex->progtypes,mprog->type);
#else
					pRoomIndex->progtypes = pRoomIndex->progtypes | mprog->type;
#endif
					mprog->arglist=STRALLOC(buf);

				}
				else if(!strcmp(word,"|"))
				{
					mprog->comlist=STRALLOC(progbuf);
					mprog->next = NULL;
					break;
				}
				else
				{
					if(err)
					{
						continue;
					}
					sprintf(progbuf + strlen(progbuf),"%s\n",buff);
				}
			}
	  		for ( mprog = pRoomIndex->mudprogs; mprog; mprog = mprog->next )
			{
				prog=make_in_prog(mprog->comlist,
					pRoomIndex->name,
					pRoomIndex->vnum,
					area->low_r_vnum,
					area->hi_r_vnum,
					axlog);
				STRFREE(mprog->comlist);
				mprog->comlist=STRALLOC(prog);
			}
			continue;
		}
		if(!strcmp(command,"@roomexitwordcheck"))
		{
			char *d;
			int dir,found;
			EXIT_DATA *xit;
			d=pRoomIndex->description;
			d=one_argument(d,word); /* yeppers, the native one */
			while(*word)
			{
				if(!str_cmp(word,"n")
				|| !str_cmp(word,"e")
				|| !str_cmp(word,"w")
				|| !str_cmp(word,"s")
				|| !str_cmp(word,"u")
				|| !str_cmp(word,"d")
				|| !str_cmp(word,"ne")
				|| !str_cmp(word,"nw")
				|| !str_cmp(word,"se")
				|| !str_cmp(word,"sw")
				|| !str_cmp(word,"north")
				|| !str_cmp(word,"east")
				|| !str_cmp(word,"west")
				|| !str_cmp(word,"south")
				|| !str_cmp(word,"up")
				|| !str_cmp(word,"down")
				|| !str_cmp(word,"northeast")
				|| !str_cmp(word,"northwest")
				|| !str_cmp(word,"southeast")
				|| !str_cmp(word,"southwest"))
				{
					if(!str_cmp(word,"n"))
						strcpy(word,"north");
					if(!str_cmp(word,"e"))
						strcpy(word,"east");
					if(!str_cmp(word,"w"))
						strcpy(word,"west");
					if(!str_cmp(word,"s"))
						strcpy(word,"south");
					if(!str_cmp(word,"u"))
						strcpy(word,"up");
					if(!str_cmp(word,"d"))
						strcpy(word,"down");
					if(!str_cmp(word,"ne"))
						strcpy(word,"northeast");
					if(!str_cmp(word,"nw"))
						strcpy(word,"northwest");
					if(!str_cmp(word,"se"))
						strcpy(word,"southeast");
					if(!str_cmp(word,"sw"))
						strcpy(word,"southwest");
					dir=get_dir(word);
					found=0;
					for ( xit = pRoomIndex->first_exit; xit; xit = xit->next )
					{
						if(xit->vdir == dir)
						{
							found=1;
							break;
						}
					}
					if(!found)
					{
						fprintf(axlog,"******** Warning room %d has a reference to %s but has no exit that way\n",
							pRoomIndex->vnum,word);
						fprintf(axlog,"%s\n",strip_cr(pRoomIndex->description));
					}
				}
				d=one_argument(d,word);
			}
			continue;	
		}
		if(!strcmp(command,"#RESETS"))
		{
			continue;
		}
		if(!strcmp(command,"!mobresetvnum"))
		{
			letter='M';
			extra=0;
			arg1=IN_VNUM(atoi(buf));
			arg2=0;
			arg3=0;
			pMobIndex=get_mob_index(arg1);
			continue;
		}
		if(!strcmp(command,"@mobresetinroom"))
		{
			arg3=IN_VNUM(atoi(buf));
			continue;
		}
		if(!strcmp(command,"@mobresetlimit"))
		{
			arg2=atoi(buf);
			add_reset(area,letter,extra,arg1,arg2,arg3);
			continue;
		}
		if(!strcmp(command,"!objresetvnum"))
		{
			letter='O';
			extra=0;
			arg1=IN_VNUM(atoi(buf));
			arg2=0;
			arg3=0;
			pObjIndex=get_obj_index(arg1);
			continue;
		}
		if(!strcmp(command,"@objresetinroom"))
		{
			arg3=IN_VNUM(atoi(buf));
			continue;
		}
		if(!strcmp(command,"@objresetlimit"))
		{
			arg2=atoi(buf);
			add_reset(area,letter,extra,arg1,arg2,arg3);
			continue;
		}
		
		if(!strcmp(command,"!putobjvnum"))
		{
			letter='P';
			extra=0;
			arg1=IN_VNUM(atoi(buf));
			arg2=0;
			arg3=0;
			pObjIndex=get_obj_index(arg1);
			continue;
		}
		if(!strcmp(command,"@putobjinobjvnum"))
		{
			arg3=IN_VNUM(atoi(buf));
			continue;
		}
		if(!strcmp(command,"@putobjunderobjvnum"))
		{
			arg3=0;
			continue;
		}
		if(!strcmp(command,"@putobjresetlimit"))
		{
			arg2=atoi(buf);
			add_reset(area,letter,extra,arg1,arg2,arg3);
			continue;
		}
		if(!strcmp(command,"!equipobjvnum"))
		{
			letter='E';
			extra=0;
			arg1=IN_VNUM(atoi(buf));
			arg2=0;
			arg3=0;
			continue;
		}
		if(!strcmp(command,"@equipwearlocation"))
		{
			if((s=find_sub(subwearloc,buf)))
			{
				strcpy(buf,s);
			}
			if((i=get_wearloc(buf)) > -1)
			{
				arg3=i;
				add_reset(area,letter,extra,arg1,arg2,arg3);
			}
			else
			{
				fprintf(axlog,"Unknown equipwearlocation %s\n",buf);
			}
			continue;
		}
		if(!strcmp(command,"!doorinroomvnum"))
		{
			letter='D';
			extra=0;
			arg1=IN_VNUM(atoi(buf));
			arg2=0;
			arg3=0;
			continue;
		}
		if(!strcmp(command,"@doordirection"))
		{
			if((s=find_sub(subexitdir,buf)))
			{
				strcpy(buf,s);
			}
			if((i=get_dir(buf)) > -1 )
			{
				arg2=i;
			}
			else
			{
				fprintf(axlog,"Unknown reset doordirection %s\n",buf);
			}
			continue;
		}
		if(!strcmp(command,"@doorstate"))
		{
			if(i < 0) /* check if doordirection failed */
			{
				continue;
			}
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subexitflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_exflag(word)) > -1)
				{
					SET_BIT(arg3,1 << i);
				}
				else
			        {
					fprintf(axlog,"Unknown room exitinfo flag: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			add_reset(area,letter,extra,arg1,arg2,arg3);
			continue;
		}
		if(!strcmp(command,"!trapflag"))
		{
			letter='T';
			extra=0;
			arg2=0;
			arg3=0;
			buf=One_Argument(buf,word);
			while(*word)
			{
				if((s=find_sub(subtrapflag,word)))
				{
					strcpy(word,s);
				}
				if((i=get_trapflag(word)) > -1)
				{
					SET_BIT(extra,1 << i);
				}
				else
	        		{
					fprintf(axlog,"Unknown reset trapflag: %s\n",word);
				}	
				buf=One_Argument(buf,word);
			}
			continue;
		}
		if(!strcmp(command,"@traptype"))
		{
			i=0;
			buf=One_Argument(buf,word);
			if((s=find_sub(subtraptype,word)))
			{
				strcpy(word,s);
			}
			while(ax_traps[i])
			{
				if(!strcmp(word,ax_traps[i]))
				{
					arg1=i;
					break;
				}
				i++;
			}
			if(!ax_traps[i])
			{
				fprintf(axlog,"Unknown reset traptype %s\n",buf);
			}
			continue;
		}
		if(!strcmp(command,"@trapcharges"))
		{
			arg2=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@trapvnum"))
		{
			arg3=IN_VNUM(atoi(buf));
			add_reset(area,letter,extra,arg1,arg2,arg3);
			continue;
		}
		if(!strcmp(command,"!giveobj"))
		{
			letter='G';
			extra=0;
			arg1=IN_VNUM(atoi(buf));
			arg2=0;
			arg3=0;
			continue;
		}
		if(!strcmp(command,"@giveobjresetlimit"))
		{
			arg2=atoi(buf);
			add_reset(area,letter,extra,arg1,arg2,arg3);
			continue;
		}
		if(!strcmp(command,"!randomexitsforroom"))
		{
			letter='R';
			extra=0;
			arg1=IN_VNUM(atoi(buf));
			arg2=0;
			arg3=0;
			continue;
		}
		if(!strcmp(command,"@randomexitlastdoor"))
		{
			arg2=atoi(buf);
			add_reset(area,letter,extra,arg1,arg2,arg3);
			continue;
		}
		if(!strcmp(command,"#SHOPS"))
		{
			continue;
		}
		if(!strcmp(command,"!shopkeepervnum"))
		{
			CREATE(pShop,SHOP_DATA,1);
			pShop->keeper=IN_VNUM(atoi(buf));
			if ( (pMobIndex = get_mob_index(pShop->keeper)) != NULL )
			{
				pMobIndex->pShop=pShop;
			}
			else
			{
				DISPOSE(pShop);
			}
			buyslot=0;
			continue;
		}
		if(!strcmp(command,"@shoptradewith"))
		{
			continue;
		}
		if(!strcmp(command,"@shopbuys"))
		{
			if ( (pShop = pMobIndex->pShop) == NULL )
			{
	  			continue;
			}
			if(buyslot >= MAX_SHOP_BUY_SLOT)
			{
				continue;
			}
			buf=One_Argument(buf,word);
			if((s=find_sub(subobjtype,word)))
			{
				strcpy(word,s);
			}
			if((i=get_otype(word)) > -1)
			{
				pShop->buy_type[buyslot++]=i;
			}
			else
		        {
				fprintf(axlog,"Unknown shop objtype: %s\n",word);
			}	
			continue;
		}
		if(!strcmp(command,"@shoptype"))
		{
			/* this is purely documentary for the .aex */
			continue;
		}
		if(!strcmp(command,"@shopprofitbuy"))
		{
			if ( (pShop = pMobIndex->pShop) == NULL )
			{
	  			continue;
			}
			pShop->profit_buy=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@shopprofitsell"))
		{
			if ( (pShop = pMobIndex->pShop) == NULL )
			{
	  			continue;
			}
			pShop->profit_sell=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@shopopenhour"))
		{
			if ( (pShop = pMobIndex->pShop) == NULL )
			{
	  			continue;
			}
			pShop->open_hour=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@shopclosehour"))
		{
			if ( (pShop = pMobIndex->pShop) == NULL )
			{
	  			continue;
			}
			pShop->close_hour=atoi(buf);
			if ( !first_shop )
			{
	    			first_shop		= pShop;
			}
			else
			{
	    			last_shop->next	= pShop;
			}
			pShop->next = NULL;
			pShop->prev = last_shop;
			last_shop = pShop;
			top_shop++;
			continue;
		}
		if(!strcmp(command,"#REPAIRS"))
		{
			continue;
		}
		if(!strcmp(command,"!shoprepairvnum"))
		{
			CREATE(rShop,REPAIR_DATA,1);
			rShop->keeper=IN_VNUM(atoi(buf));
			if ( (pMobIndex = get_mob_index(rShop->keeper)) != NULL )
			{
				pMobIndex->rShop=rShop;
			}
			else
			{
				DISPOSE(rShop);
			}
			buyslot=0;
			continue;
		}
		if(!strcmp(command,"@shoprepairs"))
		{
			if ( (rShop = pMobIndex->rShop) == NULL )
			{
	  			continue;
			}
			if(buyslot >= MAX_SHOP_FIX_SLOT)
			{
				continue;
			}
			buf=One_Argument(buf,word);
			if((s=find_sub(subobjtype,word)))
			{
				strcpy(word,s);
			}
			if((i=get_otype(word)) > -1)
			{
				rShop->fix_type[buyslot++]=i;
			}
			else
		        {
				fprintf(axlog,"Unknown repair objtype: %s\n",word);
			}	
			continue;
		}
		if(!strcmp(command,"@shopprofitfix"))
		{
			if ( (rShop = pMobIndex->rShop) == NULL )
			{
	  			continue;
			}
			rShop->profit_fix=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@shoprepairtype"))
		{
			if ( (rShop = pMobIndex->rShop) == NULL )
			{
	  			continue;
			}
			i=0;
			while(ax_shoptypes[i])
			{
				if(!strcmp(buf,ax_shoptypes[i]))
				{
					break;
				}
				i++;
			}
			if(ax_shoptypes[i])
			{
				rShop->shop_type=atoi(buf);
			}
			else
			{
				fprintf(axlog,"Unknown shoprepairtype %s\n",buf);
			}
			continue;
		}
		if(!strcmp(command,"@shoprepairopenhour"))
		{
			if ( (rShop = pMobIndex->rShop) == NULL )
			{
	  			continue;
			}
			rShop->open_hour=atoi(buf);
			continue;
		}
		if(!strcmp(command,"@shoprepairclosehour"))
		{
			if ( (rShop = pMobIndex->rShop) == NULL )
			{
	  			continue;
			}
			rShop->close_hour=atoi(buf);
			if ( !first_repair )
			{
	    			first_repair = rShop;
			}
			else
			{
	    			last_repair->next = rShop;
			}
			rShop->next = NULL;
			rShop->prev = last_repair;
			last_repair = rShop;
			top_repair++;
			continue;
		}
		if(!strcmp(command,"#END"))
		{
			continue;
		}
		if(command[0]=='#' 
		|| command[0]=='!' 
		|| command[0]=='@') 
		{
			display("Unknown field ");
			display(command);
			display("\n\r");
			fprintf(axlog,"Unknown field: %s\n",command);
		}
        }
#ifdef SMAUG14
    /* initialize weather data - FB */
	CREATE(area->weather, WEATHER_DATA, 1);
    	area->weather->temp = 0;
    	area->weather->precip = 0;
    	area->weather->wind = 0;
    	area->weather->temp_vector = 0;
    	area->weather->precip_vector = 0;
    	area->weather->wind_vector = 0;
    	area->weather->climate_temp = 2;
    	area->weather->climate_precip = 2;
    	area->weather->climate_wind = 2;
    	area->weather->first_neighbor = NULL;
    	area->weather->last_neighbor = NULL;
    	area->weather->echo = NULL;
    	area->weather->echo_color = AT_GREY;
#endif
	sort_area(area,TRUE);
	reset_area(area);
	SET_BIT(area->status,AREA_LOADED);
	fix_exits();
	area_update();
        fBootDb=FALSE;
	fclose(axlog);
	fclose(fp);
	clean_subs();
	display("done\n\r");
}
void do_ax_export(CHAR_DATA *ch, char *argument)
{
    	RESET_DATA	*treset;
    	ROOM_INDEX_DATA	*room;
    	MOB_INDEX_DATA	*pMobIndex;
    	OBJ_INDEX_DATA	*pObjIndex;
    	MPROG_DATA	*mprog;
	OBJ_DATA        *obj;
    	EXIT_DATA	*xit;
    	EXTRA_DESCR_DATA *ed;
    	AFFECT_DATA	*paf;
    	SHOP_DATA	*pShop;
    	REPAIR_DATA	*pRepair;
    	AREA_DATA	*tarea;
    	char		 buf[MAX_STRING_LENGTH];
    	FILE		*fpout;
    	int		 vnum,i,currext;
    	int		 val0, val1, val2, val3, val4, val5;
	int 		lastobj=0;
	char 		filename[80];

	if(! *argument)
	{
		display(version);
		display("axexport <filename.aex>\n\r");
		return;
	}
        argument=one_argument(argument,filename);
	sprintf(buf,"../exchange/%s",filename);
	if((fpout=fopen(buf,"w"))==NULL)
	{
		display("Can't open ");
		display(buf);
		display("\n\r");
		return;	
	}
    	tarea=ch->in_room->area;	
    	sprintf( buf, "exporting %s...", tarea->filename );
	find_externals(tarea);
    	log_string_plus( buf, LOG_NORMAL, LEVEL_GREATER );
	startvnum=tarea->low_r_vnum;
        fprintf( fpout, "#EXPORTEDBY %s\n",strip_cr(version));
    	fprintf( fpout, "#AREANAME   %s\n", tarea->name );
    	fprintf( fpout, "#STARTVNUM   %d\n", startvnum );
	
    	fprintf( fpout, "#AUTHOR %s\n", tarea->author );
    	fprintf( fpout, "#SOFTRANGE %f %f\n", OUT_LEVEL(tarea->low_soft_range),
				     OUT_LEVEL(tarea->hi_soft_range));
    	fprintf( fpout, "#HARDRANGE %f %f\n",
		 		     OUT_LEVEL(tarea->low_hard_range),
			   	     OUT_LEVEL(tarea->hi_hard_range));
	fprintf(fpout, "#ROOMRANGE %d %d\n",
		OUT_VNUM(tarea->low_r_vnum),OUT_VNUM(tarea->hi_r_vnum));
	fprintf(fpout, "#MOBRANGE %d %d\n",
		OUT_VNUM(tarea->low_m_vnum),OUT_VNUM(tarea->hi_m_vnum)+addmobrange);
	fprintf(fpout, "#OBJRANGE %d %d\n",
		OUT_VNUM(tarea->low_o_vnum),OUT_VNUM(tarea->hi_o_vnum)+addobjrange);
    	if ( tarea->resetmsg )	/* Rennard */
		fprintf( fpout, "#RESETMSG %s\n", tarea->resetmsg );
    	if ( tarea->reset_frequency )
		fprintf( fpout, "#RESETFREQUENCY %d\n",
			tarea->reset_frequency );
#ifdef USED
	fprintf(fpout, "#RECALL %d\n",OUT_VNUM(tarea->recall));
#endif
	fprintf( fpout, "#AREAFLAGS %s\n", flag_string(tarea->flags,area_flags) );
	
    	fprintf( fpout, "#ECONOMY %d %d\n\n", tarea->high_economy, tarea->low_economy );
	
    	/* save mobiles */
    	fprintf( fpout, "#MOBILES\n" );
	newrange=tarea->hi_m_vnum+1;
	currext=0;
	for (vnum=extmob[currext];currext < top_extmob; vnum=extmob[currext])
//    	for ( vnum = tarea->low_m_vnum; vnum <= tarea->hi_m_vnum; vnum++ )
    	{
		currext++;
		if ( (pMobIndex = get_mob_index( vnum )) == NULL )
	  		continue;
#ifdef DRAGONBANE
        	if (IS_SET(pMobIndex->act,ACT_DELETED))
	  		continue;
#endif
		vnum=getmobext(tarea,vnum);
		fprintf( fpout, "!mobvnum %d\n",OUT_VNUM(vnum));
		fprintf( fpout, "@mobkeywordname %s\n",pMobIndex->player_name		);
		fprintf( fpout,	"@mobactionname %s\n",	pMobIndex->short_descr		);
		fprintf( fpout,	"@mobinroomname %s\n",	strip_cr(pMobIndex->long_descr)	);
		fprintf( fpout,	"@moblookdescription\n");
		fprintf( fpout, "%s\n",	strip_cr(pMobIndex->description));
        	fprintf( fpout,"~\n");
#ifdef DRAGONBANE
        	if(pMobIndex->talk)
		{
			fprintf( fpout,	"@mobtalkreply\n");
			fprintf(fpout,"%s\n",strip_cr(pMobIndex->talk));
       		 	fprintf( fpout,"~\n");
		}
#endif
#ifdef SMAUG102
		fprintf( fpout, "@mobactflags %s\n",flag_string(pMobIndex->act,act_flags));
#endif
#ifdef SMAUG14
		fprintf( fpout, "@mobactflags %s\n",ext_flag_string(&pMobIndex->act,act_flags));
#endif
#ifdef SMAUG102
		fprintf( fpout, "@mobaffectedby %s\n",flag_string(pMobIndex->affected_by,a_flags));
#endif
#ifdef SMAUG14
		fprintf( fpout, "@mobaffectedby %s\n",ext_flag_string(&pMobIndex->affected_by,a_flags));
#endif
		fprintf( fpout, "@mobalignment %f\n",(float) pMobIndex->alignment/MAX_ALIGNMENT);
		fprintf( fpout, "@moblevel %f\n",OUT_LEVEL(pMobIndex->level));
		fprintf( fpout, "@mobthac0 %d\n",pMobIndex->mobthac0);
		fprintf( fpout, "@mobarmorclass %f\n",(float)pMobIndex->ac/MAX_MOBARMORCLASS);
		fprintf( fpout, "@mobnumberofhitdice %f\n",OUT_DICE(pMobIndex->hitnodice));
		fprintf( fpout, "@mobsizeofhitdice %f\n",OUT_DICE(pMobIndex->hitsizedice));
		fprintf( fpout, "@mobplustohitdice %f\n",OUT_DICE(pMobIndex->hitplus));
		fprintf( fpout, "@mobnumberofdamagedice %f\n",OUT_DICE(pMobIndex->damnodice));
		fprintf( fpout, "@mobsizeofdamagedice %f\n",OUT_DICE(pMobIndex->damsizedice));
		fprintf( fpout, "@mobplustodamagedice %f\n",OUT_DICE(pMobIndex->damplus));
		fprintf( fpout, "@mobgold %d\n",pMobIndex->gold);
		fprintf( fpout, "@mobexperience %d\n",pMobIndex->exp);
		fprintf( fpout, "@mobposition %s\n",ax_position[pMobIndex->position]);
		fprintf( fpout, "@mobdefaultposition %s\n",ax_position[pMobIndex->defposition]);
		fprintf( fpout, "@mobsex %s\n",ax_sex[pMobIndex->sex]);
		fprintf( fpout, "@mobstrength %f\n",(float)pMobIndex->perm_str/MAX_PRIME_ATTRIB); 
		fprintf( fpout, "@mobintelligence %f\n",(float) pMobIndex->perm_int/MAX_PRIME_ATTRIB); 
		fprintf( fpout, "@mobwisdom %f\n",(float) pMobIndex->perm_wis/MAX_PRIME_ATTRIB); 
		fprintf( fpout, "@mobdexterity %f\n",(float) pMobIndex->perm_dex/MAX_PRIME_ATTRIB); 
		fprintf( fpout, "@mobconstitution %f\n",(float) pMobIndex->perm_con/MAX_PRIME_ATTRIB); 
		fprintf( fpout, "@mobcharisma %f\n",(float) pMobIndex->perm_cha/MAX_PRIME_ATTRIB); 
		fprintf( fpout, "@mobluck %f\n",(float) pMobIndex->perm_lck/MAX_PRIME_ATTRIB); 
		fprintf( fpout, "@mobsavevspoisondeath %d\n",
					pMobIndex->saving_poison_death);
		fprintf( fpout, "@mobsavevswand %d\n",
					pMobIndex->saving_wand);
		fprintf( fpout, "@mobsavevsparapetri %d\n",
					pMobIndex->saving_para_petri);
		fprintf( fpout, "@mobsavevsbreath %d\n",
					pMobIndex->saving_breath);
		fprintf( fpout, "@mobsavevsspellstaff %d\n",
					pMobIndex->saving_spell_staff);
#ifdef DRAGONBANE
		fprintf( fpout, "@mobsavevspsionic %d\n",
					pMobIndex->saving_psionics);
#endif
		fprintf( fpout, "@mobrace %s\n", npc_race[pMobIndex->race]);
		fprintf( fpout, "@mobclass %s\n", npc_class[pMobIndex->class]);
		if(pMobIndex->height)
			fprintf( fpout, "@mobheight %d\n", pMobIndex->height);
		if(pMobIndex->weight)
			fprintf( fpout, "@mobweight %d\n", pMobIndex->weight);
                fprintf( fpout, "@mobspeaks");
	    	for ( i = 0; lang_array[i] != LANG_UNKNOWN; i++ )
		{
	      	   	if (IS_SET(pMobIndex->speaks, lang_array[i]) )
	      		{
				fprintf(fpout, " %s", lang_names[i]);
			}
	      	}
		fprintf( fpout,"\n");
                fprintf( fpout, "@mobspeaking");
	    	for ( i = 0; lang_array[i] != LANG_UNKNOWN; i++ )
		{
	      	   	if (IS_SET(pMobIndex->speaking, lang_array[i]) )
	      		{
				fprintf(fpout, " %s", lang_names[i]);
			}
	      	}
		fprintf( fpout,"\n");
		fprintf( fpout, "@mobnumberofattacks %d\n", pMobIndex->numattacks);
#ifdef DRAGONBANE
                if(pMobIndex->hoard)
			fprintf( fpout, "@mobhoardroom %d\n", OUT_VNUM(pMobIndex->hoard));
		if(IS_SET(pMobIndex->act,ACT_STAYTERRAIN))
		{
			fprintf( fpout, "@mobstayterraintype %s\n", 
				ax_sector_names[pMobIndex->terrain]);
		}
#endif
		fprintf( fpout, "@mobhitroll %d\n", pMobIndex->hitroll);
		fprintf( fpout, "@mobdamageroll %d\n", pMobIndex->damroll);
		fprintf( fpout, "@mobbodyparts %s\n", flag_string(pMobIndex->xflags,part_flags) );
		fprintf( fpout, "@mobisresistant %s\n", flag_string(pMobIndex->resistant,ris_flags) );
		fprintf( fpout, "@mobisimmune %s\n", flag_string(pMobIndex->immune,ris_flags) );
		fprintf( fpout, "@mobissusceptible %s\n", flag_string(pMobIndex->susceptible,ris_flags) );
#ifdef SMAUG102
		fprintf( fpout, "@mobattacks %s\n", flag_string(pMobIndex->attacks,attack_flags) );
#endif
#ifdef SMAUG14
		fprintf( fpout, "@mobattacks %s\n", ext_flag_string(&pMobIndex->attacks,attack_flags) );
#endif
#ifdef DRAGONBANE
		fprintf( fpout, "@mobattacks %s\n", flag_string(pMobIndex->attack2,attack2_flags) );
#endif
#ifdef SMAUG102
		fprintf( fpout, "@mobdefenses %s\n", flag_string(pMobIndex->defenses,defense_flags) );
#endif
#ifdef SMAUG14
		fprintf( fpout, "@mobdefenses %s\n", ext_flag_string(&pMobIndex->defenses,defense_flags) );
#endif
		if(pMobIndex->spec_fun)
			fprintf( fpout, "@mobspecial %s\n",lookup_spec(pMobIndex->spec_fun));
		if ( pMobIndex->mudprogs )
		{
			fprintf( fpout, "@mobprograms\n");
	  		for ( mprog = pMobIndex->mudprogs; mprog; mprog = mprog->next )
				fprintf( fpout, "> %s %s~\n%s~\n",
					mprog_type_to_name( mprog->type ),
					mprog->arglist, 
					strip_cr(make_out_prog(mprog->comlist)) );
	  		fprintf( fpout, "|\n" );	  
		}
    	}
	
    	/* save objects */
    	fprintf( fpout, "#OBJECTS\n" );
	newrange=tarea->hi_o_vnum + 1;
	currext=0;
	for (vnum=extobj[currext];currext < top_extobj; vnum=extobj[currext])
// 	for ( vnum = tarea->low_o_vnum; vnum <= tarea->hi_o_vnum; vnum++ )
    	{
		currext++;
		if ( (pObjIndex = get_obj_index( vnum )) == NULL )
	  		continue;
#ifdef DRAGONBANE
        	if (pObjIndex->item_type == ITEM_DELETED)
	  		continue;
#endif
		vnum=getobjext(tarea,vnum);
		if (!pObjIndex->item_type) /* no support for boards/mail at this time */
			continue;
		fprintf( fpout, "!objvnum %d\n",OUT_VNUM(vnum));
		for ( obj = first_object; obj; obj = obj->next )
		{
			if(obj->pIndexData->vnum == pObjIndex->vnum)
			{
				pObjIndex->level=obj->level;
				break;
			}
		}

		fprintf( fpout, "@objlevel %f\n",OUT_LEVEL(pObjIndex->level));
		fprintf( fpout, "@objkeywordname %s\n",	pObjIndex->name);
		fprintf( fpout, "@objinventoryname %s\n",pObjIndex->short_descr);
		fprintf( fpout, "@objinroomname %s\n",pObjIndex->description);
		fprintf( fpout, "@objactiondescription %s\n",pObjIndex->action_desc);
		fprintf( fpout, "@objitemtype %s\n",o_types[pObjIndex->item_type]);
#ifdef SMAUG102
		fprintf( fpout, "@objflags %s\n", flag_string(pObjIndex->extra_flags,o_flags) );
#endif
#ifdef SMAUG14
		fprintf( fpout, "@objflags %s\n", ext_flag_string(&pObjIndex->extra_flags,o_flags) );
#endif
		fprintf( fpout, "@objflags %s\n", flag_string(pObjIndex->magic_flags,mag_flags) );
		fprintf( fpout, "@objwearflags %s\n", flag_string(pObjIndex->wear_flags,w_flags) );
		fprintf( fpout, "@objwearlayers %s\n",flag_string(pObjIndex->layers,ax_layers));


                val0=pObjIndex->value[0];
                val1=pObjIndex->value[1];
                val2=pObjIndex->value[2];
                val3=pObjIndex->value[3];
                val4=pObjIndex->value[4];
                val5=pObjIndex->value[5];

		switch ( pObjIndex->item_type )
		{
			case ITEM_ARMOR:
				fprintf( fpout, "@objcurrac %d\n",val0);
				fprintf( fpout, "@objorgac %d\n",val1);
				break;
			case ITEM_CONTAINER:
				fprintf( fpout, "@objcapacity %d\n",val0);
				if(val1 > 0)
				fprintf( fpout, "@objcontainerflags %s\n",flag_string(val1,axcontainer_flags));
                                if(val2 > 0)
				  fprintf( fpout, "@objkeyvnum %d\n",OUT_VNUM(val2));
				else
				  fprintf( fpout, "@objkeyvnum none\n");
                           
				fprintf( fpout, "@objcontainercondtn %d\n",val3);
				break;
			case ITEM_DRINK_CON:
			case ITEM_FOUNTAIN:
				fprintf( fpout, "@objdrinkcapacity %d\n",val0);
				fprintf( fpout, "@objdrinkquantity %d\n",val1);
				fprintf( fpout, "@objliquidtype '%s'\n",liq_table[val2].liq_name);
				fprintf( fpout, "@objliquidpoisonflag %d\n",val3);
			case ITEM_BLOOD:
				fprintf( fpout, "@objdrinkcapacity %d\n",val0);
				fprintf( fpout, "@objdrinkquantity %d\n",val1);
				fprintf( fpout, "@objliquidpoisonflag %d\n",val3);
				break;
			case ITEM_FOOD:
				fprintf( fpout, "@objfoodvalue %d\n",val0);
				fprintf( fpout, "@objfoodcondition %d\n",val1);
				fprintf( fpout, "@objfoodpoisonflag %d\n",val3);
				break;
			case ITEM_HERB:
				fprintf( fpout, "@objherbdoses %d\n",val1);
				fprintf( fpout, "@objherbname %s\n",herb_table[val2]->name);
				break;
			case ITEM_KEY:
				fprintf( fpout, "@objkeylockvnum %d\n",OUT_VNUM(val0));
				break;
			case ITEM_LEVER:
			case ITEM_SWITCH:
			case ITEM_BUTTON:
				fprintf( fpout, "@objtriggerflags %s\n", flag_string(val0,trig_flags) );
				if ( IS_SET( val0, TRIG_TELEPORT )
				||   IS_SET( val0, TRIG_TELEPORTALL )
				||   IS_SET( val0, TRIG_TELEPORTPLUS ) )
				{
					fprintf( fpout, "@objtrigtoroom %d\n", OUT_VNUM(val1));
					break;
				}
				if ( IS_SET( val0, TRIG_RAND4 )
				    ||	 IS_SET( val0, TRIG_RAND6 ) )
				{
					fprintf( fpout, "@objrandomizeroom %d\n", OUT_VNUM(val1));
					break;
				}
				if ( IS_SET( val0, TRIG_DOOR ) )
				{
					fprintf( fpout, "@objtrigfromroom %d\n", OUT_VNUM(val1));
					fprintf( fpout, "@objtrigtoroom %d\n", OUT_VNUM(val2));
				}

				break;
			case ITEM_LIGHT:
				fprintf( fpout, "@objlighthrsleft %d\n",val2);
				break;
			case ITEM_GOLD:
				fprintf( fpout, "@objnumbercoins %d\n",val1);
				fprintf( fpout, "@objcointype %d\n",val2);
				break;
			case ITEM_PILL:
			case ITEM_POTION:
			case ITEM_SCROLL:
				fprintf( fpout, "@objspelllevel %f\n",OUT_LEVEL(pObjIndex->value[0]));
	    			if ( IS_VALID_SN(val1) ) 
					fprintf( fpout, "@objspell1 '%s'\n",skill_table[val1]->name);
	    			if ( IS_VALID_SN(val2) ) 
					fprintf( fpout, "@objspell2 '%s'\n",skill_table[val2]->name);
	    			if ( IS_VALID_SN(val3) ) 
					fprintf( fpout, "@objspell3 '%s'\n",skill_table[val3]->name);
	    			break;
			case ITEM_STAFF:
			case ITEM_WAND:
				fprintf( fpout, "@objspelllevel %f\n",OUT_LEVEL(pObjIndex->value[0]));
				fprintf( fpout, "@objmaxcharge %d\n",val1);
				fprintf( fpout, "@objnumcharge %d\n",val2);
	    			if ( IS_VALID_SN(val3) ) 
					fprintf( fpout, "@objspell1 '%s'\n",skill_table[val3]->name);
	    			break;
			case ITEM_SALVE:
				fprintf( fpout, "@objspelllevel %f\n",OUT_LEVEL(pObjIndex->value[0]));
				fprintf( fpout, "@objmaxcharge %d\n",val1);
				fprintf( fpout, "@objnumcharge %d\n",val2);
				fprintf( fpout, "@objchargedelay %d\n",val3);
	    			if ( IS_VALID_SN(val4) ) 
					fprintf( fpout, "@objspell1 '%s'\n",skill_table[val4]->name);
	    			if ( IS_VALID_SN(val5) ) 
					fprintf( fpout, "@objspell2 '%s'\n",skill_table[val5]->name);
	    			break;
			case ITEM_TRAP:
				fprintf( fpout, "@objtrapcharges %d\n",val0);
				fprintf( fpout, "@objtraptype %s\n",ax_traps[val1]);
				fprintf( fpout, "@objtraplevel %f\n",OUT_LEVEL(val2));
				fprintf( fpout, "@objtrapflag %s\n",flag_string(val3,trap_flags));
				break;
			case ITEM_TREASURE:
				fprintf( fpout, "@objtreasuretype %d\n",val0);
				fprintf( fpout, "@objtreasurecond %d\n",val1);
				break;
			case ITEM_WEAPON:
				fprintf( fpout, "@objweaponcond %d\n",val0);
				fprintf( fpout, "@objweaponnumdice %f\n",OUT_DICE(val1));
				fprintf( fpout, "@objweaponsizedice %f\n",OUT_DICE(val2));
				fprintf( fpout, "@objweapontype %s\n",attack_table[val3]);
				break;
			case ITEM_PEN:
				fprintf( fpout, "@objpenusesleft %d\n",val0);
				break;
			case ITEM_FURNITURE:
			case ITEM_TRASH:
			case ITEM_PAPER:
			case ITEM_BOAT:
			case ITEM_FIRE:
			case ITEM_WORN:
			case ITEM_BOOK:
				break;
			default:
                                display(o_types[pObjIndex->item_type]);
				display("-Unknown itemtype for values\n\r");
				fprintf( fpout, "@objvalue0 %d\n",pObjIndex->value[0]);
				fprintf( fpout, "@objvalue1 %d\n",pObjIndex->value[1]);
				fprintf( fpout, "@objvalue2 %d\n",pObjIndex->value[2]);
				fprintf( fpout, "@objvalue3 %d\n",pObjIndex->value[3]);
				fprintf( fpout, "@objvalue4 %d\n",pObjIndex->value[4]);
				fprintf( fpout, "@objvalue5 %d\n",pObjIndex->value[5]);
				break;

		}
		fprintf( fpout, "@objweight %d\n",pObjIndex->weight);
		fprintf( fpout, "@objcost %d\n",pObjIndex->gold_cost);
		fprintf( fpout, "@objrent %d\n",pObjIndex->rent);

		for ( ed = pObjIndex->first_extradesc; ed; ed = ed->next )
		{
	   		fprintf( fpout, "@objextradesc %s\n",
				ed->keyword);
	   		fprintf( fpout, "%s\n",
				strip_cr( ed->description ));
			fprintf( fpout, "~\n");
		}

		for ( paf = pObjIndex->first_affect; paf; paf = paf->next )
		{
	  		if ( paf->location != APPLY_NONE && paf->modifier != 0 )
	  		{
				switch(paf->location)
				{
		    			default:
		        			fprintf( fpout, "@objaffects %s %d \n",
	    	        			a_types[paf->location],
		        			paf->modifier);
						break;
						break;
		    			case APPLY_RESISTANT:
		    			case APPLY_SUSCEPTIBLE:
		    			case APPLY_IMMUNE:
						fprintf( fpout, "@objaffectris %s %s\n",
	    					a_types[paf->location],
						flag_string(paf->modifier, ris_flags) );
						break;
                    			case APPLY_AFFECT:
#ifdef SMAUG102
						fprintf( fpout, "@objapplyaffect %s %s\n",
	    					a_types[paf->location],
						affect_bit_name(paf->modifier) );
#endif
#ifdef SMAUG14
						fprintf( fpout, "@objapplyaffect %s",
	    					a_types[paf->location]);
						for ( i = 0; i < 32 ; i++ )
						if ( IS_SET( paf->modifier, 1 << i ) )
						{
						  fprintf(fpout, " %s",a_flags[i]);
						}
						fprintf(fpout, "\n" );
#endif
						break;
		    			case APPLY_WEAPONSPELL:
		    			case APPLY_WEARSPELL:
		    			case APPLY_REMOVESPELL:
		        			fprintf( fpout, "@objcastspell %s '%s'\n",
	    	        			a_types[paf->location],
						IS_VALID_SN(paf->modifier) ? skill_table[paf->modifier]->name :
						"'unknown'");
						if(!IS_VALID_SN(paf->modifier))
							pager_printf(ch,"      &R unknown sn %d&w\n\r",
								paf->modifier);
						break;
                		}
			}
		}
		if ( pObjIndex->mudprogs )
		{
			fprintf( fpout, "@objprograms\n");
	  		for ( mprog = pObjIndex->mudprogs; mprog; mprog = mprog->next )
				fprintf( fpout, "> %s %s~\n%s~\n",
					mprog_type_to_name( mprog->type ),
					mprog->arglist,
					strip_cr(make_out_prog(mprog->comlist)) );
	  		fprintf( fpout, "|\n" );	  
		}
    	}

    /* save rooms   */
    	fprintf( fpout, "#ROOMS\n" );
        ax_exit(fpout,tarea,tarea->low_r_vnum,tarea->hi_r_vnum);
        ax_entrance(fpout,tarea,tarea->low_r_vnum,tarea->hi_r_vnum);
    	for ( vnum = tarea->low_r_vnum; vnum <= tarea->hi_r_vnum; vnum++ )
    	{
		if ( (room = get_room_index( vnum )) == NULL )
	  	continue;
#ifdef DRAGONBANE
        	if (room->sector_type == SECT_DELETED)
        	{
			continue;
		}
#endif
		fprintf( fpout, "!roomvnum %d\n",OUT_VNUM(vnum));
		fprintf( fpout, "@roomname %s\n",room->name);
		fprintf( fpout, "@roomdescription\n%s\n",strip_cr(room->description)	);
        	fprintf( fpout,"~\n");
		fprintf( fpout, "@roomflags %s\n",flag_string(room->room_flags,r_flags));
#ifdef DRAGONBANE
		fprintf( fpout, "@roomflags %s\n",flag_string(room->room_flag2,r_flag2));
#endif
		fprintf( fpout, "@roomsectortype %s\n",ax_sector_names[room->sector_type]);
        	fprintf( fpout, "@roomteleportdelay %d\n",room->tele_delay);
                if(room->tele_vnum)
        	  fprintf( fpout, "@roomteleportvnum %d\n",OUT_VNUM(room->tele_vnum));
        	fprintf( fpout, "@roomtunnelcapacity %d\n",room->tunnel);
		for ( xit = room->first_exit; xit; xit = xit->next )
		{
	   		if ( IS_SET(xit->exit_info, EX_PORTAL) ) /* don't fold portals */
				continue;
	   		fprintf( fpout, "^roomexit %s\n",dir_name[xit->vdir] );
	   		fprintf( fpout, "@roomexitdesc \n%s\n",strip_cr( xit->description ) );
        		fprintf( fpout,"~\n");
	   		fprintf( fpout, "@roomexitkeyword %s\n",strip_cr( xit->keyword ) );
	   		fprintf( fpout, "@roomexitexitinfo %s\n",flag_string(xit->exit_info & ~EX_BASHED,ex_flags));
                        if(xit->key > 0)
			  fprintf( fpout, "@roomexitkey %d\n",OUT_VNUM(xit->key));
                        else
			  fprintf( fpout, "@roomexitkey none\n");
			fprintf( fpout, "@roomexittovnum %d\n",OUT_VNUM(xit->vnum));
			fprintf( fpout, "@roomexitdistance %d\n",xit->distance);
/*
			if(xit->vnum < tarea->low_r_vnum || xit->vnum > tarea->hi_r_vnum)
				fprintf(fpout, "@roomislinktoexternalarea\n");
*/
		}	
		for ( ed = room->first_extradesc; ed; ed = ed->next )
		{
	   		fprintf( fpout, "@roomextradesckeywords %s\n", ed->keyword);
	   		fprintf( fpout, "%s\n",strip_cr( ed->description ));
	   		fprintf( fpout, "~\n");
		}
#ifdef SAVEMAPS
		if ( room->map )   /* maps */
		{
#ifdef OLDMAPS
	   	fprintf( fpout, "M\n" );
	   	fprintf( fpout, "%s~\n", strip_cr( room->map )	);
#endif
	   	fprintf( fpout, "M %d %d %d %c\n",	room->map->vnum
					      , room->map->x
					      , room->map->y
					      , room->map->entry );
		}
#endif
		if ( room->mudprogs )
		{
			fprintf( fpout, "@roomprograms\n");
	  		for ( mprog = room->mudprogs; mprog; mprog = mprog->next )
				fprintf( fpout, "> %s %s~\n%s~\n",
					mprog_type_to_name( mprog->type ),
					mprog->arglist, 
					strip_cr(make_out_prog(mprog->comlist)) );
	  		fprintf( fpout, "|\n" );	  
		}
		fprintf( fpout, "@roomexitwordcheck\n");
	}

    /* save resets   */
    	fprintf( fpout, "#RESETS\n" );
    	for ( treset = tarea->first_reset; treset; treset = treset->next )
    	{
		switch( treset->command ) /* extra arg1 arg2 arg3 */
		{
	  		default:  case '*': break;
	  		case 'm': case 'M':
                        	fprintf(fpout, "!mobresetvnum %d\n",OUT_VNUM(getmobext(tarea,treset->arg1)));
                        	fprintf(fpout, "@mobresetinroom %d\n",OUT_VNUM(treset->arg3));
                        	fprintf(fpout, "@mobresetlimit %d\n",treset->arg2);
				break;
	  		case 'o': case 'O':
                        	fprintf(fpout, "!objresetvnum %d\n",OUT_VNUM(getobjext(tarea,treset->arg1)));
				lastobj=getobjext(tarea,treset->arg1);
                        	fprintf(fpout, "@objresetinroom %d\n",OUT_VNUM(treset->arg3));
                        	fprintf(fpout, "@objresetlimit %d\n",treset->arg2);
				break;
	  		case 'p': case 'P':
                        	fprintf(fpout, "!putobjvnum %d\n",OUT_VNUM(getobjext(tarea,treset->arg1)));
				if(treset->arg3)
                        		fprintf(fpout, "@putobjinobjvnum %d\n",OUT_VNUM(getobjext(tarea,treset->arg3)));
				else
                        		fprintf(fpout, "@putobjunderobjvnum %d\n",OUT_VNUM(lastobj));
                        	fprintf(fpout, "@putobjresetlimit %d\n",treset->arg2);

				break;
	  		case 'e': case 'E':
                        	fprintf( fpout, "!equipobjvnum %d\n",OUT_VNUM(getobjext(tarea,treset->arg1)));
                        	fprintf( fpout,"@equipwearlocation %s\n",wear_locs[treset->arg3]);
				break;
	  		case 'd': case 'D':
                        	fprintf( fpout, "!doorinroomvnum %d\n",OUT_VNUM(treset->arg1));
                        	fprintf( fpout, "@doordirection %s\n",dir_name[treset->arg2]);
				fprintf( fpout, "@doorstate %s\n",flag_string(treset->arg3,ex_flags));
				break;
	  		case 't': case 'T':
				fprintf( fpout, "!trapflag %s\n",flag_string(treset->extra,trap_flags));
				fprintf( fpout, "@traptype %s\n",ax_traps[treset->arg1]);
				fprintf( fpout, "@trapcharges %d\n",treset->arg2);
				fprintf( fpout, "@trapvnum %d\n",OUT_VNUM(treset->arg3));
				break;
	  		case 'g': case 'G':
				fprintf(fpout ,"!giveobj %d\n",OUT_VNUM(getobjext(tarea,treset->arg1)));
                        	fprintf(fpout, "@giveobjresetlimit %d\n",treset->arg2);
				break;
	  		case 'r': case 'R':
				fprintf(fpout, "!randomexitsforroom %d\n",OUT_VNUM(treset->arg1));
				fprintf(fpout, "@randomexitlastdoor %d\n",treset->arg2);

				break;
		}

	}
    	/* save shops */
    	fprintf( fpout, "#SHOPS\n" );
    	for ( vnum = tarea->low_m_vnum; vnum <= tarea->hi_m_vnum; vnum++ )
    	{
		int keeper;

		if ( (pMobIndex = get_mob_index( vnum )) == NULL )
		  	continue;
		if ( (pShop = pMobIndex->pShop) == NULL )
	  		continue;
		keeper=getmobext(tarea,pShop->keeper);
		fprintf( fpout, "!shopkeepervnum %d\n",OUT_VNUM(keeper));
		fprintf( fpout, "@shoptradewith all\n");
		if(pShop->buy_type[0])
			fprintf( fpout, "@shopbuys %s\n",o_types[pShop->buy_type[0]]);
		if(pShop->buy_type[1])
			fprintf( fpout, "@shopbuys %s\n",o_types[pShop->buy_type[1]]);
		if(pShop->buy_type[2])
			fprintf( fpout, "@shopbuys %s\n",o_types[pShop->buy_type[2]]);
		if(pShop->buy_type[3])
			fprintf( fpout, "@shopbuys %s\n",o_types[pShop->buy_type[3]]);
		if(pShop->buy_type[4])
			fprintf( fpout, "@shopbuys %s\n",o_types[pShop->buy_type[4]]);
		
		fprintf( fpout, "@shoptype %s\n",ax_shoptypes[0]);
		fprintf( fpout, "@shopprofitbuy %d\n",pShop->profit_buy);
		fprintf( fpout, "@shopprofitsell %d\n",pShop->profit_sell);
		fprintf( fpout, "@shopopenhour %d\n",pShop->open_hour);
		fprintf( fpout, "@shopclosehour %d\n",pShop->close_hour);
    	}

    /* save repair shops */
    	fprintf( fpout, "#REPAIRS\n" );
    	for ( vnum = tarea->low_m_vnum; vnum <= tarea->hi_m_vnum; vnum++ )
    	{
		int keeper;

		if ( (pMobIndex = get_mob_index( vnum )) == NULL )
	  		continue;
		if ( (pRepair = pMobIndex->rShop) == NULL )
	  		continue;
		keeper=getmobext(tarea,pRepair->keeper);
		fprintf( fpout, "!shoprepairvnum %d\n",OUT_VNUM(keeper));
		if(pRepair->fix_type[0])
			fprintf( fpout, "@shoprepairs %s\n",o_types[pRepair->fix_type[0]]);
		if(pRepair->fix_type[1])
			fprintf( fpout, "@shoprepairs %s\n",o_types[pRepair->fix_type[1]]);
		if(pRepair->fix_type[2])
			fprintf( fpout, "@shoprepairs %s\n",o_types[pRepair->fix_type[2]]);
		fprintf( fpout, "@shopprofitfix %d\n",pRepair->profit_fix);
		fprintf( fpout, "@shoprepairtype %s\n",ax_shoptypes[pRepair->shop_type]);
		fprintf( fpout, "@shoprepairopenhour %d\n",pRepair->open_hour);
		fprintf( fpout, "@shoprepairclosehour %d\n",pRepair->close_hour);
    	}
#ifdef DONT_THINK_THIS_IS_NEEDED
    /* save specials */
    	fprintf( fpout, "#SPECIALS\n" );
    	for ( vnum = tarea->low_m_vnum; vnum <= tarea->hi_m_vnum; vnum++ )
    	{
		if ( (pMobIndex = get_mob_index( vnum )) == NULL )
	  		continue;
		if ( !pMobIndex->spec_fun )
	  		continue;
		fprintf( fpout, "!mobhasspecvnum %d\n",OUT_VNUM(vnum));
		fprintf( fpout, "@mobspecial %s\n",lookup_spec(pMobIndex->spec_fun));
    	}
#endif

    /* END */
    	fprintf( fpout, "#END\n" );
	fclose(fpout);
	display("done\n\r");
    	return;
}