Improve test coverage.
[open-adventure.git] / newdungeon.py
index 4553eea5d8e25482d2c7fffaadbd0d69dfbc7b08..a981a1db4e0f2f23caa7cf866bee61f622afad70 100755 (executable)
@@ -8,11 +8,14 @@ yaml_name = "adventure.yaml"
 h_name = "newdb.h"
 c_name = "newdb.c"
 
+statedefines = ""
+
 h_template = """/* Generated from adventure.yaml - do not hand-hack! */
 #ifndef NEWDB_H
 #define NEWDB_H
 
 #include <stdio.h>
+#include <stdbool.h>
 
 #define SILENT -1      /* no sound */
 
@@ -29,6 +32,7 @@ typedef struct {{
 typedef struct {{
   descriptions_t description;
   const long sound;
+  const bool loud;
 }} location_t;
 
 typedef struct {{
@@ -63,7 +67,6 @@ extern turn_threshold_t turn_thresholds[];
 extern obituary_t obituaries[];
 extern hint_t hints[];
 extern long conditions[];
-
 extern const size_t CLSSES;
 extern const int maximum_deaths;
 extern const int turn_threshold_count;
@@ -81,6 +84,9 @@ enum object_descriptions_refs {{
 {}
 }};
 
+/* State definitions */
+
+{}
 #endif /* end NEWDB_H */
 """
 
@@ -193,6 +199,7 @@ def get_locations(loc):
             .big = {},
         }},
         .sound = {},
+        .loud = {},
     }},
 """
     loc_str = ""
@@ -200,7 +207,8 @@ def get_locations(loc):
         short_d = make_c_string(item[1]["description"]["short"])
         long_d = make_c_string(item[1]["description"]["long"])
         sound = item[1].get("sound", "SILENT")
-        loc_str += template.format(short_d, long_d, sound)
+        loud = "true" if item[1].get("loud") else "false"
+        loc_str += template.format(short_d, long_d, sound, loud)
     loc_str = loc_str[:-1] # trim trailing newline
     return loc_str
 
@@ -219,9 +227,21 @@ def get_object_descriptions(obj):
         if item[1]["longs"] == None:
             longs_str = " " * 12 + "NULL,"
         else:
+            labels = []
             for l_msg in item[1]["longs"]:
+                if not isinstance(l_msg, str):
+                    labels.append(l_msg)
+                    l_msg = l_msg[1]
                 longs_str += " " * 12 + make_c_string(l_msg) + ",\n"
             longs_str = longs_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)
+                statedefines += "\n"
         obj_str += template.format(i_msg, longs_str)
     obj_str = obj_str[:-1] # trim trailing newline
     return obj_str
@@ -286,13 +306,6 @@ if __name__ == "__main__":
     with open(yaml_name, "r") as f:
         db = yaml.load(f)
 
-    h = h_template.format(
-        len(db["hints"]),
-        get_refs(db["arbitrary_messages"]),
-        get_refs(db["locations"]),
-        get_refs(db["object_descriptions"]),
-    )
-
     c = c_template.format(
         h_name,
         get_arbitrary_messages(db["arbitrary_messages"]),
@@ -308,6 +321,14 @@ if __name__ == "__main__":
         len(db["turn_thresholds"]),
     )
 
+    h = h_template.format(
+        len(db["hints"]),
+        get_refs(db["arbitrary_messages"]),
+        get_refs(db["locations"]),
+        get_refs(db["object_descriptions"]),
+        statedefines,
+    )
+
     with open(h_name, "w") as hf:
         hf.write(h)