Everything learned getting PROTOTYPE 2 (Steam AppID 115320) to run in a CrossOver bottle on an Apple Silicon Mac, after months of "crashes a second after launch". Written so the next person can one-shot it.
Symptoms this guide solves
- Prototype 2 crashes ~1–2 seconds after launch, before the intro video or main menu
EXCEPTION_ACCESS_VIOLATIONinMSVCR90.dll+0xC590(this is a red herring — see §2)prototype_fix.asi(PrototypeFix / Prototype2Fix by emoose) "breaks the game"- Game renders in a corner / quarter of the screen with CrossOver High Resolution Mode on
- You are considering downgrading to the 2012 build so the old mod works — don't (§9)
- Do NOT downgrade to the 2012 build. The pre-2025 binaries hit a deterministic engine assert under CrossOver no matter what you pair them with (verified against both old and new content, and mod versions 1.5.1 and 1.8b). The 2012 build is environmentally broken under CrossOver/DXVK/MoltenVK. This invalidates the popular "downgrade so the old mod works" strategy entirely.
- Use the current (2025-09-29) game build. It launches fine on a 16-core Apple Silicon Mac without any thread-count fix — Activision's 2025 update apparently absorbed the classic crash fixes.
- Fix the Bink chain. This is the actual cause of most "crashes before the menu":
the ASI-loader
binkw32.dllforwards all Bink video calls tobinkw32Hooked.dll; if that file is missing (e.g. renamed away while "disabling the mod"), every launch dies ~1–2 s in with a garbage-pointer access violation. See §4. - For the quarter-screen problem under High Resolution Mode, use PrototypeFix 1.8b with only the resolution features enabled (§7 has the exact ini). All crash-fix patches off — the 2025 exe doesn't need them and the mod formally targets the 2012 exe.
- Steam settings: game Properties → Updates → "Only update when I launch", and never run "Verify integrity of game files" if you have any modified/renamed files in the game directory (it restores the depot state and undoes everything below).
| Item | Value |
|---|---|
| Game | PROTOTYPE 2, Steam AppID 115320 |
| Depots | 115321 Binaries · 115322 Content (~8.8 GB) · 115323 English (+115324… other languages) |
| Machine | Apple Silicon Mac, 16 cores, Retina display, macOS 26 (Darwin 25) |
| Wine/CrossOver bottle | any name — the game runs from a Steam library on a mapped Wine drive |
| Graphics | DXVK on MoltenVK (Vulkan); prototype2_d3d9.log shows some DxvkGraphicsPipeline: Failed to compile pipeline errors that are non-fatal |
Throughout, $GAME_DIR means …/steamapps/common/Prototype 2 (the macOS-side path, resolved
through the bottle's dosdevices/ symlinks).
Parse: e_lfanew at file offset 0x3C → COFF TimeDateStamp at pe+8.
| File | 2012 build | 2025 build |
|---|---|---|
prototype2.exe |
1334251894 (2012-04-12) | 1756404256 (2025-08-28) |
prototype2engine.dll |
1334252072 | (2025, 15,517,184 bytes) |
import struct
def pe_timestamp(path):
data = open(path, 'rb').read(0x200)
pe = struct.unpack_from('<I', data, 0x3C)[0]
return struct.unpack_from('<I', data, pe + 8)[0]https://steamdb.info/patchnotes/19788008/ (blocks curl/scripted fetches with 403 — open it in a real browser). It lists every changed file and both manifest IDs per depot:
| Depot | pre-2025 (old) | 2025-09-29 (new) |
|---|---|---|
| 115321 | 463092240727598525 | 463566073465694220 |
| 115322 | 4352732130145350830 | 9048180919412686294 |
| 115323 | 4481432701652791377 | 7756741017743835184 |
Depot 115322: art.rcf +223.40 MiB, boot.rcf −4 KiB, cells.rcf −4 KiB,
01audio.rcf and scripts.rcf modified, loose scripts/init.lua removed,
audio/audio.p3d added, plus a pile of irrelevant redist/ churn.
Depot 115323: cementfiles.p3d +41 B, skuinfo.p3d +21 B, audio/audio.p3d removed.
⇒ Old exe + new content = engine assert. Binaries and content must always be treated as a matched set.
| Symptom | Real cause |
|---|---|
| Crashes ~1–2 s after launch, before any video, for months | Missing binkw32Hooked.dll (§4) — access violation in MSVCR90 with a garbage pointer, scattered addresses across dumps |
| PrototypeFix 1.5.1 + 2025 exe → crash | Mod pattern-patches built for the 2012 exe; mod log shows EXE timestamp … doesn't match |
| 2012 exe (+ any mod, + either content set) → deterministic crash | Engine assert (int3 at prototype2engine.dll+0x56868F) right after requesting art\hud\fe_permanent.p3d.rz — the first read out of an RCF archive. Preceded by two setjmp3 calls (chunk-parser error recovery), followed by a collateral AV at MSVCR90.dll+0xC590 (inside the CRT's float-formatting internals, near $I10_OUTPUT) while the crash reporter formats the message. Environmental — the 2012 engine simply doesn't survive a CrossOver/MoltenVK bottle |
| 2025 build, Bink chain fixed, no mod | Game runs — but only a quarter of the screen is used under High Resolution Mode (§7) |
Key diagnostic insight: the AV at MSVCR90+0xC590 looks like the crash for hours, but it is
only the crash reporter dying while printing the real error. Always look for an earlier
EXCEPTION_BREAKPOINT (0x80000003) in the Wine/CrossOver log — that is the game's own assert.
- v1.5.1 / v1.6 (Jan 2024): target the 2012 exe only. The Prototype 2 Nexus page
(
nexusmods.com/prototype2/mods/42) never got anything newer than 1.6. - v1.7 / 1.8 / 1.8b (Sep 30 – Oct 1, 2025): published only on the Prototype 1 page
(
nexusmods.com/prototype/mods/52), but the singleprototype_fix.asiauto-detects the game (Module::init: Detected Prototype 2). - Crucial nuance: 1.8b's "2025 update support" is for Prototype 1's new exe (port 27015
launch-freeze bat, decal fix). For Prototype 2 the binary still contains only the 2012
timestamp constant
1334251894; the 2025 P2 timestamp1756404256is absent. So on the 2025 P2 exe, 1.8b logs a timestamp warning and pattern-matches opportunistically. That is fine for the resolution patches — just verify "applied successfully" in the log. - The 1.8b archive contains Prototype 1-only files — do not install these into P2:
ApplyGameLaunchFix.bat,xdelta3-*.exe,prototypef.vcdiff,prototypeenginef.dll, and itsbinkw32Hooked.dll(that one is P1's Bink, 171,008 bytes, PE 2008 — wrong game). Take onlyprototype_fix.asi(and optionally the ini as a reference). - Ini keys added since 1.5.1 default to ON when absent:
BillboardAdFix=true,PreferLooseFiles=true,MaxSampleRate=384000(P1-only). Set them explicitly. - 1.8b with
VerboseLogginglogs everyFileOpenRequest::DoRequest— extremely useful for pinpointing where a startup crash happens.
The ASI loader is installed as binkw32.dll (Ultimate ASI Loader style, ~2.2 MB,
PE timestamp 2023-12-12). It loads *.asi plugins and forwards the real Bink exports to
binkw32Hooked.dll — which must be the game's original Bink (226,304 bytes,
PE 2011-12-14).
prototype2.exe → binkw32.dll (2.2 MB ASI loader) → binkw32Hooked.dll (original 226 KB Bink)
If binkw32Hooked.dll is missing — a classic case is renaming it to binkw32Hooked.dll.bak
while "disabling the mod" and later restoring only the .asi — the game crashes on the first
Bink call on every launch, with or without the asi. This masquerades as "the mod crashes the
game" and produces several unrelated-looking crash addresses.
- To disable the mod safely: rename only
prototype_fix.asi. Never touch the Bink chain. - To remove the mod entirely: also replace
binkw32.dllwith the original 226 KB Bink and deletebinkw32Hooked.dll.
The downgrade turned out to be a dead end for the binaries, but the technique is worth keeping for any Steam game:
-
Old manifest IDs: from the public SteamDB patchnotes page (§1). The per-depot manifest history page requires login; the patchnotes page does not.
-
DepotDownloader — macOS arm64 zip,
chmod +x,xattr -d com.apple.quarantine. -
Don't download 8.8 GB — use
-filelistwith only the files the patchnotes flagged as changed (regex syntax):regex:^art\.rcf$ regex:^boot\.rcf$ ..../DepotDownloader -app 115320 -depot 115322 -manifest 4352732130145350830 \ -qr -remember-password -filelist files_115322.txt -dir p2_old_115322→ ~2.6 GB instead of 8.8 GB.
-
Logging in from a non-TTY context (script, CI, coding agent): password prompts don't work without a TTY (empty read → SteamKit
LogOn requires a username and passwordcrash). Use-qr. Note the ASCII QR block printed to the terminal rotates every ~30 s and the session times out after a few minutes. If you can't scan the terminal directly, parse the ASCII QR (██= one module) into a PNG with PIL and decode it withzxing-cpp— it yields anhttps://s.team/q/1/…URL you can simply open on a phone that has the Steam app installed. -
Steam keeps nothing useful in
depotcache/if the game was installed after the update.
-
Bottles are not always in the default location. Resolve the real path via
mdfindor by reading thedosdevices/symlinks. For CLI wine calls against a custom bottle directory:CX_BOTTLE_PATH="$HOME/<your-bottles-dir>" CX_BOTTLE="<bottle name>" \ "/Applications/CrossOver.app/Contents/SharedSupport/CrossOver/bin/wine" cmd /c ...
-
WINE_CPU_TOPOLOGYis NOT supported by CrossOver's Wine (tested:%NUMBER_OF_PROCESSORS%stayed at 16). You cannot hide cores the way you would under Proton. It didn't matter in the end — the 2025 build copes with 16 cores. -
CEG stamping: Prototype 2 (2012 build) is a Steam CEG title. At launch Steam rewrites
prototype2engine.dll(a per-user stamped copy, ~5.7 KB larger than the depot file) and leaves a.oldbeside it. Don't panic when hashes/sizes don't match the depot — that's normal. The 2025 build removed CEG (SteamDB: flagsCustomExecutable → None). -
Reading Wine/CrossOver logs: launch Steam with logging enabled. Game debug output (
OutputDebugString) shows up aswarn:seh:dispatch_exception "…"lines; exceptions astrace:seh:dispatch_exception code=…:Code Meaning 0x80000003assert / breakpoint — the interesting one 0xc0000005access violation 0xe06d7363C++ exception (often benign) 0x40010006OutputDebugString -
The game's own crash handler writes
prototype2_1_crash_*.mdmpinto the game directory (2025 engine only, apparently). The minidump exception + module list can be parsed with ~40 lines of Python (streams: 6 = Exception, 4 = ModuleList;MINIDUMP_MODULEis 108 bytes, name RVA at+20). -
macOS zsh note:
echo ===fails in zsh (=wordexpansion) — useprintfin scripts.
With CrossOver's High Resolution Mode ON, the Wine desktop is the full Retina pixel grid (e.g. 3456×2234). The game renders 1920×1080, so you see it in a corner / quarter of the screen. Keeping High Res Mode ON requires making the game render at the native resolution — and the in-game resolution list won't offer it.
Solution: PrototypeFix 1.8b with resolution features only, everything else off.
See prototype_fix.ini in this repo; the meaningful lines:
[CrashFixes]
CPUThreadCountFix = false ; 2025 build handles 16 cores natively
BillboardAdFix = false ; absent key would default to TRUE — set it explicitly!
[Performance]
DInputKeyboardMouseOnly = false
RemoveTickRateLimit = false
FixButtonTapTickRate = false
FPSLimitOverride = 0
VRAMAmount = 0
[Graphics]
FOVOffset = 0.0
ShadowMapResolution = 0
CustomResolution[0].Width = -1 ; -1 = use desktop resolution
CustomResolution[0].Height = -1
CustomResolution[1].Width = -1 ; P2: overrides the 800x600 list entry
CustomResolution[1].Height = -1
WindowResolution.Width = -1
WindowResolution.Height = -1
BorderlessWindow = true
[Audio]
MaxSampleRate = 0 ; P1-only feature, off
[Misc]
PreferLooseFiles = false ; 1.8 feature, defaults TRUE if absent
[PrototypeFix]
VerboseLogging = trueRationale: the fewer pattern-patches applied to an exe the mod doesn't formally support, the
smaller the chance of a false-positive patch. In prototype_fix.log, ignore the
EXE timestamp … doesn't match target warning; check that the resolution tweaks report
"applied successfully". If a resolution pattern is reported "not found" on the 2025 exe, the
mod can't help — fall back to the highest in-game resolution, or turn High Resolution Mode off
for the bottle.
In $GAME_DIR:
| File | Version |
|---|---|
prototype2.exe |
2025 build (PE timestamp 1756404256) |
prototype2engine.dll |
2025 build |
all .rcf, cementfiles.p3d, skuinfo.p3d, audio/audio.p3d |
2025 build (matched set) |
binkw32.dll |
ASI loader, 2,248,704 bytes |
binkw32Hooked.dll |
original P2 Bink, 226,304 bytes, PE 2011-12-14 |
prototype_fix.asi |
1.8b (PE timestamp 1759297407) |
prototype_fix.ini |
resolution-only config (§7) |
Steam: Only update when I launch; never Verify integrity of game files. CrossOver: High Resolution Mode ON.
Worth keeping around while you experiment: a _backup_2025build/ folder inside the game
directory with the untouched 2025 binaries, and the downloaded old-manifest depots in a scratch
directory outside the bottle. Both are deletable once you're happy (several GB).
- Downgrading binaries only — the old engine asserts on 2025
.rcfdata. - Downgrading binaries and full content to the matched 2012 set — same assert anyway. The 2012 build is broken in this environment, period. (This was the big surprise, and it contradicts most forum advice.)
- Suspecting the mod's hooks — they applied cleanly every time. The mod was never the crasher, apart from the genuine 1.5.1-patterns-on-2025-exe incompatibility.
- Suspecting content/loose-file case sensitivity, or an RCF hash mismatch
(
rdx=0x564E369Fis not an RCF hash), orMaxSampleRate(P1-only), orPreferLooseFiles(1.5.1 lacks it and crashed identically). WINE_CPU_TOPOLOGYunder CrossOver — unsupported.- Statically reversing the assert message — it's built at runtime via virtual calls, the registers in the Wine log don't reach it, and the 2012 engine writes no minidump. Pure time sink.
- Confirm that 1.8b's resolution patches apply on the 2025 exe and the game fills a native Retina
desktop. If not: highest in-game resolution, or High Resolution Mode off, or wait for a
PrototypeFix build that formally targets the 2025 P2 exe (watch
nexusmods.com/prototype2/mods/42). - If gameplay-level issues appear later (billboard crash, HID stalls, tick-rate quirks), re-enable
the corresponding fix one at a time and watch
prototype_fix.logfor "pattern not found" vs "applied successfully".