HexGame-aligned authoritative core (informative)
Policies that keep the org coherent
Status: Informative ideal — not a Novolis BCP 14 RFC and not a mandate to take a HexGame PackageReference. External pattern: HexGame (draft architecture 0.1). Stack law: library-boundaries.md — Math → Physics → Simulation; no Kit layers.
Purpose
Describe how Novolis games can follow HexGame’s loop — commands in, authoritative advance, snapshots and effects out — by composing existing Novolis packages and app-owned application cores, without:
- Vendoring
HexGame.*into the platform - Adding a GameKit /
Novolis.HexGame.*umbrella - Putting game ticks or world orchestration in Physics
Non-goals
- Re-hosting HexGame’s normative prose as Novolis law
- Stride Lite or any Stride engine island
- Requiring dogfood apps to rename types to HexGame names
- Shipping
Novolis.Game.Intentor shared frame DTO packages before 2–3 apps share a shape
Stack roles
| Layer | Owns | Must not own |
|---|---|---|
| **Math** | Numbers, transforms, geometry — no time | `dt`, clocks, ticks, cameras, games |
| **Physics** | Forces, integrators, collision, domain solvers with **physical** `dt` | Tick order, `SimulationWorld`, replay, commands, players, cameras, HexGame frame |
| **Simulation** | Worlds, systems, `SimulationClock` / `SimulationStep`, replay, cameras, intents, orchestration | Raylib/Rendering package refs; product game rules; becoming a full game engine |
| **Apps** | `IGameApplication`-shaped Start/Tick/Save/Load, domain rules, effect catalogs, host composition | Pushing product rules into Physics or `Novolis.Game.*` domain models |
| **Raylib / Rendering** | Window loop, draw, input bindings, presenters | Authoritative simulation state |
| **Gaming** (`Novolis.Game.*`) | Identity, menus, lobby glue, procedural authoring, packaging | Simulation/Raylib refs; game domain models; owning Tick |
Hard rule — Tick is Simulation + app
HexGame Tick, command dispatch into the core, world systems, replay, and presentation-oriented frame results belong in:
- The app application core (owns the frame boundary), and
- `Novolis.Simulation.*` (clock, systems, world, replay, platform intents/cameras).
Physics is a callee. A Simulation system or app domain step may invoke Novolis.Physics.* with a physical dt. Physics never owns the HexGame frame or simulation-world tick ordering.
Name trap: Novolis.Physics.Motion.SimulationPipeline is an integrator + force-model pipeline, not simulation orchestration. Do not grow game-loop or tick APIs there. Prefer FixedStepAccumulator only under a Simulation/app tick owner.
Composition
Input adapter (Raylib / Silk / bot / replay)
→ commands / intents
App IGameApplication-shaped core (Start / Tick / Save / Load)
→ advances Novolis.Simulation (clock / systems / world)
→ optional Novolis.Physics (physical evolution inside a system)
→ snapshot + events + effects
Presenters / hosts (Raylib, Rendering, Avalonia) execute effects and present| Concern | Location |
|---|---|
| Domain + Start/Tick/Save/Load | App project |
| Authoritative world / systems / clock / replay | `Novolis.Simulation.*` |
| Physical laws if needed | `Novolis.Physics.*` — called from Simulation systems or domain step |
| Keys → intents | Host input adapter → `Simulation.View` intents (or future `Game.Intent`) |
| Window host loop (non-authoritative) | `Novolis.Raylib.Hosting` / Silk TwoD game host |
| Present snapshot | App presenter → Raylib / Rendering |
| Headless tests | App tests → application core → Simulation (+ Physics only if domain uses it) |
| Lobby / identity / packaging | `Novolis.Game.*` |
| Launcher shell | `Novolis.Avalonia.*` when needed |
Package map (existing homes)
| HexGame-shaped idea | Novolis home |
|---|---|
| Tick / systems / world | `Novolis.Simulation.Abstractions`, `SimulationClock`, facets |
| Replay / determinism harness | `Novolis.Simulation.Replay` |
| Cameras / `MoveIntent` / `LookIntent` | `Novolis.Simulation.View` |
| Physical integration / collision | `Novolis.Physics.*` (callee) |
| Local graphical host phases | `Novolis.Raylib.Hosting` |
| Presentation adapters | `Novolis.Rendering.*` + app presenters |
| Editor save points | `Novolis.Snapshots.*` / workspaces — **not** sim step replay |
| NL / tool parse → queue | `Novolis.Commands.*` — **not** the game tick inbox |
| Identity / lobbies | `Novolis.Game.Identity.*`, `Novolis.Game.Multiplayer.*` |
| Tick leadership / rate limits | `Novolis.Messaging.Coordination.*` |
Do not add PackageReference to HexGame.Abstractions, HexGame.Hosting, or HexGame.Testing as platform foundation. Apps may study the external contracts; Novolis ships its own seams.
Deferred (exit criteria)
| Candidate | Home if extracted | When |
|---|---|---|
| `Novolis.Game.Intent` | `novolis-gaming` (BCL-only; no Simulation/Raylib/Physics refs) | 2–3 apps share the same player-command envelope |
| Shared frame request/result DTOs | `Novolis.Simulation.Abstractions` or stay app-local | Same convergence; never under Physics |
| Presentation `FrameSnapshots` facet | `novolis-simulation` | Multiple sims share a presenter-oriented shape; Replay already covers step records |
| Authoritative host glue | App + Multiplayer / Messaging | Product need; server advances app core → Simulation |
Never grow HexGame-style orchestration under Physics.
Conformance checklist
Use in dogfood / PR review for HexGame-aligned games:
- [ ] Engine / GPU objects are projections, not authoritative save state
- [ ] App Tick advances Simulation (same core path local and multiplayer-ready hosts aim for)
- [ ] Physics is not the tick owner; no game command inbox in Physics
- [ ] No
HexGame.*PackageReference in platform library csproj files - [ ] No new GameKit /
Novolis.HexGame.*umbrella package - [ ]
novolis-gamingpackages do not reference Simulation or Raylib - [ ] Headless tests can exercise the application core without a renderer when logic is under test
- [ ]
Novolis.Commands.*is not used as a substitute for player tick commands unless intentional
Related
- library-boundaries.md
- simulation-layer-policy.md
- gaming-layer-policy.md
- gameengine-reference-policy.md — Frank.GameEngine mining (distinct from HexGame)
- HexGame repository