]> git.sesse.net Git - remoteglot/blobdiff - www/js/remoteglot.js
Fix some more TB short-form issues.
[remoteglot] / www / js / remoteglot.js
index bed5a5cdf8ad3d1fdd4de3eb9cff1f8b39d17b4b..37f5c7bd1b61a034e56e9471fc4cd74f074be7ce 100644 (file)
@@ -7,7 +7,7 @@
  * @type {Number}
  * @const
  * @private */
-var SCRIPT_VERSION = 2016113008;
+var SCRIPT_VERSION = 2021021300;
 
 /**
  * The current backend URL.
@@ -660,15 +660,24 @@ var add_pv = function(start_fen, pv, move_num, toplay, scores, start_display_mov
                scores: scores,
                start_display_move_num: start_display_move_num
        });
-       return print_pv(display_lines.length - 1, opt_limit, opt_showlast);
+       var splicepos = null;
+       if (scores !== null && scores.length >= 1 &&
+           scores[scores.length - 1].score !== undefined &&
+           scores[scores.length - 1].score !== null &&
+           (scores[scores.length - 1].score[0] === 'T' ||
+            scores[scores.length - 1].score[0] === 't')) {
+               splicepos = scores[scores.length - 1].score[1];
+       }
+       return print_pv(display_lines.length - 1, splicepos, opt_limit, opt_showlast);
 }
 
 /**
  * @param {number} line_num
+ * @param {?number} splicepos If non-null, where the tablebase-spliced portion of the TB starts.
  * @param {number=} opt_limit If set, show at most this number of moves.
  * @param {boolean=} opt_showlast If limit is set, show the last moves instead of the first ones.
  */
-var print_pv = function(line_num, opt_limit, opt_showlast) {
+var print_pv = function(line_num, splicepos, opt_limit, opt_showlast) {
        var display_line = display_lines[line_num];
        var pv = display_line.pv;
        var move_num = display_line.move_num;
@@ -689,10 +698,14 @@ var print_pv = function(line_num, opt_limit, opt_showlast) {
                        --to_add;
                }
                move_num += to_add / 2;
+               if (splicepos !== null && splicepos > 0) {
+                       --splicepos;
+               }
        }
 
        var ret = '';
        var i = 0;
+       var in_tb = false;
        if (opt_limit && opt_showlast && pv.length > opt_limit) {
                // Truncate the PV at the beginning (instead of at the end).
                // We assume here that toplay is 'W'. We also assume that if
@@ -705,7 +718,12 @@ var print_pv = function(line_num, opt_limit, opt_showlast) {
                }
                move_num += i / 2;
        } else if (toplay == 'B' && pv.length > 0) {
-               var move = "<a class=\"move\" id=\"automove" + line_num + "-0\" href=\"javascript:show_line(" + line_num + ", " + 0 + ");\">" + pv[0] + "</a>";
+               var move = "";
+               if (splicepos === 0) {
+                       move += "(TB: ";
+                       in_tb = true;
+               }
+               move += "<a class=\"move\" id=\"automove" + line_num + "-0\" href=\"javascript:show_line(" + line_num + ", " + 0 + ");\">" + pv[0] + "</a>";
                ret = move_num + '. … ' + move;
                toplay = 'W';
                ++i;
@@ -713,9 +731,16 @@ var print_pv = function(line_num, opt_limit, opt_showlast) {
        }
        for ( ; i < pv.length; ++i) {
                var move = "<a class=\"move\" id=\"automove" + line_num + "-" + i + "\" href=\"javascript:show_line(" + line_num + ", " + i + ");\">" + pv[i] + "</a>";
+               if (splicepos === i) {
+                       ret += " (TB: ";
+                       in_tb = true;
+               }
 
                if (toplay == 'W') {
                        if (i > opt_limit && !opt_showlast) {
+                               if (in_tb) {
+                                       ret += ")";
+                               }
                                return ret + ' (…)';
                        }
                        if (ret != '') {
@@ -729,6 +754,9 @@ var print_pv = function(line_num, opt_limit, opt_showlast) {
                        toplay = 'W';
                }
        }
+       if (in_tb) {
+               ret += ")";
+       }
        return ret;
 }
 
@@ -748,11 +776,11 @@ var update_history = function() {
        if (display_lines[0] === null || display_lines[0].pv.length == 0) {
                $("#history").html("No history");
        } else if (truncate_display_history) {
-               $("#history").html(print_pv(0, 8, true));
+               $("#history").html(print_pv(0, null, 8, true));
        } else {
                $("#history").html(
                        '(<a class="move" href="javascript:collapse_history(true)">collapse</a>) ' +
-                       print_pv(0));
+                       print_pv(0, null));
        }
 }
 
@@ -1273,6 +1301,11 @@ var update_board = function() {
                        hiddenboard = new Chess(base_fen);
                        hiddenboard.move(line['pv'][0]);
                        var this_response = hiddenboard.move(line['pv'][1]);
+                       if (this_response === null) {
+                               console.log("BUG: ", i);
+                               console.log(data);
+                               console.log(line['pv']);
+                       }
                        if (response.from !== this_response.from || response.to !== this_response.to) {
                                // Different response depending on lines, abort.
                                response = undefined;
@@ -1339,6 +1372,7 @@ var update_sparkline = function(data) {
                        }
                        // FIXME: at some widths, calling sparkline() seems to push
                        // #scorecontainer under the board.
+                       $('#scorespark').unbind('sparklineClick');
                        $("#scorespark").sparkline(scores, {
                                type: 'bar',
                                zeroColor: 'gray',
@@ -1350,6 +1384,7 @@ var update_sparkline = function(data) {
                                        return format_tooltip(data, fields[0].offset + first_move_num - 1);
                                }
                        });
+                       $('#scorespark').unbind('sparklineClick');
                        $('#scorespark').bind('sparklineClick', function(event) {
                                var sparkline = event.sparklines[0];
                                var region = sparkline.getCurrentRegionFields();
@@ -1369,13 +1404,22 @@ var update_sparkline = function(data) {
  * @param {number} num_viewers
  */
 var update_num_viewers = function(num_viewers) {
+       var text = "";
        if (num_viewers === null) {
-               $("#numviewers").text("");
+               text = "";
        } else if (num_viewers == 1) {
-               $("#numviewers").text("You are the only current viewer");
+               text = "You are the only current viewer";
        } else {
-               $("#numviewers").text(num_viewers + " current viewers");
+               text = num_viewers + " current viewers";
        }
+       if (display_fen !== null) {
+               var counter = Math.floor(display_fen.split(" ")[4] / 2);
+               if (counter >= 20) {
+                       text = text.replace("current ", "");
+                       text += " | 50-move rule: " + counter;
+               }
+       }
+       $("#numviewers").text(text);
 }
 
 var update_clock = function() {
@@ -1732,7 +1776,7 @@ var update_move_highlight = function() {
                        $("#pvtitle").text("Exploring:");
                        current_display_line.start_display_move_num = 0;
                        display_lines.push(current_display_line);
-                       $("#pv").html(print_pv(display_lines.length - 1));
+                       $("#pv").html(print_pv(display_lines.length - 1, null));  // FIXME
                        display_line_num = display_lines.length - 1;
 
                        // Clear out the PV, so it's not selected by anything later.
@@ -2078,14 +2122,25 @@ var format_short_score = function(score) {
        if (!score) {
                return "???";
        }
-       if (score[0] === 'm') {
+       if (score[0] === 'T' || score[0] === 't') {
+               var ret = "TB\u00a0";
+               if (score[2]) {  // Is a bound.
+                       ret = score[2] + "\u00a0TB\u00a0";
+               }
+               if (score[0] === 'T') {
+                       return ret + Math.ceil(score[1] / 2);
+               } else {
+                       return ret + "-" + Math.ceil(score[1] / 2);
+               }
+       } else if (score[0] === 'M' || score[0] === 'm') {
+               var sign = (score[0] === 'm') ? '-' : '';
                if (score[2]) {  // Is a bound.
-                       return score[2] + "\u00a0M " + score[1];
+                       return score[2] + "\u00a0M " + sign + score[1];
                } else {
-                       return "M " + score[1];
+                       return "M " + sign + score[1];
                }
        } else if (score[0] === 'd') {
-               return "TB draw";
+               return "TB =0";
        } else if (score[0] === 'cp') {
                if (score[2]) {  // Is a bound.
                        return score[2] + "\u00a0" + fmt_cp(score[1]);
@@ -2100,11 +2155,29 @@ var format_long_score = function(score) {
        if (!score) {
                return "???";
        }
-       if (score[0] === 'm') {
-               if (score[1] > 0) {
+       if (score[0] === 'T') {
+               if (score[1] == 0) {
+                       return "Won for white (tablebase)";
+               } else {
+                       return "White wins in " + Math.ceil(score[1] / 2);
+               }
+       } else if (score[0] === 't') {
+               if (score[1] == -1) {
+                       return "Won for black (tablebase)";
+               } else {
+                       return "Black wins in " + Math.ceil(score[1] / 2);
+               }
+       } else if (score[0] === 'M') {
+               if (score[1] == 0) {
+                       return "White wins by checkmate";
+               } else {
                        return "White mates in " + score[1];
+               }
+       } else if (score[0] === 'm') {
+               if (score[1] == 0) {
+                       return "Black wins by checkmate";
                } else {
-                       return "Black mates in " + (-score[1]);
+                       return "Black mates in " + score[1];
                }
        } else if (score[0] === 'd') {
                return "Theoretical draw";
@@ -2115,12 +2188,10 @@ var format_long_score = function(score) {
 }
 
 var compute_plot_score = function(score) {
-       if (score[0] === 'm') {
-               if (score[1] > 0) {
-                       return 500;
-               } else {
-                       return -500;
-               }
+       if (score[0] === 'M' || score[0] === 'T') {
+               return 500;
+       } else if (score[0] === 'm' || score[0] === 't') {
+               return -500;
        } else if (score[0] === 'd') {
                return 0;
        } else if (score[0] === 'cp') {
@@ -2147,14 +2218,18 @@ var compute_score_sort_key = function(score, depth, invert, depth_secondary_key)
        if (!score) {
                return -10000000;
        }
-       if (score[0] === 'm') {
-               if (score[1] > 0) {
-                       // White mates.
-                       s = 99999 - score[1];
-               } else {
-                       // Black mates (note the double negative for score[1]).
-                       s = -99999 - score[1];
-               }
+       if (score[0] === 'T') {
+               // White reaches TB win.
+               s = 89999 - score[1];
+       } else if (score[0] === 't') {
+               // Black reaches TB win.
+               s = -(89999 - score[1]);
+       } else if (score[0] === 'M') {
+               // White mates.
+               s = 99999 - score[1];
+       } else if (score[0] === 'm') {
+               // Black mates.
+               s = -(99999 - score[1]);
        } else if (score[0] === 'd') {
                s = 0;
        } else if (score[0] === 'cp') {