2021-10-17 06:49:17 +02:00
<!-- markdownlint - disable - file MD033 -->
2021-12-22 10:52:36 +01:00
# 3D Pinball for Windows – Space Cadet
2021-01-29 17:34:45 +01:00
2021-10-17 06:49:17 +02:00
## Summary
Reverse engineering of `3D Pinball for Windows – Space Cadet` , a game bundled with Windows.
2021-12-22 10:52:36 +01:00
## About the original game
3D Pinball for Windows – Space Cadet is a pinball video game developed by Cinematronics and published by Maxis in 1995. It features pre-rendered 3D graphics and three tables—Space Cadet, Skullduggery, and Dragon's Keep. On each table, there are displays on the side that show the players' score, ball number, player number, a display for various information and a table-specific image.
2021-10-17 06:49:17 +02:00
## How to play
Place compiled executable into a folder containing original game resources (not included).\
2021-02-20 13:58:16 +01:00
Supports data files from Windows and Full Tilt versions of the game.
2021-09-23 11:16:58 +02:00
2021-12-22 10:52:36 +01:00
Use your keyboard or mouse to control the flipper
2021-10-17 06:49:17 +02:00
## Known source ports
2021-12-22 11:54:00 +01:00
| Platform | Author | URL |
| --------------- | --------------- | ---------------------------------------------------------------------------------------------------------- |
| PS Vita | Axiom | < https: / / github . com / suicvne / SpaceCadetPinball_Vita > |
| Emscripten | alula | < https: / / github . com / alula / SpaceCadetPinball > < br > Play online: < https: / / alula . github . io / SpaceCadetPinball > |
| Nintendo Switch | averne | < https: / / github . com / averne / SpaceCadetPinball-NX > |
| webOS TV | mariotaku | < https: / / github . com / webosbrew / SpaceCadetPinball > |
| Android (WIP) | Iscle | https://github.com/Iscle/SpaceCadetPinball |
| Nintendo Wii | MaikelChan | https://github.com/MaikelChan/SpaceCadetPinball |
| Nintendo 3DS | MaikelChan | https://github.com/MaikelChan/SpaceCadetPinball/tree/3ds |
| Nintendo Wii U | IntriguingTiles | https://github.com/IntriguingTiles/SpaceCadetPinball-WiiU |
2021-09-23 11:21:18 +02:00
2021-10-15 13:07:25 +02:00
Platforms covered by this project: desktop Windows, Linux and macOS.
2021-10-17 06:49:17 +02:00
< br >
< br >
< br >
< br >
< br >
< br >
## Source
* `pinball.exe` from `Windows XP` (SHA-1 `2A5B525E0F631BB6107639E2A69DF15986FB0D05` ) and its public PDB
* `CADET.EXE` 32bit version from `Full Tilt! Pinball` (SHA-1 `3F7B5699074B83FD713657CD94671F2156DBEDC4` )
## Tools used
`Ghidra` , `Ida` , `Visual Studio`
## What was done
* All structures were populated, globals and locals named.
* All subs were decompiled, C pseudo code was converted to compilable C++. Loose (namespace?) subs were assigned to classes.
## Compiling
Project uses `C++11` and depends on `SDL2` libs.
### On Windows
2021-09-09 10:40:54 +02:00
Download and unpack devel packages for `SDL2` and `SDL2_mixer` .\
2021-10-17 06:49:17 +02:00
Set paths to them in `CMakeLists.txt` , see suggested placement in `/Libs` .\
Compile with Visual Studio; tested with 2019.
### On Linux
2021-09-09 10:40:54 +02:00
Install devel packages for `SDL2` and `SDL2_mixer` .\
2021-12-22 10:52:36 +01:00
2021-10-07 11:53:56 +02:00
Compile with CMake; tested with GCC 10, Clang 11.\
2021-10-17 06:49:17 +02:00
To cross-compile for Windows, install a 64-bit version of mingw and its `SDL2` and `SDL2_mixer` distributions, then use the `mingwcc.cmake` toolchain.
2021-12-22 10:52:36 +01:00
```bash
# On Debian and Ubuntu
2021-12-22 11:54:00 +01:00
sudo apt install cmake build-essential ninja-build libsdl2-dev libsdl2-mixer-dev libsdl2-mixer-2.0-0 libsdl2-2.0-0 fluidsynth
2021-12-22 10:52:36 +01:00
# On Fedora
2021-12-22 11:54:00 +01:00
sudo dnf install cmake ninja-build SDL2 SDL2-devel SDL2_mixer SDL2_mixer-devel fluidsynth fluidsynth-libs mscore-fonts g++
2021-12-22 10:52:36 +01:00
# Build
cmake -GNinja .
ninja
```
2021-12-22 11:54:00 +01:00
[![Packaging status ](https://repology.org/badge/tiny-repos/spacecadetpinball.svg )](https://repology.org/project/spacecadetpinball/versions)
2021-12-14 10:40:44 +01:00
Some distributions provide a package in their repository. You can use those for easier dependency management and updates.
2021-12-22 11:54:00 +01:00
**Fixing the audio issue**: To make music work, you need to export the following envar before launching the game:
2021-12-22 12:06:02 +01:00
`export SDL_SOUNDFONT=/path/to/your/soundfont`
Fluidsynth will install a default soundfont in this path:
On Fedora: `/usr/share/soundfonts/FluidR3_GM.sf2`
On Ubuntu/Debian: `/usr/share/sounds/sf2/FluidR3_GM.sf2`
2021-12-22 11:54:00 +01:00
2021-10-17 06:49:17 +02:00
### On macOS
* **Homebrew**: Install the `SDL2` , `SDL2_mixer` homebrew packages.
* **MacPorts**: Install the `libSDL2` , `libSDL2_mixer` macports packages.
Compile with CMake. Ensure that `CMAKE_OSX_ARCHITECTURES` variable is set for either `x86_64` Apple Intel or `arm64` for Apple Silicon.
2021-01-29 17:34:45 +01:00
2021-09-29 03:42:22 +02:00
Tested with: macOS Big Sur (Intel) with Xcode 13 & macOS Montery Beta (Apple Silicon) with Xcode 13.
2021-10-17 06:49:17 +02:00
## Plans
* ~~Decompile original game~~
* ~~Resizable window, scaled graphics~~
* ~~Loader for high-res sprites from CADET.DAT~~
2021-10-30 11:51:24 +02:00
* ~~Cross-platform port using SDL2, SDL2_mixer, ImGui~~
2021-10-17 06:49:17 +02:00
* Misc features of Full Tilt: 3 music tracks, multiball, centered textboxes, etc.
2021-10-30 11:51:24 +02:00
* Maybe: Text translations
* Maybe: Android port
2021-10-17 06:49:17 +02:00
* Maybe x2: support for other two tables
* Table specific BL (control interactions and missions) is hardcoded, othere parts might be also patched
## On 64-bit bug that killed the game
2021-01-29 17:34:45 +01:00
I did not find it, decompiled game worked in x64 mode on the first try.\
It was either lost in decompilation or introduced in x64 port/not present in x86 build.\
Based on public description of the bug (no ball collision), I guess that the bug was in `TEdgeManager::TestGridBox`