From 537c4511e2f3802421f79aed7b6af16d66adb518 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 22 Jun 2017 15:56:42 -0400 Subject: [PATCH] Generate initializer from YAML for Section 9 bits. --- Makefile | 2 +- advent.h | 19 ----------------- adventure.yaml | 58 ++++++++++++++++++++++++++++---------------------- common.h | 22 +++++++++++++++++++ newdungeon.py | 26 ++++++++++++++++++++++ 5 files changed, 81 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index cc87a2b..a24e39a 100644 --- a/Makefile +++ b/Makefile @@ -65,7 +65,7 @@ newdb.o: newdb.c newdb.h database.h: dungeon ./dungeon -newdb.c newdb.h: +newdb.c newdb.h: newdungeon.py adventure.yaml python3 newdungeon.py linenoise.o: linenoise/linenoise.h diff --git a/advent.h b/advent.h index b8fafee..979196f 100644 --- a/advent.h +++ b/advent.h @@ -128,25 +128,6 @@ extern int suspend(void); extern int resume(void); extern int restore(FILE *); -/* Symbols for cond bits - used by following macros */ -#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 */ -/* 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 */ - /* * MOD(N,M) = Arithmetic modulus * AT(OBJ) = true if on either side of two-placed object diff --git a/adventure.yaml b/adventure.yaml index ccf2886..6fd5793 100644 --- a/adventure.yaml +++ b/adventure.yaml @@ -69,60 +69,70 @@ # FIXME: Hint texts shouldn't be in arbitrary_messages, but inlined here hints: - hint: &grate + name: CAVE number: 1 turns: 4 penalty: 2 question: ENTRY_QUERY hint: HARD_GRATE - hint: &bird + name: BIRD number: 2 turns: 5 penalty: 2 question: BIRD_QUERY hint: SKITTISH_BIRD - hint: &snake + name: SNAKE number: 3 turns: 8 penalty: 2 question: SNAKE_QUERY hint: SNAKE_HINT - hint: &maze + name: MAZE number: 4 turns: 75 penalty: 4 question: MAZE_HELP hint: DROP_THINGS - hint: &dark + name: DARK number: 5 turns: 25 penalty: 5 question: PLOVER_QUERY hint: EXPLORE_HINT - hint: &witt + name: WITT number: 6 turns: 20 penalty: 3 question: HELP_LEAVING hint: NOGO_WEST - - hint: &cliff + - hint: &urn + name: CLIFF number: 7 turns: 8 penalty: 2 question: WONDERING_QUERY hint: ADVANCED_SECTION - hint: &forest + name: WOODS number: 8 turns: 25 penalty: 2 question: FOREST_QUERY hint: GO_EAST - hint: &ogre + name: OGRE number: 9 turns: 10 penalty: 4 question: OGRE_QUERY hint: OGRE_CLUE - hint: &jade + name: JADE number: 10 turns: 1 penalty: 4 @@ -165,7 +175,7 @@ locations: !!omap long: 'The forest thins out here to reveal a steep cliff. There is no way\ndown, but a small ledge can be seen to the west across the chasm.' short: 'You''re at cliff.' conditions: {ABOVE: true, NOBACK: true, LIT: true} - hints: [*cliff] + hints: [*urn] - LOC_SLIT: description: long: 'At your feet all the water of the stream splashes into a 2-inch slit\nin the rock. Downstream the streambed is bare rock.' @@ -656,19 +666,19 @@ locations: !!omap long: 'You are in an alcove. A small nw path seems to widen after a short\ndistance. An extremely tight tunnel leads east. It looks like a very\ntight squeeze. An eerie light can be seen at the other end.' short: 'You''re in alcove.' conditions: {DEEP: true} - hits: [*dark] + hints: [*dark] - LOC_PLOVER: description: long: 'You''re in a small chamber lit by an eerie green light. An extremely\nnarrow tunnel exits to the west. A dark corridor leads ne.' short: 'You''re in Plover Room.' conditions: {DEEP: true, LIT: true} - hits: [*dark] + hints: [*dark] - LOC_DARKROOM: description: long: 'You''re in the dark-room. A corridor leading south is the only exit.' short: 'You''re in dark-room.' conditions: {DEEP: true} - hits: [*dark] + hints: [*dark] - LOC_ARCHED: description: long: 'You are in an arched hall. A coral passage once continued up and east\nfrom here, but is now blocked by debris. The air smells of sea water.' @@ -882,7 +892,7 @@ locations: !!omap long: 'You are in a large chamber with passages to the west and north.' short: !!null conditions: {DEEP: true} - hits: [*ogre] + hints: [*ogre] - LOC_STOREROOM: description: long: 'You are in the ogre''s storeroom. The only exit is to the south.' @@ -899,19 +909,19 @@ locations: !!omap long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST3: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST4: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: { FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST5: description: long: 'You are wandering aimlessly through the forest.' @@ -923,19 +933,19 @@ locations: !!omap long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST7: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST8: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST9: description: long: 'You are wandering aimlessly through the forest.' @@ -947,19 +957,19 @@ locations: !!omap long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST11: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST12: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST13: description: long: 'You are wandering aimlessly through the forest.' @@ -971,19 +981,19 @@ locations: !!omap long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST15: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST16: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST17: description: long: 'You are wandering aimlessly through the forest.' @@ -995,19 +1005,19 @@ locations: !!omap long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST19: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST20: description: long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true, DEEP: true} - hits: [*forest] + hints: [*forest] - LOC_FOREST21: description: long: 'You are wandering aimlessly through the forest.' @@ -1019,7 +1029,7 @@ locations: !!omap long: 'You are wandering aimlessly through the forest.' short: !!null conditions: {FOREST: true, NOBACK: true, LIT: true} - hits: [*forest] + hints: [*forest] - LOC_LEDGE: description: long: 'You are on a small ledge on one face of a sheer cliff. There are no\npaths away from the ledge. Across the chasm is a small clearing\nsurrounded by forest.' @@ -1110,10 +1120,6 @@ locations: !!omap long: '>>Foof!<<' short: !!null conditions: {DEEP: true} -- LOC_NUGGET5: - description: - long: !!null - short: !!null arbitrary_messages: !!omap - NO_MESSAGE: !!null diff --git a/common.h b/common.h index 801bf36..bdc8e0d 100644 --- a/common.h +++ b/common.h @@ -8,6 +8,28 @@ extern const char advent_to_ascii[128]; extern const char ascii_to_advent[128]; +/* Symbols for cond bits - used by advent.h */ +#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 */ +/* 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 */ + enum bugtype { MESSAGE_LINE_GT_70_CHARACTERS, // 0 NULL_LINE_IN_MESSAGE, // 1 diff --git a/newdungeon.py b/newdungeon.py index 193fe03..092c342 100755 --- a/newdungeon.py +++ b/newdungeon.py @@ -59,6 +59,7 @@ extern const class_t classes[]; extern turn_threshold_t turn_thresholds[]; extern obituary_t obituaries[]; extern hint_t hints[]; +extern const long conditions[]; extern const size_t CLSSES; extern const int maximum_deaths; @@ -82,6 +83,7 @@ enum object_descriptions_refs {{ c_template = """/* Generated from adventure.yaml - do not hand-hack! */ +#include "common.h" #include "{}" const char* arbitrary_messages[] = {{ @@ -112,6 +114,10 @@ hint_t hints[] = {{ {} }}; +const long conditions[] = {{ +{} +}}; + const size_t CLSSES = {}; const int maximum_deaths = {}; const int turn_threshold_count = {}; @@ -251,6 +257,25 @@ def get_hints(hnt, arb): hnt_str = hnt_str[:-1] # trim trailing newline return hnt_str +def get_condbits(locations): + cnd_str = "" + for (name, loc) in locations: + conditions = loc["conditions"] + hints = loc.get("hints") or [] + flaglist = [] + for flag in conditions: + if conditions[flag]: + flaglist.append(flag) + line = "|".join([("(1<