diff --git a/packages/website-ue/src/components/TankopediaLoadout/index.tsx b/packages/website-ue/src/components/TankopediaLoadout/index.tsx index 420a9cb67..1db14ddee 100644 --- a/packages/website-ue/src/components/TankopediaLoadout/index.tsx +++ b/packages/website-ue/src/components/TankopediaLoadout/index.tsx @@ -5,7 +5,6 @@ import { StandardPrice } from "@protos/blitz_static_standard_price"; import type { UpgradeLine } from "@protos/blitz_static_tank_upgrade_line"; import type { StageParameters } from "@protos/blitz_static_tank_upgrade_single_stage"; import { - ButtonIcon, CornerBottomLeftIcon, DoubleArrowLeftIcon, DoubleArrowRightIcon, @@ -30,15 +29,18 @@ import { useUpgradePreset } from "../../hooks/useUpgradePreset"; import { Tankopedia } from "../../stores/tankopedia"; import { Button } from "../Button"; import { Heading } from "../Heading"; -import { Link } from "../Link"; +import { IconButton } from "../IconButton"; import { Price } from "../Price"; import { Section } from "../Section"; import { Text } from "../Text"; import styles from "./index.module.css"; -import { IconButton } from "../IconButton"; -import { Tank } from "@protos/tank"; +import type { ComputedCharacteristics } from "../../tankopedia/computeCharacteristics"; -export function TankopediaLoadout() { +interface TankopediaLoadoutProps { + characteristics: ComputedCharacteristics; +} + +export function TankopediaLoadout({ characteristics }: TankopediaLoadoutProps) { const tank = useProtagonist(); const showModules = tank.tank!.upgrade_lines.some( @@ -49,22 +51,30 @@ export function TankopediaLoadout() {
{showModules && } - +
); } -function Consumables() { +interface ConsumablesProps { + characteristics: ComputedCharacteristics; +} + +function Consumables({ characteristics }: ConsumablesProps) { const consumables = useConsumables(); const tierPrices = useTierPrices(); const tank = useProtagonist(); - const isCompatible = useCompatibility(tank); + const isCompatible = useCompatibility(tank, characteristics); - return Object.values(consumables.consumables).map( - ({ compatibility, consumable, purchase }) => { + return Object.entries(consumables.consumables).map( + ([id, { compatibility, consumable, purchase }]) => { if (!isCompatible(compatibility!)) return null; - return {JSON.stringify(consumable, null, 2)}; + return ( + + {id} {JSON.stringify(consumable, null, 2)} + + ); }, ); } diff --git a/packages/website-ue/src/hooks/useCompatibility.ts b/packages/website-ue/src/hooks/useCompatibility.ts index 1c71aa657..db2332d63 100644 --- a/packages/website-ue/src/hooks/useCompatibility.ts +++ b/packages/website-ue/src/hooks/useCompatibility.ts @@ -5,8 +5,13 @@ import { TankAttributeChange_AttributeName } from "@protos/blitz_static_tank_upg import type { Sets } from "@protos/sets"; import type { Tank } from "@protos/tank"; import { useSets } from "./useSets"; +import type { ComputedCharacteristics } from "../tankopedia/computeCharacteristics"; +import { GunType } from "../tankopedia/characteristics"; -export function useCompatibility(tank: Tank) { +export function useCompatibility( + tank: Tank, + characteristics: ComputedCharacteristics, +) { const sets = useSets(); return function (compatibility: CompatibilityComponent) { @@ -26,11 +31,13 @@ export function useCompatibility(tank: Tank) { compatibility.tank_compatibility.include, tank, sets, + characteristics, ) && !tankCompatibilityApplies( compatibility.tank_compatibility.exclude, tank, sets, + characteristics, )) ); }; @@ -40,6 +47,7 @@ function tankCompatibilityApplies( include: TankCompatibility_Include | undefined, tank: Tank, sets: Sets, + characteristics: ComputedCharacteristics, ) { if (include === undefined) { return true; @@ -57,7 +65,9 @@ function tankCompatibilityApplies( ) || include.classes.some((_class) => _class === tank.tank!.tank_class) || include.catalogs_id.some((id) => id === tank.id) || - include.tank_traits.some((trait) => tankHasTraits(trait, tank)) || + include.tank_traits.some((trait) => + tankHasTraits(trait, tank, characteristics), + ) || include.types.some((type) => type === tank.tank!.tank_type) || include.tank_sets_catalog_ids.some((id) => Object.entries(sets.sets).some( @@ -74,23 +84,14 @@ function tankCompatibilityApplies( ); } -function tankHasTraits(traits: TankTraits, tank: Tank) { +function tankHasTraits( + traits: TankTraits, + tank: Tank, + characteristics: ComputedCharacteristics, +) { switch (traits) { case TankTraits.TANK_TRAITS_HAS_CLIP: - // TODO: use current tank state to check if the current gun has a clip - - return tank.tank!.upgrade_lines.some((line) => - line.stages.some((stage) => - stage.attributes.every((attribute) => - attribute.attribute_name !== - TankAttributeChange_AttributeName.ATTRIBUTE_NAME_IS_PUMP && - attribute.attribute_name === - TankAttributeChange_AttributeName.ATTRIBUTE_NAME_CLIP_SIZE - ? attribute.value === 1 - : true, - ), - ), - ); + return characteristics.gun_type !== GunType.Regular; default: throw new Error(`Unknown trait: ${traits}`); diff --git a/packages/website-ue/src/pages/[...locale]/tanks/[slug]/_index.tsx b/packages/website-ue/src/pages/[...locale]/tanks/[slug]/_index.tsx index 8d8b4e37e..52656c0ac 100644 --- a/packages/website-ue/src/pages/[...locale]/tanks/[slug]/_index.tsx +++ b/packages/website-ue/src/pages/[...locale]/tanks/[slug]/_index.tsx @@ -41,7 +41,7 @@ export const Page = withErrorWrapper(
- +

characteristics

diff --git a/packages/website-ue/src/tankopedia/characteristics.ts b/packages/website-ue/src/tankopedia/characteristics.ts index 1838f62b9..f26c2bcba 100644 --- a/packages/website-ue/src/tankopedia/characteristics.ts +++ b/packages/website-ue/src/tankopedia/characteristics.ts @@ -31,7 +31,7 @@ export enum GunType { } export const characteristics = { - gun_type({ attributeSafe, attribute }) { + gun_type({ attributeSafe }) { const isPump = attributeSafe(TankAttributeChange_AttributeName.ATTRIBUTE_NAME_IS_PUMP) ?? 0;