This spec is for MUDs that use multiple languages - to provide a special "language professor" to teach languages. You will most likely need to tailor the languages used here to match what you use. This was created to work with the "language2.txt" snippet from: Frollo but should work with most systems with some tweaking. Note - This uses quest points as charge for learning, if you don't use quest points, just change these references to gold costs instead, or take them out entirely. This is, as usual for me, a do it by hand patch. In spec_procs.c ********************* Add the following: void list_study_languages(struct char_data *ch, struct char_data *teacher) { int i, a; sprintf(buf, "I can teach the following languages: "); /* NUM_LANGUAGES would be easier */ for (i = 0; i < (MAX_SKILLS - MIN_LANGUAGES); i++){ sprintf(buf + strlen(buf), "%s ", languages[i]); } do_say(teacher, buf, 0, 0); return; } SPECIAL(lang_prof) { int lang, qpcost; struct char_data *teacher = (struct char_data *) me; if (IS_NPC(ch)) return (FALSE); if (!(CMD_IS("study"))) return (FALSE); skip_spaces(&argument); if (!argument){ list_study_languages(ch, teacher); return (TRUE); } if (is_abbrev(argument, "common")) lang = LANG_COMMON; else if (is_abbrev(argument, "human")) lang = LANG_HUMAN; else if (is_abbrev(argument, "elven")) lang = LANG_ELVEN; else if (is_abbrev(argument, "gnomish")) lang = LANG_GNOME; else if (is_abbrev(argument, "dwarven")) lang = LANG_DWARVEN; else { list_study_languages(ch, teacher); return(TRUE); } if (GET_PRACTICES(ch) <= 0){ do_say(teacher, "You haven't earned the right to study anything new.", 0, teacher->in_room); return(TRUE); } if (GET_SKILL(ch, lang) >= 95){ sprintf(buf, "You are already fluent in the %s tongue, %s.", languages[(lang - MIN_LANGUAGES)], GET_NAME(ch)); do_say(teacher, buf, 0, 0); return (TRUE); } else if (GET_SKILL(ch, lang) >= 50){ sprintf(buf, "You have learned as much as I can teach you of the %s tongue, %s.",languages[(lang - MIN_LANGUAGES)], GET_NAME(ch)); do_say(teacher, buf, 0, 0); return (TRUE); } if (GET_INT(ch) < 11){ sprintf(buf, "%s, you are lucky you can speak your native tongue.", GET_NAME(ch)); do_say(teacher, buf, 0, 0); return (TRUE); } /* This is what you should change if you wish to charge gold * instead - check to see if they have enough. */ if (GET_QPS(ch) < 1){ sprintf(buf, "Sorry, %s, but you cannot afford to study here.", GET_NAME(ch)); do_say(teacher, buf, 0, 0); return (TRUE); } /* Again here, change QPS to Gold if not using quest points */ /* Okay, all else being equal, it's time to study. */ qpcost = MIN(GET_QPS(ch), number(1, (25-GET_INT(ch)))); GET_SKILL(ch, lang) += qpcost; GET_QPS(ch) -= qpcost; GET_PRACTICES(ch) -= 1; sprintf(buf, "You have increased your knowledge of the %s tongue.", languages[(lang-MIN_LANGUAGES)]); act(buf, TRUE, ch, 0, 0, TO_CHAR); act("$n studies diligently.", FALSE, ch, 0, 0, TO_ROOM); return(TRUE); }