From 2b37e08f19cd98b3643444e06bfd3e58127aa771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 8 Feb 2024 10:58:03 -0600 Subject: [PATCH] feat: more data --- scripts/buildAssets/definitions.ts | 81 ++++++++++++++----- .../[id]/components/Characteristics/index.tsx | 18 +++-- src/core/blitzkrieg/modelDefinitions.ts | 7 +- src/core/blitzkrieg/tankDefinitions.ts | 19 ++++- src/stores/tankopedia.ts | 2 + 5 files changed, 96 insertions(+), 31 deletions(-) diff --git a/scripts/buildAssets/definitions.ts b/scripts/buildAssets/definitions.ts index b5099325a..973e48781 100644 --- a/scripts/buildAssets/definitions.ts +++ b/scripts/buildAssets/definitions.ts @@ -65,9 +65,15 @@ interface EngineDefinitionsList { userString: string; level: number; fireStartingChance: number; + weight: number; + power: number; }; }; } +export interface ChassisDefinitionsList { + nextAvailableId: number; + ids: Record; +} type VehicleDefinitionArmor = Record< string, number | { vehicleDamageFactor: 0; '#text': number } @@ -90,9 +96,12 @@ interface VehicleDefinitions { turretPositions: { turret: string }; turretInitialRotation?: { yaw: 0; pitch: 6.5; roll: 0 }; maxHealth: number; + weight: number; }; chassis: { [key: string]: { + weight: number; + terrainResistance: string; rotationSpeed: number; shotDispersionFactors: { vehicleMovement: number; @@ -123,6 +132,7 @@ interface VehicleDefinitions { turrets0: { [key: string]: { rotationSpeed: number; + weight: number; circularVisionRadius: number; maxHealth: number; armor: VehicleDefinitionArmor; @@ -196,6 +206,7 @@ interface GunDefinitionsList { shared: { [key: string]: { rotationSpeed: number; + weight: number; shotDispersionFactors: { turretRotation: number; afterShot: number; @@ -357,6 +368,11 @@ export async function definitions(production: boolean) { }>( `${DATA}/${POI.vehicleDefinitions}/${nation}/components/engines.xml.dvpl`, ); + const chassisList = await readXMLDVPL<{ + root: ChassisDefinitionsList; + }>( + `${DATA}/${POI.vehicleDefinitions}/${nation}/components/chassis.xml.dvpl`, + ); for (const tankKey in tankList.root) { const tank = tankList.root[tankKey]; @@ -370,19 +386,12 @@ export async function definitions(production: boolean) { const tankParameters = await readYAMLDVPL( `${DATA}/${POI.tankParameters}/${nation}/${tankKey}.yaml.dvpl`, ); - const defaultChassis = Object.values(tankDefinition.root.chassis).at( - -1, - )!; const turretOrigin = tankDefinition.root.hull.turretPositions.turret .split(' ') .map(Number) as Vector3Tuple; - const hullOrigin = defaultChassis.hullPosition - .split(' ') - .map(Number) as Vector3Tuple; const tankId = toUniqueId(nation, tank.id); const tankTags = tank.tags.split(' '); const hullArmor: ModelArmor = { thickness: {} }; - const trackArmorRaw = defaultChassis.armor.leftTrack; const equipment = tankDefinition.root.optDevicePreset; tankStringIdMap[`${nation}:${tankKey}`] = tankId; @@ -408,12 +417,13 @@ export async function definitions(production: boolean) { }); tankDefinitions[tankId] = { + id: tankId, + weight: tankDefinition.root.hull.weight, health: tankDefinition.root.hull.maxHealth, speed: { forwards: tankDefinition.root.speedLimits.forward, backwards: tankDefinition.root.speedLimits.backward, }, - id: tankId, equipment, consumables: tankDefinition.root.consumableSlots, provisions: tankDefinition.root.provisionSlots, @@ -439,11 +449,7 @@ export async function definitions(production: boolean) { }, turrets: [], engines: [], - dispersion: { - move: defaultChassis.shotDispersionFactors.vehicleMovement, - traverse: defaultChassis.shotDispersionFactors.vehicleRotation, - }, - traverseSpeed: defaultChassis.rotationSpeed, + tracks: [], }; if (tankDefinitions[tankId].name === tankDefinitions[tankId].nameFull) { @@ -452,12 +458,7 @@ export async function definitions(production: boolean) { modelDefinitions[tankId] = { armor: hullArmor, - trackThickness: - typeof trackArmorRaw === 'number' - ? trackArmorRaw - : trackArmorRaw['#text'], turretOrigin, - hullOrigin, turretRotation: tankDefinition.root.hull.turretInitialRotation ? { yaw: tankDefinition.root.hull.turretInitialRotation.yaw, @@ -467,8 +468,44 @@ export async function definitions(production: boolean) { : undefined, boundingBox: tankParameters.collision.hull.bbox, turrets: {}, + tracks: {}, }; + Object.keys(tankDefinition.root.chassis).forEach((key) => { + const track = tankDefinition.root.chassis[key]; + const trackId = toUniqueId(nation, chassisList.root.ids[key]); + const terrainResistances = track.terrainResistance + .split(' ') + .map(Number); + const trackArmorRaw = track.armor.leftTrack; + const hullOrigin = track.hullPosition + .split(' ') + .map(Number) as Vector3Tuple; + + tankDefinitions[tankId].tracks.push({ + id: trackId, + weight: track.weight, + traverseSpeed: track.rotationSpeed, + dispersion: { + move: track.shotDispersionFactors.vehicleMovement, + traverse: track.shotDispersionFactors.vehicleRotation, + }, + resistance: { + hard: terrainResistances[0], + medium: terrainResistances[1], + soft: terrainResistances[2], + }, + }); + + modelDefinitions[tankId].tracks[trackId] = { + thickness: + typeof trackArmorRaw === 'number' + ? trackArmorRaw + : trackArmorRaw['#text'], + origin: hullOrigin, + }; + }); + Object.keys(tankDefinition.root.engines).forEach((engineKey) => { const engine = enginesList.root.shared[engineKey]; const engineId = toUniqueId(nation, enginesList.root.ids[engineKey]); @@ -476,8 +513,10 @@ export async function definitions(production: boolean) { tankDefinitions[tankId].engines.push({ id: engineId, name: strings[engine.userString], - fire_chance: engine.fireStartingChance, + fireChance: engine.fireStartingChance, tier: engine.level as Tier, + weight: engine.weight, + power: engine.power, }); }); @@ -526,8 +565,8 @@ export async function definitions(production: boolean) { }); tankDefinitions[tankId].turrets.push({ - traverseSpeed: turret.rotationSpeed, id: turretId, + traverseSpeed: turret.rotationSpeed, name: strings[turret.userString] ?? turretKey @@ -537,6 +576,7 @@ export async function definitions(production: boolean) { guns: [], health: turret.maxHealth, viewRange: turret.circularVisionRadius, + weight: turret.weight, }); modelDefinitions[tankId].turrets[turretId] = { @@ -624,6 +664,7 @@ export async function definitions(production: boolean) { tankDefinitions[tankId].turrets[turretIndex].guns.push({ id: gunId, + weight: gunListEntry.weight, rotationSpeed: gunListEntry.rotationSpeed, name: gunName, tier: gunListEntry.level as Tier, diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx index 7efe3d3c3..ebbcd382d 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx @@ -13,7 +13,9 @@ import { Info } from './components/Info'; export function Characteristics() { const awaitedModelDefinitions = use(modelDefinitions); - const { tank, turret, gun, engine } = useDuel((state) => state.protagonist!); + const { tank, turret, gun, engine, track } = useDuel( + (state) => state.protagonist!, + ); const shell = gun.shells[0]; const tankModelDefinition = awaitedModelDefinitions[tank.id]; const turretModelDefinition = tankModelDefinition.turrets[turret.id]; @@ -24,6 +26,8 @@ export function Characteristics() { turretModelDefinition.boundingBox, ), ); + const weight = + tank.weight + engine.weight + track.weight + turret.weight + gun.weight; let dpm: number; @@ -50,7 +54,7 @@ export function Characteristics() { {tank.health + turret.health} - {Math.round(engine.fire_chance * 100)} + {Math.round(engine.fireChance * 100)} {turret.viewRange} @@ -175,12 +179,12 @@ export function Characteristics() { {gun.dispersion.base.toFixed(3)} - + {tank.dispersion.move.toFixed(3)} + + {track.dispersion.move.toFixed(3)} - - + {tank.dispersion.traverse.toFixed(3)} + + + {track.dispersion.traverse.toFixed(3)} - + + {gun.dispersion.traverse.toFixed(3)} @@ -243,7 +247,7 @@ export function Characteristics() { TODO - TODO + {(weight / 1000).toFixed(1)} diff --git a/src/core/blitzkrieg/modelDefinitions.ts b/src/core/blitzkrieg/modelDefinitions.ts index dd9b279f8..b296b9aa6 100644 --- a/src/core/blitzkrieg/modelDefinitions.ts +++ b/src/core/blitzkrieg/modelDefinitions.ts @@ -15,13 +15,16 @@ export interface BoundingBox { } interface ModelDefinition { armor: ModelArmor; - trackThickness: number; turretOrigin: Vector3Tuple; - hullOrigin: Vector3Tuple; turretRotation?: InitialTurretRotation; turrets: Record; + tracks: Record; boundingBox: BoundingBox; } +interface TrackDefinition { + thickness: number; + origin: Vector3Tuple; +} export interface InitialTurretRotation { yaw: number; pitch: number; diff --git a/src/core/blitzkrieg/tankDefinitions.ts b/src/core/blitzkrieg/tankDefinitions.ts index 734be1194..6fdceb4d0 100644 --- a/src/core/blitzkrieg/tankDefinitions.ts +++ b/src/core/blitzkrieg/tankDefinitions.ts @@ -28,6 +28,7 @@ export interface TankDefinition { testing?: boolean; turrets: TurretDefinition[]; engines: EngineDefinition[]; + tracks: TrackDefinition[]; price: TankDefinitionPrice; speed: { forwards: number; @@ -38,18 +39,30 @@ export interface TankDefinition { moving: number; onFire: number; }; + equipment: string; + weight: number; +} +export interface TrackDefinition { + id: number; + weight: number; traverseSpeed: number; dispersion: { move: number; traverse: number; }; - equipment: string; + resistance: { + hard: number; + medium: number; + soft: number; + }; } export interface EngineDefinition { id: number; name: string; tier: Tier; - fire_chance: number; + fireChance: number; + power: number; + weight: number; } export type TankDefinitionPrice = | { type: 'credits'; value: number } @@ -62,6 +75,7 @@ export interface TurretDefinition { name: string; tier: Tier; guns: GunDefinition[]; + weight: number; } export type GunDefinition = | GunDefinitionRegular @@ -69,6 +83,7 @@ export type GunDefinition = | GunDefinitionAutoReloader; interface GunDefinitionBase { rotationSpeed: number; + weight: number; id: number; name: string; tier: Tier; diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts index 6f180b446..02b39c6df 100644 --- a/src/stores/tankopedia.ts +++ b/src/stores/tankopedia.ts @@ -11,6 +11,7 @@ import { ShellDefinition, TankDefinition, Tier, + TrackDefinition, TurretDefinition, } from '../core/blitzkrieg/tankDefinitions'; @@ -24,6 +25,7 @@ export interface DuelMember { turret: TurretDefinition; gun: GunDefinition; shell: ShellDefinition; + track: TrackDefinition; } interface TankopediaPersistent { model: {