hallucination provides partial protection against gaze attacks
attempting to read "dull" spellbook might cause hero to fall asleep
dipping prompt is more precise
-using F to attack boulder or statue while wielding pick digs/breaks target
+using F to attack wall/boulder/statue while wielding pick digs/breaks target
Platform- and/or Interface-Specific New Features
STATIC_DCL boolean NDECL(rm_waslit);
STATIC_DCL void FDECL(mkcavepos, (XCHAR_P,XCHAR_P,int,BOOLEAN_P,BOOLEAN_P));
STATIC_DCL void FDECL(mkcavearea, (BOOLEAN_P));
-STATIC_DCL int FDECL(dig_typ, (struct obj *,XCHAR_P,XCHAR_P));
STATIC_DCL int NDECL(dig);
STATIC_DCL void FDECL(dig_up_grave, (coord *));
STATIC_DCL int FDECL(adj_pit_checks, (coord *,char *));
}
/* When digging into location <x,y>, what are you actually digging into? */
-STATIC_OVL int
+int
dig_typ(otmp, x, y)
struct obj *otmp;
xchar x, y;
{
- boolean ispick = is_pick(otmp);
+ boolean ispick;
+
+ if (!otmp) return DIGTYP_UNDIGGABLE;
+ ispick = is_pick(otmp);
+ if (!ispick && !is_axe(otmp)) return DIGTYP_UNDIGGABLE;
return (ispick && sobj_at(STATUE, x, y) ? DIGTYP_STATUE :
ispick && sobj_at(BOULDER, x, y) ? DIGTYP_BOULDER :
/* remembered an 'I' && didn't use a move command */
(glyph_is_invisible(levl[x][y].glyph) && !context.nopick)) {
struct obj *boulder = sobj_at(BOULDER, x, y);
- boolean explo = (Upolyd && attacktype(youmonst.data, AT_EXPL));
+ boolean explo = (Upolyd && attacktype(youmonst.data, AT_EXPL)),
+ solid = !accessible(x, y);
int glyph = glyph_at(x, y); /* might be monster */
char buf[BUFSZ];
(Hallucination && glyph_is_monster(glyph)))
boulder = sobj_at(STATUE, x, y);
- /* force fight at boulder (or statue) while wielding pick:
- start digging to break the boulder (or statue) */
- if (boulder && context.forcefight && uwep && is_pick(uwep)) {
+ /* force fight at boulder/statue or wall/door while wielding
+ pick: start digging to break the boulder or wall */
+ if (context.forcefight &&
+ /* can we dig? */
+ uwep && dig_typ(uwep, x, y) &&
+ /* should we dig? */
+ !glyph_is_invisible(glyph) &&
+ !glyph_is_monster(glyph)) {
(void)use_pick_axe2(uwep);
return;
}
if (boulder)
Strcpy(buf, ansimpleoname(boulder));
+ else if (solid)
+ Strcpy(buf, the(defsyms[glyph_to_cmap(glyph)].explanation));
else if (!Underwater)
Strcpy(buf, "thin air");
else if (is_pool(x, y))
else /* Underwater, targetting non-water */
Sprintf(buf, "a vacant spot on the %s", surface(x,y));
You("%s%s %s.",
- !boulder ? "" : !explo ? "harmlessly " : "futilely ",
+ !(boulder || solid) ? "" :
+ !explo ? "harmlessly " : "futilely ",
explo ? "explode at" : "attack",
buf);
unmap_object(x, y); /* known empty -- remove 'I' if present */