-#!/usr/bin/python3
+#!/usr/bin/env python
# This is the open-adventure dungeon generator. It consumes a YAML description of
# the dungeon and outputs a dungeon.h and dungeon.c pair of C code files.
typedef struct {{
const string_group_t words;
const char* message;
+ const bool noaction;
}} action_t;
-typedef struct {{
- const string_group_t words;
- const char* message;
-}} special_t;
-
enum condtype_t {{cond_goto, cond_pct, cond_carry, cond_with, cond_not}};
enum desttype_t {{dest_goto, dest_special, dest_speak}};
extern long conditions[];
extern const motion_t motions[];
extern const action_t actions[];
-extern const special_t specials[];
extern const travelop_t travel[];
extern const long tkey[];
extern const char *ignore;
#define NCLASSES {}
#define NDEATHS {}
#define NTHRESHOLDS {}
-#define NMOTIONS {}
+#define NMOTIONS {}
#define NACTIONS {}
-#define NSPECIALS {}
#define NTRAVEL {}
#define NKEYS {}
{}
}};
-enum special_refs {{
-{}
-}};
-
/* State definitions */
{}
{}
}};
-const special_t specials[] = {{
-{}
-}};
-
const long tkey[] = {{{}}};
const travelop_t travel[] = {{
if labels:
global statedefines
statedefines += "/* States for %s */\n" % item[0]
- for (i, label) in enumerate(labels):
- statedefines += "#define %s\t%d\n" % (label, i)
+ for (j, label) in enumerate(labels):
+ statedefines += "#define %s\t%d\n" % (label, j)
statedefines += "\n"
sounds_str = ""
if attr.get("sounds") == None:
template = """ {{
.words = {},
.message = {},
+ .noaction = {},
}},
"""
act_str = ""
for action in actions:
contents = action[1]
-
- if contents["words"] == None:
- words_str = get_string_group([])
- else:
- words_str = get_string_group(contents["words"])
-
- if contents["message"] == None:
- message = "NO_MESSAGE"
- else:
- message = contents["message"]
-
- act_str += template.format(words_str, message)
- global ignore
- if contents.get("oldstyle", True) == False:
- for word in contents["words"]:
- if len(word) == 1:
- ignore += word.upper()
- act_str = act_str[:-1] # trim trailing newline
- return act_str
-
-def get_specials(specials):
- template = """ {{
- .words = {},
- .message = {},
- }},
-"""
- spc_str = ""
- for special in specials:
- contents = special[1]
if contents["words"] == None:
words_str = get_string_group([])
else:
message = make_c_string(contents["message"])
- spc_str += template.format(words_str, message)
+ if contents.get("noaction") == None:
+ noaction = "false"
+ else:
+ noaction = "true"
+
+ act_str += template.format(words_str, message, noaction)
global ignore
if contents.get("oldstyle", True) == False:
for word in contents["words"]:
if len(word) == 1:
ignore += word.upper()
- spc_str = spc_str[:-1] # trim trailing newline
- return spc_str
+ act_str = act_str[:-1] # trim trailing newline
+ return act_str
def bigdump(arr):
out = ""
try:
return locnames.index(action[1])
except ValueError:
- sys.stderr.write("dungeon: unknown location %s in goto clause of %s\n" % (cond[1], name))
+ sys.stderr.write("dungeon: unknown location %s in goto clause of %s\n" % (action[1], name))
elif action[0] == "special":
return 300 + action[1]
elif action[0] == "speak":
get_hints(db["hints"], db["arbitrary_messages"]),
get_condbits(db["locations"]),
get_motions(db["motions"]),
- get_specials(db["actions"]),
- get_specials(db["specials"]),
+ get_actions(db["actions"]),
bigdump(tkey),
get_travel(travel),
ignore,
len(db["turn_thresholds"]),
len(db["motions"]),
len(db["actions"]),
- len(db["specials"]),
len(travel),
len(tkey),
deathbird,
get_refs(db["objects"]),
get_refs(db["motions"]),
get_refs(db["actions"]),
- get_refs(db["specials"]),
statedefines,
)