contact-and-ceremony: one frame of a touch says who struck whom, and the umpire stops repeating himself
The broadcast holds its side-on framing for every frame the two are fencing -
contactPct is 0 through all of state == fence and fencerFramePct never leaves
39.28781 there - and takes the umpire's own stop to make contact readable. For
the length of that stop the station swings 19 deg off the piste axis toward the
fencer who took the touch, cranes 0.22 m, closes to a distance solved from the
pair's own span, and holds 0.42 s past the stop. Every dial is a fraction or an
offset of the shot's own dials, because scene.json carries an authored
PisteCamera prop block and a station fixed in metres is a different shot in
every scene that loads. Over 120 samples of live play: fencerFramePct mean
40.575 (min 39.288) and lawnBelowPct mean 14.685, against 39.29 / 15.80.
A landed stroke leaves the panel's whitewash in the air for the length of the
hold, and the shape it leaves is which stroke it was: a thrust one level line,
a lunge a long low one off the back foot, a sweep a falling quarter circle, a
riposte the crossed guard and the answer out of it. It runs from the striker to
the struck, so which way the blow went is in the picture. Beside it,
contactHold pins recoil, spin, lean, overreach and jam at the values the blow
gave them, because a reaction that decays in 0.3 s is gone inside one frame of
this build.
The post is driven rather than moved: the surveyor's cord walks from where the
line stood to where it now runs, carrying a post held clear of the turf, and
three mallet blows seat it flush with the boundary's own post.
Fifteen new umpire calls through a new Fx.call, which writes a call as a list
of syllables rather than a stack of primitives. Each ceremony beat draws from
its own bag, narrowed by the bout: the score only when it is level, the last
post only when one post ends the assize, arret and touche only on a ground that
stands on form. Over one full bout of 67 lines the largest share is 13.4 %.
The bell counts one strike to open and three to close, both men breathe in the
pause, and each of the six neighbours has their own throat.
Measured: two KeyR-driven bouts to a verdict, engine.timeScale sampled 891 and
101 times, badRecovery 0 in both and max 1.0; busProduced - busTaken 0 on the
second. DuelFx 0.60 -> 0.91 ms and PisteCamera 0.23 -> 0.30 ms, medians of
eight samples each under the same load.