Blur LAN Party Patches + MacOS Native Port
  • C++ 48.8%
  • Python 21.5%
  • POV-Ray SDL 11%
  • Objective-C++ 8.4%
  • Go 2%
  • Other 8.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-20 16:55:48 +01:00
.forgejo/workflows ci: Developer ID signing + notarization of the Mac release (optional, secrets-gated) 2026-10-17 02:15:47 +01:00
deploy/ansible server image: Forgejo registry path host/owner/blur-online 2026-10-17 01:41:16 +01:00
docs Live timing: name mod icons by the game's mod names (Road_Sweeper, Shielded_Boosters, Last_Gasp, Shielding_Efficency, Vampiric_Wreck) 2026-10-20 16:55:48 +01:00
examples/live-timing Live timing: record a sector line crossed with unchanged race_ms, clock to whole seconds 2026-10-20 16:55:48 +01:00
patches/Screens Track and route names in LAN races; live timing shows circuit and route 2026-10-20 16:13:38 +01:00
server Revert "Server storage service (10/1,4,5): persist MultiplayerProfile.save so mod loadout, rank and XP survive relaunch (#12)" 2026-10-18 10:00:01 +01:00
src Race feed: lap timer reset ahead of lap counter, freeze timing after finish, all mod names 2026-10-20 14:25:53 +01:00
tests Race feed: lap timer reset ahead of lap counter, freeze timing after finish, all mod names 2026-10-20 14:25:53 +01:00
third_party/include Remove Unicorn: recompiled code is the only engine (ADR 0012); host tests run our recompiled test exes (blurhost_test) 2026-10-17 01:58:42 +01:00
tools Powerup hit events on the game-state websocket (#18) 2026-10-19 19:32:18 +01:00
.gitignore Merge feature/strip-unicorn 2026-10-17 01:59:19 +01:00
AGENTS.md Add jcodemunch-mcp to AGENTS.md 2026-10-17 10:07:45 +01:00
CMakeLists.txt Split dev and release builds (ADR 0015): BLUR_DEV gates debug env flags/switches, dev paths and all test/tool targets; tests moved out of src; tool paths made checkout-relative 2026-10-19 10:36:01 +01:00
GLOSSARY.md ADRs and Glossary 2026-10-19 22:52:36 +01:00
LICENSE MIT licence; README licence section with full text and Activision disclaimer 2026-10-17 02:57:36 +01:00
README.md Live timing: proper car names (ADR 0018) and a sample 5-player race to replay 2026-10-20 14:25:53 +01:00

Blur Native

A native Apple Silicon port of Blur (Bizarre Creations / Activision, 2010) for macOS. It runs without Wine, Rosetta or an emulator. The game's x86 code is statically recompiled to arm64 C++ (ADR 0006). Its Direct3D 9 calls go to Metal (ADR 0003), and its Windows API calls go to a native host layer (ADR 0004).

You need your own copy of Blur. This repository contains no game data and no files derived from it. The app installs the game from your disc, ISO or existing Windows install the first time it runs. Amax Emu and OpenTTD handle game files the same way.

The exceptions are the powerup and mod icons in examples/live-timing/icons, fan-wiki images from blur.fandom.com (ADR 0017), and the car display names in examples/live-timing/cars.js, also from the wiki (ADR 0018); they remain the property of their rights holders.

Install

Requirements: an Apple Silicon Mac running macOS 13 or later, and Blur for PC (disc, ISO, or an installed copy).

  1. Download Blur-Native-<version>-macos-arm64.dmg from the releases page and drag Blur Native to Applications.
  2. The app is ad-hoc signed, not notarised. The first time, right-click it and choose Open. On macOS 15 and later, use System Settings → Privacy & Security → Open Anyway instead.
  3. On first launch, point the installer at Blur.iso, the disc, or an installed Blur folder. It copies the game to ~/Library/Application Support/Blur Native/game and applies the 1.2 patch from the disc. Installing from a Windows folder still needs the disc or ISO for two runtime DLLs.

Saves go to ~/Library/Application Support/Blur Native/save.

Status

Works:

  • Every game mode starts and plays: career races, checkpoint, destruction and boss events, photo mode, and 2- and 4-player split screen. Each was tested for 30-60 s, not played through (modes-status).
  • LAN multiplayer.
  • Online play through our own server (below): accounts, lobbies, matchmaking and races between players.
  • Extra settings in the game's Options → Graphics menu: Show FPS, skip intro videos, frame-rate limit, anisotropic filtering, draw distance and bloom. The game's own Vsync and anti-aliasing (MSAA) settings work too.
  • Runs above 100 fps in races at 2560×1600 with maximum settings and MSAA on an M-series Mac.

Not done yet (see also known limitations):

  • Online stats, leaderboards, friends and mail return empty results. Online rank and XP aren't saved between sessions.
  • Players behind strict NATs may not be able to connect to each other: there's no relay server.
  • The new options rows are English only.
  • Windows players on Amax Emu can't play with players on our server.

Online

The game connects to wss://blur.entropylan.party/socket by default. Create an account on the game's own Online screen. The licence-key field is ignored, so any key works, including a blank one (ADR 0010).

To run your own server, see server/README.md: a Docker image, a compose example and an Ansible playbook. The protocol is documented in docs/online-server-spec.md.

Environment variables

Set these when launching Blur Native.app/Contents/MacOS/blurhost from a terminal.

Variable Effect
BLUR_ONLINE_URL online server (wss://host/socket), or off to disable online
BLUR_ONLINE_KEY key for that server
BLUR_OFFLINE=1 no network at all
BLUR_SHOW_FPS, BLUR_VSYNC, BLUR_FPS_LIMIT, BLUR_ANISO override the graphics options
BLUR_SKIP_INTRO 1 skips the boot logo and pre-level videos, 0 plays them; overrides Options > Graphics > Skip Intro Videos
BLUR_NO_AUDIO=1 no sound
BLUR_INSTALL_SRC install source (ISO or folder), skipping the file picker
BLUR_STATE_WS=<port> serve the game-state feed as JSON over a localhost-only websocket (format); off if unset
BLUR_DISCORD_CLIENT_ID Discord application id used for Rich Presence (Options > Graphics > Discord Rich Presence turns it off)
BLUR_PATCH_DIR directory of Lua script patches (ADR 0008)

Command-line flags: --version, --game-dir, --save-dir, --patch-dir. Debug and test flags exist only in dev builds: see docs/dev-flags.md.

Build from source

Needs Xcode Command Line Tools, CMake, Ninja, Python 3, Go (for the server tests), Ghidra 12.1.4 and JDK 21. The recompiled code is generated from your own game files, so there's no build without them.

tools/recomp/build/from_game.sh modules /path/to/Blur.iso work/mods    # extract + checksum the 5 game modules
tools/recomp/build/from_game.sh pcode work/mods work/pcode              # Ghidra analysis, ~8 min
tools/recomp/build/from_game.sh gen work/pcode                          # -> work/recomp/m3/gen
python3 tools/app/make_icon.py work/mods/Blur.exe work/app/Blur.icns   # optional app icon
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release [-DBLUR_ONLINE_KEY=<key>]
ninja -C build app                                                      # -> build/Blur Native.app
ctest --test-dir build

Set GHIDRA and JAVA_HOME if Ghidra or the JDK aren't in their default locations (see tools/recomp/ghidra/discover.sh). This is a dev build (BLUR_DEV=ON, the default): debug flags, tests and tools included. Release builds pass -DBLUR_DEV=OFF (ADR 0015). Without BLUR_ONLINE_KEY, online only works when the key is set at run time. tools/ci/build_mac.sh builds the release .dmg; CI and releases are covered in docs/ci.md.

Layout

Path Contents
src/cpu guest address space, PE loader, threads, SEH plumbing, recomp engine
src/host Win32 host layer: kernel32, user32, COM, audio, input, Winsock, Cocoa window, installer
src/d3d9metal Direct3D 9 on Metal, shader translator
src/common build-mode helpers shared by the above (dev_env.h)
tools/recomp Ghidra discovery scripts and the x86 → C++ emitter
tools dev tooling: game drivers (modes), trace, replay, track cards, CI scripts; not in release builds
tests unit and guest tests (tests/tests.cmake, dev builds only)
patches Lua patches for the game's menus (shipped in the app)
server blur-online, the online service (Go)
deploy/ansible server deployment
docs/decisions architecture decision records

Contributing

Gitflow with semver (ADR 0011): work on develop, feature/<name> branches merge back with --no-ff, and releases are vX.Y.Z tags on main. Read docs/decisions before changing architecture, tooling or workflow. Never commit game files or anything generated from them (ISO, binaries, P-code, generated code, the icon).

Credits

  • Blur is © Activision. Bizarre Creations developed it. Blur and Activision are trademarks of Activision Publishing, Inc. This project isn't affiliated with or endorsed by Activision.
  • The Amax Emu community, for keeping Blur online and for their reverse-engineering notes.
  • third_party/include/d3d9*.h come from the Wine project (LGPL 2.1).
  • Ghidra (NSA) does the code discovery at build time.

Licence

MIT, see LICENSE. Files under third_party/ keep their own licences (the Wine headers are LGPL 2.1).

Disclaimer

The MIT licence covers only the source code in this repository. Blur, its code, data, artwork, audio and other assets belong to Activision Publishing, Inc. and aren't covered by it. Blur and Activision are trademarks of Activision Publishing, Inc. This project isn't affiliated with or endorsed by Activision or Bizarre Creations. You need your own legitimate copy of Blur. Release builds contain code generated from the original game files; that generated code isn't covered by the MIT licence.

MIT License

Copyright (c) 2026 Jessica Smith

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.