import db import io import json import os from sqlalchemy.orm import contains_eager def update_missions(dir_in, old_path, languages): db.init(dir_in) quest_mst(old_path, languages) scene_mst(old_path, languages) def scene_mst(old_path, languages): result = (db.session.query(db.QuestScene) .join(db.QuestScene.parts) .options(contains_eager(db.QuestScene.parts)) .filter((db.QuestPart.beforeTalkName != "") | (db.QuestPart.afterTalkName != "")) .filter(db.QuestScene.parts.any()) .all()) scenes = {} for x in result: scenes[str(x.questSceneMstId)] = { "Name": x.name, "SummaryText": x.summaryText, "Parts": [], "Folder": "" } id_num = "" # this is slow as balls but i'm way too tired to figure out how to optimize it for y in x.parts: if y.beforeTalkName: id_num = y.beforeTalkName scenes[str(x.questSceneMstId)]["Parts"].append(y.beforeTalkName) if y.afterTalkName: id_num = y.afterTalkName scenes[str(x.questSceneMstId)]["Parts"].append(y.afterTalkName) # i checked every entry, moving it to do once for speed if not scenes[str(x.questSceneMstId)]["Folder"] and id_num: path = (db.session.query(db.ResourceEntry) .filter(db.ResourceEntry.path.like("%/Scenario/{}.tsv.utage".format(id_num))) .filter(db.ResourceEntry.path.notlike("%Utage/side03/%.tsv.utage")) # dead folder with dupes too lazy to parse settings tsv .one()) folder = path.path.split("/")[2] if scenes[str(x.questSceneMstId)]["Folder"] and scenes[str(x.questSceneMstId)]["Folder"] != folder: raise KeyError("Internal path inconsitency, bailing out {}".format(id_num)) scenes[str(x.questSceneMstId)]["Folder"] = folder with io.open(os.path.join(old_path, "XduScene.json"), "w", newline='\n') as json_file: json.dump(scenes, json_file, ensure_ascii=False, indent='\t', sort_keys=True) for l in languages: out_dict = {} if l == "jpn": for x in result: out_dict[str(x.questSceneMstId)] = { "Name": x.name, "SummaryText": x.summaryText, "Credits": "POKELABO", "Enabled": False } else: for x in result: out_dict[str(x.questSceneMstId)] = { "Name": "", "SummaryText": "", "Credits": "", "Enabled": False } langfile = os.path.join(old_path, "XduSceneNames_{}.json".format(l)) if os.path.isfile(langfile): with open(langfile, "r") as lang_file: lang_dict = json.load(lang_file) out_dict.update(lang_dict) with io.open(langfile, "w", newline='\n') as lang_file: # you're using git right json.dump(out_dict, lang_file, ensure_ascii=False, indent='\t', sort_keys=True) def quest_mst(old_path, languages): # i regret my life choices result = (db.session.query(db.Quest) .filter(db.Quest.baseQuestMstId == 0) .join(db.Quest.scenes) .join(db.QuestScene.parts) .options(contains_eager(db.Quest.scenes). contains_eager(db.QuestScene.parts)) .filter(db.QuestPart.beforeTalkName != "" or db.QuestPart.afterTalkName != "") .filter(db.QuestScene.parts.any()) .filter(db.Quest.scenes.any()) .all()) quests = {} for x in result: quests[str(x.questMstId)] = { "Name": x.name, "Scenes": [d.questSceneMstId for d in x.scenes] } with io.open(os.path.join(old_path, "XduQuest.json"), "w", newline='\n') as json_file: json.dump(quests, json_file, ensure_ascii=False, indent='\t', sort_keys=True) for l in languages: out_dict = {} if l == "jpn": for x in result: out_dict[str(x.questMstId)] = { "Name": x.name, "Enabled": False } else: for x in result: out_dict[str(x.questMstId)] = { "Name": "", "Enabled": False } langfile = os.path.join(old_path, "XduQuestNames_{}.json".format(l)) if os.path.isfile(langfile): with open(langfile, "r") as lang_file: lang_dict = json.load(lang_file) out_dict.update(lang_dict) with io.open(langfile, "w", newline='\n') as lang_file: # you're using git right json.dump(out_dict, lang_file, ensure_ascii=False, indent='\t', sort_keys=True) return quests