X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=newdungeon.py;h=a4b046e9ed5b124f454f28011f13afd00de032e7;hb=3939cd4f963b485e1da42787f59fdbcfae23be19;hp=2daae0cbe85431a49057b39ae9152a3c72138d1e;hpb=0e9e45f1b703f858d19a99f33ef8761c559c6dc4;p=open-adventure.git diff --git a/newdungeon.py b/newdungeon.py index 2daae0c..a4b046e 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,29 +17,32 @@ 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 += "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 @@ -48,8 +51,16 @@ typedef struct { char** longs; } object_description_t; -extern char* long_location_descriptions[]; -extern char* short_location_descriptions[]; +typedef struct { + char* small; + char* big; +} descriptions_t; + +typedef struct { + descriptions_t description; +} location_t; + +extern location_t locations[]; extern object_description_t object_descriptions[]; extern char* arbitrary_messages[]; extern char* class_messages[]; @@ -65,16 +76,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: @@ -87,7 +121,7 @@ for key, data in dungeon["object_descriptions"].items(): c += " .longs = (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" @@ -95,6 +129,11 @@ for key, data in dungeon["object_descriptions"].items(): h += "};" c += "};" +c += """ +size_t CLSSES = {}; +""".format(len(dungeon["class_messages"])) + +# finally, write out the files d = { h_name: h, c_name: c,