billr@saab.CNA.TEK.COM (Bill Randle) (11/23/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 8, Issue 59 Archive-name: NetHack3/Patch6f 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 6 (of 15)." # Contents: patches06g # Wrapped by billr@saab on Wed Nov 22 10:50:11 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'patches06g' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patches06g'\" else echo shar: Extracting \"'patches06g'\" \(54581 characters\) sed "s/^X//" >'patches06g' <<'END_OF_FILE' X*** src/Old/exper.c Sun Nov 19 12:40:48 1989 X--- src/exper.c Wed Nov 8 19:39:17 1989 X*************** X*** 1,4 **** X! /* SCCS Id: @(#)exper.c 3.0 89/04/21 X /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X /* NetHack may be freely redistributed. See license for details. */ X X--- 1,4 ---- X! /* SCCS Id: @(#)exper.c 3.0 89/11/08 X /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X /* NetHack may be freely redistributed. See license for details. */ X X*************** X*** 15,21 **** X return(0L * lev); X #else X if(lev < 10) return (10L*(1L << lev)); X! if(lev < 20) return (10000L*(1L << lev-10)); X return (10000000L*(lev-19)); X #endif X } X--- 15,21 ---- X return(0L * lev); X #else X if(lev < 10) return (10L*(1L << lev)); X! if(lev < 20) return (10000L*(1L << (lev-10))); X return (10000000L*(lev-19)); X #endif X } X*** src/Old/extralev.c Sun Nov 19 12:41:04 1989 X--- src/extralev.c Tue Oct 31 22:18:58 1989 X*************** X*** 29,36 **** X--- 29,40 ---- X int horiz; X { X register int x,y,middle; X+ #ifndef MAX X #define MAX(a,b) (((a) > (b)) ? (a) : (b)) X+ #endif X+ #ifndef MIN X #define MIN(a,b) (((a) < (b)) ? (a) : (b)) X+ #endif X if (horiz) { X middle = x1 + rn2(x2-x1+1); X for(x=MIN(x1,middle); x<=MAX(x1,middle); x++) X*************** X*** 71,76 **** X--- 75,81 ---- X fromy); X dodoor(fromx, fromy, &rooms[r[x][y].nroom]); X levl[fromx][fromy].doormask = D_NODOOR; X+ mnewsym(fromx,fromy); X fromy++; X } X if(y >= 2) { X*************** X*** 90,95 **** X--- 95,101 ---- X impossible("up: no wall at %d,%d?",tox,toy); X dodoor(tox, toy, &rooms[r[x][y].nroom]); X levl[tox][toy].doormask = D_NODOOR; X+ mnewsym(tox,toy); X toy--; X } X roguejoin(fromx, fromy, tox, toy, FALSE); X*************** X*** 108,113 **** X--- 114,120 ---- X fromy); X dodoor(fromx, fromy, &rooms[r[x][y].nroom]); X levl[fromx][fromy].doormask = D_NODOOR; X+ mnewsym(fromx,fromy); X fromx++; X } X if(x >= 2) { X*************** X*** 127,132 **** X--- 134,140 ---- X impossible("left: no wall at %d,%d?",tox,toy); X dodoor(tox, toy, &rooms[r[x][y].nroom]); X levl[tox][toy].doormask = D_NODOOR; X+ mnewsym(tox,toy); X tox--; X } X roguejoin(fromx, fromy, tox, toy, TRUE); X*************** X*** 307,312 **** X--- 315,321 ---- X X void X corr(x,y) X+ int x, y; X { X if (rn2(50)) { X levl[x][y].typ = CORR; X*************** X*** 313,319 **** X levl[x][y].scrsym = CORR_SYM; X } else { X levl[x][y].typ = SCORR; X! levl[x][y].scrsym = STONE_SYM; X } X } X X--- 322,328 ---- X levl[x][y].scrsym = CORR_SYM; X } else { X levl[x][y].typ = SCORR; X! levl[x][y].scrsym = ' '; /* _not_ STONE_SYM */ X } X } X X*** src/Old/fountain.c Sun Nov 19 12:41:22 1989 X--- src/fountain.c Sat Nov 18 21:17:32 1989 X*************** X*** 85,92 **** X X levl[mx][my].typ = POOL; X levl[mx][my].doormask = 0; X! if(!Blind) atl(mx,my,(char) POOL_SYM); X! else levl[mx][my].seen = 0; X madepool = 1; X } X X--- 85,93 ---- X X levl[mx][my].typ = POOL; X levl[mx][my].doormask = 0; X! mnewsym(mx,my); X! if (cansee(mx, my)) X! prl(mx, my); X madepool = 1; X } X X*************** X*** 99,105 **** X X if (!Blind) You("spot a gem in the sparkling waters!"); X (void) mkobj_at(GEM_SYM,u.ux,u.uy); X! levl[u.ux][u.uy].doormask = T_LOOTED; X } X X void X--- 100,106 ---- X X if (!Blind) You("spot a gem in the sparkling waters!"); X (void) mkobj_at(GEM_SYM,u.ux,u.uy); X! levl[u.ux][u.uy].looted = T_LOOTED; X } X X void X*************** X*** 107,113 **** 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 if(Invisible) newsym(u.ux, u.uy); X fountsound--; X } X--- 108,114 ---- 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].looted = 0; X if(Invisible) newsym(u.ux, u.uy); X fountsound--; X } X*************** X*** 131,137 **** X X case 19: /* Self-knowledge */ X X! You("feel self-knowledgable..."); X more(); X enlightenment(); X pline("The feeling subsides."); X--- 132,138 ---- X X case 19: /* Self-knowledge */ X X! You("feel self-knowledgeable..."); X more(); X enlightenment(); X pline("The feeling subsides."); X*************** X*** 193,199 **** X X case 27: /* Find a gem in the sparkling waters. */ X X! if (levl[u.ux][u.uy].doormask == 0) { X dofindgem(); X break; X } X--- 194,200 ---- X X case 27: /* Find a gem in the sparkling waters. */ X X! if (!levl[u.ux][u.uy].looted) { X dofindgem(); X break; X } X*************** X*** 230,274 **** X dipfountain(obj) X register struct obj *obj; X { X! register int fate = rnd(30); X X! if(Levitation) You("are floating high above the fountain."); X! else if(fate<10) X! if(!obj->rustfree && is_sword(obj)) { X! if(obj->spe > -6) { X! Your("sword rusts somewhat."); X! obj->spe--; X! } else Your("sword looks quite rusted."); X! } else pline("Well, it looks wet now."); X! else if(fate<14) X! if(obj->otyp == LONG_SWORD X #ifndef NAMED_ITEMS X! && !strcmp(ONAME(obj), "Excalibur") X #endif X! && u.ulevel >= 5 X! ) { X! /* The lady of the lake acts! - Eric Backus */ X! /* Be *REAL* nice to him */ X pline("A murky hand from the depths reaches up to bless the sword."); X pline("As the hand retreats, the fountain disappears!"); X X #ifndef NAMED_ITEMS X! if(obj->spe < 5) obj->spe = 5; X #else X! /* otherwise +rnd(10) / +5 "Super"sword */ X! obj = oname(obj, "Excalibur", 1); X #endif X! bless(obj); X! obj->rustfree = 1; X! levl[u.ux][u.uy].typ = ROOM; X! if(Invisible) newsym(u.ux, u.uy); X! fountsound--; X! return; X! } else pline ("Well, it looks wet now."); X! else { X! switch (fate) { X case 16: /* Curse the item */ X- pline("Well, it looks wet now."); X curse(obj); X break; X case 17: X--- 231,268 ---- X dipfountain(obj) X register struct obj *obj; X { X! if (Levitation) { X! You("are floating high above the fountain."); X! return; X! } X X! if (obj->otyp == LONG_SWORD && u.ulevel >= 5 && !rn2(6) X #ifndef NAMED_ITEMS X! && !strcmp(ONAME(obj), "Excalibur") X #endif X! ) { X! /* The lady of the lake acts! - Eric Backus */ X! /* Be *REAL* nice */ X pline("A murky hand from the depths reaches up to bless the sword."); X pline("As the hand retreats, the fountain disappears!"); X X #ifndef NAMED_ITEMS X! if(obj->spe < 5) obj->spe = 5; X #else X! /* otherwise +rnd(10) / +5 "Super"sword */ X! obj = oname(obj, "Excalibur", 1); X #endif X! bless(obj); X! obj->rustfree = 1; X! levl[u.ux][u.uy].typ = ROOM; X! levl[u.ux][u.uy].looted = 0; X! if(Invisible) newsym(u.ux, u.uy); X! fountsound--; X! return; X! } else (void) get_wet(obj); X! X! switch (rnd(30)) { X case 16: /* Curse the item */ X curse(obj); X break; X case 17: X*************** X*** 289,295 **** X case 22: /* Water Nymph */ X dowaternymph(); X break; X! case 23: /* An Endless Stream Of Snakes */ X dowatersnakes(); X break; X case 24: /* Find a gem */ X--- 283,289 ---- X case 22: /* Water Nymph */ X dowaternymph(); X break; X! case 23: /* an Endless Stream of Snakes */ X dowatersnakes(); X break; X case 24: /* Find a gem */ X*************** X*** 308,330 **** X case 28: /* Strange feeling */ X pline("An urge to take a bath overwhelms you."); X if (u.ugold > 10) { X! u.ugold -= somegold()/10; X! You("lost some of your gold in the fountain!"); X! levl[u.ux][u.uy].doormask = 0; X! } X break; X case 29: /* You see coins */ X X /* We make fountains have more coins the closer you are to the X * surface. After all, there will have been more people going X! * by. Just like a shopping mall! Chris Woodbury */ X X! mkgold((long)(rnd((MAXLEVEL-dlevel)*2)+5),u.ux,u.uy); X pline("Far below you, you see coins glistening in the water."); X break; X- default: X- break; X- } X } X dryup(); X return; X--- 302,321 ---- X case 28: /* Strange feeling */ X pline("An urge to take a bath overwhelms you."); X if (u.ugold > 10) { X! u.ugold -= somegold() / 10; X! You("lost some of your gold in the fountain!"); X! levl[u.ux][u.uy].looted = 0; X! } X break; X case 29: /* You see coins */ X X /* We make fountains have more coins the closer you are to the X * surface. After all, there will have been more people going X! * by. Just like a shopping mall! Chris Woodbury */ X X! mkgold((long)(rnd((MAXLEVEL-dlevel)*2)+5), u.ux, u.uy); X pline("Far below you, you see coins glistening in the water."); X break; X } X dryup(); X return; X*************** X*** 377,386 **** X (void) dopotion(otmp); X obfree(otmp, (struct obj *)0); X break; X! case 5: if (levl[u.ux][u.uy].doormask == 0) { X You("find a ring in the sink!"); X (void) mkobj_at(RING_SYM, u.ux, u.uy); X! levl[u.ux][u.uy].doormask = T_LOOTED; X } else pline("Some dirty water backs up in the drain."); X break; X case 6: pline("The pipes break! Water spurts out!"); X--- 368,377 ---- X (void) dopotion(otmp); X obfree(otmp, (struct obj *)0); X break; X! case 5: if (!levl[u.ux][u.uy].looted) { X You("find a ring in the sink!"); X (void) mkobj_at(RING_SYM, u.ux, u.uy); X! levl[u.ux][u.uy].looted = T_LOOTED; X } else pline("Some dirty water backs up in the drain."); X break; X case 6: pline("The pipes break! Water spurts out!"); X*** src/Old/getline.c Sun Nov 19 12:41:43 1989 X--- src/getline.c Sun Nov 5 16:15:49 1989 X*************** X*** 165,171 **** X } X in_line[0] = foo; X in_line[1] = 0; X! if(foo == 'g' || foo == 'G'){ X in_line[1] = Getchar(); X #ifdef REDO X savech(in_line[1]); X--- 165,171 ---- X } X in_line[0] = foo; X in_line[1] = 0; X! if(foo == 'g' || foo == 'G' || (flags.num_pad && foo == '5')){ X in_line[1] = Getchar(); X #ifdef REDO X savech(in_line[1]); X*** src/Old/hack.c Sun Nov 19 12:42:00 1989 X--- src/hack.c Wed Nov 8 22:56:43 1989 X*************** X*** 4,10 **** X #include "hack.h" X X #if defined(UNIX) && !defined(LINT) X! static const char SCCS_Id[] = "@(#)hack.c 3.0\t88/10/25"; X #endif X X /* called on movement: X--- 4,10 ---- X #include "hack.h" X X #if defined(UNIX) && !defined(LINT) X! static const char SCCS_Id[] = "@(#)hack.c 3.0\t89/11/03"; X #endif X X /* called on movement: X*************** X*** 24,30 **** 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->lit && lev->scrsym == ROOM_SYM) { X lev->scrsym = STONE_SYM; X lev->new = 1; X on_scr(x,y); X--- 24,30 ---- 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->lit && IS_FLOOR(lev->typ)){ X lev->scrsym = STONE_SYM; X lev->new = 1; X on_scr(x,y); X*************** X*** 46,52 **** X in trap.c: seeoff(1) - fall through trapdoor X */ X void X! seeoff(mode) { /* 1 to redo @, 0 to leave them */ X /* 1 means misc movement, 0 means blindness */ X register xchar x,y; X register struct rm *lev; X--- 46,54 ---- X in trap.c: seeoff(1) - fall through trapdoor X */ X void X! seeoff(mode) X! int mode; X! { /* 1 to redo @, 0 to leave them */ X /* 1 means misc movement, 0 means blindness */ X register xchar x,y; X register struct rm *lev; X*************** X*** 65,71 **** 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--- 67,73 ---- X lev = &levl[x][y]; X if(MON_AT(x, y)) X unpmon(m_at(x,y)); X! if(!lev->lit && IS_FLOOR(lev->typ)) { X lev->seen = 0; X atl(x, y, (char)STONE_SYM); X } X*************** X*** 94,100 **** X } X #endif 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--- 96,106 ---- X } X #endif X if(isok(rx,ry) && !IS_ROCK(levl[rx][ry].typ) && X! (!IS_DOOR(levl[rx][ry].typ) || !(u.dx && u.dy) || ( X! #ifdef REINCARNATION X! dlevel != rogue_level && X! #endif X! (levl[rx][ry].doormask & ~D_BROKEN) == D_NODOOR)) && X !sobj_at(BOULDER, rx, ry)) { X if(MON_AT(rx, ry)) { X mtmp = m_at(rx,ry); X*************** X*** 229,238 **** X # endif X You("crash to the floor!"); X losehp((rn1(10, 20 - (int)ACURR(A_CON))),"fall onto a sink"); X! if(OBJ_AT(u.ux, u.uy)) X! for(obj=fobj; obj; obj=obj->nobj) X! if(obj->ox == u.ux && obj->oy == u.uy && X! obj->olet == WEAPON_SYM) { X You("fell on %s.",doname(obj)); X losehp(rn2(3),"fall onto a sink"); X } X--- 235,242 ---- X # endif X You("crash to the floor!"); X losehp((rn1(10, 20 - (int)ACURR(A_CON))),"fall onto a sink"); X! for(obj = level.objects[u.ux][u.uy]; obj; obj = obj->nexthere) X! if(obj->olet == WEAPON_SYM) { X You("fell on %s.",doname(obj)); X losehp(rn2(3),"fall onto a sink"); X } X*************** X*** 451,459 **** X if(bad_rock(x,y) || X (u.dx && u.dy X #ifdef POLYSELF X! && !passes_walls(uasmon) X #endif X- && (IS_DOOR(tmpr->typ) || IS_DOOR(ust->typ)))){ X flags.move = 0; X nomul(0); X return; X--- 455,471 ---- X if(bad_rock(x,y) || X (u.dx && u.dy X #ifdef POLYSELF X! && !passes_walls(uasmon) X! #endif X! #ifdef REINCARNATION X! && (((IS_DOOR(tmpr->typ) && ((tmpr->doormask & ~D_BROKEN) X! || dlevel == rogue_level)) || X! ((IS_DOOR(ust->typ) && ((ust->doormask & ~D_BROKEN) X! || dlevel == rogue_level))))))) { X! #else X! && (((IS_DOOR(tmpr->typ) && (tmpr->doormask & ~D_BROKEN)) || X! ((IS_DOOR(ust->typ) && (ust->doormask & ~D_BROKEN))))))){ X #endif X flags.move = 0; X nomul(0); X return; X*************** X*** 521,527 **** X } else { X if (IS_WALL(tmpr->typ)) { X digtxt = "You chew a hole in the wall."; X! tmpr->typ = DOOR; X } else if (tmpr->typ==SDOOR) { X digtxt = "You chew through a secret door."; X tmpr->typ = DOOR; X--- 533,542 ---- X } else { X if (IS_WALL(tmpr->typ)) { X digtxt = "You chew a hole in the wall."; X! if(!is_maze_lev) X! tmpr->typ = DOOR; X! else X! tmpr->typ = ROOM; X } else if (tmpr->typ==SDOOR) { X digtxt = "You chew through a secret door."; X tmpr->typ = DOOR; X*************** X*** 537,542 **** X--- 552,559 ---- X if(IS_DOOR(tmpr->typ) && (tmpr->doormask & D_TRAPPED)) { X b_trapped("door"); X tmpr->doormask = D_NODOOR; X+ mnewsym(x, y); X+ prl(x, y); X } X dig_level = -1; X } X*************** X*** 696,701 **** X--- 713,721 ---- X #endif 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+ #ifdef POLYSELF X+ if(u.umonnum == PM_GRID_BUG && x != u.ux && y != u.uy) continue; X+ #endif 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*************** X*** 707,714 **** X { X register uchar sym = levl[x][y].scrsym; X X! if (IS_ROCK(levl[x][y].typ) || sym == ROOM_SYM) continue; X! else if (sym == DOOR_SYM) { X if(x != u.ux && y != u.uy) continue; X if(flags.run != 1) goto stop; X goto bcorr; X--- 727,736 ---- X { X register uchar sym = levl[x][y].scrsym; X X! if (IS_ROCK(levl[x][y].typ) || X! (sym == ROOM_SYM && !IS_DOOR(levl[x][y].typ))) X! continue; X! else if (sym == CLOSED_DOOR_SYM) { X if(x != u.ux && y != u.uy) continue; X if(flags.run != 1) goto stop; X goto bcorr; X*************** X*** 927,933 **** X void X losehp(n, knam) X register int n; X! register char *knam; X { X #ifdef POLYSELF X if (u.mtimedone) { X--- 949,955 ---- X void X losehp(n, knam) X register int n; X! register const char *knam; X { X #ifdef POLYSELF X if (u.mtimedone) { X*************** X*** 943,949 **** X u.uhpmax = u.uhp; /* perhaps n was negative */ X flags.botl = 1; X if(u.uhp < 1) { X! killer = knam; /* the thing that killed you */ X You("die..."); X done(DIED); X } else if(u.uhp*10 < u.uhpmax && moves-wailmsg > 50 && n > 0){ X--- 965,971 ---- X u.uhpmax = u.uhp; /* perhaps n was negative */ X flags.botl = 1; X if(u.uhp < 1) { X! killer = (char *)knam; /* the thing that killed you */ X You("die..."); X done(DIED); X } else if(u.uhp*10 < u.uhpmax && moves-wailmsg > 50 && n > 0){ X*** src/Old/invent.c Sun Nov 19 12:42:44 1989 X--- src/invent.c Tue Nov 14 21:24:36 1989 X*************** X*** 140,146 **** X--- 140,148 ---- X register struct obj *obj; X { X if(obj->quan > 1){ X+ #ifndef NO_SIGNAL X obj->in_use = FALSE; /* no longer in use */ X+ #endif X obj->quan--; X obj->owt = weight(obj); X } else { X*************** X*** 252,259 **** X { 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--- 254,260 ---- X { X register struct obj *otmp; X 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*** 282,287 **** X--- 283,299 ---- X return((struct obj *) 0); X } X X+ boolean X+ have_lizard() X+ { X+ register struct obj *otmp; X+ X+ for(otmp = invent; otmp; otmp = otmp->nobj) X+ if(otmp->otyp == CORPSE && otmp->corpsenm == PM_LIZARD) X+ return(TRUE); X+ return(FALSE); X+ } X+ X struct obj * X o_on(id, objchn) X unsigned int id; X*************** X*** 294,299 **** X--- 306,323 ---- X return((struct obj *) 0); X } X X+ boolean X+ obj_here(obj, x, y) X+ register struct obj *obj; X+ int x, y; X+ { X+ register struct obj *otmp; X+ X+ for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) X+ if(obj == otmp) return(TRUE); X+ return(FALSE); X+ } X+ X struct gold * X g_at(x,y) X register int x, y; X*************** X*** 331,337 **** X */ X struct obj * X getobj(let,word) X! register char *let,*word; X { X register struct obj *otmp; X register char ilet,ilet1,ilet2; X--- 355,361 ---- X */ X struct obj * X getobj(let,word) X! register const char *let,*word; X { X register struct obj *otmp; X register char ilet,ilet1,ilet2; X*************** X*** 395,400 **** X--- 419,427 ---- X || (!strcmp(word, "rub") && X (otmp->olet == TOOL_SYM && X otmp->otyp != LAMP && otmp->otyp != MAGIC_LAMP)) X+ || (!strcmp(word, "wield") && X+ (otmp->olet == TOOL_SYM && X+ otmp->otyp != PICK_AXE && otmp->otyp != UNICORN_HORN)) X ) X foo--; X } X*************** X*** 540,546 **** X return(otmp); X } X X! static int X ckunpaid(otmp) X register struct obj *otmp; X { X--- 567,576 ---- X return(otmp); X } X X! #ifndef OVERLAY X! static X! #endif X! int X ckunpaid(otmp) X register struct obj *otmp; X { X*************** X*** 1033,1054 **** 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! if(Blind && !uarmg && X #ifdef POLYSELF X! !resists_ston(uasmon) && X #endif X! (otmp->otyp == CORPSE && otmp->corpsenm == PM_COCKATRICE)) { X! pline("Touching the dead cockatrice is a fatal mistake..."); X! You("turn to stone..."); X! killer = "cockatrice corpse"; X! done(STONING); X! } X } X! } X X if(gold) { X char gbuf[30]; X--- 1063,1082 ---- X X cornline(0, "Things that are here:"); X for(otmp = otmp0; otmp; otmp = otmp->nexthere) { X! ct++; X! cornline(1, doname(otmp)); X X! if(Blind && !uarmg && X #ifdef POLYSELF X! !resists_ston(uasmon) && X #endif X! (otmp->otyp == CORPSE && otmp->corpsenm == PM_COCKATRICE)) { X! pline("Touching the dead cockatrice is a fatal mistake..."); X! You("turn to stone..."); X! killer = "cockatrice corpse"; X! done(STONING); X } X! } X X if(gold) { X char gbuf[30]; X*************** X*** 1074,1084 **** X stackobj(obj) X register struct obj *obj; X { X! register struct obj *otmp = fobj; X! for(otmp = fobj; otmp; otmp = otmp->nobj) if(otmp != obj) X! if(otmp->ox == obj->ox && otmp->oy == obj->oy && X! merged(obj,otmp,1)) X! break; X return; X } X X--- 1102,1112 ---- X stackobj(obj) X register struct obj *obj; X { X! register struct obj *otmp; X! X! for(otmp = level.objects[obj->ox][obj->oy]; otmp; otmp = otmp->nexthere) X! if(otmp != obj && merged(obj,otmp,1)) X! break; X return; X } X X*************** X*** 1097,1103 **** 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 && obj->oeaten != otmp->oeaten) X return(FALSE); X X else if(obj->otyp == CORPSE || obj->otyp == EGG || obj->otyp == TIN) X--- 1125,1132 ---- 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 && (obj->oeaten != otmp->oeaten || X! obj->orotten != otmp->orotten)) X return(FALSE); X X else if(obj->otyp == CORPSE || obj->otyp == EGG || obj->otyp == TIN) X*************** X*** 1205,1221 **** X } X X /* X! * useupf(obj) X! * uses up an object that's on the floor X */ X void X useupf(obj) X register struct obj *obj; X { X! if(obj->quan > 1) { X! obj->quan--; X! obj->owt = weight(obj); X! } else delobj(obj); X } X X /* X--- 1234,1255 ---- X } X X /* X! * uses up an object that's on the floor, charging for it as necessary X */ X void X useupf(obj) X register struct obj *obj; X { X! register struct obj *otmp; X! X! /* burn_floor_paper() keeps an object pointer that it tries to X! * useupf() multiple times, so obj must survive if plural */ X! if(obj->quan > 1) X! otmp = splitobj(obj, (int)obj->quan - 1); X! else X! otmp = obj; X! addtobill(otmp, FALSE); X! delobj(otmp); X } X X /* X*************** X*** 1241,1253 **** X let_to_name(let) X char let; X { X! char *pos = index(obj_symbols, let); X /* arbitrary buffer size by Tom May (tom@uw-warp) */ X static char *buf = NULL; X X if (buf == NULL) X! buf = (char *) alloc ((unsigned)(strlen(HI)+strlen(HE)+15+1)); X! X if (pos == NULL) pos = obj_symbols; X if (HI && HE) X Sprintf(buf, "%s%s%s", HI, names[pos - obj_symbols], HE); X--- 1275,1292 ---- X let_to_name(let) X char let; X { X! const char *pos = index(obj_symbols, let); X /* arbitrary buffer size by Tom May (tom@uw-warp) */ X static char *buf = NULL; X X if (buf == NULL) X! buf = (char *) alloc ((unsigned)(strlen(HI)+17+strlen(HE))); X! /* X! THE ALLOC() *MUST* BE BIG ENOUGH TO ACCOMODATE THE LONGEST NAME PLUS A X! NULL BYTE: X! Boulders/Statues + '\0' X! 1234567890123456 = 16 + 1 = 17 X! */ X if (pos == NULL) pos = obj_symbols; X if (HI && HE) X Sprintf(buf, "%s%s%s", HI, names[pos - obj_symbols], HE); X*** src/Old/ioctl.c Sun Nov 19 12:43:31 1989 X--- src/ioctl.c Sun Nov 19 11:53:02 1989 X*************** X*** 13,19 **** X X #if defined(BSD) || defined(ULTRIX) X #include <sgtty.h> X! struct ltchars ltchars, ltchars0; X #else X #include <termio.h> /* also includes part of <sgtty.h> */ X struct termio termio; X--- 13,20 ---- X X #if defined(BSD) || defined(ULTRIX) X #include <sgtty.h> X! struct ltchars ltchars; X! struct ltchars ltchars0 = { -1, -1, -1, -1, -1, -1 }; /* turn all off */ X #else X #include <termio.h> /* also includes part of <sgtty.h> */ X struct termio termio; X*** src/Old/lev_comp.l Sun Nov 19 12:44:52 1989 X--- src/lev_comp.l Mon Nov 13 21:23:17 1989 X*************** X*** 1,10 **** X %{ X! /* SCCS Id: @(#)lev_lex.c 3.0 89/07/02 X /* Copyright (c) 1989 by Jean-Christophe Collet */ X /* NetHack may be freely redistributed. See license for details. */ X X #define LEV_LEX_C X X #include "hack.h" X #include "lev_comp.h" X #include "sp_lev.h" X--- 1,14 ---- X %{ X! /* SCCS Id: @(#)lev_lex.c 3.0 89/11/08 X /* Copyright (c) 1989 by Jean-Christophe Collet */ X /* NetHack may be freely redistributed. See license for details. */ X X #define LEV_LEX_C X X+ /* block some unused #defines to avoid overloading some cpp's */ X+ #define MONDATA_H X+ #define MONFLAG_H X+ X #include "hack.h" X #include "lev_comp.h" X #include "sp_lev.h" X*************** X*** 13,18 **** X--- 17,30 ---- X #undef exit X #endif X X+ #ifdef TOS X+ extern YYSTYPE yylval; /* this doesn't always get put in lev_comp.h */ X+ #endif X+ X+ #ifdef MACOS X+ #undef putchar X+ #undef putc X+ #endif X int line_number = 1; X X /* This is *** UGLY *** but I can't think a better way to do it X*************** X*** 25,42 **** X %} X %s MAPC X %% X- ^#.*\n { line_number++; } X- MAZE return MAZE_ID; X- LEVEL return LEVEL_ID; X- GEOMETRY return GEOMETRY_ID; X- ^MAP\n { BEGIN MAPC; } X <MAPC>[-|}{+SK\\#. ]*\n { line_number++; yymore(); } X <MAPC>ENDMAP\n { BEGIN 0; X yytext[yyleng-7] = 0; /* Discard \nENDMAP */ X yylval.map = (char *) alloc(strlen(yytext)+1); X! strcpy(yylval.map, yytext+1); X return MAP_ID; X } X OBJECT return OBJECT_ID; X MONSTER return MONSTER_ID; X TRAP return TRAP_ID; X--- 37,55 ---- X %} X %s MAPC X %% X <MAPC>[-|}{+SK\\#. ]*\n { line_number++; yymore(); } X <MAPC>ENDMAP\n { BEGIN 0; X+ line_number++; X yytext[yyleng-7] = 0; /* Discard \nENDMAP */ X yylval.map = (char *) alloc(strlen(yytext)+1); X! strcpy(yylval.map, yytext); X return MAP_ID; X } X+ ^#.*\n { line_number++; } X+ MAZE return MAZE_ID; X+ LEVEL return LEVEL_ID; X+ GEOMETRY return GEOMETRY_ID; X+ ^MAP\n { BEGIN MAPC; line_number++; } X OBJECT return OBJECT_ID; X MONSTER return MONSTER_ID; X TRAP return TRAP_ID; X*** src/Old/lev_comp.y Sun Nov 19 12:45:08 1989 X--- src/lev_comp.y Tue Nov 14 20:32:34 1989 X*************** X*** 10,15 **** X--- 10,17 ---- X X /* block some unused #defines to avoid overloading some cpp's */ X #define MONDATA_H X+ #define MONFLAG_H X+ X #include "hack.h" X #include "sp_lev.h" X #ifndef O_WRONLY X*************** X*** 33,38 **** X--- 35,46 ---- X # undef exit X #endif X X+ #ifdef MACOS X+ # undef printf X+ # undef Printf X+ # define Printf printf X+ #endif X+ X #define MAX_REGISTERS 10 X #define ERR (-1) X X*************** X*** 109,115 **** X static altar *tmpaltar[256]; X #endif /* ALTARS /**/ X static lad *tmplad[256]; X! static dig *tmpdig[256]; X static char *tmpmap[ROWNO]; X static region *tmpreg[16]; X static door *tmpdoor[256]; X--- 117,123 ---- X static altar *tmpaltar[256]; X #endif /* ALTARS /**/ X static lad *tmplad[256]; X! static digpos *tmpdig[256]; X static char *tmpmap[ROWNO]; X static region *tmpreg[16]; X static door *tmpdoor[256]; X*************** X*** 153,163 **** X %token <i> MAZE_ID LEVEL_ID GEOMETRY_ID X %token <i> OBJECT_ID MONSTER_ID TRAP_ID DOOR_ID DRAWBRIDGE_ID MAZEWALK_ID X %token <i> REGION_ID RANDOM_OBJECTS_ID RANDOM_MONSTERS_ID RANDOM_PLACES_ID X! %token <i> ALTAR_ID LADDER_ID NON_DIGGABLE_ID ROOM_ID X %token <i> DOOR_STATE LIGHT_STATE X %token <i> DIRECTION RANDOM_TYPE O_REGISTER M_REGISTER P_REGISTER A_REGISTER X %token <i> ALIGNMENT LEFT_OR_RIGHT CENTER TOP_OR_BOT ALTAR_TYPE UP_OR_DOWN X! %token <i> ',' ':' '(' ')' '[' ']' X %token <map> STRING MAP_ID X %type <map> string maze_def m_name o_name X %start file X--- 161,171 ---- X %token <i> MAZE_ID LEVEL_ID GEOMETRY_ID X %token <i> OBJECT_ID MONSTER_ID TRAP_ID DOOR_ID DRAWBRIDGE_ID MAZEWALK_ID X %token <i> REGION_ID RANDOM_OBJECTS_ID RANDOM_MONSTERS_ID RANDOM_PLACES_ID X! %token <i> ALTAR_ID LADDER_ID NON_DIGGABLE_ID ROOM_ID X %token <i> DOOR_STATE LIGHT_STATE X %token <i> DIRECTION RANDOM_TYPE O_REGISTER M_REGISTER P_REGISTER A_REGISTER X %token <i> ALIGNMENT LEFT_OR_RIGHT CENTER TOP_OR_BOT ALTAR_TYPE UP_OR_DOWN X! %token <i> ',' ':' '(' ')' '[' ']' X %token <map> STRING MAP_ID X %type <map> string maze_def m_name o_name X %start file X*************** X*** 179,187 **** X fprintf(stderr,"%s : %d errors detected. No output created!\n", fname, fatal_error); X else { X fout = open($1, O_WRONLY | O_CREAT X! #ifdef MSDOS X | O_BINARY X! #endif /* MSDOS */ X , 0644); X if (fout < 0) { X yyerror("Can't open output file!!"); X--- 187,195 ---- X fprintf(stderr,"%s : %d errors detected. No output created!\n", fname, fatal_error); X else { X fout = open($1, O_WRONLY | O_CREAT X! #if defined(MSDOS) || defined(MACOS) X | O_BINARY X! #endif /* MSDOS || MACOS */ X , 0644); X if (fout < 0) { X yyerror("Can't open output file!!"); X*************** X*** 202,211 **** X $$ = $3; X } X X! regions : aregion X | regions aregion; X X! aregion : map_definition reg_init map_details X { X store_part(); X } X--- 210,219 ---- X $$ = $3; X } X X! regions : aregion X | regions aregion; X X! aregion : map_definition reg_init map_details X { X store_part(); X } X*************** X*** 341,347 **** X if (!$5) X tmpmonst[nmons]->id = -1; X else { X! token = get_monster_id($5, (char) $<i>3); X if (token == ERR) { X yywarning("Illegal monster name! Making random monster."); X tmpmonst[nmons]->id = -1; X--- 349,355 ---- X if (!$5) X tmpmonst[nmons]->id = -1; X else { X! token = get_monster_id($5, (char) $<i>3); X if (token == ERR) { X yywarning("Illegal monster name! Making random monster."); X tmpmonst[nmons]->id = -1; X*************** X*** 405,411 **** X ndb++; X } X X! mazewalk_detail : MAZEWALK_ID ':' coordinate ',' DIRECTION X { X tmpwalk[nwalk] = (walk *) alloc(sizeof(walk)); X tmpwalk[nwalk]->x = current_coord.x; X--- 413,419 ---- X ndb++; X } X X! mazewalk_detail : MAZEWALK_ID ':' coordinate ',' DIRECTION X { X tmpwalk[nwalk] = (walk *) alloc(sizeof(walk)); X tmpwalk[nwalk]->x = current_coord.x; X*************** X*** 423,431 **** X nlad++; X } X X! diggable_detail : NON_DIGGABLE_ID ':' region X { X! tmpdig[ndig] = (dig *) alloc(sizeof(dig)); X tmpdig[ndig]->x1 = current_region.x1; X tmpdig[ndig]->y1 = current_region.y1; X tmpdig[ndig]->x2 = current_region.x2; X--- 431,439 ---- X nlad++; X } X X! diggable_detail : NON_DIGGABLE_ID ':' region X { X! tmpdig[ndig] = (digpos *) alloc(sizeof(digpos)); X tmpdig[ndig]->x1 = current_region.x1; X tmpdig[ndig]->y1 = current_region.y1; X tmpdig[ndig]->x2 = current_region.x2; X*************** X*** 487,493 **** X X trap_name : string X { X! int token = get_trap_type($1); X if (token == ERR) X yyerror("unknown trap type!"); X $<i>$ = token; X--- 495,501 ---- X X trap_name : string X { X! int token = get_trap_type($1); X if (token == ERR) X yyerror("unknown trap type!"); X $<i>$ = token; X*************** X*** 537,543 **** X } X } X X! o_register : O_REGISTER '[' INTEGER ']' X { X if ( $3 >= MAX_REGISTERS ) { X yyerror("Register Index overflow!"); X--- 545,551 ---- X } X } X X! o_register : O_REGISTER '[' INTEGER ']' X { X if ( $3 >= MAX_REGISTERS ) { X yyerror("Register Index overflow!"); X*************** X*** 566,572 **** X X place : coord X X! monster : CHAR X { X if (check_monster_char($1)) X $<i>$ = $1 ; X--- 574,580 ---- X X place : coord X X! monster : CHAR X { X if (check_monster_char($1)) X $<i>$ = $1 ; X*************** X*** 598,604 **** X X coord : '(' INTEGER ',' INTEGER ')' X { X! if ($2 < 0 || $2 > max_x_map || X $4 < 0 || $4 > max_y_map) X yyerror("Coordinates out of map range!"); X current_coord.x = $2; X--- 606,612 ---- X X coord : '(' INTEGER ',' INTEGER ')' X { X! if ($2 < 0 || $2 > max_x_map || X $4 < 0 || $4 > max_y_map) X yyerror("Coordinates out of map range!"); X current_coord.x = $2; X*************** X*** 607,613 **** X X region : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' X { X! if ($2 < 0 || $2 > max_x_map || X $4 < 0 || $4 > max_y_map || X $6 < 0 || $6 > max_x_map || X $8 < 0 || $8 > max_y_map) X--- 615,621 ---- X X region : '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' X { X! if ($2 < 0 || $2 > max_x_map || X $4 < 0 || $4 > max_y_map || X $6 < 0 || $6 > max_x_map || X $8 < 0 || $8 > max_y_map) X*************** X*** 894,900 **** X /* The non_diggable directives */ X X if(tmppart[npart]->ndig = ndig) { X! tmppart[npart]->digs = (dig **) alloc(sizeof(dig*) * ndig); X for(i=0;i<ndig;i++) X tmppart[npart]->digs[i] = tmpdig[i]; X } X--- 902,908 ---- X /* The non_diggable directives */ X X if(tmppart[npart]->ndig = ndig) { X! tmppart[npart]->digs = (digpos **) alloc(sizeof(digpos*) * ndig); X for(i=0;i<ndig;i++) X tmppart[npart]->digs[i] = tmpdig[i]; X } X*************** X*** 1039,1045 **** X /* The non_diggable directives */ X (void) write(fd, &(pt->ndig), 1); X for(j=0;j<pt->ndig;j++) { X! (void) write(fd,(genericptr_t) pt->digs[j], sizeof(dig)); X free(pt->digs[j]); X } X if (pt->ndig > 0) X--- 1047,1053 ---- X /* The non_diggable directives */ X (void) write(fd, &(pt->ndig), 1); X for(j=0;j<pt->ndig;j++) { X! (void) write(fd,(genericptr_t) pt->digs[j], sizeof(digpos)); X free(pt->digs[j]); X } X if (pt->ndig > 0) X*** src/Old/lev_main.c Sun Nov 19 12:46:16 1989 X--- src/lev_main.c Sat Nov 11 17:29:56 1989 X*************** X*** 7,12 **** X--- 7,13 ---- X * and some useful functions needed by yacc X */ X X+ /* #include "hack.h" /* uncomment for the Mac */ X #include <stdio.h> X X #define MAX_ERRORS 25 X*************** X*** 21,26 **** X--- 22,76 ---- X { X FILE *fin; X int i; X+ X+ #if defined(MACOS) && defined(SMALLDATA) X+ # ifdef THINKC4 X+ #include <console.h> X+ # endif X+ #define YYLMAX 2048 X+ extern char *yysbuf, *yytext, *yysptr; X+ Handle temp; X+ Str255 name; X+ long j; X+ extern struct permonst *mons; X+ extern struct objclass *objects; X+ X+ /* sub in the Nethack resource filename */ X+ strcpy((char *)name, "\010NH3.rsrc"); X+ yysbuf = (char *)alloc(YYLMAX); X+ yysptr = yysbuf; X+ yytext = (char *)alloc(YYLMAX); X+ X+ (void)OpenResFile(name); X+ temp = GetResource(HACK_DATA, MONST_DATA); X+ if (temp) { X+ DetachResource(temp); X+ MoveHHi(temp); X+ HLock(temp); X+ i = GetHandleSize(temp); X+ mons = (struct permonst *)(*temp); X+ } else { X+ panic("Can't get MONST resource data."); X+ } X+ X+ temp = GetResource(HACK_DATA, OBJECT_DATA); X+ if (temp) { X+ DetachResource(temp); X+ MoveHHi(temp); X+ HLock(temp); X+ i = GetHandleSize(temp); X+ objects = (struct objclass *)(*temp); X+ for (j = 0; j< NROFOBJECTS+1; j++) { X+ objects[j].oc_name = sm_obj[j].oc_name; X+ objects[j].oc_descr = sm_obj[j].oc_descr; X+ } X+ } else { X+ panic("Can't get OBJECT resource data."); X+ } X+ # ifdef THINKC4 X+ argc = ccommand(&argv); X+ # endif X+ #endif X X if (argc == 1) /* Read standard input */ X yyparse(); X*** src/Old/lock.c Sun Nov 19 12:46:30 1989 X--- src/lock.c Sat Nov 11 17:29:37 1989 X*************** X*** 11,17 **** X--- 11,19 ---- X int chance, usedtime; X } xlock; X X+ #ifndef OVERLAY X static X+ #endif X int X picklock() { /* try to open/close a lock */ X X*************** X*** 59,64 **** X--- 61,68 ---- X if(xlock.door->doormask & D_TRAPPED) { X b_trapped("door"); X xlock.door->doormask = D_NODOOR; X+ mnewsym(u.ux+u.dx, u.uy+u.dy); X+ prl(u.ux+u.dx, u.uy+u.dy); X } else if(xlock.door->doormask == D_LOCKED) X xlock.door->doormask = D_CLOSED; X else xlock.door->doormask = D_LOCKED; X*************** X*** 72,78 **** X return((xlock.usedtime = 0)); X } X X! static X int X forcelock() { /* try to force a locked chest */ X X--- 76,84 ---- X return((xlock.usedtime = 0)); X } X X! #ifndef OVERLAY X! static X! #endif X int X forcelock() { /* try to force a locked chest */ X X*************** X*** 182,227 **** X y = u.uy + u.dy; X if((x == u.ux) && (y == u.uy)) { /* pick the lock on a container */ X c = 'n'; /* in case there are no boxes here */ X! if(OBJ_AT(x, y)) 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! c = ynq(); X! if(c == 'q') return(0); X! if(c == 'n') continue; X! X! if(picktyp == KEY && otmp->spe != pick->spe) { X! pline("The %s won't fit the lock.",xname(pick)); X! return(1); X! } X! switch(picktyp) { X! case CREDIT_CARD: X! ch = ACURR(A_DEX)+(20*(pl_character[0] == 'R')); X! break; X! case LOCK_PICK: X! ch = 4*ACURR(A_DEX)+(25*(pl_character[0] == 'R')); X! break; X! case SKELETON_KEY: X! ch = 75 + ACURR(A_DEX); X! break; X! case KEY: X! ch = 1000; X! break; X! default: ch = 0; X! } X! if(otmp->cursed) ch /= 2; X X! xlock.door_or_box = 0; X! xlock.picktyp = picktyp; X! xlock.box = otmp; X! break; X } X if(c != 'y') X return(0); /* decided against all boxes */ X } else { /* pick the lock in a door */ X--- 188,231 ---- X y = u.uy + u.dy; X if((x == u.ux) && (y == u.uy)) { /* pick the lock on a container */ X c = 'n'; /* in case there are no boxes here */ X! for(otmp = level.objects[x][y]; otmp; otmp = otmp->nexthere) 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! c = ynq(); X! if(c == 'q') return(0); X! if(c == 'n') continue; X X! if(picktyp == KEY && otmp->spe != pick->spe) { X! pline("The %s won't fit the lock.",xname(pick)); X! return(1); X! } X! switch(picktyp) { X! case CREDIT_CARD: X! ch = ACURR(A_DEX)+(20*(pl_character[0] == 'R')); X! break; X! case LOCK_PICK: X! ch = 4*ACURR(A_DEX)+(25*(pl_character[0] == 'R')); X! break; X! case SKELETON_KEY: X! ch = 75 + ACURR(A_DEX); X! break; X! case KEY: X! ch = 1000; X! break; X! default: ch = 0; X } X+ if(otmp->cursed) ch /= 2; X+ X+ xlock.door_or_box = 0; X+ xlock.picktyp = picktyp; X+ xlock.box = otmp; X+ break; X+ } X if(c != 'y') X return(0); /* decided against all boxes */ X } else { /* pick the lock in a door */ X*************** X*** 329,360 **** X X /* A lock is made only for the honest man, the thief will break it. */ X xlock.box = (struct obj *)0; X! if(OBJ_AT(u.ux, u.uy)) X! for(otmp = fobj; otmp; otmp = otmp->nobj) X! if((otmp->ox == u.ux) && (otmp->oy == u.uy)) X! if(Is_box(otmp)) { X! if(otmp->olocked) X pline("There is %s here, force the lock? ", doname(otmp)); X! else { X pline("There is a %s here, but it's already unlocked.", X xname(otmp)); X continue; X! } X X! c = ynq(); X! if(c == 'q') return(0); X! if(c == 'n') continue; X X! if(picktyp) X You("force your %s into a crack and pry.", xname(uwep)); X! else X You("start bashing it with your %s.", xname(uwep)); X! xlock.box = otmp; X! xlock.chance = objects[otmp->otyp].wldam * 2; X! xlock.picktyp = picktyp; X! xlock.usedtime = 0; X! break; X! } X X if(xlock.box) set_occupation(forcelock, "forcing the lock", 0); X else You("decide not to force the issue."); X--- 333,362 ---- X X /* A lock is made only for the honest man, the thief will break it. */ X xlock.box = (struct obj *)0; X! for(otmp = level.objects[u.ux][u.uy]; otmp; otmp = otmp->nexthere) X! if(Is_box(otmp)) { X! if(otmp->olocked) X pline("There is %s here, force the lock? ", doname(otmp)); X! else { X pline("There is a %s here, but it's already unlocked.", X xname(otmp)); X continue; X! } X X! c = ynq(); X! if(c == 'q') return(0); X! if(c == 'n') continue; X X! if(picktyp) X You("force your %s into a crack and pry.", xname(uwep)); X! else X You("start bashing it with your %s.", xname(uwep)); X! xlock.box = otmp; X! xlock.chance = objects[otmp->otyp].wldam * 2; X! xlock.picktyp = picktyp; X! xlock.usedtime = 0; X! break; X! } X X if(xlock.box) set_occupation(forcelock, "forcing the lock", 0); X else You("decide not to force the issue."); X*************** X*** 374,380 **** 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 return(1); X--- 376,382 ---- 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 == CLOSED_DOOR_SYM && X !Protection_from_shape_changers) { X stumble_onto_mimic(mtmp); X return(1); X*************** X*** 418,423 **** X--- 420,427 ---- X door->doormask = D_NODOOR; X } else X door->doormask = D_ISOPEN; X+ mnewsym(x,y); X+ prl(x,y); X } else { X pline("The door resists!"); X } X*************** X*** 460,466 **** 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 return(1); X--- 464,470 ---- X } X X if(MON_AT(x, y) && (mtmp = m_at(x,y))->mimic && X! mtmp->mappearance == CLOSED_DOOR_SYM && X !Protection_from_shape_changers) { X stumble_onto_mimic(mtmp); X return(1); X*************** X*** 506,511 **** X--- 510,517 ---- X if (rn2(25) < (ACURR(A_STR)+ACURR(A_DEX)+ACURR(A_CON))/3) { X pline("The door closes."); X door->doormask = D_CLOSED; X+ mnewsym(x,y); X+ prl(x,y); X } X else pline("The door resists!"); X } X*************** X*** 561,570 **** X ) { X door->typ = DOOR; X door->doormask = D_CLOSED | (door->doormask & D_TRAPPED); X! if(cansee(x,y)) { X! pline("A section of the wall opens up!"); X! newsym(x,y); X! } X return(1); X } else X return(0); X--- 567,574 ---- X ) { X door->typ = DOOR; X door->doormask = D_CLOSED | (door->doormask & D_TRAPPED); X! if(cansee(x,y)) pline("A section of the wall opens up!"); X! mnewsym(x,y); X return(1); X } else X return(0); X*************** X*** 608,613 **** X--- 612,619 ---- X default: res = 0; X } X door->doormask = D_LOCKED | (door->doormask & D_TRAPPED); X+ mnewsym(x,y); X+ if(cansee(x,y)) prl(x,y); X break; X case WAN_OPENING: X #ifdef SPELLS X*************** X*** 632,637 **** X--- 638,645 ---- X else if (flags.soundok) X You("hear a distant explosion."); X door->doormask = D_NODOOR; X+ mnewsym(x,y); X+ if (cansee(x,y)) prl(x,y); X break; X } X door->doormask = D_BROKEN; X*************** X*** 640,645 **** X--- 648,655 ---- X pline("The door crashes open!"); X else if (flags.soundok) X You("hear a crashing sound."); X+ mnewsym(x,y); X+ if (cansee(x,y)) prl(x,y); X } else res = 0; X break; X default: impossible("magic (%d) attempted on door.", otmp->otyp); X*** src/Old/makemon.c Sun Nov 19 13:40:51 1989 X--- src/makemon.c Fri Nov 17 19:31:44 1989 X*************** X*** 1,4 **** X! /* SCCS Id: @(#)makemon.c 3.0 88/04/11 X /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X /* NetHack may be freely redistributed. See license for details. */ X X--- 1,4 ---- X! /* SCCS Id: @(#)makemon.c 3.0 89/11/15 X /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X /* NetHack may be freely redistributed. See license for details. */ X X*************** X*** 5,16 **** X #include "hack.h" X 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 #define toostrong(monindx, lev) (monstr[monindx] > lev) X #define tooweak(monindx, lev) (monstr[monindx] < lev) X X--- 5,16 ---- X #include "hack.h" X X struct monst zeromonst; X! static int FDECL(uncommon, (struct permonst *)); X X int monstr[NUMMONS]; X X! #define m_initsgrp(mtmp, x, y) m_initgrp(mtmp, x, y, 3) X! #define m_initlgrp(mtmp, x, y) m_initgrp(mtmp, x, y, 10) X #define toostrong(monindx, lev) (monstr[monindx] > lev) X #define tooweak(monindx, lev) (monstr[monindx] < lev) X X*************** X*** 23,28 **** X--- 23,35 ---- X register int cnt = rnd(n); X struct monst *mon; X X+ /* X+ * Temporary kludge to cut down on swarming at lower character levels X+ * till we can get this game a little more balanced. [mrs] X+ */ X+ cnt /= (u.ulevel < 3) ? 4 : (u.ulevel < 5) ? 2 : 1; X+ if(!cnt) cnt++; X+ X mm.x = x; X mm.y = y; X while(cnt--) { X*************** X*** 64,69 **** X--- 71,77 ---- X register struct monst *mtmp; X { X register struct permonst *ptr = mtmp->data; X+ register int mm = monsndx(ptr); X #ifdef REINCARNATION X if (dlevel==rogue_level) return; X #endif X*************** X*** 84,90 **** X break; X case S_HUMAN: X if(is_mercenary(ptr)) X! switch(monsndx(ptr)) { X X #ifdef ARMY X case PM_SOLDIER: X--- 92,98 ---- X break; X case S_HUMAN: X if(is_mercenary(ptr)) X! switch (mm) { X X #ifdef ARMY X case PM_SOLDIER: X*************** X*** 108,114 **** X X case S_HUMANOID: X #ifdef TOLKIEN X! if (monsndx(ptr) == PM_HOBBIT) { X switch (rn2(3)) { X case 0: X (void)mongets(mtmp, DAGGER); X--- 116,122 ---- X X case S_HUMANOID: X #ifdef TOLKIEN X! if (mm == PM_HOBBIT) { X switch (rn2(3)) { X case 0: X (void)mongets(mtmp, DAGGER); X*************** X*** 201,253 **** X break; X #endif X case S_ORC: X #ifdef TOLKIEN X! { int mm = monsndx(ptr); X! if(rn2(2)) (void)mongets(mtmp, ORCISH_HELM); X! if (mm == PM_MORDOR_ORC || X! (mm == PM_ORC_CAPTAIN && rn2(2))) { X! if(rn2(2)) (void)mongets(mtmp, SCIMITAR); X! if(rn2(2)) (void)mongets(mtmp, ORCISH_SHIELD); X! if(rn2(2)) (void)mongets(mtmp, KNIFE); X! if(rn2(2)) (void)mongets(mtmp, ORCISH_CHAIN_MAIL); X! } else if (mm == PM_URUK_HAI || mm == PM_ORC_CAPTAIN) { X! if(rn2(2)) (void)mongets(mtmp, ORCISH_CLOAK); X! if(rn2(2)) (void)mongets(mtmp, ORCISH_SHORT_SWORD); X! if(rn2(2)) (void)mongets(mtmp, IRON_SHOES); X! if(rn2(2)) { X! (void)mongets(mtmp, ORCISH_BOW); X! m_initthrow(mtmp, ORCISH_ARROW, 12); X! } X! if(rn2(2)) (void)mongets(mtmp, URUK_HAI_SHIELD); X! } else if (mm != PM_ORC_SHAMAN) { X! (void)mongets(mtmp, (mm == PM_GOBLIN || rn2(2) == 0) ? X! ORCISH_DAGGER : SCIMITAR); X! } X! } X #else /* TOLKIEN */ X! { int mm = monsndx(ptr); X! if(rn2(2)) (void)mongets(mtmp, ORCISH_HELM); X! if (mm == PM_ORC_CAPTAIN) { X! if(rn2(2)) { X! if(rn2(2)) (void)mongets(mtmp, SCIMITAR); X! if(rn2(2)) (void)mongets(mtmp, SMALL_SHIELD); X! if(rn2(2)) (void)mongets(mtmp, KNIFE); X! if(rn2(2)) (void)mongets(mtmp, CHAIN_MAIL); X! } else { X! if(rn2(2)) (void)mongets(mtmp, SHORT_SWORD); X! if(rn2(2)) (void)mongets(mtmp, IRON_SHOES); X! if(rn2(2)) { X! (void)mongets(mtmp, BOW); X! m_initthrow(mtmp, ARROW, 12); X! } X! if(rn2(2)) (void)mongets(mtmp, SMALL_SHIELD); X! } X! } else if (mm != PM_ORC_SHAMAN) { X! (void)mongets(mtmp, (mm == PM_GOBLIN || rn2(2) == 0) ? X! DAGGER : SCIMITAR); X! } X! } X #endif /* TOLKIEN */ X break; X case S_KOBOLD: X if (!rn2(4)) m_initthrow(mtmp, DART, 12); X--- 209,261 ---- X break; X #endif X case S_ORC: X+ if(rn2(2)) (void)mongets(mtmp, ORCISH_HELM); X #ifdef TOLKIEN X! switch (mm != PM_ORC_CAPTAIN ? mm : X! rn2(2) ? PM_MORDOR_ORC : PM_URUK_HAI) { X! case PM_MORDOR_ORC: X! if(rn2(2)) (void)mongets(mtmp, SCIMITAR); X! if(rn2(2)) (void)mongets(mtmp, ORCISH_SHIELD); X! if(rn2(2)) (void)mongets(mtmp, KNIFE); X! if(rn2(2)) (void)mongets(mtmp, ORCISH_CHAIN_MAIL); X! break; X! case PM_URUK_HAI: X! if(rn2(2)) (void)mongets(mtmp, ORCISH_CLOAK); X! if(rn2(2)) (void)mongets(mtmp, ORCISH_SHORT_SWORD); X! if(rn2(2)) (void)mongets(mtmp, IRON_SHOES); X! if(rn2(2)) { X! (void)mongets(mtmp, ORCISH_BOW); X! m_initthrow(mtmp, ORCISH_ARROW, 12); X! } X! if(rn2(2)) (void)mongets(mtmp, URUK_HAI_SHIELD); X! break; X! default: X! if (mm != PM_ORC_SHAMAN) X! (void)mongets(mtmp, (mm == PM_GOBLIN || rn2(2) == 0) ? X! ORCISH_DAGGER : SCIMITAR); X #else /* TOLKIEN */ X! switch (mm) { X! case PM_ORC_CAPTAIN: X! if(rn2(2)) { X! if(rn2(2)) (void)mongets(mtmp, SCIMITAR); X! if(rn2(2)) (void)mongets(mtmp, SMALL_SHIELD); X! if(rn2(2)) (void)mongets(mtmp, KNIFE); X! if(rn2(2)) (void)mongets(mtmp, CHAIN_MAIL); X! } else { X! if(rn2(2)) (void)mongets(mtmp, SHORT_SWORD); X! if(rn2(2)) (void)mongets(mtmp, IRON_SHOES); X! if(rn2(2)) { X! (void)mongets(mtmp, BOW); X! m_initthrow(mtmp, ARROW, 12); X! } X! if(rn2(2)) (void)mongets(mtmp, SMALL_SHIELD); X! } X! default: X! if (mm != PM_ORC_SHAMAN) X! (void)mongets(mtmp, (mm == PM_GOBLIN || rn2(2) == 0) ? X! DAGGER : SCIMITAR); X #endif /* TOLKIEN */ X+ } X break; X case S_KOBOLD: X if (!rn2(4)) m_initthrow(mtmp, DART, 12); X*************** X*** 269,279 **** X (void)mongets(mtmp, LONG_SWORD); X break; X case S_DEMON: X! #ifdef HARD X! if (monsndx(ptr) == PM_BALROG) { X! (void)mongets(mtmp, BULLWHIP); X! (void)mongets(mtmp, BROADSWORD); X! break; X } X #endif X /* prevent djinnis and mail daemons from leaving objects when X--- 277,306 ---- X (void)mongets(mtmp, LONG_SWORD); X break; X case S_DEMON: X! #ifdef INFERNO X! switch (mm) { X! case PM_BALROG: X! (void)mongets(mtmp, BULLWHIP); X! (void)mongets(mtmp, BROADSWORD); X! break; X! case PM_ORCUS: X! (void)mongets(mtmp, WAN_DEATH); /* the Wand of Orcus */ X! break; X! case PM_HORNED_DEVIL: X! (void)mongets(mtmp, rn2(4) ? TRIDENT : BULLWHIP); X! break; X! case PM_ICE_DEVIL: X! if (!rn2(4)) (void)mongets(mtmp, SPEAR); X! break; X! case PM_ASMODEUS: X! (void)mongets(mtmp, WAN_COLD); X! break; X! case PM_DISPATER: X! (void)mongets(mtmp, WAN_STRIKING); X! break; X! case PM_YEENOGHU: X! (void)mongets(mtmp, FLAIL); X! break; X } X #endif X /* prevent djinnis and mail daemons from leaving objects when X*************** X*** 504,520 **** 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- * any shape-changing chameleons -dgk X- */ X- if (Protection_from_shape_changers) X- mtmp->cham = 0; X- else { X- mtmp->cham = 1; X- (void) newcham(mtmp, rndmonst()); X- } X- break; X case S_STALKER: X case S_EEL: X mtmp->minvis = 1; X--- 531,536 ---- X*************** X*** 536,542 **** X mtmp->mpeaceful = 1; X break; X } X! if (ptr == &mons[PM_WIZARD_OF_YENDOR]) { X mtmp->iswiz = 1; X flags.no_of_wizards++; X } X--- 552,568 ---- X mtmp->mpeaceful = 1; X break; X } X! if (ptr == &mons[PM_CHAMELEON]) { X! /* If you're protected with a ring, don't create X! * any shape-changing chameleons -dgk X! */ X! if (Protection_from_shape_changers) X! mtmp->cham = 0; X! else { X! mtmp->cham = 1; X! (void) newcham(mtmp, rndmonst()); X! } X! } else if (ptr == &mons[PM_WIZARD_OF_YENDOR]) { X mtmp->iswiz = 1; X flags.no_of_wizards++; X } X*************** X*** 559,565 **** X } X } X } X! #ifdef HARD X if(is_dprince(ptr)) { X mtmp->mpeaceful = mtmp->minvis = 1; X # ifdef NAMED_ITEMS X--- 585,591 ---- X } X } X } X! #ifdef INFERNO X if(is_dprince(ptr)) { X mtmp->mpeaceful = mtmp->minvis = 1; X # ifdef NAMED_ITEMS X*************** X*** 629,635 **** X range++; X } while(tfoo == foo); X foofull: X! i = rn2(tfoo - foo); X cc->x = foo[i].x; X cc->y = foo[i].y; X return; X--- 655,661 ---- X range++; X } while(tfoo == foo); X foofull: X! i = rn2((int)(tfoo - foo)); X cc->x = foo[i].x; X cc->y = foo[i].y; X return; X*************** X*** 779,785 **** 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--- 805,811 ---- X || (tmp2 == AD_WERE) X #endif X ) n += 2; X! else if (ptr != &mons[PM_GRID_BUG]) n += (tmp2 != AD_PHYS); X n += ((ptr->mattk[i].damd * ptr->mattk[i].damn) > 23); X } X X*************** X*** 935,944 **** X newtype = little_to_big(monsndx(ptr)); X if (++mtmp->m_lev >= mons[newtype].mlevel) { X if (mons[newtype].geno & G_GENOD) { X! pline("As %s grows up into a%s %s, %s dies!", X mon_nam(mtmp), X! index(vowels,*mons[newtype].mname) ? "n" : "", X! mons[newtype].mname, X mon_nam(mtmp)); X mondied(mtmp); X return (struct permonst *)0; X--- 961,969 ---- X newtype = little_to_big(monsndx(ptr)); X if (++mtmp->m_lev >= mons[newtype].mlevel) { X if (mons[newtype].geno & G_GENOD) { X! pline("As %s grows up into %s, %s dies!", X mon_nam(mtmp), X! an(mons[newtype].mname), X mon_nam(mtmp)); X mondied(mtmp); X return (struct permonst *)0; X*************** X*** 1111,1118 **** 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 else if (is_maze_lev) X sym = rn2(2) ? ROCK_SYM : syms[rn2(sizeof syms)]; X else if (roomno < 0) X--- 1136,1145 ---- X else if (OBJ_AT(mtmp->mx, mtmp->my)) X sym = level.objects[mtmp->mx][mtmp->my]->olet; X else if (IS_DOOR(levl[mtmp->mx][mtmp->my].typ) || X! IS_WALL(levl[mtmp->mx][mtmp->my].typ) || X! levl[mtmp->mx][mtmp->my].typ == SDOOR || X! levl[mtmp->mx][mtmp->my].typ == SCORR) X! sym = CLOSED_DOOR_SYM; X else if (is_maze_lev) X sym = rn2(2) ? ROCK_SYM : syms[rn2(sizeof syms)]; X else if (roomno < 0) END_OF_FILE if test 54581 -ne `wc -c <'patches06g'`; then echo shar: \"'patches06g'\" unpacked with wrong size! fi # end of 'patches06g' fi echo shar: End of archive 6 \(of 15\). cp /dev/null ark6isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 15 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