From: Aaron Traas Date: Sun, 23 Jul 2017 16:07:10 +0000 (-0400) Subject: Moved dungeon.c and dungeon.h templates into external files. X-Git-Tag: 1.3~9 X-Git-Url: https://jxself.org/git/?a=commitdiff_plain;h=refs%2Fmerge-requests%2F259%2Fhead;p=open-adventure.git 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. --- 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/templates/coverage_dungeon.html.tpl b/templates/coverage_dungeon.html.tpl new file mode 100644 index 0000000..372c43f --- /dev/null +++ b/templates/coverage_dungeon.html.tpl @@ -0,0 +1,83 @@ + + + + + Coverage - adventure.yaml + + + + + + + + + + + + + + + + + + + + + +
adventure.yaml Coverage report
+ + + + + + + + + + + +
Test:adventure.yaml
Date:2017-07-07 21:47:56
+
+ + + + + + + + {summary} +
TotalCovered% Coverage
+
+
+
+ + {categories} +
+
+
+ + + + + + + +
Generated by: Open Adventure Dungeon Coverage Generator
+
+ + 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.html.tpl b/tests/coverage_dungeon.html.tpl deleted file mode 100644 index 372c43f..0000000 --- a/tests/coverage_dungeon.html.tpl +++ /dev/null @@ -1,83 +0,0 @@ - - - - - Coverage - adventure.yaml - - - - - - - - - - - - - - - - - - - - - -
adventure.yaml Coverage report
- - - - - - - - - - - -
Test:adventure.yaml
Date:2017-07-07 21:47:56
-
- - - - - - - - {summary} -
TotalCovered% Coverage
-
-
-
- - {categories} -
-
-
- - - - - - - -
Generated by: Open Adventure Dungeon Coverage Generator
-
- - 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"