Skip to content

Commit

Permalink
fix #Q431 - water elemental caught in beartrap (trunk only)
Browse files Browse the repository at this point in the history
     Reported two months ago by <email deleted>,
having a water elemental become trapped in a bear trap seems pretty
strange.  Fixed by marking water elementals as M1_UNSOLID (like air and
fire elementals), which has a side-effect of making them immune to webs
as well.  Tweaked some unused digging code which checks unsolid(), added
unsolid() to the types allowed to bar through iron bars, and brought the
check for whether a monster is willing to enter a bear trap location up
to date.  That code also needed an update to reflect the change made to
anti-magic traps last year.  Lastly, there was another report which
suggested that being hit by a bear trap should dish out some damage
(along with a suggestion that wand of opening should work to escape such
traps, which has already been done).  This makes bear trap do 2d4 damage
(on entry, not when trying to pull out after becoming stuck).
  • Loading branch information
nethack.rankin committed Apr 3, 2007
1 parent 5f0ab02 commit 0b05ca9
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 8 deletions.
2 changes: 2 additions & 0 deletions doc/fixes35.0
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions src/dig.c
Original file line number Diff line number Diff line change
@@ -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. */

Expand Down Expand Up @@ -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.",
Expand Down
5 changes: 4 additions & 1 deletion src/mon.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
Expand Down
2 changes: 1 addition & 1 deletion src/mondata.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)));
}

Expand Down
5 changes: 3 additions & 2 deletions src/monst.c
Original file line number Diff line number Diff line change
@@ -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. */

Expand Down Expand Up @@ -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
Expand Down
15 changes: 13 additions & 2 deletions src/trap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) ||
Expand All @@ -876,16 +879,20 @@ 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
{
pline("%s bear trap closes on your %s!",
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);
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 0b05ca9

Please sign in to comment.