diff --git a/include/context.h b/include/context.h index 6a257cbae..a5ba46b80 100644 --- a/include/context.h +++ b/include/context.h @@ -129,9 +129,9 @@ struct achievement_tracking { struct context_info { unsigned ident; /* social security number for each monster */ unsigned no_of_wizards; /* 0, 1 or 2 (wizard and his shadow) */ - unsigned run; /* 0: h (etc), 1: H (etc), 2: fh (etc) */ - /* 3: FH, 4: ff+, 5: ff-, 6: FF+, 7: FF- */ - /* 8: travel */ + unsigned run; /* 0: h (etc), 1: H (etc), 2: fh (etc), + * 3: FH, 4: ff+, 5: ff-, 6: FF+, 7: FF-, + * 8: travel */ unsigned startingpet_mid; /* monster id number for initial pet */ int current_fruit; /* fruit->fid corresponding to gp.pl_fruit[] */ int mysteryforce; /* adjusts how often "mysterious force" kicks in */ diff --git a/include/decl.h b/include/decl.h index 4af60b455..4682ca49d 100644 --- a/include/decl.h +++ b/include/decl.h @@ -777,6 +777,11 @@ struct instance_globals_b { /* files.c */ char bones[BONESSIZE]; + /* hack.c */ + unsigned bldrpush_oid; /* id of last boulder pushed */ + long bldrpushtime; /* turn that a message was given for pushing + * a boulder; used in lieu of Norep() */ + /* mkmaze.c */ lev_region bughack; /* for preserving the insect legs when wallifying * baalz level */ diff --git a/src/decl.c b/src/decl.c index f5a69ef92..1ac558e41 100644 --- a/src/decl.c +++ b/src/decl.c @@ -232,6 +232,9 @@ const struct instance_globals_b g_init_b = { UNDEFINED_PTR, /* branches */ /* files.c */ BONESINIT, /* bones */ + /* hack.c */ + 0U, /* bldrpush_oid - last boulder pushed */ + 0L, /* bldrpushtime - turn message was given about pushing that boulder */ /* mkmaze.c */ { {COLNO, ROWNO, 0, 0}, {COLNO, ROWNO, 0, 0}, FALSE, FALSE, 0, 0, { 0 } }, /* bughack */ diff --git a/src/hack.c b/src/hack.c index 636ee7ab3..2b3f14d5a 100644 --- a/src/hack.c +++ b/src/hack.c @@ -414,22 +414,33 @@ moverock(void) } { - /* note: reset to zero after save/restore cycle */ - static NEARDATA long lastmovetime; + boolean givemesg, easypush; dopush: - what = the(xname(otmp)); + /* give boulder pushing feedback if this is a different + boulder than the last one pushed or if it's been at + least 2 turns since we last pushed this boulder; + unlike with Norep(), intervening messages don't cause + it to repeat, only doing something else in the meantime */ + if (otmp->o_id != gb.bldrpush_oid) { + gb.bldrpushtime = gm.moves + 1L; + gb.bldrpush_oid = otmp->o_id; + } + givemesg = (gm.moves > gb.bldrpushtime + 2L + || gm.moves < gb.bldrpushtime); + what = givemesg ? the(xname(otmp)) : 0; if (!u.usteed) { - /* FIXME: also remember boulder->o_id and override - lastmovetime if this is a different boulder */ - if (gm.moves > lastmovetime + 2 || gm.moves < lastmovetime) + easypush = throws_rocks(gy.youmonst.data); + if (givemesg) pline("With %s effort you move %s.", - throws_rocks(gy.youmonst.data) ? "little" - : "great", - what); - exercise(A_STR, TRUE); - } else - pline("%s moves %s.", upstart(y_monnam(u.usteed)), what); - lastmovetime = gm.moves; + easypush ? "little" : "great", what); + if (!easypush) + exercise(A_STR, TRUE); + } else { + if (givemesg) + pline("%s moves %s.", + upstart(y_monnam(u.usteed)), what); + } + gb.bldrpushtime = gm.moves; } /* Move the boulder *after* the message. */