skills.c 724 Remove the wrapping if and else so that : if(skill->type!=SKILL_RACIAL) { send_to_char( "--------------------------[CLASS USE]--------------------------\n\r",ch); for ( iClass = 0; iClass < MAX_PC_CLASS; iClass++ ) { strcpy( buf, class_table[iClass]->who_name ); sprintf(buf+3, ") lvl: %3d max: %2d%%", skill->skill_level[iClass], skill->skill_adept[iClass] ); if ( iClass % 3 == 2 ) strcat(buf, "\n\r" ); else strcat(buf, " " ); send_to_char( buf, ch ); } } else { send_to_char( "\n\r--------------------------[RACE USE]--------------------------\n\r",ch); for ( iRace = 0; iRace < MAX_PC_RACE; iRace++ ) { sprintf(buf, "%8.8s) lvl: %3d max: %2d%%", race_table[iRace]->race_name, skill->race_level[iRace], skill->race_adept[iRace] ); if( !strcmp(race_table[iRace]->race_name,"unused") ) sprintf(buf," "); if ( (iRace>0) && (iRace % 2 == 1 )) strcat(buf, "\n\r" ); else strcat(buf, " " ); send_to_char( buf, ch ); } } Becomes: send_to_char( "--------------------------[CLASS USE]--------------------------\n\r",ch); for ( iClass = 0; iClass < MAX_PC_CLASS; iClass++ ) { strcpy( buf, class_table[iClass]->who_name ); sprintf(buf+3, ") lvl: %3d max: %2d%%", skill->skill_level[iClass], skill->skill_adept[iClass] ); if ( iClass % 3 == 2 ) strcat(buf, "\n\r" ); else strcat(buf, " " ); send_to_char( buf, ch ); } send_to_char( "\n\r--------------------------[RACE USE]--------------------------\n\r",ch); for ( iRace = 0; iRace < MAX_PC_RACE; iRace++ ) { sprintf(buf, "%8.8s) lvl: %3d max: %2d%%", race_table[iRace]->race_name, skill->race_level[iRace], skill->race_adept[iRace] ); if( !strcmp(race_table[iRace]->race_name,"unused") ) sprintf(buf," "); if ( (iRace>0) && (iRace % 2 == 1 )) strcat(buf, "\n\r" ); else strcat(buf, " " ); send_to_char( buf, ch ); } Add in these functions to skills.c and the prototypes for them to mud.h sh_int skill_adept( CHAR_DATA *ch, int sn) { sh_int max = 0; if (skill_table[(sn)]->skill_level[ch->class] <= LEVEL_HERO) max = skill_table[(sn)]->skill_adept[(ch)->class]; if (skill_table[sn]->race_level[ch->race] <= LEVEL_HERO) max = UMAX( max, skill_table[sn]->race_adept[ch->race]); return max; } sh_int skill_level( CHAR_DATA *ch, int sn) { sh_int low_level = UMIN( skill_table[sn]->skill_level[ch->class], LEVEL_IMMORTAL); low_level = UMIN( skill_table[sn]->race_level[ch->race], low_level); return low_level; } in do_practice: if ( ch->level < skill_table[sn]->skill_level[ch->class] || (!IS_IMMORTAL(ch) && skill_table[sn]->skill_level[ch->class] == 0) ) continue; becomes: if ( ch->level < skill_level( ch, sn) || (!IS_IMMORTAL(ch) && skill_table[sn]->skill_level[ch->class] == 0) ) continue; And: if ( can_prac && ( ( sn == -1 ) || ( !IS_NPC(ch) && ch->level < skill_table[sn]->skill_level[ch->class] /* OUT FOR THIS PORT -SHADDAI && ch->level < skill_table[sn]->race_level[ch->race] */ ) ) ) Becomes: if ( can_prac && ( ( sn == -1 ) || ( !IS_NPC(ch) && ch->level < skill_level( ch, sn) ) ) ) in do_slist: if(i==skill_table[sn]->skill_level[ch->class] ) becomes: if(i==skill_level( ch, sn) ) and skill_table[sn]->skill_adept[ch->class], becomes: skill_adept( ch, sn), void learn_from_success sklvl = skill_table[sn]->skill_level[ch->class]; becomes: sklvl = skill_level( ch, sn); void learn_from_failure sklvl = skill_table[sn]->skill_level[ch->class]; becomes: sklvl = skill_level( ch, sn); in save.c all four instances of: if ( skill_table[sn]->skill_level[ch->class] >= LEVEL_IMMORTAL ) become: if ( skill_level( ch, sn) >= LEVEL_IMMORTAL ) in magic.c int ch_slookup( CHAR_DATA *ch, const char *name ) && ch->level >= skill_table[sn]->skill_level[ch->class] becomes: && ch->level >= skill_level( ch, sn) int ch_bsearch_skill_prefix( CHAR_DATA *ch, const char *name, int first, int top ) && ch->level >= skill_table[sn]->skill_level[ch->class] ) becomes: && ch->level >= skill_level( ch, sn) int ch_bsearch_skill_exact( CHAR_DATA *ch, const char *name, int first, int top ) && ch->level >= skill_table[sn]->skill_level[ch->class] ) becomes: && ch->level >= skill_level( ch, sn) in do_cast: if ( ( sn = find_spell( ch, arg1, TRUE ) ) < 0 || ( !IS_NPC(ch) && ch->level < skill_table[sn]->skill_level[ch->class] ) ) becomes: if ( ( sn = find_spell( ch, arg1, TRUE ) ) < 0 || ( !IS_NPC(ch) && ch->level < skill_level( ch, sn) ) instances of: mana = IS_NPC(ch) ? 0 : UMAX(skill->min_mana, 100 / ( 2 + ch->level - skill->skill_level[ch->class] ) ); become: mana = IS_NPC(ch) ? 0 : UMAX(skill->min_mana, 100 / ( 2 + ch->level - skill_level( ch, sn) ) ); in mud.h: #define GET_ADEPT(ch,sn) ( skill_table[(sn)]->skill_adept[(ch)->class]) becomes: #define GET_ADEPT(ch,sn) ( skill_adept( ch, sn))