summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/source/command.cc31
-rw-r--r--crawl-ref/source/dat/descript/skills.txt256
-rw-r--r--crawl-ref/source/database.cc5
-rw-r--r--crawl-ref/source/describe.cc129
-rw-r--r--crawl-ref/source/describe.h4
-rw-r--r--crawl-ref/source/fight.cc19
-rw-r--r--crawl-ref/source/skills2.cc73
-rw-r--r--crawl-ref/source/spl-util.cc5
-rw-r--r--crawl-ref/source/tutorial.cc88
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: