The initial engine
· 2 min read
The first commit: eight crates, one example, and the two things the engine is built around — hot reload that keeps state, and determinism.
What landed
- Nodes over an ECS. A game is a tree of named nodes with scripts attached; under it every node is an entity, and every subsystem — physics, rendering, audio, input, UI — is a plugin over the same data.
- Scenes as TOML. A scene file declares nodes, and plugins extend its
vocabulary:
bodyandcollidercome from the physics crate, not the core. - Hot reload. Saving a script swaps its code into the running game in milliseconds, with all live state kept. Always on in dev mode, provided by the core.
- The editor is a project.
balaur editruns an editor written in the engine's own scripts, so editing an editor script hot reloads the editor. - Export.
balaur exportprecompiles scripts into a.bpak, andbalaur playruns from bytecode with no compiler present. - Headless by default. Without the
windowfeature everything runs without a display: tests, servers, CI.
[[nodes]]
name = "Ball"
position = [0.0, 6.0, 0.0]
script = "scripts/ball"
body = "dynamic" # from balaur_physics
collider = { shape = "ball", radius = 0.5 } # from balaur_physics
Scripts were Luau on day one; they are Rune now. Cross-platform determinism was written down as non-negotiable before any of it was measured, and every subsystem since has been vetted against it. Principles is the current form of that list.
