fix github issue #614 - applying polearm at doors

Reported by G7Nation; attacking walls and such with a polearm just
gave lackluster "you miss; nobody's there" feedback.

Make applying a polearm at some non-monster locations give feedback
similar to using 'F'orcefight with melee weapons.  Was
|You miss; there is no one there to hit.
now
|You uselessly attack the closed door.

Also, extend the supported locations to include dungeon furniture.
Was
|You attack thin air. ('F')
now
|You harmlessly attack the throne. ('F')
|You uselessly attack the throne. ('a')

This doesn't address #613:  attempting to hit non-visible locations
with an applied polearm.

Closes #614
This commit is contained in:
PatR
2021-10-24 10:06:30 -07:00
parent 0ea7e7aef4
commit 6edadc4884
3 changed files with 32 additions and 10 deletions

View File

@@ -658,6 +658,8 @@ melting ice timer could persist after the ice was gone from digging or from an
using 'F'orcefight against iron bars while wielding something breakable could using 'F'orcefight against iron bars while wielding something breakable could
yield erratic outcome because non-deterministic breaktest() was being yield erratic outcome because non-deterministic breaktest() was being
called twice and could yield results that conflicted 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 Fixes to 3.7.0-x Problems that Were Exposed Via git Repository

View File

@@ -3054,6 +3054,7 @@ display_polearm_positions(int state)
static int static int
use_pole(struct obj *obj) 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; int res = 0, typ, max_range, min_range, glyph;
coord cc; coord cc;
struct monst *mtmp; struct monst *mtmp;
@@ -3067,8 +3068,7 @@ use_pole(struct obj *obj)
if (obj != uwep) { if (obj != uwep) {
if (!wield_tool(obj, "swing")) if (!wield_tool(obj, "swing"))
return 0; return 0;
else res = 1;
res = 1;
} }
/* assert(obj == uwep); */ /* assert(obj == uwep); */
@@ -3158,13 +3158,31 @@ use_pole(struct obj *obj)
Note: we only do this when a statue is displayed here, Note: we only do this when a statue is displayed here,
because the player is probably attempting to attack it; because the player is probably attempting to attack it;
other statues obscured by anything are just ignored. */ 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); wake_nearto(g.bhitpos.x, g.bhitpos.y, 25);
} }
} else { } else {
/* no monster here and no statue seen or remembered here */ /* no monster here and no statue seen or remembered here */
(void) unmap_invisible(g.bhitpos.x, g.bhitpos.y); (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 */ u_wipe_engr(2); /* same as for melee or throwing */
return 1; return 1;

View File

@@ -1815,7 +1815,7 @@ domove_core(void)
|| (glyph_is_invisible(glyph) && !g.context.nopick)) { || (glyph_is_invisible(glyph) && !g.context.nopick)) {
struct obj *boulder = 0; struct obj *boulder = 0;
boolean explo = (Upolyd && attacktype(g.youmonst.data, AT_EXPL)), 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]; char buf[BUFSZ];
if (!Underwater) { if (!Underwater) {
@@ -1859,15 +1859,17 @@ domove_core(void)
: "nothing"); : "nothing");
} else if (solid) { } else if (solid) {
/* glyph might indicate unseen terrain if hero is blind; /* glyph might indicate unseen terrain if hero is blind;
unlike searching, this won't reveal what that terrain is unlike searching, this won't reveal what that terrain is;
(except for solid rock, where the glyph would otherwise 3.7: used to say "solid rock" for the stone case, but that
yield ludicrous "dark part of a room") */ made it be different from unmapped walls outside of rooms */
Strcpy(buf, (levl[x][y].typ == STONE) ? "solid rock" Strcpy(buf, (levl[x][y].typ == STONE || levl[x][y].typ == SCORR)
? "stone"
: glyph_is_cmap(glyph) : glyph_is_cmap(glyph)
? the(defsyms[glyph_to_cmap(glyph)].explanation) ? the(defsyms[glyph_to_cmap(glyph)].explanation)
: (const char *) "an unknown obstacle"); : (const char *) "an unknown obstacle");
/* note: 'solid' is misleadingly named and catches pools /* 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 { } else {
Strcpy(buf, "thin air"); Strcpy(buf, "thin air");
} }