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".)
This commit is contained in:
nethack.rankin
2007-07-19 08:20:20 +00:00
parent 16ad2bd0b8
commit aac603a446
4 changed files with 22 additions and 9 deletions
+1 -1
View File
@@ -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 hallucination provides partial protection against gaze attacks
attempting to read "dull" spellbook might cause hero to fall asleep attempting to read "dull" spellbook might cause hero to fall asleep
dipping prompt is more precise 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 Platform- and/or Interface-Specific New Features
+1
View File
@@ -259,6 +259,7 @@ E void NDECL(sokoban_detect);
/* ### dig.c ### */ /* ### dig.c ### */
E int FDECL(dig_typ, (struct obj *,XCHAR_P,XCHAR_P));
E boolean NDECL(is_digging); E boolean NDECL(is_digging);
#ifdef USE_TRAMPOLI #ifdef USE_TRAMPOLI
E int NDECL(dig); E int NDECL(dig);
+6 -3
View File
@@ -11,7 +11,6 @@ static NEARDATA boolean did_dig_msg;
STATIC_DCL boolean NDECL(rm_waslit); STATIC_DCL boolean NDECL(rm_waslit);
STATIC_DCL void FDECL(mkcavepos, (XCHAR_P,XCHAR_P,int,BOOLEAN_P,BOOLEAN_P)); STATIC_DCL void FDECL(mkcavepos, (XCHAR_P,XCHAR_P,int,BOOLEAN_P,BOOLEAN_P));
STATIC_DCL void FDECL(mkcavearea, (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 int NDECL(dig);
STATIC_DCL void FDECL(dig_up_grave, (coord *)); STATIC_DCL void FDECL(dig_up_grave, (coord *));
STATIC_DCL int FDECL(adj_pit_checks, (coord *,char *)); STATIC_DCL int FDECL(adj_pit_checks, (coord *,char *));
@@ -129,12 +128,16 @@ register boolean rockit;
} }
/* When digging into location <x,y>, what are you actually digging into? */ /* When digging into location <x,y>, what are you actually digging into? */
STATIC_OVL int int
dig_typ(otmp, x, y) dig_typ(otmp, x, y)
struct obj *otmp; struct obj *otmp;
xchar x, y; 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 : return (ispick && sobj_at(STATUE, x, y) ? DIGTYP_STATUE :
ispick && sobj_at(BOULDER, x, y) ? DIGTYP_BOULDER : ispick && sobj_at(BOULDER, x, y) ? DIGTYP_BOULDER :
+14 -5
View File
@@ -1204,7 +1204,8 @@ domove()
/* remembered an 'I' && didn't use a move command */ /* remembered an 'I' && didn't use a move command */
(glyph_is_invisible(levl[x][y].glyph) && !context.nopick)) { (glyph_is_invisible(levl[x][y].glyph) && !context.nopick)) {
struct obj *boulder = sobj_at(BOULDER, x, y); 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 */ int glyph = glyph_at(x, y); /* might be monster */
char buf[BUFSZ]; char buf[BUFSZ];
@@ -1215,15 +1216,22 @@ domove()
(Hallucination && glyph_is_monster(glyph))) (Hallucination && glyph_is_monster(glyph)))
boulder = sobj_at(STATUE, x, y); boulder = sobj_at(STATUE, x, y);
/* force fight at boulder (or statue) while wielding pick: /* force fight at boulder/statue or wall/door while wielding
start digging to break the boulder (or statue) */ pick: start digging to break the boulder or wall */
if (boulder && context.forcefight && uwep && is_pick(uwep)) { 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); (void)use_pick_axe2(uwep);
return; return;
} }
if (boulder) if (boulder)
Strcpy(buf, ansimpleoname(boulder)); Strcpy(buf, ansimpleoname(boulder));
else if (solid)
Strcpy(buf, the(defsyms[glyph_to_cmap(glyph)].explanation));
else if (!Underwater) else if (!Underwater)
Strcpy(buf, "thin air"); Strcpy(buf, "thin air");
else if (is_pool(x, y)) else if (is_pool(x, y))
@@ -1231,7 +1239,8 @@ domove()
else /* Underwater, targetting non-water */ else /* Underwater, targetting non-water */
Sprintf(buf, "a vacant spot on the %s", surface(x,y)); Sprintf(buf, "a vacant spot on the %s", surface(x,y));
You("%s%s %s.", You("%s%s %s.",
!boulder ? "" : !explo ? "harmlessly " : "futilely ", !(boulder || solid) ? "" :
!explo ? "harmlessly " : "futilely ",
explo ? "explode at" : "attack", explo ? "explode at" : "attack",
buf); buf);
unmap_object(x, y); /* known empty -- remove 'I' if present */ unmap_object(x, y); /* known empty -- remove 'I' if present */