with an asterisk.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8011 c06c8d41-db1a-0410-9941-cceddc491573
YDWBT7CZGY33CNDPF7S4LK7YULFMDUJAKIODKMGB2IYIWHF4SJWQC
Q57GOIHVFNJHTBYNUGJNME3UF2QFRJ6CN2UXVY47NHU7XAT7JJYAC
TQOJIJP5MUILKWSEC3Q6BNGVFZJOYSCUR3DR4WPJQ4GGDEVQHEMQC
2Q42G2D2XQ4VWKLCY3JPX5PP3OPTO6PFAE2IYIKLEXA35MD67BBQC
SQEDRNEA7TOPFLWDDPQ65BJDOZAARVFHNMCWQG2SWDXP4W5Z3CLAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
CCRQESB4ADT4WA7FGLNZZXAJ6G5QMCTYCZIWORBN45P6ZPILC34AC
FWNNTOEERPUKXPE4OC52UABFZLKIU3O5GRNNLDK4QI4HR2IOU36QC
QO5ZJWQ3JK3PEGBPTQSAYIPEJEHG2M2KTD74227G5VG7DVXUL3BQC
6F6OFJCUOBUP7QTVWSMSQPW25RLVRYVXO3VO5GLMFRY6K5RMOWFAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
46MRRHVYJ3BS74R2BEVUWEWJCI4FCRBSLZ3NWMQCE6FUCNE5P73QC
SN3VSV7G6NF6NLX5E47QJQQFDIPC2LQUUYGZMH6AWBF3FOUHXCBQC
DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC
Q3DNEB5OOJ34P5ML4CMK3L6SCP7RLW7DDOZEG24KZBX3C7BJRQDAC
TZ2SH2SPO5TFSFL2OCV5A32P2X4CRHEKEK7ENUFCBVF3RKUWAD4AC
JVSCP4FTW2G57C6YD5HZOZXTODGZH7TR75JQGFJBEPX3LCZH236QC
NN6O3D72SXCVAKLQ4R6TPFUWCMWB2CQX4YAAI3DKYIUG6KK3MEEQC
6ZZO2QBB46RZM6OXVS7OIKC5M3SEAULSSJFXW5PJG556JDKKUHWAC
SCZCQPNBQG2GXZ76LCEYOMB4QMZGI6YV7LJEC7ZVBUG27KLO564AC
ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
FIYBXLWALQINNQTHG2KNDUUTAQAZRDDLXW2XOVSKDKBADJ3XCJ4AC
52XHD5LKS6UVLXBYUXMPTMVMTXQ6FBUFXJ2TAW6R7CSJY7OXWVJAC
RNJX2RDBDA62DSAUIWVVPFS7YNIU3GEOXDWJUABDS5DS5QGS3LAQC
JJVROJMJVKS7VN5HJNB4ZNCG7Y6EMHJQZR3MDN2VZCFTZC73HOZQC
74LQ7JXVLAFSHLI7LCBKFX47CNTYSKGUQSXNX5FCIUIGCC2JTR3QC
SA3XGRMUEO3K6T4TJJWMWV2SG3JCEGLBM7SAN4IQ5A4VVMHFBCKQC
DUOVSVYLZG2W4KHAPD57Z2OTWZUYHY46TLGJLI5R7YALOKZCTGFAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
VCG3BRIYRTNNWYC3LOXD6KFGXOX37HAFW2HNV7WXVG2V7EUHLDZQC
2KTJHQUX2LTU2BCLS5YXVRRKMOYKKIZAPF2LBKORFGSHEN5IO3IAC
UEI5JAVCMN7Y2SACTEZPZSNFJWOJTC55G24Q6LKQCT4XNDH5ZQIAC
KNO4TZR76DMOYJCF24PSVQW7FUZOTMOJTL7I7J74SM4IHOGDX6TAC
X4OVIUAVNYPQYIL5WU6F263TZZL22Z22LHAFJJLOGOPXWCCT7LMQC
EYYWIH7377INOKPRABJUATNQ2YWKLOVHZKQIY55POX2YXVMDDWAAC
CKY7MRFWMNHXIPJD5ZUAJN5T2YHUIEAYBNYYV5GN74LBZJRDJMEQC
return (base_type == OBJ_BOOKS? sub_type :
base_type == OBJ_STAVES? sub_type + NUM_BOOKS - STAFF_SMITING :
-1);
return (base_type == OBJ_BOOKS ? sub_type :
base_type == OBJ_STAVES ? sub_type + NUM_BOOKS - STAFF_SMITING
: -1);
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 = random_choose_weighted(
55, BOOK_RANDART_THEME,
24, book.sub_type,
level == -1 ? 0 : 12, BOOK_RANDART_LEVEL,
agent == GOD_XOM ? 0 : 6, BOOK_MANUAL, // too useful for Xom
0);
}
// Sif Muna shouldn't gift Vehumet or Kiku's special books.
// (The spells therein are still fair game for randart books.)
if (agent == GOD_SIF_MUNA
&& doodad.sub_type >= MIN_GOD_ONLY_BOOK
&& doodad.sub_type <= MAX_GOD_ONLY_BOOK)
{
ASSERT(doodad.base_type == OBJ_BOOKS);
// Try again.
destroy_item(thing_created);
thing_created = NON_ITEM;
continue;
// Adds a list of all spells contained in a book or rod to its
// description string.
void append_spells(std::string &desc, const item_def &item)
{
if (!item.has_spells())
return;
desc += "$$Spells Type Level$";
for (int j = 0; j < 8; j++)
{
spell_type stype = which_spell_in_book(item, j);
if (stype == SPELL_NO_SPELL)
continue;
std::string name = (is_memorised(stype)) ? "*" : "";
name += spell_title(stype);
desc += name;
for (unsigned int i = 0; i < 35 - name.length(); i++)
desc += " ";
name = "";
if (item.base_type == OBJ_STAVES)
name += "Evocations";
else
{
bool already = false;
for (int i = 0; i <= SPTYP_LAST_EXPONENT; i++)
{
if (spell_typematch( stype, 1 << i ))
{
if (already)
name += "/" ;
name += spelltype_name( 1 << i );
already = true;
}
}
}
desc += name;
for (unsigned int i = 36; i < 65 - name.length(); i++)
desc += " ";
char sval[3];
itoa( spell_difficulty( stype ), sval, 10 );
desc += sval;
desc += "$";
}
}
break;
case OBJ_BOOKS:
if (!player_can_read_spellbook( item ))
{
description << "$This book is beyond your current level of "
"understanding.";
}
else if (!verbose && is_random_artefact( item ))
{
append_spells( desc, item );
if (desc.empty())
need_extra_line = false;
else
description << desc;
}
break;
case OBJ_BOOKS:
if (!player_can_read_spellbook( item ))
{
description << "$This book is beyond your current level of "
"understanding.";
}
}
// Adds a list of all spells contained in a book or rod to its
// description string.
static void _append_spells(std::string &desc, const item_def &item)
{
if (!item.has_spells())
return;
desc += "$$Spells Type Level$";
for (int j = 0; j < 8; j++)
{
spell_type stype = which_spell_in_book(item, j);
if (stype == SPELL_NO_SPELL)
continue;
std::string name = spell_title(stype);
desc += name;
for (unsigned int i = 0; i < 35 - name.length(); i++)
desc += " ";
name = "";
if (item.base_type == OBJ_STAVES)
name += "Evocations";
else
{
bool already = false;
for (int i = 0; i <= SPTYP_LAST_EXPONENT; i++)
{
if (spell_typematch( stype, 1 << i ))
{
if (already)
name += "/" ;
name += spelltype_name( 1 << i );
already = true;
}
}
}
desc += name;
for (unsigned int i = 36; i < 65 - name.length(); i++)
desc += " ";
char sval[3];
itoa( spell_difficulty( stype ), sval, 10 );
desc += sval;
desc += "$";
}