divatool/diva/quest.py
2021-05-22 15:14:38 +02:00

142 lines
4.6 KiB
Python

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 = {}
for key, value in scenes.items():
name = ""
summary = ""
credit = ""
enabled = False
if lang == "jpn" or is_global:
name = value["Name"]
summary = value["SummaryText"]
credit = "POKELABO"
out_dict[key] = {
"Name": name,
"SummaryText": summary,
"Credits": credit,
"Enabled": enabled,
}
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
folder, _scenario, part_id = tokens
# side03 seems to only contain prototype scripts so we ignore it
if folder == "side03":
continue
if part_id in locations:
raise ValueError(
f"Conflicting paths for scene part {part_id}, existing folder: {locations[part_id]}"
)
locations[part_id] = folder
return locations