mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 20:19:49 +02:00
feat: universal crew skills
This commit is contained in:
1 parent
8a9d72d0e6
commit
28407b0f05
3 files changed
+65
-11
No files matched your search
@@ -31,6 +31,7 @@ import { asset } from '../../../core/blitzkrieg/asset';
|
|||||||
import { availableProvisions } from '../../../core/blitzkrieg/availableProvisions';
|
import { availableProvisions } from '../../../core/blitzkrieg/availableProvisions';
|
||||||
import { checkConsumableProvisionInclusivity } from '../../../core/blitzkrieg/checkConsumableProvisionInclusivity';
|
import { checkConsumableProvisionInclusivity } from '../../../core/blitzkrieg/checkConsumableProvisionInclusivity';
|
||||||
import { consumableDefinitions } from '../../../core/blitzkrieg/consumableDefinitions';
|
import { consumableDefinitions } from '../../../core/blitzkrieg/consumableDefinitions';
|
||||||
|
import { createDefaultSkills } from '../../../core/blitzkrieg/createDefaultSkills';
|
||||||
import { equipmentDefinitions } from '../../../core/blitzkrieg/equipmentDefinitions';
|
import { equipmentDefinitions } from '../../../core/blitzkrieg/equipmentDefinitions';
|
||||||
import { modelDefinitions } from '../../../core/blitzkrieg/modelDefinitions';
|
import { modelDefinitions } from '../../../core/blitzkrieg/modelDefinitions';
|
||||||
import { provisionDefinitions } from '../../../core/blitzkrieg/provisionDefinitions';
|
import { provisionDefinitions } from '../../../core/blitzkrieg/provisionDefinitions';
|
||||||
@@ -68,12 +69,14 @@ export default function Page() {
|
|||||||
const awaitedEquipmentDefinitions = use(equipmentDefinitions);
|
const awaitedEquipmentDefinitions = use(equipmentDefinitions);
|
||||||
const awaitedProvisionDefinitions = use(provisionDefinitions);
|
const awaitedProvisionDefinitions = use(provisionDefinitions);
|
||||||
const deltaMode = useComparePersistent((state) => state.deltaMode);
|
const deltaMode = useComparePersistent((state) => state.deltaMode);
|
||||||
|
const crewSkills = useCompareTemporary((state) => state.crewSkills);
|
||||||
const stats = useMemo(
|
const stats = useMemo(
|
||||||
() =>
|
() =>
|
||||||
members.map((item) =>
|
members.map((item) =>
|
||||||
tankCharacteristics(
|
tankCharacteristics(
|
||||||
{
|
{
|
||||||
...item,
|
...item,
|
||||||
|
crewSkills,
|
||||||
stockEngine: item.tank.engines[0],
|
stockEngine: item.tank.engines[0],
|
||||||
stockGun: item.tank.turrets[0].guns[0],
|
stockGun: item.tank.turrets[0].guns[0],
|
||||||
stockTrack: item.tank.tracks[0],
|
stockTrack: item.tank.tracks[0],
|
||||||
@@ -123,11 +126,16 @@ export default function Page() {
|
|||||||
tankToCompareMember(
|
tankToCompareMember(
|
||||||
awaitedTankDefinitions[id],
|
awaitedTankDefinitions[id],
|
||||||
awaitedProvisionDefinitions,
|
awaitedProvisionDefinitions,
|
||||||
awaitedSkillDefinitions,
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Object.keys(crewSkills).length === 0) {
|
||||||
|
mutateCompareTemporary((draft) => {
|
||||||
|
draft.crewSkills = createDefaultSkills(awaitedSkillDefinitions);
|
||||||
|
});
|
||||||
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
function Row({
|
function Row({
|
||||||
@@ -376,7 +384,6 @@ export default function Page() {
|
|||||||
tankToCompareMember(
|
tankToCompareMember(
|
||||||
tank,
|
tank,
|
||||||
awaitedProvisionDefinitions,
|
awaitedProvisionDefinitions,
|
||||||
awaitedSkillDefinitions,
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
draft.sorting = undefined;
|
draft.sorting = undefined;
|
||||||
@@ -390,7 +397,6 @@ export default function Page() {
|
|||||||
tankToCompareMember(
|
tankToCompareMember(
|
||||||
tank,
|
tank,
|
||||||
awaitedProvisionDefinitions,
|
awaitedProvisionDefinitions,
|
||||||
awaitedSkillDefinitions,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -453,7 +459,60 @@ export default function Page() {
|
|||||||
|
|
||||||
<Table.Body>
|
<Table.Body>
|
||||||
<Table.Row>
|
<Table.Row>
|
||||||
<Table.Cell />
|
<Table.Cell>
|
||||||
|
<Flex
|
||||||
|
style={{
|
||||||
|
width: '100%',
|
||||||
|
height: '100%',
|
||||||
|
}}
|
||||||
|
align="center"
|
||||||
|
justify="center"
|
||||||
|
>
|
||||||
|
<Popover.Root>
|
||||||
|
<Popover.Trigger>
|
||||||
|
<Button variant="ghost" radius="large">
|
||||||
|
<Flex
|
||||||
|
direction="column"
|
||||||
|
style={{
|
||||||
|
gap: 2,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{Object.entries(
|
||||||
|
awaitedSkillDefinitions.classes,
|
||||||
|
).map(([tankClass, skills]) => (
|
||||||
|
<Flex
|
||||||
|
key={tankClass}
|
||||||
|
style={{
|
||||||
|
gap: 2,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{skills.map((skill) => (
|
||||||
|
<div
|
||||||
|
key={skill}
|
||||||
|
style={{
|
||||||
|
width: 6,
|
||||||
|
height: 6,
|
||||||
|
borderRadius: 2,
|
||||||
|
backgroundColor:
|
||||||
|
crewSkills[skill] === 0
|
||||||
|
? theme.colors.textLowContrast
|
||||||
|
: theme.colors
|
||||||
|
.textLowContrast_crimson,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</Flex>
|
||||||
|
))}
|
||||||
|
</Flex>
|
||||||
|
</Button>
|
||||||
|
</Popover.Trigger>
|
||||||
|
|
||||||
|
<Popover.Content>
|
||||||
|
<Heading>ඞ</Heading>
|
||||||
|
</Popover.Content>
|
||||||
|
</Popover.Root>
|
||||||
|
</Flex>
|
||||||
|
</Table.Cell>
|
||||||
|
|
||||||
{members.map(
|
{members.map(
|
||||||
(
|
(
|
||||||
@@ -487,7 +546,6 @@ export default function Page() {
|
|||||||
gun,
|
gun,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
const modules = { turret, gun, engine, chassis: track };
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Table.Cell key={key}>
|
<Table.Cell key={key}>
|
||||||
|
|||||||
@@ -1,20 +1,15 @@
|
|||||||
import { uniqueId } from 'lodash';
|
import { uniqueId } from 'lodash';
|
||||||
import { CompareMember } from '../../stores/compare';
|
import { CompareMember } from '../../stores/compare';
|
||||||
import { createDefaultSkills } from './createDefaultSkills';
|
|
||||||
import { ProvisionDefinitions } from './provisionDefinitions';
|
import { ProvisionDefinitions } from './provisionDefinitions';
|
||||||
import { SkillDefinitions } from './skillDefinitions';
|
|
||||||
import { TankDefinition } from './tankDefinitions';
|
import { TankDefinition } from './tankDefinitions';
|
||||||
import { tankToDuelMember } from './tankToDuelMember';
|
import { tankToDuelMember } from './tankToDuelMember';
|
||||||
|
|
||||||
export function tankToCompareMember(
|
export function tankToCompareMember(
|
||||||
tank: TankDefinition,
|
tank: TankDefinition,
|
||||||
provisionDefinitions: ProvisionDefinitions,
|
provisionDefinitions: ProvisionDefinitions,
|
||||||
skillDefinitions: SkillDefinitions,
|
|
||||||
) {
|
) {
|
||||||
return {
|
return {
|
||||||
...tankToDuelMember(tank, provisionDefinitions),
|
...tankToDuelMember(tank, provisionDefinitions),
|
||||||
|
|
||||||
crewSkills: createDefaultSkills(skillDefinitions),
|
|
||||||
key: uniqueId(),
|
key: uniqueId(),
|
||||||
} satisfies CompareMember;
|
} satisfies CompareMember;
|
||||||
}
|
}
|
||||||
@@ -6,10 +6,10 @@ import { DuelMember } from './duel';
|
|||||||
|
|
||||||
export interface CompareMember extends DuelMember {
|
export interface CompareMember extends DuelMember {
|
||||||
key: string;
|
key: string;
|
||||||
crewSkills: Record<string, number>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CompareTemporary {
|
export interface CompareTemporary {
|
||||||
|
crewSkills: Record<string, number>;
|
||||||
members: CompareMember[];
|
members: CompareMember[];
|
||||||
sorting?: {
|
sorting?: {
|
||||||
direction: 'ascending' | 'descending';
|
direction: 'ascending' | 'descending';
|
||||||
@@ -23,6 +23,7 @@ export interface ComparePersistent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const useCompareTemporary = create<CompareTemporary>()(() => ({
|
export const useCompareTemporary = create<CompareTemporary>()(() => ({
|
||||||
|
crewSkills: {},
|
||||||
members: [],
|
members: [],
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user