Files
website/src/lib/tcg/decks.ts
T

59 lines
1.7 KiB
TypeScript

import type { DeckCard, DeckCategory, TcgDeck } from '#lib/content';
import { findCardByName } from './api';
import { categoryOrder, categoryTitles } from './cardKind';
import { toBuilderCard, type BuilderEntry } from './deckBuilder.svelte';
import type { TcgCard } from './types';
export interface DeckSection {
category: DeckCategory;
title: string;
total: number;
cards: DeckCard[];
}
const lookups = new Map<string, Promise<TcgCard | null>>();
export function deckCardKey(card: DeckCard): string {
return `${card.name}|${card.set ?? ''}`;
}
export function deckSections(deck: TcgDeck): DeckSection[] {
return categoryOrder
.map((category) => {
const cards = deck.cards.filter((card) => card.category === category);
return {
category,
title: categoryTitles[category],
total: cards.reduce((sum, card) => sum + card.count, 0),
cards
};
})
.filter((section) => section.cards.length > 0);
}
export function deckTotal(deck: TcgDeck): number {
return deck.cards.reduce((sum, card) => sum + card.count, 0);
}
export function lookUpDeckCard(card: DeckCard): Promise<TcgCard | null> {
const key = deckCardKey(card);
const existing = lookups.get(key);
if (existing) return existing;
const lookup = findCardByName(card.name, card.set).catch((error) => {
lookups.delete(key);
throw error;
});
lookups.set(key, lookup);
return lookup;
}
export async function deckBuilderEntries(deck: TcgDeck): Promise<BuilderEntry[]> {
const entries: BuilderEntry[] = [];
for (const deckCard of deck.cards) {
const card = await lookUpDeckCard(deckCard).catch(() => null);
if (card) entries.push({ card: toBuilderCard(card), count: deckCard.count });
}
return entries;
}