billr@saab.CNA.TEK.COM (Bill Randle) (09/30/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 8, Issue 39 Archive-name: NetHack3/Patch4c 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 3 (of 11)." # Contents: patches04c # Wrapped by billr@saab on Fri Sep 29 13:13:48 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'patches04c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patches04c'\" else echo shar: Extracting \"'patches04c'\" \(47374 characters\) sed "s/^X//" >'patches04c' <<'END_OF_FILE' X*** src/Old/mkroom.c Wed Sep 27 11:53:40 1989 X--- src/mkroom.c Thu Sep 14 14:36:01 1989 X*************** X*** 296,303 **** 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 levl[sx][sy].typ = POOL; X levl[sx][sy].scrsym = POOL_SYM; X--- 296,302 ---- 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! !MON_AT(sx, sy) && !t_at(sx,sy) && !nexttodoor(sx,sy)) { X if((sx+sy)%2) { X levl[sx][sy].typ = POOL; X levl[sx][sy].scrsym = POOL_SYM; X*************** X*** 324,330 **** 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--- 323,330 ---- X X if(!place_oracle(sroom,&dy,&xx,&yy)) return; X X! if(MON_AT(xx, yy)) X! 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 Sep 27 11:54:07 1989 X--- src/mon.c Mon Sep 25 21:35:03 1989 X*************** X*** 8,13 **** X--- 8,17 ---- X # include "artifact.h" X #endif X X+ #ifdef WORM X+ # include "wseg.h" X+ #endif X+ X #ifdef HARD X static boolean restrap(); X # include <ctype.h> X*************** X*** 17,23 **** X int lastwarnlev; X static const char *warnings[] = { X "white", "pink", "red", "ruby", "purple", "black" }; X! struct monst *fdmon; /* chain of dead monsters, need not to be saved */ X X /* Creates a monster corpse, a "special" corpse, or nothing if it doesn't X * leave corpses. Monsters which leave "special" corpses should have X--- 21,27 ---- X int lastwarnlev; X static const char *warnings[] = { X "white", "pink", "red", "ruby", "purple", "black" }; X! struct monst *fdmon; /* chain of dead monsters, need not be saved */ X X /* Creates a monster corpse, a "special" corpse, or nothing if it doesn't X * leave corpses. Monsters which leave "special" corpses should have X*************** X*** 112,123 **** X /* All special cases should precede the G_NOCORPSE check */ X X /* Note: oname() cannot be used generically for non-inventory objects X! * unless you fix the link from the previous object in the chain. X * (Here we know it's the first one, so there was no link.) X */ X if (mtmp->mnamelth) { X obj = oname(obj, NAME(mtmp), 0); X fobj = obj; X } X stackobj(fobj); X newsym(x, y); X--- 116,128 ---- X /* All special cases should precede the G_NOCORPSE check */ X X /* Note: oname() cannot be used generically for non-inventory objects X! * unless you fix the link from the previous object in the chains. X * (Here we know it's the first one, so there was no link.) X */ X if (mtmp->mnamelth) { X obj = oname(obj, NAME(mtmp), 0); X fobj = obj; X+ level.objects[x][y] = obj; X } X stackobj(fobj); X newsym(x, y); X*************** X*** 376,382 **** X X for(otmp = fobj; otmp; otmp = otmp->nobj) X if(throws_rocks(mtmp->data) ? otmp->otyp == BOULDER : X! (otmp->olet == GEM_SYM && otmp->otyp < LAST_GEM+5)) X if(otmp->ox == mtmp->mx && otmp->oy == mtmp->my) X if(mtmp->data->mlet != S_UNICORN X || objects[otmp->otyp].g_val != 0){ X--- 381,387 ---- X X for(otmp = fobj; otmp; otmp = otmp->nobj) X if(throws_rocks(mtmp->data) ? otmp->otyp == BOULDER : X! (otmp->olet == GEM_SYM && otmp->otyp < LAST_GEM+6)) X if(otmp->ox == mtmp->mx && otmp->oy == mtmp->my) X if(mtmp->data->mlet != S_UNICORN X || objects[otmp->otyp].g_val != 0){ X*************** X*** 542,548 **** X if(!(flag & ALLOW_U)) continue; X info[cnt] |= ALLOW_U; X } else { X! if(levl[nx][ny].mmask) { X if(!(flag & ALLOW_M)) continue; X info[cnt] |= ALLOW_M; X if((m_at(nx,ny))->mtame) { X--- 547,553 ---- X if(!(flag & ALLOW_U)) continue; X info[cnt] |= ALLOW_U; X } else { X! if(MON_AT(nx, ny)) { X if(!(flag & ALLOW_M)) continue; X info[cnt] |= ALLOW_M; X if((m_at(nx,ny))->mtame) { X*************** X*** 697,706 **** X /* Dead Kops may come back. */ X switch(rnd(5)) { X case 1: /* returns near the stairs */ X! (void) mkmon_at(mtmp->data->mname,xdnstair,ydnstair); X break; X case 2: /* randomly */ X! (void) mkmon_at(mtmp->data->mname,0,0); X break; X default: X break; X--- 702,711 ---- X /* Dead Kops may come back. */ X switch(rnd(5)) { X case 1: /* returns near the stairs */ X! (void) makemon(mtmp->data,xdnstair,ydnstair); X break; X case 2: /* randomly */ X! (void) makemon(mtmp->data,0,0); X break; X default: X break; X*************** X*** 728,739 **** X { X relmon(mtmp); X monfree(mtmp); X! levl[mtmp2->mx][mtmp2->my].mmask = 1; X mtmp2->nmon = fmon; X fmon = mtmp2; X if(u.ustuck == mtmp) u.ustuck = mtmp2; X if(mtmp2->isshk) replshk(mtmp,mtmp2); X if(mtmp2->isgd) replgd(mtmp,mtmp2); X } X X void X--- 733,753 ---- X { X relmon(mtmp); X monfree(mtmp); X! place_monster(mtmp2, mtmp2->mx, mtmp2->my); X mtmp2->nmon = fmon; X fmon = mtmp2; X if(u.ustuck == mtmp) u.ustuck = mtmp2; X if(mtmp2->isshk) replshk(mtmp,mtmp2); X if(mtmp2->isgd) replgd(mtmp,mtmp2); X+ #ifdef WORM X+ if(mtmp2->wormno) { X+ /* Each square the worm is on has a pointer; fix them all */ X+ register struct wseg *wtmp; X+ X+ for(wtmp=wsegs[mtmp2->wormno]; wtmp; wtmp=wtmp->nseg) X+ place_worm_seg(mtmp2, wtmp->wx, wtmp->wy); X+ } X+ #endif X } X X void X*************** X*** 744,750 **** X X if (fmon == 0) panic ("relmon: no fmon available."); X X! levl[mon->mx][mon->my].mmask = 0; X X if(mon == fmon) fmon = fmon->nmon; X else { X--- 758,764 ---- X X if (fmon == 0) panic ("relmon: no fmon available."); X X! remove_monster(mon->mx, mon->my); X X if(mon == fmon) fmon = fmon->nmon; X else { X*************** X*** 760,766 **** X monfree(mtmp) register struct monst *mtmp; { X mtmp->nmon = fdmon; X fdmon = mtmp; X! levl[mtmp->mx][mtmp->my].mmask = 0; X } X X void X--- 774,780 ---- X monfree(mtmp) register struct monst *mtmp; { X mtmp->nmon = fdmon; X fdmon = mtmp; X! remove_monster(mtmp->mx, mtmp->my); X } X X void X*************** X*** 862,868 **** X } X if((mtmp->mpeaceful && !rn2(2)) || mtmp->mtame) change_luck(-1); X if ((mdat==&mons[PM_BLACK_UNICORN] && u.ualigntyp == U_CHAOTIC) || X! (mdat==&mons[PM_GREY_UNICORN] && u.ualigntyp == U_NEUTRAL) || X (mdat==&mons[PM_WHITE_UNICORN] && u.ualigntyp == U_LAWFUL)) X change_luck(-5); X X--- 876,882 ---- X } X if((mtmp->mpeaceful && !rn2(2)) || mtmp->mtame) change_luck(-1); X if ((mdat==&mons[PM_BLACK_UNICORN] && u.ualigntyp == U_CHAOTIC) || X! (mdat==&mons[PM_GRAY_UNICORN] && u.ualigntyp == U_NEUTRAL) || X (mdat==&mons[PM_WHITE_UNICORN] && u.ualigntyp == U_LAWFUL)) X change_luck(-5); X X*************** X*** 961,977 **** X } X } X X- /*VARARGS2*/ X- void X- kludge(str, arg, arg2, arg3) X- register char *str,*arg,*arg2,*arg3; X- { X- if(Blind || !flags.verbose) { X- if(*str == '%') pline(str,"It",arg2,arg3); X- else pline(str,"it",arg2,arg3); X- } else pline(str,arg,arg2,arg3); X- } X- X void X rescham() { /* force all chameleons to become normal */ X X--- 975,980 ---- X*************** X*** 1094,1103 **** X { X coord mm; X enexto(&mm, u.ux, u.uy, mtmp->data); X! levl[mtmp->mx][mtmp->my].mmask = 0; X! levl[mm.x][mm.y].mmask = 1; X! mtmp->mx = mm.x; X! mtmp->my = mm.y; X pmon(mtmp); X set_apparxy(mtmp); X } X--- 1097,1104 ---- X { X coord mm; X enexto(&mm, u.ux, u.uy, mtmp->data); X! remove_monster(mtmp->mx, mtmp->my); X! place_monster(mtmp, mm.x, mm.y); X pmon(mtmp); X set_apparxy(mtmp); X } X*************** X*** 1115,1124 **** X } X if(x == mtmp->mx && y == mtmp->my) /* that was easy */ X return; X! levl[mtmp->mx][mtmp->my].mmask = 0; X! levl[x][y].mmask = 1; X! mtmp->mx = x; X! mtmp->my = y; X pmon(mtmp); X set_apparxy(mtmp); X } X--- 1116,1123 ---- X } X if(x == mtmp->mx && y == mtmp->my) /* that was easy */ X return; X! remove_monster(mtmp->mx, mtmp->my); X! place_monster(mtmp, x, y); X pmon(mtmp); X set_apparxy(mtmp); X } X*** src/Old/mondata.c Wed Sep 27 11:55:12 1989 X--- src/mondata.c Mon Sep 25 21:35:06 1989 X*************** X*** 278,284 **** X X const int grownups[][2] = { {PM_LITTLE_DOG, PM_DOG}, {PM_DOG, PM_LARGE_DOG}, X {PM_HELL_HOUND_PUP, PM_HELL_HOUND}, {PM_KITTEN, PM_HOUSECAT}, X! {PM_HOUSECAT, PM_LARGE_CAT}, {PM_BABY_GREY_DRAGON, PM_GREY_DRAGON}, X {PM_BABY_RED_DRAGON, PM_RED_DRAGON}, X {PM_BABY_WHITE_DRAGON, PM_WHITE_DRAGON}, X {PM_BABY_BLUE_DRAGON, PM_BLUE_DRAGON}, X--- 278,284 ---- X X const int grownups[][2] = { {PM_LITTLE_DOG, PM_DOG}, {PM_DOG, PM_LARGE_DOG}, X {PM_HELL_HOUND_PUP, PM_HELL_HOUND}, {PM_KITTEN, PM_HOUSECAT}, X! {PM_HOUSECAT, PM_LARGE_CAT}, {PM_BABY_GRAY_DRAGON, PM_GRAY_DRAGON}, X {PM_BABY_RED_DRAGON, PM_RED_DRAGON}, X {PM_BABY_WHITE_DRAGON, PM_WHITE_DRAGON}, X {PM_BABY_BLUE_DRAGON, PM_BLUE_DRAGON}, X*** src/Old/monmove.c Wed Sep 27 11:55:42 1989 X--- src/monmove.c Wed Sep 27 09:29:38 1989 X*************** X*** 59,65 **** X here->doormask = D_BROKEN; X } X } X! else pile = 12; /* it doesn't leave rocks if it didn't dig */ X X /* Left behind a pile? */ X if(pile < 5) { X--- 59,65 ---- X here->doormask = D_BROKEN; X } X } X! else return TRUE; /* it doesn't leave rocks if it didn't dig */ X X /* Left behind a pile? */ X if(pile < 5) { X*************** X*** 68,77 **** X else X (void) mksobj_at(ROCK, mtmp->mx, mtmp->my); X } X! if(canseeit) { X! here->seen = TRUE; X newsym(mtmp->mx,mtmp->my); X! } else X mnewsym(mtmp->mx,mtmp->my); X return(TRUE); X } X--- 68,77 ---- X else X (void) mksobj_at(ROCK, mtmp->mx, mtmp->my); X } X! here->seen = TRUE; /* required for newsym and mnewsym to work */ X! if(canseeit && mtmp->minvis && !See_invisible) X newsym(mtmp->mx,mtmp->my); X! else X mnewsym(mtmp->mx,mtmp->my); X return(TRUE); X } X*************** X*** 271,276 **** X--- 271,278 ---- X if(Hallucination) pmon(mtmp); X break; X case 1: /* monster moved */ X+ /* Maybe it stepped on a trap and fell asleep... */ X+ if(mtmp->msleep || mtmp->mfroz) return(0); X if(!nearby && ranged_attk(mdat)) break; X else if(mdat->mmove <= 12) return(0); X break; X*************** X*** 349,356 **** X X set_apparxy(mtmp); X /* where does mtmp think you are? */ X! /* Not necessary if m_move called from here, but necessary in X! * other calls of m_move (i.e. leprechauns dodging) X */ X can_tunnel = tunnels(ptr) && X #ifdef REINCARNATION X--- 351,358 ---- X X set_apparxy(mtmp); X /* where does mtmp think you are? */ X! /* Not necessary if m_move called from this file, but necessary in X! * other calls of m_move (ex. leprechauns dodging) X */ X can_tunnel = tunnels(ptr) && X #ifdef REINCARNATION X*************** X*** 360,367 **** X #ifdef WORM X if(mtmp->wormno) goto not_special; X #endif X! /* my dog gets a special treatment */ X! if(mtmp->mtame) return( dog_move(mtmp, after) ); X X /* likewise for shopkeeper */ X if(mtmp->isshk) { X--- 362,372 ---- X #ifdef WORM X if(mtmp->wormno) goto not_special; X #endif X! /* my dog gets special treatment */ X! if(mtmp->mtame) { X! mmoved = dog_move(mtmp, after); X! goto postmov; X! } X X /* likewise for shopkeeper */ X if(mtmp->isshk) { X*************** X*** 485,491 **** X (likemagic && index(magical, otmp->olet)) || X (likerock && otmp->otyp == BOULDER) || X (likegems && otmp->olet == GEM_SYM && X! otmp->otyp < LAST_GEM + 5) || X (conceals && !cansee(otmp->ox,otmp->oy)) || X (ptr == &mons[PM_GELATINOUS_CUBE] && X !index(indigestion, otmp->olet)) X--- 490,496 ---- X (likemagic && index(magical, otmp->olet)) || X (likerock && otmp->otyp == BOULDER) || X (likegems && otmp->olet == GEM_SYM && X! otmp->otyp < LAST_GEM + 6) || X (conceals && !cansee(otmp->ox,otmp->oy)) || X (ptr == &mons[PM_GELATINOUS_CUBE] && X !index(indigestion, otmp->olet)) X*************** X*** 527,533 **** X nx = poss[i].x; X ny = poss[i].y; X X! for(j=0; j < MTSZ && j < cnt-1; j++) X if(nx == mtmp->mtrack[j].x && ny == mtmp->mtrack[j].y) X if(rn2(4*(cnt-j))) goto nxti; X X--- 532,538 ---- X nx = poss[i].x; X ny = poss[i].y; X X! if (appr != 0) for(j=0; j < MTSZ && j < cnt-1; j++) X if(nx == mtmp->mtrack[j].x && ny == mtmp->mtrack[j].y) X if(rn2(4*(cnt-j))) goto nxti; X X*************** X*** 534,540 **** X nearer = (dist2(nx,ny,gx,gy) < dist2(nix,niy,gx,gy)); X X if((appr == 1 && nearer) || (appr == -1 && !nearer) || X! !mmoved || (!appr && !rn2(++chcnt))) { X nix = nx; X niy = ny; X chi = i; X--- 539,545 ---- X nearer = (dist2(nx,ny,gx,gy) < dist2(nix,niy,gx,gy)); X X if((appr == 1 && nearer) || (appr == -1 && !nearer) || X! (!appr && !rn2(++chcnt)) || !mmoved) { X nix = nx; X niy = ny; X chi = i; X*************** X*** 561,567 **** X if((info[chi] & ALLOW_M) || X (nix == mtmp->mux && niy == mtmp->muy)) { X mtmp2 = X! (levl[nix][niy].mmask ? m_at(nix,niy) : (struct monst *)0); X if(mattackm(mtmp, mtmp2) == 1 && rn2(4) && X mtmp2->mlstmv != moves && mattackm(mtmp2, mtmp) == 2) X return(2); X--- 566,572 ---- X if((info[chi] & ALLOW_M) || X (nix == mtmp->mux && niy == mtmp->muy)) { X mtmp2 = X! (MON_AT(nix, niy) ? m_at(nix,niy) : (struct monst *)0); X if(mattackm(mtmp, mtmp2) == 1 && rn2(4) && X mtmp2->mlstmv != moves && mattackm(mtmp2, mtmp) == 2) X return(2); X*************** X*** 568,580 **** X return(3); X } X #ifdef WORM X! /* The square now has a worm segment and must keep its mmask */ X if (!mtmp->wormno) X #endif X! levl[omx][omy].mmask = 0; X! levl[nix][niy].mmask = 1; X! mtmp->mx = nix; X! mtmp->my = niy; X for(j = MTSZ-1; j > 0; j--) X mtmp->mtrack[j] = mtmp->mtrack[j-1]; X mtmp->mtrack[0].x = omx; X--- 573,583 ---- X return(3); X } X #ifdef WORM X! /* The square now has a worm segment and must keep its MON_AT() state */ X if (!mtmp->wormno) X #endif X! remove_monster(omx, omy); X! place_monster(mtmp, nix, niy); X for(j = MTSZ-1; j > 0; j--) X mtmp->mtrack[j] = mtmp->mtrack[j-1]; X mtmp->mtrack[0].x = omx; X*************** X*** 688,695 **** X mtmp->mdy = mtmp->my; X } X } X } X- pmon(mtmp); X return(mmoved); X } X X--- 691,698 ---- X mtmp->mdy = mtmp->my; X } X } X+ pmon(mtmp); X } X return(mmoved); X } X X*************** X*** 732,734 **** X--- 735,770 ---- X ) X ); X } X+ X+ #ifdef STUPID_CPP /* otherwise these functions are macros in rm.h */ X+ /* X+ * Functions for encapsulation of level.monsters references. X+ */ X+ void place_monster(mtmp, x, y) X+ register struct monst *mtmp; X+ int x, y; X+ { X+ level.monsters[x][y] = mtmp; X+ mtmp->mx = x; X+ mtmp->my = y; X+ } X+ X+ void place_worm_seg(mtmp, x, y) X+ register struct monst *mtmp; X+ int x, y; X+ { X+ level.monsters[x][y] = mtmp; X+ } X+ X+ void remove_monster(x, y) X+ int x, y; X+ { X+ level.monsters[x][y] = (struct monst *)0; X+ } X+ X+ struct monst *m_at(x, y) X+ int x, y; X+ { X+ return(level.monsters[x][y]); X+ } X+ #endif /* STUPID_CPP */ X*** src/Old/mthrowu.c Wed Sep 27 11:58:14 1989 X--- src/mthrowu.c Tue Sep 26 16:08:05 1989 X*************** X*** 23,38 **** X }; X X int X! thitu(tlev, dam, name) /* u is hit by sth, but not a monster */ X register int tlev, dam; X register char *name; X { X char buf[BUFSZ]; X! boolean acidic = (!strcmp(name, "splash of venom") && dam); X! /* A horrible kludge... the problem is that we want to do something X! * special--and we can't do it after returning since we might die and X! * not return, but the special stuff should be done anyway... X! */ X X setan(name, buf); X if(u.uac + tlev <= rnd(20)) { X--- 23,35 ---- X }; X X int X! thitu(tlev, dam, obj, name) /* u is hit by sth, but not a monster */ X register int tlev, dam; X+ struct obj *obj; X register char *name; X { X char buf[BUFSZ]; X! boolean acidic = (obj && obj->otyp == ACID_VENOM); X X setan(name, buf); X if(u.uac + tlev <= rnd(20)) { X*************** X*** 43,48 **** X--- 40,52 ---- X if(Blind || !flags.verbose) You("are hit!"); X else You("are hit by %s!", buf); X #ifdef POLYSELF X+ if (obj && obj->otyp == SILVER_ARROW && (u.ulycn != -1 || X+ is_demon(uasmon) || u.usym == S_VAMPIRE || X+ (u.usym == S_IMP && u.umonnum != PM_TENGU))) { X+ dam += rnd(20); X+ pline("You feel the %sarrow sear your flesh!", X+ Blind ? "" : "silver "); X+ } X if (acidic && resists_acid(uasmon)) X pline("It doesn't seem to hurt you."); X else { X*************** X*** 106,112 **** X--- 110,120 ---- X X if(sym) { X tmp_at(-1, sym); /* open call */ X+ #ifdef TEXTCOLOR X+ tmp_at(-3, (int)objects[obj->otyp].oc_color); X+ #else X tmp_at(-3, (int)AT_OBJ); X+ #endif X } X while(range-- > 0) { /* Actually the loop is always exited by break */ X boolean vis; X*************** X*** 114,120 **** 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--- 122,128 ---- X bhitpos.x += dx; X bhitpos.y += dy; X vis = cansee(bhitpos.x, bhitpos.y); X! if(MON_AT(bhitpos.x, bhitpos.y)) { X mtmp = m_at(bhitpos.x,bhitpos.y); X X if(mtmp->data->ac + 8 + obj->spe <= rnd(20)) { X*************** X*** 146,151 **** X--- 154,169 ---- X } X } X } X+ if (obj->otyp==SILVER_ARROW && (is_were(mtmp->data) X+ || is_demon(mtmp->data) X+ || mtmp->data->mlet == S_VAMPIRE X+ || (mtmp->data->mlet==S_IMP X+ && mtmp->data != &mons[PM_TENGU]))) { X+ if (vis) pline("The silver arrow sears %s's flesh!", X+ mon_nam(mtmp)); X+ else pline("Its flesh is seared!"); X+ damage += rnd(20); 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*************** X*** 186,197 **** X int dam; X case CREAM_PIE: X case BLINDING_VENOM: X! hitu = thitu(8, 0, xname(singleobj)); X break; X default: X dam = dmgval(obj, uasmon); X if (dam < 1) dam = 1; X! hitu = thitu(8+obj->spe, dam, xname(singleobj)); X } X if (hitu && obj->opoisoned) X /* it's safe to call xname twice because it's the X--- 204,216 ---- X int dam; X case CREAM_PIE: X case BLINDING_VENOM: X! hitu = thitu(8, 0, singleobj, xname(singleobj)); X break; X default: X dam = dmgval(obj, uasmon); X if (dam < 1) dam = 1; X! hitu = thitu(8+obj->spe, dam, singleobj, X! xname(singleobj)); X } X if (hitu && obj->opoisoned) X /* it's safe to call xname twice because it's the X*** src/Old/music.c Wed Sep 27 11:58:33 1989 X--- src/music.c Mon Sep 25 22:58:27 1989 X*************** X*** 206,212 **** X /* We have to check whether monsters or player X fall in a chasm... */ X X! if (levl[x][y].mmask) { X mtmp = m_at(x,y); X if(!is_flyer(mtmp->data)) { X mtmp->mtrapped = 1; X--- 206,212 ---- X /* We have to check whether monsters or player X fall in a chasm... */ X X! if (MON_AT(x, y)) { X mtmp = m_at(x,y); X if(!is_flyer(mtmp->data)) { X mtmp->mtrapped = 1; X*************** X*** 253,259 **** X if (cansee(x,y)) X pline("The door collapses."); X levl[x][y].doormask = D_NODOOR; X! if (!levl[x][y].mmask && !(x == u.ux && y == u.uy)) X newsym(x,y); X break; X } X--- 253,259 ---- X if (cansee(x,y)) X pline("The door collapses."); X levl[x][y].doormask = D_NODOOR; X! if (!MON_AT(x, y) && !(x == u.ux && y == u.uy)) X newsym(x,y); X break; X } X*************** X*** 415,429 **** X } X if(tumblers) X if(gears) X! You("hear %d tumbler%s click and %d gear%s turn.", X! tumblers, (tumblers > 1 ? "s" : ""), X! gears, (gears > 1 ? "s" : "")); X else X You("hear %d tumbler%s click.", X! tumblers, (tumblers > 1 ? "s" : "")); X else if(gears) X You("hear %d gear%s turn.", X! gears, (gears > 1 ? "s" : "")); X } X } X return 1; X--- 415,429 ---- X } X if(tumblers) X if(gears) X! You("hear %d tumbler%s click and %d gear%s turn.", X! tumblers, plur((long)tumblers), X! gears, plur((long)gears)); X else X You("hear %d tumbler%s click.", X! tumblers, plur((long)tumblers)); X else if(gears) X You("hear %d gear%s turn.", X! gears, plur((long)gears)); X } X } X return 1; X*** src/Old/o_init.c Wed Sep 27 12:06:05 1989 X--- src/o_init.c Fri Sep 15 00:50:41 1989 X*************** X*** 36,48 **** X { X register int j,first; X #ifdef STRONGHOLD X! int level = (dlevel > MAXLEVEL) ? MAXLEVEL : dlevel; X #endif X X first = bases[letindex(GEM_SYM)]; X X #ifdef STRONGHOLD X! for(j = 0; j < 9-level/3; j++) X #else X for(j = 0; j < 9-dlevel/3; j++) X #endif X--- 36,48 ---- X { X register int j,first; X #ifdef STRONGHOLD X! int lev = (dlevel > MAXLEVEL) ? MAXLEVEL : dlevel; X #endif X X first = bases[letindex(GEM_SYM)]; X X #ifdef STRONGHOLD X! for(j = 0; j < 9-lev/3; j++) X #else X for(j = 0; j < 9-dlevel/3; j++) X #endif X*************** X*** 54,60 **** X Printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n", X first, j, LAST_GEM); X for(j = first; j < LAST_GEM; j++) X! objects[j].oc_prob = (180+j-first)/(LAST_GEM-first); X } X X /* shuffle descriptions on objects o_low to o_high */ X--- 54,60 ---- X Printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n", X first, j, LAST_GEM); X for(j = first; j < LAST_GEM; j++) X! objects[j].oc_prob = (184+j-first)/(LAST_GEM-first); X } X X /* shuffle descriptions on objects o_low to o_high */ X*************** X*** 66,71 **** X--- 66,74 ---- X { X register int i, j; X char *desc; X+ #ifdef TEXTCOLOR X+ int color; X+ #endif /* TEXTCOLOR */ X int tmp; X X for(j=o_low; j <= o_high; j++) { X*************** X*** 73,78 **** X--- 76,86 ---- X desc = objects[j].oc_descr; X objects[j].oc_descr = objects[i].oc_descr; X objects[i].oc_descr = desc; X+ #ifdef TEXTCOLOR X+ color = objects[j].oc_color; X+ objects[j].oc_color = objects[i].oc_color; X+ objects[i].oc_color = color; X+ #endif /* TEXTCOLOR */ X /* shuffle discovery list */ X tmp = disco[j]; X disco[j] = disco[i]; X*** src/Old/objnam.c Wed Sep 27 12:07:22 1989 X--- src/objnam.c Tue Sep 26 18:19:25 1989 X*************** X*** 203,209 **** X case TOOL_SYM: X if(nn) Strcat(buf, an); X else Strcat(buf, dn); X! if(obj->otyp == FIGURINE && obj->known) { X Sprintf(eos(buf), " of a%s %s", X index(vowels, *mons[obj->corpsenm].mname) X ? "n" : "", X--- 203,209 ---- X case TOOL_SYM: X if(nn) Strcat(buf, an); X else Strcat(buf, dn); X! if(obj->otyp == FIGURINE) { X Sprintf(eos(buf), " of a%s %s", X index(vowels, *mons[obj->corpsenm].mname) X ? "n" : "", X*************** X*** 503,508 **** X--- 503,510 ---- X } X break; X case FOOD_SYM: X+ if(OEATEN(obj)) X+ Strcat(prefix, "partly eaten "); X if(obj->otyp == CORPSE) { X Strcat(prefix, mons[obj->corpsenm].mname); X Strcat(prefix, " "); X*************** X*** 524,532 **** X } X X if((obj->owornmask & W_WEP) && !mrg_to_wielded) { X! Strcat(bp, " (weapon in "); X! Strcat(bp, body_part(HAND)); X! Strcat(bp, ")"); X } X if(obj->unpaid) X Strcat(bp, " (unpaid)"); X--- 526,538 ---- X } X X if((obj->owornmask & W_WEP) && !mrg_to_wielded) { X! if (obj->quan != 1) X! Strcat(bp, " (wielded)"); X! else { X! Strcat(bp, " (weapon in "); X! Strcat(bp, body_part(HAND)); X! Strcat(bp, ")"); X! } X } X if(obj->unpaid) X Strcat(bp, " (unpaid)"); X*************** X*** 541,547 **** X return(bp); X } X X! /* used only in fight.c (thitu) */ X void X setan(str,buf) X register char *str,*buf; X--- 547,553 ---- X return(bp); X } X X! /* used only in mthrowu.c (thitu) */ X void X setan(str,buf) X register char *str,*buf; X*************** X*** 562,568 **** X } X X if(verb) { X! /* verb is given in plural (i.e., without trailing s) */ X Strcat(bp, " "); X if(otmp->quan != 1) X Strcat(bp, verb); X--- 568,574 ---- X } X X if(verb) { X! /* verb is given in plural (without trailing s) */ X Strcat(bp, " "); X if(otmp->quan != 1) X Strcat(bp, verb); X*************** X*** 633,639 **** X } X Strcpy(str, oldstr); X X! /* Search for common compounds, i.e. lump of royal jelly */ X for(excess=(char *)0, spot=str; *spot; spot++) { X if (!strncmp(spot, " of ", 4) X || !strncmp(spot, " labeled ", 9) X--- 639,645 ---- X } X Strcpy(str, oldstr); X X! /* Search for common compounds, ex. lump of royal jelly */ X for(excess=(char *)0, spot=str; *spot; spot++) { X if (!strncmp(spot, " of ", 4) X || !strncmp(spot, " labeled ", 9) X*************** X*** 825,833 **** X register char *p; X register int i; X register struct obj *otmp; X! int cnt, spe, spesgn, typ, heavy, blessed, uncursed; X! int iscursed, ispoisoned, mntmp, contents, iskey=0; X! int isnamedbox=0; X #ifdef TUTTI_FRUTTI X struct fruit *f; X int ftype = current_fruit; X--- 831,839 ---- X register char *p; X register int i; X register struct obj *otmp; X! int cnt, spe, spesgn, typ, heavy, blessed, uncursed, halfeaten; X! int iscursed, ispoisoned, mntmp, contents; X! int iskey, isnamedbox; X #ifdef TUTTI_FRUTTI X struct fruit *f; X int ftype = current_fruit; X*************** X*** 845,852 **** X int fake=0; X #endif X X! cnt = spe = spesgn = typ = heavy = X! blessed = uncursed = iscursed = ispoisoned = 0; X mntmp = -1; X #define UNDEFINED 0 X #define EMPTY 1 X--- 851,858 ---- X int fake=0; X #endif X X! cnt = spe = spesgn = typ = heavy = blessed = uncursed = iscursed = X! ispoisoned = halfeaten = iskey = isnamedbox = 0; X mntmp = -1; X #define UNDEFINED 0 X #define EMPTY 1 X*************** X*** 875,883 **** X cnt = atoi(bp); X while(digit(*bp)) bp++; X while(*bp == ' ') bp++; X! } else if(!strncmp(bp,"blessed ",8) || !strncmp(bp,"holy ",5)) { X blessed=1; X bp += 8; X } else if(!strncmp(bp,"cursed ",7) || !strncmp(bp,"unholy ",7)){ X iscursed=1; X bp += 7; X--- 881,895 ---- X cnt = atoi(bp); X while(digit(*bp)) bp++; X while(*bp == ' ') bp++; X! } else if(!strncmp(bp, "partly eaten ", 13)) { X! halfeaten = 1; X! bp += 13; X! } else if(!strncmp(bp,"blessed ",8)) { X blessed=1; X bp += 8; X+ } else if(!strncmp(bp,"holy ",5)) { X+ blessed=1; X+ bp += 5; X } else if(!strncmp(bp,"cursed ",7) || !strncmp(bp,"unholy ",7)){ X iscursed=1; X bp += 7; X*************** X*** 996,1001 **** X--- 1008,1014 ---- X } X /* Find corpse type w/o "of" (red dragon scale mail, yeti corpse) */ X if (strncmp(bp, "samurai sword", 13)) /* not the "samurai" monster! */ X+ if (strncmp(bp, "wizard lock", 11)) /* not the "wizard" monster! */ X if (strncmp(bp, "orcish", 6)) /* not the "orc" monster! */ X if (mntmp < 0) if ((mntmp = name_to_mon(bp)) >= 0) { X bp += strlen(mons[mntmp].mname); X*************** X*** 1161,1167 **** X #endif X ) cnt=5000; X if (cnt < 1) cnt=1; X! pline("%d gold piece%s.", cnt, cnt==1 ? "" : "s"); X u.ugold += cnt; X flags.botl=1; X return (&zeroobj); X--- 1174,1180 ---- X #endif X ) cnt=5000; X if (cnt < 1) cnt=1; X! pline("%d gold piece%s.", cnt, plur((long)cnt)); X u.ugold += cnt; X flags.botl=1; X return (&zeroobj); X*************** X*** 1213,1219 **** X /* helmet is not generic */ X X an = bp; X! if (!dn) dn = an; /* i.e., "black cap" */ X srch: X i = 1; X if(let) i = bases[letindex(let)]; X--- 1226,1232 ---- X /* helmet is not generic */ X X an = bp; X! if (!dn) dn = an; /* ex. "black cap" */ X srch: X i = 1; X if(let) i = bases[letindex(let)]; X*************** X*** 1262,1274 **** X * wizards to wish for it since it's faster than polymorphing and X * spitting. X */ X! if(otmp->olet==VENOM_SYM X #ifdef WIZARD X! && !wizard X #endif X- ) { X- free((genericptr_t) otmp); X- return((struct obj *)0); X } X if(iskey) otmp->spe = (iskey-1); X if(isnamedbox && (otmp->otyp==LARGE_BOX || otmp->otyp==CHEST)) X--- 1275,1289 ---- X * wizards to wish for it since it's faster than polymorphing and X * spitting. X */ X! if(otmp->olet==VENOM_SYM) { X! #ifdef WIZARD X! if (!wizard) { X! #endif X! free((genericptr_t) otmp); X! return((struct obj *)0); X #ifdef WIZARD X! } else otmp->spe = 1; X #endif X } X if(iskey) otmp->spe = (iskey-1); X if(isnamedbox && (otmp->otyp==LARGE_BOX || otmp->otyp==CHEST)) X*************** 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--- 1318,1324 ---- 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*************** X*** 1379,1385 **** X case DRAGON_SCALE_MAIL: /* Not actually possible unless they X typed "red dragon dragon scale mail" */ X case SCALE_MAIL: X! if (mntmp >= PM_GREY_DRAGON && X mntmp <= PM_YELLOW_DRAGON) X otmp->corpsenm = mntmp; X if (otmp->corpsenm >= 0) X--- 1394,1400 ---- X case DRAGON_SCALE_MAIL: /* Not actually possible unless they X typed "red dragon dragon scale mail" */ X case SCALE_MAIL: X! if (mntmp >= PM_GRAY_DRAGON && X mntmp <= PM_YELLOW_DRAGON) X otmp->corpsenm = mntmp; X if (otmp->corpsenm >= 0) X*************** X*** 1420,1447 **** X if (name) otmp = oname(otmp, name, 0); X otmp->owt = weight(otmp); X if (heavy) otmp->owt += 15; X return(otmp); X- } X- X- boolean X- uses_known(otmp) X- register struct obj *otmp; X- /* returns TRUE if otmp->known would be used to affect the full description X- * of the item X- * if not, otmp->dknown and otmp->bknown give all the information of otmp->known X- * and otmp->known should always be set to avoid problems with items not X- * merging due to different values of otmp->known X- */ X- { X- return (otmp->olet == ARMOR_SYM || X- otmp->olet == WAND_SYM || X- otmp->olet == WEAPON_SYM || X- ((otmp->olet == TOOL_SYM || otmp->olet == RING_SYM) && X- objects[otmp->otyp].oc_charged) || X- otmp->otyp == FIGURINE || X- otmp->otyp == EGG || X- otmp->otyp == TIN || X- otmp->otyp == AMULET_OF_YENDOR); X } X X static int X--- 1435,1442 ---- X if (name) otmp = oname(otmp, name, 0); X otmp->owt = weight(otmp); X if (heavy) otmp->owt += 15; X+ if (halfeaten && otmp->olet == FOOD_SYM) OEATEN(otmp) = 1; X return(otmp); X } X X static int X*** src/Old/options.c Wed Sep 27 12:08:11 1989 X--- src/options.c Mon Sep 25 23:23:08 1989 X*************** X*** 5,11 **** X #include "hack.h" X static boolean set_order; X X! static void nmcpy(); X X void X initoptions() X--- 5,12 ---- X #include "hack.h" X static boolean set_order; X X! static void nmcpy P((char *, char *, int)); X! static int next_opt P((char *)); X X void X initoptions() X*************** X*** 28,33 **** X--- 29,37 ---- X nmcpy(pl_fruit, objects[SLIME_MOLD].oc_name, PL_FSIZ); X #endif X flags.num_pad = FALSE; X+ #ifdef TEXTCOLOR X+ flags.use_color = TRUE; X+ #endif X #ifdef MSDOS X #ifdef DECRAINBOW X flags.DECRainbow = FALSE; X*************** X*** 260,265 **** X--- 264,276 ---- X return; X } X X+ #ifdef TEXTCOLOR X+ if (!strncmp(opts, "col", 3)) { X+ flags.use_color = !negated; X+ return; X+ } X+ #endif X+ X #ifdef DGK X if (!strncmp(opts, "IBM", 3)) { X flags.IBMBIOS = !negated; X*************** X*** 546,551 **** X--- 557,565 ---- X Strcat(buf, inv_order); X Strcat(buf, ","); X } X+ #ifdef TEXTCOLOR X+ if (flags.use_color) Strcat(buf, "color,"); X+ #endif X if (flags.confirm) Strcat(buf,"confirm,"); X if (flags.safe_dog) Strcat(buf,"safe_pet,"); X if (flags.pickup) Strcat(buf,"pickup,"); X*************** X*** 580,585 **** X--- 594,600 ---- X } X X #define Page_line(x) if(page_line(x)) goto quit X+ #define Next_opt(x) if (next_opt(x)) goto quit X X void X option_help() { X*************** X*** 601,624 **** X Page_line(""); X X Page_line("Boolean options (which can be negated by prefixing them with '!' or \"no\"):"); X- Page_line("confirm, (fe)male, fixinv, pickup, rest_on_space, safe_pet, silent, sortpack,"); X #ifdef MSDOS X! #ifdef NEWS X! Page_line("time, tombstone, verbose, news, number_pad, rawio, and IBM_BIOS"); X! #else X! Page_line("time, tombstone, verbose, number_pad, rawio, and IBM_BIOS"); X #endif X! #ifdef DECRAINBOW X! Page_line("and DEC_Rainbow."); X! #endif /* DECRAINBOW */ X! #else /* MSDOS */ X #ifdef NEWS X! Page_line("time, tombstone, verbose, news, null, ignintr, and standout."); X! #else X! Page_line("time, tombstone, verbose, null, ignintr, and standout."); X #endif X! #endif /* MSDOS */ X! Page_line(""); X X Page_line("Compound options:"); X Page_line("`name' - your character's name (e.g., name:Merlin-W),"); X--- 616,654 ---- X Page_line(""); X X Page_line("Boolean options (which can be negated by prefixing them with '!' or \"no\"):"); X #ifdef MSDOS X! # ifdef DECRAINBOW X! Next_opt("DEC_Rainbow, "); X! # endif X! Next_opt("IBM_BIOS, "); X #endif X! #ifdef TEXTCOLOR X! Next_opt("color, "); X! #endif X! Next_opt("confirm, "); X! Next_opt("(fe)male, "); Next_opt("fixinv, "); X! #ifdef UNIX X! Next_opt("ignintr, "); X! #endif X #ifdef NEWS X! Next_opt("news, "); X #endif X! #ifdef UNIX X! Next_opt("null, "); X! #endif X! Next_opt("number_pad, "); X! Next_opt("pickup, "); X! #ifdef MSDOS X! Next_opt("rawio, "); X! #endif X! Next_opt("rest_on_space, "); Next_opt("safe_pet, "); X! Next_opt("silent, "); Next_opt("sortpack, "); X! #ifdef UNIX X! Next_opt("standout, "); X! #endif X! Next_opt("time, "); Next_opt("tombstone, "); X! Next_opt("and verbose."); X! Next_opt(""); X X Page_line("Compound options:"); X Page_line("`name' - your character's name (e.g., name:Merlin-W),"); X*************** X*** 642,647 **** X--- 672,702 ---- X quit: X set_pager(2); X return; X+ } X+ X+ /* X+ * prints the next boolean option, on the same line if possible, on a new X+ * line if not X+ */ X+ static int X+ next_opt(str) X+ char *str; X+ { X+ static char buf[80]; X+ static int i = 0; X+ int r = 0; X+ X+ i += strlen(str); X+ if (i > (CO - 2) || !*str) { X+ r = page_line(buf); X+ buf[0] = 0; X+ i = strlen(str); X+ } X+ if (*str) X+ strcat(buf, str); X+ else X+ (void) page_line(str); /* always returns 0 on "" */ X+ return r; X } X X #ifdef TUTTI_FRUTTI X*** src/Old/pager.c Wed Sep 27 12:08:41 1989 X--- src/pager.c Wed Sep 27 09:29:44 1989 X*************** X*** 29,35 **** X FILE *fp; X char bufr[BUFSZ+6]; X register char *buf = &bufr[6], *ep, q; X- register struct monst *mtmp; X #ifdef OS2_CODEVIEW X char tmp[PATHLEN]; X X--- 29,34 ---- X*************** X*** 44,50 **** X else { X coord cc; X uchar r; X- boolean bycurs = FALSE; X X pline ("Specify unknown object by cursor? "); X q = ynq(); X--- 43,48 ---- X*************** X*** 56,62 **** X pline("Specify what? "); X r = readchar(); X } else { X- bycurs = TRUE; X cc.x = u.ux; X cc.y = u.uy; X selobj: X--- 54,59 ---- X*************** X*** 68,73 **** X--- 65,71 ---- X return 0; X } X r = levl[cc.x][cc.y].scrsym; X+ if (!r || !levl[cc.x][cc.y].seen) r = ' '; X } X X #define conv_sym(x) if(r == showsyms.x) q = defsyms.x X*************** X*** 109,131 **** X else conv_sym(dbvwall); X else conv_sym(dbhwall); X #endif X- else q = r; X #undef conv_sym X! X! if (index(quitchars, q)) { X! (void) fclose(fp); /* sweet@scubed */ X! return 0; X! } X! if(q == '%') { X! pline("%% a piece of food"); X! if(bycurs) { X! buf = &bufr[6]; X! more(); X! rewind(fp); X! goto selobj; X } X- (void) fclose(fp); X- return 0; X } X X if(q != '\t') X--- 107,119 ---- X else conv_sym(dbvwall); X else conv_sym(dbhwall); X #endif X #undef conv_sym X! else { X! q = r; X! if (index(quitchars, q)) { X! (void) fclose(fp); /* sweet@scubed */ X! return 0; X } X } X X if(q != '\t') X*************** X*** 140,152 **** X buf[0] = r; X (void) strncpy(buf+1, " ", 7); X } X! pline(buf); X if(cc.x != -1) { X #ifdef ALTARS X if (r == showsyms.altar && q == defsyms.altar && X (IS_ALTAR(levl[cc.x][cc.y].typ) || X! (levl[cc.x][cc.y].mmask && X! m_at(cc.x,cc.y)->mimic)) X ) { X int type = levl[cc.x][cc.y].altarmask & X ~A_SHRINE; X--- 128,146 ---- X buf[0] = r; X (void) strncpy(buf+1, " ", 7); X } X! /* use %s so '%' won't be interpreted as a format */ X! pline("%s", buf); X if(cc.x != -1) { X+ register struct monst *mtmp; X+ X+ if(MON_AT(cc.x,cc.y)) X+ mtmp = m_at(cc.x,cc.y); X+ else X+ mtmp = (struct monst *) 0; X #ifdef ALTARS X if (r == showsyms.altar && q == defsyms.altar && X (IS_ALTAR(levl[cc.x][cc.y].typ) || X! (mtmp && mtmp->mimic)) X ) { X int type = levl[cc.x][cc.y].altarmask & X ~A_SHRINE; X*************** X*** 154,167 **** 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! if (r == showsyms.door && q == defsyms.door && X (IS_DOOR(levl[cc.x][cc.y].typ) || X! (levl[cc.x][cc.y].mmask && X! m_at(cc.x,cc.y)->mimic))) { X /* Note: this will say mimics in walls are X * closed doors, which we want. X */ X--- 148,159 ---- X (type == A_NEUTRAL) ? "(neutral)" : X "(lawful)"); X } else X+ #endif X if (q == CHAIN_SYM && OBJ_AT(cc.x, cc.y)) X pline("(chain)"); X! else if (r == showsyms.door && q == defsyms.door && X (IS_DOOR(levl[cc.x][cc.y].typ) || X! (mtmp && mtmp->mimic))) { X /* Note: this will say mimics in walls are X * closed doors, which we want. X */ X*************** X*** 191,215 **** X IS_SINK(levl[cc.x][cc.y].typ)) X pline("(sink)"); X #endif X! } X! if (!Invisible X #ifdef POLYSELF X && !u.uundetected X #endif X && u.ux==cc.x && u.uy==cc.y) { X! pline("(%s named %s)", X #ifdef POLYSELF 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--- 183,211 ---- X IS_SINK(levl[cc.x][cc.y].typ)) X pline("(sink)"); X #endif X! if (!Invisible X #ifdef POLYSELF X && !u.uundetected X #endif X && u.ux==cc.x && u.uy==cc.y) { X! pline("(%s named %s)", X #ifdef POLYSELF X! u.mtimedone ? mons[u.umonnum].mname : X #endif X! pl_character, plname); X! /* Note: the blind/telepathy check is necessary. X! * Otherwise a ghost sitting on a blank square X! * gets identified even while blind because the X! * symbol is "correct". X! */ X! } else if (mtmp && (!Blind || Telepat)) { 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 } X if(ep[-1] == ';') { X pline("More info? "); X*************** X*** 218,224 **** X return 0; X } X } X! if(bycurs) { X buf = &bufr[6]; X more(); X rewind(fp); X--- 214,220 ---- X return 0; X } X } X! if(cc.x != -1) { X buf = &bufr[6]; X more(); X rewind(fp); X*************** X*** 254,264 **** X } X X pline("What command? "); X! #ifdef UNIX X introff(); X #endif X q = readchar(); X! #ifdef UNIX X intron(); X #endif X ctrl = ((q <= '\033') ? (q - 1 + 'A') : 0); X--- 250,260 ---- X } X X pline("What command? "); X! #if defined(UNIX) || defined(VMS) X introff(); X #endif X q = readchar(); X! #if defined(UNIX) || defined(VMS) X intron(); X #endif X ctrl = ((q <= '\033') ? (q - 1 + 'A') : 0); X*************** X*** 282,288 **** X buf[0] = q; X (void) strncpy(buf+1, " ", 7); X } X! pline(buf); X (void) fclose(fp); X return 0; X } X--- 278,284 ---- X buf[0] = q; X (void) strncpy(buf+1, " ", 7); X } X! pline("%s", buf); X (void) fclose(fp); X return 0; X } X*************** X*** 514,520 **** X X /* --- now we really do it --- */ X if(mode == 2 && linect == 1) /* topline only */ X! pline(texthead->line_text); X else X if(mode == 2) { X register int curline, lth; X--- 510,516 ---- X X /* --- now we really do it --- */ X if(mode == 2 && linect == 1) /* topline only */ X! pline("%s", texthead->line_text); X else X if(mode == 2) { X register int curline, lth; X*************** X*** 760,765 **** X--- 756,762 ---- X } X #endif /* SHELL /**/ X X+ #if defined(SHELL) || defined(DEF_PAGER) || defined(DEF_MAILREADER) X int X child(wt) X int wt; X*************** X*** 806,809 **** X--- 803,807 ---- X docrt(); X return(0); X } X+ #endif X #endif /* UNIX /**/ X*** src/Old/panic.c Wed Sep 27 12:09:11 1989 X--- src/panic.c Sun Sep 17 14:26:41 1989 X*************** X*** 6,11 **** X--- 6,12 ---- X */ X /* NetHack may be freely redistributed. See license for details. */ X X+ #define NEED_VARARGS X #include "config.h" X X #ifdef MSDOS X*************** X*** 17,25 **** X boolean panicking; X X void X! panic(str,a1,a2,a3,a4,a5,a6) X! char *str; X! { X if(panicking++) X #ifdef SYSV X (void) X--- 18,26 ---- X boolean panicking; X X void X! panic VA_DECL(char *,str) X! VA_START(str); X! VA_INIT(str, char *); X if(panicking++) X #ifdef SYSV X (void) X*************** X*** 27,40 **** X abort(); /* avoid loops - this should never happen*/ X X (void) fputs(" ERROR: ", stderr); X! Printf(str,a1,a2,a3,a4,a5,a6); X (void) fflush(stderr); X! #ifdef UNIX X # ifdef SYSV X (void) X # endif X abort(); /* generate core dump */ X #endif X exit(1); /* redundant */ X return; X } X--- 28,42 ---- X abort(); /* avoid loops - this should never happen*/ X X (void) fputs(" ERROR: ", stderr); X! Vprintf(str,VA_ARGS); X (void) fflush(stderr); X! #if defined(UNIX) || defined(VMS) X # ifdef SYSV X (void) X # endif X abort(); /* generate core dump */ X #endif X+ VA_END(); X exit(1); /* redundant */ X return; X } X*** src/Old/pickup.c Wed Sep 27 12:09:25 1989 X--- src/pickup.c Tue Sep 26 12:59:19 1989 X*************** X*** 29,37 **** X dummygold.oy = u.uy; X dummygold.olet = GOLD_SYM; X dummygold.nobj = fobj; X dummygold.cobj = 0; X X! if(Levitation) return; X if (all && !flags.pickup) { X int ct = 0; X X--- 29,41 ---- X dummygold.oy = u.uy; X dummygold.olet = GOLD_SYM; X dummygold.nobj = fobj; X+ dummygold.nexthere = level.objects[u.ux][u.uy]; X dummygold.cobj = 0; X X! if(Levitation) { X! if (all && !flags.pickup) read_engr_at(u.ux,u.uy); X! return; X! } X if (all && !flags.pickup) { X int ct = 0; X X*************** X*** 65,72 **** X register int ct = 0; X X if (gold) ct++; X! for(obj = fobj; obj; obj = obj->nobj) X! if(obj->ox == u.ux && obj->oy == u.uy) X if(!obj->cobj) ct++; X if(ct < 2) X all++; X--- 69,75 ---- X register int ct = 0; X X if (gold) ct++; X! for(obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) X if(!obj->cobj) ct++; X if(ct < 2) X all++; X*************** X*** 76,82 **** X X /* added by GAN 10/24/86 to allow selective picking up */ X if(!all) { X! register struct obj *otmp = fobj; X X ilets[iletct] = 0; X if(gold) { X--- 79,85 ---- X X /* added by GAN 10/24/86 to allow selective picking up */ X if(!all) { X! register struct obj *otmp = level.objects[u.ux][u.uy]; X X ilets[iletct] = 0; X if(gold) { X*************** X*** 84,95 **** X ilets[iletct] = 0; X } X while(otmp) { X! if(!index(ilets, otmp->olet) && !otmp->cobj && X! otmp->ox == u.ux && otmp->oy == u.uy) { X ilets[iletct++] = otmp->olet; X ilets[iletct] = 0; X } X! otmp = otmp->nobj; X } X if(iletct == 1) X Strcpy(buf,ilets); X--- 87,97 ---- X ilets[iletct] = 0; X } X while(otmp) { X! if(!index(ilets, otmp->olet) && !otmp->cobj) { X ilets[iletct++] = otmp->olet; X ilets[iletct] = 0; X } X! otmp = otmp->nexthere; X } X if(iletct == 1) X Strcpy(buf,ilets); X*************** X*** 127,135 **** X } X if(all_of_a_type && !olets[0]) all = TRUE; X X! for(obj = (gold ? &dummygold : fobj); obj; obj = obj2) { X! obj2 = obj->nobj; /* perhaps obj will be picked up */ X! if(!obj->cobj && obj->ox == u.ux && obj->oy == u.uy) { X if(flags.run) nomul(0); X X if(!all) { X--- 129,138 ---- X } X if(all_of_a_type && !olets[0]) all = TRUE; X X! for(obj = (gold ? &dummygold : level.objects[u.ux][u.uy]); obj; X! obj = obj2) { X! obj2 = obj->nexthere; /* perhaps obj will be picked up */ X! if(!obj->cobj) { X if(flags.run) nomul(0); X X if(!all) { X*************** X*** 282,288 **** X obj->quan = pickquan; /* to fool prinv() */ X if(uwep && uwep == obj) mrg_to_wielded = TRUE; X prinv(obj); X! if(mrg_to_wielded) mrg_to_wielded = FALSE; X obj->quan = mergquan; X } X } X--- 285,291 ---- X obj->quan = pickquan; /* to fool prinv() */ X if(uwep && uwep == obj) mrg_to_wielded = TRUE; X prinv(obj); X! mrg_to_wielded = FALSE; X obj->quan = mergquan; X } X } X*************** X*** 368,374 **** X if((obj->otyp == LOADSTONE) && obj->cursed) { X obj->bknown = 1; X pline("The stone%s won't leave your person.", X! obj->quan==1 ? "" : "s"); X return(0); X } X /* Prohibit Amulets in containers; if you allow it, monsters can't X--- 371,377 ---- X if((obj->otyp == LOADSTONE) && obj->cursed) { X obj->bknown = 1; X pline("The stone%s won't leave your person.", X! plur((long)obj->quan)); X return(0); X } X /* Prohibit Amulets in containers; if you allow it, monsters can't X*************** X*** 407,413 **** X obj->nobj = fcobj; X fcobj = obj; X X! if(Icebox) obj->age = moves - obj->age; /* actual age */ X X else if(Is_mbag(obj->cobj) && X (Is_mbag(obj) || X--- 410,416 ---- X obj->nobj = fcobj; X fcobj = obj; X X! if(Icebox) obj->age = monstermoves - obj->age; /* actual age */ X X else if(Is_mbag(obj->cobj) && X (Is_mbag(obj) || X*************** X*** 452,459 **** X dec_cwt(current_container, obj); X obj->cobj = (struct obj *) 0; X X! if (Icebox) X! obj->age = moves - obj->age; /* simulated point of time */ X X (void) addinv(obj); X return 0; X--- 455,462 ---- X dec_cwt(current_container, obj); X obj->cobj = (struct obj *) 0; X X! if (Icebox) obj->age = monstermoves - obj->age; X! /* simulated point of time */ X X (void) addinv(obj); X return 0; X END_OF_FILE if test 47374 -ne `wc -c <'patches04c'`; then echo shar: \"'patches04c'\" unpacked with wrong size! fi # end of 'patches04c' fi echo shar: End of archive 3 \(of 11\). cp /dev/null ark3isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 11 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0