summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/effects.cc
diff options
context:
space:
mode:
authorzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-12-13 05:43:36 +0000
committerzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-12-13 05:43:36 +0000
commit4eca7c3f1b63c4bcb48ed78c1214ee2a1d2e9ded (patch)
tree1a7e39cc13c8bbff98ef00c32ea604924470206e /crawl-ref/source/effects.cc
parent9e6fb5de4cf9c3eb3ffe4e7eb9b594b40ae81e14 (diff)
downloadcrawl-ref-4eca7c3f1b63c4bcb48ed78c1214ee2a1d2e9ded.tar.gz
crawl-ref-4eca7c3f1b63c4bcb48ed78c1214ee2a1d2e9ded.zip
Fixed some book acquirement crashes, and not getting any more manuals after
having seen all nine of the different levels of fixed level randart books. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7818 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/effects.cc')
-rw-r--r--crawl-ref/source/effects.cc26
1 files changed, 20 insertions, 6 deletions
diff --git a/crawl-ref/source/effects.cc b/crawl-ref/source/effects.cc
index 8dcbc673c8..d66b9d3d45 100644
--- a/crawl-ref/source/effects.cc
+++ b/crawl-ref/source/effects.cc
@@ -1430,6 +1430,8 @@ static void _do_book_acquirement(item_def &book, int agent)
int level = (you.skills[SK_SPELLCASTING] + 2) / 3;
unsigned int seen_levels = you.attribute[ATTR_RND_LVL_BOOKS];
+ level = std::max(1, level);
+
if (agent == GOD_XOM)
level = random_range(1, 9);
else if (seen_levels & (1 << level))
@@ -1452,12 +1454,14 @@ static void _do_book_acquirement(item_def &book, int agent)
level = -1;
}
- int choice = random_choose_weighted(
- 55, 0, // fixed themed
- 24, 1, // leave alone
- level == -1 ? 0 : 12, 2, // fixed level
- agent == GOD_XOM ? 0 : 6, 3, // manual (too useful for Xom)
- 0);
+ int choice_weights[4] = {
+ 55, // fixed themed
+ 24, // leave alone
+ level == -1 ? 0 : 12, // fixed level
+ agent == GOD_XOM ? 0 : 6, // manual (too useful for Xom)
+ };
+
+ int choice = choose_random_weighted(choice_weights, choice_weights + 4);
switch(choice)
{
@@ -1480,6 +1484,7 @@ static void _do_book_acquirement(item_def &book, int agent)
case 3:
{
int weights[SK_POISON_MAGIC - SK_CONJURATIONS + 1];
+ int total_weights = 0;
for (int i = SK_CONJURATIONS; i <= SK_POISON_MAGIC; i++)
{
@@ -1487,7 +1492,16 @@ static void _do_book_acquirement(item_def &book, int agent)
* 100 / species_skills(i, you.species);
weights[i - SK_CONJURATIONS] = w;
+ total_weights += w;
}
+
+ // Are we too skilled to get any manuals?
+ if (total_weights == 0)
+ {
+ _do_book_acquirement(book, agent);
+ return;
+ }
+
int skill = choose_random_weighted(weights,
weights + ARRAYSZ(weights));
skill += SK_CONJURATIONS;