diff --git a/.vscode/settings.json b/.vscode/settings.json index 549fa2304..22a7d3591 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -125,6 +125,7 @@ "Synx", "tankaverages", "Tankerch", + "tankmen", "tankopedia", "tankopedias", "tankstats", diff --git a/package.json b/package.json index 12d0e558b..618462289 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blitzkrieg", - "version": "1.18.2", + "version": "1.18.3", "description": "🎉 Tools for everything World of Tanks Blitz", "main": "src/server.ts", "type": "module", diff --git a/scripts/buildAssets/crewSkillIcons.ts b/scripts/buildAssets/crewSkillIcons.ts new file mode 100644 index 000000000..18b8ad3df --- /dev/null +++ b/scripts/buildAssets/crewSkillIcons.ts @@ -0,0 +1,51 @@ +import sharp from 'sharp'; +import { TankClass } from '../../src/components/Tanks'; +import { readDVPLFile } from '../../src/core/blitz/readDVPLFile'; +import { readXMLDVPL } from '../../src/core/blitz/readXMLDVPL'; +import { commitAssets } from '../../src/core/blitzkrieg/commitAssets'; +import { FileChange } from '../../src/core/blitzkrieg/commitMultipleFiles'; +import { DATA } from './constants'; + +interface SkillIcon { + name: string; + state: number; +} + +interface Avatar { + roles: unknown; + skillsByClasses: Record; + skills: { + [name: string]: { + userString: '#crew_skills:surrounded_by_enemy/name'; + effectDescription: '#crew_skills:surrounded_by_enemy/effect'; + tipDescription: '#crew_skills:surrounded_by_enemy/tip'; + icon: SkillIcon | SkillIcon[]; + type: 'continuous' | 'trigger'; + }; + }; +} + +export async function crewSkillIcons(production: boolean) { + console.log('Building crew skill icons...'); + + const avatar = await readXMLDVPL<{ root: Avatar }>( + `${DATA}/XML/item_defs/tankmen/avatar.xml.dvpl`, + ); + const changes = await Promise.all( + Object.values(avatar.root.skills).map(async (skill) => { + const icon = Array.isArray(skill.icon) ? skill.icon[0] : skill.icon; + const name = icon.name.split('/').at(-1)!.replace(/_\d$/, ''); + const path = `${DATA}${icon.name.replace('~res:', '')}.packed.webp.dvpl`; + const image = sharp(await readDVPLFile(path)).trim(); + const content = (await image.toBuffer()).toString('base64'); + + return { + content, + encoding: 'base64', + path: `icons/skills/${name}.webp`, + } satisfies FileChange; + }), + ); + + commitAssets('crew skill icons', changes, production); +} diff --git a/scripts/buildAssets/index.ts b/scripts/buildAssets/index.ts index 643ee2b6b..33153b177 100644 --- a/scripts/buildAssets/index.ts +++ b/scripts/buildAssets/index.ts @@ -14,6 +14,7 @@ import { boosterIcons } from './boosterIcons'; import { camouflageIcons } from './camouflageIcons'; import { circleFlags } from './circleFlags'; import { consumableProvisionIcons } from './consumableProvisionIcons'; +import { crewSkillIcons } from './crewSkillIcons'; import { currencies } from './currencies'; import { definitions } from './definitions'; import { equipmentIcons } from './equipmentIcons'; @@ -40,6 +41,7 @@ const methods = [ tankArmors, tankModels, currencies, + crewSkillIcons, ]; for (const method of methods) { diff --git a/src/core/blitzkrieg/crewSkillDefinitions.ts b/src/core/blitzkrieg/crewSkillDefinitions.ts new file mode 100644 index 000000000..f48785fef --- /dev/null +++ b/src/core/blitzkrieg/crewSkillDefinitions.ts @@ -0,0 +1,11 @@ +import { TankClass } from '../../components/Tanks'; +import { asset } from './asset'; +import { fetchCdonLz4 } from './fetchCdonLz4'; + +export interface CrewSkillDefinitions { + classes: Record; +} + +export const crewSkillDefinitions = fetchCdonLz4( + asset('definitions/equipment.cdon.lz4'), +);