| {ROW_LABELS[i]} | - {row.map((id, j) => ( -
-
- |
- ))}
-
| {ROW_LABELS[i]} | + {row.map((id, j) => ( +
+
+ |
+ ))}
+
- )}
-
+ )}
+ {error}
} - {sendouError &&{sendouError}
} -No detections yet.
} - {feed.map((e) => ( -{error}
} + {sendouError &&{sendouError}
} +No detections yet.
} + {feed.map((e) => ( +
- ) : (
-
- ?
-
- ),
- )}
- >
- );
+ return (
+ <>
+ {abilities.map((id, i) =>
+ id ? (
+
+ ) : (
+
+ ?
+
+ ),
+ )}
+ >
+ );
}
-function PlayerRow({ label, player }: { label: string; player: MinimapTeammate | MinimapEnemy }) {
- return (
-
- ) : (
- "?"
- )}
-
+ ) : (
+ "?"
+ )}
+
-
- {p.weaponId !== null && (
-
- )}
- {abilities?.has(offset + i) && (
- |
- {p.name || "?"} | -{p.paint ?? "?"}p | -- {p.ka ?? "?"}/{p.d ?? "?"}/{p.s ?? "?"} - | -
+
+ {p.weaponId !== null && (
+
+ )}
+ {abilities?.has(offset + i) && (
+ |
+ {p.name || "?"} | +{p.paint ?? "?"}p | ++ {p.ka ?? "?"}/{p.d ?? "?"}/{p.s ?? "?"} + | +
- )}
-
+ )}
+ {error}
} + return ( +{error}
} -- {" "} - -
- )} + {frame && !busy && ( ++ {" "} + +
+ )} - {Object.values(results).map((result) => ( -- {result.detector} gate: {result.gate.pass ? "fired" : "no fire"} (score{" "} - {result.gate.score.toFixed(3)}) - {result.events[0] && result.detector === "death" && ( - <> - {" · "}confidence {((result.events[0].confidence ?? 0) * 100).toFixed(1)}%{" · "} - {(() => { - const data = result.events[0].data as DeathData; - return `splatted by ${weaponLabel(data.weaponType, data.weaponId) ?? "?"} (${data.name ?? "?"})`; - })()} - > - )} - {result.events[0] && result.detector === "map-start" && ( - <> - {" · "}confidence {((result.events[0].confidence ?? 0) * 100).toFixed(1)}%{" · "} - {(() => { - const data = result.events[0].data as MapStartData; - return `${modeLabel(data.mode) ?? "?"} · ${stageLabel(data.stage) ?? "?"}`; - })()} - > - )} - {result.events[0] && result.detector === "scoreboard-own" && ( - <> - {" · "}confidence {((result.events[0].confidence ?? 0) * 100).toFixed(1)}%{" · "} - {(() => { - const data = result.events[0].data as ScoreboardOwnData; - return `${[lobbyLabel(data.lobby), modeLabel(data.mode), stageLabel(data.stage)].map((v) => v ?? "?").join(" · ")} · ${mainWeaponLabel(data.weaponId) ?? "?"}`; - })()} - > - )} - {result.events[0] && result.detector === "minimap" && ( - <> - {" · "}confidence {((result.events[0].confidence ?? 0) * 100).toFixed(1)}%{" · "} - {(() => { - const data = result.events[0].data as MinimapData; - const players = data.teammates.map((p) => p.name ?? "?").join(", "); - return `${data.stage ?? "?"} · ${players}`; - })()} - > - )} - {result.events[0] && - result.detector !== "death" && - result.detector !== "map-start" && - result.detector !== "scoreboard-own" && - result.detector !== "minimap" && ( - <> - {" · "}confidence {((result.events[0].confidence ?? 0) * 100).toFixed(1)}% · scores{" "} - {JSON.stringify((result.events[0].data as CardData).scores)} - {" · "} - {(() => { - const data = result.events[0].data as CardData; - return [lobbyLabel(data.lobby), modeLabel(data.mode), stageLabel(data.stage)] - .map((v) => v ?? "?") - .join(" · "); - })()} - > - )} -
- ))} + {Object.values(results).map((result) => ( ++ {result.detector} gate:{" "} + {result.gate.pass ? "fired" : "no fire"} (score{" "} + {result.gate.score.toFixed(3)}) + {result.events[0] && result.detector === "death" && ( + <> + {" · "}confidence{" "} + {((result.events[0].confidence ?? 0) * 100).toFixed(1)}%{" · "} + {(() => { + const data = result.events[0].data as DeathData; + return `splatted by ${weaponLabel(data.weaponType, data.weaponId) ?? "?"} (${data.name ?? "?"})`; + })()} + > + )} + {result.events[0] && result.detector === "map-start" && ( + <> + {" · "}confidence{" "} + {((result.events[0].confidence ?? 0) * 100).toFixed(1)}%{" · "} + {(() => { + const data = result.events[0].data as MapStartData; + return `${modeLabel(data.mode) ?? "?"} · ${stageLabel(data.stage) ?? "?"}`; + })()} + > + )} + {result.events[0] && result.detector === "scoreboard-own" && ( + <> + {" · "}confidence{" "} + {((result.events[0].confidence ?? 0) * 100).toFixed(1)}%{" · "} + {(() => { + const data = result.events[0].data as ScoreboardOwnData; + return `${[lobbyLabel(data.lobby), modeLabel(data.mode), stageLabel(data.stage)].map((v) => v ?? "?").join(" · ")} · ${mainWeaponLabel(data.weaponId) ?? "?"}`; + })()} + > + )} + {result.events[0] && result.detector === "minimap" && ( + <> + {" · "}confidence{" "} + {((result.events[0].confidence ?? 0) * 100).toFixed(1)}%{" · "} + {(() => { + const data = result.events[0].data as MinimapData; + const players = data.teammates + .map((p) => p.name ?? "?") + .join(", "); + return `${data.stage ?? "?"} · ${players}`; + })()} + > + )} + {result.events[0] && + result.detector !== "death" && + result.detector !== "map-start" && + result.detector !== "scoreboard-own" && + result.detector !== "minimap" && ( + <> + {" · "}confidence{" "} + {((result.events[0].confidence ?? 0) * 100).toFixed(1)}% · + scores{" "} + {JSON.stringify((result.events[0].data as CardData).scores)} + {" · "} + {(() => { + const data = result.events[0].data as CardData; + return [ + lobbyLabel(data.lobby), + modeLabel(data.mode), + stageLabel(data.stage), + ] + .map((v) => v ?? "?") + .join(" · "); + })()} + > + )} +
+ ))} - {frame && event && isReplay && ( -
- timestamp {event.data.timestamp ?? "?"}
- {" · "}code {event.data.replayCode ?? "?"}{" "}
- (raw: {String(event.debug?.codeRaw ?? "")})
- {" · "}match scores {JSON.stringify(event.data.matchScores)}
- {" · "}winner panel {winnerSide}
-
-
+ timestamp {event.data.timestamp ?? "?"}
+ {" · "}code {event.data.replayCode ?? "?"}{" "}
+
+ (raw: {String(event.debug?.codeRaw ?? "")})
+
+ {" · "}match scores {JSON.stringify(event.data.matchScores)}
+ {" · "}winner panel {winnerSide}
+
+
- {(() => {
- const data = event.data as unknown as DeathData;
- return (
- <>
- weapon {weaponLabel(data.weaponType, data.weaponId) ?? "?"}{" "}
- (raw: {String(event.debug?.weaponRaw ?? "")})
- {" · "}name {data.name ?? "?"}{" "}
- (raw: {String(event.debug?.nameRaw ?? "")})
- {" · "}abilities {data.abilities.map((row) => row.join(" ")).join(" | ")}
-
-
+ {(() => {
+ const data = event.data as unknown as DeathData;
+ return (
+ <>
+ weapon{" "}
+ {weaponLabel(data.weaponType, data.weaponId) ?? "?"}{" "}
+
+ (raw: {String(event.debug?.weaponRaw ?? "")})
+
+ {" · "}name {data.name ?? "?"}{" "}
+
+ (raw: {String(event.debug?.nameRaw ?? "")})
+
+ {" · "}abilities{" "}
+ {data.abilities.map((row) => row.join(" ")).join(" | ")}
+
+
- {(() => {
- const data = event.data as unknown as MapStartData;
- return (
- <>
- mode {modeLabel(data.mode) ?? "?"}{" "}
- (raw: {String(event.debug?.modeReading ?? "")})
- {" · "}stage {stageLabel(data.stage) ?? "?"}{" "}
- (raw: {String(event.debug?.stageReading ?? "")})
-
-
+ {(() => {
+ const data = event.data as unknown as MapStartData;
+ return (
+ <>
+ mode {modeLabel(data.mode) ?? "?"}{" "}
+
+ (raw: {String(event.debug?.modeReading ?? "")})
+
+ {" · "}stage {stageLabel(data.stage) ?? "?"}{" "}
+
+ (raw: {String(event.debug?.stageReading ?? "")})
+
+
+
- {(() => {
- const data = event.data as unknown as ScoreboardOwnData;
- return (
- <>
- weapon {mainWeaponLabel(data.weaponId) ?? "?"}{" "}
- (raw: {String(event.debug?.weaponReading ?? "")})
- {" · "}abilities {data.abilities.map((row) => row.join(" ")).join(" | ")}
-
-
+ {(() => {
+ const data = event.data as unknown as ScoreboardOwnData;
+ return (
+ <>
+ weapon {mainWeaponLabel(data.weaponId) ?? "?"}{" "}
+
+ (raw: {String(event.debug?.weaponReading ?? "")})
+
+ {" · "}abilities{" "}
+ {data.abilities.map((row) => row.join(" ")).join(" | ")}
+
+
| row | -weapon crop | -top candidates | -name | -paint | -stats (splats / deaths / specials) | -
|---|---|---|---|---|---|
| {i} | -
- |
-
-
- {dbg?.weapon?.top.map((c) => (
-
-
-
- {c.id}
- {c.score.toFixed(3)}
-
- ))}
- |
-
- |
-
- |
-
-
- {([0, 1, 2] as const).map((s) => (
-
-
- |
-
| row | +weapon crop | +top candidates | +name | +paint | +stats (splats / deaths / specials) | +
|---|---|---|---|---|---|
| {i} | +
+ |
+
+
+ {dbg?.weapon?.top.map((c) => (
+
+
+
+ {c.id}
+ {c.score.toFixed(3)}
+
+ ))}
+ |
+
+ |
+
+ |
+
+
+ {([0, 1, 2] as const).map((s) => (
+
+
+ |
+