Configuration
Build options, the environment variables the game reads, and the player's settings in savedata.txt.
Three layers configure the game: CMake options when you build it, environment variables when you
start it (mostly for testing and diagnostics), and the player's own settings, which the Setup
screen edits and savedata.txt keeps. Names below are checked against
CMakeLists.txt and src/ as of 2026-11-10.
CMake options
The game's own
| Option | Default | Effect |
|---|---|---|
GALAXY_EGGBERT_BUILD_CNA | ON | Builds the game (GalaxyEggbertCNA) and every verifier that links CNA. When OFF, CNA and cna-engine are not needed and only the engine-independent tools and tests are configured (not a configuration the project exercises regularly). |
GALAXY_EGGBERT_ENABLE_CHEATS | ON | Becomes the compile definition GALAXY_EGGBERT_ENABLE_CHEATS=0/1 on the game's update and draw sources, InputPad.cpp and VerifyGEInputPad.cpp. OFF removes typed cheat words (including help and compass), F12, the hidden cheat gesture and menu (Cheats & Diagnostics). |
GALAXY_EGGBERT_ENABLE_LINUX_BUNDLE | ON | Defines the install rules and CPack's package target for the Linux .tar.gz. Exists only on Linux (not Emscripten, Android or Apple). |
CNA_HOME | empty = ../cna | Path to the CNA source checkout. Configure fails if it has no CMakeLists.txt. |
CNA_ENGINE_HOME | empty = ../cna-engine | Path to the cna-engine checkout; same check. |
CNA options the game gives a default
| Option | Default here | Effect |
|---|---|---|
CNA_GRAPHICS_RENDERER | OPENGLES3 native, WEBGL2 under Emscripten | CNA's renderer identity. Set before CNA is added and without forcing, so a command-line value or an existing tree's value is kept. Valid names: Platform Support. |
CNA_USE_CCACHE | OFF | Lets CNA use ccache for itself and sharp-runtime. To cache the whole build, pass -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache instead. |
Standard CMake variables that matter here
| Variable | Use |
|---|---|
CMAKE_BUILD_TYPE | Release for playing and packaging. |
BUILD_TESTING | ON by default (include(CTest)). Registers the tests; on desktop it also builds GalaxyEggbertWorldsTests and fetches GoogleTest. The web build turns it off. |
FETCHCONTENT_SOURCE_DIR_GOOGLETEST | Path to a local GoogleTest checkout, used instead of downloading v1.14.0 from GitHub. |
CMAKE_TOOLCHAIN_FILE | cmake/toolchains/mingw-w64.cmake for the Windows cross-build; it reads MINGW_TRIPLET (default x86_64-w64-mingw32) and the optional CNA_WINDOWS_DEPENDENCIES_ROOT. |
Fixed by the game
The game forces these OFF so that only the libraries are built: CNA_BUILD_TESTS,
CNA_BUILD_EXAMPLES, CNA_SHARED_LIBRARY (CNA is static: cna-engine links
its static modules, and a shared CNA would load twice), and cna-engine's
CNA_ENGINE_BUILD_TESTS, CNA_ENGINE_BUILD_EXAMPLES,
CNA_ENGINE_WITH_EXTENDED, CNA_ENGINE_WITH_ENHANCED_GRAPHICS,
CNA_ENGINE_INSTALL, CNA_ENGINE_PILOT_PROBES and
CNA_ENGINE_WARNINGS_AS_ERRORS. CNA itself turns off sharp-runtime's tests.
Where CNA finds its own dependencies
CNA looks for sharp-runtime and easy-gl next to itself; its cache
variables CNA_SHARP_RUNTIME_ROOT and CNA_EASYGL_ROOT point elsewhere.
easy-gl always adds ../meta-gl beside itself. For Android, Gradle passes
CNA_HOME / CNA_ENGINE_HOME from cna.home /
cna.engine.home in android/local.properties, else from the environment
variables of the same names, else the siblings (Build Guide).
Environment variables
Every variable below is read with std::getenv somewhere in src/. None is
needed to play; most exist for tests, comparisons and measurements.
Files and setting overrides
| Variable | Values | Effect |
|---|---|---|
GALAXY_USER_DIR | a folder | The player's folder on the desktop, unless --user DIR is given (main.cpp). The test scripts point it at their run folder. |
GALAXY_EFFECTS | 0-4 or off, low, medium, high, ultra | Overrides the Setup's 3D effects level for this run (golden frames per level use it). |
GALAXY_TERRAIN_RELIEF | 0 or 1 | Overrides the Setup's 3D terrain: 0 flat cubes, any other value the reliefs. |
GALAXY_TEXTURES | 1/1x, 2/2x, anything else = auto | Overrides the Setup's Textures (TextureScale.cpp). Desktop only; the web and Android always use 1x. |
Diagnostics
| Variable | Effect |
|---|---|
GALAXY_PERF=1 | Prints the average draw time, model draws, triangles and culled models every 120 frames, and how long terrain patches and rebuilds take. |
GALAXY_MODEL_CULL=0 | Draws object models even when they are out of view (no culling), to compare. |
GALAXY_EFFECTS_DEBUG | shadow or occlusion: the terrain drawn as that factor alone, in grey. Ultra only: gi (the light from around, halved) and sprites (the light on sprites and particles). |
GALAXY_ULTRA_DEBUG | A number 1-9 that shows one intermediate of Ultra's final pass instead of the picture (no grade, no bloom, fixed exposure, the scene before tone mapping, the exposure, occlusion channels, reflection strength, the fog); see UltraFinish.cpp. |
GALAXY_RELIEF_GI=0 | Ultra: the terrain reliefs without the baked light from around, to compare. |
GALAXY_TERRAIN_RELIEF_DIR | Folder of the relief meshes (default avatars3d/terrain). |
GALAXY_TERRAIN_RELIEF_RADIUS | Distance in blocks around the camera's target within which reliefs are shown (default 8). |
GALAXY_TERRAIN_RELIEF_OVERHANG=1 | Keeps the reliefs' overhangs into open air, to compare. |
GALAXY_TERRAIN_RELIEF_TIMING | Set to anything: prints the chunks, triangles and milliseconds of a world's first relief build. |
GALAXY_INTERP_TRACE=FILE | Writes one line per frame in play: the step, the interpolation fraction, the camera, the shake and the moved objects (frame rates above 60). |
GALAXY_ACCEL_PAD=1 | Shows the accelerometer layout of the on-screen pad without a sensor, to look at it on a desktop. |
QA runs
| Variable | Effect |
|---|---|
AUTOPLAY_REALTIME=1 | With --autoplay: keep real 60 Hz pacing instead of running as fast as possible, to watch or screenshot a run. |
AUTOPLAY_SHOTS=N | With --autoplay: save the frame every N ticks into autoplay_shots/ (tick-numbered PNGs). |
GALAXY_RESUME_SELFTEST=N | At tick N of a mission, restore it from its own resume log, replay to the same tick and compare; prints RESUME SELFTEST equal or different: ... and exits with 1 on a difference. |
Read by the libraries, not the game: XDG_DATA_HOME, LOCALAPPDATA and
HOME decide CNA's per-user folder (Running the Game);
SDL_AUDIODRIVER and SDL_VIDEODRIVER are SDL's. The scripts in
tools/ have variables of their own (Testing).
Player settings
The Setup screen
Open it from the main menu's Setup button or from Setup in the
pause menu; Return or Esc leaves it. Every change is saved at once (a slider when
you let it go) and applies at once, except Textures, which applies at the next start. From top to
bottom (InputPad.cpp):
| Left column | Right column |
|---|---|
| Nickname (top left: the player's name in the menu and the network game) | Language (top right: the language's own name; it opens the panel of twenty flags, as the main menu's flag does) |
| Frame rate: 60 / 120 / 144 / 240 fps | Textures: Auto / 1x / 2x (next start) |
| Sound effects (on/off), then the Sound effects and Music volume sliders | |
| Jump button on the right | Player A/B/C : Erase progress (main menu only) |
| Automatic zoom on action | 3D terrain |
| Accelerometer, with a Sensitivity slider while it is on | 3D effects: Off / Low / Medium / High / Ultra |
The nickname, the language, the volume sliders, 3D terrain, 3D effects, frame rate and textures are Galaxy Eggbert additions (the original took its language, French or English, from the system's; Galaxy does too until the button is pressed); the rest is the original's Setup. Erase progress works as the original's: it resets the whole file to its defaults, every setting and all three players' progress. What the effect levels draw: 3D Effects & Graphics.
savedata.txt keys
A plain key=value text file in the player's folder
(src/GalaxyEggbert/Game/SaveData.cpp). Unknown keys are ignored and out-of-range values
are clamped or fall back to the default.
| Key | Values (default) | Set by |
|---|---|---|
soundEnabled | 0/1 (1) | Sound effects toggle; off silences the music too |
effectsVolume | 0-100 (100) | Sound effects slider; 100 is the original's loudness |
musicVolume | 0-100 (100) | Music slider (the music plays at half volume at most, scaled by it) |
jumpRight | 0/1 (1) | Jump button on the right (the on-screen pad's layout) |
autoZoom | 0/1 (1) | Automatic zoom: the view eases in while Blupi walks |
accelActive | 0/1 (0) | Accelerometer |
accelSensitivity | 0-100 (50) | Sensitivity slider |
terrainRelief | 0/1 (0) | 3D terrain |
effectsLevel | 0-4 (0 = Off) | 3D effects; an old effects3d=1 line reads as High |
frameRate | 60, 120, 144, 240 (60) | Frame rate; the simulation always steps 60 times a second |
textureScale | 0 auto, 1, 2 (0) | Textures |
language | en, fr, de, cs, sk, es, it, pl, pt, nl, hu, ro, sv, ru, uk, fi, da, nb, tr, el (absent: the system's) | Language; written only once it is chosen |
gamerN.nickname | text (empty: Player A, B, C in the language) | Nickname |
fullscreen | 0/1 (0) | F11 or the main menu's Fullscreen / Window button, not the Setup |
selectedGamer | 0-2 (0) | The player chosen in the main menu (A, B, C) |
gamerN.lives, .missionNumber, .lastWorld, .hasProgress, .doorsUnlocked | per player 0-2 | Campaign progress; doorsUnlocked is 200 digits, one per mission door |
galaxyN.* | same fields | Progress in that player's own galaxy, written only once there is some |
soundEnabled=1
jumpRight=1
autoZoom=1
accelActive=0
effectsVolume=100
musicVolume=100
accelSensitivity=50
fullscreen=0
terrainRelief=0
effectsLevel=0
frameRate=60
textureScale=0
selectedGamer=0
gamer0.lives=3
gamer0.missionNumber=0
gamer0.lastWorld=1
gamer0.hasProgress=0
gamer0.doorsUnlocked=0000... (200 digits)
...
The other player files (resume.txt, demos/, customworlds/)
and how progress is checkpointed: Save Data & Resume and
SaveData.