diff --git a/source/mkw/ExtractedGame.py b/source/mkw/ExtractedGame.py index 9469917..d53fd14 100644 --- a/source/mkw/ExtractedGame.py +++ b/source/mkw/ExtractedGame.py @@ -51,11 +51,17 @@ class ExtractedGame: """ destination_path = Path(destination_path) destination_path.mkdir(parents=True, exist_ok=True) - yield Progress(description=_("EXTRACTING_ORIGINAL_TRACKS"), determinate=False) - for track_file in (self.path / "files/Race/Course/").glob("*.szs"): - yield Progress(description=_("EXTRACTING_ORIGINAL_TRACKS", " (", track_file.name, ") ..."), - determinate=False) + original_tracks: list[Path] = list((self.path / "files/Race/Course/").glob("*.szs")) + yield Progress( + description=_("EXTRACTING_ORIGINAL_TRACKS"), + determinate=True, + max_step=len(original_tracks), + set_step=0, + ) + + for track_file in original_tracks: + yield Progress(description=_("EXTRACTING_ORIGINAL_TRACKS", " (", track_file.name, ") ..."), step=1) if not (destination_path / track_file.name).exists(): track_file.rename(destination_path / track_file.name) else: track_file.unlink() @@ -67,7 +73,7 @@ class ExtractedGame: :mystuff_path: path to the MyStuff directory :return: """ - yield Progress(description=_("INSTALLING_MYSTUFF", ' "', mystuff_path, '" ...'), determinate=False) + yield Progress(description=_("INSTALLING_MYSTUFF", ' "', mystuff_path, '" ...')) mystuff_path = Path(mystuff_path) mystuff_rootfiles: dict[str, Path] = {} @@ -84,9 +90,15 @@ class ExtractedGame: Install multiple mystuff patch :param mystuff_paths: paths to all the mystuff patch """ - yield Progress(description=_("INSTALLING_ALL_MYSTUFF_PATCHS")) + yield Progress( + description=_("INSTALLING_ALL_MYSTUFF_PATCHS"), + determinate=True, + max_step=len(mystuff_paths), + set_step=0 + ) for mystuff_path in mystuff_paths: + yield Progress(step=1) yield from self.install_mystuff(mystuff_path) def prepare_special_file(self, mod_config: ModConfig) -> Generator[Progress, None, None]: @@ -94,7 +106,7 @@ class ExtractedGame: Prepare special files for the patch :return: the special files dict """ - yield Progress(description=_("PREPARING", " ct_icon ", "SPECIAL_FILE", "..."), determinate=False) + yield Progress(description=_("PREPARING", " ct_icons ", "SPECIAL_FILE", "..."), determinate=False) ct_icons = BytesIO() mod_config.get_full_cticon().save(ct_icons, format="PNG") ct_icons.seek(0) @@ -111,12 +123,20 @@ class ExtractedGame: """ Repack all the .d directory into .szs files. """ - yield Progress(description=_("REPACKING", " ", "ALL_ARCHIVES"), determinate=False) + all_extracted_szs: list[Path] = list(filter(lambda path: path.is_dir(), self.path.rglob("*.d"))) + yield Progress( + description=_("REPACKING", " ", "ALL_ARCHIVES"), + determinate=True, + max_step=len(all_extracted_szs), + set_step=0, + ) - for extracted_szs in filter(lambda path: path.is_dir(), self.path.rglob("*.d")): + for extracted_szs in all_extracted_szs: # for every directory that end with a .d in the extracted game, recreate the szs - yield Progress(description=_("REPACKING", ' "', extracted_szs.relative_to(self.path), '"'), - determinate=False) + yield Progress( + description=_("REPACKING", ' "', extracted_szs.relative_to(self.path), '"'), + step=1 + ) szs.create(extracted_szs, extracted_szs.with_suffix(".szs"), overwrite=True) shutil.rmtree(str(extracted_szs.resolve())) @@ -219,12 +239,19 @@ class ExtractedGame: """ new_hash_map = yield from self.get_hash_map() - yield Progress(description=_("CONVERTING_TO_RIIVOLUTION"), determinate=False) + game_files: list[Path] = list(filter(lambda file: file.is_file(), self.path.rglob("*"))) + yield Progress( + description=_("CONVERTING_TO_RIIVOLUTION"), + determinate=True, + max_step=len(game_files), + set_step=0, + ) # get the files difference between the original game and the patched game diff_hash_map: dict[str, Path] = comp_dict_changes(old_hash_map, new_hash_map) - for file in filter(lambda file: file.is_file(), self.path.rglob("*")): + for file in game_files: + yield Progress(step=1) # if the file have not being patched, delete it if str(file.relative_to(self.path)) not in diff_hash_map: file.unlink() @@ -277,11 +304,21 @@ class ExtractedGame: """ md5_map: dict[str, str] = {} - for fp in filter(lambda fp: fp.is_file(), self.path.rglob("*")): + game_files: list[Path] = list(filter(lambda fp: fp.is_file(), self.path.rglob("*"))) + yield Progress( + determinate=True, + max_step=len(game_files), + set_step=0 + ) + + for fp in game_files: hasher = hashlib.md5() rel_path: str = str(fp.relative_to(self.path)) - yield Progress(description=_(f"CALCULATING_HASH_FOR", ' "', rel_path, '"')) + yield Progress( + description=_(f"CALCULATING_HASH_FOR", ' "', rel_path, '"'), + step=1 + ) with open(fp, "rb") as file: while block := file.read(file_block_size): diff --git a/source/mkw/Game.py b/source/mkw/Game.py index 23c85e2..072de13 100644 --- a/source/mkw/Game.py +++ b/source/mkw/Game.py @@ -149,19 +149,19 @@ class Game: yield from extracted_game.prepare_special_file(mod_config) # prepatch the game - yield Progress(title=_("PRE-PATCHING"), set_part=5) - yield from extracted_game.install_all_prepatch(mod_config) + yield Progress(title=_("PRE-PATCH_TITLE"), set_part=5) + yield from extracted_game.install_all_prepatch(mod_config) # PROGRESS yield Progress(title="LE-CODE", set_part=6) - yield from extracted_game.patch_lecode( + yield from extracted_game.patch_lecode( # PROGRESS mod_config, cache_directory, cache_cttracks_directory, cache_ogtracks_directory, ) - yield Progress(title=_("PATCHING"), set_part=7) - yield from extracted_game.install_all_patch(mod_config) + yield Progress(title=_("PATCH_TITLE"), set_part=7) + yield from extracted_game.install_all_patch(mod_config) # PROGRESS yield from extracted_game.recreate_all_szs() if output_type.is_riivolution(): diff --git a/source/mkw/ModConfig.py b/source/mkw/ModConfig.py index 9f7dab2..a687c05 100644 --- a/source/mkw/ModConfig.py +++ b/source/mkw/ModConfig.py @@ -407,12 +407,12 @@ class ModConfig: :param autoadd_path: autoadd directory :param destination_path: destination where the files are converted """ - yield Progress(description=_("NORMALIZING_TRACKS")) destination_path = Path(destination_path) original_tracks_path = Path(original_tracks_path) destination_path.mkdir(parents=True, exist_ok=True) normalize_threads: list[dict] = [] + all_arenas_tracks = list(self.get_all_arenas_tracks()) def remove_finished_threads() -> Generator[Progress, None, None]: """ @@ -424,6 +424,7 @@ class ModConfig: yield Progress( description=_("NORMALIZING_TRACKS", " :\n" + "\n".join(thread['name'] for thread in normalize_threads)) ) + normalize_threads = list(filter(lambda thread: thread["thread"].is_alive(), normalize_threads)) track_directory = self.path.parent / "_TRACKS" @@ -431,7 +432,16 @@ class ModConfig: self.multiplayer_disable_if, args=["track"] ) - for track in self.get_all_arenas_tracks(): + yield Progress( + description=_("NORMALIZING_TRACKS"), + determinate=True, + max_step=len(all_arenas_tracks)+1, + set_step=0, + ) + + for track in all_arenas_tracks: + yield Progress(step=1) + track_file: Path = next( track_directory.rglob(f"{track.repr_format(template=self.track_file_template)}.*") )