flatten armor dir

This commit is contained in:
tresabhi committed 2026-09-27 16:46:22 -05:00
1 parent e18d6f58f9
commit e5b44d4eb8
28 files changed
+90 -101

No files matched your search

@@ -1,8 +0,0 @@
import { forwardRef, type ComponentProps } from "react";
import { Group } from "three";
export const ModelTankWrapper = forwardRef<Group, ComponentProps<"group">>(
(props, ref) => {
return <group rotation={[-Math.PI / 2, 0, 0]} ref={ref} {...props} />;
}
);
@@ -10,11 +10,11 @@ import {
import { Html } from "@react-three/drei"; import { Html } from "@react-three/drei";
import { useRef } from "react"; import { useRef } from "react";
import { radToDeg } from "three/src/math/MathUtils.js"; import { radToDeg } from "three/src/math/MathUtils.js";
import { resolveArmorIndex } from "../../../core/blitzkit/resolveArmorIndex"; import { resolveArmorIndex } from "../core/blitzkit/resolveArmorIndex";
import { LocaleProvider, useLocale } from "../../../hooks/useLocale"; import { LocaleProvider, useLocale } from "../hooks/useLocale";
import { App } from "../../../stores/app"; import { App } from "../stores/app";
import { Duel } from "../../../stores/duel"; import { Duel } from "../stores/duel";
import { Tankopedia } from "../../../stores/tankopedia"; import { Tankopedia } from "../stores/tankopedia";
import { layerTypeNames } from "./ShotDisplayCard"; import { layerTypeNames } from "./ShotDisplayCard";
import { ArmorType } from "./SpacedArmorScene"; import { ArmorType } from "./SpacedArmorScene";
@@ -1,11 +1,11 @@
import { createPortal, useFrame, useThree } from "@react-three/fiber"; import { createPortal, useFrame, useThree } from "@react-three/fiber";
import { memo, useState } from "react"; import { memo, useState } from "react";
import { DepthTexture, Scene, Vector2 } from "three"; import { DepthTexture, Scene, Vector2 } from "three";
import { PrimaryArmorScene } from "./components/PrimaryArmorScene"; import { spacedArmorRenderTarget } from "./PrimaryArmorRenderTarget";
import { spacedArmorRenderTarget } from "./components/PrimaryArmorSceneComponent/target"; import { PrimaryArmorScene } from "./PrimaryArmorScene";
import { SpacedArmorScene } from "./components/SpacedArmorScene"; import { SpacedArmorScene } from "./SpacedArmorScene";
export const Armor = memo(() => { export const DynamicArmor = memo(() => {
const rootScene = useThree((state) => state.scene); const rootScene = useThree((state) => state.scene);
const [spacedArmorScene] = useState(() => new Scene()); const [spacedArmorScene] = useState(() => new Scene());
const [primaryArmorScene] = useState(() => { const [primaryArmorScene] = useState(() => {
@@ -1,10 +1,10 @@
import { memo, useRef } from "react"; import { memo, useRef } from "react";
import { Group } from "three"; import { Group } from "three";
import { correctZYTuple } from "../../../core/blitz/correctZYTuple"; import { correctZYTuple } from "../core/blitz/correctZYTuple";
import { nameToArmorId } from "../../../core/blitzkit/nameToArmorId"; import { nameToArmorId } from "../core/blitzkit/nameToArmorId";
import { resolveArmor } from "../../../core/blitzkit/resolveThickness"; import { resolveArmor } from "../core/blitzkit/resolveThickness";
import { useArmor } from "../../../hooks/useArmor"; import { useArmor } from "../hooks/useArmor";
import { DuelModule, useDuel } from "../../../hooks/useDuel"; import { DuelModule, useDuel } from "../hooks/useDuel";
import { ModelTankWrapper } from "./ModelTankWrapper"; import { ModelTankWrapper } from "./ModelTankWrapper";
import { PrimaryArmorSceneComponent } from "./PrimaryArmorSceneComponent"; import { PrimaryArmorSceneComponent } from "./PrimaryArmorSceneComponent";
@@ -17,15 +17,15 @@ import {
Vector2, Vector2,
} from "three"; } from "three";
import { degToRad } from "three/src/math/MathUtils.js"; import { degToRad } from "three/src/math/MathUtils.js";
import { jsxTree } from "../../../../core/blitzkit/jsxTree"; import { jsxTree } from "../../core/blitzkit/jsxTree";
import { DuelModule, getDuel } from "../../../../hooks/useDuel"; import { DuelModule, getDuel } from "../../hooks/useDuel";
import { hasEquipment } from "../../../../hooks/useEquipment"; import { hasEquipment } from "../../hooks/useEquipment";
import { Tankopedia } from "../../../../stores/tankopedia"; import { Tankopedia } from "../../stores/tankopedia";
import { TankopediaPersistent } from "../../../../stores/tankopediaPersistent"; import { TankopediaPersistent } from "../../stores/tankopediaPersistent";
import { transitionEvent } from "../../../Lighting"; import { transitionEvent } from "../Lighting";
import fragmentShader from "./shaders/fragment.glsl?raw"; import fragmentShader from "./shaders/fragment.glsl?raw";
import vertexShader from "./shaders/vertex.glsl?raw"; import vertexShader from "./shaders/vertex.glsl?raw";
import { spacedArmorRenderTarget } from "./target"; import { spacedArmorRenderTarget } from "./PrimaryArmorRenderTarget";
interface PrimaryArmorSceneComponentProps { interface PrimaryArmorSceneComponentProps {
thickness: number; thickness: number;
@@ -16,13 +16,13 @@ import {
Path, Path,
Quaternion, Quaternion,
} from "three"; } from "three";
import { isHalloween } from "../../../core/blitzkit/isHalloween"; import { isHalloween } from "../core/blitzkit/isHalloween";
import { LocaleProvider, useLocale } from "../../../hooks/useLocale"; import { LocaleProvider, useLocale } from "../hooks/useLocale";
import { import {
Tankopedia, Tankopedia,
type ShotLayerNonExternal, type ShotLayerNonExternal,
type ShotStatus, type ShotStatus,
} from "../../../stores/tankopedia"; } from "../stores/tankopedia";
import { ShotDisplayCard } from "./ShotDisplayCard"; import { ShotDisplayCard } from "./ShotDisplayCard";
export const shotStatusColors: Record< export const shotStatusColors: Record<
@@ -9,8 +9,8 @@ import {
} from "@radix-ui/themes"; } from "@radix-ui/themes";
import type { ComponentProps } from "react"; import type { ComponentProps } from "react";
import { radToDeg } from "three/src/math/MathUtils.js"; import { radToDeg } from "three/src/math/MathUtils.js";
import { useLocale } from "../../../hooks/useLocale"; import { useLocale } from "../hooks/useLocale";
import type { Shot, ShotLayer } from "../../../stores/tankopedia"; import type { Shot, ShotLayer } from "../stores/tankopedia";
import { shotStatusColors } from "./ShotDisplay"; import { shotStatusColors } from "./ShotDisplay";
import { ArmorType } from "./SpacedArmorScene"; import { ArmorType } from "./SpacedArmorScene";
@@ -1,13 +1,13 @@
import { memo, useRef } from "react"; import { memo, useRef } from "react";
import { Group, Plane, Scene, Vector3 } from "three"; import { Group, Plane, Scene, Vector3 } from "three";
import { correctZYTuple } from "../../../core/blitz/correctZYTuple"; import { correctZYTuple } from "../core/blitz/correctZYTuple";
import { nameToArmorId } from "../../../core/blitzkit/nameToArmorId"; import { nameToArmorId } from "../core/blitzkit/nameToArmorId";
import { resolveArmor } from "../../../core/blitzkit/resolveThickness"; import { resolveArmor } from "../core/blitzkit/resolveThickness";
import { useArmor } from "../../../hooks/useArmor"; import { useArmor } from "../hooks/useArmor";
import { useModel } from "../../../hooks/useModel"; import { useModel } from "../hooks/useModel";
import { useTankModelDefinition } from "../../../hooks/useTankModelDefinition"; import { useTankModelDefinition } from "../hooks/useTankModelDefinition";
import { useTankTransform } from "../../../hooks/useTankTransform"; import { useTankTransform } from "../hooks/useTankTransform";
import { Duel } from "../../../stores/duel"; import { Duel } from "../stores/duel";
import { ModelTankWrapper } from "./ModelTankWrapper"; import { ModelTankWrapper } from "./ModelTankWrapper";
import { SpacedArmorSceneComponent } from "./SpacedArmorSceneComponent"; import { SpacedArmorSceneComponent } from "./SpacedArmorSceneComponent";
@@ -16,20 +16,20 @@ import {
Vector3, Vector3,
} from "three"; } from "three";
import { degToRad } from "three/src/math/MathUtils.js"; import { degToRad } from "three/src/math/MathUtils.js";
import { hasEquipment } from "../../../../core/blitzkit/hasEquipment"; import { hasEquipment } from "../core/blitzkit/hasEquipment";
import { jsxTree } from "../../../../core/blitzkit/jsxTree"; import { jsxTree } from "../core/blitzkit/jsxTree";
import { defaultEqualizer } from "../../../../core/blitzkit/tankToDuelMember"; import { defaultEqualizer } from "../core/blitzkit/tankToDuelMember";
import { discardClippingPlane } from "../../../../core/three/discardClippingPlane"; import { discardClippingPlane } from "../core/three/discardClippingPlane";
import { Duel } from "../../../../stores/duel"; import { Duel } from "../stores/duel";
import { import {
type Shot, type Shot,
type ShotLayerBase, type ShotLayerBase,
type ShotLayerNonExternal, type ShotLayerNonExternal,
Tankopedia, Tankopedia,
} from "../../../../stores/tankopedia"; } from "../stores/tankopedia";
import { ArmorType } from "../SpacedArmorScene"; import { ArmorType } from "./SpacedArmorScene";
import { SpacedArmorSubExternal } from "./components/SpacedArmorSubExternal"; import { SpacedArmorSubExternal } from "./SpacedArmorSubExternal";
import { SpacedArmorSubSpaced } from "./components/SpacedArmorSubSpaced"; import { SpacedArmorSubSpaced } from "./SpacedArmorSubSpaced";
type SpacedArmorSceneComponentProps = { type SpacedArmorSceneComponentProps = {
node: Object3D; node: Object3D;
@@ -7,12 +7,12 @@ import {
Plane, Plane,
ShaderMaterial, ShaderMaterial,
} from "three"; } from "three";
import type { ArmorUserData, ExternalModuleVariant } from "../.."; import type { ArmorUserData, ExternalModuleVariant } from "../SpacedArmorSceneComponent";
import { hasEquipment } from "../../../../../../core/blitzkit/hasEquipment"; import { hasEquipment } from "../../core/blitzkit/hasEquipment";
import { jsxTree } from "../../../../../../core/blitzkit/jsxTree"; import { jsxTree } from "../../core/blitzkit/jsxTree";
import { Duel } from "../../../../../../stores/duel"; import { Duel } from "../../stores/duel";
import { Tankopedia } from "../../../../../../stores/tankopedia"; import { Tankopedia } from "../../stores/tankopedia";
import { ArmorType } from "../../../SpacedArmorScene"; import { ArmorType } from "./SpacedArmorScene";
import fragmentShader from "./shaders/fragment.glsl?raw"; import fragmentShader from "./shaders/fragment.glsl?raw";
import vertexShader from "./shaders/vertex.glsl?raw"; import vertexShader from "./shaders/vertex.glsl?raw";
@@ -7,12 +7,12 @@ import {
type Object3D, type Object3D,
} from "three"; } from "three";
import { degToRad } from "three/src/math/MathUtils.js"; import { degToRad } from "three/src/math/MathUtils.js";
import type { ArmorUserData } from "../.."; import type { ArmorUserData } from "../SpacedArmorSceneComponent";
import { hasEquipment } from "../../../../../../core/blitzkit/hasEquipment"; import { hasEquipment } from "../../core/blitzkit/hasEquipment";
import { jsxTree } from "../../../../../../core/blitzkit/jsxTree"; import { jsxTree } from "../../core/blitzkit/jsxTree";
import { Duel } from "../../../../../../stores/duel"; import { Duel } from "../../stores/duel";
import { Tankopedia } from "../../../../../../stores/tankopedia"; import { Tankopedia } from "../../stores/tankopedia";
import { ArmorType } from "../../../SpacedArmorScene"; import { ArmorType } from "./SpacedArmorScene";
import fragmentShader from "./shaders/fragment.glsl?raw"; import fragmentShader from "./shaders/fragment.glsl?raw";
import vertexShader from "./shaders/vertex.glsl?raw"; import vertexShader from "./shaders/vertex.glsl?raw";
@@ -1,20 +1,20 @@
import { useThree, type ThreeEvent } from "@react-three/fiber"; import { useThree, type ThreeEvent } from "@react-three/fiber";
import { memo, useRef } from "react"; import { memo, useRef } from "react";
import { Group, Plane, Vector2, Vector3 } from "three"; import { Group, Plane, Vector2, Vector3 } from "three";
import { applyPitchYawLimits } from "../../../core/blitz/applyPitchYawLimits"; import { applyPitchYawLimits } from "../core/blitz/applyPitchYawLimits";
import { correctZYTuple } from "../../../core/blitz/correctZYTuple"; import { correctZYTuple } from "../core/blitz/correctZYTuple";
import { hasEquipment } from "../../../core/blitzkit/hasEquipment"; import { hasEquipment } from "../core/blitzkit/hasEquipment";
import { modelTransformEvent } from "../../../core/blitzkit/modelTransform"; import { modelTransformEvent } from "../core/blitzkit/modelTransform";
import { nameToArmorId } from "../../../core/blitzkit/nameToArmorId"; import { nameToArmorId } from "../core/blitzkit/nameToArmorId";
import { resolveArmor } from "../../../core/blitzkit/resolveThickness"; import { resolveArmor } from "../core/blitzkit/resolveThickness";
import { controlsEnabledEvent } from "../../../core/controlsEnabled"; import { controlsEnabledEvent } from "../core/controlsEnabled";
import { useArmor } from "../../../hooks/useArmor"; import { useArmor } from "../hooks/useArmor";
import { useModel } from "../../../hooks/useModel"; import { useModel } from "../hooks/useModel";
import { useTankModelDefinition } from "../../../hooks/useTankModelDefinition"; import { useTankModelDefinition } from "../hooks/useTankModelDefinition";
import { useTankTransform } from "../../../hooks/useTankTransform"; import { useTankTransform } from "../hooks/useTankTransform";
import { Duel } from "../../../stores/duel"; import { Duel } from "../stores/duel";
import { Tankopedia } from "../../../stores/tankopedia"; import { Tankopedia } from "../stores/tankopedia";
import { TankopediaPersistent } from "../../../stores/tankopediaPersistent"; import { TankopediaPersistent } from "../stores/tankopediaPersistent";
import { ModelTankWrapper } from "./ModelTankWrapper"; import { ModelTankWrapper } from "./ModelTankWrapper";
import { ArmorType } from "./SpacedArmorScene"; import { ArmorType } from "./SpacedArmorScene";
import { StaticArmorSceneComponent } from "./StaticArmorSceneComponent"; import { StaticArmorSceneComponent } from "./StaticArmorSceneComponent";
@@ -16,18 +16,18 @@ import {
Quaternion, Quaternion,
Vector3, Vector3,
} from "three"; } from "three";
import { unrotateDavaVector } from "../../../core/blitz/unrotateDavaVector"; import { unrotateDavaVector } from "../core/blitz/unrotateDavaVector";
import { jsxTree } from "../../../core/blitzkit/jsxTree"; import { jsxTree } from "../core/blitzkit/jsxTree";
import { import {
modelTransformEvent, modelTransformEvent,
type ModelTransformEventData, type ModelTransformEventData,
} from "../../../core/blitzkit/modelTransform"; } from "../core/blitzkit/modelTransform";
import { defaultEqualizer } from "../../../core/blitzkit/tankToDuelMember"; import { defaultEqualizer } from "../core/blitzkit/tankToDuelMember";
import { discardClippingPlane } from "../../../core/three/discardClippingPlane"; import { discardClippingPlane } from "../core/three/discardClippingPlane";
import { useEquipment } from "../../../hooks/useEquipment"; import { useEquipment } from "../hooks/useEquipment";
import { Duel } from "../../../stores/duel"; import { Duel } from "../stores/duel";
import { Tankopedia } from "../../../stores/tankopedia"; import { Tankopedia } from "../stores/tankopedia";
import { transitionEvent } from "../../Lighting"; import { transitionEvent } from "./Lighting";
import { ArmorType } from "./SpacedArmorScene"; import { ArmorType } from "./SpacedArmorScene";
import type { import type {
ArmorUserData, ArmorUserData,
@@ -12,7 +12,7 @@ import { useModel } from "../hooks/useModel";
import { useTankTransform } from "../hooks/useTankTransform"; import { useTankTransform } from "../hooks/useTankTransform";
import { Tankopedia } from "../stores/tankopedia"; import { Tankopedia } from "../stores/tankopedia";
import { TankopediaDisplay } from "../stores/tankopediaPersistent/constants"; import { TankopediaDisplay } from "../stores/tankopediaPersistent/constants";
import { ModelTankWrapper } from "./Armor/components/ModelTankWrapper"; import { ModelTankWrapper } from "./ModelTankWrapper";
export function TankModel() { export function TankModel() {
const protagonist = Duel.use((draft) => draft.protagonist); const protagonist = Duel.use((draft) => draft.protagonist);
@@ -7,7 +7,7 @@ import { Tankopedia } from "../../../../../../stores/tankopedia";
import { TankopediaPersistent } from "../../../../../../stores/tankopediaPersistent"; import { TankopediaPersistent } from "../../../../../../stores/tankopediaPersistent";
import { TankopediaDisplay } from "../../../../../../stores/tankopediaPersistent/constants"; import { TankopediaDisplay } from "../../../../../../stores/tankopediaPersistent/constants";
import type { MaybeSkeletonComponentProps } from "../../../../../../types/maybeSkeletonComponentProps"; import type { MaybeSkeletonComponentProps } from "../../../../../../types/maybeSkeletonComponentProps";
import type { ThicknessRange } from "../../../../../Armor/components/StaticArmor"; import type { ThicknessRange } from "../../../../../StaticArmor";
import { DynamicArmorSwitcher } from "./DynamicArmorSwitcher"; import { DynamicArmorSwitcher } from "./DynamicArmorSwitcher";
type ThicknessesProps = MaybeSkeletonComponentProps & { type ThicknessesProps = MaybeSkeletonComponentProps & {
@@ -37,7 +37,7 @@ import { Tankopedia } from "../../../../../stores/tankopedia";
import { TankopediaPersistent } from "../../../../../stores/tankopediaPersistent"; import { TankopediaPersistent } from "../../../../../stores/tankopediaPersistent";
import { TankopediaDisplay } from "../../../../../stores/tankopediaPersistent/constants"; import { TankopediaDisplay } from "../../../../../stores/tankopediaPersistent/constants";
import type { MaybeSkeletonComponentProps } from "../../../../../types/maybeSkeletonComponentProps"; import type { MaybeSkeletonComponentProps } from "../../../../../types/maybeSkeletonComponentProps";
import type { ThicknessRange } from "../../../../Armor/components/StaticArmor"; import type { ThicknessRange } from "../../../../StaticArmor";
import { EqualIcon } from "../../../../EqualIcon"; import { EqualIcon } from "../../../../EqualIcon";
import { ModuleButton } from "../../../../ModuleButtons/ModuleButton"; import { ModuleButton } from "../../../../ModuleButtons/ModuleButton";
import { ScreenshotButton } from "../../../../ScreenshotButton"; import { ScreenshotButton } from "../../../../ScreenshotButton";
@@ -7,7 +7,7 @@ import { useModel } from "../../../../../../../hooks/useModel";
import { useTankModelDefinition } from "../../../../../../../hooks/useTankModelDefinition"; import { useTankModelDefinition } from "../../../../../../../hooks/useTankModelDefinition";
import { useTankTransform } from "../../../../../../../hooks/useTankTransform"; import { useTankTransform } from "../../../../../../../hooks/useTankTransform";
import { Duel } from "../../../../../../../stores/duel"; import { Duel } from "../../../../../../../stores/duel";
import { ModelTankWrapper } from "../../../../../../Armor/components/ModelTankWrapper"; import { ModelTankWrapper } from "../../../../../../ModelTankWrapper";
import fragmentShader from "./shaders/fragment.glsl?raw"; import fragmentShader from "./shaders/fragment.glsl?raw";
import vertexShader from "./shaders/vertex.glsl?raw"; import vertexShader from "./shaders/vertex.glsl?raw";
@@ -7,7 +7,7 @@ import { useFullScreen } from "../../../hooks/useFullScreen";
import { Duel } from "../../../stores/duel"; import { Duel } from "../../../stores/duel";
import { Tankopedia } from "../../../stores/tankopedia"; import { Tankopedia } from "../../../stores/tankopedia";
import type { MaybeSkeletonComponentProps } from "../../../types/maybeSkeletonComponentProps"; import type { MaybeSkeletonComponentProps } from "../../../types/maybeSkeletonComponentProps";
import type { ThicknessRange } from "../../Armor/components/StaticArmor"; import type { ThicknessRange } from "../../StaticArmor";
import { Options } from "./components/Options"; import { Options } from "./components/Options";
import { TankSandbox } from "./components/TankSandbox"; import { TankSandbox } from "./components/TankSandbox";
import { Title } from "./components/TankSandbox/Title"; import { Title } from "./components/TankSandbox/Title";
@@ -14,19 +14,16 @@ import { useModel } from "../../hooks/useModel";
import { Tankopedia } from "../../stores/tankopedia"; import { Tankopedia } from "../../stores/tankopedia";
import { TankopediaPersistent } from "../../stores/tankopediaPersistent"; import { TankopediaPersistent } from "../../stores/tankopediaPersistent";
import { TankopediaDisplay } from "../../stores/tankopediaPersistent/constants"; import { TankopediaDisplay } from "../../stores/tankopediaPersistent/constants";
import { Armor } from "../Armor"; import { ArmorPlateDisplay } from "../ArmorPlateDisplay";
import { ArmorPlateDisplay } from "../Armor/components/ArmorPlateDisplay";
import { ShotDisplay } from "../Armor/components/ShotDisplay";
import {
StaticArmor,
type ThicknessRange,
} from "../Armor/components/StaticArmor";
import { CanvasAutoClear } from "../CanvasAutoClear"; import { CanvasAutoClear } from "../CanvasAutoClear";
import { CanvasControl } from "../CanvasControl"; import { CanvasControl } from "../CanvasControl";
import { DynamicArmor } from "../DynamicArmor";
import { InitialCameraAligner } from "../InitialCameraAligner"; import { InitialCameraAligner } from "../InitialCameraAligner";
import { Lighting } from "../Lighting"; import { Lighting } from "../Lighting";
import { SceneProps } from "../SceneProps"; import { SceneProps } from "../SceneProps";
import { ShotDisplay } from "../ShotDisplay";
import { SmartCanvas } from "../SmartCanvas"; import { SmartCanvas } from "../SmartCanvas";
import { StaticArmor, type ThicknessRange } from "../StaticArmor";
import { TankModel } from "../TankModel"; import { TankModel } from "../TankModel";
import styles from "./index.module.css"; import styles from "./index.module.css";
@@ -187,7 +184,7 @@ export const TankopediaSandbox = forwardRef<
{/* Controls within Suspense to allow for frame-perfect start of camera auto-rotate */} {/* Controls within Suspense to allow for frame-perfect start of camera auto-rotate */}
<CanvasControl /> <CanvasControl />
{display === TankopediaDisplay.DynamicArmor && <Armor />} {display === TankopediaDisplay.DynamicArmor && <DynamicArmor />}
{display === TankopediaDisplay.StaticArmor && ( {display === TankopediaDisplay.StaticArmor && (
<StaticArmor thicknessRange={thicknessRange} /> <StaticArmor thicknessRange={thicknessRange} />
)} )}
+2 -2
View File
@@ -7,8 +7,8 @@ import type {
import type { Vector3 } from "three"; import type { Vector3 } from "three";
import { Varuna } from "varuna"; import { Varuna } from "varuna";
import { api } from "../api/dynamic"; import { api } from "../api/dynamic";
import type { ArmorType } from "../components/Armor/components/SpacedArmorScene"; import type { ArmorType } from "../components/SpacedArmorScene";
import type { ExternalModuleVariant } from "../components/Armor/components/SpacedArmorSceneComponent"; import type { ExternalModuleVariant } from "../components/SpacedArmorSceneComponent";
import type { XP_MULTIPLIERS } from "../components/Tankopedia/TechTreeSection"; import type { XP_MULTIPLIERS } from "../components/Tankopedia/TechTreeSection";
import { createTankState } from "../tankopedia/createTankState"; import { createTankState } from "../tankopedia/createTankState";
import type { TankState } from "../tankopedia/tankState"; import type { TankState } from "../tankopedia/tankState";
View File
Whitespace-only changes.