]> git.sesse.net Git - remoteglot/blobdiff - www/js/remoteglot.js
Fix a crash on short multi-PVs.
[remoteglot] / www / js / remoteglot.js
index ff566ab85c81c4ba4b33ff8a9853bec23d8f89ca..01faf1aec858f3b603f14ee3ad04828e40f53a6f 100644 (file)
@@ -7,7 +7,7 @@
  * @type {Number}
  * @const
  * @private */
-var SCRIPT_VERSION = 2016113002;
+var SCRIPT_VERSION = 2016113007;
 
 /**
  * The current backend URL.
@@ -298,7 +298,9 @@ var request_update = function() {
                }
 
                // Next update.
-               current_analysis_request_timer = setTimeout(function() { request_update(); }, timeout);
+               if (!backend_url.match(/history/)) {
+                       current_analysis_request_timer = setTimeout(function() { request_update(); }, timeout);
+               }
        }).fail(function(jqXHR, textStatus, errorThrown) {
                if (textStatus === "abort") {
                        // Aborted because we are switching backends. Abandon and don't retry,
@@ -474,17 +476,25 @@ var position_arrow = function(arrow) {
                return;
        }
 
-       var pos = $(".square-a8").position();
-
        var zoom_factor = $("#board").width() / 400.0;
        var line_width = arrow.line_width * zoom_factor;
        var arrow_size = arrow.arrow_size * zoom_factor;
 
        var square_width = $(".square-a8").width();
-       var from_y = (7 - arrow.from_row + 0.5)*square_width;
-       var to_y = (7 - arrow.to_row + 0.5)*square_width;
-       var from_x = (arrow.from_col + 0.5)*square_width;
-       var to_x = (arrow.to_col + 0.5)*square_width;
+       var pos, from_y, to_y, from_x, to_x;
+       if (board.orientation() === 'black') {
+               pos = $(".square-h1").position();
+               from_y = (arrow.from_row + 0.5)*square_width;
+               to_y = (arrow.to_row + 0.5)*square_width;
+               from_x = (7 - arrow.from_col + 0.5)*square_width;
+               to_x = (7 - arrow.to_col + 0.5)*square_width;
+       } else {
+               pos = $(".square-a8").position();
+               from_y = (7 - arrow.from_row + 0.5)*square_width;
+               to_y = (7 - arrow.to_row + 0.5)*square_width;
+               from_x = (arrow.from_col + 0.5)*square_width;
+               to_x = (arrow.to_col + 0.5)*square_width;
+       }
 
        var SVG_NS = "http://www.w3.org/2000/svg";
        var XHTML_NS = "http://www.w3.org/1999/xhtml";
@@ -786,7 +796,7 @@ var update_refutation_lines = function() {
        }
 
        var invert = (toplay === 'B');
-       if (current_display_line && current_display_move % 2 == 0) {
+       if (current_display_line && current_display_move % 2 == 0 && !current_display_line_is_history) {
                invert = !invert;
        }
        moves = moves.sort(function(a, b) { return compare_by_score(refutation_lines, invert, a, b) });
@@ -930,6 +940,18 @@ var update_game_list = function(games) {
  * and switch to it if we're not already displaying it.
  */
 var possibly_switch_game_from_hash = function() {
+       var history_match = window.location.hash.match(/^#history=([a-zA-Z0-9_-]+)/);
+       if (history_match !== null) {
+               var game_id = history_match[1];
+               var fake_game = {
+                       url: '/history/' + game_id + '.json',
+                       hashurl: '',
+                       id: 'history=' + game_id
+               };
+               switch_backend(fake_game);
+               return;
+       }
+
        if (current_games === null) {
                return;
        }
@@ -945,6 +967,32 @@ var possibly_switch_game_from_hash = function() {
        }
 }
 
+/**
+ * If this is a Chess960 castling which doesn't move the king,
+ * move the rook instead.
+*/
+var patch_move = function(move) {
+       if (move === null) return null;
+       if (move.from !== move.to) return move;
+
+       var f = move.rook_sq & 15;
+       var r = move.rook_sq >> 4;
+       var from = ('abcdefgh'.substring(f,f+1) + '87654321'.substring(r,r+1));
+       var to = move.to;
+
+       if (move.to === 'g1') {
+               to = 'f1';
+       } else if (move.to === 'g8') {
+               to = 'f8';
+       } else if (move.to === 'b1') {
+               to = 'c1';
+       } else if (move.to === 'b8') {
+               to = 'c8';
+       }
+
+       return { from: from, to: to };
+}
+
 /** Update all the HTML on the page, based on current global state.
  */
 var update_board = function() {
@@ -1174,20 +1222,21 @@ var update_board = function() {
                // draw a continuation arrow as long as it's the same piece
                var last_to;
                for (var i = 0; i < data['pv'].length; i += 2) {
-                       var move = hiddenboard.move(data['pv'][i]);
+                       var move = patch_move(hiddenboard.move(data['pv'][i]));
+
                        if ((i >= 2 && move.from != last_to) ||
                             interfering_arrow(move.from, move.to)) {
                                break;
                        }
                        create_arrow(move.from, move.to, '#f66', 6, 20);
-                       last_to = move.from;
+                       last_to = move.to;
                        hiddenboard.move(data['pv'][i + 1]);  // To keep continuity.
                }
 
                var alt_moves = find_nonstupid_moves(data, 30, data['position']['toplay'] === 'B');
                for (var i = 1; i < alt_moves.length && i < 3; ++i) {
                        hiddenboard = new Chess(base_fen);
-                       var move = hiddenboard.move(alt_moves[i]);
+                       var move = patch_move(hiddenboard.move(alt_moves[i]));
                        if (move !== null) {
                                create_arrow(move.from, move.to, '#f66', 1, 10);
                        }
@@ -1211,7 +1260,7 @@ var update_board = function() {
                        if (!data['refutation_lines'] ||
                            !data['refutation_lines'][nonstupid_moves[i]] ||
                            !data['refutation_lines'][nonstupid_moves[i]]['pv'] ||
-                           data['refutation_lines'][nonstupid_moves[i]]['pv'].length < 1) {
+                           data['refutation_lines'][nonstupid_moves[i]]['pv'].length < 2) {
                                // Incomplete PV, abort.
                                response = undefined;
                                break;
@@ -2160,6 +2209,8 @@ var switch_backend = function(game) {
 }
 window['switch_backend'] = switch_backend;
 
+window['flip'] = function() { board.flip(); redraw_arrows(); };
+
 var init = function() {
        unique = get_unique();
 
@@ -2204,6 +2255,7 @@ var init = function() {
                }
        });
        window.addEventListener('hashchange', possibly_switch_game_from_hash, false);
+       possibly_switch_game_from_hash();
 };
 $(document).ready(init);