diff --git a/packages/core/lang/en-US.json b/packages/core/lang/en-US.json index 72b8cfb92..7a22c9011 100644 --- a/packages/core/lang/en-US.json +++ b/packages/core/lang/en-US.json @@ -52,6 +52,7 @@ }, "tank_class_short": { + "-1": "unrecognized", "0": "Light", "1": "Medium", "2": "Heavy", @@ -67,9 +68,10 @@ }, "tree_type": { - "researchable": "Tech tree", - "premium": "Premium", - "collector": "Collector" + "-1": "unrecognized", + "0": "Tech tree", + "1": "Premium", + "2": "Collector" }, "regions": { diff --git a/packages/website/src/components/Armor/components/ArmorPlateDisplay.tsx b/packages/website/src/components/Armor/components/ArmorPlateDisplay.tsx index 47e152e0b..daef49cac 100644 --- a/packages/website/src/components/Armor/components/ArmorPlateDisplay.tsx +++ b/packages/website/src/components/Armor/components/ArmorPlateDisplay.tsx @@ -98,7 +98,8 @@ export function ArmorPlateDisplay() { const { protagonist } = duelStore.getState(); const tank = draft.model; const turret = tank.turrets[protagonist.turret.id]; - const gun = turret.guns[protagonist.gun.id]; + const gun = + turret.guns[protagonist.gun.gunType!.value.base.id]; const track = tank.tracks[protagonist.track.id]; console.log(highlightArmor.name); @@ -152,8 +153,12 @@ export function ArmorPlateDisplay() { const turret = tank.turrets[protagonist.turret.id]; const initialTurret = initialTank.turrets[protagonist.turret.id]; - const gun = turret.guns[protagonist.gun.id]; - const initialGun = initialTurret.guns[protagonist.gun.id]; + const gun = + turret.guns[protagonist.gun.gunType!.value.base.id]; + const initialGun = + initialTurret.guns[ + protagonist.gun.gunType!.value.base.id + ]; const track = tank.tracks[protagonist.track.id]; const initialTrack = initialTank.tracks[protagonist.track.id]; diff --git a/packages/website/src/components/Armor/components/SpacedArmorSceneComponent/components/SpacedArmorSubExternal/index.tsx b/packages/website/src/components/Armor/components/SpacedArmorSceneComponent/components/SpacedArmorSubExternal/index.tsx index 938054342..31c3a1d51 100644 --- a/packages/website/src/components/Armor/components/SpacedArmorSceneComponent/components/SpacedArmorSubExternal/index.tsx +++ b/packages/website/src/components/Armor/components/SpacedArmorSceneComponent/components/SpacedArmorSubExternal/index.tsx @@ -1,5 +1,4 @@ import { - resolveNearPenetration, resolvePenetrationCoefficient, type ShellDefinition, } from '@blitzkit/core'; @@ -51,9 +50,7 @@ export function SpacedArmorSubExternal({ useEffect(() => { function handleShellChange(shell: ShellDefinition) { - material.uniforms.penetration.value = resolveNearPenetration( - shell.penetration, - ); + material.uniforms.penetration.value = shell.penetration.near; } async function handleProtagonistEquipmentChange( equipment: EquipmentMatrix, @@ -61,7 +58,7 @@ export function SpacedArmorSubExternal({ const duel = duelStore.getState(); const hasEnhancedArmor = await hasEquipment( 110, - duel.protagonist.tank.equipment, + duel.protagonist.tank.equipmentPreset, equipment, ); material.uniforms.thickness.value = hasEnhancedArmor @@ -71,10 +68,10 @@ export function SpacedArmorSubExternal({ async function handleAntagonistEquipmentChange(equipment: EquipmentMatrix) { const duel = duelStore.getState(); const shell = duel.antagonist.shell; - const penetration = resolveNearPenetration(shell.penetration); + const penetration = shell.penetration.near; const hasCalibratedShells = await hasEquipment( 103, - duel.antagonist.tank.equipment, + duel.antagonist.tank.equipmentPreset, equipment, ); diff --git a/packages/website/src/components/Compare/Body.tsx b/packages/website/src/components/Compare/Body.tsx index 18a4de4a6..ab6707b01 100644 --- a/packages/website/src/components/Compare/Body.tsx +++ b/packages/website/src/components/Compare/Body.tsx @@ -31,7 +31,7 @@ export function Body({ stats }: BodyProps) { - {gun.gunType!.value.gun.shells.map( + {gun.gunType!.value.base.shells.map( (thisShell, shellIndex) => ( void; disabled?: boolean; diff --git a/packages/website/src/components/ModuleButtons/ConsumableButton.tsx b/packages/website/src/components/ModuleButtons/ConsumableButton.tsx index 4dcbcaf9e..19a04a9ca 100644 --- a/packages/website/src/components/ModuleButtons/ConsumableButton.tsx +++ b/packages/website/src/components/ModuleButtons/ConsumableButton.tsx @@ -1,5 +1,4 @@ -import { asset } from '@blitzkit/core'; -import { consumableDefinitions } from '@blitzkit/core/src/blitzkit/consumableDefinitions'; +import { asset, fetchConsumableDefinitions } from '@blitzkit/core'; import { ClockIcon, ReloadIcon } from '@radix-ui/react-icons'; import { Flex, Text } from '@radix-ui/themes'; import { useDelta } from '../../hooks/useDelta'; @@ -12,7 +11,7 @@ interface ConsumableButtonProps extends TankComponentButtonProps { cooldown?: number; } -const awaitedConsumableDefinitions = await consumableDefinitions; +const consumableDefinitions = await fetchConsumableDefinitions(); export function ConsumableButton({ consumable, @@ -26,7 +25,7 @@ export function ConsumableButton({ return ( diff --git a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Miscellaneous.tsx b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Miscellaneous.tsx index 8aa6ad780..33e8de27d 100644 --- a/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Miscellaneous.tsx +++ b/packages/website/src/components/Tankopedia/CharacteristicsSection/components/Miscellaneous.tsx @@ -1,4 +1,4 @@ -import { asset } from '@blitzkit/core'; +import { asset, TankType } from '@blitzkit/core'; import { Flex, Heading, Slider, TextField } from '@radix-ui/themes'; import { clamp, debounce } from 'lodash-es'; import { useEffect, useMemo, useRef, useState } from 'react'; @@ -78,7 +78,7 @@ export function Miscellaneous() { }} /> - {tank.treeType === 'researchable' && ( + {tank.type === TankType.RESEARCHABLE && ( { @@ -76,7 +78,7 @@ export function Controls() { const duel = duelStore.getState(); const hasImprovedVerticalStabilizer = await hasEquipment( 122, - duel.protagonist.tank.equipment, + duel.protagonist.tank.equipmentPreset, duel.protagonist.equipmentMatrix, ); diff --git a/packages/website/src/components/Tankopedia/MetaSection/components/Votes/components/VoteCaster.tsx b/packages/website/src/components/Tankopedia/MetaSection/components/Votes/components/VoteCaster.tsx index 4731df0d4..f30c9dd33 100644 --- a/packages/website/src/components/Tankopedia/MetaSection/components/Votes/components/VoteCaster.tsx +++ b/packages/website/src/components/Tankopedia/MetaSection/components/Votes/components/VoteCaster.tsx @@ -1,4 +1,4 @@ -import { BlitzkitResponse, StarsInt } from '@blitzkit/core'; +import type { BlitzkitResponse, StarsInt } from '@blitzkit/core'; import { PaperPlaneIcon } from '@radix-ui/react-icons'; import { AlertDialog, @@ -9,8 +9,9 @@ import { Text, } from '@radix-ui/themes'; import { useState } from 'react'; -import * as App from '../../../../../../../../../../stores/app'; -import * as Duel from '../../../../../../../../../../stores/duel'; +import { App } from '../../../../../../stores/app'; +import { Duel } from '../../../../../../stores/duel'; +import { $wargamingLogin } from '../../../../../../stores/wargamingLogin'; import { Stars } from '../../Stars'; export function VoteCaster() { @@ -98,9 +99,9 @@ export function VoteCaster() { survivability === null) } onClick={() => { - const wargaming = appStore.getState().logins.wargaming; + const wargaming = $wargamingLogin.get(); - if (!wargaming) { + if (!wargaming.token) { return setShowDialogue(false); } diff --git a/packages/website/src/components/Tankopedia/MetaSection/index.tsx b/packages/website/src/components/Tankopedia/MetaSection/index.tsx index 7caa62633..cbe48a1dc 100644 --- a/packages/website/src/components/Tankopedia/MetaSection/index.tsx +++ b/packages/website/src/components/Tankopedia/MetaSection/index.tsx @@ -1,8 +1,10 @@ import { assertSecret, asset, - modelDefinitions, - provisionDefinitions, + fetchModelDefinitions, + fetchProvisionDefinitions, + TankPriceType, + TankType, } from '@blitzkit/core'; import strings from '@blitzkit/core/lang/en-US.json'; import { ChevronLeftIcon, MixIcon, UpdateIcon } from '@radix-ui/react-icons'; @@ -17,8 +19,8 @@ import { ScienceIcon } from '../../ScienceIcon'; import { TankSearch } from '../../TankSearch'; import { Listing } from './components/Listing'; -const awaitedProvisionDefinitions = await provisionDefinitions; -const awaitedModelDefinitions = await modelDefinitions; +const provisionDefinitions = await fetchProvisionDefinitions(); +const modelDefinitions = await fetchModelDefinitions(); export function MetaSection() { const developerMode = App.useDeferred((state) => state.developerMode, false); @@ -78,12 +80,12 @@ export function MetaSection() { onSelect={(tank) => { setShowSwapDialog(false); mutateTankopediaEphemeral((draft) => { - draft.model = awaitedModelDefinitions[tank.id]; + draft.model = modelDefinitions.models[tank.id]; }); mutateDuel((draft) => { draft.protagonist = tankToDuelMember( tank, - awaitedProvisionDefinitions, + provisionDefinitions, ); }); @@ -130,14 +132,14 @@ export function MetaSection() { - {strings.common.tree_type[protagonist.treeType]} + {strings.common.tree_type[protagonist.type]} @@ -147,7 +149,7 @@ export function MetaSection() { {protagonist.id} )} - {protagonist.treeType === 'premium' && ( + {protagonist.type === TankType.PREMIUM && ( {protagonist.price.value / 400} @@ -161,7 +163,7 @@ export function MetaSection() { )} @@ -184,10 +188,12 @@ export function MetaSection() { {(protagonist.price.value / 2).toLocaleString()} {protagonist.price.type} diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx index 03e98de6e..cce2c8ca6 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx @@ -1,8 +1,8 @@ import { asset, - averageDefinitions, + fetchAverageDefinitions, + fetchTankDefinitions, formatCompact, - tankDefinitions, TIER_ROMAN_NUMERALS, } from '@blitzkit/core'; import { Box, Flex, Link, Text } from '@radix-ui/themes'; @@ -14,13 +14,13 @@ interface NodeProps { highlight?: boolean; } -const awaitedTankDefinitions = await tankDefinitions; -const awaitedAverageDefinitions = await averageDefinitions; +const tankDefinitions = await fetchTankDefinitions(); +const averageDefinitions = await fetchAverageDefinitions(); export function Node({ id, highlight, nextIds }: NodeProps) { const xpMultiplier = TankopediaEphemeral.use((state) => state.xpMultiplier); - const tank = awaitedTankDefinitions[id]; - const nextTanks = nextIds?.map((id) => awaitedTankDefinitions[id]); + const tank = tankDefinitions.tanks[id]; + const nextTanks = nextIds?.map((id) => tankDefinitions.tanks[id]); const thisTankXp = tank.xp === undefined || tank.tier === 1 ? 0 : tank.xp! / xpMultiplier; const nextTanksXp = nextTanks?.reduce( @@ -29,7 +29,7 @@ export function Node({ id, highlight, nextIds }: NodeProps) { (tank.xp === undefined || tank.tier === 1 ? 0 : tank.xp! / xpMultiplier), 0, ); - const averages = awaitedAverageDefinitions.averages[tank.id]?.mu; + const averages = averageDefinitions.averages[tank.id]?.mu; const averageXp = averages ? averages.xp / averages.battles : undefined; const games = averages && nextTanks ? Math.round(nextTanksXp! / averageXp!) : undefined; diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx index 2b81cafe9..377e1711c 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx @@ -1,4 +1,4 @@ -import { asset, imgur, tankDefinitions } from '@blitzkit/core'; +import { asset, fetchTankDefinitions, imgur, TankType } from '@blitzkit/core'; import { CaretLeftIcon, CaretRightIcon, PlusIcon } from '@radix-ui/react-icons'; import { Flex, Heading, IconButton, ScrollArea, Text } from '@radix-ui/themes'; import { Fragment, useEffect, useMemo, useRef, useState } from 'react'; @@ -9,7 +9,7 @@ import { Node } from './components/Node'; type Line = number[]; -const awaitedTankDefinitions = await tankDefinitions; +const tankDefinitions = await fetchTankDefinitions(); export const XP_MULTIPLIERS = [1, 2, 3, 4, 5, 10]; @@ -20,7 +20,7 @@ export function TechTreeSection() { const container = useRef(null); const lines = useMemo(() => { function extend(line: Line): Line[] { - const root = awaitedTankDefinitions[line.at(-1)!]; + const root = tankDefinitions.tanks[line.at(-1)!]; if (root.ancestors === undefined || root.tier === 1) { return [line]; @@ -28,7 +28,7 @@ export function TechTreeSection() { if (root.ancestors.length === 1 || root.tier === 2) { line.push( root.ancestors.find( - (ancestor) => !awaitedTankDefinitions[ancestor].deprecated, + (ancestor) => !tankDefinitions.tanks[ancestor].deprecated, ) ?? root.ancestors[0], ); return extend(line); @@ -53,14 +53,14 @@ export function TechTreeSection() { const totalXp = line.reduce( (xp, id) => xp + - (awaitedTankDefinitions[id].xp === undefined || - awaitedTankDefinitions[id].tier === 1 + (tankDefinitions.tanks[id].xp === undefined || + tankDefinitions.tanks[id].tier === 1 ? 0 - : awaitedTankDefinitions[id].xp), + : tankDefinitions.tanks[id].xp), 0, ); const totalCredits = line.reduce( - (credits, id) => credits + awaitedTankDefinitions[id].price.value, + (credits, id) => credits + tankDefinitions.tanks[id].price.value, 0, ); @@ -70,7 +70,7 @@ export function TechTreeSection() { }); if ( - master.treeType !== 'researchable' || + master.type !== TankType.RESEARCHABLE || master.ancestors === undefined || master.ancestors.length === 0 ) { @@ -163,7 +163,7 @@ export function TechTreeSection() { {line.map((id, index) => { const last = index === line.length - 1; - const tank = awaitedTankDefinitions[id]; + const tank = tankDefinitions.tanks[id]; return ( diff --git a/packages/website/src/components/Tankopedia/VideoSection.tsx b/packages/website/src/components/Tankopedia/VideoSection.tsx index f291044b2..a05f21ca4 100644 --- a/packages/website/src/components/Tankopedia/VideoSection.tsx +++ b/packages/website/src/components/Tankopedia/VideoSection.tsx @@ -1,15 +1,15 @@ -import { reviews, youtubers } from '@blitzkit/core'; +import { fetchReviews, youtubers } from '@blitzkit/core'; import { Box, Flex, Heading, Link, Text } from '@radix-ui/themes'; import { Var } from '../../core/radix/var'; import { Duel } from '../../stores/duel'; import { PageWrapper } from '../PageWrapper'; import { VerifiedIcon } from '../VerifiedIcon'; -const awaitedReviews = await reviews; +const reviews = await fetchReviews(); export function VideoSection() { const tank = Duel.use((state) => state.protagonist.tank); - const videos = awaitedReviews.reviews[tank.id]?.videos; + const videos = reviews.reviews[tank.id]?.videos; if (!videos) return null; diff --git a/packages/website/src/components/TanksEmbed.tsx b/packages/website/src/components/TanksEmbed.tsx index 77844c452..42dbc5b2f 100644 --- a/packages/website/src/components/TanksEmbed.tsx +++ b/packages/website/src/components/TanksEmbed.tsx @@ -1,16 +1,18 @@ import { - CompositeStatsKey, previewCompositeStat, + TankClass, TankDefinition, + TankType, + type CompositeStatsKey, } from '@blitzkit/core'; import strings from '@blitzkit/core/lang/en-US.json'; import { amberDark, blueDark } from '@radix-ui/colors'; import { Flex, Text } from '@radix-ui/themes'; import { times } from 'lodash-es'; -import { ReactNode } from 'react'; -import { toRadiusVar } from '../../../website-legacy/src/core/radix/utils'; -import { useEmbedStateCurry } from '../../../website-legacy/src/stores/embedState/utilities'; +import type { ReactNode } from 'react'; import { breakdownConfig } from '../constants/embeds'; +import { toRadiusVar } from '../core/radix/utils'; +import { useEmbedStateCurry } from '../stores/embedState/utilities'; import { ClassHeavy } from './ClassIcon/components/ClassHeavy'; import { ClassLight } from './ClassIcon/components/ClassLight'; import { ClassMedium } from './ClassIcon/components/ClassMedium'; @@ -63,12 +65,12 @@ export function BreakdownEmbedCard({ tank }: BreakdownEmbedCardProps) { style: tank === null ? undefined - : tank.treeType === 'researchable' || + : tank.type === TankType.RESEARCHABLE || !useState('cardTitleTypeColor') ? undefined : { color: - tank.treeType === 'premium' + tank.type === TankType.PREMIUM ? amberDark.amber11 : blueDark.blue11, }, @@ -77,16 +79,16 @@ export function BreakdownEmbedCard({ tank }: BreakdownEmbedCardProps) { {useState('cardTitleClassIcon') && tank !== null && ( <> - {tank.class === 'lightTank' && ( + {tank.class === TankClass.LIGHT && ( )} - {tank.class === 'mediumTank' && ( + {tank.class === TankClass.MEDIUM && ( )} - {tank.class === 'heavyTank' && ( + {tank.class === TankClass.HEAVY && ( )} - {tank.class === 'AT-SPG' && ( + {tank.class === TankClass.TANK_DESTROYER && ( )} diff --git a/packages/website/src/core/blitz/correctZYTuple.ts b/packages/website/src/core/blitz/correctZYTuple.ts index 99a536268..572f3439d 100644 --- a/packages/website/src/core/blitz/correctZYTuple.ts +++ b/packages/website/src/core/blitz/correctZYTuple.ts @@ -1,6 +1,7 @@ -import { Vector3, type Vector3Tuple } from 'three'; +import type { Vector3 as BlitzkitVector3 } from '@blitzkit/core'; +import { Vector3 as THREEVector3 } from 'three'; import { rotateDavaVector } from './rotateDavaVector'; -export function correctZYTuple(tuple: Vector3Tuple) { - return rotateDavaVector(new Vector3(tuple[0], tuple[1], -tuple[2])); +export function correctZYTuple(tuple: BlitzkitVector3) { + return rotateDavaVector(new THREEVector3(tuple.x, tuple.y, -tuple.z)); } diff --git a/packages/website/src/core/blitzkit/hasEquipment.ts b/packages/website/src/core/blitzkit/hasEquipment.ts index 5d96c3b77..854af3f77 100644 --- a/packages/website/src/core/blitzkit/hasEquipment.ts +++ b/packages/website/src/core/blitzkit/hasEquipment.ts @@ -1,4 +1,4 @@ -import { equipmentDefinitions } from '@blitzkit/core'; +import { fetchEquipmentDefinitions } from '@blitzkit/core'; import type { EquipmentMatrix } from '../../stores/duel'; export async function hasEquipment( @@ -6,14 +6,17 @@ export async function hasEquipment( equipmentPreset: string, equipmentMatrix: EquipmentMatrix, ) { - const awaitedEquipmentDefinitions = await equipmentDefinitions; - const presetRows = awaitedEquipmentDefinitions.presets[equipmentPreset]; - return presetRows.some((equipmentRow, rowIndex) => { - return equipmentRow.some((equipment, columnIndex) => { - const choice = equipmentMatrix[rowIndex][columnIndex]; - if (choice === 0) return false; - const equipped = equipment[choice === -1 ? 0 : 1]; - return equipped === id; - }); + const equipmentDefinitions = await fetchEquipmentDefinitions(); + const preset = equipmentDefinitions.presets[equipmentPreset]; + return preset.slots.some((slot, index) => { + const row = Math.floor(index / 3); + const column = index % 3; + const choice = equipmentMatrix[row][column]; + + if (choice === 0) return false; + + const equipped = slot[choice === -1 ? 'left' : 'right']; + + return equipped === id; }); } diff --git a/packages/website/src/core/blitzkit/resolveReload.ts b/packages/website/src/core/blitzkit/resolveReload.ts index 94ae9df7f..77c71ba46 100644 --- a/packages/website/src/core/blitzkit/resolveReload.ts +++ b/packages/website/src/core/blitzkit/resolveReload.ts @@ -2,18 +2,18 @@ import type { GunDefinition } from '@blitzkit/core'; export function resolveReload(gun: GunDefinition) { if (gun.gunType!.$case === 'regular') { - return gun.gunType!.value.regular.reload; + return gun.gunType!.value.extension.reload; } else if (gun.gunType!.$case === 'autoLoader') { return ( - gun.gunType!.value.autoLoader.clipReload + - (gun.gunType!.value.autoLoader.shellCount - 1) * - gun.gunType!.value.autoLoader.intraClip + gun.gunType!.value.extension.clipReload + + (gun.gunType!.value.extension.shellCount - 1) * + gun.gunType!.value.extension.intraClip ); } else { return ( - gun.gunType!.value.autoReloader.shellReloads.reduce((a, b) => a + b, 0) + - (gun.gunType!.value.autoReloader.shellCount - 1) * - gun.gunType!.value.autoReloader.intraClip + gun.gunType!.value.extension.shellReloads.reduce((a, b) => a + b, 0) + + (gun.gunType!.value.extension.shellCount - 1) * + gun.gunType!.value.extension.intraClip ); } } diff --git a/packages/website/src/core/blitzkit/tankToDuelMember.ts b/packages/website/src/core/blitzkit/tankToDuelMember.ts index 7b8043a09..7b067dbdd 100644 --- a/packages/website/src/core/blitzkit/tankToDuelMember.ts +++ b/packages/website/src/core/blitzkit/tankToDuelMember.ts @@ -37,11 +37,11 @@ export function tankToDuelMember( infinityFallback(PROVISION_PREFERENCES.indexOf(b.id)), ) .sort((a, b) => (b.crew ?? 0) - (a.crew ?? 0)) - .slice(0, tank.provisions) + .slice(0, tank.maxProvisions) .map(({ id }) => id), engine: tank.engines.at(-1)!, gun, - shell: tank.turrets.at(-1)!.guns.at(-1)!.shells[0], + shell: tank.turrets.at(-1)!.guns.at(-1)!.gunType!.value.base.shells[0], tank, track: tank.tracks.at(-1)!, yaw: 0, diff --git a/packages/website/src/hooks/useEquipment.ts b/packages/website/src/hooks/useEquipment.ts index 4e4ee9f2d..dbbb3fdfd 100644 --- a/packages/website/src/hooks/useEquipment.ts +++ b/packages/website/src/hooks/useEquipment.ts @@ -1,31 +1,31 @@ -import { equipmentDefinitions } from '@blitzkit/core'; +import { fetchEquipmentDefinitions } from '@blitzkit/core'; import { useMemo } from 'react'; import { Duel } from '../stores/duel'; -const awaitedEquipmentDefinitions = await equipmentDefinitions; +const equipmentDefinitions = await fetchEquipmentDefinitions(); export function useEquipment(id: number, antagonist = false) { const member = Duel.use( (state) => state[antagonist ? 'antagonist' : 'protagonist']!, ); - const equipmentRows = - awaitedEquipmentDefinitions.presets[member.tank.equipment]; + const preset = equipmentDefinitions.presets[member.tank.equipmentPreset]; const equipmentMatrix = Duel.use( (state) => state[antagonist ? 'antagonist' : 'protagonist']!.equipmentMatrix, ); - const value = useMemo( - () => - equipmentRows.some((equipmentRow, rowIndex) => { - return equipmentRow.some((equipment, columnIndex) => { - const choice = equipmentMatrix[rowIndex][columnIndex]; - if (choice === 0) return false; - const equipped = equipment[choice === -1 ? 0 : 1]; - return equipped === id; - }); - }), - [equipmentMatrix, member.tank], - ); + const value = useMemo(() => { + return preset.slots.some((slot, index) => { + const row = Math.floor(index / 3); + const column = index % 3; + const choice = equipmentMatrix[row][column]; + + if (choice === 0) return false; + + const equipped = slot[choice === -1 ? 'left' : 'right']; + + return equipped === id; + }); + }, [equipmentMatrix, member.tank]); return value; } diff --git a/packages/website/src/hooks/useProvision.ts b/packages/website/src/hooks/useProvision.ts index 606c38f93..054664f7e 100644 --- a/packages/website/src/hooks/useProvision.ts +++ b/packages/website/src/hooks/useProvision.ts @@ -1,4 +1,4 @@ -import * as Duel from '../stores/duel'; +import { Duel } from '../stores/duel'; export function useProvision(id: number) { const provisions = Duel.use((state) => state.protagonist.provisions); diff --git a/packages/website/src/hooks/useTankTransform.ts b/packages/website/src/hooks/useTankTransform.ts index 2f718eecc..dacec28e2 100644 --- a/packages/website/src/hooks/useTankTransform.ts +++ b/packages/website/src/hooks/useTankTransform.ts @@ -52,12 +52,16 @@ export function useTankTransform( .applyAxisAngle(new Vector3(0, 0, 1), yaw); turretRotation.set(0, 0, yaw); - if (tankModelDefinition.turretRotation) { + if (tankModelDefinition.initialTurretRotation) { const initialPitch = -degToRad( - tankModelDefinition.turretRotation.pitch, + tankModelDefinition.initialTurretRotation.pitch, + ); + const initialYaw = -degToRad( + tankModelDefinition.initialTurretRotation.yaw, + ); + const initialRoll = -degToRad( + tankModelDefinition.initialTurretRotation.roll, ); - const initialYaw = -degToRad(tankModelDefinition.turretRotation.yaw); - const initialRoll = -degToRad(tankModelDefinition.turretRotation.roll); turretPosition .applyAxisAngle(I_HAT, initialPitch) diff --git a/packages/website/src/stores/wargamingLogin.ts b/packages/website/src/stores/wargamingLogin.ts index 1ffea6665..db37e920d 100644 --- a/packages/website/src/stores/wargamingLogin.ts +++ b/packages/website/src/stores/wargamingLogin.ts @@ -1,6 +1,6 @@ import { persistentMap } from '@nanostores/persistent'; -type PatreonLogin = +type WargamingLogin = | { token: undefined; } @@ -10,6 +10,6 @@ type PatreonLogin = expires: string; }; -export const $wargamingLogin = persistentMap('wargaming:', { +export const $wargamingLogin = persistentMap('wargaming:', { token: undefined, });