[comp.sources.games] v08i039: NetHack3 - display oriented dungeons & dragons

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