X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=make_dungeon.py;h=3a78d4eccfa9784fe79f88007450848fa0cf4f03;hb=1cbc3d827bda4a29085302ba64af9486552a17cf;hp=45b9334c09e5427de996dfb76233e0849a6c4516;hpb=004693c261b775ca0652734fecea41afc9e076ef;p=open-adventure.git diff --git a/make_dungeon.py b/make_dungeon.py index 45b9334..3a78d4e 100755 --- a/make_dungeon.py +++ b/make_dungeon.py @@ -149,10 +149,16 @@ typedef struct {{ const char* message; }} special_t; +enum condtype_t {{cond_goto, cond_pct, cond_carry, cond_with, cond_not}}; +enum desttype_t {{dest_goto, dest_special, dest_speak}}; + typedef struct {{ const long motion; - const long cond; - const long dest; + const long condtype; + const long condarg1; + const long condarg2; + const enum desttype_t desttype; + const long destval; const bool nodwarves; const bool stop; }} travelop_t; @@ -163,7 +169,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[]; @@ -673,7 +678,7 @@ def buildtravel(locs, objs): tt = [i] dest = dencode(rule["action"], name) + 1000 * cencode(rule.get("cond"), name) tt.append(dest) - tt += [verbmap[e] for e in rule["verbs"]] + tt += [motionnames[verbmap[e]].upper() for e in rule["verbs"]] if not rule["verbs"]: tt.append(1) ltravel.append(tuple(tt)) @@ -702,7 +707,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, 0, 0, False, False]] + travel = [[0, "LOC_NOWHERE", 0, 0, 0, 0, 0, 0, "false", "false"]] tkey = [0] oldloc = 0 while ltravel: @@ -713,29 +718,71 @@ def buildtravel(locs, objs): tkey.append(len(travel)) oldloc = loc elif travel: - travel[-1][-1] = not travel[-1][-1] + travel[-1][-1] = "false" if travel[-1][-1] == "true" else "true" while rule: cond = newloc // 1000 - travel.append([rule.pop(0), - cond, - newloc % 1000, - cond==100, - False]) - travel[-1][-1] = True + nodwarves = (cond == 100) + if cond == 0: + condtype = "cond_goto" + condarg1 = condarg2 = 0 + elif cond < 100: + condtype = "cond_pct" + condarg1 = cond + condarg2 = 0 + elif cond == 100: + condtype = "cond_goto" + condarg1 = 100 + condarg2 = 0 + elif cond <= 200: + condtype = "cond_carry" + condarg1 = objnames[cond - 100] + condarg2 = 0 + elif cond <= 300: + condtype = "cond_with" + condarg1 = objnames[cond - 200] + condarg2 = 0 + else: + condtype = "cond_not" + condarg1 = cond % 100 + condarg2 = (cond - 300) // 100. + 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), + condtype, + condarg1, + condarg2, + desttype, + destval, + "true" if nodwarves else "false", + "false"]) + travel[-1][-1] = "true" return (travel, tkey) def get_travel(travel): - template = """ {{ + template = """ {{ // from {}: {} .motion = {}, - .cond = {}, - .dest = {}, + .condtype = {}, + .condarg1 = {}, + .condarg2 = {}, + .desttype = {}, + .destval = {}, .nodwarves = {}, .stop = {}, }}, """ out = "" for entry in travel: - out += template.format(*entry).lower() + out += template.format(*entry) out = out[:-1] # trim trailing newline return out @@ -746,6 +793,7 @@ if __name__ == "__main__": locnames = [x[0] for x in db["locations"]] msgnames = [el[0] for el in db["arbitrary_messages"]] objnames = [el[0] for el in db["objects"]] + motionnames = [el[0] for el in db["motions"]] (travel, tkey) = buildtravel(db["locations"], db["objects"])