]> git.sesse.net Git - remoteglot/blobdiff - www/js/remoteglot.js
Fix Chess960 bug when castling does not move the rook.
[remoteglot] / www / js / remoteglot.js
index 1f4c2a587694ff6eae27bb07f7f2d3835bb6965e..b3b8163f0bd1dca60ca0c495eda7b987c413b0bd 100644 (file)
@@ -7,7 +7,7 @@
  * @type {Number}
  * @const
  * @private */
-var SCRIPT_VERSION = 2016091401;
+var SCRIPT_VERSION = 2016113007;
 
 /**
  * The current backend URL.
@@ -94,9 +94,6 @@ var toplay = 'W';
 /** @type {number} @private */
 var ims = 0;
 
-/** @type {boolean} @private */
-var sort_refutation_lines_by_score = true;
-
 /** @type {boolean} @private */
 var truncate_display_history = true;
 
@@ -569,15 +566,6 @@ var create_arrow = function(from_square, to_square, fg_color, line_width, arrow_
        arrows.push(arrow);
 }
 
-// Note: invert is ignored.
-var compare_by_name = function(refutation_lines, invert, a, b) {
-       var ska = refutation_lines[a]['move'];
-       var skb = refutation_lines[b]['move'];
-       if (ska < skb) return -1;
-       if (ska > skb) return 1;
-       return 0;
-};
-
 var compare_by_score = function(refutation_lines, invert, a, b) {
        var sa = compute_score_sort_key(refutation_lines[b]['score'], refutation_lines[b]['depth'], invert);
        var sb = compute_score_sort_key(refutation_lines[a]['score'], refutation_lines[a]['depth'], invert);
@@ -801,8 +789,7 @@ var update_refutation_lines = function() {
        if (current_display_line && current_display_move % 2 == 0) {
                invert = !invert;
        }
-       var compare = sort_refutation_lines_by_score ? compare_by_score : compare_by_name;
-       moves = moves.sort(function(a, b) { return compare(refutation_lines, invert, a, b) });
+       moves = moves.sort(function(a, b) { return compare_by_score(refutation_lines, invert, a, b) });
        for (var i = 0; i < moves.length; ++i) {
                var line = refutation_lines[moves[i]];
 
@@ -863,15 +850,6 @@ var update_refutation_lines = function() {
                tbl.append(tr);
        }
 
-       // Make one of the links clickable and the other nonclickable.
-       if (sort_refutation_lines_by_score) {
-               $("#sortbyscore0").html("<a href=\"javascript:resort_refutation_lines(false)\">Move</a>");
-               $("#sortbyscore1").html("<strong>Score</strong>");
-       } else {
-               $("#sortbyscore0").html("<strong>Move</strong>");
-               $("#sortbyscore1").html("<a href=\"javascript:resort_refutation_lines(true)\">Score</a>");
-       }
-
        // Update the move highlight, as we've rewritten all the HTML.
        update_move_highlight();
 }
@@ -886,7 +864,7 @@ var update_refutation_lines = function() {
  */
 var chess_from = function(fen, moves, last_move) {
        var hiddenboard = new Chess();
-       if (fen !== null) {
+       if (fen !== null && fen !== undefined) {
                hiddenboard.load(fen);
        }
        for (var i = 0; i <= last_move; ++i) {
@@ -967,6 +945,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() {
@@ -979,7 +983,8 @@ var update_board = function() {
        // unconditionally taken from current_data (we're not interested in
        // historic history).
        if (current_data['position']['history']) {
-               add_pv('start', current_data['position']['history'], 1, 'W', null, 0, 8, true);
+               var start = (current_data['position'] && current_data['position']['start_fen']) ? current_data['position']['start_fen'] : 'start';
+               add_pv(start, current_data['position']['history'], 1, 'W', null, 0, 8, true);
        } else {
                display_lines.push(null);
        }
@@ -1105,7 +1110,8 @@ var update_board = function() {
                // We don't have historic analysis for this position, but we
                // can reconstruct what the last move was by just replaying
                // from the start.
-               var hiddenboard = chess_from(null, current_display_line.pv, current_display_move);
+               var position = (data['position'] && data['position']['start_fen']) ? data['position']['start_fen'] : null;
+               var hiddenboard = chess_from(position, current_display_line.pv, current_display_move);
                var moves = hiddenboard.history({ verbose: true });
                last_move = moves.pop();
                highlight_from = last_move.from;
@@ -1194,7 +1200,8 @@ 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;
@@ -1207,8 +1214,10 @@ var update_board = function() {
                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]);
-                       create_arrow(move.from, move.to, '#f66', 1, 10);
+                       var move = patch_move(hiddenboard.move(alt_moves[i]));
+                       if (move !== null) {
+                               create_arrow(move.from, move.to, '#f66', 1, 10);
+                       }
                }
        }
 
@@ -1315,6 +1324,13 @@ var update_sparkline = function(data) {
                                        return format_tooltip(data, fields[0].offset + first_move_num - 1);
                                }
                        });
+                       $('#scorespark').bind('sparklineClick', function(event) {
+                               var sparkline = event.sparklines[0];
+                               var region = sparkline.getCurrentRegionFields();
+                               if (region[0].offset !== undefined) {
+                                       show_line(0, first_move_num + region[0].offset - 1);
+                               }
+                       });
                } else {
                        $("#scorespark").text("");
                }
@@ -1409,8 +1425,9 @@ var update_clock = function() {
                return;
        }
 
-       // If either player has ten minutes or less left, add the second counters.
-       var show_seconds = (white_clock_ms < 60 * 10 * 1000 || black_clock_ms < 60 * 10 * 1000);
+       // If either player has twenty minutes or less left, add the second counters.
+       // This matches what DGT clocks do.
+       var show_seconds = (white_clock_ms < 60 * 20 * 1000 || black_clock_ms < 60 * 20 * 1000);
 
        if (color) {
                // See when the clock will change next, and update right after that.
@@ -1530,18 +1547,6 @@ var format_tooltip = function(data, halfmove_num) {
        }
 }
 
-/**
- * @param {boolean} sort_by_score
- */
-var resort_refutation_lines = function(sort_by_score) {
-       sort_refutation_lines_by_score = sort_by_score;
-       if (supports_html5_storage()) {
-               localStorage['sort_refutation_lines_by_score'] = sort_by_score ? 1 : 0;
-       }
-       update_refutation_lines();
-}
-window['resort_refutation_lines'] = resort_refutation_lines;
-
 /**
  * @param {boolean} truncate_history
  */
@@ -1631,7 +1636,7 @@ var update_historic_analysis = function() {
        }
 
        // Fetch old analysis for this line if it exists.
-       var hiddenboard = chess_from(null, current_display_line.pv, current_display_move);
+       var hiddenboard = chess_from(current_display_line.start_fen, current_display_line.pv, current_display_move);
        var filename = "/history/move" + (current_display_move + 1) + "-" +
                hiddenboard.fen().replace(/ /g, '_').replace(/\//g, '-') + ".json";
 
@@ -2191,11 +2196,6 @@ var init = function() {
        } else {
                set_sound(false);
        }
-       if (supports_html5_storage() && localStorage['sort_refutation_lines_by_score']) {
-               sort_refutation_lines_by_score = parseInt(localStorage['sort_refutation_lines_by_score']);
-       } else {
-               sort_refutation_lines_by_score = true;
-       }
 
        // Create board.
        board = new window.ChessBoard('board', {