Unify web burning or dissolving
Also make any flaming monster burn webs. This also fixes a bug, where a gelatinous cube monster did not dissolve the web.
This commit is contained in:
85
src/trap.c
85
src/trap.c
@@ -793,6 +793,52 @@ struct obj *objchn, *saddle;
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* monster or you go through and possibly destroy a web.
|
||||||
|
mtmp == NULL == you.
|
||||||
|
return TRUE if could go through. */
|
||||||
|
boolean
|
||||||
|
mu_maybe_destroy_web(mtmp, domsg, trap)
|
||||||
|
struct monst *mtmp;
|
||||||
|
boolean domsg;
|
||||||
|
struct trap *trap;
|
||||||
|
{
|
||||||
|
boolean isyou = !mtmp;
|
||||||
|
struct permonst *mptr = isyou ? youmonst.data : mtmp->data;
|
||||||
|
boolean gelcube = isyou ? (u.umonnum == PM_GELATINOUS_CUBE)
|
||||||
|
: (mptr == &mons[PM_GELATINOUS_CUBE]);
|
||||||
|
if (amorphous(mptr) || is_whirly(mptr) || flaming(mptr)
|
||||||
|
|| unsolid(mptr) || gelcube) {
|
||||||
|
xchar x = trap->tx;
|
||||||
|
xchar y = trap->ty;
|
||||||
|
if (flaming(mptr) || acidic(mptr)) {
|
||||||
|
if (domsg) {
|
||||||
|
if (isyou)
|
||||||
|
You("%s %s spider web!",
|
||||||
|
(flaming(mptr)) ? "burn" : "dissolve",
|
||||||
|
a_your[trap->madeby_u]);
|
||||||
|
else
|
||||||
|
pline("%s %s %s spider web!", Monnam(mtmp),
|
||||||
|
(flaming(mptr)) ? "burns" : "dissolves",
|
||||||
|
a_your[trap->madeby_u]);
|
||||||
|
}
|
||||||
|
deltrap(trap);
|
||||||
|
newsym(x, y);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (domsg) {
|
||||||
|
if (isyou)
|
||||||
|
You("flow through %s spider web.", a_your[trap->madeby_u]);
|
||||||
|
else {
|
||||||
|
pline("%s flows through %s spider web.", Monnam(mtmp),
|
||||||
|
a_your[trap->madeby_u]);
|
||||||
|
seetrap(trap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
dotrap(trap, trflags)
|
dotrap(trap, trflags)
|
||||||
register struct trap *trap;
|
register struct trap *trap;
|
||||||
@@ -1197,23 +1243,8 @@ unsigned trflags;
|
|||||||
|
|
||||||
case WEB: /* Our luckless player has stumbled into a web. */
|
case WEB: /* Our luckless player has stumbled into a web. */
|
||||||
feeltrap(trap);
|
feeltrap(trap);
|
||||||
if (amorphous(youmonst.data) || is_whirly(youmonst.data)
|
if (mu_maybe_destroy_web(NULL, webmsgok, trap))
|
||||||
|| unsolid(youmonst.data)) {
|
|
||||||
if (acidic(youmonst.data) || u.umonnum == PM_GELATINOUS_CUBE
|
|
||||||
|| u.umonnum == PM_FIRE_ELEMENTAL) {
|
|
||||||
if (webmsgok)
|
|
||||||
You("%s %s spider web!",
|
|
||||||
(u.umonnum == PM_FIRE_ELEMENTAL) ? "burn"
|
|
||||||
: "dissolve",
|
|
||||||
a_your[trap->madeby_u]);
|
|
||||||
deltrap(trap);
|
|
||||||
newsym(u.ux, u.uy);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (webmsgok)
|
|
||||||
You("flow through %s spider web.", a_your[trap->madeby_u]);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
if (webmaker(youmonst.data)) {
|
if (webmaker(youmonst.data)) {
|
||||||
if (webmsgok)
|
if (webmsgok)
|
||||||
pline(trap->madeby_u ? "You take a walk on your web."
|
pline(trap->madeby_u ? "You take a walk on your web."
|
||||||
@@ -2412,28 +2443,8 @@ register struct monst *mtmp;
|
|||||||
/* Monster in a web. */
|
/* Monster in a web. */
|
||||||
if (webmaker(mptr))
|
if (webmaker(mptr))
|
||||||
break;
|
break;
|
||||||
if (amorphous(mptr) || is_whirly(mptr) || unsolid(mptr)) {
|
if (mu_maybe_destroy_web(mtmp, in_sight, trap))
|
||||||
if (acidic(mptr) || mptr == &mons[PM_GELATINOUS_CUBE]
|
|
||||||
|| mptr == &mons[PM_FIRE_ELEMENTAL]
|
|
||||||
|| mptr == &mons[PM_FIRE_VORTEX]) {
|
|
||||||
if (in_sight)
|
|
||||||
pline("%s %s %s spider web!", Monnam(mtmp),
|
|
||||||
(mptr == &mons[PM_FIRE_ELEMENTAL]
|
|
||||||
|| mptr == &mons[PM_FIRE_VORTEX])
|
|
||||||
? "burns"
|
|
||||||
: "dissolves",
|
|
||||||
a_your[trap->madeby_u]);
|
|
||||||
deltrap(trap);
|
|
||||||
newsym(mtmp->mx, mtmp->my);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (in_sight) {
|
|
||||||
pline("%s flows through %s spider web.", Monnam(mtmp),
|
|
||||||
a_your[trap->madeby_u]);
|
|
||||||
seetrap(trap);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
tear_web = FALSE;
|
tear_web = FALSE;
|
||||||
switch (monsndx(mptr)) {
|
switch (monsndx(mptr)) {
|
||||||
case PM_OWLBEAR: /* Eric Backus */
|
case PM_OWLBEAR: /* Eric Backus */
|
||||||
|
|||||||
Reference in New Issue
Block a user