billr@saab.CNA.TEK.COM (Bill Randle) (09/08/89)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 8, Issue 18 Archive-name: NetHack3/Patch3c 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 3 (of 6)." # Contents: patch03c # Wrapped by billr@saab on Thu Sep 7 14:38:47 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'patch03c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patch03c'\" else echo shar: Extracting \"'patch03c'\" \(56862 characters\) sed "s/^X//" >'patch03c' <<'END_OF_FILE' X*** src/Old/apply.c Wed Sep 6 15:38:11 1989 X--- src/apply.c Tue Sep 5 18:52:45 1989 X*************** X*** 482,491 **** X register char *digtxt; X register struct obj *obj; X X! if(obj = sobj_at(BOULDER, dpx, dpy)) { X! fracture_rock(obj); X! digtxt = "The boulder falls apart."; X! } else if(obj = sobj_at(STATUE, dpx, dpy)) { X if (break_statue(obj)) X digtxt = "The statue shatters."; X else X--- 482,488 ---- X register char *digtxt; X register struct obj *obj; X X! if(obj = sobj_at(STATUE, dpx, dpy)) { X if (break_statue(obj)) X digtxt = "The statue shatters."; X else X*************** X*** 493,498 **** X--- 490,498 ---- X * printed a message and updated the screen X */ X digtxt = NULL; X+ } else if(obj = sobj_at(BOULDER, dpx, dpy)) { X+ fracture_rock(obj); X+ digtxt = "The boulder falls apart."; X } else if(!lev->typ || lev->typ == SCORR) { X lev->typ = CORR; X digtxt = "You succeeded in cutting away some rock."; X*************** X*** 585,591 **** X if(Invisible) newsym(ttmp->tx,ttmp->ty); X pline("You've made a hole in the floor."); X if(!u.ustuck && !Levitation) { /* KAA */ X! if(inshop()) X shopdig(1); X #ifdef WALKIES X if(!next_to_u()) X--- 585,591 ---- X if(Invisible) newsym(ttmp->tx,ttmp->ty); X pline("You've made a hole in the floor."); X if(!u.ustuck && !Levitation) { /* KAA */ X! if(in_shop(u.ux, u.uy)) X shopdig(1); X #ifdef WALKIES X if(!next_to_u()) X*************** X*** 704,722 **** X dig_level = dlevel; X dig_effort = 0; X You("start %s.", X- isclosedoor ? "chopping at the door" : X sobj_at(STATUE, rx, ry) ? X "chipping the statue" : X sobj_at(BOULDER, rx, ry) ? X "hitting the boulder" : X "digging"); X } else X You("continue %s.", X- isclosedoor ? "chopping at the door" : X sobj_at(STATUE, rx, ry) ? X "chipping the statue" : X sobj_at(BOULDER, rx, ry) ? X "hitting the boulder" : X "digging"); X did_dig_msg = FALSE; X set_occupation(dig, "digging", 0); X--- 704,722 ---- X dig_level = dlevel; X dig_effort = 0; X You("start %s.", X sobj_at(STATUE, rx, ry) ? X "chipping the statue" : X sobj_at(BOULDER, rx, ry) ? X "hitting the boulder" : X+ isclosedoor ? "chopping at the door" : X "digging"); X } else X You("continue %s.", X sobj_at(STATUE, rx, ry) ? X "chipping the statue" : X sobj_at(BOULDER, rx, ry) ? X "hitting the boulder" : X+ isclosedoor ? "chopping at the door" : X "digging"); X did_dig_msg = FALSE; X set_occupation(dig, "digging", 0); X*************** X*** 732,738 **** X dig_level = dlevel; X dig_effort = 0; X You("start digging in the floor."); X! if(inshop()) X shopdig(0); X } else X You("continue digging in the floor."); X--- 732,738 ---- X dig_level = dlevel; X dig_effort = 0; X You("start digging in the floor."); X! if(in_shop(u.ux, u.uy)) X shopdig(0); X } else X You("continue digging in the floor."); X*************** X*** 1031,1036 **** X--- 1031,1037 ---- X X if(!obj || (obj != uwep && !wield_tool(obj))) return 0; X X+ /* now uwep is obj */ X if (uwep->otyp == MAGIC_LAMP) { X if (uwep->spe > 0 && !rn2(3)) { X uwep->spe = 0; X*** src/Old/artifact.c Wed Sep 6 15:38:48 1989 X--- src/artifact.c Sat Sep 2 12:15:16 1989 X*************** X*** 15,24 **** X X { LONG_SWORD, "Excalibur", (SPFX_NOGEN | SPFX_SEEK | SPFX_DEFN | X SPFX_SEARCH), 0, X! { 0, AD_PHYS, 5, 10 }, { 0, AD_DRLI, 0, 0} }, X X { KATANA, "Snickersnee", SPFX_RESTR, 0, X! { 0, AD_PHYS, 0, 8 }, NO_ATTK }, X X /* Ah, never shall I forget the cry, X * or the shriek that shrieked he, X--- 15,24 ---- X X { LONG_SWORD, "Excalibur", (SPFX_NOGEN | SPFX_SEEK | SPFX_DEFN | X SPFX_SEARCH), 0, X! { 0, AD_PHYS, 5, 10 }, { 0, AD_DRLI, 0, 0}, A_LAW }, X X { KATANA, "Snickersnee", SPFX_RESTR, 0, X! { 0, AD_PHYS, 0, 8 }, NO_ATTK, A_LAW }, X X /* Ah, never shall I forget the cry, X * or the shriek that shrieked he, X*************** X*** 30,87 **** X */ X X { AXE, "Cleaver", SPFX_RESTR, 0, X! { 0, AD_PHYS, 3, 12 }, NO_ATTK }, X X /* Special purpose swords - various types */ X X { TWO_HANDED_SWORD, "Orcrist", SPFX_DCLAS, S_ORC, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X X #ifdef TOLKIEN X { ELVEN_DAGGER, "Sting", (SPFX_WARN | SPFX_DCLAS), S_ORC, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X #else X { DAGGER, "Sting", (SPFX_WARN | SPFX_DCLAS), S_ORC, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X #endif X X { LONG_SWORD, "Frost Brand", (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, X! { 0, AD_COLD, 5, 0 }, { 0, AD_COLD, 0, 0 } }, X X { LONG_SWORD, "Fire Brand", (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, X! { 0, AD_FIRE, 5, 0 }, { 0, AD_FIRE, 0, 0 } }, X X /* Stormbringer only has a 2 because it can drain a level, providing 8 more */ X { BROADSWORD, "Stormbringer", (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN | X SPFX_DRLI), 0, X! { 0, AD_DRLI, 5, 2 }, { 0, AD_DRLI, 0, 0 } }, X X { LONG_SWORD, "Sunsword", (SPFX_RESTR | SPFX_DCLAS), 0, /* undead */ X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X X { BROADSWORD, "Dragonbane", (SPFX_RESTR | SPFX_DCLAS), S_DRAGON, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X X { LONG_SWORD, "Demonbane", (SPFX_RESTR | SPFX_DCLAS), 0, /* demons */ X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X X { LONG_SWORD, "Werebane", (SPFX_RESTR | SPFX_DCLAS), 0, /* weres */ X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X X { LONG_SWORD, "Giantslayer", (SPFX_RESTR | SPFX_DCLAS), 0, /* giants */ X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X X! { LUCERN_HAMMER, "Ogresmasher", (SPFX_RESTR | SPFX_DCLAS), S_OGRE, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X X! { LUCERN_HAMMER, "Thunderfist", (SPFX_RESTR | SPFX_ATTK), 0, X! { 0, AD_ELEC, 5, 24 }, NO_ATTK }, X X { MORNING_STAR, "Trollsbane", (SPFX_RESTR | SPFX_DCLAS), S_TROLL, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK }, X X /* ARRAY TERMINATOR */ X! { 0, "", 0, 0, NO_ATTK, NO_ATTK } X }; X X void X--- 30,100 ---- X */ X X { AXE, "Cleaver", SPFX_RESTR, 0, X! { 0, AD_PHYS, 3, 12 }, NO_ATTK, A_CHAOS }, X X+ #ifdef TOLKIEN X+ { ORCISH_DAGGER, "Grimtooth", SPFX_RESTR, 0, X+ { 0, AD_PHYS, 2, 6 }, NO_ATTK, A_CHAOS }, X+ #else X+ { DAGGER, "Grimtooth", SPFX_RESTR, 0, X+ { 0, AD_PHYS, 2, 6 }, NO_ATTK, A_CHAOS }, X+ #endif X+ X /* Special purpose swords - various types */ X X { TWO_HANDED_SWORD, "Orcrist", SPFX_DCLAS, S_ORC, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_LAW }, X X #ifdef TOLKIEN X { ELVEN_DAGGER, "Sting", (SPFX_WARN | SPFX_DCLAS), S_ORC, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_LAW }, X #else X { DAGGER, "Sting", (SPFX_WARN | SPFX_DCLAS), S_ORC, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_LAW }, X #endif X X { LONG_SWORD, "Frost Brand", (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, X! { 0, AD_COLD, 5, 0 }, { 0, AD_COLD, 0, 0 }, A_NEUTRAL }, X X { LONG_SWORD, "Fire Brand", (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, X! { 0, AD_FIRE, 5, 0 }, { 0, AD_FIRE, 0, 0 }, A_NEUTRAL }, X X /* Stormbringer only has a 2 because it can drain a level, providing 8 more */ X { BROADSWORD, "Stormbringer", (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN | X SPFX_DRLI), 0, X! { 0, AD_DRLI, 5, 2 }, { 0, AD_DRLI, 0, 0 }, A_CHAOS }, X X { LONG_SWORD, "Sunsword", (SPFX_RESTR | SPFX_DCLAS), 0, /* undead */ X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_LAW }, X X { BROADSWORD, "Dragonbane", (SPFX_RESTR | SPFX_DCLAS), S_DRAGON, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_NEUTRAL }, X X { LONG_SWORD, "Demonbane", (SPFX_RESTR | SPFX_DCLAS), 0, /* demons */ X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_LAW }, X X+ /* A silver weapon would be appropriate, if we had one. */ X { LONG_SWORD, "Werebane", (SPFX_RESTR | SPFX_DCLAS), 0, /* weres */ X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_LAW }, X X { LONG_SWORD, "Giantslayer", (SPFX_RESTR | SPFX_DCLAS), 0, /* giants */ X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_NEUTRAL }, X X! /* Another interesting weapon would be the dwarven hammer or axe with the X! * boomerang-like power of returning to the wielder's hand, if the code X! * were written to add such an ability. X! */ X! { WAR_HAMMER, "Ogresmasher", (SPFX_RESTR | SPFX_DCLAS), S_OGRE, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_LAW }, X X! { WAR_HAMMER, "Mjollnir", (SPFX_RESTR | SPFX_ATTK), 0, X! { 0, AD_ELEC, 5, 24 }, NO_ATTK, A_LAW }, /* Mjo:llnir */ X X { MORNING_STAR, "Trollsbane", (SPFX_RESTR | SPFX_DCLAS), S_TROLL, X! { 0, AD_PHYS, 5, 0 }, NO_ATTK, A_LAW }, X X /* ARRAY TERMINATOR */ X! { 0, "", 0, 0, NO_ATTK, NO_ATTK, 0 } X }; X X void X*************** X*** 157,163 **** X # if defined(THEOLOGY) && defined(ALTARS) X struct obj * X mk_aligned_artifact(align) X! int align; X { X register struct artifact *artif; X register struct obj *otmp; X--- 170,176 ---- X # if defined(THEOLOGY) && defined(ALTARS) X struct obj * X mk_aligned_artifact(align) X! unsigned align; X { X register struct artifact *artif; X register struct obj *otmp; X*** src/Old/attrib.c Wed Sep 6 15:39:06 1989 X--- src/attrib.c Tue Sep 5 21:34:05 1989 X*************** X*** 375,381 **** X } X } X X- #ifdef POLYSELF X void X redist_attr() { X X--- 375,380 ---- X*************** X*** 393,399 **** X if (ABASE(i) < attrmin.a[i]) ABASE(i) = attrmin.a[i]; X } X } X- #endif X X void X adjabil(flag) X--- 392,397 ---- X*** src/Old/bones.c Wed Sep 6 15:39:26 1989 X--- src/bones.c Thu Aug 31 19:09:46 1989 X*************** X*** 133,140 **** X /* drop everything; the corpse's possessions are usually cursed */ X otmp = invent; X while(otmp) { X! otmp->ox = u.ux; X! otmp->oy = u.uy; X otmp->owornmask = 0; X #ifdef TUTTI_FRUTTI X if(otmp->otyp == SLIME_MOLD) goodfruit(otmp->spe); X--- 133,139 ---- X /* drop everything; the corpse's possessions are usually cursed */ X otmp = invent; X while(otmp) { X! place_object(otmp, u.ux, u.uy); X otmp->owornmask = 0; X #ifdef TUTTI_FRUTTI X if(otmp->otyp == SLIME_MOLD) goodfruit(otmp->spe); X*************** X*** 144,160 **** X otmp->nobj = fobj; X fobj = invent; X invent = 0; /* superfluous */ X- levl[u.ux][u.uy].omask = 1; X break; X } X otmp = otmp->nobj; X } X if (u.ugrave_arise == -1) { X! if(!(mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy))) return; X Strcpy((char *) mtmp->mextra, plname); X } else { X- in_mklev = TRUE; X- /* tricks makemon() into allowing monster creation on your square */ X mons[u.ugrave_arise].pxlth += strlen(plname); X mtmp = makemon(&mons[u.ugrave_arise], u.ux, u.uy); X mons[u.ugrave_arise].pxlth -= strlen(plname); X--- 143,160 ---- X otmp->nobj = fobj; X fobj = invent; X invent = 0; /* superfluous */ X break; X } X otmp = otmp->nobj; X } X+ in_mklev = TRUE; X+ /* tricks makemon() into allowing monster creation on your square */ X if (u.ugrave_arise == -1) { X! mtmp = makemon(&mons[PM_GHOST], u.ux, u.uy); X! in_mklev = FALSE; X! if (!mtmp) return; X Strcpy((char *) mtmp->mextra, plname); X } else { X mons[u.ugrave_arise].pxlth += strlen(plname); X mtmp = makemon(&mons[u.ugrave_arise], u.ux, u.uy); X mons[u.ugrave_arise].pxlth -= strlen(plname); X*************** X*** 279,284 **** X--- 279,288 ---- X register int fd; X register int ok; X X+ #ifdef EXPLORE_MODE X+ if(discover) /* save bones files for real games */ X+ return(0); X+ #endif X /* wizard check added by GAN 02/05/87 */ X if(rn2(3) /* only once in three times do we find bones */ X #ifdef WIZARD X*** src/Old/cmd.c Wed Sep 6 15:39:48 1989 X--- src/cmd.c Wed Aug 30 13:10:33 1989 X*************** X*** 559,570 **** X {0,0,0} X }; X #undef M X- #undef C X X const struct ext_func_tab extcmdlist[] = { X "chat", "talk to someone", dotalk, /* converse? */ X "dip", "dip an object into something", dodip, X! "force", "force the lock on a chest", doforce, X "jump", "jump to a location", dojump, X "loot", "loot a box on the floor", doloot, X #ifdef POLYSELF X--- 559,569 ---- X {0,0,0} X }; X #undef M X X const struct ext_func_tab extcmdlist[] = { X "chat", "talk to someone", dotalk, /* converse? */ X "dip", "dip an object into something", dodip, X! "force", "force a lock", doforce, X "jump", "jump to a location", dojump, X "loot", "loot a box on the floor", doloot, X #ifdef POLYSELF X*************** X*** 578,596 **** X "rub", "rub a lamp", dorub, X "sit", "sit down", dosit, X "turn", "turn undead", doturn, X! "untrap", "untrap a trapped object", dountrap, X! "wipe", "wipe your face off", dowipe, X "?", "get this list of extended commands", doextlist, X NULL, NULL, donull X }; X X! char X unctrl(sym) X char sym; X { X! return (sym >= ('A' & 037) && sym <= ('Z' & 037)) ? sym + 0140 : sym; X } X X void X rhack(cmd) X register char *cmd; X--- 577,608 ---- X "rub", "rub a lamp", dorub, X "sit", "sit down", dosit, X "turn", "turn undead", doturn, X! "untrap", "untrap something", dountrap, X! "wipe", "wipe off your face", dowipe, X "?", "get this list of extended commands", doextlist, X NULL, NULL, donull X }; X X! #ifdef STUPID_CPP X! static char X unctrl(sym) X char sym; X { X! return (sym >= C('a') && sym <= C('z')) ? sym + 0140 : sym; X } X X+ static char X+ unmeta(sym) X+ char sym; X+ { X+ return (sym & 0x7f); X+ } X+ #else X+ #define unctrl(c) ((c) <= C('z') ? (0x60 | (c)) : (c)) X+ #define unmeta(c) (0x7f & (c)) X+ #endif X+ X+ X void X rhack(cmd) X register char *cmd; X*************** X*** 631,637 **** X domove(); X return; X } X! if(!flags.num_pad && movecmd(lowc(*cmd))) { X flags.run = 1; X rush: X if(firsttime){ X--- 643,649 ---- X domove(); X return; X } X! if(movecmd(flags.num_pad ? unmeta(*cmd) : lowc(*cmd))) { X flags.run = 1; X rush: X if(firsttime){ X*** src/Old/do.c Wed Sep 6 15:40:48 1989 X--- src/do.c Mon Aug 28 15:54:42 1989 X*************** X*** 318,330 **** X if(u.uswallow) X mpickobj(u.ustuck,obj); X else { X- obj->ox = u.ux; X- obj->oy = u.uy; X obj->nobj = fobj; X fobj = obj; X! levl[u.ux][u.uy].omask = 1; X if(Invisible) newsym(u.ux,u.uy); X! subfrombill(obj); X stackobj(obj); X } X } X--- 318,328 ---- X if(u.uswallow) X mpickobj(u.ustuck,obj); X else { X obj->nobj = fobj; X fobj = obj; X! place_object(obj, u.ux, u.uy); X if(Invisible) newsym(u.ux,u.uy); X! if(obj != uball) subfrombill(obj); X stackobj(obj); X } X } X*************** X*** 360,371 **** X return(1); X } X if(Levitation) { X- #ifdef STRONGHOLD X pline("You're floating high above the %s.", X! levl[u.ux][u.uy].typ == STAIRS ? "stairs" : "ladder"); X! #else X! pline("You're floating high above the stairs."); X #endif X return(0); X } X X--- 358,369 ---- X return(1); X } X if(Levitation) { X pline("You're floating high above the %s.", X! levl[u.ux][u.uy].typ == STAIRS ? "stairs" : X! #ifdef STRONGHOLD X! levl[u.ux][u.uy].typ == LADDER ? "ladder" : X #endif X+ "trapdoor"); X return(0); X } X X*************** X*** 726,732 **** X setsee(); X seeobjs(); /* make old cadavers disappear - riv05!a3 */ X docrt(); X! if(!flags.nopick && (levl[u.ux][u.uy].omask || levl[u.ux][u.uy].gmask)) X pickup(1); X else read_engr_at(u.ux,u.uy); X #ifdef HARD X--- 724,730 ---- X setsee(); X seeobjs(); /* make old cadavers disappear - riv05!a3 */ X docrt(); X! if(!flags.nopick && (OBJ_AT(u.ux, u.uy) || levl[u.ux][u.uy].gmask)) X pickup(1); X else read_engr_at(u.ux,u.uy); X #ifdef HARD X*** src/Old/dog.c Wed Sep 6 15:42:02 1989 X--- src/dog.c Wed Aug 30 18:49:01 1989 X*************** X*** 260,266 **** X case CARROT: X return (herbi ? DOGFOOD : MANFOOD); X default: X! #ifdef SLIME_MOLD X return (obj->otyp > SLIME_MOLD ? X #else X return (obj->otyp > CLOVE_OF_GARLIC ? X--- 260,266 ---- X case CARROT: X return (herbi ? DOGFOOD : MANFOOD); X default: X! #ifdef TUTTI_FRUTTI X return (obj->otyp > SLIME_MOLD ? X #else X return (obj->otyp > CLOVE_OF_GARLIC ? X*************** X*** 308,315 **** X mtmp->mflee = 0; X mtmp->mfleetim = 0; X if(mtmp->mtame || mtmp->mfroz || X! #ifdef WORM X! mtmp->wormno || X #endif X mtmp->isshk || mtmp->isgd || X #if defined(ALTARS) && defined(THEOLOGY) X--- 308,315 ---- X mtmp->mflee = 0; X mtmp->mfleetim = 0; X if(mtmp->mtame || mtmp->mfroz || X! #ifdef MEDUSA X! mtmp->data == &mons[PM_MEDUSA] || X #endif X mtmp->isshk || mtmp->isgd || X #if defined(ALTARS) && defined(THEOLOGY) X*************** X*** 321,328 **** X is_human(mtmp->data) || is_demon(mtmp->data)) X #endif X return(0); X- /* no tame long worms so they don't try to follow you down stairs X- or get in your way */ X if(obj) { X if(dogfood(mtmp, obj) >= MANFOOD) return(0); X if(cansee(mtmp->mx,mtmp->my)) X--- 321,326 ---- X*** src/Old/dogmove.c Wed Sep 6 15:42:19 1989 X--- src/dogmove.c Tue Sep 5 10:23:58 1989 X*************** X*** 247,253 **** X /* dog eschews cursed objects */ X /* but likes dog food */ X obj = fobj; X! if(levl[nx][ny].omask) X while(obj){ X if(obj->ox != nx || obj->oy != ny) X goto nextobj; X--- 247,253 ---- X /* dog eschews cursed objects */ X /* but likes dog food */ X obj = fobj; X! if(OBJ_AT(nx, ny)) X while(obj){ X if(obj->ox != nx || obj->oy != ny) X goto nextobj; X*** src/Old/dokick.c Wed Sep 6 15:42:37 1989 X--- src/dokick.c Tue Sep 5 21:34:52 1989 X*************** X*** 263,269 **** X } X /* stop on a zorkmid */ X if(levl[bhitpos.x][bhitpos.y].gmask || X! levl[bhitpos.x][bhitpos.y].omask) { X tmp_at(-1, -1); /* close call */ X return (struct monst *)0; X } X--- 263,269 ---- X } X /* stop on a zorkmid */ X if(levl[bhitpos.x][bhitpos.y].gmask || X! OBJ_AT(bhitpos.x, bhitpos.y)) { X tmp_at(-1, -1); /* close call */ X return (struct monst *)0; X } X*************** X*** 281,293 **** X #ifdef KICK X static int X kick_object(x, y) X! register int x, y; X { X! register int range, odx, ody, cnt = 0; X register struct monst *mon; X! register struct gold *gold; X register struct obj *otmp, *obj; X! register boolean costly = FALSE; X X /* if a pile, the "top" object gets kicked */ X for (otmp = fobj; otmp; otmp = otmp->nobj) X--- 281,293 ---- X #ifdef KICK X static int X kick_object(x, y) X! int x, y; X { X! int range, odx, ody, cnt = 0; X register struct monst *mon; X! struct gold *gold; X register struct obj *otmp, *obj; X! boolean costly = FALSE; X X /* if a pile, the "top" object gets kicked */ X for (otmp = fobj; otmp; otmp = otmp->nobj) X*************** X*** 321,339 **** X long zm; X gold = g_at(x, y); X zm = gold->amount; X if(range < 2 || zm > 300L) /* arbitrary */ X return(0); X! else { X! freegold(gold); X! if(!levl[x][y].mmask) newsym(x, y); X! if(mon = ghit(u.dx, u.dy, range)) { X setmangry(mon); /* not a means for payment to shk */ X if(ghitm(mon, zm)) /* was it caught? */ X return(1); X- } X- mkgold(zm, bhitpos.x, bhitpos.y); X- if(cansee(bhitpos.x, bhitpos.y)) prl(bhitpos.x,bhitpos.y); X } X return(1); X } X X--- 321,358 ---- X long zm; X gold = g_at(x, y); X zm = gold->amount; X+ if(IS_ROCK(levl[x][y].typ)) { X+ if ((!martial() && rn2(20) > ACURR(A_DEX)) X+ #ifdef POLYSELF X+ || IS_ROCK(levl[u.ux][u.uy].typ) X+ #endif X+ ) { X+ pline("%s doesn't come loose.", X+ Blind ? "It" : "The gold"); X+ return(!rn2(3) || martial()); X+ } X+ pline("%s comes loose.", Blind ? "It" : "The gold"); X+ freegold(gold); X+ newsym(x, y); X+ mkgold(zm, u.ux, u.uy); X+ if (Invisible X+ #ifdef POLYSELF X+ && !u.uundetected X+ #endif X+ ) newsym(u.ux, u.uy); X+ return(1); X+ } X if(range < 2 || zm > 300L) /* arbitrary */ X return(0); X! freegold(gold); X! newsym(x, y); X! if(mon = ghit(u.dx, u.dy, range)) { X setmangry(mon); /* not a means for payment to shk */ X if(ghitm(mon, zm)) /* was it caught? */ X return(1); X } X+ mkgold(zm, bhitpos.x, bhitpos.y); X+ if(cansee(bhitpos.x, bhitpos.y)) prl(bhitpos.x,bhitpos.y); X return(1); X } X X*************** X*** 378,388 **** X You("smash the %s!", xname(obj)); X if(costly) addtobill(obj, FALSE); X potionbreathe(obj); X! delobj(obj); /* takes care of omask */ X return(1); X } X } X X /* too heavy to move. make sure not to call bhit */ X /* in this function when range < 2 (a display bug */ X /* results otherwise). */ X--- 397,434 ---- X You("smash the %s!", xname(obj)); X if(costly) addtobill(obj, FALSE); X potionbreathe(obj); X! delobj(obj); X return(1); X } X } X X+ if(IS_ROCK(levl[x][y].typ)) { X+ if ((!martial() && rn2(20) > ACURR(A_DEX)) X+ #ifdef POLYSELF X+ || IS_ROCK(levl[u.ux][u.uy].typ) X+ #endif X+ ) { X+ if (Blind) pline("It doesn't come loose."); X+ else pline("The %s do%sn't come loose.", X+ distant_name(obj, xname), X+ (obj->quan==1) ? "es" : ""); X+ return(!rn2(3) || martial()); X+ } X+ if (Blind) pline("It comes loose."); X+ else pline("The %s come%s loose.", distant_name(obj, xname), X+ (obj->quan==1) ? "s" : ""); X+ move_object(obj, u.ux, u.uy); X+ newsym(x, y); X+ stackobj(obj); X+ if (Invisible X+ #ifdef POLYSELF X+ && !u.uundetected X+ #endif X+ ) newsym(u.ux, u.uy); X+ if (costly && !costly_spot(u.ux, u.uy)) addtobill(obj, FALSE); X+ return(1); X+ } X+ X /* too heavy to move. make sure not to call bhit */ X /* in this function when range < 2 (a display bug */ X /* results otherwise). */ X*************** X*** 393,409 **** X return(0); X } X X! if(cnt > 1) { X! /* Needed to fool bhit's display-cleanup to show */ X! /* immediately the next object in the pile. We */ X! /* know here that the object will move, so there */ X! /* is no need to worry about omask. */ X! obj->ox = u.ux; X! obj->oy = u.uy; X! } else { X! levl[x][y].omask = 0; X! if(!levl[x][y].gmask) newsym(x, y); X! } X X mon = bhit(u.dx, u.dy, range, obj->olet, X (int (*)()) 0, (int (*)()) 0, obj); X--- 439,450 ---- X return(0); X } X X! /* Needed to fool bhit's display-cleanup to show immediately */ X! /* the next object in the pile. We know here that the object */ X! /* will move, so there is no need to worry about the location, */ X! /* which merely needs to be something other than ox, oy. */ X! move_object(obj, u.ux, u.uy); X! if(cnt == 1 && !levl[x][y].mmask) newsym(x, y); X X mon = bhit(u.dx, u.dy, range, obj->olet, X (int (*)()) 0, (int (*)()) 0, obj); X*************** X*** 417,425 **** X if(thitmonst(mon, obj)) return(1); X } X if(costly && !costly_spot(bhitpos.x,bhitpos.y)) addtobill(obj, FALSE); X! obj->ox = bhitpos.x; X! obj->oy = bhitpos.y; X! levl[obj->ox][obj->oy].omask = 1; X stackobj(obj); X if(!levl[obj->ox][obj->oy].mmask) newsym(obj->ox, obj->oy); X return(1); X--- 458,464 ---- X if(thitmonst(mon, obj)) return(1); X } X if(costly && !costly_spot(bhitpos.x,bhitpos.y)) addtobill(obj, FALSE); X! move_object(obj, bhitpos.x, bhitpos.y); X stackobj(obj); X if(!levl[obj->ox][obj->oy].mmask) newsym(obj->ox, obj->oy); X return(1); X*************** X*** 498,504 **** X return(1); X } X X! if((maploc->omask || maploc->gmask) && !Levitation) { X if(kick_object(x, y)) return(1); X else goto ouch; X } X--- 537,543 ---- X return(1); X } X X! if((OBJ_AT(x, y) || maploc->gmask) && !Levitation) { X if(kick_object(x, y)) return(1); X else goto ouch; X } X*** src/Old/dothrow.c Wed Sep 6 15:43:02 1989 X--- src/dothrow.c Mon Aug 21 14:52:34 1989 X*************** X*** 160,171 **** X if(obj->otyp == CRYSKNIFE) X obj->otyp = WORM_TOOTH; X #endif X- obj->ox = bhitpos.x; X- obj->oy = bhitpos.y; X obj->nobj = fobj; X fobj = obj; X! levl[bhitpos.x][bhitpos.y].omask = 1; X! if(obj->unpaid && costly_spot(bhitpos.x, bhitpos.y)) X subfrombill(obj); X stackobj(obj); X if(obj == uball && X--- 160,171 ---- X if(obj->otyp == CRYSKNIFE) X obj->otyp = WORM_TOOTH; X #endif X obj->nobj = fobj; X fobj = obj; X! place_object(obj, bhitpos.x, bhitpos.y); X! if(obj != uball && costly_spot(bhitpos.x, bhitpos.y) && X! !(mon && mon->isshk && bhitpos.x == mon->mx && X! bhitpos.y == mon->my && !(obj->unpaid))) X subfrombill(obj); X stackobj(obj); X if(obj == uball && X*** src/Old/eat.c Wed Sep 6 15:43:23 1989 X--- src/eat.c Wed Sep 6 15:12:34 1989 X*************** X*** 461,466 **** X--- 461,467 ---- X tmp = 1; X break; X case DAGGER: X+ case ATHAME: X #ifdef WORM X case CRYSKNIFE: X #endif X*************** X*** 541,547 **** X #endif X if(rn2(2) X #ifdef POLYSELF X! && u.usym == S_HUMAN X #endif X ){ X You("vomit."); X--- 542,548 ---- X #endif X if(rn2(2) X #ifdef POLYSELF X! && !carnivorous(uasmon) X #endif X ){ X You("vomit."); X*************** X*** 568,573 **** X--- 569,589 ---- X "Yum! Your fave fruit!"); X else X #endif X+ #ifdef UNIX X+ if (otmp->otyp == APPLE || otmp->otyp == PEAR) { X+ if (!Hallucination) X+ pline("Core dumped."); X+ else { X+ /* This is based on an old Usenet joke, a fake a.out manual page */ X+ int x = rnd(100); X+ if (x <= 75) X+ pline("Segmentation fault -- core dumped."); X+ else if (x <= 99) X+ pline("Bus error -- core dumped."); X+ else pline("Yo' mama -- core dumped."); X+ } X+ } else X+ #endif X { X int oldquan = otmp->quan; X otmp->quan = 1; X*************** X*** 751,756 **** X--- 767,773 ---- X flags.botl = 1; X bot(); X You("die from starvation."); X+ killer = "starvation"; X done(STARVING); X } X } X*************** X*** 795,811 **** X struct obj * X floorfood(verb,corpseonly) X char *verb; X! int corpseonly; X { X register struct obj *otmp; X X /* Is there some food (probably a heavy corpse) here on the ground? */ X if(!Levitation && !u.uswallow) { X! if(levl[u.ux][u.uy].omask) X for(otmp = fobj; otmp; otmp = otmp->nobj) { X if(otmp->ox == u.ux && otmp->oy == u.uy && X! (otmp->otyp==CORPSE || X! (!corpseonly && otmp->olet == FOOD_SYM))) { X pline("There %s %s here; %s %s? ", X (otmp->quan == 1) ? "is" : "are", X doname(otmp), verb, X--- 812,827 ---- X struct obj * X floorfood(verb,corpseonly) X char *verb; X! boolean corpseonly; X { X register struct obj *otmp; X X /* Is there some food (probably a heavy corpse) here on the ground? */ X if(!Levitation && !u.uswallow) { 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! (corpseonly ? otmp->otyp==CORPSE : otmp->olet==FOOD_SYM)) { X pline("There %s %s here; %s %s? ", X (otmp->quan == 1) ? "is" : "are", X doname(otmp), verb, X*** src/Old/end.c Wed Sep 6 15:43:49 1989 X--- src/end.c Tue Sep 5 21:35:16 1989 X*************** X*** 336,342 **** X if(!done_stopprint) X Printf("Goodbye %s the %s...\n\n", buf2, X #ifdef ENDGAME X! how != ASCENDED ? pl_character : "Demigod"); X #else X pl_character); X #endif X--- 336,343 ---- X if(!done_stopprint) X Printf("Goodbye %s the %s...\n\n", buf2, X #ifdef ENDGAME X! how != ASCENDED ? pl_character : X! flags.female ? "Demigoddess" : "Demigod"); X #else X pl_character); X #endif X*************** X*** 354,360 **** X if(how == ASCENDED) u.urexp *= 2; X #endif X } X! if(how == ESCAPED) { X register struct monst *mtmp; X register struct obj *otmp; X long i; X--- 355,365 ---- X if(how == ASCENDED) u.urexp *= 2; X #endif X } X! if(how == ESCAPED X! #ifdef ENDGAME X! || how == ASCENDED X! #endif X! ) { X register struct monst *mtmp; X register struct obj *otmp; X long i; X*************** X*** 372,382 **** X--- 377,399 ---- X mtmp = mtmp->nmon; X } X if(!done_stopprint) X+ #ifdef ENDGAME X+ Printf("\n%s with %ld points,\n", X+ how==ASCENDED ? "went to your reward" X+ : "escaped from the dungeon", X+ #else X Printf("\nescaped from the dungeon with %ld points,\n", X+ #endif X u.urexp); X } else X if(!done_stopprint) X+ #ifdef ENDGAME X+ Printf("You %s with %ld points,\n", X+ how==ASCENDED ? "went to your reward" X+ : "escaped from the dungeon", X+ #else X Printf("You escaped from the dungeon with %ld points,\n", X+ #endif X u.urexp); X get_all_from_box(); /* don't forget things in boxes and bags */ X for(otmp = invent; otmp; otmp = otmp->nobj) { X*************** X*** 425,431 **** X Printf("You were level %u with a maximum of %d hit points when you %s.\n", X u.ulevel, u.uhpmax, ends[how]); X if(how == ESCAPED && !done_stopprint){ X! getret(); /* all those pieces of coloured glass ... */ X cls(); X } X #if (defined(WIZARD) || defined(EXPLORE_MODE)) && !defined(LOGFILE) X--- 442,448 ---- X Printf("You were level %u with a maximum of %d hit points when you %s.\n", X u.ulevel, u.uhpmax, ends[how]); X if(how == ESCAPED && !done_stopprint){ X! getret(); /* all those pieces of colored glass ... */ X cls(); X } X #if (defined(WIZARD) || defined(EXPLORE_MODE)) && !defined(LOGFILE) X*** src/Old/engrave.c Wed Sep 6 15:44:12 1989 X--- src/engrave.c Fri Sep 1 14:29:05 1989 X*************** X*** 4,11 **** X X #include "hack.h" X X- static void del_engr P((struct engr *)); X- X struct engr { X struct engr *nxt_engr; X char *engr_txt; X--- 4,9 ---- X*************** X*** 20,25 **** X--- 18,25 ---- X #define POLY 5 /* temporary type - for polymorphing engraving */ X } *head_engr; X X+ static void del_engr P((struct engr *)); X+ X /* random engravings */ X const char *random_engr[] = X {"Elbereth", "ad ae?ar um", X*************** X*** 443,449 **** X nomovemsg = "You finish writing."; X if(type != MARK) X nomovemsg = "You finish engraving."; X! if(otmp->olet != WAND_SYM) { X if(otmp->olet == WEAPON_SYM) X Your("%s dull.", X aobjnam(otmp, "get")); X--- 443,449 ---- X nomovemsg = "You finish writing."; X if(type != MARK) X nomovemsg = "You finish engraving."; X! if(otmp->olet != WAND_SYM && otmp->otyp != ATHAME) { X if(otmp->olet == WEAPON_SYM) X Your("%s dull.", X aobjnam(otmp, "get")); X*** src/Old/hack.c Wed Sep 6 15:45:35 1989 X--- src/hack.c Wed Sep 6 11:53:58 1989 X*************** X*** 78,84 **** X register struct obj *otmp; X register struct trap *ttmp; X register struct monst *mtmp; X- xchar oldrx, oldry; X X #ifdef POLYSELF X if (passes_walls(uasmon)) return 0; X--- 78,83 ---- X*************** X*** 150,161 **** X delobj(otmp); X continue; X } X! oldrx = otmp->ox; X! oldry = otmp->oy; X! otmp->ox = rx; X! otmp->oy = ry; X! set_omask(oldrx, oldry); X! levl[rx][ry].omask = 1; X /* pobj(otmp); */ X if(cansee(rx,ry)) atl(rx,ry,otmp->olet); X newsym(u.ux+u.dx, u.uy+u.dy); X--- 149,155 ---- X delobj(otmp); X continue; X } X! move_object(otmp, rx, ry); X /* pobj(otmp); */ X if(cansee(rx,ry)) atl(rx,ry,otmp->olet); X newsym(u.ux+u.dx, u.uy+u.dy); X*************** X*** 208,224 **** X register struct obj *obj; X register xchar ox, oy; X { X- register xchar ox2 = obj->ox, oy2= obj->oy; X- X /* Some dirty programming to get display right */ X freeobj(obj); X unpobj(obj); X obj->nobj = fobj; X fobj = obj; X! obj->ox = ox; X! obj->oy = oy; X! set_omask(ox2,oy2); X! levl[ox][oy].omask = 1; X } X X #ifdef SINKS X--- 202,213 ---- X register struct obj *obj; X register xchar ox, oy; X { X /* Some dirty programming to get display right */ X freeobj(obj); X unpobj(obj); X obj->nobj = fobj; X fobj = obj; X! move_object(obj, ox, oy); X } X X #ifdef SINKS X*************** X*** 234,240 **** X # endif X You("crash to the floor!"); X losehp((rn1(10, 20 - (int)ACURR(A_CON))),"fall onto a sink"); X! if(levl[u.ux][u.uy].omask) X for(obj=fobj; obj; obj=obj->nobj) X if(obj->ox == u.ux && obj->oy == u.uy && X obj->olet == WEAPON_SYM) { X--- 223,229 ---- 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*************** X*** 304,310 **** X domove() { X register struct monst *mtmp = (struct monst *)0; X register struct rm *tmpr,*ust; X! register xchar x,y,xx,yy; X struct trap *trap; X X u_wipe_engr(rnd(5)); X--- 293,299 ---- X domove() { X register struct monst *mtmp = (struct monst *)0; X register struct rm *tmpr,*ust; X! register xchar x,y; X struct trap *trap; X X u_wipe_engr(rnd(5)); X*************** X*** 315,326 **** X return; X } X if(u.uswallow) { X u.dx = u.dy = 0; X xx = u.ux; X yy = u.uy; X x = u.ux = u.ustuck->mx; X y = u.uy = u.ustuck->my; X! if(xx != u.ustuck->mx || yy != u.ustuck->my) newsym(xx,yy); X } else { X x = u.ux + u.dx; X y = u.uy + u.dy; X--- 304,318 ---- X return; X } X if(u.uswallow) { X+ register xchar xx,yy; X+ X u.dx = u.dy = 0; X xx = u.ux; X yy = u.uy; X x = u.ux = u.ustuck->mx; X y = u.uy = u.ustuck->my; X! if(xx != x || yy != y) newsym(xx,yy); X! mtmp = u.ustuck; X } else { X x = u.ux + u.dx; X y = u.uy + u.dy; X*************** X*** 369,399 **** X #endif X } X } X } X X u.ux0 = u.ux; X u.uy0 = u.uy; X- /* attack monster */ X tmpr = &levl[x][y]; X! if (tmpr->mmask) { X! mtmp = m_at(x,y); X! /* Don't attack if you're running */ X! if (flags.run && !mtmp->mimic && X! (Blind ? Telepat : (!mtmp->minvis || See_invisible))) { X! nomul(0); X! flags.move = 0; X! return; X! } X! } X! if(mtmp || u.uswallow) { X nomul(0); X gethungry(); X if(multi < 0) return; /* we just fainted */ X X /* try to attack; note that it might evade */ X! if(attack(u.uswallow ? u.ustuck : mtmp)) X! return; X } X /* not attacking an animal, so we try to move */ X #ifdef POLYSELF X if(!uasmon->mmove) { X--- 361,393 ---- 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+ (Blind ? Telepat : X+ (!mtmp->minvis || See_invisible))) { X+ nomul(0); X+ flags.move = 0; X+ return; X+ } X+ } X } X X u.ux0 = u.ux; X u.uy0 = u.uy; X tmpr = &levl[x][y]; X! X! /* attack monster */ X! if(mtmp) { X nomul(0); X gethungry(); X if(multi < 0) return; /* we just fainted */ X X /* try to attack; note that it might evade */ X! if(attack(mtmp)) return; X } X+ X /* not attacking an animal, so we try to move */ X #ifdef POLYSELF X if(!uasmon->mmove) { X*************** X*** 449,455 **** X #endif X ust = &levl[u.ux][u.uy]; X if(bad_rock(x,y) || X! (u.dx && u.dy && (IS_DOOR(tmpr->typ) || IS_DOOR(ust->typ)))){ X flags.move = 0; X nomul(0); X return; X--- 443,453 ---- X #endif X ust = &levl[u.ux][u.uy]; 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*************** X*** 492,500 **** X X movobj(uball, uchain->ox, uchain->oy); X unpobj(uball); /* BAH %% */ X! uchain->ox = u.ux; X! uchain->oy = u.uy; X! ust->omask = 1; X nomul(-2); X nomovemsg = ""; X nodrag: ; 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*************** X*** 571,577 **** X } X #ifdef POLYSELF X if (hides_under(uasmon)) X! u.uundetected = (levl[u.ux][u.uy].omask || 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--- 567,573 ---- X } 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*************** X*** 648,654 **** X dosinkfall(); X #endif X if(!flags.nopick && X! (levl[u.ux][u.uy].omask || levl[u.ux][u.uy].gmask)) X pickup(1); X else read_engr_at(u.ux,u.uy); X if(trap = t_at(u.ux,u.uy)) X--- 644,650 ---- X dosinkfall(); X #endif X if(!flags.nopick && X! (OBJ_AT(u.ux, u.uy) || levl[u.ux][u.uy].gmask)) X pickup(1); X else read_engr_at(u.ux,u.uy); X if(trap = t_at(u.ux,u.uy)) X*************** X*** 669,675 **** X Blind ? "feel" : "see"); X return(1); X } X! if(levl[u.ux][u.uy].omask == 0 && levl[u.ux][u.uy].gmask == 0) { X pline("There is nothing here to pick up."); X return(0); X } X--- 665,671 ---- X Blind ? "feel" : "see"); X return(1); X } X! if(!OBJ_AT(u.ux, u.uy) && levl[u.ux][u.uy].gmask == 0) { X pline("There is nothing here to pick up."); X return(0); X } X*************** X*** 696,702 **** 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 || Telepat) && !mtmp->mundetected) { X if((flags.run != 1 && !mtmp->mtame) || (x == u.ux+u.dx && y == u.uy+u.dy)) X goto stop; X } else mtmp = 0; X--- 692,698 ---- 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 } else mtmp = 0; X*************** X*** 800,806 **** X !mtmp->mtame && !mtmp->mpeaceful && X !noattacks(mtmp->data) && X !mtmp->mfroz && !mtmp->msleep && /* aplvax!jcn */ X! (!mtmp->minvis || See_invisible || Telepat) && X !onscary(u.ux, u.uy, mtmp)) X return(1); X } X--- 796,802 ---- X !mtmp->mtame && !mtmp->mpeaceful && X !noattacks(mtmp->data) && X !mtmp->mfroz && !mtmp->msleep && /* aplvax!jcn */ X! (!mtmp->minvis || See_invisible) && X !onscary(u.ux, u.uy, mtmp)) X return(1); X } X*** src/Old/invent.c Wed Sep 6 15:46:23 1989 X--- src/invent.c Tue Sep 5 21:34:56 1989 X*************** X*** 201,226 **** X { X register struct obj *otmp; X register int found = 0; X- register struct rm *lev = &levl[obj->ox][obj->oy]; X X- lev->omask = 0; X- X if(obj == fobj) { X fobj = fobj->nobj; X found = 1; X } X! for(otmp = fobj; otmp; otmp = otmp->nobj) { X if (otmp->nobj == obj) { X otmp->nobj = obj->nobj; X found = 1; X } X- if (otmp->ox == obj->ox && otmp->oy == obj->oy) { X- lev->omask = 1; X- } X- } X if (!found) panic("error in freeobj"); X #ifdef POLYSELF X! if (!levl[u.ux][u.uy].omask && !levl[u.ux][u.uy].gmask) { X u.uundetected = 0; X if (!Invisible) pru(); X } X--- 201,220 ---- X { X register struct obj *otmp; X register int found = 0; X X if(obj == fobj) { X fobj = fobj->nobj; X found = 1; X } X! for(otmp = fobj; otmp; otmp = otmp->nobj) X if (otmp->nobj == obj) { X otmp->nobj = obj->nobj; X found = 1; X } X if (!found) panic("error in freeobj"); X+ remove_object(obj); X #ifdef POLYSELF X! if (!OBJ_AT(u.ux, u.uy) && !levl[u.ux][u.uy].gmask) { X u.uundetected = 0; X if (!Invisible) pru(); X } X*************** X*** 244,250 **** X } X free((genericptr_t) gold); X #ifdef POLYSELF X! if (!levl[u.ux][u.uy].omask && !levl[u.ux][u.uy].gmask) { X u.uundetected = 0; X if (!Invisible) pru(); X } X--- 238,244 ---- X } X free((genericptr_t) gold); X #ifdef POLYSELF X! if (!OBJ_AT(u.ux, u.uy) && !levl[u.ux][u.uy].gmask) { X u.uundetected = 0; X if (!Invisible) pru(); X } X*************** X*** 294,300 **** X { X register struct obj *otmp; X X! if(levl[x][y].omask) X for(otmp = fobj; otmp; otmp = otmp->nobj) X if(otmp->ox == x && otmp->oy == y && otmp->otyp == n) X return(otmp); X--- 288,294 ---- X { 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*************** X*** 895,901 **** X char stuff[BUFSZ]; X register int stct; X register struct obj *otmp; X! boolean billx = inshop() && doinvbill(0); X boolean unpd = FALSE; X X if (!invent && !u.ugold && !billx) { X--- 889,895 ---- X char stuff[BUFSZ]; X register int stct; X register struct obj *otmp; X! boolean billx = in_shop(u.ux, u.uy) && doinvbill(0); X boolean unpd = FALSE; X X if (!invent && !u.ugold && !billx) { X*************** X*** 1139,1145 **** X return( (obj->corpsenm == otmp->corpsenm) && X (!ONAME(obj) || !strcmp(ONAME(obj), ONAME(otmp))) ); X X! else if(obj->known == otmp->known) { X return(objects[obj->otyp].oc_merge); X } else return(FALSE); X } X--- 1133,1139 ---- 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*** src/Old/ioctl.c Wed Sep 6 15:47:11 1989 X--- src/ioctl.c Fri Aug 25 16:02:36 1989 X*************** X*** 16,21 **** X--- 16,24 ---- X #else X #include <termio.h> /* also includes part of <sgtty.h> */ X struct termio termio; X+ #ifdef AMIX X+ #include <sys/ioctl.h> X+ #endif /* AMIX */ X #endif X X void X*************** X*** 26,32 **** X #else X (void) ioctl(fileno(stdin), (int) TCGETA, &termio); X #endif X! #ifdef TIOCGWINSZ X { X /* X * ttysize is found on Suns and BSD X--- 29,35 ---- X #else X (void) ioctl(fileno(stdin), (int) TCGETA, &termio); X #endif X! #if defined(TIOCGWINSZ) && (defined(BSD) || defined(ULTRIX)) X { X /* X * ttysize is found on Suns and BSD X*************** X*** 34,48 **** X */ X struct winsize ttsz; X X! (void) ioctl(fileno(stdin), (int) TIOCGWINSZ, (char *) &ttsz); X! /* X! * Use the kernel's values for lines and columns if it has X! * any idea. X! */ X! if (ttsz.ws_row) X! LI = ttsz.ws_row; X! if (ttsz.ws_col) X! CO = ttsz.ws_col; X } X #endif X } X--- 37,53 ---- X */ X struct winsize ttsz; X X! if (ioctl(fileno(stdin), (int)TIOCGWINSZ, (char *)&ttsz) != -1) X! { X! /* X! * Use the kernel's values for lines and columns if it has X! * any idea. X! */ X! if (ttsz.ws_row) X! LI = ttsz.ws_row; X! if (ttsz.ws_col) X! CO = ttsz.ws_col; X! } X } X #endif X } X*** src/Old/lev_comp.l Wed Sep 6 15:48:33 1989 X--- src/lev_comp.l Mon Sep 4 23:41:56 1989 X*************** X*** 3,12 **** X--- 3,18 ---- 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 X+ #ifdef MSDOS X+ #undef exit X+ #endif X+ X int line_number = 1; X X /* This is *** UGLY *** but I can't think a better way to do it X*************** X*** 23,31 **** X MAZE return MAZE_ID; X LEVEL return LEVEL_ID; X GEOMETRY return GEOMETRY_ID; X! ^MAP$ { BEGIN MAPC; } X <MAPC>[-|}{+SK\\#. ]*\n { line_number++; yymore(); } X! <MAPC>ENDMAP$ { BEGIN 0; X yytext[yyleng-7] = 0; /* Discard \nENDMAP */ X yylval.map = (char *) alloc(strlen(yytext)+1); X strcpy(yylval.map, yytext+1); X--- 29,37 ---- 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*** src/Old/lev_comp.y Wed Sep 6 15:48:48 1989 X--- src/lev_comp.y Sat Sep 2 15:05:38 1989 X*************** X*** 53,59 **** X "trapdoor", TRAPDOOR, X "teleport", TELEP_TRAP, X "pit", PIT, X! "sleeping gas", SLP_GAS_TRAP, X "magic", MGTRP, X "board", SQBRD, X "web", WEB, X--- 53,59 ---- X "trapdoor", TRAPDOOR, X "teleport", TELEP_TRAP, X "pit", PIT, X! "sleep gas", SLP_GAS_TRAP, X "magic", MGTRP, X "board", SQBRD, X "web", WEB, X*** src/Old/lock.c Wed Sep 6 15:50:04 1989 X--- src/lock.c Tue Aug 29 18:11:47 1989 X*************** X*** 130,138 **** X otmp->nobj = xlock.box->nobj; X xlock.box->nobj = otmp; X otmp->cobj = (struct obj *)0; X! otmp->ox = u.ux; X! otmp->oy = u.uy; X! levl[u.ux][u.uy].omask = 1; X stackobj(otmp); X } X } else probj = otmp; X--- 130,136 ---- X otmp->nobj = xlock.box->nobj; X xlock.box->nobj = otmp; X otmp->cobj = (struct obj *)0; X! place_object(otmp, u.ux, u.uy); X stackobj(otmp); X } X } else probj = otmp; X*************** X*** 184,190 **** 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(levl[x][y].omask) X for(otmp = fobj; otmp; otmp = otmp->nobj) X if((otmp->ox == x) && (otmp->oy == y)) X if(Is_box(otmp) && X--- 182,188 ---- 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*************** X*** 331,337 **** X X /* A lock is made only for the honest man, the thief will break it. */ X xlock.box = (struct obj *)0; X! if(levl[u.ux][u.uy].omask) X for(otmp = fobj; otmp; otmp = otmp->nobj) X if((otmp->ox == u.ux) && (otmp->oy == u.uy)) X if(Is_box(otmp)) { X--- 329,335 ---- 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*************** X*** 438,444 **** X "Some creature" : Monnam(m_at(x,y))); X return(TRUE); X } X! if (levl[x][y].omask || levl[x][y].gmask) { X obj: X pline("Something's in the way."); X return(TRUE); X--- 436,442 ---- X "Some creature" : Monnam(m_at(x,y))); X return(TRUE); X } X! if (OBJ_AT(x, y) || levl[x][y].gmask) { X obj: X pline("Something's in the way."); X return(TRUE); X*************** X*** 555,563 **** X register struct rm *door = &levl[x][y]; X boolean res = 1; X X- if(obstructed(x,y)) X- return 0; X- X if(door->typ == SDOOR) { X if(otmp->otyp == WAN_OPENING X #ifdef SPELLS X--- 553,558 ---- X*************** X*** 595,600 **** X--- 590,596 ---- X #ifdef SPELLS X case SPE_WIZARD_LOCK: X #endif X+ if(obstructed(x,y)) return 0; X if (cansee(x,y)) X switch (door->doormask & ~D_TRAPPED) { X case D_CLOSED: X*** src/Old/mail.c Wed Sep 6 16:29:55 1989 X--- src/mail.c Tue Sep 5 21:34:20 1989 X*************** X*** 53,59 **** X X # ifdef UNIX X static struct stat omstat,nmstat; X! static char *mailbox; X static long laststattime; X X # ifdef BSD X--- 53,59 ---- X X # ifdef UNIX X static struct stat omstat,nmstat; X! static char *mailbox = NULL; X static long laststattime; X X # ifdef BSD X*************** X*** 65,71 **** X X void X getmailstatus() { X! if(!(mailbox = getenv("MAIL"))) { X # ifdef MAILPATH X mailbox = (char *) alloc(sizeof(MAILPATH)+8); X Strcpy(mailbox, MAILPATH); X--- 65,71 ---- X X void X getmailstatus() { X! if(!mailbox && !(mailbox = getenv("MAIL"))) { X # ifdef MAILPATH X mailbox = (char *) alloc(sizeof(MAILPATH)+8); X Strcpy(mailbox, MAILPATH); X*************** X*** 180,186 **** X makeknown(SCR_MAIL); X stackobj(fobj); X verbalize("Oops!"); X- more(); X } else { X /* set known and do prinv() */ X (void) identify(addinv(mksobj(SCR_MAIL,FALSE))); X--- 180,185 ---- X*** src/Old/makedefs.c Wed Sep 6 16:30:13 1989 X--- src/makedefs.c Fri Sep 1 14:25:57 1989 X*************** X*** 63,69 **** X char in_line[256]; X extern char *gets P((char *)); X void do_objs(), do_traps(), do_data(), do_date(), do_permonst(), do_rumors(); X! char *limit P((char *,boolean)); X FILE *_freopen(); X X int X--- 63,69 ---- X char in_line[256]; X extern char *gets P((char *)); X void do_objs(), do_traps(), do_data(), do_date(), do_permonst(), do_rumors(); X! char *limit P((char *,BOOLEAN_P)); X FILE *_freopen(); X X int X*** src/Old/makemon.c Wed Sep 6 16:30:35 1989 X--- src/makemon.c Thu Aug 31 19:09:29 1989 X*************** X*** 542,548 **** X (ptr == &mons[PM_GIANT_EEL])) && rn2(5)) X mtmp->msleep = 1; X } else { X! if(x == u.ux && y == u.uy && ptr->mlet != S_GHOST) { X mnexto(mtmp); X if (ptr->mlet == S_MIMIC) { X set_mimic_sym(mtmp); X--- 542,548 ---- X (ptr == &mons[PM_GIANT_EEL])) && rn2(5)) X mtmp->msleep = 1; X } else { X! if(x == u.ux && y == u.uy) { X mnexto(mtmp); X if (ptr->mlet == S_MIMIC) { X set_mimic_sym(mtmp); X*************** X*** 1079,1085 **** X roomno = inroom(mtmp->mx, mtmp->my); X if (levl[mtmp->mx][mtmp->my].gmask) X sym = GOLD_SYM; X! else if (levl[mtmp->mx][mtmp->my].omask) 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--- 1079,1085 ---- X roomno = inroom(mtmp->mx, mtmp->my); 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*** src/Old/mcastu.c Wed Sep 6 16:31:19 1989 X--- src/mcastu.c Thu Aug 17 23:20:50 1989 X*************** X*** 166,172 **** X case 5: /* make invisible if not */ X case 4: X if(!mtmp->minvis) { X! if(canseemon(mtmp) && !See_invisible && !Telepat) X pline("%s suddenly disappears!", X Monnam(mtmp)); X mtmp->minvis = 1; X--- 166,172 ---- X case 5: /* make invisible if not */ X case 4: X if(!mtmp->minvis) { X! if(canseemon(mtmp) && !See_invisible) X pline("%s suddenly disappears!", X Monnam(mtmp)); X mtmp->minvis = 1; X*** src/Old/mhitm.c Wed Sep 6 16:31:36 1989 X--- src/mhitm.c Thu Aug 31 15:17:32 1989 X*************** X*** 15,21 **** X static int hitmm P((struct monst *,struct monst *,struct attack *)); X static int gazemm P((struct monst *,struct monst *,struct attack *)); X static int gulpmm P((struct monst *,struct monst *,struct attack *)); X! static int explmm P((struct monst *,struct attack *)); X static int mdamagem P((struct monst *,struct monst *,struct attack *)); X static void mswingsm P((struct monst *, struct monst *, struct obj *)); X X--- 15,21 ---- X static int hitmm P((struct monst *,struct monst *,struct attack *)); X static int gazemm P((struct monst *,struct monst *,struct attack *)); X static int gulpmm P((struct monst *,struct monst *,struct attack *)); X! static int explmm P((struct monst *,struct monst *,struct attack *)); X static int mdamagem P((struct monst *,struct monst *,struct attack *)); X static void mswingsm P((struct monst *, struct monst *, struct obj *)); X X*************** X*** 153,159 **** X X case AT_EXPL: /* automatic hit if next to */ X strike = -1; X! sum[i] = explmm(magr, mattk); X break; X X case AT_ENGL: X--- 153,159 ---- X X case AT_EXPL: /* automatic hit if next to */ X strike = -1; X! sum[i] = explmm(magr, mdef, mattk); X break; X X case AT_ENGL: X*************** X*** 284,308 **** X } X X static int X! explmm(magr, mattk) X! register struct monst *magr; X register struct attack *mattk; X { X- register struct monst *mon; X X if(cansee(magr->mx, magr->my)) X pline("%s explodes!", Monnam(magr)); X else noises(magr, mattk); X X! for(mon = fmon; mon; mon = mon->nmon) X! if(mon != magr) { X! if(dist2(mon->mx, mon->my, magr->mx, magr->my) < 3) X! (void) mdamagem(magr, mon, mattk); X! } X! X! if(dist2(magr->mx, magr->my, u.ux, u.uy) < 3) X! (void) mdamageu(magr, d((int)mattk->damn, (int)mattk->damd)); X X mondead(magr); X return(2); X } X--- 284,302 ---- X } X X static int X! explmm(magr, mdef, mattk) X! register struct monst *magr, *mdef; X register struct attack *mattk; X { X X if(cansee(magr->mx, magr->my)) X pline("%s explodes!", Monnam(magr)); X else noises(magr, mattk); X X! (void) mdamagem(magr, mdef, mattk); X X+ if(magr->mtame) X+ You("have a sad feeling for a moment, then it passes."); X mondead(magr); X return(2); X } X*************** X*** 325,330 **** X--- 319,328 ---- X if (magr->mcan) break; X if(vis) pline("%s staggers for a moment.", Monnam(mdef)); X mdef->mstun = 1; X+ /* fall through */ X+ case AD_WERE: X+ case AD_HEAL: X+ case AD_LEGS: X case AD_PHYS: X if (mattk->aatyp == AT_KICK && thick_skinned(mdef->data)) X tmp = 0; X*************** X*** 657,665 **** X Strcpy(buf, mon_nam(mdef)); X if (!flags.verbose || Blind || otemp->olet != WEAPON_SYM) return; X pline("%s %s %s %s at %s.", Monnam(magr), X! (otemp->otyp == SPEAR || X! otemp->otyp == LANCE || X! otemp->otyp == GLAIVE || X otemp->otyp == TRIDENT) ? "thrusts" : "swings", X is_female(magr) ? "her" : X is_human(magr->data) ? "his" : "its", X--- 655,664 ---- X Strcpy(buf, mon_nam(mdef)); X if (!flags.verbose || Blind || otemp->olet != WEAPON_SYM) return; X pline("%s %s %s %s at %s.", Monnam(magr), X! ((otemp->otyp >= SPEAR && X! otemp->otyp <= LANCE) || X! (otemp->otyp >= PARTISAN && X! otemp->otyp <= SPETUM) || X otemp->otyp == TRIDENT) ? "thrusts" : "swings", X is_female(magr) ? "her" : X is_human(magr->data) ? "his" : "its", X*** src/Old/mhitu.c Wed Sep 6 16:32:08 1989 X--- src/mhitu.c Sat Sep 2 15:05:22 1989 X*************** X*** 84,92 **** X { X if (!flags.verbose || Blind || otemp->olet != WEAPON_SYM) return; X pline("%s %s %s %s.", Monnam(mtmp), X! (otemp->otyp == SPEAR || X! otemp->otyp == LANCE || X! otemp->otyp == GLAIVE || X otemp->otyp == TRIDENT) ? "thrusts" : "swings", X is_female(mtmp) ? "her" : X is_human(mtmp->data) ? "his" : "its", X--- 84,93 ---- X { X if (!flags.verbose || Blind || otemp->olet != WEAPON_SYM) return; X pline("%s %s %s %s.", Monnam(mtmp), X! ((otemp->otyp >= SPEAR && X! otemp->otyp <= LANCE) || X! (otemp->otyp >= PARTISAN && X! otemp->otyp <= SPETUM) || X otemp->otyp == TRIDENT) ? "thrusts" : "swings", X is_female(mtmp) ? "her" : X is_human(mtmp->data) ? "his" : "its", X*************** X*** 145,161 **** X Monnam(mtmp)); X } X X! static void X regurgitates(mtmp) X register struct monst *mtmp; X { X! u.ux = mtmp->mx; X! u.uy = mtmp->my; X! u.uswallow = 0; X! u.ustuck = 0; X mnexto(mtmp); X! setsee(); X! docrt(); X spoteffects(); X /* to cover for a case where mtmp is not in a next square */ X if(um_dist(mtmp->mx,mtmp->my,1)) X--- 146,158 ---- X Monnam(mtmp)); X } X X! void X regurgitates(mtmp) X register struct monst *mtmp; X { X! unstuck(mtmp); X mnexto(mtmp); X! pru(); X spoteffects(); X /* to cover for a case where mtmp is not in a next square */ X if(um_dist(mtmp->mx,mtmp->my,1)) X*************** X*** 246,252 **** 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! levl[u.ux][u.uy].omask ? doname(o_at(u.ux,u.uy)) : X "some gold"); X prme(); X } X--- 243,249 ---- 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*************** X*** 467,473 **** X if(!(Blind ? Telepat : (HTelepat & WORN_HELMET))) { X register struct obj *obj; X X! if(levl[mtmp->mx][mtmp->my].omask == 1) { X if(obj = o_at(mtmp->mx,mtmp->my)) X pline("%s was hidden under %s!", X Xmonnam(mtmp), doname(obj)); X--- 464,470 ---- X if(!(Blind ? Telepat : (HTelepat & WORN_HELMET))) { 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*************** X*** 816,822 **** X * is, no matter what covers it. X */ X getbronze = (mdat == &mons[PM_BLACK_PUDDING] && X! uarm && uarm->otyp == BRONZE_PLATE_MAIL); X while (1) { X switch(rn2(5)) { X case 0: X--- 813,819 ---- X * is, no matter what covers it. X */ X getbronze = (mdat == &mons[PM_BLACK_PUDDING] && X! uarm && is_corrodeable(uarm)); X while (1) { X switch(rn2(5)) { X case 0: X*************** X*** 1520,1526 **** X #endif X break; X case 4: You("feel exhausted."); X! losehp(5+rnd(10), "bout of exhaustion"); X break; X } X } else { X--- 1517,1523 ---- X #endif X break; X case 4: You("feel exhausted."); X! losehp(5+rnd(10), "exhaustion"); X break; X } X } else { X END_OF_FILE if test 56862 -ne `wc -c <'patch03c'`; then echo shar: \"'patch03c'\" unpacked with wrong size! fi # end of 'patch03c' fi echo shar: End of archive 3 \(of 6\). cp /dev/null ark3isdone MISSING="" for I in 1 2 3 4 5 6 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 6 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0