From c34edbd3ac30101a3cf685a756993f71c1991d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 28 Jan 2024 19:06:38 -0600 Subject: [PATCH] feat: fire chance --- scripts/buildAssets/definitions.ts | 47 ++++++++++++++--- .../[id]/components/AntagonistBar/index.tsx | 1 + .../Characteristics/components/Modules.tsx | 51 +++++++++++++------ .../[id]/components/Characteristics/index.tsx | 6 ++- .../tankopedia/[id]/components/Title.tsx | 3 +- src/app/tools/tankopedia/[id]/page.tsx | 9 +--- src/core/blitzkrieg/tankDefinitions.ts | 7 +++ src/stores/tankopedia.ts | 2 + 8 files changed, 94 insertions(+), 32 deletions(-) diff --git a/scripts/buildAssets/definitions.ts b/scripts/buildAssets/definitions.ts index 3ed930fa9..cdd2c69e6 100644 --- a/scripts/buildAssets/definitions.ts +++ b/scripts/buildAssets/definitions.ts @@ -55,6 +55,17 @@ type ShellDefinitionsList = Record< > & { icons: Record; }; +interface EngineDefinitionsList { + nextAvailableId: number; + ids: Record; + shared: { + [key: string]: { + userString: string; + level: number; + fireStartingChance: number; + }; + }; +} type VehicleDefinitionArmor = Record< string, number | { vehicleDamageFactor: 0; '#text': number } @@ -91,6 +102,9 @@ interface VehicleDefinitions { }; }; }; + engines: { + [key: string]: unknown; + }; turrets0: { [key: string]: { maxHealth: number; @@ -260,7 +274,7 @@ export async function definitions(production: boolean) { (nations) => nations.filter((nation) => nation !== 'common'), ); const tankStringIdMap: Record = {}; - const strings = await readYAMLDVPL( + const stringsPreInstalled = await readYAMLDVPL( `${DATA}/${POI.strings}/en.yaml.dvpl`, ); const stringsCache = await fetch(POI.cachedStrings) @@ -269,6 +283,10 @@ export async function definitions(production: boolean) { const optionalDevices = await readXMLDVPL<{ root: OptionalDevices }>( `${DATA}/${POI.optionalDevices}.dvpl`, ); + const strings = { + ...stringsPreInstalled, + ...stringsCache, + }; const optionalDeviceSlots = await readXMLDVPL<{ root: OptionalDeviceSlots; }>(`${DATA}/${POI.optionalDeviceSlots}.dvpl`); @@ -299,6 +317,11 @@ export async function definitions(production: boolean) { }>( `${DATA}/${POI.vehicleDefinitions}/${nation}/components/shells.xml.dvpl`, ); + const enginesList = await readXMLDVPL<{ + root: EngineDefinitionsList; + }>( + `${DATA}/${POI.vehicleDefinitions}/${nation}/components/engines.xml.dvpl`, + ); for (const tankKey in tankList.root) { const tank = tankList.root[tankKey]; @@ -354,12 +377,9 @@ export async function definitions(production: boolean) { provisions: tankDefinition.root.provisionSlots, name: (tank.shortUserString - ? strings[tank.shortUserString] ?? - stringsCache[tank.shortUserString] - : undefined) ?? - strings[tank.userString] ?? - stringsCache[tank.userString], - name_full: strings[tank.userString] ?? stringsCache[tank.userString], + ? strings[tank.shortUserString] + : undefined) ?? strings[tank.userString], + name_full: strings[tank.userString], nation, tree_type: tankTags.includes('collectible') ? 'collector' @@ -376,6 +396,7 @@ export async function definitions(production: boolean) { firing: tankDefinition.root.invisibility.firePenalty, }, turrets: [], + engines: [], }; if ( @@ -402,6 +423,18 @@ export async function definitions(production: boolean) { turrets: {}, }; + Object.keys(tankDefinition.root.engines).forEach((engineKey) => { + const engine = enginesList.root.shared[engineKey]; + const engineId = toUniqueId(nation, enginesList.root.ids[engineKey]); + + tankDefinitions[tankId].engines.push({ + id: engineId, + name: strings[engine.userString], + fire_chance: engine.fireStartingChance, + tier: engine.level as Tier, + }); + }); + Object.keys(tankDefinition.root.turrets0).forEach( (turretKey, turretIndex) => { const turret = tankDefinition.root.turrets0[turretKey]; diff --git a/src/app/tools/tankopedia/[id]/components/AntagonistBar/index.tsx b/src/app/tools/tankopedia/[id]/components/AntagonistBar/index.tsx index 7a3d2de9f..c249defbf 100644 --- a/src/app/tools/tankopedia/[id]/components/AntagonistBar/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/AntagonistBar/index.tsx @@ -104,6 +104,7 @@ export function AntagonistBar() { onSelect={(tank) => { mutateDuel((draft) => { draft.antagonist!.tank = tank; + draft.antagonist!.engine = tank.engines.at(-1)!; draft.antagonist!.turret = tank.turrets.at(-1)!; draft.antagonist!.gun = draft.antagonist!.turret.guns.at(-1)!; diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/components/Modules.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/components/Modules.tsx index 5ebea0922..31139b117 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/components/Modules.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/components/Modules.tsx @@ -11,25 +11,24 @@ export function Modules() { Modules - + - {protagonist.tank.turrets.map((thisTurret, index) => { + {protagonist.tank.turrets.map((turret, index) => { return ( { mutateDuel((draft) => { - draft.protagonist!.turret = thisTurret; - draft.protagonist!.gun = thisTurret.guns.at(-1)!; - draft.protagonist!.shell = - thisTurret.guns.at(-1)!.shells[0]; + draft.protagonist!.turret = turret; + draft.protagonist!.gun = turret.guns.at(-1)!; + draft.protagonist!.shell = turret.guns.at(-1)!.shells[0]; }); }} /> @@ -38,21 +37,43 @@ export function Modules() { - {protagonist.turret.guns.map((thisGun, index) => { + {protagonist.turret.guns.map((gun, index) => { return ( { mutateDuel((draft) => { - draft.protagonist!.gun = thisGun; - draft.protagonist!.shell = thisGun.shells[0]; + draft.protagonist!.gun = gun; + draft.protagonist!.shell = gun.shells[0]; + }); + }} + /> + ); + })} + + + + {protagonist.tank.engines.map((engine, index) => { + return ( + { + mutateDuel((draft) => { + draft.protagonist!.engine = engine; }); }} /> diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx index e4aae3225..5724266ce 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx @@ -14,7 +14,9 @@ import { Provisions } from './components/Provisions'; export function Characteristics() { const awaitedModelDefinitions = use(modelDefinitions); - const { tank, turret, gun, shell } = useDuel((state) => state.protagonist!); + const { tank, turret, gun, shell, engine } = useDuel( + (state) => state.protagonist!, + ); const tankModelDefinition = awaitedModelDefinitions[tank.id]; const turretModelDefinition = tankModelDefinition.turrets[turret.id]; const gunModelDefinition = turretModelDefinition.guns[gun.id]; @@ -52,7 +54,7 @@ export function Characteristics() { {tank.health + turret.health} - TODO + {Math.round(engine.fire_chance * 100)} TODO diff --git a/src/app/tools/tankopedia/[id]/components/Title.tsx b/src/app/tools/tankopedia/[id]/components/Title.tsx index 220bcc1fa..42b789815 100644 --- a/src/app/tools/tankopedia/[id]/components/Title.tsx +++ b/src/app/tools/tankopedia/[id]/components/Title.tsx @@ -1,9 +1,9 @@ import { UpdateIcon } from '@radix-ui/react-icons'; import { Button, Dialog, Flex, Heading } from '@radix-ui/themes'; +import { useState } from 'react'; import { TREE_TYPE_ICONS } from '../../../../../components/Tanks'; import { mutateDuel, useDuel } from '../../../../../stores/duel'; import { TankSearch } from '../../components/TankSearch'; -import { useState } from 'react'; export function Title() { const protagonist = useDuel((state) => state.protagonist!); @@ -61,6 +61,7 @@ export function Title() { onSelect={(tank) => { mutateDuel((draft) => { draft.protagonist!.tank = tank; + draft.protagonist!.engine = tank.engines.at(-1)!; draft.protagonist!.turret = tank.turrets.at(-1)!; draft.protagonist!.gun = draft.protagonist!.turret.guns.at(-1)!; diff --git a/src/app/tools/tankopedia/[id]/page.tsx b/src/app/tools/tankopedia/[id]/page.tsx index 1a6bae0f9..91196a963 100644 --- a/src/app/tools/tankopedia/[id]/page.tsx +++ b/src/app/tools/tankopedia/[id]/page.tsx @@ -22,18 +22,13 @@ export default function Page({ params }: { params: { id: string } }) { draft.assigned = true; draft.protagonist = { tank: awaitedTankDefinitions[id], + engine: awaitedTankDefinitions[id].engines.at(-1)!, turret: awaitedTankDefinitions[id].turrets.at(-1)!, gun: awaitedTankDefinitions[id].turrets.at(-1)!.guns.at(-1)!, shell: awaitedTankDefinitions[id].turrets.at(-1)!.guns.at(-1)! .shells[0], }; - draft.antagonist = { - tank: awaitedTankDefinitions[id], - turret: awaitedTankDefinitions[id].turrets.at(-1)!, - gun: awaitedTankDefinitions[id].turrets.at(-1)!.guns.at(-1)!, - shell: awaitedTankDefinitions[id].turrets.at(-1)!.guns.at(-1)! - .shells[0], - }; + draft.antagonist = { ...draft.protagonist }; }); mutateTankopediaTemporary((draft) => { diff --git a/src/core/blitzkrieg/tankDefinitions.ts b/src/core/blitzkrieg/tankDefinitions.ts index 5772e5917..a2e26184f 100644 --- a/src/core/blitzkrieg/tankDefinitions.ts +++ b/src/core/blitzkrieg/tankDefinitions.ts @@ -26,10 +26,17 @@ export interface TankDefinition { type: TankType; testing?: boolean; turrets: TurretDefinition[]; + engines: EngineDefinition[]; price: TankDefinitionPrice; camouflage: { still: number; moving: number; firing: number }; equipment: string; } +export interface EngineDefinition { + id: number; + name: string; + tier: Tier; + fire_chance: number; +} export type TankDefinitionPrice = | { type: 'credits'; value: number } | { type: 'gold'; value: number }; diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts index 151ddb077..aa6603f08 100644 --- a/src/stores/tankopedia.ts +++ b/src/stores/tankopedia.ts @@ -3,6 +3,7 @@ import { create } from 'zustand'; import { persist, subscribeWithSelector } from 'zustand/middleware'; import { TankType, TreeType } from '../components/Tanks'; import { + EngineDefinition, GunDefinition, ShellDefinition, TankDefinition, @@ -16,6 +17,7 @@ export type TankopediaTestTankDisplay = 'include' | 'exclude' | 'only'; export type TankopediaMode = 'model' | 'armor'; export interface DuelMember { tank: TankDefinition; + engine: EngineDefinition; turret: TurretDefinition; gun: GunDefinition; shell: ShellDefinition;