base: playable loop — the Hedgerow Assizes fence duel end to end
Scene, both fencers, controls, camera, core loop and win/lose. Placeholder
primitives and untuned numbers throughout.
- duel.module — the rules in one file: ground plan, frame data for thrust /
sweep / parry, the triangle (resolveTouch), and the placeholder palette.
- Fencer.component — one combatant: builds its own primitive body, footwork
locked to the piste, windup/active/recover state machine. The panel's pose per
phase is the tell. role=player reads input; role=rival is driven by FencerAI
through the same methods.
- FencerAI.component — the neighbour: closes the measure, reads a wind-up after
a reaction delay it cannot beat on a thrust, holds guard, takes its riposte.
- DuelMatch.component — the umpire: builds the garden and the boundary fence,
spawns the rival, resolves exchanges, plants a post, drives the line into the
loser's garden, runs the salute, calls the match at either hedge.
- DuelHud.component — the umpire's card.
- PisteCamera.component — the locked side-on broadcast view, on the
PlayerPrototype's CameraRig.
- fencing_controls.inputMap — A/D footwork on the canonical move axis, J thrust,
K sweep, L/Space parry, with touch buttons synthesised.
The fence runs ALONG the piste and its leading post IS the property line, so the
health bar is a physical fence growing across the lawn and the won ground
brightens behind it.
Validated in a running engine: two full matches to a player win driven with
synthetic input, both terminal branches (player and rival) reached, parry into
riposte into touch observed in play, clear-and-reload rebuilds the whole arena,
scene.json holds exactly 11 entities, zero component errors.
---
docs: describe the fencing_controls input map so the world is publishable