Vahag Byurat  ·  All Projects
Compatibility · macOS · Wine · Apple Silicon

AoE2 HD Crossover

A documented offline compatibility setup for running a legally owned copy of Age of Empires II HD on Apple Silicon, without Windows or a paid compatibility layer.

Shell · Bash Wine CrossOver Rosetta 2 wined3d · Metal Offline single-player
AoE2 HD Crossover castle icon
The Problem
Enabling a 32-bit Windows game on Apple Silicon

Age of Empires II HD Edition is a 2013 Windows release with no native Apple Silicon client. This project documents the compatibility work needed to run that specific edition offline on an M1 Mac.

The challenge was threefold. First, the binary is a 32-bit x86 Windows executable; Apple Silicon speaks arm64. Second, the game depends on DirectX 9 and the Steam API; neither exists on macOS. Third, the Steam desktop client failed in the tested Wine environment because of its Chromium-based web helper and authentication dependencies.

Three translation layers. One working game. Zero Windows licenses.
AoE2 HD Crossover decorative header
Medieval architecture meets Apple Silicon engineering
Scope Note

This project predates my copy of AoE2: Definitive Edition and targets the HD Edition specifically. The stack has been tested offline only: single-player skirmish and campaign. Online multiplayer through Steam is outside its scope.


The Solution
Combining the compatibility layers

The setup combines open-source compatibility components with proprietary tools supplied by Apple and Valve. A CrossOver-derived Wine build provides Windows API support, including its 32-bit-on-64-bit path, while Rosetta 2 translates the x86_64 host-side Wine process for Apple Silicon.

AoK HD.exe x86 Windows binary · DirectX 9 · Steam DRM Game
Wine CrossOver · wined3d Windows API → macOS API · DirectX 9 → OpenGL → Metal API Bridge
Rosetta 2 x86_64 machine code → arm64 machine code · JIT, invisible CPU Bridge
Apple M1 · Metal GPU arm64 native execution · macOS 12+ · no Windows required Hardware
AoE2 HD Crossover translation stack diagram
The four-layer translation chain from Windows binary to Apple Silicon GPU

Key Discoveries
Failures and working configuration

Getting a working game required diagnosing errors across four independent translation boundaries. Most error messages were cryptic, most documentation was fragmented or Windows-specific. Three non-obvious problems stood between "install Wine" and "game running."

Discovery 1 · DXVK vs wined3d

DXVK (the modern DirectX-over-Vulkan bridge) is widely recommended for Wine gaming, but it causes a fatal crash on AoE2 HD. DXVK requests the geometryShader and shaderFloat64 Vulkan features; Metal on Apple Silicon does not expose either. The fix: force wined3d (the older OpenGL bridge) via WINEDLLOVERRIDES="d3d9=b;dxgi=b;d3d10core=b;d3d11=b", which routes rendering through OpenGL → Metal instead. The error message ("Failed to initialize draw system") gives no hint of the real cause.

Discovery 2 · Steam client and offline API replacement

The Steam desktop client crashes immediately under Wine because steamwebhelper depends on a bcryptprimitives.dll → chrome_elf.dll initialisation chain that Wine does not support. For an already licensed copy, SteamCMD supplied the game files and a local Steam API replacement allowed offline single-player testing without the desktop client. Multiplayer and online Steam features were not tested.

Discovery 3 · Working directory crash & launch flags

The game crashes with "FATAL: Storage Point #12 does not exist" when launched from the wrong working directory. Its relative paths for resources\_common\drs\ only resolve if Wine is launched with the game folder as the working directory. The fix: use wine start /d "C:\path\to\game" AoKHD.exe rather than a plain wine AoKHD.exe call.

# Launch command: every flag matters WINEPREFIX=~/.wine/aoe2 \ WINEDLLOVERRIDES="d3d9=b;dxgi=b;d3d10core=b;d3d11=b" \ WINED3D_CSMT=1 # multi-threaded GPU commands WINEDEBUG=-all # silence debug log (saves CPU) wine start /d "C:\Program Files (x86)\Steam\steamapps\common\age2hd\" AoKHD.exe

Components
Community tooling plus platform dependencies

Most compatibility components are open source, while Rosetta 2 and SteamCMD are proprietary platform tools. The project documents the tested versions, errors, and configuration so the setup can be reproduced against a legally owned copy.

Component Role Licence
wine-crossover Windows API translation layer LGPL-2.1
wined3d DirectX 9 → OpenGL → Metal renderer LGPL-2.1
Rosetta 2 x86_64 → arm64 JIT translation (Apple built-in) Apple proprietary · free
gbe_fork (Goldberg) Local Steam API replacement for offline testing MIT
SteamCMD Headless CLI game installer Valve · free
winetricks Wine prefix configuration helper LGPL-2.1
MoltenVK Vulkan → Metal (for other games in the prefix) Apache 2.0
View on GitHub Troubleshooting Log