mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 10:47:04 +02:00
feat: skill stats
This commit is contained in:
1 parent
eaff26c8d9
commit
099e5eb228
3 files changed
+45
-14
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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}
|
||||
</InfoWithDelta>
|
||||
<InfoWithDelta
|
||||
decimals={3}
|
||||
@@ -470,7 +490,7 @@ export function Characteristics() {
|
||||
name="Turret traversing"
|
||||
deltaType="lowerIsBetter"
|
||||
>
|
||||
{gun.dispersion.traverse * dispersionMovingCoefficient}
|
||||
{gun.dispersion.traverse * dispersionTurretTraverseCoefficient}
|
||||
</InfoWithDelta>
|
||||
<InfoWithDelta
|
||||
decimals={3}
|
||||
@@ -479,7 +499,7 @@ export function Characteristics() {
|
||||
name="After shooting"
|
||||
deltaType="lowerIsBetter"
|
||||
>
|
||||
{gun.dispersion.shot * dispersionMovingCoefficient}
|
||||
{gun.dispersion.shot * dispersionAfterShotCoefficient}
|
||||
</InfoWithDelta>
|
||||
<InfoWithDelta
|
||||
decimals={1}
|
||||
@@ -489,7 +509,7 @@ export function Characteristics() {
|
||||
unit="scalar"
|
||||
deltaType="lowerIsBetter"
|
||||
>
|
||||
{gun.dispersion.damaged * dispersionMovingCoefficient}
|
||||
{gun.dispersion.damaged * dispersionDamagedCoefficient}
|
||||
</InfoWithDelta>
|
||||
<Info name="Gun flexibility" unit="°" />
|
||||
<InfoWithDelta decimals={1} indent name="Depression">
|
||||
|
||||
@@ -38,12 +38,12 @@ export interface TankopediaPersistent {
|
||||
test: TankopediaTestTankDisplay;
|
||||
page: number;
|
||||
};
|
||||
skills: Record<string, number>;
|
||||
mode: TankopediaMode;
|
||||
}
|
||||
|
||||
interface TankopediaTemporary {
|
||||
shot?: Shot;
|
||||
skills: Record<string, number>;
|
||||
}
|
||||
|
||||
export interface ShotLayerBase {
|
||||
@@ -147,7 +147,6 @@ export const useTankopediaPersistent = create<TankopediaPersistent>()(
|
||||
test: 'include',
|
||||
page: 0,
|
||||
},
|
||||
skills: {},
|
||||
mode: 'model',
|
||||
})),
|
||||
{ name: 'tankopedia', merge: (a, b) => merge(b, a) },
|
||||
@@ -155,7 +154,9 @@ export const useTankopediaPersistent = create<TankopediaPersistent>()(
|
||||
);
|
||||
|
||||
export const useTankopediaTemporary = create<TankopediaTemporary>()(
|
||||
subscribeWithSelector<TankopediaTemporary>(() => ({})),
|
||||
subscribeWithSelector<TankopediaTemporary>(() => ({
|
||||
skills: {},
|
||||
})),
|
||||
);
|
||||
|
||||
export default function mutateTankopediaPersistent(
|
||||
|
||||
Reference in new issue
Block a user