From 319c5830c835b86cdcaa56e2ba9bdb50549e9186 Mon Sep 17 00:00:00 2001 From: Aaron Traas Date: Sun, 23 Jul 2017 12:07:10 -0400 Subject: [PATCH] Moved dungeon.c and dungeon.h templates into external files. Also refactored to use named vars in the templates, so it's easier to refactor, as order when you call .format() isn't important. --- make_dungeon.py | 311 +++--------------- .../coverage_dungeon.html.tpl | 0 templates/dungeon.c.tpl | 51 +++ templates/dungeon.h.tpl | 165 ++++++++++ tests/coverage_dungeon.py | 2 +- 5 files changed, 269 insertions(+), 260 deletions(-) rename {tests => templates}/coverage_dungeon.html.tpl (100%) create mode 100644 templates/dungeon.c.tpl create mode 100644 templates/dungeon.h.tpl diff --git a/make_dungeon.py b/make_dungeon.py index 03b5b04..6ac5ba1 100755 --- a/make_dungeon.py +++ b/make_dungeon.py @@ -9,233 +9,15 @@ import sys, yaml -yaml_name = "adventure.yaml" -h_name = "dungeon.h" -c_name = "dungeon.c" +YAML_NAME = "adventure.yaml" +H_NAME = "dungeon.h" +C_NAME = "dungeon.c" +H_TEMPLATE_PATH = "templates/dungeon.h.tpl" +C_TEMPLATE_PATH = "templates/dungeon.c.tpl" -statedefines = "" - -h_template = """/* Generated from adventure.yaml - do not hand-hack! */ -#ifndef DUNGEON_H -#define DUNGEON_H - -#include -#include - -#define SILENT -1 /* no sound */ - -/* Symbols for cond bits */ -#define COND_LIT 0 /* Light */ -#define COND_OILY 1 /* If bit 2 is on: on for oil, off for water */ -#define COND_FLUID 2 /* Liquid asset, see bit 1 */ -#define COND_NOARRR 3 /* Pirate doesn't go here unless following */ -#define COND_NOBACK 4 /* Cannot use "back" to move away */ -#define COND_ABOVE 5 -#define COND_DEEP 6 /* Deep - e.g where dwarves are active */ -#define COND_FOREST 7 /* In the forest */ -#define COND_FORCED 8 /* Only one way in or out of here */ -/* Bits past 10 indicate areas of interest to "hint" routines */ -#define COND_HBASE 10 /* Base for location hint bits */ -#define COND_HCAVE 11 /* Trying to get into cave */ -#define COND_HBIRD 12 /* Trying to catch bird */ -#define COND_HSNAKE 13 /* Trying to deal with snake */ -#define COND_HMAZE 14 /* Lost in maze */ -#define COND_HDARK 15 /* Pondering dark room */ -#define COND_HWITT 16 /* At Witt's End */ -#define COND_HCLIFF 17 /* Cliff with urn */ -#define COND_HWOODS 18 /* Lost in forest */ -#define COND_HOGRE 19 /* Trying to deal with ogre */ -#define COND_HJADE 20 /* Found all treasures except jade */ - -typedef struct {{ - const char** strs; - const int n; -}} string_group_t; - -typedef struct {{ - const string_group_t words; - const char* inventory; - int plac, fixd; - bool is_treasure; - const char** descriptions; - const char** sounds; - const char** texts; - const char** changes; -}} object_t; - -typedef struct {{ - const char* small; - const char* big; -}} descriptions_t; - -typedef struct {{ - descriptions_t description; - const long sound; - const bool loud; -}} location_t; - -typedef struct {{ - const char* query; - 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; - -typedef struct {{ - const string_group_t words; -}} motion_t; - -typedef struct {{ - const string_group_t words; - const char* message; - const bool noaction; -}} action_t; - -enum condtype_t {{cond_goto, cond_pct, cond_carry, cond_with, cond_not}}; -enum desttype_t {{dest_goto, dest_special, dest_speak}}; - -typedef struct {{ - const long motion; - const long condtype; - const long condarg1; - const long condarg2; - const enum desttype_t desttype; - const long destval; - const bool nodwarves; - const bool stop; -}} travelop_t; - -/* Abstract out the encoding of words in the travel array. Gives us - * some hope of getting to a less cryptic representation than we - * inherited from FORTRAN, someday. To understand these, read the - * encoding description for travel. - */ -#define T_TERMINATE(entry) ((entry).motion == 1) - -extern const location_t locations[]; -extern const object_t objects[]; -extern const char* arbitrary_messages[]; -extern const class_t classes[]; -extern const turn_threshold_t turn_thresholds[]; -extern const obituary_t obituaries[]; -extern const hint_t hints[]; -extern long conditions[]; -extern const motion_t motions[]; -extern const action_t actions[]; -extern const travelop_t travel[]; -extern const long tkey[]; -extern const char *ignore; - -#define NLOCATIONS {} -#define NOBJECTS {} -#define NHINTS {} -#define NCLASSES {} -#define NDEATHS {} -#define NTHRESHOLDS {} -#define NMOTIONS {} -#define NACTIONS {} -#define NTRAVEL {} -#define NKEYS {} - -#define BIRD_ENDSTATE {} - -enum arbitrary_messages_refs {{ -{} -}}; - -enum locations_refs {{ -{} -}}; - -enum object_refs {{ -{} -}}; - -enum motion_refs {{ -{} -}}; - -enum action_refs {{ -{} -}}; - -/* State definitions */ - -{} -#endif /* end DUNGEON_H */ -""" - -c_template = """/* Generated from adventure.yaml - do not hand-hack! */ - -#include "{}" - -const char* arbitrary_messages[] = {{ -{} -}}; - -const class_t classes[] = {{ -{} -}}; - -const turn_threshold_t turn_thresholds[] = {{ -{} -}}; - -const location_t locations[] = {{ -{} -}}; - -const object_t objects[] = {{ -{} -}}; - -const obituary_t obituaries[] = {{ -{} -}}; - -const hint_t hints[] = {{ -{} -}}; - -long conditions[] = {{ -{} -}}; +DONOTEDIT_COMMENT = "/* Generated from adventure.yaml - do not hand-hack! */\n\n" -const motion_t motions[] = {{ -{} -}}; - -const action_t actions[] = {{ -{} -}}; - -const long tkey[] = {{{}}}; - -const travelop_t travel[] = {{ -{} -}}; - -const char *ignore = \"{}\"; - -/* end */ -""" +statedefines = "" def make_c_string(string): """Render a Python string into C string literal format.""" @@ -738,7 +520,7 @@ def get_travel(travel): return out if __name__ == "__main__": - with open(yaml_name, "r") as f: + with open(YAML_NAME, "r") as f: db = yaml.load(f) locnames = [x[0] for x in db["locations"]] @@ -749,21 +531,32 @@ if __name__ == "__main__": (travel, tkey) = buildtravel(db["locations"], db["objects"]) ignore = "" + try: + with open(H_TEMPLATE_PATH, "r") as htf: + # read in dungeon.h template + h_template = DONOTEDIT_COMMENT + htf.read() + with open(C_TEMPLATE_PATH, "r") as ctf: + # read in dungeon.c template + c_template = DONOTEDIT_COMMENT + ctf.read() + except IOError as e: + print('ERROR: reading template failed ({})'.format(e.strerror)) + exit(-1) + 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_objects(db["objects"]), - get_obituaries(db["obituaries"]), - get_hints(db["hints"], db["arbitrary_messages"]), - get_condbits(db["locations"]), - get_motions(db["motions"]), - get_actions(db["actions"]), - bigdump(tkey), - get_travel(travel), - ignore, + h_file = H_NAME, + arbitrary_messages = get_arbitrary_messages(db["arbitrary_messages"]), + classes = get_class_messages(db["classes"]), + turn_thresholds = get_turn_thresholds(db["turn_thresholds"]), + locations = get_locations(db["locations"]), + objects = get_objects(db["objects"]), + obituaries = get_obituaries(db["obituaries"]), + hints = get_hints(db["hints"], db["arbitrary_messages"]), + conditions = get_condbits(db["locations"]), + motions = get_motions(db["motions"]), + actions = get_actions(db["actions"]), + tkeys = bigdump(tkey), + travel = get_travel(travel), + ignore = ignore ) # 0-origin index of birds's last song. Bird should @@ -771,29 +564,29 @@ if __name__ == "__main__": deathbird = len(dict(db["objects"])["BIRD"]["sounds"]) - 1 h = h_template.format( - len(db["locations"])-1, - len(db["objects"])-1, - len(db["hints"]), - len(db["classes"])-1, - len(db["obituaries"]), - len(db["turn_thresholds"]), - len(db["motions"]), - len(db["actions"]), - len(travel), - len(tkey), - deathbird, - get_refs(db["arbitrary_messages"]), - get_refs(db["locations"]), - get_refs(db["objects"]), - get_refs(db["motions"]), - get_refs(db["actions"]), - statedefines, + num_locations = len(db["locations"])-1, + num_objects = len(db["objects"])-1, + num_hints = len(db["hints"]), + num_classes = len(db["classes"])-1, + num_deaths = len(db["obituaries"]), + num_thresholds = len(db["turn_thresholds"]), + num_motions = len(db["motions"]), + num_actions = len(db["actions"]), + num_travel = len(travel), + num_keys = len(tkey), + bird_endstate = deathbird, + arbitrary_messages = get_refs(db["arbitrary_messages"]), + locations = get_refs(db["locations"]), + objects = get_refs(db["objects"]), + motions = get_refs(db["motions"]), + actions = get_refs(db["actions"]), + state_definitions = statedefines ) - with open(h_name, "w") as hf: + with open(H_NAME, "w") as hf: hf.write(h) - with open(c_name, "w") as cf: + with open(C_NAME, "w") as cf: cf.write(c) # end diff --git a/tests/coverage_dungeon.html.tpl b/templates/coverage_dungeon.html.tpl similarity index 100% rename from tests/coverage_dungeon.html.tpl rename to templates/coverage_dungeon.html.tpl diff --git a/templates/dungeon.c.tpl b/templates/dungeon.c.tpl new file mode 100644 index 0000000..dbc28a6 --- /dev/null +++ b/templates/dungeon.c.tpl @@ -0,0 +1,51 @@ +#include "{h_file}" + +const char* arbitrary_messages[] = {{ +{arbitrary_messages} +}}; + +const class_t classes[] = {{ +{classes} +}}; + +const turn_threshold_t turn_thresholds[] = {{ +{turn_thresholds} +}}; + +const location_t locations[] = {{ +{locations} +}}; + +const object_t objects[] = {{ +{objects} +}}; + +const obituary_t obituaries[] = {{ +{obituaries} +}}; + +const hint_t hints[] = {{ +{hints} +}}; + +long conditions[] = {{ +{conditions} +}}; + +const motion_t motions[] = {{ +{motions} +}}; + +const action_t actions[] = {{ +{actions} +}}; + +const long tkey[] = {{{tkeys}}}; + +const travelop_t travel[] = {{ +{travel} +}}; + +const char *ignore = "{ignore}"; + +/* end */ \ No newline at end of file diff --git a/templates/dungeon.h.tpl b/templates/dungeon.h.tpl new file mode 100644 index 0000000..4dde750 --- /dev/null +++ b/templates/dungeon.h.tpl @@ -0,0 +1,165 @@ +#ifndef DUNGEON_H +#define DUNGEON_H + +#include +#include + +#define SILENT -1 /* no sound */ + +/* Symbols for cond bits */ +#define COND_LIT 0 /* Light */ +#define COND_OILY 1 /* If bit 2 is on: on for oil, off for water */ +#define COND_FLUID 2 /* Liquid asset, see bit 1 */ +#define COND_NOARRR 3 /* Pirate doesn't go here unless following */ +#define COND_NOBACK 4 /* Cannot use "back" to move away */ +#define COND_ABOVE 5 +#define COND_DEEP 6 /* Deep - e.g where dwarves are active */ +#define COND_FOREST 7 /* In the forest */ +#define COND_FORCED 8 /* Only one way in or out of here */ +/* Bits past 10 indicate areas of interest to "hint" routines */ +#define COND_HBASE 10 /* Base for location hint bits */ +#define COND_HCAVE 11 /* Trying to get into cave */ +#define COND_HBIRD 12 /* Trying to catch bird */ +#define COND_HSNAKE 13 /* Trying to deal with snake */ +#define COND_HMAZE 14 /* Lost in maze */ +#define COND_HDARK 15 /* Pondering dark room */ +#define COND_HWITT 16 /* At Witt's End */ +#define COND_HCLIFF 17 /* Cliff with urn */ +#define COND_HWOODS 18 /* Lost in forest */ +#define COND_HOGRE 19 /* Trying to deal with ogre */ +#define COND_HJADE 20 /* Found all treasures except jade */ + +typedef struct {{ + const char** strs; + const int n; +}} string_group_t; + +typedef struct {{ + const string_group_t words; + const char* inventory; + int plac, fixd; + bool is_treasure; + const char** descriptions; + const char** sounds; + const char** texts; + const char** changes; +}} object_t; + +typedef struct {{ + const char* small; + const char* big; +}} descriptions_t; + +typedef struct {{ + descriptions_t description; + const long sound; + const bool loud; +}} location_t; + +typedef struct {{ + const char* query; + 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; + +typedef struct {{ + const string_group_t words; +}} motion_t; + +typedef struct {{ + const string_group_t words; + const char* message; + const bool noaction; +}} action_t; + +enum condtype_t {{cond_goto, cond_pct, cond_carry, cond_with, cond_not}}; +enum desttype_t {{dest_goto, dest_special, dest_speak}}; + +typedef struct {{ + const long motion; + const long condtype; + const long condarg1; + const long condarg2; + const enum desttype_t desttype; + const long destval; + const bool nodwarves; + const bool stop; +}} travelop_t; + +/* Abstract out the encoding of words in the travel array. Gives us + * some hope of getting to a less cryptic representation than we + * inherited from FORTRAN, someday. To understand these, read the + * encoding description for travel. + */ +#define T_TERMINATE(entry) ((entry).motion == 1) + +extern const location_t locations[]; +extern const object_t objects[]; +extern const char* arbitrary_messages[]; +extern const class_t classes[]; +extern const turn_threshold_t turn_thresholds[]; +extern const obituary_t obituaries[]; +extern const hint_t hints[]; +extern long conditions[]; +extern const motion_t motions[]; +extern const action_t actions[]; +extern const travelop_t travel[]; +extern const long tkey[]; +extern const char *ignore; + +#define NLOCATIONS {num_locations} +#define NOBJECTS {num_objects} +#define NHINTS {num_hints} +#define NCLASSES {num_classes} +#define NDEATHS {num_deaths} +#define NTHRESHOLDS {num_thresholds} +#define NMOTIONS {num_motions} +#define NACTIONS {num_actions} +#define NTRAVEL {num_travel} +#define NKEYS {num_keys} + +#define BIRD_ENDSTATE {bird_endstate} + +enum arbitrary_messages_refs {{ +{arbitrary_messages} +}}; + +enum locations_refs {{ +{locations} +}}; + +enum object_refs {{ +{objects} +}}; + +enum motion_refs {{ +{motions} +}}; + +enum action_refs {{ +{actions} +}}; + +/* State definitions */ + +{state_definitions} + +#endif /* end DUNGEON_H */ \ No newline at end of file diff --git a/tests/coverage_dungeon.py b/tests/coverage_dungeon.py index 0a24865..6484fa7 100755 --- a/tests/coverage_dungeon.py +++ b/tests/coverage_dungeon.py @@ -14,7 +14,7 @@ import re TEST_DIR = "." YAML_PATH = "../adventure.yaml" -HTML_TEMPLATE_PATH = "coverage_dungeon.html.tpl" +HTML_TEMPLATE_PATH = "../templates/coverage_dungeon.html.tpl" DEFAULT_HTML_OUTPUT_PATH = "../coverage/adventure.yaml.html" STDOUT_REPORT_CATEGORY = " {name:.<19}: {percent:5.1f}% covered ({covered} of {total})\n" -- 2.31.1