From 44123f7622a583a5ecc2fa41a085faba1d35760d Mon Sep 17 00:00:00 2001 From: rgriffith Date: Sun, 5 Apr 2026 01:43:29 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20AI=20only=20plays=20lands=20=E2=80=94=20?= =?UTF-8?q?sync=20card=20enrichment,=20mana=20pool=20check,=20field=20alig?= =?UTF-8?q?nment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add _enrichCardFromCache() in precon-loader.js for synchronous card enrichment at draw time (typeLine, cmc, oracle roles available before async Scryfall batch completes) - Call _enrichCardFromCache in drawCard() so AI has complete card data on its first turn - Improve _canAfford in ai-bridge.js: check actual mana pool before falling back to untapped land count; free spells (cmc 0) always castable - Fix totalCards field name mismatch in ui.js and engine.js (lab.py returns totalCards, not card_count/total_cards) Co-Authored-By: Claude Opus 4.6 --- lan-client/ai-bridge.js | 14 +++++++++++++- lan-client/engine.js | 3 ++- lan-client/precon-loader.js | 24 ++++++++++++++++++++++++ lan-client/ui.js | 2 +- 4 files changed, 40 insertions(+), 3 deletions(-) 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 += '