diff --git a/app/modules/analyzer/ability-values.json b/app/modules/analyzer/ability-values.json index 7b276481d..580207754 100644 --- a/app/modules/analyzer/ability-values.json +++ b/app/modules/analyzer/ability-values.json @@ -46,5 +46,23 @@ "SensorRadius": [0.0, 0.0, 0.0], "ExplosionRadius": [0.0, 0.0, 0.0], "MaxHP": [0.0, 0.0, 0.0], - "SpecialDurationFrame": [0.0, 0.0, 0.0] + "SpecialDurationFrame": [0.0, 0.0, 0.0], + "DistanceDamageDistanceRate": [0.0, 0.0, 0.0], + "PaintRadius": [0.0, 0.0, 0.0], + "MaxFieldHP": [0.0, 0.0, 0.0], + "InkConsume_Hook": [0.0, 0.0, 0.0], + "InkConsume_PerSec": [0.0, 0.0, 0.0], + "TargetInCircleRadius": [0.0, 0.0, 0.0], + "RainyFrame": [0.0, 0.0, 0.0], + "ChargeRateAutoPerFrame": [0.0, 0.0, 0.0], + "MaxFrame": [0.0, 0.0, 0.0], + "MaxRadius": [0.0, 0.0, 0.0], + "RadiusMax": [0.0, 0.0, 0.0], + "RadiusMin": [0.0, 0.0, 0.0], + "LaserFrame": [0.0, 0.0, 0.0], + "SplashAroundVelocityMin": [0.0, 0.0, 0.0], + "SplashAroundVelocityMax": [0.0, 0.0, 0.0], + "SplashAroundPaintRadius": [0.0, 0.0, 0.0], + "SpecialTotalFrame": [0.0, 0.0, 0.0], + "PowerUpFrame": [0.0, 0.0, 0.0] } diff --git a/app/modules/analyzer/stats.ts b/app/modules/analyzer/stats.ts index 644b334ff..4877efa4a 100644 --- a/app/modules/analyzer/stats.ts +++ b/app/modules/analyzer/stats.ts @@ -108,6 +108,8 @@ export function buildStats({ subDefBombDamageHeavyPercentage: subDefBombDamageHeavyPercentage(input), ...subStats(input), specialDurationInSeconds: specialDurationInSeconds(input), + specialDamageDistance: specialDamageDistance(input), + specialPaintRadius: specialPaintRadius(input), }, }; } @@ -949,3 +951,43 @@ function specialDurationInSeconds( modifiedBy: SPECIAL_DURATION_IN_SECONDS_KEY, }; } + +function specialDamageDistance( + args: StatFunctionInput +): AnalyzedBuild["stats"]["specialDamageDistance"] { + const SPECIAL_DAMAGE_DISTANCE_KEY = "SPU"; + const { baseEffect, effect } = abilityPointsToEffects({ + abilityPoints: apFromMap({ + abilityPoints: args.abilityPoints, + ability: SPECIAL_DAMAGE_DISTANCE_KEY, + }), + key: "DistanceDamageDistanceRate", + weapon: args.specialWeaponParams, + }); + + return { + baseValue: roundToTwoDecimalPlaces(baseEffect), + value: roundToTwoDecimalPlaces(effect), + modifiedBy: SPECIAL_DAMAGE_DISTANCE_KEY, + }; +} + +function specialPaintRadius( + args: StatFunctionInput +): AnalyzedBuild["stats"]["specialPaintRadius"] { + const SPECIAL_PAINT_RADIUS_KEY = "SPU"; + const { baseEffect, effect } = abilityPointsToEffects({ + abilityPoints: apFromMap({ + abilityPoints: args.abilityPoints, + ability: SPECIAL_PAINT_RADIUS_KEY, + }), + key: "PaintRadius", + weapon: args.specialWeaponParams, + }); + + return { + baseValue: roundToTwoDecimalPlaces(baseEffect), + value: roundToTwoDecimalPlaces(effect), + modifiedBy: SPECIAL_PAINT_RADIUS_KEY, + }; +} diff --git a/app/modules/analyzer/types.ts b/app/modules/analyzer/types.ts index 49801b0cd..1ad7ff5ed 100644 --- a/app/modules/analyzer/types.ts +++ b/app/modules/analyzer/types.ts @@ -8,11 +8,16 @@ import type { SPECIAL_EFFECTS } from "./specialEffects"; import type weaponParams from "./weapon-params.json"; import type abilityValues from "./ability-values.json"; +type Overwrites = Record< + string, + Partial> +>; + export interface MainWeaponParams { subWeaponId: SubWeaponId; specialWeaponId: SpecialWeaponId; /** Replacing default values of the ability json for this specific weapon */ - overwrites?: Record>>; + overwrites?: Overwrites; SpecialPoint: number; /** Weapon's weight class. "Light/Heavy weapon" */ WeaponSpeedType?: "Slow" | "Fast"; @@ -77,7 +82,7 @@ export interface DistanceDamage { } export interface SubWeaponParams { - overwrites?: Record>>; + overwrites?: Overwrites; SubInkSaveLv: 0 | 1 | 2 | 3; /** How much ink one usage of the sub consumes */ InkConsume: number; @@ -100,7 +105,9 @@ export interface SubWeaponParams { } type SpecialWeaponParamsObject = typeof weaponParams["specialWeapons"]; -export type SpecialWeaponParams = SpecialWeaponParamsObject[SpecialWeaponId]; +export type SpecialWeaponParams = SpecialWeaponParamsObject[SpecialWeaponId] & { + overwrites?: Overwrites; +}; export type ParamsJson = { mainWeapons: Record; @@ -220,6 +227,8 @@ export interface AnalyzedBuild { subHp?: Stat; specialDurationInSeconds?: Stat; + specialDamageDistance?: Stat; + specialPaintRadius?: Stat; }; } diff --git a/app/modules/analyzer/utils.ts b/app/modules/analyzer/utils.ts index 7ed99b20d..0f9314c8c 100644 --- a/app/modules/analyzer/utils.ts +++ b/app/modules/analyzer/utils.ts @@ -68,8 +68,6 @@ function abilityValues({ key: keyof typeof abilityValuesJson; weapon: MainWeaponParams | SubWeaponParams | SpecialWeaponParams; }): [number, number, number] { - // xxx: before prod - // @ts-expect-error should be gone soon const overwrites = weapon.overwrites?.[key]; const [High, Mid, Low] = abilityValuesJson[key]; diff --git a/app/routes/analyzer.tsx b/app/routes/analyzer.tsx index 075ef81e8..d61dc8da1 100644 --- a/app/routes/analyzer.tsx +++ b/app/routes/analyzer.tsx @@ -266,6 +266,26 @@ export default function BuildAnalyzerPage() { suffix={t("analyzer:suffix.seconds")} /> )} + {analyzed.stats.specialDamageDistance && ( + + )} + {analyzed.stats.specialPaintRadius && ( + + )}