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