Demos & Recordings

Recorded games that play by themselves in the main menu, the demos you record yourself, and the .gdemo files behind both.

Speedy Blupi plays a recorded game when nobody touches the main menu for a while. Galaxy Eggbert does the same: the menu plays ten short demos, recorded input replayed through the normal simulation, so a demo looks and sounds exactly like real play. Players can also record their own demo into any of the ten positions, give it a name, and pass it to other players as a file. This page describes the state as of 2026-11-10.

Done Main-menu demos, recordings, names, export and import (desktop and web). Not verified Android, a physical gamepad, a real touch screen.

The main menu's demos

How a demo starts

The ten positions play in turn, and after the last the first plays again. A position whose demo cannot be played is skipped. Each demo lasts 45 to 50 seconds.

PositionShipped fileMissionTitle stored in the file
1demo001.gdemo011World 1: pillars, mine pits and lifts
2demo002.gdemo074World 7: skateboard over the mines and lava
3demo003.gdemo105World 10: helicopter over the cavern
4demo004.gdemo023World 2: the tower of keys
5demo005.gdemo033World 3: the haunted house of the eight wasps
6demo006.gdemo055World 5: the dark works
7demo007.gdemo065World 6: the slime catacombs
8demo008.gdemo081World 8: the sky steps
9demo009.gdemo112World 11: the machine cavern
10demo010.gdemo123World 12: the library

While a demo plays, the recorded input drives the ordinary simulation at 60 ticks a second, with picture and sound, and the word "Demo" is shown top left. The demo uses the recording's own profile (hub doors, lives, controls) but your sound, volumes, 3D terrain, 3D effects level and fullscreen setting.

What stops a demo

What is frozen and restored

Before a demo starts, the game keeps the player's own state: the saved profile and settings, camera mode, game speed, the cheat toggles (quick, open doors, show secret, compass, debug), the cheat-entry lock, lives and the list of active cheats. Nothing is saved while a demo plays, the resume file is left alone, and all of it is put back when the demo stops. The shipped demos are checked against this: their replay leaves savedata.txt and resume.txt byte for byte as they were.

Recording your own demo

In the original, demos could only be recorded by a trick (see below). Galaxy Eggbert offers it openly:

  1. During a campaign mission or a mission of your own galaxy, open Pause. The Record button sits top right. It is not shown in an editor play-test, during a demo or a resume replay.
  2. Record shows the ten demo positions. Click the position to record into.
  3. The mission restarts from its start at normal speed and is recorded; "REC" is shown top left. You play and the game saves your progress as always.
  4. The recording ends when Play is left (Pause, Win, Lost, or the move to another mission) or after ten minutes. The notice "Demo recorded in position N." confirms it.

From then on that position plays your recording instead of its shipped demo. A recording starts with an automatic title such as "Recorded by player A: mission 11".

The demo positions screen

The same screen is reached from Pause's Record button and from the main menu's Demos button (left of Exit). From the menu nothing can be recorded: a click on a position says "A recording is made in a mission: Pause > Record." Each position shows two lines: its name, "Recorded", "Shipped" or "Empty", then "Mission N", "Galaxy N" or "(unplayable)". A recorded position has an Original button under it, which deletes your recording so the shipped demo plays again.

ButtonWhat it does
ExportThe next click on a position copies its demo to the shared folder, as A-demo-5.gdemo (player A, position 5) or <name>.gdemo for a named demo. A name already taken is numbered (A-demo-5-2.gdemo); nothing is replaced. On the web the file is also offered as a download.
ImportLists the shared .gdemo files, newest first, seven to a page. Each row shows the demo's name, its mission or galaxy mission and its length, or why it cannot be imported. Click a row, then a position: the file is copied into it. A row's bin deletes the shared file (two clicks). On the web, Import first opens the browser's file picker; the chosen file lands in the shared folder and is listed first.
NameClick a recorded position, then type its name: letters, digits, spaces, - and ', at most 24 characters, on the keyboard or on the keyboard drawn on the screen. OK or Enter keeps it; Cancel or Escape leaves the old name.
CancelLeaves Export, Import or Name first, then the screen. Escape does the same.

The arrow keys or a gamepad's d-pad choose a button (drawn lit) and A or Enter presses it; in Pause, B leaves the positions. A recording made in a player's galaxy finds its world by its hash in any player's galaxy, on the desktop and on the web. When its world is not there, the position is kept but skipped until the world exists.

The .gdemo file

A demo is a text file holding the same input history as a resume log (ResumeLog: the start state, the random seed and the raw input of every 1/60 s tick) under a header of its own. Shortened, the start of the shipped demo001.gdemo:

GALAXY_DEMO 1
1
"World 1: pillars, mine pits and lifts"
"Nov  8 2026 19:35:31 fnv1a64=17098780557396544612"
9
"Blupi" 5723123326820972394
"Hide trail" 14695981039346656037
...
"objects" 940733633382668234
"worlds3d/world011.vwr" 17476187514555174857
11 3 1 3279155381 14 10 10 -0 0 0 0 0 0 0 1
"soundEnabled=1
...
END 8344386914525136986
PartMeaning
GALAXY_DEMO 1Magic word and format version (kDemoFormatVersion).
Second lineThe simulation revision it was recorded with (kDemoSimulationRevision, now 1).
Title, buildThe demo's name, then the recording build. The build is for information only and is never compared.
End signatureA count, then named hashes of the game state after the last tick (Blupi, blocks, camera, objects, counters ...).
BodyThe world file's path and FNV-1a hash; mission, lives, speed, seed, Blupi's position and heading, cheat flags, camera mode; the recorded profile; then runs of identical input (count, keys, mouse, buttons, viewport, touches, accelerometer, typed cheat letter).
ENDA checksum of everything before it.

Resume files only work with the identical binary. A demo instead names a simulation revision and the hash of its world, so it survives rebuilds but is never replayed into a different game. Before anything of the player's is touched, ParseDemo() and DemoWorldStatus() check the file. A demo that fails is skipped with a log line such as demo ... skipped: its world has changed.

DemoLoadStatusReason
MissingNo such file.
CorruptDamaged, truncated, bad checksum, not a demo, not at normal speed, empty, or longer than ten minutes (36,000 ticks). Checked first, so a damaged file is reported as damaged whatever revision it claims.
IncompatibleFormatAnother kDemoFormatVersion.
IncompatibleRevisionRecorded with another simulation revision.
WorldMissingIts world file is gone or does not load.
WorldChangedIts world's bytes no longer match the stored hash.

Where the files live

WhatWhere
Shipped demosContent/demos/demo001.gdemo ... demo010.gdemo beside the game.
Your recordingsdemos/demo001.gdemo ... demo010.gdemo in the player's folder, beside savedata.txt.
Shared demos (export and import)demos/shared/ in the player's folder.

The player's folder is, since 2026-11-10, ~/.local/share/Galaxy Eggbert on Linux (or under $XDG_DATA_HOME), %LOCALAPPDATA%\Galaxy Eggbert on Windows, or the folder given by --user DIR or GALAXY_USER_DIR. The web build keeps everything under /save in the browser's storage (so recordings are in /save/demos/ and survive a page reload); there, Export is a download and Import uses the file picker. Android keeps the files in the app's private storage. A galaxy exported as a .galaxy pack carries the demos recorded in it; see Your Own Galaxy.

For developers: recording and verifying demos

The command-line flags are read in src/GalaxyEggbertCNA/main.cpp:

FlagEffect
--record-demo <file>Records a demo into file; use with --mission N.
--demo-ticks NEnds the recording after N ticks (at most ten minutes).
--demo-title <text>The title written into the file.
--autoplay <script>Plays the mission by a QA autoplay script while recording.
--verify-demo <file>Replays a demo undrawn, as fast as possible, compares its end signature, prints DEMO VERIFY <file>: equal or different: ... and exits 0 or 1.

A developer's recording ends at Escape (a gamepad's Start), at the mission's end, at the autoplay's end, after --demo-ticks, or when the window closes. The F-keys and Tab are left out of the recording. The two scripts wrap this:

# scripted, from an autoplay script, cut after 45 s, under its own Xvfb display
tools/record_demo.sh build-cna-opengl3 Content/demos/demo001.gdemo 11 \
    --autoplay tools/autoplay/world011.txt --demo-ticks 2700 --demo-title "World 1: lifts and mines"

# replay every shipped demo and compare its end state
tools/verify_demos.sh build-cna-opengl3

When a simulation change makes verify_demos.sh report a shipped demo as different, bump kDemoSimulationRevision in DemoReplay.hpp and record every demo again. The CTest cases:

SourceRole
src/GalaxyEggbert/Game/DemoReplay.hpp/.cppEngine-independent: format, paths, parsing, import/export, naming, idle timer, stop rules. See DemoReplay.
src/GalaxyEggbertCNA/GalaxyEggbertGameDemo.cppThe host: StartDemoFile(), DemoTick(), StopDemo(), UpdateDemoMenu(), the player's recordings and the positions screen.
src/GalaxyEggbert/Game/InputPad.cppThe menu's Demo and Demos buttons, Pause's Record, the positions screen.
src/GalaxyEggbert/Game/ResumeLog.hppThe input history a demo shares with the resume file. See ResumeLog.

Verification status (as of 2026-11-10)

How Speedy Blupi did it. The original recorded a demo automatically whenever a world numbered 200-219 was played, and those worlds could only be reached with the hidden XMISSION cheat, typed xnjttjpo. Galaxy Eggbert keeps the cheat (it opens the 3D editor on the world being played) and makes recording an open feature instead. The research is in plans/audit/speedy_blupi_demos.md (ledger rows BD-0115 to BD-0119).