You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
5.1 KiB

#!/usr/bin/env python
import os
import json
import sys
import errno
from collections import defaultdict
import urllib
import _pathfix
from mhapi.db import MHDB
from mhapi import model
def mkdirs_p(path):
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
SAFE_CHARS = " &'+\""
def file_path(path, model_object, use_name=False):
if use_name and "name" in model_object:
key = urllib.quote(model_object.name.encode("utf8"), SAFE_CHARS)
else:
key = str(model_object.id)
return os.path.join(path, "%s.json" % key)
def write_list_file(path, model_list):
list_path = os.path.join(path, "_list.json")
with open(list_path, "w") as f:
json.dump([o.as_list_data() for o in model_list],
f, cls=model.ModelJSONEncoder, indent=2)
def write_index_file(path, indexes):
for key, data in indexes.iteritems():
index_path = os.path.join(path, "_index_%s.json" % key)
with open(index_path, "w") as f:
json.dump(data, f, cls=model.ModelJSONEncoder, indent=2)
def write_all_file(path, all_data):
all_path = os.path.join(path, "_all.json")
with open(all_path, "w") as f:
json.dump(all_data, f, cls=model.ModelJSONEncoder, indent=2)
def monster_json(db, path):
monsters = db.get_monsters()
mkdirs_p(path)
write_list_file(path, monsters)
indexes = {}
for m in monsters:
monster_path = file_path(path, m)
m.update_indexes(indexes)
data = m.as_data()
damage = db.get_monster_damage(m.id)
damage.set_breakable(db.get_monster_breaks(m.id))
data["damage"] = damage.as_data()
with open(monster_path, "w") as f:
json.dump(data, f, cls=model.ModelJSONEncoder, indent=2)
write_index_file(path, indexes)
def armor_json(db, path):
armors = db.get_armors()
mkdirs_p(path)
write_list_file(path, armors)
all_data = []
indexes = {}
for a in armors:
armor_path = file_path(path, a)
a.update_indexes(indexes)
skills = db.get_item_skills(a.id)
if not skills:
print "WARN: armor '%s' (%d) has no skills" % (a.name, a.id)
a.set_skills(skills)
all_data.append(a.as_data())
with open(armor_path, "w") as f:
a.json_dump(f)
write_index_file(path, indexes)
write_all_file(path, all_data)
def decoration_json(db, path):
decorations = db.get_decorations()
mkdirs_p(path)
write_list_file(path, decorations)
all_data = []
indexes = {}
for a in decorations:
decoration_path = file_path(path, a)
a.update_indexes(indexes)
skills = db.get_item_skills(a.id)
if not skills:
print "WARN: decoration '%s' (%d) has no skills" % (a.name, a.id)
a.set_skills(skills)
all_data.append(a.as_data())
with open(decoration_path, "w") as f:
a.json_dump(f)
write_index_file(path, indexes)
write_all_file(path, all_data)
def skilltree_json(db, path):
skill_trees = db.get_skill_trees()
mkdirs_p(path)
write_list_file(path, skill_trees)
all_data = {}
for st in skill_trees:
ds = db.get_decorations_by_skills([st.id])
for d in ds:
d.set_skills(db.get_item_skills(d.id))
st.set_decorations(ds)
skilltree_path = file_path(path, st)
all_data[st.name] = st
with open(skilltree_path, "w") as f:
st.json_dump(f)
write_all_file(path, all_data)
def weapon_json(db, path):
weapons = db.get_weapons(get_components=True)
mkdirs_p(path)
write_list_file(path, weapons)
indexes = {}
for w in weapons:
weapon_path = file_path(path, w)
w.update_indexes(indexes)
with open(weapon_path, "w") as f:
w.json_dump(f)
tree_path = os.path.join(path, "%s_tree.json" % w.id)
costs = model.get_costs(db, w)
for cost in costs:
cost["path"] = [dict(name=w.name, id=w.id)
for w in cost["path"]]
with open(tree_path, "w") as f:
json.dump(costs, f, cls=model.ModelJSONEncoder, indent=2)
write_index_file(path, indexes)
def items_json(db, path):
items = db.get_items()
mkdirs_p(path)
write_list_file(path, items)
indexes = {}
for item in items:
item_path = file_path(path, item)
item.update_indexes(indexes)
with open(item_path, "w") as f:
item.json_dump(f)
write_index_file(path, indexes)
def main():
db = MHDB(_pathfix.db_path)
if len(sys.argv) > 1:
outpath = sys.argv[1]
else:
outpath = os.path.join(_pathfix.web_path, "jsonapi")
weapon_json(db, os.path.join(outpath, "weapon"))
sys.exit(0)
items_json(db, os.path.join(outpath, "item"))
monster_json(db, os.path.join(outpath, "monster"))
armor_json(db, os.path.join(outpath, "armor"))
skilltree_json(db, os.path.join(outpath, "skilltree"))
decoration_json(db, os.path.join(outpath, "decoration"))
#quest_json(db, os.path.join(outpath, "quest"))
if __name__ == '__main__':
main()