Towards a more readable generated file.
[open-adventure.git] / make_dungeon.py
index c394b5f516d20c0b4d74017a17b84d12ce1b21d8..45b9334c09e5427de996dfb76233e0849a6c4516 100755 (executable)
@@ -141,7 +141,7 @@ typedef struct {{
 
 typedef struct {{
   const string_group_t words;
-  const long message;
+  const char* message;
 }} action_t;
 
 typedef struct {{
@@ -192,6 +192,8 @@ extern const char *ignore;
 #define NTRAVEL                {}
 #define NKEYS          {}
 
+#define BIRD_ENDSTATE  {}
+
 enum arbitrary_messages_refs {{
 {}
 }};
@@ -353,7 +355,7 @@ def get_turn_thresholds(trn):
     return trn_str
 
 def get_locations(loc):
-    template = """    {{ // {}
+    template = """    {{ // {}: {}
         .description = {{
             .small = {},
             .big = {},
@@ -368,12 +370,12 @@ def get_locations(loc):
         long_d = make_c_string(item[1]["description"]["long"])
         sound = item[1].get("sound", "SILENT")
         loud = "true" if item[1].get("loud") else "false"
-        loc_str += template.format(i, short_d, long_d, sound, loud)
+        loc_str += template.format(i, item[0], short_d, long_d, sound, loud)
     loc_str = loc_str[:-1] # trim trailing newline
     return loc_str
 
 def get_objects(obj):
-    template = """    {{ // {}
+    template = """    {{ // {}: {}
         .words = {},
         .inventory = {},
         .plac = {},
@@ -407,18 +409,15 @@ def get_objects(obj):
         else:
             labels = []
             for l_msg in attr["descriptions"]:
-                if not isinstance(l_msg, str):
-                    labels.append(l_msg)
-                    l_msg = l_msg[1]
                 descriptions_str += " " * 12 + make_c_string(l_msg) + ",\n"
+            for label in attr.get("states", []):
+                labels.append(label)
             descriptions_str = descriptions_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)
+                for (i, label) in enumerate(labels):
+                    statedefines += "#define %s\t%d\n" % (label, i)
                 statedefines += "\n"
         sounds_str = ""
         if attr.get("sounds") == None:
@@ -445,14 +444,12 @@ def get_objects(obj):
         immovable = attr.get("immovable", False)
         try:
             if type(locs) == str:
-                locs = [locnames.index(locs), -1 if immovable else 0]
-            else:
-                locs = [locnames.index(x) for x in locs]
+                locs = [locs, -1 if immovable else 0]
         except IndexError:
             sys.stderr.write("dungeon: unknown object location in %s\n" % locs)
             sys.exit(1)
         treasure = "true" if attr.get("treasure") else "false"
-        obj_str += template.format(i, words_str, i_msg, locs[0], locs[1], treasure, descriptions_str, sounds_str, texts_str, changes_str)
+        obj_str += template.format(i, item[0], words_str, i_msg, locs[0], locs[1], treasure, descriptions_str, sounds_str, texts_str, changes_str)
     obj_str = obj_str[:-1] # trim trailing newline
     return obj_str
 
@@ -651,6 +648,8 @@ def buildtravel(locs, objs):
                 obj = objnames.index(cond[1])
                 if type(cond[2]) == int:
                     state = cond[2]
+                elif cond[2] in objs[obj][1].get("states", []):
+                    state = objs[obj][1].get("states").index(cond[2])
                 else:
                     for (i, stateclause) in enumerate(objs[obj][1]["descriptions"]):
                         if type(stateclause) == list:
@@ -716,10 +715,11 @@ def buildtravel(locs, objs):
         elif travel:
             travel[-1][-1] = not travel[-1][-1]
         while rule:
+            cond = newloc // 1000
             travel.append([rule.pop(0),
-                           newloc // 1000,
+                           cond,
                            newloc % 1000,
-                           (newloc//1000)==100,
+                           cond==100,
                            False])
         travel[-1][-1] = True
     return (travel, tkey)
@@ -761,13 +761,17 @@ if __name__ == "__main__":
         get_hints(db["hints"], db["arbitrary_messages"]),
         get_condbits(db["locations"]),
         get_motions(db["motions"]),
-        get_actions(db["actions"]),
+        get_specials(db["actions"]),
         get_specials(db["specials"]),
         bigdump(tkey),
         get_travel(travel), 
         ignore,
     )
 
+    # 0-origin index of birds's last song.  Bird should
+    # die after player hears this.
+    deathbird = len(dict(db["objects"])["BIRD"]["sounds"]) - 1
+
     h = h_template.format(
         len(db["locations"])-1,
         len(db["objects"])-1,
@@ -780,6 +784,7 @@ if __name__ == "__main__":
         len(db["specials"]),
         len(travel),
         len(tkey),
+        deathbird,
         get_refs(db["arbitrary_messages"]),
         get_refs(db["locations"]),
         get_refs(db["objects"]),