diff --git a/src/components/Armor/components/CoreArmor/index.tsx b/src/components/Armor/components/CoreArmor/index.tsx index 5c81454eb..28fda6c92 100644 --- a/src/components/Armor/components/CoreArmor/index.tsx +++ b/src/components/Armor/components/CoreArmor/index.tsx @@ -83,16 +83,27 @@ export function CoreArmor({ node, thickness }: CoreArmorProps) { material.uniforms.opaque.value = visual.opaque || visual.wireframe; material.wireframe = visual.wireframe; } - async function handleEquipmentChange(equipment: EquipmentMatrix) { + async function handleProtagonistEquipmentChange( + equipment: EquipmentMatrix, + ) { const hasEnhancedArmor = await hasEquipment(110, false, equipment); material.uniforms.thickness.value = hasEnhancedArmor ? thickness * 1.04 : thickness; } + async function handleAntagonistEquipmentChange(equipment: EquipmentMatrix) { + const shell = useDuel.getState().antagonist!.shell; + const penetration = resolveNearPenetration(shell.penetration); + const hasCalibratedShells = await hasEquipment(103, true, equipment); + material.uniforms.penetration.value = hasCalibratedShells + ? penetration * (isExplosive(shell.type) ? 1.1 : 1.05) + : penetration; + } handleShellChange(useDuel.getState().antagonist!.shell); handleVisualChange(useTankopediaPersistent.getState().model.visual); - handleEquipmentChange(useDuel.getState().protagonist!.equipment); + handleProtagonistEquipmentChange(useDuel.getState().protagonist!.equipment); + handleAntagonistEquipmentChange(useDuel.getState().antagonist!.equipment); const unsubscribes = [ useDuel.subscribe((state) => state.antagonist!.shell, handleShellChange), @@ -102,7 +113,11 @@ export function CoreArmor({ node, thickness }: CoreArmorProps) { ), useDuel.subscribe( (state) => state.protagonist!.equipment, - handleEquipmentChange, + handleProtagonistEquipmentChange, + ), + useDuel.subscribe( + (state) => state.antagonist!.equipment, + handleAntagonistEquipmentChange, ), ]; diff --git a/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubExternal/index.tsx b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubExternal/index.tsx index 8641cc63f..8512f1ae5 100644 --- a/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubExternal/index.tsx +++ b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubExternal/index.tsx @@ -5,6 +5,7 @@ import { Object3D, ShaderMaterial, } from 'three'; +import { isExplosive } from '../../../../../../core/blitz/isExplosive'; import { resolveNearPenetration } from '../../../../../../core/blitz/resolveNearPenetration'; import { hasEquipment } from '../../../../../../core/blitzkrieg/hasEquipment'; import { jsxTree } from '../../../../../../core/blitzkrieg/jsxTree'; @@ -42,21 +43,36 @@ export function SpacedArmorSubExternal({ shell.penetration, ); } - async function handleEquipmentChange(equipment: EquipmentMatrix) { + async function handleProtagonistEquipmentChange( + equipment: EquipmentMatrix, + ) { const hasEnhancedArmor = await hasEquipment(110, false, equipment); material.uniforms.thickness.value = hasEnhancedArmor ? thickness * 1.04 : thickness; } + async function handleAntagonistEquipmentChange(equipment: EquipmentMatrix) { + const shell = useDuel.getState().antagonist!.shell; + const penetration = resolveNearPenetration(shell.penetration); + const hasCalibratedShells = await hasEquipment(103, true, equipment); + material.uniforms.penetration.value = hasCalibratedShells + ? penetration * (isExplosive(shell.type) ? 1.1 : 1.05) + : penetration; + } handleShellChange(useDuel.getState().antagonist!.shell); - handleEquipmentChange(useDuel.getState().protagonist!.equipment); + handleProtagonistEquipmentChange(useDuel.getState().protagonist!.equipment); + handleAntagonistEquipmentChange(useDuel.getState().antagonist!.equipment); const unsubscribes = [ useDuel.subscribe((state) => state.antagonist!.shell, handleShellChange), useDuel.subscribe( (state) => state.protagonist!.equipment, - handleEquipmentChange, + handleProtagonistEquipmentChange, + ), + useDuel.subscribe( + (state) => state.antagonist!.equipment, + handleAntagonistEquipmentChange, ), ]; diff --git a/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/index.tsx b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/index.tsx index ac264e31d..2f651ce98 100644 --- a/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/index.tsx +++ b/src/components/Armor/components/SpacedArmor/components/SpacedArmorSubSpaced/index.tsx @@ -6,6 +6,7 @@ import { ShaderMaterial, } from 'three'; import { degToRad } from 'three/src/math/MathUtils'; +import { isExplosive } from '../../../../../../core/blitz/isExplosive'; import { resolveNearPenetration } from '../../../../../../core/blitz/resolveNearPenetration'; import { hasEquipment } from '../../../../../../core/blitzkrieg/hasEquipment'; import { jsxTree } from '../../../../../../core/blitzkrieg/jsxTree'; @@ -56,21 +57,36 @@ export function SpacedArmorSubSpaced({ shell.normalization ?? 0, ); } - async function handleEquipmentChange(equipment: EquipmentMatrix) { + async function handleProtagonistEquipmentChange( + equipment: EquipmentMatrix, + ) { const hasEnhancedArmor = await hasEquipment(110, false, equipment); material.uniforms.thickness.value = hasEnhancedArmor ? thickness * 1.04 : thickness; } + async function handleAntagonistEquipmentChange(equipment: EquipmentMatrix) { + const shell = useDuel.getState().antagonist!.shell; + const penetration = resolveNearPenetration(shell.penetration); + const hasCalibratedShells = await hasEquipment(103, true, equipment); + material.uniforms.penetration.value = hasCalibratedShells + ? penetration * (isExplosive(shell.type) ? 1.1 : 1.05) + : penetration; + } handleShellChange(useDuel.getState().antagonist!.shell); - handleEquipmentChange(useDuel.getState().protagonist!.equipment); + handleProtagonistEquipmentChange(useDuel.getState().protagonist!.equipment); + handleAntagonistEquipmentChange(useDuel.getState().antagonist!.equipment); const unsubscribes = [ useDuel.subscribe((state) => state.antagonist!.shell, handleShellChange), useDuel.subscribe( (state) => state.protagonist!.equipment, - handleEquipmentChange, + handleProtagonistEquipmentChange, + ), + useDuel.subscribe( + (state) => state.antagonist!.equipment, + handleAntagonistEquipmentChange, ), ];