From fe6051abc755060612c53ca92658cac2badb0a59 Mon Sep 17 00:00:00 2001 From: j-p-e-g Date: Thu, 18 Dec 2008 18:25:39 +0000 Subject: Remove spells from randart books that don't fit at least one of primary and secondary spell type. Move definite articles in spell type synonyms in front of the adjective when one is used. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7862 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/dat/database/randname.txt | 32 ++++++++---- crawl-ref/source/spl-book.cc | 82 ++++++++++++++++++++++-------- crawl-ref/source/spl-util.cc | 2 +- 3 files changed, 84 insertions(+), 32 deletions(-) (limited to 'crawl-ref/source') diff --git a/crawl-ref/source/dat/database/randname.txt b/crawl-ref/source/dat/database/randname.txt index ef6d8e0eb3..c51f9f990a 100644 --- a/crawl-ref/source/dat/database/randname.txt +++ b/crawl-ref/source/dat/database/randname.txt @@ -988,6 +988,8 @@ w:1 Mastering @book_magic@ %%%% # synonyms for predominant spell schools +# variants starting with the definite article will get "the" prepended +# to the adjective version Conjuration Conjuration @@ -1008,7 +1010,8 @@ Arcane Weapons w:1 Blows and Bruises -w:1 Damage Dealing +w:1 +Damage Dealing %%%% Enchantment @@ -1032,13 +1035,13 @@ Flames Heat -Volcanoes +the Volcanoes -Blaze +the Blaze Ignition -Arsonist +the Arsonist %%%% Ice @@ -1048,11 +1051,11 @@ Snow Cold -Snowflakes +the Snowflakes -Glaciers +the Glacier -Frostbite +the Frostbite %%%% Transmigration @@ -1115,14 +1118,17 @@ Calling Creation -Entourage +the Entourage Companions -Escort +the Escort w:1 Illusion + +w:2 +Slavery %%%% Divination @@ -1139,6 +1145,10 @@ Prediction Omens Sight + +Visions + +Truth %%%% Translocation @@ -1176,7 +1186,7 @@ Clay the Mountains -Rock +the Rocks %%%% Air @@ -1188,7 +1198,7 @@ Weightlessness Flight -Birds +the Birds Feathers %%%% diff --git a/crawl-ref/source/spl-book.cc b/crawl-ref/source/spl-book.cc index 446fcd5580..6cdb8e8dc7 100644 --- a/crawl-ref/source/spl-book.cc +++ b/crawl-ref/source/spl-book.cc @@ -2148,22 +2148,31 @@ static void _get_weighted_spells(bool completely_random, god_type god, ASSERT(book_pos > 0 && max_levels >= 0); } -bool _spells_need_disc2(spell_type chosen_spells[], int d1, int d2) +static void _remove_nondiscipline_spells(spell_type chosen_spells[], + int d1, int d2) { + int replace = -1; for (int i = 0; i < SPELLBOOK_SIZE; i++) { if (chosen_spells[i] == SPELL_NO_SPELL) break; - // If a spell matches the second type but not the first, - // we need the second in the title. - if (!spell_typematch( chosen_spells[i], d1 ) - && spell_typematch( chosen_spells[i], d2)) + // If a spell matches neither the first nor the second type + // (that may be the same) remove it. + if (!spell_typematch(chosen_spells[i], d1) + && !spell_typematch(chosen_spells[i], d2)) { - return (true); + chosen_spells[i] = SPELL_NO_SPELL; + if (replace == -1) + replace = i; + } + else if (replace != -1) + { + chosen_spells[replace] = chosen_spells[i]; + chosen_spells[i] = SPELL_NO_SPELL; + replace++; } } - return (false); } bool make_book_theme_randart(item_def &book, int disc1, int disc2, @@ -2270,7 +2279,6 @@ bool make_book_theme_randart(item_def &book, int disc1, int disc2, for (int i = 0; i < SPELLBOOK_SIZE; i++) { - spell_vec[i] = (long) chosen_spells[i]; if (chosen_spells[i] == SPELL_NO_SPELL) continue; @@ -2282,27 +2290,53 @@ bool make_book_theme_randart(item_def &book, int disc1, int disc2, // Remember the two dominant spell schools ... int max1 = 0; int max2 = 0; + int num1 = 1; + int num2 = 0; for (int k = 1; k <= SPTYP_LAST_EXPONENT; k++) { if (count[k] > count[max1]) { max2 = max1; + num2 = num1; max1 = k; + num1 = 1; + } + else + { + if (count[k] == count[max1]) + num1++; + + if (max2 == max1 || count[k] > count[max2]) + { + max2 = k; + if (count[k] == count[max1]) + num2 = num1; + else + num2 = 1; + } + else if (count[k] == count[max2]) + num2++; } - else if (max2 == max1 || count[k] > count[max2]) - max2 = k; } + // If there are several "secondary" disciplines with the same count + // ignore all of them. Same, if the secondary discipline appears only once. + if (num2 > 1 && num1 > num2 || count[max2] < 2) + max2 = max1; + + // Remove spells that don't fit either discipline. + _remove_nondiscipline_spells(chosen_spells, 1 << max1, 1 << max2); + + // Finally fill the spell vector. + for (int i = 0; i < SPELLBOOK_SIZE; i++) + spell_vec[i] = (long) chosen_spells[i]; + // ... and change disc1 and disc2 accordingly. disc1 = 1 << max1; - if (max1 != max2 - && (count[max2] > 1 || _spells_need_disc2(chosen_spells, - 1 << max1, 1 << max2))) - { - disc2 = 1 << max2; - } - else + if (max1 == max2) disc2 = disc1; + else + disc2 = 1 << max2; std::string name; @@ -2355,14 +2389,22 @@ bool make_book_theme_randart(item_def &book, int disc1, int disc2, } else { - name += type_name + " "; + std::string bookname = type_name + " "; // Add the noun for the first discipline. type_name = getRandNameString(spelltype_long_name(disc1)); if (type_name.empty()) - name += spelltype_long_name(disc1); + bookname += spelltype_long_name(disc1); else - name += type_name; + { + if (type_name.find("the ", 0) != std::string::npos) + { + type_name = replace_all(type_name, "the ", ""); + bookname = "the " + bookname; + } + bookname += type_name; + } + name += bookname; } if (need_quotes) diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc index 592da11f61..c4b96b7ffa 100644 --- a/crawl-ref/source/spl-util.cc +++ b/crawl-ref/source/spl-util.cc @@ -94,7 +94,7 @@ void init_spell_descs(void) // which corrupts the heap. for (unsigned int i = 0; i < SPELLDATASIZE - 1; i++) spell_list[spelldata[i].id] = i; -} // end init_spell_descs() +} typedef std::map spell_name_map; static spell_name_map spell_name_cache; -- cgit v1.2.3-54-g00ecf