Put the long and short location descriptions into a 'locations' data structure.

They're renamed 'small' and 'big' to avoid colliding with C reserved words.
This commit is contained in:
Jason S. Ninneman 2017-06-14 16:45:49 -07:00
parent da883d53c0
commit 1322a347ae
4 changed files with 792 additions and 388 deletions

File diff suppressed because it is too large Load diff

2
init.c
View file

@ -184,7 +184,7 @@ void initialise(void)
for (i=1; i<=LOCSIZ; i++) { for (i=1; i<=LOCSIZ; i++) {
game.abbrev[i]=0; game.abbrev[i]=0;
if (!(long_location_descriptions[i] == 0 || KEY[i] == 0)) { if (!(locations[i].description.big == 0 || KEY[i] == 0)) {
k=KEY[i]; k=KEY[i];
if(MOD(labs(TRAVEL[k]),1000) == 1)COND[i]=2; if(MOD(labs(TRAVEL[k]),1000) == 1)COND[i]=2;
} }

4
main.c
View file

@ -936,9 +936,9 @@ static bool do_command(FILE *cmdin)
for (;;) { for (;;) {
if (game.loc == 0) if (game.loc == 0)
croak(cmdin); croak(cmdin);
char* msg = short_location_descriptions[game.loc]; char* msg = locations[game.loc].description.small;
if (MOD(game.abbrev[game.loc],game.abbnum) == 0 || msg == 0) if (MOD(game.abbrev[game.loc],game.abbnum) == 0 || msg == 0)
msg=long_location_descriptions[game.loc]; msg=locations[game.loc].description.big;
if (!FORCED(game.loc) && DARK(game.loc)) { if (!FORCED(game.loc) && DARK(game.loc)) {
/* The easiest way to get killed is to fall into a pit in /* The easiest way to get killed is to fall into a pit in
* pitch darkness. */ * pitch darkness. */

View file

@ -17,13 +17,16 @@ def c_escape(string):
string = string.replace("'", "\\'") string = string.replace("'", "\\'")
return string return string
def quotewrap(string):
"""Wrap a string in double quotes."""
return '"' + string + '"'
def write_regular_messages(name, h, c): def write_regular_messages(name, h, c):
if name != "short_location_descriptions": h += "enum {}_refs {{\n".format(name)
h += "enum {}_refs {{\n".format(name) for key, text in dungeon[name]:
for key, text in dungeon[name]: h += " {},\n".format(key)
h += " {},\n".format(key) h += "};\n\n"
h += "};\n\n"
c += "char* {}[] = {{\n".format(name) c += "char* {}[] = {{\n".format(name)
index = 0 index = 0
@ -48,8 +51,16 @@ typedef struct {
char** longs; char** longs;
} object_description_t; } object_description_t;
extern char* long_location_descriptions[]; typedef struct {
extern char* short_location_descriptions[]; char* small;
char* big;
} descriptions_t;
typedef struct {
descriptions_t description;
} location_t;
extern location_t locations[];
extern object_description_t object_descriptions[]; extern object_description_t object_descriptions[];
extern char* arbitrary_messages[]; extern char* arbitrary_messages[];
extern char* class_messages[]; extern char* class_messages[];
@ -65,13 +76,36 @@ c = """#include "{}"
for name in [ for name in [
"arbitrary_messages", "arbitrary_messages",
"long_location_descriptions",
"short_location_descriptions",
"class_messages", "class_messages",
"turn_threshold_messages", "turn_threshold_messages",
]: ]:
h, c = write_regular_messages(name, h, c) h, c = write_regular_messages(name, h, c)
h += "enum locations_refs {\n"
c += "location_t locations[] = {\n"
for key, data in dungeon["locations"]:
h += " {},\n".format(key)
try:
short = quotewrap(c_escape(data["description"]["short"]))
except AttributeError:
short = "NULL"
try:
long = quotewrap(c_escape(data["description"]["long"]))
except AttributeError:
long = "NULL"
c += """ {{
.description = {{
.small = {},
.big = {},
}},
}},
""".format(short, long)
c += "};\n\n"
h += "};\n\n"
h += "enum object_descriptions_refs {\n" h += "enum object_descriptions_refs {\n"
c += "object_description_t object_descriptions[] = {\n" c += "object_description_t object_descriptions[] = {\n"
for key, data in dungeon["object_descriptions"]: for key, data in dungeon["object_descriptions"]: