Sub defense stats for Point Sensor and Ink Mine

This commit is contained in:
Kalle 2022-09-17 17:09:46 +03:00
parent f57d1a750d
commit bdaa18b3a2
9 changed files with 175 additions and 5 deletions

View File

@ -44,5 +44,6 @@
"PeriodSecond": [0.0, 0.0, 0.0],
"MarkingFrameSubSpec": [0.0, 0.0, 0.0],
"SensorRadius": [0.0, 0.0, 0.0],
"ExplosionRadius": [0.0, 0.0, 0.0],
"MaxHP": [0.0, 0.0, 0.0]
}

View File

@ -1,4 +1,5 @@
import type { MainWeaponId } from "~/modules/in-game-lists";
import { INK_MINE_ID, POINT_SENSOR_ID } from "~/modules/in-game-lists";
import type {
AbilityPoints,
AnalyzedBuild,
@ -80,6 +81,9 @@ export function buildStats({
quickRespawnTime: quickRespawnTime(input),
superJumpTimeGroundFrames: superJumpTimeGroundFrames(input),
superJumpTimeTotal: superJumpTimeTotal(input),
subDefPointSensorMarkedTimeInSeconds:
subDefPointSensorMarkedTimeInSeconds(input),
subDefInkMineMarkedTimeInSeconds: subDefInkMineMarkedTimeInSeconds(input),
...subStats(input),
},
};
@ -592,6 +596,11 @@ const SUB_WEAPON_STATS = [
abilityValuesKey: "SensorRadius",
type: "NO_CHANGE",
},
{
analyzedBuildKey: "subExplosionRadius",
abilityValuesKey: "ExplosionRadius",
type: "NO_CHANGE",
},
{ analyzedBuildKey: "subHp", abilityValuesKey: "MaxHP", type: "HP" },
] as const;
function subStats(args: StatFunctionInput) {
@ -633,3 +642,59 @@ function subStats(args: StatFunctionInput) {
return result;
}
function subDefPointSensorMarkedTimeInSeconds(
args: StatFunctionInput
): AnalyzedBuild["stats"]["subDefPointSensorMarkedTimeInSeconds"] {
const SUB_DEF_POINT_SENSOR_MARKED_TIME_IN_SECONDS_KEY = "SRU";
const { baseEffect, effect } = abilityPointsToEffects({
abilityPoints: apFromMap({
abilityPoints: args.abilityPoints,
ability: SUB_DEF_POINT_SENSOR_MARKED_TIME_IN_SECONDS_KEY,
}),
key: "MarkingTimeRt",
weapon: args.mainWeaponParams,
});
const pointSensorParams = weaponParams().subWeapons[POINT_SENSOR_ID];
const { baseEffect: markingTimeEffect } = abilityPointsToEffects({
abilityPoints: 0,
key: "MarkingFrameSubSpec",
weapon: pointSensorParams,
});
return {
baseValue: framesToSeconds(markingTimeEffect * baseEffect),
modifiedBy: SUB_DEF_POINT_SENSOR_MARKED_TIME_IN_SECONDS_KEY,
value: framesToSeconds(markingTimeEffect * effect),
};
}
function subDefInkMineMarkedTimeInSeconds(
args: StatFunctionInput
): AnalyzedBuild["stats"]["subDefInkMineMarkedTimeInSeconds"] {
const SUB_DEF_INK_MINE_MARKED_TIME_IN_SECONDS_KEY = "SRU";
const { baseEffect, effect } = abilityPointsToEffects({
abilityPoints: apFromMap({
abilityPoints: args.abilityPoints,
ability: SUB_DEF_INK_MINE_MARKED_TIME_IN_SECONDS_KEY,
}),
key: "MarkingTimeRt_Trap",
weapon: args.mainWeaponParams,
});
const inkMineParams = weaponParams().subWeapons[INK_MINE_ID];
const { baseEffect: markingTimeEffect } = abilityPointsToEffects({
abilityPoints: 0,
key: "MarkingFrameSubSpec",
weapon: inkMineParams,
});
return {
baseValue: framesToSeconds(markingTimeEffect * baseEffect),
modifiedBy: SUB_DEF_INK_MINE_MARKED_TIME_IN_SECONDS_KEY,
value: framesToSeconds(markingTimeEffect * effect),
};
}

View File

@ -185,11 +185,24 @@ export interface AnalyzedBuild {
quickRespawnTime: Stat;
superJumpTimeGroundFrames: Stat;
superJumpTimeTotal: Stat;
subDefPointSensorMarkedTimeInSeconds: Stat;
subDefInkMineMarkedTimeInSeconds: Stat;
// subDefBombDamageLight: Stat;
// subDefBombDamageHeavy: Stat;
// subDefAngleShooterDamage: Stat;
// subDefSplashWallDamage: Stat;
// subDefSprinklerDamage: Stat;
// subDefToxicMistMoveReduction: Stat;
// subDefInkMineMarkingTime: Stat;
// subDefPointSensorMarkingTime: Stat;
subVelocity?: Stat;
subFirstPhaseDuration?: Stat;
subSecondPhaseDuration?: Stat;
subMarkingTimeInSeconds?: Stat;
subMarkingRadius?: Stat;
subExplosionRadius?: Stat;
subHp?: Stat;
};
}

View File

@ -875,10 +875,20 @@
},
"10": {
"overwrites": {
"MarkingFrameSubSpec": {
"High": 600,
"Low": 300,
"Mid": 450
},
"SensorRadius": {
"High": 4,
"Low": 3,
"Mid": 3.5
},
"ExplosionRadius": {
"High": 11,
"Low": 8,
"Mid": 9.5
}
},
"SubInkSaveLv": 3,

View File

@ -1,6 +1,24 @@
export { stages } from "./stages";
export { modes, modesShort } from "./modes";
export { mainWeaponIds, subWeaponIds, specialWeaponIds } from "./weapon-ids";
export {
mainWeaponIds,
subWeaponIds,
specialWeaponIds,
SPLAT_BOMB_ID,
SUCTION_BOMB_ID,
BURST_BOMB_ID,
SPRINKLER_ID,
SPLASH_WALL_ID,
FIZZY_BOMB_ID,
CURLING_BOMB_ID,
AUTO_BOMB_ID,
SQUID_BEAKON_ID,
POINT_SENSOR_ID,
INK_MINE_ID,
TOXIC_MIST_ID,
ANGLE_SHOOTER_ID,
TORPEDO_ID,
} from "./weapon-ids";
export { headGearIds, clothesGearIds, shoesGearIds } from "./gear-ids";
export { abilitiesShort, abilities } from "./abilities";
export type {

View File

@ -5,8 +5,36 @@ export const mainWeaponIds = [
5010, 5020, 5030, 5040, 6000, 6010, 6020, 7010, 7020, 8000, 8010,
] as const;
export const SPLAT_BOMB_ID = 0;
export const SUCTION_BOMB_ID = 1;
export const BURST_BOMB_ID = 2;
export const SPRINKLER_ID = 3;
export const SPLASH_WALL_ID = 4;
export const FIZZY_BOMB_ID = 5;
export const CURLING_BOMB_ID = 6;
export const AUTO_BOMB_ID = 7;
export const SQUID_BEAKON_ID = 8;
export const POINT_SENSOR_ID = 9;
export const INK_MINE_ID = 10;
export const TOXIC_MIST_ID = 11;
export const ANGLE_SHOOTER_ID = 12;
export const TORPEDO_ID = 13;
export const subWeaponIds = [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
SPLAT_BOMB_ID,
SUCTION_BOMB_ID,
BURST_BOMB_ID,
SPRINKLER_ID,
SPLASH_WALL_ID,
FIZZY_BOMB_ID,
CURLING_BOMB_ID,
AUTO_BOMB_ID,
SQUID_BEAKON_ID,
POINT_SENSOR_ID,
INK_MINE_ID,
TOXIC_MIST_ID,
ANGLE_SHOOTER_ID,
TORPEDO_ID,
] as const;
export const specialWeaponIds = [

View File

@ -20,6 +20,7 @@ import type {
SpecialEffectType,
} from "~/modules/analyzer/types";
import type { BuildAbilitiesTupleWithUnknown } from "~/modules/in-game-lists";
import { INK_MINE_ID, POINT_SENSOR_ID } from "~/modules/in-game-lists";
import {
abilities,
isAbility,
@ -47,7 +48,7 @@ export const handle = {
};
export default function BuildAnalyzerPage() {
const { t } = useTranslation(["analyzer", "common"]);
const { t } = useTranslation(["analyzer", "common", "weapons"]);
useSetTitle(t("common:pages.buildAnalyzer"));
const {
build,
@ -140,6 +141,7 @@ export default function BuildAnalyzerPage() {
/>
)}
</StatCategory>
<StatCategory title={t("analyzer:stat.category.sub")}>
<StatCard
stat={analyzed.stats.subWeaponWhiteInkSeconds}
@ -179,6 +181,12 @@ export default function BuildAnalyzerPage() {
title={t("analyzer:stat.sub.markingRadius")}
/>
)}
{analyzed.stats.subExplosionRadius && (
<StatCard
stat={analyzed.stats.subExplosionRadius}
title={t("analyzer:stat.sub.explosionRadius")}
/>
)}
{analyzed.stats.subHp && (
<StatCard
stat={analyzed.stats.subHp}
@ -187,11 +195,12 @@ export default function BuildAnalyzerPage() {
/>
)}
</StatCategory>
<StatCategory title={t("analyzer:stat.category.special")}>
<StatCard
stat={analyzed.stats.specialPoint}
title={t("analyzer:stat.specialPoints")}
suffix="p"
suffix={t("analyzer:suffix.specialPointsShort")}
/>
<StatCard
stat={analyzed.stats.specialSavedAfterDeath}
@ -199,6 +208,23 @@ export default function BuildAnalyzerPage() {
suffix="%"
/>
</StatCategory>
<StatCategory title={t("analyzer:stat.category.subDef")}>
<StatCard
stat={analyzed.stats.subDefPointSensorMarkedTimeInSeconds}
title={t("analyzer:stat.markedTime", {
weapon: t(`weapons:SUB_${POINT_SENSOR_ID}`),
})}
suffix={t("analyzer:suffix.seconds")}
/>
<StatCard
stat={analyzed.stats.subDefInkMineMarkedTimeInSeconds}
title={t("analyzer:stat.markedTime", {
weapon: t(`weapons:SUB_${INK_MINE_ID}`),
})}
suffix={t("analyzer:suffix.seconds")}
/>
</StatCategory>
{analyzed.stats.damages.length > 0 && (
<StatCategory
title={t("analyzer:stat.category.damage")}
@ -211,6 +237,7 @@ export default function BuildAnalyzerPage() {
/>
</StatCategory>
)}
{analyzed.stats.fullInkTankOptions.length > 0 && (
<StatCategory
title={t("analyzer:stat.category.actionsPerInkTank")}
@ -222,6 +249,7 @@ export default function BuildAnalyzerPage() {
/>
</StatCategory>
)}
<StatCategory title={t("analyzer:stat.category.movement")}>
<StatCard
stat={analyzed.stats.swimSpeed}
@ -250,6 +278,7 @@ export default function BuildAnalyzerPage() {
suffix={t("analyzer:suffix.hp")}
/>
</StatCategory>
<StatCategory title={t("analyzer:stat.category.misc")}>
<StatCard
stat={analyzed.stats.squidFormInkRecoverySeconds}

View File

@ -6,6 +6,7 @@
"stat.category.main": "Main weapon",
"stat.category.sub": "Sub weapon",
"stat.category.special": "Special weapon",
"stat.category.subDef": "Sub weapon defense",
"stat.category.actionsPerInkTank": "Actions per ink tank",
"stat.category.damage": "Damage",
"stat.category.movement": "Movement",
@ -26,6 +27,7 @@
"stat.framesBeforeTakingDamageInEnemyInk": "Frames before enemy ink damage",
"stat.damageTakenInEnemyInkPerSecond": "Damage from enemy ink per second",
"stat.enemyInkDamageLimit": "Max damage from enemy ink",
"stat.markedTime": "{{weapon}} tracking time",
"stat.consumption.NORMAL": "Shots",
"stat.consumption.SWING": "Swings",
"stat.consumption.SLOSH": "Sloshes",
@ -41,6 +43,7 @@
"stat.sub.secondPhaseDuration": "Mid phase duration",
"stat.sub.markingTimeInSeconds": "Marking duration",
"stat.sub.markingRadius": "Marking radius",
"stat.sub.explosionRadius": "Explosion radius",
"stat.sub.hp": "Durability",
"damage.header.type": "Type",
"damage.header.damage": "Damage",
@ -55,6 +58,7 @@
"damage.DISTANCE": "Splash",
"suffix.seconds": "s",
"suffix.hp": "hp",
"suffix.specialPointsShort": "p",
"base": "Base",
"value": "Value",
"build": "Build",

View File

@ -343,8 +343,10 @@ function resolveSubWeaponOverwrites(params: any) {
PeriodSecond: params["MoveParam"]?.["PeriodSecond"],
MarkingFrameSubSpec:
params["MoveParam"]?.["MarkingFrameSubSpec"] ??
params["MoveParam"]?.["MarkingFrame"],
params["MoveParam"]?.["MarkingFrame"] ??
params["AreaParam"]?.["MarkingFrameSubSpec"],
SensorRadius: params["MoveParam"]?.["SensorRadius"],
ExplosionRadius: params["AreaParam"]?.["Distance"],
MaxHP: params["MoveParam"]?.["MaxHP"],
};