Another version of a "skillstat". I found that the skillset2 was a great idea, but it needed a bit of tinkering, so here is the outcome ;) This snippet patches cleanly to bpl17 (with ascii pfiles, though that doesn't really impact here.) Simply "practice playername" to view their skills and percent of learnedness. (You are still able to practice normally, this simply expands the command for immortal use) Dana(dtluther@mindspring.com) *****in act.other.c***** replace do_practice with the following: ACMD(do_practice) { struct char_data *vict; void list_skills(struct char_data * ch); void list_skills_perct(struct char_data * ch, struct char_data * vict); one_argument(argument, arg); if (IS_NPC(ch)) return; if (*arg) { if(GET_LEVEL(ch) >= LVL_IMMORT) { if (!(vict = get_char_vis(ch, arg, FIND_CHAR_WORLD))) { send_to_char(NOPERSON, ch); return; } list_skills_perct(ch, vict); /* Pull up the skill list with %'s */ return; } send_to_char("You can only practice skills in your guild.\r\n", ch); } else list_skills(ch); } *****in spec_procs.c***** Immediately below the void list_skills() void list_skills_perct(struct char_data * ch, struct char_data * vict) { int i, sortpos; if (!GET_PRACTICES(vict)) sprintf(buf, "%s has no practice sessions remaining.\r\n", GET_NAME(vict)); else sprintf(buf, "%s has %d practice session%s remaining.\r\n", GET_NAME(vict), GET_PRACTICES(vict), (GET_PRACTICES(vict) == 1 ? "" : "s")); sprintf(buf + strlen(buf), "%s knows of the following %ss:\r\n", GET_NAME(vict), SPLSKL(vict)); strcpy(buf2, buf); for (sortpos = 1; sortpos <= MAX_SKILLS; sortpos++) { i = spell_sort_info[sortpos]; if (strlen(buf2) >= MAX_STRING_LENGTH - 32) { strcat(buf2, "**OVERFLOW**\r\n"); break; } if (GET_LEVEL(vict) >= spell_info[i].min_level[(int) GET_CLASS(vict)]) { sprintf(buf, "%-20s %d\r\n", spell_info[i].name, GET_SKILL(vict, i)); strcat(buf2, buf); /* The above, ^ should always be safe to do. */ } } page_string(ch->desc, buf2, 1); }