feat: Implement deck builder magnified card view, land advice, basic land integration, and unlimited time for deck construction.

This commit is contained in:
2025-12-17 16:15:20 +01:00
parent e5750d9729
commit e13aa16766
18 changed files with 672 additions and 264 deletions

View File

@@ -151,8 +151,20 @@ app.post('/api/packs/generate', async (req: Request, res: Response) => {
const { pools, sets } = packGeneratorService.processCards(poolCards, activeFilters);
// Extract available basic lands for deck building
const basicLands = pools.lands.filter(c => c.typeLine?.includes('Basic'));
// Deduplicate by Scryfall ID to get unique arts
const uniqueBasicLands: any[] = [];
const seenLandIds = new Set();
for (const land of basicLands) {
if (!seenLandIds.has(land.scryfallId)) {
seenLandIds.add(land.scryfallId);
uniqueBasicLands.push(land);
}
}
const packs = packGeneratorService.generatePacks(pools, sets, settings, numPacks || 108);
res.json(packs);
res.json({ packs, basicLands: uniqueBasicLands });
} catch (e: any) {
console.error("Generation error", e);
res.status(500).json({ error: e.message });
@@ -195,7 +207,10 @@ const draftInterval = setInterval(() => {
oracleId: card.oracle_id || card.id,
name: card.name,
imageUrl: card.image || card.image_uris?.normal || card.card_faces?.[0]?.image_uris?.normal || "",
zone: 'library'
zone: 'library',
typeLine: card.typeLine || card.type_line || '',
oracleText: card.oracleText || card.oracle_text || '',
manaCost: card.manaCost || card.mana_cost || ''
});
});
}
@@ -213,8 +228,8 @@ io.on('connection', (socket) => {
// Timer management
// Timer management removed (Global loop handled)
socket.on('create_room', ({ hostId, hostName, packs }, callback) => {
const room = roomManager.createRoom(hostId, hostName, packs, socket.id); // Add socket.id
socket.on('create_room', ({ hostId, hostName, packs, basicLands }, callback) => {
const room = roomManager.createRoom(hostId, hostName, packs, basicLands || [], socket.id);
socket.join(room.id);
console.log(`Room created: ${room.id} by ${hostName}`);
callback({ success: true, room });
@@ -404,7 +419,10 @@ io.on('connection', (socket) => {
oracleId: card.oracle_id || card.id,
name: card.name,
imageUrl: card.image || card.image_uris?.normal || card.card_faces?.[0]?.image_uris?.normal || "",
zone: 'library'
zone: 'library',
typeLine: card.typeLine || card.type_line || '',
oracleText: card.oracleText || card.oracle_text || '',
manaCost: card.manaCost || card.mana_cost || ''
});
});
}
@@ -428,7 +446,10 @@ io.on('connection', (socket) => {
oracleId: card.id,
name: card.name,
imageUrl: card.image || card.image_uris?.normal || card.card_faces?.[0]?.image_uris?.normal || "",
zone: 'library'
zone: 'library',
typeLine: card.typeLine || card.type_line || '',
oracleText: card.oracleText || card.oracle_text || '',
manaCost: card.manaCost || card.mana_cost || ''
});
});
}
@@ -456,7 +477,10 @@ io.on('connection', (socket) => {
oracleId: card.oracle_id || card.id,
name: card.name,
imageUrl: card.image_uris?.normal || card.card_faces?.[0]?.image_uris?.normal || "",
zone: 'library'
zone: 'library',
typeLine: card.typeLine || card.type_line || '',
oracleText: card.oracleText || card.oracle_text || '',
manaCost: card.manaCost || card.mana_cost || ''
});
});
});