From aac603a446ec73170efb35c7aca5688928a39d87 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Thu, 19 Jul 2007 08:20:20 +0000 Subject: [PATCH] more F move (trunk only) Using F prefix when trying to move into a wall or closed door yielded "you attack thin air". Like the recently fixed F-vs-boulder case, give more appropriate feedback. Also like F-vs-boulder, initiate digging if wielding a pick-axe. (Also handles axes versus trees and closed doors). One thing which isn't handled but possibly should be: F vs closed door when not wielding a pick or other axe might attempt to force the door. (Right now it gives "you harmlessly attack the door".) --- doc/fixes35.0 | 2 +- include/extern.h | 1 + src/dig.c | 9 ++++++--- src/hack.c | 19 ++++++++++++++----- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 72f846472..afefe3f9d 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -370,7 +370,7 @@ C and #name commands are now same and use menu to choose monster vs object 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 diff --git a/include/extern.h b/include/extern.h index 094193712..8fc407724 100644 --- a/include/extern.h +++ b/include/extern.h @@ -259,6 +259,7 @@ E void NDECL(sokoban_detect); /* ### dig.c ### */ +E int FDECL(dig_typ, (struct obj *,XCHAR_P,XCHAR_P)); E boolean NDECL(is_digging); #ifdef USE_TRAMPOLI E int NDECL(dig); diff --git a/src/dig.c b/src/dig.c index c7253d628..c565918d0 100644 --- a/src/dig.c +++ b/src/dig.c @@ -11,7 +11,6 @@ static NEARDATA boolean did_dig_msg; 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 *)); @@ -129,12 +128,16 @@ register boolean rockit; } /* When digging into location , 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 : diff --git a/src/hack.c b/src/hack.c index 82211bf4e..09a11eda4 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1204,7 +1204,8 @@ domove() /* 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]; @@ -1215,15 +1216,22 @@ domove() (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)) @@ -1231,7 +1239,8 @@ domove() 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 */