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

billr@saab.CNA.TEK.COM (Bill Randle) (02/24/90)

Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 9, Issue 7
Archive-name: NetHack3/Patch7g
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 7 (of 30)."
# Contents:  patch7.03
# Wrapped by billr@saab on Wed Feb 21 10:04:28 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patch7.03' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'patch7.03'\" to \"'patch7.03.orig'\"
  mv -f 'patch7.03' 'patch7.03.orig'
fi
echo shar: Extracting \"'patch7.03'\" \(56128 characters\)
sed "s/^X//" >'patch7.03' <<'END_OF_FILE'
X*** src/Old/dog.c	Mon Feb 19 17:59:10 1990
X--- src/dog.c	Sun Feb 11 16:05:48 1990
X***************
X*** 1,4 ****
X! /*	SCCS Id: @(#)dog.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: @(#)dog.c	3.0	89/11/20
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X***************
X*** 5,15 ****
X--- 5,21 ----
X  #include "hack.h"
X  #include "edog.h"
X  
X+ #ifdef OVLB
X+ 
X  char dogname[63] = DUMMY;
X  char catname[63] = DUMMY;
X  
X+ #endif /* OVLB */
X+ 
X  #define domestic(mtmp)	(mtmp->data->msound == MS_BARK || mtmp->data->msound == MS_MEW)
X  
X+ #ifdef OVLB
X+ 
X  void
X  initedog(mtmp)
X  register struct monst *mtmp;
X***************
X*** 59,64 ****
X--- 65,71 ----
X  	    return;
X  	}
X  	initedog(mtmp);
X+ 	mtmp->msleep = 0;
X  	if (otmp && otmp->cursed) { /* cursed figurine */
X  		You("get a bad feeling about this.");
X  		mtmp->mtame = mtmp->mpeaceful = 0;
X***************
X*** 85,100 ****
X  	if(!mtmp) return((struct monst *) 0); /* dogs were genocided */
X  
X  	if (petname[0]) {
X! 		register struct monst *mtmp2;
X! 
X! 		mtmp->mnamelth = strlen(petname) + 1;
X! 		mtmp2 = newmonst(sizeof(struct edog) + mtmp->mnamelth);
X! 		*mtmp2 = *mtmp;
X! 
X! 		replmon(mtmp, mtmp2);
X! 		mtmp = mtmp2;
X! 		Strcpy(NAME(mtmp), petname);
X  		petname[0] = '\0'; /* name first only; actually unnecessary */
X  	}
X  	initedog(mtmp);
X  	return(mtmp);
X--- 92,101 ----
X  	if(!mtmp) return((struct monst *) 0); /* dogs were genocided */
X  
X  	if (petname[0]) {
X! 		mtmp = christen_monst(mtmp, petname);
X! #ifndef MACOS
X  		petname[0] = '\0'; /* name first only; actually unnecessary */
X+ #endif
X  	}
X  	initedog(mtmp);
X  	return(mtmp);
X***************
X*** 102,109 ****
X  
X  /* attach the monsters that went down (or up) together with @ */
X  struct monst *mydogs = 0;
X! /* monsters that fell through a trapdoor or stepped on a tele-trap. */
X! /* 'down' is now true only of trapdooor falling, not for tele-trap. */
X  struct monst *fallen_down = 0;
X  				
X  void
X--- 103,110 ----
X  
X  /* attach the monsters that went down (or up) together with @ */
X  struct monst *mydogs = 0;
X! /* monsters that fell through a trap door or stepped on a tele-trap. */
X! /* 'down' is now true only of trap door falling, not for tele-trap. */
X  struct monst *fallen_down = 0;
X  				
X  void
X***************
X*** 116,122 ****
X  		fmon = mtmp;
X  		mnexto(mtmp);
X  	}
X! #ifdef LINT
X  	mtmp0 = (struct monst *)0;
X  #endif
X  	for(mtmp = fallen_down; mtmp; mtmp = mtmp2) {
X--- 117,123 ----
X  		fmon = mtmp;
X  		mnexto(mtmp);
X  	}
X! #if defined(LINT) || defined(__GNULINT__)
X  	mtmp0 = (struct monst *)0;
X  #endif
X  	for(mtmp = fallen_down; mtmp; mtmp = mtmp2) {
X***************
X*** 155,161 ****
X  		   the amulet; if you don't have it, will chase you
X  		   only if in range. -3. */
X  			(u.uhave_amulet && mtmp->iswiz))
X! 			&& !mtmp->msleep && !mtmp->mfroz) {
X  #ifdef WORM
X  		/* Bug "fix" for worm changing levels collapsing dungeon
X  		 */
X--- 156,162 ----
X  		   the amulet; if you don't have it, will chase you
X  		   only if in range. -3. */
X  			(u.uhave_amulet && mtmp->iswiz))
X! 			&& !mtmp->msleep && mtmp->mcanmove) {
X  #ifdef WORM
X  		/* Bug "fix" for worm changing levels collapsing dungeon
X  		 */
X***************
X*** 216,221 ****
X--- 217,225 ----
X  		/* so rloc() on next level doesn't affect MON_AT() state */
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL1
X+ 
X  /* return quality of food; the lower the better */
X  /* fungi will eat even tainted food */
X  int
X***************
X*** 244,254 ****
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--- 248,263 ----
X  			return POISON;
X  		    return (carni ? CADAVER : MANFOOD);
X  		case CORPSE:
X! 		    if ((obj->age+50 <= monstermoves
X! 					    && obj->corpsenm != PM_LIZARD
X  					    && mon->data->mlet != S_FUNGUS) ||
X+ 			(acidic(&mons[obj->corpsenm]) &&
X+ 						!resists_acid(mon->data)) ||
X  			(poisonous(&mons[obj->corpsenm]) &&
X  						!resists_poison(mon->data)))
X  			return POISON;
X+ 		    else if (mon->data->mlet == S_FUNGUS)
X+ 			return (herbi ? CADAVER : MANFOOD);
X  		    else return (carni ? CADAVER : MANFOOD);
X  		case CLOVE_OF_GARLIC:
X  		    return (is_undead(mon->data) ? TABU :
X***************
X*** 277,282 ****
X--- 286,294 ----
X  	}
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVL0
X+ 
X  /* return roomnumber or -1 */
X  int
X  inroom(x,y) xchar x,y; {
X***************
X*** 290,295 ****
X--- 302,310 ----
X  	return(-1);	/* not in room or on door */
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X+ 
X  int
X  tamedog(mtmp, obj)
X  register struct monst *mtmp;
X***************
X*** 306,312 ****
X  	/* If we cannot tame him, at least he's no longer afraid. */
X  	mtmp->mflee = 0;
X  	mtmp->mfleetim = 0;
X! 	if(mtmp->mtame || mtmp->mfroz ||
X  #ifdef MEDUSA
X  	   mtmp->data == &mons[PM_MEDUSA] ||
X  #endif
X--- 321,327 ----
X  	/* If we cannot tame him, at least he's no longer afraid. */
X  	mtmp->mflee = 0;
X  	mtmp->mfleetim = 0;
X! 	if(mtmp->mtame || !mtmp->mcanmove ||
X  #ifdef MEDUSA
X  	   mtmp->data == &mons[PM_MEDUSA] ||
X  #endif
X***************
X*** 334,336 ****
X--- 349,353 ----
X  	replmon(mtmp,mtmp2);
X  	return(1);
X  }
X+ 
X+ #endif /* OVLB */
X*** src/Old/dogmove.c	Mon Feb 19 17:59:33 1990
X--- src/dogmove.c	Mon Feb  5 18:09:09 1990
X***************
X*** 7,15 ****
X  #include "mfndpos.h"
X  #include "edog.h"
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--- 7,23 ----
X  #include "mfndpos.h"
X  #include "edog.h"
X  
X+ #ifdef OVL0
X+ 
X  static const char nofetch[] = { BALL_SYM, CHAIN_SYM, ROCK_SYM, 0 };
X  
X! #endif /* OVL0 */
X! 
X! OSTATIC void FDECL(dog_eat, (struct monst *, struct obj *, XCHAR_P, int, int));
X! 
X! #ifdef OVLB
X! 
X! XSTATIC void
X  dog_eat(mtmp, obj, otyp, x, y)
X  register struct monst *mtmp;
X  register struct obj * obj;
X***************
X*** 54,59 ****
X--- 62,70 ----
X  	delobj(obj);
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL0
X+ 
X  /* return 0 (no move), 1 (move) or 2 (dead) */
X  int
X  dog_move(mtmp, after)
X***************
X*** 75,80 ****
X--- 86,94 ----
X  #define GDIST(x,y) (dist2(x,y,gx,gy))
X  #define DDIST(x,y) (dist2(x,y,omx,omy))
X  
X+ #ifdef __GNULINT__
X+ 	chi = -1;	/* gcc warning from 'goto newdogpos' */
X+ #endif
X  	omx = mtmp->mx;
X  	omy = mtmp->my;
X  	whappr = (moves - edog->whistletime < 5);
X***************
X*** 134,139 ****
X--- 148,154 ----
X  			goto newdogpos;
X  		    }
X  		    if(can_carry(mtmp, obj))
X+ 		    if(!obj->cursed)
X  		    if(rn2(20) < edog->apport+3)
X  		    if(rn2(udist) || !rn2((int) edog->apport)){
X  			if (cansee(omx, omy) && flags.verbose)
X***************
X*** 243,248 ****
X--- 258,269 ----
X  	
X  	allowflags = ALLOW_M | ALLOW_TRAPS | ALLOW_SSM | ALLOW_SANCT;
X  	if (passes_walls(mtmp->data)) allowflags |= (ALLOW_ROCK|ALLOW_WALL);
X+ 	if (throws_rocks(mtmp->data)) allowflags |= ALLOW_ROCK;
X+ 	if (!nohands(mtmp->data) && !verysmall(mtmp->data)) {
X+ 		allowflags |= OPENDOOR;
X+ 		if (m_carrying(mtmp, SKELETON_KEY)) allowflags |= BUSTDOOR;
X+ 	}
X+ 	if (is_giant(mtmp->data)) allowflags |= BUSTDOOR;
X  	if (tunnels(mtmp->data) && !needspick(mtmp->data))
X  		allowflags |= ALLOW_DIG;
X  	cnt = mfndpos(mtmp, poss, info, allowflags);
X***************
X*** 258,263 ****
X--- 279,285 ----
X  #endif
X  		if(info[i] & ALLOW_M) {
X  			if(MON_AT(nx, ny)) {
X+ 			    int stat;
X  			    register struct monst *mtmp2 = m_at(nx,ny);
X  
X  			    if(mtmp2->m_lev >= mtmp->m_lev+2 ||
X***************
X*** 266,274 ****
X  				continue;
X  			    if(after) return(0); /* hit only once each move */
X  
X! 			    if(mattackm(mtmp, mtmp2) == 1 && rn2(4) &&
X  			      mtmp2->mlstmv != moves &&
X  			      mattackm(mtmp2, mtmp) == 2) return(2);
X  			    return(0);
X  			}
X  		}
X--- 288,297 ----
X  				continue;
X  			    if(after) return(0); /* hit only once each move */
X  
X! 			    if((stat = mattackm(mtmp, mtmp2)) == 1 && rn2(4) &&
X  			      mtmp2->mlstmv != moves &&
X  			      mattackm(mtmp2, mtmp) == 2) return(2);
X+ 			    if(stat == -1) return(2);
X  			    return(0);
X  			}
X  		}
X***************
X*** 377,379 ****
X--- 400,404 ----
X  #endif
X  	return(1);
X  }
X+ 
X+ #endif /* OVL0 */
X*** src/Old/dokick.c	Mon Feb 19 18:00:00 1990
X--- src/dokick.c	Tue Feb  6 19:54:46 1990
X***************
X*** 7,12 ****
X--- 7,14 ----
X  
X  #define martial()	((pl_character[0] == 'S' || pl_character[0] == 'P'))
X  
X+ static struct rm *maploc;
X+ 
X  #ifdef KICK
X  
X  # ifdef WORM
X***************
X*** 13,18 ****
X--- 15,26 ----
X  extern boolean notonhead;
X  # endif
X  
X+ static void FDECL(kickdmg, (struct monst *, BOOLEAN_P));
X+ static void FDECL(kick_monster, (int, int));
X+ static int FDECL(kick_object, (int, int));
X+ 
X+ static struct obj *obj = (struct obj *) 0;
X+ 
X  static void
X  kickdmg(mon, clumsy)
X  register struct monst *mon;
X***************
X*** 54,60 ****
X  		killed(mon);
X  		return;
X  	}
X! 	if(martial() && !bigmonst(mon->data) && !rn2(3) && !mon->mfroz) {
X  	    	/* see if the monster has a place to move into */
X  	    	mdx = mon->mx + u.dx;
X  	    	mdy = mon->my + u.dy;
X--- 62,68 ----
X  		killed(mon);
X  		return;
X  	}
X! 	if(martial() && !bigmonst(mon->data) && !rn2(3) && mon->mcanmove) {
X  	    	/* see if the monster has a place to move into */
X  	    	mdx = mon->mx + u.dx;
X  	    	mdy = mon->my + u.dy;
X***************
X*** 70,76 ****
X  
X  /*	it is unchivalrous to attack the defenseless or from behind */
X  	if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL && 
X! 		u.ualign > -10 && (mon->mfroz || mon->msleep || mon->mflee))
X  	    	adjalign(-1);
X  
X  }
X--- 78,84 ----
X  
X  /*	it is unchivalrous to attack the defenseless or from behind */
X  	if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL && 
X! 		u.ualign > -10 && (!mon->mcanmove || mon->msleep || mon->mflee))
X  	    	adjalign(-1);
X  
X  }
X***************
X*** 149,155 ****
X  	kludge("You kick %s.", mon_nam(mon));
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--- 157,163 ----
X  	kludge("You kick %s.", mon_nam(mon));
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->mcanmove && 
X  	   !mon->mstun && !mon->mconf && !mon->msleep &&
X  	   mon->data->mmove >= 12) {
X  		if(!nohands(mon->data) && !rn2(martial() ? 5 : 3)) {
X***************
X*** 236,245 ****
X  bad_kick_throw_pos(x,y)
X  xchar x,y;
X  {
X! 	register struct rm *lvl = &(levl[x][y]);
X! 
X! 	return(!ACCESSIBLE(lvl->typ) || lvl->typ == SDOOR ||
X! 	    (IS_DOOR(lvl->typ) && (lvl->doormask & (D_CLOSED | D_LOCKED))) );
X  }
X  
X  struct monst *
X--- 244,250 ----
X  bad_kick_throw_pos(x,y)
X  xchar x,y;
X  {
X! 	return(!accessible(x, y) || levl[x][y].typ == SDOOR);
X  }
X  
X  struct monst *
X***************
X*** 286,292 ****
X  	int range, odx, ody, cnt = 0;
X  	register struct monst *mon;
X  	struct gold *gold;
X! 	register struct obj *otmp, *obj;
X  	boolean costly = FALSE;
X  
X  	/* if a pile, the "top" object gets kicked */
X--- 291,297 ----
X  	int range, odx, ody, cnt = 0;
X  	register struct monst *mon;
X  	struct gold *gold;
X! 	register struct obj *otmp;
X  	boolean costly = FALSE;
X  
X  	/* if a pile, the "top" object gets kicked */
X***************
X*** 469,479 ****
X  }
X  #endif /* KICK */
X  
X  
X  int
X  dokick() {		/* try to kick the door down - noisy! */
X          register int x, y;
X- 	register struct rm *maploc;
X  	register int avrg_attrib = (ACURR(A_STR)+ACURR(A_DEX)+ACURR(A_CON))/3;
X  
X  #ifdef POLYSELF
X--- 474,521 ----
X  }
X  #endif /* KICK */
X  
X+ char *
X+ kickstr() {
X+ 	static char buf[BUFSIZ];
X+ 
X+ #ifdef KICK
X+ 	if (obj) Sprintf(buf, "kicking %s", doname(obj));
X+ 	else
X+ #endif
X+ 	if (IS_STWALL(maploc->typ)) Strcpy(buf, "kicking a wall");
X+ 	else if (IS_ROCK(maploc->typ)) Strcpy(buf, "kicking a rock");
X+ #ifdef THRONES
X+ 	else if (IS_THRONE(maploc->typ)) Strcpy(buf, "kicking a throne");
X+ #endif
X+ #ifdef SINKS
X+ 	else if (IS_SINK(maploc->typ)) Strcpy(buf, "kicking a sink");
X+ #endif
X+ #ifdef ALTARS
X+ 	else if (IS_ALTAR(maploc->typ)) Strcpy(buf, "kicking an altar");
X+ #endif
X+ #ifdef STRONGHOLD
X+ 	else if (IS_DRAWBRIDGE(maploc->typ))
X+ 		Strcpy(buf, "kicking the drawbridge");
X+ #endif
X+ 	else {
X+ 		switch (maploc->typ) {
X+ 		case STAIRS:	
X+ 			Strcpy(buf, "kicking the stairs");
X+ 			break;
X+ #ifdef STRONGHOLD
X+ 		case LADDER:
X+ 			Strcpy(buf, "kicking a ladder");
X+ 			break;
X+ #endif
X+ 		}
X+ 	}
X+ 
X+ 	return buf;
X+ }
X  
X  int
X  dokick() {		/* try to kick the door down - noisy! */
X          register int x, y;
X  	register int avrg_attrib = (ACURR(A_STR)+ACURR(A_DEX)+ACURR(A_CON))/3;
X  
X  #ifdef POLYSELF
X***************
X*** 520,526 ****
X  		switch(rn2(3)) {
X  		case 0:  You("can't move your %s!", body_part(LEG));
X  			 break;
X! 		case 1:  pline("%s burps loudly.", Monnam(u.ustuck)); break;
X  		default: Your("feeble kick has no effect."); break;
X  		}
X  		return(1);
X--- 562,571 ----
X  		switch(rn2(3)) {
X  		case 0:  You("can't move your %s!", body_part(LEG));
X  			 break;
X! 		case 1:  if (is_animal(u.ustuck->data)) {
X! 			 	pline("%s burps loudly.", Monnam(u.ustuck)); 
X! 			       	break; 
X!                          }
X  		default: Your("feeble kick has no effect."); break;
X  		}
X  		return(1);
X***************
X*** 573,579 ****
X  # ifdef THRONES
X  		if(IS_THRONE(maploc->typ)) {
X  		    register int i;
X! 		    if((u.uluck < 0 || maploc->doormask) && !rn2(3)) {
X  			pline("CRASH!  You destroy the throne.");
X  			maploc->typ = ROOM;
X  			maploc->doormask = 0; /* don't leave loose ends.. */
X--- 618,624 ----
X  # ifdef THRONES
X  		if(IS_THRONE(maploc->typ)) {
X  		    register int i;
X! 		    if((Luck < 0 || maploc->doormask) && !rn2(3)) {
X  			pline("CRASH!  You destroy the throne.");
X  			maploc->typ = ROOM;
X  			maploc->doormask = 0; /* don't leave loose ends.. */
X***************
X*** 580,589 ****
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  			if(i > 6) i = 6;
X  			while(i--) (void) mkobj_at(GEM_SYM, x, y);
X  			prl(x, y);
X--- 625,634 ----
X  			mkgold((long)rnd(200), x, y);
X  			prl(x, y);
X  			return(1);
X! 		    } else if(Luck > 0 && !rn2(3) && !maploc->looted) {
X  			You("kick loose some ornamental coins and gems!");
X  			mkgold((300L+(long)rn2(201)), x, y);
X! 			i = Luck + 1;
X  			if(i > 6) i = 6;
X  			while(i--) (void) mkobj_at(GEM_SYM, x, y);
X  			prl(x, y);
X***************
X*** 656,662 ****
X  ouch:
X  		    pline("Ouch!  That hurts!");
X  		    if(!rn2(3)) set_wounded_legs(RIGHT_SIDE, 5 + rnd(5));
X! 		    losehp(rnd(ACURR(A_CON) > 15 ? 3 : 5), "dumb move");
X  		    return(1);
X  		}
X  # ifdef STRONGHOLD
X--- 701,708 ----
X  ouch:
X  		    pline("Ouch!  That hurts!");
X  		    if(!rn2(3)) set_wounded_legs(RIGHT_SIDE, 5 + rnd(5));
X! 		    losehp(rnd(ACURR(A_CON) > 15 ? 3 : 5), kickstr(),
X! 			KILLED_BY);
X  		    return(1);
X  		}
X  # ifdef STRONGHOLD
X*** src/Old/dothrow.c	Mon Feb 19 18:00:36 1990
X--- src/dothrow.c	Fri Feb  2 18:23:55 1990
X***************
X*** 6,12 ****
X--- 6,14 ----
X  
X  #include "hack.h"
X  
X+ static void FDECL(hitfloor, (struct obj *));
X  static void FDECL(gem_accept, (struct monst *, struct obj *));
X+ static boolean NDECL(martial);
X  static int FDECL(throw_gold, (struct obj *));
X  static const char toss_objs[] = { '0', GOLD_SYM, '#', WEAPON_SYM, 0 };
X  #ifdef WORM
X***************
X*** 100,106 ****
X  		potionhit(&youmonst, obj);
X  	    else {
X  		if(uarmh) pline("Fortunately, you are wearing a helmet!");
X! 		losehp(uarmh ? 1 : rnd((int)(obj->owt)), "falling object");
X  		if (!breaks(obj, TRUE)) dropy(obj);
X  	    }
X  	  } else hitfloor(obj);
X--- 102,109 ----
X  		potionhit(&youmonst, obj);
X  	    else {
X  		if(uarmh) pline("Fortunately, you are wearing a helmet!");
X! 		losehp(uarmh ? 1 : rnd((int)(obj->owt)), "falling object",
X! 			KILLED_BY_AN);
X  		if (!breaks(obj, TRUE)) dropy(obj);
X  	    }
X  	  } else hitfloor(obj);
X***************
X*** 189,195 ****
X  					(side == LEFT_SIDE) ? "left" : "right",
X  					body_part(LEG));
X  				set_wounded_legs(side, 500+rn2(1000));
X! 				losehp(2, "thrown ball");
X  				}
X  				u.utrap = 0;
X  			}
X--- 192,199 ----
X  					(side == LEFT_SIDE) ? "left" : "right",
X  					body_part(LEG));
X  				set_wounded_legs(side, 500+rn2(1000));
X! 				losehp(2, "leg damage from being pulled out of a bear trap",
X! 					KILLED_BY);
X  				}
X  				u.utrap = 0;
X  			}
X***************
X*** 238,246 ****
X  		mon->msleep = 0;
X  		tmp += 2;
X  	}
X! 	if(mon->mfroz) {
X  		tmp += 4;
X! 		if(!rn2(10)) mon->mfroz = 0;
X  	}
X  	if (is_orc(mon->data) && pl_character[0]=='E') tmp++;
X  	if (u.uswallow && mon == u.ustuck) tmp += 1000; /* Guaranteed hit */
X--- 242,253 ----
X  		mon->msleep = 0;
X  		tmp += 2;
X  	}
X! 	if(!mon->mcanmove) {
X  		tmp += 4;
X! 		if(!rn2(10)) {
X! 			mon->mcanmove = 1;
X! 			mon->mfrozen = 0;
X! 		}
X  	}
X  	if (is_orc(mon->data) && pl_character[0]=='E') tmp++;
X  	if (u.uswallow && mon == u.ustuck) tmp += 1000; /* Guaranteed hit */
X***************
X*** 310,317 ****
X  	} else {
X  		pline("The %s misses %s.", xname(obj),
X  			cansee(bhitpos.x,bhitpos.y) ? mon_nam(mon) : "it");
X! 		if(obj->olet == FOOD_SYM &&
X! 		  (mon->data->mlet == S_DOG || mon->data->mlet == S_FELINE))
X  			if(tamedog(mon,obj)) return(1);
X  	}
X  	return(0);
X--- 317,323 ----
X  	} else {
X  		pline("The %s misses %s.", xname(obj),
X  			cansee(bhitpos.x,bhitpos.y) ? mon_nam(mon) : "it");
X! 		if(obj->olet == FOOD_SYM && is_domestic(mon->data))
X  			if(tamedog(mon,obj)) return(1);
X  	}
X  	return(0);
X***************
X*** 422,429 ****
X  	}
X  
X  	if(u.uswallow) {
X! 		pline("The gold disappears in the %s's entrails.", 
X! 					mon_nam(u.ustuck));
X  		u.ustuck->mgold += zorks;
X  		return(1);
X  	}
X--- 428,439 ----
X  	}
X  
X  	if(u.uswallow) {
X! 		if (is_animal(u.ustuck->data))
X! 			pline("The gold disappears in the %s's entrails.", 
X! 			      mon_nam(u.ustuck));
X! 		else
X! 			pline("The gold disappears into %s.",
X! 			      mon_nam(u.ustuck));
X  		u.ustuck->mgold += zorks;
X  		return(1);
X  	}
X*** src/Old/eat.c	Mon Feb 19 18:01:13 1990
X--- src/eat.c	Mon Feb 19 10:18:37 1990
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--- 1,4 ----
X! /*      SCCS Id: @(#)eat.c      3.0     89/11/21
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X***************
X*** 13,24 ****
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--- 13,61 ----
X  # endif
X  #endif
X  
X! static long FDECL(rounddiv, (long, long));
X! #ifndef OVERLAY
X! static int NDECL(Meatdone);
X! #endif
X! static void FDECL(choke, (struct obj *));
X! static void NDECL(recalc_wt);
X! static struct obj *FDECL(touchfood, (struct obj *));
X! static void NDECL(do_reset_eat);
X! #ifndef OVERLAY
X! static int NDECL(eatfood);
X! #endif
X! static void FDECL(done_eating, (BOOLEAN_P));
X! static void FDECL(cprefx, (int));
X  static void FDECL(cpostfx, (int));
X+ #ifndef OVERLAY
X+ static int NDECL(opentin);
X+ #endif
X+ static void FDECL(start_tin, (struct obj *));
X+ #ifdef POLYSELF
X+ static int FDECL(rottenfood, (struct obj *));
X+ #else
X+ static int NDECL(rottenfood);
X+ #endif
X+ static int FDECL(eatcorpse, (struct obj *));
X+ static void FDECL(start_eating, (struct obj *));
X+ static void FDECL(fprefx, (struct obj *));
X+ #ifdef POLYSELF
X+ static void NDECL(eatspecial);
X+ static const char * FDECL(foodword, (struct obj *));
X+ #endif
X+ static void FDECL(fpostfx, (struct obj *));
X+ static int NDECL(bite);
X+ #ifndef OVERLAY
X+ static int NDECL(unfaint);
X+ #endif
X+ 
X+ #ifdef OVLB
X  
X  char corpsename[60];
X  char msgbuf[BUFSZ];
X  
X+ #endif /* OVLB */
X+ 
X  /* hunger texts used on bottom line (each 8 chars long) */
X  #define SATIATED	0
X  #define NOT_HUNGRY	1
X***************
X*** 28,33 ****
X--- 65,72 ----
X  #define FAINTED		5
X  #define STARVED		6
X  
X+ #ifdef OVLB
X+ 
X  const char *hu_stat[] = {
X  	"Satiated",
X  	"        ",
X***************
X*** 39,44 ****
X--- 78,106 ----
X  };
X  
X  static const char comestibles[] = { FOOD_SYM, 0 };
X+ #ifdef POLYSELF
X+ static const char everything[] = { GOLD_SYM, /* must come first */
X+ 	WEAPON_SYM, ARMOR_SYM, POTION_SYM, SCROLL_SYM, WAND_SYM,
X+ #ifdef SPELLS
X+ 	SPBOOK_SYM,
X+ #endif
X+ 	RING_SYM, WAND_SYM, AMULET_SYM, FOOD_SYM, TOOL_SYM, GEM_SYM,
X+ 	ROCK_SYM, BALL_SYM, CHAIN_SYM, 0 };
X+ 
X+ boolean
X+ is_edible(obj)
X+ register struct obj *obj;
X+ {
X+ 	if (metallivorous(uasmon) && (obj->olet == GOLD_SYM ||
X+ 			(objects[obj->otyp].oc_material > WOOD &&
X+ 			objects[obj->otyp].oc_material < MINERAL)))
X+ 		return TRUE;
X+ 	if (u.umonnum == PM_GELATINOUS_CUBE &&
X+ 			objects[obj->otyp].oc_material <= WOOD)
X+ 		return TRUE;
X+ 	return !!index(comestibles, obj->olet);
X+ }
X+ #endif
X  
X  /* calculate x/y, rounding as appropriate */
X  
X***************
X*** 70,76 ****
X  	u.uhs = NOT_HUNGRY;
X  }
X  
X! const struct { char *txt; int nut; } tintxts[] = {
X  	"deep fried",	60,
X  	"pickled",	40,
X  	"soup made from", 20,
X--- 132,138 ----
X  	u.uhs = NOT_HUNGRY;
X  }
X  
X! const struct { const char *txt; int nut; } tintxts[] = {
X  	"deep fried",	60,
X  	"pickled",	40,
X  	"soup made from", 20,
X***************
X*** 137,147 ****
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--- 199,221 ----
X  		morehungry(1000);	/* you just got *very* sick! */
X  		vomit();
X  	} else {
X+ 		killer_format = KILLED_BY_AN;
X  		if(food) {
X! #ifdef POLYSELF
X! 			if (food->olet == GOLD_SYM) {
X! 				killer_format = KILLED_BY;
X! 				killer = "eating too rich a meal";
X! 			} else
X! #endif
X! 				killer = singular(food, xname);
X  		} else
X  			killer = "exuberant appetite";
X! 		if (!food) You("choke over it.");
X! #ifdef POLYSELF
X! 		else You("choke over your %s.", foodword(food));
X! #else
X! 		else You("choke over your food.");
X! #endif
X  		You("die...");
X  		done(CHOKING);
X  	}
X***************
X*** 203,208 ****
X--- 277,294 ----
X  	return(otmp);
X  }
X  
X+ /* When food decays, in the middle of your meal, we don't want to dereference
X+  * any dangling pointers, so set it to null (which should still trigger
X+  * do_reset_eat() at the beginning of eatfood()) and check for null pointers
X+  * in do_reset_eat().
X+  */
X+ void
X+ food_disappears(obj)
X+ register struct obj *obj;
X+ {
X+ 	if (obj == victual.piece) victual.piece = (struct obj *)0;
X+ }
X+ 
X  static void
X  do_reset_eat() {
X  
X***************
X*** 209,218 ****
X  #ifdef DEBUG
X  	debug("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--- 295,310 ----
X  #ifdef DEBUG
X  	debug("do_reset_eat...");
X  #endif
X! 	if (victual.piece) {
X! 		victual.piece = touchfood(victual.piece);
X! 		recalc_wt();
X! 	}
X! 	victual.fullwarn = victual.eating = victual.doreset = FALSE;
X! 	/* Do not set canchoke to FALSE; if we continue eating the same object
X! 	 * we need to know if canchoke was set when they started eating it the
X! 	 * previous time.  And if we don't continue eating the same object
X! 	 * canchoke always gets recalculated anyway.
X! 	 */
X  	stop_occupation();
X  }
X  
X***************
X*** 227,284 ****
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- 	    else if(victual.nmod > 0 && (victual.usedtime % victual.nmod))
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  static void
X--- 319,356 ----
X  		return(0);
X  	}
X  	if(!victual.eating) return(0);
X  
X! 	if(++victual.usedtime < victual.reqtime) {
X! 	    if(bite()) return(0);
X! 	    return(1);	/* still busy */
X  	} else {	/* done */
X+ 	    done_eating(TRUE);
X+ 	    return(0);
X+ 	}
X+ }
X+ 
X+ static void
X+ done_eating(message)
X+ boolean message;
X+ {
X  #ifndef NO_SIGNAL
X! 	victual.piece->in_use = TRUE;
X  #endif
X! 	if (nomovemsg) {
X! 		if (message) pline(nomovemsg);
X  		nomovemsg = 0;
X! 	} else if (message)
X! 		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 = FALSE;
X  }
X  
X  static void
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--- 358,364 ----
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*** 304,318 ****
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  	    case PM_LIZARD:
X  		/* Relief from cockatrices -dgk */
X  		if (Stoned) {
X--- 376,393 ----
X  	    case PM_MEDUSA:
X  #endif
X  #ifdef POLYSELF
X! 		if(!resists_ston(uasmon))
X  #endif
X! 			{
X! 			char *cruft;	/* killer is const char * */
X! 			killer_format = KILLED_BY;
X! 			killer = cruft = (char *) alloc(40);
X  			You("turn to stone.");
X! 			Sprintf(cruft, "%s meat", mons[pm].mname);
X  			done(STONING);
X+ 			}
X+ 			break;
X  #ifdef POLYSELF
X  	    case PM_LIZARD:
X  		/* Relief from cockatrices -dgk */
X  		if (Stoned) {
X***************
X*** 321,328 ****
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--- 396,402 ----
X  		}
X  		break;
X  	    default:
X! 		if(acidic(&mons[pm]) && Stoned) {
X  		    pline("What a pity - you just destroyed a future piece of art!");
X  		    Stoned = 0;
X  		}
X***************
X*** 416,427 ****
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  		polyself();
X! 		break;
X  #endif
X  	    default: {
X  		register struct permonst *ptr = &mons[pm];
X  		if(dmgtype(ptr, AD_STUN) || ptr==&mons[PM_VIOLET_FUNGUS]) {
X--- 490,503 ----
X  		if (HStun > 2)  make_stunned(2L,FALSE);
X  		if (HConfusion > 2)  make_confused(2L,FALSE);
X  		break;
X  	    case PM_CHAMELEON:
X  		You("feel a change coming over you.");
X+ #ifdef POLYSELF
X  		polyself();
X! #else
X! 		newman();
X  #endif
X+ 		break;
X  	    default: {
X  		register struct permonst *ptr = &mons[pm];
X  		if(dmgtype(ptr, AD_STUN) || ptr==&mons[PM_VIOLET_FUNGUS]) {
X***************
X*** 428,433 ****
X--- 504,512 ----
X  		    pline ("Oh wow!  Great stuff!");
X  		    make_hallucinated(Hallucination + 200,FALSE);
X  		}
X+ 		/* prevent polymorph abuse by killing/eating your offspring */
X+ 		if(ptr >= &mons[PM_BABY_GRAY_DRAGON] &&
X+ 		   ptr <= &mons[PM_BABY_YELLOW_DRAGON]) return;
X  		if(is_giant(ptr)) gainstr((struct obj *)0, 0);
X  
X  		if(can_teleport(ptr) && ptr->mlevel > rn2(10)) {
X***************
X*** 435,456 ****
X  			You("feel very jumpy.");
X  			HTeleportation |= INTRINSIC;
X  		    }
X! 		} else if(control_teleport(ptr) && ptr->mlevel > rn2(20)) {
X  		    if (!(HTeleport_control & INTRINSIC)) {
X  			You("feel in control of yourself.");
X  			HTeleport_control |= INTRINSIC;
X  		    }
X! 		} else if(resists_fire(ptr) && ptr->mlevel > rn2(20)) {
X  		    if (!(HFire_resistance & INTRINSIC)) {
X  			You("feel a momentary chill.");
X  			HFire_resistance |= INTRINSIC;
X  		    }
X! 		} else if(resists_cold(ptr) && ptr->mlevel > rn2(20)) {
X  		    if (!(HCold_resistance & INTRINSIC)) {
X  			You("feel full of hot air.");
X  			HCold_resistance |= INTRINSIC;
X  		    }
X! 		} else if((ptr->mflags1 & M1_POIS_RES) && ptr->mlevel>rn2(20)) {
X  		/* Monsters with only M1_POIS are poison resistant themselves,
X  		 * but do not confer resistance when eaten
X  		 */
X--- 514,536 ----
X  			You("feel very jumpy.");
X  			HTeleportation |= INTRINSIC;
X  		    }
X! 		} else if(control_teleport(ptr) && ptr->mlevel > rn2(15)) {
X  		    if (!(HTeleport_control & INTRINSIC)) {
X  			You("feel in control of yourself.");
X  			HTeleport_control |= INTRINSIC;
X  		    }
X! 		} else if(resists_fire(ptr) && ptr->mlevel > rn2(15)) {
X  		    if (!(HFire_resistance & INTRINSIC)) {
X  			You("feel a momentary chill.");
X  			HFire_resistance |= INTRINSIC;
X  		    }
X! 		} else if(resists_cold(ptr) && ptr->mlevel > rn2(15)) {
X  		    if (!(HCold_resistance & INTRINSIC)) {
X  			You("feel full of hot air.");
X  			HCold_resistance |= INTRINSIC;
X  		    }
X! 		} else if(((ptr->mflags1 & M1_POIS_RES) && ptr->mlevel>rn2(15))
X! 		   || ((pm == PM_KILLER_BEE || pm == PM_SCORPION) && !rn2(4))) {
X  		/* Monsters with only M1_POIS are poison resistant themselves,
X  		 * but do not confer resistance when eaten
X  		 */
X***************
X*** 458,469 ****
X  			You("feel healthy.");
X  			HPoison_resistance |= INTRINSIC;
X  		    }
X! 		} else if(resists_elec(ptr) && ptr->mlevel > rn2(20)) {
X  		    if (!(HShock_resistance & INTRINSIC)) {
X  			Your("health currently feels amplified!");
X  			HShock_resistance |= INTRINSIC;
X  		    }
X! 		} else if((ptr->mflags1 & M1_SLEE_RES) && ptr->mlevel > rn2(20)) {
X  		/* Undead monsters never sleep,
X  		 * but also do not confer resistance when eaten
X  		 */
X--- 538,549 ----
X  			You("feel healthy.");
X  			HPoison_resistance |= INTRINSIC;
X  		    }
X! 		} else if(resists_elec(ptr) && ptr->mlevel > rn2(15)) {
X  		    if (!(HShock_resistance & INTRINSIC)) {
X  			Your("health currently feels amplified!");
X  			HShock_resistance |= INTRINSIC;
X  		    }
X! 		} else if((ptr->mflags1 & M1_SLEE_RES) && ptr->mlevel > rn2(15)) {
X  		/* Undead monsters never sleep,
X  		 * but also do not confer resistance when eaten
X  		 */
X***************
X*** 471,477 ****
X  			You("feel wide awake.");
X  			HSleep_resistance |= INTRINSIC;
X  		    }
X! 		} else if(resists_disint(ptr) && ptr->mlevel > rn2(20)) {
X  		    if (!(HDisint_resistance & INTRINSIC)) {
X  			You("feel very firm.");
X  			HDisint_resistance |= INTRINSIC;
X--- 551,557 ----
X  			You("feel wide awake.");
X  			HSleep_resistance |= INTRINSIC;
X  		    }
X! 		} else if(resists_disint(ptr) && ptr->mlevel > rn2(15)) {
X  		    if (!(HDisint_resistance & INTRINSIC)) {
X  			You("feel very firm.");
X  			HDisint_resistance |= INTRINSIC;
X***************
X*** 568,573 ****
X--- 648,659 ----
X  {
X  	register int tmp;
X  
X+ #ifdef POLYSELF
X+ 	if (metallivorous(uasmon)) {
X+ 		You("bite right into the metal can....");
X+ 		tmp = 1;
X+ 	} else
X+ #endif
X  	if (otmp->blessed) {
X  		pline("The tin opens like magic!");
X  		tmp = 1;
X***************
X*** 626,634 ****
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--- 712,729 ----
X  }
X  
X  static int
X! #ifdef POLYSELF
X! rottenfood(obj)
X! struct obj *obj;
X! #else
X! rottenfood()
X! #endif
X! {		/* called on the "first bite" of rotten food */
X! #ifdef POLYSELF
X! 	pline("Blecch!  Rotten %s!", foodword(obj));
X! #else
X  	pline("Blecch!  Rotten food!");
X+ #endif
X  	if(!rn2(4)) {
X  		if (Hallucination) You("feel rather trippy.");
X  		else You("feel rather %s.", body_part(LIGHT_HEADED));
X***************
X*** 654,660 ****
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 = 0;
X  
X  	tp = 0;
X--- 749,755 ----
X  eatcorpse(otmp)		/* called when a corpse is selected as food */
X  	register struct obj *otmp;
X  {
X! 	register const char *cname = mons[otmp->corpsenm].mname;
X  	register int tp, rotted = 0;
X  
X  	tp = 0;
X***************
X*** 680,686 ****
X  #endif
X  			make_sick(10L + rn2(10),FALSE);
X  			Sprintf(corpsename, "rotted %s corpse", cname);
X! 			u.usick_cause = corpsename;
X  			flags.botl = 1;
X  #ifdef POLYSELF
X  		}
X--- 775,781 ----
X  #endif
X  			make_sick(10L + rn2(10),FALSE);
X  			Sprintf(corpsename, "rotted %s corpse", cname);
X! 			u.usick_cause = (const char *)corpsename;
X  			flags.botl = 1;
X  #ifdef POLYSELF
X  		}
X***************
X*** 688,699 ****
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  		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--- 783,802 ----
X  		if (carried(otmp)) useup(otmp);
X  		else useupf(otmp);
X  		return(1);
X! 	} else if(acidic(&mons[otmp->corpsenm])
X! #ifdef POLYSELF
X! 		  && !resists_acid(uasmon)
X! #endif
X! 		 ) {
X! 		tp++;
X! 		You("have a very bad case of stomach acid.");
X! 		losehp(rnd(15), "acidic corpse", KILLED_BY_AN);
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", KILLED_BY_AN);
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***************
X*** 703,713 ****
X  							){
X  		tp++;
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--- 806,819 ----
X  							){
X  		tp++;
X  		You("feel%s sick.", (Sick) ? " very" : "");
X! 		losehp(rnd(8), "cadaver", KILLED_BY_AN);
X  	}
X  	if(!tp && otmp->corpsenm != PM_LIZARD && (otmp->orotten || !rn2(7))) {
X! #ifdef POLYSELF
X! 	    if(rottenfood(otmp)) {
X! #else
X  	    if(rottenfood()) {
X+ #endif
X  		otmp->orotten = TRUE;
X  		(void)touchfood(otmp);
X  		return(1);
X***************
X*** 715,724 ****
X  	    otmp->oeaten >>= 2;
X  	} else {
X  #ifdef POLYSELF
X! 	    pline("That %s corpse %s!", cname,
X! 		carnivorous(uasmon) ? "was delicious" : "tasted terrible");
X  #else
X! 	    pline("That %s corpse tasted terrible!", cname);
X  #endif
X  	}
X  
X--- 821,830 ----
X  	    otmp->oeaten >>= 2;
X  	} else {
X  #ifdef POLYSELF
X! 	    pline("This %s corpse %s!", cname,
X! 		carnivorous(uasmon) ? "is delicious" : "tastes terrible");
X  #else
X! 	    pline("This %s corpse tastes terrible!", cname);
X  #endif
X  	}
X  
X***************
X*** 739,750 ****
X  	debug("oeaten = %d", otmp->oeaten);
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, xname));
X  	set_occupation(eatfood, msgbuf, 0);
X  }
X--- 845,862 ----
X  	debug("oeaten = %d", otmp->oeaten);
X  #endif
X  	victual.fullwarn = victual.doreset = FALSE;
X  	victual.eating = TRUE;
X  
X  	if (otmp->otyp == CORPSE)
X  	    cprefx(victual.piece->corpsenm);
X  
X+ 	if (bite()) return;
X+ 
X+ 	if(++victual.usedtime >= victual.reqtime) {
X+ 	    done_eating(FALSE);
X+ 	    return;
X+ 	}
X+ 
X  	Sprintf(msgbuf, "eating the %s", singular(otmp, xname));
X  	set_occupation(eatfood, msgbuf, 0);
X  }
X***************
X*** 829,834 ****
X--- 941,992 ----
X  	}
X  }
X  
X+ #ifdef POLYSELF
X+ static void
X+ eatspecial() /* called after eating non-food */
X+ {
X+ 	register struct obj *otmp = victual.piece;
X+ 
X+ 	lesshungry(victual.nmod);
X+ 	victual.piece = (struct obj *)0;
X+ 	victual.eating = 0;
X+ 	if (otmp->olet == GOLD_SYM) { /* temporary gold object */
X+ 		free ((genericptr_t)otmp);
X+ 		return;
X+ 	}
X+ 	if (otmp->olet == POTION_SYM) {
X+ 		otmp->quan++; /* dopotion() does a useup() */
X+ 		(void)dopotion(otmp);
X+ 	}
X+ 	if (otmp == uball) unpunish();
X+ 	if (otmp == uchain) unpunish(); /* but no useup() */
X+ 	else if (carried(otmp)) useup(otmp);
X+ 	else useupf(otmp);
X+ }
X+ 
X+ static const char *
X+ foodword(otmp)
X+ register struct obj *otmp;
X+ {
X+ 	if (otmp->olet == FOOD_SYM) return "food";
X+ 	if (otmp->olet == GOLD_SYM) return "gold";
X+ 	if (objects[otmp->otyp].oc_material == GLASS) {
X+ 		if (otmp->olet == GEM_SYM && otmp->dknown)
X+ 			makeknown(otmp->otyp);
X+ 		return "glass";
X+ 	}
X+ 	if (objects[otmp->otyp].oc_material > WOOD &&
X+ 			objects[otmp->otyp].oc_material < MINERAL)
X+ 		return "metal";
X+ 	if (objects[otmp->otyp].oc_material == MINERAL)
X+ 		return (otmp->otyp <= LAST_GEM && otmp->olet == GEM_SYM)
X+ 			? "rich food" : "stone";
X+ 	if (objects[otmp->otyp].oc_material == WOOD) return "wood";
X+ 	if (otmp->olet == ARMOR_SYM) return "armor";
X+ 	return "stuff";
X+ }
X+ #endif
X+ 
X  static void
X  fpostfx(otmp)		/* called after consuming (non-corpse) food */
X  
X***************
X*** 859,865 ****
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--- 1017,1024 ----
X  			if(!rn2(17)) u.uhpmax++;
X  			u.uhp = u.uhpmax;
X  		} else if(u.uhp <= 0) {
X! 			killer_format = KILLED_BY_AN;
X! 			killer = "rotten lump of royal jelly";
X  			done(POISONING);
X  		}
X  		if(!otmp->cursed) heal_legs();
X***************
X*** 870,875 ****
X--- 1029,1035 ----
X  		    if(!resists_ston(uasmon)) {
X  #endif
X  			if (!Stoned) Stoned = 5;
X+ 			killer_format = KILLED_BY_AN;
X  			killer = "cockatrice egg";
X  #ifdef POLYSELF
X  		    }
X***************
X*** 885,898 ****
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--- 1045,1112 ----
X  	register struct obj *otmp;
X  	int basenutrit; 		/* nutrition of full item */
X  
X+ 	if (Strangled) {
X+ 		pline("If you can't breathe air, how can you consume solids?");
X+ 		return 0;
X+ 	}
X  	if (!(otmp = floorfood("eat", 0))) return 0;
X+ #ifdef POLYSELF
X+ 	/* We have to make non-foods take no time to eat, unless we want to
X+ 	 * do ridiculous amounts of coding to deal with partly eaten plate
X+ 	 * mails, players who polymorph back to human in the middle of their
X+ 	 * metallic meal, etc....
X+ 	 */
X+ 	if (!is_edible(otmp)) {
X+ 	    You("cannot eat that!");
X+ 	    if (otmp->olet == GOLD_SYM) { /* temp gold object */
X+ 		if (otmp->ox) mkgold(OGOLD(otmp), u.ux, u.uy);
X+ 		else u.ugold += OGOLD(otmp);
X+ 		free((genericptr_t) otmp);
X+ 	    }
X+ 	    return 0;
X+ 	}
X+ 	if (otmp->olet != FOOD_SYM) {
X+ 	    victual.reqtime = 1;
X+ 	    victual.piece = otmp;
X+ 		/* Don't split it, we don't need to if it's 1 move */
X+ 	    victual.usedtime = 0;
X+ 	    victual.canchoke = (u.uhs == SATIATED);
X+ 	    if (otmp->olet == GOLD_SYM)
X+ 		basenutrit = ((OGOLD(otmp) > 5000L) ? 5000 : (int)OGOLD(otmp));
X+ 	    else basenutrit = otmp->owt * 10 / otmp->quan;
X+ 	    victual.nmod = basenutrit;
X+ 	    victual.eating = TRUE; /* needed for lesshungry() */
X+ 		
X+ 	    if (otmp->cursed) 
X+ 		(void) rottenfood(otmp);
X+ 
X+ 	    if (otmp->olet == WEAPON_SYM && otmp->opoisoned) {
X+ 		pline("Ecch - that must have been poisonous!");
X+ 		if(!Poison_resistance) {
X+ 		    losestr(rnd(4));
X+ 		    losehp(rnd(15), xname(otmp), KILLED_BY_AN);
X+ 		} else
X+ 		    You("seem unaffected by the poison.");
X+ 	    } else if (!otmp->cursed)
X+ 		pline("This %s is delicious!",
X+ 		    otmp->olet == GOLD_SYM ? "gold" : xname(otmp));
X+ 	    eatspecial();
X+ 	    return 1;
X+ 	}
X+ #endif
X  
X  	if(otmp == victual.piece) {
X! 	/* If they weren't able to choke, they don't suddenly become able to
X! 	 * choke just because they were interrupted.  On the other hand, if
X! 	 * they were able to choke before, if they lost food it's possible
X! 	 * they shouldn't be able to choke now.
X! 	 */
X! 	    if (u.uhs != SATIATED) victual.canchoke = FALSE;
X  	    if(!carried(victual.piece)) {
X  		if(victual.piece->quan != 1)
X  			(void) splitobj(victual.piece, 1);
X  	    }
X+ 	    You("resume your meal.");
X  	    start_eating(victual.piece);
X  	    return(1);
X  	}
X***************
X*** 919,932 ****
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--- 1133,1150 ----
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! #ifdef POLYSELF
X! 		if(rottenfood(otmp)) {
X! #else
X!   		if(rottenfood()) {
X! #endif
X  		    otmp->orotten = TRUE;
X  		    return(1);
X  		}
X! 		otmp->oeaten >>= 1;
X  	    } else fprefx(otmp);
X  	}
X  
X***************
X*** 956,966 ****
X--- 1174,1213 ----
X  	    victual.nmod = -(otmp->oeaten / victual.reqtime);
X  	else
X  	    victual.nmod = victual.reqtime % otmp->oeaten;
X+ 	victual.canchoke = (u.uhs == SATIATED);
X  
X  	start_eating(otmp);
X  	return(1);
X  }
X  
X+ /* Take a single bite from a piece of food, checking for choking and
X+  * modifying usedtime.  Returns 1 if they choked and survived, 0 otherwise.
X+  */
X+ static int
X+ bite()
X+ {
X+ 	if(victual.canchoke && u.uhunger >= 2000) {
X+ 		choke(victual.piece);
X+ 		return 1;
X+ 	}
X+ 	if (victual.doreset) {
X+ 		do_reset_eat();
X+ 		return 0;
X+ 	}
X+ 	if(victual.nmod < 0) {
X+ 		lesshungry(-victual.nmod);
X+ 		victual.piece->oeaten -= -victual.nmod;
X+ 	} else if(victual.nmod > 0 && (victual.usedtime % victual.nmod)) {
X+ 		lesshungry(1);
X+ 		victual.piece->oeaten--;
X+ 	}
X+ 	recalc_wt();
X+ 	return 0;
X+ }
X+ 
X+ #endif /* OVLB */
X+ #ifdef OVL0
X+ 
X  void
X  gethungry() {		/* as time goes by - called in main.c */
X  	--u.uhunger;
X***************
X*** 983,988 ****
X--- 1230,1237 ----
X  	newuhs(TRUE);
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X  
X  void
X  morehungry(num)	/* called after vomiting and after performing feats of magic */
X***************
X*** 1002,1011 ****
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--- 1251,1263 ----
X  #endif
X  	u.uhunger += num;
X  	if(u.uhunger >= 2000) {
X! 	    if (!victual.eating || victual.canchoke)
X! 		if (victual.eating) {
X! 			choke(victual.piece);
X! 			reset_eat();
X! 		} else
X! 			choke((struct obj *) 0);
X! 			/* no reset_eat(); it was a non-food such as juice */
X  	} else {
X  	    /* Have lesshungry() report when you're nearly full so all eating
X  	     * warns when you're about to choke.
X***************
X*** 1040,1045 ****
X--- 1292,1322 ----
X  	return 0;
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL0
X+ 
X+ boolean
X+ is_fainted() {
X+ 	return(u.uhs == FAINTED);
X+ }
X+ 
X+ void
X+ reset_faint() {	/* call when a faint must be prematurely terminated */
X+ 	if(is_fainted()) nomul(0);
X+ }
X+ 
X+ void
X+ sync_hunger() {
X+ 
X+ 	if(is_fainted()) {
X+ 
X+ 		flags.soundok = 0;
X+ 		nomul(-10+(u.uhunger/10));
X+ 		nomovemsg = "You regain consciousness.";
X+ 		afternmv = unfaint;
X+ 	}
X+ }
X+ 
X  void
X  newuhs(incr)		/* compute and comment on your (new?) hunger status */
X  	boolean incr;
X***************
X*** 1052,1060 ****
X  		(h > 0) ? WEAK : FAINTING;
X  
X  	if(newhs == FAINTING) {
X! 		if(u.uhs == FAINTED) newhs = FAINTED;
X  		if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) {
X! 			if(u.uhs != FAINTED && multi >= 0 /* %% */) {
X  				You("faint from lack of food.");
X  				flags.soundok = 0;
X  				nomul(-10+(u.uhunger/10));
X--- 1329,1337 ----
X  		(h > 0) ? WEAK : FAINTING;
X  
X  	if(newhs == FAINTING) {
X! 		if(is_fainted()) newhs = FAINTED;
X  		if(u.uhs <= WEAK || rn2(20-u.uhunger/10) >= 19) {
X! 			if(!is_fainted() && multi >= 0 /* %% */) {
X  				You("faint from lack of food.");
X  				flags.soundok = 0;
X  				nomul(-10+(u.uhunger/10));
X***************
X*** 1068,1073 ****
X--- 1345,1351 ----
X  			flags.botl = 1;
X  			bot();
X  			You("die from starvation.");
X+ 			killer_format = KILLED_BY;
X  			killer = "starvation";
X  			done(STARVING);
X  		}
X***************
X*** 1104,1109 ****
X--- 1382,1388 ----
X  		flags.botl = 1;
X  		if(u.uhp < 1) {
X  			You("die from hunger and exhaustion.");
X+ 			killer_format = KILLED_BY;
X  			killer = "exhaustion";
X  			done(STARVING);
X  		}
X***************
X*** 1110,1129 ****
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  	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--- 1389,1435 ----
X  	}
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
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! 	const char *verb;
X  	boolean corpseonly;
X  {
X  	register struct obj *otmp;
X! #ifdef POLYSELF
X! 	struct gold *gold = g_at(u.ux, u.uy);
X! 	boolean feeding = (!strcmp(verb, "eat"));
X! #endif
X! #ifdef POLYSELF
X! 	if (feeding && gold && metallivorous(uasmon)) {
X! 	    if (gold->amount == 1)
X! 		pline("There is 1 gold piece here; eat it? ");
X! 	    else pline("There are %ld gold pieces here; eat them? ",
X! 								gold->amount);
X! 	    if (yn() == 'y') {
X! 		otmp = newobj(0);
X! 		otmp->olet = GOLD_SYM;
X! 		otmp->ox = u.ux;
X! 		otmp->oy = u.uy;
X! 		OGOLD(otmp) = gold->amount;
X! 		freegold(gold);
X! 		return otmp;
X! 	    }
X! 	}
X! #endif
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 : 
X! #ifdef POLYSELF
X! 		    feeding ? is_edible(otmp) :
X! #endif
X! 						otmp->olet==FOOD_SYM) {
X  			pline("There %s %s here; %s %s? ",
X  				(otmp->quan == 1) ? "is" : "are",
X  				doname(otmp), verb,
X***************
X*** 1133,1139 ****
X--- 1439,1453 ----
X  		}
X  	    }
X  	}
X+ #ifdef POLYSELF
X+ 	/* We cannot use "#" since that causes getobj() to skip its
X+ 	 * "ugly checks" and we need to check for inedible items.
X+ 	 */
X+ 	return getobj (feeding ? (const char *)everything :
X+ 				 (const char *)comestibles, verb);
X+ #else
X  	return getobj(comestibles, verb);
X+ #endif
X  }
X  
X  /* Side effects of vomiting */
X***************
X*** 1152,1158 ****
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--- 1466,1477 ----
X  {
X  	base *= obj->oeaten;
X  
X! 	if (obj->otyp == CORPSE) 
X! 	    base = mons[obj->corpsenm].cnutrit ?
X! 				base / mons[obj->corpsenm].cnutrit : 0;
X! 	else base = objects[obj->otyp].nutrition ?
X! 				base / objects[obj->otyp].nutrition : 0;
X  	return (base < 1) ? 1 : base;
X  }
X+ 
X+ #endif /* OVLB */
X*** src/Old/getline.c	Mon Feb 19 18:04:54 1990
X--- src/getline.c	Mon Feb 19 14:45:59 1990
X***************
X*** 12,22 ****
X--- 12,30 ----
X  #if defined(SYSV) || defined(DGUX)
X  #define	NR_OF_EOFS	20
X  #endif
X+ #ifdef MACOS
X+ extern short macflags;
X+ #endif
X+ #ifdef OVL1
X  
X  char morc = 0;	/* tell the outside world what char he used */
X  
X+ #endif /* OVL1 */
X+ 
X  extern char erase_char, kill_char;	/* from appropriate tty.c file */
X  
X+ #ifdef OVL1
X+ 
X  /*
X   * Read a line closed with '\n' into the array char bufp[BUFSZ].
X   * (The '\n' is not stored. The string is closed with a '\0'.)
X***************
X*** 29,45 ****
X  {
X  	register char *obufp = bufp;
X  	register int c;
X! 
X  	flags.toplin = 2;		/* nonempty, no --More-- required */
X  	for(;;) {
X  		(void) fflush(stdout);
X  		if((c = Getchar()) == EOF) {
X  			*bufp = 0;
X  			return;
X  		}
X  		if(c == '\033') {
X  			*obufp = c;
X  			obufp[1] = 0;
X  			return;
X  		}
X  		if(c == erase_char || c == '\b') {
X--- 37,64 ----
X  {
X  	register char *obufp = bufp;
X  	register int c;
X! #ifdef MACOS
X! 	short	tmpflags;
X! 	
X! 	tmpflags = macflags;
X! 	macflags &= ~fDoNonKeyEvt;
X! #endif
X  	flags.toplin = 2;		/* nonempty, no --More-- required */
X  	for(;;) {
X  		(void) fflush(stdout);
X  		if((c = Getchar()) == EOF) {
X  			*bufp = 0;
X+ #ifdef MACOS
X+ 	macflags |= (tmpflags & fDoNonKeyEvt);
X+ #endif
X  			return;
X  		}
X  		if(c == '\033') {
X  			*obufp = c;
X  			obufp[1] = 0;
X+ #ifdef MACOS
X+ 	macflags |= (tmpflags & fDoNonKeyEvt);
X+ #endif
X  			return;
X  		}
X  		if(c == erase_char || c == '\b') {
X***************
X*** 49,54 ****
X--- 68,76 ----
X  			} else	bell();
X  		} else if(c == '\n') {
X  			*bufp = 0;
X+ #ifdef MACOS
X+ 	macflags |= (tmpflags & fDoNonKeyEvt);
X+ #endif
X  			return;
X  		} else if(' ' <= c && c < '\177' && 
X  			    (bufp-obufp < BUFSZ-1 || bufp-obufp < COLNO)) {
X***************
X*** 70,77 ****
X--- 92,105 ----
X  		} else
X  			bell();
X  	}
X+ #ifdef MACOS
X+ 	macflags |= (tmpflags & fDoNonKeyEvt);
X+ #endif
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVLB
X+ 
X  void
X  getret() {
X  	cgetret("");
X***************
X*** 79,85 ****
X  
X  void
X  cgetret(s)
X! register char *s;
X  {
X  	putsym('\n');
X  	if(flags.standout)
X--- 107,113 ----
X  
X  void
X  cgetret(s)
X! register const char *s;
X  {
X  	putsym('\n');
X  	if(flags.standout)
X***************
X*** 92,118 ****
X  	xwaitforspace(s);
X  }
X  
X  
X  void
X  xwaitforspace(s)
X! register char *s;	/* chars allowed besides space or return */
X  {
X  	register int c;
X  
X  	morc = 0;
X  
X  	while((c = readchar()) != '\n') {
X  	    if(flags.cbreak) {
X! 		if(c == ' ') break;
X! 		if(s && index(s,c)) {
X! 			morc = c;
X! 			break;
X! 		}
X! 		bell();
X  	    }
X  	}
X  }
X  
X  static int last_multi;
X  
X  char *
X--- 120,161 ----
X  	xwaitforspace(s);
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL1
X  
X  void
X  xwaitforspace(s)
X! register const char *s;	/* chars allowed besides space or return */
X  {
X  	register int c;
X  
X  	morc = 0;
X+ #ifdef MACOS
X+ 	flags.wantspace = TRUE;
X+ #endif
X  
X  	while((c = readchar()) != '\n') {
X+ #ifdef MACOS
X+ 		if(c == '\r' || c == 0x3 || c == 'p') break;
X+ #endif
X  	    if(flags.cbreak) {
X! 			if(c == ' ') break;
X! 			if(s && index(s,c)) {
X! 				morc = c;
X! 				break;
X! 			}
X! 			bell();
X  	    }
X  	}
X+ 
X+ #ifdef MACOS
X+ 	flags.wantspace = FALSE;
X+ #endif
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVL0
X+ 
X  static int last_multi;
X  
X  char *
X***************
X*** 131,156 ****
X  	curs_on_u();
X  
X  	if (!flags.num_pad || (foo = readchar()) == 'n')
X! 	    while((foo = readchar()) >= '0' && foo <= '9') {
X! 		multi = 10*multi+foo-'0';
X! 		if (multi < 0 || multi > LARGEST_INT)
X! 			multi = LARGEST_INT;
X! 		if (multi > 9) {
X! 			remember_topl();
X! 			home();
X! 			cl_end();
X! 			Printf("Count: %d", multi);
X! 		}
X! 		last_multi = multi;
X! 		if(!cnt && foo == '0') prezero = TRUE;
X! 		cnt++;
X! 	    }
X! 	    if (foo == '\033') {   /* esc cancels count (TH) */
X! 		remember_topl();
X! 		home();
X! 		cl_end();
X! 		multi = last_multi = 0;
X! 	    }
X  # ifdef REDO
X  	if (foo == DOAGAIN || in_doagain)
X  		multi = last_multi;
X--- 174,202 ----
X  	curs_on_u();
X  
X  	if (!flags.num_pad || (foo = readchar()) == 'n')
X! 	    do {
X! 	    	foo = readchar();
X! 	    	if(foo >= '0' && foo <= '9') {
X! 				multi = 10*multi+foo-'0';
X! 				if (multi < 0 || multi > LARGEST_INT)
X! 					multi = LARGEST_INT;
X! 				if (multi > 9) {
X! 					remember_topl();
X! 					home();
X! 					cl_end();
X! 					Printf("Count: %d", multi);
X! 				}
X! 				last_multi = multi;
X! 				if(!cnt && foo == '0') prezero = TRUE;
X! 				cnt++;
X! 		    }
X! 		    if (foo == '\033') {   /* esc cancels count (TH) */
X! 				remember_topl();
X! 				home();
X! 				cl_end();
X! 				multi = last_multi = 0;
X! 		    }
X! 		} while(foo >= '0' && foo <= '9');
X  # ifdef REDO
X  	if (foo == DOAGAIN || in_doagain)
X  		multi = last_multi;
X***************
X*** 184,189 ****
X--- 230,238 ----
X  	return(in_line);
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X+ 
X  #ifdef UNIX
X  static void
X  end_of_input()
X***************
X*** 194,199 ****
X--- 243,251 ----
X  }
X  #endif
X  
X+ #endif /* OVLB */
X+ #ifdef OVL0
X+ 
X  char
X  readchar() {
X  	register int sym;
X***************
X*** 226,231 ****
X--- 278,286 ----
X  	return((char) sym);
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVL2
X+ 
X  #ifdef COM_COMPL
X  /* Read in an extended command - doing command line completion for
X   * when enough characters have been entered to make a unique command.
X***************
X*** 303,305 ****
X--- 358,362 ----
X  
X  }
X  #endif /* COM_COMPL */
X+ 
X+ #endif /* OVL2 */
X
END_OF_FILE
if test 56128 -ne `wc -c <'patch7.03'`; then
    echo shar: \"'patch7.03'\" unpacked with wrong size!
fi
# end of 'patch7.03'
echo shar: End of archive 7 \(of 30\).
cp /dev/null ark7isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 30 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