diff options
-rw-r--r-- | crawl-ref/source/command.cc | 31 | ||||
-rw-r--r-- | crawl-ref/source/dat/descript/skills.txt | 256 | ||||
-rw-r--r-- | crawl-ref/source/database.cc | 5 | ||||
-rw-r--r-- | crawl-ref/source/describe.cc | 129 | ||||
-rw-r--r-- | crawl-ref/source/describe.h | 4 | ||||
-rw-r--r-- | crawl-ref/source/fight.cc | 19 | ||||
-rw-r--r-- | crawl-ref/source/skills2.cc | 73 | ||||
-rw-r--r-- | crawl-ref/source/spl-util.cc | 5 | ||||
-rw-r--r-- | crawl-ref/source/tutorial.cc | 88 |
9 files changed, 495 insertions, 115 deletions
diff --git a/crawl-ref/source/command.cc b/crawl-ref/source/command.cc index 2f348e68e3..b6f92d2690 100644 --- a/crawl-ref/source/command.cc +++ b/crawl-ref/source/command.cc @@ -44,6 +44,7 @@ #include "player.h" #include "quiver.h" #include "religion.h" +#include "skills2.h" #include "spl-cast.h" #include "spl-util.h" #include "state.h" @@ -1035,6 +1036,24 @@ static bool _item_filter(std::string key, std::string body) return (item_types_by_name(key).base_type == OBJ_UNASSIGNED); } +static bool _skill_filter(std::string key, std::string body) +{ + key = lowercase_string(key); + std::string name; + for (int i = 0; i < NUM_SKILLS; i++) + { + // There are a couple of NULL entries in the skill set. + if (!skill_name(i)) + continue; + + name = lowercase_string(skill_name(i)); + + if (name.find(key) != std::string::npos) + return (false); + } + return (true); +} + static bool _feature_filter(std::string key, std::string body) { return (feat_by_desc(key) == DNGN_UNSEEN); @@ -1165,7 +1184,7 @@ static bool _find_description(bool &again, std::string& error_inout) if (! error_inout.empty()) mpr(error_inout.c_str(), MSGCH_PROMPT); - mpr("Describe a (M)onster, (S)pell, (I)tem, (F)eature, (G)od " + mpr("Describe a (M)onster, (S)pell, s(K)ill, (I)tem, (F)eature, (G)od " "or (B)ranch?", MSGCH_PROMPT); int ch = toupper(getch()); @@ -1195,6 +1214,10 @@ static bool _find_description(bool &again, std::string& error_inout) type = "spell"; filter = _spell_filter; break; + case 'K': + type = "skill"; + filter = _skill_filter; + break; case 'I': type = "item"; extra = " Enter a single letter to list items displayed by " @@ -1295,19 +1318,19 @@ static bool _find_description(bool &again, std::string& error_inout) { error_inout = "No monsters with symbol '"; error_inout += regex; - error_inout += "'"; + error_inout += "'."; } else if (by_item_symbol) { error_inout = "No items with symbol '"; error_inout += regex; - error_inout += "'"; + error_inout += "'."; } else { error_inout = "No matching "; error_inout += type; - error_inout += "s"; + error_inout += "s."; } return (false); } diff --git a/crawl-ref/source/dat/descript/skills.txt b/crawl-ref/source/dat/descript/skills.txt new file mode 100644 index 0000000000..fc194e6686 --- /dev/null +++ b/crawl-ref/source/dat/descript/skills.txt @@ -0,0 +1,256 @@ +%%%% +Buggy + +Buggy +(It's a bug if you ever see this.) +%%%% +Fighting + +Apart from making you more proficient in hand-to-hand combat, Fighting +also increases your maximum hitpoints. +%%%% +Short Blades + +Being skilled with a particular type of weapon will make it easier to +fight with all weapons of this type and make you deal more damage with +them. It is generally recommended to concentrate your efforts on one or +two weapon types to become more powerful in them. + +If you're already skilled in Short Blades, it is easier to become +skilled in Long Blades. +%%%% +Long Blades + +Being skilled with a particular type of weapon will make it easier to +fight with all weapons of this type and make you deal more damage with +them. It is generally recommended to concentrate your efforts on one or +two weapon types to become more powerful in them. + +If you're already skilled in Short Blades, it is easier to become +(more) skilled in Long Blades. +%%%% +Axes + +Being skilled with a particular type of weapon will make it easier to +fight with all weapons of this type and make you deal more damage with +them. It is generally recommended to concentrate your efforts on one or +two weapon types to become more powerful in them. + +Being skilled in Axes makes learning to fight with Maces or Polearms +easier. +%%%% +Maces & Flails + +Being skilled with a particular type of weapon will make it easier to +fight with all weapons of this type and make you deal more damage with +them. It is generally recommended to concentrate your efforts on one or +two weapon types to become more powerful in them. + +Being skilled in Maces & Flails makes it easier to also become skilled +when fighting with Axes. +%%%% +Polearms + +Being skilled with a particular type of weapon will make it easier to +fight with all weapons of this type and make you deal more damage with +them. It is generally recommended to concentrate your efforts on one or +two weapon types to become more powerful in them. + +Being skilled in Polearms eases training in Maces/Flails or Staves. +%%%% +Staves + +Being skilled with a particular type of weapon will make it easier to +fight with all weapons of this type and make you deal more damage with +them. It is generally recommended to concentrate your efforts on one or +two weapon types to become more powerful in them. + +Being skilled in Staves makes becoming skilled in Polearms easier. +%%%% +Slings + +Being skilled in a particular type of ranged attack will let you deal +more damage when using the appropriate launcher an dammunition. + +If you're already trained in Throwing, you'll pick up the Slings skill +faster, and vice versa. +%%%% +Bows + +Being skilled in a particular type of ranged attack will let you deal +more damage when using the appropriate launcher an dammunition. +%%%% +Crossbows + +Being skilled in a particular type of ranged attack will let you deal +more damage when using the appropriate launcher an dammunition. +%%%% +Darts + +Being skilled in a particular type of ranged attack will let you deal +more damage when using the appropriate launcher an dammunition. +%%%% +Throwing + +Training Throwing will make thrown weapons (as opposed to ones fired +from a launcher) more effective. In particular, it makes weapons of +returning more likely to actually return to their thrower. + +If you're already trained in Slings, you'll pick up the Throwing skill +faster, and vice versa. +%%%% +Armour + +Armour skill helps lessen the hinderance of heavy armour on moving, +spellcasting and other actions. +%%%% +Dodging + +Obviously, the Dodging skill will affect your chance of dodging an +attack, be it melee, ranged, or magical. You cannot dodge enchantments, +sadly. Rather, to resist them, you'll need magic resistance. +%%%% +Stealth + +By training stealth, you can make it less likely that monsters will +notice you. Note that monsters become more suspicious and observant as +you descend. +%%%% +Stabbing + +Stabbing is the skill that governs the likeliness of doing a great +amount of damage on a distracted or helpless creature. +Some gods may disapprove of this. +%%%% +Shields + +A high Shields skill of blocking a melee or ranged attack with your +equipped (or a magical) shield. +%%%% +Traps & Doors + +A character trained in Traps & Doors will be more observant to his or +her surroundings and be quicker in noticing traps and secret doors. +%%%% +Unarmed Combat + +A character trained in unarmed combat will occasionally do an +additional melee attack, provided they have the means to do so. +Of course, this skill also trains your proficiency in barehanded +combat. +%%%% +Spellcasting + +Now that you have the basic Spellcasting skill, you can learn and cast +spells, if you wish to. In addition, gaining another level in +Spellcasting will occasionally grant your more magic and "spell slots" +to spend on new spells. A high Spellcasting skill will also decrease +the amount by which casting a high level spell makes you hunger. +%%%% +Conjurations + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. +%%%% +Enchantments + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. +%%%% +Summonings + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. +%%%% +Necromancy + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. +%%%% +Translocations + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. +%%%% +Transmigration + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. +%%%% +Divinations + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. +%%%% +Fire Magic + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. + +Being skilled in Fire Magic makes Ice Magic harder to learn, and vice +versa. +%%%% +Ice Magic + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. + +Being skilled in Ice Magic makes Fire Magic harder to learn, and vice +versa. +%%%% +Air Magic + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. + +Being skilled in Air Magic makes Earth Magic harder to learn, and vice +versa. +%%%% +Earth Magic + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. + +Being skilled in Earth Magic makes Ice Magic harder to learn, and vice +versa. +%%%% +Poison Magic + +Being skilled in a magical "school" makes it easier to learn and cast +spells of this school. Many spells belong to a combination of several +schools, in which case the average skill in these schools will decide +on spellcasting success and power. +%%%% +Invocations + +Your Invocations skill affects the likelihood trying to use a +divine ability will be successful. +%%%% +Evocations + +Evocations is all about using magical items like wands, decks or +other uncommon objects. The higher your skill, the more likely is a +positive outcome when evoking items. +%%%% diff --git a/crawl-ref/source/database.cc b/crawl-ref/source/database.cc index c64b6b44a0..a700e4d825 100644 --- a/crawl-ref/source/database.cc +++ b/crawl-ref/source/database.cc @@ -65,6 +65,7 @@ static TextDB AllDBs[] = "descript/spells.txt", "descript/gods.txt", "descript/branches.txt", + "descript/skills.txt", NULL), TextDB( "db/randart", @@ -232,8 +233,8 @@ std::vector<std::string> database_find_keys(DBM *database, { std::string key((const char *)dbKey.dptr, dbKey.dsize); - if (tpat.matches(key) && - key.find("__") == std::string::npos + if (tpat.matches(key) + && key.find("__") == std::string::npos && (filter == NULL || !(*filter)(key, ""))) { matches.push_back(key); diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc index 877f61d546..255572a9b1 100644 --- a/crawl-ref/source/describe.cc +++ b/crawl-ref/source/describe.cc @@ -58,6 +58,7 @@ #include "spl-book.h" #include "stuff.h" #include "spl-util.h" +#include "transfor.h" #include "tutorial.h" #include "xom.h" @@ -2992,3 +2993,131 @@ void describe_god( god_type which_god, bool give_title ) if (keyin == '!') _detailed_god_description(which_god); } + +std::string get_skill_description(int skill, bool need_title) +{ + std::string lookup = skill_name(skill); + std::string result = ""; + + if (need_title) + { + result = lookup; + result += EOL EOL; + } + + result += getLongDescription(lookup); + + switch (skill) + { + case SK_UNARMED_COMBAT: + { + // Give a detailed listing of what attacks the character may perform. + std::vector<std::string> unarmed_attacks; + + if (you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON + || player_genus(GENPC_DRACONIAN) + || (you.species == SP_MERFOLK && player_is_swimming()) + || player_mutation_level( MUT_STINGER )) + { + unarmed_attacks.push_back("slap monsters with your tail"); + } + + if (player_mutation_level(MUT_FANGS) + || you.attribute[ATTR_TRANSFORMATION] == TRAN_DRAGON) + { + unarmed_attacks.push_back("bite other creatures"); + } + + if (you.species == SP_KENKU) + unarmed_attacks.push_back("peck at monsters with your beak"); + + if (player_mutation_level(MUT_HORNS)) + unarmed_attacks.push_back("do a headbutt attack with your horns"); + else if (you.species == SP_NAGA) + unarmed_attacks.push_back("do a headbutt attack"); + + if (player_mutation_level(MUT_HOOVES)) + { + unarmed_attacks.push_back("kick your enemies with your hooves"); + } + else if (player_mutation_level(MUT_TALONS)) + { + unarmed_attacks.push_back("claw at your enemies with your talons"); + } + else if (you.species != SP_NAGA + && (you.species != SP_MERFOLK || !player_is_swimming())) + { + unarmed_attacks.push_back("kick your enemies"); + } + + unarmed_attacks.push_back("punch monsters with your free hand"); + + if (!unarmed_attacks.empty()) + { + std::string broken = "For example, you could "; + broken += comma_separated_line(unarmed_attacks.begin(), + unarmed_attacks.end(), + " or ", ", "); + broken += "."; + linebreak_string2(broken, 72); + + result += EOL; + result += broken; + } + break; + } + case SK_INVOCATIONS: + if (you.species == SP_DEMIGOD) + { + result += EOL; + result += "How on earth did you manage to pick this up?"; + } + else if (you.religion == GOD_TROG) + { + result += EOL; + result += "Note that Trog doesn't use Invocations, it being too " + "closely connected to magic."; + } + else if (you.religion == GOD_NEMELEX_XOBEH) + { + result += EOL; + result += "Note that Nemelex uses Evocations rather than " + "Invocations."; + } + break; + + case SK_EVOCATIONS: + if (you.religion == GOD_NEMELEX_XOBEH) + { + result += EOL; + result += "This is the skill all of Nemelex' abilities rely on."; + } + break; + + case SK_SPELLCASTING: + if (you.religion == GOD_TROG) + { + result += EOL; + result += "Keep in mind, though, that Trog will greatly disapprove " + "of this."; + } + break; + default: + // No further information. + break; + } + + return result; +} + +void describe_skill(int skill) +{ + std::ostringstream data; + + data << get_skill_description(skill, true); + + clrscr(); + print_description(data.str()); + if (getch() == 0) + getch(); +} diff --git a/crawl-ref/source/describe.h b/crawl-ref/source/describe.h index a8014d7b95..009b6077eb 100644 --- a/crawl-ref/source/describe.h +++ b/crawl-ref/source/describe.h @@ -81,6 +81,10 @@ void describe_spell(spell_type spelled); * *********************************************************************** */ std::string get_ghost_description(const monsters &mons, bool concise = false); +std::string get_skill_description(int skill, bool need_title = false); + +void describe_skill(int skill); + void print_description( const std::string &d ); const char *trap_name(trap_type trap); diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc index 5e980de450..9792d59602 100644 --- a/crawl-ref/source/fight.cc +++ b/crawl-ref/source/fight.cc @@ -969,12 +969,19 @@ bool melee_attack::player_aux_unarmed() continue; } - unarmed_attack = (you.species == SP_KENKU) ? "peck" : "headbutt"; - - aux_damage = 5 + player_mutation_level(MUT_HORNS) * 3; - - // minotaurs used to get +5 damage here, now they get - // +6 because of the horns. + if (you.species == SP_KENKU + && (!player_mutation_level(MUT_HORNS) || coinflip())) + { + unarmed_attack = "peck"; + aux_damage = 6; + } + else + { + // Minotaurs used to get +5 damage here, now they get + // +6 because of the horns. + unarmed_attack = "headbutt"; + aux_damage = 5 + player_mutation_level(MUT_HORNS) * 3; + } if (you.equip[EQ_HELMET] != -1) { diff --git a/crawl-ref/source/skills2.cc b/crawl-ref/source/skills2.cc index 4f8283aafd..93212f0d52 100644 --- a/crawl-ref/source/skills2.cc +++ b/crawl-ref/source/skills2.cc @@ -21,6 +21,8 @@ #include "skills2.h" #include <algorithm> +#include <string> +#include <sstream> #include <stdio.h> #include <stdlib.h> @@ -30,6 +32,7 @@ #include <conio.h> #endif +#include "describe.h" #include "externs.h" #include "fight.h" #include "itemprop.h" @@ -41,11 +44,10 @@ #include "tutorial.h" #include "view.h" -/* Basic goals for titles: - The higher titles must come last. - Referring to the skill itself is fine ("Transmuter") but not impressive. - No overlaps, high diversity. -*/ +// Basic goals for titles: +// The higher titles must come last. +// Referring to the skill itself is fine ("Transmuter") but not impressive. +// No overlaps, high diversity. // Replace @genus@ with lowercase genus, @Genus@ with uppercase, and %s // with special cases defined below, including but not limited to species. @@ -53,6 +55,8 @@ // NOTE: Even though %s could be used with most of these, remember that // the character's race will be listed on the next line. It's only really // intended for cases where things might be really awkward without it. -- bwr + +// NOTE: If a skill name is changed, remember to also adapt the database entry. const char *skills[50][6] = { // Skill name levels 1-7 levels 8-14 levels 15-20 levels 21-26 level 27 @@ -1706,7 +1710,7 @@ static bool _player_knows_aptitudes() } -static void _display_skill_table(bool show_aptitudes) +static void _display_skill_table(bool show_aptitudes, bool show_description) { menu_letter lcount = 'a'; @@ -1714,9 +1718,10 @@ static void _display_skill_table(bool show_aptitudes) textcolor(LIGHTGREY); #if DEBUG_DIAGNOSTICS - cprintf( "You have %d points of unallocated experience " - " (cost lvl %d; total %d)." EOL EOL, - you.exp_available, you.skill_cost_level, you.total_skill_points ); + cprintf("You have %d points of unallocated experience " + " (cost lvl %d; total %d)." EOL EOL, + you.exp_available, you.skill_cost_level, + you.total_skill_points); #else cprintf(" You have %s unallocated experience." EOL EOL, you.exp_available == 0? "no" : @@ -1828,10 +1833,32 @@ static void _display_skill_table(bool show_aptitudes) else { // NOTE: If any more skills added, must adapt letters to go into caps. - cgotoxy(1, bottom_line-1); + cgotoxy(1, bottom_line-2); textcolor(LIGHTGREY); - cprintf("Press the letter of a skill to choose " - "whether you want to practise it."); + + if (show_description) + { + cprintf("Press the letter of a skill to read its description. " + " "); + } + else + { + cprintf("Press the letter of a skill to choose whether you want to " + "practise it."); + } + + cgotoxy(1, bottom_line-1); + if (show_description) + { + formatted_string::parse_string("Press '<w>?</w>' to choose which " + "skills to train. ").display(); + } + else + { + formatted_string::parse_string("Press '<w>?</w>' to read the " + "skills' descriptions.").display(); + } + if (_player_knows_aptitudes()) { cgotoxy(1, bottom_line); @@ -1845,11 +1872,12 @@ static void _display_skill_table(bool show_aptitudes) void show_skills() { - bool show_aptitudes = false; + bool show_aptitudes = false; + bool show_description = false; clrscr(); while (true) { - _display_skill_table(show_aptitudes); + _display_skill_table(show_aptitudes, show_description); const int keyin = getch(); if (keyin == '!' && _player_knows_aptitudes()) @@ -1858,7 +1886,14 @@ void show_skills() continue; } - if ( !isalpha(keyin) ) + if (keyin == '?') + { + // Show skill description. + show_description = !show_description; + continue; + } + + if (!isalpha(keyin)) break; menu_letter lcount = 'a'; // toggle skill practise @@ -1874,7 +1909,13 @@ void show_skills() if (keyin == lcount) { - you.practise_skill[x] = !you.practise_skill[x]; + if (!show_description) + you.practise_skill[x] = !you.practise_skill[x]; + else + { + describe_skill(x); + clrscr(); + } break; } ++lcount; diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc index f308ca2f55..0b4f541951 100644 --- a/crawl-ref/source/spl-util.cc +++ b/crawl-ref/source/spl-util.cc @@ -98,6 +98,7 @@ spell_type spell_by_name(std::string name, bool partial_match) { if (name.empty()) return (SPELL_NO_SPELL); + lowercase(name); if (!partial_match) @@ -129,8 +130,8 @@ spell_type spell_by_name(std::string name, bool partial_match) } } - return (spellmatch != -1? static_cast<spell_type>(spellmatch) - : SPELL_NO_SPELL); + return (spellmatch != -1 ? static_cast<spell_type>(spellmatch) + : SPELL_NO_SPELL); } int get_spell_slot_by_letter( char letter ) diff --git a/crawl-ref/source/tutorial.cc b/crawl-ref/source/tutorial.cc index 496ce598a1..ef7f3e357b 100644 --- a/crawl-ref/source/tutorial.cc +++ b/crawl-ref/source/tutorial.cc @@ -19,6 +19,7 @@ #include "abl-show.h" #include "cloud.h" #include "command.h" +#include "describe.h" #include "food.h" #include "format.h" #include "initfile.h" @@ -1025,103 +1026,20 @@ void tut_gained_new_skill(int skill) { // Special cases first. case SK_FIGHTING: - mpr("Apart from making you more proficient in hand-to-hand combat, " - "Fighting also increases your maximum hitpoints.", MSGCH_TUTORIAL); - break; - case SK_ARMOUR: - mpr("Armour skill helps lessen the hinderance of heavy armour on " - "moving, spellcasting and other actions.", MSGCH_TUTORIAL); - break; - case SK_STEALTH: - mpr("By training stealth, you can make it less likely that monsters " - "will notice you. Note that monsters become more suspicious and " - "observant as you descend.", MSGCH_TUTORIAL); - break; - case SK_STABBING: - mpr("Stabbing is the skill that governs the likeliness of doing a " - "great amount of damage on a distracted or helpless creature. " - "Some gods may disapprove of this.", MSGCH_TUTORIAL); - break; - case SK_TRAPS_DOORS: - mpr("A character trained in Traps & Doors will be more observant to " - "his or her surroundings and be quicker in noticing traps and " - "secret doors.", MSGCH_TUTORIAL); - break; - case SK_UNARMED_COMBAT: - { - std::string text; - text = "A character trained in unarmed combat will occasionally do an " - "additional melee attack, provided they have the means to do " - "so."; - - if (you.species == SP_MINOTAUR) - { - text += " For example, with your horns you can do a dangerous " - "headbutt attack."; - } - else if (you.species == SP_CENTAUR) - text += " For example, with your hooves you can kick your enemies."; - - text += " Of course, this skill also trains your proficiency in " - "barehanded combat."; - - mpr(text.c_str(), MSGCH_TUTORIAL); - break; - } case SK_INVOCATIONS: - mpr("Your Invocations skill affects the likelihood trying to use a " - "divine ability will be successful.", MSGCH_TUTORIAL); - break; - case SK_EVOCATIONS: - mpr("Evocations is all about using magical items like wands, decks or " - "other objects. The higher your skill, the more likely is a " - "positive outcome when evoking items.", MSGCH_TUTORIAL); - break; - case SK_DODGING: - mpr("Obviously, the Dodging skill will affect your chance of dodging " - "an attack, be it melee, ranged, or magical. You cannot dodge " - "enchantments, sadly. You'll need magic resistance to resist them.", - MSGCH_TUTORIAL); - break; - case SK_SHIELDS: - mpr("A high Shields skill of blocking a melee or ranged attack with " - "your equipped (or a magical) shield.", MSGCH_TUTORIAL); - break; - case SK_THROWING: - mpr("Training Throwing will make thrown weapons (as opposed to ones " - "fired from a launcher) more effective. In particular, it makes " - "weapons of returning more likely to actually return to the " - "thrower.", MSGCH_TUTORIAL); - break; - case SK_SPELLCASTING: - { - std::string text; - text = "Now that you have the basic Spellcasting skill, you can learn " - "and cast spells, if you wish to. "; - - if (you.religion == GOD_TROG) - text += "Note that Trog will disapprove of this, though."; - else - { - text += "In addition, gaining another level in Spellcasting will " - "occasionally grant your more magic and \"spell slots\" to " - "spend on new spells. A high Spellcasting skill will also " - "decrease the amount by which casting a high level spell " - "makes you hunger."; - } - mpr(text.c_str(), MSGCH_TUTORIAL); + mpr(get_skill_description(skill).c_str(), MSGCH_TUTORIAL); break; - } + // Only one message for all magic skills (except Spellcasting). case SK_CONJURATIONS: case SK_ENCHANTMENTS: |