diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 1c136f1f6..0437b707d 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -210,6 +210,8 @@ unicorn horn produced by revived monster will polymorph as if non-magic stone-to-flesh on any golem statue or golem figurine creates flesh golem stone-to-flesh which activates shop-owned figurine entails shop charges make giants be less likely to be randomly generated in Sokoban +bear traps dish out some damage on initial entrapment +bear traps and webs are harmless to water elementals Platform- and/or Interface-Specific Fixes diff --git a/src/dig.c b/src/dig.c index 17a161ef9..6ade43031 100644 --- a/src/dig.c +++ b/src/dig.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)dig.c 3.5 2006/07/08 */ +/* SCCS Id: @(#)dig.c 3.5 2007/04/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1937,7 +1937,9 @@ escape_tomb() boolean good; if(amorphous(youmonst.data) || Passes_walls || - noncorporeal(youmonst.data) || unsolid(youmonst.data) || + noncorporeal(youmonst.data) || + (unsolid(youmonst.data) && + youmonst.data != &mons[PM_WATER_ELEMENTAL]) || (tunnels(youmonst.data) && !needspick(youmonst.data))) { You("%s up through the %s.", diff --git a/src/mon.c b/src/mon.c index 3737f3221..69ae08f01 100644 --- a/src/mon.c +++ b/src/mon.c @@ -1192,12 +1192,15 @@ impossible("A monster looked at a very strange trap of type %d.", ttmp->ttyp); !resists_sleep(mon)) && (ttmp->ttyp != BEAR_TRAP || (mdat->msize > MZ_SMALL && - !amorphous(mdat) && !is_flyer(mdat))) + !amorphous(mdat) && !is_flyer(mdat) && + !is_whirly(mdat) && !unsolid(mdat))) && (ttmp->ttyp != FIRE_TRAP || !resists_fire(mon)) && (ttmp->ttyp != SQKY_BOARD || !is_flyer(mdat)) && (ttmp->ttyp != WEB || (!amorphous(mdat) && !webmaker(mdat))) + && (ttmp->ttyp != ANTI_MAGIC || + !resists_magm(mon)) ) { if (!(flag & ALLOW_TRAPS)) { if (mon->mtrapseen & (1L << (ttmp->ttyp - 1))) diff --git a/src/mondata.c b/src/mondata.c index 4e67fb096..86981c519 100644 --- a/src/mondata.c +++ b/src/mondata.c @@ -283,7 +283,7 @@ passes_bars(mptr) struct permonst *mptr; { return (boolean) (passes_walls(mptr) || amorphous(mptr) || - is_whirly(mptr) || verysmall(mptr) || + unsolid(mptr) || is_whirly(mptr) || verysmall(mptr) || (slithy(mptr) && !bigmonst(mptr))); } diff --git a/src/monst.c b/src/monst.c index af7305661..0e7bef1fe 100644 --- a/src/monst.c +++ b/src/monst.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)monst.c 3.5 2006/02/13 */ +/* SCCS Id: @(#)monst.c 3.5 2007/04/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1389,7 +1389,8 @@ NEARDATA struct permonst mons[] = { A(ATTK(AT_CLAW, AD_PHYS, 5, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 0, MS_SILENT, MZ_HUGE), MR_POISON|MR_STONE, 0, - M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_AMPHIBIOUS|M1_SWIM, + M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_UNSOLID| + M1_AMPHIBIOUS|M1_SWIM, M2_STRONG|M2_NEUTER, 0, CLR_BLUE), /* * Fungi diff --git a/src/trap.c b/src/trap.c index aa81fd7a8..667eff55f 100644 --- a/src/trap.c +++ b/src/trap.c @@ -852,6 +852,9 @@ unsigned trflags; break; case BEAR_TRAP: + { + int dmg = d(2, 4); + if ((Levitation || Flying) && !forcetrap) break; feeltrap(trap); if(amorphous(youmonst.data) || is_whirly(youmonst.data) || @@ -876,6 +879,8 @@ unsigned trflags; pline("%s bear trap closes on %s %s!", A_Your[trap->madeby_u], s_suffix(mon_nam(u.usteed)), mbodypart(u.usteed, FOOT)); + if (thitm(0, u.usteed, (struct obj *)0, dmg, FALSE)) + u.utrap = 0; /* steed died, hero not trapped */ } else #endif { @@ -883,9 +888,11 @@ unsigned trflags; A_Your[trap->madeby_u], body_part(FOOT)); if(u.umonnum == PM_OWLBEAR || u.umonnum == PM_BUGBEAR) You("howl in anger!"); + losehp(Maybe_Half_Phys(dmg), "bear trap", KILLED_BY_AN); } exercise(A_DEX, FALSE); break; + } case SLP_GAS_TRAP: seetrap(trap); @@ -2055,6 +2062,9 @@ register struct monst *mtmp; seetrap(trap); } } + if (mtmp->mtrapped) + trapkilled = thitm(0, mtmp, (struct obj *)0, + d(2, 4), FALSE); break; case SLP_GAS_TRAP: @@ -2365,8 +2375,9 @@ glovecheck: target = which_armor(mtmp, W_ARMG); case ANTI_MAGIC: /* similar to hero's case, more or less */ if (!resists_magm(mtmp)) { /* lose spell energy */ - if (attacktype(mptr, AT_MAGC) || - attacktype(mptr, AT_BREA)) { + if (!mtmp->mcan && + (attacktype(mptr, AT_MAGC) || + attacktype(mptr, AT_BREA))) { mtmp->mspec_used += d(2, 2); if (in_sight) { seetrap(trap);