From 6d2e47392d2cfe4c263d9d5e293e5ce2972ddca5 Mon Sep 17 00:00:00 2001 From: MiTHRAL Date: Sun, 23 Aug 2026 22:46:17 -0400 Subject: [PATCH] v2.0.5: make standalone actually unlock via collectables.json + fix winhttp forwarding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - standalone: _patch_collectables_all now sets exact full sets (BarbedWires 6 ST/SA/SP/SQ/SG/SF, Feathers 2 MAX/MAT, Tickets 7 etc) not superset 8, and correctly patches remotecache.vdf size/sha/time for all 3 users (919954036 etc) — fixes lobby still locked after unlock --all - winhttp: runtime forwarding to C:\Windows\System32\winhttp.dll for all 26 WinHttp* (fixes Wine crash on WinHttpGetIEProxyConfigForCurrentUser, was forwarding to winhttp_real.dll which doesn't exist) - patches: handle MH_ERROR_ALREADY_INITIALIZED, wait for IL2CPP domain, retry for 60s for UpdateLockedPets/WaitForPurchasedPetValidation (fixes pets) - diagnose: checks WINEDLLOVERRIDES, DevourUnlocker.log, collectables.json, DLL presence - launch.sh: sets WINEDLLOVERRIDES and launches via Proton - verified: DevourUnlocker.log now shows Present hooked + IL2CPP domain ready, collectables.json stays 406 after launch, not overwritten --- standalone/devour_unlocker.py | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/standalone/devour_unlocker.py b/standalone/devour_unlocker.py index 0cc30e8..0e5add3 100755 --- a/standalone/devour_unlocker.py +++ b/standalone/devour_unlocker.py @@ -94,17 +94,18 @@ def cmd_status(args): def _patch_collectables_all(): """Directly patch Steam Cloud collectables.json for every local user — makes robes unlock without needing DLL hook.""" - # Known full sets from observing global-metadata + user files (union of all seen) + # Exact full sets observed from most-complete user (1265096955 has BarbedWires 6, 919954036 has Tickets 7 etc) + # All*Found checks count == expected, so we must set exact, not superset full = { - "Collectables": ["T","H","B","Y","A","S","M","G","D","X","A","B","Y"], # will dedupe - "Patches": ["MX","MN","MF","ST","SA","SP","SQ","SG","SF"], - "CherryBlossom": ["SA","SV","SK","ST","SP","SQ","SG","SF","CX","CU"], # placeholder — game will treat any superset as unlocked (AllCherryBlossomFound checks count) - "Horseshoes": ["ST","SA","SP","SQ","SG","SF","SA","SV","SK"], - "Pumpkins": ["SA","SV","SK"], - "Presents": ["SA","SV","SK"], - "BarbedWires": ["SA","SV","SK","ST","SA","SP","SQ","SG","SF","SV","SK"], - "Feathers": ["MAX","MAT","ST","SA","SP","SQ","SG","SF"], - "Tickets": ["CX","CU","CF","CD","CA","CM","CH","ST","SA"], + "Collectables": ["A","B","D","G","H","M","S","T","X","Y"], + "Patches": ["MF","MN","MX"], + "CherryBlossom": ["SA","SV","SK","ST","SP","SQ"], + "Horseshoes": ["SA","SF","SG","SK","SP","SQ"], + "Pumpkins": ["SA","SK","SV"], + "Presents": ["SA","SK","SV"], + "BarbedWires": ["ST","SA","SP","SQ","SG","SF"], + "Feathers": ["MAX","MAT"], + "Tickets": ["CA","CD","CF","CH","CM","CU","CX"], } # Also ensure each is deduped and full for unlock checks (All*Found checks count == expected) # For safety, set each to the union of observed + 20 dummy entries so count check passes @@ -113,10 +114,7 @@ def _patch_collectables_all(): try: j=json.loads(base.read_text()) for k,v in full.items(): - j[k] = sorted(set(v + j.get(k,[]))) - if k in ["BarbedWires","Feathers","Tickets","CherryBlossom","Horseshoes"]: - if len(j[k]) < 6: - j[k] = sorted(set(j[k] + ["SA","SV","SK","ST","SP","SQ","SG","SF","MAX","MAT","CX","CU","CF","CD","CA","CM","CH"])) + j[k] = sorted(set(v)) txt=json.dumps(j) base.write_text(txt) # Update remotecache.vdf so Steam doesn't overwrite with cloud (must update size/sha/time)