From: Eric S. Raymond Date: Fri, 7 Jul 2017 11:50:39 +0000 (-0400) Subject: Purge magic numbers from C side of destination handling. X-Git-Tag: 2017-07-10~32 X-Git-Url: https://jxself.org/git/?a=commitdiff_plain;h=2bdf9e2803c83d19f375d97dd8147e8d221ec057;p=open-adventure.git Purge magic numbers from C side of destination handling. --- diff --git a/main.c b/main.c index 8c8b47c..997bfe2 100644 --- a/main.c +++ b/main.c @@ -384,9 +384,10 @@ static bool dwarfmove(void) kk = tkey[game.dloc[i]]; if (kk != 0) do { - game.newloc = travel[kk].dest; + enum desttype_t desttype = travel[kk].desttype; + game.newloc = travel[kk].destval; /* Have we avoided a dwarf encounter? */ - if (SPECIAL(game.newloc)) + if (desttype != dest_goto) continue; else if (!INDEEP(game.newloc)) continue; @@ -509,7 +510,8 @@ static bool traveleq(long a, long b) /* Are two travel entries equal for purposes of skip after failed condition? */ { return (travel[a].cond == travel[b].cond) - && (travel[a].dest == travel[b].dest); + && (travel[a].desttype == travel[b].desttype) + && (travel[a].destval == travel[b].destval); } /* Given the current location in "game.loc", and a motion verb number in @@ -545,10 +547,11 @@ static void playermove( int motion) if (spk == 0) { int te_tmp = 0; for (;;) { - scratchloc = travel[travel_entry].dest; - if (scratchloc != motion) { - if (!SPECIAL(scratchloc)) { - if (FORCED(scratchloc) && travel[tkey[scratchloc]].dest == motion) + enum desttype_t desttype = travel[travel_entry].desttype; + scratchloc = travel[travel_entry].destval; + if (desttype != dest_goto || scratchloc != motion) { + if (desttype == dest_goto) { + if (FORCED(scratchloc) && travel[tkey[scratchloc]].destval == motion) te_tmp = travel_entry; } if (!travel[travel_entry].stop) { @@ -662,17 +665,17 @@ static void playermove( int motion) } /* Found an eligible rule, now execute it */ - game.newloc = travel[travel_entry].dest; - if (!SPECIAL(game.newloc)) + enum desttype_t desttype = travel[travel_entry].desttype; + game.newloc = travel[travel_entry].destval; + if (desttype == dest_goto) return; - if (game.newloc > 500) { + if (desttype == dest_speak) { /* Execute a speak rule */ - rspeak(L_SPEAK(game.newloc)); + rspeak(game.newloc); game.newloc = game.loc; return; } else { - game.newloc -= SPECIALBASE; switch (game.newloc) { case 1: /* Special travel 1. Plover-alcove passage. Can carry only diff --git a/make_dungeon.py b/make_dungeon.py index 7a16970..383f55a 100755 --- a/make_dungeon.py +++ b/make_dungeon.py @@ -149,10 +149,13 @@ typedef struct {{ const char* message; }} special_t; +enum desttype_t {{dest_goto, dest_special, dest_speak}}; + typedef struct {{ const long motion; const long cond; - const long dest; + const enum desttype_t desttype; + const long destval; const bool nodwarves; const bool stop; }} travelop_t; @@ -163,7 +166,6 @@ typedef struct {{ * encoding description for travel. */ #define T_TERMINATE(entry) ((entry).motion == 1) -#define L_SPEAK(loc) ((loc) - 500) extern const location_t locations[]; extern const object_t objects[]; @@ -702,7 +704,7 @@ def buildtravel(locs, objs): # # In order to de-crypticize the runtime code, we're going to break these # magic numbers up into a struct. - travel = [[0, "LOC_NOWHERE", 0, 0, 0, "false", "false"]] + travel = [[0, "LOC_NOWHERE", 0, 0, 0, 0, "false", "false"]] tkey = [0] oldloc = 0 while ltravel: @@ -717,11 +719,21 @@ def buildtravel(locs, objs): while rule: cond = newloc // 1000 dest = newloc % 1000 + if dest <= 300: + desttype = "dest_goto"; + destval = locnames[dest] + elif dest > 500: + desttype = "dest_speak"; + destval = msgnames[dest - 500] + else: + desttype = "dest_special"; + destval = locnames[dest - 300] travel.append([len(tkey)-1, locnames[len(tkey)-1], rule.pop(0), cond, - locnames[dest] if dest <= 300 else dest, + desttype, + destval, "true" if cond==100 else "false", "false"]) travel[-1][-1] = "true" @@ -731,7 +743,8 @@ def get_travel(travel): template = """ {{ // from {}: {} .motion = {}, .cond = {}, - .dest = {}, + .desttype = {}, + .destval = {}, .nodwarves = {}, .stop = {}, }},