From 507802f1f3170b8d70ad5cd4660818df73e202ad Mon Sep 17 00:00:00 2001 From: Pistonight Date: Sun, 20 Sep 2026 12:35:17 -0700 Subject: [PATCH] setup: add 1.6.0 nso --- tools/setup.py | 55 +++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/tools/setup.py b/tools/setup.py index 927c4f55..45e7deba 100755 --- a/tools/setup.py +++ b/tools/setup.py @@ -18,14 +18,16 @@ TARGET_PATH = setup.get_target_path() TARGET_ELF_PATH = setup.get_target_elf_path() -def _download_latest_to_v150_patch(dest: Path): - print(">>>> downloading patch...") - urllib.request.urlretrieve("https://s.botw.link/v150_downgrade/v190_to_v150.patch", dest) +def _download_downgrade_to_v150_patch(version: str, dest: Path): + print(f">>>> downloading patch for {version}...") + urllib.request.urlretrieve(f"https://s.botw.link/v150_downgrade/{version}_to_v150.patch", dest) def prepare_executable(original_nso: Optional[Path]): COMPRESSED_V150_HASH = "898dc199301f7c419be5144bb5cb27e2fc346e22b27345ba3fb40c0060c2baf8" UNCOMPRESSED_V150_HASH = "d9fa308d0ee7c0ab081c66d987523385e1afe06f66731bbfa32628438521c106" + COMPRESSED_V160_HASH = "15cfca7b89348956f85d945fade2e215a6af5991ed1071e181f97ca72f7ae20b" + UNCOMPRESSED_V160_HASH = "8a2fc8b1111a35a76fd2d53a8670599da4a7a9706a3d91215d30fd62149f00c1" COMPRESSED_V190_HASH = "f6f0b20bb1f2b67d164c24871cd473147eef1d285f12e7bd492e3126c6022e27" UNCOMPRESSED_V190_HASH = "6a30c162a2e6f885e0b1c0a6673a84795549a5ccdec1de8d3a741168ac4cba86" @@ -45,33 +47,40 @@ def prepare_executable(original_nso: Optional[Path]): nso_data = original_nso.read_bytes() nso_hash = hashlib.sha256(nso_data).hexdigest() - if nso_hash == UNCOMPRESSED_V150_HASH: - print(">>> found uncompressed 1.5.0 NSO") - TARGET_PATH.write_bytes(nso_data) + version_matrix = [ + # SHA256 Compressed? Version + (UNCOMPRESSED_V150_HASH, False, "1.5.0"), + ( COMPRESSED_V150_HASH, True, "1.5.0"), + (UNCOMPRESSED_V160_HASH, False, "1.6.0"), + ( COMPRESSED_V160_HASH, True, "1.6.0"), + (UNCOMPRESSED_V190_HASH, False, "1.9.0"), + ( COMPRESSED_V190_HASH, True, "1.9.0"), + ] - elif nso_hash == COMPRESSED_V150_HASH: - print(">>> found compressed 1.5.0 NSO") - setup._decompress_nso(original_nso, TARGET_PATH) + for (expected_hash, is_compressed, version_str) in version_matrix: + if nso_hash != expected_hash: + continue + print(f">>> found {"compressed" if is_compressed else "uncompressed"} {version_str} NSO") - elif nso_hash == UNCOMPRESSED_V190_HASH: - print(">>> found uncompressed 1.9.0 NSO") + if version_str == "1.5.0": + if is_compressed: + setup._decompress_nso(original_nso, TARGET_PATH) + else: + TARGET_PATH.write_bytes(nso_data) + break with tempfile.TemporaryDirectory() as tmpdir: patch_path = Path(tmpdir) / "patch" - _download_latest_to_v150_patch(patch_path) - setup._apply_xdelta3_patch(original_nso, patch_path, TARGET_PATH) + patch_version_str = "v" + version_str.replace(".","") + _download_downgrade_to_v150_patch(patch_version_str, patch_path) + if is_compressed: + decompressed_nso_path = Path(tmpdir) / f"{patch_version_str}.nso" + setup._decompress_nso(original_nso, decompressed_nso_path) + else: + decompressed_nso_path = original_nso - elif nso_hash == COMPRESSED_V190_HASH: - print(">>> found compressed 1.9.0 NSO") - - with tempfile.TemporaryDirectory() as tmpdir: - patch_path = Path(tmpdir) / "patch" - decompressed_nso_path = Path(tmpdir) / "v190.nso" - - setup._decompress_nso(original_nso, decompressed_nso_path) - _download_latest_to_v150_patch(patch_path) setup._apply_xdelta3_patch(decompressed_nso_path, patch_path, TARGET_PATH) - + break else: setup.fail(f"unknown executable: {nso_hash}")