Free Eggbert is a reconstruction project for Speedy Eggbert 2, based on decompiled and reverse-engineered source code.
The original source code for Speedy Blupi / Speedy Eggbert has not been publicly released. This project uses Ghidra and IDA to inspect the original game binaries, while also comparing behavior and structure against the official Planet Blupi source code.
The current goal is to make the game buildable, playable, documented, and eventually portable beyond its original Windows/DirectX environment.
Gameplay is already partially functional, but the game is still defective and many features are incomplete, inaccurate, or missing.
This repository should be considered a work-in-progress reverse-engineering and preservation effort.
- C++
- DirectX 3
- Visual Studio 2022
- Ghidra
- IDA
- ILSpy
- Improve accuracy of the decompiled source code
- Restore missing or defective gameplay behavior
- Add Doxygen documentation
- Add support for Free Direct via CMake
- Make the game portable to additional platforms
- Investigate Android support
- Investigate web browser support
Some demangled symbol names are taken from the 2013 Windows Phone version of Speedy Blupi, inspected using ILSpy.
Special thanks to Ч.У.Ш from the 4PDA forum for archiving this obscure version of the game.
For personal convenience, this code currently uses the BASS and BASSMIDI audio libraries.
The original Windows MCI-based behavior can be restored in def.h by changing:
#define _BASSto:#define _BASS false
These files currently need the most work, listed in rough priority order:
event.cppdecblupi.cppdecio.cppdecdesign.cppdecblock.cppdecmove.cppdecnet.cppdecor.cppmisc.cpp
These files appear mostly complete, but still require testing and verification:
blupi.cppbutton.cppjauge.cppmenu.cppmovie.cppnetwork.cpppixmap.cppsound.cppwave.cpp
After cloning the repository, initialize and update submodules:
git submodule init
git submodule updateAlternatively:
git submodule update --init --recursiveThis project vendors SDL via git submodules under third_party/:
third_party/SDLthird_party/SDL_imagethird_party/SDL_mixer
By default, CMake builds these vendored dependencies directly (no system SDL packages required).
Optional override for advanced users:
cmake -S . -B build -DFREE_USE_SYSTEM_SDL=ON- DATA
- IMAGE08
- IMAGE16
- SOUND
On non-Windows platforms (Linux, incl. Steam Deck, Web, Android), MIDI
music is rendered by free-api's TinySoundFont-based backend instead of the
Windows MCI sequencer, and needs a .sf2 SoundFont file to synthesize audio.
A free, redistributable default — GeneralUser GS by S. Christian Collins —
is vendored at assets/soundfont/default.sf2
(see assets/soundfont/README.md for license
and attribution), so MIDI music works out of the box with no extra setup.
The build copies it next to the built executable automatically. To use a
different SoundFont, set the FREE_API_SOUNDFONT environment variable to its
path.
- Microsoft Visual Studio Community 2022
- MSVC v143 desktop toolset
- Windows x86 build target
- Open the solution file:
Speedy Eggbert 2 Source.sln - Use Microsoft Visual Studio 2022.
- Set the platform to:
x86 - Set the debugger target to:
Win32
Open:
Project Properties
- Configuration Properties
- C/C++
- Command Line
- Additional Options
Add: /wd4700 /wd4703
Note: These options disable warnings related to potentially uninitialized local variables.
Open:
Project Properties
- General
- Platform Toolset
Set it to: Visual Studio 2022 (v143)
Right-click the solution: Speedy Eggbert 2 Source.sln
Then select: Build Solution
Build:
git submodule update --init --recursive
cmake -S . -B build -DSPEEDY_BLUPI_BACKEND=FREEDIRECT
cmake --build buildIf an older build directory cached system SDL package paths, do a clean reconfigure:
rm -rf build
git submodule update --init --recursive
cmake -S . -B build -DSPEEDY_BLUPI_BACKEND=FREEDIRECT
cmake --build buildWindows (Visual Studio generator example):
git submodule update --init --recursive
cmake -S . -B build -G "Visual Studio 17 2022" -DSPEEDY_BLUPI_BACKEND=FREEDIRECT
cmake --build build --config DebugDependency boundary note:
SPEEDY_BLUPI_WINDOWSlinks onlyfree-apiandfree-direct.- SDL include directories, compile definitions, and SDL libraries stay private to
free-api/free-direct.
This workaround may be required in some configurations:
typedef struct IUnknown IUnknown;It is used to avoid the following error:
c:\program files (x86)\windows kits\8.1\include\um\combaseapi.h(229):
error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
First, install and activate the Emscripten SDK:
source /path/to/emsdk/emsdk_env.shThen configure, build, and run:
emcmake cmake -S . -B cmake-build-web -DCMAKE_BUILD_TYPE=Debug
cmake --build cmake-build-web -j
emrun cmake-build-web/bin/SPEEDY_BLUPI_WINDOWS.htmlGame assets are preloaded directly from the repository's gamefiles/ directories
(DATA, IMAGE08, IMAGE16, SOUND) into the Emscripten virtual filesystem at
build time — no manual data copying is required.
User config and save-game data are stored in the browser's IndexedDB (via
Emscripten IDBFS) and mounted at /save inside the virtual filesystem. Data
persists across page reloads. Clearing browser site data resets persistence to
the preloaded defaults.
Export and import save data from the browser console:
// Download /save as free-eggbert-save.json
Module.ccall('FreeEggbert_ExportPersistentData', null, [], []);
// Import a previously exported .json back into /save
Module.ccall('FreeEggbert_ImportPersistentData', null, [], []);See cmake/EmscriptenToolchain.md for full details.
This project is intended for research, preservation, documentation, and compatibility work.
It is not an official release of the original game source code.
