New dungeon compiler to gradually replace the existing one.
This commit is contained in:
parent
c818a10f28
commit
0e9e45f1b7
2 changed files with 1404 additions and 0 deletions
1299
adventure.json
Normal file
1299
adventure.json
Normal file
File diff suppressed because it is too large
Load diff
105
newdungeon.py
Executable file
105
newdungeon.py
Executable file
|
@ -0,0 +1,105 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
# 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
|
||||
|
||||
json_name = "adventure.json"
|
||||
h_name = "newdb.h"
|
||||
c_name = "newdb.c"
|
||||
|
||||
def c_escape(string):
|
||||
"""Add C escape sequences to a string."""
|
||||
string = string.replace("\n", "\\n")
|
||||
string = string.replace("\t", "\\t")
|
||||
string = string.replace('"', '\\"')
|
||||
string = string.replace("'", "\\'")
|
||||
return string
|
||||
|
||||
def write_regular_messages(name, h, c):
|
||||
|
||||
h += "enum {}_refs {{\n".format(name)
|
||||
c += "char* {}[] = {{\n".format(name)
|
||||
|
||||
index = 0
|
||||
for key, text in dungeon[name].items():
|
||||
h += " {},\n".format(key)
|
||||
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)
|
||||
|
||||
h = """#include <stdio.h>
|
||||
|
||||
typedef struct {
|
||||
char* inventory;
|
||||
char** longs;
|
||||
} object_description_t;
|
||||
|
||||
extern char* long_location_descriptions[];
|
||||
extern char* short_location_descriptions[];
|
||||
extern object_description_t object_descriptions[];
|
||||
extern char* arbitrary_messages[];
|
||||
extern char* class_messages[];
|
||||
extern char* turn_threshold_messages[];
|
||||
|
||||
extern size_t CLSSES;
|
||||
|
||||
"""
|
||||
|
||||
c = """#include "{}"
|
||||
|
||||
""".format(h_name)
|
||||
|
||||
for name in [
|
||||
"arbitrary_messages",
|
||||
"long_location_descriptions",
|
||||
"short_location_descriptions",
|
||||
"class_messages",
|
||||
"turn_threshold_messages",
|
||||
]:
|
||||
h, c = write_regular_messages(name, h, c)
|
||||
|
||||
h += "enum object_descriptions_refs {\n"
|
||||
c += "object_description_t object_descriptions[] = {\n"
|
||||
for key, data in dungeon["object_descriptions"].items():
|
||||
try:
|
||||
data["inventory"] = "\"{}\"".format(c_escape(data["inventory"]))
|
||||
except AttributeError:
|
||||
data["inventory"] = "NULL"
|
||||
h += " {},\n".format(key)
|
||||
c += " {\n"
|
||||
c += " .inventory = {},\n".format(data["inventory"])
|
||||
try:
|
||||
data["longs"][0]
|
||||
c += " .longs = (char* []) {\n"
|
||||
for l in data["longs"]:
|
||||
l = c_escape(l)
|
||||
c += " \"{}\"\n".format(l)
|
||||
c += " },\n"
|
||||
except (TypeError, IndexError):
|
||||
c += " .longs = NULL,\n"
|
||||
c += " },\n"
|
||||
h += "};"
|
||||
c += "};"
|
||||
|
||||
d = {
|
||||
h_name: h,
|
||||
c_name: c,
|
||||
}
|
||||
for filename, string in d.items():
|
||||
with open(filename, "w") as f:
|
||||
f.write(string)
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue