Skip to content

yigit353/prototype2-crossover-macos

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 

Repository files navigation

Prototype 2 on macOS (CrossOver / Wine) — Field Guide

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_VIOLATION in MSVCR90.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)

TL;DR — the one-shot solution

  1. 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.
  2. 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.
  3. Fix the Bink chain. This is the actual cause of most "crashes before the menu": the ASI-loader binkw32.dll forwards all Bink video calls to binkw32Hooked.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.
  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.
  5. 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).

1. Environment & constants

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

PE header timestamps (the reliable build fingerprint)

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]

Manifest IDs (from the public SteamDB patchnotes page — no login needed)

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

What the 2025 update actually changed (game data, not just binaries)

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.


2. Timeline of failures (what each crash actually was)

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.


3. The mod situation (PrototypeFix by emoose)

  • 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 single prototype_fix.asi auto-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 timestamp 1756404256 is 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 its binkw32Hooked.dll (that one is P1's Bink, 171,008 bytes, PE 2008 — wrong game). Take only prototype_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 VerboseLogging logs every FileOpenRequest::DoRequest — extremely useful for pinpointing where a startup crash happens.

4. The Bink chain (root cause #1 — check this first)

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.dll with the original 226 KB Bink and delete binkw32Hooked.dll.

5. Getting old depot files (if you ever need them)

The downgrade turned out to be a dead end for the binaries, but the technique is worth keeping for any Steam game:

  1. Old manifest IDs: from the public SteamDB patchnotes page (§1). The per-depot manifest history page requires login; the patchnotes page does not.

  2. DepotDownloader — macOS arm64 zip, chmod +x, xattr -d com.apple.quarantine.

  3. Don't download 8.8 GB — use -filelist with 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.

  4. 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 password crash). 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 with zxing-cpp — it yields an https://s.team/q/1/… URL you can simply open on a phone that has the Steam app installed.

  5. Steam keeps nothing useful in depotcache/ if the game was installed after the update.


6. CrossOver / Wine gotchas

  • Bottles are not always in the default location. Resolve the real path via mdfind or by reading the dosdevices/ 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_TOPOLOGY is 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 .old beside it. Don't panic when hashes/sizes don't match the depot — that's normal. The 2025 build removed CEG (SteamDB: flags CustomExecutable → None).

  • Reading Wine/CrossOver logs: launch Steam with logging enabled. Game debug output (OutputDebugString) shows up as warn:seh:dispatch_exception "…" lines; exceptions as trace:seh:dispatch_exception code=…:

    Code Meaning
    0x80000003 assert / breakpoint — the interesting one
    0xc0000005 access violation
    0xe06d7363 C++ exception (often benign)
    0x40010006 OutputDebugString
  • The game's own crash handler writes prototype2_1_crash_*.mdmp into 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_MODULE is 108 bytes, name RVA at +20).

  • macOS zsh note: echo === fails in zsh (=word expansion) — use printf in scripts.


7. High Resolution Mode & the quarter-screen problem

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 = true

Rationale: 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.


8. Final known-good configuration

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


9. Dead ends (don't repeat these)

  1. Downgrading binaries only — the old engine asserts on 2025 .rcf data.
  2. Downgrading binaries and full content to the matched 2012 setsame assert anyway. The 2012 build is broken in this environment, period. (This was the big surprise, and it contradicts most forum advice.)
  3. 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.
  4. Suspecting content/loose-file case sensitivity, or an RCF hash mismatch (rdx=0x564E369F is not an RCF hash), or MaxSampleRate (P1-only), or PreferLooseFiles (1.5.1 lacks it and crashed identically).
  5. WINE_CPU_TOPOLOGY under CrossOver — unsupported.
  6. 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.

10. Open items

  • 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.log for "pattern not found" vs "applied successfully".

Credits & license

  • PrototypeFix / Prototype2Fix by emoose — not affiliated with this repo.
  • DepotDownloader by SteamRE.
  • This documentation: MIT. No game files, binaries, or copyrighted assets are distributed here — only notes, offsets, and configuration.

About

Field guide: running PROTOTYPE 2 (Steam 115320) on macOS via CrossOver/Wine — the binkw32Hooked.dll crash, why downgrading to the 2012 build fails, and a resolution-only PrototypeFix config

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors