* Version of this script. If the server returns a version larger than
* this, it is a sign we should reload to upgrade ourselves.
*
- * @type {Number}
+ * @type {number}
* @const
* @private */
let SCRIPT_VERSION = 2023122700;
/** Currently displayed refutation lines (on-screen).
* Can either come from the current_analysis_data, displayed_analysis_data,
* or hash_refutation_lines.
+ *
+ * TODO: This is a mess, and we should probably just let update_refutation_lines()
+ * decide anew every time instead of storing the state here in multiple global
+ * variables.
+ *
+ * @type {Array.<{
+ * score: Array,
+ * depth: string,
+ * pv: Array.<string>,
+ * move: string
+ * }>}
+ * @private
*/
let refutation_lines = [];
*/
let hash_refutation_lines = null;
+/**
+ * What FEN refutation_lines is relative to. Will usually be base_fen,
+ * but if another move gets loaded while we are looking, they can diverge.
+ */
+let refutation_lines_base_fen = null;
+
/** @type {number} @private */
let ims = 0;
/** @typedef {{
* start_fen: string,
* pv: Array.<string>,
- * move_num: number,
- * toplay: string,
* scores: Array<{first_move: number, score: Object}>,
* start_display_move_num: number
- * }} DisplayLine
+ * }}
*
* "start_display_move_num" is the (half-)move number to start displaying the PV at.
* "score" is also evaluated at this point.
*/
+var DisplayLine;
/** All PVs that we currently know of.
*
* The current timer to fire off a request to get main analysis (not history),
* if any, so that we can abort it.
*
- * @type {?Number}
+ * @type {?number}
* @private
*/
let current_analysis_request_timer = null;
* The current timer to display hash probe information (it could be waiting on the
* board to stop animating), if any, so that we can abort it.
*
- * @type {?Number}
+ * @type {?number}
* @private
*/
let current_hash_display_timer = null;
/**
* @param {!string} start_fen
* @param {Array.<string>} pv
- * @param {Array<{ first_move: integer, score: Object }>} scores
+ * @param {Array<{ first_move: number, score: Object }>} scores
* @param {number} start_display_move_num
* @param {number=} opt_limit
* @param {boolean=} opt_showlast
display_lines.push({
start_fen: start_fen,
pv: pv,
- move_num: find_move_num(start_fen),
- toplay: find_toplay(start_fen),
scores: scores,
start_display_move_num: start_display_move_num
});
function print_pv(line_num, splicepos, opt_limit, opt_showlast) {
let display_line = display_lines[line_num];
let pv = display_line.pv;
- let move_num = display_line.move_num;
- let toplay = display_line.toplay;
+ let move_num = find_move_num(display_line.start_fen);
+ let toplay = find_toplay(display_line.start_fen);
// Truncate PV at the start if needed.
let start_display_move_num = display_line.start_display_move_num;
* Also recreates the global "display_lines".
*/
function update_refutation_lines() {
- if (base_fen === null) {
+ if (refutation_lines_base_fen === null) {
return;
}
if (display_lines.length > 2) {
moves.push(move);
}
- let invert = (find_toplay(base_fen) === 'b');
+ let invert = (find_toplay(refutation_lines_base_fen) === 'b');
if (current_display_line && current_display_move % 2 == 0 && !current_display_line_is_history) {
invert = !invert;
}
let pv_td = document.createElement("td");
tr.appendChild(pv_td);
pv_td.classList.add("pv");
- pv_td.append(add_pv(base_fen, base_line.concat([ line['move'] ]), scores, start_display_move_num));
+ pv_td.append(add_pv(refutation_lines_base_fen, base_line.concat([ line['move'] ]), scores, start_display_move_num));
tbl.append(tr);
continue;
let pv_td = document.createElement("td");
tr.appendChild(pv_td);
pv_td.classList.add("pv");
- pv_td.append(add_pv(base_fen, base_line.concat(line['pv']), scores, start_display_move_num, 10));
+ pv_td.append(add_pv(refutation_lines_base_fen, base_line.concat(line['pv']), scores, start_display_move_num, 10));
tbl.append(tr);
}
document.getElementById("whiteclock").replaceChildren();
document.getElementById("blackclock").replaceChildren();
refutation_lines = [];
+ refutation_lines_base_fen = null;
update_refutation_lines();
clear_arrows();
update_displayed_line();
// Update the refutation lines.
base_fen = data['position']['fen'];
- refutation_lines = hash_refutation_lines || data['refutation_lines'];
+ if (hash_refutation_lines === null) {
+ refutation_lines = data['refutation_lines'];
+ refutation_lines_base_fen = base_fen;
+ }
update_refutation_lines();
// Update the sparkline last, since its size depends on how everything else reflowed.
}
/**
- * @param {Number} remaining_ms
+ * @param {number} remaining_ms
* @param {boolean} show_seconds
*/
function format_clock(remaining_ms, show_seconds) {
}
/**
- * @param {Number} x
+ * @param {number} x
*/
function format_2d(x) {
if (x >= 10) {
/**
* @param {string} move
- * @param {Number} move_num Move number of this move.
+ * @param {number} move_num Move number of this move.
* @param {boolean} white_to_play Whether white is to play this move.
*/
function format_move_with_number(move, move_num, white_to_play) {
/**
* @param {string} move
- * @param {Number} halfmove_num Half-move number that is to be played,
+ * @param {number} halfmove_num Half-move number that is to be played,
* starting from 0.
*/
function format_halfmove_with_number(move, halfmove_num) {
/**
* @param {Object} data
- * @param {Number} halfmove_num
+ * @param {number} halfmove_num
*/
function format_tooltip(data, halfmove_num) {
if (data['score_history'][halfmove_num + 1] ||
}
}
-/**
- * @param {boolean} truncate_history
- */
-function set_truncate_history(truncate_history) {
- truncate_display_history = truncate_history;
- update_refutation_lines();
-}
-window['set_truncate_history'] = set_truncate_history;
-
/**
* @param {number} line_num
* @param {number} move_num
current_display_line = null;
current_display_move = null;
hash_refutation_lines = null;
+ refutation_lines_base_fen = base_fen;
if (displayed_analysis_data) {
// TODO: Support exiting to history position if we are in an
// analysis line of a history position.
}
current_hash_display_timer = null;
hash_refutation_lines = data['lines'];
+ refutation_lines_base_fen = fen;
update_board();
}