I am not sure what is happening here: Namely why adept is in the millions when it should be 95 at most.
Program received signal SIGSEGV, Segmentation fault.
0x00000000005d8ace in learn_from_success (ch=0xc426a0, sn=-1) at skills.c:1835
1835 adept = GET_ADEPT( ch, sn );
(gdb) list
1830
1831
1832
1833 if( IS_NPC( ch ) || ch->pcdata->learned[sn] <= 0 )
1834 return;
1835 adept = GET_ADEPT( ch, sn );
1836 sklvl = skill_table[sn]->skill_level[ch->Class];
1837 if( sklvl == 0 )
1838 sklvl = ch->level;
1839 if( ch->pcdata->learned[sn] < adept )
(gdb) print adept
$19 = 178727773
(gdb) print ch
$20 = (CHAR_DATA *) 0xc426a0
(gdb) print sn
$21 = -1
(gdb) print sklvl
$22 = 32
(gdb) print ch->level
$23 = 65
(gdb) print ch->pcdata->learned[sn]
$24 = 75
(gdb)
void learn_from_success( CHAR_DATA * ch, int sn )
{
int adept, gain, sklvl, learn, percent, schance;
if( IS_NPC( ch ) || ch->pcdata->learned[sn] <= 0 )
return;
adept = GET_ADEPT( ch, sn );
sklvl = skill_table[sn]->skill_level[ch->Class];
if( sklvl == 0 )
sklvl = ch->level;
if( ch->pcdata->learned[sn] < adept )
{
schance = ch->pcdata->learned[sn] + ( 5 * skill_table[sn]->difficulty );
percent = number_percent( );
if( percent >= schance )
learn = 2;
else if( schance - percent > 25 )
return;
else
learn = 1;
ch->pcdata->learned[sn] = UMIN( adept, ch->pcdata->learned[sn] + learn );
if( ch->pcdata->learned[sn] == adept ) /* fully learned! */
{
gain = 1000 * sklvl;
set_char_color( AT_WHITE, ch );
ch_printf( ch, "You are now an adept of %s! You gain %d bonus experience!\r\n", skill_table[sn]->name, gain );
}
else
{
gain = 100 * sklvl;
if( !ch->fighting && sn != gsn_hide && sn != gsn_sneak )
{
set_char_color( AT_WHITE, ch );
ch_printf( ch, "You gain %d experience points from your success!\r\n", gain );
}
}
gain_exp( ch, gain );
}
}