v2.0.5: make standalone actually unlock via collectables.json + fix winhttp forwarding
Some checks are pending
Build DevourUnlocker / windows-cross (push) Waiting to run
Build DevourUnlocker / linux (push) Waiting to run
Build DevourUnlocker / standalone (push) Waiting to run

- 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
This commit is contained in:
MiTHRAL 2026-08-23 22:46:17 -04:00
parent f1a75f8f71
commit 6d2e47392d

View file

@ -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)