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
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:
$(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
$(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
@ -47,11 +47,15 @@ common.o: common.h
database.o: database.c database.h common.h
$(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
./dungeon
newdb.c newdb.h:
./newdungeon.py
linenoise.o: linenoise/linenoise.h
$(CC) -c linenoise/linenoise.c
@ -60,6 +64,7 @@ dungeon: dungeon.o common.o
clean:
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 *~
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.
import json
import collections
import yaml
import sys
json_name = "adventure.json"
yaml_name = "adventure.yaml"
h_name = "newdb.h"
c_name = "newdb.c"
@ -19,27 +19,27 @@ def c_escape(string):
def write_regular_messages(name, h, c):
h += "enum {}_refs {{\n".format(name)
c += "char* {}[] = {{\n".format(name)
if name != "short_location_descriptions":
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
for key, text in dungeon[name].items():
h += " {},\n".format(key)
for key, text in dungeon[name]:
if text == None:
c += " NULL,\n"
else:
text = c_escape(text)
c += " \"{}\",\n".format(text)
index += 1
h += "};\n\n"
c += "};\n\n"
return (h, c)
with open(json_name, "r") as f:
dungeon = json.load(f, object_pairs_hook = collections.OrderedDict)
with open(yaml_name, "r") as f:
dungeon = yaml.load(f)
h = """#include <stdio.h>
@ -74,7 +74,7 @@ for name in [
h += "enum object_descriptions_refs {\n"
c += "object_description_t object_descriptions[] = {\n"
for key, data in dungeon["object_descriptions"].items():
for key, data in dungeon["object_descriptions"]:
try:
data["inventory"] = "\"{}\"".format(c_escape(data["inventory"]))
except AttributeError:
@ -87,7 +87,7 @@ for key, data in dungeon["object_descriptions"].items():
c += " .longs = (char* []) {\n"
for l in data["longs"]:
l = c_escape(l)
c += " \"{}\"\n".format(l)
c += " \"{}\",\n".format(l)
c += " },\n"
except (TypeError, IndexError):
c += " .longs = NULL,\n"
@ -95,6 +95,11 @@ for key, data in dungeon["object_descriptions"].items():
h += "};"
c += "};"
c += """
size_t CLSSES = {};
""".format(len(dungeon["class_messages"]))
# finally, write out the files
d = {
h_name: h,
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
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
FORTRAN-derived code that formerly implemented the save/restore