diff --git a/app/features/build-analyzer/analyzer-types.ts b/app/features/build-analyzer/analyzer-types.ts
index 47b01070c..8e1b14d91 100644
--- a/app/features/build-analyzer/analyzer-types.ts
+++ b/app/features/build-analyzer/analyzer-types.ts
@@ -311,6 +311,7 @@ export interface AnalyzedBuild {
swimSpeed: Stat;
swimSpeedHoldingRainmaker: Stat;
runSpeedInEnemyInk: Stat;
+ jumpHeightInEnemyInk: Stat;
framesBeforeTakingDamageInEnemyInk: Stat;
damageTakenInEnemyInkPerSecond: Stat;
enemyInkDamageLimit: Stat;
diff --git a/app/features/build-analyzer/core/stats.test.ts b/app/features/build-analyzer/core/stats.test.ts
index 8e1e2f80a..06628aa93 100644
--- a/app/features/build-analyzer/core/stats.test.ts
+++ b/app/features/build-analyzer/core/stats.test.ts
@@ -218,6 +218,17 @@ describe("Analyze build", () => {
expect(statWithISM.value).toBeGreaterThan(statWithISM.baseValue);
});
+ test("RES increases jump height in enemy ink", () => {
+ const analyzed = buildStats({
+ weaponSplId: 40,
+ abilityPoints: new Map([["RES", 57]]),
+ hasTacticooler: false,
+ });
+
+ expect(analyzed.stats.jumpHeightInEnemyInk.baseValue).toBe(0.8);
+ expect(analyzed.stats.jumpHeightInEnemyInk.value).toBe(1.1);
+ });
+
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 c29de271c..063bd82bd 100644
--- a/app/features/build-analyzer/core/stats.ts
+++ b/app/features/build-analyzer/core/stats.ts
@@ -142,6 +142,7 @@ export function buildStats({
swimSpeed: swimSpeed(input),
swimSpeedHoldingRainmaker: swimSpeedHoldingRainmaker(input),
runSpeedInEnemyInk: runSpeedInEnemyInk(input),
+ jumpHeightInEnemyInk: jumpHeightInEnemyInk(input),
damageTakenInEnemyInkPerSecond: damageTakenInEnemyInkPerSecond(input),
enemyInkDamageLimit: enemyInkDamageLimit(input),
framesBeforeTakingDamageInEnemyInk:
@@ -926,6 +927,26 @@ function runSpeedInEnemyInk(
};
}
+function jumpHeightInEnemyInk(
+ args: StatFunctionInput,
+): AnalyzedBuild["stats"]["jumpHeightInEnemyInk"] {
+ const JUMP_HEIGHT_IN_ENEMY_INK_ABILITY = "RES";
+ const { baseEffect, effect } = abilityPointsToEffects({
+ abilityPoints: apFromMap({
+ abilityPoints: args.abilityPoints,
+ ability: JUMP_HEIGHT_IN_ENEMY_INK_ABILITY,
+ }),
+ key: "OpInk_JumpVel",
+ weapon: args.mainWeaponParams,
+ });
+
+ return {
+ baseValue: effectToRounded(baseEffect * 10),
+ value: effectToRounded(effect * 10),
+ modifiedBy: JUMP_HEIGHT_IN_ENEMY_INK_ABILITY,
+ };
+}
+
function shootingRunSpeed(
args: StatFunctionInput,
keyName:
diff --git a/app/features/build-analyzer/data/ability-values.ts b/app/features/build-analyzer/data/ability-values.ts
index 281e5fcd9..bc09c0c68 100644
--- a/app/features/build-analyzer/data/ability-values.ts
+++ b/app/features/build-analyzer/data/ability-values.ts
@@ -4,7 +4,7 @@ export const abilityValues = {
ConsumeRt_Sub_Lv1: [0.7, 0.85, 1.0],
ConsumeRt_Sub_Lv2: [0.65, 0.825, 1.0],
ConsumeRt_Sub_Lv3: [0.6, 0.8, 1.0],
- ConsumeRt_Sub_Lv4: [0.71111, 0.85555, 1.0],
+ ConsumeRt_Sub_Lv4: [0.711111, 0.855555, 1.0],
DamageRt_BombH: [0.5, 0.75, 1.0],
DamageRt_BombL: [0.6, 0.75, 1.0],
DamageRt_LineMarker: [0.5, 0.75, 1.0],
@@ -27,7 +27,7 @@ export const abilityValues = {
MoveVel_Stealth_Slow: [0.24, 0.216, 0.1728],
OpInk_ArmorHP: [39.0, 26.0, 0.0],
OpInk_DamageLmt: [0.2, 0.3, 0.4],
- OpInk_DamagePerFrame: [0.0015, 0.0022, 0.003],
+ OpInk_DamagePerFrame: [0.0015, 0.00225, 0.003],
OpInk_JumpVel: [0.11, 0.098, 0.08],
OpInk_MoveVel: [0.0768, 0.0557, 0.024],
OpInk_MoveVel_Shot: [0.042, 0.033, 0.012],
diff --git a/app/features/build-analyzer/routes/analyzer.tsx b/app/features/build-analyzer/routes/analyzer.tsx
index 938cc4989..6b501addb 100644
--- a/app/features/build-analyzer/routes/analyzer.tsx
+++ b/app/features/build-analyzer/routes/analyzer.tsx
@@ -927,6 +927,11 @@ function BuildAnalyzerPage() {
stat={statKeyToTuple("runSpeedInEnemyInk")}
title={t("analyzer:stat.runSpeedInEnemyInk")}
/>
+