Forza Horizon 1: ReImagined
> [!TIP]
> **The launcher is out: [latest release](https://github.com/Dyotson/ForzaHorizon1-ReImagined/releases/latest)**
> (Linux Flatpak for any distro, Windows installer; both experimental). It builds the game
> from your own copy, no build steps needed. [Announcement](https://github.com/Dyotson/ForzaHorizon1-ReImagined/discussions/21)
> · [Website](https://forza.dyotson.dev) · [Discord](https://discord.gg/DAHCbyrpFj)
The original 2012 Forza Horizon, running natively on PC and rebuilt around the modern
Horizon experience: a shared online open world, leaderboards and rivals, high frame rates.
**Forza Horizon 1: ReImagined** takes **Forza Horizon (Xbox 360)** and brings it closer to
what Horizon is today. The game runs natively on Linux and Windows, made by statically
recompiling the original PowerPC executable to C++ with the
[ReXGlue SDK](https://github.com/rexglue/rexglue-sdk) (the approach of
[RecompiledHaloReach](https://github.com/Dyotson/RecompiledHaloReach)), and on top of that
the project focuses on:
- **Better gameplay:** 60, 120 or 144 fps with the physics and race timing intact, native
controllers or keyboard and mouse, saves, Title Update 4 with Horizon Rally and the 1000
Club, and all 23 DLC packages.
- **Online free roam:** the **Horizon World** playlist drops every online player into one
shared Colorado, where you drive, meet and race together; the goal is an MMO-like world
where events fill up with players and the grid's free slots with AI
([`docs/online_vision.md`](docs/online_vision.md)).
- **Leaderboards and rivals:** times, ghosts and bounties shared between players, Monthly
Rivals, car clubs and the Message Center, all live again.
- **Your own servers:** Xbox LIVE and Turn 10's services are long gone, so the project
ships the **Forza Live** server (`server/`), self-hostable, with a public instance to
join.
This repository contains **no game code and no game data**. You need your own copy of the
game (the Games on Demand package or the disc 1 ISO of the base version, Title ID `4D5309C9`). The recompiled
C++ is generated from your copy on your machine; no binaries are published here.
## Contents
- [Screenshots](#screenshots)
- [What works](#what-works)
- [Known issues](#known-issues)
- [Requirements](#requirements)
- [Install with the launcher](#install-with-the-launcher)
- [Building (Linux)](#building-linux)
- [Windows](#windows)
- [Playing](#playing)
- [Playing online](#playing-online)
- [More documentation](#more-documentation)
- [Roadmap](#roadmap)
- [Community](#community)
- [Legal](#legal)
## Screenshots
Captured from the recompiled game running natively on Linux.
| | |
|---|---|
| 
Free roam | 
Circuit race against 7 AI drivers |
| 
Free roam, Colorado mountains | 
Horizon World online playlist: race lobby and races |
## What works
- **The whole game, single player:** the opening drive to the end of the festival has been
played through on ReImagined: free roam, festival events and races, showcase events,
audio and saves. Saves from Xenia Canary can be continued (`tools/play.sh --xenia`).
- **Title Update 4 (the default), Horizon Rally and the 1000 Club:** TU4 is built from your
own copy of the update (`tools/apply_title_update.py`, about 2 s). It adds the **Horizon
Rally** expansion (with a Xenia save that has reached it: the Rally Heats and whole
championships played to the end and saved; the co-driver is not heard yet) and the
**1000 Club** in the pause menu (signed in to the Forza Live server: its challenges
earn medals that are kept with the career, and the server has the club's leaderboard).
[`docs/dlc.md`](docs/dlc.md)
- **All 23 DLC packages:** every DLC car counts as installed, the Rally Expansion's 15 and
the 1000 Club's cars included (`tools/install_dlc.py`).
- **Keyboard and mouse or controller:** `mnk_mode = true` plays the menus, free roam, a
race from sign-up to the finish, the pause menu, the map and photo mode with the
keyboard (WASD, rebindable keys, a steering ramp and the mouse as the right stick).
Throttle and brake are on/off. Any connected controller drives player 1.
[`docs/playing.md`](docs/playing.md#keyboard-and-mouse)
- **60, 120 or 144 fps** (`frame_rate` in `forza.toml`, any rate up to 240), with physics, the
race clock and online play keeping their timing. Measured on a Ryzen 7 7800X3D with a
Radeon RX 9060 XT ([`docs/framerate.md`](docs/framerate.md), [`docs/perf.md`](docs/perf.md)):
| `frame_rate` | Free roam | Race, 7 AI cars (Clear Springs Circuit) |
|---|---|---|
| 60 | 59.9 fps | 59.6 fps |
| 120 | 115.2 fps | 75.7 fps |
| 144 | 111.5 fps | 70.1 fps |
The race is bound by the GPU emulation above 60; the game itself ran its main loop at
the target rate in every run. 0 to 100 km/h takes 2.4 s at every rate.
- **Online** (through the Forza Live server): sign-in as a Gold member, Find Game and races
with XP and credits, parties and custom games, a shared online free roam (the **Horizon
World** playlist: 8 players per world, JUMP IN while a world runs, the next player
placed with you when the host leaves), Playground Games modes (Infected, Cat & Mouse,
King), leaderboards and Rivals (times, ghosts and bounties shared between players), car
clubs and the club garage, and the Message Center (beaten-time alerts, gifts, club
requests, invitations, news). Details in [`docs/online_vision.md`](docs/online_vision.md)
and [`docs/title_services.md`](docs/title_services.md).
- **Title Update 4 online** (tested with two players on a local server): Horizon World (one
player placed into the other's world), a 30 s event lobby filled with CPU drivers (2
humans and 6 CPU in an 8-car race) with scores, XP and credits, head-to-head challenges,
the Rivals screen, the 1000 Club and host migration. Base-game and TU4 players are kept in
separate rooms, since the two versions cannot play together
([`docs/dlc.md`](docs/dlc.md#online-20)).
- **Your own server:** the Forza Live server (`server/`, Python 3 standard library only, or
Docker) is self-hostable ([`docs/hosting.md`](docs/hosting.md)), and there is a public
instance to join.
## Known issues
- The Auction House exists on the server only; its screens were removed from the game, and
the storefront answers empty.
- Throttle, brake and steering on the keyboard are all or nothing (the steering has a ramp),
and the game's menus have no pointer, so the mouse does nothing there
([`docs/playing.md`](docs/playing.md#keyboard-and-mouse)).
- Races with many AI cars are GPU-bound: 76 fps at a 120 fps target and 70 at 144 (60 holds).
- Windows builds are cross-compiled from Linux and have only been tried under Proton, not
on Windows itself; the launcher's Windows path and installer have never run on Windows.
- The launcher (v0.1.0) is experimental: tested end to end on Linux (Flatpak), not yet on Windows.
- Title Update 4 and base-game players can't play together (separate rooms), and a profile
that ran on TU4 is refused by the base build.
## Requirements
- Linux x86-64 or Windows 10/11 64-bit, with a Vulkan 1.3 GPU, about 4 GB of free RAM (measured:
the game peaks at 1.1 GB from the main menu through free roam; the build peaks near 2 GB at
`-j4` and 3.2 GB at `-j8`, and is not run together with the game) and about 15 GB of disk (7.6 GB of extracted game
files, the SDK 1.6 GB, the build tree about 1 GB, a downloaded compiler 1.1 GB). Windows:
see below.
- Your own copy of Forza Horizon, base version: the Games on Demand package
(`4D5309C9/00007000/` plus `.data/`), or the retail **disc 1 as an ISO** (or a
folder with its files; see [docs/disc.md](docs/disc.md)). Optional but recommended: the Title Update 4 package
(`4D5309C9/000B0000/`, update 4000D145) for Horizon Rally and the 1000 Club.
- For the manual build: Clang (tested with 23), CMake >= 3.25, Ninja, Python 3, Git,
OpenSSL (for `tools/xex_image.py` only). The launcher downloads what is missing.
- [ReXGlue SDK](https://github.com/rexglue/rexglue-sdk) 0.10.0.24 nightly
(`nightly-20261002-bd833a2a`).
## Install with the launcher
This is the way to install. The launcher builds the game on
your machine from your own files; nothing of the game is ever downloaded or shipped.
1. Get the launcher from the [latest release](https://github.com/Dyotson/ForzaHorizon1-ReImagined/releases/latest):
on Linux a **Flatpak** (works on Bazzite, SteamOS, Chimera, Ubuntu, Fedora and Arch; a
`.tar.gz` is the alternative), on Windows an **installer**. The Flatpak is installed with
`flatpak install --user ForzaHorizon1-ReImagined-x86_64.flatpak` (it pulls the freedesktop
SDK runtime from Flathub by itself); install the compiler extension once with
`flatpak install flathub org.freedesktop.Sdk.Extension.llvm22//26.08` (0.5 GB; without it the
launcher downloads a 2 GB compiler instead and tells you so).
2. In **Setup**, point it at your Games on Demand package or your disc 1 ISO (it is
extracted and checked first), and optionally at your Title Update 4 package and DLC folder.
3. **Build**: it generates the game from your copy and compiles it, downloading a compiler
and the SDK when you have none. Measured on 8 cores at `-j4`: a full build with Title
Update 4 takes about 3.6 to 4.6 minutes, peaks near 2 GB of RAM and leaves about 15 GB on
disk. It can be cancelled and resumed, and is repeated only when something changed.
4. **Play**. Every setting of `forza.toml` has a page in **Settings** (frame rate, display,
keyboard and mouse bindings, online server, profile, Xenia save import).
Details: [`docs/launcher.md`](docs/launcher.md). The steps below are the same build by hand.
## Building (Linux)
```sh
# 1. The ReXGlue SDK nightly, unpacked to ~/rexglue-sdk-nightly/0.10.0.24/linux-amd64
# 2. The game files, extracted from your Games on Demand package (only read)
python3 tools/xcontent_extract.py /path/to/4D5309C9/00007000/ extract extracted/game
# 3. The patched Xenos GPU plugin and codegen tool (clones the SDK to ~/rexglue-sdk-src-forza,
# applies patches/rexglue-sdk/ and installs an overlay at ~/rexglue-sdk-patched-forza;
# the stock rexglue's dot products overflow to infinity, Xenon's to QNaN, and free roam
# crashes without it)
tools/build_rexglue_sdk.sh
# 4. Configure (the first configure runs codegen with the overlay's rexglue, about a
# minute) and build
cmake -S forza-recomp -B forza-recomp/out/build/linux -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_PREFIX_PATH=$HOME/rexglue-sdk-nightly/0.10.0.24/linux-amd64
ninja -C forza-recomp/out/build/linux
```
**Title Update 4** (needed for Horizon Rally and the 1000 Club; recommended): apply the
update to your `default.xex` (about 2 s; it writes the patched executable, the two facade
DLLs and the update's `media.zip` to `extracted/tu4/`) and build the TU4 version next to the
base one. It has its own hints (`hints_tu4/`) and generated code (`generated_tu4/`); a full
build is about 4 minutes at `-j4` on 8 cores. `git checkout forza-recomp/generated/rexglue.cmake`
afterwards if codegen shows it modified.
```sh
python3 tools/apply_title_update.py extracted/game/default.xex /path/to/ extracted/tu4/default.xex
cmake -S forza-recomp -B forza-recomp/out/build/linux-tu4 -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_PREFIX_PATH=$HOME/rexglue-sdk-nightly/0.10.0.24/linux-amd64 \
-DFORZA_TITLE_UPDATE=4
ninja -C forza-recomp/out/build/linux-tu4
```
The launcher does all of this from the two packages ([above](#install-with-the-launcher)).
## Windows
The Windows version is cross-compiled from Linux with clang/clang-cl and lld-link, after the
Linux build above (its codegen output in `forza-recomp/generated/` is reused, and step 3
checks out the SDK source). `tools/build_windows.sh` builds the ReXGlue SDK for Windows
from `~/rexglue-sdk-src-forza` with this project's patches and the Vulkan backend into
`~/rexglue-sdk-patched-forza/0.10.0.24/win-amd64`, then the game, and packages it in
`forza-recomp/out/dist/windows` (`--sdk-only` and `--game-only` split the long build):
```sh
brew install llvm lld # clang, clang-cl, lld-link
xwin --accept-license splat --output ~/.local/opt/xwin/sdk # MSVC CRT + Windows SDK (Microsoft's license)
tools/build_windows.sh
tools/package_linux.sh # the Linux package, forza-recomp/out/dist/linux
```
On Windows, extract the package, install the Microsoft Visual C++ 2015-2022 x64
redistributable, extract your game files with `python xcontent_extract.py` and run
`play.bat C:\path\to\extracted\game` (`--offline` for no Xbox LIVE; it starts a local
Forza Live server when Python is installed, or uses `FORZA_SERVER` / `live_server` in
`forza.toml`). Saves, the online identity and the log go to `Documents\forza`.
## Playing
```sh
tools/play.sh # play with your own profile (~/.local/share/forza)
tools/play.sh --xenia # continue your Xenia Canary save (a copy)
tools/play.sh --offline # without Xbox LIVE
tools/play.sh --base # the base game instead of Title Update 4
```
`play.sh` runs the Title Update 4 build (`forza-recomp/out/build/linux-tu4`) when it exists
and the base build otherwise. TU4 converts a profile save when it loads it
(`ForzaProfile/VersionFlags`, a `NeedsAA` file), and the base build then refuses that
profile ("MISSING TITLE UPDATE"): `--base` is for profiles that never ran on TU4, and a copy
of the profile folder lets you go back.
Install DLC once with `python3 tools/install_dlc.py /path/to/4D5309C9/00000002` (STFS packages, or a Xenia `content` folder with the DLC extracted; the launcher's DLC step takes both). Controllers,
saves, the Xenia save import and more are in [`docs/playing.md`](docs/playing.md).
### Playing online
`play.sh` starts a local Forza Live server for the session. To play on the public server,
set in `forza.toml` next to the binary:
```toml
live_server = "forza-reimagined.playit.plus:56677"
```
(or start with `FORZA_SERVER=forza-reimagined.playit.plus:56677`). You forward no ports. To run your
own server, see [`docs/hosting.md`](docs/hosting.md).
## More documentation
[`docs/PROJECT.md`](docs/PROJECT.md) (status log, findings, debugging recipes),
[`docs/playing.md`](docs/playing.md), [`docs/hosting.md`](docs/hosting.md),
[`docs/perf.md`](docs/perf.md), [`docs/framerate.md`](docs/framerate.md),
and the [issue tracker](https://github.com/Dyotson/ForzaHorizon1-ReImagined/issues)
(known bugs and planned work).
## Roadmap
Where the project is heading, on the [ReImagined Roadmap](https://github.com/users/Dyotson/projects/3) board:
1. **Stable everywhere**: the game runs well on any PC, GPU and the Steam Deck.
2. **Multiplayer as cool as possible**: Horizon World, challenges, ranked, clubs, sharing tunes and liveries.
3. **Modding, and more multiplayer**: a mod loader, car and tuning mods, custom events, mod sync online.
4. **Decompilation and custom game**: readable C++ game systems, new modes, decoupled physics, better AI.
Every card is an issue: comment there to discuss an item or help with it.
## Community
Questions, help with setup and online sessions: [Discord](https://discord.gg/DAHCbyrpFj).
Bugs and feature requests: [issues](https://github.com/Dyotson/ForzaHorizon1-ReImagined/issues)
(the bug report template asks for your OS, GPU and log).
## Legal
Forza Horizon is © Microsoft. This project is not affiliated with, endorsed by or
sponsored by Microsoft, Playground Games or Turn 10 Studios. It contains no game code or
assets; you must own the game. See [`LICENSE`](LICENSE).