Improve special detection

This commit is contained in:
Kalle
2026-09-21 18:15:52 +03:00
parent 0ae52a9a2b
commit 0c0598d4bc
16 changed files with 224 additions and 38 deletions

View File

@@ -245,13 +245,18 @@ sequenceDiagram
broadcasts can hide the badges while keeping their geometry, so a
badge-less frame scores the geometries on how decisively the bodies
read and sticks with the established layout unless another wins
clearly — the special-ready wash also pulses, so its dim trough is told
clearly, or unless the slot comb — which is positional, so it sees a
pitch the body reads cannot — puts narrow-right decisively ahead of a
latched `even`, as happens when a spectator toggles between the
overhead map and a player POV mid-match — the special-ready wash also pulses, so its dim trough is told
apart from a splat by its team tint: a splat is a neutral grey plate under
a grey X, which a blown-out backdrop turns near-white while a wash stays
tinted at every pulse phase, and a narrow-layout ready read
must also see a washed (ink-poor) body: pale backdrop or the lead
banner leaking past an icon edge fakes the shoulder glow on the
overhead map view's badge-less strip), with
tinted at every pulse phase, and a ready read
must also see a washed (ink-poor) body: pale backdrop, a ship's hull or
the lead banner leaking past an icon edge fakes the shoulder glow, and a ready the shoulder glow does
not corroborate needs the body's ink gone rather than merely paled,
since a near-white weapon render (S-BLAST '91) pales a live body
without emptying it), with
the same `time` value so the two reads pair downstream; its fixtures
live under `tests/fixtures/player-status/`. Within a side the strip's
slot order is the lobby seating, while the results scoreboard re-sorts

View File

@@ -10,9 +10,14 @@
* S3 POV draws it too) and "narrow-left" (right column nearly coincides with
* even's). Camera badges prove a broadcast, but broadcasts can hide them, so a
* badge-less frame picks the geometry reading more decisively, with a slot-comb
* win proving narrow-left and a history-less near-tie staying narrow-right
* (pickLayout). On narrow layouts only the unsaturated glow counts toward ready
* so saturated backdrop leaks cannot fake or suppress a state.
* win proving narrow-left or unseating a latched even, and a history-less
* near-tie staying narrow-right (pickLayout). Only the unsaturated glow counts
* toward ready — saturated backdrop leaks and bright team ink alike must not
* fake a state — and a ready read the shoulder does not corroborate needs a
* body the wash has emptied of ink, not merely paled (a near-white weapon
* render pales one without the other). Every layout also demands a washed
* (ink-poor, pale) body, since backdrop leaking past an icon edge fakes the
* shoulder glow.
*/
import type { Mat } from "../../cv";
import { copyRoi, type Roi } from "../../image";
@@ -32,6 +37,8 @@ import {
STATUS_DPAD_PROBES_EVEN,
STATUS_DPAD_PROBES_NARROW_LEFT,
STATUS_DPAD_PROBES_NARROW_RIGHT,
STATUS_EVEN_FLIP_COMB_LEAD,
STATUS_EVEN_FLIP_COMB_MIN,
STATUS_FRESH_EVEN_MIN_LEAD,
STATUS_FRESH_NARROW_LEFT_MIN_LEFT_LEAD,
STATUS_FRESH_NARROW_LEFT_RIVAL_COMB_VETO,
@@ -51,6 +58,7 @@ import {
STATUS_READY_MIN_BODY_PALE,
STATUS_READY_MIN_SHOULDER_GLOW,
STATUS_READY_MIN_WASH_BODY_PALE,
STATUS_READY_PALE_ONLY_MAX_BODY_INK,
STATUS_READY_WASH_MAX_BODY_INK,
STATUS_SHOULDER_BOX_EVEN,
STATUS_SHOULDER_BOX_NARROW,
@@ -239,10 +247,15 @@ const SCORED_FLIPS: Record<PlayerStatusLayout, readonly PlayerStatusLayout[]> =
* reads mid-range ink. Featureless dark backdrop still reads "decisively dead",
* so the sticky margin stops one noisy frame flipping an established layout and
* SCORED_FLIPS keeps the even/narrow-left false friends from trading places.
* Three decisions decisiveness cannot make alone:
* Four decisions decisiveness cannot make alone:
* - badge-less narrow-left (sendou-triton VoD) scores below narrow-right even
* when true, so a decisive slot-comb win (combContrast) overrides all but
* badges — positional, so only the differing left columns can lead;
* - a spectator toggling between the overhead map and a player POV swaps even
* for narrow-right mid-match, and even's columns sit between the narrow ones,
* so the two score within 0.001 of each other and the wrong pick sticks for a
* whole match; the comb sees the pitch and flips even outright
* (STATUS_EVEN_FLIP_COMB_*), fresh or sticky;
* - a history-less even-vs-narrow-right near-tie stays narrow-right unless it
* reads under the floor or even leads decisively (STATUS_FRESH_*);
* - badge-less narrow-left POV over pale backdrops (2026-08-22 Sendou VoD)
@@ -290,6 +303,9 @@ function pickLayout(
) {
return { layout: "narrow-left", scores };
}
const combFlipsEven =
combs["narrow-right"] >= STATUS_EVEN_FLIP_COMB_MIN &&
combs["narrow-right"] >= combs.even + STATUS_EVEN_FLIP_COMB_LEAD;
if (prevLayout) {
// flips away from narrow-right also need comb corroboration: on S3 POV the
// strip shrinks toward the timer while the POV player is dead, spiking the
@@ -305,6 +321,8 @@ function pickLayout(
challengers.length > 0
? challengers.reduce((a, b) => (scores[b] > scores[a] ? b : a))
: null;
if (prevLayout === "even" && combFlipsEven)
return { layout: "narrow-right", scores };
return {
layout:
challenger !== null &&
@@ -332,7 +350,10 @@ function pickLayout(
return { layout: "narrow-right", scores };
}
return {
layout: scores.even >= scores["narrow-right"] ? "even" : "narrow-right",
layout:
scores.even >= scores["narrow-right"] && !combFlipsEven
? "even"
: "narrow-right",
scores,
};
}
@@ -357,12 +378,16 @@ function sideDecisiveness(reads: SlotRead[]): number {
* splat or a wash, and its tint tells them apart: the wash is a pale team tint
* at every pulse phase while the splat is neutral grey — even when a blown-out
* backdrop turns the plate near-white, or the trough dims the wash under both
* ready floors. On narrow layouts the wash replaces the body's ink, so an
* ink-heavy body means backdrop leak unless strongly pale too (graded
* STATUS_READY_*WASH* guards), and only unsaturated glow counts
* (STATUS_GLOW_MAX_SPREAD). A pale backdrop can still light a DEAD icon's
* shoulder, so narrow ready reads also need the wash's pale body and the
* narrow dead read trusts the body classes alone.
* ready floors. Only unsaturated glow counts as the wash's
* (STATUS_GLOW_MAX_SPREAD): bright team ink lights the shoulder on its own
* once the ink is light enough (orange clears the glow floor, lime does not).
* The wash also replaces the body's ink, so an ink-heavy body means backdrop
* leak unless strongly pale too (graded STATUS_READY_*WASH* guards). A pale
* backdrop can still light a DEAD icon's shoulder, so a ready read also needs
* the wash's pale body, and the narrow dead read trusts the body classes
* alone. Without the shoulder's corroboration the graded allowances do not
* apply at all: a pale-only ready needs the ink gone (STATUS_READY_PALE_ONLY_MAX_BODY_INK), since a pale body
* over live ink is a weapon render, not a wash.
*/
function classifySlot(
bodyInk: number,
@@ -372,7 +397,8 @@ function classifySlot(
shoulderPaleGlow: number,
layout: PlayerStatusLayout,
): SlotRead {
const washGlow = layout === "even" ? shoulderGlow : shoulderPaleGlow;
// the wash glows pale on every layout; raw brightness is team ink or backdrop
const washGlow = shoulderPaleGlow;
const inkPoor = bodyInk <= STATUS_DEAD_MAX_BODY_INK;
const tinted = bodyTint >= STATUS_WASH_MIN_BODY_TINT;
const dead =
@@ -383,13 +409,15 @@ function classifySlot(
bodyInk <= STATUS_READY_CLEAN_WASH_MAX_BODY_INK ||
(bodyInk <= STATUS_READY_WASH_MAX_BODY_INK &&
bodyPale >= STATUS_READY_INKY_WASH_MIN_BODY_PALE);
const paleEmptiedBody =
bodyPale >= STATUS_READY_MIN_BODY_PALE &&
bodyInk <= STATUS_READY_PALE_ONLY_MAX_BODY_INK;
const special =
!dead &&
((inkPoor && tinted) ||
((washGlow >= STATUS_READY_MIN_SHOULDER_GLOW ||
bodyPale >= STATUS_READY_MIN_BODY_PALE) &&
(layout === "even" ||
(washedBody && bodyPale >= STATUS_READY_MIN_WASH_BODY_PALE))));
((washGlow >= STATUS_READY_MIN_SHOULDER_GLOW || paleEmptiedBody) &&
washedBody &&
bodyPale >= STATUS_READY_MIN_WASH_BODY_PALE));
const confidence = dead
? Math.min(
1,

View File

@@ -174,10 +174,14 @@ export const STATUS_INK_MIN_VALUE = 105;
export const STATUS_GLOW_MIN_VALUE = 225;
/**
* Narrow-layout glow must be UNSATURATED: the wash is pale while backdrop leak
* is colored (sky over a dead shoulder: 0.30 raw, 0.00 capped, spread >130;
* lilac/pink washes spread 70-90, capped 0.46-0.61). Even ready icons light IN
* team color (glow 0.94 saturated), so narrow layouts only.
* Ready glow must be UNSATURATED on every layout: the wash is pale while
* backdrop leak is colored (sky over a dead shoulder: 0.30 raw, 0.00 capped,
* spread >130; lilac/pink washes spread 70-90, capped 0.46-0.61). Even was
* exempt on the belief that its ready icons light in team color, but all seven
* attested even-layout washes glow unsaturated too (saturated fraction <=0.02),
* and taking raw brightness there starred a live ORANGE body whose ink clears
* the 225 floor unaided (Manta Maria scrim VoD: glow 0.48 at body ink 0.81).
* The 225 floor was set against lime, which peaks just under it.
*/
export const STATUS_GLOW_MAX_SPREAD = 90;
@@ -226,25 +230,44 @@ export const STATUS_READY_MIN_SHOULDER_GLOW = 0.25;
*/
export const STATUS_READY_MIN_BODY_PALE = 0.3;
/**
* ...and only on a body the wash has emptied of ink. Pale alone cannot carry a
* ready read: a near-white weapon render (S-BLAST '91, Museum d'Alfonsino
* scrim VoD) pales a live body to 0.33-0.44 without touching its ink, which
* charted two whole matches as one unbroken special-ready band. Body ink over
* that footage splits cleanly — 272 dense reads of the slot land at 0.01-0.09
* washed and 0.25-0.47 alive, nothing in between — and every attested wash
* reaching ready off the pale body alone reads <=0.18. The graded
* STATUS_READY_*WASH* allowances above stay wider because they only ever apply
* to washes the shoulder glow corroborates (attested inky washes 0.30-0.40 all
* glow >=0.27, though the triton one clears the glow floor by only 0.03 — if
* footage ever drops it under, that wash needs this branch and would be lost).
*/
export const STATUS_READY_PALE_ONLY_MAX_BODY_INK = 0.22;
/**
* Narrow-layout ready guard: the wash REPLACES body ink, so an ink-heavy body
* means backdrop leak (the overhead view's left column sits ~12px off, sliding
* probes onto pale buildings / the lead banner: ink >=0.44). Graded: clean
* washes ink <=0.303 (SWS26 pale pink on orange; nearest alive 0.33 has no
* wash signal); inky washes (0.316/0.344) still read strongly pale
* (>=0.399) while the Um'ami POV leak read ink 0.36 / pale 0.269. Even ready
* icons light IN team color (ink up to 0.68), so narrow only. Margins are THIN
* (ink 0.303 vs 0.32, 0.344 vs 0.4; pale 0.399 vs 0.35) — re-measure before moving any.
* wash signal); inky washes (0.316-0.41) still read strongly pale (>=0.36)
* while the Um'ami POV leak read ink 0.36 / pale 0.269. The ceiling sits above
* the pink pulse phase of a pale-pink wash on orange (Manta Maria scrim VoD:
* ink 0.41 at pale 0.36, glow 0.43), which the pitch fix brought under these
* guards; the nearest leak that also reads pale is 0.45. Even reads them too:
* its inkiest attested wash is 0.403 at pale 0.37, with a colored weapon
* render still in the box. Margins are THIN (ink 0.303 vs 0.32, 0.403/0.41 vs
* 0.42 vs 0.45; pale 0.36 vs 0.35) — re-measure before moving any.
*/
export const STATUS_READY_WASH_MAX_BODY_INK = 0.4;
export const STATUS_READY_WASH_MAX_BODY_INK = 0.42;
export const STATUS_READY_CLEAN_WASH_MAX_BODY_INK = 0.32;
export const STATUS_READY_INKY_WASH_MIN_BODY_PALE = 0.35;
/**
* Narrow ready reads also need a minimally pale body: every attested wash reads
* A ready read also needs a minimally pale body: every attested wash reads
* >=0.22 (bright and trough) while a dead icon under skylight leak (2026-08-22
* VoD: shoulder 0.26-0.35) reads pale <=0.15 — a dead body is ink-poor, so the
* ink guards cannot catch it. Even reads skip this.
* ink guards cannot catch it.
*/
export const STATUS_READY_MIN_WASH_BODY_PALE = 0.2;
@@ -261,12 +284,16 @@ export const STATUS_LAYOUT_STICKY_MARGIN = 0.04;
* attested; busy backdrops mis-rank: sendou-triton match-start scores even
* 0.278 / narrow-right 0.273 yet is narrow-right). Even wins only when
* narrow-right reads under the floor (S2 POV fixture 0.198 vs true >=0.212) or
* leads decisively (true narrow-right mis-leads even by at most 0.036). With even
* at the SWS26 pitch, the badge-less AREA CUP trough frame (0.192 vs even 0.224)
* lands on even too, where every slot still reads right.
* leads decisively. Every badge-less frame attested narrow-right hands even a
* lead of at most 0.016 (worst: pov-alfonsino-false-star-at-match-start),
* while the one attested badge-less even frame that clears the floor leads by
* 0.034 (pov-inkblot-even-pitch-read-as-narrow, whose sky backdrop lifts
* narrow-right to 0.239) — the threshold splits that gap. With even at the
* SWS26 pitch, the badge-less AREA CUP trough frame (0.192 vs even 0.224)
* lands on even through the floor instead, where every slot still reads right.
*/
export const STATUS_FRESH_NARROW_RIGHT_MIN_DECISIVENESS = 0.21;
export const STATUS_FRESH_EVEN_MIN_LEAD = 0.05;
export const STATUS_FRESH_EVEN_MIN_LEAD = 0.025;
/**
* Fresh badge-less NARROW-LEFT pick (pickLayout): S3 POV draws it in steady
@@ -310,6 +337,19 @@ export const STATUS_NARROW_LEFT_COMB_LEAD = 0.25;
*/
export const STATUS_STICKY_FLIP_COMB_MIN = 0.3;
/**
* Even loses to narrow-right on the comb alone (past this floor AND leading by
* this much), no score margin needed: a spectator toggling between the overhead
* map and a player POV swaps the two geometries mid-match, and even's columns
* sit between the narrow ones, so the mispicked geometry still scores within
* 0.001 of the right one (Manta Maria scrim VoD locked even for a whole match,
* starring the outer right slot 39% of its reads). True narrow-right stretches
* combed 0.27-0.78 over that footage, leading even by 0.29-0.45; the widest
* false lead on genuinely even footage is 0.15 (pov-wahoo-world-special-dead).
*/
export const STATUS_EVEN_FLIP_COMB_MIN = 0.3;
export const STATUS_EVEN_FLIP_COMB_LEAD = 0.25;
/** Layout carries forward only across reads this close (~1s apart in-match); longer means a new match. */
export const STATUS_LAYOUT_STICKY_MAX_GAP_S = 30;

View File

@@ -13,7 +13,6 @@
]
},
"options": {
"skipFields": ["special.0.1"],
"notes": "sendou-triton VoD (MakoMart, match 6) spectator HUD at 4:27 (t=2576). All eight players are alive — no icon is crossed out — yet the live scan read left slot0 as splatted (✕··· @ 0.967), one of the +2 phantom deaths the audit charges against this row; the icon sits over the dark rafters of the ceiling backdrop, which starves the body probe of team ink. Reads two seconds later flap ✕ between slots 0, 2 and 3 on the same all-alive strip. special.0.1 is skipped: slot1's body reads pale under its white Splattershot silhouette and the wash-vs-weapon boundary is unclear from the frame alone. Layout corrected from the live scan's 'cast': the icon apexes measure [603,680,754,828|1086,1180,1278,1366] — the badge-less MIRROR arrangement's pitches (left 76, right 97), not cast's — which is why cast geometry read slot0's boxes off the icon (true center 605, cast center 543); under mirror geometry every slot reads its labeled state."
"notes": "sendou-triton VoD (MakoMart, match 6) spectator HUD at 4:27 (t=2576). All eight players are alive — no icon is crossed out — yet the live scan read left slot0 as splatted (✕··· @ 0.967), one of the +2 phantom deaths the audit charges against this row; the icon sits over the dark rafters of the ceiling backdrop, which starves the body probe of team ink. Reads two seconds later flap ✕ between slots 0, 2 and 3 on the same all-alive strip. special.0.1 was skipped as unresolvable — slot1's body reads pale under its white Splattershot silhouette — and is now labelled true off the icon APEX, the one part of the icon no weapon render reaches: within this frame slot1's apex reads ink 0.01 / pale 0.96 against 0.79-1.00 ink and 0.00 pale on its three teammates, and it is plainly pale cream beside their saturated orange. The body probe cannot see this because at the 76px narrow-left pitch its 80px width overlaps both neighbours, lending slot1 their ink (0.32). The read survives on shoulder glow (0.28) rather than the body, which is why the pale-only branch's ink ceiling (STATUS_READY_PALE_ONLY_MAX_BODY_INK) does not cost it. Layout corrected from the live scan's 'cast': the icon apexes measure [603,680,754,828|1086,1180,1278,1366] — the badge-less MIRROR arrangement's pitches (left 76, right 97), not cast's — which is why cast geometry read slot0's boxes off the icon (true center 605, cast center 543); under mirror geometry every slot reads its labeled state."
}
}

View File

@@ -0,0 +1,19 @@
{
"event": "PlayerStatus",
"data": {
"layout": "narrow-right",
"cast": null,
"time": 300,
"special": [
[false, false, false, false],
[false, false, false, false]
],
"dead": [
[false, false, false, false],
[false, false, false, false]
]
},
"options": {
"notes": "Same VoD at the opening whistle (t=1066, clock 5:00): all eight alive and saturated, and nobody can hold a special yet — the strongest possible ground truth for a no-star frame. Holds the pale side of the pale-only ready guard: left slot 2's S-BLAST '91 render pales the body to 0.41 here while its ink stays at 0.33. Pale cannot separate the states at all — over 272 dense reads of that slot it runs 0.30-0.44 alive against 0.55-0.61 washed, overlapping the 0.30 ready floor throughout — so only the ink does (0.25-0.47 alive vs 0.01-0.09 washed, nothing between; 0.18 is the top of any attested pale-only wash). Shoulder ink does not separate them: 0.47 here against 0.83 at pov-alfonsino-sblast-render-read-as-ready, overlapping the 0.34 of a true wash."
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@@ -0,0 +1,19 @@
{
"event": "PlayerStatus",
"data": {
"layout": "narrow-right",
"cast": null,
"time": 198,
"special": [
[false, false, true, false],
[false, false, false, false]
],
"dead": [
[false, false, false, false],
[false, false, false, false]
]
},
"options": {
"notes": "Same VoD 26s later (t=1171.5, clock 3:18): left slot 2's S-BLAST '91 really is charged — the whole icon turns pale cream while its neighbours stay saturated orange, and the wash is spent within three seconds. Positive control for pov-alfonsino-sblast-render-read-as-ready: the white weapon render is drawn here too, but the wash has emptied the body of ink (0.10 against 0.39 alive) as well as paling it (0.60), which is what separates the two. All eight alive."
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@@ -0,0 +1,19 @@
{
"event": "PlayerStatus",
"data": {
"layout": "narrow-right",
"cast": null,
"time": 224,
"special": [
[false, false, false, false],
[false, false, false, false]
],
"dead": [
[false, false, false, false],
[false, false, true, false]
]
},
"options": {
"notes": "Private-battle spectator camera, Museum d'Alfonsino SZ at 3:44 (Top Level Scrim VoD 2tE_iIUDSio, t=1145). Badge-less narrow-right geometry. Left slot 2 is Mongering's S-BLAST '91 (the small purple 91 under the icon is part of that weapon's art, not a gauge — the player-switch banner at t=838 ties the same render and badge to Mongering): its render is a big near-white silhouette covering most of the body box, so bodyPale reached 0.37 while the body kept 0.39 team ink, and a pale body alone was enough to read ready — the whole match charted as one unbroken special-ready band on that row. Every left body is saturated orange (alive, none washed); right slot 2 is splatted (grey X on a neutral plate). A real wash empties the ink it pales (0.06-0.10 on this same slot, see pov-alfonsino-splash-real-ready-wash), so a ready read the shoulder glow does not corroborate now needs an ink-poor body."
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@@ -0,0 +1,19 @@
{
"event": "PlayerStatus",
"data": {
"layout": "even",
"cast": null,
"time": 300,
"special": [
[false, false, false, false],
[false, false, false, false]
],
"dead": [
[false, false, false, false],
[false, false, false, false]
]
},
"options": {
"notes": "Private-battle spectator, Inkblot Art Academy SZ at the opening whistle (Top Level Scrim VoD 2tE_iIUDSio, t=14, clock 5:00): all eight bodies saturated purple/orange, nobody splatted, and nobody can hold a special yet. The strip draws even's pitch - right apexes 1086/1172/1262/1348 against even's 1090/1178/1267/1355 - but a fresh badge-less frame prefers narrow-right unless even leads decisively, and the old 0.05 margin was wider than this frame's 0.034 (even 0.273 vs narrow-right 0.239). Under narrow-right the left column shifts 28px out at slot 0, putting its shoulder box entirely off the strip on bright sky (pale glow 0.93 over a body box that is half sky: ink 0.31, pale 0.37) and slot 2's box 9px off (glow 0.35, ink 0.39, pale 0.41) - both land inside the inky-wash allowance, so the pixels alone cannot refuse them; only the pitch can. Every badge-less frame attested narrow-right hands even at most 0.016, so the margin now sits at 0.025. One read, but the timeline merge stretches it into a 4s band and the match card opened with the S-BLAST '91 and the Splash-o-matic both holding special."
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

@@ -0,0 +1,19 @@
{
"event": "PlayerStatus",
"data": {
"layout": "narrow-right",
"cast": null,
"time": 260,
"special": [
[true, false, false, false],
[false, false, false, false]
],
"dead": [
[false, false, false, false],
[true, false, false, false]
]
},
"options": {
"notes": "Private-battle spectator on Manta Maria SZ, 40s after pov-manta-team-ink-glow-read-as-ready (Top Level Scrim VoD 2tE_iIUDSio, t=822.6, clock 4:20): the spectator has left the overhead map for a player POV, so the strip now draws the narrow-right pitch (left apexes 542/643/744/843, right 1085/1162/1237/1317) where the opening frame drew even's. Left slot 0 holds a cream-pink wash, right slot 0 is crossed out, the rest are saturated. Decisiveness cannot see the pitch change - even scores 0.206 against narrow-right's 0.205 - so the scan kept even for the whole match and starred the outer right slot on 39% of its reads. Under even's centers that slot's body box hangs half off the icon onto the ship's white hull, which reads as an emptied pale body here (ink 0.17 over pale 0.36), so no body guard can catch it; only the pitch can. The comb is positional and does see it (narrow-right 0.42 vs even 0.00), so it now flips even outright (STATUS_EVEN_FLIP_COMB_*). Left slot 0's wash is the pink phase of the pulse, ink 0.41 over pale 0.36, which is why the inky-wash ceiling had to clear 0.41."
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@@ -0,0 +1,19 @@
{
"event": "PlayerStatus",
"data": {
"layout": "even",
"cast": null,
"time": 300,
"special": [
[false, false, false, false],
[false, false, false, false]
],
"dead": [
[false, false, false, false],
[false, false, false, false]
]
},
"options": {
"notes": "Private-battle spectator on the overhead camera, Manta Maria SZ at the opening whistle (Top Level Scrim VoD 2tE_iIUDSio, t=780, clock 5:00): all eight bodies saturated, no cross-out, no wash - and nobody can hold a special yet. The overhead camera draws the even pitch here (apexes 566/654/744/834 left, 1086/1176/1262/1349 right); the POV camera the spectator cuts to 40s later draws narrow-right, see pov-manta-narrow-pitch-read-as-even. Two separate leaks starred this frame. Left slot 3 went through the shoulder probe counting RAW brightness: this team's orange ink clears the 225 glow floor on its own (glow 0.48 at body ink 0.81, pale 0.02), where the floor was calibrated on lime that peaked just under it - every attested ready glows UNSATURATED instead (<=0.02 saturated on all even fixtures), so only the pale glow counts now. Right slot 3 went through even's old exemption from the body guards: the ship's white hull runs right up against the outer icon and the shoulder box, which straddles the icon edge by design, takes 0.26 unsaturated glow off it. The body is the tell - 0.36 ink over 0.35 pale, short of the wash's - and even now reads the same body guards the narrow layouts do."
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB