diff --git a/packages/core/src/blitzkit/api/server/2_camouflages.ts b/packages/core/src/blitzkit/api/server/2_camouflages.ts index d0939df34..441bc3c95 100644 --- a/packages/core/src/blitzkit/api/server/2_camouflages.ts +++ b/packages/core/src/blitzkit/api/server/2_camouflages.ts @@ -1,4 +1,4 @@ -import { CamouflageDefinitions } from "@blitzkit/core"; +import { CamouflageDefinitions } from "@blitzkit/protos"; import { Cache } from "./0_base"; import { ServerBlitzKitAPI1 } from "./1_tanks"; diff --git a/packages/core/src/blitzkit/api/server/3_models.ts b/packages/core/src/blitzkit/api/server/3_models.ts index 427ee452a..bb0adc137 100644 --- a/packages/core/src/blitzkit/api/server/3_models.ts +++ b/packages/core/src/blitzkit/api/server/3_models.ts @@ -1,19 +1,16 @@ import { - Armor, BlitzCrewType, ChassisDefinitionsList, - Crew, EngineDefinitionsList, GunDefinitionsList, - ModelDefinitions, TankParameters, toUniqueId, TurretDefinitionsList, - Vector3, VehicleDefinitionArmor, VehicleDefinitionList, VehicleDefinitions, } from "@blitzkit/core"; +import { Armor, Crew, ModelDefinitions, Vector3 } from "@blitzkit/protos"; import { Vector3Tuple } from "three"; import { Cache } from "./0_base"; import { ServerBlitzKitAPI2 } from "./2_camouflages"; diff --git a/packages/core/src/blitzkit/availableProvisions.ts b/packages/core/src/blitzkit/availableProvisions.ts index 9ad2cd667..5049111cc 100644 --- a/packages/core/src/blitzkit/availableProvisions.ts +++ b/packages/core/src/blitzkit/availableProvisions.ts @@ -3,6 +3,7 @@ import { ProvisionDefinitions, TankDefinition, } from "../../../protos/src/blitzkit"; +import { isTankCompatible } from "../tankopedia"; export function availableProvisions( tank: TankDefinition, @@ -10,6 +11,6 @@ export function availableProvisions( provisionDefinitions: ProvisionDefinitions, ) { return Object.values(provisionDefinitions.provisions).filter((provision) => - checkConsumableProvisionInclusivity(provision, tank, gun), + isTankCompatible(tank, gun, provision.include, provision.exclude), ); } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 3ed7973bc..18c510f77 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -7,4 +7,5 @@ export * from "./math"; export * from "./patreon"; export * from "./statistics"; export * from "./streams"; +export * from "./tankopedia"; export * from "./types"; diff --git a/packages/core/src/tankopedia/index.ts b/packages/core/src/tankopedia/index.ts new file mode 100644 index 000000000..4a426064e --- /dev/null +++ b/packages/core/src/tankopedia/index.ts @@ -0,0 +1 @@ +export * from "./isTankCompatible"; diff --git a/packages/core/src/tankopedia/isTankCompatible.ts b/packages/core/src/tankopedia/isTankCompatible.ts new file mode 100644 index 000000000..9bc0ded83 --- /dev/null +++ b/packages/core/src/tankopedia/isTankCompatible.ts @@ -0,0 +1,57 @@ +import { + ConsumableTankCategoryFilterCategory, + GunDefinition, + TankDefinition, + TankInclusivityFilter, +} from "@blitzkit/protos"; + +export function isTankCompatible( + tank: TankDefinition, + gun: GunDefinition, + include?: TankInclusivityFilter[], + exclude?: TankInclusivityFilter[], +) { + const included = include?.every((rule) => { + switch (rule.filter_type!.$case) { + case "tiers": + return ( + rule.filter_type!.value.min <= tank.tier && + tank.tier <= rule.filter_type!.value.max + ); + + case "ids": + return rule.filter_type!.value.ids.includes(tank.id); + + case "nations": + return rule.filter_type!.value.nations.includes(tank.nation); + + case "categories": + throw new SyntaxError("Category filtering found in include rule"); + } + }); + const excluded = exclude?.some((rule) => { + switch (rule.filter_type!.$case) { + case "tiers": + return ( + rule.filter_type!.value.min <= tank.tier && + tank.tier <= rule.filter_type!.value.max + ); + + case "ids": + return rule.filter_type!.value.ids.includes(tank.id); + + case "nations": + return rule.filter_type!.value.nations.includes(tank.nation); + + case "categories": + return rule.filter_type!.value.categories.some((category) => { + switch (category) { + case ConsumableTankCategoryFilterCategory.CONSUMABLE_TANK_CATEGORY_FILTER_CATEGORY_CLIP: + return gun.gun_type!.$case !== "regular"; + } + }); + } + }); + + return include !== undefined && include?.length > 0 && included && !excluded; +} diff --git a/packages/website/src/components/TankSearch/index.tsx b/packages/website/src/components/TankSearch/index.tsx index 6bda2757d..a1f633a08 100644 --- a/packages/website/src/components/TankSearch/index.tsx +++ b/packages/website/src/components/TankSearch/index.tsx @@ -4,9 +4,9 @@ import { resolveDpm, SEARCH_KEYS, unionBoundingBox, - type TankDefinition, } from "@blitzkit/core"; import { literals } from "@blitzkit/i18n/src/literals"; +import type { TankDefinition } from "@blitzkit/protos"; import fuzzysort from "fuzzysort"; import { uniq } from "lodash-es"; import { memo, useMemo } from "react"; @@ -16,6 +16,7 @@ import { awaitableTankNames } from "../../core/awaitables/tankNames"; import { filterTanks } from "../../core/blitzkit/filterTanks"; import { resolveReload } from "../../core/blitzkit/resolveReload"; import { useLocale } from "../../hooks/useLocale"; +import { useStrings } from "../../hooks/useStrings"; import { App } from "../../stores/app"; import { TankFilters } from "../../stores/tankFilters"; import { TankopediaPersistent } from "../../stores/tankopediaPersistent"; @@ -53,7 +54,8 @@ const [gameDefinitions, modelDefinitions, tankDefinitions, tankNames] = export const TankSearch = memo( ({ compact, onSelect, onSelectAll, skeleton }) => { - const { strings, locale } = useLocale(); + const strings = useStrings(); + const locale = useLocale(); const wargaming = App.use((state) => state.logins.wargaming); const awaitedTanksDefinitionsArray = Object.values(tankDefinitions.tanks); const tankopediaSort = TankSort.use(); diff --git a/packages/website/src/hooks/useTankCompatibility.ts b/packages/website/src/hooks/useTankCompatibility.ts index d3f878d87..9324270c4 100644 --- a/packages/website/src/hooks/useTankCompatibility.ts +++ b/packages/website/src/hooks/useTankCompatibility.ts @@ -1,5 +1,5 @@ +import { isTankCompatible } from "@blitzkit/core"; import { - ConsumableTankCategoryFilterCategory, GunDefinition, TankDefinition, TankInclusivityFilter, @@ -13,54 +13,3 @@ export function useTankCompatibility(tank: TankDefinition, gun: GunDefinition) { return isTankCompatible(tank, gun, include, exclude); }; } - -export function isTankCompatible( - tank: TankDefinition, - gun: GunDefinition, - include?: TankInclusivityFilter[], - exclude?: TankInclusivityFilter[], -) { - const included = include?.every((rule) => { - switch (rule.filter_type!.$case) { - case "tiers": - return ( - rule.filter_type!.value.min <= tank.tier && - tank.tier <= rule.filter_type!.value.max - ); - - case "ids": - return rule.filter_type!.value.ids.includes(tank.id); - - case "nations": - return rule.filter_type!.value.nations.includes(tank.nation); - - case "categories": - throw new SyntaxError("Category filtering found in include rule"); - } - }); - const excluded = exclude?.some((rule) => { - switch (rule.filter_type!.$case) { - case "tiers": - return ( - rule.filter_type!.value.min <= tank.tier && - tank.tier <= rule.filter_type!.value.max - ); - - case "ids": - return rule.filter_type!.value.ids.includes(tank.id); - - case "nations": - return rule.filter_type!.value.nations.includes(tank.nation); - - case "categories": - return rule.filter_type!.value.categories.some((category) => { - switch (category) { - case ConsumableTankCategoryFilterCategory.CONSUMABLE_TANK_CATEGORY_FILTER_CATEGORY_CLIP: - return gun.gun_type!.$case !== "regular"; - } - }); - } - }); - - return include !== undefined && include?.length > 0 && included && !excluded; -} diff --git a/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.tsx b/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.tsx index 4f729490e..b0e3cc32a 100644 --- a/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.tsx +++ b/packages/website/src/pages/[...chunk_default]/[...locale]/tanks/[slug]/_index.tsx @@ -1,10 +1,11 @@ import { useMemo } from "react"; import { api } from "../../../../../api/dynamic"; -import { computeCharacteristics } from "../../../../../tankopedia/computeCharacteristics"; +import { TankopediaLoadout } from "../../../../../components/TankopediaLoadout"; import { withErrorWrapper } from "../../../../../hocs/withErrorWrapper"; import { withLocale } from "../../../../../hocs/withLocale"; import { useAwait } from "../../../../../hooks/useAwait"; import { Tankopedia } from "../../../../../stores/tankopedia"; +import { computeCharacteristics } from "../../../../../tankopedia/computeCharacteristics"; import styles from "./_index.module.css"; interface PageProps {