From 099e5eb2281b4065e70824697cbd9b2ba460f338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 31 Mar 2024 19:17:30 -0500 Subject: [PATCH] feat: skill stats --- .../Characteristics/components/Skills.tsx | 22 ++++++++++---- .../[id]/components/Characteristics/index.tsx | 30 +++++++++++++++---- src/stores/tankopedia.ts | 7 +++-- 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/components/Skills.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/components/Skills.tsx index 482786f2a..0272e2b41 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/components/Skills.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/components/Skills.tsx @@ -5,20 +5,30 @@ import { asset } from '../../../../../../../core/blitzkrieg/asset'; import { skillDefinitions } from '../../../../../../../core/blitzkrieg/skillDefinitions'; import { Tier } from '../../../../../../../core/blitzkrieg/tankDefinitions'; import { TIER_ROMAN_NUMERALS } from '../../../../../../../core/blitzkrieg/tankDefinitions/constants'; -import mutateTankopediaPersistent, { - useTankopediaPersistent, +import { + mutateTankopediaTemporary, + useTankopediaTemporary, } from '../../../../../../../stores/tankopedia'; import { ConfigurationChildWrapper } from './ConfigurationChildWrapper'; +const usefulSkills = [ + 'smooth_turn', + 'soft_recoil', + 'smooth_driving', + 'smooth_turret', + 'virtuoso', + 'camouflage', +]; + export function Skills() { const awaitedSkillDefinitions = use(skillDefinitions); - const skillLevels = useTankopediaPersistent((state) => state.skills); + const skillLevels = useTankopediaTemporary((state) => state.skills); if (Object.keys(skillLevels).length === 0) { - mutateTankopediaPersistent((draft) => { + mutateTankopediaTemporary((draft) => { Object.values(awaitedSkillDefinitions.classes).forEach((skills) => { skills.forEach((skill) => { - draft.skills[skill] = 0; + draft.skills[skill] = usefulSkills.includes(skill) ? 7 : 0; }); }); }); @@ -49,7 +59,7 @@ export function Skills() { } icon={asset(`icons/skills/${skill}.webp`)} onClick={(event) => { - mutateTankopediaPersistent((draft) => { + mutateTankopediaTemporary((draft) => { if (event.shiftKey) { draft.skills[skill] = draft.skills[skill] === 0 ? 7 : 0; diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx index e9a3b0d40..ecd91fc76 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/index.tsx @@ -25,11 +25,13 @@ import { useEquipment } from '../../../../../../hooks/useEquipment'; import { useProvision } from '../../../../../../hooks/useProvision'; import { useProvisions } from '../../../../../../hooks/useProvisions'; import { mutateDuel, useDuel } from '../../../../../../stores/duel'; +import { useTankopediaTemporary } from '../../../../../../stores/tankopedia'; import { Info } from './components/Info'; import { InfoWithDelta } from './components/InfoWithDelta'; export function Characteristics() { const awaitedModelDefinitions = use(modelDefinitions); + const crewSkills = useTankopediaTemporary((state) => state.skills); const { tank, turret, gun, engine, track, shell } = useDuel( (state) => state.protagonist!, ); @@ -132,10 +134,26 @@ export function Characteristics() { const dispersionStillCoefficient = coefficient([hasRefinedGun, -0.1], [hasReticleCalibration, -0.4]) * coefficient([true, degressiveStat(crewMemberMastery)]); - const dispersionMovingCoefficient = coefficient([ + const dispersionDamagedCoefficient = coefficient([ hasVerticalStabilizer, -0.15, ]); + const dispersionHullTraverseCoefficient = coefficient( + [hasVerticalStabilizer, -0.15], + [true, -crewSkills.smooth_turn / 100], + ); + const dispersionAfterShotCoefficient = coefficient( + [hasVerticalStabilizer, -0.15], + [true, -crewSkills.soft_recoil / 100], + ); + const dispersionMovingCoefficient = coefficient( + [hasVerticalStabilizer, -0.15], + [true, -crewSkills.smooth_driving / 100], + ); + const dispersionTurretTraverseCoefficient = coefficient( + [hasVerticalStabilizer, -0.15], + [true, -crewSkills.smooth_turret * (2 / 100)], + ); const enginePowerCoefficient = coefficient( [ hasEngineAccelerator && @@ -161,6 +179,7 @@ export function Characteristics() { coefficient( [hasImprovedControl, 0.1], [hasImprovedEnginePowerBoost, 0.05], + [true, crewSkills.virtuoso / 100], ) * coefficient([true, progressiveStat(crewMemberMastery)]); const resistanceCoefficient = coefficient([hasImprovedSuspension, -0.25]); const viewRangeCoefficient = @@ -204,6 +223,7 @@ export function Characteristics() { camouflage, tank.class === 'AT-SPG' ? 0.04 : tank.class === 'heavyTank' ? 0.03 : 0.02, ], + [true, crewSkills.camouflage * (3 / 100)], ); const resolvedEnginePower = engine.power * enginePowerCoefficient; @@ -461,7 +481,7 @@ export function Characteristics() { name="Hull traversing" deltaType="lowerIsBetter" > - {track.dispersion.traverse * dispersionMovingCoefficient} + {track.dispersion.traverse * dispersionHullTraverseCoefficient} - {gun.dispersion.traverse * dispersionMovingCoefficient} + {gun.dispersion.traverse * dispersionTurretTraverseCoefficient} - {gun.dispersion.shot * dispersionMovingCoefficient} + {gun.dispersion.shot * dispersionAfterShotCoefficient} - {gun.dispersion.damaged * dispersionMovingCoefficient} + {gun.dispersion.damaged * dispersionDamagedCoefficient} diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts index 9565bd407..9db0e43ae 100644 --- a/src/stores/tankopedia.ts +++ b/src/stores/tankopedia.ts @@ -38,12 +38,12 @@ export interface TankopediaPersistent { test: TankopediaTestTankDisplay; page: number; }; - skills: Record; mode: TankopediaMode; } interface TankopediaTemporary { shot?: Shot; + skills: Record; } export interface ShotLayerBase { @@ -147,7 +147,6 @@ export const useTankopediaPersistent = create()( test: 'include', page: 0, }, - skills: {}, mode: 'model', })), { name: 'tankopedia', merge: (a, b) => merge(b, a) }, @@ -155,7 +154,9 @@ export const useTankopediaPersistent = create()( ); export const useTankopediaTemporary = create()( - subscribeWithSelector(() => ({})), + subscribeWithSelector(() => ({ + skills: {}, + })), ); export default function mutateTankopediaPersistent(