feat: penetration testing

This commit is contained in:
TrèsAbhi committed 2026-04-03 12:57:43 -05:00
1 parent 1a008a4852
commit b176ec6c96
7 files changed
+53 -23

No files matched your search

@@ -1,16 +1,21 @@
import { ShellType } from "../protos";
import { Equalizer, ShellType } from "../protos";
export function resolvePenetrationCoefficient(
calibratedShells: boolean,
equalize: boolean,
type: ShellType,
equalizerObj?: Equalizer,
) {
if (!calibratedShells) return 1;
const calibrated = calibratedShells
? type === ShellType.SHELL_TYPE_AP
? 1.08
: type === ShellType.SHELL_TYPE_APCR
? 1.05
: type === ShellType.SHELL_TYPE_HEAT
? 1.13
: 1.08
: 1;
const equalizer = (equalize ? equalizerObj?.penetration : undefined) ?? 1;
return type === ShellType.SHELL_TYPE_AP
? 1.08
: type === ShellType.SHELL_TYPE_APCR
? 1.05
: type === ShellType.SHELL_TYPE_HEAT
? 1.13
: 1.08;
return calibrated * equalizer;
}
@@ -151,7 +151,12 @@ export function PrimaryArmorSceneComponent({
material.uniforms.penetration.value =
penetration *
resolvePenetrationCoefficient(hasCalibratedShells, shell.type) *
resolvePenetrationCoefficient(
hasCalibratedShells,
Duel.state.equalize,
shell.type,
Duel.state.antagonist.tank.equalizer,
) *
equalize;
if (!noInvalidate) invalidate();
@@ -85,7 +85,12 @@ export function SpacedArmorSubExternal({
material.uniforms.penetration.value =
penetration *
resolvePenetrationCoefficient(hasCalibratedShells, shell.type) *
resolvePenetrationCoefficient(
hasCalibratedShells,
Duel.state.equalize,
shell.type,
Duel.state.antagonist.tank.equalizer,
) *
equalize;
}
@@ -95,7 +95,12 @@ export function SpacedArmorSubSpaced({
material.uniforms.penetration.value =
penetration *
resolvePenetrationCoefficient(hasCalibratedShells, shell.type) *
resolvePenetrationCoefficient(
hasCalibratedShells,
Duel.state.equalize,
shell.type,
Duel.state.antagonist.tank.equalizer,
) *
equalize;
}
@@ -18,6 +18,7 @@ import {
import { degToRad } from "three/src/math/MathUtils.js";
import { hasEquipment } from "../../../../core/blitzkit/hasEquipment";
import { jsxTree } from "../../../../core/blitzkit/jsxTree";
import { defaultEqualizer } from "../../../../core/blitzkit/tankToDuelMember";
import { discardClippingPlane } from "../../../../core/three/discardClippingPlane";
import { Duel } from "../../../../stores/duel";
import {
@@ -88,9 +89,12 @@ export function SpacedArmorSceneComponent({
const { customShell } = Tankopedia.state;
const shell = customShell ?? Duel.state.antagonist.shell;
const { equalize } = Duel.state;
const equalizer =
(equalize ? Duel.state.antagonist.tank.equalizer?.damage : undefined) ??
1;
const protagonistEqualizer =
(equalize ? Duel.state.protagonist.tank.equalizer : undefined) ??
defaultEqualizer;
const antagonistEqualizer =
(equalize ? Duel.state.antagonist.tank.equalizer : undefined) ??
defaultEqualizer;
const cameraNormal = camera.position.clone().sub(point).normalize();
const shot: Shot = {
splashRadius:
@@ -118,8 +122,14 @@ export function SpacedArmorSceneComponent({
);
const penetration =
shell.penetration!.near *
resolvePenetrationCoefficient(hasCalibratedShells, shell.type);
const thicknessCoefficient = hasEnhancedArmor ? 1.03 : 1;
resolvePenetrationCoefficient(
hasCalibratedShells,
equalize,
shell.type,
antagonistEqualizer,
);
const thicknessCoefficient =
(hasEnhancedArmor ? 1.03 : 1) * protagonistEqualizer.armor;
const filteredIntersections = intersections.filter(
(intersection) =>
"type" in intersection.object.userData &&
@@ -371,7 +381,7 @@ export function SpacedArmorSceneComponent({
}
}
shot.damage *= equalizer;
shot.damage *= antagonistEqualizer.damage;
return shot;
},
@@ -102,6 +102,7 @@ export function Options({ thicknessRange, canvas, skeleton }: OptionsProps) {
value: (
resolvePenetrationCoefficient(
hasCalibratedShells,
false,
antagonistShell.type,
) * antagonistShell.penetration!.near
).toFixed(0),
@@ -181,11 +181,10 @@ export function tankCharacteristics(
(coefficient([hasGunRammer, -0.05]) *
coefficient([true, degressiveStat(loaderMastery)])) /
coefficient([hasAdrenaline && gun.gun_type!.$case === "regular", 0.17]);
const penetrationCoefficient =
coefficient([
hasCalibratedShells,
resolvePenetrationCoefficient(true, shell.type) - 1,
]) * equalizer.penetration;
const penetrationCoefficient = coefficient([
hasCalibratedShells,
resolvePenetrationCoefficient(true, equalize, shell.type, equalizer) - 1,
]);
const healthCoefficient =
coefficient(
[hasSandbagArmor, 0.03],