X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=www%2Fjs%2Fremoteglot.js;h=b72f4c426119082512ba43af50bec53fe68a3019;hb=f71f5c94d093acda1b39d23cf7a71a21c6a3122b;hp=4ff9d6429756fb325dd93c194392b6dc6bf46f99;hpb=3a8a3682f658b1fd5f1ae8420230a356f57fc0ad;p=remoteglot diff --git a/www/js/remoteglot.js b/www/js/remoteglot.js index 4ff9d64..b72f4c4 100644 --- a/www/js/remoteglot.js +++ b/www/js/remoteglot.js @@ -7,7 +7,7 @@ * @type {Number} * @const * @private */ -var SCRIPT_VERSION = 2016113007; +var SCRIPT_VERSION = 2021021300; /** * The current backend URL. @@ -294,11 +294,13 @@ var request_update = function() { update_num_viewers(num_viewers); } else { console.log("Received invalid update, waiting five seconds and trying again."); - location.reload(true); + setTimeout(function() { location.reload(true); }, 5000); } // 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, @@ -658,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; @@ -687,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 @@ -703,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 = "" + pv[0] + ""; + var move = ""; + if (splicepos === 0) { + move += "(TB: "; + in_tb = true; + } + move += "" + pv[0] + ""; ret = move_num + '. … ' + move; toplay = 'W'; ++i; @@ -711,9 +731,16 @@ var print_pv = function(line_num, opt_limit, opt_showlast) { } for ( ; i < pv.length; ++i) { var move = "" + pv[i] + ""; + 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 != '') { @@ -727,6 +754,9 @@ var print_pv = function(line_num, opt_limit, opt_showlast) { toplay = 'W'; } } + if (in_tb) { + ret += ")"; + } return ret; } @@ -746,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( '(collapse) ' + - print_pv(0)); + print_pv(0, null)); } } @@ -778,6 +808,10 @@ var update_refutation_lines = function() { var tbl = $("#refutationlines"); tbl.empty(); + if (display_lines.length < 2) { + return; + } + // Find out where the lines start from. var base_line = []; var base_scores = display_lines[1].scores; @@ -794,7 +828,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) }); @@ -938,6 +972,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; } @@ -1167,6 +1213,24 @@ var update_board = function() { $("#score").text(format_long_score(data['score'])); } + // Low depth. + var lowdepth = ''; + if (data['lowdepth']) { + lowdepth = 'Quick look: '; + var lds = []; + Object.keys(data['lowdepth']).forEach(function(depth) { + lds.push([parseInt(depth), format_short_score(data['lowdepth'][depth])]); + }); + lds.sort(function(a, b) { return a[0] - b[0]; }); + for (var i = 0; i < lds.length; ++i) { + lowdepth += 'd' + lds[i][0] + ': ' + lds[i][1]; + if (i != lds.length - 1) { + lowdepth += ', '; + } + } + } + $("#lowdepth").html(lowdepth); + // The search stats. if (data['searchstats']) { $("#searchstats").html(data['searchstats']); @@ -1246,7 +1310,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; @@ -1255,6 +1319,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; @@ -1321,6 +1390,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', @@ -1332,6 +1402,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(); @@ -1351,13 +1422,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() { @@ -1714,7 +1794,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. @@ -2060,14 +2140,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. - return score[2] + "\u00a0M " + score[1]; + ret = score[2] + "\u00a0TB\u00a0"; + } + if (score[0] === 'T') { + return ret + Math.ceil(score[1] / 2); } else { - return "M " + score[1]; + 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 " + sign + score[1]; + } else { + 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]); @@ -2082,11 +2173,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"; @@ -2097,12 +2206,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') { @@ -2129,14 +2236,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') { @@ -2241,6 +2352,7 @@ var init = function() { } }); window.addEventListener('hashchange', possibly_switch_game_from_hash, false); + possibly_switch_game_from_hash(); }; $(document).ready(init);