Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Decision log

Each entry: what was decided, why, and what it costs. Append new decisions at the end; do not rewrite old ones. If a decision is reversed, add a new entry that supersedes it and mark the old one.

Status values: Accepted, Revisit, Superseded.


D1. The kerosene crate is the product

Status: Accepted

One published crate; one lockstep version is its API under SemVer; tags are the bare version. Internal crates are publish = false and folded into it by cargo xtask bundle.

Why: a game author wants one dependency and one version to reason about. Cost: the bundle step rewrites paths, so the published crate’s layout differs from the workspace.

D2. Layered dependencies, enforced

Status: Accepted

Crates depend only downward; subsystems never on each other; checked by cargo xtask layers.

Why: see Principles. Cost: sharing between subsystems means moving code down a layer, which is sometimes awkward. One exception exists (ui → script) and is marked Revisit.

D3. Bake at build time

Status: Accepted

Visibility, lighting and acoustics are tools, not runtime systems.

Why: predictable frame time; a small runtime. Cost: longer content builds, no fully dynamic worlds.

D4. bevy_ecs and bevy_reflect behind facades, exact-pinned

Status: Accepted

Used for entity storage and field reflection, reached only through kerosene-ecs and kerosene-reflect, pinned with =.

Why: a mature ECS and reflection without handing games Bevy’s API surface or churn. Cost: upgrades are deliberate work.

D5. wgpu and egui versions move together

Status: Accepted

wgpu is pinned to the version egui-wgpu links (25 with egui 0.32); other crates reach wgpu through kerosene_rhi::wgpu.

Why: two wgpu versions in one binary do not interoperate. Cost: wgpu upgrades wait for egui.

D6. Rhai for scripting

Status: Accepted

Why: pure Rust, sandboxable, no build-system burden, easy to give a snapshot and collect actions. Cost: slower than a JIT language, a small ecosystem.

D7. Headless Engine, windowed host

Status: Accepted

See Runtime. Why: servers, CI, tests. Cost: every host concern needs a seam rather than a direct call.

D8. Request-shaped handlers

Status: Accepted

Entity handlers and console commands leave requests rather than call into the engine.

Why: keeps those crates plain data, testable alone. Cost: an indirection, and a verb nobody claims is only caught at run time (it is reported, not silent).

D9. Engine owns no game; fallback map only

Status: Accepted

The engine ships a built-in fallback map, kerosene_room, and base content, not a demo game. The demo game (kero_start) lives in the separate kerosene-demo repository as an ordinary crates.io game crate.

Why: proves a game really is a crate, and keeps the engine free of game content. Cost: the demo can lag the engine (see Open issues).

D10. No migration support in alpha

Status: Accepted until 1.0, or until real games exist

Breaking changes (for example removing the func_ prefix from class names, in 1.0.0-a4) ship with no migrate command or compatibility shim; the CHANGELOG.md says what to change.

Why: nothing yet depends on the old shapes, and shims are cost with no user. Cost: old maps and .kdef files need hand edits.

D11. Short file extensions

Status: Accepted

Formats use short k… extensions (.kmap, .kbsp, .kproj, …).

Why: consistency and brevity. Cost: older material (the demo’s README, some docs) may still show long names.

D12. Source-style movement, separate from rigid bodies

Status: Accepted

Why: the movement feel is the point of a Source-style engine, and it must be deterministic and BSP-trace-based. Rigid props use a general solver (box3d-rust) and couple to the player explicitly. Cost: two collision representations to keep consistent.

D13. License with an exception

Status: Accepted

GPL-3.0-or-later with the Kerosene exception. See Licensing.


Template

### Dn. Title

**Status:** Accepted | Revisit | Superseded by Dm

What was decided.

*Why:* …  *Cost:* …