공유 덱 카드 복원 기준을 imgSrc로 전환

동일 번호 카드가 많은 시리즈에서도 선택한 카드가 정확히 복원되도록 저장·검증·복원 흐름을 imgSrc 중심으로 정리하고, 이미지 누락 시 공통 뒷면 폴백을 적용한다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-25 17:59:46 +09:00
parent 2c4f622408
commit c193975c86
10 changed files with 100 additions and 24 deletions

View File

@@ -1,13 +1,19 @@
import { pathToFileURL } from 'url';
import path from 'path';
/** @type {Map<string, Map<string, object>>} */
/**
* @typedef {object} CardIndex
* @property {Map<string, object>} byNumber
* @property {Map<string, object>} byImgSrc
*/
/** @type {Map<string, CardIndex>} */
const cache = new Map();
/**
* 시리즈 카드 맵 로드
* 시리즈 카드 인덱스 로드
* @param {string} seriesKey
* @returns {Promise<Map<string, object>>}
* @returns {Promise<CardIndex>}
*/
export async function getCardMap(seriesKey) {
if (cache.has(seriesKey)) {
@@ -25,27 +31,34 @@ export async function getCardMap(seriesKey) {
}
const byNumber = new Map();
const byImgSrc = new Map();
for (const card of mod.cardList) {
byNumber.set(card.Number, card);
if (!byNumber.has(card.Number)) {
byNumber.set(card.Number, card);
}
if (card.imgSrc && !byImgSrc.has(card.imgSrc)) {
byImgSrc.set(card.imgSrc, card);
}
}
cache.set(seriesKey, byNumber);
return byNumber;
const index = { byNumber, byImgSrc };
cache.set(seriesKey, index);
return index;
}
/**
* 저장된 덱 카드를 풀 카드 객체로 합성
* @param {string} seriesKey
* @param {Array<{number: string, count: number, key: boolean}>} cards
* @param {Array<{number?: string, imgSrc?: string, count: number, key: boolean}>} cards
* @returns {Promise<{cards: object[], totalCards: number}>}
*/
export async function resolveDeckCards(seriesKey, cards) {
const map = await getCardMap(seriesKey);
const index = await getCardMap(seriesKey);
const resolved = [];
let totalCards = 0;
for (const item of cards) {
const base = map.get(item.number);
const base = (item.imgSrc && index.byImgSrc.get(item.imgSrc)) || index.byNumber.get(item.number);
if (!base) continue;
totalCards += item.count;