fix #Q431 - water elemental caught in beartrap (trunk only)
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).
This commit is contained in:
@@ -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 on any golem statue or golem figurine creates flesh golem
|
||||||
stone-to-flesh which activates shop-owned figurine entails shop charges
|
stone-to-flesh which activates shop-owned figurine entails shop charges
|
||||||
make giants be less likely to be randomly generated in Sokoban
|
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
|
Platform- and/or Interface-Specific Fixes
|
||||||
|
|||||||
@@ -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. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
|
|
||||||
@@ -1937,7 +1937,9 @@ escape_tomb()
|
|||||||
boolean good;
|
boolean good;
|
||||||
|
|
||||||
if(amorphous(youmonst.data) || Passes_walls ||
|
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))) {
|
(tunnels(youmonst.data) && !needspick(youmonst.data))) {
|
||||||
|
|
||||||
You("%s up through the %s.",
|
You("%s up through the %s.",
|
||||||
|
|||||||
@@ -1192,12 +1192,15 @@ impossible("A monster looked at a very strange trap of type %d.", ttmp->ttyp);
|
|||||||
!resists_sleep(mon))
|
!resists_sleep(mon))
|
||||||
&& (ttmp->ttyp != BEAR_TRAP ||
|
&& (ttmp->ttyp != BEAR_TRAP ||
|
||||||
(mdat->msize > MZ_SMALL &&
|
(mdat->msize > MZ_SMALL &&
|
||||||
!amorphous(mdat) && !is_flyer(mdat)))
|
!amorphous(mdat) && !is_flyer(mdat) &&
|
||||||
|
!is_whirly(mdat) && !unsolid(mdat)))
|
||||||
&& (ttmp->ttyp != FIRE_TRAP ||
|
&& (ttmp->ttyp != FIRE_TRAP ||
|
||||||
!resists_fire(mon))
|
!resists_fire(mon))
|
||||||
&& (ttmp->ttyp != SQKY_BOARD || !is_flyer(mdat))
|
&& (ttmp->ttyp != SQKY_BOARD || !is_flyer(mdat))
|
||||||
&& (ttmp->ttyp != WEB || (!amorphous(mdat) &&
|
&& (ttmp->ttyp != WEB || (!amorphous(mdat) &&
|
||||||
!webmaker(mdat)))
|
!webmaker(mdat)))
|
||||||
|
&& (ttmp->ttyp != ANTI_MAGIC ||
|
||||||
|
!resists_magm(mon))
|
||||||
) {
|
) {
|
||||||
if (!(flag & ALLOW_TRAPS)) {
|
if (!(flag & ALLOW_TRAPS)) {
|
||||||
if (mon->mtrapseen & (1L << (ttmp->ttyp - 1)))
|
if (mon->mtrapseen & (1L << (ttmp->ttyp - 1)))
|
||||||
|
|||||||
+1
-1
@@ -283,7 +283,7 @@ passes_bars(mptr)
|
|||||||
struct permonst *mptr;
|
struct permonst *mptr;
|
||||||
{
|
{
|
||||||
return (boolean) (passes_walls(mptr) || amorphous(mptr) ||
|
return (boolean) (passes_walls(mptr) || amorphous(mptr) ||
|
||||||
is_whirly(mptr) || verysmall(mptr) ||
|
unsolid(mptr) || is_whirly(mptr) || verysmall(mptr) ||
|
||||||
(slithy(mptr) && !bigmonst(mptr)));
|
(slithy(mptr) && !bigmonst(mptr)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -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. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* 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),
|
A(ATTK(AT_CLAW, AD_PHYS, 5, 6),
|
||||||
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
||||||
SIZ(2500, 0, MS_SILENT, MZ_HUGE), MR_POISON|MR_STONE, 0,
|
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),
|
M2_STRONG|M2_NEUTER, 0, CLR_BLUE),
|
||||||
/*
|
/*
|
||||||
* Fungi
|
* Fungi
|
||||||
|
|||||||
+13
-2
@@ -852,6 +852,9 @@ unsigned trflags;
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case BEAR_TRAP:
|
case BEAR_TRAP:
|
||||||
|
{
|
||||||
|
int dmg = d(2, 4);
|
||||||
|
|
||||||
if ((Levitation || Flying) && !forcetrap) break;
|
if ((Levitation || Flying) && !forcetrap) break;
|
||||||
feeltrap(trap);
|
feeltrap(trap);
|
||||||
if(amorphous(youmonst.data) || is_whirly(youmonst.data) ||
|
if(amorphous(youmonst.data) || is_whirly(youmonst.data) ||
|
||||||
@@ -876,6 +879,8 @@ unsigned trflags;
|
|||||||
pline("%s bear trap closes on %s %s!",
|
pline("%s bear trap closes on %s %s!",
|
||||||
A_Your[trap->madeby_u], s_suffix(mon_nam(u.usteed)),
|
A_Your[trap->madeby_u], s_suffix(mon_nam(u.usteed)),
|
||||||
mbodypart(u.usteed, FOOT));
|
mbodypart(u.usteed, FOOT));
|
||||||
|
if (thitm(0, u.usteed, (struct obj *)0, dmg, FALSE))
|
||||||
|
u.utrap = 0; /* steed died, hero not trapped */
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -883,9 +888,11 @@ unsigned trflags;
|
|||||||
A_Your[trap->madeby_u], body_part(FOOT));
|
A_Your[trap->madeby_u], body_part(FOOT));
|
||||||
if(u.umonnum == PM_OWLBEAR || u.umonnum == PM_BUGBEAR)
|
if(u.umonnum == PM_OWLBEAR || u.umonnum == PM_BUGBEAR)
|
||||||
You("howl in anger!");
|
You("howl in anger!");
|
||||||
|
losehp(Maybe_Half_Phys(dmg), "bear trap", KILLED_BY_AN);
|
||||||
}
|
}
|
||||||
exercise(A_DEX, FALSE);
|
exercise(A_DEX, FALSE);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case SLP_GAS_TRAP:
|
case SLP_GAS_TRAP:
|
||||||
seetrap(trap);
|
seetrap(trap);
|
||||||
@@ -2055,6 +2062,9 @@ register struct monst *mtmp;
|
|||||||
seetrap(trap);
|
seetrap(trap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (mtmp->mtrapped)
|
||||||
|
trapkilled = thitm(0, mtmp, (struct obj *)0,
|
||||||
|
d(2, 4), FALSE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLP_GAS_TRAP:
|
case SLP_GAS_TRAP:
|
||||||
@@ -2365,8 +2375,9 @@ glovecheck: target = which_armor(mtmp, W_ARMG);
|
|||||||
case ANTI_MAGIC:
|
case ANTI_MAGIC:
|
||||||
/* similar to hero's case, more or less */
|
/* similar to hero's case, more or less */
|
||||||
if (!resists_magm(mtmp)) { /* lose spell energy */
|
if (!resists_magm(mtmp)) { /* lose spell energy */
|
||||||
if (attacktype(mptr, AT_MAGC) ||
|
if (!mtmp->mcan &&
|
||||||
attacktype(mptr, AT_BREA)) {
|
(attacktype(mptr, AT_MAGC) ||
|
||||||
|
attacktype(mptr, AT_BREA))) {
|
||||||
mtmp->mspec_used += d(2, 2);
|
mtmp->mspec_used += d(2, 2);
|
||||||
if (in_sight) {
|
if (in_sight) {
|
||||||
seetrap(trap);
|
seetrap(trap);
|
||||||
|
|||||||
Reference in New Issue
Block a user