import {ParsedDemo, PlayerState, Header, WorldBoundaries, Team} from "../Data/Parser"; export interface TimelineProps { parser: AsyncParser; tick: number; onSetTick: (tick: number) => any; disabled?: boolean; } export const Timeline = (props: TimelineProps) => { const parser = props.parser; const background = ; return
{ props.onSetTick(parseInt(event.target.value, 10)) }} disabled={props.disabled} /> {background}
; } import {AsyncParser} from "../Data/AsyncParser"; import {createSignal} from "solid-js"; function TimeLineBackground({parser}: { parser: AsyncParser }) { const length = Math.floor(parser.demo.tickCount / 30); const blueHealth = new Uint16Array(length); const redHealth = new Uint16Array(length); let index = 0; let maxHealth = 0; for (let tick = 0; tick < parser.demo.tickCount; tick += 30) { index++; const players = parser.getPlayersAtTick(tick); for (const player of players) { if (player.team === 2) { redHealth[index] += player.health; } else if (player.team === 3) { blueHealth[index] += player.health; } } if (blueHealth[index] > 0 && redHealth[index] > 0) { maxHealth = Math.max(maxHealth, blueHealth[index], redHealth[index]); } } let darkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; let redStroke = darkMode ? '#ff756bff' : '#ff000088'; let blueStroke = darkMode ? '#7378ffff' : '#0000ff88'; const redHealthPath = redHealth.reduce(pathReducer, 'M 0 0'); const blueHealthPath = blueHealth.reduce(pathReducer, 'M 0 0'); return ( ); } function pathReducer(path, y, x) { return `${path} L ${x} ${y}` }