39 lines
2.3 KiB
TypeScript
39 lines
2.3 KiB
TypeScript
export type Roll = { statId: string; value: number };
|
|
export type GearSelection = { itemId: string; level: number; brandId: string; talentId: string; health: number; armor: number; rolls: Roll[]; augmentSlots: number[] };
|
|
export type WeaponSelection = { itemId: string; tier: number; damage: number; firepower: number; toughness: number; engineering: number; talent1Id: string; talent2Id: string };
|
|
export type ChipSelection = { setId: string; quality: 'Superior' | 'High-end'; primary: Roll; secondary: [Roll, Roll] };
|
|
export type ProtocolSelection = { itemId: string; level: number; talentUpgrades: number };
|
|
export type LoadoutDraft = {
|
|
version: 1;
|
|
buildName: string;
|
|
gear: Record<string, GearSelection>;
|
|
weapons: [WeaponSelection, WeaponSelection];
|
|
chips: [ChipSelection, ChipSelection, ChipSelection];
|
|
protocol: ProtocolSelection;
|
|
activeTalents: string[];
|
|
};
|
|
|
|
export const gearSlots = ['Holster', 'Gloves', 'Backpack', 'Knee Pads', 'Body Armor', 'Mask'] as const;
|
|
export const blankRoll = (): Roll => ({ statId: '', value: 0 });
|
|
export const blankGear = (): GearSelection => ({ itemId: '', level: 50, brandId: '', talentId: '', health: 0, armor: 0, rolls: [blankRoll()], augmentSlots: [] });
|
|
export const blankWeapon = (): WeaponSelection => ({ itemId: '', tier: 0, damage: 0, firepower: 0, toughness: 0, engineering: 0, talent1Id: '', talent2Id: '' });
|
|
export const blankChip = (): ChipSelection => ({ setId: '', quality: 'Superior', primary: blankRoll(), secondary: [blankRoll(), blankRoll()] });
|
|
export const createDraft = (): LoadoutDraft => ({
|
|
version: 1,
|
|
buildName: 'Untitled loadout',
|
|
gear: Object.fromEntries(gearSlots.map((slot) => [slot, blankGear()])),
|
|
weapons: [blankWeapon(), blankWeapon()],
|
|
chips: [blankChip(), blankChip(), blankChip()],
|
|
protocol: { itemId: '', level: 1, talentUpgrades: 0 },
|
|
activeTalents: []
|
|
});
|
|
|
|
export const clamp = (value: unknown, min: unknown, max: unknown) => {
|
|
const low = Number(min), high = Number(max), numeric = Number(value);
|
|
if (!Number.isFinite(numeric)) return Number.isFinite(low) ? low : 0;
|
|
return Math.min(Number.isFinite(high) ? high : numeric, Math.max(Number.isFinite(low) ? low : numeric, numeric));
|
|
};
|
|
|
|
export const scaled = (min: unknown, max: unknown, progress: number, steps: number) =>
|
|
Number(min) + (Number(max) - Number(min)) * Math.min(steps, Math.max(0, progress)) / steps;
|