From 89e97f484ba78e34c3be7e6c3f64fbf4116b989a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 3 May 2024 23:58:19 -0500 Subject: [PATCH] feat: unlocks proof of concept --- scripts/buildAssets/definitions.ts | 34 +++++++++ .../[id]/components/Model/ModulesSection.tsx | 73 +++++++++++++++++++ src/app/tools/tankopedia/[id]/page.tsx | 2 + src/core/blitzkit/tankDefinitions/index.ts | 9 +++ 4 files changed, 118 insertions(+) create mode 100644 src/app/tools/tankopedia/[id]/components/Model/ModulesSection.tsx diff --git a/scripts/buildAssets/definitions.ts b/scripts/buildAssets/definitions.ts index 6f737f4f7..89af27e07 100644 --- a/scripts/buildAssets/definitions.ts +++ b/scripts/buildAssets/definitions.ts @@ -453,6 +453,36 @@ export async function definitions(production: boolean) { `${DATA}/${POI.vehicleDefinitions}/${nation}/components/chassis.xml.dvpl`, ); + function resolveUnlocks(unlocks?: Unlocks) { + if (!unlocks) return undefined; + + return Object.entries(unlocks) + .map(([type, list]) => + (Array.isArray(list) ? list : [list]).map((item) => { + const typeTyped = type as keyof Unlocks; + let rawId: number; + + if (typeTyped === 'chassis') { + rawId = chassisList.root.ids[item['#text']]; + } else if (typeTyped === 'engine') { + rawId = enginesList.root.ids[item['#text']]; + } else if (typeTyped === 'gun') { + rawId = gunList.root.ids[item['#text']]; + } else if (typeTyped === 'turret') { + rawId = turretList.root.ids[item['#text']]; + } else if (typeTyped === 'vehicle') { + rawId = tankList.root[item['#text']].id; + } + + return { + type: typeTyped, + id: toUniqueId(nation, rawId!), + }; + }), + ) + .flat(); + } + for (const tankKey in tankList.root) { if (botPattern.test(tankKey)) continue; @@ -626,6 +656,7 @@ export async function definitions(production: boolean) { soft: terrainResistances[2], }, tier: track.level as Tier, + unlocks: resolveUnlocks(track.unlocks), }); modelDefinitions[tankId].tracks[trackId] = { @@ -650,6 +681,7 @@ export async function definitions(production: boolean) { tier: engineListEntry.level as Tier, weight: engineListEntry.weight, power: engineListEntry.power, + unlocks: resolveUnlocks(engine.unlocks), }); }); @@ -711,6 +743,7 @@ export async function definitions(production: boolean) { health: turret.maxHealth, viewRange: turret.circularVisionRadius, weight: turret.weight, + unlocks: resolveUnlocks(turret.unlocks), }); modelDefinitions[tankId].turrets[turretId] = { @@ -829,6 +862,7 @@ export async function definitions(production: boolean) { shot: shotDispersionFactors.afterShot, traverse: shotDispersionFactors.turretRotation, }, + unlocks: resolveUnlocks(gun.unlocks), } as GunDefinition); modelDefinitions[tankId].turrets[turretId].guns[gunId] = { diff --git a/src/app/tools/tankopedia/[id]/components/Model/ModulesSection.tsx b/src/app/tools/tankopedia/[id]/components/Model/ModulesSection.tsx new file mode 100644 index 000000000..de04ef3c7 --- /dev/null +++ b/src/app/tools/tankopedia/[id]/components/Model/ModulesSection.tsx @@ -0,0 +1,73 @@ +import { Heading } from '@radix-ui/themes'; +import { use } from 'react'; +import PageWrapper from '../../../../../../components/PageWrapper'; +import { + EngineDefinition, + GunDefinition, + ModuleType, + tankDefinitions, + TrackDefinition, + TurretDefinition, + Unlock, +} from '../../../../../../core/blitzkit/tankDefinitions'; +import { useDuel } from '../../../../../../stores/duel'; + +export function ModulesSection() { + const awaitedTankDefinitions = use(tankDefinitions); + const tank = useDuel((state) => state.protagonist!.tank); + + function tree(type: ModuleType, unlocks: Unlock[]) { + return ( +