X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=make_dungeon.py;h=4e3c88e219284af62a62de64397d3c7bbfab4f3e;hp=bc8751d3707472ac23eb1f35b4d8ff57e4baf7f2;hb=7be7ac9406512644886fbf4a99d16e1b4f7cefc3;hpb=0aa70d04cf0f4edaaf10f2894d9181caf521bce0 diff --git a/make_dungeon.py b/make_dungeon.py index bc8751d..4e3c88e 100755 --- a/make_dungeon.py +++ b/make_dungeon.py @@ -153,6 +153,7 @@ typedef struct {{ const long motion; const long cond; const long dest; + const bool nodwarves; const bool stop; }} travelop_t; @@ -161,7 +162,6 @@ typedef struct {{ * inherited from FORTRAN, someday. To understand these, read the * encoding description for travel. */ -#define T_NODWARVES(entry) (T_CONDITION(entry) == 100) #define T_TERMINATE(entry) ((entry).motion == 1) #define L_SPEAK(loc) ((loc) - 500) @@ -192,6 +192,8 @@ extern const char *ignore; #define NTRAVEL {} #define NKEYS {} +#define BIRD_ENDSTATE {} + enum arbitrary_messages_refs {{ {} }}; @@ -407,18 +409,15 @@ def get_objects(obj): else: labels = [] for l_msg in attr["descriptions"]: - if not isinstance(l_msg, str): - labels.append(l_msg) - l_msg = l_msg[1] descriptions_str += " " * 12 + make_c_string(l_msg) + ",\n" + for label in attr.get("states", []): + labels.append(label) descriptions_str = descriptions_str[:-1] # trim trailing newline if labels: global statedefines statedefines += "/* States for %s */\n" % item[0] - for (i, (label, message)) in enumerate(labels): - if len(message) >= 45: - message = message[:45] + "..." - statedefines += "#define %s\t%d /* %s */\n" % (label, i, message) + for (i, label) in enumerate(labels): + statedefines += "#define %s\t%d\n" % (label, i) statedefines += "\n" sounds_str = "" if attr.get("sounds") == None: @@ -629,7 +628,9 @@ def buildtravel(locs, objs): raise ValueError def cencode(cond, name): if cond is None: - return 0; + return 0 + elif cond == ["nodwarves"]: + return 100 elif cond[0] == "pct": return cond[1] elif cond[0] == "carry": @@ -645,11 +646,12 @@ def buildtravel(locs, objs): sys.stderr.write("dungeon: unknown object name %s in with clause of \n" % (cond[1], name)) sys.exit(1) elif cond[0] == "not": - # FIXME: Allow named as well as numbered states try: obj = objnames.index(cond[1]) if type(cond[2]) == int: state = cond[2] + elif cond[2] in objs[obj][1].get("states", []): + state = objs[obj][1].get("states").index(cond[2]) else: for (i, stateclause) in enumerate(objs[obj][1]["descriptions"]): if type(stateclause) == list: @@ -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, 0, 0, False]] + travel = [[0, 0, 0, False, False]] tkey = [0] oldloc = 0 while ltravel: @@ -715,7 +717,12 @@ def buildtravel(locs, objs): elif travel: travel[-1][-1] = not travel[-1][-1] while rule: - travel.append([rule.pop(0), newloc // 1000, newloc % 1000, False]) + cond = newloc // 1000 + travel.append([rule.pop(0), + cond, + newloc % 1000, + cond==100, + False]) travel[-1][-1] = True return (travel, tkey) @@ -724,12 +731,13 @@ def get_travel(travel): .motion = {}, .cond = {}, .dest = {}, + .nodwarves = {}, .stop = {}, }}, """ out = "" for entry in travel: - out += template.format(entry[0], entry[1], entry[2], entry[3]).lower() + out += template.format(*entry).lower() out = out[:-1] # trim trailing newline return out @@ -762,6 +770,10 @@ if __name__ == "__main__": ignore, ) + # 0-origin index of birds's last song. Bird should + # die after player hears this. + deathbird = len(dict(db["objects"])["BIRD"]["sounds"]) - 1 + h = h_template.format( len(db["locations"])-1, len(db["objects"])-1, @@ -774,6 +786,7 @@ if __name__ == "__main__": len(db["specials"]), len(travel), len(tkey), + deathbird, get_refs(db["arbitrary_messages"]), get_refs(db["locations"]), get_refs(db["objects"]),