diff --git a/scripts/buildAssets/definitions.ts b/scripts/buildAssets/definitions.ts index 67ce24892..cdc54b5bd 100644 --- a/scripts/buildAssets/definitions.ts +++ b/scripts/buildAssets/definitions.ts @@ -849,26 +849,6 @@ export async function definitions(production: boolean) { }); } } - - Object.entries({ - ...consumable.script, - ...consumable.script.bonusValues, - }).forEach(([effectName, effect]) => { - if ( - !consumableProvisionEffectSuffixes.some((suffix) => - effectName.endsWith(suffix), - ) - ) { - return; - } - - if (!consumableDefinitions[consumable.id].effects) { - consumableDefinitions[consumable.id].effects = {}; - } - - consumableDefinitions[consumable.id].effects![effectName] = - effect as number; - }); }); Object.values(provisions.root).forEach((provision) => { diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx index eae7b2557..920be0ce2 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx @@ -9,7 +9,8 @@ import { normalizeBoundingBox } from '../../../../../../core/blitzkrieg/normaliz import { resolveDpm } from '../../../../../../core/blitzkrieg/resolveDpm'; import { GUN_TYPE_NAMES } from '../../../../../../core/blitzkrieg/tankDefinitions'; import { unionBoundingBox } from '../../../../../../core/blitzkrieg/unionBoundingBox'; -import { useEquipment } from '../../../../../../core/blitzkrieg/useEquipmentEquipped'; +import { useConsumable } from '../../../../../../core/blitzkrieg/useConsumable'; +import { useEquipment } from '../../../../../../core/blitzkrieg/useEquipment'; import { useDuel } from '../../../../../../stores/duel'; import { Info } from './components/Info'; import { InfoWithDelta } from './components/InfoWithDelta'; @@ -56,6 +57,16 @@ export function Characteristics() { const hasImprovedVerticalStabilizer = useEquipment(122); const hasImprovedSuspension = useEquipment(123); const penetrationDistanceInput = useRef(null); + const hasEnginePowerBoost = useConsumable(14); + const hasImprovedEnginePowerBoost = useConsumable(27); + const hasAdrenaline = useConsumable(18); + const hasTungsten = useConsumable(45); + const hasReticleCalibration = useConsumable(28); + const hasShellReloadBoost = useConsumable(29); + const shellReloadBoostBonus = hasShellReloadBoost ? 0.7 : 1; + const adrenalineBonus = hasAdrenaline && gun.type === 'regular' ? 0.8 : 1; + const enginePowerBoostBonus = + (hasEnginePowerBoost ? 1.2 : 1) * (hasImprovedEnginePowerBoost ? 1.4 : 1); const camouflageNetBonus = hasCamouflageNet ? tank.type === 'heavy' ? 1.03 @@ -73,11 +84,12 @@ export function Characteristics() { ? 1.05 : 1.07 : 1; - - /** - * TODO: - * - Improved Ventilation - */ + const resolvedEnginePower = + engine.power * engineAcceleratorBonus * enginePowerBoostBonus; + const reticleCalibrationBonus = hasReticleCalibration ? 0.6 : 1; + const improvedEnginePowerBoostTraverseBonus = hasImprovedEnginePowerBoost + ? 1.05 + : 1; useEffect(() => { if (penetrationDistanceInput.current) { @@ -91,7 +103,7 @@ export function Characteristics() { Fire {GUN_TYPE_NAMES[gun.type]} - {resolveDpm(gun, shell, hasRammer)} + {resolveDpm(gun, shell, hasRammer, hasShellReloadBoost)} {gun.type === 'autoReloader' && ( <> @@ -154,7 +166,18 @@ export function Characteristics() { unit="s" deltaType="lowerIsBetter" > - {gun.reload * (hasRammer ? 0.93 : 1)} + {gun.reload * (hasRammer ? 0.93 : 1) * adrenalineBonus} + + )} + {gun.type === 'autoLoader' && ( + + {gun.interClip * shellReloadBoostBonus} )} @@ -237,8 +260,8 @@ export function Characteristics() { )} - - {shell.damage.armor} + + {shell.damage.armor * (hasTungsten ? 1.15 : 1)} {shell.damage.module} @@ -252,7 +275,9 @@ export function Characteristics() { unit="s" deltaType="lowerIsBetter" > - {gun.aimTime * (hasEnhancedGunLayingDrive ? 0.9 : 1)} + {gun.aimTime * + (hasEnhancedGunLayingDrive ? 0.9 : 1) * + reticleCalibrationBonus} - {gun.dispersion.base * (hasRefinedGun ? 0.9 : 1)} + {gun.dispersion.base * + (hasRefinedGun ? 0.9 : 1) * + reticleCalibrationBonus} - {track.dispersion.move * (hasVerticalStabilizer ? 0.85 : 1)} + {track.dispersion.move * + (hasVerticalStabilizer ? 0.85 : 1) * + reticleCalibrationBonus} - {track.dispersion.traverse * (hasVerticalStabilizer ? 0.85 : 1)} + {track.dispersion.traverse * + (hasVerticalStabilizer ? 0.85 : 1) * + reticleCalibrationBonus} - {gun.dispersion.traverse * (hasVerticalStabilizer ? 0.85 : 1)} + {gun.dispersion.traverse * + (hasVerticalStabilizer ? 0.85 : 1) * + reticleCalibrationBonus} - {gun.dispersion.shot} + {gun.dispersion.shot * reticleCalibrationBonus} - {gun.dispersion.damaged} + {gun.dispersion.damaged * reticleCalibrationBonus} @@ -359,28 +392,28 @@ export function Characteristics() { Maneuverability - {tank.speed.forwards} + {tank.speed.forwards + (hasImprovedEnginePowerBoost ? 5 : 0)} - {tank.speed.backwards} + {tank.speed.backwards + (hasImprovedEnginePowerBoost ? 10 : 0)} - {engine.power * engineAcceleratorBonus} + {resolvedEnginePower} - {(engine.power * engineAcceleratorBonus) / + {resolvedEnginePower / weightTons / (track.resistance.hard * (hasImprovedSuspension ? 0.75 : 1))} - {((engine.power * engineAcceleratorBonus) / + {(resolvedEnginePower / weightTons / (track.resistance.medium * (hasImprovedSuspension ? 0.75 : 1))) * engineAcceleratorBonus} - {((engine.power * engineAcceleratorBonus) / + {(resolvedEnginePower / weightTons / (track.resistance.soft * (hasImprovedSuspension ? 0.75 : 1))) * engineAcceleratorBonus} @@ -395,28 +428,28 @@ export function Characteristics() { - {(engine.power / stockEngine.power) * - engineAcceleratorBonus * + {(resolvedEnginePower / stockEngine.power) * track.traverseSpeed * (track.resistance.hard / track.resistance.hard) * (stockWeight / weight) * - (hasImprovedControl ? 1.1 : 1)} + (hasImprovedControl ? 1.1 : 1) * + improvedEnginePowerBoostTraverseBonus} - {(engine.power / stockEngine.power) * - engineAcceleratorBonus * + {(resolvedEnginePower / stockEngine.power) * track.traverseSpeed * (track.resistance.hard / track.resistance.medium) * (stockWeight / weight) * - (hasImprovedControl ? 1.1 : 1)} + (hasImprovedControl ? 1.1 : 1) * + improvedEnginePowerBoostTraverseBonus} - {(engine.power / stockEngine.power) * - engineAcceleratorBonus * + {(resolvedEnginePower / stockEngine.power) * track.traverseSpeed * (track.resistance.hard / track.resistance.soft) * (stockWeight / weight) * - (hasImprovedControl ? 1.1 : 1)} + (hasImprovedControl ? 1.1 : 1) * + improvedEnginePowerBoostTraverseBonus} diff --git a/src/core/blitzkrieg/consumableDefinitions.ts b/src/core/blitzkrieg/consumableDefinitions.ts index 5a3f8a793..97828ea3f 100644 --- a/src/core/blitzkrieg/consumableDefinitions.ts +++ b/src/core/blitzkrieg/consumableDefinitions.ts @@ -25,7 +25,6 @@ export type TankFilterDefinition = export interface ConsumableEntry { id: number; name: string; - effects?: Record; include: TankFilterDefinition[]; exclude?: TankFilterDefinition[]; } @@ -37,3 +36,5 @@ export interface ConsumableDefinitions { export const consumableDefinitions = fetchCdonLz4( asset('definitions/consumables.cdon.lz4'), ); + +consumableDefinitions.then(console.log); diff --git a/src/core/blitzkrieg/resolveDpm.ts b/src/core/blitzkrieg/resolveDpm.ts index 94b992076..dba994237 100644 --- a/src/core/blitzkrieg/resolveDpm.ts +++ b/src/core/blitzkrieg/resolveDpm.ts @@ -4,13 +4,15 @@ export function resolveDpm( gun: GunDefinition, shell: ShellDefinition, hasRammer = false, + hasShellReloadBoost = false, ) { if (gun.type === 'regular') { return (shell.damage.armor / ((hasRammer ? 0.93 : 1) * gun.reload)) * 60; } else if (gun.type === 'autoLoader') { return ( ((shell.damage.armor * gun.count) / - (gun.reload + (gun.count - 1) * gun.interClip)) * + (gun.reload + + (gun.count - 1) * gun.interClip * (hasShellReloadBoost ? 0.7 : 1))) * 60 ); } else { diff --git a/src/core/blitzkrieg/useConsumable.ts b/src/core/blitzkrieg/useConsumable.ts new file mode 100644 index 000000000..8d69610c2 --- /dev/null +++ b/src/core/blitzkrieg/useConsumable.ts @@ -0,0 +1,6 @@ +import { useTankopediaTemporary } from '../../stores/tankopedia'; + +export function useConsumable(id: number) { + const consumables = useTankopediaTemporary((state) => state.consumables); + return consumables.includes(id); +} diff --git a/src/core/blitzkrieg/useEquipmentEquipped.ts b/src/core/blitzkrieg/useEquipment.ts similarity index 100% rename from src/core/blitzkrieg/useEquipmentEquipped.ts rename to src/core/blitzkrieg/useEquipment.ts