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

billr@saab.CNA.TEK.COM (Bill Randle) (10/18/89)

Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 8, Issue 51
Archive-name: NetHack3/Patch5d
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 4 (of 6)."
# Contents:  patches05d
# Wrapped by billr@saab on Tue Oct 17 13:16:44 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patches05d' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patches05d'\"
else
echo shar: Extracting \"'patches05d'\" \(56241 characters\)
sed "s/^X//" >'patches05d' <<'END_OF_FILE'
X*** src/Old/allmain.c	Sun Oct 15 18:28:13 1989
X--- src/allmain.c	Sat Oct 14 21:51:34 1989
X***************
X*** 22,27 ****
X--- 22,47 ----
X  #endif
X  
X  	for(;;) {
X+ #ifdef MACOS
X+ 	if (!(moves % 20)) {
X+ 		UnloadSeg(doapply);
X+ 		UnloadSeg(initedog);
X+ 		UnloadSeg(doeat);
X+ 		UnloadSeg(doengrave);
X+ 		UnloadSeg(doopen);
X+ 		UnloadSeg(mattacku);
X+ 		UnloadSeg(mklev);
X+ 		UnloadSeg(attacktype);
X+ 		UnloadSeg(dohelp);
X+ 		UnloadSeg(dopray);
X+ 		UnloadSeg(dorecover);
X+ 		UnloadSeg(timeout);
X+ 		UnloadSeg(setworn);
X+ 		UnloadSeg(initterm);
X+ 		UnloadSeg(done);
X+ 		UnloadSeg(savebones);
X+ 	}
X+ #endif
X  		if(flags.move) {	/* actual time passed */
X  
X  #ifdef SOUNDS
X***************
X*** 149,160 ****
X  					pushch(ch);
X  # endif /* REDO */
X  			}
X! 			if(abort || monster_nearby())
X  #else
X! 			if(monster_nearby())
X  #endif
X  				stop_occupation();
X! 			else if ((*occupation)() == 0)
X  				occupation = 0;
X  #ifdef MSDOS
X  			if (!(++occtime % 7))
X--- 169,181 ----
X  					pushch(ch);
X  # endif /* REDO */
X  			}
X! 			if(abort || monster_nearby()) {
X  #else
X! 			if(monster_nearby()) {
X  #endif
X  				stop_occupation();
X! 				reset_eat();
X! 			} else if ((*occupation)() == 0)
X  				occupation = 0;
X  #ifdef MSDOS
X  			if (!(++occtime % 7))
X*** src/Old/apply.c	Sun Oct 15 18:28:44 1989
X--- src/apply.c	Sat Oct 14 19:20:37 1989
X***************
X*** 601,607 ****
X  				u.utraptype = 0;
X  			    }
X  			    unsee();
X! 			    goto_level(dlevel+1, FALSE);
X  #ifdef WALKIES
X  			}
X  #endif
X--- 601,607 ----
X  				u.utraptype = 0;
X  			    }
X  			    unsee();
X! 			    goto_level(dlevel+1, FALSE, TRUE);
X  #ifdef WALKIES
X  			}
X  #endif
X***************
X*** 1111,1116 ****
X--- 1111,1120 ----
X  	 * moves, we've got to deal with decaying corpses...
X  	 */
X  	if (!(corpse = floorfood("can", 1))) return;
X+ 	if (corpse->oeaten) {
X+ 		pline("You cannot tin something which is partly eaten.");
X+ 		return;
X+ 	}
X  	if ((corpse->corpsenm == PM_COCKATRICE)
X  #ifdef POLYSELF
X  		&& !resists_ston(uasmon)
X*** src/Old/bones.c	Sun Oct 15 18:29:52 1989
X--- src/bones.c	Sat Oct 14 21:54:44 1989
X***************
X*** 230,236 ****
X--- 230,258 ----
X  #ifdef MSDOS
X  	fd = open(bones, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK);
X  #else
X+ # ifdef MACOS
X+ 	{
X+ 		Str255	fileName;
X+ 		OSErr	er;
X+ 		struct term_info	*t;
X+ 		extern WindowPtr	HackWindow;
X+ 		short	oldvolume;
X+ 		
X+ 		t = (term_info *)GetWRefCon(HackWindow);
X+ 		(void)GetVol(&fileName,&oldvolume);
X+ 		(void)SetVol(0L, t->system.sysVRefNum);
X+ 		fileName[0] = (uchar)strlen(bones);
X+ 		(void)strcpy((char *)&fileName[1],bones);
X+ 		
X+ 		if (er = Create(&fileName,0,CREATOR,BONES_TYPE))
X+ 			SysBeep(1);
X+ 		fd = open(bones,
X+ 			O_WRONLY | O_BINARY | O_TRUNC | ((er) ? O_CREAT : 0));
X+ 		(void)SetVol(0L, oldvolume);
X+ 	}
X+ # else
X  	fd = creat(bones, FCMASK);
X+ # endif /* MACOS */
X  #endif
X  	if(fd < 0) {
X  #ifdef WIZARD
X*** src/Old/decl.c	Sun Oct 15 18:30:46 1989
X--- src/decl.c	Sun Oct 15 12:05:32 1989
X***************
X*** 60,66 ****
X--- 60,70 ----
X  #  endif
X  #endif
X  
X+ #ifdef SMALLDATA
X+ char *occtxt = 0;
X+ #else
X  char *occtxt = DUMMY;
X+ #endif
X  const char quitchars[] = " \r\n\033";
X  const char vowels[] = "aeiouAEIOU";
X  const char ynchars[] = "yn";
X***************
X*** 67,80 ****
X  const char ynqchars[] = "ynq";
X  const char ynaqchars[] = "ynaq";
X  const char nyaqchars[] = "nyaq";
X  char *HI = DUMMY, *HE = DUMMY, *AS = DUMMY, *AE = DUMMY, *CD = DUMMY;
X  	/* set up in termcap.c */
X  int CO = 0, LI = 0;	/* set up in termcap.c: usually COLNO and ROWNO+3 */
X  
X  #ifdef TEXTCOLOR
X  char *hilites[MAXCOLORS];	/* terminal escapes for the various colors */
X  #endif
X- 
X  #ifdef MSDOS
X  char hackdir[PATHLEN];		/* where rumors, help, record are */
X  const char *configfile = "NetHack.cnf";	/* read by read_config_file() */
X--- 71,89 ----
X  const char ynqchars[] = "ynq";
X  const char ynaqchars[] = "ynaq";
X  const char nyaqchars[] = "nyaq";
X+ 
X+ #ifdef SMALLDATA
X+ char *HI = 0, *HE = 0, *AS = 0, *AE = 0, *CD = 0;
X+ 	/* set up in termcap.c */
X+ #else
X  char *HI = DUMMY, *HE = DUMMY, *AS = DUMMY, *AE = DUMMY, *CD = DUMMY;
X  	/* set up in termcap.c */
X+ #endif
X  int CO = 0, LI = 0;	/* set up in termcap.c: usually COLNO and ROWNO+3 */
X  
X  #ifdef TEXTCOLOR
X  char *hilites[MAXCOLORS];	/* terminal escapes for the various colors */
X  #endif
X  #ifdef MSDOS
X  char hackdir[PATHLEN];		/* where rumors, help, record are */
X  const char *configfile = "NetHack.cnf";	/* read by read_config_file() */
X***************
X*** 129,135 ****
X  coord doors[DOORMAX] = DUMMY;
X  
X  struct mkroom rooms[MAXNROFROOMS+1] = DUMMY;
X! level_t level;		/* level map */
X  struct trap *ftrap = 0;
X  struct gold *fgold = 0;
X  struct monst youmonst = DUMMY;	/* dummy; used as return value for boomhit */
X--- 138,144 ----
X  coord doors[DOORMAX] = DUMMY;
X  
X  struct mkroom rooms[MAXNROFROOMS+1] = DUMMY;
X! dlevel_t level;		/* level map */
X  struct trap *ftrap = 0;
X  struct gold *fgold = 0;
X  struct monst youmonst = DUMMY;	/* dummy; used as return value for boomhit */
X***************
X*** 196,202 ****
X--- 205,215 ----
X  
X  struct obj *billobjs = 0;
X  
X+ #ifdef THINK_C
X+ const char Black[] = "black";
X+ #else
X  const char black[] = "black";
X+ #endif
X  const char amber[] = "amber";
X  #ifdef THEOLOGY
X  const char golden[] = "golden";
X***************
X*** 207,213 ****
X--- 220,230 ----
X  const char silver[] = "silver";
X  const char blue[] = "blue";
X  const char purple[] = "purple";
X+ #ifdef THINK_C
X+ const char White[] = "white";
X+ #else
X  const char white[] = "white";
X+ #endif
X  
X  const char nothing_happens[] = "Nothing happens.";
X  const char thats_enough_tries[] = "That's enough tries!";
X*** src/Old/do.c	Sun Oct 15 18:31:17 1989
X--- src/do.c	Sun Oct 15 17:25:04 1989
X***************
X*** 246,265 ****
X  register char *word;
X  {
X  	if(obj->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)){
X! 		You("cannot %s something you are wearing.",word);
X  		return(FALSE);
X  	}
X  	if (obj->otyp == LOADSTONE && obj->cursed) {
X  		obj->bknown = 1;
X! 		pline("For some reason, you cannot %s the stone%s!",
X! 			word,
X! 			plur((long)obj->quan));
X  		return(FALSE);
X  	}
X  #ifdef WALKIES
X  	if (obj->otyp == LEASH && obj->leashmon != 0) {
X! 		pline ("The leash is tied around your %s.",
X! 			body_part(HAND));
X  		return(FALSE);
X  	}
X  #endif
X--- 246,268 ----
X  register char *word;
X  {
X  	if(obj->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)){
X! 	       if (*word)
X! 			You("cannot %s something you are wearing.",word);
X  		return(FALSE);
X  	}
X  	if (obj->otyp == LOADSTONE && obj->cursed) {
X  		obj->bknown = 1;
X! 		if (*word)
X! 			pline("For some reason, you cannot %s the stone%s!",
X! 				word,
X! 		      		plur((long)obj->quan));
X  		return(FALSE);
X  	}
X  #ifdef WALKIES
X  	if (obj->otyp == LEASH && obj->leashmon != 0) {
X! 	       if (*word)
X! 			pline ("The leash is tied around your %s.",
X! 					body_part(HAND));
X  		return(FALSE);
X  	}
X  #endif
X***************
X*** 412,418 ****
X  #endif
X  		if (trap)
X  			pline("You jump into the trapdoor...");
X! 		goto_level(dlevel+1, !trap);
X  #ifdef STRONGHOLD
X  		at_ladder = FALSE;
X  #endif
X--- 415,421 ----
X  #endif
X  		if (trap)
X  			pline("You jump into the trapdoor...");
X! 		goto_level(dlevel+1, !trap, TRUE);
X  #ifdef STRONGHOLD
X  		at_ladder = FALSE;
X  #endif
X***************
X*** 473,482 ****
X  		if (levl[u.ux][u.uy].typ == LADDER) at_ladder = TRUE;
X  		goto_level(dlevel-1, 
X  		    (dlevel-1 < stronghold_level || (at_ladder && 
X! 		       dlevel-1 >= tower_level && dlevel-1 < tower_level+2)));
X  		at_ladder = FALSE;
X  #else
X! 		goto_level(dlevel-1, (dlevel-1 <= medusa_level));
X  #endif
X  #ifdef WALKIES
X  	}
X--- 476,486 ----
X  		if (levl[u.ux][u.uy].typ == LADDER) at_ladder = TRUE;
X  		goto_level(dlevel-1, 
X  		    (dlevel-1 < stronghold_level || (at_ladder && 
X! 		       dlevel-1 >= tower_level && dlevel-1 < tower_level+2)),
X! 			   FALSE);
X  		at_ladder = FALSE;
X  #else
X! 		goto_level(dlevel-1, (dlevel-1 <= medusa_level), FALSE);
X  #endif
X  #ifdef WALKIES
X  	}
X***************
X*** 484,496 ****
X  	return(1);
X  }
X  
X  void
X! goto_level(newlevel, at_stairs)
X  register int newlevel;
X! register boolean at_stairs;
X  {
X  	register int fd;
X  	register boolean up = (newlevel < dlevel);
X  
X  #ifdef ENDGAME
X  	if(dlevel == ENDLEVEL) return;	/* To be on the safe side.. */
X--- 488,569 ----
X  	return(1);
X  }
X  
X+ 
X+ static void
X+ litter()
X+ {
X+ 	struct obj *otmp = invent, *nextobj;
X+ 	int capacity = weight_cap();
X+ 
X+ 	while (otmp) {
X+ 		nextobj = otmp->nobj;
X+ 		if ((otmp != uball) && (rnd(capacity) <= otmp->owt)) {
X+ 			if (otmp == uwep)
X+ 				setuwep((struct obj *)0);
X+ 			if ((otmp != uwep) && (canletgo(otmp, ""))) {
X+ 				Your("%s left behind on the stairs.",
X+ 				     aobjnam(otmp, "get"));
X+ 				dropx(otmp);
X+ 			}
X+ 		}
X+ 		otmp = nextobj;
X+ 	}
X+ }
X+ 
X+ boolean
X+ drag_down()
X+ {
X+ 	boolean forward;
X+ 	uchar dragchance = 3;
X+ 
X+ 
X+ 	/* 
X+ 		Assume that the ball falls forward if:
X+ 
X+ 		a) the character is wielding it, or
X+ 		b) the character has both hands available to hold it (i.e. is 
X+ 		   not wielding any weapon), or 
X+ 		c) (perhaps) it falls forward out of his non-weapon hand
X+ 	*/
X+ 
X+ 	forward = (!(carried(uball))? 
X+ 		  FALSE : ((uwep == uball) || (!uwep))? 
X+ 			  TRUE : (boolean)(rn2(3) / 2));
X+ 
X+ 	if (carried(uball)) 
X+ 		You("lose your grip on the iron ball.");
X+ 
X+ 	if(forward) {
X+ 		if(rn2(6)) {
X+ 			You("get dragged downstairs by the iron ball.");
X+ 			losehp(rnd(6), "iron ball accident");
X+ 			return(TRUE);
X+ 		}
X+ 	} else {
X+ 		if(rn2(2)) {
X+ 			pline("The iron ball smacks into you!");
X+ 			losehp(rnd(20), "iron ball collision");
X+ 			dragchance -= 2;
X+ 		} 
X+ 		if(dragchance >= rnd(6)) {
X+ 			You("get dragged downstairs by the iron ball.");
X+ 			losehp(rnd(3), "iron ball accident");
X+ 			return(TRUE);
X+ 		}
X+ 	}
X+ 	return(FALSE);
X+ }
X+ 
X  void
X! goto_level(newlevel, at_stairs, falling)
X  register int newlevel;
X! register boolean at_stairs, falling;
X  {
X  	register int fd;
X  	register boolean up = (newlevel < dlevel);
X+ 	boolean stair_fall = (at_stairs && !up && ((inv_weight() + 5 > 0) || 
X+ 						  Punished || Fumbling));
X+ 	boolean stair_drag = FALSE;
X  
X  #ifdef ENDGAME
X  	if(dlevel == ENDLEVEL) return;	/* To be on the safe side.. */
X***************
X*** 560,566 ****
X--- 633,663 ----
X  	 */
X  	fd = open(lock, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FCMASK);
X  #else
X+ # ifdef MACOS
X+ 	{
X+ 		Str255	fileName;
X+ 		OSErr	er;
X+ 		short	refNum;
X+ 		struct term_info	*t;
X+ 		extern WindowPtr	HackWindow;
X+ 		
X+ 		t = (term_info *)GetWRefCon(HackWindow);
X+ 		fileName[0] = (char)strlen(lock);
X+ 		(void)Strcpy((char *)&fileName[1],lock);
X+ 		if (FSOpen(fileName, t->system.sysVRefNum, &refNum)) {
X+ 				if (er = Create(&fileName,t->system.sysVRefNum,
X+ 							CREATOR,LEVEL_TYPE))
X+ 					SysBeep(1);
X+ 		} else {
X+ 			(void)SetEOF(refNum,0L);
X+ 			(void)FSClose(refNum);
X+ 		}
X+ 		SetVol(0L,t->system.sysVRefNum);
X+ 		fd = open(lock,O_WRONLY | O_BINARY | ((er) ? O_CREAT : 0));
X+ 	}
X+ # else
X  	fd = creat(lock, FCMASK);
X+ # endif /* MACOS */
X  #endif
X  	if(fd < 0) {
X  		/*
X***************
X*** 592,597 ****
X--- 689,702 ----
X  	}
X  #endif
X  	if(Punished) unplacebc();
X+ 	if (stair_fall) {
X+ #ifdef STRONGHOLD
X+ 			You("fall down the %s.",
X+ 			    !at_ladder ? "stairs" : "ladder");
X+ #else
X+ 		You("fall down the stairs.");
X+ #endif
X+ 	}
X  	u.utrap = 0;				/* needed in level_tele */
X  	u.ustuck = 0;				/* idem */
X  	keepdogs();
X***************
X*** 646,652 ****
X  		if (fileinfo[dlevel].where != ACTIVE)
X  			swapin_file(dlevel);
X  #endif
X! #if defined(MSDOS) && !defined(TOS)
X  		if((fd = open(lock, O_RDONLY | O_BINARY)) < 0) {
X  #else
X  		if((fd = open(lock,0)) < 0) {
X--- 751,757 ----
X  		if (fileinfo[dlevel].where != ACTIVE)
X  			swapin_file(dlevel);
X  #endif
X! #if (defined(MSDOS) && !defined(TOS)) || defined(MACOS)
X  		if((fd = open(lock, O_RDONLY | O_BINARY)) < 0) {
X  #else
X  		if((fd = open(lock,0)) < 0) {
X***************
X*** 701,721 ****
X  		    u.uy = yupladder;
X  		}
X  #endif
X! 		if(inv_weight() + 5 > 0 || Punished || Fumbling) {
X! #ifdef STRONGHOLD
X! 			You("fall down the %s.",
X! 			      !at_ladder ? "stairs" : "ladder");
X! #else
X! 			You("fall down the stairs.");
X! #endif
X  			losehp(rnd(3), "fall");
X- 			if(Punished) {
X- 			    if(uwep != uball && rn2(3)) {
X- 				pline("... and are hit by the iron ball.");
X- 				losehp(rnd(20), "iron ball");
X- 			    }
X- 			    placebc(1);
X- 			}
X  			selftouch("Falling, you");
X  		}
X  	    }
X--- 806,824 ----
X  		    u.uy = yupladder;
X  		}
X  #endif
X! 		if(stair_fall) {
X! 			if (Punished) {
X! 				if (stair_drag)
X! 					litter();
X! 				if (carried(uball)) {
X! 					if (uwep == uball)
X! 						setuwep((struct obj *)0);
X! 					if (uwep != uball)
X! 						freeinv(uball);
X! 				}
X! 				placebc(1);
X! 			} 
X  			losehp(rnd(3), "fall");
X  			selftouch("Falling, you");
X  		}
X  	    }
X***************
X*** 743,759 ****
X  		     levl[u.ux][u.uy].typ != CORR) || MON_AT(u.ux, u.uy));
X  	    if(tryct >= 100)
X  		panic("goto_level: could not relocate player!");
X! 	    if(Punished){
X! 		if(uwep != uball && !up /* %% */ && rn2(5)){
X! 			pline("The iron ball falls on your %s.",
X! 				body_part(HEAD));
X! 			if (uarmh)
X! 				Your("helmet doesn't help too much...");
X! 			losehp(rnd(25), "iron ball");
X  		}
X  		placebc(1);
X  	    }
X! 	    selftouch("Falling, you");
X  	}
X  	(void) inshop();
X  	initrack();
X--- 846,875 ----
X  		     levl[u.ux][u.uy].typ != CORR) || MON_AT(u.ux, u.uy));
X  	    if(tryct >= 100)
X  		panic("goto_level: could not relocate player!");
X! 	    if(Punished) {
X! 		if(falling) {
X! 			boolean gets_hit;
X! 
X! 			gets_hit = (uwep == uball)? FALSE : (boolean)rn2(5);
X! 			if (carried(uball)) {
X! 				pline("Startled, you drop the iron ball.");
X! 				if (uwep == uball)
X! 					setuwep((struct obj *)0);
X! 				if (uwep != uball)
X! 					freeinv(uball);
X! 			} 
X! 			if(gets_hit){
X! 					pline("The iron ball falls on your %s.",
X! 					body_part(HEAD));
X! 				if (uarmh)
X! 					Your("helmet doesn't help too much...");
X! 				losehp(rnd(25), "iron ball");
X! 			}
X  		}
X  		placebc(1);
X  	    }
X! 	    if(falling)
X! 		selftouch("Falling, you");
X  	}
X  	(void) inshop();
X  	initrack();
X*** src/Old/do_name.c	Sun Oct 15 18:31:51 1989
X--- src/do_name.c	Wed Oct 11 17:14:47 1989
X***************
X*** 189,196 ****
X  #endif
X  	if(lth) Strcpy(ONAME(otmp2), buf);
X  
X! 	setworn((struct obj *)0, obj->owornmask);
X! 	setworn(otmp2, otmp2->owornmask);
X  
X  	if (ininv) {
X  		/* do freeinv(obj); etc. by hand in order to preserve
X--- 189,201 ----
X  #endif
X  	if(lth) Strcpy(ONAME(otmp2), buf);
X  
X! 	if (obj->owornmask) {
X! 		/* Note: dying by burning in Hell causes problems if you
X! 		 * try doing this when owornmask isn't set.
X! 		 */
X! 		setworn((struct obj *)0, obj->owornmask);
X! 		setworn(otmp2, otmp2->owornmask);
X! 	}
X  
X  	if (ininv) {
X  		/* do freeinv(obj); etc. by hand in order to preserve
X***************
X*** 401,406 ****
X--- 406,432 ----
X  
X  	if(!strncmp(bp, "the ", 4)) bp += 4;
X  	Sprintf(buf, "the %s %s", adj, bp);
X+ 	return(buf);
X+ }
X+ 
X+ /* sometimes we don't want an article in front of definite names */
X+ 
X+ char *
X+ a2_monnam(mtmp,adj)
X+ register struct monst *mtmp;
X+ register char *adj;
X+ {
X+ 	register char *bp = mon_nam(mtmp);
X+ #ifdef LINT	/* static char buf[BUFSZ]; */
X+ 	char buf[BUFSZ];
X+ #else
X+ 	static char buf[BUFSZ];
X+ #endif
X+ 
X+ 	if(!strncmp(bp, "the ", 4))
X+ 		Sprintf(buf, "the %s %s", adj, bp+4);
X+ 	else
X+ 		Sprintf(buf, "%s %s", adj, bp);
X  	return(buf);
X  }
X  
X*** src/Old/do_wear.c	Sun Oct 15 18:32:16 1989
X--- src/do_wear.c	Thu Oct  5 16:24:40 1989
X***************
X*** 1152,1160 ****
X  #ifdef HARD
X  	boolean leftfall, rightfall;
X  
X! 	leftfall = (uleft && !uleft->cursed && (!uwep || !uwep->cursed));
X! 	rightfall = (uright && !uright->cursed && (!uwep || !uwep->cursed
X  		|| !bimanual(uwep)));
X  #else
X  #define leftfall uleft
X  #define rightfall uright
X--- 1152,1160 ----
X  #ifdef HARD
X  	boolean leftfall, rightfall;
X  
X! 	leftfall = (uleft && !uleft->cursed && (!uwep || !uwep->cursed
X  		|| !bimanual(uwep)));
X+ 	rightfall = (uright && !uright->cursed && (!uwep || !uwep->cursed));
X  #else
X  #define leftfall uleft
X  #define rightfall uright
X*** src/Old/dogmove.c	Sun Oct 15 18:33:08 1989
X--- src/dogmove.c	Wed Oct 11 18:22:36 1989
X***************
X*** 261,272 ****
X  			niy = ny;
X  			chi = i;
X  		     eatobj:
X- 			mtmp->meating =
X- 			    obj->quan * objects[obj->otyp].oc_delay;
X  			if(EDOG(mtmp)->hungrytime < moves)
X  			    EDOG(mtmp)->hungrytime = moves;
X! 			EDOG(mtmp)->hungrytime +=
X! 			    5*obj->quan * objects[obj->otyp].nutrition;
X  			mtmp->mconf = 0;
X  			if (mtmp->mtame < 20) mtmp->mtame++;
X  			if(cansee(nix,niy))
X--- 261,291 ----
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*** src/Old/eat.c	Sun Oct 15 18:34:06 1989
X--- src/eat.c	Thu Oct 12 17:45:45 1989
X***************
X*** 3,10 ****
X--- 3,15 ----
X  /* NetHack may be freely redistributed.  See license for details. */
X  
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***************
X*** 27,32 ****
X--- 32,57 ----
X  
X  static const char comestibles[] = { FOOD_SYM, 0 };
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+ 		r++;
X+ 	return divsgn*r;
X+ }
X+ 
X  void
X  init_uhunger(){
X  	u.uhunger = 900;
X***************
X*** 44,55 ****
X  #define	TTSZ	SIZE(tintxts)
X  
X  static struct {
X! 	struct obj *tin;
X! 	int usedtime, reqtime;
X  } tin;
X  
X  static int
X! Meatdone() {
X  	u.usym =
X  #ifdef POLYSELF
X  		u.mtimedone ? uasmon->mlet :
X--- 69,94 ----
X  #define	TTSZ	SIZE(tintxts)
X  
X  static struct {
X! 	struct	obj *tin;
X! 	int	usedtime, reqtime;
X  } tin;
X  
X+ static struct {
X+ 	struct	obj *piece;	/* the thing being eaten, or last thing that
X+ 				 * was partially eaten, unless that thing was
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+ 	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  		u.mtimedone ? uasmon->mlet :
X***************
X*** 59,70 ****
X  	return 0;
X  }
X  
X  static int
X! corpsefx(pm)
X  register int pm;
X  {
X- 	register int tmp = 0, tp = 0;
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--- 98,247 ----
X  	return 0;
X  }
X  
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+ 	if(u.uhs != SATIATED) return;
X+ 
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+ void
X+ reset_eat() {		/* called when eating interrupted by an event */
X+ 
X+     /* we only set a flag here - the actual reset process is done after
X+      * the round is spent eating.
X+      */
X+ 	if(victual.eating && !victual.doreset) {
X+ #ifdef DEBUG
X+ 	    pline("reset_eat...");
X+ #endif
X+ 	    victual.doreset = TRUE;
X+ 	}
X+ 	return;
X+ }
X+ 
X+ static struct obj *
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+ static void
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+ 	victual.fullwarn = victual.eating = victual.doreset = 
X+ 		victual.canchoke = FALSE;
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! 	    else if(victual.nmod > 0 && (victual.usedtime % victual.nmod))
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! static void
X! cprefx(pm)		/* called at the "first bite" of a corpse */
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*** 71,76 ****
X--- 248,293 ----
X  	}
X  
X  	switch(pm) {
X+ 	    case PM_LITTLE_DOG:
X+ 	    case PM_DOG:
X+ 	    case PM_LARGE_DOG:
X+ 	    case PM_KITTEN:
X+ 	    case PM_HOUSECAT:
X+ 	    case PM_LARGE_CAT:
X+ 		Aggravate_monster |= INTRINSIC;
X+ 		break;
X+ 	    case PM_COCKATRICE:
X+ #ifdef MEDUSA
X+ 	    case PM_MEDUSA:
X+ #endif
X+ #ifdef POLYSELF
X+ 		if(!resists_ston(uasmon)) {
X+ #endif
X+ 			killer = (char *) alloc(40);
X+ 			You("turn to stone.");
X+ 			Sprintf(killer, "%s meat", mons[pm].mname);
X+ 			done(STONING);
X+ #ifdef POLYSELF
X+ 		}
X+ 		break;
X+ 	    default:
X+ 
X+ 		if(dmgtype(&mons[pm], AD_ACID) && Stoned) {
X+ 		    pline("What a pity - you just destroyed a future piece of art!");
X+ 		    Stoned = 0;
X+ 		}
X+ #endif
X+ 	}
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  		pluslvl();
X  		break;
X***************
X*** 89,102 ****
X  		u.uhp = u.uhpmax;
X  		flags.botl = 1;
X  		break;
X- 	    case PM_LITTLE_DOG:
X- 	    case PM_DOG:
X- 	    case PM_LARGE_DOG:
X- 	    case PM_KITTEN:
X- 	    case PM_HOUSECAT:
X- 	    case PM_LARGE_CAT:
X- 		Aggravate_monster |= INTRINSIC;
X- 		break;
X  	    case PM_STALKER:
X  		if(!Invis) {
X  			HInvis = 50+rn2(100);
X--- 306,311 ----
X***************
X*** 103,109 ****
X  			if(!See_invisible)
X  				newsym(u.ux, u.uy);
X  		} else {
X! 			if (!HInvis) You("feel hidden!");
X  			HInvis |= INTRINSIC;
X  			HSee_invisible |= INTRINSIC;
X  		}
X--- 312,318 ----
X  			if(!See_invisible)
X  				newsym(u.ux, u.uy);
X  		} else {
X! 			if (!(HInvis & INTRINSIC)) You("feel hidden!");
X  			HInvis |= INTRINSIC;
X  			HSee_invisible |= INTRINSIC;
X  		}
X***************
X*** 116,137 ****
X  	    case PM_BAT:
X  		make_stunned(HStun + 30,FALSE);
X  		break;
X- 	    case PM_COCKATRICE:
X- #ifdef MEDUSA
X- 	    case PM_MEDUSA:
X- #endif
X- #ifdef POLYSELF
X- 		if(!resists_ston(uasmon)) {
X- #endif
X- 			killer = (char *) alloc(40);
X- 			You("turn to stone.");
X- 			Sprintf(killer, "%s meat",
X- 				      mons[pm].mname);
X- 			done(STONING);
X- #ifdef POLYSELF
X- 		}
X- #endif
X- 		break;
X  	    case PM_GIANT_MIMIC:
X  		tmp += 10;
X  		/* fall into next case */
X--- 325,330 ----
X***************
X*** 142,151 ****
X  		tmp += 20;
X  		if(u.usym == S_HUMAN) {
X  		    You("cannot resist the temptation to mimic a treasure chest.");
X- 		    tp++;
X  		    nomul(tmp);
X  		    afternmv = Meatdone;
X! 		    nomovemsg = "You now again prefer mimicking a human.";
X  		    u.usym = GOLD_SYM;
X  		    prme();
X  		}
X--- 335,347 ----
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! 		    else
X! 			nomovemsg = "You now again prefer mimicking a human.";
X  		    u.usym = GOLD_SYM;
X  		    prme();
X  		}
X***************
X*** 179,191 ****
X  		    pline ("Oh wow!  Great stuff!");
X  		    make_hallucinated(Hallucination + 200,FALSE);
X  		}
X- 		if(dmgtype(ptr, AD_ACID)) {
X- 		  if(Stoned) {
X- 			pline("What a pity - you just destroyed a future piece of art!");
X- 			tp++;
X- 			Stoned = 0;
X- 		  }
X- 		}
X  		if(is_giant(ptr)) gainstr((struct obj *)0, 0);
X  
X  		if(can_teleport(ptr) && ptr->mlevel > rn2(10)) {
X--- 375,380 ----
X***************
X*** 242,248 ****
X  }
X  
X  static int
X! opentin(){
X  	register int r;
X  
X  	if(!carried(tin.tin))		/* perhaps it was stolen? */
X--- 431,437 ----
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***************
X*** 278,290 ****
X  	    You("consume %s %s.", tintxts[r].txt,
X  		  mons[tin.tin->corpsenm].mname);
X  	    tin.tin->dknown = tin.tin->known = TRUE;
X! 	    (void) corpsefx(tin.tin->corpsenm);
X  	    /* check for vomiting added by GAN 01/16/87 */
X! 	    if(tintxts[r].nut < 0) {
X! 		You("vomit.");
X! 		vomit();
X! 		morehungry(-tintxts[r].nut);
X! 	    } else lesshungry(tintxts[r].nut);
X  	    if(r == 0) {			/* Deep Fried */
X  		Glib = rnd(15);
X  		pline("Eating deep fried food made your %s very slippery.",
X--- 467,478 ----
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! 	    else lesshungry(tintxts[r].nut);
X! 
X  	    if(r == 0) {			/* Deep Fried */
X  		Glib = rnd(15);
X  		pline("Eating deep fried food made your %s very slippery.",
X***************
X*** 306,327 ****
X  	return(0);
X  }
X  
X! int
X! Hear_again()
X  {
X  	flags.soundok = 1;
X  	return 0;
X  }
X  
X! static void
X! rottenfood() {
X  
X  	pline("Blecch!  Rotten food!");
X  	if(!rn2(4)) {
X  		if (Hallucination) You("feel rather trippy.");
X! 		else
X! 			You("feel rather %s.",
X! 				body_part(LIGHT_HEADED));
X  		make_confused(HConfusion + d(2,4),FALSE);
X  	} else if(!rn2(4) && !Blind) {
X  		pline("Everything suddenly goes dark.");
X--- 494,568 ----
X  	return(0);
X  }
X  
X! static void
X! start_tin(otmp)		/* called when starting to open a tin */
X! 	register struct obj *otmp;
X  {
X+ 	register int tmp;
X+ 
X+ 	if (otmp->blessed) {
X+ 		pline("The tin opens like magic!");
X+ 		tmp = 1;
X+ 	} else if(uwep) {
X+ 		switch(uwep->otyp) {
X+ 		case TIN_OPENER:
X+ 			tmp = 1;
X+ 			break;
X+ 		case DAGGER:
X+ #ifdef TOLKIEN
X+ 		case ELVEN_DAGGER:
X+ 		case ORCISH_DAGGER:
X+ #endif
X+ 		case ATHAME:
X+ #ifdef WORM
X+ 		case CRYSKNIFE:
X+ #endif
X+ 			tmp = 3;
X+ 			break;
X+ 		case PICK_AXE:
X+ 		case AXE:
X+ 			tmp = 6;
X+ 			break;
X+ 		default:
X+ 			goto no_opener;
X+ 		}
X+ 		pline("Using your %s you try to open the tin.",
X+ 			aobjnam(uwep, NULL));
X+ 	} else {
X+ no_opener:
X+ 		pline("It is not so easy to open this tin.");
X+ 		if(Glib) {
X+ 			pline("The tin slips out of your hands.");
X+ 			if(otmp->quan > 1) {
X+ 				register struct obj *obj;
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+ 	}
X+ 	tin.reqtime = tmp;
X+ 	tin.usedtime = 0;
X+ 	tin.tin = otmp;
X+ 	set_occupation(opentin, "opening the tin", 0);
X+ 	return;
X+ }
X+ 
X+ int
X+ Hear_again() {		/* called when waking up after fainting */
X  	flags.soundok = 1;
X  	return 0;
X  }
X  
X! static int
X! rottenfood() {		/* called on the "first bite" of rotten food */
X  
X  	pline("Blecch!  Rotten food!");
X  	if(!rn2(4)) {
X  		if (Hallucination) You("feel rather trippy.");
X! 		else You("feel rather %s.", body_part(LIGHT_HEADED));
X  		make_confused(HConfusion + d(2,4),FALSE);
X  	} else if(!rn2(4) && !Blind) {
X  		pline("Everything suddenly goes dark.");
X***************
X*** 335,345 ****
X  		nomul(-rnd(10));
X  		nomovemsg = "You are conscious again.";
X  		afternmv = Hear_again;
X  	}
X  }
X  
X! static void
X! eatcorpse(otmp) register struct obj *otmp; {
X  	register char *cname = mons[otmp->corpsenm].mname;
X  	register int tp, rotted;
X  
X--- 576,590 ----
X  		nomul(-rnd(10));
X  		nomovemsg = "You are conscious again.";
X  		afternmv = Hear_again;
X+ 		return(1);
X  	}
X+ 	return(0);
X  }
X  
X! static int
X! eatcorpse(otmp)		/* called when a corpse is selected as food */
X! 	register struct obj *otmp;
X! {
X  	register char *cname = mons[otmp->corpsenm].mname;
X  	register int tp, rotted;
X  
X***************
X*** 370,383 ****
X  #ifdef POLYSELF
X  		}
X  #endif
X  	} else if(poisonous(&mons[otmp->corpsenm]) && rn2(5)){
X  		pline("Ecch - that must have been poisonous!");
X  		if(!Poison_resistance) {
X  			losestr(rnd(4));
X  			losehp(rnd(15), "poisonous corpse");
X  		} else	You("seem unaffected by the poison.");
X- 		(void) corpsefx(otmp->corpsenm);
X- 		tp++;
X  	/* now any corpse left too long will make you mildly ill */
X  	} else if(((rotted > 5) || ((rotted > 3) && rn2(5)))
X  #ifdef POLYSELF
X--- 615,629 ----
X  #ifdef POLYSELF
X  		}
X  #endif
X+ 		useup(otmp);
X+ 		return(1);
X  	} else if(poisonous(&mons[otmp->corpsenm]) && rn2(5)){
X+ 		tp++;
X  		pline("Ecch - that must have been poisonous!");
X  		if(!Poison_resistance) {
X  			losestr(rnd(4));
X  			losehp(rnd(15), "poisonous corpse");
X  		} else	You("seem unaffected by the poison.");
X  	/* now any corpse left too long will make you mildly ill */
X  	} else if(((rotted > 5) || ((rotted > 3) && rn2(5)))
X  #ifdef POLYSELF
X***************
X*** 387,397 ****
X  		tp++;
X  		You("feel%s sick.", (Sick) ? " very" : "");
X  		losehp(rnd(8), "cadaver");
X! 	} else	tp = corpsefx(otmp->corpsenm);
X  	if(!tp && !rn2(7)) {
X  
X! 	    rottenfood();
X! 	    lesshungry((int)mons[otmp->corpsenm].cnutrit >> 2);
X  	} else {
X  #ifdef POLYSELF
X  	    pline("That %s corpse %s!", cname,
X--- 633,646 ----
X  		tp++;
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***************
X*** 399,689 ****
X  #else
X  	    pline("That %s corpse tasted terrible!", cname);
X  #endif
X! 	    lesshungry((int)mons[otmp->corpsenm].cnutrit);
X  	}
X  
X  	/* delay is weight dependant */
X! 	multi = -(3 + (mons[otmp->corpsenm].cwt >> 2));
X  }
X  
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! 	if(u.uhs != SATIATED) return;
X! 
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! 			int savequan = food->quan;
X! 			food->quan = 1;
X! 			killer = xname(food);
X! 			food->quan = savequan;
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- int
X- doeat() {
X- 	register struct obj *otmp;
X- 	register struct objclass *ftmp;
X- 	register int tmp;
X- 
X- 	if (!(otmp = floorfood("eat", 0))) return 0;
X  
X! 	if(otmp->otyp == TIN) {
X! 		if (otmp->blessed) {
X! 			pline("The tin opens like magic!");
X! 			tmp = 1;
X! 		} else if(uwep) {
X! 			switch(uwep->otyp) {
X! 			case TIN_OPENER:
X! 				tmp = 1;
X! 				break;
X! 			case DAGGER:
X! 			case ATHAME:
X! #ifdef WORM
X! 			case CRYSKNIFE:
X! #endif
X! 				tmp = 3;
X! 				break;
X! 			case PICK_AXE:
X! 			case AXE:
X! 				tmp = 6;
X! 				break;
X! 			default:
X! 				goto no_opener;
X! 			}
X! 			pline("Using your %s you try to open the tin.",
X! 				aobjnam(uwep, NULL));
X! 		} else {
X! 		no_opener:
X! 			pline("It is not so easy to open this tin.");
X! 			if(Glib) {
X! 				pline("The tin slips out of your hands.");
X! 				if(otmp->quan > 1) {
X! 					register struct obj *obj;
X! 					obj = splitobj(otmp, 1);
X! 					if(otmp == uwep) setuwep(obj);
X! 				}
X! 				dropx(otmp);
X! 				return(1);
X! 			}
X! 			tmp = 10 + rn2(1 + 500/((int)(ACURR(A_DEX) + ACURR(A_STR))));
X! 		}
X! 		tin.reqtime = tmp;
X! 		tin.usedtime = 0;
X! 		tin.tin = otmp;
X! 		set_occupation(opentin, "opening the tin", 0);
X! 		return(1);
X! 	}
X  
X! 	ftmp = &objects[otmp->otyp];
X! 	multi = -ftmp->oc_delay;
X! 	if(otmp->otyp == CORPSE) eatcorpse(otmp);
X! 	else {
X! 	    if (otmp->otyp != FORTUNE_COOKIE &&
X! 		otmp->otyp != DEAD_LIZARD &&
X! 		(otmp->cursed ||
X! 		 ((monstermoves - otmp->age) > otmp->blessed ? 50 : 30)) &&
X! 		  !rn2(7)) {
X  
X! 		rottenfood();
X! 		lesshungry(ftmp->nutrition >> 2);
X! 	    } else {
X! 		if(u.uhunger >= 1500) choke(otmp);
X! 
X! 		switch(otmp->otyp){
X! 		case FOOD_RATION:
X! 			if(u.uhunger <= 200)
X! 			    if (Hallucination)
X! 				pline("Oh wow, like, superior, man!");
X! 			    else
X! 				pline("That food really hit the spot!");
X! 			else if(u.uhunger <= 700)
X! 				pline("That satiated your stomach!");
X! 	/* Have lesshungry() report when you are nearly full so all eating
X! 	 * warns when you are about to choke.
X! 	 */
X! 			lesshungry(ftmp->nutrition);
X! 			if(multi < 0) nomovemsg = "You finished your meal.";
X! 			break;
X! 		case TRIPE_RATION:
X  #ifdef POLYSELF
X! 			if (carnivorous(uasmon))
X! 			    pline("That tripe ration was surprisingly good!");
X! 			else {
X  #endif
X! 			    pline("Yak - dog food!");
X! 			    more_experienced(1,0);
X! 			    flags.botl = 1;
X  #ifdef POLYSELF
X! 			}
X! #endif
X! 			if(rn2(2)
X  #ifdef POLYSELF
X! 				&& !carnivorous(uasmon)
X! #endif
X! 							){
X! 				You("vomit.");
X! 				morehungry(20);
X! 				vomit();
X! 			} else	lesshungry(ftmp->nutrition);
X  			break;
X! #ifdef POLYSELF
X! 		case CLOVE_OF_GARLIC:
X! 			if (is_undead(uasmon)) {
X! 				You("cannot stand eating it.  You vomit.");
X! 				vomit();
X! 				break;
X! 			}
X! 			/* Fall through otherwise */
X  #endif
X! 		default:
X  #ifdef TUTTI_FRUTTI
X! 			if (otmp->otyp==SLIME_MOLD && !otmp->cursed
X! 				&& otmp->spe == current_fruit
X! 								)
X! 			    pline(!Hallucination ?
X! 				    "Mmm!  Your favorite!" :
X! 				    "Yum!  Your fave fruit!");
X! 			else
X  #endif
X  #ifdef UNIX
X! 			if (otmp->otyp == APPLE || otmp->otyp == PEAR) {
X! 			    if (!Hallucination)
X! 				pline("Core dumped.");
X! 			    else {
X! 	/* This is based on an old Usenet joke, a fake a.out manual page */
X! 				int x = rnd(100);
X! 				if (x <= 75)
X! 				    pline("Segmentation fault -- core dumped.");
X! 				else if (x <= 99)
X! 				    pline("Bus error -- core dumped.");
X! 				else pline("Yo' mama -- core dumped.");
X! 			    }
X! 			} else
X! #endif
X! 			{
X! 			    int oldquan = otmp->quan;
X! 			    otmp->quan = 1;
X! 			    pline("That %s was %s!", xname(otmp),
X! 			      otmp->cursed ?
X! 				(Hallucination ? "grody" : "terrible"):
X! 			      Hallucination ? "gnarly" : (
X  #ifdef TOLKIEN
X! 			       otmp->otyp==CRAM_RATION ? "bland":
X  #endif
X! 			       "delicious"));
X! 			    otmp->quan = oldquan;
X! 			}
X! 			lesshungry(ftmp->nutrition);
X  
X! 			switch(otmp->otyp) {
X  #ifdef POLYSELF
X! 			    case CLOVE_OF_GARLIC:
X! 				if (u.ulycn != -1) {
X! 					You("feel purified.");
X! 					if(uasmon == &mons[u.ulycn] &&
X! 					  !Polymorph_control)
X! 						rehumanize();
X! 					u.ulycn = -1;
X! 				}
X! 				break;
X! #endif
X! 			    case DEAD_LIZARD:
X! 				/* Relief from cockatrices -dgk */
X! 				if (Stoned) {
X! 					Stoned = 0;
X! 					You("feel limber!");
X! 				}
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! 			    case FORTUNE_COOKIE:
X! 				outrumor(bcsign(otmp), TRUE);
X! 				break;
X! 			    case LUMP_OF_ROYAL_JELLY:
X! 				/* This stuff seems to be VERY healthy! */
X! 				gainstr(otmp, 1);
X! 				u.uhp += (otmp->cursed) ? -rnd(20) : rnd(20);
X! 				if(u.uhp > u.uhpmax) {
X! 					if(!rn2(17)) u.uhpmax++;
X! 					u.uhp = u.uhpmax;
X! 				} else if(u.uhp <= 0) {
X! 					killer = "rotten jelly lump";
X! 					done(POISONING);
X! 				}
X! 				if(!otmp->cursed) heal_legs();
X! 				break;
X! 			    case EGG:
X! 				if(otmp->corpsenm == PM_COCKATRICE) {
X! #ifdef POLYSELF
X! 				    if(!resists_ston(uasmon)) {
X! #endif
X! 					if (!Stoned) Stoned = 5;
X! 					killer = "cockatrice egg";
X! #ifdef POLYSELF
X! 				    }
X! #endif
X! 				}
X! 				break;
X! 			    default:	break;
X! 			}
X! 			break;
X! 		}
X! 	    }
X  	}
X! 	
X  
X! 	if(multi < 0 && !nomovemsg){
X! #ifdef LINT	/* JAR		static char msgbuf[BUFSZ]; */
X! 		char msgbuf[BUFSZ];
X! #else
X! 		static char msgbuf[BUFSZ];
X! #endif
X! 		/* note: ftmp->oc_name usually works, the exception being
X! 		 * for fruits.  If fruits are changed to take more time to
X! 		 * eat, this has to be modified.
X! 		 */
X! 		if (otmp->otyp != CORPSE)
X! 			Sprintf(msgbuf, "You finish eating the %s.",
X! 						ftmp->oc_name);
X! 		else
X! 			Sprintf(msgbuf, "You finish eating the %s corpse.",
X! 						mons[otmp->corpsenm].mname);
X! 		nomovemsg = msgbuf;
X  	}
X! 	useup(otmp);
X  	return(1);
X  }
X  
X- /* called in main.c */
X  void
X! gethungry(){
X  	--u.uhunger;
X  	if(moves % 2) {
X  		if(HRegeneration) u.uhunger--;
X--- 648,908 ----
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  
X  static void
X! start_eating(otmp)		/* called as you start to eat */
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! 	victual.eating = TRUE;
X! 
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  
X! static void
X! fprefx(otmp)		/* called on "first bite" of (non-corpse) food */
X  
X! 	register struct obj *otmp;
X! {
X! 	switch(otmp->otyp) {
X  
X! 	    case FOOD_RATION:
X! 		if(u.uhunger <= 200)
X! 		    if (Hallucination) pline("Oh wow, like, superior, man!");
X! 		    else	       pline("That food really hit the spot!");
X! 		else if(u.uhunger <= 700) pline("That satiated your stomach!");
X! 		break;
X! 	    case TRIPE_RATION:
X  #ifdef POLYSELF
X! 		if (carnivorous(uasmon))
X! 		    pline("That tripe ration was surprisingly good!");
X! 		else {
X  #endif
X! 		    pline("Yak - dog food!");
X! 		    more_experienced(1,0);
X! 		    flags.botl = 1;
X  #ifdef POLYSELF
X! 		}
X! #endif
X! 		if(rn2(2)
X! #ifdef POLYSELF
X! 			&& !carnivorous(uasmon)
X! #endif
X! 						) {
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! 			make_vomiting((long)rn1(victual.reqtime, 5), FALSE);
X  			break;
X! 		}
X! 		/* Fall through otherwise */
X  #endif
X! 	    default:
X  #ifdef TUTTI_FRUTTI
X! 		if (otmp->otyp==SLIME_MOLD && !otmp->cursed
X! 			&& otmp->spe == current_fruit)
X! 		    pline(!Hallucination ? "Mmm!  Your favorite!" :
X! 			    		   "Yum!  Your fave fruit!");
X! 		else
X  #endif
X  #ifdef UNIX
X! 		if (otmp->otyp == APPLE || otmp->otyp == PEAR) {
X! 		    if (!Hallucination) pline("Core dumped.");
X! 		    else {
X! /* This is based on an old Usenet joke, a fake a.out manual page */
X! 			int x = rnd(100);
X! 			if (x <= 75)
X! 			    pline("Segmentation fault -- core dumped.");
X! 			else if (x <= 99)
X! 			    pline("Bus error -- core dumped.");
X! 			else pline("Yo' mama -- core dumped.");
X! 		    }
X! 		} else 
X! #endif
X! 		{
X! 		    int oldquan = otmp->quan;
X! 		    otmp->quan = 1;
X! 		    pline("This %s is %s!", xname(otmp),
X! 		      otmp->cursed ? (Hallucination ? "grody" : "terrible"):
X! 		      Hallucination ? "gnarly" : (
X  #ifdef TOLKIEN
X! 		       otmp->otyp==CRAM_RATION ? "bland":
X  #endif
X! 		       "delicious"));
X! 		    otmp->quan = oldquan;
X! 		}
X! 		break;
X! 	}
X! }
X! 
X! static int
X! fpostfx(otmp)		/* called after consuming (non-corpse) food */
X  
X! 	register struct obj *otmp;
X! {
X! 	switch(otmp->otyp) {
X  #ifdef POLYSELF
X! 	    case CLOVE_OF_GARLIC:
X! 		if (u.ulycn != -1) {
X! 		    u.ulycn = -1;
X! 		    You("feel purified.");
X! 		    if(uasmon == &mons[u.ulycn] && !Polymorph_control)
X! 			rehumanize();
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! 	    case FORTUNE_COOKIE:
X! 		outrumor(bcsign(otmp), TRUE);
X! 		break;
X! 	    case LUMP_OF_ROYAL_JELLY:
X! 		/* This stuff seems to be VERY healthy! */
X! 		gainstr(otmp, 1);
X! 		u.uhp += (otmp->cursed) ? -rnd(20) : rnd(20);
X! 		if(u.uhp > u.uhpmax) {
X! 			if(!rn2(17)) u.uhpmax++;
X! 			u.uhp = u.uhpmax;
X! 		} else if(u.uhp <= 0) {
X! 			killer = "rotten jelly lump";
X! 			done(POISONING);
X! 		}
X! 		if(!otmp->cursed) heal_legs();
X! 		break;
X! 	    case EGG:
X! 		if(otmp->corpsenm == PM_COCKATRICE) {
X! #ifdef POLYSELF
X! 		    if(!resists_ston(uasmon)) {
X! #endif
X! 			if (!Stoned) Stoned = 5;
X! 			killer = "cockatrice egg";
X! #ifdef POLYSELF
X! 		    }
X! #endif
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! 	}
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! 	    return(1);
X  	}
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! 	 * then adjusted in accordance with the amount of food left.
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! 	 * 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  }
X  
X  void
X! gethungry() {		/* as time goes by - called in main.c */
X  	--u.uhunger;
X  	if(moves % 2) {
X  		if(HRegeneration) u.uhunger--;
X***************
X*** 704,712 ****
X  	newuhs(TRUE);
X  }
X  
X! /* called after vomiting and after performing feats of magic */
X  void
X! morehungry(num)
X  register int num;
X  {
X  	u.uhunger -= num;
X--- 923,931 ----
X  	newuhs(TRUE);
X  }
X  
X! 
X  void
X! morehungry(num)	/* called after vomiting and after performing feats of magic */
X  register int num;
X  {
X  	u.uhunger -= num;
X***************
X*** 713,733 ****
X  	newuhs(TRUE);
X  }
X  
X! /* called after eating something (and after drinking fruit juice) */
X  void
X! lesshungry(num)
X  register int num;
X  {
X  	u.uhunger += num;
X! 	if(u.uhunger >= 2000) 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  	     */
X  	    if (u.uhunger >= 1500) {
X  		pline("You're having a hard time getting all of it down.");
X- 		multi -= 2;
X  		nomovemsg = "You're finally finished.";
X  	    }
X  	}
X  	newuhs(FALSE);
X--- 932,967 ----
X  	newuhs(TRUE);
X  }
X  
X! 
X  void
X! lesshungry(num)	/* called after eating (and after drinking fruit juice) */
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  	     */
X  	    if (u.uhunger >= 1500) {
X+ 	      if(!victual.eating || (victual.eating && !victual.fullwarn)) {
X  		pline("You're having a hard time getting all of it down.");
X  		nomovemsg = "You're finally finished.";
X+ 		if(!victual.eating)
X+ 		    multi = -2;
X+ 		else {
X+ 		    victual.fullwarn = TRUE;
X+ 		    if (victual.canchoke) {
X+ 			pline("Stop eating?");
X+ 			if(yn() == 'y') reset_eat();
X+ 		    }
X+ 		}
X+ 	      }
X  	    }
X  	}
X  	newuhs(FALSE);
X***************
X*** 742,748 ****
X  }
X  
X  void
X! newuhs(incr) boolean incr; {
X  	register int newhs, h = u.uhunger;
X  
X  	newhs = (h > 1000) ? SATIATED :
X--- 976,984 ----
X  }
X  
X  void
X! newuhs(incr)		/* compute and comment on your (new?) hunger status */
X! 	boolean incr;
X! {
X  	register int newhs, h = u.uhunger;
X  
X  	newhs = (h > 1000) ? SATIATED :
X***************
X*** 792,798 ****
X  			if (Hallucination)
X  			    pline((!incr) ?
X  				  "You still have the munchies." :
X! 				  "The munchies are starting to interfere with your motor capabilities.");
X  			else
X  			    You((!incr) ? "feel weak now." :
X  				  (u.uhunger < 45) ? "feel weak." :
X--- 1028,1034 ----
X  			if (Hallucination)
X  			    pline((!incr) ?
X  				  "You still have the munchies." :
X!       "The munchies are starting to interfere with your motor capabilities.");
X  			else
X  			    You((!incr) ? "feel weak now." :
X  				  (u.uhunger < 45) ? "feel weak." :
X***************
X*** 810,827 ****
X  }
X  
X  struct obj *
X! floorfood(verb,corpseonly)
X! char *verb;
X! boolean corpseonly;
X  {
X  	register struct obj *otmp;
X  
X  	/* Is there some food (probably a heavy corpse) here on the ground? */
X  	if(!Levitation && !u.uswallow) {
X! 	if(OBJ_AT(u.ux, u.uy))
X! 	    for(otmp = fobj; otmp; otmp = otmp->nobj) {
X! 		if(otmp->ox == u.ux && otmp->oy == u.uy &&
X! 		   (corpseonly ? otmp->otyp==CORPSE : otmp->olet==FOOD_SYM)) {
X  			pline("There %s %s here; %s %s? ",
X  				(otmp->quan == 1) ? "is" : "are",
X  				doname(otmp), verb,
X--- 1046,1061 ----
X  }
X  
X  struct obj *
X! floorfood(verb,corpseonly)	/* get food from floor or pack */
X! 	char *verb;
X! 	boolean corpseonly;
X  {
X  	register struct obj *otmp;
X  
X  	/* Is there some food (probably a heavy corpse) here on the ground? */
X  	if(!Levitation && !u.uswallow) {
X! 	    for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) {
X! 		if(corpseonly ? otmp->otyp==CORPSE : otmp->olet==FOOD_SYM) {
X  			pline("There %s %s here; %s %s? ",
X  				(otmp->quan == 1) ? "is" : "are",
X  				doname(otmp), verb,
X***************
X*** 829,839 ****
X  			if(yn() == 'y') {
X  				if(otmp->quan != 1)
X  					(void) splitobj(otmp, 1);
X! 				freeobj(otmp);
X! 				otmp = addinv(otmp);
X! 				addtobill(otmp, TRUE);
X! 				if(Invisible) newsym(u.ux, u.uy);
X! 				return otmp;
X  			}
X  		}
X  	    }
X--- 1063,1069 ----
X  			if(yn() == 'y') {
X  				if(otmp->quan != 1)
X  					(void) splitobj(otmp, 1);
X! 				return(pick_obj(otmp));
X  			}
X  		}
X  	    }
X***************
X*** 842,849 ****
X  }
X  
X  /* Side effects of vomiting */
X  /* TO DO: regurgitate swallowed monsters when poly'd */
X  void
X! vomit() { /* A good idea from David Neves */
X  	make_sick(0L,TRUE);
X  }
X--- 1072,1081 ----
X  }
X  
X  /* Side effects of vomiting */
X+ /* added nomul (MRS) - it makes sense, you're too busy being sick! */
X  /* TO DO: regurgitate swallowed monsters when poly'd */
X  void
X! vomit() {		/* A good idea from David Neves */
X  	make_sick(0L,TRUE);
X+ 	nomul(-2);
X  }
X*** src/Old/end.c	Sun Oct 15 18:34:53 1989
X--- src/end.c	Sun Oct 15 17:25:26 1989
X***************
X*** 158,163 ****
X--- 158,168 ----
X  panic VA_DECL(char *, str)
X  	VA_START(str);
X  	VA_INIT(str, char *);
X+ #ifdef MACOS
X+ 	puts(str);
X+ 	more();
X+ #endif
X+ 
X  	if(panicking++)
X  #ifdef SYSV
X  	    (void)
X***************
X*** 185,191 ****
X--- 190,200 ----
X  	hu = FALSE;
X  	(void) dosave0();
X  #endif
X+ #ifdef MACOS
X+ 	puts(" ERROR:  ");
X+ #else
X  	(void) fputs(" ERROR:  ", stdout);
X+ #endif
X  	Vprintf(str,VA_ARGS);
X  	more();				/* contains a fflush() */
X  #if defined(WIZARD) && (defined(UNIX) || defined(VMS))
X***************
X*** 234,240 ****
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--- 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***************
X*** 281,287 ****
X  	else if(how == STONED)
X  		(mk_named_object(STATUE, upmon, u.ux, u.uy, plname,
X  					strlen(plname)))->spe = 0;
X! 	else
X  		(void) mk_named_object(CORPSE, upmon, u.ux, u.uy, plname,
X  							strlen(plname));
X  
X--- 295,304 ----
X  	else if(how == STONED)
X  		(mk_named_object(STATUE, upmon, u.ux, u.uy, plname,
X  					strlen(plname)))->spe = 0;
X! /*
X!  * If you're burned to a crisp, why leave a corpse?
X!  */
X! 	else if (how != BURNING)
X  		(void) mk_named_object(CORPSE, upmon, u.ux, u.uy, plname,
X  							strlen(plname));
X  
X***************
X*** 468,474 ****
X  		topten();
X  /* "So when I die, the first thing I will see in Heaven is a score list?" */
X  	if(done_stopprint) Printf("\n\n");
X! #ifdef APOLLO
X  	getret();
X  #endif
X  	exit(0);
X--- 485,491 ----
X  		topten();
X  /* "So when I die, the first thing I will see in Heaven is a score list?" */
X  	if(done_stopprint) Printf("\n\n");
X! #if defined(APOLLO) || defined(MACOS)
X  	getret();
X  #endif
X  	exit(0);
X***************
X*** 481,496 ****
X  	if (ramdisk)
X  		eraseall(permbones, alllevels);
X  #else
X! #if defined(UNIX) || (defined(MSDOS) && !defined(OLD_TOS)) || defined(VMS)
X  	register int x;
X! #if defined(UNIX) || defined(VMS)
X  	(void) signal(SIGHUP,SIG_IGN);
X! #endif
X  	for(x = maxdlevel; x >= 0; x--) {
X  		glo(x);
X  		(void) unlink(lock);	/* not all levels need be present */
X  	}
X! #endif
X  #endif
X  }
X  
X--- 498,514 ----
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! #  endif
X  	for(x = maxdlevel; x >= 0; x--) {
X  		glo(x);
X  		(void) unlink(lock);	/* not all levels need be present */
X  	}
X! # endif
X  #endif
X  }
X  
X*** src/Old/invent.c	Sun Oct 15 18:37:27 1989
X--- src/invent.c	Thu Oct  5 21:18:12 1989
X***************
X*** 140,145 ****
X--- 140,146 ----
X  register struct obj *obj;
X  {
X  	if(obj->quan > 1){
X+ 		obj->in_use = FALSE;	/* no longer in use */
X  		obj->quan--;
X  		obj->owt = weight(obj);
X  	} else {
X***************
X*** 1096,1102 ****
X  	else if((obj->olet==WEAPON_SYM || obj->olet==ARMOR_SYM) &&
X  		obj->rustfree != otmp->rustfree) return FALSE;
X  
X! 	else if(obj->olet == FOOD_SYM && OEATEN(obj) != OEATEN(otmp))
X  		return(FALSE);
X  
X  	else if(obj->otyp == CORPSE || obj->otyp == EGG || obj->otyp == TIN)
X--- 1097,1103 ----
X  	else if((obj->olet==WEAPON_SYM || obj->olet==ARMOR_SYM) &&
X  		obj->rustfree != otmp->rustfree) return FALSE;
X  
X! 	else if(obj->olet == FOOD_SYM && obj->oeaten != otmp->oeaten)
X  		return(FALSE);
X  
X  	else if(obj->otyp == CORPSE || obj->otyp == EGG || obj->otyp == TIN)
X
END_OF_FILE
if test 56241 -ne `wc -c <'patches05d'`; then
    echo shar: \"'patches05d'\" unpacked with wrong size!
fi
# end of 'patches05d'
fi
echo shar: End of archive 4 \(of 6\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 6 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0