Eos/
Eos/player/
Eos/src/
Eos/src/tmp/lcc/
/***************************************************************************
 *  File: mem.c                                                            *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 *                                                                         *
 *  This code was freely distributed with the The Isles 1.1 source code,   *
 *  and has been used here for OLC - OLC would not be what it is without   *
 *  all the previous coders who released their source code.                *
 *                                                                         *
 ***************************************************************************/


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


/*
 * Globals
 */
extern          int                     top_reset;
extern          int                     top_area;
extern          int                     top_exit;
extern          int                     top_ed;
extern          int                     top_room;

/*AREA_DATA		*	area_free;
EXTRA_DESCR_DATA	*	extra_descr_free;
EXIT_DATA		*	exit_free;
ROOM_INDEX_DATA		*	room_index_free;
SOCIAL_DATA		*	social_index_free;
CLAN_DATA               *       clan_index_free;
OBJ_INDEX_DATA		*	obj_index_free;
SHOP_DATA		*	shop_free;
MOB_INDEX_DATA		*	mob_index_free;
MPROG_DATA              *       mprog_free;
TRAP_DATA               *       trap_free;
RESET_DATA		*	reset_free;
HELP_DATA		*	help_free;*/

HELP_DATA		*	help_last;



/*****************************************************************************
 Name:		new_reset_data
 Purpose:	Creates and clears a reset structure.
 ****************************************************************************/
RESET_DATA *new_reset_data( void )
{
    RESET_DATA *pReset;

/*    if ( !reset_free )
    {*/
	pReset		= alloc_perm( sizeof(*pReset) );
	top_reset++;
/*    }
    else
    {
	pReset		= reset_free;
	reset_free	= reset_free->next;
    }*/

    pReset->next	= NULL;
    pReset->command	= 'X';
    pReset->arg1	= 0;
    pReset->arg2	= 0;
    pReset->arg3	= 0;

    return pReset;
}



/*****************************************************************************
 Name:		free_reset_data
 Purpose:	Clears and deletes a reset structure.
 ****************************************************************************/
void free_reset_data( RESET_DATA *pReset )
{
/*    pReset->next            = reset_free;
    reset_free              = pReset;*/
    top_reset--;
    free_mem( pReset, sizeof( *pReset ) );
    return;
}



/*****************************************************************************
 Name:		new_area
 Purpose:	Creates and clears a new area structure.
 ****************************************************************************/
AREA_DATA *new_area( void )
{
    AREA_DATA *pArea;
    char buf[MAX_INPUT_LENGTH];

/*    if ( !area_free )
    {*/
	pArea		= alloc_perm( sizeof(*pArea) );
	top_area++;
/*    }
    else
    {
	pArea		= area_free;
	area_free	= area_free->next;
    }*/

    pArea->next		= NULL;
    pArea->name		= str_dup( "New area" );
    pArea->recall	= ROOM_VNUM_TEMPLE;
    pArea->age		= 0;
    pArea->nplayer	= 0;
    pArea->reset_sound  = NULL; /*&str_empty[0]; */
    pArea->area_flags	= 0; /*AREA_ADDED;*/
    pArea->security	= 1;
    pArea->builders	= str_dup( "None" );
    pArea->lvnum	= 0;
    pArea->uvnum	= 0;
    pArea->llevel	= 0;
    pArea->ulevel	= 0;
    pArea->windstr	= 0;
    pArea->winddir	= 0;
    pArea->llevel	= 0;
    pArea->ulevel	= 0;
    pArea->def_color	= 6;
    pArea->vnum		= top_area-1;		/* OLC 1.1b */
    sprintf( buf, "area%d.are", pArea->vnum );
    pArea->filename	= str_dup( buf );

    return pArea;
}



/*****************************************************************************
 Name:		free_area
 Purpose:	Clears and deletes an area structure.
 ****************************************************************************/
void free_area( AREA_DATA *pArea )
{
    top_area--;
    free_string( pArea->name );
    free_string( pArea->filename );
    free_string( pArea->builders );
    free_string( pArea->reset_sound );
/*    pArea->next		=   area_free->next;
    area_free		=   pArea;*/
    free_mem( pArea, sizeof( *pArea ) );
    return;
}



EXIT_DATA *new_exit( void )
{
    EXIT_DATA *pExit;

/*    if ( !exit_free )
    {*/
	pExit           =   alloc_perm( sizeof(*pExit) );
	top_exit++;
/*    }
    else
    {
	pExit           =   exit_free;
	exit_free       =   exit_free->next;
    }*/

    pExit->to_room      =   NULL;
    pExit->next         =   NULL;
    pExit->traps	=   NULL;
    pExit->traptypes	=   0;
    pExit->rs_flags     =   0;
    pExit->vnum         =   0;
    pExit->exit_info    =   0;
    pExit->key          =   0;
    pExit->keyword      =   &str_empty[0];
    pExit->description  =   &str_empty[0];

    return pExit;
}

void free_trap_data( TRAP_DATA *pTrap )
{
  top_trap--;
  free_string( pTrap->arglist );
  free_string( pTrap->comlist );

  free_mem( pTrap, sizeof( *pTrap ) );
}

void free_exit( EXIT_DATA *pExit )
{

    TRAP_DATA	     *pTrap;
    TRAP_DATA	     *pTrap_next;

    top_exit--;

    free_string( pExit->keyword );
    free_string( pExit->description );

    for ( pTrap = pExit->traps; pTrap; pTrap = pTrap_next )
    {
       pTrap_next = pTrap->next;
       free_trap_data( pTrap );
    }

/*    pExit->next         =   exit_free;
    exit_free           =   pExit;*/
    free_mem( pExit, sizeof( *pExit ) );
    return;
}



EXTRA_DESCR_DATA *new_extra_descr( void )
{
    EXTRA_DESCR_DATA *pExtra;

/*    if ( !extra_descr_free )
    { */
	pExtra              =   alloc_perm( sizeof(*pExtra));
	top_ed++;
/*    }
    else
    {
	pExtra              =   extra_descr_free;
	extra_descr_free    =   extra_descr_free->next;
    }*/

    pExtra->next            =   NULL;
    pExtra->keyword         =   &str_empty[0];
    pExtra->description     =   &str_empty[0];
    pExtra->deleted	    =  	FALSE;

    return pExtra;
}



void free_extra_descr( EXTRA_DESCR_DATA *pExtra )
{
    free_string( pExtra->keyword );
    free_string( pExtra->description );

    top_ed--;
/*    pExtra->next        =   extra_descr_free;
    extra_descr_free    =   pExtra;*/
    free_mem( pExtra, sizeof( *pExtra ) );
    return;
}



ROOM_INDEX_DATA *new_room_index( void )
{
    ROOM_INDEX_DATA *pRoom;
    int door;

/*    if ( !room_index_free )
    {*/
	pRoom           =   alloc_perm( sizeof(*pRoom) );
	top_room++;
/*    }
    else
    {
	pRoom           =   room_index_free;
	room_index_free =   room_index_free->next;
    }*/

    pRoom->next             =   NULL;
    pRoom->people           =   NULL;
    pRoom->contents         =   NULL;
    pRoom->extra_descr      =   NULL;
    pRoom->area             =   NULL;

    for ( door=0; door < MAX_DIR; door++ )
	pRoom->exit[door]   =   NULL;

    pRoom->reset_first	    = 	NULL;
    pRoom->reset_last	    =   NULL;
    pRoom->traps	    =   NULL;
    pRoom->traptypes	    =   0;
    pRoom->name             =   &str_empty[0];
    pRoom->description      =   &str_empty[0];
    pRoom->vnum             =   0;
    pRoom->room_flags       =   0;
    pRoom->light            =   0;
    pRoom->sector_type      =   0;
    pRoom->rd		    =	0;

    return pRoom;
}

void free_social_index( SOCIAL_DATA *pSocial )
{
        free_string(pSocial->name);
        free_string(pSocial->char_no_arg);
        free_string(pSocial->others_no_arg);
        free_string(pSocial->char_found);
        free_string(pSocial->others_found);
        free_string(pSocial->vict_found);    
        free_string(pSocial->char_auto);
        free_string(pSocial->others_auto);    
	top_social--;

        free_mem( pSocial, sizeof( *pSocial ) );

  return;
}  

SOCIAL_DATA *new_social_index ( void )
{
    SOCIAL_DATA *pSocial;

	pSocial  =  alloc_perm( sizeof( *pSocial ));

	pSocial->next		   =       NULL;
	pSocial->name              =       &str_empty[0];
	pSocial->char_no_arg       =       &str_empty[0];
	pSocial->others_no_arg     =       &str_empty[0];
	pSocial->char_found        =       &str_empty[0];
	pSocial->others_found      =       &str_empty[0];
	pSocial->vict_found        =       &str_empty[0];
	pSocial->char_auto         =       &str_empty[0];
	pSocial->others_auto       =       &str_empty[0];
	top_social++;

 return pSocial;
}

NEWBIE_DATA *new_newbie_index( void )
{
  NEWBIE_DATA *pNewbie;

  pNewbie	= alloc_perm( sizeof(*pNewbie) );
  top_newbie++;
  pNewbie->next = NULL;
  pNewbie->keyword = &str_empty[0];
  pNewbie->answer1 = &str_empty[0];
  pNewbie->answer2 = &str_empty[0];

  return pNewbie;

}

CLAN_DATA *new_clan_index( void )
{
    CLAN_DATA *pClan;

/*    if ( !clan_index_free )
    {*/
	pClan           =   alloc_perm( sizeof(*pClan) );
	top_clan++;
/*    }
    else
    {
	pClan           =   clan_index_free;
	clan_index_free =   clan_index_free->next;
    }*/

    pClan->next             =   NULL;
    pClan->bankaccount.gold   = 0;
    pClan->bankaccount.silver = 0;
    pClan->bankaccount.copper = 0; 
    pClan->name             =   &str_empty[0];
    pClan->diety            =   &str_empty[0];
    pClan->description	    =   &str_empty[0];
    pClan->leader	    =   &str_empty[0];
    pClan->first	    =   &str_empty[0];
    pClan->second	    =   &str_empty[0];
    pClan->champ	    =   &str_empty[0];
    pClan->isleader	    =   FALSE;
    pClan->isfirst	    =	FALSE;
    pClan->issecond	    =   FALSE;
    pClan->ischamp	    =   FALSE;
    pClan->vnum             =   0;
    pClan->recall	    =   ROOM_VNUM_TEMPLE;
    pClan->members          =   0;
    pClan->pkills           =   0;
    pClan->mkills           =   0;
    pClan->mdeaths          =   0;
    pClan->pdeaths          =   0;
    pClan->settings         =   0;
    pClan->obj_vnum_1       =   OBJ_VNUM_DUMMY;
    pClan->obj_vnum_2       =   OBJ_VNUM_DUMMY;
    pClan->obj_vnum_3       =   OBJ_VNUM_DUMMY;
    return pClan;
}



void free_room_index( ROOM_INDEX_DATA *pRoom )
{
    int door;
    EXTRA_DESCR_DATA *pExtra;
    EXTRA_DESCR_DATA *pExtra_next;
    RESET_DATA 	     *pReset;
    RESET_DATA       *pReset_next;
    TRAP_DATA	     *pTrap;
    TRAP_DATA	     *pTrap_next;


    top_room--;
    free_string( pRoom->name );
    free_string( pRoom->description );

    for ( pTrap = pRoom->traps; pTrap; pTrap = pTrap_next )
    {
       pTrap_next = pTrap->next;
       free_trap_data( pTrap );
    }

    for ( door = 0; door < MAX_DIR; door++ )
    {
	if ( pRoom->exit[door] )
	    free_exit( pRoom->exit[door] );
    }

    for ( pExtra = pRoom->extra_descr; pExtra; pExtra = pExtra_next )
    {
	pExtra_next = pExtra->next;
	free_extra_descr( pExtra );
    }

    for ( pReset = pRoom->reset_first; pReset; pReset = pReset_next )
    {
	pReset_next = pReset->next;
	free_reset_data( pReset );
    }

/*    pRoom->next     =   room_index_free;
    room_index_free =   pRoom;*/
    free_mem( pRoom, sizeof( *pRoom ) );
    return;
}



AFFECT_DATA *new_affect( void )
{
    AFFECT_DATA *pAf;

/*    if ( !affect_free )
    {*/
	pAf             =   alloc_perm( sizeof(*pAf) );
	top_affect++;
/*    }
    else
    {
	pAf             =   affect_free;
	affect_free     =   affect_free->next;
    }*/

    pAf->next       =   NULL;
    pAf->type       =   0;
    pAf->level	    =   0;
    pAf->duration   =   0;
    pAf->location   =   0;
    pAf->modifier   =   0;
    pAf->bitvector  =   0;
    pAf->deleted    =   FALSE;

    return pAf;
}


ALIAS_DATA *new_alias( void )
{
  ALIAS_DATA *pAl;

  pAl = alloc_perm( sizeof( *pAl ) );

  pAl->next = NULL;
  pAl->old = &str_empty[0]; /*str_dup( "" );*/
  pAl->new = &str_empty[0]; /*str_dup( "" );*/

  return pAl;
}


void free_alias( ALIAS_DATA *pAl )
{
  free_string( pAl->old );
  free_string( pAl->new );

  free_mem( pAl, sizeof( *pAl ) );

  return;
}


void free_affect( AFFECT_DATA* pAf )
{
/*    pAf->next           = affect_free;
    affect_free         = pAf;*/
    top_affect--;
    free_mem( pAf, sizeof( *pAf ) );
    return;
}



SHOP_DATA *new_shop( void )
{
    SHOP_DATA *pShop;
    int buy;

/*    if ( !shop_free )
    {*/
	pShop           =   alloc_perm( sizeof(*pShop));
	top_shop++;
/*    }
    else
    {
	pShop           =   shop_free;
	shop_free       =   shop_free->next;
    }*/

    pShop->next         =   NULL;
    pShop->keeper       =   0;

    for ( buy=0; buy<MAX_TRADE; buy++ )
	pShop->buy_type[buy]    =   0;

    pShop->profit_buy   =   100;
    pShop->profit_sell  =   100;
    pShop->open_hour    =   0;
    pShop->close_hour   =   23;

    return pShop;
}



void free_shop( SHOP_DATA *pShop )
{
/*    pShop->next = shop_free;
    shop_free   = pShop;*/
    top_shop--;
    free_mem( pShop, sizeof( *pShop ) );
    return;
}

TRAP_DATA *new_trap_data( void )
{
  TRAP_DATA *pTrap;

/*  if ( !trap_free )
  {*/
    pTrap = alloc_perm( sizeof( *pTrap ) );
    top_trap++;
/*  }
  else
  {
    pTrap = trap_free;
    trap_free = trap_free->next;
  }*/

  pTrap->next = NULL;
  pTrap->next_here = NULL;
  pTrap->on_obj = NULL;
  pTrap->in_room = NULL;
  pTrap->on_exit = NULL;
  pTrap->disarmable = FALSE;
  pTrap->disarmed = FALSE;
  pTrap->disarm_dur = 0;
  pTrap->type = 1;
  pTrap->arglist = &str_empty[0]; /*str_dup( "" );*/
  pTrap->comlist = &str_empty[0]; /*str_dup( "" );*/
  return pTrap;
}

OBJ_INDEX_DATA *new_obj_index( void )
{
    OBJ_INDEX_DATA *pObj;
    int value;

/*    if ( !obj_index_free )
    {*/
	pObj           =   alloc_perm( sizeof(*pObj) );
	top_obj_index++;
/*    }
    else
    {
	pObj            =   obj_index_free;
	obj_index_free  =   obj_index_free->next;
    }*/

    pObj->next          =   NULL;
    pObj->extra_descr   =   NULL;
    pObj->affected      =   NULL;
    pObj->area          =   NULL;
    pObj->traps		=   NULL;
    pObj->traptypes	=   0;
    pObj->name          =   str_dup( "no name" );
    pObj->short_descr   =   str_dup( "(no short description)" );
    pObj->description   =   str_dup( "(no description)" );
    pObj->vnum          =   0;
    pObj->item_type     =   ITEM_TRASH;
    pObj->extra_flags   =   0;
    pObj->anti_race_flags = 0;
    pObj->anti_class_flags= 0;
    pObj->wear_flags    =   0;
    pObj->count         =   0;
    pObj->weight        =   0;
#ifdef NEW_MONEY
    pObj->cost.gold	=   0;
    pObj->cost.silver	=   0;
    pObj->cost.copper	=   0;
#else
    pObj->cost          =   0;
#endif
    pObj->level		=   0;
    for ( value=0; value<4; value++ )
	pObj->value[value]  =   0;
    pObj->ac_type	=   0;
    pObj->ac_vnum	=   0;
    pObj->ac_spell	=   &str_empty[0];
    pObj->ac_charge[0]	=   0;
    pObj->ac_charge[1]	=   0;
    pObj->join		=   0;
    pObj->sep_one	=   0;
    pObj->sep_two	=   0;

    return pObj;
}



void free_obj_index( OBJ_INDEX_DATA *pObj )
{
    EXTRA_DESCR_DATA *pExtra;
    EXTRA_DESCR_DATA *pExtra_next;
    AFFECT_DATA      *pAf;
    AFFECT_DATA      *pAf_next;
    TRAP_DATA	     *pTrap;
    TRAP_DATA	     *pTrap_next;

    top_obj_index--;

    free_string( pObj->name );
    free_string( pObj->short_descr );
    free_string( pObj->description );
    free_string( pObj->ac_spell );

    for ( pAf = pObj->affected; pAf; pAf = pAf_next )
    {
	pAf_next = pAf->next;
	free_affect( pAf );
    }

    for ( pExtra = pObj->extra_descr; pExtra; pExtra = pExtra_next )
    {
	pExtra_next = pExtra->next;
	free_extra_descr( pExtra );
    }

    for ( pTrap = pObj->traps; pTrap; pTrap = pTrap_next )
    {
       pTrap_next = pTrap->next;
       free_trap_data( pTrap );
    }

/*    pObj->next              = obj_index_free;
    obj_index_free          = pObj;*/
    free_mem( pObj, sizeof( *pObj ) );
    return;
}



MOB_INDEX_DATA *new_mob_index( void )
{
    MOB_INDEX_DATA *pMob;

/*    if ( !mob_index_free )
    {*/
	pMob           =   alloc_perm( sizeof(*pMob) );
	top_mob_index++;
/*    }
    else
    {
	pMob            =   mob_index_free;
	mob_index_free  =   mob_index_free->next;
    }*/

    pMob->next          =   NULL;
    pMob->spec_fun      =   NULL;
    pMob->pShop         =   NULL;
    pMob->area          =   NULL;
    pMob->mobprogs	=   NULL;
    pMob->player_name   =   str_dup( "no name" );
    pMob->short_descr   =   str_dup( "(no short description)" );
    pMob->long_descr    =   str_dup( "(no long description)\n\r" );
    pMob->description   =   &str_empty[0];
    pMob->vnum          =   0;
    pMob->progtypes	=   0;
    pMob->count         =   0;
    pMob->killed        =   0;
    pMob->sex           =   0;
    pMob->class		=   0;
    pMob->level         =   0;
    pMob->act           =   ACT_IS_NPC;
    pMob->affected_by   =   0;
    pMob->affected_by2  =   0;
    pMob->imm_flags	=   0;
    pMob->res_flags	=   0;
    pMob->vul_flags	=   0;
    pMob->alignment     =   0;
    pMob->hitroll	=   0;
    pMob->ac	        =   0;
    pMob->hitnodice	=   0;
    pMob->hitsizedice	=   0;
    pMob->hitplus	=   0;
    pMob->damnodice	=   0;
    pMob->damsizedice	=   0;
    pMob->damplus	=   0;
#ifdef NEW_MONEY
    pMob->money.gold	=   0;
    pMob->money.silver	=   0;
    pMob->money.copper	=   0;
#else
    pMob->gold          =   0;
#endif

    return pMob;
}

void free_mprog_data( MPROG_DATA *pMProg )
{
  free_string( pMProg->arglist );
  free_string( pMProg->comlist );

  top_mob_prog--;
/*  pMProg->next = mprog_free;
  mprog_free = pMProg;*/
  free_mem( pMProg, sizeof( *pMProg ) );
}


void free_mob_index( MOB_INDEX_DATA *pMob )
{
    MPROG_DATA	     *pMProg;
    MPROG_DATA	     *pMProg_next;
    SHOP_DATA	     *pShop;
    SHOP_DATA        *pShop_next;

    top_mob_index--;

    free_string( pMob->player_name );
    free_string( pMob->short_descr );
    free_string( pMob->long_descr );
    free_string( pMob->description );

    for ( pMProg = pMob->mobprogs; pMProg; pMProg = pMProg_next )
    {
       pMProg_next = pMProg->next;
       free_mprog_data( pMProg );
    }

    for ( pShop = pMob->pShop; pShop; pShop = pShop_next )
    {
       pShop_next = pShop->next;
       free_shop( pShop );
    }

/*    pMob->next              = mob_index_free;
    mob_index_free          = pMob;*/
    free_mem( pMob, sizeof( *pMob ) );
    return;
}

/* Altrag */
MPROG_DATA *new_mprog_data( void )
{
  MPROG_DATA *pMProg;

/*  if ( !mprog_free )
  {*/
    pMProg = alloc_perm( sizeof(*pMProg) );
    top_mob_prog++;
/*  }
  else
  {
    pMProg = mprog_free;
    mprog_free = mprog_free->next;
  }*/

  pMProg->next     = NULL;
  pMProg->type     = 1;
  pMProg->arglist  = &str_empty[0]; /*str_dup( "" );*/
  pMProg->comlist  = &str_empty[0]; /*str_dup( "" );*/
  return pMProg;
}


RACE_DATA *new_race_data( )
{
   RACE_DATA *pRace;

   top_race++;

   pRace             = alloc_perm( sizeof( RACE_DATA ));
   pRace->vnum       = 0;
   pRace->race_full  = NULL;
   pRace->race_name  = NULL;
   pRace->mstr       = 0;
   pRace->mint       = 0;
   pRace->mwis       = 0;
   pRace->mdex       = 0;
   pRace->mcon       = 0;

   return pRace;
}

void free_race_data( RACE_DATA *pRace )
{

   top_race--;

   free_string( pRace->race_name );
   free_string( pRace->race_full ); 

   free_mem( pRace, sizeof( *pRace ) );

}