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).

FileLinesWhat it holds
main.cpp~200Chooses the player's folder (--user, GALAXY_USER_DIR), parses the command-line flags, creates the game and calls Run().
GalaxyEggbertGame.hpp~1 490The class GalaxyEggbertGame (an Microsoft::Xna::Framework::Game): every member and helper declaration.
GalaxyEggbertGame.cpp~1 490Constructor, input capture (CaptureInput(), the accelerometer), focus loss and exit (OnDeactivated, OnExiting), frame rate, music, cheats, voyage and death resolution, vehicles.
GalaxyEggbertGameUpdate.cpp~3 500Update() and the tick: UpdateTick(), UpdateTickScreens(), UpdateTickWorld(), UpdateTickActions(), UpdateTickEvents(), UpdateTickCamera(), UpdateScreenPlay().
GalaxyEggbertGameDraw.cpp~990The frame: Draw(), DrawFrame(), DrawWorld(), DrawOverlay() (HUD, menus, editor), DrawFrameCaptures().
GalaxyEggbertGameScene.cpp~1 540BuildSceneFrame() and its AppendScene*() helpers: what the 3D world draws this frame.
GalaxyEggbertGameLoad.cpp~1 220LoadContent(), the world presentation (RebuildWorldPresentation(), RefreshTerrainMeshIfChanged()), effect-level and relief settings.
GalaxyEggbertGameMissions.cpp~710LoadMission(), SetPhase(), PlaceBlupi(), StepAutoplay(), the title scene, galaxy start and exit, worlds opened in the editor.
GalaxyEggbertGameDemo.cpp~1 300The resume log (StartResumeLog(), ReadResumeLog(), BeginResume(), ReplayBatch()), the main-menu demos and the player's recordings.
GameHelpers.hpp, GameInternal.hppHelpers shared by those files only (keyboard and gamepad merge, the build identity, world paths, timing constants).
AndroidAssets.hpp, .cppAndroid only: copies the packaged assets into internal storage and makes it the working directory; sends stdout to logcat.

The game, editor and model

PathContents
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/*.cppBlockDefinitionRegistry.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/

PathContents
tools/Verify*.cppAbout 30 verification programs registered with CTest (VerifyInteractionSystem, VerifyBlupiMovement, VerifyGESaveData, VerifyDemoReplay, VerifyGEWorldEditor, ...). The GE in some names is historical.
tools/DumpBlockDefinitions.cpp, tools/GenerateSampleWorld3D.cppExports the block registry to tools/data/blocks.csv; writes the sample world.
tools/*.pyWorld 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/*.shQA 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/

Worlds and assets

PathContents
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

PathContents
plans/GALAXY_EGGBERT_COMPLETION.mdThe active plan (milestones A-F done).
plans/GALAXY_EGGBERT_FIDELITY_AUDIT.mdThe 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

Root documents

FileUse it for
CURRENT.mdThe status authority: what works now, the verified baseline, known limitations, open work.
README.mdIntroduction and onboarding.
handoff.mdThe detailed working log: where work stands, commands, sibling pins, gotchas.
plan.mdHistorical implementation log and full task inventory.
NEXT.mdFrozen since 2026-10-24: earlier write-ups and architecture notes.
World Format.mdThe .vwr binary voxel format (summary).
upstream_bugs.mdDefects found in CNA, cna-engine and other siblings (UB-NNN).
ANDROID.md, WINDOWS.mdPlatform build notes.
renderers.md, renderers-next-steps.mdThe renderer seam design (now realised as SceneFrame) and its history.
missing.mdCases where existing engine-independent code was not reused.
REMAKE-ANALYSIS.md, easy3d.md, assets-3d-analysis.mdOlder analyses (root causes, the 2026-07 migration to CNA, 3D sources).
backlog.md, editor-wireframe-gles-bug.md, texture-distance-washout-bug.mdSmall notes and bug records, partly historical.
AGENTS.md, CLAUDE.mdThe contributor rules (direction, fidelity, boundaries, build hygiene).
LICENSEThe licence (GNU GPL v3).
VERSION.txtThe 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.
Where to start reading. 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.