billr@saab.CNA.TEK.COM (Bill Randle) (08/18/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 8, Issue 10 Archive-name: NetHack3/Patch2e Patch-To: NetHack3: Volume 7, Issue 56-93 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 5 (of 7)." # Contents: patch02e # Wrapped by billr@saab on Fri Aug 18 08:35:58 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'patch02e' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patch02e'\" else echo shar: Extracting \"'patch02e'\" \(54587 characters\) sed "s/^X//" >'patch02e' <<'END_OF_FILE' X*** src/Old/mhitu.c Wed Aug 16 12:26:05 1989 X--- src/mhitu.c Tue Aug 15 20:34:37 1989 X*************** X*** 20,71 **** X static int explmu P((struct monst *,struct attack *)); X static int gazemu P((struct monst *,struct attack *)); X X- #ifdef POLYSELF X- boolean X- /* also needed in uhitm.c */ X- #else X- static boolean X- #endif X- incompatible(mon) X- register struct monst *mon; X- { X- return(poly_gender() != 1-gender(mon)); X- } X- X- boolean X- is_nymph(mon) X- register struct monst *mon; X- { X- return( mon->data->mlet == S_NYMPH ); X- } X X- boolean X- sp_melee(mon) X- register struct monst *mon; X- { X- return( X- #ifdef SEDUCE X- (mon->data == &mons[PM_SUCCUBUS] && !mon->minvis) || X- (mon->data == &mons[PM_INCUBUS] && !mon->minvis) || X- #endif X- is_nymph(mon)); X- } X- X static void X! hitmsg(mtmp, attyp) X register struct monst *mtmp; X! register uchar attyp; X { X /* Note: if opposite gender, "seductively" */ X /* If same gender, "engagingly" for nymph, normal msg for others */ X! if(sp_melee(mtmp) && !mtmp->mcan && !mtmp->mspec_used) { X! if(!is_nymph(mtmp) && incompatible(mtmp)) goto strike; X kludge("%s %s you %s.", Monnam(mtmp), X Blind ? "talks to" : "smiles at", X! incompatible(mtmp) ? "engagingly" : "seductively"); X } else X! strike: X! switch (attyp) { X case AT_BITE: X kludge("%s bites!", Monnam(mtmp)); X break; X--- 20,42 ---- X static int explmu P((struct monst *,struct attack *)); X static int gazemu P((struct monst *,struct attack *)); X X X static void X! hitmsg(mtmp, mattk) X register struct monst *mtmp; X! register struct attack *mattk; X { X+ int compat; X+ X /* Note: if opposite gender, "seductively" */ X /* If same gender, "engagingly" for nymph, normal msg for others */ X! if((compat = could_seduce(mtmp, &youmonst, mattk)) X! && !mtmp->mcan && !mtmp->mspec_used) { X kludge("%s %s you %s.", Monnam(mtmp), X Blind ? "talks to" : "smiles at", X! compat == 2 ? "engagingly" : "seductively"); X } else X! switch (mattk->aatyp) { X case AT_BITE: X kludge("%s bites!", Monnam(mtmp)); X break; X*************** X*** 91,105 **** X } X X static void X! missmu(mtmp, nearmiss) /* monster missed you */ X register struct monst *mtmp; X register boolean nearmiss; X { X! if(sp_melee(mtmp) && !mtmp->mcan) { X! if(!is_nymph(mtmp) && incompatible(mtmp)) goto strike; X kludge("%s pretends to be friendly.", Monnam(mtmp)); X! } else { X! strike: X if (!flags.verbose || !nearmiss) X kludge("%s misses.", Monnam(mtmp)); X else X--- 62,75 ---- X } X X static void X! missmu(mtmp, nearmiss, mattk) /* monster missed you */ X register struct monst *mtmp; X register boolean nearmiss; X+ register struct attack *mattk; X { X! if(could_seduce(mtmp, &youmonst, mattk) && !mtmp->mcan) X kludge("%s pretends to be friendly.", Monnam(mtmp)); X! else { X if (!flags.verbose || !nearmiss) X kludge("%s misses.", Monnam(mtmp)); X else X*************** X*** 127,141 **** X wildmiss(mtmp) /* monster attacked your displaced image */ X register struct monst *mtmp; X { X if (!flags.verbose) return; X if (!cansee(mtmp->mx, mtmp->my)) return; X /* maybe it's attacking an image around the corner? */ X if(Invis && !perceives(mtmp->data)) { X! if(sp_melee(mtmp) && !mtmp->mcan) { X! if(!is_nymph(mtmp) && incompatible(mtmp)) goto strike; X kludge("%s tries to touch you and misses!", Monnam(mtmp)); X! } else X! strike: X switch(rn2(3)) { X case 0: kludge("%s swings wildly and misses!", Monnam(mtmp)); X break; X--- 97,119 ---- X wildmiss(mtmp) /* monster attacked your displaced image */ X register struct monst *mtmp; X { X+ int compat; X+ X if (!flags.verbose) return; X if (!cansee(mtmp->mx, mtmp->my)) return; X /* maybe it's attacking an image around the corner? */ X+ X+ compat = could_seduce(mtmp, &youmonst, (struct attack *)0); X+ /* we really want to have the attack here to pass -- X+ * the previous code checked whether mtmp was a nymph, X+ * which was not correct either since the attack type of X+ * succubi/incubi varies with SEDUCE X+ */ X+ X if(Invis && !perceives(mtmp->data)) { X! if(compat) X kludge("%s tries to touch you and misses!", Monnam(mtmp)); X! else X switch(rn2(3)) { X case 0: kludge("%s swings wildly and misses!", Monnam(mtmp)); X break; X*************** X*** 148,161 **** X } X } X else if(Displaced) { X! if(sp_melee(mtmp) && !mtmp->mcan) { X! if(!is_nymph(mtmp) && incompatible(mtmp)) goto strikem; X kludge("%s smiles %s at your %sdisplaced image...", X Monnam(mtmp), X! incompatible(mtmp) ? "engagingly" : "seductively", X Invis ? "invisible " : ""); X! } else X! strikem: X kludge("%s strikes at your %sdisplaced image and misses you!", X /* Note: if you're both invisible and displaced, X * only monsters which see invisible will attack your X--- 126,137 ---- X } X } X else if(Displaced) { X! if(compat) X kludge("%s smiles %s at your %sdisplaced image...", X Monnam(mtmp), X! compat == 2 ? "engagingly" : "seductively", X Invis ? "invisible " : ""); X! else X kludge("%s strikes at your %sdisplaced image and misses you!", X /* Note: if you're both invisible and displaced, X * only monsters which see invisible will attack your X*************** X*** 338,343 **** X--- 314,320 ---- X X for(i = 0; i < NATTK; i++) { X X+ sum[i] = 0; X mattk = &(mdat->mattk[i]); X switch(mattk->aatyp) { X case AT_CLAW: /* "hand to hand" attacks */ X*************** X*** 347,395 **** X case AT_TUCH: X case AT_BUTT: X if(!range2) { X! if (!foundyou) { X! wildmiss(mtmp); X! sum[i] = 0; X! } else if(tmp > (j = rnd(20+i))) X #ifdef POLYSELF X! if (mattk->aatyp == AT_KICK && X! thick_skinned(uasmon)) sum[i] = 0; X! else X #endif X sum[i] = hitmu(mtmp, mattk); X! else { X! missmu(mtmp, (tmp == j)); X! sum[i] = 0; X! } X! } else sum[i] = 0; X break; X X case AT_HUGS: /* automatic if prev two attacks succeed */ X /* Note: if displaced, prev attacks never succeeded */ X! if(!range2) { X! if(sum[i-1] && sum[i-2]) X sum[i]= hitmu(mtmp, mattk); X- else sum[i] = 0; X- } else sum[i] = 0; X break; X X case AT_GAZE: /* can affect you either ranged or not */ X! if (!youseeit) sum[i] = 0; X! /* Displaced and around a corner so not visible */ X! else sum[i] = gazemu(mtmp, mattk); X break; X X case AT_EXPL: /* automatic hit if next to, and aimed at you */ X if(!range2) { X! if (!foundyou) { X if (!mtmp->mcan) { X pline("%s explodes at a spot in thin air!", X youseeit ? Monnam(mtmp) : "It"); X mondead(mtmp); X sum[i] = 2; X! } else sum[i] = 0; X! } else sum[i] = explmu(mtmp, mattk); X! } else sum[i] = 0; X break; X X case AT_ENGL: X--- 324,368 ---- X case AT_TUCH: X case AT_BUTT: X if(!range2) { X! if (foundyou) { X! if(tmp > (j = rnd(20+i))) { X #ifdef POLYSELF X! if (mattk->aatyp != AT_KICK || X! !thick_skinned(uasmon)) X #endif X sum[i] = hitmu(mtmp, mattk); X! } else X! missmu(mtmp, (tmp == j), mattk); X! } else X! wildmiss(mtmp); X! } X break; X X case AT_HUGS: /* automatic if prev two attacks succeed */ X /* Note: if displaced, prev attacks never succeeded */ X! if(!range2 && sum[i-1] && sum[i-2]) X sum[i]= hitmu(mtmp, mattk); X break; X X case AT_GAZE: /* can affect you either ranged or not */ X! if (youseeit) X! /* not displaced around a corner so not visible */ X! sum[i] = gazemu(mtmp, mattk); X break; X X case AT_EXPL: /* automatic hit if next to, and aimed at you */ X if(!range2) { X! if (foundyou) X! sum[i] = explmu(mtmp, mattk); X! else { X if (!mtmp->mcan) { X pline("%s explodes at a spot in thin air!", X youseeit ? Monnam(mtmp) : "It"); X mondead(mtmp); X sum[i] = 2; X! } X! } X! } X break; X X case AT_ENGL: X*************** X*** 402,423 **** X nscr(); X sum[i] = gulpmu(mtmp, mattk); X } else { X! missmu(mtmp, (tmp == j)); X! sum[i] = 0; X } X } else pline("%s gulps some air!", youseeit ? X Monnam(mtmp) : "It"); X! } else sum[i] = 0; X break; X case AT_BREA: X if(range2) sum[i] = breamu(mtmp, mattk); X /* Note: breamu takes care of displacement */ X- else sum[i] = 0; X break; X case AT_SPIT: X if(range2) sum[i] = spitmu(mtmp); X /* Note: spitmu takes care of displacement */ X- else sum[i] = 0; X break; X case AT_WEAP: X if(range2) { X--- 375,393 ---- X nscr(); X sum[i] = gulpmu(mtmp, mattk); X } else { X! missmu(mtmp, (tmp == j), mattk); X } X } else pline("%s gulps some air!", youseeit ? X Monnam(mtmp) : "It"); X! } X break; X case AT_BREA: X if(range2) sum[i] = breamu(mtmp, mattk); X /* Note: breamu takes care of displacement */ X break; X case AT_SPIT: X if(range2) sum[i] = spitmu(mtmp); X /* Note: spitmu takes care of displacement */ X break; X case AT_WEAP: X if(range2) { X*************** X*** 425,435 **** X if (dlevel != rogue_level) X #endif X sum[i] = thrwmu(mtmp); X! } else { X! if (!foundyou) { X! wildmiss(mtmp); X! sum[i] = 0; X! } else { X set_uasmon(); X otmp = select_hwep(mtmp); X if(otmp) { X--- 395,402 ---- X if (dlevel != rogue_level) X #endif X sum[i] = thrwmu(mtmp); X! } else X! if (foundyou) { X set_uasmon(); X otmp = select_hwep(mtmp); X if(otmp) { X*************** X*** 438,456 **** X } X if(tmp > (j = rnd(20+i))) X sum[i] = hitmu(mtmp, mattk); X! else { X! missmu(mtmp, (tmp == j)); X! sum[i] = 0; X! } X! } X! } X break; X case AT_MAGC: X! if(!range2) { X! if (!foundyou) { X pline("%s casts a spell at thin air!", X youseeit ? Monnam(mtmp) : "It"); X- sum[i] = 0; X /* Not totally right since castmu allows other X * spells, such as the monster healing itself, X * that should work even when not next to you-- X--- 405,424 ---- X } X if(tmp > (j = rnd(20+i))) X sum[i] = hitmu(mtmp, mattk); X! else X! missmu(mtmp, (tmp == j), mattk); X! } else X! wildmiss(mtmp); X break; X case AT_MAGC: X! if (range2) X! sum[i] = buzzmu(mtmp, mattk); X! else X! if (foundyou) X! sum[i] = castmu(mtmp, mattk); X! else X pline("%s casts a spell at thin air!", X youseeit ? Monnam(mtmp) : "It"); X /* Not totally right since castmu allows other X * spells, such as the monster healing itself, X * that should work even when not next to you-- X*************** X*** 457,472 **** X * but the previous code was just as wrong. X * --KAA X */ X- } else sum[i] = castmu(mtmp, mattk); X- } else sum[i] = buzzmu(mtmp, mattk); X break; X X default: /* no attack */ X- sum[i] = 0; X break; X } X if(flags.botl) bot(); X if(sum[i] == 2) return(1); /* attacker dead */ X } X return(0); X } X--- 425,440 ---- X * but the previous code was just as wrong. X * --KAA X */ X break; X X default: /* no attack */ X break; X } X if(flags.botl) bot(); X if(sum[i] == 2) return(1); /* attacker dead */ X+ if(sum[i] == 3) break; /* attacker teleported, no more attacks */ X+ /* sum[i] == 1: successful attack */ X+ /* sum[i] == 0: unsuccessful attack */ X } X return(0); X } X*************** X*** 473,479 **** X X /* X * hitmu: monster hits you X! * returns 2 if monster dies (e.g. "yellow light"), 0 otherwise X */ X static X int X--- 441,448 ---- X X /* X * hitmu: monster hits you X! * returns 2 if monster dies (e.g. "yellow light"), 1 otherwise X! * 3 if the monster lives but teleported, so it can't keep attacking you X */ X static X int X*************** X*** 541,547 **** X "crushed"); X X } else { /* hand to hand weapon */ X! hitmsg(mtmp,mattk->aatyp); X if(mattk->aatyp == AT_WEAP && otmp) { X dmg += dmgval(otmp, uasmon); X if (dmg <= 0) dmg = 1; X--- 510,516 ---- X "crushed"); X X } else { /* hand to hand weapon */ X! hitmsg(mtmp, mattk); X if(mattk->aatyp == AT_WEAP && otmp) { X dmg += dmgval(otmp, uasmon); X if (dmg <= 0) dmg = 1; X*************** X*** 551,559 **** X && !resists_drli(uasmon) X # endif X ) { X pline("The %s blade drains your life!", X Hallucination ? hcolor() : black); X! losexp(); X } X #endif X #ifdef POLYSELF X--- 520,531 ---- X && !resists_drli(uasmon) X # endif X ) { X+ if (Blind) X+ You("feel an unholy blade drain your life!"); X+ else X pline("The %s blade drains your life!", X Hallucination ? hcolor() : black); X! losexp(); X } X #endif X #ifdef POLYSELF X*************** X*** 577,589 **** X } X break; X case AD_DISE: X! hitmsg(mtmp, mattk->aatyp); X You("feel very sick."); X make_sick((long)rn1(25-ACURR(A_CON),15),FALSE); X u.usick_cause = mdat->mname; X break; X case AD_FIRE: X! hitmsg(mtmp,mattk->aatyp); X if(ctmp && rn2(2)) { X pline("You're on fire!"); X if (Fire_resistance) { X--- 549,561 ---- X } X break; X case AD_DISE: X! hitmsg(mtmp, mattk); X You("feel very sick."); X make_sick((long)rn1(25-ACURR(A_CON),15),FALSE); X u.usick_cause = mdat->mname; X break; X case AD_FIRE: X! hitmsg(mtmp, mattk); X if(ctmp && rn2(2)) { X pline("You're on fire!"); X if (Fire_resistance) { X*************** X*** 601,607 **** X } X break; X case AD_COLD: X! hitmsg(mtmp,mattk->aatyp); X if(ctmp && rn2(2)) { X pline("You're covered in frost!"); X if (Cold_resistance) { X--- 573,579 ---- X } X break; X case AD_COLD: X! hitmsg(mtmp, mattk); X if(ctmp && rn2(2)) { X pline("You're covered in frost!"); X if (Cold_resistance) { X*************** X*** 613,619 **** X } X break; X case AD_ELEC: X! hitmsg(mtmp,mattk->aatyp); X if(ctmp && rn2(2)) { X You("get zapped!"); X if (Shock_resistance) { X--- 585,591 ---- X } X break; X case AD_ELEC: X! hitmsg(mtmp, mattk); X if(ctmp && rn2(2)) { X You("get zapped!"); X if (Shock_resistance) { X*************** X*** 627,633 **** X } X break; X case AD_SLEE: X! hitmsg(mtmp,mattk->aatyp); X if(ctmp && multi >= 0 && !rn2(5)) { X if (Sleep_resistance) break; X nomul(-rnd(10)); X--- 599,605 ---- X } X break; X case AD_SLEE: X! hitmsg(mtmp, mattk); X if(ctmp && multi >= 0 && !rn2(5)) { X if (Sleep_resistance) break; X nomul(-rnd(10)); X*************** X*** 644,650 **** X case AD_DRCO: X ptmp = A_CON; X dopois: X! hitmsg(mtmp,mattk->aatyp); X if(ctmp && !rn2(8)) { X Sprintf(buf, "%s's %s", X Hallucination ? rndmonnam() : mdat->mname, X--- 616,622 ---- X case AD_DRCO: X ptmp = A_CON; X dopois: X! hitmsg(mtmp, mattk); X if(ctmp && !rn2(8)) { X Sprintf(buf, "%s's %s", X Hallucination ? rndmonnam() : mdat->mname, X*************** X*** 653,659 **** X } X break; X case AD_PLYS: X! hitmsg(mtmp, mattk->aatyp); X if(ctmp && multi >= 0 && !rn2(3)) { X if (Blind) You("are frozen!"); X else You("are frozen by %s!", mon_nam(mtmp)); X--- 625,631 ---- X } X break; X case AD_PLYS: X! hitmsg(mtmp, mattk); X if(ctmp && multi >= 0 && !rn2(3)) { X if (Blind) You("are frozen!"); X else You("are frozen by %s!", mon_nam(mtmp)); X*************** X*** 661,667 **** X } X break; X case AD_DRLI: X! hitmsg(mtmp, mattk->aatyp); X if (ctmp && !rn2(3) X #ifdef POLYSELF X && !resists_drli(uasmon) X--- 633,639 ---- X } X break; X case AD_DRLI: X! hitmsg(mtmp, mattk); X if (ctmp && !rn2(3) X #ifdef POLYSELF X && !resists_drli(uasmon) X*************** X*** 674,689 **** X case AD_LEGS: X { register long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE; X if (mtmp->mcan) { X! pline("%s nuzzles against your %s %s!", Monnam(mtmp), X (side == RIGHT_SIDE) ? "right" : "left", X body_part(LEG)); X } else { X if (uarmf) { X! pline("%s scratches your %s boot!", Monnam(mtmp), X (side == RIGHT_SIDE) ? "right" : "left"); X break; X } X! pline("%s pricks your %s %s!", Monnam(mtmp), X (side == RIGHT_SIDE) ? "right" : "left", X body_part(LEG)); X set_wounded_legs(side, rnd(60-ACURR(A_DEX))); X--- 646,661 ---- X case AD_LEGS: X { register long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE; X if (mtmp->mcan) { X! kludge("%s nuzzles against your %s %s!", Monnam(mtmp), X (side == RIGHT_SIDE) ? "right" : "left", X body_part(LEG)); X } else { X if (uarmf) { X! kludge("%s scratches your %s boot!", Monnam(mtmp), X (side == RIGHT_SIDE) ? "right" : "left"); X break; X } X! kludge("%s pricks your %s %s!", Monnam(mtmp), X (side == RIGHT_SIDE) ? "right" : "left", X body_part(LEG)); X set_wounded_legs(side, rnd(60-ACURR(A_DEX))); X*************** X*** 691,704 **** X break; X } X case AD_STON: /* at present only a cockatrice */ X! hitmsg(mtmp,mattk->aatyp); X if(!rn2(3) && !Stoned) { X if (mtmp->mcan) { X if (flags.soundok) X! You("hear a cough from %s!", mon_nam(mtmp)); X } else { X if (flags.soundok) X! You("hear %s's hissing!", mon_nam(mtmp)); X if((!rn2(10) || X (flags.moonphase == NEW_MOON && X !carrying(DEAD_LIZARD))) X--- 663,678 ---- X break; X } X case AD_STON: /* at present only a cockatrice */ X! hitmsg(mtmp, mattk); X if(!rn2(3) && !Stoned) { X if (mtmp->mcan) { X if (flags.soundok) X! You("hear a cough from %s!", Blind ? "it" X! : mon_nam(mtmp)); X } else { X if (flags.soundok) X! if (Blind) You("hear its hissing!"); X! else You("hear %s's hissing!", mon_nam(mtmp)); X if((!rn2(10) || X (flags.moonphase == NEW_MOON && X !carrying(DEAD_LIZARD))) X*************** X*** 715,721 **** X } X break; X case AD_STCK: X! hitmsg(mtmp,mattk->aatyp); X if(ctmp && !u.ustuck X #ifdef POLYSELF X && !sticks(uasmon) X--- 689,695 ---- X } X break; X case AD_STCK: X! hitmsg(mtmp, mattk); X if(ctmp && !u.ustuck X #ifdef POLYSELF X && !sticks(uasmon) X*************** X*** 729,736 **** X #endif X ) { X if(!u.ustuck && !rn2(10)) { X! pline("%s swings itself around you!", X! Monnam(mtmp)); X u.ustuck = mtmp; X } else if(u.ustuck == mtmp) { X if (is_pool(mtmp->mx,mtmp->my) X--- 703,709 ---- X #endif X ) { X if(!u.ustuck && !rn2(10)) { X! kludge("%s swings itself around you!", Monnam(mtmp)); X u.ustuck = mtmp; X } else if(u.ustuck == mtmp) { X if (is_pool(mtmp->mx,mtmp->my) X*************** X*** 738,745 **** X && !is_swimmer(uasmon) X #endif X ) { X! pline("%s drowns you...", Monnam(mtmp)); X! done("drowned"); X } else if(mattk->aatyp == AT_HUGS) X You("are being crushed."); X } else dmg = 0; X--- 711,718 ---- X && !is_swimmer(uasmon) X #endif X ) { X! kludge("%s drowns you...", Monnam(mtmp)); X! done(DROWNING); X } else if(mattk->aatyp == AT_HUGS) X You("are being crushed."); X } else dmg = 0; X*************** X*** 746,752 **** X } else dmg = 0; X break; X case AD_WERE: X! hitmsg(mtmp,mattk->aatyp); X #ifdef POLYSELF X if (ctmp && !rn2(4) && u.ulycn == -1 X # ifdef NAMED_ITEMS X--- 719,725 ---- X } else dmg = 0; X break; X case AD_WERE: X! hitmsg(mtmp, mattk); X #ifdef POLYSELF X if (ctmp && !rn2(4) && u.ulycn == -1 X # ifdef NAMED_ITEMS X*************** X*** 759,765 **** X #endif X break; X case AD_SGLD: X! hitmsg(mtmp,mattk->aatyp); X #ifdef POLYSELF X if (u.usym == mdat->mlet) break; X #endif X--- 732,738 ---- X #endif X break; X case AD_SGLD: X! hitmsg(mtmp, mattk); X #ifdef POLYSELF X if (u.usym == mdat->mlet) break; X #endif X*************** X*** 775,786 **** X # endif X ) { X if (mtmp->minvent) X! pline("%s brags about the goods some dungeon explorer provided.", X Monnam(mtmp)); X else X! pline("%s makes some remarks about how difficult theft is lately.", X Monnam(mtmp)); X rloc(mtmp); X } else X #endif X if(mtmp->mcan) { X--- 748,760 ---- X # endif X ) { X if (mtmp->minvent) X! kludge("%s brags about the goods some dungeon explorer provided.", X Monnam(mtmp)); X else X! kludge("%s makes some remarks about how difficult theft is lately.", X Monnam(mtmp)); X rloc(mtmp); X+ return 3; X } else X #endif X if(mtmp->mcan) { X*************** X*** 790,808 **** X flags.female ? "charm" : "seduce", X flags.female ? "unaffected" : "uninterested"); X } X! if(rn2(3)) rloc(mtmp); X } else if(steal(mtmp)) { X rloc(mtmp); X mtmp->mflee = 1; X } X break; X #ifdef SEDUCE X case AD_SSEX: X! if(!mtmp->mcan && !mtmp->minvis) doseduce(mtmp); X break; X #endif X case AD_SAMU: X! hitmsg(mtmp,mattk->aatyp); X /* when the Wiz hits, 1/20 steals the amulet */ X if (!carrying(AMULET_OF_YENDOR)) break; X if (!rn2(20)) stealamulet(mtmp); X--- 764,789 ---- X flags.female ? "charm" : "seduce", X flags.female ? "unaffected" : "uninterested"); X } X! if(rn2(3)) { X! rloc(mtmp); X! return 3; X! } X } else if(steal(mtmp)) { X rloc(mtmp); X mtmp->mflee = 1; X+ return 3; X } X break; X #ifdef SEDUCE X case AD_SSEX: X! if(could_seduce(mtmp, &youmonst, mattk) == 1 X! && !mtmp->mcan) X! if (doseduce(mtmp)) X! return 3; X break; X #endif X case AD_SAMU: X! hitmsg(mtmp, mattk); X /* when the Wiz hits, 1/20 steals the amulet */ X if (!carrying(AMULET_OF_YENDOR)) break; X if (!rn2(20)) stealamulet(mtmp); X*************** X*** 809,815 **** X break; X X case AD_TLPT: X! hitmsg(mtmp,mattk->aatyp); X if(ctmp) { X if(flags.verbose) X Your("position suddenly seems very uncertain!"); X--- 790,796 ---- X break; X X case AD_TLPT: X! hitmsg(mtmp, mattk); X if(ctmp) { X if(flags.verbose) X Your("position suddenly seems very uncertain!"); X*************** X*** 817,823 **** X } X break; X case AD_RUST: X! hitmsg(mtmp,mattk->aatyp); X if (mtmp->mcan) break; X #ifdef POLYSELF X #ifdef GOLEMS X--- 798,804 ---- X } X break; X case AD_RUST: X! hitmsg(mtmp, mattk); X if (mtmp->mcan) break; X #ifdef POLYSELF X #ifdef GOLEMS X*************** X*** 868,874 **** X } X break; X case AD_DCAY: X! hitmsg(mtmp,mattk->aatyp); X if (mtmp->mcan) break; X #ifdef POLYSELF X #ifdef GOLEMS X--- 849,855 ---- X } X break; X case AD_DCAY: X! hitmsg(mtmp, mattk); X if (mtmp->mcan) break; X #ifdef POLYSELF X #ifdef GOLEMS X*************** X*** 888,894 **** X break; X case 1: X if (uarmc) break; X! (void)rust_dmg(uarm, "leather armor", 2, TRUE); X break; X case 2: X if (!rust_dmg(uarms, "wooden shield", 2, FALSE)) X--- 869,875 ---- X break; X case 1: X if (uarmc) break; X! if (uarm) (void)rust_dmg(uarm, xname(uarm), 2, TRUE); X break; X case 2: X if (!rust_dmg(uarms, "wooden shield", 2, FALSE)) X*************** X*** 934,943 **** X if (flags.soundok && !(moves % 5)) X pline("'Doc, I can't help you unless you cooperate.'"); X dmg = 0; X! } else hitmsg(mtmp,mattk->aatyp); X break; X case AD_CURS: X! hitmsg(mtmp,mattk->aatyp); X if(!night() && mdat == &mons[PM_GREMLIN]) break; X if(!mtmp->mcan && !rn2(10)) { X if (flags.soundok) X--- 915,924 ---- X if (flags.soundok && !(moves % 5)) X pline("'Doc, I can't help you unless you cooperate.'"); X dmg = 0; X! } else hitmsg(mtmp, mattk); X break; X case AD_CURS: X! hitmsg(mtmp, mattk); X if(!night() && mdat == &mons[PM_GREMLIN]) break; X if(!mtmp->mcan && !rn2(10)) { X if (flags.soundok) X*************** X*** 956,962 **** X } X break; X case AD_STUN: X! hitmsg(mtmp,mattk->aatyp); X if(!mtmp->mcan && !rn2(4)) { X make_stunned(HStun + dmg, TRUE); X dmg /= 2; X--- 937,943 ---- X } X break; X case AD_STUN: X! hitmsg(mtmp, mattk); X if(!mtmp->mcan && !rn2(4)) { X make_stunned(HStun + dmg, TRUE); X dmg /= 2; X*************** X*** 963,969 **** X } X break; X case AD_ACID: X! hitmsg(mtmp,mattk->aatyp); X if(!mtmp->mcan && !rn2(3)) X #ifdef POLYSELF X if (resists_acid(uasmon)) { X--- 944,950 ---- X } X break; X case AD_ACID: X! hitmsg(mtmp, mattk); X if(!mtmp->mcan && !rn2(3)) X #ifdef POLYSELF X if (resists_acid(uasmon)) { X*************** X*** 975,981 **** X else dmg = 0; X break; X case AD_SLOW: X! hitmsg(mtmp,mattk->aatyp); X if(!ctmp && (Fast & (INTRINSIC|TIMEOUT)) && !rn2(4)) { X Fast &= ~(INTRINSIC|TIMEOUT); X You("feel yourself slowing down."); X--- 956,962 ---- X else dmg = 0; X break; X case AD_SLOW: X! hitmsg(mtmp, mattk); X if(!ctmp && (Fast & (INTRINSIC|TIMEOUT)) && !rn2(4)) { X Fast &= ~(INTRINSIC|TIMEOUT); X You("feel yourself slowing down."); X*************** X*** 982,988 **** X } X break; X case AD_DREN: X! hitmsg(mtmp,mattk->aatyp); X #ifdef SPELLS X if(!ctmp && !rn2(4)) drain_en(dmg); X #endif X--- 963,969 ---- X } X break; X case AD_DREN: X! hitmsg(mtmp, mattk); X #ifdef SPELLS X if(!ctmp && !rn2(4)) drain_en(dmg); X #endif X*************** X*** 994,1000 **** X break; X #ifdef HARD /* a non-gaze AD_CONF exists only for one of the demons */ X case AD_CONF: X! hitmsg(mtmp,mattk->aatyp); X if(!mtmp->mcan && !rn2(4) && !mtmp->mspec_used) { X mtmp->mspec_used += (dmg + rn2(6)); X if(Confusion) X--- 975,981 ---- X break; X #ifdef HARD /* a non-gaze AD_CONF exists only for one of the demons */ X case AD_CONF: X! hitmsg(mtmp, mattk); X if(!mtmp->mcan && !rn2(4) && !mtmp->mspec_used) { X mtmp->mspec_used += (dmg + rn2(6)); X if(Confusion) X*************** X*** 1252,1258 **** X #endif X You("turn to stone..."); X killer = mons[PM_MEDUSA].mname; X! done("stoned"); X } X break; X #endif X--- 1233,1239 ---- X #endif X You("turn to stone..."); X killer = mons[PM_MEDUSA].mname; X! done(STONING); X } X break; X #endif X*************** X*** 1269,1274 **** X--- 1250,1267 ---- X make_confused(HConfusion + conf, FALSE); X } X break; X+ #ifdef HARD X+ case AD_STUN: X+ if(!mtmp->mcan && canseemon(mtmp) && mtmp->mcansee && X+ !mtmp->mspec_used && rn2(5)) { X+ int stun = d(2,6); X+ X+ pline("%s stares piercingly at you!", Monnam(mtmp)); X+ mtmp->mspec_used += (stun + rn2(6)); X+ make_stunned(HStun + stun, TRUE); X+ } X+ break; X+ #endif X default: impossible("Gaze attack %d?", mattk->adtyp); X break; X } X*************** X*** 1323,1330 **** X } X #endif X X #ifdef SEDUCE X! void X doseduce(mon) X register struct monst *mon; X { X--- 1316,1379 ---- X } X #endif X X+ int X+ could_seduce(magr,mdef,mattk) X+ struct monst *magr, *mdef; X+ struct attack *mattk; X+ /* returns 0 if seduction impossible, X+ * 1 if fine, X+ * 2 if wrong gender for nymph */ X+ { X+ register struct permonst *pagr, *pdef; X+ boolean agrinvis, defperc; X+ xchar genagr, gendef; X+ X+ if(magr == &youmonst) { X+ pagr = uasmon; X+ agrinvis = (Invis != 0); X+ genagr = poly_gender(); X+ } else { X+ pagr = magr->data; X+ agrinvis = magr->minvis; X+ genagr = gender(magr); X+ } X+ if(mdef == &youmonst) { X+ pdef = uasmon; X+ defperc = (See_invisible != 0); X+ gendef = poly_gender(); X+ } else { X+ pdef = mdef->data; X+ defperc = perceives(pdef); X+ gendef = gender(mdef); X+ } X+ X+ if(agrinvis && !defperc X+ #ifdef SEDUCE X+ && mattk && mattk->adtyp != AD_SSEX X+ #endif X+ ) X+ return 0; X+ X+ if(pagr->mlet != S_NYMPH X+ #ifdef HARD X+ && ((pagr != &mons[PM_INCUBUS] && pagr != &mons[PM_SUCCUBUS]) X+ # ifdef SEDUCE X+ || (mattk && mattk->adtyp != AD_SSEX) X+ # endif X+ ) X+ #endif X+ ) X+ return 0; X+ X+ if(genagr == 1 - gendef) X+ return 1; X+ else X+ return (pagr->mlet == S_NYMPH) ? 2 : 0; X+ } X+ X #ifdef SEDUCE X! /* Returns 1 if monster teleported */ X! int X doseduce(mon) X register struct monst *mon; X { X*************** X*** 1331,1350 **** X register struct obj *ring; X boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */ X X- if (fem == poly_gender() || poly_gender()==2) return; X- X if (mon->mcan || mon->mspec_used) { X pline("%s acts as though %s has got a %sheadache.", X Blind ? "It" : Monnam(mon), Blind ? "it" : X fem ? "she" : "he", X mon->mcan ? "severe " : ""); X! return; X } X X if (unconscious()) { X kludge("%s seems dismayed at your lack of response.", X Monnam(mon)); X! return; X } X X if (Blind) pline("It caresses you..."); X--- 1380,1397 ---- X register struct obj *ring; X boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */ X X if (mon->mcan || mon->mspec_used) { X pline("%s acts as though %s has got a %sheadache.", X Blind ? "It" : Monnam(mon), Blind ? "it" : X fem ? "she" : "he", X mon->mcan ? "severe " : ""); X! return 0; X } X X if (unconscious()) { X kludge("%s seems dismayed at your lack of response.", X Monnam(mon)); X! return 0; X } X X if (Blind) pline("It caresses you..."); X*************** X*** 1360,1366 **** X if (yn() == 'n') continue; X } else pline("%s decides she'd like your %s, and takes it.", X Blind ? "She" : Monnam(mon), xname(ring)); X! if (ring->known) makeknown(RIN_ADORNMENT); X if (ring==uleft || ring==uright) Ring_gone(ring); X if (ring==uwep) setuwep((struct obj *)0); X freeinv(ring); X--- 1407,1413 ---- X if (yn() == 'n') continue; X } else pline("%s decides she'd like your %s, and takes it.", X Blind ? "She" : Monnam(mon), xname(ring)); X! makeknown(RIN_ADORNMENT); X if (ring==uleft || ring==uright) Ring_gone(ring); X if (ring==uwep) setuwep((struct obj *)0); X freeinv(ring); X*************** X*** 1426,1432 **** X pline("\"You're such a %s; I wish...\"", X flags.female ? "sweet lady" : "nice guy"); X rloc(mon); X! return; X } X #define ALIGNLIM (5L + (moves/200L)) /* from pray.c */ X if (u.ualigntyp == U_CHAOTIC && u.ualign < ALIGNLIM) u.ualign++; X--- 1473,1479 ---- X pline("\"You're such a %s; I wish...\"", X flags.female ? "sweet lady" : "nice guy"); X rloc(mon); X! return 1; X } X #define ALIGNLIM (5L + (moves/200L)) /* from pray.c */ X if (u.ualigntyp == U_CHAOTIC && u.ualign < ALIGNLIM) u.ualign++; X*************** X*** 1464,1469 **** X--- 1511,1520 ---- X #endif X You("feel out of shape."); X losexp(); X+ if(u.uhp <= 0) { X+ killer = "overexertion"; X+ done(DIED); X+ } X #ifdef POLYSELF X } X #endif X*************** X*** 1534,1539 **** X--- 1585,1591 ---- X } X if (!rn2(25)) mon->mcan = 1; /* monster is worn out */ X rloc(mon); X+ return 1; X } X X static void X*** src/Old/mklev.c Wed Aug 16 12:27:26 1989 X--- src/mklev.c Tue Aug 15 18:48:20 1989 X*************** X*** 14,19 **** X--- 14,20 ---- X #ifdef ALTARS X static void mkaltar(); X #endif X+ static boolean occupied(); X X int X somex(croom) X*************** X*** 501,507 **** X if(!rn2(3)) { /* is it a locked door, closed, or a doorway? */ X if(!rn2(5)) X levl[x][y].doormask = D_ISOPEN; X! else if(!rn2(4)) X levl[x][y].doormask = D_LOCKED; X else X levl[x][y].doormask = D_CLOSED; X--- 502,508 ---- X if(!rn2(3)) { /* is it a locked door, closed, or a doorway? */ X if(!rn2(5)) X levl[x][y].doormask = D_ISOPEN; X! else if(!rn2(6)) X levl[x][y].doormask = D_LOCKED; X else X levl[x][y].doormask = D_CLOSED; X*************** X*** 798,805 **** X croom = &rooms[rn2(nroom-1)]; X if(croom >= troom) croom++; X } X! xupstair = somex(croom); /* %% < and > might be in the same place */ X! yupstair = somey(croom); X levl[xupstair][yupstair].scrsym = UP_SYM; X levl[xupstair][yupstair].typ = STAIRS; X #ifdef STRONGHOLD X--- 799,808 ---- X croom = &rooms[rn2(nroom-1)]; X if(croom >= troom) croom++; X } X! do { X! xupstair = somex(croom); X! yupstair = somey(croom); X! } while(occupied(xupstair, yupstair)); X levl[xupstair][yupstair].scrsym = UP_SYM; X levl[xupstair][yupstair].typ = STAIRS; X #ifdef STRONGHOLD X*************** X*** 1025,1030 **** X--- 1028,1034 ---- X #ifdef ALTARS X || levl[x][y].typ == ALTAR X #endif X+ || is_pool(x,y) X ); X } X X*** src/Old/mkmaze.c Wed Aug 16 12:28:20 1989 X--- src/mkmaze.c Tue Aug 15 20:34:39 1989 X*************** X*** 164,169 **** X--- 164,174 ---- X return; X } X X+ /* NCR towers define "tower". Blecccch. */ X+ #ifdef tower X+ # undef tower X+ #endif X+ X static const uchar tower[] = { X MOAT, MOAT, MOAT, MOAT, MOAT, MOAT, MOAT, X MOAT, MOAT, TLCORNER, HWALL, TRCORNER, MOAT, MOAT, X*************** X*** 233,239 **** X return; X } X impossible("Cannot build the EndGame Level!"); X! done("escaped"); X } X # endif X #endif X--- 238,244 ---- X return; X } X impossible("Cannot build the EndGame Level!"); X! done(ESCAPED); X } X # endif X #endif X*** src/Old/mkobj.c Wed Aug 16 12:28:46 1989 X--- src/mkobj.c Tue Aug 15 18:48:04 1989 X*************** X*** 231,241 **** X case WEAPON_SYM: X otmp->quan = (otmp->otyp <= SHURIKEN) ? rn1(6,6) : 1; X if(!rn2(11)) { X! otmp->spe = rne(2); X otmp->blessed = rn2(2); X } else if(!rn2(10)) { X curse(otmp); X! otmp->spe = -rne(2); X } else blessorcurse(otmp, 10); X X #ifdef NAMED_ITEMS X--- 231,241 ---- X case WEAPON_SYM: X otmp->quan = (otmp->otyp <= SHURIKEN) ? rn1(6,6) : 1; X if(!rn2(11)) { X! otmp->spe = rne(3); X otmp->blessed = rn2(2); X } else if(!rn2(10)) { X curse(otmp); X! otmp->spe = -rne(3); X } else blessorcurse(otmp, 10); X X #ifdef NAMED_ITEMS X*************** X*** 349,357 **** X otmp->otyp == GAUNTLETS_OF_FUMBLING || X !rn2(11))) { X curse(otmp); X! otmp->spe = -rne(2); X } else if(!rn2(10)) { X! otmp->spe = rne(2); X otmp->blessed = rn2(2); X } else blessorcurse(otmp, 10); X if(otmp->otyp == DRAGON_SCALE_MAIL) X--- 349,357 ---- X otmp->otyp == GAUNTLETS_OF_FUMBLING || X !rn2(11))) { X curse(otmp); X! otmp->spe = -rne(3); X } else if(!rn2(10)) { X! otmp->spe = rne(3); X otmp->blessed = rn2(2); X } else blessorcurse(otmp, 10); X if(otmp->otyp == DRAGON_SCALE_MAIL) X*** src/Old/mkroom.c Wed Aug 16 12:29:10 1989 X--- src/mkroom.c Thu Aug 10 10:25:36 1989 X*************** X*** 88,94 **** X return; X } X #ifdef THRONES X! if(*ep == 't' || *ep == 'T'){ X mkzoo(COURT); X return; X } X--- 88,94 ---- X return; X } X #ifdef THRONES X! if(*ep == 't' || *ep == 'T' || *ep == '\\'){ X mkzoo(COURT); X return; X } X*************** X*** 111,117 **** X } X for(i=0; shtypes[i].name; i++) X if(*ep == shtypes[i].symb) goto gottype; X! i = -1; X } X } X gottype: X--- 111,120 ---- X } X for(i=0; shtypes[i].name; i++) X if(*ep == shtypes[i].symb) goto gottype; X! if(*ep == 'g' || *ep == 'G') X! i = 0; X! else X! i = -1; X } X } X gottype: X*************** X*** 320,325 **** X--- 323,330 ---- X if(!(sroom = pick_room())) return; X X if(!place_oracle(sroom,&dy,&xx,&yy)) return; X+ X+ if(levl[xx][yy].mmask) rloc(m_at(xx, yy)); /* insurance */ X X /* set up Oracle and environment */ X if(!(oracl = makemon(&mons[PM_ORACLE],xx,yy))) return; X*** src/Old/mon.c Wed Aug 16 12:29:34 1989 X--- src/mon.c Wed Aug 16 10:15:20 1989 X*************** X*** 10,15 **** X--- 10,16 ---- X X #ifdef HARD X static boolean restrap(); X+ # include <ctype.h> X #endif X X long lastwarntime; X*************** X*** 211,219 **** X /* continue if the monster died fighting */ X fr = -1; X /* TODO: Handle the case of the agressor dying? */ X! if(Conflict && cansee(mtmp->mx,mtmp->my) X! && !mtmp->iswiz X! && (fr = fightm(mtmp)) == 2) X continue; X if(fr<0 && dochugw(mtmp)) X continue; X--- 212,226 ---- X /* continue if the monster died fighting */ X fr = -1; X /* TODO: Handle the case of the agressor dying? */ X! if(Conflict && !mtmp->iswiz && X! /* area you can see if you're not blind */ X! (dist(mtmp->mx,mtmp->my) < 3 || X! (levl[mtmp->mx][mtmp->my].lit && X! ((seelx <= mtmp->mx && mtmp->mx <= seehx && X! seely <= mtmp->my && mtmp->my <= seehy) || X! (seelx2 <= mtmp->mx && mtmp->mx <= seehx2 && X! seely2 <= mtmp->my && mtmp->my <= seehy2)))) && X! (fr = fightm(mtmp)) == 2) X continue; X if(fr<0 && dochugw(mtmp)) X continue; X*************** X*** 635,643 **** X /* so have "poison arrow", "poison dart", etc... */ X plural = (string[strlen(string) - 1] == 's')? 1 : 0; X if(Blind) X! pline("%s poisoned.", (plural) ? "They were" : "It was"); X else X! pline("The %s %s poisoned!", string, (plural) ? "were" : "was"); X } X X if(Poison_resistance) { X--- 642,655 ---- X /* so have "poison arrow", "poison dart", etc... */ X plural = (string[strlen(string) - 1] == 's')? 1 : 0; X if(Blind) X! pline("%s poisoned.", plural ? "They were" : "It was"); X! #ifdef HARD X! /* avoid "The" Orcus's sting was poisoned... */ X! else if(isupper(*string)) X! pline("%s %s poisoned!", string, plural ? "were" : "was"); X! #endif X else X! pline("The %s %s poisoned!", string, plural ? "were" : "was"); X } X X if(Poison_resistance) { X*************** X*** 657,663 **** X } X if(u.uhp < 1) { X killer = pname; X! done("died"); X } X } X X--- 669,675 ---- X } X if(u.uhp < 1) { X killer = pname; X! done(POISONING); X } X } X X*************** X*** 831,837 **** X #ifdef DEBUG X pline("Automatically genocided %s.", makeplural(mons[tmp].mname)); X #endif X! mons[tmp].geno |= G_GENOD; X } X #ifdef MAIL X /* If you kill the mail daemon, no more mail delivery. -3. */ X--- 843,850 ---- X #ifdef DEBUG X pline("Automatically genocided %s.", makeplural(mons[tmp].mname)); X #endif X! if (tmp != PM_WIZARD_OF_YENDOR) X! mons[tmp].geno |= G_GENOD; X } X #ifdef MAIL X /* If you kill the mail daemon, no more mail delivery. -3. */ X*** src/Old/mondata.c Wed Aug 16 12:30:26 1989 X--- src/mondata.c Tue Aug 15 22:58:29 1989 X*************** X*** 96,102 **** X canseemon(mtmp) X register struct monst *mtmp; X { X! return((!mtmp->minvis || See_invisible) X && (!mtmp->mhide || X (levl[mtmp->mx][mtmp->my].omask == 0 && X levl[mtmp->mx][mtmp->my].gmask == 0)) X--- 96,102 ---- X canseemon(mtmp) X register struct monst *mtmp; X { X! return((!mtmp->minvis || See_invisible || Telepat) X && (!mtmp->mhide || X (levl[mtmp->mx][mtmp->my].omask == 0 && X levl[mtmp->mx][mtmp->my].gmask == 0)) X*************** X*** 121,135 **** X struct permonst *ptr; X { X register int i; X- register struct permonst *mdat; X X if(ptr == &playermon) return(-1); X X! for(i = 0, mdat = &mons[0]; mdat->mlet; i++) X! if(ptr == mdat++) return(i); X X! panic("monsndx - could not index monster (%x)", ptr); X! return FALSE; /* will not get here */ X } X X int X--- 121,137 ---- X struct permonst *ptr; X { X register int i; X X if(ptr == &playermon) return(-1); X X! i = (int)(ptr - &mons[0]); X X! if(i < 0 || i >= NUMMONS) { X! panic("monsndx - could not index monster (%x)", ptr); X! return FALSE; /* will not get here */ X! } X! X! return(i); X } X X int X*************** X*** 630,641 **** X cantweararm(ptr) struct permonst *ptr; { X return(breakarm(ptr) || sliparm(ptr)); X } X X int X nolimbs(ptr) struct permonst *ptr; { X return((ptr->mflags2 & M2_NOLIMBS) != 0L); X } X- # endif /* POLYSELF */ X X int X carnivorous(ptr) struct permonst *ptr; { X--- 632,643 ---- X cantweararm(ptr) struct permonst *ptr; { X return(breakarm(ptr) || sliparm(ptr)); X } X+ # endif /* POLYSELF */ X X int X nolimbs(ptr) struct permonst *ptr; { X return((ptr->mflags2 & M2_NOLIMBS) != 0L); X } X X int X carnivorous(ptr) struct permonst *ptr; { X*** src/Old/monmove.c Wed Aug 16 12:30:53 1989 X--- src/monmove.c Tue Aug 15 18:49:05 1989 X*************** X*** 8,14 **** X # include "artifact.h" X #endif X X! static boolean /* TRUE : mtmp died */ X mb_trapped(mtmp) X register struct monst *mtmp; X { X--- 8,14 ---- X # include "artifact.h" X #endif X X! boolean /* TRUE : mtmp died */ X mb_trapped(mtmp) X register struct monst *mtmp; X { X*************** X*** 684,689 **** X--- 684,690 ---- X u.uy = mtmp->my; X if(mtmp->mx != mtmp->mdx || mtmp->my != mtmp->mdy) { X swallowed(0); X+ newsym(mtmp->mdx,mtmp->mdy); X mtmp->mdx = mtmp->mx; X mtmp->mdy = mtmp->my; X } X*** src/Old/mthrowu.c Mon Jul 31 21:56:30 1989 X--- src/mthrowu.c Thu Aug 17 09:02:22 1989 X*************** X*** 133,139 X kludge("The poison doesn't seem to affect %s.", X mon_nam(mtmp)); X else { X! if (rn2(10)) damage += rnd(6); X else { X pline("The poison was deadly..."); X damage = mtmp->mhp; X X--- 133,139 ----- X kludge("The poison doesn't seem to affect %s.", X mon_nam(mtmp)); X else { X! if (rn2(30)) damage += rnd(6); X else { X pline("The poison was deadly..."); X damage = mtmp->mhp; X*** src/Old/version.c Wed Aug 16 12:49:33 1989 X--- src/version.c Tue Aug 15 22:05:17 1989 X*************** X*** 4,9 **** X--- 4,12 ---- X X #include "hack.h" X #include "date.h" X+ #ifndef BETA X+ #include "patchlevel.h" X+ #endif X X int X doversion(){ X*************** X*** 11,17 **** X #ifdef BETA X pline("%s NetHack Beta Version %s - last build %s.", X #else X! pline("%s NetHack Version %s - last build %s.", X #endif X #if defined(MSDOS) X # if defined(TOS) X--- 14,20 ---- X #ifdef BETA X pline("%s NetHack Beta Version %s - last build %s.", X #else X! pline("%s NetHack Version %s Patchlevel %d - last build %s.", X #endif X #if defined(MSDOS) X # if defined(TOS) X*************** X*** 20,26 **** X--- 23,33 ---- X # if defined(AMIGA) X "Amiga", X # else X+ # if defined(OS2) X+ "OS/2", X+ # else X "PC", X+ # endif X # endif X # endif X #endif X*************** X*** 27,32 **** X #ifdef UNIX X "Unix", X #endif X! VERSION, datestring); X return 0; X } X--- 34,43 ---- X #ifdef UNIX X "Unix", X #endif X! VERSION, X! #ifndef BETA X! PATCHLEVEL, X! #endif X! datestring); X return 0; X } X*** src/Old/weapon.c Sun Jul 16 10:05:53 1989 X--- src/weapon.c Fri Aug 18 08:13:41 1989 X*************** X*** 205,211 **** X X /* shooting gems from slings; this goes just before the darts */ X if (rwep[i]==DART && !likes_gems(mtmp->data) X! /* && m_carrying(mtmp, SLING) */) { X for(otmp=mtmp->minvent; otmp; otmp=otmp->nobj) { X if(otmp->olet==GEM_SYM && X (otmp->otyp != LOADSTONE || !otmp->cursed)) X--- 205,211 ---- X X /* shooting gems from slings; this goes just before the darts */ X if (rwep[i]==DART && !likes_gems(mtmp->data) X! && m_carrying(mtmp, SLING)) { X for(otmp=mtmp->minvent; otmp; otmp=otmp->nobj) { X if(otmp->olet==GEM_SYM && X (otmp->otyp != LOADSTONE || !otmp->cursed)) X*************** X*** 224,237 **** X no_propellor = !(m_carrying(mtmp, BOW)); X #endif X break; X! /* case WP_SLING: X no_propellor = (m_carrying(mtmp, SLING) != 0); X! break; */ X case WP_CROSSBOW: X no_propellor = (m_carrying(mtmp, CROSSBOW) != 0); X } X } X! if (!no_propellor) Oselect(rwep[i]); X } X X /* failure */ X--- 224,248 ---- X no_propellor = !(m_carrying(mtmp, BOW)); X #endif X break; X! case WP_SLING: X no_propellor = (m_carrying(mtmp, SLING) != 0); X! break; X case WP_CROSSBOW: X no_propellor = (m_carrying(mtmp, CROSSBOW) != 0); X } X } X! if (!no_propellor) { X! /* Note: cannot use m_carrying for loadstones, since it will X! * always select the first object of a type, and maybe the X! * monster is carrying two but only the first is unthrowable. X! */ X! if (rwep[i] != LOADSTONE) { X! Oselect(rwep[i]); X! } else for(otmp=mtmp->minvent; otmp; otmp=otmp->nobj) { X! if (otmp->otyp == LOADSTONE && !otmp->cursed) X! return otmp; X! } X! } X } X X /* failure */ X*************** X*** 327,333 **** X else if(ACURR(A_DEX) < 6) return(sbon-2); X else if(ACURR(A_DEX) < 8) return(sbon-1); X else if(ACURR(A_DEX) < 14) return(sbon); X! else return(sbon+ACURR(A_DEX)-15); X } X X int X--- 338,344 ---- X else if(ACURR(A_DEX) < 6) return(sbon-2); X else if(ACURR(A_DEX) < 8) return(sbon-1); X else if(ACURR(A_DEX) < 14) return(sbon); X! else return(sbon+ACURR(A_DEX)-14); X } X X int X*** src/Old/were.c Wed Aug 16 12:49:59 1989 X--- src/were.c Fri Aug 4 12:37:40 1989 X*************** X*** 47,53 **** X } X X if(canseemon(mon)) X! pline("%s changes into a %s.", Monnam(mon), mons[pm].mname); X X mon->data = &mons[pm]; X /* regenerate by 1/4 of the lost hit points */ X--- 47,54 ---- X } X X if(canseemon(mon)) X! pline("%s changes into a %s.", Monnam(mon), X! Hallucination ? rndmonnam() : mons[pm].mname); X X mon->data = &mons[pm]; X /* regenerate by 1/4 of the lost hit points */ X*** src/Old/wield.c Wed Aug 16 12:50:15 1989 X--- src/wield.c Tue Aug 15 20:35:31 1989 X*************** X*** 66,72 **** X makeplural(body_part(HAND))); X You("turn to stone..."); X killer="cockatrice corpse"; X! done("stoned"); X } else if(uarms && bimanual(wep)) X You("cannot wield a two-handed %s and hold a shield.", X is_sword(wep) ? "sword" : "weapon"); X--- 66,72 ---- X makeplural(body_part(HAND))); X You("turn to stone..."); X killer="cockatrice corpse"; X! done(STONING); X } else if(uarms && bimanual(wep)) X You("cannot wield a two-handed %s and hold a shield.", X is_sword(wep) ? "sword" : "weapon"); X*** src/Old/worn.c Wed Aug 16 12:50:55 1989 X--- src/worn.c Tue Aug 15 20:35:33 1989 X*************** X*** 68,74 **** X if (Inhell && !Fire_resistance) { X pline(crispy); X killer = "loss of fire protection"; X! done("burned"); X /* If we're here they survived with life saving, so put the X * weapon they just unwielded back in their hands... X */ X--- 68,74 ---- X if (Inhell && !Fire_resistance) { X pline(crispy); X killer = "loss of fire protection"; X! done(BURNING); X /* If we're here they survived with life saving, so put the X * weapon they just unwielded back in their hands... X */ X*************** X*** 108,114 **** X if (Inhell && !Fire_resistance && obj->olet != AMULET_SYM) { X pline(crispy); X killer = "loss of fire protection"; X! done("burned"); X /* Survived with lifesaving, etc...; there's no general way X * to undo the setnotworn()--we can't re-wear/wield the X * item since it might have been stolen, disintegrated, etc.... X--- 108,114 ---- X if (Inhell && !Fire_resistance && obj->olet != AMULET_SYM) { X pline(crispy); X killer = "loss of fire protection"; X! done(BURNING); X /* Survived with lifesaving, etc...; there's no general way X * to undo the setnotworn()--we can't re-wear/wield the X * item since it might have been stolen, disintegrated, etc.... X*************** X*** 121,127 **** X */ X #endif X You("are still burning and die again..."); X! done("burned"); X #if defined(WIZARD) || defined(EXPLORE_MODE) X } X #endif X--- 121,127 ---- X */ X #endif X You("are still burning and die again..."); X! done(BURNING); X #if defined(WIZARD) || defined(EXPLORE_MODE) X } X #endif X*** src/Old/zap.c Wed Aug 16 13:54:17 1989 X--- src/zap.c Wed Aug 16 13:40:28 1989 X*************** X*** 43,48 **** X--- 43,55 ---- X "" X }; X X+ #ifdef TEXTCOLOR X+ static const int zapcolor[10] = { X+ AT_ZAP, RED, AT_ZAP, WHITE, AT_ZAP, WHITE, X+ AT_ZAP, AT_ZAP, AT_ZAP, AT_ZAP X+ }; X+ #endif X+ X /* Routines for IMMEDIATE wands and spells. */ X /* bhitm: monster mtmp was hit by the effect of wand or spell otmp */ X static int X*************** X*** 657,663 **** X You("die."); X makeknown(WAN_DEATH); X /* They might survive with an amulet of life saving */ X! done("died"); X break; X #ifdef SPELLS X case SPE_TURN_UNDEAD: X--- 664,670 ---- X You("die."); X makeknown(WAN_DEATH); X /* They might survive with an amulet of life saving */ X! done(DIED); X break; X #ifdef SPELLS X case SPE_TURN_UNDEAD: X*************** X*** 705,743 **** X if(objects[obj->otyp].bits & IMMEDIATE) { X if(u.uswallow) (void)bhitm(u.ustuck, obj); X else if(u.dz) { X! if(u.dz > 0 && levl[u.ux][u.uy].omask) { X! register struct obj *otmp,*otmp2; X! X! /* changed by GAN to hit all objects there */ X! for(otmp = fobj; otmp ; otmp = otmp2) { X! otmp2 = otmp->nobj; X! /* save pointer as bhito may destroy otmp */ X! if(otmp->ox == u.ux && otmp->oy == u.uy) X! (void) bhito(otmp, obj); X! } X! } X! } else if((obj->otyp == WAN_OPENING) || X! #ifdef SPELLS X! (obj->otyp == SPE_KNOCK) || X! (obj->otyp == SPE_WIZARD_LOCK) || X! #endif X! (obj->otyp == WAN_LOCKING)) { X! (void)bhit(u.dx,u.dy,rn1(8,6),0,bhitm,bhito,obj); X #ifdef STRONGHOLD X! } else if(obj->otyp == WAN_STRIKING X! #ifdef SPELLS X! || obj->otyp == SPE_FORCE_BOLT X! #endif /* SPELLS /**/ X! ) { X! int x,y; X! x = u.ux + u.dx; X! y = u.uy + u.dy; X! if (find_drawbridge(&x,&y)) X! destroy_drawbridge(x,y); X! X! else (void) bhit(u.dx,u.dy,rn1(8,6),0,bhitm,bhito,obj); X! #endif /* STRONGHOLD /**/ X! } else (void) bhit(u.dx,u.dy,rn1(8,6),0,bhitm,bhito,obj); X } else { X switch(obj->otyp){ X case WAN_LIGHT: X--- 712,741 ---- X if(objects[obj->otyp].bits & IMMEDIATE) { X if(u.uswallow) (void)bhitm(u.ustuck, obj); X else if(u.dz) { X! if(u.dz > 0) { X #ifdef STRONGHOLD X! if(levl[u.ux][u.uy].typ == DRAWBRIDGE_DOWN && X! (obj->otyp == WAN_LOCKING X! # ifdef SPELLS X! || obj->otyp == SPE_WIZARD_LOCK X! # endif X! )) X! (void)close_drawbridge(u.ux, u.uy); X! else X! #endif X! if (levl[u.ux][u.uy].omask) { X! register struct obj *otmp,*otmp2; X! X! /* changed by GAN to hit all objects there */ X! for(otmp = fobj; otmp ; otmp = otmp2) { X! otmp2 = otmp->nobj; X! /* save pointer as bhito may destroy otmp */ X! if(otmp->ox == u.ux && otmp->oy == u.uy) X! (void) bhito(otmp, obj); X! } X! } X! } X! } else (void) bhit(u.dx,u.dy,rn1(8,6),0,bhitm,bhito,obj); X } else { X switch(obj->otyp){ X case WAN_LIGHT: X*************** X*** 935,940 **** X--- 933,940 ---- X register struct monst *mtmp; X register struct obj *otmp; X register int typ; X+ boolean shopdoor = FALSE; X+ xchar dlx, dly; X X bhitpos.x = u.ux; X bhitpos.y = u.uy; X*************** X*** 944,966 **** X tmp_at(-3, (int)AT_OBJ); X } X while(range-- > 0) { X bhitpos.x += ddx; X bhitpos.y += ddy; X- typ = levl[bhitpos.x][bhitpos.y].typ; X #ifdef STRONGHOLD X! if(IS_DRAWBRIDGE(typ)) X switch (obj->otyp) { X case WAN_OPENING: X # ifdef SPELLS X case SPE_KNOCK: X # endif X! (void) open_drawbridge(bhitpos.x,bhitpos.y); X break; X case WAN_LOCKING: X # ifdef SPELLS X case SPE_WIZARD_LOCK: X # endif X! (void) close_drawbridge(bhitpos.x,bhitpos.y); X } X #endif /* STRONGHOLD /**/ X if(levl[bhitpos.x][bhitpos.y].mmask){ X--- 944,975 ---- X tmp_at(-3, (int)AT_OBJ); X } X while(range-- > 0) { X+ #ifdef STRONGHOLD X+ int x,y; X+ #endif X bhitpos.x += ddx; X bhitpos.y += ddy; X #ifdef STRONGHOLD X! x = bhitpos.x; y = bhitpos.y; X! if (find_drawbridge(&x,&y)) X switch (obj->otyp) { X case WAN_OPENING: X # ifdef SPELLS X case SPE_KNOCK: X # endif X! (void) open_drawbridge(x,y); X break; X case WAN_LOCKING: X # ifdef SPELLS X case SPE_WIZARD_LOCK: X # endif X! (void) close_drawbridge(x,y); X! break; X! case WAN_STRIKING: X! # ifdef SPELLS X! case SPE_FORCE_BOLT: X! # endif X! destroy_drawbridge(x,y); X } X #endif /* STRONGHOLD /**/ X if(levl[bhitpos.x][bhitpos.y].mmask){ X*************** X*** 987,1002 **** X } X if(hitanything) range--; X } X if(IS_DOOR(typ) || typ == SDOOR) { X switch (obj->otyp) { X case WAN_OPENING: X case WAN_LOCKING: X #ifdef SPELLS X case SPE_KNOCK: X case SPE_WIZARD_LOCK: X #endif X! if (doorlock(obj,bhitpos.x,bhitpos.y)) X! makeknown(obj->otyp); X break; X } X } X--- 996,1020 ---- X } X if(hitanything) range--; X } X+ typ = levl[bhitpos.x][bhitpos.y].typ; X if(IS_DOOR(typ) || typ == SDOOR) { X switch (obj->otyp) { X case WAN_OPENING: X case WAN_LOCKING: X+ case WAN_STRIKING: X #ifdef SPELLS X case SPE_KNOCK: X case SPE_WIZARD_LOCK: X+ case SPE_FORCE_BOLT: X #endif X! if (doorlock(obj, bhitpos.x, bhitpos.y)) { X! makeknown(obj->otyp); X! if (levl[bhitpos.x][bhitpos.y].doormask == D_BROKEN X! && in_shop(bhitpos.x, bhitpos.y)) { X! shopdoor = TRUE; X! dlx = bhitpos.x; dly = bhitpos.y; X! } X! } X break; X } X } X*************** X*** 1017,1022 **** X--- 1035,1044 ---- X /* leave last symbol unless in a pool */ X if(sym) X tmp_at(-1, is_pool(bhitpos.x,bhitpos.y) ? -1 : 0); X+ X+ if(shopdoor && !in_shop(u.ux, u.uy)) X+ pay_for_door(dlx, dly, "destroy"); X+ X return (struct monst *)0; X } X X*************** X*** 1032,1038 **** X--- 1054,1064 ---- X X for(i=0; i<8; i++) if(xdir[i] == dx && ydir[i] == dy) break; X tmp_at(-1, sym); /* open call */ X+ #ifndef TEXTCOLOR X tmp_at(-3, (int)AT_OBJ); X+ #else X+ tmp_at(-3, HI_METAL); X+ #endif X for(ct=0; ct<10; ct++) { X if(i == 8) i = 0; X sym = ')' + '(' - sym; X*************** X*** 1225,1234 **** X if(type < 0) pru(); X range = rn1(7,7); X Tmp_at2(-1, (int) dirlet(dx,dy)); /* open call */ X! #ifdef MSDOSCOLOR X! Tmp_at2(-3, (int)(abstype == 1 ? AT_RED : /* fire */ X! abstype == 3 || abstype == 5 ? AT_WHITE : /* cold/elec */ X! AT_ZAP)); X #endif X while(range-- > 0) { X sx += dx; X--- 1251,1258 ---- X if(type < 0) pru(); X range = rn1(7,7); X Tmp_at2(-1, (int) dirlet(dx,dy)); /* open call */ X! #ifdef TEXTCOLOR X! Tmp_at2(-3, zapcolor[abstype]); X #endif X while(range-- > 0) { X sx += dx; END_OF_FILE if test 54587 -ne `wc -c <'patch02e'`; then echo shar: \"'patch02e'\" unpacked with wrong size! fi # end of 'patch02e' fi echo shar: End of archive 5 \(of 7\). cp /dev/null ark5isdone MISSING="" for I in 1 2 3 4 5 6 7 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 7 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0