diff --git a/app/features/build-analyzer/analyzer-types.ts b/app/features/build-analyzer/analyzer-types.ts
index 1c1111386..80e39cbed 100644
--- a/app/features/build-analyzer/analyzer-types.ts
+++ b/app/features/build-analyzer/analyzer-types.ts
@@ -325,6 +325,7 @@ export interface AnalyzedBuild {
shotAutofireSpreadAir?: Stat;
shotAutofireSpreadGround?: number;
squidSurgeChargeFrames: Stat;
+ squidRollSpeedRetained: Stat;
subDefPointSensorMarkedTimeInSeconds: Stat;
subDefInkMineMarkedTimeInSeconds: Stat;
diff --git a/app/features/build-analyzer/core/stats.test.ts b/app/features/build-analyzer/core/stats.test.ts
index 06628aa93..5a997baf7 100644
--- a/app/features/build-analyzer/core/stats.test.ts
+++ b/app/features/build-analyzer/core/stats.test.ts
@@ -229,6 +229,17 @@ describe("Analyze build", () => {
expect(analyzed.stats.jumpHeightInEnemyInk.value).toBe(1.1);
});
+ test("IA removes the speed loss of consecutive Squid Rolls", () => {
+ const analyzed = buildStats({
+ weaponSplId: 40,
+ abilityPoints: new Map([["IA", 57]]),
+ hasTacticooler: false,
+ });
+
+ expect(analyzed.stats.squidRollSpeedRetained.baseValue).toBe(85);
+ expect(analyzed.stats.squidRollSpeedRetained.value).toBe(100);
+ });
+
test("Accounts for Jr. big ink tank with main weapon ink consumption %", () => {
const analyzedJr = buildStats({
weaponSplId: 10,
diff --git a/app/features/build-analyzer/core/stats.ts b/app/features/build-analyzer/core/stats.ts
index 9dfc29d81..616dec4ed 100644
--- a/app/features/build-analyzer/core/stats.ts
+++ b/app/features/build-analyzer/core/stats.ts
@@ -156,6 +156,7 @@ export function buildStats({
shotAutofireSpreadAir: shotAutofireSpreadAir(input),
shotAutofireSpreadGround: mainWeaponParams.Variable_Stand_DegSwerve,
squidSurgeChargeFrames: squidSurgeChargeFrames(input),
+ squidRollSpeedRetained: squidRollSpeedRetained(input),
subDefPointSensorMarkedTimeInSeconds:
subDefPointSensorMarkedTimeInSeconds(input),
subDefInkMineMarkedTimeInSeconds: subDefInkMineMarkedTimeInSeconds(input),
@@ -1232,6 +1233,26 @@ function squidSurgeChargeFrames(
};
}
+function squidRollSpeedRetained(
+ args: StatFunctionInput,
+): AnalyzedBuild["stats"]["squidRollSpeedRetained"] {
+ const SQUID_ROLL_SPEED_RETAINED_ABILITY = "IA";
+ const { baseEffect, effect } = abilityPointsToEffects({
+ abilityPoints: apFromMap({
+ abilityPoints: args.abilityPoints,
+ ability: SQUID_ROLL_SPEED_RETAINED_ABILITY,
+ }),
+ key: "Somersault_MoveVelKd",
+ weapon: args.mainWeaponParams,
+ });
+
+ return {
+ baseValue: effectToRounded(baseEffect * 100, 1),
+ value: effectToRounded(effect * 100, 1),
+ modifiedBy: SQUID_ROLL_SPEED_RETAINED_ABILITY,
+ };
+}
+
function damageTakenInEnemyInkPerSecond(
args: StatFunctionInput,
): AnalyzedBuild["stats"]["damageTakenInEnemyInkPerSecond"] {
diff --git a/app/features/build-analyzer/routes/analyzer.tsx b/app/features/build-analyzer/routes/analyzer.tsx
index 6b501addb..8600c6484 100644
--- a/app/features/build-analyzer/routes/analyzer.tsx
+++ b/app/features/build-analyzer/routes/analyzer.tsx
@@ -922,6 +922,12 @@ function BuildAnalyzerPage() {
stat={statKeyToTuple("squidSurgeChargeFrames")}
title={t("analyzer:stat.squidSurgeChargeFrames")}
/>
+