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:
+1
-1
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
@@ -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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user