From 31a61c8a6be3e8e86c79a6038162ebee5edfc41c Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Sun, 8 Dec 2024 21:51:39 -0600 Subject: [PATCH] feat: some turret traverse penalties --- .../TankSandbox/components/Control.tsx | 2 +- .../SceneProps/components/TargetCircle.tsx | 62 ++++++++++++------- .../components/SceneProps/index.tsx | 42 ++++++++++--- .../src/core/blitzkit/tankCharacteristics.ts | 3 + 4 files changed, 74 insertions(+), 35 deletions(-) diff --git a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Control.tsx b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Control.tsx index 260f958ec..04f69a7ec 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Control.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/Control.tsx @@ -20,7 +20,7 @@ const poseDistances: Record = { const modelDefinitions = await awaitableModelDefinitions; -const ARCADE_MODE_DISTANCE = 12; +const ARCADE_MODE_DISTANCE = 19; const ARCADE_MODE_ANGLE = Math.PI / 8; export const ARCADE_MODE_FOV = 54; export const INSPECT_MODE_FOV = 25; diff --git a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/SceneProps/components/TargetCircle.tsx b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/SceneProps/components/TargetCircle.tsx index 724daf782..dfdc6589a 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/SceneProps/components/TargetCircle.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/components/TankSandbox/components/SceneProps/components/TargetCircle.tsx @@ -1,40 +1,54 @@ import { imgur } from '@blitzkit/core'; import { Box, type BoxProps } from '@radix-ui/themes'; -import { times } from 'lodash-es'; import { forwardRef } from 'react'; import { Var } from '../../../../../../../../core/radix/var'; const DOTS = 32; -export const TargetCircle = forwardRef( - ({ ...props }, ref) => { +type TargetCircleProps = BoxProps & { + variant: 'client' | 'server'; +}; + +export const TargetCircle = forwardRef( + ({ style, variant, ...props }, ref) => { return ( - {times(DOTS, (index) => { - const angle = 2 * Math.PI * (index / DOTS); + {/* {variant === 'client' && + times(DOTS, (index) => { + const angle = 2 * Math.PI * (index / DOTS); + + return ( + + ); + })} */} - return ( - - ); - })} state.showGrid && !state.showEnvironment, ); const targetCircleWrapper = useRef(null); - const targetCircle = useRef(null); + const clientTargetCircle = useRef(null); + const serverTargetCircle = useRef(null); const material = useRef(null); const playground = useRef(null); @@ -70,8 +71,6 @@ export function SceneProps() { -tankModelDefinition.turret_origin.z, ); const gunOriginOnlyY = new Vector3(0, turretModelDefinition.gun_origin.y, 0); - const turretRotationSpeed = degToRad(turret.traverse_speed); - const gunRotationSpeed = degToRad(gun.gun_type!.value.base.rotation_speed); const shellOrigin = new Vector3() .add(hullOrigin) .add(turretOrigin) @@ -106,6 +105,9 @@ export function SceneProps() { }, { equipmentDefinitions, provisionDefinitions, tankModelDefinition }, ); + let { dispersion } = characteristics; + const turretRotationSpeed = degToRad(characteristics.turretTraverseSpeed); + const gunRotationSpeed = degToRad(characteristics.gunTraverseSpeed); const mockTank = useLoader(GLTFLoader, asset(`3d/tanks/models/12305.glb`)); const texture = useLoader(TextureLoader, imgur('C28Z8nU')); @@ -125,7 +127,8 @@ export function SceneProps() { !playground.current || !targetCircleWrapper.current || DEBUG_disable || - !targetCircle.current + !clientTargetCircle.current || + !serverTargetCircle.current ) { return; } @@ -152,6 +155,7 @@ export function SceneProps() { const deltaT = clock.elapsedTime - lastTime; lastTime = clock.elapsedTime; + const desiredPitch = Math.asin(direction.y); const desiredYaw = Math.atan2(-direction.x, -direction.z); const deltaPitch = desiredPitch - lastPitch; @@ -170,6 +174,22 @@ export function SceneProps() { turretModelDefinition.yaw, ); + const deltaRotation = Math.abs(maxDeltaPitch) + Math.abs(maxDeltaYaw); + const rotationSpeed = deltaRotation; + const turretTraversePenalty = + characteristics.dispersionTurretTraversing * radToDeg(rotationSpeed); + + const penalty = turretTraversePenalty; + + const dispersionMod = dispersion - characteristics.dispersion; + const dispersionModDischarged = + dispersionMod * Math.exp(-deltaT / characteristics.aimTime) - + dispersionMod; + + dispersion += penalty + dispersionModDischarged; + + document.title = `${dispersion.toFixed(3)} (${penalty.toFixed(3)})`; + modelTransformEvent.emit({ pitch, yaw }); lastPitch = pitch; lastYaw = yaw; @@ -198,8 +218,7 @@ export function SceneProps() { targetCircleWrapper.current.position.copy(gunTarget); const distanceToTarget = gunTarget.distanceTo(shellOrigin); - const dispersionRadius = - characteristics.dispersion * (distanceToTarget / 100); + const dispersionRadius = dispersion * (distanceToTarget / 100); const dispersionSize = 2 * dispersionRadius; const targetDistanceFromCamera = gunTarget.distanceTo(camera.position); const angularSize = @@ -210,8 +229,10 @@ export function SceneProps() { gl.domElement.clientHeight * (angularSize / verticalScreenSize); const targetCircleDotsSize = `${screenSpaceSize}px`; - targetCircle.current.style.width = targetCircleDotsSize; - targetCircle.current.style.height = targetCircleDotsSize; + clientTargetCircle.current.style.width = targetCircleDotsSize; + clientTargetCircle.current.style.height = targetCircleDotsSize; + serverTargetCircle.current.style.width = targetCircleDotsSize; + serverTargetCircle.current.style.height = targetCircleDotsSize; }); return ( @@ -227,7 +248,8 @@ export function SceneProps() { <> - + + diff --git a/packages/website/src/core/blitzkit/tankCharacteristics.ts b/packages/website/src/core/blitzkit/tankCharacteristics.ts index af9091f4a..548754ebc 100644 --- a/packages/website/src/core/blitzkit/tankCharacteristics.ts +++ b/packages/website/src/core/blitzkit/tankCharacteristics.ts @@ -461,6 +461,8 @@ export function tankCharacteristics( resolvedEnginePower / weightTons / softTerrainCoefficientRaw; const weight = weightTons; const turretTraverseSpeed = turret.traverse_speed * turretTraverseCoefficient; + const gunTraverseSpeed = + gun.gun_type!.value.base.rotation_speed * turretTraverseCoefficient; const hullTraverseHardTerrain = (resolvedEnginePower / stockEngine.power) * track.traverse_speed * @@ -555,6 +557,7 @@ export function tankCharacteristics( powerToWeightRatioSoftTerrain, weight, turretTraverseSpeed, + gunTraverseSpeed, // TODO: display this hullTraverseHardTerrain, hullTraverseMediumTerrain, hullTraverseSoftTerrain,