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

billr@saab.CNA.TEK.COM (Bill Randle) (11/23/89)

Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 8, Issue 56
Archive-name: NetHack3/Patch6c
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 15)."
# Contents:  UPDATE6 patches06f
# Wrapped by billr@saab on Wed Nov 22 10:50:07 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'UPDATE6' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'UPDATE6'\"
else
echo shar: Extracting \"'UPDATE6'\" \(1267 characters\)
sed "s/^X//" >'UPDATE6' <<'END_OF_FILE'
XThis patch contains two major improvements:
X
XFirst, thanks to Ari Huttunen, different door states show up as different
X(configurable) characters on the screen.
X
XSecond, doors can now be entered/exited diagonally both for player and
Xmonster.
X
XThird, a gaggle of people credited in the appropriate files developed an
Xoverlay manager for MS-DOS and MSC such that all the options of NetHack can
Xbe supported.  See Install.dos and ovlmgr.* for further details.
X
XIn more minor news:
X
XYou no longer have to pick up food to eat it, and you no longer necessarily
Xresume eating your interrupted meal.
X
XYou can no longer get properties from wielding a non-weapon.
X
XThere is a new option, CLIPPING, which allows playing on small screens or
Xwindows.
X
XThe multiple demon types portion of HARD has been split off into the new
XINFERNO option.
X
XThe Macintosh port has been further refined.
X
XThe / command now takes configurable characters into account when identifying
Xitems.
X
XLeprechauns and lichs and nymphs and nagas had their letters switched so that
Xthe more formidable monsters get capital letters.  Several new low-level
Xmonsters were added.
X
XDrawbridge interactions are much smarter, thanks to Kevin Darcy.
X
XAnd a large number of minor bug fixes and efficiency enhancements.
X
END_OF_FILE
if test 1267 -ne `wc -c <'UPDATE6'`; then
    echo shar: \"'UPDATE6'\" unpacked with wrong size!
fi
# end of 'UPDATE6'
fi
if test -f 'patches06f' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patches06f'\"
else
echo shar: Extracting \"'patches06f'\" \(55539 characters\)
sed "s/^X//" >'patches06f' <<'END_OF_FILE'
X*** src/Old/dog.c	Sun Nov 19 12:37:40 1989
X--- src/dog.c	Wed Nov  8 22:56:30 1989
X***************
X*** 150,156 ****
X  keepdogs(){
X  register struct monst *mtmp;
X  	for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X! 	    if(((dist(mtmp->mx,mtmp->my) < 3 && levl_follower(mtmp)) ||
X  		/* the wiz will level t-port from anywhere to chase
X  		   the amulet; if you don't have it, will chase you
X  		   only if in range. -3. */
X--- 150,156 ----
X  keepdogs(){
X  register struct monst *mtmp;
X  	for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X! 	    if(((monnear(mtmp, u.ux, u.uy) && levl_follower(mtmp)) ||
X  		/* the wiz will level t-port from anywhere to chase
X  		   the amulet; if you don't have it, will chase you
X  		   only if in range. -3. */
X***************
X*** 160,166 ****
X  		/* Bug "fix" for worm changing levels collapsing dungeon
X  		 */
X  		if (mtmp->data == &mons[PM_LONG_WORM]) {
X! 			if (canseemon(mtmp) || (Blind && Telepat))
X  				pline("The worm can't fit down the stairwell.");
X  # ifdef WALKIES
X  			if (mtmp->mleashed) {
X--- 160,166 ----
X  		/* Bug "fix" for worm changing levels collapsing dungeon
X  		 */
X  		if (mtmp->data == &mons[PM_LONG_WORM]) {
X! 			if (showmon(mtmp))
X  				pline("The worm can't fit down the stairwell.");
X  # ifdef WALKIES
X  			if (mtmp->mleashed) {
X***************
X*** 244,256 ****
X  			return POISON;
X  		    return (carni ? CADAVER : MANFOOD);
X  		case CORPSE:
X! 		    if ((obj->age+50 <= moves && mon->data->mlet != S_FUNGUS) ||
X  			(poisonous(&mons[obj->corpsenm]) &&
X  						!resists_poison(mon->data)))
X  			return POISON;
X  		    else return (carni ? CADAVER : MANFOOD);
X- 		case DEAD_LIZARD:
X- 		    return (carni ? ACCFOOD : MANFOOD);
X  		case CLOVE_OF_GARLIC:
X  		    return (is_undead(mon->data) ? TABU :
X  			    (herbi ? ACCFOOD : MANFOOD));
X--- 244,255 ----
X  			return POISON;
X  		    return (carni ? CADAVER : MANFOOD);
X  		case CORPSE:
X! 		    if ((obj->age+50 <= moves && obj->corpsenm != PM_LIZARD
X! 					    && mon->data->mlet != S_FUNGUS) ||
X  			(poisonous(&mons[obj->corpsenm]) &&
X  						!resists_poison(mon->data)))
X  			return POISON;
X  		    else return (carni ? CADAVER : MANFOOD);
X  		case CLOVE_OF_GARLIC:
X  		    return (is_undead(mon->data) ? TABU :
X  			    (herbi ? ACCFOOD : MANFOOD));
X*** src/Old/dogmove.c	Sun Nov 19 12:37:57 1989
X--- src/dogmove.c	Sat Nov 11 17:05:22 1989
X***************
X*** 9,14 ****
X--- 9,59 ----
X  
X  static const char nofetch[] = { BALL_SYM, CHAIN_SYM, ROCK_SYM, 0 };
X  
X+ static void
X+ dog_eat(mtmp, obj, otyp, x, y)
X+ register struct monst *mtmp;
X+ register struct obj * obj;
X+ xchar otyp;
X+ int x, y;
X+ {
X+ 	register struct edog *edog = EDOG(mtmp);
X+ 	int nutrit;
X+ 
X+ 	if(edog->hungrytime < moves)
X+ 	    edog->hungrytime = moves;
X+ 	/* Note: to get the correct percentage-eaten in case oeaten is set,
X+ 	 * use "obj->owt / obj->quan / base-weight".  It so happens that here
X+ 	 * we want to multiply by obj->quan, which thus cancels out.
X+ 	 * It is arbitrary that the pet takes the same length of time to eat
X+ 	 * as a human, but gets 5X as much nutrition.
X+ 	 */
X+ 	if(obj->otyp == CORPSE) {
X+ 	    mtmp->meating = 3 + (mons[obj->corpsenm].cwt >> 2);
X+ 	    nutrit = 5 * mons[obj->corpsenm].cnutrit;
X+ 	} else {
X+ 	    mtmp->meating = objects[obj->otyp].oc_delay;
X+ 	    nutrit = 5 * objects[obj->otyp].nutrition;
X+ 	}
X+ 	if(obj->oeaten) {
X+ 	    mtmp->meating = eaten_stat(mtmp->meating, obj);
X+ 	    nutrit = eaten_stat(nutrit, obj);
X+ 	}
X+ 	edog->hungrytime += nutrit;
X+ 	mtmp->mconf = 0;
X+ 	if (mtmp->mtame < 20) mtmp->mtame++;
X+ 	if(cansee(x,y))
X+ 	    pline("%s eats %s.", Monnam(mtmp), doname(obj));
X+ 	/* perhaps this was a reward */
X+ 	if(otyp != CADAVER)
X+ #ifdef LINT
X+ 	    edog->apport = 0;
X+ #else
X+ 	    edog->apport += (unsigned)(200L/
X+ 		((long)edog->dropdist+moves-edog->droptime));
X+ #endif
X+ 	delobj(obj);
X+ }
X+ 
X  /* return 0 (no move), 1 (move) or 2 (dead) */
X  int
X  dog_move(mtmp, after)
X***************
X*** 32,41 ****
X  
X  	omx = mtmp->mx;
X  	omy = mtmp->my;
X! 	whappr = (moves - EDOG(mtmp)->whistletime < 5);
X! 	if(moves > EDOG(mtmp)->hungrytime + 500) {
X  		if(!carnivorous(mtmp->data) && !herbivorous(mtmp->data)) {
X! 			EDOG(mtmp)->hungrytime = moves + 500;
X  			/* but not too high; it might polymorph */
X  		} else if (!mtmp->mconf) {
X  			mtmp->mconf = 1;
X--- 77,86 ----
X  
X  	omx = mtmp->mx;
X  	omy = mtmp->my;
X! 	whappr = (moves - edog->whistletime < 5);
X! 	if(moves > edog->hungrytime + 500) {
X  		if(!carnivorous(mtmp->data) && !herbivorous(mtmp->data)) {
X! 			edog->hungrytime = moves + 500;
X  			/* but not too high; it might polymorph */
X  		} else if (!mtmp->mconf) {
X  			mtmp->mconf = 1;
X***************
X*** 45,51 ****
X  			if(cansee(omx,omy))
X  			    pline("%s is confused from hunger.", Monnam(mtmp));
X  			else You("feel worried about %s.", mon_nam(mtmp));
X! 		} else if(moves > EDOG(mtmp)->hungrytime + 750 ||
X  							mtmp->mhp < 1) {
X  #ifdef WALKIES
X  			if(mtmp->mleashed)
X--- 90,96 ----
X  			if(cansee(omx,omy))
X  			    pline("%s is confused from hunger.", Monnam(mtmp));
X  			else You("feel worried about %s.", mon_nam(mtmp));
X! 		} else if(moves > edog->hungrytime + 750 ||
X  							mtmp->mhp < 1) {
X  #ifdef WALKIES
X  			if(mtmp->mleashed)
X***************
X*** 85,91 ****
X  		    if((otyp = dogfood(mtmp, obj)) <= CADAVER){
X  			nix = omx;
X  			niy = omy;
X! 			goto eatobj;
X  		    }
X  		    if(can_carry(mtmp, obj))
X  		    if(rn2(20) < edog->apport+3)
X--- 130,137 ----
X  		    if((otyp = dogfood(mtmp, obj)) <= CADAVER){
X  			nix = omx;
X  			niy = omy;
X! 			dog_eat(mtmp, obj, otyp, nix, niy);
X! 			goto newdogpos;
X  		    }
X  		    if(can_carry(mtmp, obj))
X  		    if(rn2(20) < edog->apport+3)
X***************
X*** 137,143 ****
X  	    }
X  
X  	if(gtyp == UNDEF ||
X! 	  (gtyp != DOGFOOD && gtyp != APPORT && moves < EDOG(mtmp)->hungrytime)){
X  		if(dogroom < 0 || dogroom == uroom){
X  			gx = u.ux;
X  			gy = u.uy;
X--- 183,189 ----
X  	    }
X  
X  	if(gtyp == UNDEF ||
X! 	  (gtyp != DOGFOOD && gtyp != APPORT && moves < edog->hungrytime)){
X  		if(dogroom < 0 || dogroom == uroom){
X  			gx = u.ux;
X  			gy = u.uy;
X***************
X*** 246,308 ****
X  
X  		/* dog eschews cursed objects */
X  		/* but likes dog food */
X! 		obj = fobj;
X! 		if(OBJ_AT(nx, ny)) 
X! 		  while(obj){
X! 		    if(obj->ox != nx || obj->oy != ny)
X! 			goto nextobj;
X  		    if(obj->cursed && !mtmp->mleashed) goto nxti;
X  		    if(obj->olet == FOOD_SYM &&
X  			(otyp = dogfood(mtmp, obj)) < MANFOOD &&
X! 			(otyp < ACCFOOD || EDOG(mtmp)->hungrytime <= moves)){
X  			/* Note: our dog likes the food so much that he
X  			might eat it even when it conceals a cursed object */
X  			nix = nx;
X  			niy = ny;
X  			chi = i;
X! 		     eatobj:
X! 			if(EDOG(mtmp)->hungrytime < moves)
X! 			    EDOG(mtmp)->hungrytime = moves;
X! 			/* Note: to get the correct percentage-eaten in case
X! 			 * oeaten is set, use "obj->owt / obj->quan /
X! 			 * base-weight".  It so happens that here we want to
X! 			 * multiply by obj->quan, which thus cancels out.
X! 			 * It is arbitrary that the pet takes the same length
X! 			 * of time to eat as a human, but gets 5X as much
X! 			 * nutrition.
X! 			 */
X! 			if(obj->otyp == CORPSE) {
X! 			    mtmp->meating =
X! 				(3 + (mons[obj->corpsenm].cwt >> 2))
X! 				* obj->owt / mons[obj->corpsenm].cwt;
X! 			    EDOG(mtmp)->hungrytime += 5 * 
X! 				mons[obj->corpsenm].cnutrit
X! 				* obj->owt / mons[obj->corpsenm].cwt;
X! 			} else {
X! 			    mtmp->meating =
X! 				objects[obj->otyp].oc_delay
X! 				* obj->owt / objects[obj->otyp].oc_weight;
X! 			    EDOG(mtmp)->hungrytime += 5 *
X! 				objects[obj->otyp].nutrition
X! 				* obj->owt / objects[obj->otyp].oc_weight;
X! 			}
X! 			mtmp->mconf = 0;
X! 			if (mtmp->mtame < 20) mtmp->mtame++;
X! 			if(cansee(nix,niy))
X! 			    pline("%s eats %s.", Monnam(mtmp), doname(obj));
X! 			/* perhaps this was a reward */
X! 			if(otyp != CADAVER)
X! #ifdef LINT	/* edog->apport += (unsigned) (200L/((long) edog->dropdist...*/
X! 			edog->apport = 0;
X! #else
X! 			edog->apport += (unsigned)(200L/
X! 				((long)edog->dropdist+moves-edog->droptime));
X! #endif
X! 			delobj(obj);
X  			goto newdogpos;
X  		    }
X- 		nextobj:
X- 		    obj = obj->nobj;
X  		}
X  
X  		for(j=0; j<MTSZ && j<cnt-1; j++)
X--- 292,310 ----
X  
X  		/* dog eschews cursed objects */
X  		/* but likes dog food */
X! 		for(obj = level.objects[nx][ny]; obj; obj = obj->nexthere) {
X  		    if(obj->cursed && !mtmp->mleashed) goto nxti;
X  		    if(obj->olet == FOOD_SYM &&
X  			(otyp = dogfood(mtmp, obj)) < MANFOOD &&
X! 			(otyp < ACCFOOD || edog->hungrytime <= moves)){
X  			/* Note: our dog likes the food so much that he
X  			might eat it even when it conceals a cursed object */
X  			nix = nx;
X  			niy = ny;
X  			chi = i;
X! 			dog_eat(mtmp, obj, otyp, nix, niy);
X  			goto newdogpos;
X  		    }
X  		}
X  
X  		for(j=0; j<MTSZ && j<cnt-1; j++)
X*** src/Old/dokick.c	Sun Nov 19 12:38:19 1989
X--- src/dokick.c	Sat Nov 18 23:06:56 1989
X***************
X*** 150,156 ****
X  	if(!rn2(clumsy ? 3 : 4) && (clumsy || !bigmonst(mon->data)) && 
X  	   mon->mcansee && !mon->mtrapped && !thick_skinned(mon->data) && 
X  	   mon->data->mlet != S_EEL && haseyes(mon->data) && !mon->mfroz && 
X! 	   !mon->mstun && !mon->mconf && mon->data->mmove >= 12) {
X  		if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) {
X  		    kludge("%s blocks your %skick.", Monnam(mon), 
X  				clumsy ? "clumsy " : "");
X--- 150,157 ----
X  	if(!rn2(clumsy ? 3 : 4) && (clumsy || !bigmonst(mon->data)) && 
X  	   mon->mcansee && !mon->mtrapped && !thick_skinned(mon->data) && 
X  	   mon->data->mlet != S_EEL && haseyes(mon->data) && !mon->mfroz && 
X! 	   !mon->mstun && !mon->mconf && !mon->msleep &&
X! 	   mon->data->mmove >= 12) {
X  		if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) {
X  		    kludge("%s blocks your %skick.", Monnam(mon), 
X  				clumsy ? "clumsy " : "");
X***************
X*** 289,300 ****
X  	boolean costly = FALSE;
X  
X  	/* if a pile, the "top" object gets kicked */
X! 	for (otmp = fobj; otmp; otmp = otmp->nobj)
X! 		if(otmp->ox == x && otmp->oy == y)
X! 		    if(!otmp->cobj) {
X! 			    cnt++;
X! 			    if(cnt == 1) obj = otmp;
X! 		    }
X  
X  	/* range < 2 means the object will not move.	*/
X  	/* maybe dexterity should also figure here.     */
X--- 290,300 ----
X  	boolean costly = FALSE;
X  
X  	/* if a pile, the "top" object gets kicked */
X! 	for (otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere)
X! 		if(!otmp->cobj) {
X! 			cnt++;
X! 			if(cnt == 1) obj = otmp;
X! 		}
X  
X  	/* range < 2 means the object will not move.	*/
X  	/* maybe dexterity should also figure here.     */
X***************
X*** 302,309 ****
X  				ACURR(A_STR))/2 - obj->owt/4);
X  	else range = rnd((int)ACURR(A_STR));
X  
X- 	if(range < 1) range = 1; /* safety... */
X  	if(martial()) range = range + rnd(3);
X  
X  	/* see if the object has a place to move into */
X  	odx = x + u.dx;
X--- 302,309 ----
X  				ACURR(A_STR))/2 - obj->owt/4);
X  	else range = rnd((int)ACURR(A_STR));
X  
X  	if(martial()) range = range + rnd(3);
X+ 	if(range < 1) range = 1; /* safety... */
X  
X  	/* see if the object has a place to move into */
X  	odx = x + u.dx;
X***************
X*** 355,361 ****
X  		return(1);
X  	}
X  
X! 	if(obj->otyp == BOULDER || obj == uball || obj == uchain)
X  		return(0);
X  
X  	/* a box gets a chance of breaking open here */
X--- 355,363 ----
X  		return(1);
X  	}
X  
X! 	/* cnt should always be >= 1 here (meaning obj is set) due to
X! 	 * conditions of call */
X! 	if(!cnt || obj->otyp == BOULDER || obj == uball || obj == uchain)
X  		return(0);
X  
X  	/* a box gets a chance of breaking open here */
X***************
X*** 365,380 ****
X  		if (!obj->olocked && (!rn2(3) ||
X  					(martial() && !rn2(2)))) {
X  		    pline("The lid slams open, then falls shut.");
X! 		    if(otrp) goto gotcha;
X  		    return(1);
X  		} else if (obj->olocked && 
X  				(!rn2(5) || (martial() && !rn2(2)))) {
X  		    You("break open the lock!");
X  		    obj->olocked = 0;
X! 	            if(otrp) {
X! gotcha:
X! 		        chest_trap(obj, LEG);
X! 		    }
X  		    return(1);
X  		}
X  		/* let it fall through to the next cases... */
X--- 367,379 ----
X  		if (!obj->olocked && (!rn2(3) ||
X  					(martial() && !rn2(2)))) {
X  		    pline("The lid slams open, then falls shut.");
X! 		    if(otrp) chest_trap(obj, LEG);
X  		    return(1);
X  		} else if (obj->olocked && 
X  				(!rn2(5) || (martial() && !rn2(2)))) {
X  		    You("break open the lock!");
X  		    obj->olocked = 0;
X! 	            if(otrp) chest_trap(obj, LEG);
X  		    return(1);
X  		}
X  		/* let it fall through to the next cases... */
X***************
X*** 393,402 ****
X  	/* potions get a chance of breaking here */
X  	if(obj->olet == POTION_SYM) {
X  		if(rn2(2)) {
X! 		    You("smash the %s!", xname(obj));
X! 		    if(costly) addtobill(obj, FALSE);
X  		    potionbreathe(obj);
X! 		    delobj(obj);
X  		    return(1);
X  		}
X  	}
X--- 392,400 ----
X  	/* potions get a chance of breaking here */
X  	if(obj->olet == POTION_SYM) {
X  		if(rn2(2)) {
X! 		    You("smash %s %s!", obj->quan==1 ? "the" : "a", xname(obj));
X  		    potionbreathe(obj);
X! 		    useupf(obj);
X  		    return(1);
X  		}
X  	}
X***************
X*** 438,443 ****
X--- 436,443 ----
X  	    return(0);
X  	}
X  
X+ 	if (obj->quan > 1) (void) splitobj(obj, 1);
X+ 
X  	/* Needed to fool bhit's display-cleanup to show immediately	*/
X  	/* the next object in the pile.  We know here that the object	*/
X  	/* will move, so there is no need to worry about the location,	*/
X***************
X*** 448,453 ****
X--- 448,454 ----
X  
X  	mon = bhit(u.dx, u.dy, range, obj->olet,
X  			(int (*)()) 0, (int (*)()) 0, obj);
X+ 	freeobj(obj);
X  	if(mon) {
X  # ifdef WORM
X  		if (mon->mx != bhitpos.x || mon->my != bhitpos.y)
X***************
X*** 459,464 ****
X--- 460,467 ----
X  	}
X  	if(costly && !costly_spot(bhitpos.x,bhitpos.y)) addtobill(obj, FALSE);
X  	move_object(obj, bhitpos.x, bhitpos.y);
X+ 	obj->nobj = fobj;
X+ 	fobj = obj;
X  	stackobj(obj);
X  	if(!MON_AT(obj->ox, obj->oy))
X  	    newsym(obj->ox, obj->oy);
X***************
X*** 548,559 ****
X  		    if(rn2(30) < avrg_attrib) { 
X  			pline("Crash!  You kick open a secret door!");
X  			maploc->typ = DOOR;
X- 			atl(x, y, (char) DOOR_SYM);
X  			if(maploc->doormask & D_TRAPPED) {
X  			    b_trapped("door");
X  			    maploc->doormask = D_NODOOR;
X  			} else
X  			    maploc->doormask = D_ISOPEN;
X  			return(1);
X  		    } else goto ouch;
X  		}
X--- 551,563 ----
X  		    if(rn2(30) < avrg_attrib) { 
X  			pline("Crash!  You kick open a secret door!");
X  			maploc->typ = DOOR;
X  			if(maploc->doormask & D_TRAPPED) {
X  			    b_trapped("door");
X  			    maploc->doormask = D_NODOOR;
X  			} else
X  			    maploc->doormask = D_ISOPEN;
X+ 			mnewsym(x,y);
X+ 			prl(x,y);
X  			return(1);
X  		    } else goto ouch;
X  		}
X***************
X*** 561,567 ****
X  		    if(rn2(30) < avrg_attrib) { 
X  			pline("Crash!  You kick open a secret passage!");
X  			maploc->typ = CORR;
X! 			atl(x, y, (char) CORR_SYM);
X  			return(1);
X  		    } else goto ouch;
X  		}
X--- 565,572 ----
X  		    if(rn2(30) < avrg_attrib) { 
X  			pline("Crash!  You kick open a secret passage!");
X  			maploc->typ = CORR;
X! 			mnewsym(x,y);
X! 			prl(x,y);
X  			return(1);
X  		    } else goto ouch;
X  		}
X***************
X*** 575,581 ****
X  			mkgold((long)rnd(200), x, y);
X  			prl(x, y);
X  			return(1);
X! 		    } else if(u.uluck && !rn2(3) && !maploc->doormask) {
X  			You("kick loose some ornamental coins and gems!");
X  			mkgold((300L+(long)rn2(201)), x, y);
X  			i = u.uluck + 1;
X--- 580,586 ----
X  			mkgold((long)rnd(200), x, y);
X  			prl(x, y);
X  			return(1);
X! 		    } else if(u.uluck && !rn2(3) && !maploc->looted) {
X  			You("kick loose some ornamental coins and gems!");
X  			mkgold((300L+(long)rn2(201)), x, y);
X  			i = u.uluck + 1;
X***************
X*** 583,589 ****
X  			while(i--) (void) mkobj_at(GEM_SYM, x, y);
X  			prl(x, y);
X  			/* prevent endless milking */
X! 			maploc->doormask = T_LOOTED; 
X  			return(1);
X  		    } else if (!rn2(4)) {
X  			register struct trap *ttmp = 
X--- 588,594 ----
X  			while(i--) (void) mkobj_at(GEM_SYM, x, y);
X  			prl(x, y);
X  			/* prevent endless milking */
X! 			maploc->looted = T_LOOTED;
X  			return(1);
X  		    } else if (!rn2(4)) {
X  			register struct trap *ttmp = 
X***************
X*** 617,623 ****
X  			      Hallucination ? hcolor() : black);
X  			pmon(makemon(&mons[PM_BLACK_PUDDING], x, y));
X  			return(1);
X! #  ifdef HARD
X  		    } else if(!rn2(3) &&
X  #   ifndef POLYSELF
X  			      poly_gender() != 2 &&
X--- 622,628 ----
X  			      Hallucination ? hcolor() : black);
X  			pmon(makemon(&mons[PM_BLACK_PUDDING], x, y));
X  			return(1);
X! #  ifdef INFERNO
X  		    } else if(!rn2(3) &&
X  #   ifndef POLYSELF
X  			      poly_gender() != 2 &&
X***************
X*** 630,641 ****
X  #  endif
X  		    } else if(!rn2(3)) {
X  			pline("Flupp!  Muddy waste pops up from the drain.");
X! 			if(!maploc->doormask) { /* only once per sink */
X  			    if(!Blind) 
X  				You("see a ring shining in its midst.");
X  			    (void) mkobj_at(RING_SYM, x, y);
X  			    prl(x, y);
X! 			    maploc->doormask = T_LOOTED;
X  			}
X  			return(1);
X  		    }
X--- 635,646 ----
X  #  endif
X  		    } else if(!rn2(3)) {
X  			pline("Flupp!  Muddy waste pops up from the drain.");
X! 			if(!maploc->looted) { /* only once per sink */
X  			    if(!Blind) 
X  				You("see a ring shining in its midst.");
X  			    (void) mkobj_at(RING_SYM, x, y);
X  			    prl(x, y);
X! 			    maploc->looted = T_LOOTED;
X  			}
X  			return(1);
X  		    }
X***************
X*** 692,700 ****
X  		} else {
X  		    pline("As you kick the door, it crashes open!");
X  		    maploc->doormask = D_BROKEN;
X! 		    if(in_shop(x, y) && !in_shop(u.ux, u.uy))
X  			pay_for_door(x, y, "break");
X  		}
X  	} else	pline("WHAMMM!!!");
X  
X  	return(1);
X--- 697,707 ----
X  		} else {
X  		    pline("As you kick the door, it crashes open!");
X  		    maploc->doormask = D_BROKEN;
X! 		    if(in_shop(x, y))
X  			pay_for_door(x, y, "break");
X  		}
X+ 		mnewsym(x,y);
X+ 		prl(x,y);
X  	} else	pline("WHAMMM!!!");
X  
X  	return(1);
X*** src/Old/dothrow.c	Sun Nov 19 12:38:45 1989
X--- src/dothrow.c	Fri Nov 17 19:31:32 1989
X***************
X*** 1,4 ****
X! /*	SCCS Id: @(#)dothrow.c	3.0	88/10/22
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X--- 1,4 ----
X! /*	SCCS Id: @(#)dothrow.c	3.0	89/11/15
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X***************
X*** 6,13 ****
X  
X  #include "hack.h"
X  
X! static void gem_accept P((struct monst *, struct obj *));
X! static int throw_gold P((struct obj *));
X  static const char toss_objs[] = { '0', GOLD_SYM, '#', WEAPON_SYM, 0 };
X  #ifdef WORM
X  extern boolean notonhead;
X--- 6,13 ----
X  
X  #include "hack.h"
X  
X! static void FDECL(gem_accept, (struct monst *, struct obj *));
X! static int FDECL(throw_gold, (struct obj *));
X  static const char toss_objs[] = { '0', GOLD_SYM, '#', WEAPON_SYM, 0 };
X  #ifdef WORM
X  extern boolean notonhead;
X***************
X*** 255,261 ****
X  		}
X  		return(1);
X  	}
X! 	if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE || obj->olet == GEM_SYM) {
X  		if(obj->otyp < DART || obj->olet == GEM_SYM) {
X  		    if (!uwep ||
X  			objects[obj->otyp].w_propellor !=
X--- 255,262 ----
X  		}
X  		return(1);
X  	}
X! 	if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE ||
X! 	   obj->otyp == UNICORN_HORN || obj->olet == GEM_SYM) {
X  		if(obj->otyp < DART || obj->olet == GEM_SYM) {
X  		    if (!uwep ||
X  			objects[obj->otyp].w_propellor !=
X*** src/Old/eat.c	Sun Nov 19 12:39:11 1989
X--- src/eat.c	Sat Nov 18 18:18:49 1989
X***************
X*** 1,4 ****
X! /*	SCCS Id: @(#)eat.c	3.0	88/10/22
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X--- 1,4 ----
X! /*	SCCS Id: @(#)eat.c	3.0	89/11/15
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X***************
X*** 5,22 ****
X  #include	"hack.h"
X  /*#define DEBUG 	/* uncomment to enable new eat code debugging */
X  
X! static int fpostfx P((struct obj *));
X! static int cpostfx P((int));
X  
X  char corpsename[60];
X  char msgbuf[BUFSZ];
X  
X  /* hunger texts used on bottom line (each 8 chars long) */
X! #define	SATIATED	0
X  #define NOT_HUNGRY	1
X! #define	HUNGRY		2
X! #define	WEAK		3
X! #define	FAINTING	4
X  #define FAINTED		5
X  #define STARVED		6
X  
X--- 5,30 ----
X  #include	"hack.h"
X  /*#define DEBUG 	/* uncomment to enable new eat code debugging */
X  
X! #ifdef DEBUG
X! # ifdef WIZARD
X! #define debug	if (wizard) pline
X! # else
X! #define debug	pline
X! # endif
X! #endif
X! 
X! static void FDECL(fpostfx, (struct obj *));
X! static void FDECL(cpostfx, (int));
X  
X  char corpsename[60];
X  char msgbuf[BUFSZ];
X  
X  /* hunger texts used on bottom line (each 8 chars long) */
X! #define SATIATED	0
X  #define NOT_HUNGRY	1
X! #define HUNGRY		2
X! #define WEAK		3
X! #define FAINTING	4
X  #define FAINTED		5
X  #define STARVED		6
X  
X***************
X*** 34,50 ****
X  
X  /* calculate x/y, rounding as appropriate */
X  
X! static int
X  rounddiv(x, y)
X! int x, y;
X  {
X! 	int divsgn;
X! 	int r, m;
X  
X  	if (y == 0)
X  		panic("division by zero in rounddiv");
X! 	divsgn = (x*y > 0) ? 1 : -1;
X! 	x = abs(x); y = abs(y);
X  	r = x/y;
X  	m = x%y;
X  	if (2*m >= y)
X--- 42,62 ----
X  
X  /* calculate x/y, rounding as appropriate */
X  
X! static long
X  rounddiv(x, y)
X! long x, y;
X  {
X! 	int divsgn = 1;
X! 	long r, m;
X  
X  	if (y == 0)
X  		panic("division by zero in rounddiv");
X! 	if (x < 0) {
X! 		divsgn = -divsgn; x = -x;
X! 	}
X! 	if (y < 0) {
X! 		divsgn = -divsgn; y = -y;
X! 	}
X  	r = x/y;
X  	m = x%y;
X  	if (2*m >= y)
X***************
X*** 79,86 ****
X  				 * a tin, which uses the tin structure above */
X  	int	usedtime,	/* turns spent eating */
X  		reqtime;	/* turns required to eat */
X! 	int	nutrit,		/* total nutrition at beginning */
X! 		nmod;		/* coded nutrition per turn */
X  	Bitfield(canchoke,1);	/* was satiated at beginning */
X  	Bitfield(fullwarn,1);	/* have warned about being full */
X  	Bitfield(eating,1);	/* victual currently being eaten */
X--- 91,97 ----
X  				 * a tin, which uses the tin structure above */
X  	int	usedtime,	/* turns spent eating */
X  		reqtime;	/* turns required to eat */
X! 	int	nmod;		/* coded nutrition per turn */
X  	Bitfield(canchoke,1);	/* was satiated at beginning */
X  	Bitfield(fullwarn,1);	/* have warned about being full */
X  	Bitfield(eating,1);	/* victual currently being eaten */
X***************
X*** 87,93 ****
X  	Bitfield(doreset,1);	/* stop eating at end of turn */
X  } victual;
X  
X! static int
X  Meatdone() {		/* called after mimicing is over */
X  	u.usym =
X  #ifdef POLYSELF
X--- 98,107 ----
X  	Bitfield(doreset,1);	/* stop eating at end of turn */
X  } victual;
X  
X! #ifndef OVERLAY
X! static 
X! #endif
X! int
X  Meatdone() {		/* called after mimicing is over */
X  	u.usym =
X  #ifdef POLYSELF
X***************
X*** 101,110 ****
X  /* Created by GAN 01/28/87
X   * Amended by AKP 09/22/87: if not hard, don't choke, just vomit.
X   * Amended by 3.  06/12/89: if not hard, sometimes choke anyway, to keep risk.
X   */
X  /*ARGSUSED*/
X  static void
X! choke(food)
X  	register struct obj *food;
X  {
X  	/* only happens if you were satiated */
X--- 115,125 ----
X  /* Created by GAN 01/28/87
X   * Amended by AKP 09/22/87: if not hard, don't choke, just vomit.
X   * Amended by 3.  06/12/89: if not hard, sometimes choke anyway, to keep risk.
X+  *		  11/10/89: if hard, rarely vomit anyway, for slim chance.
X   */
X  /*ARGSUSED*/
X  static void
X! choke(food)	/* To a full belly all food is bad. (It.) */
X  	register struct obj *food;
X  {
X  	/* only happens if you were satiated */
X***************
X*** 113,152 ****
X  	if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL)
X  		u.ualign--;	/* gluttony is unchivalrous */
X  
X! #ifndef HARD
X  	if (rn2(20)) {
X  		You("stuff yourself and then vomit voluminously.");
X  		morehungry(1000);	/* you just got *very* sick! */
X  		vomit();
X  	} else {
X- #endif
X  		if(food) {
X! 			killer = singular(food);
X  		} else
X  			killer = "exuberant appetite";
X  		You("choke over your food.");
X  		You("die...");
X  		done(CHOKING);
X- #ifndef HARD
X  	}
X- #endif
X  }
X  
X  static void
X  recalc_wt() {	/* modify object wt. depending on time spent consuming it */
X! 	int baseweight = weight(victual.piece);	/* weight of full item */
X  
X  #ifdef DEBUG
X! 	pline("Old weight = %d", victual.piece->owt);
X! 	pline("Used time = %d, Req'd time = %d",
X  		victual.usedtime, victual.reqtime);
X  #endif
X! 	if(victual.usedtime)
X! 	    victual.piece->owt = (unsigned)rounddiv(
X! 			    baseweight * (victual.reqtime - victual.usedtime),
X! 			    victual.reqtime );
X  #ifdef DEBUG
X! 	pline("New weight = %d", victual.piece->owt);
X  #endif
X  }
X  
X--- 128,166 ----
X  	if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL)
X  		u.ualign--;	/* gluttony is unchivalrous */
X  
X! #ifdef HARD
X! 	if (!rn2(20)) {
X! #else
X  	if (rn2(20)) {
X+ #endif
X  		You("stuff yourself and then vomit voluminously.");
X  		morehungry(1000);	/* you just got *very* sick! */
X  		vomit();
X  	} else {
X  		if(food) {
X! 			killer = singular(food, xname);
X  		} else
X  			killer = "exuberant appetite";
X  		You("choke over your food.");
X  		You("die...");
X  		done(CHOKING);
X  	}
X  }
X  
X  static void
X  recalc_wt() {	/* modify object wt. depending on time spent consuming it */
X! 	register struct obj *piece = victual.piece;
X  
X  #ifdef DEBUG
X! 	debug("Old weight = %d", piece->owt);
X! 	debug("Used time = %d, Req'd time = %d",
X  		victual.usedtime, victual.reqtime);
X  #endif
X! 	/* weight(piece) = weight of full item */
X!   	if(victual.usedtime)
X! 	    piece->owt = eaten_stat(weight(piece), piece);
X  #ifdef DEBUG
X! 	debug("New weight = %d", piece->owt);
X  #endif
X  }
X  
X***************
X*** 158,164 ****
X       */
X  	if(victual.eating && !victual.doreset) {
X  #ifdef DEBUG
X! 	    pline("reset_eat...");
X  #endif
X  	    victual.doreset = TRUE;
X  	}
X--- 172,178 ----
X       */
X  	if(victual.eating && !victual.doreset) {
X  #ifdef DEBUG
X! 	    debug("reset_eat...");
X  #endif
X  	    victual.doreset = TRUE;
X  	}
X***************
X*** 169,191 ****
X  touchfood(otmp)
X  register struct obj *otmp;
X  {
X! 	if(otmp->quan > 1) {
X! 
X  	    otmp = splitobj(otmp, (int)otmp->quan-1);
X  #ifdef DEBUG
X! 	    pline("split object,");
X  #endif
X! 
X! 	    otmp->oeaten = TRUE;
X! 	    if(carried(otmp)) {
X! 		freeinv(otmp);
X! 		if(inv_cnt() >= 52)
X! 		    dropy(otmp);
X! 		else
X! 		    otmp = addinv(otmp); /* unlikely but a merge is possible */
X! 	    }
X! 	} else
X! 	    otmp->oeaten = TRUE;
X  	return(otmp);
X  }
X  
X--- 183,205 ----
X  touchfood(otmp)
X  register struct obj *otmp;
X  {
X! 	if (otmp->quan > 1) {
X  	    otmp = splitobj(otmp, (int)otmp->quan-1);
X  #ifdef DEBUG
X! 	    debug("split object,");
X  #endif
X! 	}
X! 	if (!otmp->oeaten)
X! 	    otmp->oeaten = (otmp->otyp == CORPSE ?
X! 				(int)mons[otmp->corpsenm].cnutrit :
X! 				objects[otmp->otyp].nutrition);
X! 	if (carried(otmp)) {
X! 	    freeinv(otmp);
X! 	    if(inv_cnt() >= 52)
X! 		dropy(otmp);
X! 	    else
X! 		otmp = addinv(otmp); /* unlikely but a merge is possible */
X! 	}
X  	return(otmp);
X  }
X  
X***************
X*** 193,199 ****
X  do_reset_eat() {
X  
X  #ifdef DEBUG
X! 	pline("do_reset_eat...");
X  #endif
X  	victual.piece = touchfood(victual.piece);
X  	recalc_wt();
X--- 207,213 ----
X  do_reset_eat() {
X  
X  #ifdef DEBUG
X! 	debug("do_reset_eat...");
X  #endif
X  	victual.piece = touchfood(victual.piece);
X  	recalc_wt();
X***************
X*** 202,216 ****
X  	stop_occupation();
X  }
X  
X! static int
X  eatfood() {		/* called each move during eating process */
X! 
X  	if(!victual.eating) return(0);
X  	if(victual.usedtime++ < victual.reqtime) {
X  	/* You can only choke if you were satiated before you started
X  	 * eating.
X  	 */
X! 	    if(victual.canchoke && u.uhunger >= 2000) choke(victual.piece);
X  
X  	    if(victual.nmod < 0)
X  		lesshungry(-victual.nmod);
X--- 216,241 ----
X  	stop_occupation();
X  }
X  
X! #ifndef OVERLAY
X! static 
X! #endif
X! int
X  eatfood() {		/* called each move during eating process */
X! 	if(!carried(victual.piece) && !obj_here(victual.piece, u.ux, u.uy)) {
X! 		/* maybe it was stolen? */
X! 		do_reset_eat();
X! 		return(0);
X! 	}
X  	if(!victual.eating) return(0);
X  	if(victual.usedtime++ < victual.reqtime) {
X  	/* You can only choke if you were satiated before you started
X  	 * eating.
X  	 */
X! 	    if(victual.canchoke && u.uhunger >= 2000) {
X! 		choke(victual.piece);
X! 		do_reset_eat(); /* if they were lifesaved, stop eating */
X! 		return 0;
X! 	    }
X  
X  	    if(victual.nmod < 0)
X  		lesshungry(-victual.nmod);
X***************
X*** 218,240 ****
X  		lesshungry(1);
X  
X  	    if(victual.doreset) do_reset_eat();
X  	    return 1;	/* still busy */
X  	} else {	/* done */
X! 
X! 	    register int tp;
X  
X  	    if(victual.piece->otyp == CORPSE)
X! 		tp = cpostfx(victual.piece->corpsenm);
X  	    else
X! 		tp = fpostfx(victual.piece);
X! 
X! 	    You("finish eating the %s.", singular(victual.piece));
X  
X! 	    useup(victual.piece);
X  	    victual.piece = (struct obj *) 0;
X  	    victual.fullwarn = victual.eating = victual.doreset = 
X  		victual.canchoke = FALSE;
X! 	    return(tp);
X  	}
X  }
X  
X--- 243,283 ----
X  		lesshungry(1);
X  
X  	    if(victual.doreset) do_reset_eat();
X+ 	    else {
X+ 		/* We have to calculate this every move--sometimes the thing
X+ 		 * which interrupts eating also needs to know the state of your
X+ 		 * food, so it's no good to recalculate the state of your food
X+ 		 * only after you stopped eating.  Currently, the only meal-
X+ 		 * interruptor which needs to know it is troll revivication,
X+ 		 * and it only needs to know oeaten and the weight.
X+ 		 */
X+ 		if (victual.nmod < 0)
X+ 			victual.piece->oeaten -= -victual.nmod;
X+ 		else if (victual.nmod > 0 && (victual.usedtime % victual.nmod))
X+ 			victual.piece->oeaten--;
X+ 		recalc_wt();
X+ 	    }
X  	    return 1;	/* still busy */
X  	} else {	/* done */
X! #ifndef NO_SIGNAL
X! 	    victual.piece->in_use = TRUE;
X! #endif
X! 	    if (nomovemsg) {
X! 		pline(nomovemsg);
X! 		nomovemsg = 0;
X! 	    } else You("finish eating the %s.", singular(victual.piece, xname));
X  
X  	    if(victual.piece->otyp == CORPSE)
X! 		cpostfx(victual.piece->corpsenm);
X  	    else
X! 		fpostfx(victual.piece);
X  
X! 	    if (carried(victual.piece)) useup(victual.piece);
X! 	    else useupf(victual.piece);
X  	    victual.piece = (struct obj *) 0;
X  	    victual.fullwarn = victual.eating = victual.doreset = 
X  		victual.canchoke = FALSE;
X! 	    return(0);
X  	}
X  }
X  
X***************
X*** 243,249 ****
X  register int pm;
X  {
X  	if ((pl_character[0]=='E') ? is_elf(&mons[pm]) : is_human(&mons[pm])) {
X! 		You("cannibal!  You will be sorry for this!");
X  		Aggravate_monster |= INTRINSIC;
X  	}
X  
X--- 286,292 ----
X  register int pm;
X  {
X  	if ((pl_character[0]=='E') ? is_elf(&mons[pm]) : is_human(&mons[pm])) {
X! 		You("cannibal!	You will regret this!");
X  		Aggravate_monster |= INTRINSIC;
X  	}
X  
X***************
X*** 270,275 ****
X--- 313,325 ----
X  #ifdef POLYSELF
X  		}
X  		break;
X+ 	    case PM_LIZARD:
X+ 		/* Relief from cockatrices -dgk */
X+ 		if (Stoned) {
X+ 			Stoned = 0;
X+ 			You("feel limber!");
X+ 		}
X+ 		break;
X  	    default:
X  
X  		if(dmgtype(&mons[pm], AD_ACID) && Stoned) {
X***************
X*** 281,291 ****
X  	return;
X  }
X  
X! static int
X  cpostfx(pm)		/* called after completely consuming a corpse */
X  register int pm;
X  {
X! 	register int tmp = 0, tp = 0;
X  
X  	switch(pm) {
X  	    case PM_WRAITH:
X--- 331,341 ----
X  	return;
X  }
X  
X! static void
X  cpostfx(pm)		/* called after completely consuming a corpse */
X  register int pm;
X  {
X! 	register int tmp = 0;
X  
X  	switch(pm) {
X  	    case PM_WRAITH:
X***************
X*** 334,342 ****
X  	    case PM_SMALL_MIMIC:
X  		tmp += 20;
X  		if(u.usym == S_HUMAN) {
X! 		    You("cannot resist the temptation to mimic a treasure chest.");
X! 		    nomul(tmp);
X! 		    tp++;
X  		    afternmv = Meatdone;
X  		    if (pl_character[0]=='E')
X  			nomovemsg = "You now again prefer mimicking an elf.";
X--- 384,391 ----
X  	    case PM_SMALL_MIMIC:
X  		tmp += 20;
X  		if(u.usym == S_HUMAN) {
X! 		    You("cannot resist the temptation to mimic a pile of gold.");
X! 		    nomul(-tmp);
X  		    afternmv = Meatdone;
X  		    if (pl_character[0]=='E')
X  			nomovemsg = "You now again prefer mimicking an elf.";
X***************
X*** 363,368 ****
X--- 412,421 ----
X  			You("seem faster.");
X  		}
X  		break;
X+ 	    case PM_LIZARD:
X+ 		if (HStun > 2)  make_stunned(2L,FALSE);
X+ 		if (HConfusion > 2)  make_confused(2L,FALSE);
X+ 		break;
X  #ifdef POLYSELF
X  	    case PM_CHAMELEON:
X  		You("feel a change coming over you.");
X***************
X*** 427,440 ****
X  	    }
X  	    break;
X  	}
X! 	return(tp);
X  }
X  
X! static int
X! opentin() {		/* called during each move whilst opening a tin */
X  	register int r;
X  
X! 	if(!carried(tin.tin))		/* perhaps it was stolen? */
X  		return(0);		/* %% probably we should use tinoid */
X  	if(tin.usedtime++ >= 50) {
X  		You("give up your attempt to open the tin.");
X--- 480,498 ----
X  	    }
X  	    break;
X  	}
X! 	return;
X  }
X  
X! #ifndef OVERLAY
X! static 
X! #endif
X! int
X! opentin()		/* called during each move whilst opening a tin */
X! {
X  	register int r;
X  
X! 	if(!carried(tin.tin) && !obj_here(tin.tin, u.ux, u.uy))
X! 					/* perhaps it was stolen? */
X  		return(0);		/* %% probably we should use tinoid */
X  	if(tin.usedtime++ >= 50) {
X  		You("give up your attempt to open the tin.");
X***************
X*** 444,451 ****
X  		return(1);		/* still busy */
X  	if(tin.tin->cursed && !rn2(8)) {
X  		b_trapped("tin");
X! 		useup(tin.tin);
X! 		return(0);
X  	}
X  	You("succeed in opening the tin.");
X  	if(!tin.tin->spe) {
X--- 502,508 ----
X  		return(1);		/* still busy */
X  	if(tin.tin->cursed && !rn2(8)) {
X  		b_trapped("tin");
X! 		goto use_me;
X  	}
X  	You("succeed in opening the tin.");
X  	if(!tin.tin->spe) {
X***************
X*** 452,459 ****
X  	    if(tin.tin->corpsenm == -1) {
X  		pline("It turns out to be empty.");
X  		tin.tin->dknown = tin.tin->known = TRUE;
X! 		useup(tin.tin);
X! 		return(0);
X  	    }
X  	    r = tin.tin->cursed ? 4 : rn2(TTSZ-1); /* Always rotten if cursed */
X  	    pline("It smells like %s.", makeplural(
X--- 509,515 ----
X  	    if(tin.tin->corpsenm == -1) {
X  		pline("It turns out to be empty.");
X  		tin.tin->dknown = tin.tin->known = TRUE;
X! 		goto use_me;
X  	    }
X  	    r = tin.tin->cursed ? 4 : rn2(TTSZ-1); /* Always rotten if cursed */
X  	    pline("It smells like %s.", makeplural(
X***************
X*** 461,473 ****
X  	    pline("Eat it? ");
X  	    if (yn() == 'n') {
X  		if (!Hallucination) tin.tin->dknown = tin.tin->known = TRUE;
X! 		useup(tin.tin);
X! 		return 0;
X  	    }
X  	    You("consume %s %s.", tintxts[r].txt,
X  		  mons[tin.tin->corpsenm].mname);
X  	    tin.tin->dknown = tin.tin->known = TRUE;
X! 	    cprefx(tin.tin->corpsenm); (void) cpostfx(tin.tin->corpsenm);
X  
X  	    /* check for vomiting added by GAN 01/16/87 */
X  	    if(tintxts[r].nut < 0) make_vomiting((long)rn1(15,10), FALSE);
X--- 517,529 ----
X  	    pline("Eat it? ");
X  	    if (yn() == 'n') {
X  		if (!Hallucination) tin.tin->dknown = tin.tin->known = TRUE;
X! 		if (flags.verbose) You("discard the open tin.");
X! 		goto use_me;
X  	    }
X  	    You("consume %s %s.", tintxts[r].txt,
X  		  mons[tin.tin->corpsenm].mname);
X  	    tin.tin->dknown = tin.tin->known = TRUE;
X! 	    cprefx(tin.tin->corpsenm); cpostfx(tin.tin->corpsenm);
X  
X  	    /* check for vomiting added by GAN 01/16/87 */
X  	    if(tintxts[r].nut < 0) make_vomiting((long)rn1(15,10), FALSE);
X***************
X*** 483,496 ****
X  		pline("It contains some decaying %s substance.",
X  			Hallucination ? hcolor() : green);
X  	    else
X! 		pline("It contains spinach - this makes you feel like %s!",
X! 			Hallucination ? "Swee'pea" : "Popeye");
X  
X  	    lesshungry(600);
X  	    gainstr(tin.tin, 0);
X  	}
X  	tin.tin->dknown = tin.tin->known = TRUE;
X! 	useup(tin.tin);
X  	return(0);
X  }
X  
X--- 539,564 ----
X  		pline("It contains some decaying %s substance.",
X  			Hallucination ? hcolor() : green);
X  	    else
X! 		pline("It contains spinach.");
X  
X+ 	    pline("Eat it? ");
X+ 	    if (yn() == 'n') {
X+ 		if (!Hallucination && !tin.tin->cursed)
X+ 		    tin.tin->dknown = tin.tin->known = TRUE;
X+ 		if (flags.verbose)
X+ 		    You("discard the open tin.");
X+ 		goto use_me;
X+ 	    }
X+ 	    if (!tin.tin->cursed)
X+ 		pline("This makes you feel like %s!",
X+ 		      Hallucination ? "Swee'pea" : "Popeye");
X  	    lesshungry(600);
X  	    gainstr(tin.tin, 0);
X  	}
X  	tin.tin->dknown = tin.tin->known = TRUE;
X! use_me:
X! 	if (carried(tin.tin)) useup(tin.tin);
X! 	else useupf(tin.tin);
X  	return(0);
X  }
X  
X***************
X*** 538,544 ****
X  				obj = splitobj(otmp, 1);
X  				if(otmp == uwep) setuwep(obj);
X  			}
X! 			dropx(otmp);
X  			return;
X  		}
X  		tmp = 10 + rn2(1 + 500/((int)(ACURR(A_DEX) + ACURR(A_STR))));
X--- 606,613 ----
X  				obj = splitobj(otmp, 1);
X  				if(otmp == uwep) setuwep(obj);
X  			}
X! 			if (carried(otmp)) dropx(otmp);
X! 			else stackobj(otmp);
X  			return;
X  		}
X  		tmp = 10 + rn2(1 + 500/((int)(ACURR(A_DEX) + ACURR(A_STR))));
X***************
X*** 586,602 ****
X  	register struct obj *otmp;
X  {
X  	register char *cname = mons[otmp->corpsenm].mname;
X! 	register int tp, rotted;
X  
X  	tp = 0;
X! #ifdef LINT	/* problem if more than 320K moves before try to eat */
X! 	rotted = 0;
X! #else
X! 	rotted = (monstermoves - otmp->age)/((long)(10 + rn2(20)));
X  #endif
X  
X! 	if(otmp->cursed) rotted += 2;
X! 	else if (otmp->blessed) rotted -= 2;
X  
X  	if(otmp->corpsenm != PM_ACID_BLOB && (rotted > 5)) {
X  		tp++;
X--- 655,672 ----
X  	register struct obj *otmp;
X  {
X  	register char *cname = mons[otmp->corpsenm].mname;
X! 	register int tp, rotted = 0;
X  
X  	tp = 0;
X! 
X! 	if(otmp->corpsenm != PM_LIZARD) {
X! #ifndef LINT	/* problem if more than 320K moves before try to eat */
X! 		rotted = (monstermoves - otmp->age)/((long)(10 + rn2(20)));
X  #endif
X  
X! 		if(otmp->cursed) rotted += 2;
X! 		else if (otmp->blessed) rotted -= 2;
X! 	}
X  
X  	if(otmp->corpsenm != PM_ACID_BLOB && (rotted > 5)) {
X  		tp++;
X***************
X*** 615,621 ****
X  #ifdef POLYSELF
X  		}
X  #endif
X! 		useup(otmp);
X  		return(1);
X  	} else if(poisonous(&mons[otmp->corpsenm]) && rn2(5)){
X  		tp++;
X--- 685,692 ----
X  #ifdef POLYSELF
X  		}
X  #endif
X! 		if (carried(otmp)) useup(otmp);
X! 		else useupf(otmp);
X  		return(1);
X  	} else if(poisonous(&mons[otmp->corpsenm]) && rn2(5)){
X  		tp++;
X***************
X*** 634,646 ****
X  		You("feel%s sick.", (Sick) ? " very" : "");
X  		losehp(rnd(8), "cadaver");
X  	}
X! 	if(!tp && !rn2(7)) {
X  
X  	    if(rottenfood()) {
X  		(void)touchfood(otmp);
X  		return(1);
X  	    }
X! 	    victual.nutrit = (int)mons[otmp->corpsenm].cnutrit >> 2;
X  	} else {
X  #ifdef POLYSELF
X  	    pline("That %s corpse %s!", cname,
X--- 705,718 ----
X  		You("feel%s sick.", (Sick) ? " very" : "");
X  		losehp(rnd(8), "cadaver");
X  	}
X! 	if(!tp && otmp->corpsenm != PM_LIZARD && (otmp->orotten || !rn2(7))) {
X  
X  	    if(rottenfood()) {
X+ 		otmp->orotten = TRUE;
X  		(void)touchfood(otmp);
X  		return(1);
X  	    }
X! 	    otmp->oeaten >>= 2;
X  	} else {
X  #ifdef POLYSELF
X  	    pline("That %s corpse %s!", cname,
X***************
X*** 648,657 ****
X  #else
X  	    pline("That %s corpse tasted terrible!", cname);
X  #endif
X- 	    victual.nutrit = (int)mons[otmp->corpsenm].cnutrit;
X  	}
X  
X! 	/* delay is weight dependant */
X  	victual.reqtime = 3 + (mons[otmp->corpsenm].cwt >> 2);
X  	return(0);
X  }
X--- 720,728 ----
X  #else
X  	    pline("That %s corpse tasted terrible!", cname);
X  #endif
X  	}
X  
X! 	/* delay is weight dependent */
X  	victual.reqtime = 3 + (mons[otmp->corpsenm].cwt >> 2);
X  	return(0);
X  }
X***************
X*** 661,670 ****
X  	register struct obj *otmp;
X  {
X  #ifdef DEBUG
X! 	pline("start_eating: %x (victual = %x)", otmp, victual.piece);
X! 	pline("reqtime = %d", victual.reqtime);
X! 	pline("nutrit = %d", victual.nutrit);
X! 	pline("nmod = %d", victual.nmod);
X  #endif
X  	victual.fullwarn = victual.doreset = FALSE;
X  	victual.canchoke = (u.uhs == SATIATED);
X--- 732,742 ----
X  	register struct obj *otmp;
X  {
X  #ifdef DEBUG
X! 	debug("start_eating: %lx (victual = %lx)", otmp, victual.piece);
X! 	debug("reqtime = %d", victual.reqtime);
X! 	debug("(original reqtime = %d)", objects[otmp->otyp].oc_delay);
X! 	debug("nmod = %d", victual.nmod);
X! 	debug("oeaten = %d", otmp->oeaten);
X  #endif
X  	victual.fullwarn = victual.doreset = FALSE;
X  	victual.canchoke = (u.uhs == SATIATED);
X***************
X*** 673,679 ****
X  	if (otmp->otyp == CORPSE)
X  	    cprefx(victual.piece->corpsenm);
X  
X! 	Sprintf(msgbuf, "eating the %s", singular(otmp));
X  	set_occupation(eatfood, msgbuf, 0);
X  }
X  
X--- 745,751 ----
X  	if (otmp->otyp == CORPSE)
X  	    cprefx(victual.piece->corpsenm);
X  
X! 	Sprintf(msgbuf, "eating the %s", singular(otmp, xname));
X  	set_occupation(eatfood, msgbuf, 0);
X  }
X  
X***************
X*** 711,723 ****
X  			make_vomiting((long)rn1(victual.reqtime, 10), FALSE);
X  		}
X  		break;
X- 	    case DEAD_LIZARD:
X- 		/* Relief from cockatrices -dgk */
X- 		if (Stoned) {
X- 			Stoned = 0;
X- 			You("feel limber!");
X- 		}
X- 		break;
X  #ifdef POLYSELF
X  	    case CLOVE_OF_GARLIC:
X  		if (is_undead(uasmon)) {
X--- 783,788 ----
X***************
X*** 764,770 ****
X  	}
X  }
X  
X! static int
X  fpostfx(otmp)		/* called after consuming (non-corpse) food */
X  
X  	register struct obj *otmp;
X--- 829,835 ----
X  	}
X  }
X  
X! static void
X  fpostfx(otmp)		/* called after consuming (non-corpse) food */
X  
X  	register struct obj *otmp;
X***************
X*** 780,789 ****
X  		}
X  		break;
X  #endif
X- 	    case DEAD_LIZARD:
X- 		if (HStun > 2)  make_stunned(2L,FALSE);
X- 		if (HConfusion > 2)  make_confused(2L,FALSE);
X- 		break;
X  	    case CARROT:
X  		make_blinded(0L,TRUE);
X  		break;
X--- 845,850 ----
X***************
X*** 816,837 ****
X  		}
X  		break;
X  	}
X! 	return(0);	/* must do this for sync with cpostfx() */
X  }
X  
X  int
X  doeat() {		/* generic "eat" command funtion (see cmd.c) */
X  	register struct obj *otmp;
X  
X! 	if(victual.piece &&
X! 	   (carried(victual.piece) ||
X! 	    (victual.piece->ox == u.ux && victual.piece->oy == u.uy))) {
X  
X  	    You("resume your meal.");
X  	    if(!carried(victual.piece)) {
X  		if(victual.piece->quan != 1)
X  			(void) splitobj(victual.piece, 1);
X- 		victual.piece = pick_obj(victual.piece);
X  	    }
X  	    start_eating(victual.piece);
X  	    return(1);
X--- 877,897 ----
X  		}
X  		break;
X  	}
X! 	return;
X  }
X  
X  int
X  doeat() {		/* generic "eat" command funtion (see cmd.c) */
X  	register struct obj *otmp;
X+ 	int basenutrit; 		/* nutrition of full item */
X  
X! 	if (!(otmp = floorfood("eat", 0))) return 0;
X  
X+ 	if(otmp == victual.piece) {
X  	    You("resume your meal.");
X  	    if(!carried(victual.piece)) {
X  		if(victual.piece->quan != 1)
X  			(void) splitobj(victual.piece, 1);
X  	    }
X  	    start_eating(victual.piece);
X  	    return(1);
X***************
X*** 838,845 ****
X  	}
X  
X  	/* nothing in progress - so try to find something. */
X- 	if (!(otmp = floorfood("eat", 0))) return 0;
X- 
X  	/* tins are a special case */
X  	if(otmp->otyp == TIN) {
X  	    start_tin(otmp);
X--- 898,903 ----
X***************
X*** 846,851 ****
X--- 904,912 ----
X  	    return(1);
X  	}
X  
X+ 	victual.piece = otmp = touchfood(otmp);
X+ 	victual.usedtime = 0;
X+ 
X  	/* Now we need to calculate delay and nutritional info.
X  	 * The base nutrition calculated here and in eatcorpse() accounts
X  	 * for normal vs. rotten food.  The reqtime and nutrit values are
X***************
X*** 853,888 ****
X  	 */
X  	if(otmp->otyp == CORPSE) {
X  	    if(eatcorpse(otmp)) return(1);
X! 	    /* else eatcorpse sets up reqtime and nutrit */
X  	} else {
X  	    victual.reqtime = objects[otmp->otyp].oc_delay;
X! 	    victual.nutrit = objects[otmp->otyp].nutrition;
X! 	    if (otmp->otyp != FORTUNE_COOKIE && otmp->otyp != DEAD_LIZARD &&
X  		(otmp->cursed ||
X  		 ((monstermoves - otmp->age) > otmp->blessed ? 50 : 30)) &&
X! 		!rn2(7)) {
X  
X  		if(rottenfood()) {
X! 		    (void)touchfood(otmp);
X  		    return(1);
X  		}
X! 		victual.nutrit /= 2;
X  	    } else fprefx(otmp);
X  	}
X  
X! 	victual.piece = otmp;
X! 	victual.usedtime = 0;
X! 
X! 	/* re-calc the nutrition (already set) to account for weight */
X! 	if(otmp->oeaten) {
X! 	    int baseweight = weight(otmp);	/* weight of full item */
X! 
X! 	    victual.reqtime = 
X! 		rounddiv((int)(victual.reqtime * otmp->owt), baseweight);
X! 	    victual.nutrit = 
X! 		rounddiv((int)(victual.nutrit * otmp->owt), baseweight);
X! 	}
X  
X  	/* calculate the modulo value (nutrit. units per round eating)
X  	 * note: this isn't exact - you actually lose a little nutrition
X  	 *	 due to this method.
X--- 914,948 ----
X  	 */
X  	if(otmp->otyp == CORPSE) {
X  	    if(eatcorpse(otmp)) return(1);
X! 	    /* else eatcorpse sets up reqtime and oeaten */
X  	} else {
X  	    victual.reqtime = objects[otmp->otyp].oc_delay;
X! 	    if (otmp->otyp != FORTUNE_COOKIE &&
X  		(otmp->cursed ||
X  		 ((monstermoves - otmp->age) > otmp->blessed ? 50 : 30)) &&
X! 		(otmp->orotten || !rn2(7))) {
X  
X  		if(rottenfood()) {
X! 		    otmp->orotten = TRUE;
X  		    return(1);
X  		}
X! 		otmp->oeaten /= 2;
X  	    } else fprefx(otmp);
X  	}
X  
X! 	/* re-calc the nutrition */
X! 	if (otmp->otyp == CORPSE) basenutrit = mons[otmp->corpsenm].cnutrit;
X! 	else basenutrit = objects[otmp->otyp].nutrition;
X  
X+ #ifdef DEBUG
X+ 	debug("before rounddiv: victual.reqtime == %d", victual.reqtime);
X+ 	debug("oeaten == %d, basenutrit == %d", otmp->oeaten, basenutrit);
X+ #endif
X+ 	victual.reqtime = (basenutrit == 0 ? 0 :
X+ 	  (int)rounddiv(victual.reqtime * (long)otmp->oeaten,(long)basenutrit));
X+ #ifdef DEBUG
X+ 	debug("after rounddiv: victual.reqtime == %d", victual.reqtime);
X+ #endif
X  	/* calculate the modulo value (nutrit. units per round eating)
X  	 * note: this isn't exact - you actually lose a little nutrition
X  	 *	 due to this method.
X***************
X*** 889,901 ****
X  	 * TODO: add in a "remainder" value to be given at the end of the
X  	 *	 meal.
X  	 */
X! 	if(victual.nutrit == 0 || victual.reqtime == 0)
X  	    /* possible if most has been eaten before */
X  	    victual.nmod = 0;
X! 	else if(victual.nutrit > victual.reqtime)
X! 	    victual.nmod = -(victual.nutrit / victual.reqtime);
X  	else
X! 	    victual.nmod = victual.reqtime % victual.nutrit;
X  
X  	start_eating(otmp);
X  	return(1);
X--- 949,961 ----
X  	 * TODO: add in a "remainder" value to be given at the end of the
X  	 *	 meal.
X  	 */
X! 	if(victual.reqtime == 0)
X  	    /* possible if most has been eaten before */
X  	    victual.nmod = 0;
X! 	else if (otmp->oeaten > victual.reqtime)
X! 	    victual.nmod = -(otmp->oeaten / victual.reqtime);
X  	else
X! 	    victual.nmod = victual.reqtime % otmp->oeaten;
X  
X  	start_eating(otmp);
X  	return(1);
X***************
X*** 938,949 ****
X  register int num;
X  {
X  #ifdef DEBUG
X! 	pline("lesshungry(%d)", num);
X  #endif
X  	u.uhunger += num;
X  	if(u.uhunger >= 2000) {
X! 	    if (!victual.eating || victual.canchoke)
X  		choke((struct obj *) 0);
X  	} else {
X  	    /* Have lesshungry() report when you're nearly full so all eating
X  	     * warns when you're about to choke.
X--- 998,1011 ----
X  register int num;
X  {
X  #ifdef DEBUG
X! 	debug("lesshungry(%d)", num);
X  #endif
X  	u.uhunger += num;
X  	if(u.uhunger >= 2000) {
X! 	    if (!victual.eating || victual.canchoke) {
X  		choke((struct obj *) 0);
X+ 		reset_eat(); /* stop eating if they were lifesaved */
X+ 	    }
X  	} else {
X  	    /* Have lesshungry() report when you're nearly full so all eating
X  	     * warns when you're about to choke.
X***************
X*** 957,963 ****
X  		else {
X  		    victual.fullwarn = TRUE;
X  		    if (victual.canchoke) {
X! 			pline("Stop eating?");
X  			if(yn() == 'y') reset_eat();
X  		    }
X  		}
X--- 1019,1025 ----
X  		else {
X  		    victual.fullwarn = TRUE;
X  		    if (victual.canchoke) {
X! 			pline("Stop eating? ");
X  			if(yn() == 'y') reset_eat();
X  		    }
X  		}
X***************
X*** 967,973 ****
X  	newuhs(FALSE);
X  }
X  
X! static int
X  unfaint() {
X  	(void) Hear_again();
X  	u.uhs = FAINTING;
X--- 1029,1038 ----
X  	newuhs(FALSE);
X  }
X  
X! #ifndef OVERLAY
X! static 
X! #endif
X! int
X  unfaint() {
X  	(void) Hear_again();
X  	u.uhs = FAINTING;
X***************
X*** 1045,1050 ****
X--- 1110,1118 ----
X  	}
X  }
X  
X+ /* Returns an object representing food.  Object may be either on floor or
X+  * in inventory.
X+  */
X  struct obj *
X  floorfood(verb,corpseonly)	/* get food from floor or pack */
X  	char *verb;
X***************
X*** 1060,1070 ****
X  				(otmp->quan == 1) ? "is" : "are",
X  				doname(otmp), verb,
X  				(otmp->quan == 1) ? "it" : "one");
X! 			if(yn() == 'y') {
X! 				if(otmp->quan != 1)
X! 					(void) splitobj(otmp, 1);
X! 				return(pick_obj(otmp));
X! 			}
X  		}
X  	    }
X  	}
X--- 1128,1135 ----
X  				(otmp->quan == 1) ? "is" : "are",
X  				doname(otmp), verb,
X  				(otmp->quan == 1) ? "it" : "one");
X! 			if(yn() == 'y')
X! 				return(otmp);
X  		}
X  	    }
X  	}
X***************
X*** 1078,1081 ****
X--- 1143,1158 ----
X  vomit() {		/* A good idea from David Neves */
X  	make_sick(0L,TRUE);
X  	nomul(-2);
X+ }
X+ 
X+ int
X+ eaten_stat(base, obj)
X+ register int base;
X+ register struct obj *obj;
X+ {
X+ 	base *= obj->oeaten;
X+ 
X+ 	if (obj->otyp == CORPSE) base /= mons[obj->corpsenm].cnutrit;
X+ 	else base /= objects[obj->otyp].nutrition;
X+ 	return (base < 1) ? 1 : base;
X  }
X*** src/Old/end.c	Sun Nov 19 12:39:59 1989
X--- src/end.c	Sun Nov  5 16:15:57 1989
X***************
X*** 15,21 ****
X  
X  void end_box_display();
X  
X! static const char *deaths[] = { 	/* the array of death */
X  	"died", "choked", "poisoned", "starvation", "drowning",
X  	"burning", "crushed", "turned to stone", "genocided",
X  	"panic", "trickery",
X--- 15,21 ----
X  
X  void end_box_display();
X  
X! static const char *deaths[] = {		/* the array of death */
X  	"died", "choked", "poisoned", "starvation", "drowning",
X  	"burning", "crushed", "turned to stone", "genocided",
X  	"panic", "trickery",
X***************
X*** 44,50 ****
X  		return 0;
X  	}
X  	return done2();
X! } 
X  
X  int
X  done2()
X--- 44,50 ----
X  		return 0;
X  	}
X  	return done2();
X! }
X  
X  int
X  done2()
X***************
X*** 198,204 ****
X  	Vprintf(str,VA_ARGS);
X  	more();				/* contains a fflush() */
X  #if defined(WIZARD) && (defined(UNIX) || defined(VMS))
X! 	if (wizard)	
X  # ifdef SYSV
X  		(void)
X  # endif
X--- 198,204 ----
X  	Vprintf(str,VA_ARGS);
X  	more();				/* contains a fflush() */
X  #if defined(WIZARD) && (defined(UNIX) || defined(VMS))
X! 	if (wizard)
X  # ifdef SYSV
X  		(void)
X  # endif
X***************
X*** 243,254 ****
X  		      !Blind ? "begins to glow" : "feels warm");
X  		You("feel much better!");
X  		pline("The medallion crumbles to dust!");
X! 		if (uamul)	/* Huss:  Check if amulet really is worn */
X! 			useup(uamul);
X! 		else if (uwep && uwep->otyp == AMULET_OF_LIFE_SAVING)
X! 			useup(uwep);	/* Oops, he must be wielding it. */
X! 		else
X! 			impossible("Using an amulet without having it?");
X  		if (u.uhunger < 500) u.uhunger = 500;
X  		nomovemsg = "You survived that attempt on your life.";
X  		curs_on_u();
X--- 243,249 ----
X  		      !Blind ? "begins to glow" : "feels warm");
X  		You("feel much better!");
X  		pline("The medallion crumbles to dust!");
X! 		useup(uamul);
X  		if (u.uhunger < 500) u.uhunger = 500;
X  		nomovemsg = "You survived that attempt on your life.";
X  		curs_on_u();
X***************
X*** 367,373 ****
X  	if(!done_stopprint)
X  	    Printf("Goodbye %s the %s...\n\n", buf2,
X  #ifdef ENDGAME
X! 		   how != ASCENDED ? pl_character : 
X  		   flags.female ? "Demigoddess" : "Demigod");
X  #else
X  		   pl_character);
X--- 362,368 ----
X  	if(!done_stopprint)
X  	    Printf("Goodbye %s the %s...\n\n", buf2,
X  #ifdef ENDGAME
X! 		   how != ASCENDED ? pl_character :
X  		   flags.female ? "Demigoddess" : "Demigod");
X  #else
X  		   pl_character);
X***************
X*** 441,447 ****
X  				    doname(otmp), i);
X  			} else if(otmp->olet == AMULET_SYM) {
X  				otmp->known = 1;
X! 				i = (otmp->spe < 0) ? 2 : 
X  					otmp->otyp == AMULET_OF_YENDOR ?
X  							5000 : 500;
X  				u.urexp += i;
X--- 436,442 ----
X  				    doname(otmp), i);
X  			} else if(otmp->olet == AMULET_SYM) {
X  				otmp->known = 1;
X! 				i = (otmp->spe < 0) ? 2 :
X  					otmp->otyp == AMULET_OF_YENDOR ?
X  							5000 : 500;
X  				u.urexp += i;
X***************
X*** 459,465 ****
X  		    if (how != ASCENDED) {
X  			if(dlevel == ENDLEVEL)
X  			     Printf("in the endgame ");
X! 		    	else Printf("on dungeon level %d ", dlevel);
X  		    }
X  #else
X  		    Printf("on dungeon level %d ", dlevel);
X--- 454,460 ----
X  		    if (how != ASCENDED) {
X  			if(dlevel == ENDLEVEL)
X  			     Printf("in the endgame ");
X! 			else Printf("on dungeon level %d ", dlevel);
X  		    }
X  #else
X  		    Printf("on dungeon level %d ", dlevel);
X***************
X*** 498,505 ****
X  	if (ramdisk)
X  		eraseall(permbones, alllevels);
X  #else
X! # if defined(UNIX) || (defined(MSDOS) && !defined(OLD_TOS)) || defined(VMS) \
X! 							|| defined(MACOS)
X  	register int x;
X  #  if defined(UNIX) || defined(VMS)
X  	(void) signal(SIGHUP,SIG_IGN);
X--- 493,499 ----
X  	if (ramdisk)
X  		eraseall(permbones, alllevels);
X  #else
X! # if defined(UNIX) || (defined(MSDOS) && !defined(OLD_TOS)) || defined(VMS) || defined(MACOS)
X  	register int x;
X  #  if defined(UNIX) || defined(VMS)
X  	(void) signal(SIGHUP,SIG_IGN);
X***************
X*** 528,534 ****
X  end_box_display()
X  {
X  	register struct obj *box, *obj;
X- 	int boxcnt = 0;
X  	char buf[BUFSZ];
X  
X  	for(box=invent; box; box=box->nobj) {
X--- 522,527 ----
X***************
X*** 539,548 ****
X  		    if (obj->cobj == box) {
X  			if (!cnt) {
X  			    Sprintf(buf, "Contents of the %s:",xname(box));
X! 			    if (!boxcnt)
X! 				cornline(0, buf);
X! 			    else
X! 				cornline(1, buf);
X  			}
X  			makeknown(obj->otyp);
X  			obj->known = obj->bknown = obj->dknown = 1;
X--- 532,538 ----
X  		    if (obj->cobj == box) {
X  			if (!cnt) {
X  			    Sprintf(buf, "Contents of the %s:",xname(box));
X! 			    cornline(0, buf);
X  			}
X  			makeknown(obj->otyp);
X  			obj->known = obj->bknown = obj->dknown = 1;
X***************
X*** 551,565 ****
X  		    }
X  		}
X  		if (!cnt) {
X! 		    Sprintf(buf, "The %s is empty.", xname(box));
X! 		    if (!boxcnt)
X! 			cornline(0, buf);
X! 		    else
X! 			cornline(1, buf);
X! 		} else
X! 		    cornline(1," ");
X! 		boxcnt++;
X  	    }
X  	}
X- 	if (boxcnt) cornline(2,"");
X  }
X--- 541,549 ----
X  		    }
X  		}
X  		if (!cnt) {
X! 		    pline("The %s is empty.", xname(box));
X! 		    more();
X! 		} else cornline(2,"");
X  	    }
X  	}
X  }
X*** src/Old/engrave.c	Sun Nov 19 12:40:26 1989
X--- src/engrave.c	Fri Nov 17 19:31:37 1989
X***************
X*** 1,4 ****
X! /*	SCCS Id: @(#)engrave.c	3.0	89/06/12
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X--- 1,4 ----
X! /*	SCCS Id: @(#)engrave.c	3.0	89/11/15
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X***************
X*** 11,24 ****
X  	unsigned engr_lth;	/* for save & restore; not length of text */
X  	long engr_time;	/* moment engraving was (will be) finished */
X  	xchar engr_type;
X! #define	DUST	1
X! #define	ENGRAVE	2
X! #define	BURN	3
X  #define MARK	4
X  #define POLY	5	/* temporary type - for polymorphing engraving */
X  } *head_engr;
X  
X! static void del_engr P((struct engr *));
X  
X  /* random engravings */
X  const char *random_engr[] =
X--- 11,24 ----
X  	unsigned engr_lth;	/* for save & restore; not length of text */
X  	long engr_time;	/* moment engraving was (will be) finished */
X  	xchar engr_type;
X! #define DUST	1
X! #define ENGRAVE	2
X! #define BURN	3
X  #define MARK	4
X  #define POLY	5	/* temporary type - for polymorphing engraving */
X  } *head_engr;
X  
X! static void FDECL(del_engr, (struct engr *));
X  
X  /* random engravings */
X  const char *random_engr[] =
END_OF_FILE
if test 55539 -ne `wc -c <'patches06f'`; then
    echo shar: \"'patches06f'\" unpacked with wrong size!
fi
# end of 'patches06f'
fi
echo shar: End of archive 3 \(of 15\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 15 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