From 8560122f01f82bd508b93a0d27105bf415203803 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Tue, 27 Jun 2017 22:11:58 -0400 Subject: [PATCH] Break travel opcodes into a two-element structure. --- init.c | 2 +- main.c | 12 ++++++------ newdungeon.py | 35 ++++++++++++++++++++++++++++------- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/init.c b/init.c index 66ef59e..fc8d5fd 100644 --- a/init.c +++ b/init.c @@ -25,7 +25,7 @@ void initialise(void) game.abbrev[i] = 0; if (!(locations[i].description.big == 0 || tkey[i] == 0)) { int k = tkey[i]; - if (MOD(labs(travel[k]), 1000) == 1) + if (MOD(labs(travel[k].opcode), 1000) == 1) conditions[i] |= (1 << COND_FORCED); } game.atloc[i] = 0; diff --git a/main.c b/main.c index 5ad7d90..c58281d 100644 --- a/main.c +++ b/main.c @@ -32,13 +32,13 @@ * inherited from FORTRAN, someday. To understand these, read the * encoding description for travel. */ -#define T_DESTINATION(entry) MOD(labs(entry) / 1000, 1000) -#define T_NODWARVES(entry) labs(entry) / 1000000 == 100 -#define T_MOTION(entry) MOD(labs(entry), 1000) -#define L_SPEAK(loc) ((loc) - 500) +#define T_DESTINATION(entry) MOD(labs((entry).opcode) / 1000, 1000) +#define T_NODWARVES(entry) labs((entry).opcode) / 1000000 == 100 +#define T_MOTION(entry) MOD(labs((entry).opcode), 1000) #define T_TERMINATE(entry) (T_MOTION(entry) == 1) -#define T_STOP(entry) ((entry) < 0) -#define T_OPCODE(entry) (entry) +#define T_STOP(entry) ((entry).stop) +#define T_OPCODE(entry) ((entry).opcode) +#define L_SPEAK(loc) ((loc) - 500) struct game_t game; diff --git a/newdungeon.py b/newdungeon.py index 68dbc39..b4c85b2 100755 --- a/newdungeon.py +++ b/newdungeon.py @@ -137,6 +137,11 @@ typedef struct {{ const long message; }} action_t; +typedef struct {{ + const long opcode; + const bool stop; +}} travelop_t; + extern const location_t locations[]; extern const object_t objects[]; extern const char* arbitrary_messages[]; @@ -147,7 +152,7 @@ extern const hint_t hints[]; extern long conditions[]; extern const motion_t motions[]; extern const action_t actions[]; -extern const long travel[]; +extern const travelop_t travel[]; extern const long tkey[]; #define NLOCATIONS {} @@ -233,7 +238,9 @@ const action_t actions[] = {{ {} +const travelop_t travel[] = {{ {} +}}; /* end */ """ @@ -558,7 +565,7 @@ def buildtravel(locs, objs, voc): state = i break else: - sys.stderr.write("dungeon: unmatched state symbol %s in not caluase of %s\n" % (cond[2], name)) + sys.stderr.write("dungeon: unmatched state symbol %s in not clause of %s\n" % (cond[2], name)) sys.exit(0); return 300 + obj + 100 * state except ValueError: @@ -600,7 +607,9 @@ def buildtravel(locs, objs, voc): # } # TRAVEL[TRVS - 1] = -TRAVEL[TRVS - 1]; # } - travel = [0] + # + # We're going to break the magic numbers up into a struct. + travel = [[0, False]] tkey = [0] oldloc = 0 while ltravel: @@ -611,12 +620,24 @@ def buildtravel(locs, objs, voc): tkey.append(len(travel)) oldloc = loc elif travel: - travel[-1] *= -1 + travel[-1][1] = not travel[-1][1] while rule: - travel.append(rule.pop(0) + newloc * 1000) - travel[-1] *= -1 + travel.append([rule.pop(0) + newloc * 1000, False]) + travel[-1][1] = True return (travel, tkey) +def get_travel(travel): + template = """ {{ + .opcode = {}, + .stop = {}, + }}, +""" + out = "" + for entry in travel: + out += template.format(entry[0], entry[1]).lower() + out = out[:-1] # trim trailing newline + return out + if __name__ == "__main__": with open(yaml_name, "r") as f: db = yaml.load(f) @@ -642,7 +663,7 @@ if __name__ == "__main__": get_motions(db["motions"]), get_actions(db["actions"]), "const long tkey[] = {%s};" % bigdump(tkey), - "const long travel[] = {%s};" % bigdump(travel), + get_travel(travel), ) h = h_template.format( -- 2.31.1