Coding Style

Rules from CLAUDE.md's Current Direction Lock and the existing codebase.

The Direction Lock (binding, not a suggestion)

Read this before touching engine-layer code Full text: Architecture. In short: CNA is used directly (no abstraction layer); Easy3D is a small helper beside it (must not hide CNA, must not become a scene graph/ECS); GalaxyEggbertSimple3D stays as reference, not to be expanded; ../mobile-eggbert is read-only — its code/data requires explicit approval to reuse, its assets do not.

No #ifdef Engine Guards

Neither GalaxyEggbertSimple3D nor GalaxyEggbertCNA may use #ifdef to paper over engine differences — each target speaks its own API (Simple3D, or CNA+Easy3D) directly. If a backend is missing a feature, that's a problem for the sub-repo (simple-3d or CNA/easy-3d), not something to work around here.

Naming Conventions (as used in src/GalaxyEggbertCNA/)

ElementConventionExample
ClassesPascalCase, GE prefix for CNA/Simple3D game classesGEWorldRuntime, GEBlupiController
MethodsPascalCaseLoadFromVwrFile()
ConstantskPascalCasekMoveSpeed, kWorldCenterX
Enum valuesPascalCase within enum classGamePhase::Play
NamespacesPascalCaseGalaxyEggbert::Worlds, GalaxyEggbert::CNA, Easy3D

Header Layout

Public API headers used by tests live under include/GalaxyEggbert/ (all engine-agnostic: Worlds/, def/, BlockTypes.hpp, Def.hpp, GameConstants.hpp). Private implementation headers live beside their .cpp under src/GalaxyEggbertCNA/ or src/GalaxyEggbertSimple3D/.

Enum Stability

ObjectType, SoundChannel, BlupiAction, and other def/ enums are frozen to match mobile-eggbert's level/save format exactly — do not renumber existing values. New values must be appended at the end.

Approval Gates