Save/resume fail test coverage -- test works in Docker now
[open-adventure.git] / newdungeon.py
index 2daae0cbe85431a49057b39ae9152a3c72138d1e..5888f83f64c8e100e63eec5df0c07a288b2a5e92 100755 (executable)
@@ -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 <stdio.h>
 
 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,