[comp.sources.games] v09i014: 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 14
Archive-name: NetHack3/Patch7n
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 14 (of 30)."
# Contents:  patch7.10
# Wrapped by billr@saab on Wed Feb 21 10:04:35 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patch7.10' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'patch7.10'\" to \"'patch7.10.orig'\"
  mv -f 'patch7.10' 'patch7.10.orig'
fi
echo shar: Extracting \"'patch7.10'\" \(54708 characters\)
sed "s/^X//" >'patch7.10' <<'END_OF_FILE'
X*** src/Old/mail.c	Mon Feb 19 20:26:33 1990
X--- src/mail.c	Thu Jan 25 22:13:05 1990
X***************
X*** 7,12 ****
X--- 7,15 ----
X  #include "hack.h"	/* mainly for index() which depends on BSD */
X  
X  #ifdef MAIL
X+ static void FDECL(mdrush,(struct monst *,int,int));
X+ static void FDECL(mdappear,(struct monst *,BOOLEAN_P));
X+ static void NDECL(newmail);
X  
X  # ifdef UNIX
X  #  include <sys/stat.h>
X***************
X*** 55,64 ****
X--- 58,72 ----
X   *	- It may also do this with adjoining castle rooms.
X   */
X  
X+ #ifdef OVL0
X+ 
X  # if !defined(UNIX) && !defined(VMS)
X  int mustgetmail = -1;
X  # endif
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X+ 
X  # ifdef UNIX
X  extern struct passwd *getpwuid();
X  static struct stat omstat,nmstat;
X***************
X*** 65,70 ****
X--- 73,81 ----
X  static char *mailbox = NULL;
X  static long laststattime;
X  
X+ # ifdef AMS				/* Just a placeholder for AMS */
X+ #   define MAILPATH "/dev/null"
X+ # else
X  #  ifdef BSD
X  #   define MAILPATH "/usr/spool/mail/"
X  #  endif
X***************
X*** 71,84 ****
X--- 82,108 ----
X  #  ifdef SYSV
X  #   define MAILPATH "/usr/mail/"
X  #  endif
X+ # endif /* AMS */
X  
X  void
X  getmailstatus() {
X  	if(!mailbox && !(mailbox = getenv("MAIL"))) {
X  #  ifdef MAILPATH
X+ #   ifdef AMS
X+ 	        struct passwd ppasswd;
X+ 
X+ 		bcopy(getpwuid(getuid()), &ppasswd, sizeof(struct passwd));
X+ 		if (ppasswd.pw_dir) {
X+ 		     mailbox = (char *) alloc((unsigned) strlen(ppasswd.pw_dir)+sizeof(AMS_MAILBOX));
X+ 		     Strcpy(mailbox, ppasswd.pw_dir);
X+ 		     Strcat(mailbox, AMS_MAILBOX);
X+ 		} else
X+ 		  return;
X+ #   else
X  		mailbox = (char *) alloc(sizeof(MAILPATH)+8);
X  		Strcpy(mailbox, MAILPATH);
X  		Strcat(mailbox, getpwuid(getuid())->pw_name);
X+ #  endif /* AMS */
X  #  else
X  		return;
X  #  endif
X***************
X*** 217,225 ****
X--- 241,254 ----
X  # ifdef VMS
X  	pline("\"Hello, %s!  I have a message for you.\"", plname);
X  # else
X+ #  ifdef NO_MAILREADER
X+ 	pline("\"Hello, %s!  You have some mail in the outside world.\"", plname);
X+ #  else
X  	pline("\"Hello, %s!  I have some mail for you.\"", plname);
X  # endif
X+ # endif
X  
X+ # ifndef NO_MAILREADER
X  	if(dist(md->mx,md->my) > 2)
X  		verbalize("Catch!");
X  	more();
X***************
X*** 243,251 ****
X--- 272,286 ----
X  # ifdef VMS
X  	broadcasts--;
X  # endif
X+ # endif /* NO_MAILREADER */
X  }
X  
X+ #endif /* OVLB */
X+ 
X  # if !defined(UNIX) && !defined(VMS)
X+ 
X+ #ifdef OVL0
X+ 
X  void
X  ckmailstatus() {
X  	if (mustgetmail < 0)
X***************
X*** 256,269 ****
X--- 291,313 ----
X  	}
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X+ 
X  void
X  readmail()
X  {
X  	pline("It says:  \"Please disregard previous letter.\"");
X  }
X+ 
X+ #endif /* OVLB */
X+ 
X  # endif /* !UNIX && !VMS */
X  
X  # ifdef UNIX
X+ 
X+ #ifdef OVL0
X+ 
X  void
X  ckmailstatus() {
X  	if(!mailbox
X***************
X*** 288,293 ****
X--- 332,340 ----
X  	}
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X+ 
X  void
X  readmail() {
X  #  ifdef DEF_MAILREADER			/* This implies that UNIX is defined */
X***************
X*** 300,314 ****
X  		exit(1);
X  	}
X  #  else
X  	(void) page_file(mailbox, FALSE);
X! #  endif
X  	/* get new stat; not entirely correct: there is a small time
X  	   window where we do not see new mail */
X  	getmailstatus();
X  }
X  # endif /* UNIX */
X  
X  # ifdef VMS
X  void
X  ckmailstatus()
X  {
X--- 347,370 ----
X  		exit(1);
X  	}
X  #  else
X+ #   ifndef AMS  			/* AMS mailboxes are directories */
X  	(void) page_file(mailbox, FALSE);
X! #   endif /* AMS */
X! #  endif /* DEF_MAILREADER */
X! 
X  	/* get new stat; not entirely correct: there is a small time
X  	   window where we do not see new mail */
X  	getmailstatus();
X  }
X+ 
X+ #endif /* OVLB */
X+ 
X  # endif /* UNIX */
X  
X  # ifdef VMS
X+ 
X+ #ifdef OVL0
X+ 
X  void
X  ckmailstatus()
X  {
X***************
X*** 316,321 ****
X--- 372,380 ----
X  		newmail();
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X+ 
X  void
X  readmail()
X  {
X***************
X*** 330,334 ****
X--- 389,395 ----
X  	}
X  }
X  # endif /* VMS */
X+ 
X+ #endif /* OVLB */
X  
X  #endif /* MAIL */
X*** src/Old/makedefs.c	Mon Feb 19 20:26:53 1990
X--- src/makedefs.c	Thu Feb  8 17:33:49 1990
X***************
X*** 2,8 ****
X  /* NetHack may be freely redistributed.  See license for details. */
X  /* makedefs.c - NetHack version 3.0 */
X  
X- #define MAKEDEFS_C 1	/* needs to be defined to 1 for Mac */
X  
X  #define EXTERN_H
X  #include	"config.h"
X--- 2,7 ----
X***************
X*** 13,26 ****
X  #endif /* NULL */
X  #define NULL	((genericptr_t)0)
X  
X! #ifndef LINT
X  static	const char	SCCS_Id[] = "@(#)makedefs.c\t3.0\t89/11/15";
X  #endif
X  
X  #ifdef MSDOS
X! #ifndef TOS
X  # define freopen _freopen
X! #endif
X  # undef	exit
X  extern void FDECL(exit, (int));
X  # define RDMODE	"r"
X--- 12,26 ----
X  #endif /* NULL */
X  #define NULL	((genericptr_t)0)
X  
X! #if !defined(LINT) && !defined(__GNULINT__)
X  static	const char	SCCS_Id[] = "@(#)makedefs.c\t3.0\t89/11/15";
X  #endif
X  
X  #ifdef MSDOS
X! # if !defined(AMIGA) && !defined(TOS)
X  # define freopen _freopen
X! FILE *FDECL(_freopen, (char *,char *,FILE *));
X! # endif
X  # undef	exit
X  extern void FDECL(exit, (int));
X  # define RDMODE	"r"
X***************
X*** 29,56 ****
X  # define RDMODE  "r+"
X  # define WRMODE  "w+"
X  #endif
X! #if defined(SYSV) || defined(GENIX) || defined(UNIXDEBUG)
X! void rename();
X! #endif
X! #ifdef AMIGA
X! # undef freopen
X! # undef printf
X! # undef puts
X! # undef fflush
X! # define fflush FFLUSH
X! # undef fputs
X! # undef fprintf
X  #endif
X  
X  /* construct definitions of object constants */
X  
X  #ifdef AMIGA
X! # define MONST_FILE	 "include:pm.h"
X! # define ONAME_FILE	 "include:onames.h"
X! # define TRAP_FILE	 "include:trap.h"
X! # define DATE_FILE	 "include:date.h"
X! # define DATA_FILE	 "auxil:data"
X! # define RUMOR_FILE	 "auxil:rumors"
X  #else
X  # ifndef MACOS
X  /* construct definitions of object constants */
X--- 29,53 ----
X  # define RDMODE  "r+"
X  # define WRMODE  "w+"
X  #endif
X! 
X! #ifdef MACOS
X! Boolean FDECL(TouchFile,(char *));
X! Str255 VolName;
X! int vRef;
X! Str255 File;
X! FInfo info;
X! OSErr macErr;
X  #endif
X  
X  /* construct definitions of object constants */
X  
X  #ifdef AMIGA
X! # define MONST_FILE	 "Incl:pm.h"
X! # define ONAME_FILE	 "Incl:onames.h"
X! # define TRAP_FILE	 "Incl:trap.h"
X! # define DATE_FILE	 "Incl:date.h"
X! # define DATA_FILE	 "Auxil:data"
X! # define RUMOR_FILE	 "Auxil:rumors"
X  #else
X  # ifndef MACOS
X  /* construct definitions of object constants */
X***************
X*** 84,95 ****
X  
X  char	in_line[256];
X  extern char *FDECL(gets, (char *));
X! void do_objs(), do_traps(), do_data(), do_date(), do_permonst(), do_rumors();
X  #ifdef SMALLDATA
X! void do_monst(), save_resource();
X  #endif
X  char *FDECL(limit, (char *,BOOLEAN_P));
X! FILE *FDECL(_freopen, (char *,char *,FILE *));
X  
X  int
X  main(argc, argv)
X--- 81,114 ----
X  
X  char	in_line[256];
X  extern char *FDECL(gets, (char *));
X! 
X! int FDECL(main, (int, char **));
X! void NDECL(do_objs);
X! void NDECL(do_traps);
X! void NDECL(do_data);
X! void NDECL(do_date);
X! void NDECL(do_permonst);
X! void NDECL(do_rumors);
X! 
X! char * FDECL(tmpdup, (const char *));
X! 
X! #if defined(SYSV) || defined(GENIX) || defined(UNIXDEBUG)
X! void FDECL(rename, (char *, char *));
X! #endif
X! 
X  #ifdef SMALLDATA
X! void NDECL(do_monst);
X! void NDECL(save_resource);
X  #endif
X+ 
X  char *FDECL(limit, (char *,BOOLEAN_P));
X! 
X! #if defined(SMALLDATA) && defined(MACOS)
X! OSErr FDECL(write_resource, (Handle, short, Str255, short));
X! # if defined(AZTEC) || defined(THINKC4)
X! int NDECL(getpid);
X! # endif
X! #endif
X  
X  int
X  main(argc, argv)
X***************
X*** 113,119 ****
X  
X  	/* standard Mac initialization */
X  	InitGraf(&MAINGRAFPORT);
X! 	
X  	InitFonts();
X  	InitWindows();
X  	InitMenus();
X--- 132,138 ----
X  
X  	/* standard Mac initialization */
X  	InitGraf(&MAINGRAFPORT);
X! 
X  	InitFonts();
X  	InitWindows();
X  	InitMenus();
X***************
X*** 120,126 ****
X  	InitCursor();
X  	FlushEvents(everyEvent,0);
X  	InitDialogs(NULL);
X! 	
X  	params[0] = '-';
X  	options = "DVPRTOM";
X  	dialog = GetNewDialog(200, 0L, (WindowPtr) -1);
X--- 139,145 ----
X  	InitCursor();
X  	FlushEvents(everyEvent,0);
X  	InitDialogs(NULL);
X! 
X  	params[0] = '-';
X  	options = "DVPRTOM";
X  	dialog = GetNewDialog(200, 0L, (WindowPtr) -1);
X***************
X*** 154,160 ****
X  	if (itemHit == OK_BUTTON && lastItem >= FIRST_RADIO_BUTTON) {
X  		argc = 2;
X  		option = params;
X! 	
X  #else
X  	if(argc == 2) {
X  	    option = argv[1];
X--- 173,179 ----
X  	if (itemHit == OK_BUTTON && lastItem >= FIRST_RADIO_BUTTON) {
X  		argc = 2;
X  		option = params;
X! 
X  #else
X  	if(argc == 2) {
X  	    option = argv[1];
X***************
X*** 183,195 ****
X  		case 'r':
X  		case 'R':	do_rumors();
X  				break;
X! #if defined(SMALLDATA) && defined(MACOS)
X  		case 'm':
X  		case 'M':	do_monst();
X  				break;
X- 		
X- #endif	/* SMALLDATA && MACOS */
X  
X  		default:
X  				(void) fprintf(stderr,
X  					"Unknown option '%c'.\n", option[1]);
X--- 202,214 ----
X  		case 'r':
X  		case 'R':	do_rumors();
X  				break;
X! #if defined(SMALLDATA)
X  		case 'm':
X  		case 'M':	do_monst();
X  				break;
X  
X+ #endif	/* SMALLDATA */
X+ 
X  		default:
X  				(void) fprintf(stderr,
X  					"Unknown option '%c'.\n", option[1]);
X***************
X*** 260,266 ****
X  void
X  do_rumors(){
X  	char	infile[30];
X- 	FILE	*FDECL(freopen, (char *,char *,FILE *));
X  	long	true_rumor_size;
X  
X  	if(freopen(RUMOR_FILE, WRMODE, stdout) == (FILE *)0) {
X--- 279,284 ----
X***************
X*** 294,299 ****
X--- 312,326 ----
X  
X  	(void) fclose(stdin);
X  	(void) fclose(stdout);
X+ #ifdef MACOS
X+ 	strcpy((char *)File, RUMOR_FILE);
X+ 	CtoPstr((char *)File);
X+ 	if(!GetVol(VolName, &vRef) && !GetFInfo(File, vRef, &info)){
X+ 		info.fdCreator = CREATOR;
X+ 		info.fdType = TEXT_TYPE;
X+ 		(void) SetFInfo(File, vRef, &info);
X+ 	}
X+ #endif
X  	return;
X  }
X  
X***************
X*** 321,326 ****
X--- 348,357 ----
X  #endif
X  	for(c = cbuf; *c != '\n'; c++);	*c = 0; /* strip off the '\n' */
X  	Printf("const char datestring[] = \"%s\";\n", cbuf);
X+ #ifdef MSDOS
X+       /* get the time we did a compile for checking save and level files */
X+ 	Printf("const long compiletime = %ld;\n", clock);
X+ #endif
X  
X  	(void) fclose(stdout);
X  	return;
X***************
X*** 329,335 ****
X  void
X  do_data(){
X  	char	tempfile[30];
X! 
X  	Sprintf(tempfile, "%s.base", DATA_FILE);
X  	if(freopen(tempfile, RDMODE, stdin) == (FILE *)0) {
X  		perror(tempfile);
X--- 360,368 ----
X  void
X  do_data(){
X  	char	tempfile[30];
X! #ifndef INFERNO
X! 	boolean	skipping_demons = TRUE;
X! #endif
X  	Sprintf(tempfile, "%s.base", DATA_FILE);
X  	if(freopen(tempfile, RDMODE, stdin) == (FILE *)0) {
X  		perror(tempfile);
X***************
X*** 342,365 ****
X  	}
X  
X  	while(gets(in_line) != NULL) {
X  #ifndef GOLEMS
X! 	    if(!strcmp(in_line, "'\ta golem;"))
X  		while(gets(in_line) != NULL && in_line[0] == '\t')
X  		    ; /* do nothing */
X  #endif
X! #ifndef	SPELLS
X! 	    if(!strcmp(in_line, "+\ta spell book"))
X! 		; /* do nothing */
X! 	    else
X! #endif
X! #ifndef KOPS
X! 	    if(!strcmp(in_line, "K\ta Keystone Kop"))
X! 		; /* do nothing */
X  	    else
X  #endif
X! #ifndef WORM
X! 	    if(!strcmp(in_line, "~\tthe tail of a long worm"))
X! 		; /* do nothing */
X  	    else
X  #endif
X  		(void) puts(in_line);
X--- 375,426 ----
X  	}
X  
X  	while(gets(in_line) != NULL) {
X+ #ifndef INFERNO
X+ 	    if(skipping_demons)
X+ 		while(gets(in_line) != NULL && strcmp(in_line, "*centaur"))
X+ 		    ; /* do nothing */
X+ 	    skipping_demons = FALSE;
X+ #endif
X+ #ifndef ARMY
X+ 	    if(!strcmp(in_line, "*soldier")) {
X+ 		while(gets(in_line) != NULL && in_line[0] != '\t') ;
X+ 		while(gets(in_line) != NULL && in_line[0] == '\t')
X+ 		    ; /* do nothing */
X+ 	    }
X+ 	    else
X+ #endif
X+ #ifndef WORM
X+ 	    if(!strcmp(in_line, "*long worm")) {
X+ 		while(gets(in_line) != NULL && in_line[0] != '\t') ;
X+ 		while(gets(in_line) != NULL && in_line[0] == '\t')
X+ 		    ; /* do nothing */
X+ 	    }
X+ 	    else
X+ #endif
X  #ifndef GOLEMS
X! 	    if(!strcmp(in_line, "*golem"))
X  		while(gets(in_line) != NULL && in_line[0] == '\t')
X  		    ; /* do nothing */
X+ 	    else
X  #endif
X! #ifndef MEDUSA
X! 	    if(!strcmp(in_line, "medusa"))
X! 		while(gets(in_line) != NULL && in_line[0] == '\t')
X! 		    ; /* do nothing */
X  	    else
X  #endif
X! #ifndef NAMED_ITEMS
X! 	    if(!strcmp(in_line, "snickersnee")
X! 		|| !strcmp(in_line, "orcrist")
X! 	      )
X! 		while(gets(in_line) != NULL && in_line[0] == '\t')
X! 		    ; /* do nothing */
X! 	    else
X! #endif
X! #ifndef TOLKIEN
X! 	    if(!strcmp(in_line, "hobbit"))
X! 		while(gets(in_line) != NULL && in_line[0] == '\t')
X! 		    ; /* do nothing */
X  	    else
X  #endif
X  		(void) puts(in_line);
X***************
X*** 366,379 ****
X  	}
X  	(void) fclose(stdin);
X  	(void) fclose(stdout);
X! 	return;
X  }
X  
X  void
X! do_permonst() {
X! 
X  	int	i;
X! 	char	*c;
X  
X  	if(freopen(MONST_FILE, WRMODE, stdout) == (FILE *)0) {
X  		perror(MONST_FILE);
X--- 427,450 ----
X  	}
X  	(void) fclose(stdin);
X  	(void) fclose(stdout);
X! #ifdef MACOS
X! 	Strcpy((char *)File, DATA_FILE);
X! 	CtoPstr((char *)File);
X! 	if(!GetVol(VolName, &vRef) && !GetFInfo(File, vRef, &info)){
X! 		info.fdCreator = CREATOR;
X! 		info.fdType = TEXT_TYPE;
X! 		(void) SetFInfo(File, vRef, &info);
X! 	}
X! #endif
X! 
X! 	return;
X  }
X  
X  void
X! do_permonst()
X! {
X  	int	i;
X! 	char	*c, *nam;
X  
X  	if(freopen(MONST_FILE, WRMODE, stdout) == (FILE *)0) {
X  		perror(MONST_FILE);
X***************
X*** 384,394 ****
X  
X  	for(i = 0; mons[i].mlet; i++) {
X  		Printf("\n#define\tPM_");
X! 		for(c = mons[i].mname; *c; c++) {
X  		    if((*c >= 'a') && (*c <= 'z')) *c -= (char)('a' - 'A');
X  		    else if(*c == ' ' || *c == '-')	*c = '_';
X  		}
X! 		Printf("%s\t%d", mons[i].mname, i);
X  	}
X  	Printf("\n\n#define\tNUMMONS\t%d\n", i);
X  	Printf("\n#endif /* PM_H /**/\n");
X--- 455,465 ----
X  
X  	for(i = 0; mons[i].mlet; i++) {
X  		Printf("\n#define\tPM_");
X! 		for(nam = c = tmpdup(mons[i].mname); *c; c++) {
X  		    if((*c >= 'a') && (*c <= 'z')) *c -= (char)('a' - 'A');
X  		    else if(*c == ' ' || *c == '-')	*c = '_';
X  		}
X! 		Printf("%s\t%d", nam, i);
X  	}
X  	Printf("\n\n#define\tNUMMONS\t%d\n", i);
X  	Printf("\n#endif /* PM_H /**/\n");
X***************
X*** 409,423 ****
X  }
X  
X  void
X! do_objs() {
X! 
X! 	register int i = 0, sum = 0;
X! 	register char *c;
X  #ifdef SPELLS
X! 	register int nspell = 0;
X  #endif
X! 	register boolean prefix = 0;
X! 	register char let = '\0';
X  	boolean	sumerr = FALSE;
X  
X  	if(freopen(ONAME_FILE, WRMODE, stdout) == (FILE *)0) {
X--- 480,494 ----
X  }
X  
X  void
X! do_objs()
X! {
X! 	int i = 0, sum = 0;
X! 	char *c, *objnam;
X  #ifdef SPELLS
X! 	int nspell = 0;
X  #endif
X! 	boolean prefix = 0;
X! 	char let = '\0';
X  	boolean	sumerr = FALSE;
X  
X  	if(freopen(ONAME_FILE, WRMODE, stdout) == (FILE *)0) {
X***************
X*** 428,434 ****
X  	Printf("#ifndef ONAMES_H\n#define ONAMES_H\n\n");
X  
X  	for(i = 0; !i || objects[i].oc_olet != ILLOBJ_SYM; i++) {
X! 		if (!(c = objects[i].oc_name)) continue;
X  
X  		/* make sure probabilities add up to 1000 */
X  		if(objects[i].oc_olet != let) {
X--- 499,505 ----
X  	Printf("#ifndef ONAMES_H\n#define ONAMES_H\n\n");
X  
X  	for(i = 0; !i || objects[i].oc_olet != ILLOBJ_SYM; i++) {
X! 		if (!(objnam = tmpdup(objects[i].oc_name))) continue;
X  
X  		/* make sure probabilities add up to 1000 */
X  		if(objects[i].oc_olet != let) {
X***************
X*** 442,448 ****
X  			sum = 0;
X  		}
X  
X! 		for(; *c; c++) {
X  		    if((*c >= 'a') && (*c <= 'z')) *c -= (char)('a' - 'A');
X  		    else if(*c == ' ' || *c == '-')	*c = '_';
X  		}
X--- 513,519 ----
X  			sum = 0;
X  		}
X  
X! 		for(c = objnam; *c; c++) {
X  		    if((*c >= 'a') && (*c <= 'z')) *c -= (char)('a' - 'A');
X  		    else if(*c == ' ' || *c == '-')	*c = '_';
X  		}
X***************
X*** 464,476 ****
X  			/* avoid trouble with stupid C preprocessors */
X  			if(objects[i].oc_material == GLASS) {
X  			    Printf("/* #define\t%s\t%d */\n",
X! 							objects[i].oc_name, i);
X  			    continue;
X  			}
X  		    default:
X  			Printf("#define\t");
X  		}
X! 		Printf("%s\t%d\n", limit(objects[i].oc_name, prefix), i);
X  		prefix = 0;
X  
X  		sum += objects[i].oc_prob;
X--- 535,547 ----
X  			/* avoid trouble with stupid C preprocessors */
X  			if(objects[i].oc_material == GLASS) {
X  			    Printf("/* #define\t%s\t%d */\n",
X! 							objnam, i);
X  			    continue;
X  			}
X  		    default:
X  			Printf("#define\t");
X  		}
X! 		Printf("%s\t%d\n", limit(objnam, prefix), i);
X  		prefix = 0;
X  
X  		sum += objects[i].oc_prob;
X***************
X*** 486,491 ****
X--- 557,573 ----
X  	return;
X  }
X  
X+ char *
X+ tmpdup(str)
X+ const char *str;
X+ {
X+ 	static char buf[128];
X+ 
X+ 	if (!str) return (char *)0;
X+ 	(void)strncpy(buf, str, 127);
X+ 	return buf;
X+ }
X+ 
X  #if defined(SYSV) || defined(GENIX) || defined(UNIXDEBUG)
X  void
X  rename(oldname, newname)
X***************
X*** 536,542 ****
X  #endif /* MSDOS */
X  
X  
X! #if defined(SMALLDATA) && defined(MACOS)
X  void
X  do_monst()
X  {
X--- 618,624 ----
X  #endif /* MSDOS */
X  
X  
X! #if defined(SMALLDATA)
X  void
X  do_monst()
X  {
X***************
X*** 548,559 ****
X  	Str255	name;
X  	short	findNamedFile();
X  	OSErr	write_resource();
X! 	
X  	for(i = 0; mons[i].mlet; i++) {
X  		;
X  	}
X  	i++;
X! 	
X  	/*
X  	 * convert to struct where character arrays instead of pointers to
X  	 * strings are used
X--- 630,641 ----
X  	Str255	name;
X  	short	findNamedFile();
X  	OSErr	write_resource();
X! 
X  	for(i = 0; mons[i].mlet; i++) {
X  		;
X  	}
X  	i++;
X! 
X  	/*
X  	 * convert to struct where character arrays instead of pointers to
X  	 * strings are used
X***************
X*** 564,572 ****
X  		BlockMove(&(mons[j].mlet), &(pmMonst[j].pmp.mlet),
X  				(long)sizeof(struct pmpart));
X  	}
X! 	
X  	PtrToHand((Ptr)pmMonst, &monstData, (long)(i * sizeof(struct pmstr)));
X! 	
X  	/* store the object data, in Nethack the char * will be copied in */
X  	for(i = 0; !i || objects[i].oc_olet != ILLOBJ_SYM; i++) {
X  		;
X--- 646,654 ----
X  		BlockMove(&(mons[j].mlet), &(pmMonst[j].pmp.mlet),
X  				(long)sizeof(struct pmpart));
X  	}
X! 
X  	PtrToHand((Ptr)pmMonst, &monstData, (long)(i * sizeof(struct pmstr)));
X! 
X  	/* store the object data, in Nethack the char * will be copied in */
X  	for(i = 0; !i || objects[i].oc_olet != ILLOBJ_SYM; i++) {
X  		;
X***************
X*** 573,579 ****
X  	}
X  	PtrToHand((Ptr)objects, &objData, ((i+1)*sizeof(struct objclass)));
X  
X! 	strcpy((char *)&name[0], "\014Nethack.rsrc");
X  	if (findNamedFile(&name[1], 0, &reply)) {
X  	    strncpy((char *)&name[0],(char *)&reply.fName[0], reply.fName[0]+1);
X  	    if ((refNum = OpenResFile(name)) != -1) {
X--- 655,661 ----
X  	}
X  	PtrToHand((Ptr)objects, &objData, ((i+1)*sizeof(struct objclass)));
X  
X! 	strcpy((char *)&name[0], "\010NH3.rsrc");
X  	if (findNamedFile(&name[1], 0, &reply)) {
X  	    strncpy((char *)&name[0],(char *)&reply.fName[0], reply.fName[0]+1);
X  	    if ((refNum = OpenResFile(name)) != -1) {
X***************
X*** 581,594 ****
X  		    strcpy((char *)&name[0], "\012MONST_DATA");
X  		    if (error = write_resource(monstData,
X  						MONST_DATA, name, refNum)) {
X! 		    	SysBeep(1);
X! 		    	Printf("Couldn't add monster data resource.\n");
X  		    }
X  		    strcpy((char *)&name[0], "\013OBJECT_DATA");
X  		    if (error = write_resource(objData,
X  						OBJECT_DATA, name, refNum)) {
X! 		    	SysBeep(1);
X! 		    	Printf("Couldn't add object data resource.\n");
X  		    }
X  		    CloseResFile(refNum);
X  		    if (ResError() != noErr) {
X--- 663,676 ----
X  		    strcpy((char *)&name[0], "\012MONST_DATA");
X  		    if (error = write_resource(monstData,
X  						MONST_DATA, name, refNum)) {
X! 			SysBeep(1);
X! 			Printf("Couldn't add monster data resource.\n");
X  		    }
X  		    strcpy((char *)&name[0], "\013OBJECT_DATA");
X  		    if (error = write_resource(objData,
X  						OBJECT_DATA, name, refNum)) {
X! 			SysBeep(1);
X! 			Printf("Couldn't add object data resource.\n");
X  		    }
X  		    CloseResFile(refNum);
X  		    if (ResError() != noErr) {
X***************
X*** 598,608 ****
X  		}
X  	    }
X  	}
X! 	
X  	DisposHandle(monstData);
X  	DisposHandle(objData);
X  }
X  
X  OSErr
X  write_resource(data, resID, resName, refNum)
X  Handle	data;
X--- 680,739 ----
X  		}
X  	    }
X  	}
X! 
X  	DisposHandle(monstData);
X  	DisposHandle(objData);
X+ 
X+ 	vRef = reply.vRefNum;
X+ 	(void) TouchFile(SHELP);
X+ 	(void) TouchFile(HELP);
X+ #ifdef NEWS
X+ 	(void) TouchFile("news");
X+ #endif
X+ 	if(!TouchFile(RECORD))
X+ 		(void) Create(File, vRef, CREATOR, TEXT_TYPE);
X+ 
X+ 	(void) TouchFile(CMDHELPFILE);
X+ 	(void) TouchFile(HISTORY);
X+ 	(void) TouchFile(OPTIONFILE);
X+ #ifdef ORACLE
X+ 	(void) TouchFile(ORACLEFILE);
X+ #endif
X+ 	(void) TouchFile(LICENSE);
X+ #ifdef MACOS
X+ 	(void) TouchFile(MACHELP);
X+ #endif
X+ }
X+ 
X+ Boolean
X+ TouchFile(fname)
X+ char *fname;
X+ {
X+ 	SFReply	reply;
X+ 	short	findNamedFile();
X+ 
X+ 	Strcpy((char *)File, fname);
X+ 	CtoPstr((char *)File);
X+ 	File[File[0]+1] = 0;
X+ 	reply.good = TRUE;
X+ 	if(GetFInfo(File, vRef, &info)){
X+ 		findNamedFile(&File[1], 2, &reply);
X+ 		if(reply.good){
X+ 			vRef = reply.vRefNum;
X+ 			GetFInfo(File, vRef, &info);
X+ 		}
X+ 	}
X+ 	if(reply.good){
X+ 		info.fdCreator = CREATOR;
X+ 		info.fdType = TEXT_TYPE;
X+ 		(void) SetFInfo(File, vRef, &info);
X+ 	}
X+ 
X+ 	return(reply.good);
X  }
X  
X+ 
X+ 
X  OSErr
X  write_resource(data, resID, resName, refNum)
X  Handle	data;
X***************
X*** 625,632 ****
X  			error = ResError();
X  		}
X  		if (error != noErr) {
X!     		return error;
X!     	}
X  	} else if (ResError() != resNotFound && ResError() != noErr) {
X  			return (ResError());
X  	}
X--- 756,763 ----
X  			error = ResError();
X  		}
X  		if (error != noErr) {
X! 			return error;
X! 		}
X  	} else if (ResError() != resNotFound && ResError() != noErr) {
X  			return (ResError());
X  	}
X***************
X*** 645,648 ****
X  	return 1;
X  }
X  # endif
X! #endif	/* SMALLDATA && MACOS */
X--- 776,779 ----
X  	return 1;
X  }
X  # endif
X! #endif	/* SMALLDATA */
X*** src/Old/makemon.c	Mon Feb 19 20:27:27 1990
X--- src/makemon.c	Wed Feb 14 18:38:13 1990
X***************
X*** 1,20 ****
X! /*	SCCS Id: @(#)makemon.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  
X- struct monst zeromonst;
X  static int FDECL(uncommon, (struct permonst *));
X  
X  int monstr[NUMMONS];
X  
X  #define m_initsgrp(mtmp, x, y)	m_initgrp(mtmp, x, y, 3)
X  #define m_initlgrp(mtmp, x, y)	m_initgrp(mtmp, x, y, 10)
X  #define toostrong(monindx, lev) (monstr[monindx] > lev)
X  #define tooweak(monindx, lev)	(monstr[monindx] < lev)
X  
X! static void
X  m_initgrp(mtmp, x, y, n)	/* make a group just like mtmp */
X  register struct monst *mtmp;
X  register int x, y, n;
X--- 1,38 ----
X! /*	SCCS Id: @(#)makemon.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! #ifdef REINCARNATION
X! # include <ctype.h>
X! #endif
X! 
X! VSTATIC struct monst zeromonst;
X  
X  static int FDECL(uncommon, (struct permonst *));
X+ OSTATIC void FDECL(m_initgrp,(struct monst *,int,int,int));
X+ static void FDECL(m_initthrow,(struct monst *,int,int));
X+ OSTATIC void FDECL(m_initweap,(struct monst *));
X+ static void FDECL(m_initinv,(struct monst *));
X+ static void FDECL(rloc_to,(struct monst *,int,int));
X+ static int FDECL(mstrength,(struct permonst *));
X  
X+ extern int monstr[];
X+ 
X+ #ifdef OVLB
X+ 
X  int monstr[NUMMONS];
X  
X+ #endif /* OVLB */
X+ 
X  #define m_initsgrp(mtmp, x, y)	m_initgrp(mtmp, x, y, 3)
X  #define m_initlgrp(mtmp, x, y)	m_initgrp(mtmp, x, y, 10)
X  #define toostrong(monindx, lev) (monstr[monindx] > lev)
X  #define tooweak(monindx, lev)	(monstr[monindx] < lev)
X  
X! #ifdef OVLB
X! 
X! XSTATIC void
X  m_initgrp(mtmp, x, y, n)	/* make a group just like mtmp */
X  register struct monst *mtmp;
X  register int x, y, n;
X***************
X*** 50,55 ****
X--- 68,74 ----
X  	}
X  }
X  
X+ 
X  static void
X  m_initthrow(mtmp,otyp,oquan)
X  struct monst *mtmp;
X***************
X*** 66,72 ****
X  	mpickobj(mtmp, otmp);
X  }
X  
X! static void
X  m_initweap(mtmp)
X  register struct monst *mtmp;
X  {
X--- 85,91 ----
X  	mpickobj(mtmp, otmp);
X  }
X  
X! XSTATIC void
X  m_initweap(mtmp)
X  register struct monst *mtmp;
X  {
X***************
X*** 118,124 ****
X  #ifdef TOLKIEN
X  		if (mm == PM_HOBBIT) {
X  		    switch (rn2(3)) {
X! 		  	case 0:
X  			    (void)mongets(mtmp, DAGGER);
X  			    break;
X  			case 1:
X--- 137,143 ----
X  #ifdef TOLKIEN
X  		if (mm == PM_HOBBIT) {
X  		    switch (rn2(3)) {
X! 			case 0:
X  			    (void)mongets(mtmp, DAGGER);
X  			    break;
X  			case 1:
X***************
X*** 134,143 ****
X  		    (void)mongets(mtmp, IRON_SHOES);
X  		    if (!rn2(4)) {
X  			(void)mongets(mtmp, DWARVISH_SHORT_SWORD);
X! 			(void)mongets(mtmp,
X! 			    rn2(3) ? DWARVISH_MATTOCK : AXE);
X  			(void)mongets(mtmp, DWARVISH_IRON_HELM);
X- 			(void)mongets(mtmp, DWARVISH_ROUNDSHIELD);
X  			if (!rn2(3))
X  			    (void)mongets(mtmp, DWARVISH_MITHRIL_COAT);
X  		    } else {
X--- 153,165 ----
X  		    (void)mongets(mtmp, IRON_SHOES);
X  		    if (!rn2(4)) {
X  			(void)mongets(mtmp, DWARVISH_SHORT_SWORD);
X! 			/* note: you can't use a mattock with a shield */
X! 			if (rn2(2)) (void)mongets(mtmp, DWARVISH_MATTOCK);
X! 			else {
X! 				(void)mongets(mtmp, AXE);
X! 				(void)mongets(mtmp, DWARVISH_ROUNDSHIELD);
X! 			}
X  			(void)mongets(mtmp, DWARVISH_IRON_HELM);
X  			if (!rn2(3))
X  			    (void)mongets(mtmp, DWARVISH_MITHRIL_COAT);
X  		    } else {
X***************
X*** 338,343 ****
X--- 360,368 ----
X  	}
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL1
X+ 
X  static void
X  m_initinv(mtmp)
X  register struct	monst	*mtmp;
X***************
X*** 392,397 ****
X--- 417,424 ----
X  			if (!rn2(2)) (void) mongets(mtmp, C_RATION);
X  		    }
X  #endif
X+ 		} else if (ptr == &mons[PM_SHOPKEEPER]) {
X+ 		    (void) mongets(mtmp,SKELETON_KEY);
X  		}
X  		break;
X  
X***************
X*** 450,456 ****
X  	if(x == 0 && y == 0) {
X  		int uroom;
X  		int tryct = 0;	/* careful with bigrooms */
X! 
X  		if(!in_mklev) uroom = inroom(u.ux, u.uy);
X  
X  		do {
X--- 477,485 ----
X  	if(x == 0 && y == 0) {
X  		int uroom;
X  		int tryct = 0;	/* careful with bigrooms */
X! #ifdef __GNULINT__
X! 		uroom = 0;	/* supress used before set warning */
X! #endif
X  		if(!in_mklev) uroom = inroom(u.ux, u.uy);
X  
X  		do {
X***************
X*** 465,480 ****
X  		return((struct monst *) 0);
X  
X  	if(ptr){
X! 		/* if you are to make a specific monster and it has 
X  		   already been genocided, return */
X  		if(ptr->geno & G_GENOD) return((struct monst *) 0);
X  	} else {
X  		/* make a random (common) monster. */
X- #ifdef REINCARNATION
X- 		if (!(ptr = (dlevel==rogue_level) ? roguemon() : rndmonst()))
X- #else
X  		if(!(ptr = rndmonst()))
X- #endif
X  		{
X  #ifdef DEBUG
X  		    pline("Warning: no monster.");
X--- 494,505 ----
X  		return((struct monst *) 0);
X  
X  	if(ptr){
X! 		/* if you are to make a specific monster and it has
X  		   already been genocided, return */
X  		if(ptr->geno & G_GENOD) return((struct monst *) 0);
X  	} else {
X  		/* make a random (common) monster. */
X  		if(!(ptr = rndmonst()))
X  		{
X  #ifdef DEBUG
X  		    pline("Warning: no monster.");
X***************
X*** 489,496 ****
X  	*mtmp = zeromonst;		/* clear all entries in structure */
X  	for(ct = 0; ct < ptr->pxlth; ct++)
X  		((char *) &(mtmp->mextra[0]))[ct] = 0;
X-  	if(type_is_pname(ptr))
X-  		Strcpy(NAME(mtmp), ptr->mname);
X  	mtmp->nmon = fmon;
X  	fmon = mtmp;
X  	mtmp->m_id = flags.ident++;
X--- 514,519 ----
X***************
X*** 503,521 ****
X  	    mtmp->mhpmax = mtmp->mhp = golemhp(monsndx(ptr));
X  	else
X  #endif /* GOLEMS */
X!  	if(ptr->mlevel > 49) {
X  	    /* "special" fixed hp monster
X  	     * the hit points are encoded in the mlevel in a somewhat strange
X  	     * way to fit in the 50..127 positive range of a signed character
X  	     * above the 1..49 that indicate "normal" monster levels */
X!  	    mtmp->mhpmax = mtmp->mhp = 2*(ptr->mlevel - 6);
X!  	    mtmp->m_lev = mtmp->mhp / 4;	/* approximation */
X!  	} else if((ptr->mlet == S_DRAGON) && (ptr >= &mons[PM_GRAY_DRAGON]))
X  	    mtmp->mhpmax = mtmp->mhp = 80;
X  	else if(!mtmp->m_lev) mtmp->mhpmax = mtmp->mhp = rnd(4);
X  	else mtmp->mhpmax = mtmp->mhp = d((int)mtmp->m_lev, 8);
X  	place_monster(mtmp, x, y);
X! 	mtmp->mcansee = 1;
X  	mtmp->mpeaceful = peace_minded(ptr);
X  
X  	switch(ptr->mlet) {
X--- 526,544 ----
X  	    mtmp->mhpmax = mtmp->mhp = golemhp(monsndx(ptr));
X  	else
X  #endif /* GOLEMS */
X! 	if(ptr->mlevel > 49) {
X  	    /* "special" fixed hp monster
X  	     * the hit points are encoded in the mlevel in a somewhat strange
X  	     * way to fit in the 50..127 positive range of a signed character
X  	     * above the 1..49 that indicate "normal" monster levels */
X! 	    mtmp->mhpmax = mtmp->mhp = 2*(ptr->mlevel - 6);
X! 	    mtmp->m_lev = mtmp->mhp / 4;	/* approximation */
X! 	} else if((ptr->mlet == S_DRAGON) && (ptr >= &mons[PM_GRAY_DRAGON]))
X  	    mtmp->mhpmax = mtmp->mhp = 80;
X  	else if(!mtmp->m_lev) mtmp->mhpmax = mtmp->mhp = rnd(4);
X  	else mtmp->mhpmax = mtmp->mhp = d((int)mtmp->m_lev, 8);
X  	place_monster(mtmp, x, y);
X! 	mtmp->mcansee = mtmp->mcanmove = 1;
X  	mtmp->mpeaceful = peace_minded(ptr);
X  
X  	switch(ptr->mlet) {
X***************
X*** 543,553 ****
X  			if(rn2(5) && !u.uhave_amulet) mtmp->msleep = 1;
X  			break;
X  		case S_UNICORN:
X! 			if ((ptr==&mons[PM_WHITE_UNICORN] && 
X  				u.ualigntyp == U_LAWFUL) ||
X! 			(ptr==&mons[PM_GRAY_UNICORN] && 
X  				u.ualigntyp == U_NEUTRAL) ||
X! 			(ptr==&mons[PM_BLACK_UNICORN] && 
X  				u.ualigntyp == U_CHAOTIC))
X  				mtmp->mpeaceful = 1;
X  			break;
X--- 566,576 ----
X  			if(rn2(5) && !u.uhave_amulet) mtmp->msleep = 1;
X  			break;
X  		case S_UNICORN:
X! 			if ((ptr==&mons[PM_WHITE_UNICORN] &&
X  				u.ualigntyp == U_LAWFUL) ||
X! 			(ptr==&mons[PM_GRAY_UNICORN] &&
X  				u.ualigntyp == U_NEUTRAL) ||
X! 			(ptr==&mons[PM_BLACK_UNICORN] &&
X  				u.ualigntyp == U_CHAOTIC))
X  				mtmp->mpeaceful = 1;
X  			break;
X***************
X*** 565,571 ****
X  	} else if (ptr == &mons[PM_WIZARD_OF_YENDOR]) {
X  		mtmp->iswiz = 1;
X  		flags.no_of_wizards++;
X! 	}
X  
X  	if(in_mklev) {
X  		if(((is_ndemon(ptr)) ||
X--- 588,595 ----
X  	} else if (ptr == &mons[PM_WIZARD_OF_YENDOR]) {
X  		mtmp->iswiz = 1;
X  		flags.no_of_wizards++;
X! 	} else if (ptr == &mons[PM_QUANTUM_MECHANIC])
X! 		mtmp = qname(mtmp);
X  
X  	if(in_mklev) {
X  		if(((is_ndemon(ptr)) ||
X***************
X*** 676,684 ****
X  	    if (passes_walls(mdat)) return 1;
X  	}
X  	if (!ACCESSIBLE(levl[x][y].typ)) return 0;
X! 	if (IS_DOOR(levl[x][y].typ) &&
X! 		    (levl[x][y].doormask & (D_LOCKED | D_CLOSED)) &&
X! 		    (!mdat || !amorphous(mdat)))
X  		return 0;
X  	if (sobj_at(BOULDER, x, y) && (!mdat || !throws_rocks(mdat)))
X  		return 0;
X--- 700,706 ----
X  	    if (passes_walls(mdat)) return 1;
X  	}
X  	if (!ACCESSIBLE(levl[x][y].typ)) return 0;
X! 	if (closed_door(x, y) && (!mdat || !amorphous(mdat)))
X  		return 0;
X  	if (sobj_at(BOULDER, x, y) && (!mdat || !throws_rocks(mdat)))
X  		return 0;
X***************
X*** 685,690 ****
X--- 707,715 ----
X  	return 1;
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVLB
X+ 
X  static void
X  rloc_to(mtmp, x, y)
X  struct monst *mtmp;
X***************
X*** 742,747 ****
X--- 767,775 ----
X  	rloc(mtmp);
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL0
X+ 
X  static int
X  cmnum()	{	/* return the number of "common" monsters */
X  
X***************
X*** 761,766 ****
X--- 789,797 ----
X  		(!Inhell ? ptr->geno & G_HELL : ptr->maligntyp > 0);
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVL1
X+ 
X  /* This routine is designed to return an integer value which represents
X   * an approximation of monster strength.  It uses a similar method of
X   * determination as "experience()" to arrive at the strength.
X***************
X*** 771,777 ****
X  {
X  	int	i, tmp2, n, tmp = ptr->mlevel;
X  
X!  	if(tmp > 49)		/* special fixed hp monster */
X  	    tmp = 2*(tmp - 6) / 4;
X  
X  /*	For creation in groups */
X--- 802,808 ----
X  {
X  	int	i, tmp2, n, tmp = ptr->mlevel;
X  
X! 	if(tmp > 49)		/* special fixed hp monster */
X  	    tmp = 2*(tmp - 6) / 4;
X  
X  /*	For creation in groups */
X***************
X*** 830,843 ****
X  		monstr[ct] = mstrength(&(mons[ct]));
X  }
X  
X  struct	permonst *
X! rndmonst() {		/* select a random monster */
X  	register struct permonst *ptr;
X  	register int i, ct;
X  	register int zlevel;
X  	static int minmlev, maxmlev, accept;
X  	static long oldmoves = 0L;	/* != 1, starting value of moves */
X  
X  	if(oldmoves != moves) {		/* must recalculate accept */
X  	    oldmoves = moves;
X  	    zlevel = u.uhave_amulet ? MAXLEVEL : dlevel;
X--- 861,886 ----
X  		monstr[ct] = mstrength(&(mons[ct]));
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVL0
X+ 
X  struct	permonst *
X! rndmonst()		/* select a random monster */
X! {
X  	register struct permonst *ptr;
X  	register int i, ct;
X  	register int zlevel;
X  	static int minmlev, maxmlev, accept;
X  	static long oldmoves = 0L;	/* != 1, starting value of moves */
X+ #ifdef REINCARNATION
X+ 	static boolean upper;
X  
X+ 	upper = (dlevel == rogue_level);
X+ #endif
X+ 
X+ #ifdef __GNULINT__
X+ 	ptr = (struct permonst *)0; /* suppress "used uninitialized" warning */
X+ #endif
X  	if(oldmoves != moves) {		/* must recalculate accept */
X  	    oldmoves = moves;
X  	    zlevel = u.uhave_amulet ? MAXLEVEL : dlevel;
X***************
X*** 855,861 ****
X  /*
X   *	Find out how many monsters exist in the range we have selected.
X   */
X! 	    for(accept = ct = 0 ; mons[ct].mlet; ct++) {
X  		ptr = &(mons[ct]);
X  		if(uncommon(ptr)) continue;
X  		if(tooweak(ct, minmlev) || toostrong(ct, maxmlev))
X--- 898,910 ----
X  /*
X   *	Find out how many monsters exist in the range we have selected.
X   */
X! 	    accept = 0;
X! #ifdef REINCARNATION
X! 	    for(ct = (upper ? PM_APE : 0);
X! 			upper ? isupper(mons[ct].mlet) : mons[ct].mlet; ct++) {
X! #else
X! 	    for(ct = 0 ; mons[ct].mlet; ct++) {
X! #endif
X  		ptr = &(mons[ct]);
X  		if(uncommon(ptr)) continue;
X  		if(tooweak(ct, minmlev) || toostrong(ct, maxmlev))
X***************
X*** 874,880 ****
X--- 923,934 ----
X   *	Now, select a monster at random.
X   */
X  	ct = rnd(accept);
X+ #ifdef REINCARNATION
X+ 	for(i = (upper ? PM_APE : 0);
X+ 	    (upper ? isupper(mons[i].mlet) : mons[i].mlet) && ct > 0; i++) {
X+ #else
X  	for(i = 0; mons[i].mlet && ct > 0; i++) {
X+ #endif
X  		ptr = &(mons[i]);
X  		if(uncommon(ptr)) continue;
X  		if(tooweak(i, minmlev) || toostrong(i, maxmlev))
X***************
X*** 890,895 ****
X--- 944,952 ----
X  	return(ptr);
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVL1
X+ 
X  /*	The routine below is used to make one of the multiple types
X   *	of a given monster class.  It will return 0 if no monsters
X   *	in that class can be made.
X***************
X*** 949,954 ****
X--- 1006,1014 ----
X  	return((tmp > tmp2) ? tmp2 : (tmp > 0 ? tmp : 0)); /* 0 lower limit */
X  }
X  
X+ #endif /* OVL1 */
X+ #ifdef OVLB
X+ 
X  struct permonst *
X  grow_up(mtmp)		/* mon mtmp "grows up" to a bigger version. */
X  register struct monst *mtmp;
X***************
X*** 976,981 ****
X--- 1036,1044 ----
X  	return(mtmp->data);
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL1
X+ 
X  int
X  mongets(mtmp, otyp)
X  register struct monst *mtmp;
X***************
X*** 989,1033 ****
X  		curse(otmp);
X  	    }
X  	    mpickobj(mtmp, otmp);
X! 	    return(otmp->spe);	    
X  	} else return(0);
X  }
X  
X! #ifdef REINCARNATION
X! struct permonst *
X! roguemon()
X! {
X! /* Make a monster for a Rogue-like level; only capital letters.  There are
X!  * no checks for "too hard" or "too easy", though dragons are specifically
X!  * ruled out because playtesting showed they made the level too hard.
X!  * Modified from rndmonst().
X!  */
X! #define isupper(x) ('A'<=(x) && (x)<='Z')
X! 	register struct permonst *ptr;
X! 	register int accept,ct,i;
X! 
X! 	/* See how many there are. */
X! 	accept = 0;
X! 	for(ct = PM_APE ; isupper(mons[ct].mlet); ct++) {
X! 		if (mons[ct].mlet == S_DRAGON) continue;
X! 		ptr = &(mons[ct]);
X! 		if(uncommon(ptr)) continue;
X! 		accept += (ptr->geno & G_FREQ);
X! 	}
X! 	if(!accept) return((struct permonst *) 0);
X! 
X! 	/* Now, select one at random. */
X! 	ct = rnd(accept);
X! 	for(i = PM_APE; isupper(mons[i].mlet) && ct > 0; i++) {
X! 		if (mons[i].mlet == S_DRAGON) continue;
X! 		ptr = &(mons[i]);
X! 		if(uncommon(ptr)) continue;
X! 		ct -= (ptr->geno & G_FREQ);
X! 	}
X! 	if(ct > 0) return((struct permonst *) 0);
X! 	return(ptr);
X! }
X! #endif
X  
X  #ifdef GOLEMS
X  int
X--- 1052,1063 ----
X  		curse(otmp);
X  	    }
X  	    mpickobj(mtmp, otmp);
X! 	    return(otmp->spe);
X  	} else return(0);
X  }
X  
X! #endif /* OVL1 */
X! #ifdef OVLB
X  
X  #ifdef GOLEMS
X  int
X***************
X*** 1048,1053 ****
X--- 1078,1086 ----
X  }
X  #endif /* GOLEMS */
X  
X+ #endif /* OVLB */
X+ #ifdef OVL1
X+ 
X  /*
X   *	Alignment vs. yours determines monster's attitude to you.
X   *	( some "animal" types are co-aligned, but also hungry )
X***************
X*** 1109,1115 ****
X  		mtmp->malign = abs(mal);
X  }
X  
X! static char syms[] = { 0, 0, RING_SYM, WAND_SYM, WEAPON_SYM, FOOD_SYM, GOLD_SYM,
X  	SCROLL_SYM, POTION_SYM, ARMOR_SYM, AMULET_SYM, TOOL_SYM, ROCK_SYM,
X  	GEM_SYM,
X  #ifdef SPELLS
X--- 1142,1151 ----
X  		mtmp->malign = abs(mal);
X  }
X  
X! #endif /* OVL1 */
X! #ifdef OVLB
X! 
X! static char syms[] = { 0, 1, RING_SYM, WAND_SYM, WEAPON_SYM, FOOD_SYM, GOLD_SYM,
X  	SCROLL_SYM, POTION_SYM, ARMOR_SYM, AMULET_SYM, TOOL_SYM, ROCK_SYM,
X  	GEM_SYM,
X  #ifdef SPELLS
X***************
X*** 1119,1169 ****
X  };
X  
X  void
X! set_mimic_sym(mtmp) /* KAA */
X  register struct monst *mtmp;
X  {
X  	int roomno, rt;
X! 	char sym;
X! 	if (!mtmp) return;
X! 
X! 	syms[0] = UP_SYM;
X! 	syms[1] = DN_SYM;
X  
X  	mtmp->mimic = 1;
X! 	roomno = inroom(mtmp->mx, mtmp->my);
X! 	if (levl[mtmp->mx][mtmp->my].gmask)
X! 		sym = GOLD_SYM;
X! 	else if (OBJ_AT(mtmp->mx, mtmp->my))
X! 		sym = level.objects[mtmp->mx][mtmp->my]->olet;
X! 	else if (IS_DOOR(levl[mtmp->mx][mtmp->my].typ) ||
X! 		 IS_WALL(levl[mtmp->mx][mtmp->my].typ) ||
X! 		 levl[mtmp->mx][mtmp->my].typ == SDOOR ||
X! 		 levl[mtmp->mx][mtmp->my].typ == SCORR)
X! 		sym = CLOSED_DOOR_SYM;
X! 	else if (is_maze_lev)
X! 		sym = rn2(2) ? ROCK_SYM : syms[rn2(sizeof syms)];
X! 	else if (roomno < 0)
X! 		sym = ROCK_SYM;
X! 	else if ((rt = rooms[roomno].rtype) == ZOO || rt == VAULT)
X! 		sym = GOLD_SYM;
X  #ifdef ORACLE
X! 	else if (rt == DELPHI)
X! 		sym = rn2(2) ? ROCK_SYM : FOUNTAIN_SYM;
X  #endif
X  #ifdef ALTARS
X! 	else if (rt == TEMPLE)
X! 		sym = ALTAR_SYM;
X  #endif
X  	/* We won't bother with beehives, morgues, barracks, throne rooms
X  	 * since they shouldn't contain too many mimics anyway...
X  	 */
X  	else if (rt >= SHOPBASE) {
X! 		int s_sym = get_shop_item(rt - SHOPBASE);
X! 
X! 		if (s_sym < 0) sym = objects[-s_sym].oc_olet;
X! 		else if (s_sym == RANDOM_SYM)
X! 			sym = syms[rn2(sizeof(syms)-2) + 2];
X! 		else sym = s_sym;
X! 	} else sym = syms[rn2(sizeof syms)];
X! 	mtmp->mappearance = sym;
X  }
X--- 1155,1260 ----
X  };
X  
X  void
X! set_mimic_sym(mtmp)		/* KAA, modified by ERS */
X  register struct monst *mtmp;
X  {
X  	int roomno, rt;
X! 	unsigned appear, ap_type;
X! 	int s_sym;
X! 	struct obj *otmp;
X! 	int mx, my;
X  
X+ 	if (!mtmp) return;
X+ 	mx = mtmp->mx; my = mtmp->my;
X  	mtmp->mimic = 1;
X! 	roomno = inroom(mx, my);
X! 	if (levl[mx][my].gmask) {
X! 		ap_type = M_AP_GOLD;
X! 		if (g_at(mx, my)->amount <= 32767)
X! 			appear = g_at(mx, my)->amount;
X! 		else
X! 			appear = 32000 + rnd(767);
X! 	}
X! 	else if (OBJ_AT(mx, my)) {
X! 		ap_type = M_AP_OBJECT;
X! 		appear = level.objects[mx][my]->otyp;
X! 	}
X! 	else if (IS_DOOR(levl[mx][my].typ) ||
X! 		 IS_WALL(levl[mx][my].typ) ||
X! 		 levl[mx][my].typ == SDOOR ||
X! 		 levl[mx][my].typ == SCORR) {
X! 		ap_type = M_AP_FURNITURE;
X! 		appear = S_cdoor;
X! 	}
X! 	else if (is_maze_lev && rn2(2)) {
X! 		ap_type = M_AP_OBJECT;
X! 		appear = STATUE;
X! 	}
X! 	else if (roomno < 0) {
X! 		ap_type = M_AP_OBJECT;
X! 		appear = BOULDER;
X! 	}
X! 	else if ((rt = rooms[roomno].rtype) == ZOO || rt == VAULT) {
X! 		ap_type = M_AP_GOLD;
X! 		appear = rn2(100)+10;	/* number of gold pieces in pile */
X! 	}
X  #ifdef ORACLE
X! 	else if (rt == DELPHI) {
X! 		if (rn2(2)) {
X! 			ap_type = M_AP_OBJECT;
X! 			appear = STATUE;
X! 		}
X! 		else {
X! 			ap_type = M_AP_FURNITURE;
X! 			appear = S_fountain;
X! 		}
X! 	}
X  #endif
X  #ifdef ALTARS
X! 	else if (rt == TEMPLE) {
X! 		ap_type = M_AP_FURNITURE;
X! 		appear = S_altar;
X! 	}
X  #endif
X  	/* We won't bother with beehives, morgues, barracks, throne rooms
X  	 * since they shouldn't contain too many mimics anyway...
X  	 */
X  	else if (rt >= SHOPBASE) {
X! 		s_sym = get_shop_item(rt - SHOPBASE);
X! 		if (s_sym < 0) {
X! 			ap_type = M_AP_OBJECT;
X! 			appear = -s_sym;
X! 		}
X! 		else {
X! 			if (s_sym == RANDOM_SYM)
X! 				s_sym = syms[rn2(sizeof(syms)-2) + 2];
X! 			goto assign_sym;
X! 		}
X! 	}
X! 	else {
X! 		s_sym = syms[rn2(sizeof syms)];
X! assign_sym:
X! 		if (s_sym < 2) {
X! 			ap_type = M_AP_FURNITURE;
X! 			appear = s_sym ? S_upstair : S_dnstair;
X! 		}
X! 		else if (s_sym == GOLD_SYM) {
X! 			ap_type = M_AP_GOLD;
X! 			appear = rn2(100)+100;
X! 		}
X! 		else {
X! 			ap_type = M_AP_OBJECT;
X! 			if (s_sym == S_MIMIC_DEF)
X! 				appear = STRANGE_OBJECT;
X! 			else {
X! 				otmp = mkobj( (char) s_sym, FALSE );
X! 				appear = otmp->otyp;
X! 				free((genericptr_t) otmp);
X! 			}
X! 		}
X! 	}
X! 	mtmp->m_ap_type = ap_type;
X! 	mtmp->mappearance = appear;
X  }
X+ 
X+ #endif /* OVLB */
X*** src/Old/mcastu.c	Mon Feb 19 20:28:15 1990
X--- src/mcastu.c	Sat Feb  3 11:04:43 1990
X***************
X*** 4,9 ****
X--- 4,12 ----
X  
X  #include	"hack.h"
X  
X+ #ifdef OVL0
X+ 
X+ static void FDECL(cursetxt,(struct monst *));
X  const char *spelltyp[] = {
X  	"shower of missiles",
X  	"fireball",
X***************
X*** 22,33 ****
X  cursetxt(mtmp)
X  	register struct monst *mtmp;
X  {
X! 	if(canseemon(mtmp))
X  		pline("%s points at you, then curses.", Monnam(mtmp));
X! 	else if((!(moves%4) || !rn2(4)) && flags.soundok) 
X  		You("hear a mumbled curse.");
X  }
X  
X  int
X  castmu(mtmp, mattk)	/* monster casts spell at you */
X  	register struct monst *mtmp;
X--- 25,51 ----
X  cursetxt(mtmp)
X  	register struct monst *mtmp;
X  {
X! 	if(canseemon(mtmp)) {
X! 	    if ((Invis && !perceives(mtmp->data) &&
X! 				(mtmp->mux != u.ux || mtmp->muy != u.uy))
X! #ifdef POLYSELF
X! 			|| u.usym == S_MIMIC_DEF || u.uundetected
X! #endif
X! 									)
X! 		pline("%s points and curses in your general direction.",
X! 				Monnam(mtmp));
X! 	    else if (Displaced && (mtmp->mux != u.ux || mtmp->muy != u.uy))
X! 		pline("%s points and curses at your displaced image.",
X! 				Monnam(mtmp));
X! 	    else
X  		pline("%s points at you, then curses.", Monnam(mtmp));
X! 	} else if((!(moves%4) || !rn2(4)) && flags.soundok) 
X  		You("hear a mumbled curse.");
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X+ 
X  int
X  castmu(mtmp, mattk)	/* monster casts spell at you */
X  	register struct monst *mtmp;
X***************
X*** 41,47 ****
X  	} else {
X  	    nomul(0);
X  	    if(rn2(ml*10) < (mtmp->mconf ? 100 : 20)) {	/* fumbled attack */
X! 		if(canseemon(mtmp))
X  		    pline("The air crackles around %s.", mon_nam(mtmp));
X  		return(0);
X  	    }
X--- 59,69 ----
X  	} else {
X  	    nomul(0);
X  	    if(rn2(ml*10) < (mtmp->mconf ? 100 : 20)) {	/* fumbled attack */
X! 		if(canseemon(mtmp)
X! #ifdef SOUNDS
X! 				&& flags.soundok
X! #endif
X! 							)
X  		    pline("The air crackles around %s.", mon_nam(mtmp));
X  		return(0);
X  	    }
X***************
X*** 104,109 ****
X--- 126,132 ----
X  			    if(Hallucination)
X  				You("have an out of body experience.");
X  			    else  {
X+ 				killer_format = KILLED_BY_AN;
X  				killer = "touch of death";
X  				done(DIED);
X  			    }
X***************
X*** 300,305 ****
X--- 323,331 ----
X  	return(1);
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL0
X+ 
X  int
X  buzzmu(mtmp, mattk)		/* monster uses spell (ranged) */
X  	register struct monst *mtmp;
X***************
X*** 321,324 ****
X--- 347,352 ----
X  	}
X  	return(1);
X  }
X+ 
X+ #endif /* OVL0 */
X  
X*** src/Old/mhitm.c	Mon Feb 19 20:28:34 1990
X--- src/mhitm.c	Sun Feb  4 13:54:28 1990
X***************
X*** 1,4 ****
X! /*	SCCS Id: @(#)mhitm.c	3.0	89/11/15
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X--- 1,4 ----
X! /*	SCCS Id: @(#)mhitm.c	3.0	89/11/27
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X***************
X*** 7,16 ****
X--- 7,20 ----
X  #  include "artifact.h"
X  #endif
X  
X+ #ifdef OVLB
X+ 
X  static boolean vis, far_noise;
X  static long noisetime;
X  static struct obj *otmp;
X  
X+ #endif /* OVLB */
X+ 
X  static void FDECL(mrustm, (struct monst *, struct monst *, struct obj *));
X  static int FDECL(hitmm, (struct monst *,struct monst *,struct attack *));
X  static int FDECL(gazemm, (struct monst *,struct monst *,struct attack *));
X***************
X*** 18,23 ****
X--- 22,31 ----
X  static int FDECL(explmm, (struct monst *,struct monst *,struct attack *));
X  static int FDECL(mdamagem, (struct monst *,struct monst *,struct attack *));
X  static void FDECL(mswingsm, (struct monst *, struct monst *, struct obj *));
X+ static void FDECL(noises,(struct monst *,struct attack *));
X+ static void FDECL(missmm,(struct monst *,struct monst *,struct attack *));
X+ 
X+ #ifdef OVLB
X  
X  static void
X  noises(magr, mattk)
X***************
X*** 55,69 ****
X  	} else  noises(magr, mattk);
X  }
X  
X  int
X  fightm(mtmp)		/* have monsters fight each other */
X  	register struct monst *mtmp;
X  {
X! register struct monst *mon;
X! /*	TODO:	this loop needs to be restructured, as we don't know if
X!  *		either "mon" or "mon->nmon" will exist after the attack.
X!  */
X! 	for(mon = fmon; mon; mon = mon->nmon)
X  	    if(mon != mtmp) {
X  		if(dist2(mon->mx,mon->my,mtmp->mx,mtmp->my) < 3)
X  		/* note: grid bug check needed here as well as in mattackm */
X--- 63,82 ----
X  	} else  noises(magr, mattk);
X  }
X  
X+ /*
X+  * fightm returns 3 if no attack, otherwise the results of mattackm
X+  */
X  int
X  fightm(mtmp)		/* have monsters fight each other */
X  	register struct monst *mtmp;
X  {
X! register struct monst *mon, *nmon;
X! #ifdef LINT
X! 	nmon = 0;
X! #endif
X! 	for(mon = fmon; mon; mon = nmon) {
X! 	    nmon = mon->nmon;
X! 	    if(nmon == mtmp) nmon = mtmp->nmon;
X  	    if(mon != mtmp) {
X  		if(dist2(mon->mx,mon->my,mtmp->mx,mtmp->my) < 3)
X  		/* note: grid bug check needed here as well as in mattackm */
X***************
X*** 71,77 ****
X  				|| mtmp->my==mon->my)
X  			return(mattackm(mtmp,mon));
X  	    }
X! 	return(-1);
X  }
X  
X  /*
X--- 84,91 ----
X  				|| mtmp->my==mon->my)
X  			return(mattackm(mtmp,mon));
X  	    }
X! 	}
X! 	return(3);
X  }
X  
X  /*
X***************
X*** 93,99 ****
X  
X  	if(!magr || !mdef) return(0);		/* mike@genat */
X  	pa = magr->data; pd = mdef->data;
X! 	if(magr->mfroz) return(0);		/* riv05!a3 */
X  	if(pa==&mons[PM_GRID_BUG] && magr->mx != mdef->mx
X  						&& magr->my != mdef->my)
X  		return(0);
X--- 107,113 ----
X  
X  	if(!magr || !mdef) return(0);		/* mike@genat */
X  	pa = magr->data; pd = mdef->data;
X! 	if(!magr->mcanmove) return(0);		/* riv05!a3 */
X  	if(pa==&mons[PM_GRID_BUG] && magr->mx != mdef->mx
X  						&& magr->my != mdef->my)
X  		return(0);
X***************
X*** 101,107 ****
X  /*	Calculate the armour class differential.	*/
X  
X  	tmp = pd->ac + magr->m_lev;
X! 	if(mdef->mconf || mdef->mfroz || mdef->msleep){
X  		tmp += 4;
X  		if(mdef->msleep) mdef->msleep = 0;
X  	}
X--- 115,121 ----
X  /*	Calculate the armour class differential.	*/
X  
X  	tmp = pd->ac + magr->m_lev;
X! 	if(mdef->mconf || !mdef->mcanmove || mdef->msleep){
X  		tmp += 4;
X  		if(mdef->msleep) mdef->msleep = 0;
X  	}
X***************
X*** 194,200 ****
X  		if(magr->mimic) seemimic(magr);
X  		if((compat = could_seduce(magr,mdef,mattk)) && !magr->mcan) {
X  			Sprintf(buf, "%s %s", Monnam(magr),
X! 				mdef->mblinded ? "talks to" : "smiles at");
X  			pline("%s %s %s.", buf, mon_nam(mdef),
X  				compat == 2 ?
X  					"engagingly" : "seductively");
X--- 208,214 ----
X  		if(magr->mimic) seemimic(magr);
X  		if((compat = could_seduce(magr,mdef,mattk)) && !magr->mcan) {
X  			Sprintf(buf, "%s %s", Monnam(magr),
X! 				mdef->mcansee ? "smiles at" : "talks to");
X  			pline("%s %s %s.", buf, mon_nam(mdef),
X  				compat == 2 ?
X  					"engagingly" : "seductively");
X***************
X*** 238,244 ****
X  		pline("%s %s.", buf, mon_nam(mdef));
X  	}
X  
X! 	if (mdef->mblinded || mdef->msleep) {
X  
X  	    if(vis) pline("but nothing happens.");
X  	    return(0);
X--- 252,258 ----
X  		pline("%s %s.", buf, mon_nam(mdef));
X  	}
X  
X! 	if (!mdef->mcansee || mdef->msleep) {
X  
X  	    if(vis) pline("but nothing happens.");
X  	    return(0);
X***************
X*** 255,260 ****
X--- 269,276 ----
X  	int	mx, my, tmp;
X  	char buf[BUFSZ];
X  
X+ 	if(mdef->data->msize >= MZ_HUGE) return 0;
X+ 
X  	if(vis) {
X  		Sprintf(buf,"%s swallows", Monnam(magr));
X  		pline("%s %s.", buf, mon_nam(mdef));
X***************
X*** 307,312 ****
X--- 323,331 ----
X  	return(2);
X  }
X  
X+ static const char psf[] =
X+ 	"have a peculiarly sad feeling for a moment, then it passes.";
X+ 
X  static int
X  mdamagem(magr, mdef, mattk)
X  	register struct monst	*magr, *mdef;
X***************
X*** 316,324 ****
X  	int	tmp = d((int)mattk->damn,(int)mattk->damd);
X  	char buf[BUFSZ];
X  
X  	switch(mattk->adtyp) {
X  	    case AD_DGST:
X! 		if(flags.verbose && flags.soundok) pline("\"Burrrrp!\"");
X  		tmp = mdef->mhp;
X  		break;
X  	    case AD_STUN:
X--- 335,355 ----
X  	int	tmp = d((int)mattk->damn,(int)mattk->damd);
X  	char buf[BUFSZ];
X  
X+ 	if(mdef->data == &mons[PM_COCKATRICE] && !resists_ston(magr->data) &&
X+ 	   (mattk->aatyp != AT_WEAP || !otmp) &&
X+ 	   (mattk->aatyp != AT_GAZE && mattk->aatyp != AT_EXPL) &&
X+ 	   (!is_mercenary(magr->data) || !m_carrying(magr, LEATHER_GLOVES))) {
X+ 	   /* Note: other monsters may carry gloves, only soldiers have them */
X+ 	   /* as their "armor" and can be said to wear them */
X+ 		if (vis) pline("%s turns to stone!", Monnam(magr));
X+ 		else if (magr->mtame) You(psf);
X+ 		monstone(magr);
X+ 		return -1;
X+ 	}
X+ 
X  	switch(mattk->adtyp) {
X  	    case AD_DGST:
X! 		if(flags.verbose && flags.soundok) verbalize("Burrrrp!");
X  		tmp = mdef->mhp;
X  		break;
X  	    case AD_STUN:
X***************
X*** 363,369 ****
X--- 394,402 ----
X  #ifdef GOLEMS
X  		golemeffects(mdef, AD_FIRE, tmp);
X  #endif /* GOLEMS */
X+ 		if(vis) pline("%s is on fire!", Monnam(mdef));
X  		if(resists_fire(pd)) {
X+ 		    pline("The fire doesn't seem to burn %s!", mon_nam(mdef));
X  		    shieldeff(mdef->mx, mdef->my);
X  		    tmp = 0;
X  		} else {
X***************
X*** 382,388 ****
X--- 415,424 ----
X  #ifdef GOLEMS
X  		golemeffects(mdef, AD_COLD, tmp);
X  #endif /* GOLEMS */
X+ 		if(vis) pline("%s is covered in frost!", Monnam(mdef));
X  		if(resists_cold(pd)) {
X+ 		    pline("The frost doesn't seem to chill %s!",
X+ 			mon_nam(mdef));
X  		    shieldeff(mdef->mx, mdef->my);
X  		    tmp = 0;
X  		} else tmp += destroy_mitem(mdef, POTION_SYM, AD_COLD);
X***************
X*** 395,401 ****
X--- 431,439 ----
X  #ifdef GOLEMS
X  		golemeffects(mdef, AD_ELEC, tmp);
X  #endif /* GOLEMS */
X+ 		if(vis) pline("%s gets zapped!", Monnam(mdef));
X  		if(resists_elec(pd)) {
X+ 		    pline("The zap doesn't shock %s!", mon_nam(mdef));
X  		    shieldeff(mdef->mx, mdef->my);
X  		    tmp = 0;
X  		}
X***************
X*** 405,411 ****
X  		    tmp = 0;
X  		    break;
X  		}
X! 		if(resists_acid(pd)) tmp = 0;
X  		break;
X  	    case AD_RUST:
X  #ifdef GOLEMS
X--- 443,456 ----
X  		    tmp = 0;
X  		    break;
X  		}
X! 		if(resists_acid(pd)) {
X! 		    pline("%s is covered in acid, but it seems harmless.",
X! 			Monnam(mdef));
X! 		    tmp = 0;
X! 		} else {
X! 		    pline("%s is covered in acid!", Monnam(mdef));
X! 		    pline("It burns %s!", mon_nam(mdef));
X! 		}
X  		break;
X  	    case AD_RUST:
X  #ifdef GOLEMS
X***************
X*** 442,449 ****
X  		if(!resists_ston(pd)) {
X  			magr->mhpmax += 1 + rn2((int)mdef->m_lev+1);
X  			if(vis) pline("%s turns to stone!", Monnam(mdef));
X! 			else if(mdef->mtame)
X!      You("have a peculiarly sad feeling for a moment, then it passes.");
X  			monstone(mdef);
X  			ptr = grow_up(magr);
X  			if(!ptr) return(-1);
X--- 487,493 ----
X  		if(!resists_ston(pd)) {
X  			magr->mhpmax += 1 + rn2((int)mdef->m_lev+1);
X  			if(vis) pline("%s turns to stone!", Monnam(mdef));
X! 			else if(mdef->mtame) You(psf);
X  			monstone(mdef);
X  			ptr = grow_up(magr);
X  			if(!ptr) return(-1);
X***************
X*** 459,479 ****
X  		}
X  		break;
X  	    case AD_SLEE:
X! 		if(!resists_sleep(pd) && !magr->mcan && vis && !mdef->msleep
X! 							&& !mdef->mfroz) {
X! 		    pline("%s falls asleep.", Monnam(mdef));
X! 		    mdef->msleep = 1;
X  		}
X  		break;
X  	    case AD_PLYS:
X! 		if(!magr->mcan && vis && !mdef->mfroz) {
X! 		    pline("%s stops moving.", Monnam(mdef));
X! 		    mdef->mfroz = 1;
X  		}
X  		break;
X  	    case AD_SLOW:
X  		if(!magr->mcan && vis && mdef->mspeed != MSLOW) {
X! 		    pline("%s slows down.", Monnam(mdef));
X  		    if (mdef->mspeed == MFAST) mdef->mspeed = 0;
X  		    else mdef->mspeed = MSLOW;
X  		}
X--- 503,531 ----
X  		}
X  		break;
X  	    case AD_SLEE:
X! 		if(!resists_sleep(pd) && !magr->mcan && !mdef->msleep
X! 							&& mdef->mcanmove) {
X! 		    if (vis) {
X! 			Strcpy(buf, Monnam(mdef));
X! 			pline("%s is put to sleep by %s.", buf, mon_nam(magr));
X! 		    }
X! 		    mdef->mcanmove = 0;
X! 		    mdef->mfrozen = rnd(10);
X  		}
X  		break;
X  	    case AD_PLYS:
X! 		if(!magr->mcan && mdef->mcanmove) {
X! 		    if (vis) {
X! 			Strcpy(buf, Monnam(mdef));
X! 			pline("%s is frozen by %s.", buf, mon_nam(magr));
X! 		    }
X! 		    mdef->mcanmove = 0;
X! 		    mdef->mfrozen = rnd(10);
X  		}
X  		break;
X  	    case AD_SLOW:
X  		if(!magr->mcan && vis && mdef->mspeed != MSLOW) {
X! 		    if (vis) pline("%s slows down.", Monnam(mdef));
X  		    if (mdef->mspeed == MFAST) mdef->mspeed = 0;
X  		    else mdef->mspeed = MSLOW;
X  		}
X***************
X*** 491,497 ****
X  	    case AD_BLND:
X  		if(!magr->mcan && haseyes(pd)) {
X  
X! 		    if(vis && !mdef->mblinded)
X  			pline("%s is blinded.", Monnam(mdef));
X  		    {
X  			register unsigned rnd_tmp;
X--- 543,549 ----
X  	    case AD_BLND:
X  		if(!magr->mcan && haseyes(pd)) {
X  
X! 		    if(vis && mdef->mcansee)
X  			pline("%s is blinded.", Monnam(mdef));
X  		    {
X  			register unsigned rnd_tmp;
X***************
X*** 606,612 ****
X  
X  	if((mdef->mhp -= tmp) < 1) {
X  	    magr->mhpmax += 1 + rn2((int)mdef->m_lev+1);
X! 	    if(vis) pline("%s is killed!", Monnam(mdef));
X  	    else if(mdef->mtame)
X  		You("have a sad feeling for a moment, then it passes.");
X  	    mondied(mdef);
X--- 658,667 ----
X  
X  	if((mdef->mhp -= tmp) < 1) {
X  	    magr->mhpmax += 1 + rn2((int)mdef->m_lev+1);
X! 	    if(vis)
X! 		pline("%s is %s!", Monnam(mdef),
X! 			(is_demon(mdef->data) || is_undead(mdef->data)) ?
X! 			 "destroyed" : "killed");
X  	    else if(mdef->mtame)
X  		You("have a sad feeling for a moment, then it passes.");
X  	    mondied(mdef);
X***************
X*** 620,625 ****
X--- 675,683 ----
X  	return(1);
X  }
X  
X+ #endif /* OVLB */
X+ #ifdef OVL0
X+ 
X  int
X  noattacks(ptr)			/* returns 1 if monster doesn't attack */
X  	struct	permonst *ptr;
X***************
X*** 632,637 ****
X--- 690,698 ----
X  	return(1);
X  }
X  
X+ #endif /* OVL0 */
X+ #ifdef OVLB
X+ 
X  static void
X  mrustm(magr, mdef, obj)
X  register struct monst *magr, *mdef;
X***************
X*** 671,673 ****
X--- 732,736 ----
X  	      is_human(magr->data) ? "his" : "its",
X  	      xname(otemp), buf);
X  }
X+ 
X+ #endif /* OVLB */
X
END_OF_FILE
if test 54708 -ne `wc -c <'patch7.10'`; then
    echo shar: \"'patch7.10'\" unpacked with wrong size!
fi
# end of 'patch7.10'
echo shar: End of archive 14 \(of 30\).
cp /dev/null ark14isdone
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