From 98a9a4c7c6479f7df8d46fd5803cada28698bc9a Mon Sep 17 00:00:00 2001 From: Omni Date: Wed, 28 Jan 2026 22:13:51 +0000 Subject: [PATCH] Sync from development - prepare for v0.2.2.2 --- CHANGELOG.md | 16 + jackify/__init__.py | 2 +- jackify/backend/handlers/path_handler.py | 107 ++++- .../backend/handlers/protontricks_handler.py | 7 + jackify/backend/handlers/wine_utils.py | 185 ++++++- .../backend/handlers/winetricks_handler.py | 36 +- .../services/automated_prefix_service.py | 154 +----- .../backend/services/native_steam_service.py | 25 +- jackify/engine/Wabbajack.CLI.Builder.dll | Bin 19456 -> 19456 bytes jackify/engine/Wabbajack.Common.dll | Bin 209408 -> 209408 bytes jackify/engine/Wabbajack.Compiler.dll | Bin 160256 -> 160256 bytes jackify/engine/Wabbajack.Compression.BSA.dll | Bin 94720 -> 94720 bytes jackify/engine/Wabbajack.Compression.Zip.dll | Bin 18944 -> 18944 bytes jackify/engine/Wabbajack.Configuration.dll | Bin 4096 -> 4096 bytes jackify/engine/Wabbajack.DTOs.dll | Bin 142336 -> 142336 bytes .../engine/Wabbajack.Downloaders.Bethesda.dll | Bin 18432 -> 18432 bytes .../Wabbajack.Downloaders.Dispatcher.dll | Bin 29184 -> 29184 bytes .../engine/Wabbajack.Downloaders.GameFile.dll | Bin 16384 -> 16384 bytes .../Wabbajack.Downloaders.GoogleDrive.dll | Bin 17920 -> 17920 bytes jackify/engine/Wabbajack.Downloaders.Http.dll | Bin 15872 -> 15872 bytes ...ajack.Downloaders.IPS4OAuth2Downloader.dll | Bin 35328 -> 35328 bytes .../Wabbajack.Downloaders.Interfaces.dll | Bin 7168 -> 7168 bytes .../engine/Wabbajack.Downloaders.Manual.dll | Bin 9216 -> 9216 bytes .../Wabbajack.Downloaders.MediaFire.dll | Bin 15872 -> 15872 bytes jackify/engine/Wabbajack.Downloaders.Mega.dll | Bin 16384 -> 16384 bytes .../engine/Wabbajack.Downloaders.ModDB.dll | Bin 19456 -> 19456 bytes .../engine/Wabbajack.Downloaders.Nexus.dll | Bin 23552 -> 23552 bytes ...abbajack.Downloaders.VerificationCache.dll | Bin 13824 -> 13824 bytes .../Wabbajack.Downloaders.WabbajackCDN.dll | Bin 24576 -> 24576 bytes jackify/engine/Wabbajack.FileExtractor.dll | Bin 79360 -> 79360 bytes jackify/engine/Wabbajack.Hashing.PHash.dll | Bin 49664 -> 49664 bytes jackify/engine/Wabbajack.Hashing.xxHash64.dll | Bin 21504 -> 21504 bytes jackify/engine/Wabbajack.IO.Async.dll | Bin 15360 -> 15360 bytes jackify/engine/Wabbajack.Installer.dll | Bin 137216 -> 137216 bytes .../Wabbajack.Networking.BethesdaNet.dll | Bin 39936 -> 39936 bytes .../engine/Wabbajack.Networking.Discord.dll | Bin 14336 -> 14336 bytes .../engine/Wabbajack.Networking.GitHub.dll | Bin 21504 -> 21504 bytes .../Wabbajack.Networking.Http.Interfaces.dll | Bin 5632 -> 5632 bytes jackify/engine/Wabbajack.Networking.Http.dll | Bin 36864 -> 36864 bytes .../engine/Wabbajack.Networking.NexusApi.dll | Bin 80896 -> 80896 bytes ...abbajack.Networking.WabbajackClientApi.dll | Bin 77824 -> 77824 bytes jackify/engine/Wabbajack.Paths.IO.dll | Bin 34816 -> 34816 bytes jackify/engine/Wabbajack.Paths.dll | Bin 17408 -> 17408 bytes jackify/engine/Wabbajack.RateLimiter.dll | Bin 24576 -> 24576 bytes jackify/engine/Wabbajack.Server.Lib.dll | Bin 6656 -> 6656 bytes .../Wabbajack.Services.OSIntegrated.dll | Bin 55808 -> 55808 bytes jackify/engine/Wabbajack.VFS.Interfaces.dll | Bin 5120 -> 5120 bytes jackify/engine/Wabbajack.VFS.dll | Bin 64512 -> 64512 bytes jackify/engine/jackify-engine.deps.json | 450 +++++++++--------- jackify/engine/jackify-engine.dll | Bin 227840 -> 227840 bytes jackify/frontends/gui/main.py | 86 ++-- jackify/tools/winetricks | 62 ++- 52 files changed, 688 insertions(+), 442 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34262fd..01794d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Jackify Changelog +## v0.2.2.2 - ModOrganizer.ini Path Fixes for SD Card Installations +**Release Date:** TBD (Testing in progress) + +### Bug Fixes +- **ModOrganizer.ini Path Mangling**: Fixed incorrect drive letter assignment when modlist is on SD card but vanilla game is on internal storage. Now uses gamePath drive letter as source of truth for vanilla game paths. +- **Proton Config Name Mismatch (Issues #150, #151)**: Fixed incorrect Proton names written to Steam config.vdf CompatToolMapping. Naive string conversion produced wrong names (e.g., `proton_9.0_(beta)` instead of `proton_9`). Now resolves correct internal names from `compatibilitytool.vdf` (third-party) or App ID mapping (Valve Proton). CachyOS and other community Proton builds in `compatibilitytools.d/` are now detected and selectable. +- **Removed Lorerim/Lost Legacy Proton Override**: No longer forces Proton 9 for specific modlists. ENB compatibility warnings are handled by the success dialog instead. + +### Engine Updates +- **jackify-engine 0.4.7**: Fixed incorrect quoting/escaping of MO2 `customExecutables` by writing clean, unquoted Proton `Z:\...` paths in `ModOrganizer.ini`. This eliminates engine-side quote corruption that previously triggered SD card path mangling issues. + +### Loggging Improvement +- **Debug External Command Logging**: When debug mode is enabled, Jackify now logs the full `protontricks` command line before execution, making it easier for advanced users to reproduce and troubleshoot Wine/Proton issues by running the same command manually. + +--- + ## v0.2.2.1 - TTW Installer Pinning and Configure New Modlist CLI Fix **Release Date:** 2026-01-24 diff --git a/jackify/__init__.py b/jackify/__init__.py index 2b0304e..548d554 100644 --- a/jackify/__init__.py +++ b/jackify/__init__.py @@ -5,4 +5,4 @@ This package provides both CLI and GUI interfaces for managing Wabbajack modlists natively on Linux systems. """ -__version__ = "0.2.2.1" +__version__ = "0.2.2.2" diff --git a/jackify/backend/handlers/path_handler.py b/jackify/backend/handlers/path_handler.py index 33aa3b1..70ec12e 100644 --- a/jackify/backend/handlers/path_handler.py +++ b/jackify/backend/handlers/path_handler.py @@ -892,6 +892,7 @@ class PathHandler: # Extract existing gamePath to use as source of truth for vanilla game location existing_game_path = None + gamepath_drive_letter = None gamepath_line_index = -1 for i, line in enumerate(lines): if re.match(r'^\s*gamepath\s*=.*@ByteArray\(([^)]+)\)', line, re.IGNORECASE): @@ -899,11 +900,16 @@ class PathHandler: if match: raw_path = match.group(1) gamepath_line_index = i + # Extract drive letter from gamePath (Z: or D:) + if raw_path.startswith('Z:'): + gamepath_drive_letter = 'Z:' + elif raw_path.startswith('D:'): + gamepath_drive_letter = 'D:' # Convert Windows path back to Linux path if raw_path.startswith(('Z:', 'D:')): linux_path = raw_path[2:].replace('\\\\', '/').replace('\\', '/') existing_game_path = linux_path - logger.debug(f"Extracted existing gamePath: {existing_game_path}") + logger.debug(f"Extracted existing gamePath: {existing_game_path}, drive letter: {gamepath_drive_letter}") break # Special handling for gamePath in three-true scenario (engine_installed + steamdeck + sdcard) @@ -957,19 +963,33 @@ class PathHandler: logger.error(f"Malformed binary line: {line}") continue key_part, value_part = parts - exe_name = os.path.basename(value_part).lower() + + # Clean up malformed paths (quotes in wrong places, etc.) + cleaned_value = PathHandler._clean_malformed_binary_path(value_part) + exe_name = os.path.basename(cleaned_value).lower() # SELECTIVE FILTERING: Only process target executables (script extenders, etc.) if exe_name not in TARGET_EXECUTABLES_LOWER: logger.debug(f"Skipping non-target executable: {exe_name}") continue - drive_prefix = "D:" if modlist_sdcard else "Z:" rel_path = None # --- BEGIN: FULL PARITY LOGIC --- - if 'steamapps' in value_part: - idx = value_part.index('steamapps') - subpath = value_part[idx:].lstrip('/') + if 'steamapps' in cleaned_value: + # Vanilla game path detected - always rebuild to ensure correct format + if not gamepath_drive_letter: + logger.warning(f"Vanilla game path detected but gamePath drive letter not found. Skipping binary path update for: {exe_name}") + logger.warning("This may indicate jackify-engine already configured paths correctly, or gamePath is malformed.") + continue + + # Check if path is malformed (has quotes or wrong structure) + is_malformed = '"' in cleaned_value or cleaned_value != value_part.strip().strip('"') + + # Extract subpath from cleaned value (includes exe name) + idx = cleaned_value.index('steamapps') + subpath = cleaned_value[idx:].lstrip('/') + + # Find correct Steam library correct_steam_lib = None for lib in steam_libraries: # Check if the actual game folder exists in this library @@ -979,39 +999,62 @@ class PathHandler: if not correct_steam_lib and steam_libraries: correct_steam_lib = steam_libraries[0] if correct_steam_lib: + # Always rebuild path using gamePath drive letter to ensure correct format + drive_prefix = gamepath_drive_letter + if is_malformed: + logger.info(f"Fixing malformed binary path for {exe_name}: {value_part.strip()}") + logger.debug(f"Vanilla game path detected: Using drive letter from gamePath: {drive_prefix}") new_binary_path = f"{drive_prefix}/{correct_steam_lib}/{subpath}".replace('\\', '/').replace('//', '/') else: logger.error("Could not determine correct Steam library for vanilla game path.") continue else: + # For modlist-relative paths (Stock Game, mods, etc.), use modlist location + drive_prefix = "D:" if modlist_sdcard else "Z:" found_stock = None for folder in STOCK_GAME_FOLDERS: folder_pattern = f"/{folder}" - if folder_pattern in value_part: - idx = value_part.index(folder_pattern) - rel_path = value_part[idx:].lstrip('/') + if folder_pattern in cleaned_value: + idx = cleaned_value.index(folder_pattern) + rel_path = cleaned_value[idx:].lstrip('/') found_stock = folder break if not rel_path: mods_pattern = "/mods/" - if mods_pattern in value_part: - idx = value_part.index(mods_pattern) - rel_path = value_part[idx:].lstrip('/') + if mods_pattern in cleaned_value: + idx = cleaned_value.index(mods_pattern) + rel_path = cleaned_value[idx:].lstrip('/') else: rel_path = exe_name processed_modlist_path = PathHandler._strip_sdcard_path_prefix(modlist_dir_path) if modlist_sdcard else str(modlist_dir_path) new_binary_path = f"{drive_prefix}/{processed_modlist_path}/{rel_path}".replace('\\', '/').replace('//', '/') formatted_binary_path = PathHandler._format_binary_for_mo2(new_binary_path) + # Ensure no quotes in formatted path (binary paths should never have quotes) + if '"' in formatted_binary_path: + logger.warning(f"Formatted binary path still contains quotes, removing: {formatted_binary_path}") + formatted_binary_path = formatted_binary_path.replace('"', '') new_binary_line = f"{index}{backslash_style}binary = {formatted_binary_path}" - logger.debug(f"Updating binary path: {line.strip()} -> {new_binary_line}") - lines[i] = new_binary_line + "\n" + logger.info(f"Updating binary path: {line.strip()} -> {new_binary_line}") + # Preserve original line ending - lines from readlines() should have newline, but ensure it + original_line = lines[i] + if original_line.endswith('\n'): + lines[i] = new_binary_line + '\n' + else: + lines[i] = new_binary_line + '\n' binary_paths_updated += 1 binary_paths_by_index[index] = formatted_binary_path for j, wd_line, index, backslash_style in working_dir_lines: if index in binary_paths_by_index: binary_path = binary_paths_by_index[index] wd_path = os.path.dirname(binary_path) - drive_prefix = "D:" if modlist_sdcard else "Z:" + # Derive drive letter from binary path, not modlist location + if binary_path.startswith("D:"): + drive_prefix = "D:" + elif binary_path.startswith("Z:"): + drive_prefix = "Z:" + else: + # Fallback: use modlist location if binary path doesn't have drive letter + drive_prefix = "D:" if modlist_sdcard else "Z:" if wd_path.startswith("D:") or wd_path.startswith("Z:"): wd_path = wd_path[2:] wd_path = drive_prefix + wd_path @@ -1019,7 +1062,12 @@ class PathHandler: key_part = f"{index}{backslash_style}workingDirectory" new_wd_line = f"{key_part} = {formatted_wd_path}" logger.debug(f"Updating working directory: {wd_line.strip()} -> {new_wd_line}") - lines[j] = new_wd_line + "\n" + # Preserve original line ending - ensure newline is present + original_wd_line = lines[j] + if original_wd_line.endswith('\n'): + lines[j] = new_wd_line + '\n' + else: + lines[j] = new_wd_line + '\n' working_dirs_updated += 1 with open(modlist_ini_path, 'w', encoding='utf-8') as f: f.writelines(lines) @@ -1141,6 +1189,33 @@ class PathHandler: path = re.sub(r'^([A-Z]:)\\+', r'\1\\', path) return path + @staticmethod + def _clean_malformed_binary_path(value_part: str) -> str: + """ + Clean up malformed binary paths from engine (e.g., quotes in wrong places). + Example: "Z:/path/to/game"/exe.exe -> Z:/path/to/game/exe.exe + """ + cleaned = value_part.strip() + # Remove quotes if they wrap only part of the path (malformed) + if cleaned.startswith('"') and '"' in cleaned[1:]: + # Find the closing quote + quote_end = cleaned.find('"', 1) + if quote_end > 0: + # Check if there's content after the quote (malformed) + after_quote = cleaned[quote_end + 1:].strip() + if after_quote.startswith('/') or after_quote: + # Malformed: quotes wrap only part of path + # Remove quotes and join + path_part = cleaned[1:quote_end] + remaining = after_quote.lstrip('/') + cleaned = f"{path_part}/{remaining}" if remaining else path_part + logger.info(f"Cleaned malformed binary path: {value_part} -> {cleaned}") + # Remove any remaining quotes (handles fully quoted paths too) + cleaned = cleaned.strip('"') + # Normalize slashes + cleaned = cleaned.replace('\\', '/') + return cleaned + @staticmethod def _format_binary_for_mo2(path: str) -> str: import re diff --git a/jackify/backend/handlers/protontricks_handler.py b/jackify/backend/handlers/protontricks_handler.py index 89137d9..507ae06 100644 --- a/jackify/backend/handlers/protontricks_handler.py +++ b/jackify/backend/handlers/protontricks_handler.py @@ -367,6 +367,13 @@ class ProtontricksHandler: **kwargs # Allow overriding defaults (like stderr=DEVNULL) } + # Log full command for advanced users to reproduce manually (debug mode only) + cmd_str = ' '.join(map(str, cmd)) + logger.debug("=" * 80) + logger.debug("PROTONTRICKS COMMAND (for manual reproduction):") + logger.debug(f" {cmd_str}") + logger.debug("=" * 80) + # Handle environment: if env was passed in kwargs, merge it with our clean env # Otherwise create a clean env from scratch if 'env' in kwargs and kwargs['env']: diff --git a/jackify/backend/handlers/wine_utils.py b/jackify/backend/handlers/wine_utils.py index 4a6b4ef..11ce136 100644 --- a/jackify/backend/handlers/wine_utils.py +++ b/jackify/backend/handlers/wine_utils.py @@ -19,6 +19,15 @@ from .subprocess_utils import get_clean_subprocess_env # Initialize logger logger = logging.getLogger(__name__) +# Known Valve Proton App ID -> config.vdf internal name mapping +VALVE_PROTON_APPID_MAP = { + '2805730': 'proton_9', + '3658110': 'proton_10', + '1493710': 'proton_experimental', + '2180100': 'proton_hotfix', + '1887720': 'proton_8', +} + class WineUtils: """ @@ -849,6 +858,155 @@ class WineUtils: # Return only existing paths return [path for path in compat_paths if path.exists()] + @staticmethod + def _parse_compat_tool_name(proton_dir: Path) -> Optional[str]: + """Parse the Steam internal name from a compatibilitytool.vdf file. + The key under compat_tools is what Steam uses in config.vdf CompatToolMapping.""" + vdf_path = proton_dir / "compatibilitytool.vdf" + if not vdf_path.exists(): + return None + try: + with open(vdf_path, 'r', encoding='utf-8', errors='ignore') as f: + content = f.read() + match = re.search(r'"compat_tools"\s*\{[^{]*"([^"]+)"\s*(?://[^\n]*)?\s*\{', content, re.DOTALL) + if match: + return match.group(1) + except Exception as e: + logger.warning(f"Failed to parse {vdf_path}: {e}") + return None + + @staticmethod + def _find_valve_proton_appid(proton_dir_name: str) -> Optional[str]: + """Find the Steam App ID for a Valve Proton by matching appmanifest installdir.""" + steam_libs = WineUtils.get_steam_library_paths() + for lib_path in steam_libs: + steamapps_dir = lib_path.parent + for manifest in steamapps_dir.glob("appmanifest_*.acf"): + try: + with open(manifest, 'r', encoding='utf-8', errors='ignore') as f: + content = f.read() + installdir_match = re.search(r'"installdir"\s+"([^"]+)"', content) + appid_match = re.search(r'"appid"\s+"(\d+)"', content) + if installdir_match and appid_match: + if installdir_match.group(1) == proton_dir_name: + return appid_match.group(1) + except Exception: + continue + return None + + @staticmethod + def resolve_steam_compat_name(proton_path) -> Optional[str]: + """Resolve the correct Steam config.vdf internal name for a Proton installation. + + For third-party Protons (GE, CachyOS, etc.): parses compatibilitytool.vdf + For Valve Protons: maps via App ID from appmanifest files. + + Args: + proton_path: Path to the Proton directory (str or Path) + + Returns: + Internal name for config.vdf CompatToolMapping, or None if unresolvable + """ + proton_path = Path(proton_path) + + if not proton_path.is_dir(): + logger.warning(f"Proton path not found: {proton_path}") + return None + + # Third-party Proton: check for compatibilitytool.vdf + compat_name = WineUtils._parse_compat_tool_name(proton_path) + if compat_name: + logger.debug(f"Resolved compat name from vdf: {proton_path.name} -> {compat_name}") + return compat_name + + # Valve Proton: look up App ID from appmanifest, then map + dir_name = proton_path.name + appid = WineUtils._find_valve_proton_appid(dir_name) + if appid and appid in VALVE_PROTON_APPID_MAP: + name = VALVE_PROTON_APPID_MAP[appid] + logger.debug(f"Resolved Valve Proton: {dir_name} (AppID {appid}) -> {name}") + return name + + # Fallback for GE-Proton dirs without a vdf (shouldn't happen, but safe) + if dir_name.startswith('GE-Proton'): + return dir_name + + logger.warning(f"Could not resolve Steam compat name for: {proton_path}") + return None + + @staticmethod + def scan_thirdparty_proton_versions() -> List[Dict[str, any]]: + """Scan for non-GE third-party Proton versions in compatibilitytools.d directories. + Discovers CachyOS, TKG, and other community builds by parsing compatibilitytool.vdf. + + Returns: + List of dicts with version info, sorted by name + """ + logger.info("Scanning for third-party Proton versions...") + + found_versions = [] + seen_names = set() + compat_paths = WineUtils.get_compatibility_tool_paths() + + if not compat_paths: + return [] + + for compat_path in compat_paths: + try: + for proton_dir in compat_path.iterdir(): + if not proton_dir.is_dir(): + continue + + dir_name = proton_dir.name + + # Skip GE-Proton (handled by scan_ge_proton_versions) + if dir_name.startswith("GE-Proton"): + continue + + # Must have a wine binary to be a usable Proton + wine_bin = proton_dir / "files" / "bin" / "wine" + if not wine_bin.exists(): + continue + + # Must have a compatibilitytool.vdf (proves it's a Proton compat tool) + compat_name = WineUtils._parse_compat_tool_name(proton_dir) + if not compat_name: + continue + + # Skip non-Proton tools (e.g., LegacyRuntime) + vdf_path = proton_dir / "compatibilitytool.vdf" + try: + with open(vdf_path, 'r', encoding='utf-8', errors='ignore') as f: + vdf_content = f.read() + if '"from_oslist" "linux"' in vdf_content: + continue + except Exception: + pass + + # Skip Proton Hotfix + if 'hotfix' in compat_name.lower(): + continue + + if compat_name in seen_names: + continue + seen_names.add(compat_name) + + found_versions.append({ + 'name': dir_name, + 'path': proton_dir, + 'wine_bin': wine_bin, + 'priority': 175, + 'type': 'ThirdParty-Proton', + 'steam_compat_name': compat_name, + }) + logger.debug(f"Found third-party Proton: {dir_name} (compat name: {compat_name})") + + except Exception as e: + logger.warning(f"Error scanning {compat_path}: {e}") + + logger.info(f"Found {len(found_versions)} third-party Proton version(s)") + return found_versions + @staticmethod def scan_ge_proton_versions() -> List[Dict[str, any]]: """ @@ -895,6 +1053,7 @@ class WineUtils: # Priority format: 200 (base) + major*10 + minor (e.g., 200 + 100 + 16 = 316) priority = 200 + (major_ver * 10) + minor_ver + compat_name = WineUtils._parse_compat_tool_name(proton_dir) or dir_name found_versions.append({ 'name': dir_name, 'path': proton_dir, @@ -902,7 +1061,8 @@ class WineUtils: 'priority': priority, 'major_version': major_ver, 'minor_version': minor_ver, - 'type': 'GE-Proton' + 'type': 'GE-Proton', + 'steam_compat_name': compat_name, }) logger.debug(f"Found {dir_name} at {proton_dir} (priority: {priority})") else: @@ -951,12 +1111,14 @@ class WineUtils: wine_bin = proton_path / "files" / "bin" / "wine" if wine_bin.exists() and wine_bin.is_file(): + compat_name = WineUtils.resolve_steam_compat_name(proton_path) found_versions.append({ 'name': version_name, 'path': proton_path, 'wine_bin': wine_bin, 'priority': priority, - 'type': 'Valve-Proton' + 'type': 'Valve-Proton', + 'steam_compat_name': compat_name, }) logger.debug(f"Found {version_name} at {proton_path}") @@ -998,6 +1160,10 @@ class WineUtils: ge_versions = WineUtils.scan_ge_proton_versions() all_versions.extend(ge_versions) + # Scan third-party Proton versions (CachyOS, TKG, etc.) + thirdparty_versions = WineUtils.scan_thirdparty_proton_versions() + all_versions.extend(thirdparty_versions) + # Scan Valve Proton versions valve_versions = WineUtils.scan_valve_proton_versions() all_versions.extend(valve_versions) @@ -1025,6 +1191,7 @@ class WineUtils: def select_best_proton() -> Optional[Dict[str, any]]: """ Select the best available Proton version (GE-Proton or Valve Proton) using unified precedence. + Excludes third-party builds (CachyOS, etc.) which may have compatibility issues. Returns: Dict with version info for the best Proton, or None if none found @@ -1035,8 +1202,16 @@ class WineUtils: logger.warning("No compatible Proton versions found") return None + # Filter out third-party Protons - they may have compatibility issues with component installation + # Only include GE-Proton and Valve-Proton types + compatible_versions = [v for v in available_versions if v.get('type') in ('GE-Proton', 'Valve-Proton')] + + if not compatible_versions: + logger.warning("No compatible Proton versions found (only third-party builds available)") + return None + # Return the highest priority version (first in sorted list) - best_version = available_versions[0] + best_version = compatible_versions[0] logger.info(f"Selected best Proton version: {best_version['name']} ({best_version['type']})") return best_version @@ -1079,11 +1254,11 @@ class WineUtils: if best_proton: # Compatible Proton found proton_type = best_proton.get('type', 'Unknown') - status_msg = f"✓ Using {best_proton['name']} ({proton_type}) for this workflow" + status_msg = f"[OK] Using {best_proton['name']} ({proton_type}) for this workflow" logger.info(f"Proton requirements satisfied: {best_proton['name']} ({proton_type})") return True, status_msg, best_proton else: # No compatible Proton found - status_msg = "✗ No compatible Proton version found (GE-Proton 10+, Proton 9+, 10, or Experimental required)" + status_msg = "[FAIL] No compatible Proton version found (GE-Proton 10+, Proton 9+, 10, or Experimental required)" logger.warning("Proton requirements not met - no compatible version found") return False, status_msg, None \ No newline at end of file diff --git a/jackify/backend/handlers/winetricks_handler.py b/jackify/backend/handlers/winetricks_handler.py index 5908dc2..12da521 100644 --- a/jackify/backend/handlers/winetricks_handler.py +++ b/jackify/backend/handlers/winetricks_handler.py @@ -484,7 +484,16 @@ class WinetricksHandler: # Build winetricks command - using --unattended for silent installation cmd = [self.winetricks_path, '--unattended'] + components_to_install - self.logger.debug(f"Running: {' '.join(cmd)}") + # Log full command for advanced users to reproduce manually (debug mode only) + cmd_str = ' '.join(cmd) + self.logger.debug("=" * 80) + self.logger.debug("WINETRICKS COMMAND (for manual reproduction):") + self.logger.debug(f" {cmd_str}") + self.logger.debug("") + self.logger.debug("Environment variables required:") + self.logger.debug(f" WINEPREFIX={env.get('WINEPREFIX', 'NOT SET')}") + self.logger.debug(f" WINE={env.get('WINE', 'NOT SET')}") + self.logger.debug("=" * 80) # Enhanced diagnostics for bundled winetricks self.logger.debug("=== Winetricks Environment Diagnostics ===") @@ -567,8 +576,31 @@ class WinetricksHandler: self.logger.error("") self.logger.error("STDERR:") if result.stderr.strip(): + # Filter out verbose winetricks "Executing..." messages - these are informational, not errors + error_lines = [] + verbose_lines = [] for line in result.stderr.strip().split('\n'): - self.logger.error(f" {line}") + line_lower = line.lower().strip() + # Skip verbose informational messages + if (line_lower.startswith('executing ') or + (line_lower.startswith('grep: warning:') and 'stray' in line_lower) or + ('warning; possible' in line_lower and 'extra bytes' in line_lower)): + # These are verbose info messages, log at debug level instead + verbose_lines.append(line) + else: + # Actual error/warning messages (including "returned status", "aborting", dbus errors, etc.) + error_lines.append(line) + + if error_lines: + self.logger.error(" Actual errors/warnings:") + for line in error_lines: + self.logger.error(f" {line}") + if verbose_lines: + self.logger.debug(f" ({len(verbose_lines)} verbose 'Executing...' lines suppressed - see debug log for details)") + else: + self.logger.error(" (only verbose output, no actual errors)") + if verbose_lines: + self.logger.debug(f" ({len(verbose_lines)} verbose lines suppressed)") else: self.logger.error(" (empty)") self.logger.error("=" * 80) diff --git a/jackify/backend/services/automated_prefix_service.py b/jackify/backend/services/automated_prefix_service.py index 8ac90fb..036c756 100644 --- a/jackify/backend/services/automated_prefix_service.py +++ b/jackify/backend/services/automated_prefix_service.py @@ -41,60 +41,32 @@ class AutomatedPrefixService: from jackify.shared.timing import get_timestamp return get_timestamp() - def _get_user_proton_version(self, modlist_name: str = None): - """Get user's preferred Proton version from config, with fallback to auto-detection - - Args: - modlist_name: Optional modlist name for special handling (e.g., Lorerim) - """ + def _get_user_proton_version(self): + """Get user's preferred Proton version from config, with fallback to auto-detection.""" try: from jackify.backend.handlers.config_handler import ConfigHandler from jackify.backend.handlers.wine_utils import WineUtils - # Check for Lorerim-specific Proton override first - modlist_normalized = modlist_name.lower().replace(" ", "") if modlist_name else "" - if modlist_normalized == 'lorerim': - lorerim_proton = self._get_lorerim_preferred_proton() - if lorerim_proton: - logger.info(f"Lorerim detected: Using {lorerim_proton} instead of user settings") - self._store_proton_override_notification("Lorerim", lorerim_proton) - return lorerim_proton - - # Check for Lost Legacy-specific Proton override (needs Proton 9 for ENB compatibility) - if modlist_normalized == 'lostlegacy': - lostlegacy_proton = self._get_lorerim_preferred_proton() # Use same logic as Lorerim - if lostlegacy_proton: - logger.info(f"Lost Legacy detected: Using {lostlegacy_proton} instead of user settings (ENB compatibility)") - self._store_proton_override_notification("Lost Legacy", lostlegacy_proton) - return lostlegacy_proton - config_handler = ConfigHandler() user_proton_path = config_handler.get_game_proton_path() if not user_proton_path or user_proton_path == 'auto': - # Use enhanced fallback logic with GE-Proton preference - logger.info("User selected auto-detect, using GE-Proton → Experimental → Proton precedence") - return WineUtils.select_best_proton() + logger.info("User selected auto-detect, using GE-Proton -> Experimental -> Proton precedence") + best = WineUtils.select_best_proton() + if best: + return best.get('steam_compat_name') or WineUtils.resolve_steam_compat_name(best['path']) + return "proton_experimental" else: - # User has selected a specific Proton version - # Use the exact directory name for Steam config.vdf - try: - proton_version = os.path.basename(user_proton_path) - # GE-Proton uses exact directory name, Valve Proton needs lowercase conversion - if proton_version.startswith('GE-Proton'): - # Keep GE-Proton name exactly as-is - steam_proton_name = proton_version - else: - # Convert Valve Proton names to Steam's format - steam_proton_name = proton_version.lower().replace(' - ', '_').replace(' ', '_').replace('-', '_') - if not steam_proton_name.startswith('proton'): - steam_proton_name = f"proton_{steam_proton_name}" - + steam_proton_name = WineUtils.resolve_steam_compat_name(user_proton_path) + if steam_proton_name: logger.info(f"Using user-selected Proton: {steam_proton_name}") return steam_proton_name - except Exception as e: - logger.warning(f"Invalid user Proton path '{user_proton_path}', falling back to auto: {e}") - return WineUtils.select_best_proton() + + logger.warning(f"Could not resolve compat name for '{user_proton_path}', falling back to auto") + best = WineUtils.select_best_proton() + if best: + return best.get('steam_compat_name') or WineUtils.resolve_steam_compat_name(best['path']) + return "proton_experimental" except Exception as e: logger.error(f"Failed to get user Proton preference, using default: {e}") @@ -148,8 +120,7 @@ class AutomatedPrefixService: logger.warning(f"Could not generate STEAM_COMPAT_MOUNTS, using default: {e}") launch_options = "%command%" - # Get user's preferred Proton version (with Lorerim-specific override) - proton_version = self._get_user_proton_version(shortcut_name) + proton_version = self._get_user_proton_version() # Create shortcut with Proton using native service success, app_id = steam_service.create_shortcut_with_proton( @@ -1619,8 +1590,6 @@ echo Prefix creation complete. if progress_callback: progress_callback(f"{self._get_progress_timestamp()} Steam Configuration complete!") - # Show Proton override notification if applicable - self._show_proton_override_notification(progress_callback) logger.info(" Simple automated prefix creation workflow completed successfully") return True, prefix_path, actual_appid @@ -1960,9 +1929,6 @@ echo Prefix creation complete. progress_callback(f"{last_timestamp} Steam integration complete") progress_callback("") # Blank line after Steam integration complete - # Show Proton override notification if applicable - self._show_proton_override_notification(progress_callback) - if progress_callback: progress_callback("") # Extra blank line to span across Configuration Summary progress_callback("") # And one more to create space before Prefix Configuration @@ -2800,7 +2766,7 @@ echo Prefix creation complete. platform_service = PlatformDetectionService.get_instance() is_steamdeck_sdcard = (platform_service.is_steamdeck and str(proton_path).startswith('/run/media/')) - timeout = 180 if is_steamdeck_sdcard else 60 + timeout = 180 if is_steamdeck_sdcard else 120 if is_steamdeck_sdcard: logger.info(f"Using extended timeout ({timeout}s) for Steam Deck SD card Proton installation") @@ -3364,91 +3330,5 @@ echo Prefix creation complete. if created_count > 0: logger.info(f"Created {created_count} user directories for {game_dir_name}") - def _get_lorerim_preferred_proton(self): - """Get Lorerim's preferred Proton 9 version with specific priority order""" - try: - from jackify.backend.handlers.wine_utils import WineUtils - - # Get all available Proton versions - available_versions = WineUtils.scan_all_proton_versions() - - if not available_versions: - logger.warning("No Proton versions found for Lorerim override") - return None - - # Priority order for Lorerim: - # 1. GEProton9-27 (specific version) - # 2. Other GEProton-9 versions (latest first) - # 3. Valve Proton 9 (any version) - - preferred_candidates = [] - - for version in available_versions: - version_name = version['name'] - - # Priority 1: GEProton9-27 specifically - if version_name == 'GE-Proton9-27': - logger.info(f"Lorerim: Found preferred GE-Proton9-27") - return version_name - - # Priority 2: Other GE-Proton 9 versions - elif version_name.startswith('GE-Proton9-'): - preferred_candidates.append(('ge_proton_9', version_name, version)) - - # Priority 3: Valve Proton 9 - elif 'Proton 9' in version_name: - preferred_candidates.append(('valve_proton_9', version_name, version)) - - # Return best candidate if any found - if preferred_candidates: - # Sort by priority (GE-Proton first, then by name for latest) - preferred_candidates.sort(key=lambda x: (x[0], x[1]), reverse=True) - best_candidate = preferred_candidates[0] - logger.info(f"Lorerim: Selected {best_candidate[1]} as best Proton 9 option") - return best_candidate[1] - - logger.warning("Lorerim: No suitable Proton 9 versions found, will use user settings") - return None - - except Exception as e: - logger.error(f"Error detecting Lorerim Proton preference: {e}") - return None - - def _store_proton_override_notification(self, modlist_name: str, proton_version: str): - """Store Proton override information for end-of-install notification""" - try: - # Store override info for later display - if not hasattr(self, '_proton_overrides'): - self._proton_overrides = [] - - self._proton_overrides.append({ - 'modlist': modlist_name, - 'proton_version': proton_version, - 'reason': f'{modlist_name} requires Proton 9 for optimal compatibility' - }) - - logger.debug(f"Stored Proton override notification: {modlist_name} → {proton_version}") - - except Exception as e: - logger.error(f"Failed to store Proton override notification: {e}") - - def _show_proton_override_notification(self, progress_callback=None): - """Display any Proton override notifications to the user""" - try: - if hasattr(self, '_proton_overrides') and self._proton_overrides: - for override in self._proton_overrides: - notification_msg = f"PROTON OVERRIDE: {override['modlist']} configured to use {override['proton_version']} for optimal compatibility" - - if progress_callback: - progress_callback("") - progress_callback(f"{self._get_progress_timestamp()} {notification_msg}") - - logger.info(notification_msg) - - # Clear notifications after display - self._proton_overrides = [] - - except Exception as e: - logger.error(f"Failed to show Proton override notification: {e}") diff --git a/jackify/backend/services/native_steam_service.py b/jackify/backend/services/native_steam_service.py index 7974947..835e349 100644 --- a/jackify/backend/services/native_steam_service.py +++ b/jackify/backend/services/native_steam_service.py @@ -485,24 +485,23 @@ class NativeSteamService: if proton_version is None: try: from jackify.backend.handlers.config_handler import ConfigHandler + from jackify.backend.handlers.wine_utils import WineUtils config_handler = ConfigHandler() game_proton_path = config_handler.get_game_proton_path() - + if game_proton_path and game_proton_path != 'auto': - # User has selected Game Proton - use it - proton_version = os.path.basename(game_proton_path) - # Convert to Steam format - if not proton_version.startswith('GE-Proton'): - proton_version = proton_version.lower().replace(' - ', '_').replace(' ', '_').replace('-', '_') - if not proton_version.startswith('proton'): - proton_version = f"proton_{proton_version}" - logger.info(f"Using Game Proton from settings: {proton_version}") - else: - # Fallback to auto-detect if Game Proton not set - from jackify.backend.handlers.wine_utils import WineUtils + resolved = WineUtils.resolve_steam_compat_name(game_proton_path) + if resolved: + proton_version = resolved + logger.info(f"Using Game Proton from settings: {proton_version}") + else: + logger.warning(f"Could not resolve compat name for '{game_proton_path}', falling back to auto") + game_proton_path = None + + if not game_proton_path or game_proton_path == 'auto': best_proton = WineUtils.select_best_proton() if best_proton: - proton_version = best_proton['name'] + proton_version = best_proton.get('steam_compat_name') or WineUtils.resolve_steam_compat_name(best_proton['path']) logger.info(f"Auto-detected Game Proton: {proton_version}") else: proton_version = "proton_experimental" diff --git a/jackify/engine/Wabbajack.CLI.Builder.dll b/jackify/engine/Wabbajack.CLI.Builder.dll index 3a7b67be0b37450df6bdca30bc8ea7ac1ba25d33..4539bd1da8bc16052fb85bf4a53e510ef3194b75 100644 GIT binary patch delta 297 zcmZpe!Pqc^aY6^n+fvUv8+$Yq7}+OpRVZa-->j`zD=lDic*(NI#ZO%JNcFtkT2b4# zd56s;Hgj`50|o|TMg~0tJrg~1Z6gEAL<37RBQuK>^E5L<%QSOCOH=dIL{noE!xS@9 zlVnTd6oW)VqsfiV(^=F$oVqhv#w9@DggFo2n`b3{v%O=Ik4}4EIl0EAKmjWFFB&Qc zQhhCTL1|?B9py8U`m&pOT$>m<*%??EK!APobhlJSM)S>o-NPA!%^9>Aj2H|UEEy8P zq#2NB#$dsa!eGvj24oomWzv9b5N!&iQ-SJC8H^cBfFdbCc~c-O87OBAl0j OFZVPB8h_VQnF#>73s^t^ delta 297 zcmZpe!Pqc^aY6@+D$BuZ8+$Yq7}+LoRVZa-+pMivD=ko^wYjf$r;SUq)2p@LS2jm( z-eEI|&D>1SfPul7kwMQu&qU8m+bAu~D9ymq(#X=>+{7X|#lqOY+%VBRE!of@&B7qr z)G*n^%plRocygojbe7YPuFjb(;}Rec^rvkR1IJ2-4vt6er*t$GC)c1`uG|Jl!pok1jOb*Xu@E@kj#(*B#nVG<_v}mi9j+9C}s%crvb$cfNWDBFBz!T49H6a>NTFc N+|v|j{9R9FCIAk|RWSen diff --git a/jackify/engine/Wabbajack.Common.dll b/jackify/engine/Wabbajack.Common.dll index bfa83076c33fb07b1b10857ca0ef6fd7243ee4fe..78171da6a5d9eca31ecb8e92876e74388cc17a49 100644 GIT binary patch delta 381 zcmXv}KS%;$6o0Sp?64dzA{-=WF$?qh?$39h7eo|M4GDrYG{xb0dqZ204MvcJ+s#p1 zEfI1{4Q&!MiB!<&5RsI*HB_HwZ+O4I!+XVMq}Ys94yBjyduhL1E#vnG%KlLs;{q<* zI65Z7|FF|PCV}ifwK0KmfS*WEG((-9Om#5VPhW7MdOqiD2bJ2u&Eh;) zDS&~XQq@#>Qm3{ zrf#o&DMqr&=J;ei+F4$yZr$VEbFJjNG2%`1-GiOJ+wH4^)%C_hBtB9hw5P8r_kp;|gNP-R&Y;bzp63T)!xWK^^OcRMGco&(#g6J_Yz!Z)vawb?_ bWQI^wWSY2sZl$3#}qV5JfP?%0it)Gmm*Q@9o=SinVyL7B4SLlk@wVi>1>Ne!rs}uGVpY z#!(%6dSz&rz4Nz8AcyyL97H+74`fKmSfeFV4b0ssPiv0{eMNQbuvFNqEZvr(@=eF( zXvWbvfQg`S&C;BtA%r1#I&Gv~*YbkAXL48fT@mP9cs#K6z;d{6m;f$<5oWttB0A|} zSw*U@KW~SU%BGY#wfcI!QXfBq*^G5wQNp~+ME}1#({`KrtH!6;dPr=fzK$=V7nSWQ zoia$Rd*mn_V$+CD^p;{Hm~$Wr1_(lvIiv{&wM($Tg8=fxCcU_zgHJ5T(@6{RIqf#7 cfU*uLpZ=QR!Z5RA4rsu`LXu5H$k`A60^6HxSpWb4 diff --git a/jackify/engine/Wabbajack.Compiler.dll b/jackify/engine/Wabbajack.Compiler.dll index 3bd371b9b19cc638fe83cde38b2f38a7dafc0488..77ea24a671f6368b8e7785fadc21368879fc5ccc 100644 GIT binary patch delta 500 zcmZp8!rAbIb3zA;iu1+Z#-6P`j8R>T?9-ojF{+BPGr+)XTL_DVfqlASH>0pELQ2#D zE(KG~u-6__?6V|XYakGc9 zn~{BcYA<7coxsMJ^eiscSkFCYTBo1=^`CS56KTY}222F{+BPF~GoVTL_DVfo-~CH>0pELQ2#D zE(KG~u-6__?6V|XYakGc9 zn~`mMYA<7coq!47)oa>S4Bq>8Ifxy2sl&Sc2{+SsPa88m0|o|TMg~0tJrg}MZKJd_ zqcj6cOCw8ja}$f?6boYmbHhaQv}8krGz)`dQ^RBvGlN7UV+IBmMuzE)VNAx`y~3EH zgjsIYPwJe$B9kdVfT`N)(}VI<&kZUIJx=e`$ezxT#gwH06`lD3Dhg6>{wZUEnN{+t zdzW&Bw@=Dq`oqY{#=rvh2HW=OIZUyPjAq-v<}!IR2AeTxGZ-h zLK6lHhGd2mAZZMgF=sGjNCc8;KrurgKMg2u0A!m2dC5SvW) S3KS;;^-V<67}C}+rEH2r)oqbaL7gC2vycELQx4~!EHIJPqu IF#cx*0CH})9)V`Q7W|DUBM8v_h1)rPQG7!YEURp4Ti75@t}vTZi~ zuWT!@(AHpTlWK_HHlC?cMiSOq+cRt!brsFc^b8mnj2Rj94D?L&%(RWt(u~p!EG>;J z&CN|Ll2a^<4a^M_&C`+%4bm(Ol1&YhP0S1ujf}USiDmr5!4h-m%h%~=(ij5-4rbe$ ztGzq!v;Ido)9ZHI3Db4b87mZ^qJQ+Eq9FA>d_C+6wHF>PTIsQ6`;m0UQ%sy}3@l(b zvu&TA#aPP7XttdHU{PBh@y%;@o-5dfUWULgPg delta 309 zcmZpe!q_l{aY6@+4C|ZDjXg$MjBJzlYpF7_ZGNito>xF9f+gwiRBz`+s}|KJtkk`` z`H97PR&z5w0|o|TMg~0tJrg}MZKJd_qcj6cOCw8ja}$f?6boYmbHhaQv}8krGz)`d zQ^RBvGlN7UV_orW@&w0!oNNp%3?RU^dAd_6Bcs`7UYC5vU^5171|x1jOb*Xu@E@kj#(*B#nVG<_v}mi9j+9C}s%crvb$cfNWDBFBz!T49H6a>NTEx b-qn=Vj6sjVV6&jx2gZp89Ge+E{xbpq{!?3d diff --git a/jackify/engine/Wabbajack.Configuration.dll b/jackify/engine/Wabbajack.Configuration.dll index 371d3b6ba0fca6bd0b471ac15da995db61c24eb8..4d0baf72fb2230650d0b3be035594bea20e91634 100644 GIT binary patch delta 289 zcmZorXi%8Y!7}ecQpd&~J7z}q&8L|enFM-WKknMwp3=o#pl=$UI98CWJ7SehA`S)`b!nHgH9nHyS~nx`h38k-oVn31F}K1DUePDsxxIUW-tMYqyXhjfvjYpoH3AR0F*OiFq*uZ*A!^{M_zs=0Mm+3 A3;+NC delta 289 zcmZorXi%8Y!NNU(d&$NgJ7z|<&8L|enFN}iufG=|)9)~I**EPMXYMLZzQelT(M->P zfx(!OLC-+XM9)myC@sw>&A`&q$kN>0#3DJx!q~vvFws0M+0Y=(!XVkyFxkY+AkoN} z0Swkue(RWghb=(hof}Kj_Z?l%s~Y<5M)Glgo@~Qjq5u_Cegzc-s^+*~@#Oyf=K%pv znYHe3zQDeZiIa_i1#A}E=ILCyjErWRS$UEfgUuMU8H^axfDl9)FjxYi5fGaLp$UTp zLo!1OkTeF$m@^nMBm&7apqL?$p9T~+0J2SiykwwSGaxS!sMmP%ZeCNM@gI5lnE-`S BQxpII diff --git a/jackify/engine/Wabbajack.DTOs.dll b/jackify/engine/Wabbajack.DTOs.dll index b85b6ab433678790ac6fb49731ac72dd0149c44f..cce4cb70225ced81520f75f20ddf52b7398497cb 100644 GIT binary patch delta 332 zcmZp;!O?JoV?qbZy#0#n8hf_(Fs|`pWS?&7&FCx2&Hw}E!4MV;1N-*b-i)y;1++CJ zZ2LLqx~_3NFDky^UgLI-uZ$mM%+2)-7#NHh8T1VFO!UmPjSMUk4J^%!%q&vO)65Jl z)65MmP0dpiO^r3=$2Ewi^gBO%Pyd-CDI~`Vl3j0D&dt7C}|FNk)76-K z85zyDKUHTkW(+oG&}J}VFkrA`NCcB+K%N1F}K1DUePDsxxIU mW-tMYqyXhjfvjYpoH3AR0F*OiFq)pN$z%$&V4)^cJQDy#4OiR% delta 332 zcmZp;!O?JoV?qbZ_t`7wH1=%mVO-5o6%R4jR6MCgCQ&y2Da_9y%}Ry3f$ck z#i)78-K9A;W@C7*)uQbjUl~8jn49StFfbT1GUyrTndq5m8>OWgr5RXS8d;i~n^+{L zSQs0a8z!2kB^w%~Sr{an8YY{V86+ARZ#NKPnjpZ!Kk-h>^dm}40RqaY6^n=0``rZtU5jz{oz?QBl>FodE`PxgjhT287sCE=;jrUbxug#fsLV z2-S&<2$|1{)<7HdmHd(9-y`HVPgZIa5a3&|kug~Nj?30I-u%yeeaAPe7%yNqH`g;@ zU@&H6&@<38(KFXJGO$cEurxC=vq&*dGc&YIGdHv}HBU`6H8wF!F*7wuwlq#LNHjE> z>}YMd*~Iz@BTJ4#>h{SpwgCc9G&e4Mv$or{b;tj7pBLP!lWT076rh5vN1=is)yiQ8 z@e+EAT#L3@w{DiRD`4VeXJ7$)hJEvNhh9cT^UbPGlNp1}8MGOU7z`LJ84|&y8IWhj zV8M{WV9t;RWElcw(tvCbZ3?7Qf$B^dj2TRTA}K(5Qy?oDC}#}h835%B8H^@#yO;uv JcXZj$3;;hDT$2C* delta 420 zcmZpez}PT>aY6^nS+VBb8+*1WFtSZ{R8+NPV}Jo&ZU~Eo0U`F33sbC@7cMq=v7)so zLUke|LgurgHP8lqC4VIO_XzpTla(3;1g2Eq)UP?^F3tLJz%h?q$ak4S6fIY*udAdU{Bcs`7Rj0{}!DbBF3`PuTKnNlY7%YL% z2#C#r(1gK)A(PXme@0NJKMUNTUv8IYF<)N4GM+r<=U Jyrav0W&r17VRrxk diff --git a/jackify/engine/Wabbajack.Downloaders.Dispatcher.dll b/jackify/engine/Wabbajack.Downloaders.Dispatcher.dll index d89fb5d45a5961d25d7093af26f8c449646bfda0..164bb697d210b54b39462c868f4093ab239f739d 100644 GIT binary patch delta 623 zcmZp8!r1VHaY6@+Rz>8&jXm3}7}+N~TdRt)Gr+(leh7<&fqinVwYn`rCXNd(15?bf zl@(KLjsRS2@5N5+oXyZYsmbLLma!C*;LZ;D17|A75S>Q5ob8fO>iU}dq zO}>a?f&wq5YCVK%xT!V>Qzt9h3M090A0jk1d)hKf3B2@P#FT8jz;%6Gm_fuPhj*J} z!XpSi^bGV&^vt!53@j53EX|C}EK-%yxnMAvGUSZN)ExqLYWQX)N1*l-^NvI%D zb!=7?pAGX(iNudz$~iYbOJBjn$<6@r7W?MuSyLGq%{S}j%x4TXXV7LaVlZH^WJm;) zWPQkYxyzNdvM$v?-8I1*$V;FlI0TilhMLO@XXrpqw#~X8@ElWH6d6 XpJ&Qy&Y;I&u-P$V1>90i@!Pd${-q_I zG2b`GgiG+4o9P)aFc>p3=o#pl=$UC7rKK6A8CY5xS(=-hSR|)d7#o-yCYq-u8ycip z7$ln-CYzWUBpMlSUY%^n%%ZG!@xtT>X#oO>ni)-JXWKhWb@<0&S@*hrvO{{C0#q>J zDpU}pdP;=j&E}G89U_t}Pc}bGU%|x5#sKja+ve$6QyCe}HtXihXACxD&}J}VNCQF; zX~19!ghoJY4umEQ77WP@DL~Q~C}YlG$dCvm(|}@zKzd Z$?|!otY!>)3#WB`s6g8DOBE8^U5?K#0X+5xc^Osm=_G*b*MN zy2<|~-!rmrelN9ANMLfk}53Q6y3aegYH!}b8|fd1_onB20a5k6FqZn zBLmAs14}a_Gm8}SG&4iXG;>2sQ}fhBQ)3gu6f;wkWJ}`|gG584$$L!pu;kuUo;SJ1 zG(e#5pN1fR?<)V!13~TDPEV>Q-!W}cfC{eXgbIRGn{BSNXs=xRAn?wbwVUhA1eiG4 z8CbxsW#2sAqL-1;e6y<6WX51~25kl-1_K65hD0!F2IQGBSTLk8m@}jSS%yHFG$0#9 tn*!-npgL0qV+IqTND5Hi6v#>j${7QB20%GO2BXQ`Hl{%19c}hA0{|V|T2KH0 delta 403 zcmZo@U~Fh$oY29dH~sF8jXhT+7}+K#N?N9}F~C4QH-yE)fDnttB6fulQ=J(Wu_Zik zb(8-~zGr0H{9bCKkU-oW8P9#fA^!V{Wtd!w5)C(R(7noLZl-6zz+lYCpl6_GqGzUU zl$K_cW?*S)WNB`0Vv(F;VQgS-m}s7sY-o^XVUTQUm~3KZkZ5E)d5_5+mfEwrA12qB z1_*@7e@>mgT-;&WyG)Iiwr3fW@0d0zKm{jUg9-vw7o0r3`1$O|Qpdh&OLT9pGZSFq zWMg0fyOwS9bcm?4m#1{5~{vQ2@!WT09zATJT9*LX6wjVaK0N1Of30DB`_=Kufz diff --git a/jackify/engine/Wabbajack.Downloaders.GoogleDrive.dll b/jackify/engine/Wabbajack.Downloaders.GoogleDrive.dll index b60af48c001e2b55278c2e1e8403129cad7356ef..770953cfbc8d0a9cce1d505ba2d4945d221ed6a5 100644 GIT binary patch delta 405 zcmZqZVQlDOoY28i@JH^+#vTqiM)t{5hYtz*QAVXMufLev{-C9<5#O&9Qlhkp;WCxt;+7 zgE1q6o`If;p1HP>fn}nBrJ0eLMT&WvnW1HxxuK=0d1|7mv58@dnW;&#rE!WuqM^}d zb*q_-ETQZ@ZzdnH4iHc~7%JUc;px@JW-*0->E!OoDmEPoFhMt{AW(G->mB}pE1~+L7Tyd!GOV%ArVZP0eNN&77Qs2 z<_u{-mLX6k4af%3ra(FssLqtZn85@nk^+=B1+tQXa>hWO0Z`76!DzC)lPRk?gC2vy PWy^zrj4asA&GZZy z7>pSi^bGV&^vtx4($b953@j~;EX~bLERs_!j19~U6V20-4Gq#P43bR^lTFMF5{-;E zt6R-vWXZbw`OxGe)&T+x|GpdvQC;HN;Bijv!7B^V$tpG-3NXO~P(h$-r(Kn+eb&Ut zbN)CrW%=eaHisBF*%(;B4rSXs-EJx)quFL%hxv@bW(?X4Mhs~{2qFy_EP>Dnh|Ph} zgu#L#nIQ#88Utm_84MW`fn*v`%n-;=1Bx2}*``2VGEl7fn}nBrJ0eLMT&WvnW1HxxuK=0d1|7mv58@dnW;&#rE!WuqM;E3gB>G- z<>ZaVTARg<8yQ&`R(*Isd5%edz_}T_@Bhu1;Ii>SWkl3OO~=W9OsW*1f=>*gfz zpO@NZ&8W8DB6)Fc!{lkEKRDSLSipV(I@he0kEm^1_O z%or>fQW(q`(ts>OpiCN&4WdnfbShAtDT6VC2~Z>jC~pd6B?IM*fjk4CoFRkJ2X=z4j29}mamgeRr7Rf0V#s=nwiRNj^h6ZUC2Fa#|$tGq7iAKf@40enR zmXkLcYi$-cZe(QHb#MKW$#YBs1UBt&FpWKT#(DnDt?D9zTH%xbm{ci11wY3_1%awn zP6h01zQHf~HA_fAe)2TaADnCqEMUI?ooiOh$Y{1%)S{X(*o;A&!H6LZ2tlL)gC!6e z0kJs{nlM-}Br~J{Nn@alIfEfXB9Kf2iWvg=X+UuUAlnqkO9rYn1M(7qdW|PPwlrlm TW6)zT*eq!CgmE*Y&3{G!cdujZ diff --git a/jackify/engine/Wabbajack.Downloaders.IPS4OAuth2Downloader.dll b/jackify/engine/Wabbajack.Downloaders.IPS4OAuth2Downloader.dll index 382332d57a331db98fc4800828dc5363d9d930cd..be3779b10f9e8405cee612d0fac988081680622f 100644 GIT binary patch delta 405 zcmZpe!qhN@X+j5!x#z9l8+$Z-8QCXq^;H#RXMh1GVF-(bfqn9OUu&Sewx7BtLjEoz zTpp%{K~V%QHo4lb8_6^dLAcCjX@64%fu9+LhqrB4aa$7q&=7yH0=BbIM#wLa-W~L^|mc}UtiH1g- zwW{k_Sj_6@_Do(=A0VJzP<*Se?xaV@r!$kqiWL(k^EAv-fC@@@Km|dnn=B?XymEce zG4C+@>CML)PB3z^Gq8Xi%D#De(_ThK^Ua|xw;6-Y8MGOU7z`LJ84|&y8IWhjV8M{W zV9t;RWElcw(tvCbZ3?7Qf$B^dj2TRTA}K(5Qy?oDC}#}h835%B8H^@3x0$kWrVcg8v@t+X@(QIH9 delta 405 zcmZpe!qhN@X+j6ft2m=28+$Z-8QCUp^;H#RV}JoCVF-(bfo<}8Uu&Sewx7BtLjEoz zTpp%{K~V%QHo4lb8_6^dLAcCjX@64%0lljn$#Zs!`m9gmb+(>=S7&oV{$y@*Gd%+a z24hABJp(-xJu_{iv^1kM14~OIOLKD*i{umwV*_);MDw&{LxVI6gJe^~WD_%kL?h$P zTGe$dEE|qi?3}!&K0u)M)x`^&^Z&W8c{nlo*N&4DC-XGSQh*9xhY12zTh2Ns6q988 z=<|lgO%|JvHJo7NWMg0fJCtqn^rpRxjAoldTW&K3n=xoJ7%`*)A&4|!umnOQAT|d= z69x;0WQG(VX$+JxXE0<)1d?e$F+(6f4Jd8^WSatc$w0McKwctHukqyOHd9tJ20aFY P&4L{+jGGxd{xbpq_^M~J diff --git a/jackify/engine/Wabbajack.Downloaders.Interfaces.dll b/jackify/engine/Wabbajack.Downloaders.Interfaces.dll index 5c3168ea3e2837460b31d3c2c22b9c1fd85c66f7..8f9fa3123e191090e1bf3445549cb4f9264187d9 100644 GIT binary patch delta 382 zcmZp$Xt0>j!4jCa_wmM_MI4Omll3`OZP^)Mz>WpNVqrjtr9dT-#hxJ4ZJx;4%__hX z(Jp$s$H}p^`Dgx;|Mx>S>+pYK3^La`iIk`YEKw#1i z`9&xGID1YudCV(S)<1Rf1;I82s34~>R1l;(H~-D+1xYp+c>1awHj!ScK)@chP}MI4N5ll3`OZP^%Lz>WpNVqrjtr9dT-#hxJ4ZJx;4%_+{7X| z#lqOY+%VBRE!of@&B7qr)G*n^%plRon1O+nk%5VUfrF8O8|E?~{f0CA?c@T%00GdV+-E%|QiZ!Qy(VB%zBfViA( z^K_A^jErWRb;ag02AeTxGZ-hLK6lHhGd2mAZZMgF=sGjNCc8; wKrurgKMg2u0A!m2dC5SvW!XuqU;PX;00x}FtAT92$fzP@V2T;0Ls=lz z2f2lTrd{Q>W@O(i$Ro`qaL2v2sVVigQ*Tnuj_L1jT-j_R_J+yaT+e`k!I+Uj&p^*a z&s^Kcz%tRm(#*)rBE>w-%+NB;+|bh0JT=kO*u*f!%+w^=(m2H+(a>meyksUzTW#dL z$!8=31gtad4QAY);!XuqHGK>;KdGMu`sYrF636%M98QjWMGOJrbAgE z)d#tSfu>#Mwq|78EXX6xCE(xK+IjTTF{f?Qs@0hr?(N%bBld>L+)U4afx(!OLC-+X zM9)myC@sw>&A`&q$kN>0#3DJx!q~vvFws0M+0Y=(!XVkyFxkY+AkoNpa=c_F3%{`W zrO9U`0|Z`eFtm7l;fPnyx1S70w72F@){&}HfC^TffeHdu2c3&t|2r<>luzaCgnOG$ zNgZM2WMg0fJDP3tbeUF0MzhVba_x-4W(?X4Mhs~{2qFy_EP>Dnh|Ph}gu#L#nIQ#8 w8Utm_84MW`fn*v`%n-;=1Bx2}*``2VGEl7<{9 diff --git a/jackify/engine/Wabbajack.Downloaders.MediaFire.dll b/jackify/engine/Wabbajack.Downloaders.MediaFire.dll index 8e706dd86c78fca05fd699b2e90a97455b64d4ab..bea33d11a621151dd5b5a575021a1132a60ecfe9 100644 GIT binary patch delta 388 zcmZpuX{edd!SX@nz>JMO_oNxwCuhs30?COo!lLX9FtC~v!eU`ypS)AXS`#4?$q1K$ zDQ1|(1s9tvE9=k5zByMmn@?bFg|~%vp}J?kyHZ`kq$t+SFSMVq*_!JaFfbT1GUyrT zndq5o8yQ$88d#bcnOUTmrZ zGz0R?7%Ui47|a>cfGk6xOd604qD_HxDo~v%gE4~%P$UH?Zwh231Lcf?JOiMdA%oFm NZYxuu@s3venF0EoTRs2) delta 388 zcmZpuX{edd!II79G;L$gJ!wX^$=NchKysptuqYb?46Npauvi$_ChwH7)}_P7urwQY|Zox7#NHh8T1VF zO!UmOjndML(hMvujV#U0O)QdAEQ}4z4HM1Nk_`>gEDVxO4U8N4U| zQx}_DV648`&De;MCGyMV-;--h0t5tZo!R+C>AUyBowh3z|%SZf-E;W8`FGU;#UxZS!=qUPeZ<&8ilY8H3Fjv>A*T(tr>|8ZcM_ zp%D<91EC3n1w%4J3Xn7g%9t}4G9&`YG@zIvke>z=HvqCtfxKj(S~DOo5vbRAGPji} K(0E6y{mcL*uwn23 diff --git a/jackify/engine/Wabbajack.Downloaders.Mega.dll b/jackify/engine/Wabbajack.Downloaders.Mega.dll index 93b4387a2d7c2827cc96b1b8f50e2bb1081ba26a..718cb050256451f72e7db3e1d4c43307d10937af 100644 GIT binary patch delta 376 zcmZo@U~Fh$oY29tLvYcCjXipDjO>$l%c%m%hjPL|@~fORkTjGR)?{aZflx*Wi-iFp zR?h_&o181}57e_)UY(JB^HX_wJ^|@-n^w4Izj15u@}AMXL$zeHh~5P@b8|fd1_onB z20a5k6FqZnBLmAs14}a_Gm8}SG&4iXG;>2sQ}fhBQ)3gu6f;wkWJ}`|gG584&C;fo zj4ZEI8E#LWVHO}TYm?mZz-DQ$33E?A$Xi&LHTj2Gl>$^yD*!48R2}_W?CcRAMf5JPnVabuFfbT1 zGUyrTndq5m8>OWgr5RXS8d;i~n^+{LSQs0a8z!2kB^w%~Sr{an8YY{V86+ARZw!H^*lNTvbB41xSKptu2$Z3^Ti1J#-Vd5J*1#*-ggo3ffQ=rI^<7PNc9 KxS7%JKO+D_cxBxH diff --git a/jackify/engine/Wabbajack.Downloaders.ModDB.dll b/jackify/engine/Wabbajack.Downloaders.ModDB.dll index 9f8b1335d7379ccdab9d1e5b1c0b6c65183fc4e8..8c63bfaa693adb53b63801b0f9fae866f2b2fd03 100644 GIT binary patch delta 405 zcmZpe!Pqc^aY6^njpOX6HuhXnWMrQlucWHU&Hw`|c_1tn2837=LTvI{C2J(r)=ZeH z9eLqmlLeLifi@&6TQjn6o~z6+EN~_1(|h6gV&{DYdX}@DI8ScgW0uEhZmws*z+lYC zpl6_GqGzscWMG+SU}CYHVVdVrFWRY-yZgkZ5SMInkk* zk>$Iv^R>x090LSCv9E}n-@M6nnd{nyuMzdilP#QT6rh5vX;49+>aaDF%7ngMd?EkI zu5aJwD^9x@IoTOlz>a3$Jl&<1kEm^1_O%or>fQW(q` z(ts>OpiCN&4WdnfbShAtDT6VC2~Z>jC~pd6B?IM*fjk4CoFRkJpSi z^bGV&^vtx4($b953@j~;EX~bLERs_!j19~U6V20-4Gq#P43bR^lTFMF5{-;ECpr`} zvMi65+c5ctV}QUt)^!gW`@?*@qB<70S*&!JY~fU+02Pe&f(n9Er%Zh9!jh1ekb3{@ zqRm&Fb}@3YF|dFg&9-^EOD!X#*=A9KwKxhQS=0Iq|V8M{g zkOCx)fimU{h75^7G7TtZ2;`>$#SMULQy?!HsMZX~O9bjQp8VL|l+}zukHKKGpw|<| J&5U0E83CU^T_6Ae diff --git a/jackify/engine/Wabbajack.Downloaders.Nexus.dll b/jackify/engine/Wabbajack.Downloaders.Nexus.dll index a937ee25357661916386159eb33d8da598d2af8f..aed0518b8308145ac940e6739cb2b7a9974393cd 100644 GIT binary patch delta 431 zcmZqJ!Pu~aaY6^noU;EjH}*8BF|tqQRaezyXMh0@UI>eY0U^eS5StvWt`5}Gtgeov zr;i6y&o?AJm%(~|tCx!+%;e{W>)G6{@l#$v__{*gnF~3-li%>U*u{LU*gU~w8i%>L zo&f`cF(ZSXfu4z;xweskWuk$lnUR@Aig}uup=Fx6p{1#LYNDyJiD8PFsY$Y>af(5r zq0#2pKy^lz+PJeHCwBw|2po6ZXWq%f=+;^9n(>TB-DL8Mpc)0J;4zpWNcFs;mr;&^ zst0fW3~k)p63oTO$SpB%^9>Aj2H|UEEy8Pq#2NB#$dsa z!eGvj24oomWzv9b5N!&iQ-SJC8H^cBfFdbCc~c-O87OBAl0jKMpr#HD}Oc QFxV^@^@MRVW7K~}09meI%K!iX delta 431 zcmZqJ!Pu~aaY6@+$v)FZ8+#hm7}+NCs;g?UF~EQaFNDRyfDmIuh)s@GR|o28R#!*T z)5n9U=Npoq%V0gf)yqW@X7Y2x^=xj}_$e>IXm0m&n)Pna`46M);*x$Y*gU~w8i%== zo&f`cF(ZSXfu4z;nYK|{no*j8rKORjxw(l&a*Bnqfw^I#d0MieL7Ig@vZ-ORiJ3v7 zk@4o(Ky^lzl@z-!NS5Xw02`pm>47b3=$2EHgjo3F|xRn&0IA(Lpwk~%rG~(vA)4=U1``CSZhz<7zxvk->yvNxh;OdZ5n|$GXJ7$4oPG0jy|s*t=9^s&4l@Ru zGiWmyF&HpdG9-dYGa%25!Ga-$!JHut$T9@VqygC=+7w8q0@ax^7&DjvMN)wBra)FQ ZP|g_0GXTmNG8j#cHZlboKhY?k82}5~QQrUn delta 322 zcmZq3X~>z-!7^99cGbq7Ffm59$&bZUMcEi&Ae9}$VqsvLEGzEM$hJ9G+?r3|Pn1?q z{10ibre^6^7B4w6*=GfFeCv^26bH#f0JPO&gH zFgHvzPfIp5NV70VHZ@E(F*8UsGTzLk6~)LR_hIAq$r;)K0vdN7|DL#t)1^(rK}7nf zO!4Fs+EWyuf=}3>f*{rZ5Hzrwqi}n<{BL#CQdd67O->KHc!`E%gAW9+121M zW3U;6HiHpE8W4g=0|rYVGy-CCAT(jHU`S?20g}c*8FL0hhD0El1{5;{^3#Cg20*qc ake3WpYX;;c0`(eCjy5s{8b8q}pBVrQaZ?rm diff --git a/jackify/engine/Wabbajack.Downloaders.WabbajackCDN.dll b/jackify/engine/Wabbajack.Downloaders.WabbajackCDN.dll index 271d1ee6f9f58543d80c15c6c282fffb73a46bbf..0ee0ace491345155f580d6de6f227fa1a9ca1911 100644 GIT binary patch delta 415 zcmZoTz}RqraY6@6l1#S8mfx2Gr&LwH-yE)z&`o6p*m1r*~niLA%Bhs zE)Ubfkj?}bn>^dd8p$+8glU^!8!3tkgoQq-u-tsvr}OLSzyHeZipOyIIL*E3*X zFlJ=XGte{9GuJjUuuL?tG&3@@NHI?{Gqg-IH?%Z0Pfav6HZe>wGc`%JG)^%{G&Evh zaA9PypFAN%Z1evhL1q^5@7-%Ai-ZLTJP&M`IIGjzcjcYGlV4A|$uqemtV;nZ_*WAu z2vn`pYVw)QftU5CY)g*hX1VYJMoxAH7O-d7H&2h4%gAWH*)(c3W3V}cHiHp^0fQw& zBA7G-^2``47*ZI_8Pb3(L!e9=kPV_ufpjWRohgGcg9%V11t@O{WF-UTjDb7@pqwFt a(PZNoQ&w{ZJqCl#f^kzAH#5flX9NHpo?{sR delta 415 zcmZoTz}RqraY6@+NXp0NjXfrYjBJw+8mfx2F~C3uH-yE)z&81}p*m1r*~niLA%Bhs zE)Ubfkj?}bn>^dd8p$+8glU^!8!3tk{AZbNvg!8?$Ms7#6`okk#<5w(V*;10nVtay zgE1q6o`If;o|(2$TAERsfu*I9rMbC@MRJOTv4Oc^qIp`fp+TC3L9(e~vWb~NqLDEJ zg9{^r{p1NDVw?X52{N<%aGB6EStKk#Alh`9OH?Kg%>b#vN5oLJ;Szndc<5tMzhVPQL7n)%^0*9j2O~@5JVa< zSOTFD5Ss&`34;YgGD8ZGGzQ9;GZ-=?0?9O>m?4m#1{5~{vQ2@!WT09zATJT9*LbpV Xj47)bgC2vyX2G~AjGGzb{xbpqcfMm{ diff --git a/jackify/engine/Wabbajack.FileExtractor.dll b/jackify/engine/Wabbajack.FileExtractor.dll index 6d387e49375b7b24f2877d3a9a360a362d78794a..d9eacb835d73ec77d0e486521e7ad2d28da98b86 100644 GIT binary patch delta 363 zcmZp8!_x4EWkLtbpQp>0Z|wQEjgftF_jXkvxpBKNkUY9w9Z0?flcGD+McEl(;D-!^ z#lpZoIdBI^ZR!qdM)u7McYF>KSj57ld2F7T>xNB#+S@{JW^P}?&G1{DRW=jqW4{5hFN z>FY+Jr+(WT^cndWIoTOlz%FOsKHY#ZmyywYJF5|6GGnkggEoT^g8_pjLn4?o1MF@4N4~tM`q1-#BX+>z&q9r}=Y_X6sbvh#j3F zKI=SjFlIK+XHEED-z$HU0cL9_9(8N+2AbWQc(|MHvC5!fb+@i^!S%x1NkiYx;rp`i zEC#?4EM~cuS8$Ya6bk|;5W@9k)#psup-|Fh%4f1O5*%SV<4p zHXk0_?egXJ?CV{!coFq2JX)Qk@zNw6^*>Uz{qk|9CyR#}T`yt^XG}20KR0#6@Bq=% z(+*19^Pm6@DAI@w0+K^pkX-OVLY2trM1Tz;QBh`-SCliFOXMVVJ#r!43=$2EHtTLNW@Y(ou=?NRl$`+rbKU1kUB9F1 zHS64qoU1W!OD7-MS)u?Hyd?z{1gXCNO!V=B$pU9W)V9ps9I?xciIbgy1?*_{&C~bf zGBTQPX5E*}7;Mg<&0xe}z+lOc2qw*dJTnFhh7<;KhBP3{5Ga!dWP@l^Ae{KS;;^-V<67}C}+rEG-MwaI0 zCKkyl7RCnVhKc5B$%Y1L76!?thRG&o28l+-n{~Gsv$B|`YOk7{vNJ&7@};={314^n zHn*MH@A7r}*U3kAmMB04_re50s+TfWw!H^*lNTvbB41xSK gptu2$Z3^Ti1J#-Vd5J*1#*=sNHw7C1aX&v30K%qWTmS$7 diff --git a/jackify/engine/Wabbajack.Hashing.xxHash64.dll b/jackify/engine/Wabbajack.Hashing.xxHash64.dll index 5030b866fef80e0bb1d43024566aa532266848d8..b91a4801a4217771a2949879959fc0ffff3fbce3 100644 GIT binary patch delta 337 zcmZoz!Pu~ZaY6^nu5z&-8+(rEF|tn%)K?W{XMlk{To4uu1N-J~eOUnk>v$K7-HGR2 zXPNvcmo`%l*u2C3C5NrKo&f`cF(ZSXfu4z;xweskWuk$lnUR@Aig}uup=Fx6p{1#L zYNDyJiD8PFsY$Y>af(5rp%DXv9V3I~$`o@ja*@NcGa))lb3;bh0Og-e0~s%Ugw!lbwMD>}2-M(|u|g z8O=9~`c*Rqn=@!L7%>96H0HufCRV`Q5gsIMx@#sC9*xF9SR2DZ)J`mzE72W6HVaXRef zJWFzJ@Vx0?nl|sSf5~BMrf0ywV9dy%XP{@IXQpkGmS&V@U}M*}k(^>-Y+!Df zXr7jAXpm-MkZfw0Y+`1RXk^U5V8_T{Ik~_?YV!||5=NH2PYz6)T;LTTuygC3H9{*c zIL_SR!uL$t(O~iguPOzo;KrL!L6GVV;xczMrGMRG=8ZYAIm=sxk&}&q1?*(D&C`8q z85zwsi~3bF2AeTxGZ-hLK6lHhGd2mAZZMgF=sGjNCc8;Krurg sKMg2u0A!m2dC5SvWuyxMtl_?Y(>(Dd6L!4WT%r}tYHqG) zz`$V4$e?GSXQF4WZDe4XXkck(WM+|Ko@QofnPzTiX=G1#0zo56^|fWeX>5lor^d1ee2 z3@Hre3~4}?Ay6g_$Oh4-Ksptu&XmEJ!2~Fh0+crevXX&v#z39{P|lFSX!2xBQ&w{Z RJqClxjwU9X8Lj>^0syY`Ra^i7 delta 298 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 delta 53172 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 diff --git a/jackify/engine/Wabbajack.Networking.BethesdaNet.dll b/jackify/engine/Wabbajack.Networking.BethesdaNet.dll index f973f004b807b7ab1ebe67a0c3c0de37f74b9396..fd3a72bc7014708347b8d88775b636d38d44cf9c 100644 GIT binary patch delta 343 zcmZqJ!PKyWX+j4}%DP+IH}({TFtShnAEGMC&Hw`U3=GDM40;B7CVJ-DMh2FN29{<;tX=a9& zY37EOrsk=Mrp6|QDQ2c7$(F_`28o773=Ecx3?`EqyEHd{?by!Fa_^DajmaA(1PFv? zDXU)jQ|_>#Qpr{(>QKXEfr)JjP{9K*L7?i0zsvTyTc!QH#p1Ez@#bw4Z!mGPGq8Xi z&c1p2l&Or2=9_h=&1VcYXV7LaVlZH^WJm;)WPQkYxyzNdvM$v?-8I z1*$V;FlI0TilhMLO@XXrpqw#~X8@ElWH6d6Kf{#OoI#JlV6)()6^xr1XZ>dc009+W ADF6Tf delta 343 zcmZqJ!PKyWX+j6fho9?yZR{xuVPu>9KSWiOjR6KkWFRaS2DZtTq4OEpHs1_w*AU46 zt8j8Pi;(-W3k{aiKQs<(E~t~|vNh8)U|=w2WY9CvGto2CHcCq~N;9yuG_o`|H?c@g zu`o6;H%v57OExq}voJ_DHB2@!Ge|TtW?-;nWH6b`*rmDoYsYqWme1Q~%$vMnLV!T$ z<;|Tbx99n7+aOe3`>B9;vcSYP1$056YPkqCLzbY%Ga?3csg|3!O}xRx$;Q9}b~xMS z=~JdMGMa7Hoi?8_*o;A&!H6LZ2tlL)gC!6e0kJs{nlM-}Br~J{Nn@alIfEfXB9Kf2 viWvg=X+UuUAlnqkO9rYn1M(7qdW|Q`&oE^*W6)zT*ep0{1>af(5rp%DXvBO`;&WJMLx$rH5IHkW9#FtO~q{NmT-8r=Ya>7w$PBDY>KFhASyQ^Zz$bCsS56DK5lor^d1ee23@Hre3~4}?Ay6g_$Oh4-Ksptu&XmEJ!2~Fh f0+crevXX&v#z39{P|lFSX!3VsQ=sv>CYPB3u(?^~ delta 315 zcmZoDXegM_!F+?UcVl;?1S8wzrxLzE(pXZRk!^Fdq$RHaht}D>yWd$jHSd0XZjN%( z_03DvB3NwA^b8mnj2Rj94D?L&%(RWt(u~p!EG>;J&CN|Ll2a^<4a^M_&C`+%4bm(O zl1&YhP0S1ujf@!>92psGCM&9lPM)Bxwz))`g^6YRiK6|JYjgtymNFaW$3NKTx+h`( zQ`fE+wj- z1|tRo21|xSFlh$lnK4)}q%fE>qybrmK$$ck8$_D|=~SRPQwC!O6QD>6P~H^CN(Raq h19=8OIYS1c$&dX_Sp delta 317 zcmZoz!Pu~ZaY6@+*#?VA8+#UMFtSb7*R%wZnVQy&Y@3&AeijipTzBlfWY8hsEpL8b zpLxgHaq|khRCaSSJp%>?V@3u&13eQxGi{@^G@~>FOG_h5b8{1m?NX2q6V6)W$a@-H>Y@OF>A*T(tr>|8ZcM_p%D<91EC3n1w%4J3Xn7g%9t}4G9&`YG@zIvke>z=HvqCtfxKj( hS~DOo5vbRA@?(EfRx<`Y27}FlK~ESrGY0)<1OQk7T(kfH diff --git a/jackify/engine/Wabbajack.Networking.Http.Interfaces.dll b/jackify/engine/Wabbajack.Networking.Http.Interfaces.dll index c7256e00b4733f2d1ad372d24b1696cc06335d89..d0da75594847f08017b3bd884f093662c52810dd 100644 GIT binary patch delta 321 zcmZqBY0#O_!7`WKZ{NnA6D*AElS5fmfn+tSx+psX3`}H(uvi$_H*aTs$SiQo@#BPi z`$LW$2bV@)xuEa6c?G8=qq(`B0Rw|EBZHoSo{65hwvmBlqJgEEk(ot`d77D_WtzF6 zrKx#pqN%ZoVTzflNwTGJib0~G(c~Xo8Z6g$Z{9gsg*!mNzkj{#y7QC$r*8eOWaX~+ zdU6YQp8{0yz9>`>sM^vkYJ$rCplx2eyiE6QHsXn4;$&xF0lSlZ^K`zYjEv@+Z3VV7 z2AeZzGZ--#Fjz7qf=M$V&y2x>A%(%5Aq~hf1j?iV*&x~!NT&kTnKBqNm;gmmfbyn5 bRx(h|7|1gK${8{kO?DSD1sY!~)XWS3{0&tE delta 321 zcmZqBY0#O_!D6J;^Sa$QxoHSX5J3xTTU%_+Q&u-TZH`gCco1yGE zxrMt=0V)_;02KtOmdoQj*yjJWa^KgxEWExP+5XeshiW>mgra)dY XP^}q|mk88rJlS2y6li>{P%|?Cq diff --git a/jackify/engine/Wabbajack.Networking.Http.dll b/jackify/engine/Wabbajack.Networking.Http.dll index 030d3cf71f82a648f196957e249f65d182f91fc1..93526b9ee68db00c1473b34635b7c96e51c5764a 100644 GIT binary patch delta 338 zcmZozz|^pSX+j4}RE^i(jXi$ujO>$dyO#pVKo4Ocnd)H;Bo~6&TRr?4**CL#cIygA z`+eAbr+h%?(T}dw%tIPi|-n5GZ+`cvnSM z!nxV-oB6A=H6D{6v{fiT1%sWTf*{pfWlw(8Vvn-=e$-2Rb49xtBPTlp3j+wSZ=T*! z%E)NGnYSySG1#0zo56^|fWeX>5lor^d1ee23@Hre3~4}?Ay6g_$Oh4-Ksptu&XmEJ x!2~Fh0+crevXX&v#z39{P|lFSX!7}PQ&w{ZJqCl#f;}G?CmL{UX6*aV2mnucWR?H` delta 338 zcmZozz|^pSX+j6f(wF{oHum_rGqO#-?OqBb13iR+WU7ZXkX#66Z}sqJWZTT@*{v&Z zGxnzfn`fW**50eFTlL-eHZLf<$761$XTZQ<%*dc;pl70Irfrm#W|U@NX=!9>Zf;_c zoMK^YU~ZUbo|bHAkY-_!Y-*TnVrGzNWIXwAv-{>h%?(T}|BI9EO>Srl5Sag1mSKg; z3imZ@78$ORdU;~M7$N&HU diff --git a/jackify/engine/Wabbajack.Networking.NexusApi.dll b/jackify/engine/Wabbajack.Networking.NexusApi.dll index 1e49a451c5c2fec1f3100dc9606ed9d418abdcb1..970ee473333f14ca23c6dd978f1c29224d6c6c1d 100644 GIT binary patch delta 396 zcmZqp!P4-9WkLtb)#qm?Z|qsOnUQ_6^%hG}b_N)TQHQWt7}zIwZczuyZ``7;iIC4% zgv-OUFih5fi%n+SDh$*ky49bNeRJy8*C7IjYo%O$<}aOihw4jZ+K~ z4UMKZsxj(q|E9{Q#=|0Y&8};@f)QhYzO$D^txVG!j2IgfprZVL zp`sx5y>}JFw39^sG8|hUyj{VVF^`dxoq+}HeD>|rO&D7l8O^uLnlZLB2AeZzGZ--# zFjz7qf=M$V&y2x>A%(%5Aq~hf1j?iV*&x~!NT&kTnKBqNm;gmmfbyn5Rx(h|7|1gK V${8{kP5*ArXbQAI*MjjfGXRwDVVD2_ delta 396 zcmZqp!P4-9WkLr_`m3mE8++DmW@MXey~R?LjR6K?)FCVu2DZtaThxK_8@H%yBINTG z;qovo43jnBVv`xS3Ip|sZuMtm+nl=fb%?;pL{XW%y$POsrf;cD)NWY1J%NkSP}ImN=*z}zs=JT2MKAkD%c+0-!E#LOVk z$as3A8l&F!Z>o%HJS?%XwfCkg7%>J2yk?vEe)q%qKGW6GVh?4PZ<*d;#Mq#KE(%ir z!Z3U1TaD%3-?o)}*sfsAn8(P;#=ru0KHK)`CXB6&jAq+q%^2GmgUuMU8H^axfDl9) zFjxYi5fGaLp$UTpLo!1OkTeF$m@^nMBm&7apqL?$p9T~+0J2SiykwwSGaxS!sMmP< PcXLKlpar@XjF*`K(641U diff --git a/jackify/engine/Wabbajack.Networking.WabbajackClientApi.dll b/jackify/engine/Wabbajack.Networking.WabbajackClientApi.dll index 6d650d7c78b926621541aba2b670446f937fcfeb..a6e6021c25463520f3e40c82ca72f0f232535f6a 100644 GIT binary patch delta 407 zcmZp8z|!!5WkLtba*JihH};5ZWMrSbaHA@aJibv~lbrzuUP?n)EDQ*-DQs}D$>N*T zMG-P5r4TZ~o791(Rd4DBlI)v-?9KX{x7rKDOPOq*f7af8`Z-_T`_IFtZ~pQrLfO__ z&wzo!n2|xxK+i3(9+aAHPO`A#4yFo)Fj!`IK?2* z(1?M-nUTS6x}yZ6=JriujBfla{Ka|ur~gr93=q)c=?_gc@AO(1uKr$V+bjF&F=~uc z6riHJ@}QzX_4eDCnT#&+_bS}F@u*|FfI4FxBPTlp3)m;@+ox+Vu4QC2-|ni#c$hKR zoI#txh{1rtk|7aHngMxc3>FM24CV}JK$am;CJo32(WXE;6{yaX!I;4WD3St{HwChi bfpW$`o&iwKkilqrv<{;w(1M9NjQPv}KO13^ delta 407 zcmZp8z|!!5WkLrFN5K2T8+$}HGO|rxxKR~I9^a_0$;JQ!FQp+Y76yda6etrYHd%a= zx+p^Cq!e8BbpuKE%|P~M{monL1^(OKEz_}B?%4U@Yj$*%Jlp0kpCXiP z&GZZy7>pSi^bGV&^vtx4($b953@j~;EX~bLERs_!j19~U6V20-4Gq#P43bR^lTFMF z5{--*7@Qdy?4~*KT^WH}iN&?HpH1C1tG#p)>F0~z zd?Wu3m#Mj)0Rw|EBZHoSo{65hwvmBlqJgEEk(ot`d77D_WtzF6rKx#pqN%ZoVTzfl zNwTGJib3M!-PKl;HA4kAn^d1*X1TGs`S7Ir00F0Y!qXm92za;8n{hGE((Ux*g!(K6 zsNnD8P(h$#XMTMH&bV8j!<(#3FKm8Qzl4dCoq>e`1lTuEZ;EAPG~fKS*_$!goI#tx zh{1rtk|7aHngMxc3>FM24CV}JK$am;CJo32(WXE;6{yaX!I;4WD3St{HwChifpW$` fo&iwKkils3$l@Zud$W?kaJj$V)Ynt$p4FT+% zZ{*+MGB?vRU|=w2WY9CvGto2CHcCq~N;9yuG_o`|H?c@gu`o6;H%v57OExq}voJ_D zHB2@!Ge|Ttp1il(VzOqa;AWHR6U;1rb2^qyst*vDI5)Ur$uCvMRmnlFM?IZ?OirlJ zQh*9F!UTbe)iNZ?&T++b+w(|XR@nTiehCvN8v_di2(WFQ-W1EoXtw!lvo~X~8G|;1 z5kndff=B}fOCU4?VsjugVX$CGW=H{&#y}Z!21ABKAejafGX(O}fZ_%~wkeR83{-0d d%O$<}aOihw4jZ+K~ z4UHy0u!>+|oH6^`Of{O5_RWn!`sPotWy-Ag1mR3f*{pRi}(CK z75gErKX=dk%?dVoOq}ctEDRvPzInQxFC(M*=BM_?jKSs%+6+bv1`L)AiD1$U$TMTG zU`SywXGjCG41qFfKsJar1=6WNb*2o)3?@L46rj8*kd+LSGY0YufO3WmMw7E0O@YQQ Ibc|;L0JRlWDgXcg delta 291 zcmZqZU~K4MoY29tYwh#qjXhJ;7}+)}s~%E!wDEDT!;E7_nYCH3dNx~_7P6X~ z=@~FE7&9{H8R(hlnQ0rPr5U9eSXvrcnwy(gB&S#y8<-m=nx`cj8l+hmB%2y0o0u6S z8W~T1U=_jgXu--UlWnX61UeS>&E~pw$A9U!weLALWL=*;$2vs;D)>GXDhN^?>QU-@ ztkLMol$*jkHY?cVF>$gnurPoC+ve$ZzKo1!o1fYnGX|S6XfqfwqyZs_G+?jq&=7yH0=BbIM#wLa-W~L^|mc}Ut ziH1fD40? zptd7a5Tx4Lqxa{^a>ECftMXl|}&z`$V4$e?GSXQF4WZDe4XXkck(WM+|Ko@Qof znPzTiX=Hp{kuK2IjU5DXBoa%PsX^WpTKR@}4x zX>I<&$sR&^3Q)mpF{mI=bxLW)M%HgZX|LGJeAG8z6WYPZ$<6?AGyCT0BB_jw=9~YD zhBF46GiWmyF&HpdG9-dYGa%25!Ga-$!JHut$T9@VqygC=+7w8q0@ax^7&DjvMN)wB dra)FQP|g_0GXTmNG8j!>E^Z1m{;s$(69Ba&R0IG3 delta 327 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 O`}I3fUSWH@>c0Xn%ym)# delta 6090 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 diff --git a/jackify/engine/Wabbajack.VFS.Interfaces.dll b/jackify/engine/Wabbajack.VFS.Interfaces.dll index 4c53ae91eb80f3579f56f637f9378f0a025c4107..d4a3fad5b014f6798a36ee99157f85de5bc8b140 100644 GIT binary patch delta 326 zcmZqBXwaC@!J^#7`DbI#A7)1O$(<~!qU;PX;Kl@Du`sZ2KFlJ^EU@rmH|xaGIUZ~D zn;u&)n>}Un2lf}{=6VJU491KMdIowXdgj_j29}8imS#p~7AfXwW`>q&=7yH0=BbIM z#wLa-W~L^|mc}UtiH1g#`8gF?eCDPsoNU4wAP}5+`{a?>nI1cRk6XuW$nu&zg|kcn zDp>IoDhN`&Q0kuPx2-l(2JSmHZPwySVd7+GU;#Umee-mlQbtDe&Afd1jKSs%+6+bv z1`L)AiD1$U$TMTGU`SywXGjCG41qFfKsJar1=6WNb*2o)3?@L46rj8*kd+LSGY0Yu hfO3WmMw8F;o3ffS=rI^<78LlvIMIM(Go#RdMgX0uROA2v delta 326 zcmZqBXwaC@!4jWyb;`z`Kg^75lRH^dMcEi&z>NvQVqsw0e3(U+S>O(P(pSi^bGV&^vtx4($b953@j~;EX~bLERs_!j19~U6V20- z4Gq#P43bR^lTFMF5{--}^K&Y)q;3A%JK2OYK)@yCrB}_FFHTL9=80~D}{-Zje!O1Ot#I_c}f`>%{KG$sK(%H- hULsJh@#ORTrmSWRdJG1e1qD7ZPBh@y%qaAq5ddcJShoNG diff --git a/jackify/engine/Wabbajack.VFS.dll b/jackify/engine/Wabbajack.VFS.dll index 204e6d59dc6bf327a4d427ea466eb3cfc1f0709e..9d54bed166a807680230022dc235589113c07f0e 100644 GIT binary patch delta 374 zcmZqp!QAkJc|r$^&*Ph4Huk)m&B#8vdX6fPTsTKql$`+vl4T$)76$goC+DaG0*Ut54WZ!&tuD+oFS0s0nyWV~G{?j{xnRqmHHuId0*Ut54WZQgpuD+qbS+lU~PhuPWx{E9$<}3>Px0&a>mb|%{ zo&f`cF(ZSXfu4z;nYK|{no*j8rKORjxw(l&a*Bnqfw^I#d0MieL7Ig@vZ-ORiJ3v7 zk@4o-cg$=o-goA&pIq`KKw#s;$1fC>D?F!I`1DpvZ7P|3FN@3@Jd;7${@TV91aNB-4OmhCqHAP}~5>HU;vMfojcwyhNa0uqZnN421hb zSS$?e(<5b>{526$+ic)cFx3qA5Mt9W0!^|-D8DC*sr;cnrr3HPxY%?>IVNGCn@r`H z)RElu$PJ;QP>v}X$&!OuEcpU8keR^>q7O(OQ$iRaC=a$oRi4Qo$)x-MxC*!~RXI#C zaaXw5^o3(9+aAHPO`A#4yFo)Fj!` zIK?2*&}e&bATy%^%eo82XQxLLG6x8R`}Q~9y;AJ4O}Fg5rjgRQ={pLUbL63-8D&sW zkov`2!;e1^KG~4h3k*3J2=@HSioLl-+sP?*_V;ge7kHJvoT|^ zIfFKX5rYAPB|{>ZGz0R?7%Ui47|a>cfGk6xOd604qD_HxDo~v%gE4~%P$UH?Zwh23 c1Lcf?JOiMdA%oHM#pTSVKnre`GpjQJ0JZvjS^xk5 delta 675 zcmZqp!rSnLcR~ltpZU|4H1@RiFmCN(`XtTBHoabk$r4EIlwm3dQiifj!lG;pFc9t! zVX-igEDVxO4Ue$y0-+HQn**T3aUW>cUAH_MsTnE=0%dzk= 10: - is_fast_proton = True + # Determine if this Proton is explicitly slow for texture processing + slow_warning = False - if is_fast_proton: - if proton_type == 'GE-Proton': - display_name = f"{proton_name} (GE)" - else: - display_name = proton_name - fast_protons.append((display_name, str(proton['path']))) - else: - # Slow Protons: Valve 9, 10 beta, older GE-Proton, etc. - if proton_type == 'GE-Proton': - display_name = f"{proton_name} (GE) (Slow texture processing)" - else: - display_name = f"{proton_name} (Slow texture processing)" + if proton_type == 'GE-Proton': + # Older GE (< 10) are known to be slower for heavy texture processing. + major_version = proton.get('major_version') + # Check if we have a valid major_version and it's < 10 + if major_version is not None and isinstance(major_version, int) and major_version < 10: + slow_warning = True + # Also check name pattern as fallback (e.g., "GE-Proton9-27") + elif 'GE-Proton9' in proton_name or 'GE-Proton8' in proton_name: + slow_warning = True + display_name = f"{proton_name} (GE)" + elif proton_type == 'Valve-Proton': + # Valve Proton 9.x is slower for BC7/BC6H workloads; newer Valve Proton is fine. + display_name = proton_name + if proton_name.startswith("Proton 9") or "9.0" in proton_name: + slow_warning = True + + # Add slow label if needed + if slow_warning: + display_name = f"{display_name} (Slow texture processing)" slow_protons.append((display_name, str(proton['path']))) + else: + # Everything else (fast) goes above the separator + fast_protons.append((display_name, str(proton['path']))) # Add fast Protons first for display_name, path in fast_protons: @@ -964,7 +974,7 @@ class SettingsDialog(QDialog): # Save component installation method preference if self.winetricks_radio.isChecked(): method = 'winetricks' - else: # protontricks_radio (default) + else: # protontricks_radio (alternative) method = 'system_protontricks' old_method = self.config_handler.get('component_installation_method', 'winetricks') diff --git a/jackify/tools/winetricks b/jackify/tools/winetricks index 9b7773a..1688406 100755 --- a/jackify/tools/winetricks +++ b/jackify/tools/winetricks @@ -6,7 +6,7 @@ # Name of this version of winetricks (YYYYMMDD) # (This doesn't change often, use the sha256sum of the file when reporting problems) -WINETRICKS_VERSION=20250102-next +WINETRICKS_VERSION=20260125-next # This is a UTF-8 file # You should see an o with two dots over it here [ö] @@ -4605,7 +4605,7 @@ winetricks_set_wineprefix() _W_wineserver_binary_arch="$(winetricks_get_file_arch "${WINE_BINDIR}/wineserver")" fi fi - if [ -z "${_W_wineserver_binary_arch}" ]; then + if [ -z "${W_OPT_UNATTENDED}" ] && [ -z "${_W_wineserver_binary_arch}" ]; then w_warn "Unknown file arch of ${WINESERVER_BIN}." fi @@ -4622,7 +4622,7 @@ winetricks_set_wineprefix() _W_wine_binary_arch="$(winetricks_get_file_arch "${WINE_BINDIR}/wine")" fi fi - if [ -z "${_W_wine_binary_arch}" ]; then + if [ -z "${W_OPT_UNATTENDED}" ] && [ -z "${_W_wine_binary_arch}" ]; then w_warn "Unknown file arch of ${WINE_BIN}." fi @@ -9893,6 +9893,56 @@ load_dotnetdesktop9() #---------------------------------------------------------------- +w_metadata dotnet10 dlls \ + title="MS .NET Runtime 10.0 LTS" \ + publisher="Microsoft" \ + year="2025" \ + media="download" \ + file1="dotnet-runtime-10.0.0-win-x86.exe" \ + installed_file1="${W_PROGRAMS_WIN}/dotnet/dotnet.exe" + +load_dotnet10() +{ + # Official version, see https://dotnet.microsoft.com/en-us/download/dotnet/10.0 + w_download https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.0/dotnet-runtime-10.0.0-win-x86.exe 90bc5667c2a35c030a2e964e7083fe8fbdbc461377d27b4f0d9bf7b400d7b982 + + w_try_cd "${W_CACHE}"/"${W_PACKAGE}" + w_try "${WINE}" "${file1}" ${W_OPT_UNATTENDED:+/quiet} + + if [ "${W_ARCH}" = "win64" ]; then + # Also install the 64-bit version + w_download https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.0/dotnet-runtime-10.0.0-win-x64.exe ca2dd25d477174767a55756d9ef92bbda0d3c7ef12cef284a542689b2ba52767 + w_try "${WINE}" "dotnet-runtime-10.0.0-win-x64.exe" ${W_OPT_UNATTENDED:+/quiet} + fi +} + +#---------------------------------------------------------------- + +w_metadata dotnetdesktop10 dlls \ + title="MS .NET Desktop Runtime 10.0 LTS" \ + publisher="Microsoft" \ + year="2025" \ + media="download" \ + file1="windowsdesktop-runtime-10.0.0-win-x86.exe" \ + installed_file1="${W_PROGRAMS_WIN}/dotnet/dotnet.exe" + +load_dotnetdesktop10() +{ + # Official version, see https://dotnet.microsoft.com/en-us/download/dotnet/10.0 + w_download https://builds.dotnet.microsoft.com/dotnet/WindowsDesktop/10.0.0/windowsdesktop-runtime-10.0.0-win-x86.exe ac38c81fef78c565d6bfbddf49ac5bcca354616176c0108c5f0e23333c3d093a + + w_try_cd "${W_CACHE}"/"${W_PACKAGE}" + w_try "${WINE}" "${file1}" ${W_OPT_UNATTENDED:+/quiet} + + if [ "${W_ARCH}" = "win64" ]; then + # Also install the 64-bit version + w_download https://builds.dotnet.microsoft.com/dotnet/WindowsDesktop/10.0.0/windowsdesktop-runtime-10.0.0-win-x64.exe fc0494eaf529b15f74b10d920784cc618ff0845bebfdfd5d85d585e921157a5c + w_try "${WINE}" "windowsdesktop-runtime-10.0.0-win-x64.exe" ${W_OPT_UNATTENDED:+/quiet} + fi +} + +#---------------------------------------------------------------- + w_metadata dotnet_verifier dlls \ title="MS .NET Verifier" \ publisher="Microsoft" \ @@ -15467,8 +15517,10 @@ w_metadata dxwnd apps \ load_dxwnd() { # 2022/10/02 v2_05_88_build.rar a80ad1246493b3b34fba2131494052423ac298a39592d4e06a685568b829922e - w_download https://versaweb.dl.sourceforge.net/project/dxwnd/Latest%20build/v2_05_88_build.rar a80ad1246493b3b34fba2131494052423ac298a39592d4e06a685568b829922e - w_try_7z "${W_PROGRAMS_X86_UNIX}"/dxwnd "${W_CACHE}"/"${W_PACKAGE}"/"${file1}" -aoa + w_download https://downloads.sourceforge.net/project/dxwnd/Latest%20build/v2_05_88_build.rar a80ad1246493b3b34fba2131494052423ac298a39592d4e06a685568b829922e + w_try_mkdir "${W_PROGRAMS_X86_UNIX}"/dxwnd + w_try_cd "${W_PROGRAMS_X86_UNIX}"/dxwnd + w_try_unrar "${W_CACHE}/${W_PACKAGE}/${file1}" } #----------------------------------------------------------------