summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/skills.cc
diff options
context:
space:
mode:
authorPekka Lampila <pekka.lampila@iki.fi>2013-06-07 01:17:12 +0300
committerNeil Moore <neil@s-z.org>2013-06-06 19:33:32 -0400
commite0bb6f7075ee525a3d28584a897f08090cac4a77 (patch)
treef2b624031a436eace87cd3782c78040c2dae7cce /crawl-ref/source/skills.cc
parentd28d70e7ab6c23aa07cbc7a57fa446b8c1a881d2 (diff)
downloadcrawl-ref-e0bb6f7075ee525a3d28584a897f08090cac4a77.tar.gz
crawl-ref-e0bb6f7075ee525a3d28584a897f08090cac4a77.zip
Always study all manuals in the inventory
Multiple manuals for different skills can be used at once. If there are multiple manuals for the same skill, the one with least charges is used up first.
Diffstat (limited to 'crawl-ref/source/skills.cc')
-rw-r--r--crawl-ref/source/skills.cc35
1 files changed, 19 insertions, 16 deletions
diff --git a/crawl-ref/source/skills.cc b/crawl-ref/source/skills.cc
index 3c0a7d411e..9249bf9f4e 100644
--- a/crawl-ref/source/skills.cc
+++ b/crawl-ref/source/skills.cc
@@ -356,7 +356,7 @@ static void _check_abil_skills()
}
}
-static string _skill_names(skill_set &skills)
+string skill_names(skill_set &skills)
{
string s;
int i = 0;
@@ -365,12 +365,13 @@ static string _skill_names(skill_set &skills)
{
++i;
s += skill_name(*it);
- if (i == size)
- s += ".";
- else if (i == size - 1)
- s += " and ";
- else
- s+= ", ";
+ if (i < size)
+ {
+ if (i == size - 1)
+ s += " and ";
+ else
+ s+= ", ";
+ }
}
return s;
}
@@ -399,7 +400,7 @@ static void _check_start_train()
++it;
if (!skills.empty())
- mpr("You resume training " + _skill_names(skills));
+ mpr("You resume training " + skill_names(skills) + ".");
you.start_train.clear();
}
@@ -411,9 +412,6 @@ static void _check_stop_train()
_check_spell_skills();
_check_abil_skills();
- if (you.manual_skill != SK_NONE)
- you.stop_train.erase(you.manual_skill);
-
if (you.stop_train.empty())
return;
@@ -423,6 +421,8 @@ static void _check_stop_train()
{
if (is_invalid_skill(*it))
continue;
+ if (skill_has_manual(*it))
+ continue;
if (skill_trained(*it) && you.training[*it])
skills.insert(*it);
@@ -431,7 +431,7 @@ static void _check_stop_train()
if (!skills.empty())
{
- mpr("You stop training " + _skill_names(skills));
+ mpr("You stop training " + skill_names(skills) + ".");
check_selected_skills();
}
@@ -973,14 +973,17 @@ static int _train(skill_type exsk, int &max_exp, bool simu)
return 0;
// Bonus from manual
- if (exsk == you.manual_skill)
+ int slot;
+ int bonus_left = skill_inc;
+ while (bonus_left > 0 && (slot = manual_slot_for_skill(exsk)) != -1)
{
- item_def& manual(you.inv[you.manual_index]);
- const int bonus = min<int>(skill_inc, manual.plus2);
+ item_def& manual(you.inv[slot]);
+ const int bonus = min<int>(bonus_left, manual.plus2);
skill_inc += bonus;
+ bonus_left -= bonus;
manual.plus2 -= bonus;
if (!manual.plus2 && !simu)
- stop_studying_manual(true);
+ finish_manual(slot);
}
const skill_type old_best_skill = best_skill(SK_FIRST_SKILL, SK_LAST_SKILL);