diff --git a/lan-client/ai-bridge.js b/lan-client/ai-bridge.js index e11d663..d4b264b 100644 --- a/lan-client/ai-bridge.js +++ b/lan-client/ai-bridge.js @@ -895,10 +895,22 @@ class MacroActionMapper { static _canAfford(playerIdx, card, gameState) { if (!gameState) return false; + const cmc = MacroActionMapper._cmc(card); + if (cmc === 0) return true; // Free spells always castable + + // Prefer actual mana pool if populated + const player = gameState.players[playerIdx]; + const pool = player?.manaPool; + if (pool) { + const total = Object.values(pool).reduce((s, v) => s + (v || 0), 0); + if (total > 0) return total >= cmc; + } + + // Fallback: count untapped lands const available = typeof aiCountUntappedLands === 'function' ? aiCountUntappedLands(playerIdx) : 0; - return available >= MacroActionMapper._cmc(card); + return available >= cmc; } static _creatureScore(card) { diff --git a/lan-client/engine.js b/lan-client/engine.js index c9d87b7..bb38f8a 100644 --- a/lan-client/engine.js +++ b/lan-client/engine.js @@ -8241,6 +8241,7 @@ function drawCard(playerId) { } const card = player.zones.library.shift(); // Take from top (index 0) + if (typeof _enrichCardFromCache === 'function') _enrichCardFromCache(card); player.zones.hand.push(card); addLogEntry('' + player.name + ' drew a card (' + player.zones.hand.length + ' in hand)'); updatePlayerZones(); @@ -12604,7 +12605,7 @@ function _loadUserDecksForSetup() { var html = ''; for (var di = 0; di < decks.length; di++) { var d = decks[di]; - var cardCount = d.card_count || d.total_cards || 0; + var cardCount = d.totalCards || d.card_count || d.total_cards || 0; var cmdr = d.commander || ''; html += '