def make_buff_icon_mapping(): try: shutil.rmtree("./_icons") except FileNotFoundError: pass ex = Extractor(ex_img_dir="./_icons", ex_dir="./_icons") ex.download_and_extract_by_pattern(DEPENDENCIES) with open(PATH_ID_FILE, "r") as fp: path_id_map = json.load(fp) with open(INGAME_UI_FILE, "r") as fp: ingame_ui = {} for icon_type, data in json.load(fp).items(): if not icon_type.endswith("Icon"): continue ingame_ui[icon_type] = {idx: path_id_map.get(str(entry["m_PathID"])) for idx, entry in enumerate(data) if entry["m_FileID"]} nosprite_icons = set() for icon_type, icon_map in ingame_ui.items(): new_folder = f"./_icons/{icon_type}" os.makedirs(new_folder) for icon in icon_map.values(): src = f"./_icons/jp/images_ingame/{icon}.png" if os.path.exists(src): shutil.move(src, f"{new_folder}/{icon}.png") else: nosprite_icons.add(icon) ingame_ui["nospriteIcons"] = list(nosprite_icons) noref_icons = set() for root, _, files in os.walk("./_icons/jp/images_ingame"): os.makedirs(os.path.join("_icons", "noref")) for fn in files: if fn.startswith("Icon_Buff_") and not fn in ingame_ui["buffIcon"].values(): shutil.move(os.path.join(root, fn), os.path.join("_icons", "noref", fn)) noref_icons.add(fn) ingame_ui["norefIcons"] = list(noref_icons) shutil.rmtree("./_icons/jp") try: from loader.InGameBuffUI import BuffIconType, UniqueBuffIconType unique_icons = {} for idx, icon in ingame_ui["buffIcon"].items(): try: unique_icons[UniqueBuffIconType[BuffIconType(idx).name].value] = icon except (KeyError, ValueError): pass ingame_ui["uniqueBuffIcon"] = unique_icons except ImportError: pass with open(COMBINED_MAP_FILE, "w") as fp: json.dump(ingame_ui, fp, indent=4)
def download_sticker_assets(): ex = Extractor(ex_dir=OUT_DIR, ex_img_dir=OUT_DIR) ex.download_and_extract_by_pattern(STICKER_PATTERN) for region in ("jp", "en"): voice_dir = os.path.join(OUT_DIR, region, "voices") cmd = [ LIBCGSS, os.path.join(voice_dir, "vo_chr_stamp.acb"), *LIBCGSS_ARGS ] subprocess.check_output(cmd) os.remove(os.path.join(voice_dir, "vo_chr_stamp.acb")) os.remove(os.path.join(voice_dir, "vo_chr_stamp.awb")) external_dir = os.path.join(voice_dir, "_acb_vo_chr_stamp.acb", "external") for wav in os.listdir( os.path.join(voice_dir, "_acb_vo_chr_stamp.acb", "external")): shutil.copy(os.path.join(external_dir, wav), voice_dir) shutil.rmtree(os.path.join(voice_dir, "_acb_vo_chr_stamp.acb"))
def download_all_icons(out, set_icons=None): ex = Extractor(ex_dir=None, ex_img_dir=out) ex.download_and_extract_by_pattern(IMAGE_PATTERNS) if not set_icons: return patterns = {"jp": {}} for icon_set, prefix, dest in set_icons: patterns["jp"][prefix + "(?:" + "|".join(map(str, icon_set)) + ")"] = dest ex.download_and_extract_by_pattern(patterns)
"name": "Overdrive Punisher +15%\nGauge Accelerator +10%", "icon": "coabs/Wand2.png", "link": "Overdrive_Punisher_&_Gauge_Accelerator_VIII", }, "Empty_6": { "name": "Empty 6", "icon": "icons/formC.png", "link": "<NO>" }, "Empty_7": { "name": "Empty 7", "icon": "icons/formC.png", "link": "<NO>" }, } ex = Extractor(ex_dir=None, ex_img_dir=DST) patterns = {"jp": {}} icon_set = set() with open(os.path.join(GEN, "wyrmprints.json"), "r") as fn: for wp, data in json.load(fn).items(): pic_index[wp] = { "name": data["name"], "icon": f"amulet/{data['icon']}.png" } if data["union"] > 0: pic_index[wp]["deco"] = f"union/{data['union']:02}.png" icon_set.add(data["icon"]) patterns["jp"]["^images/icon/amulet/l/" + "(?:" + "|".join(map(str, icon_set)) + ")"] = f"../amulet" icon_set = set()
LABEL_PATTERNS_JP = { r'^master$': 'master', r'^actions$': 'actions', r'^characters/motion': 'characters_motion', r'characters/motion/animationclips$': 'characters_motion', r'^dragon/motion': 'dragon_motion', } if __name__ == '__main__': parser = argparse.ArgumentParser(description='Import data to database.') parser.add_argument('--do_prep', help='Do downloading and extracting of assets', action='store_true') parser.add_argument('-o', type=str, help='output file', default='dl.sqlite') args = parser.parse_args() if args.do_prep: ex = Extractor(MANIFEST_JP, MANIFEST_EN, stdout_log=True) ex.download_and_extract_all(LABEL_PATTERNS_JP, region='jp') ex.download_and_extract_all(LABEL_PATTERNS_EN, region='en') in_dir = '_extract' db = DBManager(args.o) load_master(db, os.path.join(in_dir, EN, MASTER)) load_json(db, os.path.join(in_dir, JP, MASTER, TEXT_LABEL), 'TextLabelJP') load_actions(db, os.path.join(in_dir, JP, ACTIONS)) load_character_motion(db, os.path.join(in_dir, JP, CHARACTERS_MOTION)) load_dragon_motion(db, os.path.join(in_dir, JP, DRAGON_MOTION))
def download_all_icons(out): ex = Extractor(ex_dir=None, ex_img_dir=out, stdout_log=False) ex.download_and_extract_by_pattern(IMAGE_PATTERNS)
parser.add_argument('--do_prep', help='Download and extract db related assets', action='store_true') parser.add_argument('-m_hash', help='Use', action='store_true') parser.add_argument('-o', type=str, help='output file', default='dl.sqlite') args = parser.parse_args() # if args.do_images: # ex = Extractor(MANIFEST_JP, MANIFEST_EN, ex_dir='images', stdout_log=True) # ex.download_and_extract_by_pattern(IMAGE_PATTERNS, region='jp') in_dir = '_extract' if args.do_prep: print('prepare: ', flush=True, end='') start = monotonic() ex = Extractor(MANIFESTS, ex_dir=in_dir, stdout_log=False) ex.download_and_extract_by_pattern(LABEL_PATTERNS_CN, region='cn') ex.download_and_extract_by_pattern(LABEL_PATTERNS_EN, region='en') ex.download_and_extract_by_pattern(LABEL_PATTERNS_JP, region='jp') print(f'{monotonic()-start:.4f}s', flush=True) start = monotonic() print('load database: ', flush=True, end='') db = DBManager(args.o) load_master(db, os.path.join(in_dir, EN, MASTER)) load_json(db, os.path.join(in_dir, JP, MASTER, TEXT_LABEL), 'TextLabelJP') load_json(db, os.path.join(in_dir, CN, MASTER, TEXT_LABEL), 'TextLabelCN') load_actions(db, os.path.join(in_dir, JP, ACTIONS)) load_character_motion(db, os.path.join(in_dir, JP, CHARACTERS_MOTION)) load_dragon_motion(db, os.path.join(in_dir, JP, DRAGON_MOTION)) print(f'{monotonic()-start:.4f}s', flush=True)
def prepare_icons(): ex = Extractor(ex_dir=OUTPUT_DIR, ex_img_dir=OUTPUT_DIR, overwrite=False) ex.download_and_extract_by_pattern(ICON_PATTERNS)
("ex_dir", args.extract_dir), ("ex_img_dir", args.extract_img_dir), ("ex_media_dir", args.extract_media_dir), ("local_mirror", args.local_mirror)): if arg == "0": ex_kwargs[key] = None elif arg: ex_kwargs[key] = arg if args.manifest and args.operation in ("extract", "mirror"): if args.manifest in ("ALLTIME", "OLDSTYLE"): ex_kwargs["manifest_override"] = args.manifest else: ex_kwargs["manifest_override"] = get_manifests( args.manifest, args.manifest) ex = Extractor(**ex_kwargs) ex_patterns = defaultdict(dict) for region, exp, target in args.patterns: if not (region := (region or args.region)): for reg in ex.pm.keys(): ex_patterns[reg][exp] = target else: ex_patterns[region][exp] = target if args.operation == "apk": ex.apk_assets_extract(args.patterns[0][1]) elif args.operation == "diff": if ex_patterns: print(f"Patterns\n{dict(ex_patterns)}") ex.download_and_extract_by_pattern_diff(ex_patterns)
if __name__ == '__main__': parser = argparse.ArgumentParser(description='Import data to database.') parser.add_argument( '--do_prep', help='Download and extract db related assets', action='store_true') parser.add_argument('-m_hash', help='Use', action='store_true') parser.add_argument('-o', type=str, help='output file', default='dl.sqlite') args = parser.parse_args() # if args.do_images: # ex = Extractor(MANIFEST_JP, MANIFEST_EN, ex_dir='images', stdout_log=True) # ex.download_and_extract_by_pattern(IMAGE_PATTERNS, region='jp') start = monotonic() in_dir = '_ex_sim' if args.do_prep: ex = Extractor(ex_dir=in_dir, stdout_log=False, overwrite=True) if not os.path.isdir(in_dir): ex.download_and_extract_by_pattern(LABEL_PATTERNS) else: ex.download_and_extract_by_pattern_diff(LABEL_PATTERNS) load_aiscript('./_ex_sim/jp/aiscript') db = DBManager(args.o) load_master(db, os.path.join(in_dir, EN, MASTER)) load_json(db, os.path.join(in_dir, JP, MASTER, TEXT_LABEL), 'TextLabelJP') load_json(db, os.path.join(in_dir, CN, MASTER, TEXT_LABEL), 'TextLabelCN') schema_map = load_actions(db, os.path.join(in_dir, JP, ACTIONS)) with open('./out/_action_schema.json', 'w') as f: json.dump(schema_map, f, indent=4, sort_keys=True) load_character_motion(db, os.path.join(in_dir, JP, CHARACTERS_MOTION)) load_dragon_motion(db, os.path.join(in_dir, JP, DRAGON_MOTION))
def download_set_icons(out, icon_set, prefix, dest): patterns = {'jp': {f'{prefix}{ic}': dest for ic in icon_set}} ex = Extractor(ex_dir=None, ex_img_dir=out, stdout_log=False) ex.download_and_extract_by_pattern(patterns)
parser.add_argument("--do_prep", help="Download and extract db related assets", action="store_true") parser.add_argument("-m_hash", help="Use", action="store_true") parser.add_argument("-o", type=str, help="output file", default="dl.sqlite") args = parser.parse_args() start = monotonic() dl_dir = "./_dl_sim" in_dir = "./_ex_sim" if args.do_prep: ex = Extractor(dl_dir=dl_dir, ex_dir=in_dir, ex_img_dir=None, overwrite=True) if not os.path.isdir(in_dir): ex.download_and_extract_by_pattern(LABEL_PATTERNS) else: ex.download_and_extract_by_pattern_diff(LABEL_PATTERNS) load_aiscript(os.path.join(in_dir, "jp", "aiscript")) # extract_story_function_json(ex) db = DBManager(args.o) load_master(db, os.path.join(in_dir, EN, MASTER)) load_json(db, os.path.join(in_dir, JP, MASTER, TEXT_LABEL), "TextLabelJP") load_json(db, os.path.join(in_dir, CN, MASTER, TEXT_LABEL), "TextLabelCN") schema_map = load_actions(db, os.path.join(in_dir, JP, ACTIONS)) os.makedirs("out", exist_ok=True) with open("./out/_action_schema.json", "w") as f: json.dump(schema_map, f, indent=4, sort_keys=True)