diff --git a/src/components/ArmorMesh/components/Armor/index.tsx b/src/components/ArmorMesh/components/Armor/index.tsx index 8900df693..3a70006ba 100644 --- a/src/components/ArmorMesh/components/Armor/index.tsx +++ b/src/components/ArmorMesh/components/Armor/index.tsx @@ -9,6 +9,7 @@ import { Vector3, } from 'three'; import { degToRad } from 'three/src/math/MathUtils'; +import { canRicochet } from '../../../../core/blitz/canRicochet'; import { canSplash } from '../../../../core/blitz/canSplash'; import { isExplosive } from '../../../../core/blitz/isExplosive'; import { resolveNearPenetration } from '../../../../core/blitz/resolveNearPenetration'; @@ -43,6 +44,7 @@ export function ArmorMesh({ const initialTankopedia = useTankopediaPersistent.getState(); const material = useRef(null); const explosionCapable = isExplosive(initialShell.type); + const ricochetCapable = canRicochet(initialShell.type); const cameraNormal = new Vector3(); const shellNormal = new Vector3(); const surfaceNormal = new Vector3(); @@ -66,6 +68,7 @@ export function ArmorMesh({ function updateShellProperties() { const shell = useDuel.getState().antagonist!.shell; if (material.current) { + material.current.uniforms.canRicochet.value = canRicochet(shell.type); material.current.uniforms.isExplosive.value = isExplosive(shell.type); material.current.uniforms.canSplash.value = canSplash(shell.type); material.current.uniforms.caliber.value = shell.caliber; @@ -211,7 +214,7 @@ export function ArmorMesh({ if ( index === 0 && - !isExplosive(shell.type) && + canRicochet(shell.type) && !threeCalibersRule && angle >= degToRad(shell.ricochet!) ) { @@ -319,6 +322,7 @@ export function ArmorMesh({ }, maxThickness: { value: maxThickness }, isExplosive: { value: explosionCapable }, + canRicochet: { value: ricochetCapable }, canSplash: { value: canSplash(initialShell.type) }, thickness: { value: diff --git a/src/components/ArmorMesh/components/Armor/shaders/fragment.glsl b/src/components/ArmorMesh/components/Armor/shaders/fragment.glsl index 21f7cdba6..17754268e 100644 --- a/src/components/ArmorMesh/components/Armor/shaders/fragment.glsl +++ b/src/components/ArmorMesh/components/Armor/shaders/fragment.glsl @@ -3,6 +3,7 @@ varying vec3 vViewPosition; varying vec3 vNormal; uniform bool isExplosive; +uniform bool canRicochet; uniform bool canSplash; uniform float thickness; uniform float penetration; @@ -45,7 +46,7 @@ void main() { float spacedArmorNominalThickness = spacedArmorMaskColor.g * maxThickness; bool spacedArmorThreeCalibersRule = isUnderSpacedArmor && caliber > 3.0 * spacedArmorNominalThickness; bool hasRicochetedSpacedArmor = isUnderSpacedArmor && !spacedArmorThreeCalibersRule && spacedArmorAngle >= ricochetAngle; - bool hasRicochetedCoreArmor = !hasRicochetedSpacedArmor && !isUnderExternalModule && !isExplosive && !coreArmorThreeCalibersRule && coreArmorangle >= ricochetAngle; + bool hasRicochetedCoreArmor = !hasRicochetedSpacedArmor && !isUnderExternalModule && canRicochet && !coreArmorThreeCalibersRule && coreArmorangle >= ricochetAngle; if (hasRicochetedCoreArmor || hasRicochetedSpacedArmor) { penetrationChance = 0.0; diff --git a/src/core/blitz/canRicochet.ts b/src/core/blitz/canRicochet.ts new file mode 100644 index 000000000..fc03a9a99 --- /dev/null +++ b/src/core/blitz/canRicochet.ts @@ -0,0 +1,7 @@ +import { ShellDefinition } from '../blitzkrieg/tankDefinitions'; + +export function canRicochet( + type: ShellDefinition['type'], +): type is Exclude { + return type !== 'he'; +}