> 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


Reply via email to