Tapestries/
Tapestries/area/
Tapestries/area/current/
Tapestries/area/helps/
Tapestries/area/tmp/
Tapestries/ideas/
Tapestries/log/
Tapestries/player/
Tapestries/player/b/
Tapestries/player/d/
Tapestries/player/e/
Tapestries/player/h/
Tapestries/player/j/
Tapestries/player/k/
Tapestries/player/l/
Tapestries/player/m/
Tapestries/player/n/
Tapestries/player/r/
Tapestries/player/s/
Tapestries/player/t/
Tapestries/player/u/
Tapestries/player/z/
#if defined( macintosh )
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "merc.h"

/* free lists */
WEAPON_DATA		*weapon_free;
ARMOUR_DATA		*armour_free;
CONT_DATA		*cont_free;
DRINK_DATA		*drink_free;
FOOD_DATA		*food_free;
SCROLL_DATA		*scroll_free;
PILL_DATA		*pill_free;
POTION_DATA		*potion_free;
WAND_DATA		*wand_free;
STAFF_DATA		*staff_free;
LIGHT_DATA		*light_free;
MONEY_DATA		*money_free;

WEAPON_DATA *new_weapon( void )
{
    WEAPON_DATA *weapon;

    if( !weapon_free )
    {
	top_weapon++;
	weapon = alloc_perm( sizeof( *weapon ) );
    }
    else
    {
	weapon 		= weapon_free;
	weapon_free	= weapon_free->next;
    }
    weapon->next	= NULL;

    return weapon;
}

ARMOUR_DATA *new_armour( void )
{
    ARMOUR_DATA *armour;

    if( !armour_free )
    {
	top_armour++;
	armour = alloc_perm( sizeof( *armour ) );
    }
    else
    {
	armour		= armour_free;
	armour_free	= armour_free->next;
    }
    armour->next	= NULL;

    return armour;
}

CONT_DATA *new_cont( void )
{
    CONT_DATA *cont;

    if( !cont_free )
    {
	top_cont++;
	cont = alloc_perm( sizeof( *cont ) );
    }
    else
    {
	cont		= cont_free;
	cont_free	= cont_free->next;
    }
    cont->next	= NULL;

    return cont;
}

DRINK_DATA *new_drink( void )
{
    DRINK_DATA *drink;

    if( !drink_free )
    {
	top_drink++;
	drink = alloc_perm( sizeof( *drink ) );
    }
    else
    {
	drink		= drink_free;
	drink_free	= drink_free->next;
    }
    drink->next	= NULL;

    return drink;
}

FOOD_DATA *new_food( void )
{
    FOOD_DATA *food;

    if( !food_free )
    {
	top_food++;
	food = alloc_perm( sizeof( *food ) );
    }
    else
    {
	food		= food_free;
	food_free	= food_free->next;
    }
    food->next	= NULL;

    return food;
}

POTION_DATA *new_potion( void )
{
    POTION_DATA *potion;
    int i;

    if( !potion_free )
    {
	top_potion++;
	potion = alloc_perm( sizeof( *potion ) );
	for( i = 0 ; i < 4 ; i++ )
	    potion->spell[ i ] = -1;
    }
    else
    {
	potion		= potion_free;
	potion_free	= potion_free->next;
    }
    potion->next	= NULL;

    return potion;
}

PILL_DATA *new_pill( void )
{
    PILL_DATA *pill;
    int i;

    if( !pill_free )
    {
	top_pill++;
	pill = alloc_perm( sizeof( *pill ) );
	for( i = 0 ; i < 4 ; i++ )
	    pill->spell[ i ] = -1;
    }
    else
    {
	pill		= pill_free;
	pill_free	= pill_free->next;
    }
    pill->next	= NULL;

    return pill;
}

SCROLL_DATA *new_scroll( void )
{
    SCROLL_DATA *scroll;
    int i;

    if( !scroll_free )
    {
	top_scroll++;
	scroll = alloc_perm( sizeof( *scroll ) );
	for( i = 0 ; i < 4 ; i++ )
	    scroll->spell[ i ] = -1;
    }
    else
    {
	scroll		= scroll_free;
	scroll_free	= scroll_free->next;
    }
    scroll->next	= NULL;

    return scroll;
}

STAFF_DATA *new_staff( void )
{
    STAFF_DATA *staff;

    if( !staff_free )
    {
	top_staff++;
	staff = alloc_perm( sizeof( *staff ) );
	staff->spell = -1;
    }
    else
    {
	staff		= staff_free;
	staff_free	= staff_free->next;
    }
    staff->next	= NULL;

    return staff;
}

WAND_DATA *new_wand( void )
{
    WAND_DATA *wand;

    if( !wand_free )
    {
	top_wand++;
	wand = alloc_perm( sizeof( *wand ) );
	wand->spell = -1;
    }
    else
    {
	wand		= wand_free;
	wand_free	= wand_free->next;
    }
    wand->next	= NULL;

    return wand;
}

LIGHT_DATA *new_light( void )
{
    LIGHT_DATA *light;

    if( !light_free )
    {
	top_light++;
	light = alloc_perm( sizeof( *light ) );
    }
    else
    {
	light		= light_free;
	light_free	= light_free->next;
    }
    light->next	= NULL;

    return light;
}

MONEY_DATA *new_money( void )
{
    MONEY_DATA *money;

    if( !money_free )
    {
	top_money++;
	money = alloc_perm( sizeof( *money ) );
    }
    else
    {
	money		= money_free;
	money_free	= money_free->next;
    }
    money->next	= NULL;

    return money;
}

/* free code for fields -- puts the field on the free list, and clears it */
void free_weapon( OBJ_DATA *obj )
{
    int i;

    if( !obj->weapon )
	return;
  
    if( obj->weapon == obj->pIndexData->weapon )
    {
	obj->weapon = NULL;
	return;
    }

    obj->weapon->type 		= 0;
    obj->weapon->message	= 0;
    obj->weapon->flags		= 0;
    obj->weapon->hit		= 0;
     
    for( i = 0 ; i < 3 ; i++ )
	obj->weapon->damage[i]	= 0;

    obj->weapon->next 	= weapon_free;
    weapon_free		= obj->weapon;
    obj->weapon		= NULL;
}

void free_weapon_index( OBJ_INDEX_DATA *obj )
{
    int i;

    if( !obj->weapon )
	return;
  
    obj->weapon->type 		= 0;
    obj->weapon->message	= 0;
    obj->weapon->flags		= 0;
    obj->weapon->hit		= 0;
     
    for( i = 0 ; i < 3 ; i++ )
	obj->weapon->damage[i]	= 0;

    obj->weapon->next 	= weapon_free;
    weapon_free		= obj->weapon;
    obj->weapon		= NULL;
}

void free_armour( OBJ_DATA *obj )
{
    int i;

    if( !obj->armour )
	return;

    if( obj->armour == obj->pIndexData->armour )
    {	
	obj->armour = NULL;
	return;
    }

    for( i = 0 ; i < 4 ; i++ )
	obj->armour->ac[i]	= 0;

    obj->armour->next	= armour_free;
    armour_free		= obj->armour;
    obj->armour		= NULL;
}

void free_armour_index( OBJ_INDEX_DATA *obj )
{
    int i;

    if( !obj->armour )
	return;

    for( i = 0 ; i < 4 ; i++ )
	obj->armour->ac[i]	= 0;

    obj->armour->next	= armour_free;
    armour_free		= obj->armour;
    obj->armour		= NULL;
}

void free_cont( OBJ_DATA *obj )
{

    if( !obj->cont )
	return;

    if( obj->cont == obj->pIndexData->cont )
    {
	obj->cont = NULL;
	return;
    }

    obj->cont->closed	= 0;
    obj->cont->key	= 0;
    obj->cont->capacity	= 0;
    obj->cont->single	= 0;

    obj->cont->next	= cont_free;
    cont_free		= obj->cont;
    obj->cont		= NULL;
}

void free_cont_index( OBJ_INDEX_DATA *obj )
{

    if( !obj->cont )
	return;

    obj->cont->closed	= 0;
    obj->cont->key	= 0;
    obj->cont->capacity	= 0;
    obj->cont->single	= 0;

    obj->cont->next	= cont_free;
    cont_free		= obj->cont;
    obj->cont		= NULL;
}

void free_drink( OBJ_DATA *obj )
{

    if( !obj->drink )
	return;

    if( obj->drink == obj->pIndexData->drink )
    {
	obj->drink = NULL;
	return;
    }

    obj->drink->volume	= 0;
    obj->drink->limit	= 0;
    obj->drink->liquid	= 0;
    obj->drink->poison	= 0;

    obj->drink->next	= drink_free;
    drink_free		= obj->drink;
    obj->drink		= NULL;
}

void free_drink_index( OBJ_INDEX_DATA *obj )
{

    if( !obj->drink )
	return;

    obj->drink->volume	= 0;
    obj->drink->limit	= 0;
    obj->drink->liquid	= 0;
    obj->drink->poison	= 0;

    obj->drink->next	= drink_free;
    drink_free		= obj->drink;
    obj->drink		= NULL;
}

void free_food( OBJ_DATA *obj )
{
    if( !obj->food )
	return;

    if( obj->food == obj->pIndexData->food )
    {
	obj->food = NULL;
	return;
    }

    if( obj->food == obj->pIndexData->food )

    obj->food->bite	= 0;
    obj->food->poison	= 0;

    obj->food->next	= food_free;
    food_free		= obj->food;
    obj->food		= NULL;
}

void free_food_index( OBJ_INDEX_DATA *obj )
{
    if( !obj->food )
	return;

    obj->food->bite	= 0;
    obj->food->poison	= 0;

    obj->food->next	= food_free;
    food_free		= obj->food;
    obj->food		= NULL;
}

void free_potion( OBJ_DATA *obj )
{
    int i;

    if( !obj->potion )
	return;

    if( obj->potion == obj->pIndexData->potion )
    {
	obj->potion = NULL;
	return;
    }

    obj->potion->level	= 0;

    for( i = 0 ; i < 4 ; i++ )
	obj->potion->spell[i]	= -1;

    obj->potion->next	= potion_free;
    potion_free		= obj->potion;
    obj->potion		= NULL;
}

void free_potion_index( OBJ_INDEX_DATA *obj )
{
    int i;

    if( !obj->potion )
	return;

    obj->potion->level	= 0;

    for( i = 0 ; i < 4 ; i++ )
	obj->potion->spell[i]	= -1;

    obj->potion->next	= potion_free;
    potion_free		= obj->potion;
    obj->potion		= NULL;
}

void free_scroll( OBJ_DATA *obj )
{
    int i;

    if( !obj->scroll )
	return;

    if( obj->scroll == obj->pIndexData->scroll )
    {
	obj->scroll = NULL;
	return;
    }

    obj->scroll->level	= 0;

    for( i = 0 ; i < 4 ; i++ )
	obj->scroll->spell[i]	= -1;

    obj->scroll->next	= scroll_free;
    scroll_free		= obj->scroll;
    obj->scroll		= NULL;
}

void free_scroll_index( OBJ_INDEX_DATA *obj )
{
    int i;

    if( !obj->scroll )
	return;

    obj->scroll->level	= 0;

    for( i = 0 ; i < 4 ; i++ )
	obj->scroll->spell[i]	= -1;

    obj->scroll->next	= scroll_free;
    scroll_free		= obj->scroll;
    obj->scroll		= NULL;
}

void free_pill( OBJ_DATA *obj )
{
    int i;

    if( !obj->pill )
	return;

    if( obj->pill == obj->pIndexData->pill )
    {
	obj->pill = NULL;
	return;
    }

    obj->pill->level	= 0;

    for( i = 0 ; i < 4 ; i++ )
	obj->pill->spell[i]	= -1;

    obj->pill->next	= pill_free;
    pill_free		= obj->pill;
    obj->pill		= NULL;
}

void free_pill_index( OBJ_INDEX_DATA *obj )
{
    int i;

    if( !obj->pill )
	return;

    obj->pill->level	= 0;

    for( i = 0 ; i < 4 ; i++ )
	obj->pill->spell[i]	= -1;

    obj->pill->next	= pill_free;
    pill_free		= obj->pill;
    obj->pill		= NULL;
}

void free_staff( OBJ_DATA *obj )
{
    if( !obj->staff )
	return;

    if( obj->staff == obj->pIndexData->staff )
    {
	obj->staff = NULL;
	return;
    }

    obj->staff->level	= 0;
    obj->staff->charges	= 0;
    obj->staff->max	= 0;
    obj->staff->spell	= -1;

    obj->staff->next	= staff_free;
    staff_free		= obj->staff;
    obj->staff		= NULL;
}

void free_staff_index( OBJ_INDEX_DATA *obj )
{
    if( !obj->staff )
	return;

    obj->staff->level	= 0;
    obj->staff->charges	= 0;
    obj->staff->max	= 0;
    obj->staff->spell	= -1;

    obj->staff->next	= staff_free;
    staff_free		= obj->staff;
    obj->staff		= NULL;
}

void free_wand( OBJ_DATA *obj )
{
    if( !obj->wand )
	return;

    if( obj->wand == obj->pIndexData->wand )
    {
	obj->wand = NULL;
	return;
    }

    obj->wand->level	= 0;
    obj->wand->charges	= 0;
    obj->wand->max	= 0;
    obj->wand->spell	= -1;

    obj->wand->next	= wand_free;
    wand_free		= obj->wand;
    obj->wand		= NULL;
}

void free_wand_index( OBJ_INDEX_DATA *obj )
{
    if( !obj->wand )
	return;

    obj->wand->level	= 0;
    obj->wand->charges	= 0;
    obj->wand->max	= 0;
    obj->wand->spell	= -1;

    obj->wand->next	= wand_free;
    wand_free		= obj->wand;
    obj->wand		= NULL;
}

void free_light( OBJ_DATA *obj )
{
    if( !obj->light )
	return;

    if( obj->light == obj->pIndexData->light )
    {
	obj->light = NULL;
	return;
    }

    obj->light->duration	= 0;
    obj->light->intensity	= 0;

    obj->light->next	= light_free;
    light_free		= obj->light;
    obj->light		= NULL;
}

void free_light_index( OBJ_INDEX_DATA *obj )
{
    if( !obj->light )
	return;

    obj->light->duration	= 0;
    obj->light->intensity	= 0;

    obj->light->next	= light_free;
    light_free		= obj->light;
    obj->light		= NULL;
}

void free_money( OBJ_DATA *obj )
{
    if( !obj->money )
	return;

    if( obj->money == obj->pIndexData->money )
    {
	obj->money = NULL;
	return;
    }

    obj->money->gold	= 0;
    obj->money->silver	= 0;
    obj->money->copper	= 0;

    obj->money->next	= money_free;
    money_free		= obj->money;
    obj->money		= NULL;
}

void free_money_index( OBJ_INDEX_DATA *obj )
{
    if( !obj->money )
	return;

    obj->money->gold	= 0;
    obj->money->silver	= 0;
    obj->money->copper	= 0;

    obj->money->next	= money_free;
    money_free		= obj->money;
    obj->money		= NULL;
}