+
+ recommended_dest = null;
+ get_best_dest(pseudogame, source, function(dest) {
+ $("#board").find('.square-55d63').removeClass('nonuglyhighlight');
+ if (dest !== null) {
+ var squareEl = $('#board .square-' + dest);
+ squareEl.addClass('highlight1-32417');
+ }
+ recommended_dest = dest;
+ });
+}
+
+var get_best_dest = function(game, source, cb) {
+ var moves = game.moves({ square: source, verbose: true });
+ if (moves.length == 0) {
+ cb(null);
+ return;
+ }
+ if (moves.length == 1) {
+ cb(moves[0].to);
+ return;
+ }
+
+ // More than one move. Ask the engine to disambiguate.
+ var uci_moves = moves.map(function(m) { return m.from + m.to; });
+ var when_engine_is_ready = function() {
+ engine_running = true;
+ stockfish.onmessage = function(event) {
+ var res = event.data.match(/^bestmove \S\S(\S\S)/);
+ if (res !== null) {
+ engine_running = false;
+ if (engine_replacement_callback !== null) {
+ // We are no longer interested in this query,
+ // so just discard it and call this other callback.
+ engine_replacement_callback();
+ engine_replacement_callback = null;
+ } else {
+ cb(res[1]);
+ }
+ }
+ };
+ stockfish.postMessage("position fen " + game.fen());
+ stockfish.postMessage("go depth 6 searchmoves " + uci_moves.join(" "));
+ };
+ if (engine_running) {
+ engine_replacement_callback = when_engine_is_ready;
+ } else {
+ when_engine_is_ready();
+ }