billr@saab.CNA.TEK.COM (Bill Randle) (02/24/90)
Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu> Posting-number: Volume 9, Issue 18 Archive-name: NetHack3/Patch7r 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 18 (of 30)." # Contents: patch7.12 # Wrapped by billr@saab on Thu Feb 22 16:18:37 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'patch7.12' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patch7.12'\" else echo shar: Extracting \"'patch7.12'\" \(53746 characters\) sed "s/^X//" >'patch7.12' <<'END_OF_FILE' X*** src/Old/mondata.c Mon Feb 19 20:32:59 1990 X--- src/mondata.c Thu Jan 25 22:13:40 1990 X*************** X*** 1,4 **** X! /* SCCS Id: @(#)mondata.c 3.0 89/11/19 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: @(#)mondata.c 3.0 89/11/21 X /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X /* NetHack may be freely redistributed. See license for details. */ X X*************** X*** 8,13 **** X--- 8,15 ---- X X /* These routines provide basic data for any type of monster. */ X X+ #ifdef OVL0 X+ X boolean X attacktype(ptr, atyp) X register struct permonst *ptr; X*************** X*** 21,32 **** X return(FALSE); X } X X boolean X resists_ston(ptr) /* returns TRUE if monster is petrify resistant */ X register struct permonst *ptr; X { X! return (ptr->mflags1 & M1_STON_RES || dmgtype(ptr, AD_STON) || X! dmgtype(ptr, AD_ACID)); X } X X boolean X--- 23,36 ---- X return(FALSE); X } X X+ #endif /* OVL0 */ X+ #ifdef OVLB X+ X boolean X resists_ston(ptr) /* returns TRUE if monster is petrify resistant */ X register struct permonst *ptr; X { X! return (ptr->mflags1 & (M1_STON_RES | M1_ACID) || dmgtype(ptr, AD_STON)); X } X X boolean X*************** X*** 37,42 **** X--- 41,49 ---- X return(is_undead(ptr) || is_demon(ptr) || is_were(ptr)); X } X X+ #endif /* OVLB */ X+ #ifdef OVL0 X+ X boolean X ranged_attk(ptr) /* returns TRUE if monster can attack at range */ X register struct permonst *ptr; X*************** X*** 46,51 **** X--- 53,61 ---- X attacktype(ptr, AT_MAGC)); X } X X+ #endif /* OVL0 */ X+ #ifdef OVL1 X+ X boolean X can_track(ptr) /* returns TRUE if monster can track well */ X register struct permonst *ptr; X*************** X*** 56,61 **** X--- 66,74 ---- X return(haseyes(ptr)); X } X X+ #endif /* OVL1 */ X+ #ifdef OVLB X+ X #ifdef POLYSELF X boolean X breakarm(ptr) /* creature will break out of armor */ X*************** X*** 82,87 **** X--- 95,103 ---- X } X #endif X X+ #endif /* OVLB */ X+ #ifdef OVL1 X+ X boolean X sticks(ptr) /* creature sticks other creatures it hits */ X register struct permonst *ptr; X*************** X*** 121,132 **** X monsndx(ptr) /* return an index into the mons array */ X struct permonst *ptr; X { X register int i; X X if(ptr == &playermon) return(-1); X! X i = (int)(ptr - &mons[0]); X! X if(i < 0 || i >= NUMMONS) { X panic("monsndx - could not index monster (%x)", ptr); X return FALSE; /* will not get here */ X--- 137,156 ---- X monsndx(ptr) /* return an index into the mons array */ X struct permonst *ptr; X { X+ #ifdef LATTICE_504_BUG X+ register int d; X+ /* no problem - see, pspace IS bounded (and fits in 32 bits!) KL */ X+ const int pspace= sizeof(struct permonst[NUMMONS])/NUMMONS; X+ #endif X register int i; X X if(ptr == &playermon) return(-1); X! #ifndef LATTICE_504_BUG X i = (int)(ptr - &mons[0]); X! #else X! d=(int)((int)ptr-(int)&mons[0]); X! i= d/pspace; X! #endif X if(i < 0 || i >= NUMMONS) { X panic("monsndx - could not index monster (%x)", ptr); X return FALSE; /* will not get here */ X*************** X*** 175,186 **** X if (!strncmp(str, "cavewomen", 9)) return PM_CAVEWOMAN; X if (!strncmp(str, "zruties", 7)) return PM_ZRUTY; X if (!strncmp(str, "djinn", 5)) return PM_DJINNI; X- /* be careful with "ies"; "priest", "zombies" */ X for(s=str; *s; s++) { X if (!strncmp(s, "vortices", 8)) { X Strcpy(s+4, "ex"); X break; X } X if (!strncmp(s, "jellies", 7) || !strncmp(s, "mummies", 7)) { X Strcpy(s+4, "y"); X break; X--- 199,210 ---- X if (!strncmp(str, "cavewomen", 9)) return PM_CAVEWOMAN; X if (!strncmp(str, "zruties", 7)) return PM_ZRUTY; X if (!strncmp(str, "djinn", 5)) return PM_DJINNI; X for(s=str; *s; s++) { X if (!strncmp(s, "vortices", 8)) { X Strcpy(s+4, "ex"); X break; X } X+ /* be careful with "ies"; "priest", "zombies" */ X if (!strncmp(s, "jellies", 7) || !strncmp(s, "mummies", 7)) { X Strcpy(s+4, "y"); X break; X*************** X*** 203,208 **** X--- 227,235 ---- X return mntmp; X } X X+ #endif /* OVL1 */ X+ #ifdef OVLB X+ X #ifdef POLYSELF X boolean X webmaker(ptr) /* creature can spin a web */ X*************** X*** 220,228 **** X #if defined(ALTARS) && defined(THEOLOGY) X if (mtmp->ispriest) return !EPRI(mtmp)->ismale; X #endif X! return !!(mtmp->data->mflags1 & M1_FEM); X } X X /* Gender function. Differs from is_female() in that 1) It allows the monster X * type of a polymorphed shopkeeper to override ESHK(mtmp)->ismale, and 2) X * it returns 3 values (0=male, 1=female, 2=none) instead of 2. X--- 247,258 ---- X #if defined(ALTARS) && defined(THEOLOGY) X if (mtmp->ispriest) return !EPRI(mtmp)->ismale; X #endif X! return !!(mtmp->data->mflags2 & M2_FEM); X } X X+ #endif /* OVLB */ X+ #ifdef OVL2 X+ X /* Gender function. Differs from is_female() in that 1) It allows the monster X * type of a polymorphed shopkeeper to override ESHK(mtmp)->ismale, and 2) X * it returns 3 values (0=male, 1=female, 2=none) instead of 2. X*************** X*** 232,238 **** X register struct monst *mtmp; X { X if (!humanoid(mtmp->data)) return 2; X! if (mtmp->data->mflags1 & M1_FEM) return 1; X if (mtmp->data == &mons[PM_CAVEMAN] X || mtmp->data == &mons[PM_PRIEST] X #ifdef INFERNO X--- 262,268 ---- X register struct monst *mtmp; X { X if (!humanoid(mtmp->data)) return 2; X! if (mtmp->data->mflags2 & M2_FEM) return 1; X if (mtmp->data == &mons[PM_CAVEMAN] X || mtmp->data == &mons[PM_PRIEST] X #ifdef INFERNO X*************** X*** 246,256 **** X return 0; X } X X boolean X levl_follower(mtmp) X register struct monst *mtmp; X { X! return (mtmp->mtame || (mtmp->data->mflags1 & M1_STALK) || is_fshk(mtmp) X || (mtmp->iswiz && !mon_has_amulet(mtmp))); X } X X--- 276,289 ---- X return 0; X } X X+ #endif /* OVL2 */ X+ #ifdef OVLB X+ X boolean X levl_follower(mtmp) X register struct monst *mtmp; X { X! return (mtmp->mtame || (mtmp->data->mflags2 & M2_STALK) || is_fshk(mtmp) X || (mtmp->iswiz && !mon_has_amulet(mtmp))); X } X X*************** X*** 280,285 **** X--- 313,326 ---- X const int grownups[][2] = { {PM_LITTLE_DOG, PM_DOG}, {PM_DOG, PM_LARGE_DOG}, X {PM_HELL_HOUND_PUP, PM_HELL_HOUND}, {PM_KITTEN, PM_HOUSECAT}, X {PM_HOUSECAT, PM_LARGE_CAT}, {PM_BABY_GRAY_DRAGON, PM_GRAY_DRAGON}, X+ {PM_KOBOLD, PM_LARGE_KOBOLD}, {PM_LARGE_KOBOLD, PM_KOBOLD_LORD}, X+ {PM_GNOME, PM_GNOME_LORD}, {PM_GNOME_LORD, PM_GNOME_KING}, X+ {PM_DWARF, PM_DWARF_LORD}, {PM_DWARF_LORD, PM_DWARF_KING}, X+ {PM_SMALL_MIMIC, PM_LARGE_MIMIC}, {PM_LARGE_MIMIC, PM_GIANT_MIMIC}, X+ {PM_BAT, PM_GIANT_BAT}, X+ {PM_LICH, PM_DEMILICH}, {PM_DEMILICH, PM_MASTER_LICH}, X+ {PM_OGRE, PM_OGRE_LORD}, {PM_OGRE_LORD, PM_OGRE_KING}, X+ {PM_VAMPIRE, PM_VAMPIRE_LORD}, X {PM_BABY_RED_DRAGON, PM_RED_DRAGON}, X {PM_BABY_WHITE_DRAGON, PM_WHITE_DRAGON}, X {PM_BABY_BLUE_DRAGON, PM_BLUE_DRAGON}, X*************** X*** 300,305 **** X--- 341,347 ---- X {PM_SERGEANT, PM_LIEUTENANT}, X {PM_LIEUTENANT, PM_CAPTAIN}, X #endif X+ {PM_BABY_CROCODILE, PM_CROCODILE}, X {-1,-1} X }; X X*************** X*** 324,329 **** X--- 366,387 ---- X } X X X+ const char * X+ locomotion(ptr, def) X+ const struct permonst *ptr; X+ const char *def; X+ { X+ return ( X+ is_floater(ptr) ? "float" : X+ is_flyer(ptr) ? "fly" : X+ slithy(ptr) ? "slither" : X+ amorphous(ptr) ? "ooze" : X+ nolimbs(ptr) ? "crawl" : X+ def X+ ); X+ X+ } X+ X #ifdef STUPID_CPP /* otherwise these functions are macros in mondata.h */ X X int X*************** X*** 362,387 **** X } X X int X! is_animal(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_ANIMAL) != 0L); X } X X int X! humanoid(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_HUMANOID) != 0L); X } X X int X! is_undead(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_UNDEAD) != 0L); X } X X int X! is_were(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_WERE) != 0L); X } X X! int haseyes(ptr) struct permonst *ptr; { X return((ptr->mflags1 & M1_NOEYES) == 0L); X } X X--- 420,451 ---- X } X X int X! amorphous(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_AMORPHOUS) != 0L); X } X X int X! tunnels(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_TUNNEL) != 0L); X } X X int X! needspick(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_NEEDPICK) != 0L); X } X X int X! hides_under(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_CONCEAL) != 0L); X } X X! int X! is_hider(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_HIDE) != 0L); X! } X! X! int X! haseyes(ptr) struct permonst *ptr; { X return((ptr->mflags1 & M1_NOEYES) == 0L); X } X X*************** X*** 391,408 **** X } X X int X! lays_eggs(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_EGGS) != 0L); X } X X int X! poisonous(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_POIS) != 0L); X } X X int X! resists_poison(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & (M1_POIS | M1_POIS_RES)) != 0L); X } X X int X--- 455,495 ---- X } X X int X! nolimbs(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_NOLIMBS) == M1_NOLIMBS); X } X X+ # ifdef POLYSELF X int X! polyok(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_NOPOLY) == 0L); X } X+ # endif X X int X! is_whirly(ptr) struct permonst *ptr; { X! return((ptr->mlet == S_VORTEX) || X! (ptr == &mons[PM_AIR_ELEMENTAL])); X! } X! X! int X! humanoid(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_HUMANOID) != 0L); X! } X! X! int X! is_animal(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_ANIMAL) != 0L); X! } X! X! int X! slithy(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_SLITHY) != 0L); X! } X! X! int X! thick_skinned(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_THICK_HIDE) != 0L); X } X X int X*************** X*** 411,423 **** X } X X int X resists_cold(ptr) struct permonst *ptr; { X return((ptr->mflags1 & M1_COLD_RES) != 0L); X } X X int X! resists_acid(ptr) struct permonst *ptr; { X! return(dmgtype(ptr, AD_ACID)); X } X X int X--- 498,516 ---- X } X X int X+ resists_sleep(ptr) struct permonst *ptr; { X+ return((ptr->mflags1 & M1_SLEE_RES) != 0L || is_undead(ptr)); X+ } X+ X+ int X resists_cold(ptr) struct permonst *ptr; { X return((ptr->mflags1 & M1_COLD_RES) != 0L); X } X X int X! resists_disint(ptr) struct permonst *ptr; { X! return(ptr == &mons[PM_BLACK_DRAGON] || X! ptr == &mons[PM_BABY_BLACK_DRAGON]); X } X X int X*************** X*** 426,439 **** X } X X int X! resists_sleep(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & (M1_SLEE_RES | M1_UNDEAD)) != 0L); X } X X int X! resists_disint(ptr) struct permonst *ptr; { X! return(ptr == &mons[PM_BLACK_DRAGON] || X! ptr == &mons[PM_BABY_BLACK_DRAGON]); X } X X int X--- 519,541 ---- X } X X int X! resists_acid(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_ACID) != 0L); X } X X int X! acidic(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_ACID) != 0L); X! } X! X! int X! resists_poison(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & (M1_POIS | M1_POIS_RES)) != 0L); X! } X! X! int X! poisonous(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_POIS) != 0L); X } X X int X*************** X*** 482,511 **** X } X X int X! hides_under(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_CONCEAL) != 0L); X! } X! X! int X! is_hider(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_HIDE) != 0L); X! } X! X! # ifdef POLYSELF X! int X! polyok(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_NOPOLY) == 0L); X! } X! # endif /* POLYSELF */ X! X! int X! tunnels(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_TUNNEL) != 0L); X } X X int X! needspick(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_NEEDPICK) != 0L); X } X X int X--- 584,596 ---- X } X X int X! is_undead(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_UNDEAD) != 0L); X } X X int X! is_were(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_WERE) != 0L); X } X X int X*************** X*** 531,536 **** X--- 616,627 ---- X # endif /* GOLEMS */ X X int X+ is_domestic(ptr) struct permonst *ptr; { X+ return((ptr->mflags2 & M2_DOMESTIC) != 0L); X+ } X+ X+ X+ int X is_orc(ptr) struct permonst *ptr; { X return((ptr->mflags2 & M2_ORC) != 0L); X } X*************** X*** 551,663 **** X } X X int X- throws_rocks(ptr) struct permonst *ptr; { X- return((ptr->mflags2 & M2_ROCKTHROW) != 0L); X- } X- X- int X is_wanderer(ptr) struct permonst *ptr; { X return((ptr->mflags2 & M2_WANDER) != 0L); X } X X int X! is_lord(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_LORD) != 0L); X } X X int X! is_prince(ptr) struct permonst *ptr; { X! return((ptr->mflags1 & M1_PRINCE) != 0L); X } X X- # ifdef INFERNO X int X! is_ndemon(ptr) struct permonst *ptr; { X! return(is_demon(ptr) && X! (ptr->mflags1 & (M1_LORD | M1_PRINCE)) == 0L); X } X! # else X int X! is_ndemon(ptr) struct permonst *ptr; { X! return(ptr == &mons[PM_DEMON]); X } X- # endif X X int X! is_dlord(ptr) struct permonst *ptr; { X! return(is_demon(ptr) && is_lord(ptr)); X } X X int X! is_dprince(ptr) struct permonst *ptr; { X! return(is_demon(ptr) && is_prince(ptr)); X } X X int X! type_is_pname(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_PNAME) != 0L); X } X X int X! always_hostile(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_HOSTILE) != 0L); X } X X int X! always_peaceful(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_PEACEFUL) != 0L); X } X X int X! strongmonst(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_STRONG) != 0L); X } X X int X! extra_nasty(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_NASTY) != 0L); X } X X- # ifdef POLYSELF X int X! can_breathe(ptr) struct permonst *ptr; { X! return(attacktype(ptr, AT_BREA)); X } X X int X! cantwield(ptr) struct permonst *ptr; { X! return(nohands(ptr) || verysmall(ptr)); X } X X int X! cantweararm(ptr) struct permonst *ptr; { X! return(breakarm(ptr) || sliparm(ptr)); X } X- # endif /* POLYSELF */ X X int X! nolimbs(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_NOLIMBS) != 0L); X } X X int X! carnivorous(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_CARNIVORE) != 0L); X } X! X int X! herbivorous(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_HERBIVORE) != 0L); X } X X int X! thick_skinned(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_THICK_HIDE) != 0L); X } X X int X! amorphous(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_AMORPHOUS) != 0L); X } X X #endif /* STUPID_CPP */ X--- 642,751 ---- X } X X int X is_wanderer(ptr) struct permonst *ptr; { X return((ptr->mflags2 & M2_WANDER) != 0L); X } X X int X! always_hostile(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_HOSTILE) != 0L); X } X X int X! always_peaceful(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_PEACEFUL) != 0L); X } X X int X! extra_nasty(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_NASTY) != 0L); X } X! X int X! strongmonst(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_STRONG) != 0L); X } X X+ # ifdef POLYSELF X int X! can_breathe(ptr) struct permonst *ptr; { X! return(attacktype(ptr, AT_BREA)); X } X X int X! cantwield(ptr) struct permonst *ptr; { X! return(nohands(ptr) || verysmall(ptr)); X } X X int X! cantweararm(ptr) struct permonst *ptr; { X! return(breakarm(ptr) || sliparm(ptr)); X } X+ # endif /* POLYSELF */ X X int X! carnivorous(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_CARNIVORE) != 0L); X } X X int X! herbivorous(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_HERBIVORE) != 0L); X } X X int X! metallivorous(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_METALLIVORE) != 0L); X } X X int X! lays_eggs(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_EGGS) != 0L); X } X X int X! throws_rocks(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_ROCKTHROW) != 0L); X } X X int X! type_is_pname(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_PNAME) != 0L); X } X X int X! is_lord(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_LORD) != 0L); X } X X int X! is_prince(ptr) struct permonst *ptr; { X! return((ptr->mflags2 & M2_PRINCE) != 0L); X } X X+ # ifdef INFERNO X int X! is_ndemon(ptr) struct permonst *ptr; { X! return(is_demon(ptr) && X! (ptr->mflags2 & (M2_LORD | M2_PRINCE)) == 0L); X } X! # else X int X! is_ndemon(ptr) struct permonst *ptr; { X! return(ptr == &mons[PM_DEMON]); X } X+ # endif X X int X! is_dlord(ptr) struct permonst *ptr; { X! return(is_demon(ptr) && is_lord(ptr)); X } X X int X! is_dprince(ptr) struct permonst *ptr; { X! return(is_demon(ptr) && is_prince(ptr)); X } X X #endif /* STUPID_CPP */ X+ X+ #endif /* OVLB */ X*** Old/monmove.c Wed Feb 21 18:10:20 1990 X--- src/monmove.c Wed Feb 21 18:00:56 1990 X*************** X*** 1,7 **** X! /* SCCS Id: @(#)monmove.c 3.0 88/11/10 X /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X /* NetHack may be freely redistributed. See license for details. */ X X #include "hack.h" X #include "mfndpos.h" X #ifdef NAMED_ITEMS X--- 1,14 ---- X! /* SCCS Id: @(#)monmove.c 3.0 89/11/21 X /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ X /* NetHack may be freely redistributed. See license for details. */ X X+ #ifndef LINT X+ # ifndef __STDC__ X+ #define TRAP_H /* comment line for pre-compiled headers */ X+ /* block some unused #defines to avoid overloading some cpp's */ X+ # endif X+ #endif X+ X #include "hack.h" X #include "mfndpos.h" X #ifdef NAMED_ITEMS X*************** X*** 8,13 **** X--- 15,27 ---- X # include "artifact.h" X #endif X X+ static void FDECL(distfleeck,(struct monst *,int *,int *,int *)); X+ #ifdef POLYSELF X+ static boolean FDECL(itsstuck,(struct monst *)); X+ #endif X+ X+ #ifdef OVLB X+ X boolean /* TRUE : mtmp died */ X mb_trapped(mtmp) X register struct monst *mtmp; X*************** X*** 36,72 **** X boolean canseeit = cansee(mtmp->mx, mtmp->my); X here = &levl[mtmp->mx][mtmp->my]; X X if(IS_ROCK(here->typ)) { X /* Just ate something. */ X! if(here->typ == STONE) here->typ = CORR; X! else if(IS_WALL(here->typ) && X! !(here->diggable & W_NONDIGGABLE)) { X! if(flags.soundok && flags.verbose && !rn2(5)) X! You("hear the sound of crashing rock."); X! if(!is_maze_lev) { X! here->typ = DOOR; X! here->doormask = D_NODOOR; X! } X! else X! here->typ = ROOM; X! mnewsym(mtmp->mx, mtmp->my); X! } X! } X! /* Eats away door if present & closed or locked */ X! else if(IS_DOOR(here->typ) && X! (here->doormask & (D_LOCKED | D_CLOSED))) { X! if(here->doormask & D_TRAPPED) { X! here->doormask = D_NODOOR; X! mnewsym(mtmp->mx, mtmp->my); X! if(mb_trapped(mtmp)) return(FALSE); X! } else { X! if(!rn2(3) && flags.verbose) /* not too often.. */ X! You("feel an unexpected draft of air."); X! here->doormask = D_BROKEN; X! mnewsym(mtmp->mx, mtmp->my); X } X! } X! else return TRUE; /* it doesn't leave rocks if it didn't dig */ X X /* Left behind a pile? */ X if(pile < 5) { X--- 50,88 ---- X boolean canseeit = cansee(mtmp->mx, mtmp->my); X here = &levl[mtmp->mx][mtmp->my]; X X+ if (here->typ == SDOOR) X+ here->typ = DOOR; X if(IS_ROCK(here->typ)) { X /* Just ate something. */ X! if(IS_WALL(here->typ)) { X! if (!(here->diggable & W_NONDIGGABLE)) { X! if(flags.soundok && flags.verbose && !rn2(5)) X! You("hear the sound of crashing rock."); X! if(!is_maze_lev) { X! here->typ = DOOR; X! here->doormask = D_NODOOR; X! } X! else X! here->typ = ROOM; X } X! } else X! here->typ = CORR; X! mnewsym(mtmp->mx, mtmp->my); X! } else /* Eats away door if present & closed or locked */ X! if(closed_door(mtmp->mx, mtmp->my)) { X! if(here->doormask & D_TRAPPED) { X! here->doormask = D_NODOOR; X! if(mb_trapped(mtmp)) return(FALSE); X! } else { X! if(!rn2(3) && flags.verbose) X! /* not too often.. */ X! You("feel an unexpected draft of air."); X! here->doormask = D_BROKEN; X! } X! mnewsym(mtmp->mx, mtmp->my); X! } else X! /* it doesn't leave rocks if it didn't dig */ X! return TRUE; X X /* Left behind a pile? */ X if(pile < 5) { X*************** X*** 80,88 **** X--- 96,108 ---- X newsym(mtmp->mx,mtmp->my); X else X mnewsym(mtmp->mx,mtmp->my); X+ here->seen = FALSE; X return(TRUE); X } X X+ #endif /* OVLB */ X+ #ifdef OVL1 X+ X int X dochugw(mtmp) X register struct monst *mtmp; X*************** X*** 110,115 **** X--- 130,138 ---- X return(rd); X } X X+ #endif /* OVL1 */ X+ #ifdef OVL2 X+ X boolean X onscary(x, y, mtmp) X int x, y; X*************** X*** 130,135 **** X--- 153,161 ---- X sobj_at(SCR_SCARE_MONSTER, x, y) != (struct obj *)0); X } X X+ #endif /* OVL2 */ X+ #ifdef OVL1 X+ X static void X distfleeck(mtmp,inrange,nearby,scared) X register struct monst *mtmp; X*************** X*** 197,203 **** X /* polymorph lycanthropes */ X were_change(mtmp); X X! if(mtmp->mfroz) { X if (Hallucination) pmon(mtmp); X return(0); /* frozen monsters don't do anything */ X } X--- 223,229 ---- X /* polymorph lycanthropes */ X were_change(mtmp); X X! if(!mtmp->mcanmove) { X if (Hallucination) pmon(mtmp); X return(0); /* frozen monsters don't do anything */ X } X*************** X*** 239,262 **** X /* check distance and scariness of attacks */ X distfleeck(mtmp,&inrange,&nearby,&scared); X X! #ifdef INFERNO /* Demonic Blackmail!!! */ X! if(nearby && is_demon(mdat) && mtmp->mpeaceful && !mtmp->mtame) { X if (mtmp->mux != u.ux || mtmp->muy != u.uy) { X pline("%s whispers something to thin air.", X cansee(mtmp->mux, mtmp->muy) ? Monnam(mtmp) : "It"); X! #ifdef POLYSELF X if (is_demon(uasmon)) rloc(mtmp); X /* "Good hunting, brother" */ X! else X! #endif X! if (is_lord(mdat) || is_prince(mdat)) { X! /* use is_lord instead of is_dlord */ X mtmp->minvis = 0; X /* Why? For the same reason in real demon talk */ X pline("%s gets angry.", Xmonnam(mtmp)); X mtmp->mpeaceful = 0; X /* since no way is an image going to pay it off */ X } X } else if(demon_talk(mtmp)) return(1); /* you paid it off */ X } X #endif X--- 265,289 ---- X /* check distance and scariness of attacks */ X distfleeck(mtmp,&inrange,&nearby,&scared); X X! #ifdef INFERNO /* Demonic Blackmail! */ X! if(nearby && mdat->msound == MS_BRIBE && X! mtmp->mpeaceful && !mtmp->mtame) { X if (mtmp->mux != u.ux || mtmp->muy != u.uy) { X pline("%s whispers something to thin air.", X cansee(mtmp->mux, mtmp->muy) ? Monnam(mtmp) : "It"); X! # ifdef POLYSELF X if (is_demon(uasmon)) rloc(mtmp); X /* "Good hunting, brother" */ X! else { X! # endif X mtmp->minvis = 0; X /* Why? For the same reason in real demon talk */ X pline("%s gets angry.", Xmonnam(mtmp)); X mtmp->mpeaceful = 0; X /* since no way is an image going to pay it off */ X+ # ifdef POLYSELF X } X+ # endif X } else if(demon_talk(mtmp)) return(1); /* you paid it off */ X } X #endif X*************** X*** 284,290 **** X break; X case 1: /* monster moved */ X /* Maybe it stepped on a trap and fell asleep... */ X! if(mtmp->msleep || mtmp->mfroz) return(0); X if(!nearby && ranged_attk(mdat)) break; X else if(mdat->mmove <= 12) return(0); X break; X--- 311,317 ---- X break; X case 1: /* monster moved */ X /* Maybe it stepped on a trap and fell asleep... */ X! if(mtmp->msleep || !mtmp->mcanmove) return(0); X if(!nearby && ranged_attk(mdat)) break; X else if(mdat->mmove <= 12) return(0); X break; X*************** X*** 303,308 **** X--- 330,340 ---- X if(mtmp->wormno && !mtmp->mtame) wormhit(mtmp); X #endif X X+ /* extra emotional attack for vile monsters */ X+ if(inrange && mtmp->data->msound == MS_CUSS && X+ !mtmp->minvis && !mtmp->mpeaceful && !rn2(5)) X+ cuss(mtmp); X+ X /* extra movement for fast monsters */ X if(mdat->mmove-12 > rnd(12)) tmp = m_move(mtmp, 1); X return(tmp == 2); X*************** X*** 330,335 **** X--- 362,370 ---- X } X #endif X X+ #endif /* OVL1 */ X+ #ifdef OVL0 X+ X int X m_move(mtmp, after) X register struct monst *mtmp; X*************** X*** 341,346 **** X--- 376,382 ---- X schar chi; X boolean likegold=0, likegems=0, likeobjs=0, likemagic=0, conceals=0; X boolean likerock=0, can_tunnel=0; X+ boolean can_open=0, can_unlock=0, doorbuster=0; X struct permonst *ptr = mtmp->data; X schar mmoved = 0; /* not strictly nec.: chi >= 0 will do */ X coord poss[9]; X*************** X*** 371,376 **** X--- 407,415 ---- X dlevel != rogue_level && X #endif X (!needspick(ptr) || m_carrying(mtmp, PICK_AXE)); X+ can_open = !(nohands(ptr) || verysmall(ptr)); X+ can_unlock = ((can_open && m_carrying(mtmp, SKELETON_KEY)) || mtmp->iswiz); X+ doorbuster = is_giant(ptr); X #ifdef WORM X if(mtmp->wormno) goto not_special; X #endif X*************** X*** 390,397 **** X X /* and for the guard */ X if(mtmp->isgd) { X! mmoved = gd_move(); X! goto postmov; X } X X /* and the wiz already got special treatment */ X--- 429,438 ---- X X /* and for the guard */ X if(mtmp->isgd) { X! mmoved = gd_move(mtmp); X! if(mmoved == -2) return(2); X! if(mmoved >= 0) goto postmov; X! mmoved = 0; X } X X /* and the wiz already got special treatment */ X*************** X*** 411,422 **** X #ifdef MAIL X if(ptr == &mons[PM_MAIL_DAEMON]) { X if(flags.soundok && canseemon(mtmp)) X! pline("\"I'm late!\""); X mongone(mtmp); X return(2); X } X #endif X- X /* teleport if that lies in our nature */ X if(ptr == &mons[PM_TENGU] && !rn2(5)) { X if(mtmp->mhp < 7 || mtmp->mpeaceful || rn2(2)) X--- 452,462 ---- X #ifdef MAIL X if(ptr == &mons[PM_MAIL_DAEMON]) { X if(flags.soundok && canseemon(mtmp)) X! verbalize("I'm late!"); X mongone(mtmp); X return(2); X } X #endif X /* teleport if that lies in our nature */ X if(ptr == &mons[PM_TENGU] && !rn2(5)) { X if(mtmp->mhp < 7 || mtmp->mpeaceful || rn2(2)) X*************** X*** 433,438 **** X--- 473,481 ---- X appr = 1; X if(mtmp->mflee) appr = -1; X if(mtmp->mconf || (Invis && !perceives(ptr)) || !mtmp->mcansee || X+ #ifdef POLYSELF X+ (u.usym == S_MIMIC_DEF) || u.uundetected || X+ #endif X (mtmp->mpeaceful && !mtmp->isshk) || /* allow shks to follow */ X ((ptr->mlet == S_STALKER || ptr->mlet == S_BAT || X ptr->mlet == S_YLIGHT) && !rn2(3))) X*************** X*** 536,541 **** X--- 579,587 ---- X if (is_human(ptr)) flag |= ALLOW_SSM; X if (is_undead(ptr)) flag |= NOGARLIC; X if (throws_rocks(ptr)) flag |= ALLOW_ROCK; X+ if (can_open) flag |= OPENDOOR; X+ if (can_unlock) flag |= UNLOCKDOOR; X+ if (doorbuster) flag |= BUSTDOOR; X cnt = mfndpos(mtmp, poss, info, flag); X chcnt = 0; X chi = -1; X*************** X*** 577,587 **** X */ X if((info[chi] & ALLOW_M) || X (nix == mtmp->mux && niy == mtmp->muy)) { X mtmp2 = X (MON_AT(nix, niy) ? m_at(nix,niy) : (struct monst *)0); X! if(mattackm(mtmp, mtmp2) == 1 && rn2(4) && X mtmp2->mlstmv != moves && mattackm(mtmp2, mtmp) == 2) X return(2); X return(3); X } X #ifdef WORM X--- 623,635 ---- X */ X if((info[chi] & ALLOW_M) || X (nix == mtmp->mux && niy == mtmp->muy)) { X+ int stat; X mtmp2 = X (MON_AT(nix, niy) ? m_at(nix,niy) : (struct monst *)0); X! if((stat = mattackm(mtmp, mtmp2)) == 1 && rn2(4) && X mtmp2->mlstmv != moves && mattackm(mtmp2, mtmp) == 2) X return(2); X+ if(stat == -1) return(2); X return(3); X } X #ifdef WORM X*************** X*** 616,629 **** X /* open a door, or crash through it, if you can */ X if(IS_DOOR(levl[mtmp->mx][mtmp->my].typ) X && !passes_walls(ptr) /* doesn't need to open doors */ X- && !amorphous(ptr) /* ditto */ X && !can_tunnel /* taken care of below */ X ) { X struct rm *here = &levl[mtmp->mx][mtmp->my]; X boolean btrapped = (here->doormask & D_TRAPPED); X X! if(here->doormask & D_LOCKED && mtmp->isshk) { X! /* can't lock out shk */ X if(btrapped) { X here->doormask = D_NODOOR; X mnewsym(mtmp->mx, mtmp->my); X--- 664,679 ---- X /* open a door, or crash through it, if you can */ X if(IS_DOOR(levl[mtmp->mx][mtmp->my].typ) X && !passes_walls(ptr) /* doesn't need to open doors */ X && !can_tunnel /* taken care of below */ X ) { X struct rm *here = &levl[mtmp->mx][mtmp->my]; X boolean btrapped = (here->doormask & D_TRAPPED); X X! if(here->doormask & (D_LOCKED|D_CLOSED) && amorphous(ptr)) { X! if (flags.verbose && canseeit) X! pline("%s %ss under the door.", Monnam(mtmp), X! ptr == &mons[PM_FOG_CLOUD] ? "flow" : "ooze"); X! } else if(here->doormask & D_LOCKED && can_unlock) { X if(btrapped) { X here->doormask = D_NODOOR; X mnewsym(mtmp->mx, mtmp->my); X*************** X*** 640,647 **** X mnewsym(mtmp->mx, mtmp->my); X if (canseeit) prl(mtmp->mx,mtmp->my); X } X! } else if (here->doormask == D_CLOSED && X! !nohands(mtmp->data)) { X if(btrapped) { X here->doormask = D_NODOOR; X mnewsym(mtmp->mx, mtmp->my); X--- 690,696 ---- X mnewsym(mtmp->mx, mtmp->my); X if (canseeit) prl(mtmp->mx,mtmp->my); X } X! } else if (here->doormask == D_CLOSED && can_open) { X if(btrapped) { X here->doormask = D_NODOOR; X mnewsym(mtmp->mx, mtmp->my); X*************** X*** 658,665 **** X mnewsym(mtmp->mx, mtmp->my); X if (canseeit) prl(mtmp->mx,mtmp->my); X } X! } else if(here->doormask & (D_LOCKED | D_CLOSED)) { X! /* mfndpos guarantees monster is a giant */ X if(btrapped) { X here->doormask = D_NODOOR; X mnewsym(mtmp->mx, mtmp->my); X--- 707,714 ---- X mnewsym(mtmp->mx, mtmp->my); X if (canseeit) prl(mtmp->mx,mtmp->my); X } X! } else if (here->doormask & (D_LOCKED|D_CLOSED)) { X! /* mfndpos guarantees this must be a doorbuster */ X if(btrapped) { X here->doormask = D_NODOOR; X mnewsym(mtmp->mx, mtmp->my); X*************** X*** 683,696 **** X /* Maybe a rock mole just ate something? */ X if(can_tunnel) if(!mdig_tunnel(mtmp)) return(2); /* died? */ X X! if(levl[mtmp->mx][mtmp->my].gmask == 1) { X /* Maybe a rock mole just ate some gold */ X! if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp); X if(likegold && (!abstain || !rn2(10))) mpickgold(mtmp); X } X if(OBJ_AT(mtmp->mx, mtmp->my)) { X /* Maybe a rock mole just ate some metal object */ X! if(ptr == &mons[PM_ROCK_MOLE]) meatgold(mtmp); X /* Maybe a cube ate just about anything */ X if(ptr == &mons[PM_GELATINOUS_CUBE]) meatobj(mtmp); X X--- 732,745 ---- X /* Maybe a rock mole just ate something? */ X if(can_tunnel) if(!mdig_tunnel(mtmp)) return(2); /* died? */ X X! if(levl[mtmp->mx][mtmp->my].gmask == TRUE) { X /* Maybe a rock mole just ate some gold */ X! if(metallivorous(ptr)) meatgold(mtmp); X if(likegold && (!abstain || !rn2(10))) mpickgold(mtmp); X } X if(OBJ_AT(mtmp->mx, mtmp->my)) { X /* Maybe a rock mole just ate some metal object */ X! if(metallivorous(ptr)) meatgold(mtmp); X /* Maybe a cube ate just about anything */ X if(ptr == &mons[PM_GELATINOUS_CUBE]) meatobj(mtmp); X X*************** X*** 720,725 **** X--- 769,795 ---- X return(mmoved); X } X X+ #endif /* OVL0 */ X+ #ifdef OVL2 X+ X+ boolean X+ closed_door(x, y) X+ register int x, y; X+ { X+ return(IS_DOOR(levl[x][y].typ) && X+ (levl[x][y].doormask & (D_LOCKED | D_CLOSED))); X+ } X+ X+ boolean X+ accessible(x, y) X+ register int x, y; X+ { X+ return(ACCESSIBLE(levl[x][y].typ) && !closed_door(x, y)); X+ } X+ X+ #endif /* OVL2 */ X+ #ifdef OVL1 X+ X void X set_apparxy(mtmp) /* where does mtmp think you are standing? */ X register struct monst *mtmp; X*************** X*** 748,765 **** X mtmp->mux = u.ux - disp + rn2(2*disp+1); X mtmp->muy = u.uy - disp + rn2(2*disp+1); X } while((mtmp->mux != u.ux || mtmp->muy != u.uy) && X! ( (!passes_walls(mtmp->data) && X (!ACCESSIBLE(levl[mtmp->mux][mtmp->muy].typ) || X! (IS_DOOR(levl[mtmp->mux][mtmp->muy].typ) && X! (levl[mtmp->mux][mtmp->muy].doormask & (D_LOCKED | D_CLOSED)) && X !amorphous(mtmp->data) X! )) X ) || X (disp==1 && mtmp->mux == mtmp->mx && mtmp->muy == mtmp->my) X! ) X! ); X } X X #ifdef STUPID_CPP /* otherwise these functions are macros in rm.h */ X /* X * Functions for encapsulation of level.monsters references. X--- 818,838 ---- X mtmp->mux = u.ux - disp + rn2(2*disp+1); X mtmp->muy = u.uy - disp + rn2(2*disp+1); X } while((mtmp->mux != u.ux || mtmp->muy != u.uy) && X! ( (!passes_walls(mtmp->data) && X (!ACCESSIBLE(levl[mtmp->mux][mtmp->muy].typ) || X! (closed_door(mtmp->mux, mtmp->muy) && X !amorphous(mtmp->data) X! ) X! ) X ) || X (disp==1 && mtmp->mux == mtmp->mx && mtmp->muy == mtmp->my) X! ) X! ); X } X X+ #endif /* OVL1 */ X+ #ifdef OVLB X+ X #ifdef STUPID_CPP /* otherwise these functions are macros in rm.h */ X /* X * Functions for encapsulation of level.monsters references. X*************** X*** 799,801 **** X--- 872,876 ---- X return(level.monsters[x][y]); X } X #endif /* STUPID_CPP */ X+ X+ #endif /* OVLB */ X X*** src/Old/write.c Mon Feb 19 19:10:15 1990 X--- src/write.c Thu Jan 25 22:16:35 1990 X*************** X*** 4,9 **** X--- 4,11 ---- X X #include "hack.h" X X+ static int FDECL(cost,(struct obj *)); X+ X /* X * returns basecost of a scroll X */ X*************** X*** 109,114 **** X--- 111,117 ---- X newscroll->otyp == SCR_BLANK_PAPER) { X You("can't write that!"); X pline("It's obscene!"); X+ obfree(newscroll, (struct obj *) 0); /* pb@ethz.uucp */ X return; X } X X*** src/Old/zap.c Mon Feb 19 19:10:33 1990 X--- src/zap.c Wed Feb 14 17:54:22 1990 X*************** X*** 8,13 **** X--- 8,26 ---- X static boolean priesthit = FALSE; X #endif X X+ static int FDECL(burn_floor_paper,(int,int)); X+ #ifndef OVERLAY X+ static int FDECL(bhitm,(struct monst *,struct obj *)); X+ #endif X+ static void FDECL(cancel_item,(struct obj *)); X+ static int FDECL(bhitgold,(struct gold *,struct obj *)); X+ #ifndef OVERLAY X+ static int FDECL(bhito,(struct obj *,struct obj *)); X+ #endif X+ static void FDECL(backfire,(struct obj *)); X+ static uchar FDECL(dirlet,(int,int)); X+ static int FDECL(zhit,(struct monst *,int,int)); X+ X const char *fl[]= { X "magic missile", /* Wands must be 0-9 */ X "bolt of fire", X*************** X*** 76,84 **** X #ifdef SPELLS X case SPE_SLOW_MONSTER: X #endif X! if(! resist(mtmp, otmp->olet, 0, NOTELL)) X if (mtmp->mspeed == MFAST) mtmp->mspeed = 0; X else mtmp->mspeed = MSLOW; X break; X case WAN_SPEED_MONSTER: X if (!resist(mtmp, otmp->olet, 0, NOTELL)) X--- 89,104 ---- X #ifdef SPELLS X case SPE_SLOW_MONSTER: X #endif X! if(! resist(mtmp, otmp->olet, 0, NOTELL)) { X if (mtmp->mspeed == MFAST) mtmp->mspeed = 0; X else mtmp->mspeed = MSLOW; X+ if (u.uswallow && (mtmp == u.ustuck) && X+ is_whirly(mtmp->data)) { X+ You("disrupt %s!", mon_nam(mtmp)); X+ pline("A huge hole opens up..."); X+ expels(mtmp, mtmp->data, TRUE); X+ } X+ } X break; X case WAN_SPEED_MONSTER: X if (!resist(mtmp, otmp->olet, 0, NOTELL)) X*************** X*** 149,157 **** X #endif X case WAN_OPENING: X if(u.uswallow && mtmp == u.ustuck) { X! if (Blind) pline("Its mouth opens!"); X! else pline("%s opens its mouth!", Monnam(mtmp)); X! regurgitates(mtmp); X break; X } X case WAN_LOCKING: X--- 169,179 ---- X #endif X case WAN_OPENING: X if(u.uswallow && mtmp == u.ustuck) { X! if (is_animal(mtmp->data)) { X! if (Blind) pline("Its mouth opens!"); X! else pline("%s opens its mouth!", Monnam(mtmp)); X! } X! expels(mtmp, mtmp->data, TRUE); X break; X } X case WAN_LOCKING: X*************** X*** 190,202 **** X if (is_mercenary(&mons[montype])) X montype = PM_UNARMORED_SOLDIER; X #endif X- mons[montype].pxlth += obj->onamelth; X mtmp = makemon(&mons[montype], x, y); X- mons[montype].pxlth -= obj->onamelth; X if (mtmp) { X /* Monster retains its name */ X! if (mtmp->mnamelth = obj->onamelth) X! Strcpy(NAME(mtmp), ONAME(obj)); X /* No inventory for newly revived monsters */ X while(otmp = (mtmp->minvent)) { X mtmp->minvent = otmp->nobj; X--- 212,222 ---- X if (is_mercenary(&mons[montype])) X montype = PM_UNARMORED_SOLDIER; X #endif X mtmp = makemon(&mons[montype], x, y); X if (mtmp) { X /* Monster retains its name */ X! if (obj->onamelth) X! mtmp = christen_monst(mtmp, ONAME(obj)); X /* No inventory for newly revived monsters */ X while(otmp = (mtmp->minvent)) { X mtmp->minvent = otmp->nobj; X*************** X*** 207,214 **** X if (mtmp && obj->oeaten) X mtmp->mhp = eaten_stat(mtmp->mhp, obj); X if (ininv) useup(obj); X! else useupf(obj); X! newsym(x, y); X } X return mtmp; X } X--- 227,239 ---- X if (mtmp && obj->oeaten) X mtmp->mhp = eaten_stat(mtmp->mhp, obj); X if (ininv) useup(obj); X! else { X! /* not useupf(), which charges */ X! if (obj->quan > 1) obj->quan--; X! else delobj(obj); X! } X! if (x != u.ux || y != u.uy || Invisible) X! newsym(x, y); X } X return mtmp; X } X*************** X*** 219,224 **** X--- 244,272 ---- X cancel_item(obj) X register struct obj *obj; X { X+ switch(obj->otyp) { X+ case RIN_GAIN_STRENGTH: X+ ABON(A_STR) -= obj->spe; X+ flags.botl = 1; X+ break; X+ case RIN_ADORNMENT: X+ ABON(A_CHA) -= obj->spe; X+ flags.botl = 1; X+ break; X+ case RIN_INCREASE_DAMAGE: X+ u.udaminc -= obj->spe; X+ break; X+ case GAUNTLETS_OF_DEXTERITY: X+ ABON(A_DEX) -= obj->spe; X+ flags.botl = 1; X+ break; X+ case HELM_OF_BRILLIANCE: X+ ABON(A_INT) -= obj->spe; X+ ABON(A_WIS) -= obj->spe; X+ flags.botl = 1; X+ break; X+ /* case RIN_PROTECTION: /* not needed */ X+ } X if(obj->spe && X !(obj->otyp == AMULET_OF_YENDOR || X obj->otyp == WAN_CANCELLATION || /* can't cancel cancellation */ X*************** X*** 290,296 **** X */ X if (obj->otyp == SCR_MAIL) { X otmp2->otyp = SCR_MAIL; X! obj->spe = 1; X } X #endif X /* keep special fields (including charges on wands) */ X--- 338,344 ---- X */ X if (obj->otyp == SCR_MAIL) { X otmp2->otyp = SCR_MAIL; X! otmp2->spe = 1; X } X #endif X /* keep special fields (including charges on wands) */ X*************** X*** 341,346 **** X--- 389,405 ---- X } X } X X+ /* no named weapons --KAA */ X+ if (otmp2->onamelth) { X+ otmp2 = oname(otmp2, "", 0); X+ fobj = otmp2; X+ /* cannot use place_object() */ X+ level.objects[otmp2->ox][otmp2->oy] = otmp2; X+ } X+ X+ /* no box contents --KAA */ X+ if (Is_container(otmp2)) delete_contents(otmp2); X+ X /* update the weight */ X otmp2->owt = weight(otmp2); X delobj(obj); X*************** X*** 447,454 **** X } X break; X case WAN_WISHING: X! X! if(u.uluck + rn2(5) < 0) { X pline("Unfortunately, nothing happens."); X break; X } X--- 506,512 ---- X } X break; X case WAN_WISHING: X! if(Luck + rn2(5) < 0) { X pline("Unfortunately, nothing happens."); X break; X } X*************** X*** 467,473 **** X register struct obj * otmp; X { X pline("The %s suddenly explodes!", xname(otmp)); X! losehp(d(otmp->spe+2,6), "exploding wand"); X useup(otmp); X } X X--- 525,531 ---- X register struct obj * otmp; X { X pline("The %s suddenly explodes!", xname(otmp)); X! losehp(d(otmp->spe+2,6), "exploding wand", KILLED_BY_AN); X useup(otmp); X } X X*************** X*** 495,501 **** X /* make him pay for knowing !NODIR */ X } else if(!u.dx && !u.dy && !u.dz && !(objects[obj->otyp].bits & NODIR)) { X if((damage = zapyourself(obj))) X! losehp(damage,"self-inflicted injury"); X } X else { X weffects(obj); X--- 553,560 ---- X /* make him pay for knowing !NODIR */ X } else if(!u.dx && !u.dy && !u.dz && !(objects[obj->otyp].bits & NODIR)) { X if((damage = zapyourself(obj))) X! losehp(damage, self_pronoun("zapped %sself with a wand", "him"), X! NO_KILLER_PREFIX); X } X else { X weffects(obj); X*************** X*** 698,704 **** X break; X } X #endif X! killer = "death ray"; X You("irradiate yourself with pure energy!"); X You("die."); X makeknown(WAN_DEATH); X--- 757,764 ---- X break; X } X #endif X! killer_format = NO_KILLER_PREFIX; X! killer = self_pronoun("shot %sself with a death ray","him"); X You("irradiate yourself with pure energy!"); X You("die."); X makeknown(WAN_DEATH); X*************** X*** 711,717 **** X case WAN_UNDEAD_TURNING: X #ifdef POLYSELF X if (is_undead(uasmon)) { X! Printf("You feel frightened and %sstunned.", X Stunned ? "even more " : ""); X make_stunned(HStun + rnd(30), FALSE); X } X--- 771,777 ---- X case WAN_UNDEAD_TURNING: X #ifdef POLYSELF X if (is_undead(uasmon)) { X! You("feel frightened and %sstunned.", X Stunned ? "even more " : ""); X make_stunned(HStun + rnd(30), FALSE); X } X*************** X*** 799,805 **** X } X break; X case WAN_WISHING: X! if(u.uluck + rn2(5) < 0) { X pline("Unfortunately, nothing happens."); X break; X } X--- 859,865 ---- X } X break; X case WAN_WISHING: X! if(Luck + rn2(5) < 0) { X pline("Unfortunately, nothing happens."); X break; X } X*************** X*** 819,832 **** X { register struct rm *room; X register int digdepth,dlx,dly; X register boolean shopdoor = FALSE; X if(u.uswallow) { X register struct monst *mtmp = u.ustuck; X X! if (Blind) You("pierce its stomach wall!"); X! else You("pierce %s's stomach wall!", X! mon_nam(mtmp)); X! mtmp->mhp = 1; /* almost dead */ X! regurgitates(mtmp); X break; X } X if(u.dz) { X--- 879,901 ---- X { register struct rm *room; X register int digdepth,dlx,dly; X register boolean shopdoor = FALSE; X+ #ifdef __GNULINT__ X+ dlx = dly = 0; X+ #endif X if(u.uswallow) { X register struct monst *mtmp = u.ustuck; X X! if (!is_whirly(mtmp->data)) { X! if (is_animal(mtmp->data)) X! if (Blind) X! You("pierce its stomach wall!"); X! else X! You("pierce %s's stomach wall!", X! mon_nam(mtmp)); X! mtmp->mhp = 1; /* almost dead */ X! expels(mtmp, mtmp->data, X! !is_animal(mtmp->data)); X! } X break; X } X if(u.dz) { X*************** X*** 834,840 **** X You("loosen a rock from the ceiling."); X pline("It falls on your %s!", X body_part(HEAD)); X! losehp(1, "falling rock"); X (void) mksobj_at((int)ROCK, u.ux, u.uy); X fobj->quan = 1; X stackobj(fobj); X--- 903,909 ---- X You("loosen a rock from the ceiling."); X pline("It falls on your %s!", X body_part(HEAD)); X! losehp(1, "falling rock", KILLED_BY_AN); X (void) mksobj_at((int)ROCK, u.ux, u.uy); X fobj->quan = 1; X stackobj(fobj); X*************** X*** 883,890 **** X } X else X break; X! else if(room->typ == DOOR && X! (room->doormask & (D_LOCKED | D_CLOSED))) { X room->doormask = D_NODOOR; X mnewsym(zx, zy); X if (cansee(zx,zy)) prl(zx, zy); X--- 952,958 ---- X } X else X break; X! else if(closed_door(zx, zy)) { X room->doormask = D_NODOOR; X mnewsym(zx, zy); X if (cansee(zx,zy)) prl(zx, zy); X*************** X*** 927,933 **** X return; X } X X! char * X exclam(force) X register int force; X { X--- 995,1001 ---- X return; X } X X! const char * X exclam(force) X register int force; X { X*************** X*** 934,940 **** X /* force == 0 occurs e.g. with sleep ray */ X /* note that large force is usual with wands so that !! would X require information about hand/weapon/wand */ X! return( (force < 0) ? "?" : (force <= 4) ? "." : "!" ); X } X X void X--- 1002,1008 ---- X /* force == 0 occurs e.g. with sleep ray */ X /* note that large force is usual with wands so that !! would X require information about hand/weapon/wand */ X! return (const char *)((force < 0) ? "?" : (force <= 4) ? "." : "!"); X } X X void X*************** X*** 968,974 **** X bhit(ddx,ddy,range,sym,fhitm,fhito,obj) X register int ddx,ddy,range; /* direction and range */ X char sym; /* symbol displayed on path */ X! int (*fhitm)(), (*fhito)(); /* fns called when mon/obj hit */ X struct obj *obj; /* 2nd arg to fhitm/fhito */ X { X register struct monst *mtmp; X--- 1036,1043 ---- X bhit(ddx,ddy,range,sym,fhitm,fhito,obj) X register int ddx,ddy,range; /* direction and range */ X char sym; /* symbol displayed on path */ X! int FDECL((*fhitm), (struct monst *, struct obj *)), X! FDECL((*fhito), (struct obj *, struct obj *)); /* fns called when mon/obj hit */ X struct obj *obj; /* 2nd arg to fhitm/fhito */ X { X register struct monst *mtmp; X*************** X*** 975,981 **** X--- 1044,1054 ---- X register struct obj *otmp; X register uchar typ; X boolean shopdoor = FALSE; X+ #ifdef __GNULINT__ X+ xchar dlx=0, dly=0; X+ #else X xchar dlx, dly; X+ #endif X X bhitpos.x = u.ux; X bhitpos.y = u.uy; X*************** X*** 1063,1071 **** X break; X } X } X! if(!ZAP_POS(typ) || (IS_DOOR(typ) && X! (levl[bhitpos.x][bhitpos.y].doormask & (D_LOCKED | D_CLOSED))) X! ) { X bhitpos.x -= ddx; X bhitpos.y -= ddy; X break; X--- 1136,1142 ---- X break; X } X } X! if(!ZAP_POS(typ) || closed_door(bhitpos.x, bhitpos.y)) { X bhitpos.x -= ddx; X bhitpos.y -= ddy; X break; X*************** X*** 1179,1185 **** X if(resists_sleep(mon->data) || X resist(mon, (type == 2) ? WAND_SYM : '\0', 0, NOTELL)) X shieldeff(mon->mx, mon->my); X! else mon->mfroz = 1; X break; X case 3: /* cold */ X if(resists_cold(mon->data)) { X--- 1250,1261 ---- X if(resists_sleep(mon->data) || X resist(mon, (type == 2) ? WAND_SYM : '\0', 0, NOTELL)) X shieldeff(mon->mx, mon->my); X! else if (mon->mcanmove) { X! int tmp2 = d(nd,25); X! mon->mcanmove = 0; X! if (mon->mfrozen + tmp2 > 127) mon->mfrozen = 127; X! else mon->mfrozen += tmp2; X! } X break; X case 3: /* cold */ X if(resists_cold(mon->data)) { X*************** X*** 1256,1266 **** X #else X if(obj->olet == SCROLL_SYM) { X #endif X scrquan = obj->quan; X for(i = 1; i <= scrquan ; i++) X if(!rn2(3)) { X cnt++; X! useupf(obj); X } X } X } X--- 1332,1349 ---- X #else X if(obj->olet == SCROLL_SYM) { X #endif X+ if (obj->otyp == SCR_FIRE X+ #ifdef SPELLS X+ || obj->otyp == SPE_FIREBALL) X+ #endif X+ continue; X scrquan = obj->quan; X for(i = 1; i <= scrquan ; i++) X if(!rn2(3)) { X cnt++; X! /* not useupf(), which charges */ X! if (obj->quan > 1) obj->quan--; X! else delobj(obj); X } X } X } X*************** X*** 1282,1288 **** X--- 1365,1376 ---- X int abstype = abs(type) % 10; X register const char *fltxt = fl[abs(type)]; X struct rm *lev; X+ register xchar lsx, lsy; X+ #ifdef __GNULINT__ X+ xchar range, olx=0, oly=0; X+ #else X xchar range, olx, oly; X+ #endif X struct monst *mon; X register boolean bodyhit = FALSE; X register boolean shopdoor = FALSE; X*************** X*** 1306,1315 **** X Tmp_at2(-3, zapcolor[abstype]); X #endif X while(range-- > 0) { X! sx += dx; X! sy += dy; X! if((lev = &levl[sx][sy])->typ) Tmp_at2(sx,sy); X! else { X int bounce = 0; X if(cansee(sx-dx,sy-dy)) X pline("The %s bounces!", fltxt); X--- 1394,1407 ---- X Tmp_at2(-3, zapcolor[abstype]); X #endif X while(range-- > 0) { X! lsx = sx; sx += dx; X! lsy = sy; sy += dy; X! if((lev = &levl[sx][sy])->typ) { X! if((cansee(lsx,lsy) && cansee(sx,sy)) || X! (!cansee(lsx,lsy) && cansee(sx,sy) && X! (IS_DOOR(lev->typ) || IS_ROOM(lev->typ)))) X! Tmp_at2(sx,sy); X! } else { X int bounce = 0; X if(cansee(sx-dx,sy-dy)) X pline("The %s bounces!", fltxt); X*************** X*** 1388,1394 **** X } else if(flags.soundok) X You("hear a crackling sound."); X } X! if(IS_DOOR(lev->typ) && (lev->doormask & (D_LOCKED | D_CLOSED))) { X range = 0; X switch(abstype) { X case 1: X--- 1480,1486 ---- X } else if(flags.soundok) X You("hear a crackling sound."); X } X! if(closed_door(sx, sy)) { X range = 0; X switch(abstype) { X case 1: X*************** X*** 1545,1551 **** X case 1: X bodyhit = TRUE; X if (uarmc) break; X! (void)(rust_dmg(uarm, "leather armor", 0, FALSE)); X break; X case 2: X if (!rust_dmg(uarms, "wooden shield", 0, FALSE)) continue; X--- 1637,1643 ---- X case 1: X bodyhit = TRUE; X if (uarmc) break; X! if (uarm) (void)(rust_dmg(uarm, xname(uarm), 0, FALSE)); X break; X case 2: X if (!rust_dmg(uarms, "wooden shield", 0, FALSE)) continue; X*************** X*** 1623,1629 **** X dam = d(nd, 6); X break; X case 6: /* poison */ X! poisoned("blast", A_DEX, "poisoned blast"); X break; X case 7: /* acid */ X pline("The acid burns!"); X--- 1715,1721 ---- X dam = d(nd, 6); X break; X case 6: /* poison */ X! poisoned("blast", A_DEX, "poisoned blast", 15); X break; X case 7: /* acid */ X pline("The acid burns!"); X*************** X*** 1632,1638 **** X if(!rn2(6)) corrode_armor(); X break; X } X! losehp(dam,fltxt); X } else pline("The %s whizzes by you!",fltxt); X if (abstype == 5 && !Blind) { /* LIGHTNING */ X You("are blinded by the flash!"); X--- 1724,1730 ---- X if(!rn2(6)) corrode_armor(); X break; X } X! losehp(dam,fltxt, KILLED_BY_AN); X } else pline("The %s whizzes by you!",fltxt); X if (abstype == 5 && !Blind) { /* LIGHTNING */ X You("are blinded by the flash!"); X*************** X*** 1675,1682 **** X } X } X Tmp_at2(-1,-1); X! if(shopdoor && !in_shop(u.ux, u.uy)) X! pay_for_door(olx, oly, abstype == 1 ? "burn away" : X abstype == 3 ? "shatter" : X abstype == 4 ? "disintegrate" : X "destroy"); X--- 1767,1773 ---- X } X } X Tmp_at2(-1,-1); X! if(shopdoor) pay_for_door(olx, oly, abstype == 1 ? "burn away" : X abstype == 3 ? "shatter" : X abstype == 4 ? "disintegrate" : X "destroy"); X*************** X*** 1780,1786 **** X register struct obj *obj, *obj2; X register int quan, i, cnt, dmg, xresist, skip; X register int dindx; X! char *mult; X X for(obj = invent; obj; obj = obj2) { X X--- 1871,1877 ---- X register struct obj *obj, *obj2; X register int quan, i, cnt, dmg, xresist, skip; X register int dindx; X! const char *mult; X X for(obj = invent; obj; obj = obj2) { X X*************** X*** 1787,1793 **** X obj2 = obj->nobj; X if(obj->olet != osym) continue; /* test only objs of type osym */ X xresist = skip = 0; X! X switch(dmgtyp) { X case AD_COLD: X if(osym == POTION_SYM) { X--- 1878,1886 ---- X obj2 = obj->nobj; X if(obj->olet != osym) continue; /* test only objs of type osym */ X xresist = skip = 0; X! #ifdef __GNULINT__ X! quan = dmg = dindx = 0; X! #endif X switch(dmgtyp) { X case AD_COLD: X if(osym == POTION_SYM) { X*************** X*** 1799,1807 **** X case AD_FIRE: X xresist = (Fire_resistance && obj->olet != POTION_SYM); X X! /* Let's say scrolls of fire are fire resistant */ X! X! if (obj->otyp == SCR_FIRE) X skip++; X quan = obj->quan; X switch(osym) { X--- 1892,1902 ---- X case AD_FIRE: X xresist = (Fire_resistance && obj->olet != POTION_SYM); X X! if (obj->otyp == SCR_FIRE X! #ifdef SPELLS X! || obj->otyp == SPE_FIREBALL X! #endif X! ) X skip++; X quan = obj->quan; X switch(osym) { X*************** X*** 1863,1869 **** X for(i = 0; i < cnt; i++) useup(obj); X if(dmg) { X if(xresist) You("aren't hurt!"); X! else losehp(dmg, destroy_strings[dindx*3 + 2]); X } X } X } X--- 1958,1967 ---- X for(i = 0; i < cnt; i++) useup(obj); X if(dmg) { X if(xresist) You("aren't hurt!"); X! else losehp(dmg, X! (cnt==1) ? destroy_strings[dindx*3 + 2] : X! (const char *)makeplural(destroy_strings[dindx*3 + 2]), X! (cnt==1) ? KILLED_BY_AN : KILLED_BY); X } X } X } X*************** X*** 1884,1890 **** X obj2 = obj->nobj; X if(obj->olet != osym) continue; /* test only objs of type osym */ X skip = 0; X! X switch(dmgtyp) { X case AD_COLD: X if(osym == POTION_SYM) { X--- 1982,1990 ---- X obj2 = obj->nobj; X if(obj->olet != osym) continue; /* test only objs of type osym */ X skip = 0; X! #ifdef __GNULINT__ X! quan = dindx = 0; X! #endif X switch(dmgtyp) { X case AD_COLD: X if(osym == POTION_SYM) { X*************** X*** 1894,1902 **** X } else skip++; X break; X case AD_FIRE: X! /* Let's say scrolls of fire are fire resistant */ X! X! if (obj->otyp == SCR_FIRE) X skip++; X quan = obj->quan; X switch(osym) { X--- 1994,2004 ---- X } else skip++; X break; X case AD_FIRE: X! if (obj->otyp == SCR_FIRE X! #ifdef SPELLS X! || obj->otyp == SPE_FIREBALL X! #endif X! ) X skip++; X quan = obj->quan; X switch(osym) { X*************** X*** 2036,2046 **** X prinv(otmp); X otmp->quan = mergquan; X } X- #ifdef WIZARD X- if (!wizard) X- #endif X- if(otmp->otyp == WAN_WISHING) otmp->recharged = 1; X- X #ifdef THEOLOGY X u.ublesscnt += rn1(100,50); /* the gods take notice */ X #endif X--- 2138,2143 ---- X END_OF_FILE if test 53746 -ne `wc -c <'patch7.12'`; then echo shar: \"'patch7.12'\" unpacked with wrong size! fi # end of 'patch7.12' fi echo shar: End of archive 18 \(of 30\). cp /dev/null ark18isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 30 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