sendou.ink/app/modules/analyzer/useObjectDamage.ts
2022-10-23 11:59:03 +03:00

60 lines
1.6 KiB
TypeScript

import { useSearchParams } from "@remix-run/react";
import { type MainWeaponId } from "../in-game-lists";
import { calculateDamage } from "./objectDamage";
import { buildStats } from "./stats";
import { possibleApValues, validatedWeaponIdFromSearchParams } from "./utils";
const ABILITY_POINTS_SP_KEY = "ap";
export function useObjectDamage() {
const [searchParams, setSearchParams] = useSearchParams();
const mainWeaponId = validatedWeaponIdFromSearchParams(searchParams);
const abilityPoints = validatedAbilityPointsFromSearchParams(searchParams);
const handleChange = ({
newMainWeaponId = mainWeaponId,
abilityPoints = 0,
}: {
newMainWeaponId?: MainWeaponId;
abilityPoints?: number;
}) => {
setSearchParams(
{
weapon: String(newMainWeaponId),
[ABILITY_POINTS_SP_KEY]: String(abilityPoints),
},
{ replace: true, state: { scroll: false } }
);
};
const analyzed = buildStats({
weaponSplId: mainWeaponId,
});
return {
mainWeaponId,
subWeaponId: analyzed.weapon.subWeaponSplId,
handleChange,
damagesToReceivers: calculateDamage({
abilityPoints: new Map([
["BRU", { ap: abilityPoints, apBeforeTacticooler: abilityPoints }],
["SPU", { ap: abilityPoints, apBeforeTacticooler: abilityPoints }],
]),
analyzed,
mainWeaponId,
}),
abilityPoints: String(abilityPoints),
};
}
export function validatedAbilityPointsFromSearchParams(
searchParams: URLSearchParams
) {
const abilityPoints = Number(searchParams.get(ABILITY_POINTS_SP_KEY));
return (
possibleApValues().find((possibleAp) => possibleAp === abilityPoints) ?? 0
);
}