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

billr@saab.CNA.TEK.COM (Bill Randle) (09/30/89)

Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 8, Issue 41
Archive-name: NetHack3/Patch4e
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 5 (of 11)."
# Contents:  patches04e
# Wrapped by billr@saab on Fri Sep 29 13:14:17 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patches04e' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patches04e'\"
else
echo shar: Extracting \"'patches04e'\" \(56197 characters\)
sed "s/^X//" >'patches04e' <<'END_OF_FILE'
X*** src/Old/topl.c	Wed Sep 27 12:21:06 1989
X--- src/topl.c	Mon Sep 25 23:07:03 1989
X***************
X*** 2,7 ****
X--- 2,8 ----
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X  
X+ #define NEED_VARARGS
X  #include "hack.h"
X  
X  char toplines[BUFSIZ];
X***************
X*** 134,154 ****
X  }
X  
X  /*VARARGS1*/
X! /* Because the modified mstatusline has 9 arguments KAA */
X  void
X! pline(line,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)
X! #ifndef TOS
X! register
X  #endif
X! const char *line,*arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9;
X! {
X  	char pbuf[BUFSZ];
X  	register char *bp = pbuf, *tl;
X  	register int n,n0;
X  
X  	if(!line || !*line) return;
X  	if(!index(line, '%')) Strcpy(pbuf,line); else
X! 	Sprintf(pbuf,line,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
X  	if(no_repeat && flags.toplin == 1 && !strcmp(pbuf, toplines)) return;
X  	nscr();		/* %% */
X  
X--- 135,177 ----
X  }
X  
X  /*VARARGS1*/
X! /* Note the modified mstatusline has 9 arguments KAA */
X! 
X! /* Also note that these declarations rely on knowledge of the internals
X!  * of the variable argument handling stuff in "tradstdc.h"
X!  */
X! 
X! #if defined(USE_STDARG) || defined(USE_VARARGS)
X! void
X! pline VA_DECL(const char *, line)
X! 	VA_START(line);
X! 	VA_INIT(line, char *);
X! 	vpline(line, VA_ARGS);
X! 	VA_END();
X! }
X! 
X! # ifdef USE_STDARG
X! void
X! vpline(const char *line, va_list the_args) {
X! # else
X! void
X! vpline(line, the_args) const char *line; va_list the_args; {
X! # endif
X! 
X! #else  /* USE_STDARG | USE_VARARG */
X! 
X  void
X! pline VA_DECL(const char *, line)
X  #endif
X! 
X  	char pbuf[BUFSZ];
X  	register char *bp = pbuf, *tl;
X  	register int n,n0;
X+ /* Do NOT use VA_START and VA_END in here... see above */
X  
X  	if(!line || !*line) return;
X  	if(!index(line, '%')) Strcpy(pbuf,line); else
X! 	Vsprintf(pbuf,line,VA_ARGS);
X  	if(no_repeat && flags.toplin == 1 && !strcmp(pbuf, toplines)) return;
X  	nscr();		/* %% */
X  
X***************
X*** 206,257 ****
X  
X  /*VARARGS1*/
X  void
X! Norep(line,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)
X! #ifndef TOS
X! register
X! #endif
X! const char *line,*arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9;
X! {
X  	no_repeat = TRUE;
X! 	pline(line, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
X  	no_repeat = FALSE;
X  	return;
X  }
X  
X  /*VARARGS1*/
X  void
X! You(line,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)
X! #ifndef TOS
X! register
X! #endif
X! const char *line,*arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9;
X! {
X  	char *tmp;
X  	tmp = (char *)alloc((unsigned int)(strlen(line) + 5));
X  	Strcpy(tmp, "You ");
X  	Strcat(tmp, line);
X! 	pline(tmp, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
X  	free(tmp);
X  	return;
X  }
X  
X  /*VARARGS1*/
X  void
X! Your(line,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9)
X! #ifndef TOS
X! register
X! #endif
X! const char *line,*arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9;
X! {
X  	char *tmp;
X  	tmp = (char *)alloc((unsigned int)(strlen(line) + 6));
X  	Strcpy(tmp, "Your ");
X  	Strcat(tmp, line);
X! 	pline(tmp, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
X  	free(tmp);
X  	return;
X  }
X  
X  void
X  putsym(c)
X  char c;
X--- 229,299 ----
X  
X  /*VARARGS1*/
X  void
X! Norep VA_DECL(const char *, line)
X! 	VA_START(line);
X! 	VA_INIT(line, const char *);
X  	no_repeat = TRUE;
X! 	vpline(line, VA_ARGS);
X  	no_repeat = FALSE;
X+ 	VA_END();
X  	return;
X  }
X  
X  /*VARARGS1*/
X  void
X! You VA_DECL(const char *, line)
X  	char *tmp;
X+ 	VA_START(line);
X+ 	VA_INIT(line, const char *);
X  	tmp = (char *)alloc((unsigned int)(strlen(line) + 5));
X  	Strcpy(tmp, "You ");
X  	Strcat(tmp, line);
X! 	vpline(tmp, VA_ARGS);
X  	free(tmp);
X+ 	VA_END();
X  	return;
X  }
X  
X  /*VARARGS1*/
X  void
X! Your VA_DECL(const char *,line)
X  	char *tmp;
X+ 	VA_START(line);
X+ 	VA_INIT(line, const char *);
X  	tmp = (char *)alloc((unsigned int)(strlen(line) + 6));
X  	Strcpy(tmp, "Your ");
X  	Strcat(tmp, line);
X! 	vpline(tmp, VA_ARGS);
X  	free(tmp);
X+ 	VA_END();
X  	return;
X  }
X  
X+ /*ARGSUSED*/
X+ /*VARARGS2*/
X+ void
X+ kludge  VA_DECL2(char *, str, char *, arg)
X+ #ifdef VA_NEXT
X+ 	char *other1, *other2, *other3;
X+ #endif
X+ 	VA_START(arg);
X+ 	VA_INIT(str, char *);
X+ 	VA_INIT(arg, char *);
X+ #ifdef VA_NEXT
X+ 	VA_NEXT(other1, char *);
X+ 	VA_NEXT(other2, char *);
X+ 	VA_NEXT(other3, char *);
X+ # define OTHER_ARGS other1,other2,other3
X+ #else
X+ # define OTHER_ARGS arg1,arg2,arg3
X+ #endif
X+ 	if(Blind || !flags.verbose) {
X+ 		if(*str == '%') pline(str,"It",OTHER_ARGS);
X+ 		else pline(str,"it",OTHER_ARGS);
X+ 	} else pline(str,arg,OTHER_ARGS);
X+ 	VA_END();
X+ }
X+ 
X  void
X  putsym(c)
X  char c;
X***************
X*** 311,314 ****
X--- 353,366 ----
X  	flags.toplin = 2;
X  
X  	return q;
X+ }
X+ 
X+ /*VARARGS1*/
X+ void
X+ impossible VA_DECL(char *, s)
X+ 	VA_START(s);
X+ 	VA_INIT(s, char *);
X+ 	vpline(s,VA_ARGS);
X+ 	pline("Program in disorder - perhaps you'd better Quit.");
X+ 	VA_END();
X  }
X*** src/Old/topten.c	Wed Sep 27 12:21:23 1989
X--- src/topten.c	Sun Sep 17 12:27:57 1989
X***************
X*** 42,55 ****
X  	int rank, rank0 = -1, rank1 = 0;
X  	int occ_cnt = PERSMAX;
X  	register struct toptenentry *t0, *t1, *tprev;
X- 	char *recfile = RECORD;
X  #ifdef UNIX
X  	char *reclock = "record_lock";
X  # ifdef NO_FILE_LINKS
X  	int lockfd ;
X  # endif
X- 	int sleepct = 100;
X  #endif /* UNIX */
X  	FILE *rfile;
X  	register int flg = 0;
X  #ifdef LOGFILE
X--- 42,62 ----
X  	int rank, rank0 = -1, rank1 = 0;
X  	int occ_cnt = PERSMAX;
X  	register struct toptenentry *t0, *t1, *tprev;
X  #ifdef UNIX
X  	char *reclock = "record_lock";
X  # ifdef NO_FILE_LINKS
X  	int lockfd ;
X  # endif
X  #endif /* UNIX */
X+ #ifdef VMS
X+ 	char *reclock = "record_lock;1";
X+ 	char recfile[] = RECORD;
X+ #else
X+ 	char *recfile = RECORD;
X+ #endif
X+ #if defined(UNIX) || defined(VMS)
X+ 	int sleepct = 100;
X+ #endif
X  	FILE *rfile;
X  	register int flg = 0;
X  #ifdef LOGFILE
X***************
X*** 57,64 ****
X  	FILE *lfile;
X  # ifdef UNIX
X  	char *loglock = "logfile_lock";
X- 	int sleeplgct = 30;
X  # endif /* UNIX */
X  #endif /* LOGFILE */
X  
X  #ifdef MSDOS
X--- 64,76 ----
X  	FILE *lfile;
X  # ifdef UNIX
X  	char *loglock = "logfile_lock";
X  # endif /* UNIX */
X+ # ifdef VMS
X+ 	char *loglock = "logfile_lock;1";
X+ # endif /* VMS */
X+ # if defined(UNIX) || defined(VMS)
X+ 	int sleeplgct = 30;
X+ # endif /* UNIX or VMS */
X  #endif /* LOGFILE */
X  
X  #ifdef MSDOS
X***************
X*** 84,90 ****
X  	Strcpy(t0->date, getdate());
X  
X  #ifdef LOGFILE		/* used for debugging (who dies of what, where) */
X! # ifdef UNIX
X  #  ifdef NO_FILE_LINKS
X  	loglock = (char *)alloc(sizeof(LOCKDIR)+1+strlen(lgfile)+6);
X  	Strcpy(loglock,LOCKDIR) ;
X--- 96,102 ----
X  	Strcpy(t0->date, getdate());
X  
X  #ifdef LOGFILE		/* used for debugging (who dies of what, where) */
X! # if defined(UNIX) || defined(VMS)
X  #  ifdef NO_FILE_LINKS
X  	loglock = (char *)alloc(sizeof(LOCKDIR)+1+strlen(lgfile)+6);
X  	Strcpy(loglock,LOCKDIR) ;
X***************
X*** 108,119 ****
X  		HUP Printf("Waiting for access to log file. (%d)\n",
X   			sleeplgct);
X  		HUP (void) fflush(stdout);
X! #  if defined(SYSV) || defined(ULTRIX)
X  		(void)
X  #  endif
X  		    sleep(1);
X  	}
X! # endif /* UNIX */
X  	if(!(lfile = fopen(lgfile,"a"))){
X  		HUP (void) puts("Cannot open log file!");
X  		goto lgend;
X--- 120,131 ----
X  		HUP Printf("Waiting for access to log file. (%d)\n",
X   			sleeplgct);
X  		HUP (void) fflush(stdout);
X! #  if defined(SYSV) || defined(ULTRIX) || defined(VMS)
X  		(void)
X  #  endif
X  		    sleep(1);
X  	}
X! # endif /* UNIX or VMS */
X  	if(!(lfile = fopen(lgfile,"a"))){
X  		HUP (void) puts("Cannot open log file!");
X  		goto lgend;
X***************
X*** 124,132 ****
X  	    t0->hp, t0->maxhp, t0->points,
X  	    t0->plchar, t0->sex, t0->name, t0->death);
X  	(void) fclose(lfile);
X! # ifdef UNIX
X  	(void) unlink(loglock);
X! # endif /* UNIX */
X        lgend:;
X  # ifdef NO_FILE_LINKS
X  	(void) close(lockfd) ;
X--- 136,144 ----
X  	    t0->hp, t0->maxhp, t0->points,
X  	    t0->plchar, t0->sex, t0->name, t0->death);
X  	(void) fclose(lfile);
X! # if defined(UNIX) || defined(VMS)
X  	(void) unlink(loglock);
X! # endif /* UNIX or VMS */
X        lgend:;
X  # ifdef NO_FILE_LINKS
X  	(void) close(lockfd) ;
X***************
X*** 140,146 ****
X  # endif
X  #endif /* LOGFILE */
X  
X! #ifdef UNIX
X  # ifdef NO_FILE_LINKS
X  	reclock = (char *)alloc(sizeof(LOCKDIR)+1+strlen(recfile)+7);
X  	Strcpy(reclock,LOCKDIR) ;
X--- 152,158 ----
X  # endif
X  #endif /* LOGFILE */
X  
X! #if defined(UNIX) || defined(VMS)
X  # ifdef NO_FILE_LINKS
X  	reclock = (char *)alloc(sizeof(LOCKDIR)+1+strlen(recfile)+7);
X  	Strcpy(reclock,LOCKDIR) ;
X***************
X*** 160,171 ****
X  		HUP Printf("Waiting for access to record file. (%d)\n",
X  			sleepct);
X  		HUP (void) fflush(stdout);
X! # if defined(SYSV) || defined(ULTRIX)
X  		(void)
X  # endif
X  		    sleep(1);
X  	}
X! #endif /* UNIX */
X  	if(!(rfile = fopen(recfile,"r"))){
X  		HUP (void) puts("Cannot open record file!");
X  		goto unlock;
X--- 172,183 ----
X  		HUP Printf("Waiting for access to record file. (%d)\n",
X  			sleepct);
X  		HUP (void) fflush(stdout);
X! # if defined(SYSV) || defined(ULTRIX) || defined(VMS)
X  		(void)
X  # endif
X  		    sleep(1);
X  	}
X! #endif /* UNIX or VMS */
X  	if(!(rfile = fopen(recfile,"r"))){
X  		HUP (void) puts("Cannot open record file!");
X  		goto unlock;
X***************
X*** 244,249 ****
X--- 256,269 ----
X  	}
X  	if(flg) {	/* rewrite record file */
X  		(void) fclose(rfile);
X+ #ifdef VMS
X+ 		{
X+ 			char *sem = rindex(recfile, ';');
X+ 
X+ 			if (sem)
X+ 				*sem = '\0';
X+ 		}
X+ #endif
X  		if(!(rfile = fopen(recfile,"w"))){
X  			HUP (void) puts("Cannot write record file\n");
X  			goto unlock;
X***************
X*** 295,302 ****
X  	if(rank0 >= rank) if(!done_stopprint)
X  		(void) outentry(0, t0, 1);
X  	(void) fclose(rfile);
X  unlock:	;
X! #ifdef UNIX
X  # ifdef NO_FILE_LINKS
X  	(void) close(lockfd) ;
X  # endif
X--- 315,329 ----
X  	if(rank0 >= rank) if(!done_stopprint)
X  		(void) outentry(0, t0, 1);
X  	(void) fclose(rfile);
X+ #ifdef VMS
X+ 	if (flg) {
X+ 		delete(RECORD);
X+ 		rename(recfile, RECORD);
X+ 	}
X+ # undef unlink
X+ #endif
X  unlock:	;
X! #if defined(UNIX) || defined(VMS)
X  # ifdef NO_FILE_LINKS
X  	(void) close(lockfd) ;
X  # endif
X***************
X*** 693,701 ****
X  	} else {
X  		otmp->corpsenm = classmon(tt->plchar, (tt->sex == 'F'));
X  		otmp->owt = weight(otmp);
X! 		/* Note: oname() is safe since otmp is first in chain */
X  		otmp = oname(otmp, tt->name, 0);
X  		fobj = otmp;
X  		free((genericptr_t) tt);
X  		return otmp;
X  	}
X--- 720,729 ----
X  	} else {
X  		otmp->corpsenm = classmon(tt->plchar, (tt->sex == 'F'));
X  		otmp->owt = weight(otmp);
X! 		/* Note: oname() is safe since otmp is first in chains */
X  		otmp = oname(otmp, tt->name, 0);
X  		fobj = otmp;
X+ 		level.objects[otmp->ox][otmp->oy] = otmp;
X  		free((genericptr_t) tt);
X  		return otmp;
X  	}
X*** src/Old/trap.c	Wed Sep 27 12:22:04 1989
X--- src/trap.c	Mon Sep 25 21:30:24 1989
X***************
X*** 101,109 ****
X  	boolean	tmp1, tmp2, tmp3;
X  #  ifdef POLYSELF
X  	tmp1 = isok(x,y) && (!IS_ROCK(levl[x][y].typ) ||
X! 		passes_walls(uasmon)) && !levl[x][y].mmask;
X  #  else
X! 	tmp1 = isok(x,y) && !IS_ROCK(levl[x][y].typ) && !levl[x][y].mmask;
X  #  endif
X  	tmp2 = !sobj_at(BOULDER,x,y) && !t_at(x,y);
X  	tmp3 = !(is_pool(x,y) &&
X--- 101,109 ----
X  	boolean	tmp1, tmp2, tmp3;
X  #  ifdef POLYSELF
X  	tmp1 = isok(x,y) && (!IS_ROCK(levl[x][y].typ) ||
X! 		passes_walls(uasmon)) && !MON_AT(x, y);
X  #  else
X! 	tmp1 = isok(x,y) && !IS_ROCK(levl[x][y].typ) && !MON_AT(x, y);
X  #  endif
X  	tmp2 = !sobj_at(BOULDER,x,y) && !t_at(x,y);
X  	tmp3 = !(is_pool(x,y) &&
X***************
X*** 122,128 ****
X  #  else
X  		!IS_ROCK(levl[x][y].typ) &&
X  #  endif
X! 		!levl[x][y].mmask &&
X  		!sobj_at(BOULDER,x,y) && !t_at(x,y) &&
X  		!(is_pool(x,y) &&
X  		!(Levitation || Wwalking
X--- 122,128 ----
X  #  else
X  		!IS_ROCK(levl[x][y].typ) &&
X  #  endif
X! 		!MON_AT(x, y) &&
X  		!sobj_at(BOULDER,x,y) && !t_at(x,y) &&
X  		!(is_pool(x,y) &&
X  		!(Levitation || Wwalking
X***************
X*** 206,211 ****
X--- 206,212 ----
X  #endif
X  		    break;
X  		case STATUE_TRAP:
X+ 		    deltrap(trap);
X  		    for(otmp=fobj; otmp; otmp=otmp->nobj) {
X  			if(otmp->otyp == STATUE && otmp->ox == u.ux &&
X  				otmp->oy == u.uy && otmp->corpsenm == trap->pm)
X***************
X*** 215,221 ****
X  				break;
X  			    }
X  		    }
X- 		    deltrap(trap);
X  		    break;
X  		case MONST_TRAP:
X  		    if(mtmp=makemon(&mons[trap->pm],u.ux,u.uy)) {
X--- 216,221 ----
X***************
X*** 226,232 ****
X  			    if(uarmh)
X  				pline("Its blow glances off your helmet.");
X  			    else
X! 				(void) thitu(3,d(4,6),"falling piercer");
X  			    break;
X  			default:	/* monster surprises you. */
X  			    pline("%s attacks you by surprise!",
X--- 226,233 ----
X  			    if(uarmh)
X  				pline("Its blow glances off your helmet.");
X  			    else
X! 				(void) thitu(3,d(4,6),(struct obj *)0,
X! 					"falling piercer");
X  			    break;
X  			default:	/* monster surprises you. */
X  			    pline("%s attacks you by surprise!",
X***************
X*** 238,244 ****
X  		    break;
X  		case ARROW_TRAP:
X  		    pline("An arrow shoots out at you!");
X! 		    if(!thitu(8,rnd(6),"arrow")){
X  			(void) mksobj_at(ARROW, u.ux, u.uy);
X  			fobj->quan = 1;
X  			fobj->owt = weight(fobj);
X--- 239,245 ----
X  		    break;
X  		case ARROW_TRAP:
X  		    pline("An arrow shoots out at you!");
X! 		    if(!thitu(8,rnd(6),(struct obj *)0,"arrow")){
X  			(void) mksobj_at(ARROW, u.ux, u.uy);
X  			fobj->quan = 1;
X  			fobj->owt = weight(fobj);
X***************
X*** 294,300 ****
X  		    break;
X  		case DART_TRAP:
X  		    pline("A little dart shoots out at you!");
X! 		    if(thitu(7,rnd(3),"little dart")) {
X  			if(!rn2(6)) poisoned("dart",A_CON,"poison dart");
X  		    } else {
X  			(void) mksobj_at(DART, u.ux, u.uy);
X--- 295,301 ----
X  		    break;
X  		case DART_TRAP:
X  		    pline("A little dart shoots out at you!");
X! 		    if(thitu(7,rnd(3),(struct obj *)0,"little dart")) {
X  			if(!rn2(6)) poisoned("dart",A_CON,"poison dart");
X  		    } else {
X  			(void) mksobj_at(DART, u.ux, u.uy);
X***************
X*** 1122,1132 ****
X  	    } while(!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1])));
X  	    newlevel = atoi(buf);
X  	} else {
X- 	    newlevel = rn2(5) | !Fire_resistance ? rnd(dlevel + 3) :
X  #ifdef STRONGHOLD
X! 		stronghold_level + 1;
X  #else
X! 		HELLLEVEL;
X  #endif
X  	    if(dlevel == newlevel)
X  		if(is_maze_lev) newlevel--; else newlevel++;
X--- 1123,1136 ----
X  	    } while(!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1])));
X  	    newlevel = atoi(buf);
X  	} else {
X  #ifdef STRONGHOLD
X! 	    /* We cannot send them to Hell if STRONGHOLD is defined, since
X! 	     * they may find themselves trapped on the other side of the
X! 	     * stronghold...
X! 	     */
X! 	    newlevel = rn2(5) ? rnd(dlevel + 3) : rnd(stronghold_level);
X  #else
X! 	    newlevel = rn2(5) || !Fire_resistance ? rnd(dlevel + 3) : HELLLEVEL;
X  #endif
X  	    if(dlevel == newlevel)
X  		if(is_maze_lev) newlevel--; else newlevel++;
X***************
X*** 1259,1265 ****
X  		       /* below pline added by GAN 10/30/86 */
X  		       adjattrib(A_CHA,1,FALSE);
X  		       for(i = -1; i <= 1; i++) for(j = -1; j <= 1; j++)
X! 		       if(levl[u.ux+i][u.uy+j].mmask)
X  			   (void) tamedog(m_at(u.ux+i, u.uy+j), (struct obj *)0);
X  		       break;
X  		   }
X--- 1263,1269 ----
X  		       /* below pline added by GAN 10/30/86 */
X  		       adjattrib(A_CHA,1,FALSE);
X  		       for(i = -1; i <= 1; i++) for(j = -1; j <= 1; j++)
X! 		       if(MON_AT(u.ux+i, u.uy+j))
X  			   (void) tamedog(m_at(u.ux+i, u.uy+j), (struct obj *)0);
X  		       break;
X  		   }
X***************
X*** 1289,1295 ****
X  
X  	/* Scrolls and potions get affected by the water */
X  	for(obj = invent; obj; obj = obj->nobj) {
X! 		if(obj->olet == SCROLL_SYM && rn2(12) > u.uluck)
X  			obj->otyp = SCR_BLANK_PAPER;
X  		if(obj->olet == POTION_SYM && rn2(12) > u.uluck) {
X  			if (obj->spe == -1) {
X--- 1293,1303 ----
X  
X  	/* Scrolls and potions get affected by the water */
X  	for(obj = invent; obj; obj = obj->nobj) {
X! 		if(obj->olet == SCROLL_SYM && rn2(12) > u.uluck
X! #ifdef MAIL
X! 			&& obj->otyp != SCR_MAIL
X! #endif
X! 								)
X  			obj->otyp = SCR_BLANK_PAPER;
X  		if(obj->olet == POTION_SYM && rn2(12) > u.uluck) {
X  			if (obj->spe == -1) {
X***************
X*** 1458,1465 ****
X  	}
X  }
X  
X! /* this is only called when the player is doing something to the chest
X!  * -- i.e., the player and the chest are in the same position */
X  void
X  chest_trap(obj, bodypart)
X  register struct obj *obj;
X--- 1466,1472 ----
X  	}
X  }
X  
X! /* only called when the player is doing something to the chest directly */
X  void
X  chest_trap(obj, bodypart)
X  register struct obj *obj;
X*** src/Old/u_init.c	Wed Sep 27 12:22:58 1989
X--- src/u_init.c	Mon Sep 25 22:54:56 1989
X***************
X*** 93,98 ****
X--- 93,103 ----
X  	{ POT_HEALING, 0, POTION_SYM, 4, 1, UNDEF_BLESS },
X  	{ POT_EXTRA_HEALING, 0, POTION_SYM, 4, 1, UNDEF_BLESS },
X  	{ WAN_SLEEP, UNDEF_SPE, WAND_SYM, 1, 1, UNDEF_BLESS },
X+ #ifdef SPELLS
X+ 	/* always blessed, so it's guaranteed readable */
X+ 	{ SPE_HEALING, 0, SPBOOK_SYM, 1, 1, 1 },
X+ 	{ SPE_EXTRA_HEALING, 0, SPBOOK_SYM, 1, 1, 1 },
X+ #endif
X  	{ APPLE, 0, FOOD_SYM, 5, 1, 0 },
X  	{ 0, 0, 0, 0, 0, 0 }
X  };
X***************
X*** 542,553 ****
X  		 */
X  		if (undefined) {
X  #ifdef POLYSELF
X! 			int nocreate = STRANGE_OBJECT;
X  #  ifdef SPELLS
X! 			int nocreate2 = STRANGE_OBJECT;
X  #  endif
X  #endif
X! 			int nocreate3 = STRANGE_OBJECT;
X  
X  			while(obj->otyp == WAN_WISHING
X  #ifdef POLYSELF
X--- 547,558 ----
X  		 */
X  		if (undefined) {
X  #ifdef POLYSELF
X! 			static unsigned nocreate = STRANGE_OBJECT;
X  #  ifdef SPELLS
X! 			static unsigned nocreate2 = STRANGE_OBJECT;
X  #  endif
X  #endif
X! 			static unsigned nocreate3 = STRANGE_OBJECT;
X  
X  			while(obj->otyp == WAN_WISHING
X  #ifdef POLYSELF
X***************
X*** 601,607 ****
X  		}
X  
X  		obj->bknown = trop->trknown;
X! 		if(uses_known(obj)) obj->known = trop->trknown;
X  		/* not obj->dknown = 1; - let him look at it at least once */
X  		obj->cursed = 0;
X  		if(obj->olet == TOOL_SYM){ /* problem with multiple tools */
X--- 606,612 ----
X  		}
X  
X  		obj->bknown = trop->trknown;
X! 		if(objects[obj->otyp].oc_uses_known) obj->known = trop->trknown;
X  		/* not obj->dknown = 1; - let him look at it at least once */
X  		obj->cursed = 0;
X  		if(obj->olet == TOOL_SYM){ /* problem with multiple tools */
X*** src/Old/uhitm.c	Wed Sep 27 12:23:32 1989
X--- src/uhitm.c	Mon Sep 25 23:01:15 1989
X***************
X*** 26,32 ****
X  	mm.x = mon->mx;
X  	mm.y = mon->my;
X  	enexto(&mm, mm.x, mm.y, mon->data);
X! 	if (levl[mm.x][mm.y].mmask || mon->mhp <= 1) return (struct monst *)0;
X  	m2 = newmonst(0);
X  	*m2 = *mon;			/* copy condition of old monster */
X  	m2->nmon = fmon;
X--- 26,32 ----
X  	mm.x = mon->mx;
X  	mm.y = mon->my;
X  	enexto(&mm, mm.x, mm.y, mon->data);
X! 	if (MON_AT(mm.x, mm.y) || mon->mhp <= 1) return (struct monst *)0;
X  	m2 = newmonst(0);
X  	*m2 = *mon;			/* copy condition of old monster */
X  	m2->nmon = fmon;
X***************
X*** 62,68 ****
X  	m2->mnamelth = 0;
X  	m2->mdispl = 0;
X  	pmon(m2);	/* display the new monster */
X! 	levl[m2->mx][m2->my].mmask = 1;
X  	if (mon->mtame) (void) tamedog(m2, (struct obj *)0);
X  	return m2;
X  }
X--- 62,68 ----
X  	m2->mnamelth = 0;
X  	m2->mdispl = 0;
X  	pmon(m2);	/* display the new monster */
X! 	place_monster(m2, m2->mx, m2->my);
X  	if (mon->mtame) (void) tamedog(m2, (struct obj *)0);
X  	return m2;
X  }
X***************
X*** 98,104 ****
X  
X  		    if(Blind) pline("Wait!  There's a hidden monster there!");
X  		    else if(OBJ_AT(mtmp->mx, mtmp->my)) {
X! 			if(obj = o_at(mtmp->mx,mtmp->my))
X  				pline("Wait!  There's %s hiding under %s!",
X  					defmonnam(mtmp), doname(obj));
X  		    } else if (levl[mtmp->mx][mtmp->my].gmask == 1)
X--- 98,104 ----
X  
X  		    if(Blind) pline("Wait!  There's a hidden monster there!");
X  		    else if(OBJ_AT(mtmp->mx, mtmp->my)) {
X! 			if(obj = level.objects[mtmp->mx][mtmp->my])
X  				pline("Wait!  There's %s hiding under %s!",
X  					defmonnam(mtmp), doname(obj));
X  		    } else if (levl[mtmp->mx][mtmp->my].gmask == 1)
X***************
X*** 317,326 ****
X--- 317,331 ----
X  	 * 7) Possibly kill monster (must be done after 6a, 6b)
X  	 * 8) Instant-kill from poison (can happen anywhere between 5 and 9)
X  	 * 9) Hands not glowing (must be done after 7 and 8)
X+ 	 * The major problem is that since we don't want a "hit" message
X+ 	 * when the monster dies, we have to know how much damage it did
X+ 	 * _before_ outputting a hit message, but any messages associated with
X+ 	 * the damage don't come out until _after_ outputting a hit message.
X  	 */
X  	boolean hittxt = FALSE, destroyed = FALSE;
X  	boolean get_dmg_bonus = TRUE;
X  	boolean ispoisoned = FALSE, needpoismsg = FALSE, poiskilled = FALSE;
X+ 	boolean silvermsg = FALSE;
X  
X  	wakeup(mon);
X  	if(!obj) {
X***************
X*** 379,384 ****
X--- 384,397 ----
X  				obj->opoisoned)
X  			    ispoisoned = TRUE;
X  		    }
X+ 		    if(thrown && obj->otyp == SILVER_ARROW) {
X+ 			if (is_were(mon->data) || mon->data->mlet==S_VAMPIRE
X+ 			    || (mon->data->mlet==S_IMP && mon->data != &mons[PM_TENGU])
X+ 			    || is_demon(mon->data)) {
X+ 				silvermsg = TRUE;
X+ 				tmp += rnd(20);
X+ 			}
X+ 		    }
X  		}
X  	    } else if(obj->olet == POTION_SYM) {
X  			if (obj->quan > 1) setuwep(splitobj(obj, 1));
X***************
X*** 426,432 ****
X  				kludge("You hit %s with the %s egg%s.",
X  					mon_nam(mon),
X  					mons[obj->corpsenm].mname,
X! 					(obj->quan==1) ? "" : "s");
X  				hittxt = TRUE;
X  				pline("The egg%sn't live any more...",
X  					(obj->quan==1) ? " is" : "s are");
X--- 439,445 ----
X  				kludge("You hit %s with the %s egg%s.",
X  					mon_nam(mon),
X  					mons[obj->corpsenm].mname,
X! 					plur((long)obj->quan));
X  				hittxt = TRUE;
X  				pline("The egg%sn't live any more...",
X  					(obj->quan==1) ? " is" : "s are");
X***************
X*** 557,565 ****
X  		else	You("hit %s%s", mon_nam(mon), exclam(tmp));
X  	}
X  
X  	if (needpoismsg)
X  		kludge("The poison doesn't seem to affect %s.", mon_nam(mon));
X- 
X  	if (poiskilled) {
X  		pline("The poison was deadly...");
X  		xkilled(mon, 0);
X--- 570,585 ----
X  		else	You("hit %s%s", mon_nam(mon), exclam(tmp));
X  	}
X  
X+ 	if (silvermsg) {
X+ 		if (cansee(mon->mx, mon->my))
X+ 			pline("The silver arrow sears %s's flesh!",
X+ 				mon_nam(mon));
X+ 		else
X+ 			pline("Its flesh is seared!");
X+ 	}
X+ 
X  	if (needpoismsg)
X  		kludge("The poison doesn't seem to affect %s.", mon_nam(mon));
X  	if (poiskilled) {
X  		pline("The poison was deadly...");
X  		xkilled(mon, 0);
X***************
X*** 616,622 ****
X  	    ) {
X  	    struct monst *dtmp;
X  	    pline("Some hell-p has arrived!");
X- /*	    if((dtmp = mkmon_at(uasmon, u.ux, u.uy)))*/
X  /*	    if((dtmp = makemon(uasmon, u.ux, u.uy)))*/
X  	    if((dtmp = makemon(&mons[ndemon()], u.ux, u.uy)))
X  		(void)tamedog(dtmp, (struct obj *)0);
X--- 636,641 ----
X***************
X*** 1088,1094 ****
X  				sum[i] = damageum(mon,mattk);
X  			break;
X  		case AT_CLAW:
X! 			if (i==0 && uwep && humanoid(uasmon)) goto use_weapon;
X  # ifdef SEDUCE
X  			/* succubi/incubi are humanoid, but their _second_
X  			 * attack is AT_CLAW, not their first...
X--- 1107,1113 ----
X  				sum[i] = damageum(mon,mattk);
X  			break;
X  		case AT_CLAW:
X! 			if (i==0 && uwep && !cantwield(uasmon)) goto use_weapon;
X  # ifdef SEDUCE
X  			/* succubi/incubi are humanoid, but their _second_
X  			 * attack is AT_CLAW, not their first...
X*** src/Old/unixmain.c	Wed Sep 27 12:24:30 1989
X--- src/unixmain.c	Tue Sep 26 18:46:28 1989
X***************
X*** 1,7 ****
X  /*	SCCS Id: @(#)unixmain.c	3.0	89/01/13
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X! /* main.c - (Unix) version */
X  
X  #include <signal.h>
X  #include <pwd.h>
X--- 1,7 ----
X  /*	SCCS Id: @(#)unixmain.c	3.0	89/01/13
X  /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
X  /* NetHack may be freely redistributed.  See license for details. */
X! /* main.c - Unix NetHack */
X  
X  #include <signal.h>
X  #include <pwd.h>
X***************
X*** 8,35 ****
X  
X  #include "hack.h"
X  
X  int hackpid = 0;				/* current pid */
X  int locknum = 0;				/* max num of players */
X  #ifdef DEF_PAGER
X  char *catmore = 0;				/* default pager */
X  #endif
X- char SAVEF[PL_NSIZ + 11] = "save/";	/* save/99999player */
X- char *hname = 0;		/* name of the game (argv[0] of call) */
X- char obuf[BUFSIZ];	/* BUFSIZ is defined in stdio.h */
X  
X! int (*occupation)() = DUMMY;
X! int (*afternmv)() = DUMMY;
X  #ifdef CHDIR
X  static void chdirx();
X  #endif /* CHDIR */
X! static void whoami(), newgame();
X  
X  main(argc,argv)
X  int argc;
X  char *argv[];
X  {
X  	struct passwd *pw;
X- 	extern struct passwd *getpwuid();
X  	extern int x_maze_max, y_maze_max;
X  	register int fd;
X  #ifdef CHDIR
X--- 8,35 ----
X  
X  #include "hack.h"
X  
X+ char SAVEF[PL_NSIZ + 11] = "save/";	/* save/99999player */
X+ 
X+ char *hname = 0;		/* name of the game (argv[0] of call) */
X+ char obuf[BUFSIZ];	/* BUFSIZ is defined in stdio.h */
X  int hackpid = 0;				/* current pid */
X  int locknum = 0;				/* max num of players */
X  #ifdef DEF_PAGER
X  char *catmore = 0;				/* default pager */
X  #endif
X  
X! extern struct passwd *getpwuid();
X  #ifdef CHDIR
X  static void chdirx();
X  #endif /* CHDIR */
X! static void whoami();
X  
X+ int
X  main(argc,argv)
X  int argc;
X  char *argv[];
X  {
X  	struct passwd *pw;
X  	extern int x_maze_max, y_maze_max;
X  	register int fd;
X  #ifdef CHDIR
X***************
X*** 38,47 ****
X--- 38,62 ----
X  #ifdef COMPRESS
X  	char	cmd[80], old[80];
X  #endif
X+ 
X  	hname = argv[0];
X  	hackpid = getpid();
X  	(void) umask(0);
X  
X+ 	/*
X+ 	 *  Remember tty modes, to be restored on exit.
X+ 	 *
X+ 	 *  gettty() must be called before startup()
X+ 	 *    due to ordering of LI/CO settings
X+ 	 *  startup() must be called before initoptions()
X+ 	 *    due to ordering of graphics settings
X+ 	 */
X+ 	gettty();
X+ 	setbuf(stdout,obuf);
X+ 	startup();
X+ 	initoptions();
X+ 	whoami();
X+ 
X  #ifdef CHDIR			/* otherwise no chdir() */
X  	/*
X  	 * See if we must change directory to the playground.
X***************
X*** 50,58 ****
X  	 * The environment variable HACKDIR is overridden by a
X  	 *  -d command line option (must be the first option given)
X  	 */
X- 
X  	dir = getenv("HACKDIR");
X! 	if(argc > 1 && !strncmp(argv[1], "-d", 2)) {
X  		argc--;
X  		argv++;
X  		dir = argv[0]+2;
X--- 65,75 ----
X  	 * The environment variable HACKDIR is overridden by a
X  	 *  -d command line option (must be the first option given)
X  	 */
X  	dir = getenv("HACKDIR");
X! #endif
X! 	if(argc > 1) {
X! #ifdef CHDIR
X! 	    if (!strncmp(argv[1], "-d", 2)) {
X  		argc--;
X  		argv++;
X  		dir = argv[0]+2;
X***************
X*** 64,101 ****
X  		}
X  		if(!*dir)
X  		    error("Flag -d must be followed by a directory name.");
X! 	}
X  #endif /* CHDIR /**/
X  
X  	/*
X- 	 *  Remember tty modes, to be restored on exit.
X- 	 *
X- 	 *  Note that getty() must be called before startup() due to ordering
X- 	 *  of LI/CO settings, and startup() must be called before initoptions()
X- 	 *  due to ordering of graphics settings.
X- 	 */
X- 	gettty();
X- 	startup();
X- 	initoptions();
X- 	whoami();
X- 	/*
X  	 * Now we know the directory containing 'record' and
X  	 * may do a prscore().
X  	 */
X! 	if(argc > 1 && !strncmp(argv[1], "-s", 2)) {
X  #ifdef CHDIR
X  		chdirx(dir,0);
X  #endif
X  		prscore(argc, argv);
X! 		getret();
X  		settty(NULL);
X  		exit(0);
X  	}
X  
X  	/*
X! 	 * It seems he really wants to play.
X  	 */
X- 	setbuf(stdout,obuf);
X  	setrandom();
X  	cls();
X  	u.uhp = 1;	/* prevent RIP on early quits */
X--- 81,107 ----
X  		}
X  		if(!*dir)
X  		    error("Flag -d must be followed by a directory name.");
X! 	    } else
X  #endif /* CHDIR /**/
X  
X  	/*
X  	 * Now we know the directory containing 'record' and
X  	 * may do a prscore().
X  	 */
X! 	    if (!strncmp(argv[1], "-s", 2)) {
X  #ifdef CHDIR
X  		chdirx(dir,0);
X  #endif
X  		prscore(argc, argv);
X! 		if(isatty(1)) getret();
X  		settty(NULL);
X  		exit(0);
X+ 	    }
X  	}
X  
X  	/*
X! 	 * It seems you really want to play.
X  	 */
X  	setrandom();
X  	cls();
X  	u.uhp = 1;	/* prevent RIP on early quits */
X***************
X*** 123,140 ****
X  		argc--;
X  		switch(argv[0][1]){
X  #if defined(WIZARD) || defined(EXPLORE_MODE)
X! 		case 'D':
X  		case 'X':
X! 			pw = getpwuid(getuid());
X  # ifdef WIZARD
X! 			if(!strcmp(pw->pw_name, WIZARD))
X  				wizard = TRUE;
X! # endif
X! # if defined(WIZARD) && defined(EXPLORE_MODE)
X! 			else
X  # endif
X  # ifdef EXPLORE_MODE
X! 				discover = TRUE;
X  # endif
X  			break;
X  #endif
X--- 129,149 ----
X  		argc--;
X  		switch(argv[0][1]){
X  #if defined(WIZARD) || defined(EXPLORE_MODE)
X! # ifndef EXPLORE_MODE
X  		case 'X':
X! # endif
X! 		case 'D':
X  # ifdef WIZARD
X! 			pw = getpwuid(getuid());
X! 			if(!strcmp(pw->pw_name, WIZARD)) {
X  				wizard = TRUE;
X! 				break;
X! 			}
X! 			/* otherwise fall thru to discover */
X  # endif
X  # ifdef EXPLORE_MODE
X! 		case 'X':
X! 			discover = TRUE;
X  # endif
X  			break;
X  #endif
X***************
X*** 176,182 ****
X  	getmailstatus();
X  #endif
X  #ifdef WIZARD
X! 	if(wizard) Strcpy(plname, "wizard"); else
X  #endif
X  	if(!*plname || !strncmp(plname, "player", 4)
X  		    || !strncmp(plname, "games", 4))
X--- 185,193 ----
X  	getmailstatus();
X  #endif
X  #ifdef WIZARD
X! 	if (wizard)
X! 		Strcpy(plname, "wizard");
X! 	else
X  #endif
X  	if(!*plname || !strncmp(plname, "player", 4)
X  		    || !strncmp(plname, "games", 4))
X***************
X*** 202,217 ****
X  #endif /* WIZARD /**/
X  	setftty();
X  
X! 	/* 
X  	 * Initialisation of the boundaries of the mazes
X  	 * Both boundaries have to be even.
X  	 */
X! 	 
X  	x_maze_max = COLNO-1;
X! 	if (x_maze_max % 2) 
X  		x_maze_max--;
X  	y_maze_max = ROWNO-1;
X! 	if (y_maze_max % 2) 
X  		y_maze_max--;
X  
X  	/* initialize static monster strength array */
X--- 213,228 ----
X  #endif /* WIZARD /**/
X  	setftty();
X  
X! 	/*
X  	 * Initialisation of the boundaries of the mazes
X  	 * Both boundaries have to be even.
X  	 */
X! 
X  	x_maze_max = COLNO-1;
X! 	if (x_maze_max % 2)
X  		x_maze_max--;
X  	y_maze_max = ROWNO-1;
X! 	if (y_maze_max % 2)
X  		y_maze_max--;
X  
X  	/* initialize static monster strength array */
X***************
X*** 237,247 ****
X--- 248,267 ----
X  #endif
X  	if((fd = open(SAVEF,0)) >= 0 &&
X  	   (uptodate(fd) || unlink(SAVEF) == 666)) {
X+ #ifdef WIZARD
X+ 		/* Since wizard is actually flags.debug, restoring might
X+ 		 * overwrite it.
X+ 		 */
X+ 		boolean remember_wiz_mode = wizard;
X+ #endif
X  		(void) signal(SIGINT, (SIG_RET_TYPE) done1);
X  		pline("Restoring old save file...");
X  		(void) fflush(stdout);
X  		if(!dorecover(fd))
X  			goto not_recovered;
X+ #ifdef WIZARD
X+ 		if(!wizard && remember_wiz_mode) wizard = TRUE;
X+ #endif
X  		pline("Hello %s, welcome to NetHack!", plname);
X  		/* get shopkeeper set properly if restore is in shop */
X  		(void) inshop();
X***************
X*** 282,443 ****
X  
X  	initrack();
X  
X! 	for(;;) {
X! 		if(flags.move) {	/* actual time passed */
X! 
X! #ifdef SOUNDS
X! 			dosounds();
X! #endif
X! 			settrack();
X! 
X! 			if(moves%2 == 0 ||
X! 			  (!(Fast & ~INTRINSIC) && (!Fast || rn2(3)))) {
X! 				movemon();
X! #ifdef HARD
X! 				if(!rn2(u.udemigod?25:(dlevel>30)?50:70))
X! #else
X! 				if(!rn2(70))
X! #endif
X! 				    (void) makemon((struct permonst *)0, 0, 0);
X! 			}
X! 			if(Glib) glibr();
X! 			timeout();
X! 			++moves;
X! #ifdef THEOLOGY
X! 			if (u.ublesscnt)  u.ublesscnt--;
X! #endif
X! 			if(flags.time) flags.botl = 1;
X! #ifdef POLYSELF
X! 			if(u.mtimedone)
X! 			    if(u.mh < 1) rehumanize();
X! 			else
X! #endif
X! 			    if(u.uhp < 1) {
X! 				You("die...");
X! 				done(DIED);
X! 			    }
X! #ifdef POLYSELF
X! 			if (u.mtimedone) {
X! 			    if (u.mh < u.mhmax) {
X! 				if (Regeneration || !(moves%20)) {
X! 					flags.botl = 1;
X! 					u.mh++;
X! 				}
X! 			    }
X! 			}
X! #endif
X! 			if(u.uhp < u.uhpmax) {
X! 				if(u.ulevel > 9) {
X! 				    int heal;
X! 
X! 				    if(HRegeneration || !(moves%3)) {
X! 					flags.botl = 1;
X! 					if (ACURR(A_CON) <= 12) heal = 1;
X! 					else heal = rnd((int) ACURR(A_CON)-12);
X! 					if (heal > u.ulevel-9) heal = u.ulevel-9;
X! 					u.uhp += heal;
X! 					if(u.uhp > u.uhpmax)
X! 					    u.uhp = u.uhpmax;
X! 				    }
X! 				} else if(HRegeneration ||
X! 				      (!(moves%((MAXULEV+12)/(u.ulevel+2)+1)))) {
X! 					flags.botl = 1;
X! 					u.uhp++;
X! 				}
X! 			}
X! #ifdef SPELLS
X! 			if ((u.uen<u.uenmax) && (!(moves%(19-ACURR(A_INT)/2)))) {
X! 				u.uen += rn2((int)ACURR(A_WIS)/5 + 1) + 1;
X! 				if (u.uen > u.uenmax)  u.uen = u.uenmax;
X! 				flags.botl = 1;
X! 			}
X! #endif
X! 			if(Teleportation && !rn2(85)) tele();
X! #ifdef POLYSELF
X! 			if(Polymorph && !rn2(100)) polyself();
X! 			if(u.ulycn >= 0 && !rn2(80 - (20 * night())))
X! 				you_were();
X! #endif
X! 			if(Searching && multi >= 0) (void) dosearch0(1);
X! 			hatch_eggs();
X! 			gethungry();
X! 			invault();
X! 			amulet();
X! #ifdef HARD
X! 			if (!rn2(40+(int)(ACURR(A_DEX)*3))) u_wipe_engr(rnd(3));
X! 			if (u.udemigod) {
X! 
X! 				if(u.udg_cnt) u.udg_cnt--;
X! 				if(!u.udg_cnt) {
X! 
X! 					intervene();
X! 					u.udg_cnt = rn1(200, 50);
X! 				}
X! 			}
X! #endif
X! 			restore_attrib();
X! 		}
X! 		if(multi < 0) {
X! 			if(!++multi){
X! 				pline(nomovemsg ? nomovemsg :
X! 					"You can move again.");
X! 				nomovemsg = 0;
X! 				if(afternmv) (*afternmv)();
X! 				afternmv = 0;
X! 			}
X! 		}
X! 
X! 		find_ac();
X! 		if(!flags.mv || Blind)
X! 		{
X! 			seeobjs();
X! 			seemons();
X! 			seeglds();
X! 			nscr();
X! 		}
X! 		if(flags.botl || flags.botlx) bot();
X! 
X! 		flags.move = 1;
X! 
X! 		if(multi >= 0 && occupation) {
X! 
X! 			if(monster_nearby())
X! 				stop_occupation();
X! 			else if ((*occupation)() == 0)
X! 				occupation = 0;
X! 			continue;
X! 		}
X! 
X! 		if((u.uhave_amulet || Clairvoyant) && 
X! #ifdef ENDGAME
X! 			dlevel != ENDLEVEL &&
X! #endif
X! 			!(moves%15) && !rn2(2)) do_vicinity_map();
X! 
X! 		u.umoved = FALSE;
X! 		if(multi > 0) {
X! 			lookaround();
X! 			if(!multi) {	/* lookaround may clear multi */
X! 				flags.move = 0;
X! 				continue;
X! 			}
X! 			if(flags.mv) {
X! 				if(multi < COLNO && !--multi)
X! 					flags.mv = flags.run = 0;
X! 				domove();
X! 			} else {
X! 				--multi;
X! 				rhack(save_cm);
X! 			}
X! 		} else if(multi == 0) {
X! #ifdef MAIL
X! 			ckmailstatus();
X! #endif
X! 			rhack(NULL);
X! 		}
X! 		if(multi && multi%7 == 0)
X! 			(void) fflush(stdout);
X! 	}
X  }
X  
X  void
X--- 302,309 ----
X  
X  	initrack();
X  
X! 	moveloop();
X! 	return(0);
X  }
X  
X  void
X***************
X*** 458,469 ****
X   * It may still contain a suffix denoting pl_character.
X   */
X  void
X! askname(){
X! register int c,ct;
X  	Printf("\nWho are you? ");
X  	(void) fflush(stdout);
X  	ct = 0;
X! 	while((c = Getchar()) != '\n'){
X  		if(c == EOF) error("End of input\n");
X  		/* some people get confused when their erase char is not ^H */
X  		if(c == '\010') {
X--- 324,336 ----
X   * It may still contain a suffix denoting pl_character.
X   */
X  void
X! askname() {
X! 	register int c, ct;
X! 
X  	Printf("\nWho are you? ");
X  	(void) fflush(stdout);
X  	ct = 0;
X! 	while((c = Getchar()) != '\n') {
X  		if(c == EOF) error("End of input\n");
X  		/* some people get confused when their erase char is not ^H */
X  		if(c == '\010') {
X***************
X*** 472,492 ****
X  		}
X  		if(c != '-')
X  		if(c < 'A' || (c > 'Z' && c < 'a') || c > 'z') c = '_';
X! 		if(ct < sizeof(plname)-1) plname[ct++] = c;
X  	}
X  	plname[ct] = 0;
X  	if(ct == 0) askname();
X  }
X  
X- /*VARARGS1*/
X- void
X- impossible(s,x1,x2)
X- register char *s, *x1, *x2;
X- {
X- 	pline(s,x1,x2);
X- 	pline("Program in disorder - perhaps you'd better Quit.");
X- }
X- 
X  #ifdef CHDIR
X  static void
X  chdirx(dir, wr)
X--- 339,351 ----
X  		}
X  		if(c != '-')
X  		if(c < 'A' || (c > 'Z' && c < 'a') || c > 'z') c = '_';
X! 		if(ct < sizeof(plname)-1)
X! 			plname[ct++] = c;
X  	}
X  	plname[ct] = 0;
X  	if(ct == 0) askname();
X  }
X  
X  #ifdef CHDIR
X  static void
X  chdirx(dir, wr)
X***************
X*** 515,521 ****
X  		error("Cannot chdir to %s.", dir);
X  	}
X  
X! 	/* warn the player if he cannot write the record file */
X  	/* perhaps we should also test whether . is writable */
X  	/* unfortunately the access systemcall is worthless */
X  	if(wr) {
X--- 374,380 ----
X  		error("Cannot chdir to %s.", dir);
X  	}
X  
X! 	/* warn the player if we can't write the record file */
X  	/* perhaps we should also test whether . is writable */
X  	/* unfortunately the access systemcall is worthless */
X  	if(wr) {
X***************
X*** 532,550 ****
X  }
X  #endif /* CHDIR /**/
X  
X- void
X- stop_occupation()
X- {
X- 	if(occupation) {
X- 		You("stop %s.", occtxt);
X- 		occupation = 0;
X- #ifdef REDO
X- 		multi = 0;
X- 		pushch(0);		
X- #endif
X- 	}
X- }
X- 
X  static void
X  whoami() {
X  	/*
X--- 391,396 ----
X***************
X*** 555,561 ****
X  	 * If everything fails, or if the resulting name is some generic
X  	 * account like "games", "play", "player", "hack" then eventually
X  	 * we'll ask him.
X! 	 * Note that we trust him here; it is possible to play under
X  	 * somebody else's name.
X  	 */
X  	register char *s;
X--- 401,407 ----
X  	 * If everything fails, or if the resulting name is some generic
X  	 * account like "games", "play", "player", "hack" then eventually
X  	 * we'll ask him.
X! 	 * Note that we trust the user here; it is possible to play under
X  	 * somebody else's name.
X  	 */
X  	register char *s;
X***************
X*** 566,607 ****
X  		(void) strncpy(plname, s, sizeof(plname)-1);
X  	if(!*plname && (s = getlogin()))
X  		(void) strncpy(plname, s, sizeof(plname)-1);
X- }
X- 
X- static void
X- newgame() {
X- 	fobj = fcobj = invent = 0;
X- 	fmon = fallen_down = 0;
X- 	ftrap = 0;
X- 	fgold = 0;
X- 	flags.ident = 1;
X- 
X- 	init_objects();
X- 	u_init();
X- 
X- 	(void) signal(SIGINT, (SIG_RET_TYPE) done1);
X- 
X- 	mklev();
X- 	u.ux = xupstair;
X- 	u.uy = yupstair;
X- 	(void) inshop();
X- 
X- 	setsee();
X- 	flags.botlx = 1;
X- 
X- 	/* Move the monster from under you or else
X- 	 * makedog() will fail when it calls makemon().
X- 	 * 			- ucsfcgl!kneller
X- 	 */
X- 	if(levl[u.ux][u.uy].mmask) mnexto(m_at(u.ux, u.uy));
X- 
X- 	(void) makedog();
X- 	seemons();
X- #ifdef NEWS
X- 	if(flags.nonews || !readnews())
X- 		/* after reading news we did docrt() already */
X- #endif
X- 		docrt();
X- 
X- 	return;
X  }
X--- 412,415 ----
X*** src/Old/unixtty.c	Wed Sep 27 12:24:56 1989
X--- src/unixtty.c	Sun Sep 17 14:26:48 1989
X***************
X*** 10,15 ****
X--- 10,16 ----
X  /* block some unused #defines to avoid overloading some cpp's */
X  #define MONATTK_H
X  #define ONAMES_H
X+ #define NEED_VARARGS
X  #include "hack.h"
X  
X  /*
X***************
X*** 187,199 ****
X  
X  /* fatal error */
X  /*VARARGS1*/
X  void
X! error(s, x, y)
X! char *s, *x, *y;
X! {
X  	if(settty_needed)
X  		settty(NULL);
X! 	Printf(s,x,y);
X  	(void) putchar('\n');
X  	exit(1);
X  }
X--- 188,202 ----
X  
X  /* fatal error */
X  /*VARARGS1*/
X+ 
X  void
X! error VA_DECL(char *,s)
X! 	VA_START(s);
X! 	VA_INIT(s, char *);
X  	if(settty_needed)
X  		settty(NULL);
X! 	Vprintf(s,VA_ARGS);
X  	(void) putchar('\n');
X+ 	VA_END();
X  	exit(1);
X  }
X*** src/Old/unixunix.c	Wed Sep 27 12:25:13 1989
X--- src/unixunix.c	Tue Sep 26 18:51:38 1989
X***************
X*** 27,33 ****
X  void
X  setrandom()
X  {
X! #ifdef SYSV
X  	(void) Srand((long) time ((time_t *) 0));
X  #else
X  #ifdef ULTRIX
X--- 27,33 ----
X  void
X  setrandom()
X  {
X! #if defined(SYSV) || defined(DGUX)
X  	(void) Srand((long) time ((time_t *) 0));
X  #else
X  #ifdef ULTRIX
X*** src/Old/vault.c	Wed Sep 27 12:25:28 1989
X--- src/vault.c	Mon Sep 25 21:30:30 1989
X***************
X*** 237,246 ****
X  	fcp->ftyp = typ;
X  newpos:
X  	if(EGD->gddone) nx = ny = 0;
X! 	levl[guard->mx][guard->my].mmask = 0;
X! 	levl[nx][ny].mmask = 1;
X! 	guard->mx = nx;
X! 	guard->my = ny;
X  	pmon(guard);
X  	restfakecorr();
X  	return(1);
X--- 237,244 ----
X  	fcp->ftyp = typ;
X  newpos:
X  	if(EGD->gddone) nx = ny = 0;
X! 	remove_monster(guard->mx, guard->my);
X! 	place_monster(guard, nx, ny);
X  	pmon(guard);
X  	restfakecorr();
X  	return(1);
X***************
X*** 270,277 ****
X  	if (!u.ugold) return;
X  
X  	if (u.uinvault) {
X! 	    Your("%ld Zorkmids goes into the Magic Memory Vault.",
X! 		u.ugold);
X  	    mkgold(u.ugold, u.ux, u.uy);
X  	    u.ugold = 0L;
X  	} else if (guard) {
X--- 268,275 ----
X  	if (!u.ugold) return;
X  
X  	if (u.uinvault) {
X! 	    Your("%ld zorkmid%s goes into the Magic Memory Vault.",
X! 		u.ugold, plur(u.ugold));
X  	    mkgold(u.ugold, u.ux, u.uy);
X  	    u.ugold = 0L;
X  	} else if (guard) {
X*** src/Old/version.c	Wed Sep 27 12:25:42 1989
X--- src/version.c	Sat Sep 16 17:54:27 1989
X***************
X*** 38,43 ****
X--- 38,46 ----
X  #ifdef UNIX
X  		"Unix",
X  #endif
X+ #ifdef VMS
X+ 		"VMS",
X+ #endif
X  		VERSION,
X  #ifndef BETA
X  		PATCHLEVEL,
X*** src/Old/weapon.c	Wed Sep 27 12:25:56 1989
X--- src/weapon.c	Fri Sep 15 00:51:04 1989
X***************
X*** 171,185 ****
X  #ifdef TOLKIEN
X  static const int rwep[] =
X  	{ DWARVISH_SPEAR, ELVEN_SPEAR, SPEAR, ORCISH_SPEAR, JAVELIN,
X! 	  SHURIKEN, ELVEN_ARROW, ARROW, ORCISH_ARROW, CROSSBOW_BOLT,
X! 	  ELVEN_DAGGER, DAGGER, ORCISH_DAGGER, KNIFE, ROCK, LOADSTONE,
X! 	  LUCKSTONE, DART, BOOMERANG, CREAM_PIE
X  	  /* note: CREAM_PIE should NOT be #ifdef KOPS */
X  	  };
X  #else
X  static const int rwep[] =
X! 	{ SPEAR, JAVELIN, SHURIKEN, ARROW, CROSSBOW_BOLT, DAGGER, KNIFE,
X! 	  ROCK, LOADSTONE, LUCKSTONE, DART, BOOMERANG, CREAM_PIE
X  	  /* note: CREAM_PIE should NOT be #ifdef KOPS */
X  	  };
X  #endif
X--- 171,185 ----
X  #ifdef TOLKIEN
X  static const int rwep[] =
X  	{ DWARVISH_SPEAR, ELVEN_SPEAR, SPEAR, ORCISH_SPEAR, JAVELIN,
X! 	  SHURIKEN, SILVER_ARROW, ELVEN_ARROW, ARROW, ORCISH_ARROW,
X! 	  CROSSBOW_BOLT, ELVEN_DAGGER, DAGGER, ORCISH_DAGGER, KNIFE, ROCK,
X! 	  LOADSTONE, LUCKSTONE, DART, BOOMERANG, CREAM_PIE
X  	  /* note: CREAM_PIE should NOT be #ifdef KOPS */
X  	  };
X  #else
X  static const int rwep[] =
X! 	{ SPEAR, JAVELIN, SHURIKEN, SILVER_ARROW, ARROW, CROSSBOW_BOLT,
X! 	  DAGGER, KNIFE, ROCK, LOADSTONE, LUCKSTONE, DART, BOOMERANG, CREAM_PIE
X  	  /* note: CREAM_PIE should NOT be #ifdef KOPS */
X  	  };
X  #endif
X*** src/Old/were.c	Wed Sep 27 12:26:12 1989
X--- src/were.c	Thu Sep 14 14:34:44 1989
X***************
X*** 10,25 ****
X  {
X  	register int pm = monsndx(mon->data);
X  
X- 	if(Protection_from_shape_changers) return;
X  	if(is_were(mon->data))
X  	    if(is_human(mon->data)) {
X  		if(!rn2(50-(night()*20)) || flags.moonphase == FULL_MOON) {
X  		    new_were(mon);
X! 		    if(pm != PM_WERERAT && flags.soundok)
X  			You("hear a %s howling at the moon.",
X  			      pm == PM_WEREJACKAL ? "jackal" : "wolf");
X  		}
X! 	    } else if(!rn2(30)) new_were(mon);
X  }
X  
X  static int
X--- 10,25 ----
X  {
X  	register int pm = monsndx(mon->data);
X  
X  	if(is_were(mon->data))
X  	    if(is_human(mon->data)) {
X+ 		if(Protection_from_shape_changers) return;
X  		if(!rn2(50-(night()*20)) || flags.moonphase == FULL_MOON) {
X  		    new_were(mon);
X! 		    if(mons[pm].msound == MS_BARK && flags.soundok)
X  			You("hear a %s howling at the moon.",
X  			      pm == PM_WEREJACKAL ? "jackal" : "wolf");
X  		}
X! 	    } else if(!rn2(30) || Protection_from_shape_changers) new_were(mon);
X  }
X  
X  static int
X***************
X*** 69,75 ****
X  	register struct monst *mtmp;
X  	boolean success = FALSE;
X  
X! 	if(Protection_from_shape_changers)
X  		return FALSE;
X  	for(i = rnd(5); i > 0; i--) {
X  	   switch(pm) {
X--- 69,75 ----
X  	register struct monst *mtmp;
X  	boolean success = FALSE;
X  
X! 	if(Protection_from_shape_changers && !yours)
X  		return FALSE;
X  	for(i = rnd(5); i > 0; i--) {
X  	   switch(pm) {
X*** src/Old/wield.c	Wed Sep 27 12:26:26 1989
X--- src/wield.c	Mon Sep 25 23:01:52 1989
X***************
X*** 209,215 ****
X  	} else
X  		Sprintf(buf, "Your %s%s",
X  			is_sword(obj) ? "sword" : "weapon",
X! 			((obj->quan > 1) ? "s" : ""));
X  	Strcat(buf, (obj->quan==1) ? " is" : " are");
X  #ifdef POLYSELF
X  	Sprintf(eos(buf), " welded to your %s!",
X--- 209,215 ----
X  	} else
X  		Sprintf(buf, "Your %s%s",
X  			is_sword(obj) ? "sword" : "weapon",
X! 			plur((long)obj->quan));
X  	Strcat(buf, (obj->quan==1) ? " is" : " are");
X  #ifdef POLYSELF
X  	Sprintf(eos(buf), " welded to your %s!",
X*** src/Old/wizard.c	Wed Sep 27 12:26:39 1989
X--- src/wizard.c	Thu Sep 14 20:44:26 1989
X***************
X*** 80,93 ****
X  			    mnexto(mtmp);
X  			    return(0);
X  			}
X! 			if(!levl[otmp->ox][otmp->oy].mmask ||
X  			    (mtmp->mx == otmp->ox && mtmp->my == otmp->oy)) {
X  
X  			    /* teleport to it and pick it up */
X! 			    levl[mtmp->mx][mtmp->my].mmask = 0;
X! 			    levl[otmp->ox][otmp->oy].mmask = 1;
X! 			    mtmp->mx = otmp->ox;
X! 			    mtmp->my = otmp->oy;
X  			    freeobj(otmp);
X  			    mpickobj(mtmp, otmp);
X  			    pmon(mtmp);
X--- 80,91 ----
X  			    mnexto(mtmp);
X  			    return(0);
X  			}
X! 			if(!MON_AT(otmp->ox, otmp->oy) ||
X  			    (mtmp->mx == otmp->ox && mtmp->my == otmp->oy)) {
X  
X  			    /* teleport to it and pick it up */
X! 			    remove_monster(mtmp->mx, mtmp->my);
X! 			    place_monster(mtmp, otmp->ox, otmp->oy);
X  			    freeobj(otmp);
X  			    mpickobj(mtmp, otmp);
X  			    pmon(mtmp);
X*** src/Old/worm.c	Wed Sep 27 12:26:55 1989
X--- src/worm.c	Sun Sep 17 12:28:48 1989
X***************
X*** 47,53 ****
X  register struct wseg *wtmp;
X  {
X  	if (mtmp->mx != wtmp->wx || mtmp->my != wtmp->wy)
X! 		levl[wtmp->wx][wtmp->wy].mmask = 0;
X  	if(wtmp->wdispl) newsym(wtmp->wx, wtmp->wy);
X  	free((genericptr_t) wtmp);
X  }
X--- 47,53 ----
X  register struct wseg *wtmp;
X  {
X  	if (mtmp->mx != wtmp->wx || mtmp->my != wtmp->wy)
X! 		remove_monster(wtmp->wx, wtmp->wy);
X  	if(wtmp->wdispl) newsym(wtmp->wx, wtmp->wy);
X  	free((genericptr_t) wtmp);
X  }
X***************
X*** 181,187 ****
X  	/* sometimes the tail end dies */
X  	if(rn2(3) || !getwn(mtmp2)){
X  		monfree(mtmp2);
X! 		levl[mtmp2->mx][mtmp2->my].mmask = 1;
X  			/* since mtmp is still on that spot */
X  		tmp2 = 0;
X  	} else {
X--- 181,187 ----
X  	/* sometimes the tail end dies */
X  	if(rn2(3) || !getwn(mtmp2)){
X  		monfree(mtmp2);
X! 		place_worm_seg(mtmp, mtmp2->mx, mtmp2->my);
X  			/* since mtmp is still on that spot */
X  		tmp2 = 0;
X  	} else {
X***************
X*** 196,216 ****
X  		remseg(mtmp, wtmp->nseg);
X  		wtmp->nseg = 0;
X  		if(tmp2) {
X! 		    You("cut the worm in half.");
X  		/* devalue the monster level of both halves of the worm */
X  		    mtmp->m_lev = (mtmp->m_lev <= 2) ? 2 : mtmp->m_lev - 2;
X  		    mtmp2->m_lev = mtmp->m_lev;
X  		/* calculate the mhp on the new (lower) monster level */
X  		    mtmp2->mhpmax = mtmp2->mhp = d((int)mtmp2->m_lev, 8);
X! 		    mtmp2->mx = wtmp->wx;
X! 		    mtmp2->my = wtmp->wy;
X! 		    levl[mtmp2->mx][mtmp2->my].mmask = 1;
X  		    mtmp2->nmon = fmon;
X  		    fmon = mtmp2;
X  		    mtmp2->mdispl = 0;
X  		    pmon(mtmp2);
X  		} else {
X! 			You("cut off part of the worm's tail.");
X  			remseg(mtmp, wtmp);
X  		}
X  		mtmp->mhp /= 2;
X--- 196,215 ----
X  		remseg(mtmp, wtmp->nseg);
X  		wtmp->nseg = 0;
X  		if(tmp2) {
X! 		    kludge("You cut %s in half.", mon_nam(mtmp));
X  		/* devalue the monster level of both halves of the worm */
X  		    mtmp->m_lev = (mtmp->m_lev <= 2) ? 2 : mtmp->m_lev - 2;
X  		    mtmp2->m_lev = mtmp->m_lev;
X  		/* calculate the mhp on the new (lower) monster level */
X  		    mtmp2->mhpmax = mtmp2->mhp = d((int)mtmp2->m_lev, 8);
X! 		    place_monster(mtmp2, wtmp->wx, wtmp->wy);
X  		    mtmp2->nmon = fmon;
X  		    fmon = mtmp2;
X  		    mtmp2->mdispl = 0;
X  		    pmon(mtmp2);
X  		} else {
X! 			if (Blind) You("cut off part of its tail.");
X! 			else You("cut off part of %s's tail.", mon_nam(mtmp));
X  			remseg(mtmp, wtmp);
X  		}
X  		mtmp->mhp /= 2;
X*** src/Old/worn.c	Wed Sep 27 12:27:10 1989
X--- src/worn.c	Mon Sep 25 21:35:28 1989
X***************
X*** 138,144 ****
X  
X  	if (obj->otyp != DRAGON_SCALE_MAIL) return;
X  	switch(obj->corpsenm) {
X! 		case PM_GREY_DRAGON:
X  			mask = &Antimagic;
X  			break;
X  		case PM_RED_DRAGON:
X--- 138,144 ----
X  
X  	if (obj->otyp != DRAGON_SCALE_MAIL) return;
X  	switch(obj->corpsenm) {
X! 		case PM_GRAY_DRAGON:
X  			mask = &Antimagic;
X  			break;
X  		case PM_RED_DRAGON:
X*** src/Old/write.c	Wed Sep 27 12:27:23 1989
X--- src/write.c	Mon Sep 25 21:30:53 1989
X***************
X*** 96,102 ****
X  	getlin(namebuf);
X  	if(namebuf[0] == '\033' || !namebuf[0])
X  		return;
X! 	Strcpy(scrbuf,"scroll of ");
X  	Strcat(scrbuf,namebuf);
X  	newscroll = readobjnam(scrbuf);
X  
X--- 96,104 ----
X  	getlin(namebuf);
X  	if(namebuf[0] == '\033' || !namebuf[0])
X  		return;
X! 	scrbuf[0] = '\0';
X! 	if(strncmp(namebuf,"scroll of ",10) != 0)
X! 		Strcpy(scrbuf,"scroll of ");
X  	Strcat(scrbuf,namebuf);
X  	newscroll = readobjnam(scrbuf);
X  
X*** src/Old/zap.c	Wed Sep 27 12:27:39 1989
X--- src/zap.c	Tue Sep 26 23:23:24 1989
X***************
X*** 145,150 ****
X--- 145,156 ----
X  		break;
X  #endif
X  	case WAN_OPENING:
X+ 		if(u.uswallow && mtmp == u.ustuck) {
X+ 			if (Blind) pline("Its mouth opens!");
X+ 			else pline("%s opens its mouth!", Monnam(mtmp));
X+ 			regurgitates(mtmp);
X+ 			break;
X+ 		}
X  	case WAN_LOCKING:
X  #ifdef SPELLS
X  	case SPE_KNOCK:
X***************
X*** 189,195 ****
X  				montype = PM_UNARMORED_SOLDIER;
X  #endif
X  			mons[montype].pxlth += nl;
X! 			mtmp = mkmon_at(mons[montype].mname, x, y);
X  			mons[montype].pxlth -= nl;
X  			if (mtmp) {
X  				/* Monster retains its name */
X--- 195,201 ----
X  				montype = PM_UNARMORED_SOLDIER;
X  #endif
X  			mons[montype].pxlth += nl;
X! 			mtmp = makemon(&mons[montype], x, y);
X  			mons[montype].pxlth -= nl;
X  			if (mtmp) {
X  				/* Monster retains its name */
X***************
X*** 220,225 ****
X--- 226,234 ----
X  #ifdef MAIL
X  	    obj->otyp == SCR_MAIL ||
X  #endif
X+ #ifdef TUTTI_FRUTTI
X+ 	    obj->otyp == SLIME_MOLD ||
X+ #endif
X  	    obj->otyp == KEY || obj->otyp == SKELETON_KEY ||
X  	    obj->otyp == LARGE_BOX || obj->otyp == CHEST))
X  		obj->spe = (obj->olet == WAND_SYM) ? -1 : 0;
X***************
X*** 286,292 ****
X  			otmp2->opoisoned = 1;
X  
X  		/* Turn dragon corpses into dragon armors */
X! 		if (obj->otyp == CORPSE && obj->corpsenm >= PM_GREY_DRAGON
X  				&& obj->corpsenm <= PM_YELLOW_DRAGON) {
X  			if (!rn2(10)) { /* Random failure */
X  				otmp2->otyp = TIN;
X--- 295,301 ----
X  			otmp2->opoisoned = 1;
X  
X  		/* Turn dragon corpses into dragon armors */
X! 		if (obj->otyp == CORPSE && obj->corpsenm >= PM_GRAY_DRAGON
X  				&& obj->corpsenm <= PM_YELLOW_DRAGON) {
X  			if (!rn2(10)) { /* Random failure */
X  				otmp2->otyp = TIN;
X***************
X*** 781,787 ****
X  			if(u.uswallow) {
X  				register struct monst *mtmp = u.ustuck;
X  
X! 				You("pierce %s's stomach wall!", mon_nam(mtmp));
X  				mtmp->mhp = 1;	/* almost dead */
X  				regurgitates(mtmp);
X  				break;
X--- 790,798 ----
X  			if(u.uswallow) {
X  				register struct monst *mtmp = u.ustuck;
X  
X! 				if (Blind) You("pierce its stomach wall!");
X! 				else You("pierce %s's stomach wall!",
X! 					mon_nam(mtmp));
X  				mtmp->mhp = 1;	/* almost dead */
X  				regurgitates(mtmp);
X  				break;
X***************
X*** 939,945 ****
X--- 950,960 ----
X  
X  	if(sym) {
X  		tmp_at(-1, sym);	/* open call */
X+ #ifdef TEXTCOLOR
X+ 		tmp_at(-3, (int)objects[obj->otyp].oc_color);
X+ #else
X  		tmp_at(-3, (int)AT_OBJ);
X+ #endif
X  	}
X  	while(range-- > 0) {
X  #ifdef STRONGHOLD
X***************
X*** 949,955 ****
X  		bhitpos.y += ddy;
X  #ifdef STRONGHOLD
X  		x = bhitpos.x; y = bhitpos.y;
X! 		if (find_drawbridge(&x,&y))
X  		    switch (obj->otyp) {
X  			case WAN_OPENING:
X  # ifdef SPELLS
X--- 964,970 ----
X  		bhitpos.y += ddy;
X  #ifdef STRONGHOLD
X  		x = bhitpos.x; y = bhitpos.y;
X! 		if (find_drawbridge(&x,&y) && !sym)
X  		    switch (obj->otyp) {
X  			case WAN_OPENING:
X  # ifdef SPELLS
X***************
X*** 970,976 ****
X  			    destroy_drawbridge(x,y);
X  		    }
X  #endif /* STRONGHOLD /**/
X! 		if(levl[bhitpos.x][bhitpos.y].mmask){
X  			mtmp = m_at(bhitpos.x,bhitpos.y);
X  			if(sym) {
X  				tmp_at(-1, -1);	/* close call */
X--- 985,991 ----
X  			    destroy_drawbridge(x,y);
X  		    }
X  #endif /* STRONGHOLD /**/
X! 		if(MON_AT(bhitpos.x, bhitpos.y)){
X  			mtmp = m_at(bhitpos.x,bhitpos.y);
X  			if(sym) {
X  				tmp_at(-1, -1);	/* close call */
X***************
X*** 995,1001 ****
X  		    if(hitanything)	range--;
X  		}
X  		typ = levl[bhitpos.x][bhitpos.y].typ;
X! 		if(IS_DOOR(typ) || typ == SDOOR) {
X  		    switch (obj->otyp) {
X  			case WAN_OPENING:
X  			case WAN_LOCKING:
X--- 1010,1016 ----
X  		    if(hitanything)	range--;
X  		}
X  		typ = levl[bhitpos.x][bhitpos.y].typ;
X! 		if((IS_DOOR(typ) || typ == SDOOR) && !sym) {
X  		    switch (obj->otyp) {
X  			case WAN_OPENING:
X  			case WAN_LOCKING:
X***************
X*** 1065,1071 ****
X  		dy = ydir[i];
X  		bhitpos.x += dx;
X  		bhitpos.y += dy;
X! 		if(levl[bhitpos.x][bhitpos.y].mmask){
X  			tmp_at(-1,-1);
X  			return(m_at(bhitpos.x,bhitpos.y));
X  		}
X--- 1080,1086 ----
X  		dy = ydir[i];
X  		bhitpos.x += dx;
X  		bhitpos.y += dy;
X! 		if(MON_AT(bhitpos.x, bhitpos.y)){
X  			tmp_at(-1,-1);
X  			return(m_at(bhitpos.x,bhitpos.y));
X  		}
X***************
X*** 1075,1082 ****
X  			break;
X  		}
X  		if(bhitpos.x == u.ux && bhitpos.y == u.uy) { /* ct == 9 */
X! 			if(rn2(20) >= ACURR(A_DEX)){ /* we hit ourselves */
X! 				(void) thitu(10, rnd(10), "boomerang");
X  				break;
X  			} else {	/* we catch it */
X  				tmp_at(-1,-1);
X--- 1090,1099 ----
X  			break;
X  		}
X  		if(bhitpos.x == u.ux && bhitpos.y == u.uy) { /* ct == 9 */
X! 			if(Fumbling || rn2(20) >= ACURR(A_DEX)){
X! 				/* we hit ourselves */
X! 				(void) thitu(10, rnd(10), (struct obj *)0,
X! 					"boomerang");
X  				break;
X  			} else {	/* we catch it */
X  				tmp_at(-1,-1);
X***************
X*** 1186,1196 ****
X  }
X  
X  /*
X!  * burn scrolls on floor at position x,y
X!  * return the number of scrolls burned
X   */
X  static int
X! burn_floor_scrolls(x, y)
X  int x, y;
X  {
X  	register struct obj *obj, *obj2;
X--- 1203,1213 ----
X  }
X  
X  /*
X!  * burn scrolls and spell books on floor at position x,y
X!  * return the number of scrolls and spell books burned
X   */
X  static int
X! burn_floor_paper(x, y)
X  int x, y;
X  {
X  	register struct obj *obj, *obj2;
X***************
X*** 1200,1206 ****
X  	for(obj = fobj; obj; obj = obj2) {
X  	    obj2 = obj->nobj;
X  	    /* Bug fix - KAA */
X! 	    if(obj->ox == x && obj->oy == y && obj->olet == SCROLL_SYM) {
X  		scrquan = obj->quan;
X  		for(i = 1; i <= scrquan ; i++)
X  		    if(!rn2(3))  {
X--- 1217,1228 ----
X  	for(obj = fobj; obj; obj = obj2) {
X  	    obj2 = obj->nobj;
X  	    /* Bug fix - KAA */
X! 	    if(obj->ox == x && obj->oy == y &&
X! #ifdef SPELLS
X! 	       (obj->olet == SCROLL_SYM || obj->olet == SPBOOK_SYM)) {
X! #else
X! 	       obj->olet == SCROLL_SYM) {
X! #endif
X  		scrquan = obj->quan;
X  		for(i = 1; i <= scrquan ; i++)
X  		    if(!rn2(3))  {
X***************
X*** 1391,1402 ****
X  			}
X  		}
X  		if(OBJ_AT(sx, sy) && abstype == 1)
X! 			if(burn_floor_scrolls(sx,sy) && cansee(sx,sy))  {
X  			    mnewsym(sx,sy);
X  			    if(!Blind)
X  				You("see a puff of smoke.");
X  			}
X! 		if(levl[sx][sy].mmask){
X  			mon = m_at(sx,sy);
X  			/* Cannot use wakeup() which also angers the monster */
X  			mon->msleep = 0;
X--- 1413,1424 ----
X  			}
X  		}
X  		if(OBJ_AT(sx, sy) && abstype == 1)
X! 			if(burn_floor_paper(sx,sy) && cansee(sx,sy))  {
X  			    mnewsym(sx,sy);
X  			    if(!Blind)
X  				You("see a puff of smoke.");
X  			}
X! 		if(MON_AT(sx, sy)){
X  			mon = m_at(sx,sy);
X  			/* Cannot use wakeup() which also angers the monster */
X  			mon->msleep = 0;
X***************
X*** 1863,1889 ****
X  {
X  	register int	resisted = 0;
X  #ifdef HARD
X! 	register int	level;
X  
X  	switch(olet)  {
X  
X  	    case WAND_SYM:
X! 			level = 8;
X  			break;
X  
X  	    case SCROLL_SYM:
X! 			level = 6;
X  			break;
X  
X  	    case POTION_SYM:
X! 			level = 5;
X  			break;
X  
X! 	    default:	level = u.ulevel;
X  			break;
X  	}
X  
X! 	resisted = (rn2(100) - mtmp->m_lev + level) < mtmp->data->mr;
X  	if(resisted) {
X  
X  		if(tell) {
X--- 1885,1911 ----
X  {
X  	register int	resisted = 0;
X  #ifdef HARD
X! 	register int	lev;
X  
X  	switch(olet)  {
X  
X  	    case WAND_SYM:
X! 			lev = 8;
X  			break;
X  
X  	    case SCROLL_SYM:
X! 			lev = 6;
X  			break;
X  
X  	    case POTION_SYM:
X! 			lev = 5;
X  			break;
X  
X! 	    default:	lev = u.ulevel;
X  			break;
X  	}
X  
X! 	resisted = (rn2(100) - mtmp->m_lev + lev) < mtmp->data->mr;
X  	if(resisted) {
X  
X  		if(tell) {
X***************
X*** 1925,1933 ****
X  	}
X  	if (otmp != &zeroobj) {
X  	    if(dropit) {
X! 		pline("Oops!  The %s drop%s to the floor!", xname(otmp),
X! 			otmp->quan > 1 ? "" : "s");
X! 		dropy(otmp);
X  	    } else {
X  	    	wishquan = otmp->quan;
X  	    	otmp = addinv(otmp);
X--- 1947,1954 ----
X  	}
X  	if (otmp != &zeroobj) {
X  	    if(dropit) {
X! 	        pline("Oops!  The %s to the floor!", aobjnam(otmp, "drop"));
X! 	        dropy(otmp);
X  	    } else {
X  	    	wishquan = otmp->quan;
X  	    	otmp = addinv(otmp);
X
END_OF_FILE
if test 56197 -ne `wc -c <'patches04e'`; then
    echo shar: \"'patches04e'\" unpacked with wrong size!
fi
# end of 'patches04e'
fi
echo shar: End of archive 5 \(of 11\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 11 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