mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 19:49:50 +02:00
Merge branch 'main' into data-driven
This commit is contained in:
commit
1b08393f65
60 files changed
+434
-474
No files matched your search
@@ -56,6 +56,36 @@ export type ArmorUserData = {
|
||||
}
|
||||
);
|
||||
|
||||
const PENETRATION_RANDOMIZATION = 0.05;
|
||||
|
||||
function resolvePenetrationChance(shoot: (scale: number) => Shot | null) {
|
||||
function penetrates(scale: number) {
|
||||
const shot = shoot(scale);
|
||||
|
||||
return (shot?.out ?? shot?.in)?.status === "penetration";
|
||||
}
|
||||
|
||||
let low = 1 - PENETRATION_RANDOMIZATION;
|
||||
let high = 1 + PENETRATION_RANDOMIZATION;
|
||||
|
||||
if (penetrates(low)) return 1;
|
||||
if (!penetrates(high)) return 0;
|
||||
|
||||
for (let iteration = 0; iteration < 16; iteration++) {
|
||||
const middle = (low + high) / 2;
|
||||
|
||||
if (penetrates(middle)) {
|
||||
high = middle;
|
||||
} else {
|
||||
low = middle;
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
(1 + PENETRATION_RANDOMIZATION - high) / (2 * PENETRATION_RANDOMIZATION)
|
||||
);
|
||||
}
|
||||
|
||||
const omitMaterial = new MeshBasicMaterial({
|
||||
colorWrite: false,
|
||||
depthWrite: true,
|
||||
@@ -82,6 +112,7 @@ export function SpacedArmorSceneComponent({
|
||||
intersections: Intersection[],
|
||||
allowRicochet: boolean,
|
||||
remainingPenetrationInput?: number,
|
||||
penetrationScale = 1,
|
||||
) => {
|
||||
const protagonist = getDuel("protagonist", DuelModule.Tank);
|
||||
const antagonist = getDuel("antagonist", DuelModule.Tank);
|
||||
@@ -119,6 +150,7 @@ export function SpacedArmorSceneComponent({
|
||||
Tankopedia.state.protagonist.equipment,
|
||||
);
|
||||
const penetration =
|
||||
penetrationScale *
|
||||
shell.penetration!.near *
|
||||
resolvePenetrationCoefficient(
|
||||
hasCalibratedShells,
|
||||
@@ -361,6 +393,7 @@ export function SpacedArmorSceneComponent({
|
||||
ricochetIntersections,
|
||||
false,
|
||||
remainingPenetration,
|
||||
penetrationScale,
|
||||
);
|
||||
|
||||
shot.in.status = "ricochet";
|
||||
@@ -416,6 +449,16 @@ export function SpacedArmorSceneComponent({
|
||||
|
||||
const shot = shoot(event.point, event.intersections, true)!;
|
||||
|
||||
shot.penetrationChance = resolvePenetrationChance((scale) =>
|
||||
shoot(
|
||||
event.point,
|
||||
event.intersections,
|
||||
true,
|
||||
undefined,
|
||||
scale,
|
||||
),
|
||||
);
|
||||
|
||||
Tankopedia.mutate((draft) => {
|
||||
draft.shot = shot;
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user