import csv import db import io import json import os from glob import glob def update_missions(dir_in, old_path, languages, is_global, utage_in=None): if not utage_in: utage_in = os.path.join(dir_in, "Common/Asset/Utage") if is_global: languages = ["enm", "zho", "kor"] for lang in languages: qdb = db.QuestDB(dir_in, lang) quest_mst(qdb, old_path, [lang], is_global) scene_mst(qdb, old_path, [lang], utage_in, is_global) else: qdb = db.QuestDB(dir_in) quest_mst(qdb, old_path, languages, is_global) scene_mst(qdb, old_path, languages, utage_in, is_global) def scene_mst(qdb, old_path, languages, utage_in, is_global): scenes = qdb.get_scenes() locations = load_locations(utage_in) for id, scene in scenes.items(): i = 0 while True: try: scene["Folder"] = locations[scene["Parts"][i]] except KeyError as exc: i += 1 if i == len(scene["Parts"]): if is_global: break raise KeyError(f"Could not find folder for scene {id}") from exc continue break if not is_global: with io.open( os.path.join(old_path, "XduScene.json"), "w", encoding="utf-8" ) as json_file: json.dump( scenes, json_file, ensure_ascii=False, indent="\t", sort_keys=True ) for lang in languages: out_dict = {} if lang == "jpn" or is_global: for key, value in scenes.items(): out_dict[key] = { "Name": value["Name"], "SummaryText": value["SummaryText"], "Credits": "POKELABO", "Enabled": False, } else: for key in scenes.keys(): out_dict[key] = { "Name": "", "SummaryText": "", "Credits": "", "Enabled": False, } langfile = os.path.join(old_path, f"XduSceneNames_{lang}.json") if os.path.isfile(langfile): with open(langfile, "r", encoding="utf-8") as lang_file: lang_dict = json.load(lang_file) out_dict.update(lang_dict) with io.open(langfile, "w", encoding="utf-8") as lang_file: json.dump( out_dict, lang_file, ensure_ascii=False, indent="\t", sort_keys=True, ) def quest_mst(qdb, old_path, languages, is_global): quests = qdb.get_quests() if not is_global: with io.open( os.path.join(old_path, "XduQuest.json"), "w", encoding="utf-8" ) as json_file: json.dump( quests, json_file, ensure_ascii=False, indent="\t", sort_keys=True ) for lang in languages: out_dict = {} if lang == "jpn" or is_global: for key, value in quests.items(): out_dict[key] = {"Name": value["Name"], "Enabled": False} else: for key, value in quests.items(): out_dict[key] = {"Name": "", "Enabled": False} langfile = os.path.join(old_path, f"XduQuestNames_{lang}.json") if os.path.isfile(langfile): with open(langfile, "r", encoding="utf-8") as lang_file: lang_dict = json.load(lang_file) out_dict.update(lang_dict) with io.open(langfile, "w", encoding="utf-8") as lang_file: json.dump( out_dict, lang_file, ensure_ascii=False, indent="\t", sort_keys=True, ) return quests def load_locations(utage_in): locations = {} settings = glob("{}/**/Settings/Scenario.tsv".format(utage_in), recursive=True,) if len(settings) == 0: raise FileNotFoundError("Ya didn't decrypt the files dummy") for scenario in settings: with open(scenario, "r", encoding="utf-8") as tsv_file: tsv = csv.DictReader(tsv_file, delimiter="\t", quotechar='"') for row in tsv: tokens = row["FileName"].split("/") if len(tokens) < 3: continue if tokens[2] in locations: raise ValueError("Conflicting paths for file {tokens[2]}") locations[tokens[2]] = tokens[0] return locations