diff -rU 3 nethack-3.4.3/include/extern.h nethack-3.4.3-invokation/include/extern.h --- nethack-3.4.3/include/extern.h 2003-12-08 07:39:13.000000000 +0800 +++ nethack-3.4.3-invokation/include/extern.h 2009-07-04 21:55:42.000000000 +0800 @@ -1876,6 +1876,7 @@ /* ### spell.c ### */ +E void FDECL(deadbook, (struct obj *,boolean)); #ifdef USE_TRAMPOLI E int NDECL(learn); #endif diff -rU 3 nethack-3.4.3/src/artifact.c nethack-3.4.3-invokation/src/artifact.c --- nethack-3.4.3/src/artifact.c 2003-12-08 07:39:13.000000000 +0800 +++ nethack-3.4.3-invokation/src/artifact.c 2009-07-04 21:54:17.000000000 +0800 @@ -1190,6 +1190,8 @@ if(!oart || !oart->inv_prop) { if(obj->otyp == CRYSTAL_BALL) use_crystal_ball(obj); + else if(obj->otype == SPE_BOOK_OF_THE_DEAD) + deadbook(obj, TRUE); /* deadbook() handles nothing_happens */ else pline(nothing_happens); return 1; diff -rU 3 nethack-3.4.3/src/mklev.c nethack-3.4.3-invokation/src/mklev.c --- nethack-3.4.3/src/mklev.c 2003-12-08 07:39:13.000000000 +0800 +++ nethack-3.4.3-invokation/src/mklev.c 2009-07-04 22:13:15.000000000 +0800 @@ -1418,9 +1418,7 @@ * Major level transmutation: add a set of stairs (to the Sanctum) after * an earthquake that leaves behind a a new topology, centered at inv_pos. * Assumes there are no rooms within the invocation area and that inv_pos - * is not too close to the edge of the map. Also assume the hero can see, - * which is guaranteed for normal play due to the fact that sight is needed - * to read the Book of the Dead. + * is not too close to the edge of the map. */ void mkinvokearea() @@ -1431,7 +1429,10 @@ register xchar i; pline_The("floor shakes violently under you!"); - pline_The("walls around you begin to bend and crumble!"); + if(Blind) + pline_The("entire dungeon seems to be tearing apart!"); + else + pline_The("walls around you begin to bend and crumble!"); display_nhwindow(WIN_MESSAGE, TRUE); mkinvpos(xmin, ymin, 0); /* middle, before placing stairs */ @@ -1458,14 +1459,16 @@ delay_output(); } - You("are standing at the top of a stairwell leading down!"); + if(Blind) + You_feel("the stones reassemble below you!"); + else + You("are standing at the top of a stairwell leading down!"); mkstairs(u.ux, u.uy, 0, (struct mkroom *)0); /* down */ newsym(u.ux, u.uy); vision_full_recalc = 1; /* everything changed */ } /* Change level topology. Boulders in the vicinity are eliminated. - * Temporarily overrides vision in the name of a nice effect. */ STATIC_OVL void mkinvpos(x,y,dist) @@ -1500,17 +1503,6 @@ obfree(otmp, (struct obj *)0); } } - unblock_point(x,y); /* make sure vision knows this location is open */ - - /* fake out saved state */ - lev->seenv = 0; - lev->doormask = 0; - if(dist < 6) lev->lit = TRUE; - lev->waslit = TRUE; - lev->horizontal = FALSE; - viz_array[y][x] = (dist < 6 ) ? - (IN_SIGHT|COULD_SEE) : /* short-circuit vision recalc */ - COULD_SEE; switch(dist) { case 1: /* fire traps */ diff -rU 3 nethack-3.4.3/src/read.c nethack-3.4.3-invokation/src/read.c --- nethack-3.4.3/src/read.c 2003-12-08 07:39:13.000000000 +0800 +++ nethack-3.4.3-invokation/src/read.c 2009-07-04 21:48:56.000000000 +0800 @@ -109,9 +109,7 @@ } } - /* Actions required to win the game aren't counted towards conduct */ - if (scroll->otyp != SPE_BOOK_OF_THE_DEAD && - scroll->otyp != SPE_BLANK_PAPER && + if (scroll->otyp != SPE_BLANK_PAPER && scroll->otyp != SCR_BLANK_PAPER) u.uconduct.literate++; diff -rU 3 nethack-3.4.3/src/spell.c nethack-3.4.3-invokation/src/spell.c --- nethack-3.4.3/src/spell.c 2003-12-08 07:39:13.000000000 +0800 +++ nethack-3.4.3-invokation/src/spell.c 2009-07-04 22:11:57.000000000 +0800 @@ -23,7 +23,6 @@ STATIC_DCL int FDECL(spell_let_to_idx, (CHAR_P)); STATIC_DCL boolean FDECL(cursed_book, (struct obj *bp)); STATIC_DCL boolean FDECL(confused_book, (struct obj *)); -STATIC_DCL void FDECL(deadbook, (struct obj *)); STATIC_PTR int NDECL(learn); STATIC_DCL boolean FDECL(getspell, (int *)); STATIC_DCL boolean FDECL(dospellmenu, (const char *,int,int *)); @@ -201,13 +200,15 @@ /* special effects for The Book of the Dead */ STATIC_OVL void -deadbook(book2) +deadbook(book2, boolean invoked) struct obj *book2; +boolean invoked; { struct monst *mtmp, *mtmp2; coord mm; - You("turn the pages of the Book of the Dead..."); + if(!invoked) + You("turn the pages of the Book of the Dead..."); makeknown(SPE_BOOK_OF_THE_DEAD); /* KMH -- Need ->known to avoid "_a_ Book of the Dead" */ book2->known = 1; @@ -216,15 +217,35 @@ register boolean arti1_primed = FALSE, arti2_primed = FALSE, arti_cursed = FALSE; + if(invoked) + if(Blind) + You_hear("a crisp flicker..."); + else + pline_The("Book of the Dead opens of its own accord..."); + if(book2->cursed) { + if(invoked) + if(Hallucination) + You_hear("gratuitous bleeping."); + else + You_hear("a mumbled curse."); + else pline_The("runes appear scrambled. You can't read them!"); return; } if(!u.uhave.bell || !u.uhave.menorah) { pline("A chill runs down your %s.", body_part(SPINE)); - if(!u.uhave.bell) You_hear("a faint chime..."); - if(!u.uhave.menorah) pline("Vlad's doppelganger is amused."); + if(!u.uhave.bell) + if(Hallucination) + You_feel("like a tuning fork!"); + else + You_hear("a faint chime..."); + if(!u.uhave.menorah) + if(Hallucination) + pline("Nosferatu giggles."); + else + pline("Vlad's doppelganger is amused."); return; } @@ -243,6 +264,9 @@ if(arti_cursed) { pline_The("invocation fails!"); + if(Hallucination) + pline("At least one of your heirlooms is in a tizzy!"); + else pline("At least one of your artifacts is cursed..."); } else if(arti1_primed && arti2_primed) { unsigned soon = (unsigned) d(2,6); /* time til next intervene() */ @@ -262,10 +286,18 @@ } /* when not an invocation situation */ + if(invoked) + { + pline(nothing_happens); + return; + } if (book2->cursed) { raise_dead: - You("raised the dead!"); + if(Hallucination) + You_hear("Michael Jackson dancing!"); + else + You("raised the dead!"); /* first maybe place a dangerous adversary */ if (!rn2(3) && ((mtmp = makemon(&mons[PM_MASTER_LICH], u.ux, u.uy, NO_MINVENT)) != 0 || @@ -336,7 +368,7 @@ exercise(A_WIS, TRUE); /* you're studying. */ booktype = book->otyp; if(booktype == SPE_BOOK_OF_THE_DEAD) { - deadbook(book); + deadbook(book, FALSE); return(0); }