@tennisvisuals/scoring-visualizations 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/LiveEngine.test.d.ts +2 -0
- package/dist/__tests__/LiveEngine.test.d.ts.map +1 -0
- package/dist/__tests__/LiveEngine.test.js +142 -0
- package/dist/__tests__/LiveEngine.test.js.map +1 -0
- package/dist/__tests__/buildEpisodes.test.d.ts +2 -0
- package/dist/__tests__/buildEpisodes.test.d.ts.map +1 -0
- package/dist/__tests__/buildEpisodes.test.js +150 -0
- package/dist/__tests__/buildEpisodes.test.js.map +1 -0
- package/dist/__tests__/extractors.test.d.ts +2 -0
- package/dist/__tests__/extractors.test.d.ts.map +1 -0
- package/dist/__tests__/extractors.test.js +50 -0
- package/dist/__tests__/extractors.test.js.map +1 -0
- package/dist/__tests__/feedMatchUp.test.d.ts +2 -0
- package/dist/__tests__/feedMatchUp.test.d.ts.map +1 -0
- package/dist/__tests__/feedMatchUp.test.js +96 -0
- package/dist/__tests__/feedMatchUp.test.js.map +1 -0
- package/dist/engine/LiveEngine.d.ts +42 -0
- package/dist/engine/LiveEngine.d.ts.map +1 -0
- package/dist/engine/LiveEngine.js +82 -0
- package/dist/engine/LiveEngine.js.map +1 -0
- package/dist/engine/buildSetMap.d.ts +14 -0
- package/dist/engine/buildSetMap.d.ts.map +1 -0
- package/dist/engine/buildSetMap.js +42 -0
- package/dist/engine/buildSetMap.js.map +1 -0
- package/dist/engine/createPlaybackEngine.d.ts +34 -0
- package/dist/engine/createPlaybackEngine.d.ts.map +1 -0
- package/dist/engine/createPlaybackEngine.js +90 -0
- package/dist/engine/createPlaybackEngine.js.map +1 -0
- package/dist/engine/feedMatchUp.d.ts +82 -0
- package/dist/engine/feedMatchUp.d.ts.map +1 -0
- package/dist/engine/feedMatchUp.js +116 -0
- package/dist/engine/feedMatchUp.js.map +1 -0
- package/dist/episodes/buildEpisodes.d.ts +10 -0
- package/dist/episodes/buildEpisodes.d.ts.map +1 -0
- package/dist/episodes/buildEpisodes.js +166 -0
- package/dist/episodes/buildEpisodes.js.map +1 -0
- package/dist/episodes/types.d.ts +45 -0
- package/dist/episodes/types.d.ts.map +1 -0
- package/dist/episodes/types.js +2 -0
- package/dist/episodes/types.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/statistics/index.d.ts +3 -0
- package/dist/statistics/index.d.ts.map +1 -0
- package/dist/statistics/index.js +2 -0
- package/dist/statistics/index.js.map +1 -0
- package/dist/statistics/matchStatistics.d.ts +22 -0
- package/dist/statistics/matchStatistics.d.ts.map +1 -0
- package/dist/statistics/matchStatistics.js +59 -0
- package/dist/statistics/matchStatistics.js.map +1 -0
- package/dist/visualizations/coronaChart.d.ts +54 -0
- package/dist/visualizations/coronaChart.d.ts.map +1 -0
- package/dist/visualizations/coronaChart.js +254 -0
- package/dist/visualizations/coronaChart.js.map +1 -0
- package/dist/visualizations/data/mcpFixtures.json +13166 -0
- package/dist/visualizations/data/sampleGame.d.ts +37 -0
- package/dist/visualizations/data/sampleGame.d.ts.map +1 -0
- package/dist/visualizations/data/sampleGame.js +521 -0
- package/dist/visualizations/data/sampleGame.js.map +1 -0
- package/dist/visualizations/gameFish.d.ts +16 -0
- package/dist/visualizations/gameFish.d.ts.map +1 -0
- package/dist/visualizations/gameFish.js +692 -0
- package/dist/visualizations/gameFish.js.map +1 -0
- package/dist/visualizations/gameTree.d.ts +17 -0
- package/dist/visualizations/gameTree.d.ts.map +1 -0
- package/dist/visualizations/gameTree.js +837 -0
- package/dist/visualizations/gameTree.js.map +1 -0
- package/dist/visualizations/groupGames.d.ts +6 -0
- package/dist/visualizations/groupGames.d.ts.map +1 -0
- package/dist/visualizations/groupGames.js +35 -0
- package/dist/visualizations/groupGames.js.map +1 -0
- package/dist/visualizations/helpers/JsonViewer.d.ts +27 -0
- package/dist/visualizations/helpers/JsonViewer.d.ts.map +1 -0
- package/dist/visualizations/helpers/JsonViewer.js +276 -0
- package/dist/visualizations/helpers/JsonViewer.js.map +1 -0
- package/dist/visualizations/helpers/PlaybackControls.d.ts +12 -0
- package/dist/visualizations/helpers/PlaybackControls.d.ts.map +1 -0
- package/dist/visualizations/helpers/PlaybackControls.js +98 -0
- package/dist/visualizations/helpers/PlaybackControls.js.map +1 -0
- package/dist/visualizations/horizonChart.d.ts +59 -0
- package/dist/visualizations/horizonChart.d.ts.map +1 -0
- package/dist/visualizations/horizonChart.js +215 -0
- package/dist/visualizations/horizonChart.js.map +1 -0
- package/dist/visualizations/index.d.ts +21 -0
- package/dist/visualizations/index.d.ts.map +1 -0
- package/dist/visualizations/index.js +23 -0
- package/dist/visualizations/index.js.map +1 -0
- package/dist/visualizations/legacyRally.d.ts +3 -0
- package/dist/visualizations/legacyRally.d.ts.map +1 -0
- package/dist/visualizations/legacyRally.js +26 -0
- package/dist/visualizations/legacyRally.js.map +1 -0
- package/dist/visualizations/matchDashboard.d.ts +39 -0
- package/dist/visualizations/matchDashboard.d.ts.map +1 -0
- package/dist/visualizations/matchDashboard.js +235 -0
- package/dist/visualizations/matchDashboard.js.map +1 -0
- package/dist/visualizations/momentumChart.d.ts +12 -0
- package/dist/visualizations/momentumChart.d.ts.map +1 -0
- package/dist/visualizations/momentumChart.js +454 -0
- package/dist/visualizations/momentumChart.js.map +1 -0
- package/dist/visualizations/ptsChart.d.ts +14 -0
- package/dist/visualizations/ptsChart.d.ts.map +1 -0
- package/dist/visualizations/ptsChart.js +925 -0
- package/dist/visualizations/ptsChart.js.map +1 -0
- package/dist/visualizations/ptsHorizon.d.ts +83 -0
- package/dist/visualizations/ptsHorizon.d.ts.map +1 -0
- package/dist/visualizations/ptsHorizon.js +290 -0
- package/dist/visualizations/ptsHorizon.js.map +1 -0
- package/dist/visualizations/rallyTree.d.ts +78 -0
- package/dist/visualizations/rallyTree.d.ts.map +1 -0
- package/dist/visualizations/rallyTree.js +410 -0
- package/dist/visualizations/rallyTree.js.map +1 -0
- package/dist/visualizations/simpleChart.d.ts +6 -0
- package/dist/visualizations/simpleChart.d.ts.map +1 -0
- package/dist/visualizations/simpleChart.js +126 -0
- package/dist/visualizations/simpleChart.js.map +1 -0
- package/dist/visualizations/statView.d.ts +52 -0
- package/dist/visualizations/statView.d.ts.map +1 -0
- package/dist/visualizations/statView.js +200 -0
- package/dist/visualizations/statView.js.map +1 -0
- package/dist/visualizations/typeOf.d.ts +6 -0
- package/dist/visualizations/typeOf.d.ts.map +1 -0
- package/dist/visualizations/typeOf.js +18 -0
- package/dist/visualizations/typeOf.js.map +1 -0
- package/dist/visualizations/types/events.d.ts +92 -0
- package/dist/visualizations/types/events.d.ts.map +1 -0
- package/dist/visualizations/types/events.js +2 -0
- package/dist/visualizations/types/events.js.map +1 -0
- package/dist/visualizations/types/index.d.ts +79 -0
- package/dist/visualizations/types/index.d.ts.map +1 -0
- package/dist/visualizations/types/index.js +8 -0
- package/dist/visualizations/types/index.js.map +1 -0
- package/dist/visualizations/utils/arrays.d.ts +18 -0
- package/dist/visualizations/utils/arrays.d.ts.map +1 -0
- package/dist/visualizations/utils/arrays.js +46 -0
- package/dist/visualizations/utils/arrays.js.map +1 -0
- package/dist/visualizations/utils/colorUtils.d.ts +36 -0
- package/dist/visualizations/utils/colorUtils.d.ts.map +1 -0
- package/dist/visualizations/utils/colorUtils.js +112 -0
- package/dist/visualizations/utils/colorUtils.js.map +1 -0
- package/dist/visualizations/utils/generateId.d.ts +2 -0
- package/dist/visualizations/utils/generateId.d.ts.map +1 -0
- package/dist/visualizations/utils/generateId.js +3 -0
- package/dist/visualizations/utils/generateId.js.map +1 -0
- package/dist/visualizations/utils/keyWalk.d.ts +2 -0
- package/dist/visualizations/utils/keyWalk.d.ts.map +1 -0
- package/dist/visualizations/utils/keyWalk.js +19 -0
- package/dist/visualizations/utils/keyWalk.js.map +1 -0
- package/dist/visualizations/utils/math.d.ts +10 -0
- package/dist/visualizations/utils/math.d.ts.map +1 -0
- package/dist/visualizations/utils/math.js +14 -0
- package/dist/visualizations/utils/math.js.map +1 -0
- package/dist/visualizations/utils/setDev.d.ts +29 -0
- package/dist/visualizations/utils/setDev.d.ts.map +1 -0
- package/dist/visualizations/utils/setDev.js +35 -0
- package/dist/visualizations/utils/setDev.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveEngine.js","sourceRoot":"","sources":["../../src/engine/LiveEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,wEAAwE;AACxE,gEAAgE;AAChE,MAAM,EAAE,aAAa,EAAE,GAAG,aAAa,CAAC;AAIxC,MAAM,OAAO,UAAU;IACb,MAAM,CAAM;IACZ,SAAS,GAAkB,IAAI,GAAG,EAAE,CAAC;IAE7C,YAAY,MAAY;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,aAAa,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,mEAAmE;IACnE,SAAS,CAAC,EAAY;QACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAEO,MAAM;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,EAAE,CAAC,KAAK,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IAED,kEAAkE;IAElE,QAAQ,CAAC,IAA8E;QACrF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,KAAc;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,KAAc;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,UAAkB,EAAE,OAA4B,EAAE,OAAmC;QAC7F,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,kEAAkE;IAElE,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a SetMap from ScoringEngine MatchUp state for coronaChart.
|
|
3
|
+
*
|
|
4
|
+
* For each set, computes cumulative point differential (p2sdiff)
|
|
5
|
+
* and extracts gamesScore and winnerIndex.
|
|
6
|
+
*/
|
|
7
|
+
export interface SetMap {
|
|
8
|
+
p2sdiff: number[];
|
|
9
|
+
gamesScore: [number, number];
|
|
10
|
+
players: [string, string];
|
|
11
|
+
winnerIndex: 0 | 1;
|
|
12
|
+
}
|
|
13
|
+
export declare function buildSetMap(matchUp: any, players?: [string, string]): SetMap[];
|
|
14
|
+
//# sourceMappingURL=buildSetMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSetMap.d.ts","sourceRoot":"","sources":["../../src/engine/buildSetMap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,GAAE,CAAC,MAAM,EAAE,MAAM,CAA4B,GAAG,MAAM,EAAE,CAuCxG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a SetMap from ScoringEngine MatchUp state for coronaChart.
|
|
3
|
+
*
|
|
4
|
+
* For each set, computes cumulative point differential (p2sdiff)
|
|
5
|
+
* and extracts gamesScore and winnerIndex.
|
|
6
|
+
*/
|
|
7
|
+
export function buildSetMap(matchUp, players = ['Player 1', 'Player 2']) {
|
|
8
|
+
const points = matchUp?.history?.points;
|
|
9
|
+
const sets = matchUp?.score?.sets;
|
|
10
|
+
if (!Array.isArray(points) || points.length === 0)
|
|
11
|
+
return [];
|
|
12
|
+
// Group points by set index
|
|
13
|
+
const setPoints = new Map();
|
|
14
|
+
for (const pt of points) {
|
|
15
|
+
const setIdx = pt.set ?? 0;
|
|
16
|
+
if (!setPoints.has(setIdx))
|
|
17
|
+
setPoints.set(setIdx, []);
|
|
18
|
+
setPoints.get(setIdx).push(pt);
|
|
19
|
+
}
|
|
20
|
+
const result = [];
|
|
21
|
+
for (const [setIdx, pts] of setPoints) {
|
|
22
|
+
let diff = 0;
|
|
23
|
+
const diffs = [];
|
|
24
|
+
for (const pt of pts) {
|
|
25
|
+
diff += pt.winner === 0 ? 1 : -1;
|
|
26
|
+
diffs.push(diff);
|
|
27
|
+
}
|
|
28
|
+
const setData = Array.isArray(sets) ? sets[setIdx] : undefined;
|
|
29
|
+
const gamesScore = setData
|
|
30
|
+
? [setData.side1Score ?? 0, setData.side2Score ?? 0]
|
|
31
|
+
: [0, 0];
|
|
32
|
+
const winnerIdx = setData?.winningSide === 2 ? 1 : 0;
|
|
33
|
+
result.push({
|
|
34
|
+
p2sdiff: diffs,
|
|
35
|
+
gamesScore: gamesScore,
|
|
36
|
+
players,
|
|
37
|
+
winnerIndex: winnerIdx,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=buildSetMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildSetMap.js","sourceRoot":"","sources":["../../src/engine/buildSetMap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,UAAU,WAAW,CAAC,OAAY,EAAE,UAA4B,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5F,MAAM,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7D,4BAA4B;IAC5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC3C,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;QACtC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,MAAM,UAAU,GAAqB,OAAO;YAC1C,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEX,MAAM,SAAS,GAAU,OAAO,EAAE,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5D,MAAM,CAAC,IAAI,CAAC;YACV,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,UAAU;YACtB,OAAO;YACP,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playback Engine — Incrementally feeds MCP fixture points into a LiveEngine
|
|
3
|
+
*
|
|
4
|
+
* Shared utility for Storybook stories. Provides auto-play with configurable
|
|
5
|
+
* delay, step forward/back (via undo), pause, and reset.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const playback = createPlaybackEngine({ matchIndex: 0, delayMs: 200 });
|
|
9
|
+
* playback.liveEngine.subscribe(matchUp => chart.data(buildEpisodes(matchUp)));
|
|
10
|
+
* playback.start();
|
|
11
|
+
*/
|
|
12
|
+
import { LiveEngine } from './LiveEngine';
|
|
13
|
+
import { getMcpFixture } from './feedMatchUp';
|
|
14
|
+
export interface PlaybackControls {
|
|
15
|
+
liveEngine: LiveEngine;
|
|
16
|
+
start(): void;
|
|
17
|
+
pause(): void;
|
|
18
|
+
stepForward(): void;
|
|
19
|
+
stepBack(): void;
|
|
20
|
+
reset(): void;
|
|
21
|
+
isPlaying(): boolean;
|
|
22
|
+
getProgress(): {
|
|
23
|
+
current: number;
|
|
24
|
+
total: number;
|
|
25
|
+
};
|
|
26
|
+
getFixture(): ReturnType<typeof getMcpFixture>;
|
|
27
|
+
destroy(): void;
|
|
28
|
+
}
|
|
29
|
+
export declare function createPlaybackEngine(options: {
|
|
30
|
+
matchIndex?: number;
|
|
31
|
+
delayMs?: number;
|
|
32
|
+
onComplete?: () => void;
|
|
33
|
+
}): PlaybackControls;
|
|
34
|
+
//# sourceMappingURL=createPlaybackEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPlaybackEngine.d.ts","sourceRoot":"","sources":["../../src/engine/createPlaybackEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAc,MAAM,eAAe,CAAC;AAM1D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,IAAI,IAAI,CAAC;IACd,KAAK,IAAI,IAAI,CAAC;IACd,WAAW,IAAI,IAAI,CAAC;IACpB,QAAQ,IAAI,IAAI,CAAC;IACjB,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,IAAI,OAAO,CAAC;IACrB,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,UAAU,IAAI,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IAC/C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,GAAG,gBAAgB,CAmFnB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playback Engine — Incrementally feeds MCP fixture points into a LiveEngine
|
|
3
|
+
*
|
|
4
|
+
* Shared utility for Storybook stories. Provides auto-play with configurable
|
|
5
|
+
* delay, step forward/back (via undo), pause, and reset.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const playback = createPlaybackEngine({ matchIndex: 0, delayMs: 200 });
|
|
9
|
+
* playback.liveEngine.subscribe(matchUp => chart.data(buildEpisodes(matchUp)));
|
|
10
|
+
* playback.start();
|
|
11
|
+
*/
|
|
12
|
+
import { LiveEngine } from './LiveEngine';
|
|
13
|
+
import { getMcpFixture, RESULT_MAP } from './feedMatchUp';
|
|
14
|
+
import { scoreGovernor } from 'tods-competition-factory';
|
|
15
|
+
const { ScoringEngine } = scoreGovernor;
|
|
16
|
+
export function createPlaybackEngine(options) {
|
|
17
|
+
const { matchIndex = 0, delayMs = 200, onComplete } = options;
|
|
18
|
+
const fixture = getMcpFixture(matchIndex);
|
|
19
|
+
const points = fixture.points;
|
|
20
|
+
const engine = new ScoringEngine({ matchUpFormat: 'SET3-S:6/TB7' });
|
|
21
|
+
const liveEngine = new LiveEngine(engine);
|
|
22
|
+
let cursor = 0;
|
|
23
|
+
let timer = null;
|
|
24
|
+
let playing = false;
|
|
25
|
+
function feedNextPoint() {
|
|
26
|
+
if (cursor >= points.length) {
|
|
27
|
+
pause();
|
|
28
|
+
onComplete?.();
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const pt = points[cursor];
|
|
32
|
+
liveEngine.addPoint({
|
|
33
|
+
winner: pt.winner,
|
|
34
|
+
server: pt.server,
|
|
35
|
+
result: RESULT_MAP[pt.result] || 'Winner',
|
|
36
|
+
rallyLength: pt.rallyLength,
|
|
37
|
+
});
|
|
38
|
+
cursor++;
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
function start() {
|
|
42
|
+
if (playing)
|
|
43
|
+
return;
|
|
44
|
+
playing = true;
|
|
45
|
+
timer = setInterval(() => {
|
|
46
|
+
if (!feedNextPoint()) {
|
|
47
|
+
pause();
|
|
48
|
+
}
|
|
49
|
+
}, delayMs);
|
|
50
|
+
}
|
|
51
|
+
function pause() {
|
|
52
|
+
playing = false;
|
|
53
|
+
if (timer !== null) {
|
|
54
|
+
clearInterval(timer);
|
|
55
|
+
timer = null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function stepForward() {
|
|
59
|
+
pause();
|
|
60
|
+
feedNextPoint();
|
|
61
|
+
}
|
|
62
|
+
function stepBack() {
|
|
63
|
+
pause();
|
|
64
|
+
if (cursor > 0) {
|
|
65
|
+
liveEngine.undo();
|
|
66
|
+
cursor--;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function reset() {
|
|
70
|
+
pause();
|
|
71
|
+
liveEngine.reset();
|
|
72
|
+
cursor = 0;
|
|
73
|
+
}
|
|
74
|
+
function destroy() {
|
|
75
|
+
pause();
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
liveEngine,
|
|
79
|
+
start,
|
|
80
|
+
pause,
|
|
81
|
+
stepForward,
|
|
82
|
+
stepBack,
|
|
83
|
+
reset,
|
|
84
|
+
isPlaying: () => playing,
|
|
85
|
+
getProgress: () => ({ current: cursor, total: points.length }),
|
|
86
|
+
getFixture: () => fixture,
|
|
87
|
+
destroy,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=createPlaybackEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPlaybackEngine.js","sourceRoot":"","sources":["../../src/engine/createPlaybackEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed MCP fixture data into the factory ScoringEngine
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper: iterates points, calls addPoint(), returns getState().
|
|
5
|
+
* No scoring logic lives here — the ScoringEngine is the single source of truth.
|
|
6
|
+
*/
|
|
7
|
+
interface McpPoint {
|
|
8
|
+
index: number;
|
|
9
|
+
set: number;
|
|
10
|
+
game: number;
|
|
11
|
+
score: string;
|
|
12
|
+
server: number;
|
|
13
|
+
winner: number;
|
|
14
|
+
result: string;
|
|
15
|
+
error: string | null;
|
|
16
|
+
serves: string[];
|
|
17
|
+
rally: string[];
|
|
18
|
+
rallyLength: number;
|
|
19
|
+
totalShots: number;
|
|
20
|
+
breakpoint: number | null;
|
|
21
|
+
gamepoint: number | null;
|
|
22
|
+
tiebreak: boolean;
|
|
23
|
+
code: string;
|
|
24
|
+
}
|
|
25
|
+
interface McpFixture {
|
|
26
|
+
matchId: number;
|
|
27
|
+
players: [string, string];
|
|
28
|
+
tournament: {
|
|
29
|
+
name: string;
|
|
30
|
+
division: string;
|
|
31
|
+
date: string | null;
|
|
32
|
+
tour: string;
|
|
33
|
+
};
|
|
34
|
+
score: {
|
|
35
|
+
sets?: Array<{
|
|
36
|
+
games: [number, number];
|
|
37
|
+
complete: boolean;
|
|
38
|
+
}>;
|
|
39
|
+
match_score?: string;
|
|
40
|
+
winner?: string;
|
|
41
|
+
loser?: string;
|
|
42
|
+
};
|
|
43
|
+
sets: Array<{
|
|
44
|
+
games: Array<{
|
|
45
|
+
range: [number, number];
|
|
46
|
+
winner: string;
|
|
47
|
+
score: [number, number];
|
|
48
|
+
tiebreak: boolean;
|
|
49
|
+
}>;
|
|
50
|
+
winner?: number;
|
|
51
|
+
}>;
|
|
52
|
+
points: McpPoint[];
|
|
53
|
+
totalPoints: number;
|
|
54
|
+
}
|
|
55
|
+
export declare const RESULT_MAP: Record<string, string>;
|
|
56
|
+
/**
|
|
57
|
+
* Feed a single MCP fixture match through the ScoringEngine.
|
|
58
|
+
*
|
|
59
|
+
* @param matchIndex - Index into mcpFixtures array (wraps around)
|
|
60
|
+
* @returns The ScoringEngine MatchUp state (with enriched history points)
|
|
61
|
+
*/
|
|
62
|
+
export declare function feedMatchUp(matchIndex?: number): any;
|
|
63
|
+
/**
|
|
64
|
+
* Feed all MCP fixtures through the ScoringEngine.
|
|
65
|
+
*/
|
|
66
|
+
export declare function feedAllMatchUps(): any[];
|
|
67
|
+
/**
|
|
68
|
+
* Get the raw MCP fixture data (for metadata like player names, tournament).
|
|
69
|
+
*/
|
|
70
|
+
export declare function getMcpFixture(matchIndex?: number): McpFixture;
|
|
71
|
+
/**
|
|
72
|
+
* Extract rally lengths from a ScoringEngine MatchUp, grouped by winner.
|
|
73
|
+
* Returns [player0Rallies, player1Rallies] for simpleChart.
|
|
74
|
+
*/
|
|
75
|
+
export declare function extractRallyLengths(matchUp: any): number[][];
|
|
76
|
+
/**
|
|
77
|
+
* Extract points for a single game from a ScoringEngine MatchUp.
|
|
78
|
+
* Used by gameFish stories. Returns legacy Point[] shape.
|
|
79
|
+
*/
|
|
80
|
+
export declare function extractGamePoints(matchUp: any, setIdx?: number, gameIdx?: number): any[];
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=feedMatchUp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedMatchUp.d.ts","sourceRoot":"","sources":["../../src/engine/feedMatchUp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,EAAE;QACL,IAAI,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE,KAAK,CAAC;QACV,KAAK,EAAE,KAAK,CAAC;YACX,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxB,MAAM,EAAE,MAAM,CAAC;YACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxB,QAAQ,EAAE,OAAO,CAAC;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAU7C,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,UAAU,SAAI,GAAG,GAAG,CA4B/C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,GAAG,EAAE,CAEvC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,SAAI,GAAG,UAAU,CAExD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,EAAE,EAAE,CAW5D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,SAAI,EAAE,OAAO,SAAI,GAAG,GAAG,EAAE,CA4B9E"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feed MCP fixture data into the factory ScoringEngine
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper: iterates points, calls addPoint(), returns getState().
|
|
5
|
+
* No scoring logic lives here — the ScoringEngine is the single source of truth.
|
|
6
|
+
*/
|
|
7
|
+
import { scoreGovernor } from 'tods-competition-factory';
|
|
8
|
+
import mcpFixtures from '../visualizations/data/mcpFixtures.json';
|
|
9
|
+
const { ScoringEngine } = scoreGovernor;
|
|
10
|
+
const fixtures = mcpFixtures;
|
|
11
|
+
const UNFORCED_ERROR = 'Unforced Error';
|
|
12
|
+
export const RESULT_MAP = {
|
|
13
|
+
'Ace': 'Ace',
|
|
14
|
+
'Winner': 'Winner',
|
|
15
|
+
'Serve Winner': 'Serve Winner',
|
|
16
|
+
'Unforced Error': UNFORCED_ERROR,
|
|
17
|
+
'Forced Error': 'Forced Error',
|
|
18
|
+
'Double Fault': 'Double Fault',
|
|
19
|
+
'Net': UNFORCED_ERROR,
|
|
20
|
+
'Out': UNFORCED_ERROR,
|
|
21
|
+
'Return Winner': 'Winner',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Feed a single MCP fixture match through the ScoringEngine.
|
|
25
|
+
*
|
|
26
|
+
* @param matchIndex - Index into mcpFixtures array (wraps around)
|
|
27
|
+
* @returns The ScoringEngine MatchUp state (with enriched history points)
|
|
28
|
+
*/
|
|
29
|
+
export function feedMatchUp(matchIndex = 0) {
|
|
30
|
+
const fixture = fixtures[matchIndex % fixtures.length];
|
|
31
|
+
const engine = new ScoringEngine({ matchUpFormat: 'SET3-S:6/TB7' });
|
|
32
|
+
for (const pt of fixture.points) {
|
|
33
|
+
engine.addPoint({
|
|
34
|
+
winner: pt.winner,
|
|
35
|
+
server: pt.server,
|
|
36
|
+
result: (RESULT_MAP[pt.result] || 'Winner'),
|
|
37
|
+
rallyLength: pt.rallyLength,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const matchUp = engine.getState();
|
|
41
|
+
// Enrich engine points with MCP-specific fields the ScoringEngine doesn't track
|
|
42
|
+
if (matchUp?.history?.points) {
|
|
43
|
+
for (let i = 0; i < matchUp.history.points.length; i++) {
|
|
44
|
+
const enginePt = matchUp.history.points[i];
|
|
45
|
+
const mcpPt = fixture.points[i];
|
|
46
|
+
if (enginePt && mcpPt) {
|
|
47
|
+
enginePt.mcpCode = mcpPt.code;
|
|
48
|
+
enginePt.tiebreak = mcpPt.tiebreak;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return matchUp;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Feed all MCP fixtures through the ScoringEngine.
|
|
56
|
+
*/
|
|
57
|
+
export function feedAllMatchUps() {
|
|
58
|
+
return fixtures.map((_, i) => feedMatchUp(i));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the raw MCP fixture data (for metadata like player names, tournament).
|
|
62
|
+
*/
|
|
63
|
+
export function getMcpFixture(matchIndex = 0) {
|
|
64
|
+
return fixtures[matchIndex % fixtures.length];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Extract rally lengths from a ScoringEngine MatchUp, grouped by winner.
|
|
68
|
+
* Returns [player0Rallies, player1Rallies] for simpleChart.
|
|
69
|
+
*/
|
|
70
|
+
export function extractRallyLengths(matchUp) {
|
|
71
|
+
const points = matchUp?.history?.points;
|
|
72
|
+
if (!Array.isArray(points))
|
|
73
|
+
return [[], []];
|
|
74
|
+
const p0 = [];
|
|
75
|
+
const p1 = [];
|
|
76
|
+
for (const pt of points) {
|
|
77
|
+
if (pt.winner === 0)
|
|
78
|
+
p0.push(pt.rallyLength ?? 0);
|
|
79
|
+
else
|
|
80
|
+
p1.push(pt.rallyLength ?? 0);
|
|
81
|
+
}
|
|
82
|
+
return [p0, p1];
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Extract points for a single game from a ScoringEngine MatchUp.
|
|
86
|
+
* Used by gameFish stories. Returns legacy Point[] shape.
|
|
87
|
+
*/
|
|
88
|
+
export function extractGamePoints(matchUp, setIdx = 0, gameIdx = 0) {
|
|
89
|
+
const points = matchUp?.history?.points;
|
|
90
|
+
if (!Array.isArray(points))
|
|
91
|
+
return [];
|
|
92
|
+
const gamePoints = points.filter((pt) => pt.set === setIdx && pt.game === gameIdx);
|
|
93
|
+
let p0 = 0;
|
|
94
|
+
let p1 = 0;
|
|
95
|
+
return gamePoints.map((pt, i) => {
|
|
96
|
+
if (pt.winner === 0)
|
|
97
|
+
p0++;
|
|
98
|
+
else
|
|
99
|
+
p1++;
|
|
100
|
+
return {
|
|
101
|
+
index: i,
|
|
102
|
+
game: gameIdx,
|
|
103
|
+
set: setIdx,
|
|
104
|
+
server: pt.server,
|
|
105
|
+
winner: pt.winner,
|
|
106
|
+
notation: pt.mcpCode,
|
|
107
|
+
rallyLength: pt.rallyLength,
|
|
108
|
+
result: pt.result,
|
|
109
|
+
score: pt.score,
|
|
110
|
+
points: [p0, p1],
|
|
111
|
+
tiebreak: pt.tiebreak ?? false,
|
|
112
|
+
breakpoint: pt.isBreakpoint ?? false,
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=feedMatchUp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedMatchUp.js","sourceRoot":"","sources":["../../src/engine/feedMatchUp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Episode } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Transforms a ScoringEngine MatchUp into an Episode array
|
|
4
|
+
* suitable for visualization components (GameTree, Momentum, PTS, GameFish, Corona).
|
|
5
|
+
*
|
|
6
|
+
* @param matchUp - A MatchUp object from ScoringEngine.getState()
|
|
7
|
+
* @returns Episode[] - Array of episodes, one per point played
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildEpisodes(matchUp: any): Episode[];
|
|
10
|
+
//# sourceMappingURL=buildEpisodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildEpisodes.d.ts","sourceRoot":"","sources":["../../src/episodes/buildEpisodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,CAyIrD"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transforms a ScoringEngine MatchUp into an Episode array
|
|
3
|
+
* suitable for visualization components (GameTree, Momentum, PTS, GameFish, Corona).
|
|
4
|
+
*
|
|
5
|
+
* @param matchUp - A MatchUp object from ScoringEngine.getState()
|
|
6
|
+
* @returns Episode[] - Array of episodes, one per point played
|
|
7
|
+
*/
|
|
8
|
+
export function buildEpisodes(matchUp) {
|
|
9
|
+
const points = matchUp?.history?.points;
|
|
10
|
+
if (!Array.isArray(points) || points.length === 0)
|
|
11
|
+
return [];
|
|
12
|
+
const episodes = [];
|
|
13
|
+
// Track running state
|
|
14
|
+
let setCumulativePoints = [0, 0];
|
|
15
|
+
let gamePointCounts = [0, 0];
|
|
16
|
+
let gamesScore = [0, 0];
|
|
17
|
+
let setsScore = [0, 0];
|
|
18
|
+
let currentSet = 0;
|
|
19
|
+
let currentGame = 0;
|
|
20
|
+
for (let i = 0; i < points.length; i++) {
|
|
21
|
+
const point = points[i];
|
|
22
|
+
const nextPoint = points[i + 1];
|
|
23
|
+
// Detect boundaries
|
|
24
|
+
const gameComplete = nextPoint
|
|
25
|
+
? nextPoint.game !== point.game || nextPoint.set !== point.set
|
|
26
|
+
: false;
|
|
27
|
+
const setComplete = nextPoint ? nextPoint.set !== point.set : false;
|
|
28
|
+
const isLastPoint = i === points.length - 1;
|
|
29
|
+
const matchComplete = isLastPoint && matchUp?.winningSide !== undefined;
|
|
30
|
+
// Handle set transition: reset per-set accumulators
|
|
31
|
+
if (point.set !== currentSet) {
|
|
32
|
+
setCumulativePoints = [0, 0];
|
|
33
|
+
gamePointCounts = [0, 0];
|
|
34
|
+
gamesScore = [0, 0];
|
|
35
|
+
currentSet = point.set;
|
|
36
|
+
currentGame = point.game;
|
|
37
|
+
}
|
|
38
|
+
// Handle game transition: reset within-game point counts
|
|
39
|
+
if (point.game !== currentGame) {
|
|
40
|
+
gamePointCounts = [0, 0];
|
|
41
|
+
currentGame = point.game;
|
|
42
|
+
}
|
|
43
|
+
// Update cumulative set points
|
|
44
|
+
if (point.winner === 0)
|
|
45
|
+
setCumulativePoints[0]++;
|
|
46
|
+
else
|
|
47
|
+
setCumulativePoints[1]++;
|
|
48
|
+
// Update within-game point counts
|
|
49
|
+
if (point.winner === 0)
|
|
50
|
+
gamePointCounts[0]++;
|
|
51
|
+
else
|
|
52
|
+
gamePointCounts[1]++;
|
|
53
|
+
// Determine game winner when game completes
|
|
54
|
+
const isGameEnd = gameComplete || (isLastPoint && matchComplete);
|
|
55
|
+
let gameWinner;
|
|
56
|
+
if (isGameEnd) {
|
|
57
|
+
gameWinner = point.winner;
|
|
58
|
+
}
|
|
59
|
+
// Update games score AFTER determining game winner
|
|
60
|
+
const episodeGamesScore = [...gamesScore];
|
|
61
|
+
if (isGameEnd && gameWinner !== undefined) {
|
|
62
|
+
episodeGamesScore[gameWinner]++;
|
|
63
|
+
}
|
|
64
|
+
// Determine set winner
|
|
65
|
+
const isSetEnd = setComplete || (isLastPoint && matchComplete);
|
|
66
|
+
let setWinner;
|
|
67
|
+
if (isSetEnd) {
|
|
68
|
+
setWinner = sideToIndex(deriveSetWinner(matchUp, point.set));
|
|
69
|
+
}
|
|
70
|
+
// Build cumulative sets array with current scores
|
|
71
|
+
const episodeSetsScore = [...setsScore];
|
|
72
|
+
if (isSetEnd && setWinner !== undefined) {
|
|
73
|
+
episodeSetsScore[setWinner]++;
|
|
74
|
+
}
|
|
75
|
+
const setsArray = buildSetsArray(matchUp, point.set);
|
|
76
|
+
// Score display: show "G" for game-completing points
|
|
77
|
+
const displayScore = isGameEnd ? 'G' : point.score || '';
|
|
78
|
+
const episode = {
|
|
79
|
+
action: 'addPoint',
|
|
80
|
+
point: {
|
|
81
|
+
winner: point.winner,
|
|
82
|
+
server: point.server,
|
|
83
|
+
pointNumber: point.pointNumber,
|
|
84
|
+
index: point.index ?? i,
|
|
85
|
+
isBreakpoint: point.isBreakpoint ?? false,
|
|
86
|
+
score: displayScore,
|
|
87
|
+
set: point.set,
|
|
88
|
+
game: point.game,
|
|
89
|
+
rallyLength: point.rallyLength,
|
|
90
|
+
result: point.result,
|
|
91
|
+
notation: point.mcpCode,
|
|
92
|
+
tiebreak: point.tiebreak ?? false,
|
|
93
|
+
serve: point.serve, // 1 = first serve, 2 = second serve
|
|
94
|
+
points: [...gamePointCounts],
|
|
95
|
+
setCumulativePoints: [...setCumulativePoints],
|
|
96
|
+
},
|
|
97
|
+
game: {
|
|
98
|
+
complete: isGameEnd,
|
|
99
|
+
winner: gameWinner,
|
|
100
|
+
games: episodeGamesScore,
|
|
101
|
+
index: point.game,
|
|
102
|
+
},
|
|
103
|
+
set: {
|
|
104
|
+
complete: isSetEnd,
|
|
105
|
+
winner: setWinner,
|
|
106
|
+
sets: setsArray,
|
|
107
|
+
index: point.set,
|
|
108
|
+
},
|
|
109
|
+
needed: {
|
|
110
|
+
pointsToGame: point.pointsToGame ?? [0, 0],
|
|
111
|
+
pointsToSet: point.pointsToSet ?? [0, 0],
|
|
112
|
+
gamesToSet: point.gamesToSet ?? [0, 0],
|
|
113
|
+
},
|
|
114
|
+
nextService: nextPoint?.server ?? point.server,
|
|
115
|
+
result: true,
|
|
116
|
+
complete: isLastPoint && matchComplete,
|
|
117
|
+
};
|
|
118
|
+
episodes.push(episode);
|
|
119
|
+
// Update running gamesScore after game completion
|
|
120
|
+
if (gameComplete && gameWinner !== undefined) {
|
|
121
|
+
gamesScore[gameWinner]++;
|
|
122
|
+
gamePointCounts = [0, 0];
|
|
123
|
+
}
|
|
124
|
+
// Update running setsScore after set completion
|
|
125
|
+
if (setComplete && setWinner !== undefined) {
|
|
126
|
+
setsScore[setWinner]++;
|
|
127
|
+
// Reset gamesScore for new set
|
|
128
|
+
gamesScore = [0, 0];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return episodes;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Convert ScoringEngine's winningSide (1 or 2) to 0-based index (0 or 1).
|
|
135
|
+
*/
|
|
136
|
+
function sideToIndex(winningSide) {
|
|
137
|
+
if (winningSide === 1)
|
|
138
|
+
return 0;
|
|
139
|
+
if (winningSide === 2)
|
|
140
|
+
return 1;
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get winningSide for a completed set.
|
|
145
|
+
*/
|
|
146
|
+
function deriveSetWinner(matchUp, setIndex) {
|
|
147
|
+
const sets = matchUp?.score?.sets;
|
|
148
|
+
if (!Array.isArray(sets) || !sets[setIndex])
|
|
149
|
+
return undefined;
|
|
150
|
+
return sets[setIndex].winningSide;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Build cumulative sets score array up to the given set index.
|
|
154
|
+
*/
|
|
155
|
+
function buildSetsArray(matchUp, currentSetIndex) {
|
|
156
|
+
const sets = matchUp?.score?.sets;
|
|
157
|
+
if (!Array.isArray(sets))
|
|
158
|
+
return [];
|
|
159
|
+
const result = [];
|
|
160
|
+
for (let i = 0; i <= currentSetIndex && i < sets.length; i++) {
|
|
161
|
+
const s = sets[i];
|
|
162
|
+
result.push([s.side1Score ?? 0, s.side2Score ?? 0]);
|
|
163
|
+
}
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=buildEpisodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildEpisodes.js","sourceRoot":"","sources":["../../src/episodes/buildEpisodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface EpisodePoint {
|
|
2
|
+
winner: number;
|
|
3
|
+
server: number;
|
|
4
|
+
pointNumber: number;
|
|
5
|
+
index: number;
|
|
6
|
+
isBreakpoint: boolean;
|
|
7
|
+
score: string;
|
|
8
|
+
set: number;
|
|
9
|
+
game: number;
|
|
10
|
+
rallyLength?: number;
|
|
11
|
+
result?: string;
|
|
12
|
+
notation?: string;
|
|
13
|
+
tiebreak?: boolean;
|
|
14
|
+
serve?: 1 | 2;
|
|
15
|
+
points?: [number, number];
|
|
16
|
+
setCumulativePoints?: [number, number];
|
|
17
|
+
}
|
|
18
|
+
export interface EpisodeGame {
|
|
19
|
+
complete: boolean;
|
|
20
|
+
winner: number | undefined;
|
|
21
|
+
games: number[];
|
|
22
|
+
index: number;
|
|
23
|
+
}
|
|
24
|
+
export interface EpisodeSet {
|
|
25
|
+
complete: boolean;
|
|
26
|
+
winner: number | undefined;
|
|
27
|
+
sets: number[][];
|
|
28
|
+
index: number;
|
|
29
|
+
}
|
|
30
|
+
export interface EpisodeNeeded {
|
|
31
|
+
pointsToGame: number[];
|
|
32
|
+
pointsToSet: number[];
|
|
33
|
+
gamesToSet: number[];
|
|
34
|
+
}
|
|
35
|
+
export interface Episode {
|
|
36
|
+
action: 'addPoint';
|
|
37
|
+
point: EpisodePoint;
|
|
38
|
+
game: EpisodeGame;
|
|
39
|
+
set: EpisodeSet;
|
|
40
|
+
needed: EpisodeNeeded;
|
|
41
|
+
nextService: number;
|
|
42
|
+
result: boolean;
|
|
43
|
+
complete: boolean;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/episodes/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB"}
|