From 4218626cbf9113fab268f34b4b696c4e7bbea871 Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Fri, 29 Nov 2024 20:25:39 -0600 Subject: [PATCH] feat: more progress --- .../components/DispersionVisualizer.tsx | 238 +++++++++++++----- 1 file changed, 178 insertions(+), 60 deletions(-) diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/DispersionVisualizer.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/DispersionVisualizer.tsx index aa7b84e71..bcf966629 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/DispersionVisualizer.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Characteristics/components/DispersionVisualizer.tsx @@ -1,93 +1,211 @@ -import { Button, Card, Code, Flex, Switch, Text } from '@radix-ui/themes'; +import { ChevronUpIcon, PlayIcon } from '@radix-ui/react-icons'; +import { + Box, + Button, + Card, + Checkbox, + Code, + Flex, + Select, + Text, +} from '@radix-ui/themes'; import { useEffect, useRef, useState } from 'react'; import type { TankCharacteristics } from '../../../../../../core/blitzkit/tankCharacteristics'; +import { Var } from '../../../../../../core/radix/var'; interface DispersionVisualizerProps { stats: TankCharacteristics; } -const refreshRate = 1000 / 60; // ms +const BASE_SIZE = 10; // rem +const REFRESH_RATE = 1000 / 60; // ms +const VISUALIZER_TYPES = [ + 'afterMove', + 'afterHullTraverse', + 'afterTurretTraverse', + 'afterShot', +] as const; + +type VisualizerType = (typeof VISUALIZER_TYPES)[number]; export function DispersionVisualizer({ stats }: DispersionVisualizerProps) { - const aInfinity = stats.dispersion; - const tau = stats.aimTime; const timeText = useRef(null); - const aText = useRef(null); - const [a0, setA0] = useState(stats.dispersionMoving); - const [stateDiscriminator, setStateDiscriminator] = useState(0); - const [gunBroken, setGunBroken] = useState(false); + const dispersionText = useRef(null); + const serverSideCircle = useRef(null); + const [visualize, setVisualize] = useState('afterMove'); + const [gunDamaged, setGunDamaged] = useState(false); + const [stateDiscriminator, setStateDiscriminator] = useState(false); useEffect(() => { + const tau = stats.aimTime; let t = 0; + let coefficient: number; + const dispersionBase = stats.dispersion; + let dispersionAdditive: number; + + if (gunDamaged) { + coefficient = stats.dispersionGunDamaged; + } else { + coefficient = 1; + } + + switch (visualize) { + case 'afterMove': + dispersionAdditive = stats.dispersionMoving; + break; + + case 'afterHullTraverse': + dispersionAdditive = stats.dispersionHullTraversing; + break; + + case 'afterTurretTraverse': + dispersionAdditive = stats.dispersionTurretTraversing; + break; + + case 'afterShot': + dispersionAdditive = stats.dispersion * (stats.dispersionShooting - 1); + break; + } + const interval = setInterval(() => { - if (!timeText.current || !aText.current) return; - - t += refreshRate / 1000; // ms -> s - const a = aInfinity + a0 * Math.exp(-t / tau); + if ( + !timeText.current || + !dispersionText.current || + !serverSideCircle.current + ) + return; + t += REFRESH_RATE / 1000; // ms -> s + const dispersion = + coefficient * + (dispersionBase + dispersionAdditive * Math.exp(-t / tau)); timeText.current.innerText = `t = ${t.toFixed(1)}s`; - aText.current.innerText = `a = ${a.toFixed(3)}m`; - }, refreshRate); + dispersionText.current.innerText = `a = ${dispersion.toFixed(3)}m`; + + const serverSideSize = `${(dispersion / coefficient / dispersionBase) * BASE_SIZE}rem`; + serverSideCircle.current.style.width = serverSideSize; + serverSideCircle.current.style.height = serverSideSize; + }, REFRESH_RATE); return () => { clearInterval(interval); }; - }, [aInfinity, tau, a0]); + }, [visualize, gunDamaged, stateDiscriminator]); return ( - - - - - + Gun damaged + + - - setGunBroken(checked as boolean)} + + + + + + + + - Gun broken - + + + + t = 0s + - - - t = 0s - + + a = 0.000m + + + - - a = {(aInfinity + a0).toFixed(3)}m - + +