Generate initializer from YAML for Section 9 bits.
[open-adventure.git] / newdungeon.py
index 136d941f9f9f28de3ff264ab5c337df84d7ec28f..092c342e52038588bc08550cc985fb3bbca5e4d0 100755 (executable)
@@ -8,7 +8,11 @@ yaml_name = "adventure.yaml"
 h_name = "newdb.h"
 c_name = "newdb.c"
 
-h_template = """#include <stdio.h>
+h_template = """/* Generated from adventure.yaml - do not hand-hack! */
+#ifndef NEWDB_H
+#define NEWDB_H
+
+#include <stdio.h>
 
 typedef struct {{
   const char* inventory;
@@ -55,10 +59,12 @@ extern const class_t classes[];
 extern turn_threshold_t turn_thresholds[];
 extern obituary_t obituaries[];
 extern hint_t hints[];
+extern const long conditions[];
 
-extern size_t CLSSES;
-extern int maximum_deaths;
-extern int turn_threshold_count;
+extern const size_t CLSSES;
+extern const int maximum_deaths;
+extern const int turn_threshold_count;
+#define HINT_COUNT {}
 
 enum arbitrary_messages_refs {{
 {}
@@ -71,9 +77,14 @@ enum locations_refs {{
 enum object_descriptions_refs {{
 {}
 }};
+
+#endif /* end NEWDB_H */
 """
 
-c_template = """#include "{}"
+c_template = """/* Generated from adventure.yaml - do not hand-hack! */
+
+#include "common.h"
+#include "{}"
 
 const char* arbitrary_messages[] = {{
 {}
@@ -103,9 +114,15 @@ hint_t hints[] = {{
 {}
 }};
 
-size_t CLSSES = {};
-int maximum_deaths = {};
-int turn_threshold_count = {};
+const long conditions[] = {{
+{}
+}};
+
+const size_t CLSSES = {};
+const int maximum_deaths = {};
+const int turn_threshold_count = {};
+
+/* end */
 """
 
 def make_c_string(string):
@@ -229,7 +246,8 @@ def get_hints(hnt, arb):
 """
     hnt_str = ""
     md = dict(arb)
-    for item in hnt:
+    for member in hnt:
+        item = member["hint"]
         number = item["number"]
         penalty = item["penalty"]
         turns = item["turns"]
@@ -239,12 +257,32 @@ def get_hints(hnt, arb):
     hnt_str = hnt_str[:-1] # trim trailing newline
     return hnt_str
 
+def get_condbits(locations):
+    cnd_str = ""
+    for (name, loc) in locations:
+        conditions = loc["conditions"]
+        hints = loc.get("hints") or []
+        flaglist = []
+        for flag in conditions:
+            if conditions[flag]:
+                flaglist.append(flag)
+        line = "|".join([("(1<<COND_%s)" % f) for f in flaglist])
+        trail = "|".join([("(1<<COND_H%s)" % f['name']) for f in hints])
+        if trail:
+            line += "|" + trail
+        if line.startswith("|"):
+            line = line[1:]
+        if not line:
+            line = "0"
+        cnd_str += "    " + line + ",\t// " + name + "\n"
+    return cnd_str
 
 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"]),
@@ -259,6 +297,7 @@ if __name__ == "__main__":
         get_object_descriptions(db["object_descriptions"]),
         get_obituaries(db["obituaries"]),
         get_hints(db["hints"], db["arbitrary_messages"]),
+        get_condbits(db["locations"]),
         len(db["classes"]),
         len(db["obituaries"]),
         len(db["turn_thresholds"]),
@@ -269,3 +308,5 @@ if __name__ == "__main__":
 
     with open(c_name, "w") as cf:
         cf.write(c)
+
+# end