def get_stock_map(map_unit: Union[Map, tuple], force_vanilla: bool = False) -> Hash: if isinstance(map_unit, tuple): map_unit = Map(*map_unit) try: aoc_dir = util.get_aoc_dir() except FileNotFoundError: force_vanilla = True map_bytes = None map_path: Union[str, Path] if force_vanilla: try: if util.get_settings("wiiu"): update = util.get_update_dir() else: update = util.get_game_dir() map_path = ( update / "Map/MainField/" f"{map_unit.section}/{map_unit.section}_{map_unit.type}.smubin" ) if not map_path.exists(): map_path = ( util.get_game_dir() / "Map/MainField/" f"{map_unit.section}/{map_unit.section}_{map_unit.type}.smubin" ) map_bytes = map_path.read_bytes() except FileNotFoundError: try: title_pack = oead.Sarc( util.get_game_file("Pack/TitleBG.pack").read_bytes()) map_bytes = title_pack.get_file( f"Map/MainField/{map_unit.section}/{map_unit.section}_{map_unit.type}" ".smubin").data except (KeyError, RuntimeError, AttributeError): map_bytes = None else: if (aoc_dir / "Pack" / "AocMainField.pack").exists(): try: map_pack = oead.Sarc( (aoc_dir / "Pack" / "AocMainField.pack").read_bytes()) map_bytes = map_pack.get_file( f"Map/MainField/{map_unit.section}/{map_unit.section}_{map_unit.type}" ".smubin").data except (KeyError, RuntimeError, AttributeError): map_bytes = None if not map_bytes: map_path = f"Map/MainField/{map_unit.section}/{map_unit.section}_{map_unit.type}.smubin" try: map_bytes = util.get_game_file(map_path, aoc=True).read_bytes() except FileNotFoundError: try: map_bytes = util.get_game_file(map_path).read_bytes() except FileNotFoundError: try: title_pack = oead.Sarc( util.get_game_file( "Pack/TitleBG.pack").read_bytes()) map_bytes = bytes( title_pack.get_file( f"Map/MainField/{map_unit.section}/" f"{map_unit.section}_{map_unit.type}.smubin"). data) except (KeyError, RuntimeError, AttributeError): map_bytes = None if not map_bytes: raise FileNotFoundError( f"The stock map file {map_unit.section}_{map_unit.type}.smubin could not be found." ) map_bytes = util.decompress(map_bytes) return oead.byml.from_binary(map_bytes)
def get_stock_map(map_unit: Union[Map, tuple], force_vanilla: bool = False) -> dict: """ Finds the most significant available map unit from the unmodded game and returns its contents as a dict. :param map: The map section and type. :type map: class:`bcml.mubin.Map` :return: Returns a dict representation of the requested map unit. :rtype: dict """ if isinstance(map_unit, tuple): map_unit = Map(*map_unit) try: aoc_dir = util.get_aoc_dir() except FileNotFoundError: force_vanilla = True map_bytes = None if force_vanilla: try: map_path = ( util.get_update_dir() / 'Map/MainField/' f'{map_unit.section}/{map_unit.section}_{map_unit.type}.smubin' ) if not map_path.exists(): map_path = ( util.get_game_dir() / 'Map/MainField/' f'{map_unit.section}/{map_unit.section}_{map_unit.type}.smubin' ) map_bytes = map_path.read_bytes() except FileNotFoundError: with util.get_game_file('Pack/TitleBG.pack').open('rb') \ as s_file: title_pack = sarc.read_file_and_make_sarc(s_file) if title_pack: try: map_bytes = title_pack.get_file_data( f'Map/MainField/{map_unit.section}/{map_unit.section}_{map_unit.type}' '.smubin').tobytes() except KeyError: map_bytes = None else: if (aoc_dir / 'Pack' / 'AocMainField.pack').exists(): with (aoc_dir / 'Pack' / 'AocMainField.pack').open('rb') as s_file: map_pack = sarc.read_file_and_make_sarc(s_file) if map_pack: try: map_bytes = map_pack.get_file_data( f'Map/MainField/{map_unit.section}/{map_unit.section}_{map_unit.type}' '.smubin').tobytes() except KeyError: map_bytes = None if not map_bytes: map_path = f'Map/MainField/{map_unit.section}/{map_unit.section}_{map_unit.type}.smubin' try: map_bytes = util.get_game_file(map_path, aoc=True).read_bytes() except FileNotFoundError: try: map_bytes = util.get_game_file(map_path).read_bytes() except FileNotFoundError: with util.get_game_file('Pack/TitleBG.pack').open('rb') \ as s_file: title_pack = sarc.read_file_and_make_sarc(s_file) if title_pack: try: map_bytes = title_pack.get_file_data( f'Map/MainField/{map_unit.section}/' f'{map_unit.section}_{map_unit.type}.smubin' ).tobytes() except KeyError: map_bytes = None if not map_bytes: raise FileNotFoundError( f'The stock map file {map_unit.section}_{map_unit.type}.smubin could not be found.' ) map_bytes = util.decompress(map_bytes) return byml.Byml(map_bytes).parse()