Rationalize names of structure array sizes.
[open-adventure.git] / newdungeon.py
index 873990c46d10996c74c5665929f860333caf1de0..7f70741d331f62aebe962f47a8e09434db3dbf6b 100755 (executable)
@@ -8,6 +8,8 @@ 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
@@ -20,6 +22,8 @@ h_template = """/* Generated from adventure.yaml - do not hand-hack! */
 typedef struct {{
   const char* inventory;
   const char** longs;
+  const char** sounds;
+  const char** texts;
 }} object_description_t;
 
 typedef struct {{
@@ -66,10 +70,10 @@ 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;
-#define HINT_COUNT {}
+#define NHINTS         {}
+#define NCLASSES       {}
+#define NDEATHS                {}
+#define NTHRESHOLDS    {}
 
 enum arbitrary_messages_refs {{
 {}
@@ -83,6 +87,9 @@ enum object_descriptions_refs {{
 {}
 }};
 
+/* State definitions */
+
+{}
 #endif /* end NEWDB_H */
 """
 
@@ -123,10 +130,6 @@ long conditions[] = {{
 {}
 }};
 
-const size_t CLSSES = {};
-const int maximum_deaths = {};
-const int turn_threshold_count = {};
-
 /* end */
 """
 
@@ -212,6 +215,12 @@ def get_object_descriptions(obj):
     template = """    {{
         .inventory = {},
         .longs = (const char* []) {{
+{}
+        }},
+        .sounds = (const char* []) {{
+{}
+        }},
+        .texts = (const char* []) {{
 {}
         }},
     }},
@@ -223,10 +232,36 @@ 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
-        obj_str += template.format(i_msg, longs_str)
+            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"
+        sounds_str = ""
+        if item[1].get("sounds") == None:
+            sounds_str = " " * 12 + "NULL,"
+        else:
+             for l_msg in item[1]["sounds"]:
+                 sounds_str += " " * 12 + make_c_string(l_msg) + ",\n"
+             sounds_str = sounds_str[:-1] # trim trailing newline
+        texts_str = ""
+        if item[1].get("texts") == None:
+            texts_str = " " * 12 + "NULL,"
+        else:
+             for l_msg in item[1]["texts"]:
+                 texts_str += " " * 12 + make_c_string(l_msg) + ",\n"
+             texts_str = texts_str[:-1] # trim trailing newline
+        obj_str += template.format(i_msg, longs_str, sounds_str, texts_str)
     obj_str = obj_str[:-1] # trim trailing newline
     return obj_str
 
@@ -290,13 +325,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"]),
@@ -307,9 +335,17 @@ if __name__ == "__main__":
         get_obituaries(db["obituaries"]),
         get_hints(db["hints"], db["arbitrary_messages"]),
         get_condbits(db["locations"]),
+    )
+
+    h = h_template.format(
+        len(db["hints"]),
         len(db["classes"]),
         len(db["obituaries"]),
         len(db["turn_thresholds"]),
+        get_refs(db["arbitrary_messages"]),
+        get_refs(db["locations"]),
+        get_refs(db["object_descriptions"]),
+        statedefines,
     )
 
     with open(h_name, "w") as hf: