Project Structure
What lives where in the repository, checked against the tracked files on 2026-11-10.
The repository holds the game's code, its worlds and assets, the tools that make and check them, the
plans and audit ledgers, and this website. CNA and cna-engine are not inside it: they are
sibling checkouts found at ../cna and ../cna-engine (or wherever
-DCNA_HOME and -DCNA_ENGINE_HOME point; see Build Guide).
galaxy-eggbert/
├── src/
│ ├── GalaxyEggbertCNA/ the application host (main.cpp, GalaxyEggbertGame*.cpp)
│ └── GalaxyEggbert/
│ ├── Game/ the game: simulation, renderers, HUD, menus, saving
│ ├── Editor/ the in-game 3D world editor
│ ├── Worlds/ the voxel container (engine-independent)
│ └── *.cpp record codecs, HubDoors, BlockDefinitionRegistry
├── include/GalaxyEggbert/ public engine-independent headers (Worlds/, Def/, records)
├── tools/ verifiers, generators, world and asset tools, QA scripts
├── tests/ GoogleTest unit tests and the golden frames/trace
├── worlds3d/ the shipped .vwr worlds (81 files)
├── Content/ 2D assets: sprite sheets, backgrounds, sounds, music, demos
├── avatars3d/ 3D models (CNA SkinnedModelEXT directories)
├── textures3d/ Galaxy's own 3D textures
├── worlds/ five old text-format maps
├── mobile-eggbert-reference/ research notes on the original game
├── plans/ active plan, per-world briefs, audit ledgers, evidence
├── docs/ handbook/ and provenance/
├── android/ Gradle project for the APK
├── cmake/ CMake helpers, MinGW toolchain, web shells
├── packaging/ Linux bundle launcher and README, release notes, third-party list
├── web/ this website
├── .github/workflows/ cna-ci.yml (build and test), pages.yml (website)
└── CMakeLists.txt, CURRENT.md, handoff.md, plan.md, ... (root documents, below)
The host: src/GalaxyEggbertCNA/
The thin application layer, namespace GalaxyEggbert::CNA. Until 2026-11-09 the game class was
one very large GalaxyEggbertGame.cpp (about 8 400 lines); it is now split by topic into seven
translation units that share one header. Line counts are approximate (2026-11-10).
| File | Lines | What it holds |
|---|---|---|
main.cpp | ~200 | Chooses the player's folder (--user, GALAXY_USER_DIR), parses the command-line flags, creates the game and calls Run(). |
GalaxyEggbertGame.hpp | ~1 490 | The class GalaxyEggbertGame (an Microsoft::Xna::Framework::Game): every member and helper declaration. |
GalaxyEggbertGame.cpp | ~1 490 | Constructor, input capture (CaptureInput(), the accelerometer), focus loss and exit (OnDeactivated, OnExiting), frame rate, music, cheats, voyage and death resolution, vehicles. |
GalaxyEggbertGameUpdate.cpp | ~3 500 | Update() and the tick: UpdateTick(), UpdateTickScreens(), UpdateTickWorld(), UpdateTickActions(), UpdateTickEvents(), UpdateTickCamera(), UpdateScreenPlay(). |
GalaxyEggbertGameDraw.cpp | ~990 | The frame: Draw(), DrawFrame(), DrawWorld(), DrawOverlay() (HUD, menus, editor), DrawFrameCaptures(). |
GalaxyEggbertGameScene.cpp | ~1 540 | BuildSceneFrame() and its AppendScene*() helpers: what the 3D world draws this frame. |
GalaxyEggbertGameLoad.cpp | ~1 220 | LoadContent(), the world presentation (RebuildWorldPresentation(), RefreshTerrainMeshIfChanged()), effect-level and relief settings. |
GalaxyEggbertGameMissions.cpp | ~710 | LoadMission(), SetPhase(), PlaceBlupi(), StepAutoplay(), the title scene, galaxy start and exit, worlds opened in the editor. |
GalaxyEggbertGameDemo.cpp | ~1 300 | The resume log (StartResumeLog(), ReadResumeLog(), BeginResume(), ReplayBatch()), the main-menu demos and the player's recordings. |
GameHelpers.hpp, GameInternal.hpp | Helpers shared by those files only (keyboard and gamepad merge, the build identity, world paths, timing constants). | |
AndroidAssets.hpp, .cpp | Android only: copies the packaged assets into internal storage and makes it the working directory; sends stdout to logcat. |
The game, editor and model
| Path | Contents |
|---|---|
src/GalaxyEggbert/Game/ | About 115 files, namespace GalaxyEggbert::Game.
Simulation: BlupiController, InteractionSystem, WorldRuntime,
CratePush.hpp, ObjectDefinitionRegistry. Presentation: TerrainRenderer,
TileAtlas, SceneFrame.hpp, WorldRenderer, ObjectModelTable,
TerrainRelief, the 3D-effects classes (SceneShaders, PostProcess,
UltraFinish, EffectParticles), Hud, InputPad,
QuadBatch, Sound. Input helpers: ControlInput.hpp,
GamepadInput.hpp. Persistence: SaveData, UserFolder,
ResumeLog, DemoReplay. QA: Autoplay. |
src/GalaxyEggbert/Editor/ | Namespace GalaxyEggbert::Editor: WorldEditor
(WorldEditor.cpp, WorldEditorUpdate.cpp), the palette (EditorPalette*,
PaletteCategories), EditCommandStack, BoxRegion, Clipboard,
VoxelRaycast, EditorDeviceControls (touch and gamepad), CustomWorldStorage,
PlatformFiles (web downloads and uploads), EditorBrowserScreen,
GalaxyBrowserScreen, object path markers. |
src/GalaxyEggbert/Worlds/ | World.cpp, Chunk.cpp, BitPacking.cpp,
BinaryIO.cpp, test_worlds.cpp. |
src/GalaxyEggbert/*.cpp | BlockDefinitionRegistry.cpp, MoveObjectRecord.cpp,
BigDecorRecord.cpp, HintZoneRecord.cpp, HubDoors.cpp. |
include/GalaxyEggbert/ | Worlds/ (World, Chunk, Block,
BlockMetadata, VoxelConfig, GridRaycast, BitPacking,
BinaryIO), Def/ (the original's enums: ObjectType, GamePhase,
GameSpeed, SoundChannel, BlupiAction, ...), BlockTypes.hpp,
BlockDefinitionRegistry.hpp, the record headers, HubDoors.hpp,
PlayerStart.hpp, GameConstants.hpp. |
The layering rules between them are on Architecture.
Tools: tools/
| Path | Contents |
|---|---|
tools/Verify*.cpp | About 30 verification programs registered with CTest
(VerifyInteractionSystem, VerifyBlupiMovement, VerifyGESaveData,
VerifyDemoReplay, VerifyGEWorldEditor, ...). The GE in some names is
historical. |
tools/DumpBlockDefinitions.cpp, tools/GenerateSampleWorld3D.cpp | Exports the block
registry to tools/data/blocks.csv; writes the sample world. |
tools/*.py | World tools and checkers: worldkit.py, vwr_inspect.py,
levelcheck.py, flightcheck.py, campaigncheck.py, watercheck.py,
inventories, autoplay_campaign.py, ci_pin_siblings.py. |
tools/*.sh | QA scripts: autoplay.sh, autoplay_all.sh, qa_live.sh,
play_pass.sh, record_demo.sh, verify_demos.sh,
verify_golden_frames.sh, verify_golden_trace.sh. |
tools/worlds/ | One Python generator per shipped world (world001.py ... world199.py,
title.py, gallery.py) plus shared theme kits (kit.py, cheese.py,
palace.py, ...). |
tools/autoplay/ | Scripted playthroughs, one per mission and world chain, campaign.txt,
plus probes/ and spare/. |
tools/rd4_to_gltf/ | The Ray Dream scene converter that produces avatars3d/. |
tools/terrain_relief/, tools/a3d/, tools/bolt/, tools/glue/, tools/music/, tools/textures/ |
Other asset generators (terrain reliefs, lava surface, lightning paths, glue strands, music rendering, the grass texture). |
tools/audit/, tools/qa_steps/, tools/data/ | Ledger generators, step files for
qa_live.sh, the exported blocks.csv. |
tools/release/ | make_release.sh: a release's Linux archive, Android APK and
checksums (Build Guide). |
See Assets & Tools and Testing.
Tests: tests/
tests/GalaxyEggbert/: GoogleTest suites for the world model and records (Worlds/WorldTests.cpp,ChunkTests.cpp,BitPackingTests.cpp,MoveObjectRecordTests.cpp,HubDoorsTests.cpp, ...), built asGalaxyEggbertWorldsTests.tests/golden/: the approved golden frames at ticks 60, 120 and 180 of world 999, again undereffects-medium/andeffects-high/, andgolden_trace.txt.
Worlds and assets
| Path | Contents |
|---|---|
worlds3d/ | 81 .vwr files: world001 (main hub), twelve theme hubs
(world010 ... world120), 64 missions, world199 (bonus), world998
(gallery), world999 (showcase), title.vwr (the menu's scene). See Campaign & Worlds. |
Content/ | icons/ (sprite sheets: object-m.png, blupi.png,
element.png, explo.png, pad.png, text.png, ...),
backgrounds/ (sky panoramas decorNNN.png and the menu screens), sounds/
(93 channels, sound000.wav ...), music/ (music000.ogg ... music009.ogg),
demos/ (demo001.gdemo ... demo010.gdemo), Content.mgcb. |
avatars3d/ | Converted 3D models: blupi/, objects/ (one directory per object or big
decor), terrain/ (tile reliefs), blupi_placeholder/ (fallback). Generated; edit the generator. |
textures3d/ | grass_top.png. |
worlds/ | Five old text-format maps (world001.txt ... world005.txt); the game does not load them. |
mobile-eggbert-reference/ | Numbered notes on the original's tiles, objects, enemies, doors, sounds, animations, mechanics and save format, with images. |
android/app/src/main/assets/ holds only links to Content/, avatars3d/,
textures3d/ and worlds3d/; nothing is duplicated for the APK.
Plans and documentation
| Path | Contents |
|---|---|
plans/GALAXY_EGGBERT_COMPLETION.md | The active plan (milestones A-F done). |
plans/GALAXY_EGGBERT_FIDELITY_AUDIT.md | The fidelity audit and its waves. |
plans/audit/ | Ledgers: behavior_differences.md (BD-NNNN),
mechanics_3d_decisions.md (M3D-NNNN), owner_reports.md (OR-NNNN),
release_audit.md, editor_parity.md, CSV inventories. |
plans/briefs/ | One design brief per world. |
plans/inventory/, plans/evidence/, plans/codex/ | Generated inventories, evidence images, older task briefs. |
docs/handbook/ | The developer handbook, chapters 01-08 (overview, architecture, build and run, testing, worlds, assets and tools, contributing, backlog). |
docs/provenance/ | Licences, third-party components, original-game material, generated assets. |
Build and platform files
CMakeLists.txt: the game targetGalaxyEggbertCNA, the verifiers, the tests, the Linux bundle and the Emscripten link options.cmake/:CopyDirectoryIfDifferent.cmake(copies the asset directories next to the executable),toolchains/mingw-w64.cmake,web/shell-cna.html(the page around the web build).android/: the Gradle project (app/build.gradle,gradlew,local.properties.template,SpeedyBlupiActivity.java).packaging/:run-galaxy-eggbert.sh.in,README-linux-bundle.md, and theRELEASE_NOTES.mdandTHIRD_PARTY.txtthat go into the release packages..github/workflows/:cna-ci.yml(Linux build and CTest with pinned siblings),pages.yml(deploysweb/).Doxyfile: the API documentation targetGalaxyEggbertDocs(only when Doxygen is installed).- Build trees (
build/,build-cna-opengl3/,build-cna-webgl2/, ...) are git-ignored.
Root documents
| File | Use it for |
|---|---|
CURRENT.md | The status authority: what works now, the verified baseline, known limitations, open work. |
README.md | Introduction and onboarding. |
handoff.md | The detailed working log: where work stands, commands, sibling pins, gotchas. |
plan.md | Historical implementation log and full task inventory. |
NEXT.md | Frozen since 2026-10-24: earlier write-ups and architecture notes. |
World Format.md | The .vwr binary voxel format (summary). |
upstream_bugs.md | Defects found in CNA, cna-engine and other siblings (UB-NNN). |
ANDROID.md, WINDOWS.md | Platform build notes. |
renderers.md, renderers-next-steps.md | The renderer seam design (now realised as SceneFrame) and its history. |
missing.md | Cases where existing engine-independent code was not reused. |
REMAKE-ANALYSIS.md, easy3d.md, assets-3d-analysis.md | Older analyses (root causes, the 2026-07 migration to CNA, 3D sources). |
backlog.md, editor-wireframe-gles-bug.md, texture-distance-washout-bug.md | Small notes and bug records, partly historical. |
AGENTS.md, CLAUDE.md | The contributor rules (direction, fidelity, boundaries, build hygiene). |
LICENSE | The licence (GNU GPL v3). |
VERSION.txt | The release version (0.4.0 as of 2026-11-12), read by CMake for the Linux archive's name and by Gradle for the APK's versionName. |
CURRENT.md, then
docs/handbook/01-overview.md and 02-architecture.md, then
src/GalaxyEggbertCNA/GalaxyEggbertGame.hpp. When documents disagree, the code and
CURRENT.md win.