Generate newdb.[ch] at build time, parallel with database.[ch].

Having two data compile jobs is a temporary situation. Eventually newdb.[ch] will supersede database.[ch].
This commit is contained in:
Jason S. Ninneman 2017-06-14 11:32:41 -07:00
parent 178c7ff983
commit 60126c3dac
5 changed files with 1154 additions and 1317 deletions

View file

@ -22,7 +22,7 @@ ifeq ($(UNAME_S),Linux)
endif endif
OBJS=main.o init.o actions.o score.o misc.o saveresume.o common.o newdb.o OBJS=main.o init.o actions.o score.o misc.o saveresume.o common.o newdb.o
SOURCES=$(OBJS:.o=.c) dungeon.c advent.h common.h adventure.text Makefile control linenoise/linenoise.[ch] SOURCES=$(OBJS:.o=.c) dungeon.c advent.h common.h adventure.text Makefile control linenoise/linenoise.[ch] newdungeon.py
.c.o: .c.o:
$(CC) $(CCFLAGS) $(DBX) -c $< $(CC) $(CCFLAGS) $(DBX) -c $<
@ -30,7 +30,7 @@ SOURCES=$(OBJS:.o=.c) dungeon.c advent.h common.h adventure.text Makefile contro
advent: $(OBJS) database.o linenoise.o advent: $(OBJS) database.o linenoise.o
$(CC) $(CCFLAGS) $(DBX) -o advent $(OBJS) database.o linenoise.o $(LDFLAGS) $(LIBS) $(CC) $(CCFLAGS) $(DBX) -o advent $(OBJS) database.o linenoise.o $(LDFLAGS) $(LIBS)
main.o: advent.h database.h database.c common.h main.o: advent.h database.h database.c common.h newdb.h
init.o: advent.h database.h database.c common.h init.o: advent.h database.h database.c common.h
@ -47,11 +47,15 @@ common.o: common.h
database.o: database.c database.h common.h database.o: database.c database.h common.h
$(CC) $(CCFLAGS) $(DBX) -c database.c $(CC) $(CCFLAGS) $(DBX) -c database.c
newdb.o: newdb.h newdb.o: newdb.c newdb.h
$(CC) $(CCFLAGS) $(DBX) -c newdb.c
database.c database.h: dungeon database.c database.h: dungeon
./dungeon ./dungeon
newdb.c newdb.h:
./newdungeon.py
linenoise.o: linenoise/linenoise.h linenoise.o: linenoise/linenoise.h
$(CC) -c linenoise/linenoise.c $(CC) -c linenoise/linenoise.c
@ -60,6 +64,7 @@ dungeon: dungeon.o common.o
clean: clean:
rm -f *.o advent *.html database.[ch] dungeon *.gcno *.gcda rm -f *.o advent *.html database.[ch] dungeon *.gcno *.gcda
rm -f newdb.c newdb.h
rm -f README advent.6 MANIFEST *.tar.gz rm -f README advent.6 MANIFEST *.tar.gz
rm -f *~ rm -f *~
cd tests; $(MAKE) --quiet clean cd tests; $(MAKE) --quiet clean

File diff suppressed because it is too large Load diff

1124
adventure.yaml Normal file

File diff suppressed because it is too large Load diff

View file

@ -2,10 +2,10 @@
# This is the new open-adventure dungeon generator. It'll eventually replace the existing dungeon.c It currently outputs a .h and .c pair for C code. # This is the new open-adventure dungeon generator. It'll eventually replace the existing dungeon.c It currently outputs a .h and .c pair for C code.
import json import yaml
import collections import sys
json_name = "adventure.json" yaml_name = "adventure.yaml"
h_name = "newdb.h" h_name = "newdb.h"
c_name = "newdb.c" c_name = "newdb.c"
@ -19,27 +19,27 @@ def c_escape(string):
def write_regular_messages(name, h, c): def write_regular_messages(name, h, c):
h += "enum {}_refs {{\n".format(name) if name != "short_location_descriptions":
c += "char* {}[] = {{\n".format(name) h += "enum {}_refs {{\n".format(name)
for key, text in dungeon[name]:
h += " {},\n".format(key)
h += "};\n\n"
c += "char* {}[] = {{\n".format(name)
index = 0 index = 0
for key, text in dungeon[name].items(): for key, text in dungeon[name]:
h += " {},\n".format(key)
if text == None: if text == None:
c += " NULL,\n" c += " NULL,\n"
else: else:
text = c_escape(text) text = c_escape(text)
c += " \"{}\",\n".format(text) c += " \"{}\",\n".format(text)
index += 1 index += 1
h += "};\n\n"
c += "};\n\n" c += "};\n\n"
return (h, c) return (h, c)
with open(json_name, "r") as f: with open(yaml_name, "r") as f:
dungeon = json.load(f, object_pairs_hook = collections.OrderedDict) dungeon = yaml.load(f)
h = """#include <stdio.h> h = """#include <stdio.h>
@ -74,7 +74,7 @@ for name in [
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"].items(): for key, data in dungeon["object_descriptions"]:
try: try:
data["inventory"] = "\"{}\"".format(c_escape(data["inventory"])) data["inventory"] = "\"{}\"".format(c_escape(data["inventory"]))
except AttributeError: except AttributeError:
@ -87,7 +87,7 @@ for key, data in dungeon["object_descriptions"].items():
c += " .longs = (char* []) {\n" c += " .longs = (char* []) {\n"
for l in data["longs"]: for l in data["longs"]:
l = c_escape(l) l = c_escape(l)
c += " \"{}\"\n".format(l) c += " \"{}\",\n".format(l)
c += " },\n" c += " },\n"
except (TypeError, IndexError): except (TypeError, IndexError):
c += " .longs = NULL,\n" c += " .longs = NULL,\n"
@ -95,6 +95,11 @@ for key, data in dungeon["object_descriptions"].items():
h += "};" h += "};"
c += "};" c += "};"
c += """
size_t CLSSES = {};
""".format(len(dungeon["class_messages"]))
# finally, write out the files
d = { d = {
h_name: h, h_name: h,
c_name: c, c_name: c,

View file

@ -62,7 +62,9 @@ a "seed" command) will replay reliably, including random events.
The adventure.text file is no longer required at runtime. Instead, it The adventure.text file is no longer required at runtime. Instead, it
is compiled at build time to a source module containing C structures, is compiled at build time to a source module containing C structures,
which is then linked to the advent binary. which is then linked to the advent binary. There is an adventure.yaml file
as well; this is also compiled to C code, and will eventually replace
adventure.text altogether.
The game-save format has changed. This was done to simplify the The game-save format has changed. This was done to simplify the
FORTRAN-derived code that formerly implemented the save/restore FORTRAN-derived code that formerly implemented the save/restore