diff --git a/cmd/acb-index-builder/main_test.go b/cmd/acb-index-builder/main_test.go index b721a33..95b2592 100644 --- a/cmd/acb-index-builder/main_test.go +++ b/cmd/acb-index-builder/main_test.go @@ -11,6 +11,16 @@ import ( "time" ) +func generateTestImage(w, h int) *image.RGBA { + img := image.NewRGBA(image.Rect(0, 0, w, h)) + for y := 0; y < h; y++ { + for x := 0; x < w; x++ { + img.Set(x, y, color.RGBA{R: 100, G: 100, B: 100, A: 255}) + } + } + return img +} + func TestLoadConfig(t *testing.T) { // Set test environment variables t.Setenv("ACB_POSTGRES_HOST", "testhost") diff --git a/web/src/pages/replay.ts b/web/src/pages/replay.ts index 5f11b56..0095629 100644 --- a/web/src/pages/replay.ts +++ b/web/src/pages/replay.ts @@ -1,5 +1,5 @@ // Standalone replay viewer page - lazy loaded from app.ts -import type { Replay, GameEvent } from '../types'; +import type { Replay, GameEvent, DebugInfo } from '../types'; import { fetchCommentary } from '../api-types'; const loadReplayViewer = () => import('../replay-viewer'); @@ -162,6 +162,21 @@ function initReplayViewerWithClass(ReplayViewerClass: any, initialUrl?: string): + +
+ `; @@ -258,10 +326,16 @@ function initReplayViewer(ReplayViewerClass: any, initialUrl?: string): void { const commentaryBar = document.getElementById('commentary-bar') as HTMLDivElement; const commentaryText = document.getElementById('commentary-text') as HTMLSpanElement; const commentaryToggle = document.getElementById('commentary-toggle') as HTMLButtonElement; + const debugPanel = document.getElementById('debug-panel') as HTMLDivElement; + const debugPanelToggleBtn = document.getElementById('debug-panel-toggle-btn') as HTMLDivElement; + const debugPanelChevron = document.getElementById('debug-panel-chevron') as HTMLSpanElement; + const debugPlayerToggles = document.getElementById('debug-player-toggles') as HTMLDivElement; + const debugInfoDisplay = document.getElementById('debug-info-display') as HTMLDivElement; let viewer = new ReplayViewerClass(canvas, { cellSize: 10 }); let criticalMoments: Array<{turn: number; delta: number; description: string}> = []; let commentaryEnabled = true; + let debugPanelExpanded = false; function enableControls(): void { playBtn.disabled = false; @@ -325,6 +399,24 @@ function initReplayViewer(ReplayViewerClass: any, initialUrl?: string): void { updateEventLog(); initWinProb(replay); loadCommentary(replay.match_id); + initDebugPanel(replay); + + const hasAnyDebug = replay.turns.some(t => t.debug && Object.keys(t.debug).length > 0); + if (hasAnyDebug) { + debugPanel.style.display = ''; + // On mobile, default collapsed; on desktop, default expanded + if (window.innerWidth > 900) { + debugPanelExpanded = true; + debugPanel.classList.add('expanded'); + debugPanelToggleBtn.setAttribute('aria-expanded', 'true'); + } else { + debugPanelExpanded = false; + debugPanel.classList.remove('expanded'); + debugPanelToggleBtn.setAttribute('aria-expanded', 'false'); + } + } else { + debugPanel.style.display = 'none'; + } } async function loadCommentary(matchId: string): Promise