From 9a66fb5115edb790c7c28e2faf4450aa279f07a1 Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Sun, 11 Oct 2026 01:03:35 -0500 Subject: [PATCH] terrain coeffs --- .vscode/settings.json | 1 + packages/i18n/strings/en.json | 7 ++- .../website/src/config/characteristics.ts | 62 ++++++++++++++++++- .../src/config/characteristicsGroups.ts | 7 ++- .../src/tankopedia/rawTerrainCoefficient.ts | 32 ++++++++++ packages/website/src/types/characteristics.ts | 12 ++-- 6 files changed, 113 insertions(+), 8 deletions(-) create mode 100644 packages/website/src/tankopedia/rawTerrainCoefficient.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index f64cba027..a8be47c2a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -157,6 +157,7 @@ "ownedtanks", "padder", "partytown", + "passability", "patchnotes", "PIXELFORMAT", "playerachievements", diff --git a/packages/i18n/strings/en.json b/packages/i18n/strings/en.json index a7284fa0b..2962af18d 100644 --- a/packages/i18n/strings/en.json +++ b/packages/i18n/strings/en.json @@ -70,7 +70,12 @@ "brake_force": "Brake force", "weight": "Weight", "power_to_weight": "Power to weight", - "terrain_coefficient": "Terrain coefficient", + "hard_terrain_coefficient": "Hard terrain coefficient", + "medium_terrain_coefficient": "Medium terrain coefficient", + "soft_terrain_coefficient": "Soft terrain coefficient", + "hard_terrain_coefficient_raw": "Raw hard terrain coefficient", + "medium_terrain_coefficient_raw": "Raw medium terrain coefficient", + "soft_terrain_coefficient_raw": "Raw soft terrain coefficient", "hull_traverse_speed": "Hull traverse speed", "turret_traverse_speed": "Turret traverse speed", "gun_traverse_speed": "Gun traverse speed", diff --git a/packages/website/src/config/characteristics.ts b/packages/website/src/config/characteristics.ts index a9b4e069c..be7808709 100644 --- a/packages/website/src/config/characteristics.ts +++ b/packages/website/src/config/characteristics.ts @@ -10,6 +10,7 @@ import { type Characteristic, type CharacteristicContext, } from "../types/characteristics"; +import { rawTerrainCoefficient } from "../tankopedia/rawTerrainCoefficient"; function intraClipCoefficient({ script, @@ -621,7 +622,66 @@ export const characteristics = { }, // brake_force: unavailable, - // terrain_coefficient: unavailable, + + hard_terrain_coefficient_raw: { + type: CharacteristicType.Number, + compute({ track, degressive, script }) { + return rawTerrainCoefficient( + track.resistance_hard, + "firmGroundPassabilityIncrease", + degressive("driver"), + script, + ); + }, + }, + + hard_terrain_coefficient: { + type: CharacteristicType.Number, + compute({ characteristic }) { + const raw = characteristic("hard_terrain_coefficient_raw") as number; + return 100 / raw; + }, + }, + + medium_terrain_coefficient_raw: { + type: CharacteristicType.Number, + compute({ track, degressive, script }) { + return rawTerrainCoefficient( + track.resistance_medium, + "mediumGroundPassabilityIncrease", + degressive("driver"), + script, + ); + }, + }, + + medium_terrain_coefficient: { + type: CharacteristicType.Number, + compute({ characteristic }) { + const raw = characteristic("medium_terrain_coefficient_raw") as number; + return 100 / raw; + }, + }, + + soft_terrain_coefficient_raw: { + type: CharacteristicType.Number, + compute({ track, degressive, script }) { + return rawTerrainCoefficient( + track.resistance_soft, + "softGroundPassabilityIncrease", + degressive("driver"), + script, + ); + }, + }, + + soft_terrain_coefficient: { + type: CharacteristicType.Number, + compute({ characteristic }) { + const raw = characteristic("soft_terrain_coefficient_raw") as number; + return 100 / raw; + }, + }, hull_traverse_speed: { type: CharacteristicType.Number, diff --git a/packages/website/src/config/characteristicsGroups.ts b/packages/website/src/config/characteristicsGroups.ts index fdd8ab7c9..78b0967f3 100644 --- a/packages/website/src/config/characteristicsGroups.ts +++ b/packages/website/src/config/characteristicsGroups.ts @@ -163,7 +163,12 @@ export const characteristicsGroups: CharacteristicsGroup[] = [ { name: "power_to_weight", decimals: 1, units: "bhp_t" }, { name: "brake_force", decimals: 1, units: "kN" }, - { name: "terrain_coefficient", decimals: 2 }, + { name: "hard_terrain_coefficient", decimals: 0 }, + { name: "medium_terrain_coefficient", decimals: 0 }, + { name: "soft_terrain_coefficient", decimals: 0 }, + { name: "hard_terrain_coefficient_raw", decimals: 2 }, + { name: "medium_terrain_coefficient_raw", decimals: 2 }, + { name: "soft_terrain_coefficient_raw", decimals: 2 }, { name: "hull_traverse_speed", units: "deg_s" }, { name: "turret_traverse_speed", units: "deg_s" }, diff --git a/packages/website/src/tankopedia/rawTerrainCoefficient.ts b/packages/website/src/tankopedia/rawTerrainCoefficient.ts new file mode 100644 index 000000000..55074caa4 --- /dev/null +++ b/packages/website/src/tankopedia/rawTerrainCoefficient.ts @@ -0,0 +1,32 @@ +import type { CharacteristicScript } from "../types/characteristics"; + +export function rawTerrainCoefficient( + resistance: number, + passabilityAttribute: string, + driverCoefficient: number, + script: CharacteristicScript, +) { + let passabilityIncrease = 0; + let terrainResistanceFactor = 1; + + script("protagonist", "Grousers", (effect) => { + passabilityIncrease += + (effect.bonusPercentage?.[passabilityAttribute] ?? 0) / 100; + }); + + script("protagonist", "AttributesModifier", (effect) => { + passabilityIncrease += + (effect.attributes?.[passabilityAttribute] ?? 0) / 100; + }); + + script("protagonist", "AfterburnerAbility", (effect) => { + terrainResistanceFactor *= effect.bonusValues?.terrainResistanceFactor ?? 1; + }); + + return ( + resistance * + (1 - passabilityIncrease) * + terrainResistanceFactor * + driverCoefficient + ); +} diff --git a/packages/website/src/types/characteristics.ts b/packages/website/src/types/characteristics.ts index 9fc096aaa..6bf26c4f0 100644 --- a/packages/website/src/types/characteristics.ts +++ b/packages/website/src/types/characteristics.ts @@ -28,6 +28,12 @@ export type Characteristic = { } ); +export type CharacteristicScript = ( + side: DuelSide, + name: string, + effect: (effect: BlitzEffectScript) => void, +) => void; + export interface CharacteristicContext { state: TankState; environment: TankEnvironment; @@ -48,11 +54,7 @@ export interface CharacteristicContext { name: CharacteristicName, ): ReturnType; - script( - side: DuelSide, - name: string, - effect: (effect: BlitzEffectScript) => void, - ): void; + script: CharacteristicScript; } export type CrewStatRole = "commander" | "loader" | "gunner" | "driver";