From d43854f0f6bb8e9eea7fbce80348150e7e7fc34d Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 29 Jun 2017 08:46:29 -0400 Subject: [PATCH] Simplify conditional evaluation when processing travel opcodes. --- main.c | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/main.c b/main.c index 2b264b9..1416e41 100644 --- a/main.c +++ b/main.c @@ -614,18 +614,10 @@ static bool playermove(token_t verb, int motion) /* (ESR) We've found a destination that goes with the motion verb. * Next we need to check any conditional(s) on this destination, and * possibly on following entries. */ - scratchloc = T_HIGH(travel[kk]); - do { - /* - * (ESR) This conditional-skip loop may have to be repeated if - * it includes the plover passage. Same deal for any future - * cases where we need to block travel and then redo it once - * the blocking condition has been removed. - */ for (;;) { /* L12 loop */ for (;;) { - long cond = scratchloc / 1000; + long cond = T_CONDITION(travel[kk]); long arg = MOD(cond, 100); if (!SPECIAL(cond)) { /* YAML N and [pct N] conditionals */ @@ -643,18 +635,18 @@ static bool playermove(token_t verb, int motion) /* We arrive here on conditional failure. * Skip to next non-matching destination */ - long nextup; + long k2 = kk; do { - if (travel[kk].stop) + if (travel[k2].stop) BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); // LCOV_EXCL_LINE - ++kk; - nextup = T_HIGH(travel[kk]); + ++k2; } while - (nextup == scratchloc); - scratchloc = nextup; + (T_HIGH(travel[kk]) == T_HIGH(travel[k2])); + kk = k2; } - game.newloc = MOD(scratchloc, 1000); + /* Found an eligible rule, now execute it */ + game.newloc = T_DESTINATION(travel[kk]); if (!SPECIAL(game.newloc)) return true; @@ -685,14 +677,14 @@ static bool playermove(token_t verb, int motion) * to get it out. Having dropped it, go back and * pretend he wasn't carrying it after all. */ drop(EMERALD, game.loc); + k2 = kk; do { - if (travel[kk].stop) + if (travel[k2].stop) BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); // LCOV_EXCL_LINE - ++kk; - game.newloc = T_HIGH(travel[kk]); + ++k2; } while - (game.newloc == scratchloc); - scratchloc = game.newloc; + (T_HIGH(travel[kk]) == T_HIGH(travel[k2])); + kk = k2; continue; /* goto L12 */ case 3: /* Travel 303. Troll bridge. Must be done only -- 2.31.1