/**************************************************************************/ // mem.cpp - /*************************************************************************** * The Dawn of Time v1.69r (c)1997-2004 Michael Garratt * * >> A number of people have contributed to the Dawn codebase, with the * * majority of code written by Michael Garratt - www.dawnoftime.org * * >> To use this source code, you must fully comply with all the licenses * * in licenses.txt... In particular, you may not remove this copyright * * notice. * *************************************************************************** * >> Original Diku Mud copyright (c)1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, & Katja Nyboe. * * >> Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * >> ROM 2.4 is copyright 1993-1995 Russ Taylor and has been brought to * * you by the ROM consortium: Russ Taylor(rtaylor@pacinfo.com), * * Gabrielle Taylor(gtaylor@pacinfo.com) & Brian Moore(rom@rom.efn.org) * * >> Oblivion 1.2 is copyright 1996 Wes Wagner * **************************************************************************/ /*************************************************************************** * 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. * * * ***************************************************************************/ #include "include.h" // dawn standard includes // Globals extern int top_reset; extern int top_area; extern int top_exit; extern int top_ed; extern int top_room; extern int top_mprog_index; AREA_DATA * area_free; EXIT_DATA * exit_free; ROOM_INDEX_DATA * room_index_free; OBJ_INDEX_DATA * obj_index_free; SHOP_DATA * shop_free; MOB_INDEX_DATA * mob_index_free; RESET_DATA * reset_free; ROOM_ECHO_DATA * room_echo_free; AREA_ECHO_DATA * area_echo_free; void free_extra_descr args( ( EXTRA_DESCR_DATA *pExtra ) ); void free_affect args( ( AFFECT_DATA *af ) ); void free_mprogs args ( ( MPROG_LIST *mp ) ); /**************************************************************************/ RESET_DATA *new_reset_data( void ) { RESET_DATA *pReset; if ( !reset_free ) { pReset = (RESET_DATA *)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; pReset->arg4 = 0; return pReset; } /**************************************************************************/ void free_reset_data( RESET_DATA *pReset ) { pReset->next = reset_free; reset_free = pReset; return; } /**************************************************************************/ AREA_DATA *new_area( void ) { AREA_DATA *pArea; char buf[MIL]; if ( !area_free ) { pArea = (AREA_DATA *)alloc_perm( sizeof(*pArea) ); top_area++; } else { pArea = area_free; area_free = area_free->next; } pArea->min_vnum = 0; pArea->max_vnum = 0; pArea->next = NULL; pArea->vnumsort_next = NULL; pArea->name = str_dup( "New area" ); pArea->olc_flags = OLCAREA_ADDED; pArea->area_flags = AREA_OLCONLY + AREA_NOTELEPORT + AREA_NOSCRY; pArea->security = 9; pArea->builders = str_dup( "None" ); pArea->credits = str_dup(""); pArea->continent = NULL; // default them as any for (int br=0;br<MAX_BUILD_RESTRICTS;br++) { pArea->build_restricts[br]= str_dup(""); } pArea->min_vnum = 0; pArea->max_vnum = 0; pArea->age = 0; pArea->nplayer = 0; pArea->empty = true; { int filenum=0; bool dup_in_list; AREA_DATA *pArealist; for(filenum=0; ; filenum++){ sprintf( buf, "area%d.are", filenum); if(file_exists(buf)){ continue; } dup_in_list=false; for ( pArealist= area_first; pArealist; pArealist= pArealist->next ) { if (!str_cmp( buf, pArealist->file_name)){ dup_in_list=true; break; } } if(dup_in_list){ continue; } break; // found an available file name } } pArea->file_name = str_dup( buf ); pArea->short_name = str_dup(""); pArea->vnum = top_area-1; pArea->colour = &str_empty[0]; pArea->maplevel = LEVEL_IMMORTAL; pArea->vnum_offset = 0; return pArea; } /**************************************************************************/ void free_area( AREA_DATA *pArea ) { //@@@ need to make functions that use this remove areas from the // vnumsort_next list free_string( pArea->name ); free_string( pArea->file_name ); free_string( pArea->builders ); free_string( pArea->credits ); pArea->next = area_free->next; area_free = pArea; return; } /**************************************************************************/ EXIT_DATA *new_exit( void ) { EXIT_DATA *pExit; if ( !exit_free ) { pExit = (EXIT_DATA *)alloc_perm( sizeof(*pExit) ); top_exit++; } else { pExit = exit_free; exit_free = exit_free->next; } pExit->u1.to_room = NULL; pExit->next = NULL; pExit->exit_info = 0; pExit->key = 0; pExit->keyword = &str_empty[0]; pExit->description = &str_empty[0]; pExit->rs_flags = 0; return pExit; } /**************************************************************************/ void free_exit( EXIT_DATA *pExit ) { free_string( pExit->keyword ); free_string( pExit->description ); pExit->next = exit_free; exit_free = pExit; return; } /**************************************************************************/ // Kal - Jan 2001 room_echo_data *new_room_echo( void ) { room_echo_data *recho; if( room_echo_free ){ recho = room_echo_free; room_echo_free = room_echo_free->next; }else{ recho = (room_echo_data*)alloc_perm( sizeof(*recho) ); } recho->echotext = &str_empty[0]; recho->firsthour = 23; recho->lasthour = 0; recho->percentage = 4; recho->next = NULL; return recho; } /**************************************************************************/ // Kal - Jan 2001 void free_room_echo( room_echo_data *recho) { replace_string( recho->echotext, ""); recho->next = room_echo_free; room_echo_free = recho; return; } /**************************************************************************/ ROOM_INDEX_DATA *new_room_index( void ) { ROOM_INDEX_DATA *pRoom; int door; if ( !room_index_free ) { pRoom = (ROOM_INDEX_DATA *)alloc_perm( sizeof(*pRoom) ); pRoom->name = &str_empty[0]; pRoom->description = &str_empty[0]; pRoom->owner = &str_empty[0]; pRoom->invite_list = &str_empty[0]; 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; pRoom->lockers = NULL; pRoom->echoes = NULL; for ( door=0; door < MAX_DIR; door++ ) pRoom->exit[door] = NULL; pRoom->vnum = 0; pRoom->room_flags = 0; pRoom->light = 0; pRoom->sector_type = 0; pRoom->clan = 0; pRoom->heal_rate = 100; pRoom->mana_rate = 100; return pRoom; } /**************************************************************************/ // Kal, Jan 2001 void free_room_index( ROOM_INDEX_DATA *pRoom ) { int door; EXTRA_DESCR_DATA *pExtra, *pExtra_next; RESET_DATA *pReset, *pReset_next; replace_string( pRoom->name, ""); replace_string( pRoom->description, ""); replace_string( pRoom->owner, "" ); replace_string( pRoom->invite_list, "" ); 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; return; } extern AFFECT_DATA *affect_free; /**************************************************************************/ SHOP_DATA *new_shop( void ) { SHOP_DATA *pShop; int buy; if ( !shop_free ) { pShop = (SHOP_DATA *)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 ) { if(pShop){ pShop->next = shop_free; shop_free = pShop; } return; } /**************************************************************************/ OBJ_INDEX_DATA *new_obj_index( void ) { OBJ_INDEX_DATA *pObj; int value; if ( !obj_index_free ) { pObj = (OBJ_INDEX_DATA *)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->relative_size = 50; pObj->absolute_size = 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->wear_flags = 0; pObj->count = 0; pObj->weight = 0; pObj->cost = 0; pObj->material = str_dup( "unknown" ); pObj->condition = 100; for ( value = 0; value < 5; value++ ){ pObj->value[value] = 0; } pObj->ospec_fun = NULL; return pObj; } /**************************************************************************/ void free_obj_index( OBJ_INDEX_DATA *pObj ) { EXTRA_DESCR_DATA *pExtra; AFFECT_DATA *pAf; free_string( pObj->name ); free_string( pObj->short_descr ); free_string( pObj->description ); for ( pAf = pObj->affected; pAf; pAf = pAf->next ){ free_affect( pAf ); } for ( pExtra = pObj->extra_descr; pExtra; pExtra = pExtra->next ){ free_extra_descr( pExtra ); } pObj->next = obj_index_free; obj_index_free = pObj; return; } /**************************************************************************/ MOB_INDEX_DATA *new_mob_index( void ) { MOB_INDEX_DATA *pMob; if ( !mob_index_free ) { pMob = (MOB_INDEX_DATA *)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->player_name = str_dup( "no name" ); pMob->short_descr = str_dup( "(no short description)" ); pMob->long_descr = str_dup( "(no default description)" ); pMob->description = &str_empty[0]; pMob->vnum = 0; pMob->count = 0; pMob->killed = 0; pMob->sex = 0; pMob->level = 0; pMob->act = ACT_IS_NPC; pMob->affected_by = 0; pMob->alliance = 0; pMob->tendency = 0; pMob->hitroll = 0; pMob->race = race_lookup( "human" ); pMob->form = 0; pMob->parts = 0; pMob->imm_flags = 0; pMob->res_flags = 0; pMob->vuln_flags = 0; pMob->material = str_dup("unknown"); pMob->off_flags = 0; pMob->size = SIZE_MEDIUM; pMob->ac[AC_PIERCE] = 0; pMob->ac[AC_BASH] = 0; pMob->ac[AC_SLASH] = 0; pMob->ac[AC_EXOTIC] = 0; pMob->hit[DICE_NUMBER] = 0; pMob->hit[DICE_TYPE] = 0; pMob->hit[DICE_BONUS] = 0; pMob->mana[DICE_NUMBER] = 0; pMob->mana[DICE_TYPE] = 0; pMob->mana[DICE_BONUS] = 0; pMob->damage[DICE_NUMBER]= 0; pMob->damage[DICE_TYPE] = 0; pMob->damage[DICE_NUMBER]= 0; pMob->start_pos = POS_STANDING; pMob->default_pos = POS_STANDING; pMob->wealth = 0; return pMob; } /**************************************************************************/ void free_mob_index( MOB_INDEX_DATA *pMob ) { free_string( pMob->player_name ); free_string( pMob->short_descr ); free_string( pMob->long_descr ); free_string( pMob->description ); free_mprogs( pMob->mprogs ); free_shop( pMob->pShop ); pMob->next = mob_index_free; mob_index_free = pMob; top_mob_index--; return; } /**************************************************************************/ MPROG_CODE * mpcode_free; MPROG_CODE *new_mpcode(void) { MPROG_CODE *NewCode; if (!mpcode_free) { NewCode = (MPROG_CODE *)alloc_perm(sizeof(*NewCode) ); top_mprog_index++; } else { NewCode = mpcode_free; mpcode_free = mpcode_free->next; } NewCode->vnum = 0; NewCode->code = str_dup(""); NewCode->author = str_dup(""); NewCode->disabled=false; NewCode->disabled_text=str_dup(""); NewCode->next = NULL; return NewCode; } /**************************************************************************/ void free_mpcode(MPROG_CODE *pMcode) { replace_string(pMcode->code,""); replace_string(pMcode->author,""); pMcode->next = mpcode_free; mpcode_free = pMcode; return; } /**************************************************************************/ // Daos - Dec. 2001 area_echo_data *new_area_echo( void ) { area_echo_data *aecho; if( area_echo_free ){ aecho = area_echo_free; area_echo_free = area_echo_free->next; }else{ aecho = (area_echo_data*)alloc_perm( sizeof(*aecho) ); } aecho->echotext = &str_empty[0]; aecho->firsthour = 23; aecho->lasthour = 0; aecho->percentage = 4; aecho->next = NULL; return aecho; } /**************************************************************************/ // Daos - Dec. 2001 void free_area_echo( area_echo_data *aecho) { replace_string( aecho->echotext, ""); aecho->next = area_echo_free; area_echo_free = aecho; return; } /**************************************************************************/ extern char *string_space; /**************************************************************************/ // called while the mud is shuting down() void deallocate_all_memory() { // undo the effect of init_string_space(); free(string_space); } /**************************************************************************/ /**************************************************************************/