Running the Game
Starting each build, every command-line flag, where the player's files live, and headless runs.
Desktop: run from the build directory
cd build-cna-opengl3
./GalaxyEggbert
The game reads its assets by paths relative to its working directory, and CNA resolves the model
folder (avatars3d/) against the executable's real location. After each build a
post-build step copies Content/, worlds3d/, textures3d/ and
avatars3d/ next to the executable, so the build directory is a complete run folder.
Starting it from anywhere else, or through a symbolic link to the executable, finds no assets.
(The project's QA scripts that run elsewhere use a hard link to the executable plus symlinked asset
folders for this reason.)
The window opens windowed on the first run; F11 or the main menu's upper-left Fullscreen / Window button switches, and the choice is remembered.
Linux bundle
tar -xzf GalaxyEggbert-0.4.0-linux-x86_64.tar.gz
./GalaxyEggbert-0.4.0-linux-x86_64/run-galaxy-eggbert
The archive's name carries the version from VERSION.txt. A bundle built on Debian 13 needs
glibc 2.38 or newer; see Releases for the 0.4.0 packages and their
requirements.
run-galaxy-eggbert changes into the bundle's directory and runs
GalaxyEggbert with the arguments you gave it, so every flag below works through it.
Keep the executable next to Content/, worlds3d/, textures3d/
and avatars3d/. If a system library is missing, install your distribution's runtime
package for it (the bundle carries only SDL).
Web build
emrun build-cna-webgl2/GalaxyEggbert.html
# or any static HTTP server, for example:
python3 -m http.server --directory build-cna-webgl2 8000
# then open http://localhost:8000/GalaxyEggbert.html
- Serve it over HTTP; opening the file as a
file:URL does not work. - The browser may wait for a click or key press before it starts the sound.
- The page has its own full-screen button.
- Music is fetched from
Content/music/beside the page when a world first plays a track; publish that folder with the fourGalaxyEggbert.*files. - Command-line flags do not apply. Saves, demos and the player's worlds are kept in the browser's IndexedDB storage and survive a reload.
Android
adb install android/app/build/outputs/apk/debug/app-debug.apk
adb shell am start -n org.openeggbert.galaxyeggbert/org.openeggbert.speedyblupi.SpeedyBlupiActivity
adb logcat -s SDL SDL/APP GalaxyEggbert
The first start copies the assets (about 125 MB) from the APK into the app's internal storage and
runs there; later starts copy again only when the assets changed. The game's and CNA's console
output appears in logcat under the tag GalaxyEggbert. An APK built for a single ABI
with -Pandroid.injected.build.abi is test-only: install it with
adb install -t -r. The app runs in landscape. Emulator notes are in
ANDROID.md; without hardware acceleration (KVM) the emulator is too slow to play.
Command-line flags
All parsed in src/GalaxyEggbertCNA/main.cpp, on the desktop builds. They are
development and QA tools; a player needs none of them. Unknown arguments are ignored.
| Flag | What it does |
|---|---|
--user DIR | Keep the player's files in DIR (made absolute against the working folder, created if missing) instead of the system's per-user folder. Takes precedence over GALAXY_USER_DIR. No copy from an earlier build is made. Desktop only. |
--mission N | Skip the menus and start mission N in play, loading worlds3d/worldNNN.vwr (for example 12, or 999 for the showcase world). |
--galaxy | With --mission N: load world N of the selected player's own galaxy, with that galaxy's progress (Your Own Galaxy). |
--spawn X,Y,Z[,YAW] | With --mission: put Blupi on the raw grid cell X,Y,Z (the coordinates of .vwr files and tools/vwr_inspect.py) instead of the world's start, facing YAW degrees (default 0). Ignored if fewer than three numbers parse. |
--autoplay SCRIPT | With --mission: a QA script plays instead of the keyboard and mouse, one fixed 1/60 s step per update as fast as the machine runs (one frame in 30 drawn). Writes autoplay_trace.txt in the working folder and exits when the script ends: code 0 if it passed, 1 if not, 2 if the script could not be read. |
--record-demo FILE | With --mission (and optionally --autoplay): record the mission from its start as a main-menu demo until Escape, the mission's end, the script's end, the tick limit or the window closing; write FILE and exit. F-keys and Tab are not recorded (Demos & Recordings). |
--demo-ticks N | With --record-demo: stop after N ticks (60 per second). |
--demo-title TEXT | With --record-demo: the title stored in the demo. |
--verify-demo FILE | Replay that demo at once, undrawn and silent, compare its end with the recorded one and exit: code 0 if equal, 1 if not. |
--golden-capture | Load world999, run the fixed 60 Hz simulation and save golden_frame_0060.png, golden_frame_0120.png and golden_frame_0180.png into the working folder, then exit. |
--golden-capture-trace | Load world999, turn Blupi west, drive him through a fixed input script for 150 ticks, write one line per tick to golden_trace.txt and exit. |
./GalaxyEggbert --mission 12
./GalaxyEggbert --mission 999 --spawn 34,1,6,0
./GalaxyEggbert --user ./qa-player --mission 11 --autoplay ../tools/autoplay/world011.txt
resume.txt, and winning or losing saves progress for the selected
player. For experiments, give the run its own folder with --user DIR or
GALAXY_USER_DIR, as the project's scripts do.Environment variables that change a run (GALAXY_EFFECTS, AUTOPLAY_SHOTS,
...) are listed on Configuration.
Where the player's files are
Since 2026-11-10 the player's own files are kept apart from the game
(src/GalaxyEggbert/Game/UserFolder.hpp): savedata.txt (settings and
progress), resume.txt (an interrupted mission), demos/ (recordings) and
customworlds/ (the editor's worlds and the player's galaxy). Format and behaviour:
Save Data & Resume.
| Platform | Folder |
|---|---|
| Linux | $XDG_DATA_HOME/Galaxy Eggbert, or ~/.local/share/Galaxy Eggbert when XDG_DATA_HOME is not set |
| Windows | %LOCALAPPDATA%\Galaxy Eggbert (an XDG_DATA_HOME variable, if set, wins here too) |
| Any desktop, chosen | --user DIR, else the environment variable GALAXY_USER_DIR |
| Web | /save in the page's file system, kept in IndexedDB |
| Android | The app's private internal storage (its working folder, beside the copied assets); removed when the app is uninstalled |
- The desktop folder is CNA's per-user storage root for the name "Galaxy Eggbert"
(
StorageDevice::GetStorageRootEXT()). The game prints the folder it uses at start. - Moving from an older build. Builds before 2026-11-10 kept these files in the
working folder (the build directory). On the first start without
--userorGALAXY_USER_DIR, if the per-user folder has nosavedata.txtand the working folder has one, the game copies the four items over. Nothing is moved or overwritten. - If the per-user folder cannot be found or created, the game says so and keeps the files in the working folder.
Headless runs
The game always needs a GL context. On a machine without a display, run it under Xvfb, silence the audio and give it its own player folder:
cd build-cna-opengl3
GALAXY_USER_DIR=. SDL_AUDIODRIVER=dummy SDL_VIDEODRIVER=x11 \
xvfb-run -a -s "-screen 0 1280x720x24" ./GalaxyEggbert --golden-capture
SDL_AUDIODRIVER and SDL_VIDEODRIVER are SDL's own variables. The scripts
in tools/ (autoplay.sh, qa_live.sh,
record_demo.sh, verify_demos.sh, verify_golden_frames.sh,
verify_golden_trace.sh) set all of this up; see
Testing.
Related pages
- Controls - keyboard, mouse, gamepad and touch.
- Configuration - Setup settings and environment variables.
- Platform Support - what is verified where.
- Debugging - diagnosing a run.