From 60a0495b9d15dfca72e3fad28f980fadc2874dcc Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sat, 29 Oct 2022 21:04:34 +0300 Subject: [PATCH] Support for blob 4 shots in analyzer + fixed L-3 showing curling damage in multiples. + fixed "1 hit" typoed to "1 hits" Closes #1065 --- app/modules/analyzer/constants.ts | 10 ++++++++++ app/modules/analyzer/stats.ts | 16 +++++++++------- app/modules/analyzer/types.ts | 2 +- app/routes/analyzer.tsx | 14 ++++++++------ public/locales/da/analyzer.json | 2 +- public/locales/de/analyzer.json | 2 +- public/locales/en/analyzer.json | 3 ++- public/locales/es/analyzer.json | 2 +- public/locales/fr/analyzer.json | 2 +- public/locales/ja/analyzer.json | 2 +- public/locales/nl/analyzer.json | 2 +- public/locales/ru/analyzer.json | 2 +- public/locales/zh/analyzer.json | 2 +- translation-progress.md | 28 ++++++++++++++++++---------- 14 files changed, 56 insertions(+), 33 deletions(-) diff --git a/app/modules/analyzer/constants.ts b/app/modules/analyzer/constants.ts index 4e56b505b..dfc0c72b8 100644 --- a/app/modules/analyzer/constants.ts +++ b/app/modules/analyzer/constants.ts @@ -1,5 +1,6 @@ import type { DamageType } from "./types"; import type objectDamages from "./object-dmg.json"; +import type { MainWeaponId } from "../in-game-lists"; export const MAX_LDE_INTENSITY = 21; export const MAX_AP = 57; @@ -158,3 +159,12 @@ export const objectDamageJsonKeyPriority: Record< UltraStamp_Throw_BombCore: null, UltraStamp_Throw: null, }; + +export const multiShot: Partial> = { + // L-3 + 300: 3, + // H-3 + 310: 3, + // Bloblobber + 3030: 4, +}; diff --git a/app/modules/analyzer/stats.ts b/app/modules/analyzer/stats.ts index 404e68056..113ae9704 100644 --- a/app/modules/analyzer/stats.ts +++ b/app/modules/analyzer/stats.ts @@ -10,7 +10,7 @@ import type { StatFunctionInput, SubWeaponParams, } from "./types"; -import { DAMAGE_TYPE } from "./constants"; +import { DAMAGE_TYPE, multiShot } from "./constants"; import { INK_CONSUME_TYPES } from "./types"; import invariant from "tiny-invariant"; import { @@ -71,7 +71,7 @@ export function buildStats({ ? framesToSeconds(mainWeaponParams.KeepChargeFullFrame) : undefined, speedType: mainWeaponParams.WeaponSpeedType ?? "Normal", - isTripleShooter: Boolean(mainWeaponParams.TripleShotSpanFrame), + multiShots: multiShot[weaponSplId], }, stats: { specialPoint: specialPoint(input), @@ -385,7 +385,7 @@ function damages(args: StatFunctionInput): AnalyzedBuild["stats"]["damages"] { shotsToSplat: shotsToSplat({ value, type, - isTripleShooter: Boolean(args.mainWeaponParams.TripleShotSpanFrame), + multiShots: multiShot[args.weaponSplId], }), }); } @@ -396,15 +396,17 @@ function damages(args: StatFunctionInput): AnalyzedBuild["stats"]["damages"] { function shotsToSplat({ value, type, - isTripleShooter, + multiShots, }: { value: number; type: DamageType; - isTripleShooter: boolean; + multiShots?: number; }) { - if (type !== "NORMAL_MAX" && type !== "NORMAL_MAX_FULL_CHARGE") return; + if (!["NORMAL_MAX", "NORMAL_MAX_FULL_CHARGE", "DIRECT"].includes(type)) { + return; + } - const multiplier = isTripleShooter ? 3 : 1; + const multiplier = multiShots ? multiShots : 1; return Math.ceil(1000 / (value * multiplier)); } diff --git a/app/modules/analyzer/types.ts b/app/modules/analyzer/types.ts index d396e5258..e8006bc90 100644 --- a/app/modules/analyzer/types.ts +++ b/app/modules/analyzer/types.ts @@ -185,7 +185,7 @@ export interface AnalyzedBuild { maxChargeHoldSeconds?: number; fullChargeSeconds?: number; speedType: NonNullable | "Normal"; - isTripleShooter: boolean; + multiShots?: number; }; stats: { specialPoint: Stat; diff --git a/app/routes/analyzer.tsx b/app/routes/analyzer.tsx index 050e021aa..412491e09 100644 --- a/app/routes/analyzer.tsx +++ b/app/routes/analyzer.tsx @@ -12,6 +12,7 @@ import { Toggle } from "~/components/Toggle"; import { useSetTitle } from "~/hooks/useSetTitle"; import type { AnalyzedBuild, Stat } from "~/modules/analyzer"; import { MAX_LDE_INTENSITY, useAnalyzeBuild } from "~/modules/analyzer"; +import { damageTypeToWeaponType } from "~/modules/analyzer/constants"; import { lastDitchEffortIntensityToAp, SPECIAL_EFFECTS, @@ -478,7 +479,7 @@ export default function BuildAnalyzerPage() { > @@ -831,11 +832,11 @@ function ModifiedByAbilities({ abilities }: { abilities: Stat["modifiedBy"] }) { function DamageTable({ values, - isTripleShooter, + multiShots, subWeaponId, }: { values: AnalyzedBuild["stats"]["damages"]; - isTripleShooter: AnalyzedBuild["weapon"]["isTripleShooter"]; + multiShots: AnalyzedBuild["weapon"]["multiShots"]; subWeaponId: SubWeaponId; }) { const { t } = useTranslation(["weapons", "analyzer"]); @@ -856,9 +857,10 @@ function DamageTable({ {values.map((val) => { - const damage = isTripleShooter - ? `${val.value}+${val.value}+${val.value}` - : val.value; + const damage = + multiShots && damageTypeToWeaponType[val.type] === "MAIN" + ? new Array(multiShots).fill(val.value).join(" + ") + : val.value; const typeRowName = damageTypeTranslationString({ damageType: val.type, diff --git a/public/locales/da/analyzer.json b/public/locales/da/analyzer.json index 3c1804e8f..58f1b19fd 100644 --- a/public/locales/da/analyzer.json +++ b/public/locales/da/analyzer.json @@ -77,7 +77,7 @@ "damage.header.type": "Type", "damage.header.damage": "Skade", "damage.header.distance": "Distance", - "damage.toSplat": "Våbnet skal bruge {{count}} træffere for at udskadliggøre en fjende.", + "damage.toSplat_other": "Våbnet skal bruge {{count}} træffere for at udskadliggøre en fjende.", "damage.NORMAL_MIN": "Minimum", "damage.NORMAL_MAX": "Maksimum", "damage.NORMAL_MAX_FULL_CHARGE": "Maksimum (ved Fuld opladning)", diff --git a/public/locales/de/analyzer.json b/public/locales/de/analyzer.json index f3a77621c..cd968778a 100644 --- a/public/locales/de/analyzer.json +++ b/public/locales/de/analyzer.json @@ -74,7 +74,7 @@ "damage.header.type": "Typ", "damage.header.damage": "Schaden", "damage.header.distance": "Reichweite", - "damage.toSplat": "{{count}} Treffer bis erledigt", + "damage.toSplat_other": "{{count}} Treffer bis erledigt", "damage.NORMAL_MIN": "Minimum", "damage.NORMAL_MAX": "Maximum", "damage.DIRECT": "Direkt", diff --git a/public/locales/en/analyzer.json b/public/locales/en/analyzer.json index 7004f8f04..72c9e53a3 100644 --- a/public/locales/en/analyzer.json +++ b/public/locales/en/analyzer.json @@ -77,7 +77,8 @@ "damage.header.type": "Type", "damage.header.damage": "Damage", "damage.header.distance": "Distance", - "damage.toSplat": "{{count}} hits to splat", + "damage.toSplat_one": "{{count}} hit to splat", + "damage.toSplat_other": "{{count}} hits to splat", "damage.NORMAL_MIN": "Minimum", "damage.NORMAL_MAX": "Maximum", "damage.NORMAL_MAX_FULL_CHARGE": "Maximum (Fully charged)", diff --git a/public/locales/es/analyzer.json b/public/locales/es/analyzer.json index 1b92d5b6a..0c8febfc5 100644 --- a/public/locales/es/analyzer.json +++ b/public/locales/es/analyzer.json @@ -71,7 +71,7 @@ "damage.header.type": "Tipo", "damage.header.damage": "Daño", "damage.header.distance": "Distancia", - "damage.toSplat": "{{count}} golpes para reventar", + "damage.toSplat_other": "{{count}} golpes para reventar", "damage.NORMAL_MIN": "Mínimo", "damage.NORMAL_MAX": "Máximo", "damage.DIRECT": "Directo", diff --git a/public/locales/fr/analyzer.json b/public/locales/fr/analyzer.json index de524ecc2..538ca89b9 100644 --- a/public/locales/fr/analyzer.json +++ b/public/locales/fr/analyzer.json @@ -71,7 +71,7 @@ "damage.header.type": "Type", "damage.header.damage": "Dégâts", "damage.header.distance": "Distance", - "damage.toSplat": "{{count}} coups pour liquider", + "damage.toSplat_other": "{{count}} coups pour liquider", "damage.NORMAL_MIN": "Minimum", "damage.NORMAL_MAX": "Maximum", "damage.DIRECT": "Direct", diff --git a/public/locales/ja/analyzer.json b/public/locales/ja/analyzer.json index 5a01e038c..08e12a46f 100644 --- a/public/locales/ja/analyzer.json +++ b/public/locales/ja/analyzer.json @@ -77,7 +77,7 @@ "damage.header.type": "タイプ", "damage.header.damage": "ダメージ", "damage.header.distance": "距離", - "damage.toSplat": "{{count}} 確定数", + "damage.toSplat_other": "{{count}} 確定数", "damage.NORMAL_MIN": "最小", "damage.NORMAL_MAX": "最大", "damage.NORMAL_MAX_FULL_CHARGE": "最大 (フルチャージ)", diff --git a/public/locales/nl/analyzer.json b/public/locales/nl/analyzer.json index 566be6f7c..74d19b351 100644 --- a/public/locales/nl/analyzer.json +++ b/public/locales/nl/analyzer.json @@ -50,7 +50,7 @@ "damage.header.type": "Type", "damage.header.damage": "Schade", "damage.header.distance": "Afstand", - "damage.toSplat": "{{count}} treffers nodig om vijand uit te schakelen", + "damage.toSplat_other": "{{count}} treffers nodig om vijand uit te schakelen", "damage.NORMAL_MIN": "Minimum", "damage.NORMAL_MAX": "Maximum", "damage.DIRECT": "Direct", diff --git a/public/locales/ru/analyzer.json b/public/locales/ru/analyzer.json index 906f99297..6cd3229eb 100644 --- a/public/locales/ru/analyzer.json +++ b/public/locales/ru/analyzer.json @@ -74,7 +74,7 @@ "damage.header.type": "Тип", "damage.header.damage": "Урон", "damage.header.distance": "Дальнобойность", - "damage.toSplat": "{{count}} выстрел(ов) для плюха", + "damage.toSplat_other": "{{count}} выстрел(ов) для плюха", "damage.NORMAL_MIN": "Минимум", "damage.NORMAL_MAX": "Максимум", "damage.DIRECT": "Прямое попадание", diff --git a/public/locales/zh/analyzer.json b/public/locales/zh/analyzer.json index c34de5bea..c685aaf8c 100644 --- a/public/locales/zh/analyzer.json +++ b/public/locales/zh/analyzer.json @@ -74,7 +74,7 @@ "damage.header.type": "类型", "damage.header.damage": "伤害", "damage.header.distance": "距离", - "damage.toSplat": "{{count}} 确", + "damage.toSplat_other": "{{count}} 确", "damage.NORMAL_MIN": "最小值", "damage.NORMAL_MAX": "最大值", "damage.DIRECT": "直击", diff --git a/translation-progress.md b/translation-progress.md index c7957307f..813dd1d57 100644 --- a/translation-progress.md +++ b/translation-progress.md @@ -4,11 +4,12 @@ ### 🟡 analyzer.json -**108/111** +**108/112**
Missing +- damage.toSplat_one - damage.DIRECT_MIN - damage.DIRECT_MAX - torpedoExplanation @@ -57,7 +58,7 @@ ### 🟡 analyzer.json -**95/111** +**95/112**
Missing @@ -65,6 +66,7 @@ - objCalcAd - stat.specialLostSplattedByRP - stat.quickRespawnTimeSplattedByRP +- damage.toSplat_one - damage.NORMAL_MAX_FULL_CHARGE - damage.DIRECT_MIN - damage.DIRECT_MAX @@ -138,7 +140,7 @@ ### 🟡 analyzer.json -**92/111** +**92/112**
Missing @@ -149,6 +151,7 @@ - stat.shootingRunSpeed - stat.shootingRunSpeedCharging - stat.shootingRunSpeedFullCharge +- damage.toSplat_one - damage.NORMAL_MAX_FULL_CHARGE - damage.DIRECT_MIN - damage.DIRECT_MAX @@ -296,7 +299,7 @@ ### 🟡 analyzer.json -**92/111** +**92/112**
Missing @@ -307,6 +310,7 @@ - stat.shootingRunSpeed - stat.shootingRunSpeedCharging - stat.shootingRunSpeedFullCharge +- damage.toSplat_one - damage.NORMAL_MAX_FULL_CHARGE - damage.DIRECT_MIN - damage.DIRECT_MAX @@ -466,7 +470,7 @@ ### 🔴 analyzer.json -**0/111** +**0/112** ### 🔴 badges.json @@ -526,11 +530,12 @@ ### 🟡 analyzer.json -**108/111** +**108/112**
Missing +- damage.toSplat_one - damage.DIRECT_MIN - damage.DIRECT_MAX - torpedoExplanation @@ -579,7 +584,7 @@ ### 🔴 analyzer.json -**0/111** +**0/112** ### 🟢 badges.json @@ -734,7 +739,7 @@ ### 🟡 analyzer.json -**95/111** +**95/112**
Missing @@ -742,6 +747,7 @@ - objCalcAd - stat.specialLostSplattedByRP - stat.quickRespawnTimeSplattedByRP +- damage.toSplat_one - damage.NORMAL_MAX_FULL_CHARGE - damage.DIRECT_MIN - damage.DIRECT_MAX @@ -855,7 +861,7 @@ ### 🟡 analyzer.json -**102/111** +**102/112**
Missing @@ -863,6 +869,7 @@ - objCalcAd - stat.specialLostSplattedByRP - stat.quickRespawnTimeSplattedByRP +- damage.toSplat_one - damage.NORMAL_MAX_FULL_CHARGE - damage.DIRECT_MIN - damage.DIRECT_MAX @@ -952,7 +959,7 @@ ### 🟡 analyzer.json -**95/111** +**95/112**
Missing @@ -960,6 +967,7 @@ - objCalcAd - stat.specialLostSplattedByRP - stat.quickRespawnTimeSplattedByRP +- damage.toSplat_one - damage.NORMAL_MAX_FULL_CHARGE - damage.DIRECT_MIN - damage.DIRECT_MAX