X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=newdungeon.py;h=f2e801f587d91e7735d50ecfa8061cb92663e062;hb=1ed812691287700b4bdf804d782f09f4a0eee0de;hp=27dd9f181afa1cbe74fdca5afb3ea427fab03287;hpb=aace0b1359f15195820bf6d22a897f7c332c5eab;p=open-adventure.git diff --git a/newdungeon.py b/newdungeon.py index 27dd9f1..f2e801f 100755 --- a/newdungeon.py +++ b/newdungeon.py @@ -8,7 +8,7 @@ # movement rules to the travel array that's actually used by # playermove(). This program first compiles the YAML to a form # identical to the data in section 3 of the old adventure.text file, -# then a second stage packs that data into the travel array. +# then a second stage unpacks that data into the travel array. # # Here are the rules of the intermediate form: # @@ -88,9 +88,10 @@ typedef struct {{ const char* inventory; int plac, fixd; bool is_treasure; - const char** longs; + const char** descriptions; const char** sounds; const char** texts; + const char** changes; }} object_t; typedef struct {{ @@ -138,7 +139,8 @@ typedef struct {{ }} action_t; typedef struct {{ - const long opcode; + const long motion; + const long dest; const bool stop; }} travelop_t; @@ -147,13 +149,10 @@ typedef struct {{ * inherited from FORTRAN, someday. To understand these, read the * encoding description for travel. */ -#define T_DESTINATION(entry) MOD((entry).opcode / 1000, 1000) -#define T_NODWARVES(entry) ((entry).opcode / 1000000 == 100) -#define T_MOTION(entry) MOD((entry).opcode, 1000) -#define T_TERMINATE(entry) (T_MOTION(entry) == 1) -#define T_STOP(entry) ((entry).stop) -#define T_HIGH(entry) ((entry).opcode / 1000) -#define T_LOW(entry) ((entry).opcode % 1000) +#define T_DESTINATION(entry) MOD((entry).dest, 1000) +#define T_NODWARVES(entry) ((entry).dest / 1000 == 100) +#define T_HIGH(entry) ((entry).dest) +#define T_TERMINATE(entry) ((entry).motion == 1) #define L_SPEAK(loc) ((loc) - 500) extern const location_t locations[]; @@ -343,13 +342,16 @@ def get_objects(obj): .plac = {}, .fixd = {}, .is_treasure = {}, - .longs = (const char* []) {{ + .descriptions = (const char* []) {{ {} }}, .sounds = (const char* []) {{ {} }}, .texts = (const char* []) {{ +{} + }}, + .changes = (const char* []) {{ {} }}, }}, @@ -358,17 +360,17 @@ def get_objects(obj): for (i, item) in enumerate(obj): attr = item[1] i_msg = make_c_string(attr["inventory"]) - longs_str = "" - if attr["longs"] == None: - longs_str = " " * 12 + "NULL," + descriptions_str = "" + if attr["descriptions"] == None: + descriptions_str = " " * 12 + "NULL," else: labels = [] - for l_msg in attr["longs"]: + for l_msg in attr["descriptions"]: if not isinstance(l_msg, str): labels.append(l_msg) l_msg = l_msg[1] - longs_str += " " * 12 + make_c_string(l_msg) + ",\n" - longs_str = longs_str[:-1] # trim trailing newline + descriptions_str += " " * 12 + make_c_string(l_msg) + ",\n" + descriptions_str = descriptions_str[:-1] # trim trailing newline if labels: global statedefines statedefines += "/* States for %s */\n" % item[0] @@ -391,6 +393,13 @@ def get_objects(obj): for l_msg in attr["texts"]: texts_str += " " * 12 + make_c_string(l_msg) + ",\n" texts_str = texts_str[:-1] # trim trailing newline + changes_str = "" + if attr.get("changes") == None: + changes_str = " " * 12 + "NULL," + else: + for l_msg in attr["changes"]: + changes_str += " " * 12 + make_c_string(l_msg) + ",\n" + changes_str = changes_str[:-1] # trim trailing newline locs = attr.get("locations", ["LOC_NOWHERE", "LOC_NOWHERE"]) immovable = attr.get("immovable", False) try: @@ -402,7 +411,7 @@ def get_objects(obj): sys.stderr.write("dungeon: unknown object location in %s\n" % locs) sys.exit(1) treasure = "true" if attr.get("treasure") else "false" - obj_str += template.format(i, i_msg, locs[0], locs[1], treasure, longs_str, sounds_str, texts_str) + obj_str += template.format(i, i_msg, locs[0], locs[1], treasure, descriptions_str, sounds_str, texts_str, changes_str) obj_str = obj_str[:-1] # trim trailing newline return obj_str @@ -573,7 +582,7 @@ def buildtravel(locs, objs, voc): if type(cond[2]) == int: state = cond[2] else: - for (i, stateclause) in enumerate(objs[obj][1]["longs"]): + for (i, stateclause) in enumerate(objs[obj][1]["descriptions"]): if type(stateclause) == list: if stateclause[0] == cond[2]: state = i @@ -622,8 +631,9 @@ def buildtravel(locs, objs, voc): # TRAVEL[TRVS - 1] = -TRAVEL[TRVS - 1]; # } # - # We're going to break the magic numbers up into a struct. - travel = [[0, False]] + # In order to de-crypticize the runtime code, we're going to break these + # magic numbers up into a struct. + travel = [[0, 0, False]] tkey = [0] oldloc = 0 while ltravel: @@ -634,21 +644,22 @@ def buildtravel(locs, objs, voc): tkey.append(len(travel)) oldloc = loc elif travel: - travel[-1][1] = not travel[-1][1] + travel[-1][2] = not travel[-1][2] while rule: - travel.append([rule.pop(0) + newloc * 1000, False]) - travel[-1][1] = True + travel.append([rule.pop(0), newloc, False]) + travel[-1][2] = True return (travel, tkey) def get_travel(travel): template = """ {{ - .opcode = {}, + .motion = {}, + .dest = {}, .stop = {}, }}, """ out = "" for entry in travel: - out += template.format(entry[0], entry[1]).lower() + out += template.format(entry[0], entry[1], entry[2]).lower() out = out[:-1] # trim trailing newline return out