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

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

Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 8, Issue 62
Archive-name: NetHack3/Patch6i
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 9 (of 15)."
# Contents:  patches06i
# Wrapped by billr@saab on Wed Nov 22 11:10:41 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patches06i' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patches06i'\"
else
echo shar: Extracting \"'patches06i'\" \(57020 characters\)
sed "s/^X//" >'patches06i' <<'END_OF_FILE'
X*** src/Old/mondata.c	Sun Nov 19 13:46:38 1989
X--- src/mondata.c	Sun Nov 19 09:25:29 1989
X***************
X*** 1,4 ****
X! /*	SCCS Id: @(#)mondata.c	3.0	89/01/10
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: @(#)mondata.c	3.0	89/11/19
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X***************
X*** 61,68 ****
X  breakarm(ptr)	/* creature will break out of armor */
X  	register struct permonst *ptr;
X  {
X! 	return(bigmonst(ptr) || (!verysmall(ptr) && !humanoid(ptr))
X! #ifdef HARD
X  	       || ptr == &mons[PM_MARILITH]
X  #endif
X  	       );
X--- 61,68 ----
X  breakarm(ptr)	/* creature will break out of armor */
X  	register struct permonst *ptr;
X  {
X! 	return(bigmonst(ptr) || (ptr->msize > MZ_SMALL && !humanoid(ptr))
X! #ifdef INFERNO
X  	       || ptr == &mons[PM_MARILITH]
X  #endif
X  	       );
X***************
X*** 77,83 ****
X  sliparm(ptr)	/* creature will slide out of armor */
X  	register struct permonst *ptr;
X  {
X! 	return(!bigmonst(ptr) && (verysmall(ptr) || ptr == &mons[PM_GHOST]));
X  }
X  #endif
X  
X--- 77,84 ----
X  sliparm(ptr)	/* creature will slide out of armor */
X  	register struct permonst *ptr;
X  {
X! 	return(ptr->msize < MZ_LARGE &&
X! 	       (ptr->msize <= MZ_SMALL || ptr == &mons[PM_GHOST]));
X  }
X  #endif
X  
X***************
X*** 162,168 ****
X  	else if (!strncmp(str, "an ", 3)) str += 3;
X  
X  	/* Some irregular plurals */
X! #ifdef HARD
X  	if (!strncmp(str, "incubi", 6)) return PM_INCUBUS;
X  	if (!strncmp(str, "succubi", 7)) return PM_SUCCUBUS;
X  #endif
X--- 163,169 ----
X  	else if (!strncmp(str, "an ", 3)) str += 3;
X  
X  	/* Some irregular plurals */
X! #ifdef INFERNO
X  	if (!strncmp(str, "incubi", 6)) return PM_INCUBUS;
X  	if (!strncmp(str, "succubi", 7)) return PM_SUCCUBUS;
X  #endif
X***************
X*** 234,240 ****
X  	if (mtmp->data->mflags1 & M1_FEM) return 1;
X  	if (mtmp->data == &mons[PM_CAVEMAN]
X  		|| mtmp->data == &mons[PM_PRIEST]
X! #ifdef HARD
X  		|| mtmp->data == &mons[PM_INCUBUS]
X  #endif
X  						) return 0;
X--- 235,241 ----
X  	if (mtmp->data->mflags1 & M1_FEM) return 1;
X  	if (mtmp->data == &mons[PM_CAVEMAN]
X  		|| mtmp->data == &mons[PM_PRIEST]
X! #ifdef INFERNO
X  		|| mtmp->data == &mons[PM_INCUBUS]
X  #endif
X  						) return 0;
X***************
X*** 327,338 ****
X  
X  int
X  bigmonst(ptr) struct permonst *ptr; {
X! 	return((ptr->mflags1 & M1_BIG) != 0L);
X  }
X  
X  int
X  verysmall(ptr) struct permonst *ptr; {
X! 	return((ptr->mflags1 & M1_VSMALL) != 0L);
X  }
X  
X  int
X--- 328,339 ----
X  
X  int
X  bigmonst(ptr) struct permonst *ptr; {
X! 	return(ptr->msize >= MZ_LARGE);
X  }
X  
X  int
X  verysmall(ptr) struct permonst *ptr; {
X! 	return(ptr->msize < MZ_SMALL);
X  }
X  
X  int
X***************
X*** 569,586 ****
X  	return((ptr->mflags1 & M1_PRINCE) != 0L);
X  }
X  
X! # ifdef HARD
X  int
X  is_ndemon(ptr) struct permonst *ptr; {
X  	return(is_demon(ptr) &&
X  		(ptr->mflags1 & (M1_LORD | M1_PRINCE)) == 0L);
X  }
X! # else /* HARD */
X  int
X  is_ndemon(ptr) struct permonst *ptr; {
X  	return(ptr == &mons[PM_DEMON]);
X  }
X! # endif /* HARD */
X  
X  int
X  is_dlord(ptr) struct permonst *ptr; {
X--- 570,587 ----
X  	return((ptr->mflags1 & M1_PRINCE) != 0L);
X  }
X  
X! # ifdef INFERNO
X  int
X  is_ndemon(ptr) struct permonst *ptr; {
X  	return(is_demon(ptr) &&
X  		(ptr->mflags1 & (M1_LORD | M1_PRINCE)) == 0L);
X  }
X! # else
X  int
X  is_ndemon(ptr) struct permonst *ptr; {
X  	return(ptr == &mons[PM_DEMON]);
X  }
X! # endif
X  
X  int
X  is_dlord(ptr) struct permonst *ptr; {
X*** src/Old/monmove.c	Sun Nov 19 13:47:18 1989
X--- src/monmove.c	Wed Nov  8 22:56:55 1989
X***************
X*** 43,50 ****
X  			!(here->diggable & W_NONDIGGABLE)) {
X  		if(flags.soundok && flags.verbose && !rn2(5))
X  		       You("hear the sound of crashing rock.");
X! 		here->typ = DOOR;
X! 		here->doormask = D_NODOOR;
X  	    }
X  	}
X  	/* Eats away door if present & closed or locked */
X--- 43,55 ----
X  			!(here->diggable & W_NONDIGGABLE)) {
X  		if(flags.soundok && flags.verbose && !rn2(5))
X  		       You("hear the sound of crashing rock.");
X! 		if(!is_maze_lev) {
X! 		  here->typ = DOOR;
X! 		  here->doormask = D_NODOOR;
X! 		}
X! 		else
X! 		  here->typ = ROOM;
X! 		mnewsym(mtmp->mx, mtmp->my);
X  	    }
X  	}
X  	/* Eats away door if present & closed or locked */
X***************
X*** 52,62 ****
X--- 57,69 ----
X  		(here->doormask & (D_LOCKED | D_CLOSED))) {
X  		if(here->doormask & D_TRAPPED) {
X  		    here->doormask = D_NODOOR;
X+ 		    mnewsym(mtmp->mx, mtmp->my);
X  		    if(mb_trapped(mtmp)) return(FALSE);
X  		} else {
X  		    if(!rn2(3) && flags.verbose) /* not too often.. */
X  		        You("feel an unexpected draft of air.");
X  		    here->doormask = D_BROKEN;
X+ 		    mnewsym(mtmp->mx, mtmp->my);
X  		}
X  	    }
X  	else return TRUE; /* it doesn't leave rocks if it didn't dig */
X***************
X*** 132,138 ****
X  
X  	*inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <=
X  							(BOLT_LIM * BOLT_LIM));
X! 	*nearby = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) < 3);
X  
X  	/* Note: if your image is displaced, the monster sees the Elbereth
X  	 * at your displaced position, thus never attacking your displaced
X--- 139,145 ----
X  
X  	*inrange = (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <=
X  							(BOLT_LIM * BOLT_LIM));
X! 	*nearby = monnear(mtmp, mtmp->mux, mtmp->muy);
X  
X  	/* Note: if your image is displaced, the monster sees the Elbereth
X  	 * at your displaced position, thus never attacking your displaced
X***************
X*** 232,238 ****
X  	/* check distance and scariness of attacks */
X  	distfleeck(mtmp,&inrange,&nearby,&scared);
X  
X! #ifdef HARD	/* Demonic Blackmail!!! */
X  	if(nearby && is_demon(mdat) && mtmp->mpeaceful && !mtmp->mtame) {
X  		if (mtmp->mux != u.ux || mtmp->muy != u.uy) {
X  			pline("%s whispers something to thin air.",
X--- 239,245 ----
X  	/* check distance and scariness of attacks */
X  	distfleeck(mtmp,&inrange,&nearby,&scared);
X  
X! #ifdef INFERNO		/* Demonic Blackmail!!! */
X  	if(nearby && is_demon(mdat) && mtmp->mpeaceful && !mtmp->mtame) {
X  		if (mtmp->mux != u.ux || mtmp->muy != u.uy) {
X  			pline("%s whispers something to thin air.",
X***************
X*** 619,638 ****
X  			/* can't lock out shk */
X  		    if(btrapped) {
X  			here->doormask = D_NODOOR;
X  			if(mb_trapped(mtmp)) return(2);
X  		    } else {
X  			if (flags.verbose) {
X  			    if (canseeit)
X! 			       You("see a door being unlocked and opened.");
X  			    else if (flags.soundok)
X  			       You("hear a door being unlocked and opened.");
X  		        }
X  		        here->doormask = D_ISOPEN;
X  		    }
X  		} else if (here->doormask == D_CLOSED && 
X  					!nohands(mtmp->data)) {
X  		    if(btrapped) {
X  			here->doormask = D_NODOOR;
X  			if(mb_trapped(mtmp)) return(2);
X  		    } else {
X  		        if (flags.verbose) {
X--- 626,651 ----
X  			/* can't lock out shk */
X  		    if(btrapped) {
X  			here->doormask = D_NODOOR;
X+ 			mnewsym(mtmp->mx, mtmp->my);
X+ 			if (canseeit) prl(mtmp->mx,mtmp->my);
X  			if(mb_trapped(mtmp)) return(2);
X  		    } else {
X  			if (flags.verbose) {
X  			    if (canseeit)
X! 			      You("see a door being unlocked and opened.");
X  			    else if (flags.soundok)
X  			       You("hear a door being unlocked and opened.");
X  		        }
X  		        here->doormask = D_ISOPEN;
X+ 			mnewsym(mtmp->mx, mtmp->my);
X+ 			if (canseeit) prl(mtmp->mx,mtmp->my);
X  		    }
X  		} else if (here->doormask == D_CLOSED && 
X  					!nohands(mtmp->data)) {
X  		    if(btrapped) {
X  			here->doormask = D_NODOOR;
X+ 			mnewsym(mtmp->mx, mtmp->my);
X+ 			if (canseeit) prl(mtmp->mx,mtmp->my);
X  			if(mb_trapped(mtmp)) return(2);
X  		    } else {
X  		        if (flags.verbose) {
X***************
X*** 642,652 ****
X--- 655,669 ----
X  			         You("hear the sound of a door opening.");
X  		        }
X  		        here->doormask = D_ISOPEN;
X+ 			mnewsym(mtmp->mx, mtmp->my);
X+ 			if (canseeit) prl(mtmp->mx,mtmp->my);
X  		    }
X  		} else if(here->doormask & (D_LOCKED | D_CLOSED)) {
X  			/* mfndpos guarantees monster is a giant */
X  		    if(btrapped) {
X  			here->doormask = D_NODOOR;
X+ 			mnewsym(mtmp->mx, mtmp->my);
X+ 			if (canseeit) prl(mtmp->mx,mtmp->my);
X  			if(mb_trapped(mtmp)) return(2);
X  		    } else {
X  		        if (flags.verbose) {
X***************
X*** 658,666 ****
X  		        if (here->doormask & D_LOCKED && !rn2(2))
X  			        here->doormask = D_NODOOR;
X  		        else here->doormask = D_BROKEN;
X  		    }
X  		}
X! 	    }
X  	    /* Maybe a rock mole just ate something? */
X  	    if(can_tunnel) if(!mdig_tunnel(mtmp)) return(2); /* died? */
X  
X--- 675,685 ----
X  		        if (here->doormask & D_LOCKED && !rn2(2))
X  			        here->doormask = D_NODOOR;
X  		        else here->doormask = D_BROKEN;
X+ 			mnewsym(mtmp->mx, mtmp->my);
X+ 			if (canseeit) prl(mtmp->mx,mtmp->my);
X  		    }
X  		}
X! 	      }
X  	    /* Maybe a rock mole just ate something? */
X  	    if(can_tunnel) if(!mdig_tunnel(mtmp)) return(2); /* died? */
X  
X*** src/Old/mthrowu.c	Sun Nov 19 13:50:51 1989
X--- src/mthrowu.c	Tue Oct 31 11:04:38 1989
X***************
X*** 28,50 ****
X  	struct obj *obj;
X  	register char *name;
X  {
X! 	char buf[BUFSZ];
X  	boolean acidic = (obj && obj->otyp == ACID_VENOM);
X  
X- 	setan(name, buf);
X  	if(u.uac + tlev <= rnd(20)) {
X  		if(Blind || !flags.verbose) pline("It misses.");
X! 		else You("are almost hit by %s!", buf);
X  		return(0);
X  	} else {
X  		if(Blind || !flags.verbose) You("are hit!");
X! 		else You("are hit by %s!", buf);
X  #ifdef POLYSELF
X  		if (obj && obj->otyp == SILVER_ARROW && (u.ulycn != -1 ||
X  				is_demon(uasmon) || u.usym == S_VAMPIRE ||
X  				(u.usym == S_IMP && u.umonnum != PM_TENGU))) {
X  			dam += rnd(20);
X! 			pline("You feel the %sarrow sear your flesh!",
X  				Blind ? "" : "silver ");
X  		}
X  		if (acidic && resists_acid(uasmon))
X--- 28,49 ----
X  	struct obj *obj;
X  	register char *name;
X  {
X! 	char *oname = an(name);
X  	boolean acidic = (obj && obj->otyp == ACID_VENOM);
X  
X  	if(u.uac + tlev <= rnd(20)) {
X  		if(Blind || !flags.verbose) pline("It misses.");
X! 		else You("are almost hit by %s!", oname);
X  		return(0);
X  	} else {
X  		if(Blind || !flags.verbose) You("are hit!");
X! 		else You("are hit by %s!", oname);
X  #ifdef POLYSELF
X  		if (obj && obj->otyp == SILVER_ARROW && (u.ulycn != -1 ||
X  				is_demon(uasmon) || u.usym == S_VAMPIRE ||
X  				(u.usym == S_IMP && u.umonnum != PM_TENGU))) {
X  			dam += rnd(20);
X! 			pline("The %sarrow sears your flesh!",
X  				Blind ? "" : "silver ");
X  		}
X  		if (acidic && resists_acid(uasmon))
X***************
X*** 268,273 ****
X--- 267,276 ----
X  {
X  	struct obj *otmp, *prev;
X  
X+ 	if (obj->quan > 1) {
X+ 		obj->quan--;
X+ 		return;
X+ 	}
X  	prev = ((struct obj *) 0);
X  	for (otmp = mon->minvent; otmp; otmp = otmp->nobj) {
X  		if (otmp == obj) {
X***************
X*** 315,323 ****
X  			|| otmp->otyp == CROSSBOW_BOLT) verb = "shoots";
X  		    otmp->quan = 1;
X  		    if (canseemon(mtmp))
X! 			pline("%s %s a%s %s!", Monnam(mtmp), verb,
X! 				index(vowels,*(xname(otmp))) ? "n" : "",
X! 				xname(otmp));
X  		    otmp->quan = savequan;
X  		    m_throw(mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), 
X  			movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy), otmp);
X--- 318,324 ----
X  			|| otmp->otyp == CROSSBOW_BOLT) verb = "shoots";
X  		    otmp->quan = 1;
X  		    if (canseemon(mtmp))
X! 			pline("%s %s %s!", Monnam(mtmp), verb, an(xname(otmp)));
X  		    otmp->quan = savequan;
X  		    m_throw(mtmp->mx, mtmp->my, sgn(tbx), sgn(tby), 
X  			movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy), otmp);
X*** src/Old/music.c	Sun Nov 19 13:51:12 1989
X--- src/music.c	Fri Nov 10 11:01:03 1989
X***************
X*** 253,260 ****
X--- 253,262 ----
X  			    if (cansee(x,y))
X  				pline("The door collapses.");
X  			    levl[x][y].doormask = D_NODOOR;
X+ 			    mnewsym(x,y);
X  			    if (!MON_AT(x, y) && !(x == u.ux && y == u.uy))
X  				newsym(x,y);
X+ 			    if (cansee(x,y)) prl(x,y);
X  			    break;
X  		    }
X  	    }
X***************
X*** 280,287 ****
X  		  charm_snakes((int)u.ulevel*3);
X  		break;
X  	      case MAGIC_FLUTE: /* Make monster fall asleep */
X! 		You("produce soft music.");
X! 		put_monsters_to_sleep((int)u.ulevel*5);
X  		break;
X  	      case HORN:	/* Awaken monsters or scare monsters */
X  		You("produce a frightful, grave sound.");
X--- 282,292 ----
X  		  charm_snakes((int)u.ulevel*3);
X  		break;
X  	      case MAGIC_FLUTE: /* Make monster fall asleep */
X! 		if (instr->spe > 0) {
X! 			instr->spe--;
X! 			You("produce soft music.");
X! 			put_monsters_to_sleep((int)u.ulevel*5);
X! 		}
X  		break;
X  	      case HORN:	/* Awaken monsters or scare monsters */
X  		You("produce a frightful, grave sound.");
X***************
X*** 317,323 ****
X  		break;
X  	      case MAGIC_HARP:	/* Charm monsters */
X  		if (instr->spe > 0) {
X! 			pline("The %s produces very attractive music.",xname(instr));
X  			instr->spe--;
X  			charm_monsters(((int)u.ulevel - 1) / 3 + 1);
X  		}
X--- 322,328 ----
X  		break;
X  	      case MAGIC_HARP:	/* Charm monsters */
X  		if (instr->spe > 0) {
X! 			pline("The %s produces very attractive music.", xname(instr));
X  			instr->spe--;
X  			charm_monsters(((int)u.ulevel - 1) / 3 + 1);
X  		}
X***************
X*** 330,337 ****
X  		if (instr->spe > 0) {
X  			You("produce a heavy, thunderous rolling!");
X  			pline("The entire dungeon is shaking around you!");
X- 			do_earthquake(((int)u.ulevel - 1) / 3 + 1);
X  			instr->spe--;
X  			makeknown(DRUM_OF_EARTHQUAKE);
X  		}
X  		break;
X--- 335,342 ----
X  		if (instr->spe > 0) {
X  			You("produce a heavy, thunderous rolling!");
X  			pline("The entire dungeon is shaking around you!");
X  			instr->spe--;
X+ 			do_earthquake(((int)u.ulevel - 1) / 3 + 1);
X  			makeknown(DRUM_OF_EARTHQUAKE);
X  		}
X  		break;
X*** src/Old/objects.c	Sun Nov 19 13:51:52 1989
X--- src/objects.c	Tue Nov 14 20:31:49 1989
X***************
X*** 6,11 ****
X--- 6,12 ----
X   * function declarations for all of nethack
X   */
X  #define EXTERN_H
X+ /* #define MAKEDEFS_C	1	/* for Mac compilers with 32K data limit */
X  #include "config.h"
X  #include "obj.h"
X  #include "objclass.h"
X***************
X*** 24,37 ****
X--- 25,52 ----
X  #define C(n)
X  #endif
X  
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ struct objclass *objects;
X+ struct small_objclass sm_obj[] = {
X+ #else
X  struct objclass objects[] = {
X+ #endif
X  
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ 	{ "strange object", NULL},
X+ #else
X  	{ "strange object", NULL, NULL, 1,0,0,0,0, 0,
X  		ILLOBJ_SYM, 0, 0, 0, 0, 0, 0, 0, C(0) },
X+ #endif
X  /* amulets ... - THE Amulet comes last because it is special */
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X  #define AMULET(name,desc,power,prob,weight) { \
X+ 	name, desc}
X+ #else
X+ #define AMULET(name,desc,power,prob,weight) { \
X  	name, desc, NULL, 0,0,0,0,METAL, power, AMULET_SYM, prob, 0, weight, \
X  	150, 0, 0, 0, C(HI_METAL) }
X+ #endif
X  
X  	AMULET("amulet of esp", 	  "circular",	TELEPAT,    190, 2),
X  	AMULET("amulet of life saving",   "spherical",	LIFESAVED,   90, 2),
X***************
X*** 41,53 ****
X--- 56,78 ----
X  	AMULET("amulet of change",	  "square",	0,	    150, 2),
X  								/* POLYMORPH */
X  	AMULET("amulet of reflection",	  "hexagonal",	REFLECTING,  90, 2),
X+ 
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ 	{ "Amulet of Yendor", NULL},
X+ #else
X  	{ "Amulet of Yendor", NULL, NULL, 1,0,1,0,METAL, 0,
X  		AMULET_SYM, 0, 0, 2, 3500, 0, 0, 0, C(HI_METAL) },
X+ #endif
X  #undef AMULET
X  
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ #define FOOD(name,prob,delay,wt,uk,tin,nutrition,color) { \
X+ 	name, NULL}
X+ #else
X  #define FOOD(name,prob,delay,wt,uk,tin,nutrition,color) { \
X  	name, NULL, NULL, 1,1,uk,0,tin, 0, FOOD_SYM, prob, delay, wt, \
X  	nutrition/20 + 5, 0, 0, nutrition, C(color) }
X+ #endif
X  
X  /* all types of food (except tins & corpses) must have a delay of at least 1. */
X  /* delay on corpses is computed and is weight dependant */
X***************
X*** 64,80 ****
X  #else
X  	FOOD("tripe ration",	   150, 2, 2, 0, 0, 200, BROWN),
X  #endif
X- 	FOOD("dead lizard",	    35, 1, 1, 0, 0,  40, GREEN),
X  	FOOD("corpse",		     0, 1, 0, 0, 0,   0, BROWN),
X! 	FOOD("egg",		    75, 1, 1, 1, 0,  80, WHITE),
X  	/* fruits & veggies */
X! 	FOOD("apple",		    10, 1, 1, 0, 0,  50, RED),
X! 	FOOD("orange",		     7, 1, 1, 0, 0,  80, ORANGE_COLORED),
X! 	FOOD("pear",		     7, 1, 1, 0, 0,  50, GREEN+BRIGHT),
X! 	FOOD("melon",		     7, 1, 1, 0, 0, 100, GREEN+BRIGHT),
X! 	FOOD("banana",		     7, 1, 1, 0, 0,  80, YELLOW),
X  	FOOD("carrot",		    15, 1, 1, 0, 0,  50, ORANGE_COLORED),
X! 	FOOD("clove of garlic",      5, 1, 1, 0, 0,  40, WHITE),
X  #ifdef TUTTI_FRUTTI
X  	FOOD("slime mold",	    75, 1, 1, 0, 0, 250, BROWN),
X  #else
X--- 89,104 ----
X  #else
X  	FOOD("tripe ration",	   150, 2, 2, 0, 0, 200, BROWN),
X  #endif
X  	FOOD("corpse",		     0, 1, 0, 0, 0,   0, BROWN),
X! 	FOOD("egg",		    85, 1, 1, 1, 0,  80, WHITE),
X  	/* fruits & veggies */
X! 	FOOD("apple",		    15, 1, 1, 0, 0,  50, RED),
X! 	FOOD("orange",		    10, 1, 1, 0, 0,  80, ORANGE_COLORED),
X! 	FOOD("pear",		    10, 1, 1, 0, 0,  50, GREEN|BRIGHT),
X! 	FOOD("melon",		    10, 1, 1, 0, 0, 100, GREEN|BRIGHT),
X! 	FOOD("banana",		    10, 1, 1, 0, 0,  80, YELLOW),
X  	FOOD("carrot",		    15, 1, 1, 0, 0,  50, ORANGE_COLORED),
X! 	FOOD("clove of garlic",      7, 1, 1, 0, 0,  40, WHITE),
X  #ifdef TUTTI_FRUTTI
X  	FOOD("slime mold",	    75, 1, 1, 0, 0, 250, BROWN),
X  #else
X***************
X*** 83,93 ****
X  	/* human food */
X  	FOOD("lump of royal jelly",  0, 1, 1, 0, 0, 200, YELLOW),
X  	FOOD("cream pie",	    25, 1, 1, 0, 0, 100, WHITE),
X! 	FOOD("candy bar",	     7, 1, 1, 0, 0, 100, BROWN),
X  	FOOD("fortune cookie",	    55, 1, 1, 0, 0,  40, BROWN),
X  #ifdef TOLKIEN
X  	FOOD("pancake", 	    25, 2, 1, 0, 0, 200, BROWN),
X! 	FOOD("lembas wafer",	    20, 2, 1, 0, 0, 800, WHITE+BRIGHT),
X  	FOOD("cram ration",	    20, 3, 3, 0, 0, 600, HI_ORGANIC),
X  	FOOD("food ration",	   385, 5, 4, 0, 0, 800, HI_ORGANIC),
X  #else
X--- 107,117 ----
X  	/* human food */
X  	FOOD("lump of royal jelly",  0, 1, 1, 0, 0, 200, YELLOW),
X  	FOOD("cream pie",	    25, 1, 1, 0, 0, 100, WHITE),
X! 	FOOD("candy bar",	    13, 1, 1, 0, 0, 100, BROWN),
X  	FOOD("fortune cookie",	    55, 1, 1, 0, 0,  40, BROWN),
X  #ifdef TOLKIEN
X  	FOOD("pancake", 	    25, 2, 1, 0, 0, 200, BROWN),
X! 	FOOD("lembas wafer",	    20, 2, 1, 0, 0, 800, WHITE|BRIGHT),
X  	FOOD("cram ration",	    20, 3, 3, 0, 0, 600, HI_ORGANIC),
X  	FOOD("food ration",	   385, 5, 4, 0, 0, 800, HI_ORGANIC),
X  #else
X***************
X*** 101,115 ****
X--- 125,154 ----
X  	FOOD("tin",		    75, 0, 1, 1, METAL, 0, HI_METAL),
X  #undef FOOD
X  
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ #define WEAPON(name,app,kn,mg,bi,prob,wt,cost,sdam,ldam,metal,color) { \
X+ 	name, app}
X+ #else
X  #define WEAPON(name,app,kn,mg,bi,prob,wt,cost,sdam,ldam,metal,color) { \
X  	name, app, NULL, kn,mg,1,bi,metal, 0, WEAPON_SYM, prob, 0, wt, \
X  	cost, sdam, ldam, 0, C(color) }
X+ #endif
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ #define PROJECTILE(name,app,kn,bi,prob,wt,cost,sdam,ldam,metal,prop,color) { \
X+ 	name, app}
X+ #else
X  #define PROJECTILE(name,app,kn,bi,prob,wt,cost,sdam,ldam,metal,prop,color) { \
X  	name, app, NULL, kn,1,1,bi,metal, 0, WEAPON_SYM, prob, 0, wt, \
X  	cost, sdam, ldam, prop, C(color) }
X+ #endif
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ #define BOW(name,app,kn,bi,prob,wt,cost,sdam,ldam,metal,prop,color) { \
X+ 	name, app}
X+ #else
X  #define BOW(name,app,kn,bi,prob,wt,cost,sdam,ldam,metal,prop,color) { \
X  	name, app, NULL, kn,0,1,bi,metal, 0, WEAPON_SYM, prob, 0, wt, \
X  	cost, sdam, ldam, -(prop), C(color) }
X+ #endif
X  
X  /* Note: for weapons that don't do an even die of damage (ex. 2-7 or 3-18)
X   * the extra damage is added on in weapon.c, not here! */
X***************
X*** 263,271 ****
X--- 302,315 ----
X  #undef BOW
X  
X  /* tools ... - PICK AXE comes last because it has special characteristics */
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ #define TOOL(name,desc,kn,chg,prob,weight,cost,material,color) {\
X+ 	name, desc}
X+ #else
X  #define TOOL(name,desc,kn,chg,prob,weight,cost,material,color) {\
X  	name, desc, NULL, kn,0,chg,chg,material, 0, TOOL_SYM, prob, 0, \
X  	weight, cost, 0, 0, 0, C(color)}
X+ #endif
X  
X  #ifdef WALKIES
X  	TOOL("leash",		NULL,	1, 0,  70,  3,	20, 0, HI_LEATHER),
X***************
X*** 321,328 ****
X--- 365,383 ----
X  	TOOL("drum of earthquake", "drum", 0, 1, 2,  4,	25, 0, BROWN),
X  #endif
X  #undef TOOL
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ 	{ "pick-axe", NULL},
X+ 	{ "unicorn horn", NULL},
X+ 	{ "blinding venom", "splash of venom"},
X+ 	{ "acid venom", "splash of venom"},
X+ 	    /* +d6 small or large */
X+ 	{ "heavy iron ball", NULL},
X+ 	{ "iron chain", NULL},
X+ #else
X  	{ "pick-axe", NULL, NULL, 1,0,1,1,METAL, 0, TOOL_SYM, 20,
X  						0, 10, 50, 6, 3, 0, C(HI_METAL)},
X+ 	{ "unicorn horn", NULL, NULL, 1,0,1,0,0, 0, TOOL_SYM, 0,
X+ 						0, 4, 100, 12, 12, 0, C(WHITE)},
X  	{ "blinding venom", "splash of venom", NULL,
X  		0,1,0,0,0, 0, VENOM_SYM, 500, 0, 0, 0, 0, 0, 0, C(HI_ORGANIC)},
X  	{ "acid venom", "splash of venom", NULL,
X***************
X*** 332,349 ****
X--- 387,415 ----
X  		BALL_SYM, 1000, 0, 20, 10, 0, 0, 0, C(HI_METAL)},
X  	{ "iron chain", NULL, NULL, 1,0,0,0,METAL, 0,
X  		CHAIN_SYM, 1000, 0, 20, 0, 0, 0, 0, C(HI_METAL)},
X+ #endif
X  
X  	/* Note: boulders and rocks normally do not appear at random; the
X  	 * probabilities only come into effect when you try to polymorph them.
X  	 */
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ 	{ "boulder", NULL},
X+ 	{ "statue", NULL},
X+ #else
X  	{ "boulder", NULL, NULL, 1,0,0,0,MINERAL, 0, ROCK_SYM, 100, 0,
X  		200 /* > MAX_CARR_CAP */, 0, 20, 20, 0, C(HI_MINERAL)},
X  	{ "statue", NULL, NULL, 1,0,0,0,MINERAL, 0, ROCK_SYM, 900, 0,
X  	        250, 0, 20, 20, 0, C(HI_MINERAL)},
X+ #endif
X  
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ #define ARMOR(name,desc,kn,blk,power,prob,delay,weight,cost,ac,can,metal,c) \
X+ 	{name, desc}
X+ #else
X  #define ARMOR(name,desc,kn,blk,power,prob,delay,weight,cost,ac,can,metal,c) \
X  	{name, desc, NULL, kn,0,1,blk,metal, power, ARMOR_SYM, prob,\
X  	delay, weight, cost, ac, can, 0, C(c)}
X+ #endif
X  #ifdef TOLKIEN
X  ARMOR("elven leather helm", "leather hat",
X  			0, 0, 0,  6, 1, 2,   8, 9, 0, 0, HI_LEATHER),
X***************
X*** 371,377 ****
X  ARMOR("plate mail", NULL,
X  			1, 1, 0, 44, 5, 9, 600, 3, 2, METAL, HI_METAL),
X  ARMOR("crystal plate mail", NULL,
X! 			1, 1, 0, 10, 5, 9, 820, 3, 2, 0, WHITE+BRIGHT),
X  #ifdef SHIRT
X  ARMOR("bronze plate mail", NULL,
X  			1, 1, 0, 25, 5, 9, 400, 4, 0, COPPER, HI_COPPER),
X--- 437,443 ----
X  ARMOR("plate mail", NULL,
X  			1, 1, 0, 44, 5, 9, 600, 3, 2, METAL, HI_METAL),
X  ARMOR("crystal plate mail", NULL,
X! 			1, 1, 0, 10, 5, 9, 820, 3, 2, 0, WHITE|BRIGHT),
X  #ifdef SHIRT
X  ARMOR("bronze plate mail", NULL,
X  			1, 1, 0, 25, 5, 9, 400, 4, 0, COPPER, HI_COPPER),
X***************
X*** 483,491 ****
X--- 549,562 ----
X  			0, 0, LEVITATION,  12, 2, 4, 30, 9, 0, 0, BROWN),
X  #undef ARMOR
X  
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ #define POTION(name,desc,power,prob,cost,color) \
X+ 	{ name, desc}
X+ #else
X  #define POTION(name,desc,power,prob,cost,color) \
X  		{ name, desc, NULL, 0,1,0,0,0, power,\
X  		POTION_SYM, prob, 0, 2, cost, 0, 0, 0, C(color)}
X+ #endif
X  
X  #ifdef SPELLS
X  POTION("fruit juice",		"smoky",	0,	45, 50,	WHITE),
X***************
X*** 496,522 ****
X  POTION("booze", 		"bubbly",	0,	65, 50,	WHITE),
X  #endif
X  POTION("gain ability",		"swirly",	0,	45,300,	WHITE),
X! POTION("restore ability",	"pink",		0,	45,100,	MAGENTA+BRIGHT),
X! POTION("sickness",		"ruby",		SICK,	45, 50,	RED),
X  POTION("confusion",		"orange",	CONFUSION, 45, 100, ORANGE_COLORED),
X  POTION("blindness",		"yellow",	BLINDED, 45,150, YELLOW),
X! POTION("paralysis",		"emerald", 	0,	45,300,	GREEN+BRIGHT),
X  POTION("speed", 		"dark green", 	FAST,	45,200,	GREEN),
X  POTION("levitation",		"cyan",		LEVITATION, 45,200, CYAN),
X! POTION("hallucination", 	"brilliant blue", HALLUC, 45,100, BLUE+BRIGHT),
X  POTION("invisibility",		"sky blue",	INVIS,	45,150,	CYAN),
X  POTION("see invisible", 	"magenta",	SEE_INVIS, 45,50, MAGENTA),
X  POTION("healing",		"purple", 	0,	65,100,	MAGENTA),
X  POTION("extra healing", 	"purple-red",	0,	50,100,	MAGENTA),
X! POTION("gain level",		"puce",		0,	20,300,	MAGENTA+BRIGHT),
X  POTION("enlightenment",		"brown",	0,	20,200,	BROWN),
X  POTION("monster detection",	"white",	0,	45,150,	WHITE),
X! POTION("object detection",	"glowing",	0,	45,150,	WHITE+BRIGHT),
X  POTION("water", 		"clear",	0,	125,100,CYAN),
X  #undef POTION
X  
X! #define SCROLL(name,text,prob,cost) { name, text, NULL, 0,1,0,0,0, 0,\
X  		SCROLL_SYM, prob, 0, 3, cost, 0, 0, 0, C(HI_PAPER)}
X  #ifdef MAIL
X  	SCROLL("mail",			"KIRJE",	     0,   0),
X  #endif
X--- 567,599 ----
X  POTION("booze", 		"bubbly",	0,	65, 50,	WHITE),
X  #endif
X  POTION("gain ability",		"swirly",	0,	45,300,	WHITE),
X! POTION("restore ability",	"pink",		0,	45,100,	MAGENTA|BRIGHT),
X! POTION("sickness",		"ruby",		0,	45, 50,	RED),
X  POTION("confusion",		"orange",	CONFUSION, 45, 100, ORANGE_COLORED),
X  POTION("blindness",		"yellow",	BLINDED, 45,150, YELLOW),
X! POTION("paralysis",		"emerald", 	0,	45,300,	GREEN|BRIGHT),
X  POTION("speed", 		"dark green", 	FAST,	45,200,	GREEN),
X  POTION("levitation",		"cyan",		LEVITATION, 45,200, CYAN),
X! POTION("hallucination", 	"brilliant blue", HALLUC, 45,100, BLUE|BRIGHT),
X  POTION("invisibility",		"sky blue",	INVIS,	45,150,	CYAN),
X  POTION("see invisible", 	"magenta",	SEE_INVIS, 45,50, MAGENTA),
X  POTION("healing",		"purple", 	0,	65,100,	MAGENTA),
X  POTION("extra healing", 	"purple-red",	0,	50,100,	MAGENTA),
X! POTION("gain level",		"puce",		0,	20,300,	MAGENTA|BRIGHT),
X  POTION("enlightenment",		"brown",	0,	20,200,	BROWN),
X  POTION("monster detection",	"white",	0,	45,150,	WHITE),
X! POTION("object detection",	"glowing",	0,	45,150,	WHITE|BRIGHT),
X  POTION("water", 		"clear",	0,	125,100,CYAN),
X  #undef POTION
X  
X! #if defined(MACOS) && !defined(MAKEDEFS_C)
X! #define SCROLL(name,text,prob,cost) \
X! 	{ name, text}
X! #else
X! #define SCROLL(name,text,prob,cost) \
X! 	{ name, text, NULL, 0,1,0,0,0, 0,\
X  		SCROLL_SYM, prob, 0, 3, cost, 0, 0, 0, C(HI_PAPER)}
X+ #endif
X  #ifdef MAIL
X  	SCROLL("mail",			"KIRJE",	     0,   0),
X  #endif
X***************
X*** 546,554 ****
X--- 623,636 ----
X  	SCROLL(NULL,			"GARVEN DEH",	     0, 100),
X  #undef SCROLL
X  
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X  #define WAND(name,typ,prob,cost,flags,metal,c)	{ \
X+ 	name, typ}
X+ #else
X+ #define WAND(name,typ,prob,cost,flags,metal,c)	{ \
X  	name, typ, NULL, 0,0,1,0,metal, 0, WAND_SYM, \
X  	prob, 0, 3, cost, flags, 0, 0, C(c) }
X+ #endif
X  
X  WAND("light",		"glass",	95, 100, NODIR,    GLASS,HI_GLASS),
X  WAND("secret door detection", "balsa",	50, 150, NODIR,    WOOD,HI_WOOD),
X***************
X*** 585,593 ****
X--- 667,680 ----
X  
X  #ifdef SPELLS
X  /* books */
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X  #define SPELL(name,desc,prob,delay,level,flags,color) \
X+ 	{ name, desc}
X+ #else
X+ #define SPELL(name,desc,prob,delay,level,flags,color) \
X  	{ name, desc, NULL, 0,1,0,0,0, 0, SPBOOK_SYM, prob, delay, \
X  	5, level*100, flags, 0, level, C(color)}
X+ #endif
X  
X  SPELL("magic missile",	 "parchment",	45,  3, 2, RAY,		HI_PAPER),
X  SPELL("fireball",	 "vellum",	20,  6, 4, RAY,		HI_PAPER),
X***************
X*** 597,611 ****
X  SPELL("light",		 "cloth",	45,  1, 1, NODIR,	HI_CLOTH),
X  SPELL("detect monsters", "leather", 	45,  1, 1, NODIR,	HI_LEATHER),
X  SPELL("healing",	 "white",	40,  2, 1, NODIR,	WHITE),
X! SPELL("knock",		 "pink",	40,  1, 1, IMMEDIATE,	MAGENTA+BRIGHT),
X  SPELL("force bolt",	 "red",		40,  2, 1, IMMEDIATE,	RED),
X  SPELL("confuse monster", "orange",	37,  2, 2, IMMEDIATE,	ORANGE_COLORED),
X  SPELL("cure blindness",  "yellow", 	27,  2, 2, IMMEDIATE,	YELLOW),
X! SPELL("slow monster",	 "light green",	37,  2, 2, IMMEDIATE,	GREEN+BRIGHT),
X  SPELL("wizard lock",	 "dark green",	35,  3, 2, IMMEDIATE,	GREEN),
X! SPELL("create monster",  "turquoise",	37,  3, 2, NODIR,	CYAN+BRIGHT),
X  SPELL("detect food",	 "cyan",	37,  3, 2, NODIR,	CYAN),
X! SPELL("cause fear",	 "light blue",	25,  3, 3, NODIR,	BLUE+BRIGHT),
X  SPELL("clairvoyance",	 "dark blue",	15,  3, 3, NODIR,	BLUE),
X  SPELL("cure sickness",	 "indigo",	32,  3, 3, NODIR,	BLUE),
X  SPELL("charm monster",	 "magenta",	20,  3, 3, IMMEDIATE,	MAGENTA),
X--- 684,698 ----
X  SPELL("light",		 "cloth",	45,  1, 1, NODIR,	HI_CLOTH),
X  SPELL("detect monsters", "leather", 	45,  1, 1, NODIR,	HI_LEATHER),
X  SPELL("healing",	 "white",	40,  2, 1, NODIR,	WHITE),
X! SPELL("knock",		 "pink",	40,  1, 1, IMMEDIATE,	MAGENTA|BRIGHT),
X  SPELL("force bolt",	 "red",		40,  2, 1, IMMEDIATE,	RED),
X  SPELL("confuse monster", "orange",	37,  2, 2, IMMEDIATE,	ORANGE_COLORED),
X  SPELL("cure blindness",  "yellow", 	27,  2, 2, IMMEDIATE,	YELLOW),
X! SPELL("slow monster",	 "light green",	37,  2, 2, IMMEDIATE,	GREEN|BRIGHT),
X  SPELL("wizard lock",	 "dark green",	35,  3, 2, IMMEDIATE,	GREEN),
X! SPELL("create monster",  "turquoise",	37,  3, 2, NODIR,	CYAN|BRIGHT),
X  SPELL("detect food",	 "cyan",	37,  3, 2, NODIR,	CYAN),
X! SPELL("cause fear",	 "light blue",	25,  3, 3, NODIR,	BLUE|BRIGHT),
X  SPELL("clairvoyance",	 "dark blue",	15,  3, 3, NODIR,	BLUE),
X  SPELL("cure sickness",	 "indigo",	32,  3, 3, NODIR,	BLUE),
X  SPELL("charm monster",	 "magenta",	20,  3, 3, IMMEDIATE,	MAGENTA),
X***************
X*** 623,631 ****
X  SPELL("turn undead",	 "copper",	17,  8, 6, IMMEDIATE,	HI_COPPER),
X  SPELL("polymorph",	 "silver",	12,  8, 6, IMMEDIATE,	HI_SILVER),
X  SPELL("teleport away",	 "gold",	15,  6, 6, IMMEDIATE,	HI_GOLD),
X! SPELL("create familiar", "glittering", 	10,  7, 6, NODIR,	WHITE+BRIGHT),
X! SPELL("cancellation",	 "shining",	12,  8, 7, IMMEDIATE,	WHITE+BRIGHT),
X! SPELL("genocide",	 "glowing",	 5, 10, 7, NODIR,	WHITE+BRIGHT),
X  SPELL(NULL,		 "dull",	 0,  0, 0, 0,		HI_PAPER),
X  SPELL(NULL,		 "thin",	 0,  0, 0, 0,		HI_PAPER),
X  SPELL(NULL,		 "thick",	 0,  0, 0, 0,		HI_PAPER),
X--- 710,718 ----
X  SPELL("turn undead",	 "copper",	17,  8, 6, IMMEDIATE,	HI_COPPER),
X  SPELL("polymorph",	 "silver",	12,  8, 6, IMMEDIATE,	HI_SILVER),
X  SPELL("teleport away",	 "gold",	15,  6, 6, IMMEDIATE,	HI_GOLD),
X! SPELL("create familiar", "glittering", 	10,  7, 6, NODIR,	WHITE|BRIGHT),
X! SPELL("cancellation",	 "shining",	12,  8, 7, IMMEDIATE,	WHITE|BRIGHT),
X! SPELL("genocide",	 "glowing",	 5, 10, 7, NODIR,	WHITE|BRIGHT),
X  SPELL(NULL,		 "dull",	 0,  0, 0, 0,		HI_PAPER),
X  SPELL(NULL,		 "thin",	 0,  0, 0, 0,		HI_PAPER),
X  SPELL(NULL,		 "thick",	 0,  0, 0, 0,		HI_PAPER),
X***************
X*** 632,644 ****
X  #undef SPELL
X  #endif /* SPELLS /**/
X  
X  #define RING(name,stone,power,cost,spec,metal,color) \
X  		{ name, stone, NULL, 0,0,spec,spec,metal, \
X  		power, RING_SYM, 0, 0, 1, cost, 0, 0, 0, C(color)}
X  
X  RING("adornment",	"wooden",	ADORNED,	100, 1, WOOD, HI_WOOD),
X  RING("gain strength",	"granite",	0,		150, 1, MINERAL, HI_MINERAL),
X! RING("increase damage", "coral",	0,		150, 1, MINERAL, RED+BRIGHT),
X  RING("protection",	"black onyx",	PROTECTION,	100, 1, MINERAL, BLACK),
X  RING("regeneration",	"moonstone",	REGENERATION,	200, 0, MINERAL, HI_MINERAL),
X  RING("searching",	"tiger eye",	SEARCHING,	200, 0, MINERAL, BROWN),
X--- 719,736 ----
X  #undef SPELL
X  #endif /* SPELLS /**/
X  
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ #define RING(name,stone,power,cost,spec,metal,color) \
X+ 	{ name, stone}
X+ #else
X  #define RING(name,stone,power,cost,spec,metal,color) \
X  		{ name, stone, NULL, 0,0,spec,spec,metal, \
X  		power, RING_SYM, 0, 0, 1, cost, 0, 0, 0, C(color)}
X+ #endif
X  
X  RING("adornment",	"wooden",	ADORNED,	100, 1, WOOD, HI_WOOD),
X  RING("gain strength",	"granite",	0,		150, 1, MINERAL, HI_MINERAL),
X! RING("increase damage", "coral",	0,		150, 1, MINERAL, RED|BRIGHT),
X  RING("protection",	"black onyx",	PROTECTION,	100, 1, MINERAL, BLACK),
X  RING("regeneration",	"moonstone",	REGENERATION,	200, 0, MINERAL, HI_MINERAL),
X  RING("searching",	"tiger eye",	SEARCHING,	200, 0, MINERAL, BROWN),
X***************
X*** 647,653 ****
X  RING("hunger",		"topaz",	HUNGER, 	100, 0, MINERAL, CYAN),
X  RING("aggravate monster", "sapphire",	AGGRAVATE_MONSTER, 150, 0, METAL, BLUE),
X  RING("conflict",	"ruby", 	CONFLICT,	300, 0, METAL, RED),
X! RING("warning", 	"diamond", 	WARNING,	100, 0, METAL, WHITE+BRIGHT),
X  RING("poison resistance", "pearl",	POISON_RES,	150, 0, METAL, WHITE),
X  RING("fire resistance", "iron",		FIRE_RES,	200, 0, METAL, HI_METAL),
X  RING("cold resistance", "brass",	COLD_RES,	150, 0, COPPER, HI_COPPER),
X--- 739,745 ----
X  RING("hunger",		"topaz",	HUNGER, 	100, 0, MINERAL, CYAN),
X  RING("aggravate monster", "sapphire",	AGGRAVATE_MONSTER, 150, 0, METAL, BLUE),
X  RING("conflict",	"ruby", 	CONFLICT,	300, 0, METAL, RED),
X! RING("warning", 	"diamond", 	WARNING,	100, 0, METAL, WHITE|BRIGHT),
X  RING("poison resistance", "pearl",	POISON_RES,	150, 0, METAL, WHITE),
X  RING("fire resistance", "iron",		FIRE_RES,	200, 0, METAL, HI_METAL),
X  RING("cold resistance", "brass",	COLD_RES,	150, 0, COPPER, HI_COPPER),
X***************
X*** 658,664 ****
X  #ifdef POLYSELF
X  RING("polymorph",	"ivory",	POLYMORPH,	300, 0, 0, WHITE),
X  RING("polymorph control","emerald",	POLYMORPH_CONTROL,
X! 							300, 0, METAL, GREEN+BRIGHT),
X  #endif
X  RING("invisibility",	"wire",		INVIS,		150, 0, METAL, HI_METAL),
X  RING("see invisible",	"engagement",	SEE_INVIS,	150, 0, METAL, HI_METAL),
X--- 750,756 ----
X  #ifdef POLYSELF
X  RING("polymorph",	"ivory",	POLYMORPH,	300, 0, 0, WHITE),
X  RING("polymorph control","emerald",	POLYMORPH_CONTROL,
X! 							300, 0, METAL, GREEN|BRIGHT),
X  #endif
X  RING("invisibility",	"wire",		INVIS,		150, 0, METAL, HI_METAL),
X  RING("see invisible",	"engagement",	SEE_INVIS,	150, 0, METAL, HI_METAL),
X***************
X*** 667,675 ****
X--- 759,772 ----
X  #undef RING
X  
X  /* gems ************************************************************/
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ #define GEM(name,desc,prob,wt,gval,glass, color) \
X+ 	{ name, desc}
X+ #else
X  #define GEM(name,desc,prob,wt,gval,glass, color) \
X  		{ name, desc, NULL, 0,1,0,0,glass, 0,\
X  		GEM_SYM, prob, 0, wt, gval, 3, 3, WP_SLING, C(color)}
X+ #endif
X  GEM("dilithium crystal", "white",	 3, 1, 4500, MINERAL, WHITE),
X  GEM("diamond", "white", 		 4, 1, 4000, MINERAL, WHITE),
X  GEM("ruby", "red",			 5, 1, 3500, MINERAL, RED),
X***************
X*** 694,704 ****
X--- 791,809 ----
X  GEM("worthless piece of violet glass", "violet",131, 1, 0, GLASS, MAGENTA),
X  GEM("luckstone", "gray",		 10, 1,  60, MINERAL, GRAY),
X  GEM("loadstone", "gray",		 10, 50,  1, MINERAL, GRAY),
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ { "rock", NULL},
X+ #else
X  { "rock", NULL, NULL, 1,1,0,0,MINERAL, 0,
X  		GEM_SYM, 10, 0, 1, 0, 3, 3, WP_SLING, C(HI_MINERAL)},
X+ #endif
X  #undef GEM
X  
X+ #if defined(MACOS) && !defined(MAKEDEFS_C)
X+ 	{ NULL, NULL}
X+ #else
X  	{ NULL, NULL, NULL, 0,0,0,0,0, 0, ILLOBJ_SYM, 0, 0, 0, 0, 0, 0, 0, C(0) }
X+ #endif
X  };
X  
X  #undef C
X*** src/Old/objnam.c	Sun Nov 19 13:52:54 1989
X--- src/objnam.c	Fri Nov 17 19:31:57 1989
X***************
X*** 1,4 ****
X! /*	SCCS Id: @(#)objnam.c	3.0	88/11/30
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: @(#)objnam.c	3.0	89/11/15
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X***************
X*** 17,23 ****
X  			    "octagonal", "hexagonal", "wide",
X  			    "notched", "large round", "large square" };
X  
X! static int rnd_class P((int,int));
X  
X  static int
X  named_key(s) register char *s; {
X--- 17,23 ----
X  			    "octagonal", "hexagonal", "wide",
X  			    "notched", "large round", "large square" };
X  
X! static int FDECL(rnd_class, (int,int));
X  
X  static int
X  named_key(s) register char *s; {
X***************
X*** 80,86 ****
X  static char buf[BUFSZ];
X  #endif
X  register struct objclass *ocl = &objects[otyp];
X! register char *an = ocl->oc_name;
X  register char *dn = ocl->oc_descr;
X  register char *un = ocl->oc_uname;
X  register int nn = ocl->oc_name_known;
X--- 80,86 ----
X  static char buf[BUFSZ];
X  #endif
X  register struct objclass *ocl = &objects[otyp];
X! register char *actualn = ocl->oc_name;
X  register char *dn = ocl->oc_descr;
X  register char *un = ocl->oc_uname;
X  register int nn = ocl->oc_name_known;
X***************
X*** 104,110 ****
X  		break;
X  	case AMULET_SYM:
X  		if(nn)
X! 			Strcpy(buf,an);
X  		else
X  			Strcpy(buf,"amulet");
X  		if(un)
X--- 104,110 ----
X  		break;
X  	case AMULET_SYM:
X  		if(nn)
X! 			Strcpy(buf,actualn);
X  		else
X  			Strcpy(buf,"amulet");
X  		if(un)
X***************
X*** 114,120 ****
X  		return(buf);
X  	default:
X  		if(nn) {
X! 			Strcpy(buf, an);
X  			if(otyp >= TURQUOISE && otyp <= JADE)
X  				Strcat(buf, " stone");
X  			if(un)
X--- 114,120 ----
X  		return(buf);
X  	default:
X  		if(nn) {
X! 			Strcpy(buf, actualn);
X  			if(otyp >= TURQUOISE && otyp <= JADE)
X  				Strcat(buf, " stone");
X  			if(un)
X***************
X*** 122,128 ****
X  			if(dn)
X  				Sprintf(eos(buf), " (%s)", dn);
X  		} else {
X! 			Strcpy(buf, dn ? dn : an);
X  			if(ocl->oc_olet == GEM_SYM) {
X  				if (otyp == LOADSTONE || otyp == LUCKSTONE)
X  					Strcat(buf, " stone");
X--- 122,128 ----
X  			if(dn)
X  				Sprintf(eos(buf), " (%s)", dn);
X  		} else {
X! 			Strcpy(buf, dn ? dn : actualn);
X  			if(ocl->oc_olet == GEM_SYM) {
X  				if (otyp == LOADSTONE || otyp == LUCKSTONE)
X  					Strcat(buf, " stone");
X***************
X*** 136,142 ****
X  	}
X  	/* here for ring/scroll/potion/wand */
X  	if(nn)
X! 		Sprintf(eos(buf), " of %s", an);
X  	if(un)
X  		Sprintf(eos(buf), " called %s", un);
X  	if(dn)
X--- 136,142 ----
X  	}
X  	/* here for ring/scroll/potion/wand */
X  	if(nn)
X! 		Sprintf(eos(buf), " of %s", actualn);
X  	if(un)
X  		Sprintf(eos(buf), " called %s", un);
X  	if(dn)
X***************
X*** 154,160 ****
X  char *
X  distant_name(obj, func)
X  register struct obj *obj;
X! char *(*func) P((struct obj *));
X  {
X  	char *str;
X  
X--- 154,160 ----
X  char *
X  distant_name(obj, func)
X  register struct obj *obj;
X! char *FDECL((*func), (struct obj *));
X  {
X  	char *str;
X  
X***************
X*** 176,182 ****
X  #endif
X  register char *buf = &(bufr[PREFIX]);	/* leave room for "17 -3 " */
X  register int nn = objects[obj->otyp].oc_name_known;
X! register char *an = objects[obj->otyp].oc_name;
X  register char *dn = objects[obj->otyp].oc_descr;
X  register char *un = objects[obj->otyp].oc_uname;
X  
X--- 176,182 ----
X  #endif
X  register char *buf = &(bufr[PREFIX]);	/* leave room for "17 -3 " */
X  register int nn = objects[obj->otyp].oc_name_known;
X! register char *actualn = objects[obj->otyp].oc_name;
X  register char *dn = objects[obj->otyp].oc_descr;
X  register char *un = objects[obj->otyp].oc_uname;
X  
X***************
X*** 187,197 ****
X  		if(obj->otyp == AMULET_OF_YENDOR) {
X  		    Strcpy(buf, (obj->spe < 0 && obj->known) ?
X  			   "cheap plastic imitation of the " : "");
X! 		    Strcat(buf, an);
X  		} else if (!obj->dknown)
X  			Strcpy(buf, "amulet");
X  		else if (nn)
X! 			Strcpy(buf, an);
X  		else if (un)
X  			Sprintf(buf,"amulet called %s", un);
X  		else
X--- 187,197 ----
X  		if(obj->otyp == AMULET_OF_YENDOR) {
X  		    Strcpy(buf, (obj->spe < 0 && obj->known) ?
X  			   "cheap plastic imitation of the " : "");
X! 		    Strcat(buf, actualn);
X  		} else if (!obj->dknown)
X  			Strcpy(buf, "amulet");
X  		else if (nn)
X! 			Strcpy(buf, actualn);
X  		else if (un)
X  			Sprintf(buf,"amulet called %s", un);
X  		else
X***************
X*** 202,216 ****
X  			Strcpy(buf, "poisoned ");
X  	    case VENOM_SYM:
X  	    case TOOL_SYM:
X! 		if(nn)	Strcat(buf, an);
X  		else	Strcat(buf, dn);
X! 		if(obj->otyp == FIGURINE) {
X! 			Sprintf(eos(buf), " of a%s %s",
X! 				index(vowels, *mons[obj->corpsenm].mname)
X! 								? "n" : "",
X! 				mons[obj->corpsenm].mname);
X! 			break;
X! 		}
X  		break;
X  	    case ARMOR_SYM:
X  		if(obj->otyp==DRAGON_SCALE_MAIL) {
X--- 202,212 ----
X  			Strcpy(buf, "poisoned ");
X  	    case VENOM_SYM:
X  	    case TOOL_SYM:
X! 		if(nn)	Strcat(buf, actualn);
X  		else	Strcat(buf, dn);
X! 		if(obj->otyp == FIGURINE)
X! 			Sprintf(eos(buf), " of %s",
X! 				an(mons[obj->corpsenm].mname));
X  		break;
X  	    case ARMOR_SYM:
X  		if(obj->otyp==DRAGON_SCALE_MAIL) {
X***************
X*** 221,227 ****
X  
X  		if(is_boots(obj) || is_gloves(obj)) Strcpy(buf,"pair of ");
X  
X! 		if(nn)	Strcat(buf, an);
X  		else if(un) {
X  			if(is_boots(obj))
X  				Strcat(buf,"boots");
X--- 217,223 ----
X  
X  		if(is_boots(obj) || is_gloves(obj)) Strcpy(buf,"pair of ");
X  
X! 		if(nn)	Strcat(buf, actualn);
X  		else if(un) {
X  			if(is_boots(obj))
X  				Strcat(buf,"boots");
X***************
X*** 254,260 ****
X  			break;
X  		}
X  #endif
X! 		Strcpy(buf, an);
X  		if(obj->otyp == TIN && obj->known) {
X  		    if(obj->spe > 0)
X  			Strcat(buf, " of spinach");
X--- 250,256 ----
X  			break;
X  		}
X  #endif
X! 		Strcpy(buf, actualn);
X  		if(obj->otyp == TIN && obj->known) {
X  		    if(obj->spe > 0)
X  			Strcat(buf, " of spinach");
X***************
X*** 266,279 ****
X  		}
X  		break;
X  	    case CHAIN_SYM:
X! 		Strcpy(buf, an);
X  		break;
X  	    case ROCK_SYM:
X  		if(obj->otyp == STATUE)
X! 		    Sprintf(buf, "%s of a%s %s", an,
X! 			    (index(vowels, *(mons[obj->corpsenm].mname))) ? "n" : "",
X! 			    mons[obj->corpsenm].mname);
X! 		else Strcpy(buf, an);
X  		break;
X  	    case BALL_SYM:
X  		Sprintf(buf, "%sheavy iron ball",
X--- 262,273 ----
X  		}
X  		break;
X  	    case CHAIN_SYM:
X! 		Strcpy(buf, actualn);
X  		break;
X  	    case ROCK_SYM:
X  		if(obj->otyp == STATUE)
X! 		    Sprintf(buf, "%s of %s", actualn, an(mons[obj->corpsenm].mname));
X! 		else Strcpy(buf, actualn);
X  		break;
X  	    case BALL_SYM:
X  		Sprintf(buf, "%sheavy iron ball",
X***************
X*** 291,297 ****
X  			       (obj->blessed || obj->cursed)) {
X  				Strcat(buf, obj->blessed ? "holy " : "unholy ");
X  			    }
X! 			    Strcat(buf, an);
X  			} else {
X  				Strcat(buf, " called ");
X  				Strcat(buf, un);
X--- 285,291 ----
X  			       (obj->blessed || obj->cursed)) {
X  				Strcat(buf, obj->blessed ? "holy " : "unholy ");
X  			    }
X! 			    Strcat(buf, actualn);
X  			} else {
X  				Strcat(buf, " called ");
X  				Strcat(buf, un);
X***************
X*** 306,312 ****
X  		if(!obj->dknown) break;
X  		if(nn) {
X  			Strcat(buf, " of ");
X! 			Strcat(buf, an);
X  		} else if(un) {
X  			Strcat(buf, " called ");
X  			Strcat(buf, un);
X--- 300,306 ----
X  		if(!obj->dknown) break;
X  		if(nn) {
X  			Strcat(buf, " of ");
X! 			Strcat(buf, actualn);
X  		} else if(un) {
X  			Strcat(buf, " called ");
X  			Strcat(buf, un);
X***************
X*** 319,325 ****
X  		if(!obj->dknown)
X  			Sprintf(buf, "wand");
X  		else if(nn)
X! 			Sprintf(buf, "wand of %s", an);
X  		else if(un)
X  			Sprintf(buf, "wand called %s", un);
X  		else
X--- 313,319 ----
X  		if(!obj->dknown)
X  			Sprintf(buf, "wand");
X  		else if(nn)
X! 			Sprintf(buf, "wand of %s", actualn);
X  		else if(un)
X  			Sprintf(buf, "wand called %s", un);
X  		else
X***************
X*** 330,336 ****
X  		if(!obj->dknown)
X  			Sprintf(buf, "spellbook");
X  		else if(nn)
X! 			Sprintf(buf, "spellbook of %s", an);
X  		else if(un)
X  			Sprintf(buf, "spellbook called %s", un);
X  		else
X--- 324,330 ----
X  		if(!obj->dknown)
X  			Sprintf(buf, "spellbook");
X  		else if(nn)
X! 			Sprintf(buf, "spellbook of %s", actualn);
X  		else if(un)
X  			Sprintf(buf, "spellbook called %s", un);
X  		else
X***************
X*** 341,347 ****
X  		if(!obj->dknown)
X  			Sprintf(buf, "ring");
X  		else if(nn)
X! 			Sprintf(buf, "ring of %s", an);
X  		else if(un)
X  			Sprintf(buf, "ring called %s", un);
X  		else
X--- 335,341 ----
X  		if(!obj->dknown)
X  			Sprintf(buf, "ring");
X  		else if(nn)
X! 			Sprintf(buf, "ring of %s", actualn);
X  		else if(un)
X  			Sprintf(buf, "ring called %s", un);
X  		else
X***************
X*** 363,369 ****
X  			else	Sprintf(buf, "%s %s", dn, rock);
X  			break;
X  		}
X! 		Strcpy(buf, an);
X  		if(obj->otyp >= TURQUOISE && obj->otyp <= JADE)
X  			Strcat(buf, " stone");
X  		break;
X--- 357,363 ----
X  			else	Sprintf(buf, "%s %s", dn, rock);
X  			break;
X  		}
X! 		Strcpy(buf, actualn);
X  		if(obj->otyp >= TURQUOISE && obj->otyp <= JADE)
X  			Strcat(buf, " stone");
X  		break;
X***************
X*** 484,490 ****
X  			Sprintf(eos(bp), " (%s keyhole)", lockstr[obj->spe]);
X  			break;
X  		}
X! 		if(obj->otyp == PICK_AXE) goto plus;
X  		if(!objects[obj->otyp].oc_charged) break;
X  		/* if special tool, fall through to show charges */
X  	case WAND_SYM:
X--- 478,485 ----
X  			Sprintf(eos(bp), " (%s keyhole)", lockstr[obj->spe]);
X  			break;
X  		}
X! 		if(obj->otyp == PICK_AXE || obj->otyp == UNICORN_HORN)
X! 			goto plus;
X  		if(!objects[obj->otyp].oc_charged) break;
X  		/* if special tool, fall through to show charges */
X  	case WAND_SYM:
X***************
X*** 539,545 ****
X  		Strcat(bp, " (unpaid)");
X  	if (!strncmp(prefix, "a ", 2) &&
X  			index(vowels, *(prefix+2) ? *(prefix+2) : *bp)
X! 			&& (*(prefix+2) || strncmp(bp, "uranium", 7))) {
X  		Strcpy(tmpbuf, prefix);
X  		Strcpy(prefix, "an ");
X  		Strcpy(prefix+3, tmpbuf+2);
X--- 534,541 ----
X  		Strcat(bp, " (unpaid)");
X  	if (!strncmp(prefix, "a ", 2) &&
X  			index(vowels, *(prefix+2) ? *(prefix+2) : *bp)
X! 			&& (*(prefix+2) || (strncmp(bp, "uranium", 7)
X! 				&& strncmp(bp, "unicorn", 7)))) {
X  		Strcpy(tmpbuf, prefix);
X  		Strcpy(prefix, "an ");
X  		Strcpy(prefix+3, tmpbuf+2);
X***************
X*** 553,587 ****
X   */
X  
X  char *
X! singular(otmp)
X  register struct obj *otmp;
X  {
X  	int savequan;
X  	char *nam;
X  
X  	/* Note: using xname for corpses will not give the monster type */
X! 	if (otmp->otyp == CORPSE) {
X  		static char buf[31];
X  
X! 		sprintf(buf, "%s corpse", mons[otmp->corpsenm].mname);
X  		return buf;
X  	}
X  	savequan = otmp->quan;
X  	otmp->quan = 1;
X! 	nam = xname(otmp);
X  	otmp->quan = savequan;
X  	return nam;
X  }
X  
X! /* used only in mthrowu.c (thitu) */
X! void
X! setan(str,buf)
X! register char *str,*buf;
X  {
X! 	if(index(vowels,*str))
X! 		Sprintf(buf, "an %s", str);
X! 	else
X! 		Sprintf(buf, "a %s", str);
X  }
X  
X  char *
X--- 549,602 ----
X   */
X  
X  char *
X! singular(otmp, func)
X  register struct obj *otmp;
X+ char *FDECL((*func), (struct obj *));
X  {
X  	int savequan;
X  	char *nam;
X  
X  	/* Note: using xname for corpses will not give the monster type */
X! 	if (otmp->otyp == CORPSE && func == xname) {
X  		static char buf[31];
X  
X! 		Sprintf(buf, "%s corpse", mons[otmp->corpsenm].mname);
X  		return buf;
X  	}
X  	savequan = otmp->quan;
X  	otmp->quan = 1;
X! 	nam = (*func)(otmp);
X  	otmp->quan = savequan;
X  	return nam;
X  }
X  
X! char *
X! an(str)
X! register char *str;
X  {
X! 	static char buf[BUFSZ];
X! 
X! 	buf[0] = '\0';
X! 
X! 	if (strncmp(str, "the ", 4))
X! 	    if (index(vowels, *str) &&
X! 		strncmp(str, "unicorn", 7) &&
X! 		strncmp(str, "uranium", 7))
X! 		    Strcpy(buf, "an ");
X! 	    else
X! 		    Strcpy(buf, "a ");
X! 
X! 	Strcat(buf, str);
X! 	return buf;
X! }
X! 
X! char *
X! An(str)
X! register char *str;
X! {
X! 	str = an(str);
X! 	if (*str == 'a') *str = 'A';
X! 	return str;
X  }
X  
X  char *
X***************
X*** 752,758 ****
X  	}
X  
X  	/* fungus/fungi, homunculus/homunculi, but wumpuses */
X! 	if (!strcmp(spot-1, "us") && strcmp(spot-6, "wumpus")) {
X  		*(spot--) = (char)0;
X  		*spot = 'i';
X  		goto bottom;
X--- 767,773 ----
X  	}
X  
X  	/* fungus/fungi, homunculus/homunculi, but wumpuses */
X! 	if (!strcmp(spot-1, "us") && strcmp(spot-5, "wumpus")) {
X  		*(spot--) = (char)0;
X  		*spot = 'i';
X  		goto bottom;
X***************
X*** 838,851 ****
X  	return str;
X  }
X  
X! static const char *armor_classes[] = {
X! 	/* "shield called reflection" gives a specific type of shield.
X! 	 * "shield" gives a random type of shield--but not of all armor.
X! 	 */
X! 	"gloves", "boots", "cloak", "shield", "helmet"
X  };
X! #define ARMOR_CLASSES 5
X  
X  /* Return something wished for.  If not an object, return &zeroobj; if an error
X   * (no matching object), return (struct obj *)0.  Giving readobjnam() a null
X   * pointer skips the error return and creates a random object instead.
X--- 853,944 ----
X  	return str;
X  }
X  
X! /* wishable subranges of objects */
X! static const struct o_range {
X! 	char *name, osym;
X! 	int  f_o_range, l_o_range;
X! } o_ranges[] = {
X! 	{ "bag",	TOOL_SYM,   SACK,	    BAG_OF_TRICKS },
X! 	{ "gloves",	ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
X! 	{ "gauntlets",	ARMOR_SYM,  LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY },
X! 	{ "boots",	ARMOR_SYM,  LOW_BOOTS,	    LEVITATION_BOOTS },
X! 	{ "shoes",	ARMOR_SYM,  LOW_BOOTS,	    IRON_SHOES },
X! 	{ "cloak",	ARMOR_SYM,  MUMMY_WRAPPING, CLOAK_OF_DISPLACEMENT },
X! 	{ "shield",	ARMOR_SYM,  SMALL_SHIELD,   SHIELD_OF_REFLECTION },
X! #ifdef TOLKIEN	/* note: "helmet" is a specific item */
X! 	{ "helm",	ARMOR_SYM,  ELVEN_LEATHER_HELM, HELM_OF_TELEPATHY },
X! #else
X! 	{ "helm",	ARMOR_SYM,  ORCISH_HELM,    HELM_OF_TELEPATHY },
X! #endif
X! 	{ "sword",	WEAPON_SYM, SHORT_SWORD,    KATANA }
X  };
X! 
X! 
X! /*
X!  * Singularize a string the user typed in; this helps reduce the complexity
X!  * of readobjnam.
X!  */
X! 
X! static
X! void
X! singularize(bp)
X! char *bp;
X! {
X! 	char *p;
X  
X+ 	/* find "cloves of garlic", "worthless pieces of blue glass" */
X+ 	for(p = bp; *p; p++) 
X+ 	    if(!strncmp(p, "s of ", 5)){
X+ 		/* but don't singularize "gauntlets" */
X+ 		if(strncmp(p-8, "gauntlet", 8))
X+ 			while(*p = p[1]) p++;
X+ 		return;
X+ 	    }
X+ 
X+ 	/* remove -s or -es (boxes) or -ies (rubies) */
X+ 	p = eos(bp);
X+ 	if(p[-1] == 's') {
X+ 		if(p[-2] == 'e') {
X+ 			if(p[-3] == 'i') {
X+ 				if(!strcmp(p-7, "cookies") ||
X+ 				   !strcmp(p-4, "pies"))
X+ 					goto mins;
X+ 				Strcpy(p-3, "y");
X+ 				return;
X+ 			}
X+ 
X+ 			/* note: cloves / knives from clove / knife */
X+ 			if(!strcmp(p-6, "knives")) {
X+ 				Strcpy(p-3, "fe");
X+ 				return;
X+ 			}
X+ 
X+ 			if(!strcmp(p-6, "staves")) {
X+ 				Strcpy(p-3, "ff");
X+ 				return;
X+ 			}
X+ 
X+ 			/* note: nurses, axes but boxes */
X+ 			if(!strcmp(p-5, "boxes")) {
X+ 				p[-2] = 0;
X+ 				return;
X+ 			}
X+ 		}
X+ 		/* but don't singularize boots or gloves */
X+ 		else if(!strcmp(p-5, "boots") ||
X+ 			!strcmp(p-6, "gloves"))
X+ 				return;
X+ 	mins:
X+ 		p[-1] = 0;
X+ 	} else {
X+ 		if(!strcmp(p-5, "teeth")) {
X+ 			Strcpy(p-5, "tooth");
X+ 			return;
X+ 		}
X+ 		/* here we cannot find the plural suffix */
X+ 	}
X+ }
X+ 
X  /* Return something wished for.  If not an object, return &zeroobj; if an error
X   * (no matching object), return (struct obj *)0.  Giving readobjnam() a null
X   * pointer skips the error return and creates a random object instead.
X***************
X*** 994,1002 ****
X  		/* "helmet called telepathy" is not "helmet" (a specific type)
X  		 * "shield called reflection" is not "shield" (a general type)
X  		 */
X! 		for(i=0; i<ARMOR_CLASSES; i++)
X! 		    if(!strncmp(bp,armor_classes[i], strlen(armor_classes[i]))){
X! 			let = ARMOR_SYM;
X  			goto srch;
X  		    }
X  	}
X--- 1087,1095 ----
X  		/* "helmet called telepathy" is not "helmet" (a specific type)
X  		 * "shield called reflection" is not "shield" (a general type)
X  		 */
X! 		for(i = 0; i < SIZE(o_ranges); i++)
X! 		    if(!strcmp(bp, o_ranges[i].name)) {
X! 			let = o_ranges[i].osym;
X  			goto srch;
X  		    }
X  	}
X***************
X*** 1042,1100 ****
X  	}
X  
X  	/* first change to singular if necessary */
X! 	if(cnt != 1) {
X! 		/* find "cloves of garlic", "worthless pieces of blue glass" */
X! 		for(p = bp; *p; p++) 
X! 		    if(!strncmp(p, "s of ", 5)){
X! 			/* but don't singularize "gauntlets" */
X! 			if(strncmp(p-8, "gauntlet", 8))
X! 				while(*p = p[1]) p++;
X! 			goto sing;
X! 		    }
X! 		/* remove -s or -es (boxes) or -ies (rubies) */
X! 		p = eos(bp);
X! 		if(p[-1] == 's') {
X! 			if(p[-2] == 'e') {
X! 				if(p[-3] == 'i') {
X! 
X! 					if(!strcmp(p-7, "cookies") ||
X! 					   !strcmp(p-4, "pies"))
X! 						goto mins;
X! 					Strcpy(p-3, "y");
X! 					goto sing;
X! 				}
X! 
X! 				/* note: cloves / knives from clove / knife */
X! 				if(!strcmp(p-6, "knives")) {
X! 					Strcpy(p-3, "fe");
X! 					goto sing;
X! 				}
X! 
X! 				if(!strcmp(p-6, "staves")) {
X! 					Strcpy(p-3, "ff");
X! 					goto sing;
X! 				}
X  
X- 				/* note: nurses, axes but boxes */
X- 				if(!strcmp(p-5, "boxes")) {
X- 					p[-2] = 0;
X- 					goto sing;
X- 				}
X- 			}
X- 			/* but don't singularize boots or gloves */
X- 			else if(!strcmp(p-5, "boots") ||
X- 				!strcmp(p-6, "gloves"))
X- 					goto sing;
X- 		mins:
X- 			p[-1] = 0;
X- 		} else {
X- 			if(!strcmp(p-5, "teeth")) {
X- 				Strcpy(p-5, "tooth");
X- 				goto sing;
X- 			}
X- 			/* here we cannot find the plural suffix */
X- 		}
X- 	}
X  sing:
X  	/* Maybe we need a special strcmp() which ignores capitalization and
X  	 * dashes/spaces/underscores, so the below 3 special cases would be
X--- 1135,1143 ----
X  	}
X  
X  	/* first change to singular if necessary */
X! 	if(cnt != 1)
X! 		singularize(bp);
X  
X  sing:
X  	/* Maybe we need a special strcmp() which ignores capitalization and
X  	 * dashes/spaces/underscores, so the below 3 special cases would be
X***************
X*** 1229,1255 ****
X  		typ = HEAVY_IRON_BALL;
X  		goto typfnd;
X  	}
X! 	if(!strcmp(bp, "bag")) {
X! 		typ = rnd_class(SACK, BAG_OF_TRICKS);
X! 		goto typfnd;
X! 	}
X! 	if(!strcmp(bp, armor_classes[0])){ /* pair of gloves */
X! 		typ = rnd_class(LEATHER_GLOVES, GAUNTLETS_OF_DEXTERITY);
X! 		goto typfnd;
X! 	}
X! 	if(!strcmp(bp, armor_classes[1])){ /* pair of boots */
X! 		typ = rnd_class(LOW_BOOTS, LEVITATION_BOOTS);
X! 		goto typfnd;
X! 	}
X! 	if(!strcmp(bp, armor_classes[2])){ /* cloak */
X! 		typ = rnd_class(MUMMY_WRAPPING, CLOAK_OF_DISPLACEMENT);
X! 		goto typfnd;
X! 	}
X! 	if(!strcmp(bp, armor_classes[3])){ /* shield */
X! 		typ = rnd_class(SMALL_SHIELD, SHIELD_OF_REFLECTION);
X  		goto typfnd;
X! 	}
X! 	/* helmet is not generic */
X  
X  	an = bp;
X  	if (!dn) dn = an; /* ex. "black cap" */
X--- 1272,1282 ----
X  		typ = HEAVY_IRON_BALL;
X  		goto typfnd;
X  	}
X! 	for (i = 0; i < SIZE(o_ranges); i++)
X! 	    if(!strcmp(bp, o_ranges[i].name)) {
X! 		typ = rnd_class(o_ranges[i].f_o_range, o_ranges[i].l_o_range);
X  		goto typfnd;
X! 	    }
X  
X  	an = bp;
X  	if (!dn) dn = an; /* ex. "black cap" */
X***************
X*** 1332,1337 ****
X--- 1359,1365 ----
X  	else if (wizard) /* no alteration to spe */ ;
X  #endif
X  	else if (let == ARMOR_SYM || let == WEAPON_SYM || typ == PICK_AXE ||
X+ 			typ == UNICORN_HORN ||
X  			(let==RING_SYM && objects[typ].oc_charged)) {
X  		if(spe > rnd(5) && spe > otmp->spe) spe = 0;
X  		if(spe > 2 && u.uluck < 0) spesgn = -1;
X***************
X*** 1461,1467 ****
X  	if (name) otmp = oname(otmp, name, 0);
X  	otmp->owt = weight(otmp);
X  	if (heavy) otmp->owt += 15;
X! 	if (halfeaten && otmp->olet == FOOD_SYM) otmp->oeaten = TRUE;
X  	return(otmp);
X  }
X  
X--- 1489,1503 ----
X  	if (name) otmp = oname(otmp, name, 0);
X  	otmp->owt = weight(otmp);
X  	if (heavy) otmp->owt += 15;
X! 	if (halfeaten && otmp->olet == FOOD_SYM) {
X! 		if (otmp->otyp == CORPSE)
X! 			otmp->oeaten = mons[otmp->corpsenm].cnutrit;
X! 		else otmp->oeaten = objects[otmp->otyp].nutrition;
X! 		otmp->owt /= 2;
X! 		otmp->oeaten /= 2;
X! 		if (!otmp->owt) otmp->owt = 1;
X! 		if (!otmp->oeaten) otmp->oeaten = 1;
X! 	}
X  	return(otmp);
X  }
X  
X*** src/Old/options.c	Sun Nov 19 13:53:46 1989
X--- src/options.c	Fri Nov 17 19:31:59 1989
X***************
X*** 1,4 ****
X! /*	SCCS Id: @(#)options.c	3.0	88/11/09
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: @(#)options.c	3.0	89/11/15
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X***************
X*** 5,12 ****
X  #include "hack.h"
X  static boolean set_order;
X  
X! static void nmcpy P((char *, char *, int));
X! static int next_opt P((char *));
X  
X  void
X  initoptions()
X--- 5,12 ----
X  #include "hack.h"
X  static boolean set_order;
X  
X! static void FDECL(nmcpy, (char *, char *, int));
X! static int FDECL(next_opt, (char *));
X  
X  void
X  initoptions()
X***************
X*** 143,192 ****
X  register unsigned int *graph_ints;
X  register int glth;
X  {
X! #define SETPCHAR(f, n)	showsyms.f = (glth > n) ? graph_ints[n] : defsyms.f
X! 	SETPCHAR(stone, 0);
X! 	SETPCHAR(vwall, 1);
X! 	SETPCHAR(hwall, 2);
X! 	SETPCHAR(tlcorn, 3);
X! 	SETPCHAR(trcorn, 4);
X! 	SETPCHAR(blcorn, 5);
X! 	SETPCHAR(brcorn, 6);
X! 	SETPCHAR(crwall, 7);
X! 	SETPCHAR(tuwall, 8);
X! 	SETPCHAR(tdwall, 9);
X! 	SETPCHAR(tlwall, 10);
X! 	SETPCHAR(trwall, 11);
X! 	SETPCHAR(vbeam, 12);
X! 	SETPCHAR(hbeam, 13);
X! 	SETPCHAR(lslant, 14);
X! 	SETPCHAR(rslant, 15);
X! 	SETPCHAR(door, 16);
X! 	SETPCHAR(room, 17);
X! 	SETPCHAR(corr, 18);
X! 	SETPCHAR(upstair, 19);
X! 	SETPCHAR(dnstair, 20);
X! 	SETPCHAR(trap, 21);
X! 	SETPCHAR(web, 22);
X! 	SETPCHAR(pool, 23);
X! #ifdef FOUNTAINS
X! 	SETPCHAR(fountain, 24);
X! #endif
X! #ifdef SINKS
X! 	SETPCHAR(sink, 25);
X! #endif
X! #ifdef THRONES
X! 	SETPCHAR(throne, 26);
X! #endif
X! #ifdef ALTARS
X! 	SETPCHAR(altar, 27);
X! #endif
X! #ifdef STRONGHOLD
X! 	SETPCHAR(upladder, 28);
X! 	SETPCHAR(dnladder, 29);
X! 	SETPCHAR(dbvwall, 30);
X! 	SETPCHAR(dbhwall, 31);
X! #endif
X! #undef SETPCHAR
X  }
X  
X  void
X--- 143,155 ----
X  register unsigned int *graph_ints;
X  register int glth;
X  {
X! 	register int i;
X! 
X! 	if (glth > MAXPCHARS) glth = MAXPCHARS;		/* sanity check */
X! 	for (i = 0; i < glth; i++)
X! 		showsyms[i] = graph_ints[i];
X! 	for (i = glth; i < MAXPCHARS; i++)
X! 		showsyms[i] = defsyms[i];
X  }
X  
X  void
END_OF_FILE
if test 57020 -ne `wc -c <'patches06i'`; then
    echo shar: \"'patches06i'\" unpacked with wrong size!
fi
# end of 'patches06i'
fi
echo shar: End of archive 9 \(of 15\).
cp /dev/null ark9isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 15 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0