using 'F'orcefight against iron bars while wielding something breakable could
yield erratic outcome because non-deterministic breaktest() was being
called twice and could yield results that conflicted
+have applying a polearm give feedback similar to 'F' for melee weapon when
+ attacking a wall or boulder
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
static int
use_pole(struct obj *obj)
{
+ const char thump[] = "Thump! Your blow bounces harmlessly off the %s.";
int res = 0, typ, max_range, min_range, glyph;
coord cc;
struct monst *mtmp;
if (obj != uwep) {
if (!wield_tool(obj, "swing"))
return 0;
- else
- res = 1;
+ res = 1;
}
/* assert(obj == uwep); */
Note: we only do this when a statue is displayed here,
because the player is probably attempting to attack it;
other statues obscured by anything are just ignored. */
- pline("Thump! Your blow bounces harmlessly off the statue.");
+ pline(thump, "statue");
wake_nearto(g.bhitpos.x, g.bhitpos.y, 25);
}
} else {
/* no monster here and no statue seen or remembered here */
(void) unmap_invisible(g.bhitpos.x, g.bhitpos.y);
- You("miss; there is no one there to hit.");
+
+ if (glyph_to_obj(glyph) == BOULDER
+ && sobj_at(BOULDER, g.bhitpos.x, g.bhitpos.y)) {
+ pline(thump, "boulder");
+ wake_nearto(g.bhitpos.x, g.bhitpos.y, 25);
+ } else if (!accessible(g.bhitpos.x, g.bhitpos.y)
+ || IS_FURNITURE(levl[g.bhitpos.x][g.bhitpos.y].typ)) {
+ /* similar to 'F'orcefight with a melee weapon; we know that
+ the spot can be seen or we wouldn't have gotten this far */
+ You("uselessly attack %s.",
+ (levl[g.bhitpos.x][g.bhitpos.y].typ == STONE
+ || levl[g.bhitpos.x][g.bhitpos.y].typ == SCORR)
+ ? "stone"
+ : glyph_is_cmap(glyph)
+ ? the(defsyms[glyph_to_cmap(glyph)].explanation)
+ : (const char *) "an unknown obstacle");
+ } else {
+ You("miss; there is no one there to hit.");
+ }
}
u_wipe_engr(2); /* same as for melee or throwing */
return 1;
|| (glyph_is_invisible(glyph) && !g.context.nopick)) {
struct obj *boulder = 0;
boolean explo = (Upolyd && attacktype(g.youmonst.data, AT_EXPL)),
- solid = !accessible(x, y);
+ solid = (!accessible(x, y) || IS_FURNITURE(levl[x][y].typ));
char buf[BUFSZ];
if (!Underwater) {
: "nothing");
} else if (solid) {
/* glyph might indicate unseen terrain if hero is blind;
- unlike searching, this won't reveal what that terrain is
- (except for solid rock, where the glyph would otherwise
- yield ludicrous "dark part of a room") */
- Strcpy(buf, (levl[x][y].typ == STONE) ? "solid rock"
+ unlike searching, this won't reveal what that terrain is;
+ 3.7: used to say "solid rock" for the stone case, but that
+ made it be different from unmapped walls outside of rooms */
+ Strcpy(buf, (levl[x][y].typ == STONE || levl[x][y].typ == SCORR)
+ ? "stone"
: glyph_is_cmap(glyph)
? the(defsyms[glyph_to_cmap(glyph)].explanation)
: (const char *) "an unknown obstacle");
/* note: 'solid' is misleadingly named and catches pools
- of water and lava as well as rock and walls */
+ of water and lava as well as rock and walls;
+ 3.7: furniture too */
} else {
Strcpy(buf, "thin air");
}