diff --git a/doc/fixes36.2 b/doc/fixes36.2 index d5ba86533..517cd1a09 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -405,6 +405,15 @@ when engulfed while in a shop, dropping an item into the engulfer and then 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 diff --git a/include/context.h b/include/context.h index 6209a5e82..6000b815e 100644 --- a/include/context.h +++ b/include/context.h @@ -117,6 +117,10 @@ struct context_info { int rndencode; /* randomized escape sequence introducer */ long next_attrib_check; /* next attribute check */ long stethoscope_move; + long domove_attempting; + long domove_succeeded; +#define DOMOVE_WALK 0x00000001 +#define DOMOVE_RUSH 0x00000002 short stethoscope_movement; boolean travel; /* find way automatically to u.tx,u.ty */ boolean travel1; /* first travel step */ diff --git a/include/decl.h b/include/decl.h index 57531841d..48ae8bc51 100644 --- a/include/decl.h +++ b/include/decl.h @@ -1182,3 +1182,5 @@ E const struct const_globals cg; #undef E #endif /* DECL_H */ + + diff --git a/src/allmain.c b/src/allmain.c index 21242e845..1e308590d 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -579,6 +579,7 @@ newgame() g.context.botlx = 1; g.context.ident = 1; g.context.stethoscope_move = -1L; + g.context.domove_attempting = 0L; g.context.warnlevel = 1; g.context.next_attrib_check = 600L; /* arbitrary first setting */ g.context.tribute.enabled = TRUE; /* turn on 3.6 tributes */ diff --git a/src/cmd.c b/src/cmd.c index 709a8c0f0..598d43468 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -4523,7 +4523,7 @@ rhack(cmd) 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; @@ -4554,7 +4554,7 @@ register char *cmd; } /* handle most movement commands */ - do_walk = do_rush = prefix_seen = FALSE; + prefix_seen = FALSE; g.context.travel = g.context.travel1 = 0; spkey = ch2spkeys(*cmd, NHKF_RUN, NHKF_CLICKLOOK); @@ -4562,7 +4562,7 @@ register char *cmd; case NHKF_RUSH: if (movecmd(cmd[1])) { g.context.run = 2; - do_rush = TRUE; + g.context.domove_attempting |= DOMOVE_RUSH; } else prefix_seen = TRUE; break; @@ -4573,7 +4573,7 @@ register char *cmd; case NHKF_RUN: if (movecmd(lowc(cmd[1]))) { g.context.run = 3; - do_rush = TRUE; + g.context.domove_attempting |= DOMOVE_RUSH; } else prefix_seen = TRUE; break; @@ -4589,7 +4589,7 @@ register char *cmd; case NHKF_FIGHT: if (movecmd(cmd[1])) { g.context.forcefight = 1; - do_walk = TRUE; + g.context.domove_attempting |= DOMOVE_WALK; } else prefix_seen = TRUE; break; @@ -4598,7 +4598,7 @@ register char *cmd; g.context.run = 0; g.context.nopick = 1; if (!u.dz) - do_walk = TRUE; + g.context.domove_attempting |= DOMOVE_WALK; else cmd[0] = cmd[1]; /* "m<" or "m>" */ } else @@ -4608,7 +4608,7 @@ register char *cmd; if (movecmd(lowc(cmd[1]))) { g.context.run = 1; g.context.nopick = 1; - do_rush = TRUE; + g.context.domove_attempting |= DOMOVE_RUSH; } else prefix_seen = TRUE; break; @@ -4631,20 +4631,20 @@ register char *cmd; g.context.travel1 = 1; g.context.run = 8; g.context.nopick = 1; - do_rush = TRUE; + g.context.domove_attempting |= DOMOVE_RUSH; break; } /*FALLTHRU*/ default: if (movecmd(*cmd)) { /* ordinary movement */ g.context.run = 0; /* only matters here if it was 8 */ - do_walk = TRUE; + g.context.domove_attempting |= DOMOVE_WALK; } else if (movecmd(g.Cmd.num_pad ? unmeta(*cmd) : lowc(*cmd))) { g.context.run = 1; - do_rush = TRUE; + g.context.domove_attempting |= DOMOVE_RUSH; } else if (movecmd(unctrl(*cmd))) { g.context.run = 3; - do_rush = TRUE; + g.context.domove_attempting |= DOMOVE_RUSH; } break; } @@ -4662,7 +4662,8 @@ register char *cmd; } } - if ((do_walk || do_rush) && !g.context.travel && !dxdy_moveok()) { + if (((g.context.domove_attempting & (DOMOVE_RUSH | DOMOVE_WALK)) != 0L) + && !g.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 @@ -4676,13 +4677,13 @@ register char *cmd; return; } - if (do_walk) { + if ((g.context.domove_attempting & DOMOVE_WALK) != 0L) { if (g.multi) g.context.mv = TRUE; domove(); g.context.forcefight = 0; return; - } else if (do_rush) { + } else if ((g.context.domove_attempting & DOMOVE_RUSH) != 0L) { if (firsttime) { if (!g.multi) g.multi = max(COLNO, ROWNO); diff --git a/src/decl.c b/src/decl.c index 4466d9202..75a05dfcb 100644 --- a/src/decl.c +++ b/src/decl.c @@ -105,7 +105,7 @@ const char *materialnm[] = { "mysterious", "liquid", "wax", "organic", /* Global windowing data, defined here for multi-window-system support */ NEARDATA winid WIN_MESSAGE, WIN_STATUS, WIN_MAP, WIN_INVEN; - + #ifdef PREFIXES_IN_USE const char *fqn_prefix_names[PREFIX_COUNT] = { "hackdir", "leveldir", "savedir", "bonesdir", "datadir", diff --git a/src/hack.c b/src/hack.c index 10d5336a7..7e1df0bc8 100644 --- a/src/hack.c +++ b/src/hack.c @@ -16,6 +16,8 @@ STATIC_DCL boolean FDECL(trapmove, (int, int, struct trap *)); 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) (g.rooms[x].rtype >= SHOPBASE) @@ -1327,6 +1329,19 @@ u_rooted() void domove() +{ + int ux1 = u.ux, uy1 = u.uy; + + g.context.domove_succeeded = 0L; + domove_core(); + /* g.context.domove_succeeded is available to make assessments now */ + if ((g.context.domove_succeeded & (DOMOVE_RUSH | DOMOVE_WALK)) != 0) + maybe_smudge_engr(ux1, uy1, u.ux, u.uy); + g.context.domove_attempting = 0L; +} + +void +domove_core() { register struct monst *mtmp; register struct rm *tmpr; @@ -1339,8 +1354,6 @@ domove() int bc_control = 0; /* control for ball&chain */ boolean cause_delay = FALSE; /* dragging ball will skip a move */ - u_wipe_engr(rnd(5)); - if (g.context.travel) { if (!findtravelpath(FALSE)) (void) findtravelpath(TRUE); @@ -1858,6 +1871,9 @@ domove() 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 */ + g.context.domove_succeeded |= + (g.context.domove_attempting & (DOMOVE_RUSH | DOMOVE_WALK)); u.umoved = TRUE; /* Clean old position -- vision_recalc() will print our new one. */ newsym(u.ux0, u.uy0); @@ -1897,6 +1913,21 @@ domove() } } +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()