Argila2.0/
Argila2.0/pp/
Argila2.0/pp/lib/save/objs/g/
Argila2.0/pp/lib/save/player/g/
Argila2.0/pp/regions/
Argila2.0/pp/regions/Lscripts/
Argila2.0/pp/src/lib/
/** 
*	\file hash.c
*	Central Hash Module
*
*	This module reads object and mobile information from files, loads objects
*	and mobiles, sets up spawn points and refreshes zones.
*
*	Copyright 2005, Mary C. Huston, All rights reserved.
*	Copyright (C) 2004, Shadows of Isildur: Traithe	
*
*	The program(s) may be used and/or copied only with written
*	permission or in accordance with the terms and conditions
*	stipulated in the license from DIKU GAMMA (0.0) and SOI.
*
*	\author Mary Huston
*	\author Email:  auroness@gmail.com
*
******************************************************************************
*/
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <string.h>

#include "structs.h"
#include "protos.h"
#include "utils.h"
#include "decl.h"

extern struct 	char_data *character_list;
extern struct 	obj_data *object_list;
extern struct 	zone_data *zone_table;
extern char		*null_string;


CHAR_DATA *fread_mobile (int vnum, int zone, FILE *fp)
{
	int				i = 0;
	long			tmp = 0;
	long			tmp2 = 0;
	long			tmp3 = 0;
	long			clan1 = 0;
	long			clan2 = 0;
	long			num = 0;
	char			*p = NULL;
	char			*p2 = NULL;
	ROOM_DATA		*room = NULL;
	CHAR_DATA		*mob = NULL;
	char			buf [MAX_STRING_LENGTH] = {'\0'};
	char			buf2 [MAX_STRING_LENGTH] = {'\0'};
	int				mob_skills [MAX_SKILLS];
	char			peak_char = {'\0'};


	mob = new_char (0);		/* NPC */

	clear_char (mob);
	mob->mob->currency_type		= 0;	

	mob->mob->virtual		= vnum;
	mob->mob->zone			= zone;

	mob->mob->carcass_vnum		= 0;

#define CHECK_DOUBLE_DEFS 1
#ifdef CHECK_DOUBLE_DEFS
	if ( vtom (vnum) ) {
		snprintf (buf, MAX_STRING_LENGTH,  "Mob %d multiply defined!!", vnum);
		system_log(buf, TRUE);
	} else
#endif

	add_mob_to_hash (mob);

	mob->name = fread_string (fp);

	(void)one_argument (mob->name, buf);

	mob->tname = add_hash (CAP(buf));

	while ( (i = strlen (mob->name)) > 0 &&
			(mob->name [i - 1] == '\r' ||
			 mob->name [i - 1] == '\n') )
		mob->name [i - 1] = '\0';

	mob->short_descr	= fread_string (fp);

	while ( (i = strlen (mob->short_descr)) > 0 &&
			(mob->short_descr [i - 1] == '\r' ||
			 mob->short_descr [i - 1] == '\n') )
		mob->short_descr [i - 1] = '\0';

	mob->long_descr	= fread_string (fp);

	while ( (i = strlen (mob->long_descr)) > 0 &&
			(mob->long_descr [i - 1] == '\r' ||
			 mob->long_descr [i - 1] == '\n') )
		mob->long_descr [i - 1] = '\0';

	mob->description	= fread_string (fp);

	fscanf (fp, "%lu ", &tmp);
	mob->act = tmp;
	SET_BIT (mob->act, ACT_ISNPC);

	fscanf(fp, " %ld ", &tmp);
	mob->affected_by = tmp;

	fscanf(fp, " %ld ", &tmp);
	mob->offense = (int)tmp;
	fscanf(fp, " %ld ", &tmp);		/* Was defense */
	mob->race = (int) tmp;
	fscanf(fp, " %ld ", &tmp);
	mob->armor = (int)tmp;

	/* Need to reformat the following -- only need one var in the mob file for hp */

	fscanf(fp, " %ldd%ld+%ld ", &tmp, &tmp2, &tmp3);
	mob->max_hit = (int)tmp3;
	mob->hit = mob->max_hit;

	fscanf(fp, " %ldd%ld+%ld ", &tmp, &tmp2, &tmp3);
	mob->mob->damroll = (int)tmp3;
	mob->mob->damnodice = (int)tmp;
	mob->mob->damsizedice = (int)tmp2;

	mob->move = 50;
	mob->max_move = 50;

	fscanf (fp, " %ld ", &mob->time.birth);

	fscanf(fp, " %ld ", &tmp);
	mob->position = (int)tmp;

	fscanf(fp, " %ld ", &tmp);
	mob->default_pos = (int)tmp;

	fscanf(fp, " %ld ", &tmp);
	mob->sex = (int)tmp;

	fscanf (fp, " %ld ", &tmp);		/* Used for Regi's 7 econs for now*/
	mob->mob->merch_seven = (int)tmp;

	fscanf(fp, " %ld ", &tmp);
	mob->deity = (int)tmp;

	fscanf(fp, " %ld ", &tmp);		/* phys?  what's that? */
	mob->mob->vehicle_type = tmp;

	fscanf(fp, " %ld \n", &tmp);
	mob->hmflags = (int)tmp;

	fscanf (fp, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
			&mob->mob->skinned_vnum,
			&mob->circle,
			&mob->cell_1,
			&mob->mob->carcass_vnum,	
			&mob->cell_2,				/*Formerly defense_bonus - free */
			&mob->ppoints,
			&mob->natural_delay,
			&mob->mob->helm_room,
			&mob->body_type,
			&mob->poison_type,
			&mob->nat_attack_type,
			&mob->mob->access_flags,
			&mob->height,
			&mob->frame,
			&mob->mob->noaccess_flags,
			&mob->cell_3);

	fscanf (fp, "%d %d %d %d %d %d %d %d\n",
			&mob->str,
			&mob->intel,
			&mob->wil,
			&mob->aur,
			&mob->dex,
			&mob->con,
			&mob->speaks,
			&mob->agi);
 
	if (  mob->race == RACE_HUMAN) {
		  /* Humanoid NPCs. */
		mob->max_hit = 50 + mob->con * CONSTITUTION_MULTIPLIER;
		mob->hit = mob->max_hit;
	}

	fscanf (fp, "%d %d\n", &mob->flags, &mob->mob->currency_type);

	if ( IS_SET (mob->flags, FLAG_KEEPER) ) {

		mob->shop = get_perm (sizeof (SHOP_DATA));

		(void)fgets (buf, 256, fp);

		sscanf (buf, "%d %d %f %f %f %f %d\n",
				&mob->shop->shop_vnum,
				&mob->shop->store_vnum,
				&mob->shop->markup,
				&mob->shop->discount,
				&mob->shop->econ_markup1,
				&mob->shop->econ_discount1,
				&mob->shop->econ_flags1);

		if (mob->mob->merch_seven > 0) {
			fscanf (fp, "%f %f %d %f %f %d %f %f %d %f %f %d %f %f %d %f %f %d %d\n",
				&mob->shop->econ_markup2,
                                &mob->shop->econ_discount2,
                                &mob->shop->econ_flags2,
                                &mob->shop->econ_markup3,
                                &mob->shop->econ_discount3,
                                &mob->shop->econ_flags3,
                                &mob->shop->econ_markup4,
                                &mob->shop->econ_discount4,
                                &mob->shop->econ_flags4,
                                &mob->shop->econ_markup5,
                                &mob->shop->econ_discount5,
                                &mob->shop->econ_flags5,
                                &mob->shop->econ_markup6,
                                &mob->shop->econ_discount6,
                                &mob->shop->econ_flags6,
                                &mob->shop->econ_markup7,
                                &mob->shop->econ_discount7,
                                &mob->shop->econ_flags7,
				&mob->shop->nobuy_flags);
		} 
		else {
			fscanf (fp, "%f %f %d %f %f %d %d\n",
				&mob->shop->econ_markup2,
				&mob->shop->econ_discount2,
				&mob->shop->econ_flags2,
				&mob->shop->econ_markup3,
				&mob->shop->econ_discount3,	
				&mob->shop->econ_flags3,
				&mob->shop->nobuy_flags);
		}

		for ( i = 0; i <= MAX_DELIVERIES; i++ ) {
			num = fread_number(fp);
			if ( num == -1 )
				break;
			mob->shop->delivery [i] = num;
		}

		fscanf (fp, "%d %d %d %d %d %d %d %d %d %d\n",
				&mob->shop->trades_in [0],
				&mob->shop->trades_in [1],
				&mob->shop->trades_in [2],
				&mob->shop->trades_in [3],
				&mob->shop->trades_in [4],
				&mob->shop->trades_in [5],
				&mob->shop->trades_in [6],
				&mob->shop->trades_in [7],
				&mob->shop->trades_in [8],
				&mob->shop->trades_in [9]);

		if ( mob->shop->store_vnum && (room = vtor (mob->shop->store_vnum)) ) {
			SET_BIT (room->room_flags, STORAGE);
		}
	}
		
	for ( i = 0; i < MAX_SKILLS; i++ )
		mob_skills [i] = 0;

	for ( i = 0; i < (MAX_SKILLS / 10); i++ )
		fscanf (fp, "%d %d %d %d %d %d %d %d %d %d\n",
					&mob_skills [i * 10],
					&mob_skills [i * 10 + 1],
					&mob_skills [i * 10 + 2],
					&mob_skills [i * 10 + 3],
					&mob_skills [i * 10 + 4],
					&mob_skills [i * 10 + 5],
					&mob_skills [i * 10 + 6],
					&mob_skills [i * 10 + 7],
					&mob_skills [i * 10 + 8],
					&mob_skills [i * 10 + 9]);

	for ( i = 0; i < MAX_SKILLS; i++ ){
		mob->skills [i] = mob_skills [i];
	}
	

	mob->clans = fread_string (fp);
	
/*** Lua triggers ***/
   do {
	   while ( (peak_char = getc (fp)) == ' ' ||
			   peak_char == '\t' ||
			   peak_char == '\n')
		   ;
			   
		ungetc (peak_char, fp);
			   
		if ( peak_char != 'R' )
		   break;
			   
		larg_setup_mob_triggers(fp, mob);
			   
   } while (1);
		   
/***** end lua triggers ***/	
		   
	mob->time.played = 0;
	mob->time.logon  = time(0);

	mob->intoxication = 0;
	mob->hunger       = -1;
	mob->thirst       = -1;

	mob->tmp_str	= mob->str;
	mob->tmp_dex	= mob->dex;
	mob->tmp_intel	= mob->intel;
	mob->tmp_aur	= mob->aur;
	mob->tmp_wil	= mob->wil;
	mob->tmp_con	= mob->con;
	mob->tmp_agi	= mob->agi;

	mob->equip = NULL;

	mob->mob->virtual = vnum;

	mob->desc = 0;

	if ( mob->speaks == 0 ) {
		mob->skills [SKILL_SPEAK_WESTRON] = 100;
		mob->speaks = SKILL_SPEAK_WESTRON;
	}

	if ( !mob->skills [mob->speaks] )
		mob->skills [mob->speaks] = 100;

	if ( IS_SET (mob->act, ACT_DONTUSE) ) {
		SET_BIT (mob->flags, FLAG_AUTOFLEE);
		REMOVE_BIT (mob->act, ACT_DONTUSE);
	}

	p = mob->clans;
	p2 = p;
	mob->clans = str_dup ("");

	while ( *p2 ) {

		p = one_argument (p, buf);		/* flags     */
		p = one_argument (p, buf2);		/* clan name */

		if ( !*buf2 )
			break;

		add_clan_id (mob, buf2, buf);
	}

	if ( p2 && *p2 )
		mem_free (p2);

	if ( clan1 == 1 ) {
		clan1 = 0;
		SET_BIT (mob->act, ACT_WILDLIFE);
	}

	if ( clan2 == 1 ) {
		clan2 = 0;
		SET_BIT (mob->act, ACT_WILDLIFE);
	}

	if ( clan1 ) {
		snprintf (buf, MAX_STRING_LENGTH,  "%ld", clan1);
		add_clan_id (mob, buf,
						  GET_FLAG (mob, FLAG_LEADER_1) ? "leader" : "member");
		REMOVE_BIT (mob->flags, FLAG_LEADER_1);
	}

	if ( clan2 ) {
		snprintf (buf, MAX_STRING_LENGTH,  "%ld", clan2);
		add_clan_id (mob, buf,
						  GET_FLAG (mob, FLAG_LEADER_2) ? "leader" : "member");
		REMOVE_BIT (mob->flags, FLAG_LEADER_2);
	}

	fix_offense (mob);

	mob->max_mana = mob->aur * 5;
	mob->mana = mob->max_mana;

	return (mob);
}

CHAR_DATA *load_mobile (int vnum)
{
	CHAR_DATA		*proto = NULL;
	CHAR_DATA		*new_mobile = NULL;
	MOB_DATA		*mob_info = NULL;

	if ( !(proto = vtom (vnum)) )
		return NULL;


	new_mobile = new_char (0);		/* NPC */

	mob_info = new_mobile->mob;

	memcpy (new_mobile, proto, sizeof (CHAR_DATA));

	new_mobile->mob = mob_info;

	memcpy (new_mobile->mob, proto->mob, sizeof (MOB_DATA));

	/* A mostly unique number.  Can be used to ensure
	   the same mobile is being used between game plays.  */

	new_mobile->coldload_id = get_next_coldload_id (0);
	new_mobile->deleted = 0;

	new_mobile->next = character_list;
	character_list = new_mobile;

	new_mobile->time.birth = time (0);

	new_mobile->max_move = calc_lookup (new_mobile, REG_MISC, MISC_MAX_MOVE);

	if ( !new_mobile->height )
		make_height (new_mobile, 1);

	if ( !new_mobile->frame )
		make_frame (new_mobile);

        	
	if ( IS_SET (new_mobile->affected_by, AFF_HIDE) )
		magic_add_affect (new_mobile, MAGIC_HIDDEN, -1, 0, 0, 0, 0);

	new_mobile->fight_mode = 2;

	if ( IS_SET (new_mobile->flags, FLAG_VARIABLE) ) {
		randomize_mobile (new_mobile);
		REMOVE_BIT (new_mobile->flags, FLAG_VARIABLE);
	}

	new_mobile->clans = str_dup(proto->clans);

	new_mobile->move = new_mobile->max_move;

	new_mobile->mount = NULL;
	new_mobile->wounds = NULL;
	new_mobile->lodged = NULL;
	new_mobile->subdue = NULL;

	new_mobile->mob->owner = NULL;

	if ( new_mobile->speaks == SKILL_HEALING )
		new_mobile->speaks = SKILL_SPEAK_WESTRON;

	return new_mobile;
}

void insert_string_variables (OBJ_DATA *new_obj, OBJ_DATA *proto, char *string)
{
	char	buf [MAX_STRING_LENGTH] = {'\0'};
	char	buf2 [MAX_STRING_LENGTH] = {'\0'};
	char	original [MAX_STRING_LENGTH] = {'\0'};
	char	color [MAX_STRING_LENGTH] = {'\0'};
	char	*point = NULL;
	int		i = 0;
	int		j = 0;
	int		limit = 0;
	bool	modified = FALSE;

	*buf = '\0';
	*buf2 = '\0';

	if ( string == 0 )
		*color = '\0';
	else snprintf (color, MAX_STRING_LENGTH, "%s", string);

	SET_BIT (new_obj->obj_flags.extra_flags, ITEM_VARIABLE);

	if ( !*proto->full_description )
		return;

	snprintf (original, MAX_STRING_LENGTH, "%s", proto->short_description);

	if ( (point = strstr (original, "$color")) ) {
		if ( !*color ) {
			for ( i = 0, limit = 0; *standard_object_colors[i] != '\n'; i++, limit++ )
				;
			limit--;
			snprintf (color, MAX_STRING_LENGTH, "%s", standard_object_colors[number(0,limit)]);
		}
	}
	else if ( (point = strstr (original, "$drabcolor")) ) {
		if ( !*color ) {
			for ( i = 0, limit = 0; *drab_object_colors[i] != '\n'; i++, limit++ )
				;
			limit--;
			snprintf (color, MAX_STRING_LENGTH, "%s", drab_object_colors[number(0,limit)]);
		}
	}
	else if ( (point = strstr (original, "$finecolor")) && !*color ) {
		if ( !*color ) {
			for ( i = 0, limit = 0; *fine_object_colors[i] != '\n'; i++, limit++ )
				;
			limit--;
			snprintf (color, MAX_STRING_LENGTH, "%s", fine_object_colors[number(0,limit)]);
		}
	}

	if ( point ) {
		for ( i = 0; i <= strlen(original); i++ ) {
			if ( original[i] == *point ) {
				modified = TRUE;
				snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%s", color);
				j = i+1;
				while ( isalpha(original[j]) )
					j++;
				i = j;
			}
			snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%c", original[i]);
		}

		mem_free (new_obj->short_description);
		new_obj->short_description = add_hash(buf2);
	}

	*buf2 = '\0';
	snprintf (original, MAX_STRING_LENGTH, "%s", proto->description);
	point = strstr (original, "$color");
	if ( !point )
		point = strstr (original, "$drabcolor");
	if ( !point )
		point = strstr (original, "$finecolor");

	if ( point ) {
		for ( i = 0; i <= strlen(original); i++ ) {
			if ( original[i] == *point ) {
				modified = TRUE;
				snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%s", color);
				j = i+1;
				while ( isalpha(original[j]) )
					j++;
				i = j;
			}
			snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%c", original[i]);
		}
	
		mem_free (new_obj->description);
		new_obj->description = add_hash(buf2);
	}

	*buf2 = '\0';
	snprintf (original, MAX_STRING_LENGTH, "%s", proto->full_description);
	point = strstr (original, "$color");
	if ( !point )
		point = strstr (original, "$drabcolor");
	if ( !point )
		point = strstr (original, "$finecolor");

	if ( point ) {
		for ( i = 0; i <= strlen(original); i++ ) {
			if ( original[i] == *point ) {
				modified = TRUE;
				snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%s", color);
				j = i+1;
				while ( isalpha(original[j]) )
					j++;
				i = j;
			}
			snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%c", original[i]);
		}

		mem_free (new_obj->full_description);
		new_obj->full_description = str_dup (buf2);
	}

	*buf2 = '\0';
	snprintf (original, MAX_STRING_LENGTH, "%s", proto->name);
	point = strstr (original, "$color");
	if ( !point )
		point = strstr (original, "$drabcolor");
	if ( !point )
		point = strstr (original, "$finecolor");

	if ( point ) {
		for ( i = 0; i <= strlen(original); i++ ) {
			if ( original[i] == *point ) {
				modified = TRUE;
				snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%s", color);
				j = i+1;
				while ( isalpha(original[j]) )
					j++;
				i = j;
			}
			snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%c", original[i]);
		}

		mem_free (new_obj->name);
		new_obj->name = str_dup(buf2);
	}

	if ( (IS_SET (new_obj->obj_flags.extra_flags, ITEM_MASK) && new_obj->obj_flags.type_flag == ITEM_ARMOR) ||
	     (IS_SET (new_obj->obj_flags.extra_flags, ITEM_MASK) && new_obj->obj_flags.type_flag == ITEM_WORN) ) {
		*buf2 = '\0';
		snprintf (original, MAX_STRING_LENGTH, "%s", proto->desc_keys);
		point = strstr (original, "$color");
		if ( !point )
			point = strstr (original, "$drabcolor");
		if ( !point )
			point = strstr (original, "$finecolor");

		if ( point ) {
			for ( i = 0; i <= strlen(original); i++ ) {
				if ( original[i] == *point ) {
					modified = TRUE;
					snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%s", color);
					j = i+1;
					while ( isalpha(original[j]) )
						j++;
						i = j;
				}
				snprintf (buf2 + strlen(buf2), MAX_STRING_LENGTH,  "%c", original[i]);
			}
			mem_free (new_obj->desc_keys);
			new_obj->desc_keys = add_hash(buf2);
		}
	}

	if ( new_obj->var_color )
		mem_free (new_obj->var_color);

	if ( !modified )
		new_obj->var_color = add_hash("none");
	else
		new_obj->var_color = add_hash(color);
		
	return;
}

OBJ_DATA *load_object (int vnum)
{
	OBJ_DATA		*proto = NULL;
	OBJ_DATA		*new_obj = NULL;
	WRITING_DATA	*writing = NULL;
	int				i = 0;
	AFFECTED_TYPE	*af = NULL;
	AFFECTED_TYPE	*new_af = NULL;
	AFFECTED_TYPE	*last_af = NULL;

	if ( !(proto = vtoo (vnum)) )
		return NULL;

	new_obj = new_object ();

	memcpy (new_obj, proto, sizeof (OBJ_DATA));

	new_obj->deleted = 0;

	new_obj->xaffected = NULL;

	new_obj->next_content = 0;

	new_obj->var_color = (char *)NULL;

	for ( af = proto->xaffected; af; af = af->next ) {

		new_af = (AFFECTED_TYPE *)alloc (sizeof (AFFECTED_TYPE), 13);

		memcpy (new_af, af, sizeof (AFFECTED_TYPE));

		new_af->next = NULL;

		if ( !new_obj->xaffected )
			new_obj->xaffected = new_af;
		else
			last_af->next = new_af;

		last_af = new_af;
	}

	new_obj->next = object_list;
	object_list = new_obj;
	
	new_obj->count = 1;

	if(new_obj->clock && new_obj->morphto)
	    new_obj->morphTime = time(0) + new_obj->clock * 14*60;

	if ( GET_ITEM_TYPE(new_obj) == ITEM_BOOK ) {
		if ( !new_obj->writing && new_obj->o.od.value[0] > 0) {
			CREATE (new_obj->writing, WRITING_DATA, 1);
			for ( i = 1, writing = new_obj->writing; i <= new_obj->o.od.value[0]; i++ ) {
				writing->message = add_hash ("blank");
				writing->author = add_hash ("blank");
				writing->date = add_hash ("blank");
				writing->ink = add_hash ("blank");
				writing->language = 0;
				writing->script = 0;
				writing->skill = 0;
				writing->torn = FALSE;
				if ( i != new_obj->o.od.value[0] ) {
					CREATE (writing->next_page, WRITING_DATA, 1);
					writing = writing->next_page;
				}
			}
		}
	}

	if ( GET_ITEM_TYPE (new_obj) == ITEM_BOOK )
		new_obj->o.od.value[1] = unused_writing_id();

	if ( GET_ITEM_TYPE (new_obj) == ITEM_PARCHMENT )
		new_obj->o.od.value[0] = unused_writing_id();

	if ( IS_SET(new_obj->obj_flags.extra_flags, ITEM_VARIABLE) )
		insert_string_variables (new_obj, proto, 0);
	else new_obj->var_color = 0;

	if ( GET_ITEM_TYPE(new_obj) == ITEM_WEAPON )
		SET_BIT (new_obj->obj_flags.extra_flags, ITEM_NEWSKILLS);

	new_obj->contains = NULL;
	new_obj->lodged = NULL;
	new_obj->wounds = NULL;
	new_obj->equiped_by = NULL;
	new_obj->carried_by = NULL;
	new_obj->in_obj = NULL;

	if ( !new_obj->item_wear )
		new_obj->item_wear = 100;

	new_obj->coldload_id = get_next_coldload_id (2);

	return new_obj;
}

OBJ_DATA *load_colored_object (int vnum, char *color)
{
	OBJ_DATA		*proto = NULL;
	OBJ_DATA		*new_obj = NULL;
	WRITING_DATA	*writing = NULL;
	int				i = 0;
	AFFECTED_TYPE	*af = NULL;
	AFFECTED_TYPE	*new_af = NULL;
	AFFECTED_TYPE	*last_af = NULL;

	if ( !(proto = vtoo (vnum)) )
		return NULL;

	new_obj = new_object ();

	memcpy (new_obj, proto, sizeof (OBJ_DATA));

	new_obj->deleted = 0;

	new_obj->xaffected = NULL;

	new_obj->var_color = (char *)NULL;

	for ( af = proto->xaffected; af; af = af->next ) {

		new_af = (AFFECTED_TYPE *)alloc (sizeof (AFFECTED_TYPE), 13);

		memcpy (new_af, af, sizeof (AFFECTED_TYPE));

		new_af->next = NULL;

		if ( !new_obj->xaffected )
			new_obj->xaffected = new_af;
		else
			last_af->next = new_af;

		last_af = new_af;
	}

	new_obj->next = object_list;
	object_list = new_obj;
	
	new_obj->count = 1;

	if(new_obj->clock && new_obj->morphto)
	    new_obj->morphTime = time(0) + new_obj->clock * 14*60;

	if ( GET_ITEM_TYPE(new_obj) == ITEM_BOOK ) {
		if ( !new_obj->writing && new_obj->o.od.value[0] > 0) {
			CREATE (new_obj->writing, WRITING_DATA, 1);
			for ( i = 1, writing = new_obj->writing; i <= new_obj->o.od.value[0]; i++ ) {
				writing->message = add_hash ("blank");
				writing->author = add_hash ("blank");
				writing->date = add_hash ("blank");
				writing->ink = add_hash ("blank");
				writing->language = 0;
				writing->script = 0;
				writing->skill = 0;
				writing->torn = FALSE;
				if ( i != new_obj->o.od.value[0] ) {
					CREATE (writing->next_page, WRITING_DATA, 1);
					writing = writing->next_page;
				}
			}
		}
	}

	if ( IS_SET(new_obj->obj_flags.extra_flags, ITEM_VARIABLE) )
		insert_string_variables (new_obj, proto, color);
	else new_obj->var_color = 0;

	if ( GET_ITEM_TYPE(new_obj) == ITEM_WEAPON )
		SET_BIT (new_obj->obj_flags.extra_flags, ITEM_NEWSKILLS);

	return new_obj; 
}

OBJ_DATA *fread_object (int vnum, int zone, FILE *fp)
{
	OBJ_DATA			*obj = NULL;
	float				tmpf = 0;
	int					tmp = 0;
	char				chk[50];
	char				buf [MAX_STRING_LENGTH] = {'\0'};
	XTRA_DESCR_DATA		*new_descr = NULL;
	XTRA_DESCR_DATA		*tmp_descr = NULL;
	AFFECTED_TYPE		*af = NULL;
	AFFECTED_TYPE		*taf = NULL;
	char				peak_char = {'\0'};

	obj = new_object ();

	clear_object (obj);

	obj->virtual			= vnum;
	obj->zone				= zone;

#if CHECK_DOUBLE_DEFS
	if ( vtoo (vnum) ) {
		snprintf (buf, MAX_STRING_LENGTH,  "OBJ %d multiply defined!!", vnum);
		system_log(buf, TRUE);
	} else
#endif
	add_obj_to_hash (obj);

	obj->name		= fread_string(fp);
	obj->short_description	= fread_string(fp);
	obj->description	= fread_string(fp);
	obj->full_description	= fread_string(fp);

	if ( !strcmp (obj->full_description, "(null)") ) {
		snprintf (buf, MAX_STRING_LENGTH,  "NOTE:  Object %d with '(null)' full description fixed.",
				 obj->virtual);
		system_log(buf, TRUE);
		obj->full_description = null_string;
	}

	/* *** numeric data *** */

	fscanf(fp, " %d ", &tmp);
	obj->obj_flags.type_flag = tmp;
	fscanf(fp, " %d ", &tmp);
	obj->obj_flags.extra_flags = tmp;
	fscanf(fp, " %d ", &tmp);
	obj->obj_flags.wear_flags = tmp;
	fscanf(fp, " %d ", &tmp);
	obj->o.od.value[0] = tmp;
	fscanf(fp, " %d ", &tmp);
	obj->o.od.value[1] = tmp;
	fscanf(fp, " %d ", &tmp);
	obj->o.od.value[2] = tmp;
	fscanf(fp, " %d ", &tmp);
	obj->o.od.value[3] = tmp;

	fscanf(fp, " %d ", &tmp);		/* Weight */

	obj->obj_flags.weight = tmp;

	fscanf(fp, " %f\n", &tmpf);
	obj->silver = tmpf;					/* Changed to silver from cost */

	fscanf(fp, " %d ", &tmp);
	obj->o.od.value[4] = tmp;

	if ( obj->obj_flags.type_flag == ITEM_INK )
		obj->ink_color = fread_string (fp);

	else if ( GET_ITEM_TYPE(obj) == ITEM_TENT ||
			GET_ITEM_TYPE(obj) == ITEM_DWELLING ) {
			
			obj->indoor_desc = fread_string (fp);
			
			if ( obj->indoor_desc &&
				*obj->indoor_desc &&
				!str_cmp (obj->indoor_desc, "(null)") ) {
			
				mem_free (obj->indoor_desc);
				obj->indoor_desc = NULL;
			}
		}

	else if ( IS_SET (obj->obj_flags.extra_flags, ITEM_MASK) &&
			obj->obj_flags.type_flag == ITEM_WORN ) 
			
			obj->desc_keys = fread_string (fp);
		
	else if ( IS_SET (obj->obj_flags.extra_flags, ITEM_MASK) &&
			  obj->obj_flags.type_flag == ITEM_ARMOR ) 
			
			obj->desc_keys   = fread_string (fp);
       	
	else {
			fscanf (fp, " %d",
			&obj->o.od.value [5]);
		}
	
 
	fscanf (fp, " %d %d %d %d %d\n",
				&obj->activation,
				&obj->quality,
				&obj->econ_flags,
				&obj->size,
				&obj->count);

	fscanf (fp, "%f %d %d %d %d %d %d\n",
				&obj->coppers,
				&obj->clock,
				&obj->morphto,
				&obj->item_wear,
				&obj->material,
				&tmp,
				&tmp);
	

	if ( GET_ITEM_TYPE(obj) == ITEM_INK ) {
		obj->clock = 0;
		obj->morphto = 0;
	}

	/* *** extra descriptions *** */

	obj->ex_description = 0;
	obj->wdesc = 0;

	do {
		while ( (peak_char = getc (fp)) == ' ' || peak_char == '\t' ||
				peak_char == '\n')
		       	;

		ungetc (peak_char, fp);

		if ( peak_char != 'E' )
			break;

		fscanf (fp, " %s \n", chk);

		new_descr = get_perm (sizeof (struct extra_descr_data));

		new_descr->keyword = fread_string(fp);
		new_descr->description = fread_string(fp);

			/* Add descr's in same order as read so that they
			   can get written back in same order */

		new_descr->next = NULL;

		if ( !obj->ex_description )
			obj->ex_description = new_descr;
		else {
			tmp_descr = obj->ex_description;
			while ( tmp_descr->next )
				tmp_descr = tmp_descr->next;
			tmp_descr->next = new_descr;
		}
	} while (1);

	tmp = 0;

	do {
		while ( (peak_char = getc (fp)) == ' ' || peak_char == '\t' ||
				peak_char == '\n')
			;

		ungetc (peak_char, fp);

		if ( peak_char != 'A' )
			break;

		fscanf (fp, " %s \n", chk);

		af = get_perm (sizeof (AFFECTED_TYPE));

		af->type		= 0;
		af->a.spell.duration	= -1;
		af->a.spell.bitvector	= 0;
		af->a.spell.sn			= 0;
		af->next		= NULL;

		fscanf (fp, " %d %d\n", &af->a.spell.location, &af->a.spell.modifier);

		if ( af->a.spell.location || af->a.spell.modifier ) {

			tmp++;

			if ( !obj->xaffected )
				obj->xaffected = af;
			else {
				for ( taf = obj->xaffected; taf->next; taf = taf->next )
					;
				taf->next = af;
			}
		}

	} while (1);

/*** Lua triggers ***/
	do {
			while ( (peak_char = getc (fp)) == ' ' ||
					peak_char == '\t' ||
					peak_char == '\n')
				;
	
			ungetc (peak_char, fp);
	
			if ( peak_char != 'R' )
				break;
	
			larg_setup_obj_triggers(fp, obj);
	
		} while (1);
		
/***** end lua triggers ***/	
	if ( tmp > 20 ) 
		printf ("Object %d has %d affects\n", obj->virtual, tmp);

	obj->in_room = NOWHERE;
	obj->next_content = 0;
	obj->carried_by = 0;
	obj->equiped_by = 0;
	obj->in_obj = 0;
	obj->contains = 0;

	if ( obj->count == 0 )
		obj->count = 1;

	if ( IS_SET (obj->obj_flags.wear_flags, ITEM_WEAR_SHIELD) )
		REMOVE_BIT (obj->obj_flags.wear_flags, ITEM_WEAR_SHIELD);

	return obj;
}

/** Mobs get to choose a height range (tall, average, short) and that has to be translated into actual height */
void make_height (CHAR_DATA *mob, int range)
{
	int		height = 0;
	float	adjust = 0;
		
	if ( mob->sex == SEX_MALE) {
			height = dice (db_race_table [mob->race].male_ht_dice,
						   db_race_table [mob->race].male_ht_sides);
			height += db_race_table [mob->race].male_ht_constant;
		
		if (range == 0){
			adjust = number(.85, 1.05);
			mob->height = (int)(height * adjust);
		}
		else if (range == 1){
			adjust = number(.95, 1.05);
			mob->height = (int)(height * adjust);
		}
		
		else { /* range == 2 */
			adjust = number(.95, 1.15);
			mob->height = (int)(height * adjust);
		}

		return;
	}

	else if ( mob->sex == SEX_FEMALE  || mob->sex == SEX_NEUTRAL){
		height = dice (db_race_table [mob->race].female_ht_dice,
					   db_race_table [mob->race].female_ht_sides);

		height += db_race_table [mob->race].female_ht_constant;

		if (range == 0){
			adjust = number(.85, 1.05);
			mob->height = (int)(height * adjust);
		}
		else if (range == 1){
			adjust = number(.95, 1.05);
			mob->height = (int)(height * adjust);
		}
		
		else { /* range == 2 */
			adjust = number(.95, 1.15);
			mob->height = (int)(height * adjust);
		}

	return;
	}
}

/** Frame is choosen by PC and random choice for mobs **/
void make_frame (CHAR_DATA *mob)
{
    int     frame = 0;
	
		
    if ( mob->sex == SEX_MALE ) {
            frame = dice (db_race_table [mob->race].male_fr_dice,
                           db_race_table [mob->race].male_fr_sides);
        frame += db_race_table [mob->race].male_fr_constant;

		mob->frame = frame;

        return;
    }

    else if ( mob->sex == SEX_FEMALE  || mob->sex == SEX_NEUTRAL)
        frame = dice (db_race_table [mob->race].female_fr_dice,
                       db_race_table [mob->race].female_fr_sides);

    frame += db_race_table [mob->race].female_fr_constant;

	mob->frame = frame;

    return;
}

CHAR_DATA *get_live_mob (int vnum, int zone, int reset_cmd)
{
	CHAR_DATA	*tch = NULL;

	for ( tch = character_list; tch; tch = tch->next ) {
		if ( tch->deleted )
			continue;
		if ( !IS_NPC (tch) || !tch->room || tch->mob->virtual != vnum )
			continue;
		if ( tch->mob->reset_cmd == reset_cmd && tch->mob->reset_zone == zone )
			return tch;
	}

	return NULL;
}

void initialize_new_spawnpoints (void)
{
	int		cmd_no = 0;
	int		i = 0;

	for ( i = 0; i <= 99; i++ ) {
		if ( !zone_table [i].cmd )
			continue;
		for ( cmd_no = 0; ; cmd_no++ ) {
			if ( zone_table[i].cmd[cmd_no].command == 'S' )
				break;
			if ( zone_table[i].cmd[cmd_no].command != 'M' )
				continue;	
		}
	}
	return;
}

#define ZCMD zone_table[zone].cmd[cmd_no]

void reset_zone (int zone)
{
	int			cmd_no = 0;
	int			count_vnum_in_room = 0;
	int			i = 0;
	int			current_room = -1;
	CHAR_DATA		*mob = NULL;
	CHAR_DATA		*tmob = NULL;
	OBJ_DATA		*obj = NULL;
	OBJ_DATA		*tobj = NULL;
	OBJ_DATA		*temp_obj = NULL;
	ROOM_DATA		*room = NULL;
	SUBCRAFT_HEAD_DATA	*craft = NULL;
	AFFECTED_TYPE		*af = NULL;
	RESET_AFFECT		*ra = NULL;
	RESET_DATA			*reset = NULL;
	char				buf [MAX_STRING_LENGTH] = {'\0'};

	if ( !zone_table [zone].cmd )
		return;

	for ( cmd_no = 0; ; cmd_no++ ) {

		if ( ZCMD.command == 'S' )
			break;

		if ( ZCMD.command == 'M' ) {			/* Mob to room */

			mob = NULL;

			if ( !ZCMD.enabled )
				continue;

			ZCMD.enabled = 0;

			if ( /*(port != PLAYER_PORT) &&*/ (mob = load_mobile (ZCMD.arg1)) ) {
				mob->mob->reset_zone = zone;
				mob->mob->reset_cmd = cmd_no;

				if ( !mob->height && !IS_SET (mob->flags, FLAG_VARIABLE) )
					make_height (mob, 1);

				if ( !mob->frame )
					make_frame (mob);

				mob->mob->spawnpoint = ZCMD.arg3;
				char_to_room (mob, ZCMD.arg3);

				if ( ZCMD.arg4 && (tmob = load_mobile (ZCMD.arg4)) ) {
					tmob->mount = mob;
					mob->mount = tmob;
					tmob->mob->spawnpoint = ZCMD.arg3;
					char_to_room (tmob, ZCMD.arg3);
				}	
			} else if ( !fCopyOver ) {
				snprintf (buf, MAX_STRING_LENGTH,  "Unable to load mob virtual %d!", ZCMD.arg1);
				system_log(buf, TRUE);
			}
		}

		else if ( ZCMD.command == 'R' ) {		/* Defining room */
			current_room = ZCMD.arg1;
			continue;
		}

		else if ( ZCMD.command == 'A' ||		/* Affect on char */
				  ZCMD.command == 'r' ) {		/* Affect on room */

			if ( !ZCMD.arg1 ) {
				system_log("ZCMD is zero.", TRUE);
				continue;
			}

			if ( !mob )
				continue;

			ra = (RESET_AFFECT *) ZCMD.arg1;

			if ( get_affect (mob, ra->type) )
				continue;

            af = (AFFECTED_TYPE *)alloc (sizeof (AFFECTED_TYPE), 13);

			af->type              = ra->type;
			af->a.spell.duration  = ra->duration;
			af->a.spell.modifier  = ra->modifier;
			af->a.spell.location  = ra->location;
			af->a.spell.bitvector = ra->bitvector;
			af->a.spell.sn        = ra->sn;
			af->a.spell.t         = ra->t;
			af->next              = NULL;

			if ( ZCMD.command == 'r' ) {
				af->next = vtor (current_room)->affects;
				vtor (current_room)->affects = af;
			} else
				affect_to_char (mob, af);

			continue;
		}

		else if ( ZCMD.command == 'm' ) {

			if ( !mob )
				continue;

			if ( ZCMD.arg1 == RESET_REPLY ) {
				reset = (RESET_DATA *)alloc ((int)sizeof (RESET_DATA), 33);

				reset->type = RESET_REPLY;

				reset->command = str_dup ((char *) ZCMD.arg2);

				reset->when.month  = -1;
				reset->when.day    = -1;
				reset->when.hour   = -1;
				reset->when.minute = -1;
				reset->when.second = -1;

				reset_insert (mob, reset);
			}
		}

		else if ( ZCMD.command == 'C' ) {

			if ( !mob )
				continue;

			if ( !ZCMD.arg1 )
				continue;

			for ( craft = crafts;
                  craft && str_cmp (craft->subcraft_name, (char *) ZCMD.arg1);
                  craft = craft->next )
                ; /* cycling through crafts */

            if ( !craft ) {

				snprintf (buf, MAX_STRING_LENGTH,  "RESET: No such craft %s on mob %d, room %d", craft->subcraft_name, mob->mob->virtual, mob->in_room);

				system_log(buf, TRUE);
            }

		    for ( i = CRAFT_FIRST; i <= CRAFT_LAST; i++ )
				if ( !get_affect (mob, i) )
					break;

			magic_add_affect (mob, i, -1, 0, 0, 0, 0);

			af = get_affect (mob, i);

			af->a.craft = (struct affect_craft_type *)alloc (sizeof (struct affect_craft_type), 23);

			af->a.craft->subcraft = craft;
		}

		else if ( ZCMD.command == 'O' ) {

			obj = NULL;

			count_vnum_in_room = 0;

			for ( tobj = vtor (ZCMD.arg3)->contents;
				  tobj;
				  tobj = tobj->next_content )
				if ( tobj->virtual == ZCMD.arg1 )
					count_vnum_in_room++;

			if ( count_vnum_in_room < ZCMD.arg2 &&
				 (obj = load_object (ZCMD.arg1)) )
				obj_to_room (obj, ZCMD.arg3);
		}

		else if ( ZCMD.command == 'P' ) {
			if ( !obj )
				continue;

			if ( (tobj = load_object (ZCMD.arg1)) )
				obj_to_obj (tobj, obj);
		}

		else if ( ZCMD.command == 'G' ) {

			obj = NULL;

			if ( !mob )
				continue;

			if ( (obj = load_object (ZCMD.arg1)) ) {
				obj_to_char (obj, mob);
			}
		}

		else if ( ZCMD.command == 'E' ) {
			
			obj = NULL;

			if ( !mob )
				continue;

			if ( (obj = load_object (ZCMD.arg1)) ) {

				if ( IS_WEARABLE (obj) )
					obj->size = get_size (mob);

				equip_char (mob, obj, ZCMD.arg3);

				cmd_no++;
				if ( ZCMD.command == 's' ) {
					temp_obj = load_object(ZCMD.arg1);
					obj_to_obj (temp_obj, obj);
					if ( ZCMD.arg2 > 1 )
						for ( i = 1; i < ZCMD.arg2; i++ ){
							temp_obj = load_object(ZCMD.arg1);
							obj_to_obj (temp_obj, obj);
						}
				}
				else{
					cmd_no--;
				}
			}
		}

		else if ( ZCMD.command == 'a' ) {
			
			obj = NULL;

			if ( !tmob )
				continue;

			if ( (obj = load_object (ZCMD.arg1)) ) {

				if ( IS_WEARABLE (obj) )
					obj->size = get_size (tmob);

				equip_char (tmob, obj, ZCMD.arg3);

				cmd_no++;
				if ( ZCMD.command == 's' ) {
					temp_obj = load_object(ZCMD.arg1);
					obj_to_obj (temp_obj, obj);
					if ( ZCMD.arg2 > 1 ){
						for ( i = 1; i < ZCMD.arg2; i++ ){
							temp_obj = load_object(ZCMD.arg1);
							obj_to_obj (temp_obj, obj);
						}
					}
				}
				else{
					cmd_no--;
				}
			}
		}

		else if ( ZCMD.command == 'D' ) {

			room = vtor (ZCMD.arg1);

			if ( !room || !room->dir_option [ZCMD.arg2] )
				continue;

			switch (ZCMD.arg3) {
				case 0:  
					 REMOVE_BIT (room->dir_option [ZCMD.arg2]->exit_info,
								 PASSAGE_LOCKED | PASSAGE_CLOSED);
					 break;
				case 1:  
					SET_BIT (room->dir_option [ZCMD.arg2]->exit_info,
								 PASSAGE_CLOSED);
					 REMOVE_BIT	(room->dir_option [ZCMD.arg2]->exit_info,
								 PASSAGE_LOCKED);
					 break;
				case 2:
					 SET_BIT(room->dir_option [ZCMD.arg2]->exit_info,
							 PASSAGE_LOCKED | PASSAGE_CLOSED);
					 break;
				default:
					 break;
			}
		}
	}  /* for */

	zone_table [zone].age = 0;
	
	return;
}

#undef ZCMD

void list_validate (char *name)
{
	CHAR_DATA	*ch = NULL;
	OBJ_DATA	*obj = NULL;
	int			cycle_count = 0;
	char		buf [MAX_STRING_LENGTH] = {'\0'};

	snprintf (buf, MAX_STRING_LENGTH,  "List validate:  %s entered.\n", name);
	system_log (buf, FALSE);

	for ( ch = character_list, cycle_count = 0; ch; ch = ch->next ) {
		if ( cycle_count++ > 10000 ) {
			system_log ("Character list cycle failed.", TRUE);
			((int *) 0) [-1] = 0;
		}
	}

	for ( obj = object_list, cycle_count = 0; obj; obj = obj->next ) {
		if ( cycle_count++ > 10000 ) {
			system_log ("Object list cycle failed.", TRUE);
			((int *) 0) [-1] = 0;
		}
	}

	snprintf (buf, MAX_STRING_LENGTH,  "List validate:  %s completed.\n", name);
	system_log (buf, FALSE);
}

void cleanup_the_dead (int mode)
{
	OBJ_DATA	*obj = NULL;
	OBJ_DATA	*next_obj = NULL;
	OBJ_DATA	*prev_obj = NULL;
	CHAR_DATA	*ch = NULL;
	CHAR_DATA	*next_ch = NULL;
	CHAR_DATA	*prev_ch = NULL;

	if ( mode == 1 || mode == 0 ) {
		for ( ch = character_list; ch; ch = next_ch ) {
			next_ch = ch->next;

			if ( !ch->deleted ) {
				prev_ch = ch;
				continue;
			}

			if ( ch == character_list )
				character_list = next_ch;
			else
				prev_ch->next = next_ch;	

			if ( !IS_NPC (ch) ) {
				unload_pc (ch);
				continue;
			}

			free_char (ch);
			ch = NULL;
		}
	}

	if ( mode == 2 || mode == 0 ) {
		for ( obj = object_list; obj; obj = next_obj ) {
			next_obj = obj->next;

			if ( !obj->deleted ) {
				prev_obj = obj;
				continue;
			}

			if ( obj == object_list )
				object_list = next_obj;
			else
				prev_obj->next = next_obj;

			free_obj (obj);
			obj = NULL;
		}
	}
	return;
}

#define ZCMD zone_table[zone].cmd[cmd_no]

void refresh_zone (void)
{
	int			cmd_no = 0;
	int			i = 0;
	int			count_vnum_in_room = 0;
	static int		zone = 0;
	CHAR_DATA		*mob = NULL;
	CHAR_DATA		*tmob = NULL;
	ROOM_DATA		*room = NULL;
	OBJ_DATA		*obj = NULL;
	OBJ_DATA		*tobj = NULL;
	OBJ_DATA		*temp_obj = NULL;
	char			buf [MAX_STRING_LENGTH] = {'\0'};

	if ( !zone_table [zone].cmd )
		return;

	if ( IS_FROZEN (zone) )
		return;

	snprintf (buf, MAX_STRING_LENGTH,  "Refreshing zone %d and loading any unloaded psaves...", zone);
	system_log (buf, FALSE);

	for ( room = full_room_list; room; room = room->lnext ) {
		if ( room->zone != zone )
			continue;
		if ( !room->psave_loaded )
			load_save_room (room);
	}

	for ( cmd_no = 0; ; cmd_no++ ) {

		if ( ZCMD.command == 'S' )
			break;

		if ( ZCMD.command == 'D' )
			continue;

		if ( ZCMD.command == 'M' ) {

			mob = NULL;

			if ( !ZCMD.enabled )
				continue;

			ZCMD.enabled = 0;

			if ( port == PLAYER_PORT ) {
				mysql_safe_query ("DELETE FROM mob_resets WHERE zone = %d AND cmd_no = %d", zone, cmd_no);
			}

			if ( (mob = load_mobile (ZCMD.arg1)) ) {
				mob->mob->reset_zone = zone;
				mob->mob->reset_cmd = cmd_no;
				char_to_room (mob, ZCMD.arg3);
			}

/*			act ("$n has arrived.", TRUE, mob, 0, 0, TO_ROOM | TO_ACT_FORMAT); */

			if ( ZCMD.arg4 && (tmob = load_mobile (ZCMD.arg4)) ) {
				tmob->mount = mob;
				mob->mount = tmob;
				tmob->mob->spawnpoint = ZCMD.arg3;
				char_to_room (tmob, ZCMD.arg3);
			} 

			mysql_safe_query ("DELETE FROM mob_resets WHERE zone = %d AND cmd_no = %d", zone, cmd_no);
		}

		else if ( ZCMD.command == 'O' ) {

			obj = NULL;

			count_vnum_in_room = 0;

			for ( tobj = vtor (ZCMD.arg3)->contents;
				  tobj;
				  tobj = tobj->next_content )
				if ( tobj->virtual == ZCMD.arg1 )
					count_vnum_in_room++;

			if ( count_vnum_in_room < ZCMD.arg2 &&
				 (obj = load_object (ZCMD.arg1)) )
				obj_to_room (obj, ZCMD.arg3);
		}

		else if ( ZCMD.command == 'P' ) {
			if ( !obj )
				continue;

			if ( (tobj = load_object (ZCMD.arg1)) )
				obj_to_obj (tobj, obj);
		}

		else if ( ZCMD.command == 'G' ) {

			obj = NULL;

			if ( !mob )
				continue;

			if ( (obj = load_object (ZCMD.arg1)) ) {
				obj_to_char (obj, mob);
			}
		}

		else if ( ZCMD.command == 'E' ) {
			
			obj = NULL;

			if ( !mob )
				continue;

			if ( (obj = load_object (ZCMD.arg1)) )
				equip_char (mob, obj, ZCMD.arg3);
		}

		else if ( ZCMD.command == 'a' ) {
			
			obj = NULL;

			if ( !tmob )
				continue;

			if ( (obj = load_object (ZCMD.arg1)) ) {

				if ( IS_WEARABLE (obj) )
					obj->size = get_size (tmob);

				equip_char (tmob, obj, ZCMD.arg3);

				cmd_no++;
				if ( ZCMD.command == 's' ) {
					temp_obj = load_object(ZCMD.arg1);
					obj_to_obj (temp_obj, obj);
					tobj = load_object(ZCMD.arg1);
					if ( ZCMD.arg2 > 1 )
						for ( i = 1; i < ZCMD.arg2; i++ ){
							temp_obj = load_object(ZCMD.arg1);
							obj_to_obj (temp_obj, obj);
						}
				}
				else cmd_no--;
			}
		}

	}  /* for */

	if ( zone+1 >= MAX_ZONE )
		zone = 0;
	else
		zone++;
		
	return;
}
#undef ZCMD