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(