Abolish HNTMAX and HNTSIZ in favor of HINT_COUNT.
[open-adventure.git] / newdungeon.py
index 923fb397373b769624cfab520e93dfcd501e2018..dffb8d142b0d58d136c6234ca7ddfe68e780ad12 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;
@@ -29,28 +33,42 @@ typedef struct {{
   const char* yes_response;
 }} obituary_t;
 
+typedef struct {{
+  const int threshold;
+  const int point_loss;
+  const char* message;
+}} turn_threshold_t;
+
+typedef struct {{
+  const int threshold;
+  const char* message;
+}} class_t;
+
+typedef struct {{
+  const int number;
+  const int turns;
+  const int penalty;
+  const char* question;
+  const char* hint;
+}} hint_t;
+
 extern location_t locations[];
 extern object_description_t object_descriptions[];
 extern const char* arbitrary_messages[];
-extern const char* class_messages[];
-extern const char* turn_threshold_messages[];
+extern const class_t classes[];
+extern turn_threshold_t turn_thresholds[];
 extern obituary_t obituaries[];
+extern hint_t hints[];
 
-extern size_t CLSSES;
-extern int maximum_deaths;
+extern const size_t CLSSES;
+extern const int maximum_deaths;
+extern const int turn_threshold_count;
+#define HINT_COUNT {}
 
 enum arbitrary_messages_refs {{
 {}
 }};
 
-enum class_messages_refs {{
-{}
-}};
-
-enum turn_threshold_messages_refs {{
-{}
-}};
-
 enum locations_refs {{
 {}
 }};
@@ -58,19 +76,23 @@ 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 "{}"
 
 const char* arbitrary_messages[] = {{
 {}
 }};
 
-const char* class_messages[] = {{
+const class_t classes[] = {{
 {}
 }};
 
-const char* turn_threshold_messages[] = {{
+turn_threshold_t turn_thresholds[] = {{
 {}
 }};
 
@@ -86,8 +108,15 @@ obituary_t obituaries[] = {{
 {}
 }};
 
-size_t CLSSES = {};
-int maximum_deaths = {};
+hint_t hints[] = {{
+{}
+}};
+
+const size_t CLSSES = {};
+const int maximum_deaths = {};
+const int turn_threshold_count = {};
+
+/* end */
 """
 
 def make_c_string(string):
@@ -119,20 +148,32 @@ def get_arbitrary_messages(arb):
     return arb_str
 
 def get_class_messages(cls):
-    template = """    {},
+    template = """    {{
+        .threshold = {},
+        .message = {},
+    }},
 """
     cls_str = ""
     for item in cls:
-        cls_str += template.format(make_c_string(item[1]))
+        threshold = item["threshold"]
+        message = make_c_string(item["message"])
+        cls_str += template.format(threshold, message)
     cls_str = cls_str[:-1] # trim trailing newline
-    return cls_str    
+    return cls_str
 
-def get_turn_threshold_messages(trn):
-    template = """    {},
+def get_turn_thresholds(trn):
+    template = """    {{
+        .threshold = {},
+        .point_loss = {},
+        .message = {},
+    }},
 """
     trn_str = ""
     for item in trn:
-        trn_str += template.format(make_c_string(item[1]))
+        threshold = item["threshold"]
+        point_loss = item["point_loss"]
+        message = make_c_string(item["message"])
+        trn_str += template.format(threshold, point_loss, message)
     trn_str = trn_str[:-1] # trim trailing newline
     return trn_str
 
@@ -188,31 +229,57 @@ def get_obituaries(obit):
     obit_str = obit_str[:-1] # trim trailing newline
     return obit_str
 
-with open(yaml_name, "r") as f:
-    db = yaml.load(f)
-
-h = h_template.format(
-    get_refs(db["arbitrary_messages"]),
-    get_refs(db["class_messages"]),
-    get_refs(db["turn_threshold_messages"]),
-    get_refs(db["locations"]),
-    get_refs(db["object_descriptions"]),
-)
-
-c = c_template.format(
-    h_name,
-    get_arbitrary_messages(db["arbitrary_messages"]),
-    get_class_messages(db["class_messages"]),
-    get_turn_threshold_messages(db["turn_threshold_messages"]),
-    get_locations(db["locations"]),
-    get_object_descriptions(db["object_descriptions"]),
-    get_obituaries(db["obituaries"]),
-    len(db["class_messages"]),
-    len(db["obituaries"]),
-)
-
-with open(h_name, "w") as hf:
-    hf.write(h)
-
-with open(c_name, "w") as cf:
-    cf.write(c)
+def get_hints(hnt, arb):
+    template = """    {{
+        .number = {},
+        .penalty = {},
+        .turns = {},
+        .question = {},
+        .hint = {},
+    }},
+"""
+    hnt_str = ""
+    md = dict(arb)
+    for item in hnt:
+        number = item["number"]
+        penalty = item["penalty"]
+        turns = item["turns"]
+        question = make_c_string(md[item["question"]])
+        hint = make_c_string(md[item["hint"]])
+        hnt_str += template.format(number, penalty, turns, question, hint)
+    hnt_str = hnt_str[:-1] # trim trailing newline
+    return hnt_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"]),
+    )
+
+    c = c_template.format(
+        h_name,
+        get_arbitrary_messages(db["arbitrary_messages"]),
+        get_class_messages(db["classes"]),
+        get_turn_thresholds(db["turn_thresholds"]),
+        get_locations(db["locations"]),
+        get_object_descriptions(db["object_descriptions"]),
+        get_obituaries(db["obituaries"]),
+        get_hints(db["hints"], db["arbitrary_messages"]),
+        len(db["classes"]),
+        len(db["obituaries"]),
+        len(db["turn_thresholds"]),
+    )
+
+    with open(h_name, "w") as hf:
+        hf.write(h)
+
+    with open(c_name, "w") as cf:
+        cf.write(c)
+
+# end