> It looks right.. though I'm no expert on godwars.
What do you do if you keep shoot craps?
1.) Keep throwing until they kick you out?
2.) Take a loan and try to stay above water?
3.) Walk away from the table?
I am completely lost in this memory leak. Going to post the code I have,
maybe someone who actually reads my 4 billionth post will see something.
I'm banking on 3.
MOB_INDEX_DATA *new_mob_index(void)
{
MOB_INDEX_DATA *pMob;
if (mob_index_free == NULL)
{
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->spec_name = 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 long description)");
pMob->description = str_dup("You need to clear this first!!!");
pMob->vnum = 0;
pMob->count = 0;
pMob->killed = 0;
pMob->sex = 0;
pMob->level = 0;
pMob->act = 1; /* NPC */
pMob->affected_by = 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;
pMob->gold = 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_shop(pMob->pShop);
pMob->next = mob_index_free;
mob_index_free = pMob;
return;
}
void medit(CHAR_DATA *ch, char *argument)
{
AREA_DATA *pArea;
MOB_INDEX_DATA *pMob;
char arg[MAX_STRING_LENGTH];
char arg1[MAX_STRING_LENGTH];
char arg2[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
int value;
int iHash;
strcpy(arg, argument);
smash_tilde(argument);
argument = one_argument(argument, arg1);
strcpy(arg2, argument);
value = atoi(arg2);
pMob = (MOB_INDEX_DATA *)ch->desc->pEdit;
pArea = pMob->area;
<snip shop data>
if (!str_cmp(arg1, "name"))
{
if (arg2[0] == '\0')
{
send_to_char("Syntax: name [string]\n\r", ch);
return;
}
free_string(pMob->player_name);
pMob->player_name = str_dup(arg2);
SET_BIT(pArea->area_flags, AREA_CHANGED);
send_to_char("Name set.\n\r", ch);
return;
}
if (!str_cmp(arg1, "short"))
{
if (arg2[0] == '\0')
{
send_to_char("Syntax: short [string]\n\r", ch);
return;
}
free_string(pMob->short_descr);
pMob->short_descr = str_dup(arg2);
SET_BIT(pArea->area_flags, AREA_CHANGED);
send_to_char("Short description set.\n\r", ch);
return;
}
if (!str_cmp(arg1, "long"))
{
if (arg2[0] == '\0')
{
send_to_char("Syntax: long [string]\n\r", ch);
return;
}
free_string(pMob->long_descr);
strcat(arg2, "\n\r");
pMob->long_descr = str_dup(arg2);
SET_BIT(pArea->area_flags, AREA_CHANGED);
send_to_char("Long description set.\n\r", ch);
return;
}
/*
* Create an instance of a mobile.
*/
CHAR_DATA *create_mobile( MOB_INDEX_DATA *pMobIndex )
{
CHAR_DATA *mob;
int tempvalue;
if ( pMobIndex == NULL )
{
bug( "Create_mobile: NULL pMobIndex.", 0 );
exit( 1 );
}
if ( char_free == NULL )
{
mob = alloc_perm( sizeof(*mob) );
}
else
{
mob = char_free;
char_free = char_free->next;
}
clear_char( mob );
mob->pIndexData = pMobIndex;
mob->hunting = str_dup( "" );
mob->lord = str_dup( "" );
mob->clan = str_dup( "" );
mob->morph = str_dup( "" );
mob->createtime = str_dup( "" );
mob->lasttime = str_dup( "" );
mob->lasthost = str_dup( "" );
mob->powertype = str_dup( "" );
mob->poweraction = str_dup( "" );
mob->pload = str_dup( "" );
mob->prompt = str_dup( "" );
mob->cprompt = str_dup( "" );
mob->name = pMobIndex->player_name;
mob->short_descr = pMobIndex->short_descr;
mob->long_descr = pMobIndex->long_descr;
mob->description = pMobIndex->description;
mob->spec_fun = pMobIndex->spec_fun;
mob->spec_name = pMobIndex->spec_name;
mob->home = 3001;
mob->form = 32767;
mob->level = number_fuzzy( pMobIndex->level );
mob->act = pMobIndex->act;
mob->affected_by = pMobIndex->affected_by;
mob->alignment = pMobIndex->alignment;
mob->sex = pMobIndex->sex;
/*
mob->pcdata->perm_str = 13;
mob->pcdata->perm_int = 13;
mob->pcdata->perm_wis = 13;
mob->pcdata->perm_dex = 13;
mob->pcdata->perm_con = 13;
*/
mob->armor = interpolate( mob->level, 100, -100 );
tempvalue = mob->level * 8 + number_range(
mob->level * mob->level / 4,
mob->level * mob->level );
// if (tempvalue > 30000) mob->max_hit = 30000;
mob->max_hit = tempvalue;
// if (tempvalue > 30000) mob->max_move = 30000;
mob->max_move = tempvalue;
// if (tempvalue > 30000) mob->max_mana = 30000;
mob->max_mana = tempvalue;
mob->hit = mob->max_hit;
mob->mana = mob->max_mana;
mob->move = mob->max_move;
mob->hitroll = mob->level * 4;
mob->damroll = mob->level * 4;
if (mob->spec_fun == spec_lookup("spec_gremlin_born"))
{
mob->max_mana = 100;
mob->max_move = 100;
mob->mana = 100;
mob->move = 100;
}
/*
* Insert in list.
*/
mob->next = char_list;
char_list = mob;
pMobIndex->count++;
return mob;
}
/*
* Free a string.
* Null is legal here to simplify callers.
* Read-only shared strings are not touched.
*/
void free_string( char *pstr )
{
if ( pstr == NULL
|| pstr == &str_empty[0]
|| ( pstr >= string_space && pstr < top_string ) )
return;
free_mem( pstr, strlen(pstr) + 1 );
return;
}
void free_mem( void *pMem, int sMem )
{
int iList;
for ( iList = 0; iList < MAX_MEM_LIST; iList++ )
{
if ( sMem <= rgSizeList[iList] )
break;
}
if ( iList == MAX_MEM_LIST )
{
bug( "Free_mem: size %d too large.", sMem );
exit( 1 );
}
* ((void **) pMem) = rgFreeList[iList];
rgFreeList[iList] = pMem;
return;
}
This will be my last post on this. Perhaps ever. Thanks alot Mr. Barton
(sorry for the double posts I keep sending you).
Eljon Curry