[comp.sources.games] v09i022: 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 22
Archive-name: NetHack3/Patch7v
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 22 (of 30)."
# Contents:  include/mondata.h patch7.18
# Wrapped by billr@saab on Wed Feb 21 10:04:43 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'include/mondata.h' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'include/mondata.h'\" to \"'include/mondata.h.orig'\"
  mv -f 'include/mondata.h' 'include/mondata.h.orig'
fi
echo shar: Extracting \"'include/mondata.h'\" \(4813 characters\)
sed "s/^X//" >'include/mondata.h' <<'END_OF_FILE'
X/*	SCCS Id: @(#)mondata.h	3.0	89/11/21
X/* NetHack may be freely redistributed.  See license for details. */
X/* Copyright (c) 1989 Mike Threepoint */
X
X#ifndef MONDATA_H
X#define MONDATA_H
X
X# ifndef STUPID_CPP	/* otherwise these macros are functions in mondata.c */
X
X#define verysmall(ptr)		((ptr)->msize < MZ_SMALL)
X#define bigmonst(ptr)		((ptr)->msize >= MZ_LARGE)
X
X#define is_flyer(ptr)		(((ptr)->mflags1 & M1_FLY) != 0L)
X#define is_floater(ptr) 	((ptr)->mlet == S_EYE)
X#define is_swimmer(ptr) 	(((ptr)->mflags1 & M1_SWIM) != 0L)
X#define passes_walls(ptr)	(((ptr)->mflags1 & M1_WALLWALK) != 0L)
X#define amorphous(ptr)		(((ptr)->mflags1 & M1_AMORPHOUS) != 0L)
X#define noncorporeal(ptr)	((ptr)->mlet == S_GHOST)
X#define tunnels(ptr)		(((ptr)->mflags1 & M1_TUNNEL) != 0L)
X#define needspick(ptr)		(((ptr)->mflags1 & M1_NEEDPICK) != 0L)
X#define hides_under(ptr)	(((ptr)->mflags1 & M1_CONCEAL) != 0L)
X#define is_hider(ptr)		(((ptr)->mflags1 & M1_HIDE) != 0L)
X#define haseyes(ptr)		(((ptr)->mflags1 & M1_NOEYES) == 0L)
X#define nohands(ptr)		(((ptr)->mflags1 & M1_NOHANDS) != 0L)
X#define nolimbs(ptr)		(((ptr)->mflags1 & M1_NOLIMBS) == M1_NOLIMBS)
X#  ifdef POLYSELF
X#define polyok(ptr)		(((ptr)->mflags1 & M1_NOPOLY) == 0L)
X#  endif
X#define is_whirly(ptr)		((ptr)->mlet == S_VORTEX || (ptr) == &mons[PM_AIR_ELEMENTAL])
X#define humanoid(ptr)		(((ptr)->mflags1 & M1_HUMANOID) != 0L)
X#define is_animal(ptr)		(((ptr)->mflags1 & M1_ANIMAL) != 0L)
X#define slithy(ptr)		(((ptr)->mflags1 & M1_SLITHY) != 0L)
X#define thick_skinned(ptr)	(((ptr)->mflags1 & M1_THICK_HIDE) != 0L)
X#define resists_fire(ptr)	(((ptr)->mflags1 & M1_FIRE_RES) != 0L)
X#define resists_cold(ptr)	(((ptr)->mflags1 & M1_COLD_RES) != 0L)
X#define resists_disint(ptr)	((ptr) == &mons[PM_BLACK_DRAGON] || (ptr) == &mons[PM_BABY_BLACK_DRAGON])
X#define resists_elec(ptr)	(((ptr)->mflags1 & M1_ELEC_RES) != 0L)
X#define resists_acid(ptr)	(((ptr)->mflags1 & M1_ACID) != 0L)
X#define acidic(ptr)		(((ptr)->mflags1 & M1_ACID) != 0L)
X#define resists_poison(ptr)	(((ptr)->mflags1 & (M1_POIS | M1_POIS_RES)) != 0L)
X#define poisonous(ptr)		(((ptr)->mflags1 & M1_POIS) != 0L)
X#define regenerates(ptr)	(((ptr)->mflags1 & M1_REGEN) != 0L)
X#define perceives(ptr)		(((ptr)->mflags1 & M1_SEE_INVIS) != 0L)
X#define can_teleport(ptr)	(((ptr)->mflags1 & M1_TPORT) != 0L)
X#define control_teleport(ptr)	(((ptr)->mflags1 & M1_TPORT_CONTROL) != 0L)
X#define is_armed(ptr)		attacktype(ptr, AT_WEAP)
X#define likes_gold(ptr) 	(((ptr)->mflags1 & M1_GREEDY) != 0L)
X#define likes_gems(ptr) 	(((ptr)->mflags1 & M1_JEWELS) != 0L)
X#define likes_objs(ptr) 	(((ptr)->mflags1 & M1_COLLECT) != 0L || \
X					is_armed(ptr))
X#define likes_magic(ptr)	(((ptr)->mflags1 & M1_MAGIC) != 0L)
X#define is_undead(ptr)		(((ptr)->mflags2 & M2_UNDEAD) != 0L)
X#define resists_sleep(ptr)	(((ptr)->mflags1 & M1_SLEE_RES) != 0L || is_undead(ptr))
X#define is_were(ptr)		(((ptr)->mflags2 & M2_WERE) != 0L)
X#define is_elf(ptr)		(((ptr)->mflags2 & M2_ELF) != 0L)
X#define is_dwarf(ptr)		(((ptr)->mflags2 & M2_DWARF) != 0L)
X#define is_giant(ptr)		(((ptr)->mflags2 & M2_GIANT) != 0L)
X#  ifdef GOLEMS
X#define is_golem(ptr)		((ptr)->mlet == S_GOLEM)
X#  endif
X#define is_domestic(ptr)	(((ptr)->mflags2 & M2_DOMESTIC) != 0L)
X#define is_orc(ptr)		(((ptr)->mflags2 & M2_ORC) != 0L)
X#define is_human(ptr)		(((ptr)->mflags2 & M2_HUMAN) != 0L)
X#define is_demon(ptr)		(((ptr)->mflags2 & M2_DEMON) != 0L)
X#define is_mercenary(ptr)	(((ptr)->mflags2 & M2_MERC) != 0L)
X#define is_wanderer(ptr)	(((ptr)->mflags2 & M2_WANDER) != 0L)
X#define always_hostile(ptr)	(((ptr)->mflags2 & M2_HOSTILE) != 0L)
X#define always_peaceful(ptr)	(((ptr)->mflags2 & M2_PEACEFUL) != 0L)
X#define extra_nasty(ptr)	(((ptr)->mflags2 & M2_NASTY) != 0L)
X#define strongmonst(ptr)	(((ptr)->mflags2 & M2_STRONG) != 0L)
X#  ifdef POLYSELF
X#define can_breathe(ptr)	attacktype(ptr, AT_BREA)
X#define cantwield(ptr)		(nohands(ptr) || verysmall(ptr))
X#define cantweararm(ptr)	(breakarm(ptr) || sliparm(ptr))
X#  endif /* POLYSELF */
X#define carnivorous(ptr)	(((ptr)->mflags2 & M2_CARNIVORE) != 0L)
X#define herbivorous(ptr)	(((ptr)->mflags2 & M2_HERBIVORE) != 0L)
X#define metallivorous(ptr)	(((ptr)->mflags2 & M2_METALLIVORE) != 0L)
X#define lays_eggs(ptr)		(((ptr)->mflags2 & M2_EGGS) != 0L)
X#define throws_rocks(ptr)	(((ptr)->mflags2 & M2_ROCKTHROW) != 0L)
X#define type_is_pname(ptr)	(((ptr)->mflags2 & M2_PNAME) != 0L)
X#define is_lord(ptr)		(((ptr)->mflags2 & M2_LORD) != 0L)
X#define is_prince(ptr)		(((ptr)->mflags2 & M2_PRINCE) != 0L)
X#  ifdef INFERNO
X#define is_ndemon(ptr)		(is_demon(ptr) && \
X			(((ptr)->mflags2 & (M2_LORD | M2_PRINCE)) == 0L))
X#  else
X#define is_ndemon(ptr)		(ptr == &mons[PM_DEMON])
X#  endif
X#define is_dlord(ptr)		(is_demon(ptr) && is_lord(ptr))
X#define is_dprince(ptr)		(is_demon(ptr) && is_prince(ptr))
X
X# endif /* STUPID_CPP */
X
X#endif /* MONDATA_H */
END_OF_FILE
if test 4813 -ne `wc -c <'include/mondata.h'`; then
    echo shar: \"'include/mondata.h'\" unpacked with wrong size!
fi
# end of 'include/mondata.h'
if test -f 'patch7.18' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'patch7.18'\" to \"'patch7.18.orig'\"
  mv -f 'patch7.18' 'patch7.18.orig'
fi
echo shar: Extracting \"'patch7.18'\" \(52317 characters\)
sed "s/^X//" >'patch7.18' <<'END_OF_FILE'
X*** src/Old/mthrowu.c	Mon Feb 19 20:37:10 1990
X--- src/mthrowu.c	Wed Feb 14 18:38:25 1990
X***************
X*** 1,18 ****
X! /*	SCCS Id: @(#)mthrowu.c	3.0	88/04/13
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X  #include	"hack.h"
X  
X! static int movedist();
X  
X  #define URETREATING(x,y) (movedist(u.ux,u.uy,x,y) > movedist(u.ux0,u.uy0,x,y))
X  
X! boolean lined_up();
X  
X  schar	tbx = 0, tby = 0;	/* used for direction of throw, buzz, etc. */
X  
X! const char *breathwep[] = {	"fragments",
X  				"fire",
X  				"sleep gas",
X  				"frost",
X--- 1,26 ----
X! /*	SCCS Id: @(#)mthrowu.c	3.0	89/11/22
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X  #include	"hack.h"
X  
X! OSTATIC int FDECL(movedist,(int,int,int,int));
X! static void FDECL(drop_throw,(struct obj *,BOOLEAN_P,int,int));
X! OSTATIC void FDECL(m_throw,(int,int,int,int,int,struct obj *));
X  
X  #define URETREATING(x,y) (movedist(u.ux,u.uy,x,y) > movedist(u.ux0,u.uy0,x,y))
X  
X! boolean FDECL(lined_up, (struct monst *));
X  
X+ #ifndef OVLB
X+ 
X+ OSTATIC const char *breathwep[];
X+ 
X+ #else /* OVLB */
X+ 
X  schar	tbx = 0, tby = 0;	/* used for direction of throw, buzz, etc. */
X  
X! XSTATIC const char *breathwep[] = {	"fragments",
X  				"fire",
X  				"sleep gas",
X  				"frost",
X***************
X*** 26,43 ****
X  thitu(tlev, dam, obj, name)	/* u is hit by sth, but not a monster */
X  	register int tlev, dam;
X  	struct obj *obj;
X! 	register char *name;
X  {
X! 	char *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--- 34,51 ----
X  thitu(tlev, dam, obj, name)	/* u is hit by sth, but not a monster */
X  	register int tlev, dam;
X  	struct obj *obj;
X! 	register const char *name;
X  {
X! 	const char *onm = an(name);
X! 	boolean is_acid = (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!", onm);
X  		return(0);
X  	} else {
X  		if(Blind || !flags.verbose) You("are hit!");
X! 		else You("are hit by %s!", onm);
X  #ifdef POLYSELF
X  		if (obj && obj->otyp == SILVER_ARROW && (u.ulycn != -1 ||
X  				is_demon(uasmon) || u.usym == S_VAMPIRE ||
X***************
X*** 46,57 ****
X  			pline("The %sarrow sears your flesh!",
X  				Blind ? "" : "silver ");
X  		}
X! 		if (acidic && resists_acid(uasmon))
X  			pline("It doesn't seem to hurt you.");
X  		else {
X  #endif
X! 			if (acidic) pline("It burns!");
X! 			losehp(dam, name);
X  #ifdef POLYSELF
X  		}
X  #endif
X--- 54,65 ----
X  			pline("The %sarrow sears your flesh!",
X  				Blind ? "" : "silver ");
X  		}
X! 		if (is_acid && resists_acid(uasmon))
X  			pline("It doesn't seem to hurt you.");
X  		else {
X  #endif
X! 			if (is_acid) pline("It burns!");
X! 			losehp(dam, name, KILLED_BY_AN);
X  #ifdef POLYSELF
X  		}
X  #endif
X***************
X*** 85,91 ****
X  	} else free((genericptr_t)obj);
X  }
X  
X! static void
X  m_throw(x, y, dx, dy, range, obj)
X  	register int x,y,dx,dy,range;		/* direction and range */
X  	register struct obj *obj;
X--- 93,99 ----
X  	} else free((genericptr_t)obj);
X  }
X  
X! XSTATIC void
X  m_throw(x, y, dx, dy, range, obj)
X  	register int x,y,dx,dy,range;		/* direction and range */
X  	register struct obj *obj;
X***************
X*** 174,180 ****
X  			}
X  			mtmp->mhp -= damage;
X  			if(mtmp->mhp < 1) {
X! 			    pline("%s is killed!", vis ? Monnam(mtmp) : "It");
X  			    mondied(mtmp);
X  			}
X  
X--- 182,191 ----
X  			}
X  			mtmp->mhp -= damage;
X  			if(mtmp->mhp < 1) {
X! 			    pline("%s is %s!", vis ? Monnam(mtmp) : "It",
X! 			       (is_demon(mtmp->data) || 
X! 					is_undead(mtmp->data) || !vis) ?
X! 				 "destroyed" : "killed");
X  			    mondied(mtmp);
X  			}
X  
X***************
X*** 214,220 ****
X  			if (hitu && obj->opoisoned)
X  			    /* it's safe to call xname twice because it's the
X  			       same object both times... */
X! 			    poisoned(xname(singleobj), A_STR, xname(singleobj));
X  			if(hitu && (obj->otyp == CREAM_PIE ||
X  				     obj->otyp == BLINDING_VENOM)) {
X  			    blindinc = rnd(25);
X--- 225,231 ----
X  			if (hitu && obj->opoisoned)
X  			    /* it's safe to call xname twice because it's the
X  			       same object both times... */
X! 			    poisoned(xname(singleobj), A_STR, xname(singleobj), 10);
X  			if(hitu && (obj->otyp == CREAM_PIE ||
X  				     obj->otyp == BLINDING_VENOM)) {
X  			    blindinc = rnd(25);
X***************
X*** 228,233 ****
X--- 239,245 ----
X  					makeplural(body_part(EYE)));
X  			    }
X  			}
X+ 			stop_occupation();
X  			if (hitu || !range) {
X  			    drop_throw(singleobj, hitu, u.ux, u.uy);
X  			    break;
X***************
X*** 285,290 ****
X--- 297,305 ----
X  	}
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL1
X+ 
X  /* Always returns 0??? -SAC */
X  int
X  thrwmu(mtmp)	/* monster throws item at you */
X***************
X*** 308,314 ****
X  		   !rn2(BOLT_LIM-movedist(x,mtmp->mux,y,mtmp->muy)))
X  		{
X  		    int savequan = otmp->quan;
X! 		    char *verb = "throws";
X  
X  		    if (otmp->otyp == ARROW
X  #ifdef TOLKIEN
X--- 323,329 ----
X  		   !rn2(BOLT_LIM-movedist(x,mtmp->mux,y,mtmp->muy)))
X  		{
X  		    int savequan = otmp->quan;
X! 		    const char *verb = "throws";
X  
X  		    if (otmp->otyp == ARROW
X  #ifdef TOLKIEN
X***************
X*** 331,339 ****
X  	return 0;
X  }
X  
X  int
X! spitmu(mtmp)			/* monster spits substance at you */
X  register struct monst *mtmp;
X  {
X  	register struct obj *otmp;
X  
X--- 346,358 ----
X  	return 0;
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVLB
X+ 
X  int
X! spitmu(mtmp, mattk)		/* monster spits substance at you */
X  register struct monst *mtmp;
X+ register struct attack *mattk;
X  {
X  	register struct obj *otmp;
X  
X***************
X*** 344,355 ****
X  	    return 0;
X  	}
X  	if(lined_up(mtmp)) {
X! 		otmp = mksobj(mtmp->data==&mons[PM_COBRA] ?
X! 			BLINDING_VENOM : ACID_VENOM, FALSE);
X! 		/* really incorrect; should check the attack type; this might
X! 		 * fail if someone introduces another monster with a venom
X! 		 * attack...
X! 		 */
X  		if(!rn2(BOLT_LIM-movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy))) {
X  		    if (canseemon(mtmp))
X  			pline("%s spits venom!", Monnam(mtmp));
X--- 363,380 ----
X  	    return 0;
X  	}
X  	if(lined_up(mtmp)) {
X! 		switch (mattk->adtyp) {
X! 		    case AD_BLND:
X! 		    case AD_DRST:
X! 			otmp = mksobj(BLINDING_VENOM, FALSE);
X! 			break;
X! 		    default:
X! 			impossible("bad attack type in spitmu");
X! 				/* fall through */
X! 		    case AD_ACID:
X! 			otmp = mksobj(ACID_VENOM, FALSE);
X! 			break;
X! 		}
X  		if(!rn2(BOLT_LIM-movedist(mtmp->mx,mtmp->mux,mtmp->my,mtmp->muy))) {
X  		    if (canseemon(mtmp))
X  			pline("%s spits venom!", Monnam(mtmp));
X***************
X*** 362,367 ****
X--- 387,395 ----
X  	return 0;
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL1
X+ 
X  int
X  breamu(mtmp, mattk)			/* monster breathes at you (ranged) */
X  	register struct monst *mtmp;
X***************
X*** 412,421 ****
X  		x = bx; y = by;
X  		while(x != ax || y != ay) {
X  
X! 		    if (!ACCESSIBLE(levl[x][y].typ) ||
X! 			  (IS_DOOR(levl[x][y].typ) && 
X! 				(levl[x][y].doormask & (D_LOCKED | D_CLOSED)))) 
X! 			return FALSE;
X  		    x += sgn(tbx), y += sgn(tby);
X  		}
X  		return TRUE;
X--- 440,446 ----
X  		x = bx; y = by;
X  		while(x != ax || y != ay) {
X  
X! 		    if(!accessible(x, y)) return FALSE;
X  		    x += sgn(tbx), y += sgn(tby);
X  		}
X  		return TRUE;
X***************
X*** 430,435 ****
X--- 455,463 ----
X  	return(linedup(mtmp->mux,mtmp->muy,mtmp->mx,mtmp->my));
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVL0
X+ 
X  /* Check if a monster is carrying a particular item.
X   */
X  struct obj *
X***************
X*** 445,452 ****
X  	return((struct obj *) 0);
X  }
X  
X! static int
X  movedist(x0, x1, y0, y1)
X  {
X  	register int absdx, absdy;
X  
X--- 473,484 ----
X  	return((struct obj *) 0);
X  }
X  
X! #endif /* OVL0 */
X! #ifdef OVL1
X! 
X! XSTATIC int
X  movedist(x0, x1, y0, y1)
X+ int x0, x1, y0, y1;
X  {
X  	register int absdx, absdy;
X  
X***************
X*** 455,457 ****
X--- 487,491 ----
X  
X  	return (max(absdx,absdy));
X  }
X+ 
X+ #endif /* OVL1 */
X*** src/Old/music.c	Mon Feb 19 20:37:41 1990
X--- src/music.c	Mon Feb 19 10:18:01 1990
X***************
X*** 30,36 ****
X--- 30,46 ----
X  #include "hack.h"
X  
X  #ifdef MUSIC
X+ #include <ctype.h>
X  
X+ static void FDECL(awaken_monsters,(int));
X+ static void FDECL(put_monsters_to_sleep,(int));
X+ static void FDECL(charm_snakes,(int));
X+ static void FDECL(calm_nymphs,(int));
X+ static void NDECL(awaken_soldiers);
X+ static void FDECL(charm_monsters,(int));
X+ static void FDECL(do_earthquake,(int));
X+ static int FDECL(do_improvisation,(struct obj *));
X+ 
X  /*
X   * Wake every monster in range...
X   */
X***************
X*** 48,54 ****
X  			  mtmp->mflee = 1;
X  		} else if (dist(mtmp->mx, mtmp->my) < distance) {
X  			mtmp->msleep = 0;
X! 			mtmp->mfroz = 0;
X  		}
X  		mtmp = mtmp->nmon;
X  	}
X--- 58,65 ----
X  			  mtmp->mflee = 1;
X  		} else if (dist(mtmp->mx, mtmp->my) < distance) {
X  			mtmp->msleep = 0;
X! 			mtmp->mcanmove = 1;
X! 			mtmp->mfrozen = 0;
X  		}
X  		mtmp = mtmp->nmon;
X  	}
X***************
X*** 66,73 ****
X  
X  	while(mtmp) {
X  		  if (dist(mtmp->mx, mtmp->my) < distance)
X! 		    if(!mtmp->mfroz && !resist(mtmp, WAND_SYM, 0, NOTELL))
X! 		      mtmp->mfroz = 1;
X  		mtmp = mtmp->nmon;
X  	}
X  }
X--- 77,84 ----
X  
X  	while(mtmp) {
X  		  if (dist(mtmp->mx, mtmp->my) < distance)
X! 		    if(mtmp->mcanmove && !resist(mtmp, WAND_SYM, 0, NOTELL))
X! 		      mtmp->mcanmove = mtmp->mfrozen = 0;
X  		mtmp = mtmp->nmon;
X  	}
X  }
X***************
X*** 122,129 ****
X  	register struct monst *mtmp = fmon;
X  
X  	while(mtmp) {
X! 		if (IS_SOLDIER(mtmp->data))
X! 			mtmp->mpeaceful = mtmp->msleep = mtmp->mfroz = 0;
X  		mtmp = mtmp->nmon;
X  	}
X  #endif /* ARMY /**/
X--- 133,142 ----
X  	register struct monst *mtmp = fmon;
X  
X  	while(mtmp) {
X! 		if (IS_SOLDIER(mtmp->data)) {
X! 			mtmp->mpeaceful = mtmp->msleep = 0;
X! 			mtmp->mcanmove = 1;
X! 		}
X  		mtmp = mtmp->nmon;
X  	}
X  #endif /* ARMY /**/
X***************
X*** 219,225 ****
X  					int saved_conf = u.umconf;
X  
X  					if(!cansee(x,y))
X! 					    pline("It has died!");
X  					else {
X  					    You("destroy %s!",
X  					    mtmp->mtame ?
X--- 232,238 ----
X  					int saved_conf = u.umconf;
X  
X  					if(!cansee(x,y))
X! 					    pline("It is destroyed!");
X  					else {
X  					    You("destroy %s!",
X  					    mtmp->mtame ?
X***************
X*** 242,248 ****
X  					    You("fall into a chasm!");
X  					    u.utrap = rn1(6,2);
X  					    u.utraptype = TT_PIT;
X! 					    losehp(rnd(6),"fall into a chasm");
X  					    selftouch("Falling, you");
X  				    }
X  			    } else
X--- 255,262 ----
X  					    You("fall into a chasm!");
X  					    u.utrap = rn1(6,2);
X  					    u.utraptype = TT_PIT;
X! 					    losehp(rnd(6),"fell into a chasm",
X! 						NO_KILLER_PREFIX);
X  					    selftouch("Falling, you");
X  				    }
X  			    } else
X***************
X*** 302,308 ****
X  			} else {
X  				if (!u.dx && !u.dy && !u.dz) {
X  					if((damage = zapyourself(instr)))
X! 					  losehp(damage,"self-inflicted injury");
X  					makeknown(instr->otyp);
X  					return(2);
X  				}
X--- 316,324 ----
X  			} else {
X  				if (!u.dx && !u.dy && !u.dz) {
X  					if((damage = zapyourself(instr)))
X! 					  losehp(damage,
X! 		self_pronoun("using a magical horn on %sself", "him"),
X! 					  NO_KILLER_PREFIX);
X  					makeknown(instr->otyp);
X  					return(2);
X  				}
X***************
X*** 368,374 ****
X  	pline("What tune are you playing? [what 5 notes] ");
X  	getlin(buf);
X  	for(s=buf;*s;s++)
X! 	    *s = (*s >='a' && *s<='z') ? 'A' + *s - 'a' : *s;
X  	You("extract a strange sound from the %s!",xname(instr));
X  	/* Check if there was the Stronghold drawbridge near
X  	 * and if the tune conforms to what we're waiting for.
X--- 384,390 ----
X  	pline("What tune are you playing? [what 5 notes] ");
X  	getlin(buf);
X  	for(s=buf;*s;s++)
X! 		if (islower(*s)) *s=toupper(*s);
X  	You("extract a strange sound from the %s!",xname(instr));
X  	/* Check if there was the Stronghold drawbridge near
X  	 * and if the tune conforms to what we're waiting for.
X*** src/Old/o_init.c	Mon Feb 19 20:38:04 1990
X--- src/o_init.c	Thu Feb  1 18:45:03 1990
X***************
X*** 4,9 ****
X--- 4,13 ----
X  
X  #include	"hack.h"		/* for typedefs */
X  
X+ static void NDECL(setgemprobs);
X+ static void FDECL(shuffle,(int,int,BOOLEAN_P));
X+ static boolean FDECL(interesting_to_discover,(int));
X+ 
X  /* note that NROFOBJECTS is the number of legal objects, which does not count
X   * the strange object and null object that take up positions 0 and NROFOBJECTS+1
X   * in the objects array
X***************
X*** 70,76 ****
X  	register boolean domaterial;
X  {
X  	register int i, j;
X! 	char *desc;
X  #ifdef TEXTCOLOR
X  	int color;
X  #endif /* TEXTCOLOR */
X--- 74,80 ----
X  	register boolean domaterial;
X  {
X  	register int i, j;
X! 	const char *desc;
X  #ifdef TEXTCOLOR
X  	int color;
X  #endif /* TEXTCOLOR */
X***************
X*** 120,126 ****
X  		bases[i] = 0;
X  	for(i = 0; i != TOTAL_OBJS; i++)
X  		disco[i] = i;
X! 
X  	/* init base; if probs given check that they add up to 1000,
X  	   otherwise compute probs; shuffle descriptions */
X  	end = TOTAL_OBJS;
X--- 124,132 ----
X  		bases[i] = 0;
X  	for(i = 0; i != TOTAL_OBJS; i++)
X  		disco[i] = i;
X! #ifdef NAMED_ITEMS
X! 	init_exists();	/* zero out the "artifact exists" list */
X! #endif
X  	/* init base; if probs given check that they add up to 1000,
X  	   otherwise compute probs; shuffle descriptions */
X  	end = TOTAL_OBJS;
X***************
X*** 238,244 ****
X  #ifdef MACOS
X  	for (i = 0 ; i < TOTAL_OBJS; i++) {
X  		descr[i] = objects[i].oc_descr;
X! 		objects[i].oc_descr = (char *)switches[i];
X  	}
X  #endif
X  	bwrite(fd, (genericptr_t)objects, sizeof(struct objclass) * TOTAL_OBJS);
X--- 244,250 ----
X  #ifdef MACOS
X  	for (i = 0 ; i < TOTAL_OBJS; i++) {
X  		descr[i] = objects[i].oc_descr;
X! 		objects[i].oc_descr = (const char *)switches[i];
X  	}
X  #endif
X  	bwrite(fd, (genericptr_t)objects, sizeof(struct objclass) * TOTAL_OBJS);
X***************
X*** 295,301 ****
X  		objects[i].oc_descr = d[switches[i]].descr;
X  	}
X  #else
X! # if !defined(MSDOS) && !defined(M_XENIX)
X  	differ = (genericptr_t)&objects[0] - (genericptr_t)then;
X  # else
X  	differ = (long)&objects[0] - (long)then;
X--- 301,307 ----
X  		objects[i].oc_descr = d[switches[i]].descr;
X  	}
X  #else
X! # if !defined(MSDOS) && !defined(M_XENIX) && !defined(HPUX)
X  	differ = (genericptr_t)&objects[0] - (genericptr_t)then;
X  # else
X  	differ = (long)&objects[0] - (long)then;
X***************
X*** 308,314 ****
X  			objects[i].oc_name += differ;
X  # else
X  			objects[i].oc_name =
X! 			    (char *)((long)(objects[i].oc_name) + differ);
X  # endif
X  		}
X  		if (objects[i].oc_descr) {
X--- 314,320 ----
X  			objects[i].oc_name += differ;
X  # else
X  			objects[i].oc_name =
X! 			    (const char *)((long)(objects[i].oc_name) + differ);
X  # endif
X  		}
X  		if (objects[i].oc_descr) {
X***************
X*** 316,322 ****
X  			objects[i].oc_descr += differ;
X  # else
X  			objects[i].oc_descr =
X! 			    (char *)((long)(objects[i].oc_descr) + differ);
X  # endif
X  		}
X  #endif /* MACOS */
X--- 322,328 ----
X  			objects[i].oc_descr += differ;
X  # else
X  			objects[i].oc_descr =
X! 			    (const char *)((long)(objects[i].oc_descr) + differ);
X  # endif
X  		}
X  #endif /* MACOS */
X*** src/Old/objects.c	Mon Feb 19 20:38:30 1990
X--- src/objects.c	Wed Jan 17 23:02:38 1990
X***************
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--- 6,11 ----
X***************
X*** 376,382 ****
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--- 375,381 ----
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,1,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***************
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--- 436,442 ----
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, GLASS, 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*** src/Old/objnam.c	Mon Feb 19 20:40:32 1990
X--- src/objnam.c	Sat Feb 17 21:15:08 1990
X***************
X*** 9,26 ****
X  #define	PREFIX	50
X  #define SCHAR_MAX 127
X  
X  /*	We want the player to be able to learn what key goes in what lock.  */
X! const char *keystr[N_LOX] = { "round", "square", "triangular", "oval",
X! 			    "octagonal", "hexagonal", "cylindrical",
X! 			    "irregular", "conical", "wedge-shaped" },
X! 	   *lockstr[N_LOX] = { "round", "square", "triangular", "oval",
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  	char tc[BUFSZ];
X  	register int i;
X  
X--- 9,51 ----
X  #define	PREFIX	50
X  #define SCHAR_MAX 127
X  
X+ #ifndef OVLB
X+ 
X+ OSTATIC const char *keystr[N_LOX], *lockstr[N_LOX];
X+ 
X+ #else /* OVLB */
X  /*	We want the player to be able to learn what key goes in what lock.  */
X! XSTATIC const char *keystr[N_LOX] = { "round", "square", "triangular", "oval",
X! 			              "octagonal", "hexagonal", "cylindrical",
X! 			              "irregular", "conical", "wedge-shaped" },
X! 	          *lockstr[N_LOX] = { "round", "square", "triangular", "oval",
X! 			              "octagonal", "hexagonal", "wide",
X! 			              "notched", "large round", "large square" };
X! #endif /* OVLB */
X  
X  static int FDECL(rnd_class, (int,int));
X+ OSTATIC int FDECL(named_key,(const char *));
X+ OSTATIC int FDECL(named_box,(const char *));
X+ OSTATIC char *FDECL(strprepend,(char *,const char *));
X+ static char *FDECL(sitoa,(int));
X  
X! static struct Jitem {
X! 	int item;
X! 	const char *name;
X! } Japanese_items[] = {
X! 	{ SHORT_SWORD, "wakizashi" },
X! 	{ BROADSWORD, "ninja-to" },
X! 	{ GLAIVE, "naginata" },
X! 	/* { BOW, "yumi" }, */
X! 	{ LOCK_PICK, "osaku" },
X! 	{0, "" }
X! };
X! OSTATIC const char *FDECL(Japanese_item_name,(int));
X! 
X! #ifdef OVL1
X! 
X! XSTATIC int
X! named_key(s) register const char *s; {
X  	char tc[BUFSZ];
X  	register int i;
X  
X***************
X*** 32,40 ****
X  	return(0);
X  }
X  
X! static int
X  named_box(s)
X! register char *s;
X  {
X  	char tc[BUFSZ];
X  	register int i;
X--- 57,65 ----
X  	return(0);
X  }
X  
X! XSTATIC int
X  named_box(s)
X! register const char *s;
X  {
X  	char tc[BUFSZ];
X  	register int i;
X***************
X*** 47,54 ****
X  	return(0);
X  }
X  
X! static char *
X! strprepend(s,pref) register char *s, *pref; {
X  register int i = strlen(pref);
X  	if(i > PREFIX) {
X  		pline("WARNING: prefix too short.");
X--- 72,81 ----
X  	return(0);
X  }
X  
X! XSTATIC char *
X! strprepend(s,pref)
X! register char *s;
X! register const char *pref; {
X  register int i = strlen(pref);
X  	if(i > PREFIX) {
X  		pline("WARNING: prefix too short.");
X***************
X*** 70,75 ****
X--- 97,105 ----
X  	return(buf);
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVLB
X+ 
X  char *
X  typename(otyp)
X  register int otyp;
X***************
X*** 80,89 ****
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  	switch(ocl->oc_olet) {
X  	case POTION_SYM:
X  		Strcpy(buf, "potion");
X--- 110,122 ----
X  static char buf[BUFSZ];
X  #endif
X  register struct objclass *ocl = &objects[otyp];
X! register const char *actualn = ocl->oc_name;
X! register const char *dn = ocl->oc_descr;
X! register const char *un = ocl->oc_uname;
X  register int nn = ocl->oc_name_known;
X+ 
X+ 	if (pl_character[0] == 'S' && Japanese_item_name(otyp))
X+ 		actualn = Japanese_item_name(otyp);
X  	switch(ocl->oc_olet) {
X  	case POTION_SYM:
X  		Strcpy(buf, "potion");
X***************
X*** 165,170 ****
X--- 198,206 ----
X  	return str;
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL1
X+ 
X  char *
X  xname(obj)
X  register struct obj *obj;
X***************
X*** 176,184 ****
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  	buf[0] = 0;
X  	if(!Blind) obj->dknown=1;
X--- 212,223 ----
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 const char *actualn = objects[obj->otyp].oc_name;
X! register const char *dn = objects[obj->otyp].oc_descr;
X! register const char *un = objects[obj->otyp].oc_uname;
X! 
X! 	if (pl_character[0] == 'S' && Japanese_item_name((int)obj->otyp))
X! 		actualn = Japanese_item_name((int)obj->otyp);
X  
X  	buf[0] = 0;
X  	if(!Blind) obj->dknown=1;
X***************
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--- 241,263 ----
X  			Strcpy(buf, "poisoned ");
X  	    case VENOM_SYM:
X  	    case TOOL_SYM:
X! 		if(un) {
X! 			/* un must come first here.  If it does not, they could
X! 			 * tell objects apart by seeing which ones refuse to
X! 			 * accept names.
X! 			 */
X! 			Sprintf(buf, "%s called %s",
X! 				nn ? actualn : dn, un);
X! 		} else if(nn)
X! 			Strcat(buf, actualn);
X! 		else
X! 			Strcat(buf, dn);
X! 		/* If we use an() here we'd have to remember never to use */
X! 		/* it whenever calling doname() or xname(). */
X  		if(obj->otyp == FIGURINE)
X! 		    Sprintf(eos(buf), " of a%s %s",
X! 			index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "",
X! 			mons[obj->corpsenm].mname);
X  		break;
X  	    case ARMOR_SYM:
X  		if(obj->otyp==DRAGON_SCALE_MAIL) {
X***************
X*** 266,272 ****
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--- 317,325 ----
X  		break;
X  	    case ROCK_SYM:
X  		if(obj->otyp == STATUE)
X! 		    Sprintf(buf, "%s of a%s %s", actualn,
X! 			index(vowels,*(mons[obj->corpsenm].mname)) ? "n" : "",
X! 			mons[obj->corpsenm].mname);
X  		else Strcpy(buf, actualn);
X  		break;
X  	    case BALL_SYM:
X***************
X*** 351,358 ****
X  			break;
X  		}
X  		if(!nn) {
X! 			char *rock=(obj->otyp==LOADSTONE||obj->otyp==LUCKSTONE)
X! 				? "stone" : "gem";
X  			if(un)	Sprintf(buf,"%s called %s", rock, un);
X  			else	Sprintf(buf, "%s %s", dn, rock);
X  			break;
X--- 404,411 ----
X  			break;
X  		}
X  		if(!nn) {
X! 			const char *rock=
X! 	(obj->otyp==LOADSTONE||obj->otyp==LUCKSTONE) ? "stone" : "gem";
X  			if(un)	Sprintf(buf,"%s called %s", rock, un);
X  			else	Sprintf(buf, "%s %s", dn, rock);
X  			break;
X***************
X*** 374,379 ****
X--- 427,435 ----
X  	return(buf);
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVL0
X+ 
X  char *
X  doname(obj)
X  register struct obj *obj;
X***************
X*** 544,549 ****
X--- 600,608 ----
X  	return(bp);
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X+ 
X  /*
X   * Used if only one of a collection of objects is named (e.g. in eat.c).
X   */
X***************
X*** 572,578 ****
X  
X  char *
X  an(str)
X! register char *str;
X  {
X  	static char buf[BUFSZ];
X  
X--- 631,637 ----
X  
X  char *
X  an(str)
X! register const char *str;
X  {
X  	static char buf[BUFSZ];
X  
X***************
X*** 592,608 ****
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! aobjnam(otmp,verb) register struct obj *otmp; register char *verb; {
X! register char *bp = xname(otmp);
X! char prefix[PREFIX];
X  	if(otmp->quan != 1) {
X  		Sprintf(prefix, "%u ", otmp->quan);
X  		bp = strprepend(bp, prefix);
X--- 651,673 ----
X  
X  char *
X  An(str)
X! const char *str;
X  {
X! 	register char *tmp;
X! 
X! 	tmp = an(str);
X! 	if (*tmp == 'a') *tmp = 'A';
X! 	return tmp;
X  }
X  
X  char *
X! aobjnam(otmp,verb)
X! register struct obj *otmp;
X! register const char *verb;
X! {
X! 	register char *bp = xname(otmp);
X! 	char prefix[PREFIX];
X! 
X  	if(otmp->quan != 1) {
X  		Sprintf(prefix, "%u ", otmp->quan);
X  		bp = strprepend(bp, prefix);
X***************
X*** 656,661 ****
X--- 721,729 ----
X  		if('A' <= *p && *p <= 'Z') *p += 'a'-'A';
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL0
X+ 
X  /* Plural routine; chiefly used for user-defined fruits.  We have to try to
X   * account for everything reasonable the player has; something unreasonable
X   * can still break the code.  However, it's still a lot more accurate than
X***************
X*** 666,682 ****
X   */
X  char *
X  makeplural(oldstr)
X! char *oldstr;
X  {
X  	register char *spot;
X  	static char str[BUFSZ];
X! 	static char *excess;
X  	int len;
X  
X  	while (*oldstr==' ') oldstr++;
X  	if (!oldstr || !*oldstr) {
X  		impossible("plural of null?");
X! 		return("s");
X  	}
X  	Strcpy(str, oldstr);
X  
X--- 734,751 ----
X   */
X  char *
X  makeplural(oldstr)
X! const char *oldstr;
X  {
X  	register char *spot;
X  	static char str[BUFSZ];
X! 	const char *excess;
X  	int len;
X  
X  	while (*oldstr==' ') oldstr++;
X  	if (!oldstr || !*oldstr) {
X  		impossible("plural of null?");
X! 		Strcpy(str, "s");
X! 		return str;
X  	}
X  	Strcpy(str, oldstr);
X  
X***************
X*** 853,863 ****
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--- 922,942 ----
X  	return str;
X  }
X  
X! #endif /* OVL0 */
X! 
X! struct o_range {
X! 	const char *name, osym;
X  	int  f_o_range, l_o_range;
X! };
X! 
X! #ifndef OVLB
X! 
X! OSTATIC const struct o_range o_ranges[];
X! 
X! #else /* OVLB */
X! 
X! /* wishable subranges of objects */
X! XSTATIC const struct o_range 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***************
X*** 873,891 ****
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--- 952,978 ----
X  	{ "sword",	WEAPON_SYM, SHORT_SWORD,    KATANA }
X  };
X  
X  /*
X   * Singularize a string the user typed in; this helps reduce the complexity
X!  * of readobjnam, and is also used in pager.c to singularize the string
X!  * for which help is sought.
X   */
X  
X! char *
X! makesingular(oldstr)
X! const char *oldstr;
X  {
X! 	char *p, *bp;
X! 	static char str[BUFSZ];
X! 
X! 	if (!oldstr || !*oldstr) {
X! 		impossible("singular of null?");
X! 		str[0] = 0; return str;
X! 	}
X! 	Strcpy(str, oldstr);
X! 	bp = str;
X  
X+ 	while (*bp == ' ') bp++;
X  	/* find "cloves of garlic", "worthless pieces of blue glass" */
X  	for(p = bp; *p; p++) 
X  	    if(!strncmp(p, "s of ", 5)){
X***************
X*** 892,898 ****
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--- 979,985 ----
X  		/* but don't singularize "gauntlets" */
X  		if(strncmp(p-8, "gauntlet", 8))
X  			while(*p = p[1]) p++;
X! 		return bp;
X  	    }
X  
X  	/* remove -s or -es (boxes) or -ies (rubies) */
X***************
X*** 904,942 ****
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--- 991,1030 ----
X  				   !strcmp(p-4, "pies"))
X  					goto mins;
X  				Strcpy(p-3, "y");
X! 				return bp;
X  			}
X  
X  			/* note: cloves / knives from clove / knife */
X  			if(!strcmp(p-6, "knives")) {
X  				Strcpy(p-3, "fe");
X! 				return bp;
X  			}
X  
X  			if(!strcmp(p-6, "staves")) {
X  				Strcpy(p-3, "ff");
X! 				return bp;
X  			}
X  
X  			/* note: nurses, axes but boxes */
X  			if(!strcmp(p-5, "boxes")) {
X  				p[-2] = 0;
X! 				return bp;
X  			}
X  		}
X  		/* but don't singularize boots or gloves */
X  		else if(!strcmp(p-5, "boots") ||
X  			!strcmp(p-6, "gloves"))
X! 				return bp;
X  	mins:
X  		p[-1] = 0;
X  	} else {
X  		if(!strcmp(p-5, "teeth")) {
X  			Strcpy(p-5, "tooth");
X! 			return bp;
X  		}
X  		/* here we cannot find the plural suffix */
X  	}
X+ 	return bp;
X  }
X  
X  /* Return something wished for.  If not an object, return &zeroobj; if an error
X***************
X*** 964,970 ****
X  	 */
X  #endif
X  	char let;
X! 	char *un, *dn, *an;
X  	char *name=0;
X  #ifdef WIZARD
X  	int fake=0;
X--- 1052,1058 ----
X  	 */
X  #endif
X  	char let;
X! 	char *un, *dn, *actualn;
X  	char *name=0;
X  #ifdef WIZARD
X  	int fake=0;
X***************
X*** 978,984 ****
X  #define SPINACH 2
X  	contents = UNDEFINED;
X  	let = 0;
X! 	an = dn = un = 0;
X  	
X  	for(;;) {
X  		if (!bp) goto any;
X--- 1066,1072 ----
X  #define SPINACH 2
X  	contents = UNDEFINED;
X  	let = 0;
X! 	actualn = dn = un = 0;
X  	
X  	for(;;) {
X  		if (!bp) goto any;
X***************
X*** 1135,1142 ****
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--- 1223,1230 ----
X  	}
X  
X  	/* first change to singular if necessary */
X! 	if(cnt != 1 && *bp)
X! 		Strcpy(bp, makesingular(bp));
X  
X  sing:
X  	/* Maybe we need a special strcmp() which ignores capitalization and
X***************
X*** 1174,1185 ****
X  	   !strcmp(bp, "leather armor") || /* Prevent falling to 'armor'. */
X  	   !strcmp(bp, "studded leather armor")) {
X  		let = ARMOR_SYM;
X! 		an = bp;
X  		goto srch;
X  	}
X  	if(!strcmp(bp, "food ration")){
X  		let = FOOD_SYM;
X! 		an = bp;
X  		goto srch;
X  	}
X  	if((iskey = named_key(bp)) > 0) {
X--- 1262,1273 ----
X  	   !strcmp(bp, "leather armor") || /* Prevent falling to 'armor'. */
X  	   !strcmp(bp, "studded leather armor")) {
X  		let = ARMOR_SYM;
X! 		actualn = bp;
X  		goto srch;
X  	}
X  	if(!strcmp(bp, "food ration")){
X  		let = FOOD_SYM;
X! 		actualn = bp;
X  		goto srch;
X  	}
X  	if((iskey = named_key(bp)) > 0) {
X***************
X*** 1213,1222 ****
X  			let = wrpsym[i];
X  			if(let != AMULET_SYM) {
X  			    bp += j;
X! 			    if(!strncmp(bp, " of ", 4)) an = bp+4;
X  			    /* else if(*bp) ?? */
X  			} else
X! 			    an = bp;
X  			goto srch;
X  		}
X  		if(!strcmp(p-j, wrp[i])){
X--- 1301,1310 ----
X  			let = wrpsym[i];
X  			if(let != AMULET_SYM) {
X  			    bp += j;
X! 			    if(!strncmp(bp, " of ", 4)) actualn = bp+4;
X  			    /* else if(*bp) ?? */
X  			} else
X! 			    actualn = bp;
X  			goto srch;
X  		}
X  		if(!strcmp(p-j, wrp[i])){
X***************
X*** 1231,1237 ****
X  	if(!strcmp(p-6, " stone")){
X  		p[-6] = 0;
X  		let = GEM_SYM;
X! 		dn = an = bp;
X  		goto srch;
X  	}
X  	if(!strcmp(p-10, "gold piece") || !strcmp(p-7, "zorkmid") ||
X--- 1319,1325 ----
X  	if(!strcmp(p-6, " stone")){
X  		p[-6] = 0;
X  		let = GEM_SYM;
X! 		dn = actualn = bp;
X  		goto srch;
X  	}
X  	if(!strcmp(p-10, "gold piece") || !strcmp(p-7, "zorkmid") ||
X***************
X*** 1278,1292 ****
X  		goto typfnd;
X  	    }
X  
X! 	an = bp;
X! 	if (!dn) dn = an; /* ex. "black cap" */
X  srch:
X  	i = 1;
X  	if(let) i = bases[letindex(let)];
X  	while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){
X! 		register char *zn;
X  
X! 		if(an && (zn = objects[i].oc_name) && !strcmp(an, zn)) {
X  			typ = i;
X  			goto typfnd;
X  		}
X--- 1366,1380 ----
X  		goto typfnd;
X  	    }
X  
X! 	actualn = bp;
X! 	if (!dn) dn = actualn; /* ex. "black cap" */
X  srch:
X  	i = 1;
X  	if(let) i = bases[letindex(let)];
X  	while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){
X! 		register const char *zn;
X  
X! 		if(actualn && (zn = objects[i].oc_name) && !strcmp(actualn, zn)) {
X  			typ = i;
X  			goto typfnd;
X  		}
X***************
X*** 1300,1305 ****
X--- 1388,1403 ----
X  		}
X  		i++;
X  	}
X+ 	if (actualn) {
X+ 		struct Jitem *j = Japanese_items;
X+ 		while(j->item) {
X+ 			if (actualn && !strcmp(actualn, j->name)) {
X+ 				typ = j->item;
X+ 				goto typfnd;
X+ 			}
X+ 			j++;
X+ 		}
X+ 	}
X  #ifdef TUTTI_FRUTTI
X  	for(f=ffruit; f; f = f->nextf) {
X  		char *f1 = f->fname, *f2 = makeplural(f->fname);
X***************
X*** 1351,1357 ****
X  		wizard ||
X  #endif
X  		 (cnt <= 20 &&
X! 		  (let == WEAPON_SYM && typ <= SHURIKEN) || (typ == ROCK))))
X  			otmp->quan = cnt;
X  
X  	if (spesgn == 0) spe = otmp->spe;
X--- 1449,1455 ----
X  		wizard ||
X  #endif
X  		 (cnt <= 20 &&
X! 		  ((let == WEAPON_SYM && typ <= SHURIKEN) || (typ == ROCK)))))
X  			otmp->quan = cnt;
X  
X  	if (spesgn == 0) spe = otmp->spe;
X***************
X*** 1362,1368 ****
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  	} else {
X  		if (let == WAND_SYM) {
X  			if (spe > 1 && spesgn == -1) spe = 1;
X--- 1460,1466 ----
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 && Luck < 0) spesgn = -1;
X  	} else {
X  		if (let == WAND_SYM) {
X  			if (spe > 1 && spesgn == -1) spe = 1;
X***************
X*** 1461,1482 ****
X  		curse(otmp);
X  	} else if (uncursed) {
X  		otmp->blessed = 0;
X! 		otmp->cursed = (u.uluck < 0);
X  	} else if (blessed) {
X! 		otmp->blessed = (u.uluck >= 0);
X! 		otmp->cursed = (u.uluck < 0);
X  	} else if (spesgn < 0) {
X  		curse(otmp);
X  	}
X  
X  	/* prevent wishing abuse */
X! 	if (otmp->otyp == WAN_WISHING || otmp->otyp == MAGIC_LAMP)
X  		otmp->recharged = 1;
X  
X  	/* set poisoned */
X  	if (ispoisoned) {
X  	    if (let == WEAPON_SYM && typ <= SHURIKEN)
X! 		otmp->opoisoned = (u.uluck >= 0);
X  #ifdef WIZARD
X  	    else if (Is_box(otmp))
X  		otmp->otrapped = 1;
X--- 1559,1596 ----
X  		curse(otmp);
X  	} else if (uncursed) {
X  		otmp->blessed = 0;
X! 		otmp->cursed = (Luck < 0
X! #ifdef WIZARD
X! 					 && !wizard
X! #endif
X! 							);
X  	} else if (blessed) {
X! 		otmp->blessed = (Luck >= 0
X! #ifdef WIZARD
X! 					 || wizard
X! #endif
X! 							);
X! 		otmp->cursed = (Luck < 0
X! #ifdef WIZARD
X! 					 && !wizard
X! #endif
X! 							);
X  	} else if (spesgn < 0) {
X  		curse(otmp);
X  	}
X  
X  	/* prevent wishing abuse */
X! 	if (
X! #ifdef WIZARD
X! 		!wizard &&
X! #endif
X! 		(otmp->otyp == WAN_WISHING || otmp->otyp == MAGIC_LAMP))
X  		otmp->recharged = 1;
X  
X  	/* set poisoned */
X  	if (ispoisoned) {
X  	    if (let == WEAPON_SYM && typ <= SHURIKEN)
X! 		otmp->opoisoned = (Luck >= 0);
X  #ifdef WIZARD
X  	    else if (Is_box(otmp))
X  		otmp->otrapped = 1;
X***************
X*** 1514,1516 ****
X--- 1628,1645 ----
X  			return i;
X  	return 0;
X  }
X+ 
X+ XSTATIC const char *
X+ Japanese_item_name(i)
X+ int i;
X+ {
X+ 	struct Jitem *j = Japanese_items;
X+ 
X+ 	while(j->item) {
X+ 		if (i == j->item)
X+ 			return j->name;
X+ 		j++;
X+ 	}
X+ 	return (const char *)0;
X+ }
X+ #endif /* OVLB */
X*** src/Old/options.c	Mon Feb 19 20:41:34 1990
X--- src/options.c	Thu Feb  1 20:16:30 1990
X***************
X*** 1,12 ****
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  #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--- 1,11 ----
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  #include "hack.h"
X  static boolean set_order;
X  
X! static void FDECL(nmcpy, (char *, const char *, int));
X! void FDECL(escapes,(const char *, char *));
X  
X  void
X  initoptions()
X***************
X*** 16,23 ****
X  	flags.time = flags.nonews = flags.notombstone = flags.end_own =
X  	flags.standout = flags.nonull = flags.ignintr = FALSE;
X  	flags.no_rest_on_space = flags.invlet_constant = TRUE;
X! 	flags.end_top = 5;
X! 	flags.end_around = 4;
X  	flags.female = FALSE;			/* players are usually male */
X  	flags.sortpack = TRUE;
X  	flags.soundok = TRUE;
X--- 15,22 ----
X  	flags.time = flags.nonews = flags.notombstone = flags.end_own =
X  	flags.standout = flags.nonull = flags.ignintr = FALSE;
X  	flags.no_rest_on_space = flags.invlet_constant = TRUE;
X! 	flags.end_top = 3;
X! 	flags.end_around = 2;
X  	flags.female = FALSE;			/* players are usually male */
X  	flags.sortpack = TRUE;
X  	flags.soundok = TRUE;
X***************
X*** 25,34 ****
X  	flags.confirm = TRUE;
X  	flags.safe_dog = TRUE;
X  	flags.silent = 	flags.pickup = TRUE;
X- #ifdef MACOS
X- 	flags.standout = TRUE;
X- 	flags.end_around = 3;	/* Mac display routines don't scroll */
X- #endif
X  #ifdef TUTTI_FRUTTI
X  	nmcpy(pl_fruit, objects[SLIME_MOLD].oc_name, PL_FSIZ);
X  #endif
X--- 24,29 ----
X***************
X*** 49,54 ****
X--- 44,56 ----
X  #endif
X  	read_config_file();
X  #endif /* MSDOS */
X+ #ifdef MACOS
X+ 	flags.standout = TRUE;
X+ 	flags.end_around = 2;	/* Mac display routines don't scroll */
X+ 	flags.end_top = 4;
X+ 	read_config_file();
X+ 	
X+ #endif
X  	if(opts = getenv("NETHACKOPTIONS"))
X  		parseoptions(opts,TRUE);
X  #ifdef TUTTI_FRUTTI
X***************
X*** 60,79 ****
X  }
X  
X  static void
X! nmcpy(dest, source, maxlen)
X! 	char	*dest, *source;
X  	int	maxlen;
X  {
X- 	char	*cs, *cd;
X  	int	count;
X  
X- 	cd = dest;
X- 	cs = source;
X  	for(count = 1; count < maxlen; count++) {
X! 		if(*cs == ',' || *cs == '\0') break; /*exit on \0 terminator*/
X! 		*cd++ = *cs++;
X  	}
X! 	*cd = 0;
X  }
X  
X  /*
X--- 62,79 ----
X  }
X  
X  static void
X! nmcpy(dest, src, maxlen)
X! 	char	*dest;
X! 	const char *src;
X  	int	maxlen;
X  {
X  	int	count;
X  
X  	for(count = 1; count < maxlen; count++) {
X! 		if(*src == ',' || *src == '\0') break; /*exit on \0 terminator*/
X! 		*dest++ = *src++;
X  	}
X! 	*dest = 0;
X  }
X  
X  /*
X***************
X*** 85,91 ****
X   */
X  void
X  escapes(cp, tp)
X! char	*cp, *tp;
X  {
X      while (*cp)
X      {
X--- 85,92 ----
X   */
X  void
X  escapes(cp, tp)
X! const char	*cp;
X! char *tp;
X  {
X      while (*cp)
X      {
X***************
X*** 97,103 ****
X  	}
X  	if (*cp == '\\' && index("0123456789xXoO", cp[1]))
X  	{
X! 	    char *dp, *hex = "00112233445566778899aAbBcCdDeEfF";
X  	    int dcount = 0;
X  
X  	    cp++;
X--- 98,104 ----
X  	}
X  	if (*cp == '\\' && index("0123456789xXoO", cp[1]))
X  	{
X! 	    const char *dp, *hex = "00112233445566778899aAbBcCdDeEfF";
X  	    int dcount = 0;
X  
X  	    cp++;
X***************
X*** 157,162 ****
X--- 158,164 ----
X  register char *opts;
X  boolean from_env;
X  {
X+ #ifndef MACOS
X  	register char *op;
X  	unsigned num;
X  	boolean negated;
X***************
X*** 476,481 ****
X--- 478,486 ----
X  		return;
X  	}
X  #ifdef MSDOS
X+ # ifdef AMIGA_WBENCH
X+ 	if(ami_wbench_badopt(opts))
X+ # endif
X  	Printf("Bad syntax in OPTIONS in %s: %s.", configfile, opts);
X  #else
X  	Printf("Bad syntax in NETHACKOPTIONS: %s.", opts);
X***************
X*** 485,495 ****
X--- 490,797 ----
X  	);
X  #endif
X  	getret();
X+ #endif /* MACOS */
X  }
X  
X  int
X  doset()
X  {
X+ #ifdef MACOS
X+ #define	OPTIONS			"Nethack prefs"
X+ #define OK_BUTTON 1
X+ #define SAVE_BUTTON 2
X+ #define CANCEL_BUTTON 3
X+ #define MIN_CHECKBOX 4
X+ #define EXPLORE_BOX 4
X+ #define FEM_BOX 5
X+ #define NEWS_BOX 6
X+ #define FIXINV_BOX 7
X+ #define TOMB_BOX 8
X+ #define TIME_BOX 9
X+ #define VERBOSE_BOX 10
X+ #define SILENT_BOX 11
X+ #define AUTOZOOM_BOX 12
X+ #define INVERSE_BOX 13
X+ #define SORT_BOX 14
X+ #define COLOR_BOX 15
X+ #define PICKUP_BOX 16
X+ #define CONFIRM_BOX 17
X+ #define SAFE_BOX 18
X+ #define REST_SPACE_BOX 19
X+ #define MAX_CHECKBOX 19
X+ #define PLAYER_NAME 20
X+ #define CAT_NAME 21
X+ #define DOG_NAME 22
X+ #define FRUIT_NAME 23
X+ #define PACKORDER 24
X+ #define END_TOP 26
X+ #define END_AROUND 27
X+ #define FRUIT_TEXT 35
X+ #define PACK_TEXT 34
X+ #define ITEMTEXT(item,text) {GetDItem(optionDlg,item,&type,&ItemHndl,&box); \
X+ 					         (void)CtoPstr(text); \
X+ 					         SetIText(ItemHndl,text);\
X+ 					         (void)PtoCstr(text);}
X+ #define HIDEITEM(item) {GetDItem(optionDlg,item,&type,&ItemHndl,&box); \
X+ 				        HideControl(ItemHndl);\
X+ 				        SetDItem(optionDlg,item,type+128,ItemHndl,&box);}
X+ #define HIDETEXT(item) {GetDItem(optionDlg,item,&type,&ItemHndl,&box);\
X+ 						SetDItem(optionDlg,item,128+statText,ItemHndl,&box);\
X+ 						SetIText(ItemHndl,"\0");}
X+ #define SHOWITEM(item) {GetDItem(optionDlg,item,&type,&ItemHndl,&box);\
X+ 						SetDItem(optionDlg,item,type-128,ItemHndl,&box);\
X+ 						ShowControl(ItemHndl);}
X+ #define GETTEXT(item,maxsize) {GetDItem(optionDlg,item,&type,&ItemHndl,&box);\
X+ 					GetIText (ItemHndl, &tmp_name);\
X+ 					tmp_name[tmp_name[0]+1] = 0;\
X+ 					if (tmp_name[0] > maxsize)\
X+ 						tmp_name[0] = maxsize;}
X+ 	static boolean *flag_ptrs[20] = {0, 0, 0, 0, &flags.explore,
X+ 			&flags.female, &flags.nonews,&flags.invlet_constant,
X+ 			&flags.notombstone, &flags.time, &flags.verbose,
X+ 			&flags.silent, 0, &flags.standout, &flags.sortpack,
X+ #ifdef TEXTCOLOR
X+ 			&flags.use_color,
X+ #else
X+ 			0,
X+ #endif
X+ 			&flags.pickup, &flags.confirm,
X+ 			&flags.safe_dog, &flags.no_rest_on_space};
X+ 	extern short macflags;
X+ 	short dlgItem, type;
X+ 	Rect box;
X+ 	extern WindowPtr	HackWindow;
X+ 	Handle ItemHndl;
X+ 	unsigned num;
X+ 	char *op;
X+ 	char tmp_name[256];
X+ 	char savename[PL_NSIZ];
X+ 	char savedog[63];
X+ 	char savecat[63];
X+ 	char savefruit[PL_FSIZ];
X+ 	char saveorder[20];
X+ 	DialogRecord	dlgR;
X+ 	DialogPtr optionDlg;
X+ 	DialogTHndl	th, centreDlgBox();
X+ 	boolean done = FALSE;
X+     short savemacflags = macflags;
X+ 	struct flag saveflags;
X+ 	register char	*sp, *tmp;
X+ 
X+ 	SetCursor(&ARROW_CURSOR);
X+ 
X+ 	BlockMove(&flags, &saveflags, sizeof(struct flag));
X+ 	
X+ 	th = centreDlgBox(130, FALSE);
X+ 
X+ 	optionDlg = GetNewDialog(130, (Ptr)&dlgR, (WindowPtr)-1);
X+ /* set initial values of text items */
X+ 	nmcpy(savename,plname,sizeof(plname)-1);
X+ 	ITEMTEXT(PLAYER_NAME,plname);
X+ 	if(*dogname){
X+ 		nmcpy(savedog,dogname,62);
X+ 		ITEMTEXT(DOG_NAME,dogname);
X+ 	}
X+ 	if(*catname){
X+ 		nmcpy(savecat,catname,62);
X+ 		ITEMTEXT(CAT_NAME,catname);
X+ 	}
X+ #ifdef TUTTI_FRUTTI
X+ 	if(*pl_fruit){
X+ 		nmcpy(savefruit,pl_fruit,PL_FSIZ);
X+ 		ITEMTEXT(FRUIT_NAME,pl_fruit);
X+ 	}
X+ #else
X+ 	HIDETEXT(FRUIT_NAME);
X+ 	HIDETEXT(FRUIT_TEXT);
X+ #endif
X+ 	nmcpy(saveorder,inv_order,strlen(inv_order)+1);
X+ 	ITEMTEXT(PACKORDER,inv_order);
X+ /* set initial values of record items */
X+ 	Sprintf(tmp_name,"%u",flags.end_top);
X+ 	ITEMTEXT(END_TOP,tmp_name);
X+ 	Sprintf(tmp_name,"%u",flags.end_around);
X+ 	ITEMTEXT(END_AROUND,tmp_name);
X+ /* set initial values of checkboxes */
X+ 	for(dlgItem = MIN_CHECKBOX; dlgItem <= MAX_CHECKBOX; dlgItem++) {
X+ 		GetDItem(optionDlg, dlgItem, &type, &ItemHndl, &box);
X+ 		switch (dlgItem){
X+ 			case NEWS_BOX:
X+ #ifndef NEWS
X+ 				HIDEITEM(NEWS_BOX);
X+ 				break;
X+ #endif
X+ 			case TOMB_BOX:
X+ 			case REST_SPACE_BOX:
X+ 				SetCtlValue(ItemHndl,!(*(flag_ptrs[dlgItem])));
X+ 				break;
X+ 			case AUTOZOOM_BOX:
X+ 				SetCtlValue(ItemHndl,macflags & fZoomOnContextSwitch);
X+ 				break;
X+ #ifndef TEXTCOLOR
X+ 			case COLOR_BOX:
X+ 				HIDEITEM(COLOR_BOX);
X+ 				break;
X+ #endif
X+ 			default:
X+ 				SetCtlValue(ItemHndl,*(flag_ptrs[dlgItem]));
X+ 		}
X+ 	}
X+ 	SelIText(optionDlg, PLAYER_NAME, 0, 32767);
X+ 	
X+ 	ShowWindow(optionDlg);
X+ 	GetDItem(optionDlg, OK, &type, &ItemHndl, &box);
X+ 	SetPort (optionDlg);
X+ 	PenSize(3, 3);
X+ 	InsetRect (&box, -4, -4);
X+ 	FrameRoundRect (&box, 16, 16);
X+ 	
X+ 	while(!done) {
X+ 		ModalDialog((ProcPtr)0, &dlgItem);
X+ 		GetDItem(optionDlg, dlgItem, &type, &ItemHndl, &box);
X+ 		if (dlgItem >= MIN_CHECKBOX && dlgItem <= MAX_CHECKBOX) {
X+ 			SetCtlValue(ItemHndl, ! GetCtlValue (ItemHndl));
X+ 			if (dlgItem != AUTOZOOM_BOX)
X+ 				*(flag_ptrs[dlgItem]) = !*(flag_ptrs[dlgItem]);
X+ 			else
X+ 				macflags ^= fZoomOnContextSwitch;
X+ 		}
X+ 		else switch(dlgItem){
X+ 			case SAVE_BUTTON:
X+ 				GETTEXT(PLAYER_NAME,PL_NSIZ-1);
X+ 				strncpy(plname, tmp_name, tmp_name[0]+1);
X+ 				(void)PtoCstr (plname);
X+ 			
X+ 				GETTEXT(DOG_NAME,62);
X+ 				strncpy(dogname, tmp_name, tmp_name[0]+1);
X+ 				(void)PtoCstr (dogname);
X+ 			
X+ 				GETTEXT(CAT_NAME,62);
X+ 				strncpy(catname, tmp_name, tmp_name[0]+1);
X+ 				(void)PtoCstr (catname);
X+ 
X+ #ifdef TUTTI_FRUTTI
X+ 				GETTEXT(FRUIT_NAME,PL_FSIZ-1);
X+ 				strncpy(pl_fruit, tmp_name, tmp_name[0]+1);
X+ 				(void)PtoCstr (pl_fruit);
X+ #endif
X+ 
X+ 				GETTEXT(PACKORDER,19);
X+ 				op = tmp_name+1;
X+ 				/* Missing characters in new order are filled in at the end 
X+ 				 * from inv_order.
X+ 				 */
X+ 				for (sp = op; *sp; sp++)
X+ 					if ((!index(inv_order, *sp))||(index(sp+1, *sp))){
X+ 						for(tmp = sp; *tmp;tmp++)
X+ 							tmp[0]=tmp[1];
X+ 						sp--;
X+ 					}			/* bad or duplicate char in order - remove it*/
X+ 				tmp = (char *) alloc((unsigned)(strlen(inv_order)+1));
X+ 				Strcpy(tmp, op);
X+ 				for (sp = inv_order, num = strlen(tmp); *sp; sp++)
X+ 					if (!index(tmp, *sp)) {
X+ 						tmp[num++] = *sp;
X+ 						tmp[num] = 0;
X+ 					}
X+ 				Strcpy(inv_order, tmp);
X+ 				free((genericptr_t)tmp);
X+ 
X+ 				GETTEXT(END_TOP,5);
X+ 				op = tmp_name+1;
X+ 				while(*op) {
X+ 					num = 1;
X+ 					if(digit(*op)) {
X+ 						num = atoi(op);
X+ 						while(digit(*op)) op++;
X+ 					} else op++;
X+ 				}
X+ 				flags.end_top=num;
X+ 				GETTEXT(END_AROUND,5);
X+ 				op = tmp_name+1;
X+ 				while(*op) {
X+ 					num = 1;
X+ 					if(digit(*op)) {
X+ 						num = atoi(op);
X+ 						while(digit(*op)) op++;
X+ 					} else op++;
X+ 				}
X+ 				flags.end_around = num;
X+ 				write_opts();
X+ 				nmcpy(dogname,savedog,62);
X+ 				nmcpy(catname,savecat,62);
X+ 				nmcpy(plname,savename,sizeof(plname)-1);
X+ #ifdef TUTTI_FRUTTI
X+ 				nmcpy(pl_fruit,savefruit,PL_FSIZ-1);
X+ #endif
X+ 				nmcpy(inv_order,saveorder,strlen(inv_order)+1);
X+ 			case CANCEL_BUTTON:
X+ 				flags = saveflags;
X+ 				macflags = savemacflags;
X+ 				done = TRUE;
X+ 				break;
X+ 			case OK_BUTTON:
X+ 				GETTEXT(END_TOP,5);
X+ 				op = tmp_name+1;
X+ 				while(*op) {
X+ 					num = 1;
X+ 					if(digit(*op)) {
X+ 						num = atoi(op);
X+ 						while(digit(*op)) op++;
X+ 					} else op++;
X+ 				}
X+ 				flags.end_top=num;
X+ 				GETTEXT(END_AROUND,5);
X+ 				op = tmp_name+1;
X+ 				while(*op) {
X+ 					num = 1;
X+ 					if(digit(*op)) {
X+ 						num = atoi(op);
X+ 						while(digit(*op)) op++;
X+ 					} else op++;
X+ 				}
X+ 				flags.end_around = num;
X+ #ifdef TUTTI_FRUTTI
X+ 				GETTEXT(FRUIT_NAME,PL_FSIZ-1);
X+ 				(void)PtoCstr (tmp_name);
X+ 				(void)fruitadd(tmp_name);
X+ 				nmcpy(pl_fruit,tmp_name,PL_FSIZ-1);
X+ #endif
X+ 				nmcpy(dogname,savedog,62);
X+ 				nmcpy(catname,savecat,62);
X+ 				nmcpy(plname,savename,sizeof(plname)-1);
X+ 				GETTEXT(PACKORDER,19);
X+ 				op = tmp_name+1;
X+ 				/* Missing characters in new order are filled in at the end 
X+ 				 * from inv_order.
X+ 				 */
X+ 				for (sp = op; *sp; sp++)
X+ 					if ((!index(inv_order, *sp))||(index(sp+1, *sp))){
X+ 						for (tmp = sp; *tmp;tmp++)
X+ 							tmp[0]=tmp[1];
X+ 						sp--;
X+ 					}			/* bad or duplicate char in order - remove it*/
X+ 				tmp = (char *) alloc((unsigned)(strlen(inv_order)+1));
X+ 				Strcpy(tmp, op);
X+ 				for (sp = inv_order, num = strlen(tmp); *sp; sp++)
X+ 					if (!index(tmp, *sp)) {
X+ 						tmp[num++] = *sp;
X+ 						tmp[num] = 0;
X+ 					}
X+ 				Strcpy(inv_order, tmp);
X+ 				free((genericptr_t)tmp);
X+ 				flags.female = saveflags.female;
X+ 				flags.explore = saveflags.explore;
X+ 				done = TRUE;
X+ 				break;
X+ 			default:;
X+ 		}
X+ 	} 
X+ 	HideWindow(optionDlg);
X+ 	DisposDialog (optionDlg);
X+ 	SetPort (HackWindow);
X+ 	return 0; 
X+ #else
X  	char buf[BUFSZ];
X  
X  	pline("What options do you want to set? ");
X***************
X*** 536,542 ****
X  #ifdef TUTTI_FRUTTI
X  	    Sprintf(eos(buf), "fruit:%s,", pl_fruit);
X  #endif
X! 	    if(flags.end_top != 5 || flags.end_around != 4 || flags.end_own){
X  		Sprintf(eos(buf), "endgame: %u top scores/%u around me",
X  			flags.end_top, flags.end_around);
X  		if(flags.end_own) Strcat(buf, "/own scores");
X--- 838,844 ----
X  #ifdef TUTTI_FRUTTI
X  	    Sprintf(eos(buf), "fruit:%s,", pl_fruit);
X  #endif
X! 	    if(flags.end_top != 3 || flags.end_around != 2 || flags.end_own){
X  		Sprintf(eos(buf), "endgame: %u top scores/%u around me",
X  			flags.end_top, flags.end_around);
X  		if(flags.end_own) Strcat(buf, "/own scores");
X***************
X*** 551,556 ****
X--- 853,859 ----
X  	}
X  
X  	return 0;
X+ #endif /* MACOS */
X  }
X  
X  int
X***************
X*** 637,642 ****
X--- 940,946 ----
X  	set_pager(1);
X  	return;
X  quit:
X+ 	(void) next_opt("\033");
X  	set_pager(2);
X  	return;
X  }
X***************
X*** 643,660 ****
X  
X  /*
X   * prints the next boolean option, on the same line if possible, on a new
X!  * line if not
X   */
X! static int
X  next_opt(str)
X! 	char *str;
X  {
X! 	static char buf[80];
X  	static int i = 0;
X  	int r = 0;
X  
X  	i += strlen(str);
X! 	if (i > (CO - 2) || !*str) {
X  		r = page_line(buf);
X  		buf[0] = 0;
X  		i = strlen(str);
X--- 947,968 ----
X  
X  /*
X   * prints the next boolean option, on the same line if possible, on a new
X!  * line if not. End with next_opt(""). Note that next_opt("\033") may be
X!  * used to abort.
X   */
X! int
X  next_opt(str)
X! const char *str;
X  {
X! 	static char buf[121];
X  	static int i = 0;
X  	int r = 0;
X  
X+ 	if (*str == '\033') {
X+ 		i = 0; buf[0] = 0; return 0;
X+ 	}
X  	i += strlen(str);
X! 	if (i > min(CO - 2, 120) || !*str) {
X  		r = page_line(buf);
X  		buf[0] = 0;
X  		i = strlen(str);
X***************
X*** 677,683 ****
X--- 985,995 ----
X  {
X  	register int i,j;
X  	register struct fruit *f;
X+ #ifdef __GNULINT__
X+ 	struct fruit *lastf = 0;
X+ #else
X  	struct fruit *lastf;
X+ #endif
X  	int highest_fruit_id = 0;
X  	char buf[PL_FSIZ];
X  	boolean user_specified = (str == pl_fruit);
X*** src/Old/track.c	Mon Feb 19 19:03:41 1990
X--- src/track.c	Fri Feb 16 19:14:36 1990
X***************
X*** 7,21 ****
X  
X  #define	UTSZ	50
X  
X! coord utrack[UTSZ];
X! int utcnt = 0;
X! int utpnt = 0;
X  
X  void
X  initrack(){
X  	utcnt = utpnt = 0;
X  }
X  
X  /* add to track */
X  void
X  settrack(){
X--- 7,24 ----
X  
X  #define	UTSZ	50
X  
X! VSTATIC int utcnt, utpnt;
X! VSTATIC coord utrack[UTSZ];
X  
X+ #ifdef OVLB
X  void
X  initrack(){
X  	utcnt = utpnt = 0;
X  }
X+ #endif /* OVLB */
X  
X+ #ifdef OVL1
X+ 
X  /* add to track */
X  void
X  settrack(){
X***************
X*** 26,31 ****
X--- 29,37 ----
X  	utpnt++;
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVL0
X+ 
X  coord *
X  gettrack(x, y)
X  register int x, y;
X***************
X*** 42,44 ****
X--- 48,52 ----
X  	}
X  	return (coord *)0;
X  }
X+ 
X+ #endif /* OVL0 */
X
END_OF_FILE
if test 52317 -ne `wc -c <'patch7.18'`; then
    echo shar: \"'patch7.18'\" unpacked with wrong size!
fi
# end of 'patch7.18'
echo shar: End of archive 22 \(of 30\).
cp /dev/null ark22isdone
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