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 += '