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

billr@saab.CNA.TEK.COM (Bill Randle) (08/18/89)

Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 8, Issue 9
Archive-name: NetHack3/Patch2d
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 4 (of 7)."
# Contents:  patch02d
# Wrapped by billr@saab on Fri Aug 18 08:43:06 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patch02d' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patch02d'\"
else
echo shar: Extracting \"'patch02d'\" \(54146 characters\)
sed "s/^X//" >'patch02d' <<'END_OF_FILE'
X*** src/Old/mail.c	Wed Aug 16 12:23:56 1989
X--- src/mail.c	Tue Aug 15 22:04:27 1989
X***************
X*** 56,65 ****
X  static char *mailbox;
X  static long laststattime;
X  
X  void
X  getmailstatus() {
X! 	if(!(mailbox = getenv("MAIL")))
X  		return;
X  	if(stat(mailbox, &omstat)){
X  #  ifdef PERMANENT_MAILBOX
X  		pline("Cannot get status of MAIL=%s .", mailbox);
X--- 56,79 ----
X  static char *mailbox;
X  static long laststattime;
X  
X+ #  ifdef BSD
X+ #   define MAILPATH "/usr/spool/mail/"
X+ #  endif
X+ #  ifdef SYSV
X+ #   define MAILPATH "/usr/mail/"
X+ #  endif
X+ 
X  void
X  getmailstatus() {
X! 	if(!(mailbox = getenv("MAIL"))) {
X! #  ifdef MAILPATH
X! 		mailbox = (char *) alloc(sizeof(MAILPATH)+8);
X! 		Strcpy(mailbox, MAILPATH);
X! 		Strcat(mailbox, getlogin());
X! #  else
X  		return;
X+ #  endif
X+ 	}
X  	if(stat(mailbox, &omstat)){
X  #  ifdef PERMANENT_MAILBOX
X  		pline("Cannot get status of MAIL=%s .", mailbox);
X*** src/Old/makemon.c	Thu Aug  3 08:44:40 1989
X--- src/makemon.c	Fri Aug 18 08:13:40 1989
X***************
X*** 7,13 ****
X  struct monst zeromonst;
X  static int uncommon P((struct permonst *));
X  
X! static 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--- 7,13 ----
X  struct monst zeromonst;
X  static int uncommon P((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***************
X*** 116,121 ****
X--- 116,124 ----
X  			case 1:
X  			    (void)mongets(mtmp, ELVEN_DAGGER);
X  			    break;
X+ 			case 2:
X+ 			    (void)mongets(mtmp, SLING);
X+ 			    break;
X  		      }
X  		    if (!rn2(10)) (void)mongets(mtmp, ELVEN_MITHRIL_COAT);
X  		} else if (is_dwarf(ptr)) {
X***************
X*** 541,547 ****
X  	} else {
X  		if(x == u.ux && y == u.uy && ptr->mlet != S_GHOST) {
X  			mnexto(mtmp);
X! 			if (ptr->mlet == S_MIMIC) set_mimic_sym(mtmp);
X  		}
X  	}
X  #ifdef HARD
X--- 544,554 ----
X  	} else {
X  		if(x == u.ux && y == u.uy && ptr->mlet != S_GHOST) {
X  			mnexto(mtmp);
X! 			if (ptr->mlet == S_MIMIC) {
X! 				set_mimic_sym(mtmp);
X! 				unpmon(mtmp);
X! 				pmon(mtmp);
X! 			}
X  		}
X  	}
X  #ifdef HARD
X***************
X*** 1092,1103 ****
X  		sym = ALTAR_SYM;
X  #endif
X  	/* We won't bother with beehives, morgues, barracks, throne rooms
X! 	 * since they shouldn't contain 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[-sym].oc_olet;
X  		else if (s_sym == RANDOM_SYM)
X  			sym = syms[rn2(sizeof(syms)-2) + 2];
X  		else sym = s_sym;
X--- 1099,1110 ----
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*** src/Old/end.c	Wed Aug 16 12:17:44 1989
X--- src/end.c	Tue Aug 15 20:36:34 1989
X***************
X*** 13,18 ****
X--- 13,30 ----
X  
X  void end_box_display();
X  
X+ static const char *deaths[] = { 	/* the array of death */
X+ 	"died", "choked", "poisoned", "starvation", "drowning",
X+ 	"burning", "crushed", "turned to stone", "genocided",
X+ 	"panic", "trickery",
X+ 	"quit", "escaped", "ascended" };
X+ 
X+ static const char *ends[] = {		/* "when you..." */
X+ 	"died", "choked", "were poisoned", "starved", "drowned",
X+ 	"burned", "were crushed", "turned to stone", "were genocided",
X+ 	"panicked", "were tricked",
X+ 	"quit", "escaped", "ascended" };
X+ 
X  int
X  done1()
X  {
X***************
X*** 60,66 ****
X  	}
X  #endif
X  #ifndef LINT
X! 	done("quit");
X  #endif
X  	return 0;
X  }
X--- 72,78 ----
X  	}
X  #endif
X  #ifndef LINT
X! 	done(QUIT);
X  #endif
X  	return 0;
X  }
X***************
X*** 97,118 ****
X  
X  	You("die...");
X  	buf[0] = '\0';
X  	if (mtmp->minvis)
X! 		Sprintf(eos(buf), "invisible ");
X  	if (Hallucination)
X! 		Sprintf(eos(buf), "hallucinogen-distorted ");
X  
X  	if(mtmp->data->mlet == S_GHOST) {
X  		register char *gn = (char *) mtmp->mextra;
X  		if (!Hallucination && !mtmp->minvis && *gn)
X! 			Sprintf(eos(buf), "the ");
X  		Sprintf(eos(buf), (*gn ? "ghost of %s" : "ghost%s"), gn);
X  	} else if(mtmp->isshk) {
X  		Sprintf(eos(buf), "%s %s, the shopkeeper",
X  			(ESHK(mtmp)->ismale ? "Mr." : "Ms."), shkname(mtmp));
X! 	} else if (mtmp->iswiz)
X! 		Sprintf(eos(buf), "the %s", mons[PM_WIZARD_OF_YENDOR].mname);
X! 	else Sprintf(eos(buf), "%s", mtmp->data->mname);
X  	if (mtmp->mnamelth) Sprintf(eos(buf), " called %s", NAME(mtmp));
X  	killer = buf;
X  	if (mtmp->data->mlet == S_WRAITH)
X--- 109,130 ----
X  
X  	You("die...");
X  	buf[0] = '\0';
X+ 	if (mtmp->iswiz)
X+ 		Strcat(buf, "the ");
X  	if (mtmp->minvis)
X! 		Strcat(buf, "invisible ");
X  	if (Hallucination)
X! 		Strcat(buf, "hallucinogen-distorted ");
X  
X  	if(mtmp->data->mlet == S_GHOST) {
X  		register char *gn = (char *) mtmp->mextra;
X  		if (!Hallucination && !mtmp->minvis && *gn)
X! 			Strcat(buf, "the ");
X  		Sprintf(eos(buf), (*gn ? "ghost of %s" : "ghost%s"), gn);
X  	} else if(mtmp->isshk) {
X  		Sprintf(eos(buf), "%s %s, the shopkeeper",
X  			(ESHK(mtmp)->ismale ? "Mr." : "Ms."), shkname(mtmp));
X! 	} else Strcat(buf, mtmp->data->mname);
X  	if (mtmp->mnamelth) Sprintf(eos(buf), " called %s", NAME(mtmp));
X  	killer = buf;
X  	if (mtmp->data->mlet == S_WRAITH)
X***************
X*** 125,133 ****
X  	if (u.ugrave_arise > -1 && (mons[u.ugrave_arise].geno & G_GENOD))
X  		u.ugrave_arise = -1;
X  	if (mtmp->data->mlet == S_COCKATRICE)
X! 		done("stoned");
X  	else
X! 		done("died");
X  	return;
X  }
X  
X--- 137,145 ----
X  	if (u.ugrave_arise > -1 && (mons[u.ugrave_arise].geno & G_GENOD))
X  		u.ugrave_arise = -1;
X  	if (mtmp->data->mlet == S_COCKATRICE)
X! 		done(STONING);
X  	else
X! 		done(DIED);
X  	return;
X  }
X  
X***************
X*** 170,189 ****
X  		    abort();	/* generate core dump */
X  # endif
X  #endif
X! 	done("panicked");
X  }
X  
X- /* called with arg "died", "drowned", "escaped", "quit", "choked", "panicked",
X-    "burned", "starved", "stoned", or "tricked" */
X  /* Be careful not to call panic from here! */
X  void
X! done(st1)
X! register char *st1;
X  {
X  	struct permonst *upmon;
X! 	char buf[BUFSZ], buf1[BUFSZ], buf2[BUFSZ], buf3[BUFSZ];
X  	/* buf: used if killer gets changed
X- 	 * buf1: used if st1 gets changed
X  	 * buf2: same as player name, except it is capitalized
X  	 * buf3: used to copy killer in case it comes from something like
X  		xname(), which would otherwise get overwritten when we call
X--- 182,198 ----
X  		    abort();	/* generate core dump */
X  # endif
X  #endif
X! 	done(PANICKED);
X  }
X  
X  /* Be careful not to call panic from here! */
X  void
X! done(how)
X! int how;
X  {
X  	struct permonst *upmon;
X! 	char buf[BUFSZ], buf2[BUFSZ], buf3[BUFSZ];
X  	/* buf: used if killer gets changed
X  	 * buf2: same as player name, except it is capitalized
X  	 * buf3: used to copy killer in case it comes from something like
X  		xname(), which would otherwise get overwritten when we call
X***************
X*** 192,206 ****
X  	char	c;
X  	boolean taken;
X  
X! 	Strcpy(buf3, killer);
X  	killer = buf3;
X  #ifdef WIZARD
X! 	if (wizard && *st1=='t') {
X  		You("are a very tricky wizard, it seems.");
X  		return;
X  	}
X  #endif
X! 	if(Lifesaved && index("bcds", *st1)){
X  		u.uswldtim = 0;
X  		if(u.uhpmax < 0) u.uhpmax = 10;	/* arbitrary */
X  		u.uhp = u.uhpmax;
X--- 201,215 ----
X  	char	c;
X  	boolean taken;
X  
X! 	Strcpy(buf3, (!killer || how >= PANICKED ? deaths[how] : killer));
X  	killer = buf3;
X  #ifdef WIZARD
X! 	if (wizard && how == TRICKED) {
X  		You("are a very tricky wizard, it seems.");
X  		return;
X  	}
X  #endif
X! 	if(Lifesaved && how <= GENOCIDED) {
X  		u.uswldtim = 0;
X  		if(u.uhpmax < 0) u.uhpmax = 10;	/* arbitrary */
X  		u.uhp = u.uhpmax;
X***************
X*** 212,218 ****
X  		You("feel much better!");
X  		pline("The medallion crumbles to dust!");
X  		useup(uamul);
X- 		Lifesaved = 0;
X  		if (u.uhunger < 500) u.uhunger = 500;
X  		nomovemsg = "You survived that attempt on your life.";
X  		curs_on_u();
X--- 221,226 ----
X***************
X*** 220,233 ****
X  		if(multi > 0) multi = 0; else multi = -1;
X  		flags.botl = 1;
X  		u.ugrave_arise = -1;
X! 		if (!strncmp(killer, "genocide", 8)) {
X  			pline("Unfortunately you are still genocided...");
X! 			done("died");
X  		}
X- 		return;
X  	}
X  #if defined(WIZARD) || defined(EXPLORE_MODE)
X! 	if((wizard || discover) && index("bcds", *st1)){
X  		pline("Die? ");
X  		if(yn() == 'y') goto die;
X  		u.uswldtim = 0;
X--- 228,242 ----
X  		if(multi > 0) multi = 0; else multi = -1;
X  		flags.botl = 1;
X  		u.ugrave_arise = -1;
X! 		if (how == GENOCIDED)
X  			pline("Unfortunately you are still genocided...");
X! 		else {
X! 			killer = 0;
X! 			return;
X  		}
X  	}
X  #if defined(WIZARD) || defined(EXPLORE_MODE)
X! 	if((wizard || discover) && how <= GENOCIDED) {
X  		pline("Die? ");
X  		if(yn() == 'y') goto die;
X  		u.uswldtim = 0;
X***************
X*** 241,246 ****
X--- 250,256 ----
X  		if(multi > 0) multi = 0; else multi = -1;
X  		flags.botl = 1;
X  		u.ugrave_arise = -1;
X+ 		killer = 0;
X  		return;
X  	}
X  #endif /* WIZARD || EXPLORE_MODE */
X***************
X*** 254,274 ****
X  #endif /* NO_SIGNAL /* */
X  	upmon = player_mon();
X  	if(u.ugrave_arise > -1) /* create no corpse */ ;
X! 	else if(*st1 == 's' && st1[2] == 'o') 
X  		(mk_named_object(STATUE, upmon, u.ux, u.uy, plname,
X  					strlen(plname)))->spe = 0;
X  	else
X  		(void) mk_named_object(CORPSE, upmon, u.ux, u.uy, plname,
X  							strlen(plname));
X! 	if(*st1 == 'q' && u.uhp < 1){
X! 		st1 = "died";
X! 		killer = "quit while already on Charon's boat";
X  	}
X- 	if(*st1 == 's' && st1[2] == 'a') killer = "starvation"; else
X- 	if(*st1 == 'd' && st1[1] == 'r') killer = "drowning"; else
X- 	if(*st1 == 'p') killer = "panic"; else
X- 	if(*st1 == 't') killer = "trickery"; else
X- 	if(!index("bcds", *st1)) killer = st1;
X  	taken = paybill();
X  	paygd();
X  	clearlocks();
X--- 264,281 ----
X  #endif /* NO_SIGNAL /* */
X  	upmon = player_mon();
X  	if(u.ugrave_arise > -1) /* create no corpse */ ;
X! 	else if(how == STONED)
X  		(mk_named_object(STATUE, upmon, u.ux, u.uy, plname,
X  					strlen(plname)))->spe = 0;
X  	else
X  		(void) mk_named_object(CORPSE, upmon, u.ux, u.uy, plname,
X  							strlen(plname));
X! 
X! 	if(how == QUIT && u.uhp < 1) {
X! 		how = DIED;
X! 		Strcpy(buf, "quit while already on Charon's boat");
X! 		killer = buf;
X  	}
X  	taken = paybill();
X  	paygd();
X  	clearlocks();
X***************
X*** 277,283 ****
X  	if(invent) {
X  	    if(taken)
X  		pline("Do you want to see what you had when you %s? ",
X! 			(*st1=='q') ? "quit" : "died");
X  	    else
X  		pline("Do you want your possessions identified? ");
X  	    /* New dump format by maartenj@cs.vu.nl */
X--- 284,290 ----
X  	if(invent) {
X  	    if(taken)
X  		pline("Do you want to see what you had when you %s? ",
X! 			(how == QUIT) ? "quit" : "died");
X  	    else
X  		pline("Do you want your possessions identified? ");
X  	    /* New dump format by maartenj@cs.vu.nl */
X***************
X*** 306,312 ****
X  	    }
X  	}
X  
X! 	if(index("bcds", *st1)){
X  #ifdef WIZARD
X  	    if(wizard) {
X  		pline("Save bones? ");
X--- 313,319 ----
X  	    }
X  	}
X  
X! 	if(how < GENOCIDED) {
X  #ifdef WIZARD
X  	    if(wizard) {
X  		pline("Save bones? ");
X***************
X*** 316,330 ****
X  		savebones();
X  	    if(!flags.notombstone) outrip();
X  	}
X! 	if(*st1 == 'c') killer = st1;		/* after outrip() */
X! 	if(*st1 == 's' && st1[2] == 'o') {
X! 		Sprintf(buf, "turned to stone by %s",killer);
X  		/* No a or an; topten.c will do that. */
X  		killer = buf;
X- 		st1 = "turned to stone";
X  	}
X! 	Strcpy(buf1, st1);
X! 	if(u.uhave_amulet) Strcat(killer," (with the Amulet)");
X  	settty(NULL);	/* does a clear_screen() */
X  	Strcpy(buf2, plname);
X  	if('a' <= buf2[0] && buf2[0] <= 'z') buf2[0] += 'A'-'a';
X--- 323,335 ----
X  		savebones();
X  	    if(!flags.notombstone) outrip();
X  	}
X! 	if(how == STONING) {
X! 		Strcpy(buf, "turned to stone by ");
X! 		Strcat(buf, killer);
X  		/* No a or an; topten.c will do that. */
X  		killer = buf;
X  	}
X! 	if(u.uhave_amulet) Strcat(killer, " (with the Amulet)");
X  	settty(NULL);	/* does a clear_screen() */
X  	Strcpy(buf2, plname);
X  	if('a' <= buf2[0] && buf2[0] <= 'z') buf2[0] += 'A'-'a';
X***************
X*** 331,337 ****
X  	if(!done_stopprint)
X  	    Printf("Goodbye %s the %s...\n\n", buf2,
X  #ifdef ENDGAME
X! 		   *st1 != 'a' ? pl_character : "Demigod");
X  #else
X  		   pl_character);
X  #endif
X--- 336,342 ----
X  	if(!done_stopprint)
X  	    Printf("Goodbye %s the %s...\n\n", buf2,
X  #ifdef ENDGAME
X! 		   how != ASCENDED ? pl_character : "Demigod");
X  #else
X  		   pl_character);
X  #endif
X***************
X*** 339,345 ****
X  	  tmp = u.ugold - u.ugold0;
X  	  if(tmp < 0)
X  		tmp = 0;
X! 	  if(*st1 == 'd' || *st1 == 'b')
X  		tmp -= tmp/10;
X  	  u.urexp += tmp;
X  	  u.urexp += 50 * maxdlevel;
X--- 344,350 ----
X  	  tmp = u.ugold - u.ugold0;
X  	  if(tmp < 0)
X  		tmp = 0;
X! 	  if(how < PANICKED)
X  		tmp -= tmp/10;
X  	  u.urexp += tmp;
X  	  u.urexp += 50 * maxdlevel;
X***************
X*** 346,361 ****
X  	  if(maxdlevel > 20)
X  		u.urexp += 1000*((maxdlevel > 30) ? 10 : maxdlevel - 20);
X  #ifdef ENDGAME
X! 	  if(*st1 == 'a') u.urexp *= 2;
X  #endif
X  	}
X! 	if(*st1 == 'e') {
X  		register struct monst *mtmp;
X  		register struct obj *otmp;
X  		long i;
X  		register unsigned int worthlessct = 0;
X  
X- 		killer = st1;
X  		keepdogs();
X  		mtmp = mydogs;
X  		if(mtmp) {
X--- 351,365 ----
X  	  if(maxdlevel > 20)
X  		u.urexp += 1000*((maxdlevel > 30) ? 10 : maxdlevel - 20);
X  #ifdef ENDGAME
X! 	  if(how == ASCENDED) u.urexp *= 2;
X  #endif
X  	}
X! 	if(how == ESCAPED) {
X  		register struct monst *mtmp;
X  		register struct obj *otmp;
X  		long i;
X  		register unsigned int worthlessct = 0;
X  
X  		keepdogs();
X  		mtmp = mydogs;
X  		if(mtmp) {
X***************
X*** 400,413 ****
X  		if(worthlessct)
X  		  Printf("        %u worthless piece%s of colored glass,\n",
X  			worthlessct, plur((long)worthlessct));
X- 		if(u.uhave_amulet) killer = "escaped (with Amulet)";
X- 		else killer = "escaped";
X  	} else
X  		if(!done_stopprint) {
X! 		    Printf("You %s ", 
X! 			!strcmp(st1, "tricked") ? "were tricked" : st1);
X  #ifdef ENDGAME
X! 		    if (*st1 != 'a') {
X  			if(dlevel == ENDLEVEL)
X  			     Printf("in the endgame ");
X  		    	else Printf("on dungeon level %d ", dlevel);
X--- 404,414 ----
X  		if(worthlessct)
X  		  Printf("        %u worthless piece%s of colored glass,\n",
X  			worthlessct, plur((long)worthlessct));
X  	} else
X  		if(!done_stopprint) {
X! 		    Printf("You %s ", ends[how]);
X  #ifdef ENDGAME
X! 		    if (how != ASCENDED) {
X  			if(dlevel == ENDLEVEL)
X  			     Printf("in the endgame ");
X  		    	else Printf("on dungeon level %d ", dlevel);
X***************
X*** 422,433 ****
X  	    u.ugold, plur(u.ugold), moves, plur(moves));
X  	if(!done_stopprint)
X    Printf("You were level %u with a maximum of %d hit points when you %s.\n",
X! 	    u.ulevel, u.uhpmax, buf1);
X! 	if(*st1 == 'e' && !done_stopprint){
X  		getret();	/* all those pieces of coloured glass ... */
X  		cls();
X  	}
X! #if defined(WIZARD) || defined(EXPLORE_MODE)
X  	if(wizard || discover)
X  		Printf("\nSince you were in %s mode, the score list \
X  will not be checked.\n", wizard ? "wizard" : "discover");
X--- 423,434 ----
X  	    u.ugold, plur(u.ugold), moves, plur(moves));
X  	if(!done_stopprint)
X    Printf("You were level %u with a maximum of %d hit points when you %s.\n",
X! 	    u.ulevel, u.uhpmax, ends[how]);
X! 	if(how == ESCAPED && !done_stopprint){
X  		getret();	/* all those pieces of coloured glass ... */
X  		cls();
X  	}
X! #if (defined(WIZARD) || defined(EXPLORE_MODE)) && !defined(LOGFILE)
X  	if(wizard || discover)
X  		Printf("\nSince you were in %s mode, the score list \
X  will not be checked.\n", wizard ? "wizard" : "discover");
X*** src/Old/lock.c	Wed Aug 16 12:23:18 1989
X--- src/lock.c	Wed Aug 16 10:36:10 1989
X***************
X*** 142,147 ****
X--- 142,150 ----
X  	return((xlock.usedtime = 0));
X  }
X  
X+ void
X+ reset_pick() { xlock.usedtime = 0; }
X+ 
X  int
X  pick_lock(pick) /* pick a lock with a given object */
X  	register struct	obj	*pick;
X***************
X*** 184,190 ****
X  	    if(levl[x][y].omask)
X  	    for(otmp = fobj; otmp; otmp = otmp->nobj)
X  		if((otmp->ox == x) && (otmp->oy == y))
X! 		    if(Is_box(otmp)) {
X  			pline("There is %s here, %s the lock? ",
X  			doname(otmp), (!otmp->olocked) ? "close" :
X  			((picktyp == LOCK_PICK) ? "pick" : "open" ));
X--- 187,195 ----
X  	    if(levl[x][y].omask)
X  	    for(otmp = fobj; otmp; otmp = otmp->nobj)
X  		if((otmp->ox == x) && (otmp->oy == y))
X! 		    if(Is_box(otmp) &&
X! 		       /* credit cards are only good for unlocking */
X! 		       (picktyp != CREDIT_CARD || otmp->olocked)) {
X  			pline("There is %s here, %s the lock? ",
X  			doname(otmp), (!otmp->olocked) ? "close" :
X  			((picktyp == LOCK_PICK) ? "pick" : "open" ));
X***************
X*** 232,238 ****
X  #else
X  		    mtmp->isshk)
X  #endif
X! 		    pline("\"No checks, no credit, no problem.\"");
X  		else
X  		    kludge("I don't think %s would appreciate that.", mon_nam(mtmp));
X  		return(0);
X--- 237,243 ----
X  #else
X  		    mtmp->isshk)
X  #endif
X! 		    verbalize("No checks, no credit, no problem.");
X  		else
X  		    kludge("I don't think %s would appreciate that.", mon_nam(mtmp));
X  		return(0);
X***************
X*** 259,264 ****
X--- 264,275 ----
X  		    pline("This door is broken.");
X  		    return(0);
X  		default:
X+ 		    /* credit cards are only good for unlocking */
X+ 		    if(picktyp == CREDIT_CARD && !(door->doormask & D_LOCKED)) {
X+ 			You("can't lock a door with a credit card.");
X+ 			return(0);
X+ 		    }
X+ 
X  		    pline("%sock it? ", (door->doormask & D_LOCKED) ? "Unl" : "L" );
X  
X  		    c = yn();
X***************
X*** 356,361 ****
X--- 367,373 ----
X  doopen() {		/* try to open a door */
X  	register int x, y;
X  	register struct rm *door;
X+ 	struct monst *mtmp;
X  
X  	if(!getdir(1)) return(0);
X  
X***************
X*** 363,373 ****
X  	y = u.uy + u.dy;
X  	if((x == u.ux) && (y == u.uy)) return(0);
X  
X  	door = &levl[x][y];
X  
X  	if(!IS_DOOR(door->typ)) {
X  #ifdef STRONGHOLD
X! 		if (is_drawbridge_wall(x,y) >= 0) {
X  		    pline("There is no obvious way to open the drawbridge.");
X  		    return(0);
X  		}
X--- 375,392 ----
X  	y = u.uy + u.dy;
X  	if((x == u.ux) && (y == u.uy)) return(0);
X  
X+ 	if(levl[x][y].mmask && (mtmp = m_at(x,y))->mimic && 
X+ 				mtmp->mappearance == DOOR_SYM &&
X+ 				!Protection_from_shape_changers) {
X+ 		stumble_onto_mimic(mtmp);
X+ 		return(1);
X+ 	}
X+ 
X  	door = &levl[x][y];
X  
X  	if(!IS_DOOR(door->typ)) {
X  #ifdef STRONGHOLD
X! 		if (is_db_wall(x,y)) {
X  		    pline("There is no obvious way to open the drawbridge.");
X  		    return(0);
X  		}
X***************
X*** 431,436 ****
X--- 450,456 ----
X  doclose() {		/* try to close a door */
X  	register int x, y;
X  	register struct rm *door;
X+ 	struct monst *mtmp;
X  
X  	if(!getdir(1)) return(0);
X  
X***************
X*** 440,445 ****
X--- 460,473 ----
X  		You("are in the way!");
X  		return(1);
X  	}
X+ 
X+ 	if(levl[x][y].mmask && (mtmp = m_at(x,y))->mimic && 
X+ 				mtmp->mappearance == DOOR_SYM &&
X+ 				!Protection_from_shape_changers) {
X+ 		stumble_onto_mimic(mtmp);
X+ 		return(1);
X+ 	}
X+ 
X  	door = &levl[x][y];
X  
X  	if(!IS_DOOR(door->typ)) {
X***************
X*** 592,597 ****
X--- 620,649 ----
X  		if(door->doormask & D_LOCKED) {
X  		    door->doormask = D_CLOSED | (door->doormask & D_TRAPPED);
X  		    if(cansee(x,y)) pline("The door unlocks!");
X+ 		} else res = 0;
X+ 		break;
X+ 	    case WAN_STRIKING:
X+ #ifdef SPELLS
X+ 	    case SPE_FORCE_BOLT:
X+ #endif
X+ 		if(door->doormask & (D_LOCKED | D_CLOSED)) {
X+ 		    if(door->doormask & D_TRAPPED) {
X+ 			if (levl[x][y].mmask)
X+ 			    (void) mb_trapped(m_at(x,y));
X+ 			else if (flags.verbose)
X+ 			    if (cansee(x,y))
X+ 			       pline("KABOOM!!	You see a door explode.");
X+ 			    else if (flags.soundok)
X+ 			       You("hear a distant explosion.");
X+ 			door->doormask = D_NODOOR;
X+ 			break;
X+ 		    }
X+ 		    door->doormask = D_BROKEN;
X+ 		    if (flags.verbose)
X+ 			if (cansee(x,y))
X+ 			    pline("The door crashes open!");
X+ 			else if (flags.soundok)
X+ 			    You("hear a crashing sound.");
X  		} else res = 0;
X  		break;
X  	    default:	impossible("magic (%d) attempted on door.", otmp->otyp);
X*** src/Old/mcastu.c	Wed Aug 16 12:25:17 1989
X--- src/mcastu.c	Tue Aug 15 22:58:26 1989
X***************
X*** 35,41 ****
X  {
X  	int	dmg = 0, ml = mtmp->m_lev;
X  
X! 	if(mtmp->mcan || mtmp->mspec_used) {  /* could not attack */
X  	    cursetxt(mtmp);
X  	    return(0);
X  	} else {
X--- 35,41 ----
X  {
X  	int	dmg = 0, ml = mtmp->m_lev;
X  
X! 	if(mtmp->mcan || mtmp->mspec_used || !ml) {  /* could not attack */
X  	    cursetxt(mtmp);
X  	    return(0);
X  	} else {
X***************
X*** 105,111 ****
X  				You("have an out of body experience.");
X  			    else  {
X  				killer = "touch of death";
X! 				done("died");
X  			    }
X  			} else {
X  				if(Antimagic) shieldeff(u.ux, u.uy);
X--- 105,111 ----
X  				You("have an out of body experience.");
X  			    else  {
X  				killer = "touch of death";
X! 				done(DIED);
X  			    }
X  			} else {
X  				if(Antimagic) shieldeff(u.ux, u.uy);
X***************
X*** 166,172 ****
X  		    case 5:		/* make invisible if not */
X  		    case 4:
X  			if(!mtmp->minvis) {
X! 			    if(canseemon(mtmp) && !See_invisible)
X  				pline("%s suddenly disappears!",
X  				      Monnam(mtmp));
X  			    mtmp->minvis = 1;
X--- 166,172 ----
X  		    case 5:		/* make invisible if not */
X  		    case 4:
X  			if(!mtmp->minvis) {
X! 			    if(canseemon(mtmp) && !See_invisible && !Telepat)
X  				pline("%s suddenly disappears!",
X  				      Monnam(mtmp));
X  			    mtmp->minvis = 1;
X*** src/Old/mhitm.c	Wed Aug 16 12:25:35 1989
X--- src/mhitm.c	Wed Aug  9 19:21:58 1989
X***************
X*** 19,38 ****
X  static int mdamagem P((struct monst *,struct monst *,struct attack *));
X  static void mswingsm P((struct monst *, struct monst *, struct obj *));
X  
X- static boolean
X- m_incompat(magr, mdef)
X- /* This must work like in mhitu.c.  Specifically, if it's a shopkeeper
X-  * polymorphed into a monster of a specific gender, the specific gender
X-  * overrides.  Thus, do not use is_female(), since then a female shopkeeper
X-  * polymorphed into an incubus, or any shopkeeper turned into something
X-  * genderless, would be treated improperly.
X-  * This nonsense could be avoided if every monster had a gender field...
X-  */
X- register struct monst *magr, *mdef;
X- {
X- 	return(gender(magr) != 1-gender(mdef));
X- }
X- 
X  static void
X  noises(magr, mattk)
X  	register struct monst *magr;
X--- 19,24 ----
X***************
X*** 60,70 ****
X  	if(vis) {
X  		if(mdef->mimic) seemimic(mdef);
X  		if(magr->mimic) seemimic(magr);
X! 		if (sp_melee(magr) && !magr->mcan &&
X! 			    (is_nymph(magr) || !m_incompat(magr,mdef))) {
X  			Sprintf(buf, "%s pretends to be friendly to",
X  								Monnam(magr));
X! 		} else
X  			Sprintf(buf,"%s misses", Monnam(magr));
X  		pline("%s %s.", buf, mon_nam(mdef));
X  	} else  noises(magr, mattk);
X--- 46,55 ----
X  	if(vis) {
X  		if(mdef->mimic) seemimic(mdef);
X  		if(magr->mimic) seemimic(magr);
X! 		if (could_seduce(magr,mdef,mattk) && !magr->mcan)
X  			Sprintf(buf, "%s pretends to be friendly to",
X  								Monnam(magr));
X! 		else
X  			Sprintf(buf,"%s misses", Monnam(magr));
X  		pline("%s %s.", buf, mon_nam(mdef));
X  	} else  noises(magr, mattk);
X***************
X*** 195,215 ****
X  	register struct monst *magr,*mdef;
X  	struct	attack *mattk;
X  {
X- 
X  	if(vis){
X  		char buf[BUFSZ];
X  		if(mdef->mimic) seemimic(mdef);
X  		if(magr->mimic) seemimic(magr);
X! 		if(sp_melee(magr) && !magr->mcan) {
X! 			if(!is_nymph(magr) && m_incompat(magr,mdef))
X! 				goto strike;
X  			Sprintf(buf, "%s %s", Monnam(magr),
X  				mdef->mblinded ? "talks to" : "smiles at");
X  			pline("%s %s %s.", buf, mon_nam(mdef),
X! 				m_incompat(magr,mdef) ?
X  					"engagingly" : "seductively");
X  		} else {
X- 	strike:
X  		    switch (mattk->aatyp) {
X  			case AT_BITE:
X  				Sprintf(buf,"%s bites", Monnam(magr));
X--- 180,198 ----
X  	register struct monst *magr,*mdef;
X  	struct	attack *mattk;
X  {
X  	if(vis){
X+ 		int compat;
X  		char buf[BUFSZ];
X+ 
X  		if(mdef->mimic) seemimic(mdef);
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  		} else {
X  		    switch (mattk->aatyp) {
X  			case AT_BITE:
X  				Sprintf(buf,"%s bites", Monnam(magr));
X***************
X*** 282,287 ****
X--- 265,273 ----
X  	if((tmp = mdamagem(magr, mdef, mattk)) == 2) {
X  		levl[mx][my].mmask = 0;
X  		levl[magr->mx][magr->my].mmask = 1;
X+ 		/* if mdamagem left a corpse it erased magr's symbol */
X+ 		unpmon(magr);
X+ 		pmon(magr);
X  		return(2);	/* defender died */
X  	} else {		/* defender survived */
X  		if(cansee(mdef->mx, mdef->my))
X***************
X*** 317,323 ****
X  	if(dist2(magr->mx, magr->my, u.ux, u.uy) < 3)
X  		(void) mdamageu(magr, d((int)mattk->damn, (int)mattk->damd));
X  
X! 	mondied(magr);
X  	return(2);
X  }
X  
X--- 303,309 ----
X  	if(dist2(magr->mx, magr->my, u.ux, u.uy) < 3)
X  		(void) mdamageu(magr, d((int)mattk->damn, (int)mattk->damd));
X  
X! 	mondead(magr);
X  	return(2);
X  }
X  
X*** src/Old/uhitm.c	Wed Aug 16 12:47:32 1989
X--- src/uhitm.c	Wed Aug 16 10:34:15 1989
X***************
X*** 87,110 ****
X  	}
X  
X  	if(mtmp->mimic && !Protection_from_shape_changers) {
X! 		if(!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data,AD_STCK))
X! 			u.ustuck = mtmp;
X! 		if (levl[u.ux+u.dx][u.uy+u.dy].scrsym == DOOR_SYM)
X! #ifdef SPELLS
X! 		{
X! 		    if (okdoor(u.ux+u.dx, u.uy+u.dy))
X! #endif
X! 			pline("The door actually was %s.", defmonnam(mtmp));
X! #ifdef SPELLS
X! 		    else
X! 			pline("That spellbook was %s.", defmonnam(mtmp));
X! 		}
X! #endif
X! 		else if (levl[u.ux+u.dx][u.uy+u.dy].scrsym == GOLD_SYM)
X! 			pline("That gold was %s!", defmonnam(mtmp));
X! 		else
X! 			pline("Wait!  That's %s!", defmonnam(mtmp));
X! 		wakeup(mtmp);	/* clears mtmp->mimic */
X  		return(TRUE);
X  	}
X  
X--- 87,93 ----
X  	}
X  
X  	if(mtmp->mimic && !Protection_from_shape_changers) {
X! 		stumble_onto_mimic(mtmp);
X  		return(TRUE);
X  	}
X  
X***************
X*** 127,132 ****
X--- 110,162 ----
X  	return(FALSE);
X  }
X  
X+ schar
X+ find_roll_to_hit(mtmp)
X+ register struct monst *mtmp;
X+ {
X+ 	schar tmp;
X+ 	struct permonst *mdat = mtmp->data;
X+ 
X+ #ifdef POLYSELF
X+ 	tmp = Luck + mdat->ac + abon() +
X+ 		     ((u.umonnum >= 0) ? uasmon->mlevel : u.ulevel);
X+ #else
X+ 	tmp = Luck + u.ulevel + mdat->ac + abon();
X+ #endif
X+ /*	it is unchivalrous to attack the defenseless or from behind */
X+ 	if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL &&
X+ 	    (mtmp->mfroz || mtmp->msleep || mtmp->mflee) &&
X+ 	    u.ualign > -10) adjalign(-1);
X+ 
X+ /*	Adjust vs. (and possibly modify) monster state.		*/
X+ 
X+ 	if(mtmp->mstun) tmp += 2;
X+ 	if(mtmp->mflee) tmp += 2;
X+ 
X+ 	if(mtmp->msleep) {
X+ 		mtmp->msleep = 0;
X+ 		tmp += 2;
X+ 	}
X+ 	if(mtmp->mfroz) {
X+ 		tmp += 4;
X+ 		if(!rn2(10)) mtmp->mfroz = 0;
X+ 	}
X+ 	if (is_orc(mtmp->data) && pl_character[0]=='E') tmp++;
X+ 
X+ /*	with a lot of luggage, your agility diminishes */
X+ 	tmp -= (inv_weight() + 40)/20;
X+ 	if(u.utrap) tmp -= 3;
X+ #ifdef POLYSELF
X+ /*	Some monsters have a combination of weapon attacks and non-weapon
X+  *	attacks.  It is therefore wrong to add hitval to tmp; we must add it
X+  *	only for the specific attack (in hmonas()).
X+  */
X+ 	if(uwep && u.umonnum == -1) tmp += hitval(uwep, mdat);
X+ #else
X+ 	if(uwep) tmp += hitval(uwep, mdat);
X+ #endif
X+ 	return tmp;
X+ }
X  
X  /* try to attack; return FALSE if monster evaded */
X  /* u.dx and u.dy must be set */
X***************
X*** 188,233 ****
X  			return(TRUE);
X  		}
X  	}
X- 	tmp = Luck + mdat->ac + abon() +
X- 		     ((u.umonnum >= 0) ? uasmon->mlevel : u.ulevel);
X- #else
X- 	tmp = Luck + u.ulevel + mdat->ac + abon();
X  #endif
X  
X! /*	it is unchivalrous to attack the defenseless or from behind */
X! 	if (pl_character[0] == 'K' && u.ualigntyp == U_LAWFUL &&
X! 	    (mtmp->mfroz || mtmp->msleep || mtmp->mflee) &&
X! 	    u.ualign > -10) adjalign(-1);
X! 
X! /*	Adjust vs. (and possibly modify) monster state.		*/
X! 
X! 	if(mtmp->mstun) tmp += 2;
X! 	if(mtmp->mflee) tmp += 2;
X! 
X! 	if(mtmp->msleep) {
X! 		mtmp->msleep = 0;
X! 		tmp += 2;
X! 	}
X! 	if(mtmp->mfroz) {
X! 		tmp += 4;
X! 		if(!rn2(10)) mtmp->mfroz = 0;
X! 	}
X! 	if (is_orc(mtmp->data) && pl_character[0]=='E') tmp++;
X! 
X! /*	with a lot of luggage, your agility diminishes */
X! 	tmp -= (inv_weight() + 40)/20;
X! 	if(u.utrap) tmp -= 3;
X! 
X! #ifdef POLYSELF
X! 	if(u.umonnum >= 0) (void) hmonas(mtmp, tmp);
X! 	else {
X! #endif
X! 		if(uwep) tmp += hitval(uwep, mdat);
X! 		(void) hitum(mtmp, tmp);
X  #ifdef POLYSELF
X! 	}
X  #endif
X! 
X  	return(TRUE);
X  }
X  
X--- 218,231 ----
X  			return(TRUE);
X  		}
X  	}
X  #endif
X  
X! 	tmp = find_roll_to_hit(mtmp);
X  #ifdef POLYSELF
X! 	if (u.umonnum >= 0) (void) hmonas(mtmp, tmp);
X! 	else
X  #endif
X! 	    (void) hitum(mtmp, tmp);
X  	return(TRUE);
X  }
X  
X***************
X*** 246,252 ****
X  	if(!mhit) {
X  	    if(!Blind && flags.verbose) You("miss %s.", mon_nam(mon));
X  	    else			You("miss it.");
X! 	    if(is_human(mon->data) && !(mon->msleep || mon->mfroz))
X  		wakeup(mon);
X  	} else {
X  	    /* we hit the monster; be careful: it might die! */
X--- 244,250 ----
X  	if(!mhit) {
X  	    if(!Blind && flags.verbose) You("miss %s.", mon_nam(mon));
X  	    else			You("miss it.");
X! 	    if(!mon->msleep && !mon->mfroz)
X  		wakeup(mon);
X  	} else {
X  	    /* we hit the monster; be careful: it might die! */
X***************
X*** 289,295 ****
X  	boolean mhit = !((tmp <= rnd(20)) && !u.uswallow);
X  
X  	malive = known_hitum(mon, mhit);
X! 	(void) passive(mon, mhit, malive);
X  	return(malive);
X  }
X  
X--- 287,293 ----
X  	boolean mhit = !((tmp <= rnd(20)) && !u.uswallow);
X  
X  	malive = known_hitum(mon, mhit);
X! 	(void) passive(mon, mhit, malive, FALSE);
X  	return(malive);
X  }
X  
X***************
X*** 300,308 ****
X  register int thrown;
X  {
X  	register int tmp;
X  	boolean hittxt = FALSE, destroyed = FALSE;
X  	boolean get_dmg_bonus = TRUE;
X! 	boolean ispoisoned = FALSE, needpoismsg = FALSE;
X  
X  	wakeup(mon);
X  	if(!obj) {
X--- 298,325 ----
X  register int thrown;
X  {
X  	register int tmp;
X+ 	/* Why all these booleans?  This stuff has to be done in the
X+ 	 *      following order:
X+ 	 * 1) Know what we're attacking with, and print special hittxt for
X+ 	 *	unusual cases.
X+ 	 * 2a) Know whether we did damage (depends on 1)
X+ 	 * 2b) Know if it's poisoned (depends on 1)
X+ 	 * 2c) Know whether we get a normal damage bonus or not (depends on 1)
X+ 	 * 3a) Know what the value of the damage bonus is (depends on 2c)
X+ 	 * 3b) Know how much poison damage was taken (depends on 2b) and if the
X+ 	 *	poison instant-killed it
X+ 	 * 4) Know if it was killed (requires knowing 3a, 3b) except by instant-
X+ 	 *	kill poison
X+ 	 * 5) Print hit message (depends on 1 and 4)
X+ 	 * 6a) Print poison message (must be done after 5)
X+ 	 * 6b) Rust weapon (must be done after 5)
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+ 	 */
X  	boolean hittxt = FALSE, destroyed = FALSE;
X  	boolean get_dmg_bonus = TRUE;
X! 	boolean ispoisoned = FALSE, needpoismsg = FALSE, poiskilled = FALSE;
X  
X  	wakeup(mon);
X  	if(!obj) {
X***************
X*** 502,512 ****
X  		needpoismsg = TRUE;
X  	    else if (rn2(10))
X  		tmp += rnd(6);
X! 	    else {
X! 		pline("The poison was deadly...");
X! 		xkilled(mon,0);
X! 		return FALSE;
X! 	    }
X  	}
X  	if(tmp < 1) tmp = 1;
X  
X--- 519,525 ----
X  		needpoismsg = TRUE;
X  	    else if (rn2(10))
X  		tmp += rnd(6);
X! 	    else poiskilled = TRUE;
X  	}
X  	if(tmp < 1) tmp = 1;
X  
X***************
X*** 545,551 ****
X  	if (needpoismsg)
X  		kludge("The poison doesn't seem to affect %s.", mon_nam(mon));
X  
X! 	if (destroyed)
X  		killed(mon);	/* takes care of messages */
X  	else if(u.umconf && !thrown) {
X  		if(!Blind) {
X--- 558,568 ----
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! 		return FALSE;
X! 	} else if (destroyed)
X  		killed(mon);	/* takes care of messages */
X  	else if(u.umconf && !thrown) {
X  		if(!Blind) {
X***************
X*** 579,585 ****
X  }
X  
X  #ifdef POLYSELF
X! static int
X  damageum(mdef, mattk)
X  register struct monst *mdef;
X  register struct attack *mattk;
X--- 596,603 ----
X  }
X  
X  #ifdef POLYSELF
X! 
X! int
X  damageum(mdef, mattk)
X  register struct monst *mdef;
X  register struct attack *mattk;
X***************
X*** 589,598 ****
X  
X  	stoned = FALSE;
X  	if (is_demon(uasmon) && !rn2(13) && !uwep
X! #ifdef HARD
X  		&& u.umonnum != PM_SUCCUBUS && u.umonnum != PM_INCUBUS
X  		&& u.umonnum != PM_BALROG
X! #endif
X  	    ) {
X  	    struct monst *dtmp;
X  	    pline("Some hell-p has arrived!");
X--- 607,616 ----
X  
X  	stoned = FALSE;
X  	if (is_demon(uasmon) && !rn2(13) && !uwep
X! # ifdef HARD
X  		&& u.umonnum != PM_SUCCUBUS && u.umonnum != PM_INCUBUS
X  		&& u.umonnum != PM_BALROG
X! # endif
X  	    ) {
X  	    struct monst *dtmp;
X  	    pline("Some hell-p has arrived!");
X***************
X*** 617,625 ****
X  			if(thick_skinned(mdef->data)) tmp = 0;
X  		break;
X  	    case AD_FIRE:
X! #ifdef GOLEMS
X  		golemeffects(mdef, AD_FIRE, tmp);
X! #endif /* GOLEMS */
X  		if(resists_fire(pd)) {
X  		    shieldeff(mdef->mx, mdef->my);
X  		    tmp = 0;
X--- 635,643 ----
X  			if(thick_skinned(mdef->data)) tmp = 0;
X  		break;
X  	    case AD_FIRE:
X! # ifdef GOLEMS
X  		golemeffects(mdef, AD_FIRE, tmp);
X! # endif /* GOLEMS */
X  		if(resists_fire(pd)) {
X  		    shieldeff(mdef->mx, mdef->my);
X  		    tmp = 0;
X***************
X*** 627,641 ****
X  		    if(!Blind) pline("%s is on fire!", Monnam(mdef));
X  		    tmp += destroy_mitem(mdef, SCROLL_SYM, AD_FIRE);
X  		    tmp += destroy_mitem(mdef, POTION_SYM, AD_FIRE);
X! #ifdef SPELLS
X  		    tmp += destroy_mitem(mdef, SPBOOK_SYM, AD_FIRE);
X! #endif
X  		}
X  		break;
X  	    case AD_COLD:
X! #ifdef GOLEMS
X  		golemeffects(mdef, AD_COLD, tmp);
X! #endif /* GOLEMS */
X  		if(resists_cold(pd)) {
X  		    shieldeff(mdef->mx, mdef->my);
X  		    tmp = 0;
X--- 645,659 ----
X  		    if(!Blind) pline("%s is on fire!", Monnam(mdef));
X  		    tmp += destroy_mitem(mdef, SCROLL_SYM, AD_FIRE);
X  		    tmp += destroy_mitem(mdef, POTION_SYM, AD_FIRE);
X! # ifdef SPELLS
X  		    tmp += destroy_mitem(mdef, SPBOOK_SYM, AD_FIRE);
X! # endif
X  		}
X  		break;
X  	    case AD_COLD:
X! # ifdef GOLEMS
X  		golemeffects(mdef, AD_COLD, tmp);
X! # endif /* GOLEMS */
X  		if(resists_cold(pd)) {
X  		    shieldeff(mdef->mx, mdef->my);
X  		    tmp = 0;
X***************
X*** 645,653 ****
X  		}
X  		break;
X  	    case AD_ELEC:
X! #ifdef GOLEMS
X  		golemeffects(mdef, AD_ELEC, tmp);
X! #endif /* GOLEMS */
X  		if(resists_elec(pd)) {
X  		    shieldeff(mdef->mx, mdef->my);
X  		    tmp = 0;
X--- 663,671 ----
X  		}
X  		break;
X  	    case AD_ELEC:
X! # ifdef GOLEMS
X  		golemeffects(mdef, AD_ELEC, tmp);
X! # endif /* GOLEMS */
X  		if(resists_elec(pd)) {
X  		    shieldeff(mdef->mx, mdef->my);
X  		    tmp = 0;
X***************
X*** 665,673 ****
X  		}
X  		tmp = 0;	/* no damage if this fails */
X  		break;
X! #ifdef SEDUCE
X  	    case AD_SSEX:
X! #endif
X  	    case AD_SEDU:
X  	    case AD_SITM:
X  		if(mdef->minvent) {
X--- 683,691 ----
X  		}
X  		tmp = 0;	/* no damage if this fails */
X  		break;
X! # ifdef SEDUCE
X  	    case AD_SSEX:
X! # endif
X  	    case AD_SEDU:
X  	    case AD_SITM:
X  		if(mdef->minvent) {
X***************
X*** 710,718 ****
X  				kludge("%s finishes taking off his suit.",
X  							Monnam(mdef));
X  				You("steal a %s.", xname(stealoid));
X! #ifdef ARMY
X  				mdef->data = &mons[PM_UNARMORED_SOLDIER];
X! #endif
X  			}
X  		   } else {
X  		   	   otmp = mdef->minvent;
X--- 728,736 ----
X  				kludge("%s finishes taking off his suit.",
X  							Monnam(mdef));
X  				You("steal a %s.", xname(stealoid));
X! # ifdef ARMY
X  				mdef->data = &mons[PM_UNARMORED_SOLDIER];
X! # endif
X  			}
X  		   } else {
X  		   	   otmp = mdef->minvent;
X***************
X*** 751,757 ****
X  		break;
X  	    case AD_CURS:
X  		if (night() && !rn2(10) && !mdef->mcan) {
X! #ifdef GOLEMS
X  		    if (mdef->data == &mons[PM_CLAY_GOLEM]) {
X  			if (!Blind)
X  			    pline("Some writing vanishes from %s's head!",
X--- 769,775 ----
X  		break;
X  	    case AD_CURS:
X  		if (night() && !rn2(10) && !mdef->mcan) {
X! # ifdef GOLEMS
X  		    if (mdef->data == &mons[PM_CLAY_GOLEM]) {
X  			if (!Blind)
X  			    pline("Some writing vanishes from %s's head!",
X***************
X*** 759,765 ****
X  			xkilled(mdef, 0);
X  			return 2;
X  		      }
X! #endif /* GOLEMS */
X  		    mdef->mcan = 1;
X  		    You("chuckle.");
X  		}
X--- 777,783 ----
X  			xkilled(mdef, 0);
X  			return 2;
X  		      }
X! # endif /* GOLEMS */
X  		    mdef->mcan = 1;
X  		    You("chuckle.");
X  		}
X***************
X*** 779,795 ****
X  		tmp = 0;
X  		break;
X  	    case AD_RUST:
X! #ifdef GOLEMS
X  		if (pd == &mons[PM_IRON_GOLEM]) {
X  			kludge("%s falls to pieces!", Monnam(mdef));
X  			xkilled(mdef,0);
X  			return(2);
X  		}
X! #endif /* GOLEMS */
X  		tmp = 0;
X  		break;
X  	    case AD_DCAY:
X! #ifdef GOLEMS
X  		if (pd == &mons[PM_WOOD_GOLEM] ||
X  		    pd == &mons[PM_LEATHER_GOLEM]) {
X  			kludge("%s falls to pieces!", Monnam(mdef));
X--- 797,813 ----
X  		tmp = 0;
X  		break;
X  	    case AD_RUST:
X! # ifdef GOLEMS
X  		if (pd == &mons[PM_IRON_GOLEM]) {
X  			kludge("%s falls to pieces!", Monnam(mdef));
X  			xkilled(mdef,0);
X  			return(2);
X  		}
X! # endif /* GOLEMS */
X  		tmp = 0;
X  		break;
X  	    case AD_DCAY:
X! # ifdef GOLEMS
X  		if (pd == &mons[PM_WOOD_GOLEM] ||
X  		    pd == &mons[PM_LEATHER_GOLEM]) {
X  			kludge("%s falls to pieces!", Monnam(mdef));
X***************
X*** 796,802 ****
X  			xkilled(mdef,0);
X  			return(2);
X  		}
X! #endif /* GOLEMS */
X  	    case AD_DRST:
X  	    case AD_DRDX:
X  	    case AD_DRCO:
X--- 814,820 ----
X  			xkilled(mdef,0);
X  			return(2);
X  		}
X! # endif /* GOLEMS */
X  	    case AD_DRST:
X  	    case AD_DRDX:
X  	    case AD_DRCO:
X***************
X*** 827,833 ****
X  	if((mdef->mhp -= tmp) < 1) {
X  
X  	    if(mdef->mtame) {
X! 		if(!Blind) You("killed your %s!", mon_nam(mdef));
X  		else	You("feel embarrassed for a moment.");
X  	    } else {
X  		if(!Blind && flags.verbose)  pline("%s is killed!", Monnam(mdef));
X--- 845,851 ----
X  	if((mdef->mhp -= tmp) < 1) {
X  
X  	    if(mdef->mtame) {
X! 		if(!Blind) You("killed your %s!", lmonnam(mdef) + 4);
X  		else	You("feel embarrassed for a moment.");
X  	    } else {
X  		if(!Blind && flags.verbose)  pline("%s is killed!", Monnam(mdef));
X***************
X*** 863,873 ****
X  			 killed(mdef);
X  			 return(2);
X  		    }
X! #ifdef GOLEMS
X  		} else if (is_golem(mdef->data)) {
X  		    golemeffects(mdef, AD_COLD, d(6,6));
X  		    shieldeff(mdef->mx, mdef->my);
X! #endif /* GOLEMS */
X  		} else {
X  		    shieldeff(mdef->mx, mdef->my);
X  		    kludge("The blast doesn't seem to affect %s.",
X--- 881,891 ----
X  			 killed(mdef);
X  			 return(2);
X  		    }
X! # ifdef GOLEMS
X  		} else if (is_golem(mdef->data)) {
X  		    golemeffects(mdef, AD_COLD, d(6,6));
X  		    shieldeff(mdef->mx, mdef->my);
X! # endif /* GOLEMS */
X  		} else {
X  		    shieldeff(mdef->mx, mdef->my);
X  		    kludge("The blast doesn't seem to affect %s.",
X***************
X*** 894,910 ****
X  	 * after exactly 1 round of attack otherwise.  -KAA
X  	 */
X  
X! #ifdef WORM
X  	if(mdef->wormno) return 0;
X! #endif
X  	if(u.uhunger < 1500 && !u.uswallow) {
X  
X  	    if(mdef->data->mlet != S_COCKATRICE) {
X! #ifdef LINT	/* static char msgbuf[BUFSZ]; */
X  		char msgbuf[BUFSZ];
X! #else
X  		static char msgbuf[BUFSZ];
X! #endif
X  /* TODO: get the symbol display also to work (monster symbol is removed from
X   * the screen and you moved onto it, then you get moved back and it gets
X   * moved back if the monster survives--just like when monsters swallow you.
X--- 912,928 ----
X  	 * after exactly 1 round of attack otherwise.  -KAA
X  	 */
X  
X! # ifdef WORM
X  	if(mdef->wormno) return 0;
X! # endif
X  	if(u.uhunger < 1500 && !u.uswallow) {
X  
X  	    if(mdef->data->mlet != S_COCKATRICE) {
X! # ifdef LINT	/* static char msgbuf[BUFSZ]; */
X  		char msgbuf[BUFSZ];
X! # else
X  		static char msgbuf[BUFSZ];
X! # endif
X  /* TODO: get the symbol display also to work (monster symbol is removed from
X   * the screen and you moved onto it, then you get moved back and it gets
X   * moved back if the monster survives--just like when monsters swallow you.
X***************
X*** 949,957 ****
X  				kludge("%s seems unhurt.", Monnam(mdef));
X  				dam = 0;
X  			    }
X! #ifdef GOLEMS
X  			    golemeffects(mdef,(int)mattk->adtyp,dam);
X! #endif
X  			} else dam = 0;
X  			break;
X  		    case AD_COLD:
X--- 967,975 ----
X  				kludge("%s seems unhurt.", Monnam(mdef));
X  				dam = 0;
X  			    }
X! # ifdef GOLEMS
X  			    golemeffects(mdef,(int)mattk->adtyp,dam);
X! # endif
X  			} else dam = 0;
X  			break;
X  		    case AD_COLD:
X***************
X*** 961,969 ****
X  				dam = 0;
X  			    } else
X  				kludge("%s is freezing to death!",Monnam(mdef));
X! #ifdef GOLEMS
X  			    golemeffects(mdef,(int)mattk->adtyp,dam);
X! #endif
X  			} else dam = 0;
X  			break;
X  		    case AD_FIRE:
X--- 979,987 ----
X  				dam = 0;
X  			    } else
X  				kludge("%s is freezing to death!",Monnam(mdef));
X! # ifdef GOLEMS
X  			    golemeffects(mdef,(int)mattk->adtyp,dam);
X! # endif
X  			} else dam = 0;
X  			break;
X  		    case AD_FIRE:
X***************
X*** 973,981 ****
X  				dam = 0;
X  			    } else
X  				kludge("%s is burning to a crisp!",Monnam(mdef));
X! #ifdef GOLEMS
X  			    golemeffects(mdef,(int)mattk->adtyp,dam);
X! #endif
X  			} else dam = 0;
X  			break;
X  		}
X--- 991,999 ----
X  				dam = 0;
X  			    } else
X  				kludge("%s is burning to a crisp!",Monnam(mdef));
X! # ifdef GOLEMS
X  			    golemeffects(mdef,(int)mattk->adtyp,dam);
X! # endif
X  			} else dam = 0;
X  			break;
X  		}
X***************
X*** 994,1022 ****
X  		kludge("You bite into %s", mon_nam(mdef));
X  		You("turn to stone...");
X  		killer = "poor choice of food";
X! 		done("stoned");
X  	    }
X  	}
X  	return(0);
X  }
X  
X! static void
X! missum(mdef)
X  register struct monst *mdef;
X  {
X! #ifdef POLYSELF
X! 	if (u.usym==S_NYMPH
X! #  ifdef SEDUCE
X! || ((u.umonnum==PM_INCUBUS || u.umonnum==PM_SUCCUBUS) && !incompatible(mdef))
X! #  endif
X! 									)
X  		kludge("You pretend to be friendly to %s.", mon_nam(mdef));
X  	else
X! #endif
X! 	if(!Blind && flags.verbose)  You("miss %s.", mon_nam(mdef));
X! 	else	    You("miss it.");
X! 	if(is_human(mdef->data) && !(mdef->msleep || mdef->mfroz))
X! 		wakeup(mdef);
X  }
X  
X  static boolean
X--- 1012,1035 ----
X  		kludge("You bite into %s", mon_nam(mdef));
X  		You("turn to stone...");
X  		killer = "poor choice of food";
X! 		done(STONING);
X  	    }
X  	}
X  	return(0);
X  }
X  
X! void
X! missum(mdef,mattk)
X  register struct monst *mdef;
X+ register struct attack *mattk;
X  {
X! 	if (could_seduce(&youmonst, mdef, mattk))
X  		kludge("You pretend to be friendly to %s.", mon_nam(mdef));
X+ 	else if(!Blind && flags.verbose)
X+ 		You("miss %s.", mon_nam(mdef));
X  	else
X! 		You("miss it.");
X! 	wakeup(mdef);
X  }
X  
X  static boolean
X***************
X*** 1031,1036 ****
X--- 1044,1050 ----
X  
X  	for(i = 0; i < NATTK; i++) {
X  
X+ 	    sum[i] = 0;
X  	    mattk = &(uasmon->mattk[i]);
X  	    switch(mattk->aatyp) {
X  		case AT_WEAP:
X***************
X*** 1054,1082 ****
X  			if (dhit && mattk->adtyp != AD_SPEL
X  				&& mattk->adtyp != AD_PHYS)
X  				sum[i] = damageum(mon,mattk);
X- 			else sum[i] = 0;
X  			break;
X  		case AT_CLAW:
X  			if (i==0 && uwep && humanoid(uasmon)) goto use_weapon;
X  		case AT_KICK:
X  		case AT_BITE:
X  		case AT_STNG:
X  		case AT_TUCH:
X  		case AT_BUTT:
X! 			if (i==0 && uwep && (u.usym==S_LICH
X! 				)) goto use_weapon;
X  			if(dhit = (tmp > rnd(20) || u.uswallow)) {
X! /* <----- <----- <----- <----- <----- <----- <----- <----- <----- */
X! if (!u.uswallow && (u.usym==S_NYMPH
X! #ifdef SEDUCE
X!   || ((u.umonnum==PM_INCUBUS || u.umonnum==PM_SUCCUBUS) && !incompatible(mon))
X! #endif
X! 									)) {
X! 		kludge("You %s %s %s.", mon->mblinded ? "talk to" : "smile at",
X! 			mon_nam(mon),
X! 			incompatible(mon) ? "engagingly" : "seductively");
X! }
X! /* <----- <----- <----- <----- <----- <----- <----- <----- <----- */
X  				else if (mattk->aatyp == AT_KICK)
X  					kludge("You kick %s.", mon_nam(mon));
X  				else if (mattk->aatyp == AT_BITE)
X--- 1068,1099 ----
X  			if (dhit && mattk->adtyp != AD_SPEL
X  				&& mattk->adtyp != AD_PHYS)
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+ 			 */
X+ 			if (i==1 && uwep && (u.umonnum == PM_SUCCUBUS ||
X+ 				u.umonnum == PM_INCUBUS)) goto use_weapon;
X+ # endif
X  		case AT_KICK:
X  		case AT_BITE:
X  		case AT_STNG:
X  		case AT_TUCH:
X  		case AT_BUTT:
X! 			if (i==0 && uwep && (u.usym==S_LICH)) goto use_weapon;
X  			if(dhit = (tmp > rnd(20) || u.uswallow)) {
X! 				int compat;
X! 
X! 				if (!u.uswallow &&
X! 				    (compat = could_seduce(&youmonst,
X! 							    mon, mattk)))
X! 				pline("You %s %s %s.",
X! 				    mon->mblinded ? "talk to" : "smile at",
X! 				    Blind ? "it" : mon_nam(mon),
X! 				    compat == 2 ? "engagingly" : "seductively");
X  				else if (mattk->aatyp == AT_KICK)
X  					kludge("You kick %s.", mon_nam(mon));
X  				else if (mattk->aatyp == AT_BITE)
X***************
X*** 1089,1098 ****
X  					kludge("You touch %s.", mon_nam(mon));
X  				else kludge("You hit %s.", mon_nam(mon));
X  				sum[i] = damageum(mon, mattk);
X! 			} else {
X! 				missum(mon);
X! 				sum[i] = 0;
X! 			}
X  			break;
X  
X  		case AT_HUGS:
X--- 1106,1113 ----
X  					kludge("You touch %s.", mon_nam(mon));
X  				else kludge("You hit %s.", mon_nam(mon));
X  				sum[i] = damageum(mon, mattk);
X! 			} else
X! 				missum(mon, mattk);
X  			break;
X  
X  		case AT_HUGS:
X***************
X*** 1100,1118 ****
X  			 * already grabbed in a previous attack
X  			 */
X  			dhit = 1;
X! 			if (sticks(mon->data)) sum[i] = 0;
X! 			else if (mon==u.ustuck) {
X! 			    kludge("%s is being %s.", Monnam(mon),
X! #ifdef GOLEMS
X! 				u.umonnum==PM_ROPE_GOLEM ? "choked":
X! #endif
X! 				"crushed");
X! 			    sum[i] = damageum(mon, mattk);
X! 			} else if(sum[i-1] && sum[i-2]) {
X! 			    kludge("You grab %s!", mon_nam(mon));
X! 			    u.ustuck = mon;
X! 			    sum[i] = damageum(mon, mattk);
X! 			} else sum[i] = 0;
X  			break;
X  
X  		case AT_EXPL:	/* automatic hit if next to */
X--- 1115,1133 ----
X  			 * already grabbed in a previous attack
X  			 */
X  			dhit = 1;
X! 			if (!sticks(mon->data))
X! 			    if (mon==u.ustuck) {
X! 				kludge("%s is being %s.", Monnam(mon),
X! # ifdef GOLEMS
X! 				    u.umonnum==PM_ROPE_GOLEM ? "choked":
X! # endif
X! 				    "crushed");
X! 				sum[i] = damageum(mon, mattk);
X! 			    } else if(sum[i-1] && sum[i-2]) {
X! 				kludge("You grab %s!", mon_nam(mon));
X! 				u.ustuck = mon;
X! 				sum[i] = damageum(mon, mattk);
X! 			    }
X  			break;
X  
X  		case AT_EXPL:	/* automatic hit if next to */
X***************
X*** 1123,1132 ****
X  		case AT_ENGL:
X  			if((dhit = (tmp > rnd(20+i))))
X  				sum[i]= gulpum(mon,mattk);
X! 			else {
X! 				missum(mon);
X! 				sum[i] = 0;
X! 			}
X  			break;
X  
X  		case AT_MAGC:
X--- 1138,1145 ----
X  		case AT_ENGL:
X  			if((dhit = (tmp > rnd(20+i))))
X  				sum[i]= gulpum(mon,mattk);
X! 			else
X! 				missum(mon, mattk);
X  			break;
X  
X  		case AT_MAGC:
X***************
X*** 1139,1145 ****
X  				)) goto use_weapon;
X  
X  		case AT_NONE:
X- 			sum[i] = 0;
X  			continue;
X  			/* Not break--avoid passive attacks from enemy */
X  
X--- 1152,1157 ----
X***************
X*** 1149,1162 ****
X  		case AT_BREA:
X  		case AT_SPIT:
X  		case AT_GAZE:	/* all done using #monster command */
X! 			sum[i] = dhit = 0;
X  			break;
X  	    }
X  	    if (dhit == -1)
X  		rehumanize();
X! 	    if(sum[i] == 2) return(passive(mon, 1, 0)); /* defender dead */
X  	    else {
X! 		(void) passive(mon, sum[i], 1);
X  		nsum |= sum[i];
X  	    }
X  	    if (uasmon == &playermon)
X--- 1161,1175 ----
X  		case AT_BREA:
X  		case AT_SPIT:
X  		case AT_GAZE:	/* all done using #monster command */
X! 			dhit = 0;
X  			break;
X  	    }
X  	    if (dhit == -1)
X  		rehumanize();
X! 	    if(sum[i] == 2) return(passive(mon, 1, 0, (mattk->aatyp==AT_KICK)));
X! 							/* defender dead */
X  	    else {
X! 		(void) passive(mon, sum[i], 1, (mattk->aatyp==AT_KICK));
X  		nsum |= sum[i];
X  	    }
X  	    if (uasmon == &playermon)
X***************
X*** 1167,1181 ****
X  	return(nsum);
X  }
X  
X! #endif
X  
X  /*	Special (passive) attacks on you by monsters done here.		*/
X  
X  int
X! passive(mon, mhit, malive)
X  register struct monst *mon;
X  register boolean mhit;
X  register int malive;
X  {
X  	register struct permonst *ptr = mon->data;
X  	register int i, tmp;
X--- 1180,1195 ----
X  	return(nsum);
X  }
X  
X! #endif /* POLYSELF */
X  
X  /*	Special (passive) attacks on you by monsters done here.		*/
X  
X  int
X! passive(mon, mhit, malive, kicked)
X  register struct monst *mon;
X  register boolean mhit;
X  register int malive;
X+ boolean kicked;
X  {
X  	register struct permonst *ptr = mon->data;
X  	register int i, tmp;
X***************
X*** 1201,1207 ****
X  			mdamageu(mon, tmp);
X  		if(!rn2(30)) corrode_armor();
X  	    }
X! 	    if(mhit && !rn2(6)) corrode_weapon();
X  	    break;
X  	  case AD_MAGM:
X  	    /* wrath of gods for attacking Oracle */
X--- 1215,1226 ----
X  			mdamageu(mon, tmp);
X  		if(!rn2(30)) corrode_armor();
X  	    }
X! 	    if(mhit && !rn2(6)) {
X! 		if (kicked) {
X! 		    if (uarmf)
X! 			(void) rust_dmg(uarmf, xname(uarmf), 1, TRUE);
X! 		} else corrode_weapon();
X! 	    }
X  	    break;
X  	  case AD_MAGM:
X  	    /* wrath of gods for attacking Oracle */
X***************
X*** 1306,1309 ****
X--- 1325,1357 ----
X  	    }
X  	}
X  	return(malive | mhit);
X+ }
X+ 
X+ /* Note: caller must ascertain mtmp->mimic... */
X+ void
X+ stumble_onto_mimic(mtmp)
X+ register struct monst *mtmp;
X+ {
X+ 	if(!u.ustuck && !mtmp->mflee && dmgtype(mtmp->data,AD_STCK))
X+ 		u.ustuck = mtmp;
X+ 	if (Blind) goto generic;
X+ 	else if (levl[u.ux+u.dx][u.uy+u.dy].scrsym == DOOR_SYM)
X+ #ifdef SPELLS
X+ 	{
X+ 		if (IS_ROCK(levl[u.ux+u.dx][u.uy+u.dy].typ) ||
X+ 		    IS_DOOR(levl[u.ux+u.dx][u.uy+u.dy].typ))
X+ #endif
X+ 			pline("The door actually was %s.", defmonnam(mtmp));
X+ #ifdef SPELLS
X+ 		else
X+ 			pline("That spellbook was %s.", defmonnam(mtmp));
X+ 	}
X+ #endif
X+ 	else if (levl[u.ux+u.dx][u.uy+u.dy].scrsym == GOLD_SYM)
X+ 		pline("That gold was %s!", defmonnam(mtmp));
X+ 	else {
X+ generic:
X+ 		pline("Wait!  That's %s!", defmonnam(mtmp));
X+ 	}
X+ 	wakeup(mtmp);	/* clears mtmp->mimic */
X  }
X*** src/Old/unixmain.c	Wed Aug 16 12:48:29 1989
X--- src/unixmain.c	Tue Aug 15 22:05:14 1989
X***************
X*** 67,74 ****
X  	}
X  #endif /* CHDIR /**/
X  	/* Set the default values of the presentation characters */
X! 	(void) memcpy((char *) &showsyms, 
X! 		(char *) &defsyms, sizeof(struct symbols));
X  	initoptions();
X  	whoami();
X  	/*
X--- 67,74 ----
X  	}
X  #endif /* CHDIR /**/
X  	/* Set the default values of the presentation characters */
X! 	(void) memcpy((genericptr_t) &showsyms,
X! 		(genericptr_t) &defsyms, sizeof(struct symbols));
X  	initoptions();
X  	whoami();
X  	/*
X***************
X*** 240,247 ****
X  		/* get shopkeeper set properly if restore is in shop */
X  		(void) inshop();
X  #ifdef EXPLORE_MODE
X! 		if (discover) {
X  			You("are in non-scoring discovery mode.");
X  			pline("Do you want to keep the save file? ");
X  			if(yn() == 'n')
X  				(void) unlink(SAVEF);
X--- 240,250 ----
X  		/* get shopkeeper set properly if restore is in shop */
X  		(void) inshop();
X  #ifdef EXPLORE_MODE
X! 		if (discover)
X  			You("are in non-scoring discovery mode.");
X+ #endif
X+ #if defined(EXPLORE_MODE) || defined(WIZARD)
X+ 		if (discover || wizard) {
X  			pline("Do you want to keep the save file? ");
X  			if(yn() == 'n')
X  				(void) unlink(SAVEF);
X***************
X*** 305,311 ****
X  #endif
X  			    if(u.uhp < 1) {
X  				You("die...");
X! 				done("died");
X  			    }
X  #ifdef POLYSELF
X  			if (u.mtimedone) {
X--- 308,314 ----
X  #endif
X  			    if(u.uhp < 1) {
X  				You("die...");
X! 				done(DIED);
X  			    }
X  #ifdef POLYSELF
X  			if (u.mtimedone) {
X*** src/Old/unixtty.c	Wed Aug 16 12:48:50 1989
X--- src/unixtty.c	Tue Aug 15 22:59:01 1989
X***************
X*** 37,42 ****
X--- 37,44 ----
X  #define CBRKMASK	ICANON
X  #define CBRKON		! /* reverse condition */
X  #define OSPEED(x)	((x).c_cflag & CBAUD)
X+ #define inputflags	c_iflag
X+ #define STRIPHI		ISTRIP
X  #define GTTY(x)		(ioctl(0, TCGETA, x))
X  /* STTY now modified to run under Sys V R3.	- may have to be #ifdef'ed */
X  #define STTY(x)		(ioctl(0, TCSETAW, x))	/* TCSETAF? TCSETAW? */
X***************
X*** 59,64 ****
X--- 61,68 ----
X  #define cbrkflgs	sg_flags
X  #define CBRKMASK	CBREAK
X  #define CBRKON		/* empty */
X+ #define inputflags	sg_flags	/* don't know how enabling meta bits */
X+ #define STRIPHI		0		/* should actually be done on BSD */
X  #define OSPEED(x)	(x).sg_ospeed
X  #define GTTY(x)		(gtty(0, x))
X  #define STTY(x)		(stty(0, x))
X***************
X*** 118,123 ****
X--- 122,128 ----
X  		perror("NetHack (settty)");
X  	flags.echo = (inittyb.echoflgs & ECHO) ? ON : OFF;
X  	flags.cbreak = (CBRKON(inittyb.cbrkflgs & CBRKMASK)) ? ON : OFF;
X+ 	curttyb.inputflags |= STRIPHI;
X  	setioctls();
X  }
X  
X***************
X*** 148,153 ****
X--- 153,159 ----
X  #endif
X  		change++;
X  	}
X+ 	curttyb.inputflags &=~ STRIPHI;
X  	/* If an interrupt character is used, it will be overriden and
X  	 * set to ^C.
X  	 */
X*** src/Old/unixunix.c	Wed Aug 16 12:49:07 1989
X--- src/unixunix.c	Tue Aug  1 20:39:25 1989
X***************
X*** 331,342 ****
X  	/* avoid problems with 14 character file name limit */
X  # ifdef COMPRESS
X  	if(strlen(s) > 10)
X! 		/* leave room for .e from error and .Z from compress */
X  		s[10] = '\0';
X  # else
X! 	if(strlen(s) > 12)
X! 		/* leave room for .e from error */
X! 		s[12] = '\0';
X  # endif
X  #endif
X  }
X--- 331,343 ----
X  	/* avoid problems with 14 character file name limit */
X  # ifdef COMPRESS
X  	if(strlen(s) > 10)
X! 		/* leave room for .e from error and .Z from compress
X! 		 * appended to save files */
X  		s[10] = '\0';
X  # else
X! 	if(strlen(s) > 11)
X! 		/* leave room for .nn appended to level files */
X! 		s[11] = '\0';
X  # endif
X  #endif
X  }
END_OF_FILE
if test 54146 -ne `wc -c <'patch02d'`; then
    echo shar: \"'patch02d'\" unpacked with wrong size!
fi
# end of 'patch02d'
fi
echo shar: End of archive 4 \(of 7\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 7 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 7 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0