billr@saab.CNA.TEK.COM (Bill Randle) (09/30/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 8, Issue 38 Archive-name: NetHack3/Patch4b 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 2 (of 11)." # Contents: patches04b # Wrapped by billr@saab on Fri Sep 29 13:13:32 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'patches04b' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patches04b'\" else echo shar: Extracting \"'patches04b'\" \(53375 characters\) sed "s/^X//" >'patches04b' <<'END_OF_FILE' X*** src/Old/end.c Wed Sep 27 11:25:17 1989 X--- src/end.c Tue Sep 26 17:47:43 1989 X*************** X*** 4,9 **** X--- 4,11 ---- X X /* block some unused #defines to avoid overloading some cpp's */ X #define MONATTK_H X+ #define NEED_VARARGS X+ X #include "hack.h" X #ifndef NO_SIGNAL X #include <signal.h> X*************** X*** 56,66 **** X curs_on_u(); X (void) fflush(stdout); X if(multi > 0) nomul(0); X return 0; X } X! #if defined(WIZARD) && defined(UNIX) X if(wizard) { X pline("Dump core? "); X if(yn() == 'y') { X (void) signal(SIGINT, (SIG_RET_TYPE) done1); X settty(NULL); X--- 58,73 ---- X curs_on_u(); X (void) fflush(stdout); X if(multi > 0) nomul(0); X+ multi = 0; X return 0; X } X! #if defined(WIZARD) && (defined(UNIX) || defined(VMS)) X if(wizard) { X+ #ifdef VMS X+ pline("Enter debugger? "); X+ #else X pline("Dump core? "); X+ #endif X if(yn() == 'y') { X (void) signal(SIGINT, (SIG_RET_TYPE) done1); X settty(NULL); X*************** X*** 83,89 **** X done_stopprint++; X #ifndef NO_SIGNAL X (void) signal(SIGINT, SIG_IGN); X! #ifdef UNIX X (void) signal(SIGQUIT, SIG_IGN); X #endif X #endif /* TOS /* */ X--- 90,96 ---- X done_stopprint++; X #ifndef NO_SIGNAL X (void) signal(SIGINT, SIG_IGN); X! #if defined(UNIX) || defined(VMS) X (void) signal(SIGQUIT, SIG_IGN); X #endif X #endif /* TOS /* */ X*************** X*** 90,96 **** X return 0; X } X X! #ifdef UNIX X static X int X done_hangup(){ X--- 97,103 ---- X return 0; X } X X! #if defined(UNIX) || defined(VMS) X static X int X done_hangup(){ X*************** X*** 148,156 **** X extern boolean hu; /* from save.c */ X X void X! panic(str,a1,a2,a3,a4,a5,a6) X! char *str; X! { X if(panicking++) X #ifdef SYSV X (void) X--- 155,163 ---- X extern boolean hu; /* from save.c */ X X void X! panic VA_DECL(char *, str) X! VA_START(str); X! VA_INIT(str, char *); X if(panicking++) X #ifdef SYSV X (void) X*************** X*** 159,187 **** X /* was exit(1) */ X home(); cls(); X (void) puts(" Suddenly, the dungeon collapses."); X! #ifdef WIZARD X! # ifndef MSDOS X if(!wizard) { X pline("Report error to %s and it may be possible to rebuild.",WIZARD); X more(); X } X! Sprintf (SAVEF, "%s.e", SAVEF); X hu = FALSE; X (void) dosave0(); X- # endif X #endif X (void) fputs(" ERROR: ", stdout); X! Printf(str,a1,a2,a3,a4,a5,a6); X more(); /* contains a fflush() */ X! #ifdef WIZARD X! # ifdef UNIX X if (wizard) X! # ifdef SYSV X (void) X- # endif X- abort(); /* generate core dump */ X # endif X #endif X done(PANICKED); X } X X--- 166,201 ---- X /* was exit(1) */ X home(); cls(); X (void) puts(" Suddenly, the dungeon collapses."); X! #if defined(WIZARD) && !defined(MSDOS) X if(!wizard) { X pline("Report error to %s and it may be possible to rebuild.",WIZARD); X more(); X } X! #ifdef VMS X! { X! char *sem = rindex(SAVEF, ';'); X! X! if (sem) X! *sem = '\0'; X! } X! Strcat(SAVEF, ".e;1"); X! #else X! Strcat(SAVEF, ".e"); X! #endif X hu = FALSE; X (void) dosave0(); X #endif X (void) fputs(" ERROR: ", stdout); X! Vprintf(str,VA_ARGS); X more(); /* contains a fflush() */ X! #if defined(WIZARD) && (defined(UNIX) || defined(VMS)) X if (wizard) X! # ifdef SYSV X (void) X # endif X+ abort(); /* generate core dump */ X #endif X+ VA_END(); X done(PANICKED); X } X X*************** X*** 257,263 **** X die: X #ifndef NO_SIGNAL X (void) signal(SIGINT, (SIG_RET_TYPE) done_intr); X! #ifdef UNIX X (void) signal(SIGQUIT, (SIG_RET_TYPE) done_intr); X (void) signal(SIGHUP, (SIG_RET_TYPE) done_hangup); X #endif X--- 271,277 ---- X die: X #ifndef NO_SIGNAL X (void) signal(SIGINT, (SIG_RET_TYPE) done_intr); X! #if defined(UNIX) || defined(VMS) X (void) signal(SIGQUIT, (SIG_RET_TYPE) done_intr); X (void) signal(SIGHUP, (SIG_RET_TYPE) done_hangup); X #endif X*************** X*** 406,412 **** X continue; X } X u.urexp += i; X! Printf(" %s (worth %ld Zorkmids),\n", X doname(otmp), i); X } else if(otmp->olet == AMULET_SYM) { X otmp->known = 1; X--- 420,426 ---- X continue; X } X u.urexp += i; X! Printf(" %s (worth %ld zorkmids),\n", X doname(otmp), i); X } else if(otmp->olet == AMULET_SYM) { X otmp->known = 1; X*************** X*** 414,420 **** X otmp->otyp == AMULET_OF_YENDOR ? X 5000 : 500; X u.urexp += i; X! Printf(" %s (worth %ld Zorkmids),\n", X doname(otmp), i); X } X } X--- 428,434 ---- X otmp->otyp == AMULET_OF_YENDOR ? X 5000 : 500; X u.urexp += i; X! Printf(" %s (worth %ld zorkmids),\n", X doname(otmp), i); X } X } X*************** X*** 467,475 **** X if (ramdisk) X eraseall(permbones, alllevels); X #else X! #if defined(UNIX) || (defined(MSDOS) && !defined(OLD_TOS)) X register int x; X! #ifdef UNIX X (void) signal(SIGHUP,SIG_IGN); X #endif X for(x = maxdlevel; x >= 0; x--) { X--- 481,489 ---- X if (ramdisk) X eraseall(permbones, alllevels); X #else X! #if defined(UNIX) || (defined(MSDOS) && !defined(OLD_TOS)) || defined(VMS) X register int x; X! #if defined(UNIX) || defined(VMS) X (void) signal(SIGHUP,SIG_IGN); X #endif X for(x = maxdlevel; x >= 0; x--) { X*************** X*** 486,492 **** X--- 500,508 ---- X { X (void) signal(SIGINT, SIG_IGN); X clearlocks(); X+ # ifndef VMS X exit(1); X+ # endif X } X #endif X X*************** X*** 494,499 **** X--- 510,516 ---- X end_box_display() X { X register struct obj *box, *obj; X+ int boxcnt = 0; X char buf[BUFSZ]; X X for(box=invent; box; box=box->nobj) { X*************** X*** 504,510 **** X if (obj->cobj == box) { X if (!cnt) { X Sprintf(buf, "Contents of the %s:",xname(box)); X! cornline(0, buf); X } X makeknown(obj->otyp); X obj->known = obj->bknown = obj->dknown = 1; X--- 521,530 ---- X if (obj->cobj == box) { X if (!cnt) { X Sprintf(buf, "Contents of the %s:",xname(box)); X! if (!boxcnt) X! cornline(0, buf); X! else X! cornline(1, buf); X } X makeknown(obj->otyp); X obj->known = obj->bknown = obj->dknown = 1; X*************** X*** 512,519 **** X cnt++; X } X } X! if (!cnt) pline("The %s is empty.", xname(box)); X! else cornline(2,""); X } X } X } X--- 532,547 ---- X cnt++; X } X } X! if (!cnt) { X! Sprintf(buf, "The %s is empty.", xname(box)); X! if (!boxcnt) X! cornline(0, buf); X! else X! cornline(1, buf); X! } else X! cornline(1," "); X! boxcnt++; X } X } X+ if (boxcnt) cornline(2,""); X } X*** src/Old/engrave.c Wed Sep 27 11:25:51 1989 X--- src/engrave.c Sun Sep 24 19:41:27 1989 X*************** X*** 320,325 **** X--- 320,334 ---- X type = DUST; X } X } X+ if (otmp->spe < 0 && type != POLY) { X+ dust: X+ /* If POLY, polymorph the writing and _then_ become dust. */ X+ pline("The %s %sturns to dust.", X+ xname(otmp), Blind ? "" : "glows violently, then "); X+ You("are not going to get anywhere writing in the dust with your dust..."); X+ useup(otmp); X+ return(1); X+ } X if(type == DUST) X You("write in the dust with %s.", X doname(otmp)); X*************** X*** 362,368 **** X del_engr(oep); X oep = 0; X } X! if(type == DUST && oep) { X You("cannot wipe out the message that is %s in the rock.", X (oep->engr_type == BURN) ? "burned" : X (oep->engr_type == ENGRAVE) ? "engraved" : "scribbled"); X--- 371,377 ---- X del_engr(oep); X oep = 0; X } X! if(oep) { X You("cannot wipe out the message that is %s in the rock.", X (oep->engr_type == BURN) ? "burned" : X (oep->engr_type == ENGRAVE) ? "engraved" : "scribbled"); X*************** X*** 518,524 **** X case WAN_STRIKING: X pline("The %s unsuccessfully fights your attempt to write!",xname(otmp)); X } X! X return(1); X } X X--- 527,533 ---- X case WAN_STRIKING: X pline("The %s unsuccessfully fights your attempt to write!",xname(otmp)); X } X! if (otmp->otyp == WAN_POLYMORPH && otmp->spe < 0) goto dust; X return(1); X } X X*** src/Old/fountain.c Wed Sep 27 11:27:12 1989 X--- src/fountain.c Mon Sep 25 21:34:53 1989 X*************** X*** 11,19 **** X void X dowatersnakes() /* Fountain of snakes! */ { X register int num = rnd(6); X! if (!(mons[PM_WATER_MOCCASIN].geno & G_GENOD)) { /* && chgd to &*/ X! X! pline("Good Lord! An endless stream of snakes pours forth!"); X while(num-- > 0) (void) makemon(&mons[PM_WATER_MOCCASIN],u.ux,u.uy); X } else X pline("The fountain bubbles furiously for a moment, then calms."); X--- 11,18 ---- X void X dowatersnakes() /* Fountain of snakes! */ { X register int num = rnd(6); X! if (!(mons[PM_WATER_MOCCASIN].geno & G_GENOD)) { X! pline("An endless stream of snakes pours forth!"); X while(num-- > 0) (void) makemon(&mons[PM_WATER_MOCCASIN],u.ux,u.uy); X } else X pline("The fountain bubbles furiously for a moment, then calms."); X*************** X*** 105,111 **** X X void X dryup(){ X! if (!rn2(3) && (levl[u.ux][u.uy].typ == FOUNTAIN)) { X pline("The fountain dries up!"); X levl[u.ux][u.uy].typ = ROOM; X levl[u.ux][u.uy].doormask = 0; X--- 104,110 ---- X X void X dryup(){ X! if (!rn2(3) && IS_FOUNTAIN(levl[u.ux][u.uy].typ)) { X pline("The fountain dries up!"); X levl[u.ux][u.uy].typ = ROOM; X levl[u.ux][u.uy].doormask = 0; X*** src/Old/getline.c Wed Sep 27 11:27:39 1989 X--- src/getline.c Sat Sep 23 00:47:46 1989 X*************** X*** 9,15 **** X * Some systems may have getchar() return EOF for various reasons, and X * we should not quit before seeing at least NR_OF_EOFS consecutive EOFs. X */ X! #ifdef SYSV X #define NR_OF_EOFS 20 X #endif X X--- 9,15 ---- X * Some systems may have getchar() return EOF for various reasons, and X * we should not quit before seeing at least NR_OF_EOFS consecutive EOFs. X */ X! #if defined(SYSV) || defined(DGUX) X #define NR_OF_EOFS 20 X #endif X X*************** X*** 123,129 **** X #else X static char in_line[COLNO]; X #endif X! register int foo; X X multi = 0; X flags.move = 1; X--- 123,130 ---- X #else X static char in_line[COLNO]; X #endif X! register int foo, cnt = 0; X! boolean prezero = FALSE; X X multi = 0; X flags.move = 1; X*************** X*** 141,147 **** X--- 142,156 ---- X Printf("Count: %d", multi); X } X last_multi = multi; X+ if(!cnt && foo == '0') prezero = TRUE; X+ cnt++; X } X+ if (foo == '\033') { /* esc cancels count (TH) */ X+ remember_topl(); X+ home(); X+ cl_end(); X+ multi = last_multi = 0; X+ } X # ifdef REDO X if (foo == DOAGAIN || in_doagain) X multi = last_multi; X*************** X*** 171,176 **** X--- 180,186 ---- X in_line[2] = 0; X } X clrlin(); X+ if(prezero) in_line[0] = '\033'; X return(in_line); X } X X*** src/Old/hack.c Wed Sep 27 11:28:02 1989 X--- src/hack.c Mon Sep 25 21:29:34 1989 X*************** X*** 63,69 **** X for(y = u.uy-1; y < u.uy+2; y++) { X if(!isok(x, y)) continue; X lev = &levl[x][y]; X! if(lev->mmask) unpmon(m_at(x,y)); X if(!lev->lit && lev->scrsym == ROOM_SYM) { X lev->seen = 0; X atl(x, y, (char)STONE_SYM); X--- 63,70 ---- X for(y = u.uy-1; y < u.uy+2; y++) { X if(!isok(x, y)) continue; X lev = &levl[x][y]; X! if(MON_AT(x, y)) X! unpmon(m_at(x,y)); X if(!lev->lit && lev->scrsym == ROOM_SYM) { X lev->seen = 0; X atl(x, y, (char)STONE_SYM); X*************** X*** 95,101 **** X if(isok(rx,ry) && !IS_ROCK(levl[rx][ry].typ) && X (!IS_DOOR(levl[rx][ry].typ) || !(u.dx && u.dy)) && X !sobj_at(BOULDER, rx, ry)) { X! if(levl[rx][ry].mmask) { X mtmp = m_at(rx,ry); X if(canseemon(mtmp)) X pline("There's %s on the other side.", X--- 96,102 ---- X if(isok(rx,ry) && !IS_ROCK(levl[rx][ry].typ) && X (!IS_DOOR(levl[rx][ry].typ) || !(u.dx && u.dy)) && X !sobj_at(BOULDER, rx, ry)) { X! if(MON_AT(rx, ry)) { X mtmp = m_at(rx,ry); X if(canseemon(mtmp)) X pline("There's %s on the other side.", X*************** X*** 119,124 **** X--- 120,130 ---- X pline("It completely fills the pit!"); X continue; X case TRAPDOOR: X+ if(is_maze_lev X+ #ifdef STRONGHOLD X+ && (dlevel > stronghold_level) X+ #endif X+ ) break; X pline("The boulder falls into and plugs a hole in the ground!"); X deltrap(ttmp); X delobj(otmp); X*************** X*** 361,367 **** X #endif X } X } X! if (levl[x][y].mmask) { X mtmp = m_at(x,y); X /* Don't attack if you're running */ X if (flags.run && !mtmp->mimic && X--- 367,373 ---- X #endif X } X } X! if (MON_AT(x, y)) { X mtmp = m_at(x,y); X /* Don't attack if you're running */ X if (flags.run && !mtmp->mimic && X*************** X*** 490,496 **** X X movobj(uball, uchain->ox, uchain->oy); X unpobj(uball); /* BAH %% */ X! place_object(uchain, u.ux, u.uy); X nomul(-2); X nomovemsg = ""; X nodrag: ; X--- 496,502 ---- X X movobj(uball, uchain->ox, uchain->oy); X unpobj(uball); /* BAH %% */ X! move_object(uchain, u.ux, u.uy); X nomul(-2); X nomovemsg = ""; X nodrag: ; X*************** X*** 568,574 **** X #ifdef POLYSELF X if (hides_under(uasmon)) X u.uundetected = (OBJ_AT(u.ux, u.uy) || levl[u.ux][u.uy].gmask); X! else if (u.dx || u.dy) { /* i.e. piercer */ X if (u.usym == S_MIMIC_DEF) X u.usym = S_MIMIC; X u.uundetected = 0; X--- 574,580 ---- X #ifdef POLYSELF X if (hides_under(uasmon)) X u.uundetected = (OBJ_AT(u.ux, u.uy) || levl[u.ux][u.uy].gmask); X! else if (u.dx || u.dy) { /* piercer */ X if (u.usym == S_MIMIC_DEF) X u.usym = S_MIMIC; X u.uundetected = 0; X*************** X*** 691,697 **** X if(Blind || flags.run == 0) return; X for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++) { X if(x == u.ux && y == u.uy) continue; X! if(levl[x][y].mmask && (mtmp = m_at(x,y)) && !mtmp->mimic && X (!mtmp->minvis || See_invisible) && !mtmp->mundetected) { X if((flags.run != 1 && !mtmp->mtame) || (x == u.ux+u.dx && y == u.uy+u.dy)) X goto stop; X--- 697,703 ---- X if(Blind || flags.run == 0) return; X for(x = u.ux-1; x <= u.ux+1; x++) for(y = u.uy-1; y <= u.uy+1; y++) { X if(x == u.ux && y == u.uy) continue; X! if(MON_AT(x, y) && (mtmp = m_at(x,y)) && !mtmp->mimic && X (!mtmp->minvis || See_invisible) && !mtmp->mundetected) { X if((flags.run != 1 && !mtmp->mtame) || (x == u.ux+u.dx && y == u.uy+u.dy)) X goto stop; X*************** X*** 792,798 **** X for(x = u.ux-1; x <= u.ux+1; x++) X for(y = u.uy-1; y <= u.uy+1; y++) { X if(x == u.ux && y == u.uy) continue; X! if(levl[x][y].mmask && (mtmp = m_at(x,y)) && !mtmp->mimic && X !mtmp->mtame && !mtmp->mpeaceful && X !noattacks(mtmp->data) && X !mtmp->mfroz && !mtmp->msleep && /* aplvax!jcn */ X--- 798,804 ---- X for(x = u.ux-1; x <= u.ux+1; x++) X for(y = u.uy-1; y <= u.uy+1; y++) { X if(x == u.ux && y == u.uy) continue; X! if(MON_AT(x, y) && (mtmp = m_at(x,y)) && !mtmp->mimic && X !mtmp->mtame && !mtmp->mpeaceful && X !noattacks(mtmp->data) && X !mtmp->mfroz && !mtmp->msleep && /* aplvax!jcn */ X*************** X*** 809,815 **** X { X if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0); X if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR && X! !levl[x][y].mmask && !levl[u.ux][u.uy].lit) X return(0); X if(dist(x,y) < 3) return(1); X if(levl[x][y].lit && X--- 815,821 ---- X { X if(Blind || (u.uswallow && (x != u.ux || y != u.uy))) return(0); X if(IS_ROCK(levl[x][y].typ) && levl[u.ux][u.uy].typ == CORR && X! !MON_AT(x, y) && !levl[u.ux][u.uy].lit) X return(0); X if(dist(x,y) < 3) return(1); X if(levl[x][y].lit && X*** src/Old/invent.c Wed Sep 27 11:28:57 1989 X--- src/invent.c Sat Sep 23 01:23:44 1989 X*************** X*** 245,288 **** X #endif X } X X- struct monst * X- m_at(x,y) X- register int x, y; X- { X- register struct monst *mtmp; X- #ifdef WORM X- register struct wseg *wtmp; X- m_atseg = 0; X- #endif X- X- for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){ X- if(mtmp->mx == x && mtmp->my == y) X- return(mtmp); X- #ifdef WORM X- if(mtmp->wormno){ X- for(wtmp = wsegs[mtmp->wormno]; wtmp; wtmp = wtmp->nseg) X- if(wtmp->wx == x && wtmp->wy == y){ X- m_atseg = wtmp; X- return(mtmp); X- } X- } X- #endif X- } X- return((struct monst *)0); X- } X- X struct obj * X- o_at(x,y) X- register int x, y; X- { X- register struct obj *otmp; X- X- for(otmp = fobj; otmp; otmp = otmp->nobj) X- if(otmp->ox == x && otmp->oy == y) return(otmp); X- return((struct obj *)0); X- } X- X- struct obj * X sobj_at(n,x,y) X register int n, x, y; X { X--- 245,251 ---- X*************** X*** 289,296 **** X register struct obj *otmp; X X if(OBJ_AT(x, y)) X! for(otmp = fobj; otmp; otmp = otmp->nobj) X! if(otmp->ox == x && otmp->oy == y && otmp->otyp == n) X return(otmp); X return((struct obj *)0); X } X--- 252,259 ---- X register struct obj *otmp; X X if(OBJ_AT(x, y)) X! for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) X! if(otmp->otyp == n) X return(otmp); X return((struct obj *)0); X } X*************** X*** 385,390 **** X--- 348,354 ---- X boolean allownone = FALSE; X xchar foox = 0; X long cnt; X+ boolean prezero = FALSE; X X if(*let == '0') let++, allowcnt = 1; X if(*let == GOLD_SYM) let++, X*************** X*** 475,480 **** X--- 439,445 ---- X } X cnt = 0; X ilet = readchar(); X+ if(ilet == '0') prezero = TRUE; X while(digit(ilet) && allowcnt) { X #ifdef REDO X if (ilet != '?' && ilet != '*') savech(ilet); X*************** X*** 503,508 **** X--- 468,474 ---- X You("are not carrying any gold."); X return(struct obj *)0; X } X+ if(cnt == 0 && prezero) return((struct obj *)0); X if(!(allowcnt == 2 && cnt < u.ugold)) X cnt = u.ugold; X return(mkgoldobj(cnt)); X*************** X*** 512,518 **** X * counts for other things since the throw code will X * split off a single item anyway */ X allowcnt = 1; X! if(cnt != 1) { X pline("You can only throw one item at a time."); X continue; X } X--- 478,485 ---- X * counts for other things since the throw code will X * split off a single item anyway */ X allowcnt = 1; X! if(cnt == 0 && prezero) return((struct obj *)0); X! if(cnt > 1) { X pline("You can only throw one item at a time."); X continue; X } X*************** X*** 973,979 **** X X read_engr_at(u.ux, u.uy); /* Eric Backus */ X if(!u.uswallow) { X! otmp0 = o_at(u.ux, u.uy); X gold = g_at(u.ux, u.uy); X } else { X You("%s no objects here.", verb); X--- 940,946 ---- X X read_engr_at(u.ux, u.uy); /* Eric Backus */ X if(!u.uswallow) { X! otmp0 = level.objects[u.ux][u.uy]; X gold = g_at(u.ux, u.uy); X } else { X You("%s no objects here.", verb); X*************** X*** 1064,1070 **** X } X X cornline(0, "Things that are here:"); X! for(otmp = otmp0; otmp; otmp = otmp->nobj) { X if(otmp->ox == u.ux && otmp->oy == u.uy) { X ct++; X cornline(1, doname(otmp)); X--- 1031,1037 ---- X } X X cornline(0, "Things that are here:"); X! for(otmp = otmp0; otmp; otmp = otmp->nexthere) { X if(otmp->ox == u.ux && otmp->oy == u.uy) { X ct++; X cornline(1, doname(otmp)); X*************** X*** 1129,1139 **** X else if((obj->olet==WEAPON_SYM || obj->olet==ARMOR_SYM) && X obj->rustfree != otmp->rustfree) return FALSE; X X else if(obj->otyp == CORPSE || obj->otyp == EGG || obj->otyp == TIN) X return( (obj->corpsenm == otmp->corpsenm) && X (!ONAME(obj) || !strcmp(ONAME(obj), ONAME(otmp))) ); X X! else if(obj->known == otmp->known || !uses_known(otmp)) { X return(objects[obj->otyp].oc_merge); X } else return(FALSE); X } X--- 1096,1110 ---- X else if((obj->olet==WEAPON_SYM || obj->olet==ARMOR_SYM) && X obj->rustfree != otmp->rustfree) return FALSE; X X+ else if(obj->olet == FOOD_SYM && OEATEN(obj) != OEATEN(otmp)) X+ return(FALSE); X+ X else if(obj->otyp == CORPSE || obj->otyp == EGG || obj->otyp == TIN) X return( (obj->corpsenm == otmp->corpsenm) && X (!ONAME(obj) || !strcmp(ONAME(obj), ONAME(otmp))) ); X X! else if(obj->known == otmp->known || X! !objects[otmp->otyp].oc_uses_known) { X return(objects[obj->otyp].oc_merge); X } else return(FALSE); X } X*** src/Old/ioctl.c Wed Sep 27 11:30:06 1989 X--- src/ioctl.c Fri Sep 15 09:44:18 1989 X*************** X*** 8,13 **** X--- 8,14 ---- X X /* block some unused #defines to avoid overloading some cpp's */ X #define MONATTK_H X+ #define MONFLAG_H X #include "hack.h" X X #if defined(BSD) || defined(ULTRIX) X*** src/Old/lev_comp.y Wed Sep 27 11:32:26 1989 X--- src/lev_comp.y Tue Sep 26 16:18:27 1989 X*************** X*** 12,18 **** X #define MONDATA_H X #include "hack.h" X #include "sp_lev.h" X! #include <fcntl.h> X X #ifdef AMIGA X char *fgets(); X--- 12,23 ---- X #define MONDATA_H X #include "hack.h" X #include "sp_lev.h" X! #ifndef O_WRONLY X! # include <fcntl.h> X! #endif X! #ifndef O_CREAT /* some older BSD systems do not define O_CREAT in <fcntl.h> */ X! # include <sys/file.h> X! #endif X X #ifdef AMIGA X char *fgets(); X*** src/Old/lev_main.c Wed Sep 27 11:34:00 1989 X--- src/lev_main.c Sat Sep 16 17:53:54 1989 X*************** X*** 26,32 **** X--- 26,37 ---- X yyparse(); X else /* Otherwise every argument is a filename */ X for(i=1; i<argc; i++) { X+ #ifdef VMS X+ extern FILE *yyin; X+ yyin = fin = fopen(argv[i], "r"); X+ #else X fin = freopen(argv[i], "r", stdin); X+ #endif X fname = argv[i]; X if (!fin) X fprintf(stderr,"Can't open %s\n", argv[i]); X*** src/Old/lock.c Wed Sep 27 11:34:30 1989 X--- src/lock.c Thu Sep 14 14:11:20 1989 X*************** X*** 228,234 **** X struct monst *mtmp; X X door = &levl[x][y]; X! if (door->mmask && canseemon(mtmp = m_at(x,y)) && !mtmp->mimic) { X if (picktyp == CREDIT_CARD && X #ifdef ORACLE X (mtmp->isshk || mtmp->data == &mons[PM_ORACLE])) X--- 228,234 ---- X struct monst *mtmp; X X door = &levl[x][y]; X! if (MON_AT(x, y) && canseemon(mtmp = m_at(x,y)) && !mtmp->mimic) { X if (picktyp == CREDIT_CARD && X #ifdef ORACLE X (mtmp->isshk || mtmp->data == &mons[PM_ORACLE])) X*************** X*** 373,379 **** 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--- 373,379 ---- X y = u.uy + u.dy; X if((x == u.ux) && (y == u.uy)) return(0); X X! if(MON_AT(x, y) && (mtmp = m_at(x,y))->mimic && X mtmp->mappearance == DOOR_SYM && X !Protection_from_shape_changers) { X stumble_onto_mimic(mtmp); X*************** X*** 430,436 **** X obstructed(x,y) X register int x, y; X { X! if(levl[x][y].mmask) { X if (m_at(x,y)->mimic) goto obj; X pline("%s stands in the way!", Blind ? X "Some creature" : Monnam(m_at(x,y))); X--- 430,436 ---- X obstructed(x,y) X register int x, y; X { X! if(MON_AT(x, y)) { X if (m_at(x,y)->mimic) goto obj; X pline("%s stands in the way!", Blind ? X "Some creature" : Monnam(m_at(x,y))); X*************** X*** 459,465 **** 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--- 459,465 ---- X return(1); X } X X! if(MON_AT(x, y) && (mtmp = m_at(x,y))->mimic && X mtmp->mappearance == DOOR_SYM && X !Protection_from_shape_changers) { X stumble_onto_mimic(mtmp); X*************** X*** 624,630 **** 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--- 624,630 ---- X #endif X if(door->doormask & (D_LOCKED | D_CLOSED)) { X if(door->doormask & D_TRAPPED) { X! if (MON_AT(x, y)) X (void) mb_trapped(m_at(x,y)); X else if (flags.verbose) X if (cansee(x,y)) X*** src/Old/mail.c Wed Sep 27 11:49:09 1989 X--- src/mail.c Tue Sep 26 17:24:55 1989 X*************** X*** 9,16 **** X #ifdef MAIL X X # ifdef UNIX X! #include <sys/stat.h> X # endif X X /* X * Notify user when new mail has arrived. [Idea from Merlyn Leroy, but X--- 9,21 ---- X #ifdef MAIL X X # ifdef UNIX X! # include <sys/stat.h> X! # include <pwd.h> X # endif X+ # ifdef VMS X+ # include <descrip.h> X+ # include <ssdef.h> X+ # endif X X /* X * Notify user when new mail has arrived. [Idea from Merlyn Leroy, but X*************** X*** 19,27 **** X * hack should do the paging itself. But when I get mail, I want to put it X * in some folder, reply, etc. - it would be unreasonable to put all these X * functions in hack. } X! * The motion of the mail daemon is less restrained than usual: X! * diagonal moves from a DOOR are possible. He might also use SDOOR's. Also, X! * the mail daemon is visible in a ROOM, even when you are Blind. X * Its path should be longer when you are Telepat-hic and Blind. X * X * Possible extensions: X--- 24,35 ---- X * hack should do the paging itself. But when I get mail, I want to put it X * in some folder, reply, etc. - it would be unreasonable to put all these X * functions in hack. } X! * X! * The mail daemon can move with less than usual restraint. It can: X! * - move diagonally from a door X! * - use secret doors X! * - run thru a monster X! * X * Its path should be longer when you are Telepat-hic and Blind. X * X * Possible extensions: X*************** X*** 42,57 **** X * Here are some minor problems i didn't fix: -3. X * X * - The code sometimes pops up the mail daemon next to you on X! * the corridor side of doorways when there are open spaces in X! * the room. X * - It may also do this with adjoining castle rooms. X */ X X! # ifndef UNIX X int mustgetmail = -1; X # endif X X # ifdef UNIX X static struct stat omstat,nmstat; X static char *mailbox = NULL; X static long laststattime; X--- 50,66 ---- X * Here are some minor problems i didn't fix: -3. X * X * - The code sometimes pops up the mail daemon next to you on X! * the corridor side of doorways when there are open spaces X! * within the room. X * - It may also do this with adjoining castle rooms. X */ X X! # if !defined(UNIX) && !defined(VMS) X int mustgetmail = -1; X # endif X X # ifdef UNIX X+ extern struct passwd *getpwuid(); X static struct stat omstat,nmstat; X static char *mailbox = NULL; X static long laststattime; X*************** X*** 69,75 **** 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--- 78,84 ---- X # ifdef MAILPATH X mailbox = (char *) alloc(sizeof(MAILPATH)+8); X Strcpy(mailbox, MAILPATH); X! Strcat(mailbox, getpwuid(getuid())->pw_name); X # else X return; X # endif X*************** X*** 76,82 **** X } X if(stat(mailbox, &omstat)){ X # ifdef PERMANENT_MAILBOX X! pline("Cannot get status of MAIL=%s .", mailbox); X mailbox = 0; X # else X omstat.st_mtime = 0; X--- 85,91 ---- X } X if(stat(mailbox, &omstat)){ X # ifdef PERMANENT_MAILBOX X! pline("Cannot get status of MAIL=\"%s\".", mailbox); X mailbox = 0; X # else X omstat.st_mtime = 0; X*************** X*** 85,159 **** X } X # endif /* UNIX */ X X! /* make md run through the cave */ X static void X! mdrush(md,away) X! register struct monst *md; X! boolean away; X { X! register int uroom = inroom(u.ux, u.uy); X! if(uroom >= 0 && inroom(md->mx,md->my) == uroom) { X! register int tmp = rooms[uroom].fdoor; X! register int cnt = rooms[uroom].doorct; X! register int fx = u.ux, fy = u.uy; X! while(cnt--) { X! if(dist(fx,fy) < dist(doors[tmp].x, doors[tmp].y)){ X! fx = doors[tmp].x; X! fy = doors[tmp].y; X! } X! tmp++; X! } X! if (has_dnstairs(&rooms[uroom])) X! if(dist(fx,fy) < dist(xdnstair, ydnstair)){ X! fx = xdnstair; X! fy = ydnstair; X! } X! if (has_upstairs(&rooms[uroom])) X! if(dist(fx,fy) < dist(xupstair, yupstair)){ X! fx = xupstair; X! fy = yupstair; X } X! tmp_at(-1, md->data->mlet); /* open call */ X! tmp_at(-3, (int)AT_MON); X! if(away) { /* interchange origin and destination */ X unpmon(md); X! levl[md->mx][md->my].mmask = 0; X! levl[fx][fy].mmask = 1; X! tmp = fx; fx = md->mx; md->mx = tmp; X! tmp = fy; fy = md->my; md->my = tmp; X! } X! while(fx != md->mx || fy != md->my) { X! register int dx,dy,nfx = fx,nfy = fy,d1,d2; X X! tmp_at(fx,fy); X! d1 = dist2(fx,fy,md->mx,md->my); X! for(dx = -1; dx <= 1; dx++) for(dy = -1; dy <= 1; dy++) X! if((dx || dy) && X! !IS_STWALL(levl[fx+dx][fy+dy].typ)) { X! d2 = dist2(fx+dx,fy+dy,md->mx,md->my); X! if(d2 < d1) { X! d1 = d2; X! nfx = fx+dx; X! nfy = fy+dy; X } X! } X! if(nfx != fx || nfy != fy) { X! fx = nfx; X! fy = nfy; X! } else { X! if(!away) { X! levl[md->mx][md->my].mmask = 0; X! levl[fx][fy].mmask = 1; X! md->mx = fx; X! md->my = fy; X! } X! break; X! } X } X! tmp_at(-1,-1); /* close call */ X! } X! if(!away) X! pmon(md); X } X X static void X--- 94,204 ---- X } X # endif /* UNIX */ X X! # ifdef VMS X! extern unsigned long pasteboard_id; X! int broadcasts = 0; X! # define getmailstatus() X! # endif /* VMS */ X! X! X! /* make mail daemon run through the dungeon */ X static void X! mdrush(md,fx,fy) X! struct monst *md; X! register int fx, fy; /* origin, where the '&' is displayed */ X { X! register int tx = md->mx, ty = md->my; X! /* real location, where the '&' is going */ X! X! tmp_at(-1, md->data->mlet); /* open call */ X! #ifdef TEXTCOLOR X! tmp_at(-3, (int)md->data->mcolor); X! #endif X! X! while(fx != tx || fy != ty) { X! register int dx, dy, /* direction counters */ X! nfx = fx, nfy = fy,/* next location */ X! d1, d2; /* shortest dist, eval */ X! X! /* display the '&' at (fx,fy) */ X! tmp_at(fx,fy); X! X! /* find location next to (fx,fy) closest to (tx,ty) */ X! d1 = dist2(fx,fy,tx,ty); X! for(dx = -1; dx <= 1; dx++) for(dy = -1; dy <= 1; dy++) X! if((dx || dy) && X! !IS_STWALL(levl[fx+dx][fy+dy].typ)) { X! d2 = dist2(fx+dx,fy+dy,tx,ty); X! if(d2 < d1) { X! d1 = d2; X! nfx = fx+dx; X! nfy = fy+dy; X } X! } X! X! /* set (fx,fy) to next location, unless it stopped */ X! if(nfx != fx || nfy != fy) { X! fx = nfx; X! fy = nfy; X! } else break; X! } X! X! tmp_at(-1,-1); /* close call */ X! } X! X! static void X! mdappear(md,away) X! struct monst *md; X! boolean away; X! { X! static int fx, fy; /* origin */ X! int tx = md->mx, ty = md->my; /* destination */ X! register int uroom = inroom(u.ux, u.uy);/* room you're in */ X! X! /* if mail daemon is in same room as you */ X! if(uroom >= 0 && inroom(md->mx,md->my) == uroom && (!Blind || Telepat)) X! if(away) { X unpmon(md); X! remove_monster(tx, ty); X X! /* fake "real" location to origin */ X! md->mx = fx; md->my = fy; X! X! /* rush from destination */ X! mdrush(md,tx,ty); X! return; X! } else { X! /* choose origin */ X! register int cnt = rooms[uroom].doorct; X! register int tmp = rooms[uroom].fdoor; X! register int dd = 0; X! X! /* which door (or staircase) is farthest? */ X! while (cnt--) { X! if(dd < dist(doors[tmp].x, doors[tmp].y)) { X! fx = doors[tmp].x; X! fy = doors[tmp].y; X! dd = dist(tx,ty); X! } X! tmp++; X! } X! if (has_dnstairs(&rooms[uroom])) X! if(dd < dist(xdnstair, ydnstair)) { X! fx = xdnstair; X! fy = ydnstair; X! dd = dist(xdnstair, ydnstair); X! } X! if (has_upstairs(&rooms[uroom])) X! if(dd < dist(xupstair, yupstair)) { X! fx = xupstair; X! fy = yupstair; X } X! X! /* rush from origin */ X! mdrush(md,fx,fy); X } X! X! pmon(md); X } X X static void X*************** X*** 167,175 **** X X if(!md) return; X X! mdrush(md,0); X X pline("\"Hello, %s! I have some mail for you.\"", plname); X X if(dist(md->mx,md->my) > 2) X verbalize("Catch!"); X--- 212,224 ---- X X if(!md) return; X X! mdappear(md,FALSE); X X+ # ifdef VMS X+ pline("\"Hello, %s! I have a message for you.\"", plname); X+ # else X pline("\"Hello, %s! I have some mail for you.\"", plname); X+ # endif X X if(dist(md->mx,md->my) > 2) X verbalize("Catch!"); X*************** X*** 186,199 **** X } X X /* disappear again */ X! mdrush(md,1); X mongone(md); X X /* force the graphics character set off */ X nscr(); X } X X! # ifndef UNIX X void X ckmailstatus() { X if (mustgetmail < 0) X--- 235,251 ---- X } X X /* disappear again */ X! mdappear(md,TRUE); X mongone(md); X X /* force the graphics character set off */ X nscr(); X+ # ifdef VMS X+ broadcasts--; X+ # endif X } X X! # if !defined(UNIX) && !defined(VMS) X void X ckmailstatus() { X if (mustgetmail < 0) X*************** X*** 209,217 **** X { X pline("It says: \"Please disregard previous letter.\""); X } X! X! # else /* UNIX */ X X void X ckmailstatus() { X if(!mailbox X--- 261,269 ---- X { X pline("It says: \"Please disregard previous letter.\""); X } X! # endif /* !UNIX && !VMS */ X X+ # ifdef UNIX X void X ckmailstatus() { X if(!mailbox X*************** X*** 224,230 **** X laststattime = moves; X if(stat(mailbox, &nmstat)){ X # ifdef PERMANENT_MAILBOX X! pline("Cannot get status of MAIL=%s anymore.", mailbox); X mailbox = 0; X # else X nmstat.st_mtime = 0; X--- 276,282 ---- X laststattime = moves; X if(stat(mailbox, &nmstat)){ X # ifdef PERMANENT_MAILBOX X! pline("Cannot get status of MAIL=\"%s\" anymore.", mailbox); X mailbox = 0; X # else X nmstat.st_mtime = 0; X*************** X*** 255,259 **** X--- 307,334 ---- X getmailstatus(); X } X # endif /* UNIX */ X+ X+ # ifdef VMS X+ void X+ ckmailstatus() X+ { X+ if (broadcasts) X+ newmail(); X+ } X+ X+ void X+ readmail() X+ { X+ char buf[16384]; /* $BRKTHRU limits messages to 16350 bytes */ X+ $DESCRIPTOR(message, buf); X+ short length; X+ X+ if (SMG$GET_BROADCAST_MESSAGE(&pasteboard_id, &message, &length) X+ == SS$_NORMAL && length != 0) { X+ buf[length] = '\0'; X+ pline("%s", buf); X+ } X+ } X+ # endif /* VMS */ X X #endif /* MAIL */ X*** src/Old/makemon.c Wed Sep 27 11:49:42 1989 X--- src/makemon.c Mon Sep 25 21:34:56 1989 X*************** X*** 382,388 **** X for(cnt = rn2((int)(mtmp->m_lev / 2)); cnt; cnt--) { X do X otmp = mkobj(GEM_SYM,FALSE); X! while (otmp->otyp >= LAST_GEM+5); X otmp->quan = 2 + rnd(2); X otmp->owt = weight(otmp); X mpickobj(mtmp, otmp); X--- 382,388 ---- X for(cnt = rn2((int)(mtmp->m_lev / 2)); cnt; cnt--) { X do X otmp = mkobj(GEM_SYM,FALSE); X! while (otmp->otyp >= LAST_GEM+6); X otmp->quan = 2 + rnd(2); X otmp->owt = weight(otmp); X mpickobj(mtmp, otmp); X*************** X*** 421,434 **** X X /* if caller wants random location, do it here */ X if(x == 0 && y == 0) { X do { X x = rn1(COLNO-3,2); X y = rn2(ROWNO); X! } while(!goodpos(x, y, ptr)); X } X X /* if a monster already exists at the position, return */ X! if(levl[x][y].mmask) return((struct monst *) 0); X X if(ptr){ X /* if you are to make a specific monster and it has X--- 421,441 ---- X X /* if caller wants random location, do it here */ X if(x == 0 && y == 0) { X+ int uroom; X+ int tryct = 0; /* careful with bigrooms */ X+ X+ if(!in_mklev) uroom = inroom(u.ux, u.uy); X+ X do { X x = rn1(COLNO-3,2); X y = rn2(ROWNO); X! } while(!goodpos(x, y, ptr) || X! (!in_mklev && tryct++ < 50 && inroom(x, y) == uroom)); X } X X /* if a monster already exists at the position, return */ X! if(MON_AT(x, y)) X! return((struct monst *) 0); X X if(ptr){ X /* if you are to make a specific monster and it has X*************** X*** 476,488 **** X * above the 1..49 that indicate "normal" monster levels */ X mtmp->mhpmax = mtmp->mhp = 2*(ptr->mlevel - 6); X mtmp->m_lev = mtmp->mhp / 4; /* approximation */ X! } else if((ptr->mlet == S_DRAGON) && (ptr >= &mons[PM_GREY_DRAGON])) X mtmp->mhpmax = mtmp->mhp = 80; X else if(!mtmp->m_lev) mtmp->mhpmax = mtmp->mhp = rnd(4); X else mtmp->mhpmax = mtmp->mhp = d((int)mtmp->m_lev, 8); X! mtmp->mx = x; X! mtmp->my = y; X! levl[x][y].mmask = 1; X mtmp->mcansee = 1; X mtmp->mpeaceful = peace_minded(ptr); X X--- 483,493 ---- X * above the 1..49 that indicate "normal" monster levels */ X mtmp->mhpmax = mtmp->mhp = 2*(ptr->mlevel - 6); X mtmp->m_lev = mtmp->mhp / 4; /* approximation */ X! } else if((ptr->mlet == S_DRAGON) && (ptr >= &mons[PM_GRAY_DRAGON])) X mtmp->mhpmax = mtmp->mhp = 80; X else if(!mtmp->m_lev) mtmp->mhpmax = mtmp->mhp = rnd(4); X else mtmp->mhpmax = mtmp->mhp = d((int)mtmp->m_lev, 8); X! place_monster(mtmp, x, y); X mtmp->mcansee = 1; X mtmp->mpeaceful = peace_minded(ptr); X X*************** X*** 492,501 **** X break; X case S_SPIDER: X case S_SNAKE: X! mtmp->mhide = mtmp->mundetected = 1; X if(in_mklev) X! if(mtmp->mx && mtmp->my) X! (void) mkobj_at(0, mtmp->mx, mtmp->my); X break; X case S_CHAMELEON: X /* If you're protected with a ring, don't create X--- 497,508 ---- X break; X case S_SPIDER: X case S_SNAKE: X! mtmp->mhide = 1; X if(in_mklev) X! if(x && y) X! (void) mkobj_at(0, x, y); X! if(OBJ_AT(x, y) || levl[x][y].gmask) X! mtmp->mundetected = 1; X break; X case S_CHAMELEON: X /* If you're protected with a ring, don't create X*************** X*** 521,527 **** X case S_UNICORN: X if ((ptr==&mons[PM_WHITE_UNICORN] && X u.ualigntyp == U_LAWFUL) || X! (ptr==&mons[PM_GREY_UNICORN] && X u.ualigntyp == U_NEUTRAL) || X (ptr==&mons[PM_BLACK_UNICORN] && X u.ualigntyp == U_CHAOTIC)) X--- 528,534 ---- X case S_UNICORN: X if ((ptr==&mons[PM_WHITE_UNICORN] && X u.ualigntyp == U_LAWFUL) || X! (ptr==&mons[PM_GRAY_UNICORN] && X u.ualigntyp == U_NEUTRAL) || X (ptr==&mons[PM_BLACK_UNICORN] && X u.ualigntyp == U_CHAOTIC)) X*************** X*** 632,638 **** X int x,y; X struct permonst *mdat; X { X! if (x < 1 || x > COLNO-2 || y < 1 || y > ROWNO-2 || levl[x][y].mmask) X return 0; X if (x == u.ux && y == u.uy) return 0; X if (mdat) { X--- 639,645 ---- X int x,y; X struct permonst *mdat; X { X! if (x < 1 || x > COLNO-2 || y < 1 || y > ROWNO-2 || MON_AT(x, y)) X return 0; X if (x == u.ux && y == u.uy) return 0; X if (mdat) { X*************** X*** 668,677 **** X ty = rn2(ROWNO); X } while(!goodpos(tx,ty,mtmp->data)); X if(mtmp->mx != 0 && mtmp->my != 0) X! levl[mtmp->mx][mtmp->my].mmask = 0; X! mtmp->mx = tx; X! mtmp->my = ty; X! levl[tx][ty].mmask = 1; X if(u.ustuck == mtmp){ X if(u.uswallow) { X u.ux = tx; X--- 675,682 ---- X ty = rn2(ROWNO); X } while(!goodpos(tx,ty,mtmp->data)); X if(mtmp->mx != 0 && mtmp->my != 0) X! remove_monster(mtmp->mx, mtmp->my); X! place_monster(mtmp, tx, ty); X if(u.ustuck == mtmp){ X if(u.uswallow) { X u.ux = tx; X*************** X*** 683,704 **** X set_apparxy(mtmp); X } X X- struct monst * X- mkmon_at(name, x, y) X- char *name; X- register int x,y; X- { X- register int ct; X- register struct permonst *ptr; X- X- for(ct = PM_CHAMELEON; ct >= 0; ct--) { /* Chameleon is last monster */ X- ptr = &mons[ct]; X- if(!strcmp(ptr->mname, name)) X- return(makemon(ptr, x, y)); X- } X- return((struct monst *)0); X- } X- X static int X cmnum() { /* return the number of "common" monsters */ X X--- 688,693 ---- X*************** X*** 735,740 **** X--- 724,732 ---- X n = (!!(ptr->geno & G_SGROUP)); X n += (!!(ptr->geno & G_LGROUP)) << 1; X X+ /* For ranged attacks */ X+ if (ranged_attk(ptr)) n++; X+ X /* For higher ac values */ X n += (ptr->ac < 0); X X*************** X*** 747,752 **** X--- 739,745 ---- X tmp2 = ptr->mattk[i].aatyp; X n += (tmp2 > 0); X n += (tmp2 == AT_MAGC); X+ n += (tmp2 == AT_WEAP && strongmonst(ptr)); X } X X /* For each "special" damage type */ X*************** X*** 753,763 **** X for(i = 0; i < NATTK; i++) { X X tmp2 = ptr->mattk[i].adtyp; X! if((tmp2 == AD_DRLI) || (tmp2 == AD_STON)) n += 2; X else n += (tmp2 != AD_PHYS); X n += ((ptr->mattk[i].damd * ptr->mattk[i].damn) > 23); X } X X /* Finally, adjust the monster level 0 <= n <= 24 (approx.) */ X if(n == 0) tmp--; X else if(n >= 6) tmp += ( n / 2 ); X--- 746,764 ---- X for(i = 0; i < NATTK; i++) { X X tmp2 = ptr->mattk[i].adtyp; X! if((tmp2 == AD_DRLI) || (tmp2 == AD_STON) X! #ifdef POLYSELF X! || (tmp2 == AD_WERE) X! #endif X! ) n += 2; X else n += (tmp2 != AD_PHYS); X n += ((ptr->mattk[i].damd * ptr->mattk[i].damn) > 23); X } X X+ /* Leprechauns are special cases. They have many hit dice so they X+ can hit and are hard to kill, but they don't really do much damage. */ X+ if (ptr == &mons[PM_LEPRECHAUN]) n -= 2; X+ X /* Finally, adjust the monster level 0 <= n <= 24 (approx.) */ X if(n == 0) tmp--; X else if(n >= 6) tmp += ( n / 2 ); X*************** X*** 1080,1086 **** X if (levl[mtmp->mx][mtmp->my].gmask) X sym = GOLD_SYM; X else if (OBJ_AT(mtmp->mx, mtmp->my)) X! sym = o_at(mtmp->mx,mtmp->my)->olet; X else if (IS_DOOR(levl[mtmp->mx][mtmp->my].typ) || X IS_WALL(levl[mtmp->mx][mtmp->my].typ)) X sym = DOOR_SYM; X--- 1081,1087 ---- X if (levl[mtmp->mx][mtmp->my].gmask) X sym = GOLD_SYM; X else if (OBJ_AT(mtmp->mx, mtmp->my)) X! sym = level.objects[mtmp->mx][mtmp->my]->olet; X else if (IS_DOOR(levl[mtmp->mx][mtmp->my].typ) || X IS_WALL(levl[mtmp->mx][mtmp->my].typ)) X sym = DOOR_SYM; X*** src/Old/mhitm.c Wed Sep 27 11:50:37 1989 X--- src/mhitm.c Fri Sep 15 11:43:01 1989 X*************** X*** 263,270 **** X magr->my = mdef->my; X if(cansee(magr->mx, magr->my)) pmon(magr); 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--- 263,270 ---- X magr->my = mdef->my; X if(cansee(magr->mx, magr->my)) pmon(magr); X if((tmp = mdamagem(magr, mdef, mattk)) == 2) { X! remove_monster(mx, my); X! place_monster(magr, magr->mx, magr->my); X /* if mdamagem left a corpse it erased magr's symbol */ X unpmon(magr); X pmon(magr); X*** src/Old/mhitu.c Wed Sep 27 11:51:06 1989 X--- src/mhitu.c Mon Sep 25 21:29:39 1989 X*************** X*** 217,225 **** X coord cc; /* maybe we need a unexto() function? */ X X unpmon(mtmp); X! levl[mtmp->mx][mtmp->my].mmask = 0; X! mtmp->mx = u.ux; mtmp->my = u.uy; X! levl[mtmp->mx][mtmp->my].mmask = 1; X pmon(mtmp); X enexto(&cc, u.ux, u.uy, &playermon); X teleds(cc.x, cc.y); X--- 217,224 ---- X coord cc; /* maybe we need a unexto() function? */ X X unpmon(mtmp); X! remove_monster(mtmp->mx, mtmp->my); X! place_monster(mtmp, u.ux, u.uy); X pmon(mtmp); X enexto(&cc, u.ux, u.uy, &playermon); X teleds(cc.x, cc.y); X*************** X*** 243,250 **** X pline("Wait, %s! There's a %s named %s hiding under %s!", X mtmp->mnamelth ? NAME(mtmp) : mtmp->data->mname, X uasmon->mname, plname, X! OBJ_AT(u.ux, u.uy) ? doname(o_at(u.ux,u.uy)) : X! "some gold"); X prme(); X } X return(0); X--- 242,250 ---- X pline("Wait, %s! There's a %s named %s hiding under %s!", X mtmp->mnamelth ? NAME(mtmp) : mtmp->data->mname, X uasmon->mname, plname, X! OBJ_AT(u.ux,u.uy) X! ? doname(level.objects[u.ux][u.uy]) : X! "some gold"); X prme(); X } X return(0); X*************** X*** 465,471 **** X register struct obj *obj; X X if(OBJ_AT(mtmp->mx, mtmp->my)) { X! if(obj = o_at(mtmp->mx,mtmp->my)) X pline("%s was hidden under %s!", X Xmonnam(mtmp), doname(obj)); X } else if (levl[mtmp->mx][mtmp->my].gmask == 1) X--- 465,471 ---- X register struct obj *obj; X X if(OBJ_AT(mtmp->mx, mtmp->my)) { X! if(obj = level.objects[mtmp->mx][mtmp->my]) X pline("%s was hidden under %s!", X Xmonnam(mtmp), doname(obj)); X } else if (levl[mtmp->mx][mtmp->my].gmask == 1) X*************** X*** 719,724 **** X--- 719,725 ---- X hitmsg(mtmp, mattk); X #ifdef POLYSELF X if (ctmp && !rn2(4) && u.ulycn == -1 X+ && !Protection_from_shape_changers X # ifdef NAMED_ITEMS X && !defends(AD_WERE,uwep) X # endif X*************** X*** 1020,1029 **** X #endif X X if(!u.uswallow) { /* swallow him */ X! levl[mtmp->mx][mtmp->my].mmask = 0; X! mtmp->mx = u.ux; X! mtmp->my = u.uy; X! levl[mtmp->mx][mtmp->my].mmask = 1; X u.ustuck = mtmp; X pmon(mtmp); X kludge("%s engulfs you!", Monnam(mtmp)); X--- 1021,1028 ---- X #endif X X if(!u.uswallow) { /* swallow him */ X! remove_monster(mtmp->mx, mtmp->my); X! place_monster(mtmp, u.ux, u.uy); X u.ustuck = mtmp; X pmon(mtmp); X kludge("%s engulfs you!", Monnam(mtmp)); X*************** X*** 1461,1466 **** X--- 1460,1466 ---- X mayberem(uarmf, "boots"); X mayberem(uarmg, "gloves"); X mayberem(uarms, "shield"); X+ mayberem(uarmh, "helmet"); X #ifdef SHIRT X if(!uarmc && !uarm) X mayberem(uarmu, "shirt"); X*************** X*** 1571,1580 **** X if (!cost) cost=1; X } X if (cost > u.ugold) cost = u.ugold; X! if (!cost) pline("%s says: \"It's on the house!\"", Monnam(mon)); X else { X! pline("%s takes %ld Zorkmid%s for services rendered!", X! Monnam(mon), cost, (cost==1) ? "" : "s"); X u.ugold -= cost; X mon->mgold += cost; X flags.botl = 1; X--- 1571,1580 ---- X if (!cost) cost=1; X } X if (cost > u.ugold) cost = u.ugold; X! if (!cost) verbalize("It's on the house!"); X else { X! pline("%s takes %ld zorkmid%s for services rendered!", X! Monnam(mon), cost, plur(cost)); X u.ugold -= cost; X mon->mgold += cost; X flags.botl = 1; X*************** X*** 1599,1605 **** X if (yn() == 'n') return; X } else pline("\"Take off your %s; %s.\"", str, X (obj == uarm) ? "let's get a little closer" : X! (obj == uarmc) ? "it's in the way" : X (obj == uarmf) ? "let me rub your feet" : X (obj == uarmg) ? "they're too clumsy" : X #ifdef SHIRT X--- 1599,1605 ---- X if (yn() == 'n') return; X } else pline("\"Take off your %s; %s.\"", str, X (obj == uarm) ? "let's get a little closer" : X! (obj == uarmc || obj == uarms) ? "it's in the way" : X (obj == uarmf) ? "let me rub your feet" : X (obj == uarmg) ? "they're too clumsy" : X #ifdef SHIRT X*** src/Old/mklev.c Wed Sep 27 11:52:05 1989 X--- src/mklev.c Thu Sep 14 14:27:57 1989 X*************** X*** 739,746 **** X doorindex = 0; X rooms[0].hx = -1; /* in case we are in a maze */ X X! for(x=0; x<COLNO; x++) for(y=0; y<ROWNO; y++) X levl[x][y] = zerorm; X X oinit(); /* assign level dependent obj probabilities */ X fountsound = 0; X--- 739,749 ---- X doorindex = 0; X rooms[0].hx = -1; /* in case we are in a maze */ X X! for(x=0; x<COLNO; x++) for(y=0; y<ROWNO; y++) { X levl[x][y] = zerorm; X+ level.objects[x][y] = (struct obj *)0; X+ level.monsters[x][y] = (struct monst *)0; X+ } X X oinit(); /* assign level dependent obj probabilities */ X fountsound = 0; X*************** X*** 1109,1115 **** X else my = croom->ly-1; X mx = somex(croom); X } X! } while(levl[mx][my].mmask); X X if((mtmp = makemon(mkclass(S_MIMIC), mx, my))) { X mtmp->mimic = 1; X--- 1112,1119 ---- X else my = croom->ly-1; X mx = somex(croom); X } X! } while X! (MON_AT(mx, my)); X X if((mtmp = makemon(mkclass(S_MIMIC), mx, my))) { X mtmp->mimic = 1; X*** src/Old/mkmaze.c Wed Sep 27 11:52:45 1989 X--- src/mkmaze.c Mon Sep 25 21:29:42 1989 X*************** X*** 473,480 **** X } X X void X! mazexy(cc) /* find random point in generated corridors X! i.e., don't create items in moats, bunkers, or walls */ X coord *cc; X { X int cpt=0; X--- 473,480 ---- X } X X void X! mazexy(cc) /* find random point in generated corridors, X! so we don't create items in moats, bunkers, or walls */ X coord *cc; X { X int cpt=0; X*** src/Old/mkobj.c Wed Sep 27 11:53:09 1989 X--- src/mkobj.c Tue Sep 26 12:59:37 1989 X*************** X*** 76,83 **** X register struct obj *otmp; X X mksx = x; mksy = y; X! /* We might need to know the X, Y coordinates while creating the X! * object, i.e. to insure shop boxes are empty. X * Yes, this is a horrible kludge... X */ X otmp = mkobj(let,TRUE); X--- 76,83 ---- X register struct obj *otmp; X X mksx = x; mksy = y; X! /* We need to know the X, Y coordinates while creating the object, X! * to insure shop boxes are empty. X * Yes, this is a horrible kludge... X */ X otmp = mkobj(let,TRUE); X*************** X*** 215,227 **** X X otmp = newobj(0); X *otmp = zeroobj; X! otmp->age = moves; X otmp->o_id = flags.ident++; X otmp->quan = 1; X otmp->olet = let; X otmp->otyp = otyp; X otmp->dknown = index(dknowns, let) ? 0 : 1; X! if (!uses_known(otmp)) X otmp->known = 1; X switch(let) { X case WEAPON_SYM: X--- 215,227 ---- X X otmp = newobj(0); X *otmp = zeroobj; X! otmp->age = monstermoves; X otmp->o_id = flags.ident++; X otmp->quan = 1; X otmp->olet = let; X otmp->otyp = otyp; X otmp->dknown = index(dknowns, let) ? 0 : 1; X! if (!objects[otmp->otyp].oc_uses_known) X otmp->known = 1; X switch(let) { X case WEAPON_SYM: X*************** X*** 239,244 **** X--- 239,245 ---- X #endif X break; X case FOOD_SYM: X+ OEATEN(otmp) = 0L; X if(otmp->otyp == CORPSE) { X /* overridden by mkcorpstat() */ X do otmp->corpsenm = rndmonnum(); X*************** X*** 302,312 **** X break; X case BAG_OF_TRICKS: otmp->spe = rnd(20); X break; X! case FIGURINE: { int tryct = 0; X do X otmp->corpsenm = rndmonnum(); X while(is_human(&mons[otmp->corpsenm]) X! && tryct++ < 30); X blessorcurse(otmp, 4); X break; X } X--- 303,313 ---- X break; X case BAG_OF_TRICKS: otmp->spe = rnd(20); X break; X! case FIGURINE: { int tryct2 = 0; X do X otmp->corpsenm = rndmonnum(); X while(is_human(&mons[otmp->corpsenm]) X! && tryct2++ < 30); X blessorcurse(otmp, 4); X break; X } X*************** X*** 356,363 **** X otmp->blessed = rn2(2); X } else blessorcurse(otmp, 10); X if(otmp->otyp == DRAGON_SCALE_MAIL) X! otmp->corpsenm = PM_GREY_DRAGON + X! rn2(PM_YELLOW_DRAGON-PM_GREY_DRAGON+1); X break; X case WAND_SYM: X #ifdef HARD X--- 357,364 ---- X otmp->blessed = rn2(2); X } else blessorcurse(otmp, 10); X if(otmp->otyp == DRAGON_SCALE_MAIL) X! otmp->corpsenm = PM_GRAY_DRAGON + X! rn2(PM_YELLOW_DRAGON-PM_GRAY_DRAGON+1); X break; X case WAND_SYM: X #ifdef HARD X*************** X*** 543,551 **** X X otmp = mkcorpstat(objtype,ptr,x,y); X if (lth > 0) { X! /* Note: oname() is safe since otmp is first in chain */ X otmp = oname(otmp, nm, FALSE); X fobj = otmp; X } X return(otmp); X } X--- 544,553 ---- X X otmp = mkcorpstat(objtype,ptr,x,y); X if (lth > 0) { X! /* Note: oname() is safe since otmp is first in both chains */ X otmp = oname(otmp, nm, FALSE); X fobj = otmp; X+ level.objects[x][y] = otmp; X } X return(otmp); X } X*************** X*** 575,626 **** X } X #endif X X /* X! * These functions encapsulate operations on the omask bit. Someday soon they X! * will turn into list-manipulation functions. X */ X- boolean X- OBJ_AT(x, y) X- int x, y; X- { X- return levl[x][y].omask; X- } X X void X! place_object(obj, x, y) X! struct obj *obj; X! register int x, y; X { X! obj->ox = x; X! obj->oy = y; X! levl[x][y].omask = 1; X } X X! void X! move_object(obj, x, y) X! struct obj *obj; X! register int x, y; X { X! register int oldx = obj->ox, oldy = obj->oy; X X- obj->ox = x; X- obj->oy = y; X- levl[x][y].omask = 1; X- levl[oldx][oldy].omask = (o_at(oldx, oldy) != (struct obj *)0); X- } X- X- void X- remove_object(obj) X- struct obj *obj; X- { X- register int oldx = obj->ox, oldy = obj->oy; X X- /* X- * This cannot be used since it screws up unpobj(). It's only necessary so X- * that o_at() doesn't mistakenly find the object, but this is called only X- * in situations with the object already removed from the chain anyway. X- obj->ox = 0; X- obj->oy = 0; X- */ X- levl[oldx][oldy].omask = (o_at(oldx, oldy) != (struct obj *)0); X- } X--- 577,623 ---- X } X #endif X X+ X /* X! * These routines maintain the single-linked lists headed in level.objects[][] X! * and threaded through the nexthere fields in the object-instance structure. X */ X X void X! place_object(otmp, x, y) X! /* put an object on top of the pile at the given location */ X! register struct obj *otmp; X! int x, y; X { X! otmp->nexthere = level.objects[x][y]; X! level.objects[x][y] = otmp; X! X! /* set the new object's location */ X! otmp->ox = x; X! otmp->oy = y; X! } X! X! void X! remove_object(otmp) X! register struct obj *otmp; X! { X! register struct obj *odel; X! X! if (otmp == level.objects[otmp->ox][otmp->oy]) X! level.objects[otmp->ox][otmp->oy] = otmp->nexthere; X! else X! for (odel = level.objects[otmp->ox][otmp->oy]; X! odel; odel = odel->nexthere) X! if (odel->nexthere == otmp) X! odel->nexthere = otmp->nexthere; X } X X! void move_object(otmp, x, y) X! register struct obj *otmp; X! int x, y; X { X! remove_object(otmp); X! place_object(otmp, x, y); X! } X X X END_OF_FILE if test 53375 -ne `wc -c <'patches04b'`; then echo shar: \"'patches04b'\" unpacked with wrong size! fi # end of 'patches04b' fi echo shar: End of archive 2 \(of 11\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 11 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0