From 537206883055e209ae1135058c215a8b892db7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:23:06 -0500 Subject: [PATCH] feat: added trees --- scripts/buildAssets/definitions.ts | 133 +++++++++++++------ scripts/tsconfig.json | 18 +++ src/core/blitzkrieg/tankDefinitions/index.ts | 2 + 3 files changed, 113 insertions(+), 40 deletions(-) create mode 100644 scripts/tsconfig.json diff --git a/scripts/buildAssets/definitions.ts b/scripts/buildAssets/definitions.ts index 52452b722..113998e3f 100644 --- a/scripts/buildAssets/definitions.ts +++ b/scripts/buildAssets/definitions.ts @@ -1,4 +1,4 @@ -import { readdir } from 'fs/promises'; +import { readdir, writeFile } from 'fs/promises'; import { parse as parsePath } from 'path'; import { Vector3Tuple } from 'three'; import { parse as parseYaml } from 'yaml'; @@ -79,6 +79,16 @@ type VehicleDefinitionArmor = Record< string, number | { vehicleDamageFactor: 0; '#text': number } >; +interface UnlocksInner { + cost: number; + '#text': number; +} +type Unlocks = { + [key in 'vehicle' | 'engine' | 'chassis' | 'turret' | 'gun']: + | UnlocksInner + | UnlocksInner[]; +}; +type UnlocksListing = Unlocks | undefined; interface VehicleDefinitions { invisibility: { moving: number; @@ -102,6 +112,7 @@ interface VehicleDefinitions { }; chassis: { [key: string]: { + unlocks: UnlocksListing; weight: number; terrainResistance: string; rotationSpeed: number; @@ -130,10 +141,13 @@ interface VehicleDefinitions { }; }; engines: { - [key: string]: unknown; + [key: string]: { + unlocks: UnlocksListing; + }; }; turrets0: { [key: string]: { + unlocks: UnlocksListing; rotationSpeed: number; weight: number; circularVisionRadius: number; @@ -149,6 +163,7 @@ interface VehicleDefinitions { }; guns: { [key: string]: { + unlocks: UnlocksListing; armor: VehicleDefinitionArmor & { gun?: | number @@ -427,6 +442,7 @@ export async function definitions(production: boolean) { }); const crew: Crew[] = []; const fixedCamouflage = tankTags.includes('eventCamouflage_user'); + const totalUnlocks: UnlocksListing[] = []; Object.entries(tankDefinition.root.crew).forEach(([key, value]) => { let entry: Crew; @@ -532,6 +548,7 @@ export async function definitions(production: boolean) { .split(' ') .map(Number) as Vector3Tuple; + totalUnlocks.push(track.unlocks); tankDefinitions[tankId].tracks.push({ id: trackId, weight: track.weight, @@ -558,16 +575,18 @@ export async function definitions(production: boolean) { }); Object.keys(tankDefinition.root.engines).forEach((engineKey) => { - const engine = enginesList.root.shared[engineKey]; + const engine = tankDefinition.root.engines[engineKey]; + const engineListEntry = enginesList.root.shared[engineKey]; const engineId = toUniqueId(nation, enginesList.root.ids[engineKey]); + totalUnlocks.push(engine.unlocks); tankDefinitions[tankId].engines.push({ id: engineId, - name: strings[engine.userString], - fireChance: engine.fireStartingChance, - tier: engine.level as Tier, - weight: engine.weight, - power: engine.power, + name: strings[engineListEntry.userString], + fireChance: engineListEntry.fireStartingChance, + tier: engineListEntry.level as Tier, + weight: engineListEntry.weight, + power: engineListEntry.power, }); }); @@ -594,6 +613,7 @@ export async function definitions(production: boolean) { .map(Number) as Vector3Tuple; const turretArmor: ModelArmor = { thickness: {} }; + totalUnlocks.push(turret.unlocks); Object.keys(turret.armor) .filter((name) => name.startsWith('armor_')) .forEach((name) => { @@ -646,11 +666,11 @@ export async function definitions(production: boolean) { }; Object.keys(turret.guns).forEach((gunKey, gunIndex) => { - const turretGunEntry = turret.guns[gunKey]; + const gun = turret.guns[gunKey]; const gunId = toUniqueId(nation, gunList.root.ids[gunKey]); const gunListEntry = gunList.root.shared[gunKey]; const pitchLimitsRaw = - turretGunEntry.pitchLimits ?? gunListEntry.pitchLimits; + gun.pitchLimits ?? gunListEntry.pitchLimits; const gunPitch = ( typeof pitchLimitsRaw === 'string' ? pitchLimitsRaw @@ -659,43 +679,41 @@ export async function definitions(production: boolean) { .split(' ') .map(Number) as [number, number]; const gunModel = Number( - parsePath(turretGunEntry.models.undamaged).name.split('_')[1], + parsePath(gun.models.undamaged).name.split('_')[1], ); const gunName = strings[gunListEntry.userString] ?? gunKey.replaceAll('_', ' '); const gunType = - 'clip' in turretGunEntry - ? turretGunEntry.pumpGunMode + 'clip' in gun + ? gun.pumpGunMode ? 'autoReloader' : 'autoLoader' : 'regular'; const gunReload = gunType === 'autoReloader' - ? turretGunEntry.pumpGunReloadTimes!.split(' ').map(Number) - : turretGunEntry.reloadTime; + ? gun.pumpGunReloadTimes!.split(' ').map(Number) + : gun.reloadTime; const gunClipCount = - gunType === 'regular' ? undefined : turretGunEntry.clip!.count; + gunType === 'regular' ? undefined : gun.clip!.count; const gunIntraClip = - gunType === 'regular' - ? undefined - : 60 / turretGunEntry.clip!.rate; - const front = turretGunEntry.extraPitchLimits?.front - ? turretGunEntry.extraPitchLimits.front.split(' ').map(Number) + gunType === 'regular' ? undefined : 60 / gun.clip!.rate; + const front = gun.extraPitchLimits?.front + ? gun.extraPitchLimits.front.split(' ').map(Number) : undefined; - const back = turretGunEntry.extraPitchLimits?.back - ? turretGunEntry.extraPitchLimits.back.split(' ').map(Number) + const back = gun.extraPitchLimits?.back + ? gun.extraPitchLimits.back.split(' ').map(Number) : undefined; - const transition = turretGunEntry.extraPitchLimits?.transition - ? typeof turretGunEntry.extraPitchLimits.transition === 'number' - ? turretGunEntry.extraPitchLimits.transition - : turretGunEntry.extraPitchLimits.transition.at(-1)! + const transition = gun.extraPitchLimits?.transition + ? typeof gun.extraPitchLimits.transition === 'number' + ? gun.extraPitchLimits.transition + : gun.extraPitchLimits.transition.at(-1)! : undefined; const gunArmor: ModelArmor = { thickness: {} }; const shotDispersionFactors = - turretGunEntry.shotDispersionFactors ?? - gunListEntry.shotDispersionFactors; + gun.shotDispersionFactors ?? gunListEntry.shotDispersionFactors; - Object.keys(turretGunEntry.armor) + totalUnlocks.push(gun.unlocks); + Object.keys(gun.armor) .filter((name) => name.startsWith('armor_')) .forEach((name) => { const armorIdString = name.match(/armor_(\d+)/)?.[1]; @@ -703,7 +721,7 @@ export async function definitions(production: boolean) { throw new SyntaxError(`Invalid armor id: ${name}`); } const armorId = parseInt(armorIdString); - const armorRaw = turretGunEntry.armor[name]; + const armorRaw = gun.armor[name]; if (typeof armorRaw === 'number') { gunArmor.thickness[armorId] = armorRaw; } else { @@ -725,13 +743,13 @@ export async function definitions(production: boolean) { count: gunClipCount, intraClip: gunIntraClip, camouflageLoss: - typeof turretGunEntry.invisibilityFactorAtShot === 'number' - ? turretGunEntry.invisibilityFactorAtShot - : turretGunEntry.invisibilityFactorAtShot.at(-1)!, - aimTime: turretGunEntry.aimingTime ?? gunListEntry.aimingTime, + typeof gun.invisibilityFactorAtShot === 'number' + ? gun.invisibilityFactorAtShot + : gun.invisibilityFactorAtShot.at(-1)!, + aimTime: gun.aimingTime ?? gunListEntry.aimingTime, dispersion: { base: - turretGunEntry.shotDispersionRadius ?? + gun.shotDispersionRadius ?? gunListEntry.shotDispersionRadius, damaged: shotDispersionFactors.whileGunDamaged, shot: shotDispersionFactors.afterShot, @@ -743,11 +761,11 @@ export async function definitions(production: boolean) { armor: gunArmor, model: gunModel, thickness: - turretGunEntry.armor.gun === undefined + gun.armor.gun === undefined ? 0 - : typeof turretGunEntry.armor.gun === 'number' - ? turretGunEntry.armor.gun - : turretGunEntry.armor.gun['#text'], + : typeof gun.armor.gun === 'number' + ? gun.armor.gun + : gun.armor.gun['#text'], pitch: { min: gunPitch[0], max: gunPitch[1], @@ -809,10 +827,42 @@ export async function definitions(production: boolean) { }); }, ); + + totalUnlocks.forEach((unlocks) => { + if (unlocks === undefined) return; + Object.entries(unlocks).forEach(([key, value]) => { + if ((key as keyof Unlocks) !== 'vehicle') return; + + (Array.isArray(value) ? value : [value]).forEach((vehicle) => { + const tankListEntry = tankList.root[vehicle['#text']]; + const successorId = toUniqueId(nation, tankListEntry.id); + + if (tankDefinitions[tankId].successors === undefined) { + tankDefinitions[tankId].successors = []; + } + + if (!tankDefinitions[tankId].successors!.includes(successorId)) { + tankDefinitions[tankId].successors!.push(successorId); + } + }); + }); + }); } }), ); + Object.values(tankDefinitions).forEach((tank) => { + tank.successors?.forEach((predecessorId) => { + if (tankDefinitions[predecessorId].ancestors === undefined) { + tankDefinitions[predecessorId].ancestors = []; + } + + if (!tankDefinitions[predecessorId].ancestors?.includes(tank.id)) { + tankDefinitions[predecessorId].ancestors?.push(tank.id); + } + }); + }); + Object.entries(optionalDevices.root).forEach( ([optionalDeviceKey, optionalDeviceEntry]) => { if (optionalDeviceKey === 'nextAvailableId') return; @@ -970,6 +1020,9 @@ export async function definitions(production: boolean) { } }); + writeFile('test.json', JSON.stringify(tankDefinitions, null, 2)); + + return; await commitAssets( 'definitions', [ diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json new file mode 100644 index 000000000..e84103846 --- /dev/null +++ b/scripts/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Node", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "resolveJsonModule": true, + "jsx": "preserve", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "incremental": true, + "isolatedModules": true + } +} diff --git a/src/core/blitzkrieg/tankDefinitions/index.ts b/src/core/blitzkrieg/tankDefinitions/index.ts index 7edca84ff..93061395a 100644 --- a/src/core/blitzkrieg/tankDefinitions/index.ts +++ b/src/core/blitzkrieg/tankDefinitions/index.ts @@ -22,6 +22,8 @@ export interface Crew { export interface TankDefinition { id: number; fixedCamouflage?: boolean; + ancestors?: number[]; + successors?: number[]; crew: Crew[]; health: number; nation: string;