Support loud locations.
[open-adventure.git] / newdungeon.py
index 193fe03afffbe49abfc359b02959f55320cbc9f9..873990c46d10996c74c5665929f860333caf1de0 100755 (executable)
@@ -13,6 +13,9 @@ h_template = """/* Generated from adventure.yaml - do not hand-hack! */
 #define NEWDB_H
 
 #include <stdio.h>
+#include <stdbool.h>
+
+#define SILENT -1      /* no sound */
 
 typedef struct {{
   const char* inventory;
@@ -26,6 +29,8 @@ typedef struct {{
 
 typedef struct {{
   descriptions_t description;
+  const long sound;
+  const bool loud;
 }} location_t;
 
 typedef struct {{
@@ -59,6 +64,7 @@ extern const class_t classes[];
 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;
@@ -82,6 +88,7 @@ enum object_descriptions_refs {{
 
 c_template = """/* Generated from adventure.yaml - do not hand-hack! */
 
+#include "common.h"
 #include "{}"
 
 const char* arbitrary_messages[] = {{
@@ -112,6 +119,10 @@ hint_t hints[] = {{
 {}
 }};
 
+long conditions[] = {{
+{}
+}};
+
 const size_t CLSSES = {};
 const int maximum_deaths = {};
 const int turn_threshold_count = {};
@@ -183,13 +194,17 @@ def get_locations(loc):
             .small = {},
             .big = {},
         }},
+        .sound = {},
+        .loud = {},
     }},
 """
     loc_str = ""
     for item in loc:
         short_d = make_c_string(item[1]["description"]["short"])
         long_d = make_c_string(item[1]["description"]["long"])
-        loc_str += template.format(short_d, long_d)
+        sound = item[1].get("sound", "SILENT")
+        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
 
@@ -251,6 +266,25 @@ 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:
@@ -272,6 +306,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"]),