mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-04-24 23:19:39 -05:00
Sub defense stats for Point Sensor and Ink Mine
This commit is contained in:
parent
f57d1a750d
commit
bdaa18b3a2
|
|
@ -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]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 = [
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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"],
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user