using ':' to look at current location could cause a crash
when items were on the floor just inside a shop's door where the shopkeeper
doesn't buy and sell stuff, those items showed a 'for sale' price
+separate most of domove() into domove_core() and introduce a pair of global
+ variables that allow for assessment of domove_core() results in
+ domove() after one of the many return paths
+new domove()-related global variables mentioned above also replace a couple
+ of booleans in rhack() that were used for similar upcoming action
+ identification
+smudging of an engraving has been relocated and follows domove_core() and is
+ carried out only after a successful move attempt; your former
+ location and resulting location are both potentially impacted now
tty: turn off an optimization that is the suspected cause of Windows reported
partial status lines following level changes
tty: ensure that current status fields are always copied to prior status
uchar mvflags;
} mvitals[NUMMONS];
+E NEARDATA long domove_attempting;
+E NEARDATA long domove_succeeded;
+#define DOMOVE_WALK 0x00000001
+#define DOMOVE_RUSH 0x00000002
+
E NEARDATA struct c_color_names {
const char *const c_black, *const c_amber, *const c_golden,
*const c_light_blue, *const c_red, *const c_green, *const c_silver,
register char *cmd;
{
int spkey;
- boolean do_walk, do_rush, prefix_seen, bad_command,
+ boolean prefix_seen, bad_command,
firsttime = (cmd == 0);
iflags.menu_requested = FALSE;
}
/* handle most movement commands */
- do_walk = do_rush = prefix_seen = FALSE;
+ prefix_seen = FALSE;
context.travel = context.travel1 = 0;
spkey = ch2spkeys(*cmd, NHKF_RUN, NHKF_CLICKLOOK);
case NHKF_RUSH:
if (movecmd(cmd[1])) {
context.run = 2;
- do_rush = TRUE;
+ domove_attempting |= DOMOVE_RUSH;
} else
prefix_seen = TRUE;
break;
case NHKF_RUN:
if (movecmd(lowc(cmd[1]))) {
context.run = 3;
- do_rush = TRUE;
+ domove_attempting |= DOMOVE_RUSH;
} else
prefix_seen = TRUE;
break;
case NHKF_FIGHT:
if (movecmd(cmd[1])) {
context.forcefight = 1;
- do_walk = TRUE;
+ domove_attempting |= DOMOVE_WALK;
} else
prefix_seen = TRUE;
break;
context.run = 0;
context.nopick = 1;
if (!u.dz)
- do_walk = TRUE;
+ domove_attempting |= DOMOVE_WALK;
else
cmd[0] = cmd[1]; /* "m<" or "m>" */
} else
if (movecmd(lowc(cmd[1]))) {
context.run = 1;
context.nopick = 1;
- do_rush = TRUE;
+ domove_attempting |= DOMOVE_RUSH;
} else
prefix_seen = TRUE;
break;
context.travel1 = 1;
context.run = 8;
context.nopick = 1;
- do_rush = TRUE;
+ domove_attempting |= DOMOVE_RUSH;
break;
}
/*FALLTHRU*/
default:
if (movecmd(*cmd)) { /* ordinary movement */
context.run = 0; /* only matters here if it was 8 */
- do_walk = TRUE;
+ domove_attempting |= DOMOVE_WALK;
} else if (movecmd(Cmd.num_pad ? unmeta(*cmd) : lowc(*cmd))) {
context.run = 1;
- do_rush = TRUE;
+ domove_attempting |= DOMOVE_RUSH;
} else if (movecmd(unctrl(*cmd))) {
context.run = 3;
- do_rush = TRUE;
+ domove_attempting |= DOMOVE_RUSH;
}
break;
}
}
}
- if ((do_walk || do_rush) && !context.travel && !dxdy_moveok()) {
+ if (((domove_attempting & (DOMOVE_RUSH | DOMOVE_WALK)) != 0L)
+ && !context.travel && !dxdy_moveok()) {
/* trying to move diagonally as a grid bug;
this used to be treated by movecmd() as not being
a movement attempt, but that didn't provide for any
return;
}
- if (do_walk) {
+ if ((domove_attempting & DOMOVE_WALK) != 0L) {
if (multi)
context.mv = TRUE;
domove();
context.forcefight = 0;
return;
- } else if (do_rush) {
+ } else if ((domove_attempting & DOMOVE_RUSH) != 0L) {
if (firsttime) {
if (!multi)
multi = max(COLNO, ROWNO);
NEARDATA struct monst *migrating_mons = (struct monst *) 0;
NEARDATA struct mvitals mvitals[NUMMONS];
+NEARDATA long domove_attempting = 0L;
+NEARDATA long domove_succeeded = 0L;
NEARDATA struct c_color_names c_color_names = {
"black", "amber", "golden", "light blue", "red", "green",
(char *) 0, (char *) 0, (char *) 0,
(char *) 0, (char *) 0, (char *) 0,
(char *) 0 };
-
+
#ifdef PREFIXES_IN_USE
char *fqn_prefix_names[PREFIX_COUNT] = {
"hackdir", "leveldir", "savedir", "bonesdir", "datadir",
STATIC_DCL struct monst *FDECL(monstinroom, (struct permonst *, int));
STATIC_DCL boolean FDECL(doorless_door, (int, int));
STATIC_DCL void FDECL(move_update, (BOOLEAN_P));
+STATIC_DCL void FDECL(maybe_smudge_engr, (int, int, int, int));
+STATIC_DCL void NDECL(domove_core);
#define IS_SHOP(x) (rooms[x].rtype >= SHOPBASE)
void
domove()
+{
+ int ux1 = u.ux, uy1 = u.uy;
+
+ domove_succeeded = 0L;
+ domove_core();
+ /* domove_succeeded is available for making assessments now */
+ if ((domove_succeeded & (DOMOVE_RUSH | DOMOVE_WALK)) != 0)
+ maybe_smudge_engr(ux1, uy1, u.ux, u.uy);
+ domove_attempting = 0L;
+}
+
+void
+domove_core()
{
register struct monst *mtmp;
register struct rm *tmpr;
int bc_control = 0; /* control for ball&chain */
boolean cause_delay = FALSE; /* dragging ball will skip a move */
- u_wipe_engr(rnd(5));
-
if (context.travel) {
if (!findtravelpath(FALSE))
(void) findtravelpath(TRUE);
check_leash(u.ux0, u.uy0);
if (u.ux0 != u.ux || u.uy0 != u.uy) {
+ /* let caller know so that an evaluation may take place */
+ domove_succeeded |= (domove_attempting & (DOMOVE_RUSH | DOMOVE_WALK));
u.umoved = TRUE;
/* Clean old position -- vision_recalc() will print our new one. */
newsym(u.ux0, u.uy0);
}
}
+void
+maybe_smudge_engr(x1,y1,x2,y2)
+int x1, y1, x2, y2;
+{
+ struct engr *ep;
+
+ if (can_reach_floor(TRUE)) {
+ if ((ep = engr_at(x1, y1)) && ep->engr_type != HEADSTONE)
+ wipe_engr_at(x1, y1, rnd(5), FALSE);
+ if ((x2 != x1 || y2 != y1)
+ && (ep = engr_at(x2, y2)) && ep->engr_type != HEADSTONE)
+ wipe_engr_at(x2, y2, rnd(5), FALSE);
+ }
+}
+
/* combat increases metabolism */
boolean
overexertion()