summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/randart.cc
diff options
context:
space:
mode:
authorzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-12-02 14:09:20 +0000
committerzelgadis <zelgadis@c06c8d41-db1a-0410-9941-cceddc491573>2008-12-02 14:09:20 +0000
commit021366461aba2e0504b2722d28d2b967778b3702 (patch)
treea2d759df280b978514814dd96f2c8eac7bf7cc1b /crawl-ref/source/randart.cc
parent29d2d1be7e3d8ef6096100e6c51f1dde66f3a028 (diff)
downloadcrawl-ref-021366461aba2e0504b2722d28d2b967778b3702.tar.gz
crawl-ref-021366461aba2e0504b2722d28d2b967778b3702.zip
The start of randart spellbooks. Never randomly generated and only created via
the wizard command &+, since there's no logic to how the random set of spells are selected and there's no valuation code in shopping.cc. No randart manuals or books of destruction, since I have no clue what they'd be like. The code allows for any book or spell to have its normal set of spells overridden by an arbitrary/customized set of spells, but this is only used by randart spellbooks as of now. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7722 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/randart.cc')
-rw-r--r--crawl-ref/source/randart.cc90
1 files changed, 88 insertions, 2 deletions
diff --git a/crawl-ref/source/randart.cc b/crawl-ref/source/randart.cc
index 500ee5ffa8..234ac1eff4 100644
--- a/crawl-ref/source/randart.cc
+++ b/crawl-ref/source/randart.cc
@@ -24,6 +24,9 @@
#include "place.h"
#include "player.h"
#include "religion.h"
+#include "spl-book.h"
+#include "spl-cast.h"
+#include "spl-util.h"
#include "stuff.h"
#define KNOWN_PROPS_KEY "randart_known_props"
@@ -361,6 +364,10 @@ void randart_desc_properties( const item_def &item,
randart_known_props_t &known,
bool force_fake_props)
{
+ // Randart books have no randart properties.
+ if (item.base_type == OBJ_BOOKS)
+ return;
+
randart_wpn_properties( item, proprt, known);
if (!force_fake_props && item_ident( item, ISFLAG_KNOW_PROPERTIES ))
@@ -1090,6 +1097,66 @@ void static _get_randart_properties(const item_def &item,
}
}
+static bool _compare_spell_dificulties(spell_type a, spell_type b)
+{
+ return (spell_difficulty(a) < spell_difficulty(b));
+}
+
+static void _init_randart_book(item_def &book)
+{
+ spell_type spells[SPELLBOOK_SIZE];
+ int spell_count = 0;
+
+ while(spell_count < SPELLBOOK_SIZE)
+ {
+ spell_type spl = static_cast<spell_type>(random2(NUM_SPELLS));
+
+ if (!is_valid_spell(spl))
+ continue;
+
+ // Skip monster only spells.
+ if (get_spell_flags(spl) & SPFLAG_MONSTER)
+ continue;
+
+ // Holy spells don't show up in books.
+ if (spell_typematch(spl, SPTYP_HOLY))
+ continue;
+
+ // Don't include schoolless spells, like Smiting.
+ if (get_spell_disciplines(spl) == 0)
+ continue;
+
+ // This spell passes all of the other checks.
+ if (spl == SPELL_DEBUGGING_RAY)
+ continue;
+
+ // No duplicate spells.
+ bool present = false;
+ for (int i = 0; i < spell_count; i++)
+ if (spells[i] == spl)
+ {
+ present = true;
+ break;
+ }
+ if (present)
+ continue;
+
+ spells[spell_count++] = spl;
+ }
+
+ std::sort(spells, spells + SPELLBOOK_SIZE, _compare_spell_dificulties);
+
+ CrawlHashTable &props = book.props;
+ if (!props.exists( SPELL_LIST_KEY ))
+ props[SPELL_LIST_KEY].new_vector(SV_LONG).resize(SPELLBOOK_SIZE);
+
+ CrawlVector &spell_vec = props[SPELL_LIST_KEY];
+ spell_vec.set_max_size(SPELLBOOK_SIZE);
+
+ for (int i = 0; i < SPELLBOOK_SIZE; i++)
+ spell_vec[i] = (long) spells[i];
+}
+
void static _init_randart_properties(item_def &item)
{
ASSERT( is_random_artefact( item ) );
@@ -1113,6 +1180,12 @@ void static _init_randart_properties(item_def &item)
return;
}
+ if (item.base_type == OBJ_BOOKS)
+ {
+ _init_randart_book(item);
+ return;
+ }
+
randart_properties_t prop;
_get_randart_properties(item, prop);
@@ -1260,6 +1333,8 @@ static std::string _get_artefact_type(const item_def &item,
{
switch (item.base_type)
{
+ case OBJ_BOOKS:
+ return "book";
case OBJ_WEAPONS:
return "weapon";
case OBJ_ARMOUR:
@@ -1298,7 +1373,8 @@ std::string artefact_name(const item_def &item, bool appearance)
ASSERT(item.base_type == OBJ_WEAPONS
|| item.base_type == OBJ_ARMOUR
- || item.base_type == OBJ_JEWELLERY);
+ || item.base_type == OBJ_JEWELLERY
+ || item.base_type == OBJ_BOOKS);
if (is_fixed_artefact( item ))
return _get_fixedart_name( item );
@@ -1908,6 +1984,9 @@ static bool _randart_is_conflicting( const item_def &item,
bool randart_is_bad( const item_def &item, randart_properties_t &proprt )
{
+ if (item.base_type == OBJ_BOOKS)
+ return (false);
+
if (randart_wpn_num_props( proprt ) == 0)
return (true);
@@ -1970,11 +2049,18 @@ bool make_item_randart( item_def &item )
{
if (item.base_type != OBJ_WEAPONS
&& item.base_type != OBJ_ARMOUR
- && item.base_type != OBJ_JEWELLERY)
+ && item.base_type != OBJ_JEWELLERY
+ && item.base_type != OBJ_BOOKS)
{
return (false);
}
+ if (item.base_type == OBJ_BOOKS)
+ {
+ if (item.sub_type == BOOK_MANUAL || item.sub_type == BOOK_DESTRUCTION)
+ return (false);
+ }
+
// already is a randart
if (item.flags & ISFLAG_RANDART)
return (true);