/*************************************************************************** * 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 ) ); }