X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=newdungeon.py;h=5888f83f64c8e100e63eec5df0c07a288b2a5e92;hp=2daae0cbe85431a49057b39ae9152a3c72138d1e;hb=c2df849dade5bb7d8214c6abb6c0856b84d0d1d1;hpb=0e9e45f1b703f858d19a99f33ef8761c559c6dc4 diff --git a/newdungeon.py b/newdungeon.py index 2daae0c..5888f83 100755 --- a/newdungeon.py +++ b/newdungeon.py @@ -2,10 +2,10 @@ # This is the new open-adventure dungeon generator. It'll eventually replace the existing dungeon.c It currently outputs a .h and .c pair for C code. -import json -import collections +import yaml +import sys -json_name = "adventure.json" +yaml_name = "adventure.yaml" h_name = "newdb.h" c_name = "newdb.c" @@ -17,46 +17,63 @@ 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): h += "enum {}_refs {{\n".format(name) - c += "char* {}[] = {{\n".format(name) + for key, text in dungeon[name]: + h += " {},\n".format(key) + h += "};\n\n" + c += "const char* {}[] = {{\n".format(name) index = 0 - for key, text in dungeon[name].items(): - h += " {},\n".format(key) + for key, text in dungeon[name]: if text == None: c += " NULL,\n" else: text = c_escape(text) c += " \"{}\",\n".format(text) - index += 1 - - h += "};\n\n" c += "};\n\n" return (h, c) -with open(json_name, "r") as f: - dungeon = json.load(f, object_pairs_hook = collections.OrderedDict) +with open(yaml_name, "r") as f: + dungeon = yaml.load(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,16 +82,39 @@ 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"].items(): +for key, data in dungeon["object_descriptions"]: try: data["inventory"] = "\"{}\"".format(c_escape(data["inventory"])) except AttributeError: @@ -84,17 +124,41 @@ for key, data in dungeon["object_descriptions"].items(): 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) + c += " \"{}\",\n".format(l) c += " },\n" 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, c_name: c,