This project is a rewrite of Wipeout XL / 2097 inspired by wipeout-rewrite. It is based off a decompilation of the PS1 version of Wipeout XL & 2097 and another partial decompilation of the PC release.
The goal of this project is to keep the original behavior as much as possible while also upgrading the game with more capabilities. Here is a rough list of the changes in this game compared with the original PS1 version:
- Higher resolutions (HD Mod support, accurate rendering w/out PGXP)
- Uncapped framerates (physics & game logic still limited to original framerate)
- Widescreen support
- Split-screen for one on one mode
- Loading in Wipeout and Wipeout 64 tracks (this won't be perfect but it works pretty well right now)
- Higher render distance (configurable if you prefer older style)
- Custom music
- Touch controls for mobile and web (WIP)
- Controller vibration: the pads shake at a hit, as the picture does, and growl with the launch thrust, so the throttle can be judged on the digital face buttons. The start's boost wants the throttle held at one precise amount (5/8 of the ship's top thrust to 6/8, and nothing above it, where the start stalls), which the original gets from an analogue throttle - the neGcon's button I, or the analogue stick - and a digital button cannot show: the growl is that feedback. Its strength is a slider in the debug console
- Autosave & converting save files
- Minor culling & depth buffer fixes
If you would like to change any of the settings or files for the game press the ` or ~ key on your keyboard to toggle the debug UI. It has multiple tabs with many options to configure.
To play this game, you will need a copy of Wipeout XL or Wipeout 2097. Store it somewhere on your computer.
If you are on Windows (x64 or Arm) or macOS (Apple Silicon or Intel, macOS 11 or later), you can download the latest build from the Releases and select your .cue file or archive of your PS1 rom when the app or exe prompts you for your game files. Users on all other platforms will have to build the launcher themselves.
The PlayStation game (USA, SCUS-94351) running natively on macOS, Linux and Windows, and in a web browser. One code base builds all four (the same game, the same platform layer over SDL3 and OpenGL; the web uses WebGL 2). The game is the console's own code: the decompiled C of the retail executable, compiled for the PC, with the PlayStation libraries replaced by the platform layer (OpenGL drawing at any resolution, the sound chip, the CD drive, pads and memory cards). It plays like the console, frame for frame: see docs/LOCKSTEP.md for the comparison with recordings of the real game.
- Your copy of the PlayStation disc (Wipeout XL USA, or WipEout 2097 Europe):
a
.cuewith its.binor WAV tracks, a.binwithout its.cue, a.chd, or an archive of an image (.7z,.zip,.rar,.tar,.gzand the like). Older copies with the data track packed with ECM (.bin.ecm) and the music tracks in Monkey's Audio (.ape) work too, in an archive or as they are (choose the.ecm). A version 5 CD CHD is converted once to a raw bin/cue pair in the user's data folder, like ECM. CD ZLIB, LZMA and FLAC, and the general ZLIB, LZMA and Huffman codecs work; parent-dependent images, older CHD versions and non-CD images do not. The music plays from the disc's audio tracks, the intro and ending movies from its movie files. - Or the Sega Saturn's disc (Wipeout XL Japan, or WipEout 2097 Europe), in the same forms. The game is the PlayStation's, made from the Saturn's data: its tracks, scenery, ships, HUD, menus' art, font, sounds, music (Cold Storage's Saturn soundtrack) and movies. What the Saturn has nothing for is drawn here (the PlayStation pad's button icons, a few small textures).
- To build: CMake, Ninja, a C compiler (Clang or GCC), and SDL3 3.2 or later
(zlib for the test traces is optional). Where CMake does not find SDL3 it
downloads and builds it (
-DWIPEOUT_BUILD_SDL=ONalways does). The same goes for libarchive (libarchive-devon Linux, Homebrew'slibarchiveon macOS;-DWIPEOUT_BUILD_LIBARCHIVE=ONalways builds it).
Each build has its own folder under build/. macOS (Homebrew's sdl3):
cmake -S . -B build/mac -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo
ninja -C build/macIt also makes build/mac/Wipeout XL.app, with the Mac version's icon and the
Homebrew libraries it uses inside (copy it to /Applications).
Linux (for example Debian 13 or Ubuntu 25.04: libsdl3-dev libgl-dev): the
same two commands with build/linux.
Windows, with MSYS2's MinGW-w64 (UCRT64 or CLANG64 shell, packages cmake
ninja gcc or clang): the same two commands with build/windows. From
macOS or Linux, with the MinGW-w64 cross compiler, use the toolchain file:
cmake -S . -B build/windows -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=cmake/mingw-w64-x86_64.cmake
ninja -C build/windowswipeoutxl.exe is a single file, with SDL3 and the C runtime linked in and the
PC version's icon.
Windows on Arm, from macOS or Linux with llvm-mingw:
cmake -S . -B build/windows-arm64 -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=cmake/mingw-w64-aarch64.cmake -DLLVM_MINGW=/path/to/llvm-mingw
ninja -C build/windows-arm64The release's downloads (a universal Wipeout XL.app for Apple Silicon and
Intel Macs, and the x64 and Arm Windows programs), from a Mac, into
build/release-assets/:
tools/release.py --version 0.0.4 --llvm-mingw /path/to/llvm-mingw \
--smoke-disc "path/to/Wipeout XL (USA).cue"Each is self-contained: SDL3, libarchive and its compression libraries are built into it from source rather than taken from Homebrew.
The web, with Emscripten:
emcmake cmake -S . -B build/web -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DWIPEOUT_WEB_DISC="path/to/Wipeout XL (USA).cue"
ninja -C build/webThis makes wipeoutxl.html, wipeoutxl.js and wipeoutxl.wasm, and, as
wipeout-rewrite's web build has its data beside the page, the disc the page
loads by itself: WIPEOUT_WEB_DISC (your own copy) links the .cue and its
.bin tracks into build/web/disc/ and writes wipeoutxl-data.json, which
names it. Put build/web on any web server with the links followed
(cp -RL build/web site), or try it with python3 -m http.server in
build/web and open http://localhost:8000/wipeoutxl.html. A host can also
put a disc there by hand: disc/Wipeout XL (USA).cue with its tracks is found
without a wipeoutxl-data.json, and the JSON ({ "disc": "url/of/the.cue" })
can point anywhere on the site. With -DWIPEOUT_WEB_DISC_MUSIC=OFF only the
data track goes into disc/ (about 86 MB in place of about 700): the game
plays, without its music.
The same game runs on iPhone, iPad and Android, landscape and full screen (OpenGL ES 3), with touch controls (below) and widescreen on from the start. SDL3 and libarchive are downloaded and built into the app.
iOS (Xcode; the simulator needs no signing):
cmake -S . -B build/ios -G Ninja -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator \
-DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 -DCMAKE_BUILD_TYPE=RelWithDebInfo
ninja -C build/ios wipeoutxl
codesign --force --sign - "build/ios/Wipeout XL.app"
xcrun simctl install booted "build/ios/Wipeout XL.app"For a device, configure with -G Xcode -DCMAKE_SYSTEM_NAME=iOS -DWIPEOUT_IOS_TEAM=<your team id> -DWIPEOUT_IOS_BUNDLE_ID=<an id of yours>, open the project in Xcode and run it on the device (the first
configure takes a while: Xcode checks every one of libarchive's tests). Put the disc image (the .cue with its
.bin files, or a .zip/.7z of them) in the Files app, On My iPhone (or iPad) > Wipeout XL; the game finds
it there, or says where to put it.
Android (the Android SDK with NDK 28 and Gradle 8 with JDK 17 or 21; platform/android):
cd platform/android
gradle assembleDebug # app/build/outputs/apk/debug/app-debug.apk
adb install -r app/build/outputs/apk/debug/app-debug.apkAt the first start the game looks for the disc image in its folder on the device's storage
(Android/data/com.example.wipeoutxl/files, reached from a computer over USB, or adb push); without one
it asks, and "Choose files..." picks the .cue with its .bin files (or a .zip/.7z) with the system's
picker and copies them in. On both, the debug console (the button at the top left) changes the disc later; the
new one is used from the next start. The two-player link modes need the second player's copy of the game,
which only the desktop programs hold: on a phone they find no partner, as on the web.
The ~ key (below Esc) opens a console over the whole game window: frame rates and a
frame-rate overlay, the draw distance (the console's or the whole track) and
its fade, the frame rate, widescreen, the resolution, HD textures, skipping the intro movie and the start-up logos, full screen, the
frame recorder (off by default; up to 240 pictures a second, the ones between the game's frames too; Tab: the last 3 seconds, or from one Tab to the next, with every
primitive behind any pixel; while recording, its frames come in as they are drawn, , and . step back and
forward a frame, and − / + zoom the picture, kept at the resolution it was drawn at), and where the settings and the memory cards are. Changes are saved at once to
wipeoutxl.ini in the user's data folder; a new saves folder takes effect at
the next start. Dear ImGui (platform/third_party/imgui, MIT) draws it.
docs/PLAN.md describes the design; docs/IO.md the sound, CD, pad and card side. docs/THIRD_PARTY.md has the licenses of code adapted from others (Monkey's Audio's decoder).