From e4e92d76b4c1fb65da2e03a42a7b93f1a7db5f1a Mon Sep 17 00:00:00 2001 From: Mark Greene Date: Mon, 5 Oct 2026 18:18:19 +1300 Subject: [PATCH] Feature: tier XI compatibility Prepares BlitzKit for tier XI tanks ahead of their release. Tier X was hardcoded as the maximum in the tank search filters, the guesser and the tech tree, and had no roman numeral beyond X. - Added `XI` to `TIER_ROMAN_NUMERALS` - Added an awaitable tier list derived from the highest tier in the tank definitions, so nothing changes until tier XI tanks exist - Used it for the tank search tier filters and the guesser tier picker and defaults - Made the tech tree check for successors instead of assuming tier X is the last tier Fixes #302 --- .../core/src/blitzkit/tankDefinitions/constants.ts | 1 + packages/website/src/components/Guesser.tsx | 9 +++++---- .../components/TankSearch/components/FilterControl.tsx | 4 ++-- .../components/TankSearch/components/TierFilter.tsx | 7 ++++--- .../Tankopedia/TechTreeSection/components/Node.tsx | 2 +- .../components/Tankopedia/TechTreeSection/index.tsx | 2 +- packages/website/src/core/awaitables/tiers.ts | 10 ++++++++++ packages/website/src/stores/guess.ts | 6 ++++-- 8 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 packages/website/src/core/awaitables/tiers.ts diff --git a/packages/core/src/blitzkit/tankDefinitions/constants.ts b/packages/core/src/blitzkit/tankDefinitions/constants.ts index 5224cdae7..9671b938a 100644 --- a/packages/core/src/blitzkit/tankDefinitions/constants.ts +++ b/packages/core/src/blitzkit/tankDefinitions/constants.ts @@ -54,6 +54,7 @@ export const TIER_ROMAN_NUMERALS: Record = { 8: "VIII", 9: "IX", 10: "X", + 11: "XI", }; export const flags: Record = { diff --git a/packages/website/src/components/Guesser.tsx b/packages/website/src/components/Guesser.tsx index 09c1a3cd0..a468d900b 100644 --- a/packages/website/src/components/Guesser.tsx +++ b/packages/website/src/components/Guesser.tsx @@ -27,9 +27,10 @@ import { TextField, } from "@radix-ui/themes"; import fuzzysort from "fuzzysort"; -import { debounce, times } from "lodash-es"; +import { debounce } from "lodash-es"; import { useCallback, useEffect, useRef, useState } from "react"; import { awaitableTankNames } from "../core/awaitables/tankNames"; +import { awaitableTiers } from "../core/awaitables/tiers"; import { api } from "../core/blitzkit/api"; import { useLocale } from "../hooks/useLocale"; import { Guess, GuessState } from "../stores/guess"; @@ -38,9 +39,10 @@ import { SearchResults } from "./SearchResults"; const { go } = fuzzysort; -const [tankNames, tankDefinitions] = await Promise.all([ +const [tankNames, tankDefinitions, TIERS] = await Promise.all([ awaitableTankNames, api.tankDefinitions(), + awaitableTiers, ]); const ids = Object.keys(tankDefinitions.tanks); @@ -193,8 +195,7 @@ export function Guesser() { - {times(10, (index) => { - const tier = 10 - index; + {TIERS.map((tier) => { const isSelected = tiers.includes(tier); return ( diff --git a/packages/website/src/components/TankSearch/components/FilterControl.tsx b/packages/website/src/components/TankSearch/components/FilterControl.tsx index 41400d365..5892aacd1 100644 --- a/packages/website/src/components/TankSearch/components/FilterControl.tsx +++ b/packages/website/src/components/TankSearch/components/FilterControl.tsx @@ -25,8 +25,8 @@ import { Tooltip, type FlexProps, } from "@radix-ui/themes"; -import { times } from "lodash-es"; import { Fragment, type ComponentProps, type ReactNode } from "react"; +import { awaitableTiers } from "../../../core/awaitables/tiers"; import { api } from "../../../core/blitzkit/api"; import { useLocale } from "../../../hooks/useLocale"; import { App } from "../../../stores/app"; @@ -171,7 +171,7 @@ const GUN_TYPES = Object.keys( const MAX_ICONS = 4; -const TIERS = times(10, (i) => 10 - i); +const TIERS = await awaitableTiers; export function FilterControl() { return ( diff --git a/packages/website/src/components/TankSearch/components/TierFilter.tsx b/packages/website/src/components/TankSearch/components/TierFilter.tsx index 735399ea9..7129ac418 100644 --- a/packages/website/src/components/TankSearch/components/TierFilter.tsx +++ b/packages/website/src/components/TankSearch/components/TierFilter.tsx @@ -1,10 +1,12 @@ import { TIER_ROMAN_NUMERALS } from "@blitzkit/core"; import { Flex, IconButton, Text } from "@radix-ui/themes"; -import { times } from "lodash-es"; import { memo } from "react"; +import { awaitableTiers } from "../../../core/awaitables/tiers"; import { TankFilters } from "../../../stores/tankFilters"; import { TankSort } from "../../../stores/tankopediaSort"; +const TIERS = await awaitableTiers; + export const TierFilter = memo(() => { const by = TankSort.use((state) => state.by); const search = TankFilters.use((state) => state.search); @@ -19,8 +21,7 @@ export const TierFilter = memo(() => { overflow="hidden" style={{ borderRadius: "var(--radius-full)" }} > - {times(10, (index) => { - const tier = 10 - index; + {TIERS.map((tier) => { const selected = tiers.includes(tier); return ( diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx index 5a710564e..6f575a078 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/components/Node.tsx @@ -127,7 +127,7 @@ export function Node({ id, highlight, nextIds, skeleton }: NodeProps) { - {averages && nextTanks && tank.tier !== 10 && ( + {averages && nextTanks && nextTanks.length > 0 && ( {skeleton && } {!skeleton && diff --git a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx index ab6119b1c..1b099c735 100644 --- a/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx +++ b/packages/website/src/components/Tankopedia/TechTreeSection/index.tsx @@ -191,7 +191,7 @@ export function TechTreeSection({ skeleton }: MaybeSkeletonComponentProps) { ); })} - {master.tier < 10 && ( + {master.successors.length > 0 && ( <> {master.successors!.map((id, index) => ( diff --git a/packages/website/src/core/awaitables/tiers.ts b/packages/website/src/core/awaitables/tiers.ts new file mode 100644 index 000000000..a83389b73 --- /dev/null +++ b/packages/website/src/core/awaitables/tiers.ts @@ -0,0 +1,10 @@ +import { times } from "lodash-es"; +import { api } from "../blitzkit/api"; + +export const awaitableTiers = api.tankDefinitions().then((tankDefinitions) => { + const maxTier = Math.max( + ...Object.values(tankDefinitions.tanks).map((tank) => tank.tier), + ); + + return times(maxTier, (index) => maxTier - index); +}); diff --git a/packages/website/src/stores/guess.ts b/packages/website/src/stores/guess.ts index 0a3e94f49..76a6f7c8c 100644 --- a/packages/website/src/stores/guess.ts +++ b/packages/website/src/stores/guess.ts @@ -1,6 +1,8 @@ import type { TankDefinition } from "@blitzkit/core"; -import { times } from "lodash-es"; import { Varuna } from "varuna"; +import { awaitableTiers } from "../core/awaitables/tiers"; + +const tiers = await awaitableTiers; export enum GuessState { Correct, @@ -25,5 +27,5 @@ export const Guess = new Varuna((tank) => ({ correctGuesses: 0, streak: 0, helpingReveal: false, - tiers: times(10, (index) => index + 1), + tiers, }));