billr@saab.CNA.TEK.COM (Bill Randle) (09/08/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 8, Issue 20 Archive-name: NetHack3/Patch3e 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 6)." # Contents: patch03e # Wrapped by billr@saab on Thu Sep 7 14:39:17 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'patch03e' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patch03e'\" else echo shar: Extracting \"'patch03e'\" \(55646 characters\) sed "s/^X//" >'patch03e' <<'END_OF_FILE' X*** src/Old/mkroom.c Wed Sep 6 16:34:25 1989 X--- src/mkroom.c Sat Aug 26 18:37:04 1989 X*************** X*** 237,243 **** X break; X case MORGUE: X if(!rn2(5)) X! (void) mk_tt_corpse(sx, sy); X if(!rn2(10)) /* lots of treasure buried with dead */ X (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, sx, sy); X break; X--- 237,243 ---- X break; X case MORGUE: X if(!rn2(5)) X! (void) mk_tt_object(CORPSE, sx, sy); X if(!rn2(10)) /* lots of treasure buried with dead */ X (void) mksobj_at((rn2(3)) ? LARGE_BOX : CHEST, sx, sy); X break; X*************** X*** 295,301 **** X sroom->rtype = SWAMP; X for(sx = sroom->lx; sx <= sroom->hx; sx++) X for(sy = sroom->ly; sy <= sroom->hy; sy++) X! if(levl[sx][sy].omask == 0 && levl[sx][sy].gmask == 0 && X levl[sx][sy].mmask == 0 && X !t_at(sx,sy) && !nexttodoor(sx,sy)) { X if((sx+sy)%2) { X--- 295,301 ---- X sroom->rtype = SWAMP; X for(sx = sroom->lx; sx <= sroom->hx; sx++) X for(sy = sroom->ly; sy <= sroom->hy; sy++) X! if(!OBJ_AT(sx, sy) && levl[sx][sy].gmask == 0 && X levl[sx][sy].mmask == 0 && X !t_at(sx,sy) && !nexttodoor(sx,sy)) { X if((sx+sy)%2) { X*************** X*** 333,343 **** X X yy -= dy; X if(ACCESSIBLE(levl[xx-1][yy].typ)) X! (void) mkstatue(&mons[PM_FOREST_CENTAUR], xx-1, yy); X if(ACCESSIBLE(levl[xx][yy].typ)) X! (void) mkstatue(&mons[PM_MOUNTAIN_CENTAUR], xx, yy); X if(ACCESSIBLE(levl[xx+1][yy].typ)) X! (void) mkstatue(&mons[PM_PLAINS_CENTAUR], xx+1, yy); X # ifdef FOUNTAINS X mkfount(0,sroom); X # endif X--- 333,343 ---- X X yy -= dy; X if(ACCESSIBLE(levl[xx-1][yy].typ)) X! (void) mkcorpstat(STATUE, &mons[PM_FOREST_CENTAUR], xx-1, yy); X if(ACCESSIBLE(levl[xx][yy].typ)) X! (void) mkcorpstat(STATUE, &mons[PM_MOUNTAIN_CENTAUR], xx, yy); X if(ACCESSIBLE(levl[xx+1][yy].typ)) X! (void) mkcorpstat(STATUE, &mons[PM_PLAINS_CENTAUR], xx+1, yy); X # ifdef FOUNTAINS X mkfount(0,sroom); X # endif X*** src/Old/mon.c Wed Sep 6 16:34:46 1989 X--- src/mon.c Fri Sep 1 19:53:54 1989 X*************** X*** 90,96 **** X obj->owt = weight(obj); X break; X case PM_STONE_GOLEM: X! obj = mkstatue(mdat, x, y); X break; X case PM_WOOD_GOLEM: X pieces = d(2,4); X--- 90,96 ---- X obj->owt = weight(obj); X break; X case PM_STONE_GOLEM: X! obj = mkcorpstat(STATUE, mdat, x, y); X break; X case PM_WOOD_GOLEM: X pieces = d(2,4); X*************** X*** 106,112 **** X default: X if (mdat->geno & G_NOCORPSE) X return (struct obj *)0; X! else obj = mkcorpse_at(mdat, x, y); X break; X } X /* All special cases should precede the G_NOCORPSE check */ X--- 106,112 ---- X default: X if (mdat->geno & G_NOCORPSE) X return (struct obj *)0; X! else obj = mkcorpstat(CORPSE, mdat, x, y); X break; X } X /* All special cases should precede the G_NOCORPSE check */ X*************** X*** 275,281 **** X register struct obj *otmp; X X /* Eats gold if it is there */ X! while(gold = g_at(mtmp->mx, mtmp->my)){ X if (cansee(mtmp->mx, mtmp->my) && flags.verbose) X pline("%s eats some gold!", Monnam(mtmp)); X mtmp->meating = (int)((gold->amount + 500L)/1000L); X--- 275,281 ---- X register struct obj *otmp; X X /* Eats gold if it is there */ X! if(gold = g_at(mtmp->mx, mtmp->my)){ X if (cansee(mtmp->mx, mtmp->my) && flags.verbose) X pline("%s eats some gold!", Monnam(mtmp)); X mtmp->meating = (int)((gold->amount + 500L)/1000L); X*************** X*** 287,293 **** X /* Eats topmost metal object if it is there */ X for (otmp = fobj; otmp; otmp = otmp->nobj) X if (otmp->ox == mtmp->mx && otmp->oy == mtmp->my && X! objects[otmp->otyp].oc_material == METAL) { X if (cansee(mtmp->mx,mtmp->my) && flags.verbose) X pline("%s eats %s!", Monnam(mtmp), X distant_name(otmp,doname)); X--- 287,294 ---- X /* Eats topmost metal object if it is there */ X for (otmp = fobj; otmp; otmp = otmp->nobj) X if (otmp->ox == mtmp->mx && otmp->oy == mtmp->my && X! objects[otmp->otyp].oc_material > WOOD && X! objects[otmp->otyp].oc_material < MINERAL) { X if (cansee(mtmp->mx,mtmp->my) && flags.verbose) X pline("%s eats %s!", Monnam(mtmp), X distant_name(otmp,doname)); X*************** X*** 299,313 **** X mtmp->mhp += objects[otmp->otyp].oc_weight; X if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; X } X! if((uball && otmp == uball) || X! (uchain && otmp == uchain)) unpunish(); X! freeobj(otmp); X /* Left behind a pile? */ X if(rnd(25) < 3) (void) mksobj_at(ROCK, mtmp->mx, mtmp->my); X newsym(mtmp->mx, mtmp->my); X break; X } X- set_omask(mtmp->mx, mtmp->my); X } X X void X--- 300,317 ---- X mtmp->mhp += objects[otmp->otyp].oc_weight; X if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; X } X! if(otmp == uball) { X! unpunish(); X! freeobj(otmp); X! } else if(otmp == uchain) X! unpunish(); /* frees uchain */ X! else X! freeobj(otmp); X /* Left behind a pile? */ X if(rnd(25) < 3) (void) mksobj_at(ROCK, mtmp->mx, mtmp->my); X newsym(mtmp->mx, mtmp->my); X break; X } X } X X void X*************** X*** 317,323 **** X register struct obj *otmp, *otmp2; X X /* Eats organic, glass, or wood objects if there */ X! /* Engulfs anything else, metal and rock */ X for (otmp = fobj; otmp; otmp = otmp2) { X otmp2 = otmp->nobj; X if (otmp->ox == mtmp->mx && otmp->oy == mtmp->my) { X--- 321,327 ---- X register struct obj *otmp, *otmp2; X X /* Eats organic, glass, or wood objects if there */ X! /* Engulfs others, except huge rocks and metal attached to player */ X for (otmp = fobj; otmp; otmp = otmp2) { X otmp2 = otmp->nobj; X if (otmp->ox == mtmp->mx && otmp->oy == mtmp->my) { X*************** X*** 333,339 **** X if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; X } X delobj(otmp); /* munch */ X! } else if (otmp->olet != ROCK_SYM && otmp->olet != BALL_SYM) { X if (cansee(mtmp->mx, mtmp->my) && flags.verbose) X pline("%s engulfs %s.", Monnam(mtmp), X distant_name(otmp,doname)); X--- 337,344 ---- X if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; X } X delobj(otmp); /* munch */ X! } else if (otmp->olet != ROCK_SYM && X! otmp != uball && otmp != uchain) { X if (cansee(mtmp->mx, mtmp->my) && flags.verbose) X pline("%s engulfs %s.", Monnam(mtmp), X distant_name(otmp,doname)); X*************** X*** 344,350 **** X /* Engulf & devour is instant, so don't set meating */ X newsym(mtmp->mx, mtmp->my); X } X- set_omask(mtmp->mx, mtmp->my); X } X X void X--- 349,354 ---- X*************** X*** 353,359 **** X { X register struct gold *gold; X X! while(gold = g_at(mtmp->mx, mtmp->my)){ X mtmp->mgold += gold->amount; X if (cansee(mtmp->mx, mtmp->my) && flags.verbose) X pline("%s picks up some gold.", Monnam(mtmp)); X--- 357,363 ---- X { X register struct gold *gold; X X! if(gold = g_at(mtmp->mx, mtmp->my)){ X mtmp->mgold += gold->amount; X if (cansee(mtmp->mx, mtmp->my) && flags.verbose) X pline("%s picks up some gold.", Monnam(mtmp)); X*************** X*** 361,367 **** X if(levl[mtmp->mx][mtmp->my].scrsym == GOLD_SYM) X newsym(mtmp->mx, mtmp->my); X } X- set_omask(mtmp->mx, mtmp->my); X } X X /* Now includes giants which pick up enormous rocks. KAA */ X--- 365,370 ---- X*************** X*** 385,391 **** X newsym(mtmp->mx, mtmp->my); X return; /* pick only one object */ X } X- set_omask(mtmp->mx, mtmp->my); X } X X int X--- 388,393 ---- X*************** X*** 474,480 **** X mpickobj(mtmp, otmp); X if(index(str, (char) levl[mtmp->mx][mtmp->my].scrsym)) X newsym(mtmp->mx, mtmp->my); X- set_omask(mtmp->mx, mtmp->my); X return; /* pick only one object */ X } X } X--- 476,481 ---- X*************** X*** 771,776 **** X--- 772,778 ---- X u.ux = mtmp->mx; X u.uy = mtmp->my; X u.uswallow = 0; X+ u.uswldtim = 0; X setsee(); X docrt(); X } X*************** X*** 1059,1073 **** X mtmp->minvis = !!(mdat->mlet == S_STALKER); X mtmp->mhide = !!hides_under(mdat); X if (!mtmp->mhide) mtmp->mundetected = 0; X! if (u.ustuck == mtmp X #ifdef POLYSELF X! && !sticks(uasmon) X #endif X! && !sticks(mdat)) X! u.ustuck = 0; X #ifdef WORM X if(mdat == &mons[PM_LONG_WORM] && getwn(mtmp)) initworm(mtmp); X- /* perhaps we should clear mtmp->mtame here? */ X #endif X unpmon(mtmp); /* necessary for 'I' and to force pmon */ X pmon(mtmp); X--- 1061,1087 ---- X mtmp->minvis = !!(mdat->mlet == S_STALKER); X mtmp->mhide = !!hides_under(mdat); X if (!mtmp->mhide) mtmp->mundetected = 0; X! if (u.ustuck == mtmp) { X! if(u.uswallow) { X! if(!attacktype(mdat,AT_ENGL)) { X! /* cf. digging out of monster with wand */ X! You("break out of %s's stomach!", X! mon_nam(mtmp)); X! mtmp->mhp = 1; /* almost dead */ X! regurgitates(mtmp); X! } X! } else { X! if(!sticks(mdat) X #ifdef POLYSELF X! && !sticks(uasmon) X #endif X! ) X! unstuck(mtmp); X! } X! } X! X #ifdef WORM X if(mdat == &mons[PM_LONG_WORM] && getwn(mtmp)) initworm(mtmp); X #endif X unpmon(mtmp); /* necessary for 'I' and to force pmon */ X pmon(mtmp); X*** src/Old/mondata.c Wed Sep 6 16:35:40 1989 X--- src/mondata.c Sun Aug 20 14:26:12 1989 X*************** X*** 96,104 **** 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 && cansee(mtmp->mx, mtmp->my)); X } X--- 96,104 ---- X canseemon(mtmp) X register struct monst *mtmp; X { X! return((!mtmp->minvis || See_invisible) X && (!mtmp->mhide || X! (!OBJ_AT(mtmp->mx, mtmp->my) && X levl[mtmp->mx][mtmp->my].gmask == 0)) X && cansee(mtmp->mx, mtmp->my)); X } X*************** X*** 305,314 **** X int little_to_big(montype) X int montype; X { X! register int *i; X X! for(i=grownups[0]; *i >= 0; i++) X! if(montype == *i) return *(i+1); X return montype; X } X X--- 305,314 ---- X int little_to_big(montype) X int montype; X { X! register int i; X X! for(i=0; grownups[i][0] >= 0; i++) X! if(montype == grownups[i][0]) return grownups[i][1]; X return montype; X } X X*************** X*** 315,324 **** X int big_to_little(montype) X int montype; X { X! register int *i; X X! for(i=grownups[0]; *i >= 0; i++) X! if(montype == *(i+1)) return *i; X return montype; X } X X--- 315,324 ---- X int big_to_little(montype) X int montype; X { X! register int i; X X! for(i=0; grownups[i][0] >= 0; i++) X! if(montype == grownups[i][1]) return grownups[i][0]; X return montype; X } X X*** src/Old/monmove.c Wed Sep 6 16:36:09 1989 X--- src/monmove.c Sat Aug 26 16:47:10 1989 X*************** X*** 118,131 **** X sobj_at(SCR_SCARE_MONSTER, x, y) != (struct obj *)0); X } X X /* returns 1 if monster died moving, 0 otherwise */ X int X dochug(mtmp) X! register struct monst *mtmp; X { X register struct permonst *mdat = mtmp->data; X! register int tmp=0, inrange, nearby, scared, seescaryx, X! seescaryy; X X /* Pre-movement adjustments */ X X--- 118,176 ---- X sobj_at(SCR_SCARE_MONSTER, x, y) != (struct obj *)0); X } X X+ static void X+ distfleeck(mtmp,inrange,nearby,scared) X+ register struct monst *mtmp; X+ int *inrange, *nearby, *scared; X+ { X+ int seescaryx, seescaryy; X+ X+ *inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= X+ (BOLT_LIM * BOLT_LIM)); X+ *nearby = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) < 3); X+ X+ /* Note: if your image is displaced, the monster sees the Elbereth X+ * at your displaced position, thus never attacking your displaced X+ * position, but possibly attacking you by accident. If you are X+ * invisible, it sees the Elbereth at your real position, thus never X+ * running into you by accident but possibly attacking the spot X+ * where it guesses you are. X+ */ X+ if (Invis && !perceives(mtmp->data)) { X+ seescaryx = mtmp->mux; X+ seescaryy = mtmp->muy; X+ } else { X+ seescaryx = u.ux; X+ seescaryy = u.uy; X+ } X+ *scared = (*nearby && onscary(seescaryx, seescaryy, mtmp)); X+ X+ if(*scared && !mtmp->mflee) { X+ #ifdef POLYSELF X+ if (!sticks(uasmon)) X+ #endif X+ unstuck(mtmp); /* monster lets go when fleeing */ X+ mtmp->mflee = 1; X+ #ifdef STUPID X+ if (rn2(7)) X+ mtmp->mfleetim = rnd(10); X+ else X+ mtmp->mfleetim = rnd(100); X+ #else X+ mtmp->mfleetim = (rn2(7) ? rnd(10) : rnd(100)); X+ #endif X+ } X+ X+ } X+ X /* returns 1 if monster died moving, 0 otherwise */ X int X dochug(mtmp) X! register struct monst *mtmp; X { X register struct permonst *mdat = mtmp->data; X! register int tmp=0; X! int inrange, nearby, scared; X X /* Pre-movement adjustments */ X X*************** X*** 179,218 **** X if(mtmp->iswiz) X (void) wiz_get_amulet(mtmp); X X! inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= X! (BOLT_LIM * BOLT_LIM)); X! nearby = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) < 3); X! /* Note: if your image is displaced, the monster sees the Elbereth X! * at your displaced position, thus never attacking your displaced X! * position, but possibly attacking you by accident. If you are X! * invisible, it sees the Elbereth at your real position, thus never X! * running into you by accident but possibly attacking the spot X! * where it guesses you are. X! */ X! if (Invis && !perceives(mdat)) { X! seescaryx = mtmp->mux; X! seescaryy = mtmp->muy; X! } else { X! seescaryx = u.ux; X! seescaryy = u.uy; X! } X! scared = (nearby && onscary(seescaryx, seescaryy, mtmp)); X! X! if(scared && !mtmp->mflee) { X! #ifdef POLYSELF X! if (!sticks(uasmon)) X! #endif X! unstuck(mtmp); /* monster lets go when fleeing */ X! mtmp->mflee = 1; X! #ifdef STUPID X! if (rn2(7)) X! mtmp->mfleetim = rnd(10); X! else X! mtmp->mfleetim = rnd(100); X! #else X! mtmp->mfleetim = (rn2(7) ? rnd(10) : rnd(100)); X! #endif X! } X X #ifdef HARD /* Demonic Blackmail!!! */ X if(nearby && is_demon(mdat) && mtmp->mpeaceful && !mtmp->mtame) { X--- 224,231 ---- X if(mtmp->iswiz) X (void) wiz_get_amulet(mtmp); X X! /* check distance and scariness of attacks */ X! distfleeck(mtmp,&inrange,&nearby,&scared); X X #ifdef HARD /* Demonic Blackmail!!! */ X if(nearby && is_demon(mdat) && mtmp->mpeaceful && !mtmp->mtame) { X*************** X*** 245,252 **** X (!mtmp->mcansee && !rn2(4)) || mtmp->mpeaceful) { X X tmp = m_move(mtmp, 0); X! nearby = (dist(mtmp->mx, mtmp->my) < 3); /* recalc */ X! scared = (nearby && onscary(seescaryx, seescaryy, mtmp)); X switch (tmp) { X X case 0: /* no movement, but it can still attack you */ X--- 258,265 ---- X (!mtmp->mcansee && !rn2(4)) || mtmp->mpeaceful) { X X tmp = m_move(mtmp, 0); X! distfleeck(mtmp,&inrange,&nearby,&scared); /* recalc */ X! X switch (tmp) { X X case 0: /* no movement, but it can still attack you */ X*************** X*** 264,283 **** X case 2: /* monster died */ X return(1); X } X- X- inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= X- (BOLT_LIM * BOLT_LIM)); X- if(scared && !mtmp->mflee) { X- mtmp->mflee = 1; X- #ifdef STUPID X- if (rn2(7)) X- mtmp->mfleetim = rnd(10); X- else X- mtmp->mfleetim = rnd(100); X- #else X- mtmp->mfleetim = (rn2(7) ? rnd(10) : rnd(100)); X- #endif X- } X } X X /* Now, attack the player if possible - one attack set per monst */ X--- 277,282 ---- X*************** X*** 340,346 **** X if(i == 1) return(0); /* still in trap, so didn't move */ X } X if(mtmp->mhide && X! (levl[mtmp->mx][mtmp->my].omask || levl[mtmp->mx][mtmp->my].gmask) && X rn2(10)) X return(0); /* do not leave hiding place */ X if(mtmp->meating) { X--- 339,345 ---- X if(i == 1) return(0); /* still in trap, so didn't move */ X } X if(mtmp->mhide && X! (OBJ_AT(mtmp->mx, mtmp->my) || levl[mtmp->mx][mtmp->my].gmask) && X rn2(10)) X return(0); /* do not leave hiding place */ X if(mtmp->meating) { X*************** X*** 662,668 **** X if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp); X if(likegold && (!abstain || !rn2(10))) mpickgold(mtmp); X } X! if(levl[mtmp->mx][mtmp->my].omask == 1) { X /* Maybe a rock mole just ate some metal object */ X if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp); X /* Maybe a cube ate just about anything */ X--- 661,667 ---- X if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp); X if(likegold && (!abstain || !rn2(10))) mpickgold(mtmp); X } X! if(OBJ_AT(mtmp->mx, mtmp->my)) { X /* Maybe a rock mole just ate some metal object */ X if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp); X /* Maybe a cube ate just about anything */ X*************** X*** 675,681 **** X if(likerock || likegems) mpickgems(mtmp); X } X } X! if(mtmp->mhide) mtmp->mundetected = (levl[mtmp->mx][mtmp->my].omask X || levl[mtmp->mx][mtmp->my].gmask); X X /* set also in domove(), hack.c */ X--- 674,680 ---- X if(likerock || likegems) mpickgems(mtmp); X } X } X! if(mtmp->mhide) mtmp->mundetected = (OBJ_AT(mtmp->mx, mtmp->my) X || levl[mtmp->mx][mtmp->my].gmask); X X /* set also in domove(), hack.c */ X*** src/Old/monst.c Wed Sep 6 16:36:54 1989 X--- src/monst.c Wed Sep 6 16:08:22 1989 X*************** X*** 72,83 **** X M2_WANDER | M2_NOLIMBS | M2_AMORPHOUS }, X { "gelatinous cube", S_BLOB, 6, 6, 8, 0, 0, (G_GENO | 2), X { { AT_TUCH, AD_PLYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X! 10, 100, 0, MS_SILENT, M1_BIG | M1_NOEYES | M1_NOHANDS | X M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES | M1_SLEE_RES, X M2_WANDER | M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE }, X { "quivering blob", S_BLOB, 5, 1, 8, 0, 0, (G_GENO | 2), X { { AT_TUCH, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X! 10, 100, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES, X M2_WANDER | M2_HOSTILE | M2_NOLIMBS }, X /* cockatrice */ X { "cockatrice", S_COCKATRICE, 5, 6, 6, 30, 0, (G_GENO | 5), X--- 72,83 ---- X M2_WANDER | M2_NOLIMBS | M2_AMORPHOUS }, X { "gelatinous cube", S_BLOB, 6, 6, 8, 0, 0, (G_GENO | 2), X { { AT_TUCH, AD_PLYS, 2, 4 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X! 30, 300, 0, MS_SILENT, M1_BIG | M1_NOEYES | M1_NOHANDS | X M1_FIRE_RES | M1_COLD_RES | M1_ELEC_RES | M1_SLEE_RES, X M2_WANDER | M2_HOSTILE | M2_NOLIMBS | M2_OMNIVORE }, X { "quivering blob", S_BLOB, 5, 1, 8, 0, 0, (G_GENO | 2), X { { AT_TUCH, AD_PHYS, 1, 8 }, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK }, X! 20, 200, 0, MS_SILENT, M1_NOEYES | M1_NOHANDS | M1_POIS_RES, X M2_WANDER | M2_HOSTILE | M2_NOLIMBS }, X /* cockatrice */ X { "cockatrice", S_COCKATRICE, 5, 6, 6, 30, 0, (G_GENO | 5), X*************** X*** 897,903 **** X { { AT_WEAP, AD_SLEE, 1, 8 }, { AT_CLAW, AD_DREN, 0, 0 }, X NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 200, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_COLLECT, X! M2_HOSTILE | M2_HUMAN }, X /* Rust Monster */ X { "rust monster", S_RUSTMONST, 5, 18, 2, 0, 0, (G_GENO | 2), X { { AT_TUCH, AD_RUST, 0, 0 }, { AT_TUCH, AD_RUST, 0, 0 }, NO_ATTK, X--- 897,903 ---- X { { AT_WEAP, AD_SLEE, 1, 8 }, { AT_CLAW, AD_DREN, 0, 0 }, X NO_ATTK, NO_ATTK, NO_ATTK }, X 35, 200, 0, MS_SILENT, M1_HUMANOID | M1_POIS | M1_COLLECT, X! M2_HOSTILE }, X /* Rust Monster */ X { "rust monster", S_RUSTMONST, 5, 18, 2, 0, 0, (G_GENO | 2), X { { AT_TUCH, AD_RUST, 0, 0 }, { AT_TUCH, AD_RUST, 0, 0 }, NO_ATTK, X*** src/Old/mthrowu.c Wed Sep 6 16:38:45 1989 X--- src/mthrowu.c Sun Aug 20 14:26:18 1989 X*************** X*** 75,86 **** X create = !rn2(3); X else create = 1; X if (create && !flooreffects(obj,x,y)) { X! obj->ox = x; X! obj->oy = y; X obj->nobj = fobj; X fobj = obj; X stackobj(fobj); X- levl[x][y].omask = 1; X } else free((genericptr_t)obj); X } X X--- 75,84 ---- X create = !rn2(3); X else create = 1; X if (create && !flooreffects(obj,x,y)) { X! place_object(obj, x, y); X obj->nobj = fobj; X fobj = obj; X stackobj(fobj); X } else free((genericptr_t)obj); X } X X*************** X*** 111,123 **** X tmp_at(-3, (int)AT_OBJ); X } X while(range-- > 0) { /* Actually the loop is always exited by break */ X bhitpos.x += dx; X bhitpos.y += dy; X if(levl[bhitpos.x][bhitpos.y].mmask) { X mtmp = m_at(bhitpos.x,bhitpos.y); X X if(mtmp->data->ac + 8 + obj->spe <= rnd(20)) { X! miss(distant_name(singleobj,xname), mtmp); X if (!range) { /* Last position; object drops */ X drop_throw(singleobj, 0, mtmp->mx, mtmp->my); X break; X--- 109,125 ---- X tmp_at(-3, (int)AT_OBJ); X } X while(range-- > 0) { /* Actually the loop is always exited by break */ X+ boolean vis; X+ X bhitpos.x += dx; X bhitpos.y += dy; X+ vis = cansee(bhitpos.x, bhitpos.y); X if(levl[bhitpos.x][bhitpos.y].mmask) { X mtmp = m_at(bhitpos.x,bhitpos.y); X X if(mtmp->data->ac + 8 + obj->spe <= rnd(20)) { X! if (!vis) pline("It is missed."); X! else miss(distant_name(singleobj,xname), mtmp); X if (!range) { /* Last position; object drops */ X drop_throw(singleobj, 0, mtmp->mx, mtmp->my); X break; X*************** X*** 127,141 **** X if (damage < 1) damage = 1; X if (obj->otyp==ACID_VENOM && resists_acid(mtmp->data)) X damage = 0; X! hit(distant_name(singleobj,xname), mtmp,exclam(damage)); X if (obj->opoisoned) { X! if (resists_poison(mtmp->data)) 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 } X } X--- 129,147 ---- X if (damage < 1) damage = 1; X if (obj->otyp==ACID_VENOM && resists_acid(mtmp->data)) X damage = 0; X! if (!vis) pline("It is hit%s", exclam(damage)); X! else hit(distant_name(singleobj,xname), X! mtmp,exclam(damage)); X if (obj->opoisoned) { X! if (resists_poison(mtmp->data)) { X! if (vis) X! pline("The poison doesn't seem to affect %s.", X mon_nam(mtmp)); X! } else { X if (rn2(30)) damage += rnd(6); X else { X! if (vis) X! pline("The poison was deadly..."); X damage = mtmp->mhp; X } X } X*************** X*** 142,161 **** X } X if (obj->otyp==ACID_VENOM && cansee(mtmp->mx,mtmp->my)){ X if (resists_acid(mtmp->data)) { X! pline("%s is unaffected.", Monnam(mtmp)); X damage = 0; X! } else pline("The acid burns %s!", mon_nam(mtmp)); X } X mtmp->mhp -= damage; X if(mtmp->mhp < 1) { X! if (cansee(mtmp->mx, mtmp->my)) X! pline("%s is killed!", Monnam(mtmp)); X mondied(mtmp); X } X X if((obj->otyp == CREAM_PIE) || X (obj->otyp == BLINDING_VENOM)) { X! if (cansee(mtmp->mx, mtmp->my)) X pline("%s is blinded by the %s.", X Monnam(mtmp), xname(singleobj)); X if(mtmp->msleep) mtmp->msleep = 0; X--- 148,169 ---- X } X if (obj->otyp==ACID_VENOM && cansee(mtmp->mx,mtmp->my)){ X if (resists_acid(mtmp->data)) { X! pline("%s is unaffected.", vis ? Monnam(mtmp) X! : "It"); X damage = 0; X! } else if (vis) X! pline("The acid burns %s!", mon_nam(mtmp)); X! else pline("It is burned!"); X } X mtmp->mhp -= damage; X if(mtmp->mhp < 1) { X! pline("%s is killed!", vis ? Monnam(mtmp) : "It"); X mondied(mtmp); X } X X if((obj->otyp == CREAM_PIE) || X (obj->otyp == BLINDING_VENOM)) { X! if (vis) X pline("%s is blinded by the %s.", X Monnam(mtmp), xname(singleobj)); X if(mtmp->msleep) mtmp->msleep = 0; X*************** X*** 277,282 **** X--- 285,305 ---- X if(!URETREATING(x,y) || X !rn2(BOLT_LIM-movedist(x,mtmp->mux,y,mtmp->muy))) X { X+ int savequan = otmp->quan; X+ char *verb = "throws"; X+ X+ if (otmp->otyp == ARROW X+ #ifdef TOLKIEN X+ || otmp->otyp == ELVEN_ARROW X+ || otmp->otyp == ORCISH_ARROW X+ #endif X+ || otmp->otyp == CROSSBOW_BOLT) verb = "shoots"; X+ otmp->quan = 1; X+ if (canseemon(mtmp)) X+ pline("%s %s a%s %s!", Monnam(mtmp), verb, X+ index(vowels,*(xname(otmp))) ? "n" : "", X+ xname(otmp)); X+ otmp->quan = savequan; X m_throw(mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), X movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy), otmp); X if (!otmp->quan) m_useup(mtmp, otmp); X*************** X*** 308,314 **** X * attack... X */ X if(!rn2(BOLT_LIM-movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy))) { X! X m_throw(mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), X movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy), otmp); X nomul(0); X--- 331,338 ---- X * attack... X */ X if(!rn2(BOLT_LIM-movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy))) { X! if (canseemon(mtmp)) X! pline("%s spits venom!", Monnam(mtmp)); X m_throw(mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), X movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy), otmp); X nomul(0); X*** src/Old/o_init.c Wed Sep 6 15:52:19 1989 X--- src/o_init.c Fri Sep 1 13:27:18 1989 X*************** X*** 219,225 **** X mread(fd, (genericptr_t) bases, sizeof bases); X mread(fd, (genericptr_t) disco, sizeof disco); X mread(fd, (genericptr_t) objects, sizeof(struct objclass) * TOTAL_OBJS); X! #ifndef MSDOS X differ = (genericptr_t)&objects[0] - (genericptr_t)then; X #else X differ = (long)&objects[0] - (long)then; X--- 219,225 ---- X mread(fd, (genericptr_t) bases, sizeof bases); X mread(fd, (genericptr_t) disco, sizeof disco); X mread(fd, (genericptr_t) objects, sizeof(struct objclass) * TOTAL_OBJS); X! #if !defined(MSDOS) && !defined(M_XENIX) X differ = (genericptr_t)&objects[0] - (genericptr_t)then; X #else X differ = (long)&objects[0] - (long)then; X*************** X*** 226,232 **** X #endif X for(i=0; i < TOTAL_OBJS; i++) { X if (objects[i].oc_name) { X! #ifndef MSDOS X objects[i].oc_name += differ; X #else X objects[i].oc_name = X--- 226,232 ---- X #endif X for(i=0; i < TOTAL_OBJS; i++) { X if (objects[i].oc_name) { X! #if !defined(MSDOS) && !defined(M_XENIX) X objects[i].oc_name += differ; X #else X objects[i].oc_name = X*************** X*** 234,240 **** X #endif X } X if (objects[i].oc_descr) { X! #ifndef MSDOS X objects[i].oc_descr += differ; X #else X objects[i].oc_descr = X--- 234,240 ---- X #endif X } X if (objects[i].oc_descr) { X! #if !defined(MSDOS) && !defined(M_XENIX) X objects[i].oc_descr += differ; X #else X objects[i].oc_descr = X*** src/Old/objnam.c Wed Sep 6 15:53:23 1989 X--- src/objnam.c Tue Sep 5 21:35:34 1989 X*************** X*** 6,11 **** X--- 6,12 ---- X #include <ctype.h> /* for isalpha() */ X X #define PREFIX 30 X+ #define SCHAR_MAX 127 X X /* We want the player to be able to learn what key goes in what lock. */ X const char *keystr[N_LOX] = { "round", "square", "triangular", "oval", X*************** X*** 830,839 **** X #ifdef TUTTI_FRUTTI X struct fruit *f; X int ftype = current_fruit; X- #endif X- char let; X- char *un, *dn, *an; X- char *name=0; X char fruitbuf[BUFSZ]; X /* We want to check for fruits last so that, for example, someone X * who names their fruit "katana" and wishes for a katana gets a real X--- 831,836 ---- X*************** X*** 840,845 **** X--- 837,846 ---- X * one. But, we have to keep around the old buf since in the meantime X * we have deleted "empty", "+6", etc... X */ X+ #endif X+ char let; X+ char *un, *dn, *an; X+ char *name=0; X #ifdef WIZARD X int fake=0; X #endif X*************** X*** 886,892 **** X--- 887,895 ---- X } else break; X } X if(!cnt) cnt = 1; /* %% what with "gems" etc. ? */ X+ #ifdef TUTTI_FRUTTI X Strcpy(fruitbuf, bp); X+ #endif X if(!strncmp(bp, "empty ", 6)) { X contents = EMPTY; X bp += 6; X*************** X*** 922,927 **** X--- 925,942 ---- X } X } X } X+ /* X+ otmp->spe is type schar; so we don't want spe to be any bigger or smaller. X+ also, spe should always be positive -- some cheaters may try to confuse X+ atoi() X+ */ X+ if (spe < 0) { X+ spesgn = -1; /* cheaters get what they deserve */ X+ spe = abs(spe); X+ } X+ if (spe > SCHAR_MAX) X+ spe = SCHAR_MAX; X+ X /* now we have the actual name, as delivered by xname, say X green potions called whisky X scrolls labeled "QWERTY" X*************** X*** 1288,1294 **** X if (spe > otmp->spe) spe = otmp->spe; X } X X! if (spesgn == -1) spe = -spe; X X /* set otmp->spe. This may, or may not, use spe... */ X switch (typ) { X--- 1303,1309 ---- X if (spe > otmp->spe) spe = otmp->spe; X } X X! if (spesgn == -1 && spe > 0) spe = -spe; X X /* set otmp->spe. This may, or may not, use spe... */ X switch (typ) { X*************** X*** 1322,1331 **** X break; X case WAN_WISHING: X #ifdef WIZARD X! if (!wizard) X #endif X! otmp->spe = (rn2(10) ? -1 : 0); break; X /* fall through, if wizard */ X default: otmp->spe = spe; X } X X--- 1337,1360 ---- X break; X case WAN_WISHING: X #ifdef WIZARD X! if (!wizard) { X #endif X! otmp->spe = (rn2(10) ? -1 : 0); X! break; X! #ifdef WIZARD X! } X! /* fall through (twice), if wizard */ X! #endif X! case MAGIC_LAMP: X! #ifdef WIZARD X! if (!wizard) { X! #endif X! otmp->spe = 0; X! break; X! #ifdef WIZARD X! } X /* fall through, if wizard */ X+ #endif X default: otmp->spe = spe; X } X X*************** X*** 1338,1349 **** X otmp->corpsenm = mntmp; X break; X case FIGURINE: X! if (!is_dlord(&mons[mntmp]) && !is_dprince(&mons[mntmp]) X! && !is_human(&mons[mntmp]) X! #ifdef WORM X! && mntmp != PM_LONG_WORM X! #endif X! ) X otmp->corpsenm = mntmp; X break; X case EGG: if (lays_eggs(&mons[mntmp]) || mntmp==PM_KILLER_BEE) X--- 1367,1374 ---- X otmp->corpsenm = mntmp; X break; X case FIGURINE: X! if (!(mons[mntmp].geno & G_UNIQ) X! && !is_human(&mons[mntmp])) X otmp->corpsenm = mntmp; X break; X case EGG: if (lays_eggs(&mons[mntmp]) || mntmp==PM_KILLER_BEE) X*** src/Old/options.c Wed Sep 6 15:54:14 1989 X--- src/options.c Thu Aug 31 20:16:21 1989 X*************** X*** 131,144 **** X } X X void X parseoptions(opts, from_env) X register char *opts; X boolean from_env; X { X register char *op; X- /* X- register char *op2; X- */ X unsigned num; X boolean negated; X X--- 131,192 ---- X } X X void X+ assign_graphics(graph_ints,glth) X+ register unsigned int *graph_ints; X+ register int glth; X+ { X+ #define SETPCHAR(f, n) showsyms.f = (glth > n) ? graph_ints[n] : defsyms.f X+ SETPCHAR(stone, 0); X+ SETPCHAR(vwall, 1); X+ SETPCHAR(hwall, 2); X+ SETPCHAR(tlcorn, 3); X+ SETPCHAR(trcorn, 4); X+ SETPCHAR(blcorn, 5); X+ SETPCHAR(brcorn, 6); X+ SETPCHAR(crwall, 7); X+ SETPCHAR(tuwall, 8); X+ SETPCHAR(tdwall, 9); X+ SETPCHAR(tlwall, 10); X+ SETPCHAR(trwall, 11); X+ SETPCHAR(vbeam, 12); X+ SETPCHAR(hbeam, 13); X+ SETPCHAR(lslant, 14); X+ SETPCHAR(rslant, 15); X+ SETPCHAR(door, 16); X+ SETPCHAR(room, 17); X+ SETPCHAR(corr, 18); X+ SETPCHAR(upstair, 19); X+ SETPCHAR(dnstair, 20); X+ SETPCHAR(trap, 21); X+ SETPCHAR(web, 22); X+ SETPCHAR(pool, 23); X+ #ifdef FOUNTAINS X+ SETPCHAR(fountain, 24); X+ #endif X+ #ifdef SINKS X+ SETPCHAR(sink, 25); X+ #endif X+ #ifdef THRONES X+ SETPCHAR(throne, 26); X+ #endif X+ #ifdef ALTARS X+ SETPCHAR(altar, 27); X+ #endif X+ #ifdef STRONGHOLD X+ SETPCHAR(upladder, 28); X+ SETPCHAR(dnladder, 29); X+ SETPCHAR(dbvwall, 30); X+ SETPCHAR(dbhwall, 31); X+ #endif X+ #undef SETPCHAR X+ } X+ X+ void X parseoptions(opts, from_env) X register char *opts; X boolean from_env; X { X register char *op; X unsigned num; X boolean negated; X X*************** X*** 146,158 **** X *op++ = 0; X parseoptions(op, from_env); X } X! /* X! if(op = index(opts, ' ')) { X! op2 = op; X! while(*op++) X! if(*op != ' ') *op2++ = *op; X! } X! */ X if(!*opts) return; X negated = FALSE; X while((*opts == '!') || !strncmp(opts, "no", 2)) { X--- 194,200 ---- X *op++ = 0; X parseoptions(op, from_env); X } X! X if(!*opts) return; X negated = FALSE; X while((*opts == '!') || !strncmp(opts, "no", 2)) { X*************** X*** 213,219 **** X return; X } X X! if (!strncmp(opts, "numb", 4)) { X flags.num_pad = !negated; X return; X } X--- 255,261 ---- X return; X } X X! if (!strncmp(opts, "num", 3)) { X flags.num_pad = !negated; X return; X } X*************** X*** 327,332 **** X--- 369,377 ---- X X /* graphics:string */ X if (!strncmp(opts, "gr", 2)) { X+ unsigned int translate[MAXPCHARS+1]; X+ int i, lth; X+ X if(!from_env) { X #ifdef MSDOS X pline("\"graphics\" settable only from %s.", configfile); X*************** X*** 341,390 **** X else X opts = op + 1; X escapes(opts, opts); X! #define SETPCHAR(f, n) showsyms.f = (strlen(opts) > n) ? opts[n] : defsyms.f X! SETPCHAR(stone, 0); X! SETPCHAR(vwall, 1); X! SETPCHAR(hwall, 2); X! SETPCHAR(tlcorn, 3); X! SETPCHAR(trcorn, 4); X! SETPCHAR(blcorn, 5); X! SETPCHAR(brcorn, 6); X! SETPCHAR(crwall, 7); X! SETPCHAR(tuwall, 8); X! SETPCHAR(tdwall, 9); X! SETPCHAR(tlwall, 10); X! SETPCHAR(trwall, 11); X! SETPCHAR(vbeam, 12); X! SETPCHAR(hbeam, 13); X! SETPCHAR(lslant, 14); X! SETPCHAR(rslant, 15); X! SETPCHAR(door, 16); X! SETPCHAR(room, 17); X! SETPCHAR(corr, 18); X! SETPCHAR(upstair, 19); X! SETPCHAR(dnstair, 20); X! SETPCHAR(trap, 21); X! SETPCHAR(web, 22); X! SETPCHAR(pool, 23); X! #ifdef FOUNTAINS X! SETPCHAR(fountain, 24); X! #endif X! #ifdef SINKS X! SETPCHAR(sink, 25); X! #endif X! #ifdef THRONES X! SETPCHAR(throne, 26); X! #endif X! #ifdef ALTARS X! SETPCHAR(altar, 27); X! #endif X! #ifdef STRONGHOLD X! SETPCHAR(upladder, 28); X! SETPCHAR(dnladder, 29); X! SETPCHAR(dbvwall, 30); X! SETPCHAR(dbhwall, 31); X! #endif X! #undef SETPCHAR X return; X } X X--- 386,398 ---- X else X opts = op + 1; X escapes(opts, opts); X! X! lth = strlen(opts); X! if(lth > MAXPCHARS) lth = MAXPCHARS; X! /* match the form obtained from PC configuration files */ X! for(i = 0; i < lth; i++) X! translate[i] = opts[i]; X! assign_graphics(translate,lth); X return; X } X X*************** X*** 398,422 **** X if(digit(*op)) { X num = atoi(op); X while(digit(*op)) op++; X! } else X! if(*op == '!') { X negated = !negated; X op++; X } X switch(*op) { X! case 't': X! flags.end_top = num; X! break; X! case 'a': X! flags.end_around = num; X! break; X! case 'o': X! flags.end_own = !negated; X! break; X! default: X! goto bad; X } X! while(letter(*++op)) ; X if(*op == '/') op++; X } X return; X--- 406,431 ---- X if(digit(*op)) { X num = atoi(op); X while(digit(*op)) op++; X! } else if(*op == '!') { X negated = !negated; X op++; X } X+ while(*op == ' ') op++; X+ X switch(*op) { X! case 't': X! flags.end_top = num; X! break; X! case 'a': X! flags.end_around = num; X! break; X! case 'o': X! flags.end_own = !negated; X! break; X! default: X! goto bad; X } X! while(letter(*++op) || *op == ' ') ; X if(*op == '/') op++; X } X return; X*** src/Old/pager.c Wed Sep 6 15:54:41 1989 X--- src/pager.c Mon Sep 4 20:39:17 1989 X*************** X*** 20,29 **** X static char hc = 0; X X static void page_more(); X X- const char nonlets[] = { S_EEL, S_CHAMELEON, S_DEMON, S_GHOST, S_HUMAN, X- S_GOLEM, 0 }; X- X int X dowhatis() X { X--- 20,28 ---- X static char hc = 0; X X static void page_more(); X+ static boolean clear_help P((CHAR_P)); X+ static boolean valid_help P((CHAR_P)); X X int X dowhatis() X { X*************** X*** 155,161 **** X (type == A_NEUTRAL) ? "(neutral)" : X "(lawful)"); X } else X! if (q == CHAIN_SYM && levl[cc.x][cc.y].omask) X pline("(chain)"); X else X #endif X--- 154,160 ---- X (type == A_NEUTRAL) ? "(neutral)" : X "(lawful)"); X } else X! if (q == CHAIN_SYM && OBJ_AT(cc.x, cc.y)) X pline("(chain)"); X else X #endif X*************** X*** 176,182 **** X } X #ifdef SPELLS X else X! if (q == SPBOOK_SYM && levl[cc.x][cc.y].omask) X pline("(spellbook)"); X #endif X #ifdef STRONGHOLD X--- 175,181 ---- X } X #ifdef SPELLS X else X! if (q == SPBOOK_SYM && OBJ_AT(cc.x, cc.y)) X pline("(spellbook)"); X #endif X #ifdef STRONGHOLD X*************** X*** 203,218 **** X u.mtimedone ? mons[u.umonnum].mname : X #endif X pl_character, plname); X! } else if((q >= 'A' && q <= 'z') || index(nonlets,q)) { X! for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) X! if(mtmp->mx == cc.x && mtmp->my == cc.y) { X! pline("(%s%s)", X! mtmp->mtame ? "tame " : X! mtmp->mpeaceful ? "peaceful " : "", X! strncmp(lmonnam(mtmp), "the ", 4) X! ? lmonnam(mtmp) : lmonnam(mtmp)+4); X! break; X! } X } X if(ep[-1] == ';') { X pline("More info? "); X--- 202,215 ---- X u.mtimedone ? mons[u.umonnum].mname : X #endif X pl_character, plname); X! } else if(levl[cc.x][cc.y].mmask) { X! mtmp = m_at(cc.x,cc.y); X! if (q == mtmp->data->mlet) X! pline("(%s%s)", X! mtmp->mtame ? "tame " : X! mtmp->mpeaceful ? "peaceful " : "", X! strncmp(lmonnam(mtmp), "the ", 4) X! ? lmonnam(mtmp) : lmonnam(mtmp)+4); X } X if(ep[-1] == ';') { X pline("More info? "); X*************** X*** 241,247 **** X { X FILE *fp; X char bufr[BUFSZ+6]; X! register char *buf = &bufr[6], *ep, q, ctrl; X #ifdef OS2_CODEVIEW X char tmp[PATHLEN]; X X--- 238,244 ---- X { X FILE *fp; X char bufr[BUFSZ+6]; X! register char *buf = &bufr[6], *ep, q, ctrl, meta; X #ifdef OS2_CODEVIEW X char tmp[PATHLEN]; X X*************** X*** 264,285 **** X #ifdef UNIX X intron(); X #endif X! if (q == '\033') ctrl = '['; X! else if (q != unctrl(q)) ctrl = q - 1 + 'A'; X! else ctrl = 0; X while(fgets(buf,BUFSZ,fp)) X! if ((!ctrl && *buf==q) || (ctrl && *buf=='^' && *(buf+1)==ctrl)) { X ep = index(buf, '\n'); X if(ep) *ep = 0; X! if(!ctrl && buf[1] == '\t'){ X buf = bufr; X buf[0] = q; X (void) strncpy(buf+1, " ", 7); X- } else if (ctrl && buf[2] == '\t'){ X- buf = bufr + 1; X- buf[0] = '^'; X- buf[1] = ctrl; X- (void) strncpy(buf+2, " ", 6); X } X pline(buf); X (void) fclose(fp); X--- 261,286 ---- X #ifdef UNIX X intron(); X #endif X! ctrl = ((q <= '\033') ? (q - 1 + 'A') : 0); X! meta = ((0x80 & q) ? (0x7f & q) : 0); X while(fgets(buf,BUFSZ,fp)) X! if ((ctrl && *buf=='^' && *(buf+1)==ctrl) || X! (meta && *buf=='M' && *(buf+1)=='-' && *(buf+2)==meta) || X! *buf==q) { X ep = index(buf, '\n'); X if(ep) *ep = 0; X! if (ctrl && buf[2] == '\t'){ X! buf = bufr + 1; X! (void) strncpy(buf, "^? ", 8); X! buf[1] = ctrl; X! } else if (meta && buf[3] == '\t'){ X! buf = bufr + 2; X! (void) strncpy(buf, "M-? ", 8); X! buf[2] = meta; X! } else if(buf[1] == '\t'){ X buf = bufr; X buf[0] = q; X (void) strncpy(buf+1, " ", 7); X } X pline(buf); X (void) fclose(fp); X*************** X*** 539,545 **** X curx = curx + strlen(tl->line_text); X curline++; X } X! if(hmenu) hc = lowc(readchar()); /* help menu display */ X #if defined(MSDOS) && !defined(AMIGA) X cmov (lth, curline); X #else X--- 540,550 ---- X curx = curx + strlen(tl->line_text); X curline++; X } X! if(hmenu) { /* help menu display */ X! do X! hc = lowc(readchar()); X! while (!valid_help(hc)); X! } X #if defined(MSDOS) && !defined(AMIGA) X cmov (lth, curline); X #else X*************** X*** 547,555 **** X #endif X cl_end (); X if (!hmenu) cmore (text); X! home (); X! cl_end (); X! docorner (lth, curline-1); X } else { /* feed to pager */ X set_pager(0); X for (tl = texthead; tl; tl = tl->next_line) { X--- 552,562 ---- X #endif X cl_end (); X if (!hmenu) cmore (text); X! if (!hmenu || clear_help(hc)) { X! home (); X! cl_end (); X! docorner (lth, curline-1); X! } X } else { /* feed to pager */ X set_pager(0); X for (tl = texthead; tl; tl = tl->next_line) { X*************** X*** 622,642 **** X cornline(-1,""); X } X X! int X! dohelp() X { X! char c; X X! do { X! help_menu(); X! c = hc; X! #ifdef WIZARD X! } while ((c < 'a' || c > (wizard ? 'j' : 'i')) && !index(quitchars,c)); X #else X! } while ((c < 'a' || c > 'i') && !index(quitchars,c)); X #endif X! if (!index(quitchars, c)) { X! switch(c) { X case 'a': (void) page_file(HELP, FALSE); break; X case 'b': (void) page_file(SHELP, FALSE); break; X case 'c': (void) dohistory(); break; X--- 629,668 ---- X cornline(-1,""); X } X X! static boolean X! clear_help(c) X! char c; X { X! /* those valid_help characters which do not correspond to help routines X! * that redraw the whole screen on their own. if we always clear the X! * help menu, we end up restoring the part of the maze underneath the X! * help menu when the last page of a long help file is displayed with X! * an external pager. X! */ X! return(index(quitchars,c) || c == 'd' || c == 'e' X! #ifdef WIZARD X! || c == 'j' X! #endif X! ); X! } X X! static boolean X! valid_help(c) X! char c; X! { X! #ifdef WIZARD X! return ((c >= 'a' && c <= (wizard ? 'j' : 'i')) || index(quitchars,c)); X #else X! return ((c >= 'a' && c <= 'i') || index(quitchars,c)); X #endif X! } X! X! int X! dohelp() X! { X! help_menu(); X! if (!index(quitchars, hc)) { X! switch(hc) { X case 'a': (void) page_file(HELP, FALSE); break; X case 'b': (void) page_file(SHELP, FALSE); break; X case 'c': (void) dohistory(); break; X*************** X*** 768,774 **** X #ifdef WIZARD X if(wizard) (void) signal(SIGQUIT,SIG_DFL); X #endif X! if(wt) getret(); X docrt(); X return(0); X } X--- 794,808 ---- X #ifdef WIZARD X if(wizard) (void) signal(SIGQUIT,SIG_DFL); X #endif X! if(wt) { X! boolean so; X! X! cmov(1, LI); /* get prompt in reasonable place */ X! so = flags.standout; X! flags.standout = 1; X! more(); X! flags.standout = so; X! } X docrt(); X return(0); X } X*** src/Old/pickup.c Wed Sep 6 15:55:37 1989 X--- src/pickup.c Tue Sep 5 21:35:42 1989 X*************** X*** 270,278 **** X if(obj->spe) obj->spe = 0; X break; X } X freeobj(obj); X if(Invisible) newsym(u.ux,u.uy); X- addtobill(obj, TRUE); /* sets obj->unpaid if necessary */ X if(wt > -5) You("have a little trouble lifting"); X { int pickquan = obj->quan; X int mergquan; X--- 270,278 ---- X if(obj->spe) obj->spe = 0; X break; X } X+ addtobill(obj, TRUE); /* sets obj->unpaid if necessary */ X freeobj(obj); X if(Invisible) newsym(u.ux,u.uy); X if(wt > -5) You("have a little trouble lifting"); X { int pickquan = obj->quan; X int mergquan; X*************** X*** 287,293 **** X } X } X } X- set_omask(u.ux, u.uy); X } X X int X--- 287,292 ---- X*************** X*** 300,306 **** X pline("You cannot reach the floor."); X return(0); X } X! if(levl[u.ux][u.uy].omask) X for(cobj = fobj; cobj; cobj = cobj->nobj) { X X if(cobj->ox == u.ux && cobj->oy == u.uy) X--- 299,305 ---- X pline("You cannot reach the floor."); X return(0); X } X! if(OBJ_AT(u.ux, u.uy)) X for(cobj = fobj; cobj; cobj = cobj->nobj) { X X if(cobj->ox == u.ux && cobj->oy == u.uy) X*************** X*** 466,476 **** X X for(otmp = invent; otmp; otmp = otmp->nobj) { X cobj = otmp; X! if(Is_container(otmp)) X for(ootmp=fcobj,nxobj=(fcobj ? fcobj->nobj : 0); ootmp; X ootmp=nxobj,nxobj=(ootmp ? ootmp->nobj : 0) ) X if(ootmp->cobj == cobj) X (void)out_container(ootmp); X } X return; X } X--- 465,477 ---- X X for(otmp = invent; otmp; otmp = otmp->nobj) { X cobj = otmp; X! if(Is_container(otmp)) { X! current_container = otmp; X for(ootmp=fcobj,nxobj=(fcobj ? fcobj->nobj : 0); ootmp; X ootmp=nxobj,nxobj=(ootmp ? ootmp->nobj : 0) ) X if(ootmp->cobj == cobj) X (void)out_container(ootmp); X+ } X } X return; X } X*** src/Old/polyself.c Wed Sep 6 15:56:02 1989 X--- src/polyself.c Tue Sep 5 22:05:00 1989 X*************** X*** 5,139 **** X #include "hack.h" X X #ifdef POLYSELF X- X static void break_armor(), drop_weapon(); X static void skinback(); X static void uunstick(); X X void X! polyself() X { X char buf[BUFSZ]; X- int tmp, tmp2, mntmp = -1; X- int tries=0; X- boolean draconian = (uarm && uarm->otyp==DRAGON_SCALE_MAIL && X- uarm->corpsenm >= PM_GREY_DRAGON && X- uarm->corpsenm <= PM_YELLOW_DRAGON); X- /* We have to calculate sticky in multiple places since we might go X- * through any one of them without going through the others. X- */ X- boolean sticky = sticks(uasmon) && u.ustuck && !u.uswallow; X- X- if(!Polymorph_control && !draconian) { X- if (rn2(20) > ACURR(A_CON)) { X- You("shudder for a moment."); X- losehp(rn2(30),"system shock"); X- return; X- } X- } X- X- if (Polymorph_control) { X- do { X- pline("Become what kind of monster? [type the name] "); X- getlin(buf); X- mntmp = name_to_mon(buf); X- if (mntmp < 0) X- pline("I've never heard of such monsters."); X- else if (!polyok(&mons[mntmp])) X- You("cannot polymorph into that."); X- else break; X- } while(++tries < 5); X- if (tries==5) pline(thats_enough_tries); X- } else if (draconian) X- mntmp = uarm->corpsenm; X X! if (mntmp < 0) { X! tries = 0; X! do { X! mntmp = rn2(PM_CHAMELEON); X! /* All valid monsters are from 0 to PM_CHAMELEON-1 */ X! } while(!polyok(&mons[mntmp]) && tries++ < 200); X } X! X! if (draconian && mntmp==uarm->corpsenm) { X! if (!(mons[uarm->corpsenm].geno & G_GENOD)) { X! You("merge with your scaly armor."); X! uskin = uarm; X! uarm = (struct obj *)0; X! } X } X! /* The below polyok() should never fail unless just about everything X! * was genocided... X! */ X! if (!polyok(&mons[mntmp]) || !rn2(5)) { X! if (!rn2(10)) { X! flags.female = !flags.female; X! max_rank_sz(); X! if (pl_character[0]=='P') X! Strcpy(pl_character+6, flags.female?"ess":""); X! if (pl_character[0]=='C') X! Strcpy(pl_character+5, X! flags.female ? "woman" : "man"); X! } X! if (u.umonnum != -1) { X! u.acurr = u.macurr; /* restore old attribs */ X! u.amax = u.mamax; X! } X! tmp = u.uhpmax; X! tmp2 = u.ulevel; X! u.usym = S_HUMAN; X! u.umonnum = -1; X! if (u.uundetected) u.uundetected = 0; X! prme(); X! u.mtimedone = u.mh = u.mhmax = 0; X! u.ulevel = u.ulevel-2+rn2(5); X! if (u.ulevel > 127 || u.ulevel == 0) u.ulevel = 1; X! if (u.ulevel > MAXULEV) u.ulevel = MAXULEV; X X! for(tmp = u.ulevel; tmp != tmp2; tmp += (tmp2 < u.ulevel) ? -1 : 1) X adjabil((tmp2 > u.ulevel) ? -1 : 1); X! tmp = u.uhpmax; X X! /* random experience points for the new experience level */ X! u.uexp = rndexp(); X #ifndef LINT X! u.uhpmax = (u.uhpmax-10)*(long)u.ulevel/tmp2 + 19 - rn2(19); X #endif X /* If it was u.uhpmax*u.ulevel/tmp+9-rn2(19), then a 1st level character X with 16 hp who polymorphed into a 3rd level one would have an average X of 48 hp. */ X #ifndef LINT X! u.uhp = u.uhp * (long)u.uhpmax/tmp; X #endif X #ifdef SPELLS X! tmp = u.uenmax; X! #ifndef LINT X! u.uenmax = u.uenmax * (long)u.ulevel/tmp2 + 9 - rn2(19); X! #endif X! if (u.uenmax < 0) u.uenmax = 0; X! #ifndef LINT X! u.uen = (tmp ? u.uen * (long)u.uenmax / tmp : u.uenmax); X! #endif X! #endif X! (void)redist_attr(); X! u.uhunger = rn1(500,500); X! Sick = 0; X! Stoned = 0; X! if (u.uhp <= 0 || u.uhpmax <= 0) { X! X if(Polymorph_control) { X if (u.uhp <= 0) u.uhp = 1; X if (u.uhpmax <= 0) u.uhpmax = 1; X } else { X Your("new form doesn't seem healthy enough to survive."); X killer="unsuccessful polymorph"; X done(DIED); X } X! } X! set_uasmon(); X! You("feel like a new %sman!", flags.female ? "wo" : ""); X #ifdef WIZARD X! if(!wizard) { X #endif X newname: more(); X do { X--- 5,96 ---- X #include "hack.h" X X #ifdef POLYSELF X static void break_armor(), drop_weapon(); X static void skinback(); X static void uunstick(); X+ static boolean sticky; X+ #endif X X void X! newman() X { X+ int tmp, tmp2; X char buf[BUFSZ]; X X! if (!rn2(10)) { X! flags.female = !flags.female; X! max_rank_sz(); X! if (pl_character[0]=='P') X! Strcpy(pl_character+6, flags.female?"ess":""); X! if (pl_character[0]=='C') X! Strcpy(pl_character+5, flags.female ? "woman" : "man"); X } X! #ifdef POLYSELF X! if (u.umonnum != -1) { X! u.acurr = u.macurr; /* restore old attribs */ X! u.amax = u.mamax; X } X! u.usym = S_HUMAN; X! u.umonnum = -1; X! if (u.uundetected) u.uundetected = 0; X! prme(); X! u.mtimedone = u.mh = u.mhmax = 0; X! #endif X! tmp = u.uhpmax; X! tmp2 = u.ulevel; X! u.ulevel = u.ulevel-2+rn2(5); X! if (u.ulevel > 127 || u.ulevel == 0) u.ulevel = 1; X! if (u.ulevel > MAXULEV) u.ulevel = MAXULEV; X X! for(tmp = u.ulevel; tmp != tmp2; tmp += (tmp2 < u.ulevel) ? -1 : 1) X adjabil((tmp2 > u.ulevel) ? -1 : 1); X! tmp = u.uhpmax; X X! /* random experience points for the new experience level */ X! u.uexp = rndexp(); X #ifndef LINT X! u.uhpmax = (u.uhpmax-10)*(long)u.ulevel/tmp2 + 19 - rn2(19); X #endif X /* If it was u.uhpmax*u.ulevel/tmp+9-rn2(19), then a 1st level character X with 16 hp who polymorphed into a 3rd level one would have an average X of 48 hp. */ X #ifndef LINT X! u.uhp = u.uhp * (long)u.uhpmax/tmp; X #endif X #ifdef SPELLS X! tmp = u.uenmax; X! # ifndef LINT X! u.uenmax = u.uenmax * (long)u.ulevel/tmp2 + 9 - rn2(19); X! # endif X! if (u.uenmax < 0) u.uenmax = 0; X! # ifndef LINT X! u.uen = (tmp ? u.uen * (long)u.uenmax / tmp : u.uenmax); X! # endif X! #endif X! redist_attr(); X! u.uhunger = rn1(500,500); X! Sick = 0; X! Stoned = 0; X! if (u.uhp <= 0 || u.uhpmax <= 0) { X! #ifdef POLYSELF X if(Polymorph_control) { X if (u.uhp <= 0) u.uhp = 1; X if (u.uhpmax <= 0) u.uhpmax = 1; X } else { X+ #endif X Your("new form doesn't seem healthy enough to survive."); X killer="unsuccessful polymorph"; X done(DIED); X+ #ifdef POLYSELF X } X! #endif X! } X! #ifdef POLYSELF X! set_uasmon(); X! #endif X! You("feel like a new %sman!", flags.female ? "wo" : ""); X #ifdef WIZARD X! if(!wizard) { X #endif X newname: more(); X do { X*************** X*** 148,160 **** X Sprintf(SAVEF, "save/%d%s", getuid(), plname); X regularize(SAVEF+5); /* avoid . or / in name */ X #ifdef WIZARD X! } X #endif X! flags.botl = 1; X! skinback(); X! find_ac(); X! if (sticky) uunstick(); X! } else if(!polymon(mntmp)) return; X X if (!uarmg) selftouch("No longer petrify-resistant, you"); X if (Inhell && !Fire_resistance) { X--- 105,195 ---- X Sprintf(SAVEF, "save/%d%s", getuid(), plname); X regularize(SAVEF+5); /* avoid . or / in name */ X #ifdef WIZARD X! } X! #endif X! flags.botl = 1; X! #ifdef POLYSELF X! skinback(); X! find_ac(); X! if (sticky) uunstick(); X #endif X! } X! X! #ifdef POLYSELF X! void X! polyself() X! { X! char buf[BUFSZ]; X! int mntmp = -1; X! int tries=0; X! boolean draconian = (uarm && uarm->otyp==DRAGON_SCALE_MAIL && X! uarm->corpsenm >= PM_GREY_DRAGON && X! uarm->corpsenm <= PM_YELLOW_DRAGON); X! boolean iswere = (u.ulycn > -1 || is_were(uasmon)); X! boolean isvamp = (u.usym == S_VAMPIRE || u.umonnum == PM_VAMPIRE_BAT); X! /* We have to calculate sticky in multiple places since we might go X! * through any one of them without going through the others. X! */ X! sticky = sticks(uasmon) && u.ustuck && !u.uswallow; X! X! if(!Polymorph_control && !draconian && !iswere && !isvamp) { X! if (rn2(20) > ACURR(A_CON)) { X! You("shudder for a moment."); X! losehp(rn2(30),"system shock"); X! return; X! } X! } X! X! if (Polymorph_control) { X! do { X! pline("Become what kind of monster? [type the name] "); X! getlin(buf); X! mntmp = name_to_mon(buf); X! if (mntmp < 0) X! pline("I've never heard of such monsters."); X! else if (!polyok(&mons[mntmp])) X! You("cannot polymorph into that."); X! else break; X! } while(++tries < 5); X! if (tries==5) pline(thats_enough_tries); X! } else if (draconian || iswere || isvamp) { X! /* special changes that don't require polyok() */ X! if (draconian) { X! mntmp = uarm->corpsenm; X! if (!(mons[mntmp].geno & G_GENOD)) { X! You("merge with your scaly armor."); X! uskin = uarm; X! uarm = (struct obj *)0; X! } X! } else if (iswere) { X! if (is_were(uasmon)) X! mntmp = PM_HUMAN; /* Illegal; force newman() */ X! else X! mntmp = u.ulycn; X! } else { X! if (u.usym == S_VAMPIRE) X! mntmp = PM_VAMPIRE_BAT; X! else X! mntmp = PM_VAMPIRE; X! } X! if (polymon(mntmp)) X! return; X! } X! X! if (mntmp < 0) { X! tries = 0; X! do { X! mntmp = rn2(PM_CHAMELEON); X! /* All valid monsters are from 0 to PM_CHAMELEON-1 */ X! } while(!polyok(&mons[mntmp]) && tries++ < 200); X! } X! X! /* The below polyok() fails either if everything is genocided, or if X! * we deliberately chose something illegal to force newman(). X! */ X! if (!polyok(&mons[mntmp]) || !rn2(5)) X! newman(); X! else if(!polymon(mntmp)) return; X X if (!uarmg) selftouch("No longer petrify-resistant, you"); X if (Inhell && !Fire_resistance) { X*************** X*** 169,175 **** X int mntmp; X { X int tmp; X! boolean sticky = sticks(uasmon) && u.ustuck && !u.uswallow; X X if (mons[mntmp].geno & G_GENOD) { X You("feel rather %s-ish.",mons[mntmp].mname); X--- 204,210 ---- X int mntmp; X { X int tmp; X! sticky = sticks(uasmon) && u.ustuck && !u.uswallow; X X if (mons[mntmp].geno & G_GENOD) { X You("feel rather %s-ish.",mons[mntmp].mname); X*************** X*** 228,234 **** X break_armor(); X drop_weapon(1); X if (u.uundetected && !hides_under(uasmon)) u.uundetected = 0; X! else if (hides_under(uasmon) && (levl[u.ux][u.uy].omask || X levl[u.ux][u.uy].gmask)) X u.uundetected = 1; X prme(); X--- 263,269 ---- X break_armor(); X drop_weapon(1); X if (u.uundetected && !hides_under(uasmon)) u.uundetected = 0; X! else if (hides_under(uasmon) && (OBJ_AT(u.ux, u.uy) || X levl[u.ux][u.uy].gmask)) X u.uundetected = 1; X prme(); X*************** X*** 347,353 **** X void X rehumanize() X { X! boolean sticky = sticks(uasmon) && u.ustuck && !u.uswallow; X X u.mh = u.mhmax = u.mtimedone = 0; X u.acurr = u.macurr; /* restore old strength */ X--- 382,388 ---- X void X rehumanize() X { X! sticky = sticks(uasmon) && u.ustuck && !u.uswallow; X X u.mh = u.mhmax = u.mtimedone = 0; X u.acurr = u.macurr; /* restore old strength */ X*************** X*** 423,435 **** X if (u.uswallow) { X You("release web fluid inside %s.", mon_nam(u.ustuck)); X pline("%s regurgitates you!", Monnam(u.ustuck)); X! u.ux = u.ustuck->mx; X! u.uy = u.ustuck->my; X! mnexto(u.ustuck); X! u.uswallow = 0; X! u.ustuck = 0; X! setsee(); X! docrt(); X return(1); X } X if (u.utrap) { X--- 458,464 ---- X if (u.uswallow) { X You("release web fluid inside %s.", mon_nam(u.ustuck)); X pline("%s regurgitates you!", Monnam(u.ustuck)); X! regurgitates(u.ustuck); X return(1); X } X if (u.utrap) { X*************** X*** 507,513 **** X looked = 1; X if (Invis && !perceives(mtmp->data)) X pline("%s seems not to notice your gaze.", Monnam(mtmp)); X! else if (mtmp->minvis && !See_invisible && !Telepat) X You("can't see where to gaze at %s.", Monnam(mtmp)); X else if (mtmp->mimic) X continue; X--- 536,542 ---- X looked = 1; X if (Invis && !perceives(mtmp->data)) X pline("%s seems not to notice your gaze.", Monnam(mtmp)); X! else if (mtmp->minvis && !See_invisible) X You("can't see where to gaze at %s.", Monnam(mtmp)); X else if (mtmp->mimic) X continue; X END_OF_FILE if test 55646 -ne `wc -c <'patch03e'`; then echo shar: \"'patch03e'\" unpacked with wrong size! fi # end of 'patch03e' fi echo shar: End of archive 5 \(of 6\). cp /dev/null ark5isdone MISSING="" for I in 1 2 3 4 5 6 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 6 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