diff options
-rw-r--r-- | crawl-ref/source/dat/database/randname.txt | 59 | ||||
-rw-r--r-- | crawl-ref/source/spl-book.cc | 55 |
2 files changed, 91 insertions, 23 deletions
diff --git a/crawl-ref/source/dat/database/randname.txt b/crawl-ref/source/dat/database/randname.txt index 7adb246c4f..d797cef042 100644 --- a/crawl-ref/source/dat/database/randname.txt +++ b/crawl-ref/source/dat/database/randname.txt @@ -786,6 +786,16 @@ amulet appearance ###################################################### # Books ###################################################### +# Book name should be set in make_book_level_randart() or +# make_book_theme_randart(), so if this gets picked there's a bug. +book + +Book of Bugginess +%%%% +book appearance + +@book_adjective@ +%%%% book_noun Book @@ -834,14 +844,21 @@ yellowed rare %%%% +the_book_magic + +w:1 +// capitalize later as needed +the Arcane Arts + +w:9 +@book_magic@ +%%%% book_magic Magic Theurgy -The Arcane Arts - Rites and Rhymes Secret Knowledge @@ -855,31 +872,41 @@ Sorcery Witchcraft Witchery - -Bewitchment - %%%% -level book +# level 1-3 +easy level book -@book_magic@ 101 +@the_book_magic@ 101 Easy @book_magic@ -@book_magic@ in Simple Steps +@the_book_magic@ in Simple Steps -Thorough Guide to @book_magic@ +Early Guide to @book_magic@ -Last Secrets of @book_magic@ +@the_book_magic@ for Beginners %%%% -# Book name should be set in make_book_level_randart() or -# make_book_theme_randart(), so if this gets picked there's a bug. -book +# level 4-6 +moderate level book -Book of Bugginess +Advanced Steps in @the_book_magic@ + +Advanced Guide to @the_book_magic@ + +Further Steps in @the_book_magic@ + +Improve Your @book_magic@ %%%% -book appearance +# level 7-9 +difficult level book -@book_adjective@ +Thorough Guide to @the_book_magic@ + +Last Secrets of @the_book_magic@ + +Arcane Secrets of @book_magic@ + +Intricacies of @the_book_magic@ %%%% Conjuration diff --git a/crawl-ref/source/spl-book.cc b/crawl-ref/source/spl-book.cc index 4d46a52fca..2ee27f66ca 100644 --- a/crawl-ref/source/spl-book.cc +++ b/crawl-ref/source/spl-book.cc @@ -1737,7 +1737,7 @@ static void _get_spell_list(std::vector<spell_type> &spell_list, int level, if (!is_valid_spell(spell)) continue; - // Only use spells available in books you might find laying about + // Only use spells available in books you might find lying about // the dungeon. if (spell_rarity(spell) == -1) continue; @@ -1755,7 +1755,7 @@ static void _get_spell_list(std::vector<spell_type> &spell_list, int level, continue; } - // Only wizards gets spells still under development. + // Only wizard mode gets spells still under development. const unsigned int flags = get_spell_flags(spell); if (flags & SPFLAG_DEVEL) { @@ -1860,14 +1860,18 @@ bool make_book_level_randart(item_def &book, int level, char buf[80]; if (god_discard > 0 && uncastable_discard == 0) + { sprintf(buf, "%s disliked all level %d spells", god_name(god).c_str(), level); + } else if (god_discard == 0 && uncastable_discard > 0) sprintf(buf, "No level %d spells can be cast by you", level); else if (god_discard > 0 && uncastable_discard > 0) + { sprintf(buf, "All level %d spells are either disliked by %s " "or cannot be cast by you.", level, god_name(god).c_str()); + } else sprintf(buf, "No level %d spells?!?!?!", level); @@ -1905,9 +1909,7 @@ bool make_book_level_randart(item_def &book, int level, spell_type chosen_spells[SPELLBOOK_SIZE]; for (int i = 0; i < SPELLBOOK_SIZE; i++) - { chosen_spells[i] = SPELL_NO_SPELL; - } int book_pos = 0; while (book_pos < num_spells) @@ -1949,7 +1951,20 @@ bool make_book_level_randart(item_def &book, int level, if (god != GOD_NO_GOD) name += god_name(god, false) + "'s "; - name += getRandNameString("level book"); + std::string difficulty; + if (level <= 3) + difficulty = "easy"; + else if (level <= 6) + difficulty = "moderate"; + else + difficulty = "difficult"; + + std::string bookname = getRandNameString(difficulty + " level book"); + bookname = uppercase_first(bookname); + if (bookname.empty()) + bookname = getRandNameString("book"); + + name += bookname; name += '"'; set_randart_name(book, name); @@ -2217,8 +2232,7 @@ bool make_book_theme_randart(item_def &book, int disc1, int disc2, _get_weighted_spells(completely_random, god, disc1, disc2, num_spells, max_levels, spell_list, chosen_spells); - std::sort(chosen_spells, chosen_spells + SPELLBOOK_SIZE, - _compare_spells); + std::sort(chosen_spells, chosen_spells + SPELLBOOK_SIZE, _compare_spells); ASSERT(chosen_spells[0] != SPELL_NO_SPELL); CrawlHashTable &props = book.props; @@ -2228,8 +2242,35 @@ bool make_book_theme_randart(item_def &book, int disc1, int disc2, CrawlVector &spell_vec = props[SPELL_LIST_KEY]; spell_vec.set_max_size(SPELLBOOK_SIZE); + int count[SPTYP_LAST_EXPONENT+1]; + for (int k = 0; k <= SPTYP_LAST_EXPONENT; k++) + count[k] = 0; + for (int i = 0; i < SPELLBOOK_SIZE; i++) + { spell_vec[i] = (long) chosen_spells[i]; + for (int k = 0; k <= SPTYP_LAST_EXPONENT; k++) + if (spell_typematch( chosen_spells[i], 1 << k )) + count[k]++; + } + + int max1 = 0; + int max2 = 0; + for (int k = 1; k <= SPTYP_LAST_EXPONENT; k++) + { + if (count[k] > count[max1]) + { + max2 = max1; + max1 = k; + } + else if (max2 == max1 || count[k] > count[max2]) + max2 = k; + } + disc1 = 1 << max1; + if (max1 != max2 && count[max2] > 0 && count[max2] >= count[max1]/3) + disc2 = 1 << max2; + else + disc2 = disc1; std::string name; |