From 561b59d23523b5c9a3e4298aead574e2c0732e65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 25 Jan 2024 12:45:13 -0600 Subject: [PATCH] feat: camouflage --- scripts/buildAssets/camouflageIcons.ts | 20 +++++++ scripts/buildAssets/constants.ts | 1 + scripts/buildAssets/index.ts | 54 +++++++------------ .../Configure/components/Camouflage.tsx | 28 ++++++++++ .../[id]/components/Configure/index.tsx | 6 +-- src/components/ModuleButton.tsx | 11 +++- src/stores/tankopedia.ts | 2 + 7 files changed, 81 insertions(+), 41 deletions(-) create mode 100644 scripts/buildAssets/camouflageIcons.ts create mode 100644 src/app/tools/tankopedia/[id]/components/Configure/components/Camouflage.tsx diff --git a/scripts/buildAssets/camouflageIcons.ts b/scripts/buildAssets/camouflageIcons.ts new file mode 100644 index 000000000..c9543456c --- /dev/null +++ b/scripts/buildAssets/camouflageIcons.ts @@ -0,0 +1,20 @@ +import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; +import { commitAssets } from '../../src/core/blitzkrieg/commitAssets'; +import { FileChange } from '../../src/core/blitzkrieg/commitMultipleFiles'; +import { DATA, POI } from './constants'; + +export async function camouflageIcons(production: boolean) { + console.log('Building camouflage icons...'); + const content = await readDVPLFile( + `${DATA}/${POI.defaultCamoIcon.replace('.webp', '.packed.webp.dvpl')}`, + ).then((content) => content.toString('base64')); + const changes: FileChange[] = [ + { + content, + encoding: 'base64', + path: 'icons/camo.webp', + }, + ]; + + await commitAssets('camo icons', changes, production); +} diff --git a/scripts/buildAssets/constants.ts b/scripts/buildAssets/constants.ts index 6ff1bc164..c73d99f0c 100644 --- a/scripts/buildAssets/constants.ts +++ b/scripts/buildAssets/constants.ts @@ -24,4 +24,5 @@ export const POI = { consumableIcons: 'Gfx/UI/InventoryIcons/Big/Consumables', equipmentItemImageMappings: 'UI/Screens3/Lobby/Inventory/Equipment/EquipmentItemImage.style.yaml', + defaultCamoIcon: 'Gfx/UI/Hangar/IconCamouflage.webp', } as const; diff --git a/scripts/buildAssets/index.ts b/scripts/buildAssets/index.ts index f2c139e17..6aafe8ec4 100644 --- a/scripts/buildAssets/index.ts +++ b/scripts/buildAssets/index.ts @@ -1,5 +1,6 @@ import { config } from 'dotenv'; import { argv } from 'process'; +import { camouflageIcons } from './camouflageIcons'; import { buildCircleFlags } from './circleFlags'; import { buildConsumableIcons } from './consumableIcons'; import { buildDefinitions } from './definitions'; @@ -22,41 +23,22 @@ const production = argv.includes('--production'); if (!targets && !allTargets) throw new Error('No target(s) specified'); -if (allTargets || targets?.includes('tankModels')) { - await buildTankModels(production); -} +const methods = [ + buildTankModels, + buildTankArmors, + buildDefinitions, + buildTankIcons, + buildScratchedFlags, + buildCircleFlags, + buildShellIcons, + buildModuleIcons, + equipmentIcons, + buildConsumableIcons, + camouflageIcons, +]; -if (allTargets || targets?.includes('tankArmor')) { - await buildTankArmors(production); -} - -if (allTargets || targets?.includes('definitions')) { - await buildDefinitions(production); -} - -if (allTargets || targets?.includes('tankIcons')) { - await buildTankIcons(production); -} - -if (allTargets || targets?.includes('scratchedFlags')) { - await buildScratchedFlags(production); -} - -if (allTargets || targets?.includes('circleFlags')) { - await buildCircleFlags(production); -} - -if (allTargets || targets?.includes('shellIcons')) { - await buildShellIcons(production); -} - -if (allTargets || targets?.includes('moduleIcons')) { - await buildModuleIcons(production); -} -if (allTargets || targets?.includes('equipmentIcons')) { - equipmentIcons(production); -} - -if (allTargets || targets?.includes('consumableIcons')) { - await buildConsumableIcons(production); +for (const method of methods) { + if (allTargets || targets?.includes(method.name)) { + await method(production); + } } diff --git a/src/app/tools/tankopedia/[id]/components/Configure/components/Camouflage.tsx b/src/app/tools/tankopedia/[id]/components/Configure/components/Camouflage.tsx new file mode 100644 index 000000000..d5f46c2d4 --- /dev/null +++ b/src/app/tools/tankopedia/[id]/components/Configure/components/Camouflage.tsx @@ -0,0 +1,28 @@ +import { Flex, Heading } from '@radix-ui/themes'; +import { ModuleButton } from '../../../../../../../components/ModuleButton'; +import { + mutateTankopediaTemporary, + useTankopediaTemporary, +} from '../../../../../../../stores/tankopedia'; + +export function Camouflage() { + const camouflage = useTankopediaTemporary((state) => state.camouflage); + + return ( + + Camouflage + + { + mutateTankopediaTemporary((draft) => { + draft.camouflage = !camouflage; + }); + }} + /> + + ); +} diff --git a/src/app/tools/tankopedia/[id]/components/Configure/index.tsx b/src/app/tools/tankopedia/[id]/components/Configure/index.tsx index 57b73e568..b00a07843 100644 --- a/src/app/tools/tankopedia/[id]/components/Configure/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/Configure/index.tsx @@ -1,4 +1,5 @@ import { Flex, Heading } from '@radix-ui/themes'; +import { Camouflage } from './components/Camouflage'; import { Consumables } from './components/Consumables'; import { Equipments } from './components/Equipments'; import { Modules } from './components/Modules'; @@ -12,6 +13,7 @@ export function Configure() { + {/* @@ -19,10 +21,6 @@ export function Configure() { Camouflage - - Consumables - - Provisions */} diff --git a/src/components/ModuleButton.tsx b/src/components/ModuleButton.tsx index e0b70da3a..8984061d8 100644 --- a/src/components/ModuleButton.tsx +++ b/src/components/ModuleButton.tsx @@ -25,6 +25,9 @@ type ModuleButtonProps = Omit, 'type'> & { type: 'consumable'; consumable: number; } + | { + type: 'camouflage'; + } ); export function ModuleButton({ @@ -49,6 +52,10 @@ export function ModuleButton({ imageStyles.top = '50%'; imageStyles.left = '50%'; imageStyles.transform = 'translate(calc(-50% + 2px), calc(-50% + 2px))'; + } else if (props.type === 'camouflage') { + imageStyles.top = '50%'; + imageStyles.left = '50%'; + imageStyles.transform = 'translate(calc(-50% + 4px), calc(-50% + 4px))'; } return ( @@ -80,7 +87,9 @@ export function ModuleButton({ ? `icons/shells/${props.shell}.webp` : props.type === 'consumable' ? `icons/consumables/${props.consumable}.webp` - : `icons/equipment/${props.equipment}.webp`, + : props.type === 'camouflage' + ? `icons/camo.webp` + : `icons/equipment/${props.equipment}.webp`, )} style={imageStyles} /> diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts index 373bac842..fa31e2bae 100644 --- a/src/stores/tankopedia.ts +++ b/src/stores/tankopedia.ts @@ -58,6 +58,7 @@ interface TankopediaTemporary { equipmentMatrix: EquipmentMatrix; mode: TankopediaMode; consumables: number[]; + camouflage: boolean; } export const useTankopediaPersistent = create()( @@ -106,6 +107,7 @@ export const useTankopediaTemporary = create()( ], mode: 'model', consumables: [], + camouflage: false, })), );