/** @type {?number} @private */
var unique = null;
+/** @type {boolean} @private */
+var enable_sound = false;
+
/** The current position on the board, represented as a FEN string.
* @type {?string}
* @private
}).done(function(data, textstatus, xhr) {
ims = xhr.getResponseHeader('X-Remoteglot-Last-Modified');
var num_viewers = xhr.getResponseHeader('X-Remoteglot-Num-Viewers');
+ possibly_play_sound(current_analysis_data, data);
current_analysis_data = data;
update_board(current_analysis_data, displayed_analysis_data);
update_num_viewers(num_viewers);
});
}
+var possibly_play_sound = function(old_data, new_data) {
+ if (!enable_sound) {
+ return;
+ }
+ if (old_data === null) {
+ return;
+ }
+ var ding = document.getElementById('ding');
+ if (ding && ding.play !== undefined) {
+ if (old_data['position'] && old_data['position']['fen'] &&
+ new_data['position'] && new_data['position']['fen'] &&
+ (old_data['position']['fen'] !== new_data['position']['fen'] ||
+ old_data['position']['move_num'] !== new_data['position']['move_num'])) {
+ ding.play();
+ }
+ }
+}
+
var clear_arrows = function() {
for (var i = 0; i < arrows.length; ++i) {
if (arrows[i].svg) {
arrow.svg.parentElement.removeChild(arrow.svg);
delete arrow.svg;
}
- if (current_display_line !== null) {
+ if (current_display_line !== null && !current_display_line_is_history) {
return;
}
/**
* @param {!string} fen
- * @param {Array.<string>} uci_pv
+ * @param {Array.<string>} pretty_pv
* @param {number} move_num
* @param {!string} toplay
* @param {number=} opt_limit
* @param {boolean=} opt_showlast
*/
-var add_pv = function(fen, uci_pv, move_num, toplay, opt_limit, opt_showlast) {
- var hiddenboard = new Chess();
- hiddenboard.load(fen);
- for (var i = 0; i < uci_pv.length; ++i) {
- hiddenboard.move(ucimove_to_chessjs_move(uci_pv[i]));
- }
- var pretty_pv = hiddenboard.history();
-
+var add_pv = function(fen, pretty_pv, move_num, toplay, opt_limit, opt_showlast) {
display_lines.push({
start_fen: fen,
- uci_pv: uci_pv,
pretty_pv: pretty_pv,
line_number: display_lines.length
});
var update_highlight = function() {
$("#board").find('.square-55d63').removeClass('nonuglyhighlight');
- if (current_display_line === null && highlight_from !== undefined && highlight_to !== undefined) {
+ if ((current_display_line === null || current_display_line_is_history) &&
+ highlight_from !== undefined && highlight_to !== undefined) {
$("#board").find('.square-' + highlight_from).addClass('nonuglyhighlight');
$("#board").find('.square-' + highlight_to).addClass('nonuglyhighlight');
}
var move_td = document.createElement("td");
tr.appendChild(move_td);
$(move_td).addClass("move");
- if (line['pv_uci'].length == 0) {
+ if (line['pv_pretty'].length == 0) {
$(move_td).text(line['pretty_move']);
} else {
var move = "<a class=\"move\" href=\"javascript:show_line(" + display_lines.length + ", " + 0 + ");\">" + line['pretty_move'] + "</a>";
var pv_td = document.createElement("td");
tr.appendChild(pv_td);
$(pv_td).addClass("pv");
- $(pv_td).html(add_pv(fen, line['pv_uci'], move_num, toplay, 10));
+ $(pv_td).html(add_pv(fen, line['pv_pretty'], move_num, toplay, 10));
tbl.append(tr);
}
// Print the history. This is pretty much the only thing that's
// 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', 8, true);
+ if (current_data['position']['pretty_history']) {
+ add_pv('start', current_data['position']['pretty_history'], 1, 'W', 8, true);
} else {
display_lines.push(null);
}
document.title = 'analysis.sesse.net';
}
+ // The last move (shown by highlighting the from and to squares).
+ if (data['position'] && data['position']['last_move_uci']) {
+ highlight_from = data['position']['last_move_uci'].substr(0, 2);
+ highlight_to = data['position']['last_move_uci'].substr(2, 2);
+ } else if (current_display_line_is_history && current_display_move >= 0) {
+ // 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 = new Chess();
+ for (var i = 0; i <= current_display_move; ++i) {
+ hiddenboard.move(current_display_line.pretty_pv[i]);
+ }
+ var moves = hiddenboard.history({ verbose: true });
+ var last_move = moves.pop();
+ highlight_from = last_move.from;
+ highlight_to = last_move.to;
+ } else {
+ highlight_from = highlight_to = undefined;
+ }
+ update_highlight();
+
if (data['failed']) {
$("#score").text("No analysis for this move");
$("#pv").empty();
$("#refutationlines").empty();
refutation_lines = [];
update_refutation_lines();
+ clear_arrows();
+ update_displayed_line();
return;
}
fen = data['position']['fen'];
update_displayed_line();
- if (data['position']['last_move_uci']) {
- highlight_from = data['position']['last_move_uci'].substr(0, 2);
- highlight_to = data['position']['last_move_uci'].substr(2, 2);
- } else {
- highlight_from = highlight_to = undefined;
- }
- update_highlight();
-
// Print the PV.
- $("#pv").html(add_pv(data['position']['fen'], data['pv_uci'], data['position']['move_num'], data['position']['toplay']));
+ $("#pv").html(add_pv(data['position']['fen'], data['pv_pretty'], data['position']['move_num'], data['position']['toplay']));
// Update the PV arrow.
clear_arrows();
// Fetch old analysis for this line if it exists.
var hiddenboard = new Chess();
for (var i = 0; i <= current_display_move; ++i) {
- hiddenboard.move(ucimove_to_chessjs_move(current_display_line.uci_pv[i]));
+ hiddenboard.move(current_display_line.pretty_pv[i]);
}
var filename = "/history/move" + (current_display_move + 1) + "-" +
hiddenboard.fen().replace(/ /g, '_').replace(/\//g, '-') + ".json";
} else {
$("#prevmove").html("<a href=\"javascript:prev_move();\">Previous</a></span>");
}
- if (current_display_move == current_display_line.uci_pv.length - 1) {
+ if (current_display_move == current_display_line.pretty_pv.length - 1) {
$("#nextmove").html("Next");
} else {
$("#nextmove").html("<a href=\"javascript:next_move();\">Next</a></span>");
var hiddenboard = new Chess();
hiddenboard.load(current_display_line.start_fen);
for (var i = 0; i <= current_display_move; ++i) {
- hiddenboard.move(ucimove_to_chessjs_move(current_display_line.uci_pv[i]));
+ hiddenboard.move(current_display_line.pretty_pv[i]);
}
highlighted_move = $("#automove" + current_display_line.line_number + "-" + current_display_move);
board.position(hiddenboard.fen());
}
-var ucimove_to_chessjs_move = function(move) {
- var source = move.substr(0, 2);
- var target = move.substr(2, 2);
- var promo = move.substr(4, 1);
-
- if (promo === '') {
- return { from: source, to: target };
+/**
+ * @param {boolean} param_enable_sound
+ */
+var set_sound = function(param_enable_sound) {
+ enable_sound = param_enable_sound;
+ if (enable_sound) {
+ $("#soundon").html("<strong>On</strong>");
+ $("#soundoff").html("<a href=\"javascript:set_sound(false)\">Off</a>");
} else {
- return { from: source, to: target, promotion: promo };
+ $("#soundon").html("<a href=\"javascript:set_sound(true)\">On</a>");
+ $("#soundoff").html("<strong>Off</strong>");
}
}
+window['set_sound'] = set_sound;
var init = function() {
unique = get_unique();
+ set_sound(false);
// Create board.
board = new window.ChessBoard('board', 'start');