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

OptionDefaultEffect
GALAXY_EGGBERT_BUILD_CNAONBuilds 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_CHEATSONBecomes 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_BUNDLEONDefines the install rules and CPack's package target for the Linux .tar.gz. Exists only on Linux (not Emscripten, Android or Apple).
CNA_HOMEempty = ../cnaPath to the CNA source checkout. Configure fails if it has no CMakeLists.txt.
CNA_ENGINE_HOMEempty = ../cna-enginePath to the cna-engine checkout; same check.

CNA options the game gives a default

OptionDefault hereEffect
CNA_GRAPHICS_RENDEREROPENGLES3 native, WEBGL2 under EmscriptenCNA'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_CCACHEOFFLets 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

VariableUse
CMAKE_BUILD_TYPERelease for playing and packaging.
BUILD_TESTINGON 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_GOOGLETESTPath to a local GoogleTest checkout, used instead of downloading v1.14.0 from GitHub.
CMAKE_TOOLCHAIN_FILEcmake/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

VariableValuesEffect
GALAXY_USER_DIRa folderThe player's folder on the desktop, unless --user DIR is given (main.cpp). The test scripts point it at their run folder.
GALAXY_EFFECTS0-4 or off, low, medium, high, ultraOverrides the Setup's 3D effects level for this run (golden frames per level use it).
GALAXY_TERRAIN_RELIEF0 or 1Overrides the Setup's 3D terrain: 0 flat cubes, any other value the reliefs.
GALAXY_TEXTURES1/1x, 2/2x, anything else = autoOverrides the Setup's Textures (TextureScale.cpp). Desktop only; the web and Android always use 1x.

Diagnostics

VariableEffect
GALAXY_PERF=1Prints the average draw time, model draws, triangles and culled models every 120 frames, and how long terrain patches and rebuilds take.
GALAXY_MODEL_CULL=0Draws object models even when they are out of view (no culling), to compare.
GALAXY_EFFECTS_DEBUGshadow 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_DEBUGA 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=0Ultra: the terrain reliefs without the baked light from around, to compare.
GALAXY_TERRAIN_RELIEF_DIRFolder of the relief meshes (default avatars3d/terrain).
GALAXY_TERRAIN_RELIEF_RADIUSDistance in blocks around the camera's target within which reliefs are shown (default 8).
GALAXY_TERRAIN_RELIEF_OVERHANG=1Keeps the reliefs' overhangs into open air, to compare.
GALAXY_TERRAIN_RELIEF_TIMINGSet to anything: prints the chunks, triangles and milliseconds of a world's first relief build.
GALAXY_INTERP_TRACE=FILEWrites 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=1Shows the accelerometer layout of the on-screen pad without a sensor, to look at it on a desktop.

QA runs

VariableEffect
AUTOPLAY_REALTIME=1With --autoplay: keep real 60 Hz pacing instead of running as fast as possible, to watch or screenshot a run.
AUTOPLAY_SHOTS=NWith --autoplay: save the frame every N ticks into autoplay_shots/ (tick-numbered PNGs).
GALAXY_RESUME_SELFTEST=NAt 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 columnRight 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 fpsTextures: Auto / 1x / 2x (next start)
Sound effects (on/off), then the Sound effects and Music volume sliders
Jump button on the rightPlayer A/B/C : Erase progress (main menu only)
Automatic zoom on action3D terrain
Accelerometer, with a Sensitivity slider while it is on3D 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.

KeyValues (default)Set by
soundEnabled0/1 (1)Sound effects toggle; off silences the music too
effectsVolume0-100 (100)Sound effects slider; 100 is the original's loudness
musicVolume0-100 (100)Music slider (the music plays at half volume at most, scaled by it)
jumpRight0/1 (1)Jump button on the right (the on-screen pad's layout)
autoZoom0/1 (1)Automatic zoom: the view eases in while Blupi walks
accelActive0/1 (0)Accelerometer
accelSensitivity0-100 (50)Sensitivity slider
terrainRelief0/1 (0)3D terrain
effectsLevel0-4 (0 = Off)3D effects; an old effects3d=1 line reads as High
frameRate60, 120, 144, 240 (60)Frame rate; the simulation always steps 60 times a second
textureScale0 auto, 1, 2 (0)Textures
languageen, 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.nicknametext (empty: Player A, B, C in the language)Nickname
fullscreen0/1 (0)F11 or the main menu's Fullscreen / Window button, not the Setup
selectedGamer0-2 (0)The player chosen in the main menu (A, B, C)
gamerN.lives, .missionNumber, .lastWorld, .hasProgress, .doorsUnlockedper player 0-2Campaign progress; doorsUnlocked is 200 digits, one per mission door
galaxyN.*same fieldsProgress 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.