X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=newdungeon.py;h=5888f83f64c8e100e63eec5df0c07a288b2a5e92;hb=6ecd0010931a988792e672e1fe0a1192fca7b002;hp=dc9a34357f1ab7968ffb3f11f560b7c821fdbfcf;hpb=60126c3dac4788cd5c01f5da6bb50986aeaac0d3;p=open-adventure.git diff --git a/newdungeon.py b/newdungeon.py index dc9a343..5888f83 100755 --- a/newdungeon.py +++ b/newdungeon.py @@ -17,15 +17,18 @@ def c_escape(string): string = string.replace("'", "\\'") return string +def quotewrap(string): + """Wrap a string in double quotes.""" + return '"' + string + '"' + def write_regular_messages(name, h, c): - if name != "short_location_descriptions": - h += "enum {}_refs {{\n".format(name) - for key, text in dungeon[name]: - h += " {},\n".format(key) - h += "};\n\n" + h += "enum {}_refs {{\n".format(name) + for key, text in dungeon[name]: + h += " {},\n".format(key) + h += "};\n\n" - c += "char* {}[] = {{\n".format(name) + c += "const char* {}[] = {{\n".format(name) index = 0 for key, text in dungeon[name]: if text == None: @@ -44,19 +47,33 @@ with open(yaml_name, "r") as f: h = """#include typedef struct { - char* inventory; - char** longs; + const char* inventory; + const char** longs; } object_description_t; -extern char* long_location_descriptions[]; -extern char* short_location_descriptions[]; +typedef struct { + const char* small; + const char* big; +} descriptions_t; + +typedef struct { + descriptions_t description; +} location_t; + +typedef struct { + const char* query; + const char* yes_response; +} obituary_t; + +extern location_t locations[]; extern object_description_t object_descriptions[]; -extern char* arbitrary_messages[]; -extern char* class_messages[]; -extern char* turn_threshold_messages[]; +extern const char* arbitrary_messages[]; +extern const char* class_messages[]; +extern const char* turn_threshold_messages[]; +extern obituary_t obituaries[]; extern size_t CLSSES; - +extern int maximum_deaths; """ c = """#include "{}" @@ -65,13 +82,36 @@ c = """#include "{}" for name in [ "arbitrary_messages", - "long_location_descriptions", - "short_location_descriptions", "class_messages", "turn_threshold_messages", ]: h, c = write_regular_messages(name, h, c) +h += "enum locations_refs {\n" +c += "location_t locations[] = {\n" +for key, data in dungeon["locations"]: + h += " {},\n".format(key) + + try: + short = quotewrap(c_escape(data["description"]["short"])) + except AttributeError: + short = "NULL" + try: + long = quotewrap(c_escape(data["description"]["long"])) + except AttributeError: + long = "NULL" + + c += """ {{ + .description = {{ + .small = {}, + .big = {}, + }}, + }}, +""".format(short, long) + +c += "};\n\n" +h += "};\n\n" + h += "enum object_descriptions_refs {\n" c += "object_description_t object_descriptions[] = {\n" for key, data in dungeon["object_descriptions"]: @@ -84,7 +124,7 @@ for key, data in dungeon["object_descriptions"]: c += " .inventory = {},\n".format(data["inventory"]) try: data["longs"][0] - c += " .longs = (char* []) {\n" + c += " .longs = (const char* []) {\n" for l in data["longs"]: l = c_escape(l) c += " \"{}\",\n".format(l) @@ -92,13 +132,32 @@ for key, data in dungeon["object_descriptions"]: except (TypeError, IndexError): c += " .longs = NULL,\n" c += " },\n" -h += "};" -c += "};" +h += "};\n\n" +c += "};\n\n" + +c += "obituary_t obituaries[] = {\n" +for obit in dungeon["obituaries"]: + + query = quotewrap(c_escape(obit["query"])) + yes_response = quotewrap(c_escape(obit["yes_response"])) + + c += """ {{ + .query = {}, + .yes_response = {}, + }}, +""".format(query, yes_response) + +c += "};\n" c += """ size_t CLSSES = {}; """.format(len(dungeon["class_messages"])) +c += """ +int maximum_deaths = {}; +""".format(len(dungeon["obituaries"])) + + # finally, write out the files d = { h_name: h,