B13004 spellbook destruction

When reading a cursed or too-hard book that's covered in contact poison
(presumably in the too-hard case, reading it made the poison), and you die,
the book would not be in the bones.  remove in_use mark while assessing
damage.

On the other hand, not From a bug report, the message in the "6" case says
the book explodes, but had a 1/3 chance of not disappearing in the normal
case, and 100% chance of remaining if cursed while reading - when the
player survives.  Return a flag to allow the book to be destroyed in this
case.  No work needed for the death case; in_use is set.
This commit is contained in:
cohrs
2002-10-16 05:46:20 +00:00
parent 2fa61ea7ee
commit bb732e194a
+22 -11
View File
@@ -21,7 +21,7 @@ static NEARDATA struct obj *book; /* last/current book being xscribed */
((char)((spell < 26) ? ('a' + spell) : ('A' + spell - 26))) ((char)((spell < 26) ? ('a' + spell) : ('A' + spell - 26)))
STATIC_DCL int FDECL(spell_let_to_idx, (CHAR_P)); STATIC_DCL int FDECL(spell_let_to_idx, (CHAR_P));
STATIC_DCL void FDECL(cursed_book, (int)); STATIC_DCL boolean FDECL(cursed_book, (struct obj *bp));
STATIC_DCL void FDECL(deadbook, (struct obj *)); STATIC_DCL void FDECL(deadbook, (struct obj *));
STATIC_PTR int NDECL(learn); STATIC_PTR int NDECL(learn);
STATIC_DCL boolean FDECL(getspell, (int *)); STATIC_DCL boolean FDECL(getspell, (int *));
@@ -102,10 +102,13 @@ char ilet;
return -1; return -1;
} }
STATIC_OVL void /* TRUE: book should be destroyed by caller */
cursed_book(lev) STATIC_OVL boolean
register int lev; cursed_book(bp)
struct obj *bp;
{ {
int lev = objects[bp->otyp].oc_level;
switch(rn2(lev)) { switch(rn2(lev)) {
case 0: case 0:
You_feel("a wrenching sensation."); You_feel("a wrenching sensation.");
@@ -145,9 +148,12 @@ cursed_book(lev)
Blind ? "feel" : "look"); Blind ? "feel" : "look");
break; break;
} }
/* temp disable in_use; death should not destroy the book */
bp->in_use = FALSE;
losestr(Poison_resistance ? rn1(2,1) : rn1(4,3)); losestr(Poison_resistance ? rn1(2,1) : rn1(4,3));
losehp(rnd(Poison_resistance ? 6 : 10), losehp(rnd(Poison_resistance ? 6 : 10),
"contact-poisoned spellbook", KILLED_BY_AN); "contact-poisoned spellbook", KILLED_BY_AN);
bp->in_use = TRUE;
break; break;
case 6: case 6:
if(Antimagic) { if(Antimagic) {
@@ -156,14 +162,14 @@ cursed_book(lev)
} else { } else {
pline("As you read the book, it %s in your %s!", pline("As you read the book, it %s in your %s!",
explodes, body_part(FACE)); explodes, body_part(FACE));
losehp (2*rnd(10)+5, "exploding rune", KILLED_BY_AN); losehp(2*rnd(10)+5, "exploding rune", KILLED_BY_AN);
} }
break; return TRUE;
default: default:
rndcurse(); rndcurse();
break; break;
} }
return; return FALSE;
} }
/* special effects for The Book of the Dead */ /* special effects for The Book of the Dead */
@@ -335,7 +341,11 @@ learn()
if (i == MAXSPELL) impossible("Too many spells memorized!"); if (i == MAXSPELL) impossible("Too many spells memorized!");
if (book->cursed) { /* maybe a demon cursed it */ if (book->cursed) { /* maybe a demon cursed it */
cursed_book(objects[booktype].oc_level); if (cursed_book(book)) {
useup(book);
book = 0;
return 0;
}
} }
if (costly) check_unpaid(book); if (costly) check_unpaid(book);
book = 0; book = 0;
@@ -417,11 +427,12 @@ register struct obj *spellbook;
} }
if (too_hard) { if (too_hard) {
cursed_book(objects[booktype].oc_level); boolean gone = cursed_book(spellbook);
nomul(delay); /* study time */ nomul(delay); /* study time */
delay = 0; delay = 0;
if(!rn2(3)) { if(gone || !rn2(3)) {
pline_The("spellbook crumbles to dust!"); if (!gone) pline_The("spellbook crumbles to dust!");
if (!objects[spellbook->otyp].oc_name_known && if (!objects[spellbook->otyp].oc_name_known &&
!objects[spellbook->otyp].oc_uname) !objects[spellbook->otyp].oc_uname)
docall(spellbook); docall(spellbook);