43 lines
1.5 KiB
JavaScript
43 lines
1.5 KiB
JavaScript
var evalLabel = document.createElement("span");
|
|
evalLabel.style = `font-size:12px;font-weight:bold;color:#94a3b8;min-width:38px;text-align:right;font-family:monospace;`;
|
|
evalLabel.textContent = "0.0";
|
|
|
|
var evalTrack = document.createElement("div");
|
|
evalTrack.style = `flex:1;height:6px;border-radius:4px;background:#0f172a;overflow:hidden;`;
|
|
|
|
var evalFill = document.createElement("div");
|
|
evalFill.style = `height:100%;width:50%;background:#e2e8f0;transition:width 0.4s ease;border-radius:4px;`;
|
|
evalTrack.appendChild(evalFill);
|
|
|
|
var evalPercent = document.createElement("span");
|
|
evalPercent.style = `font-size:11px;color:#64748b;min-width:34px;font-family:monospace;`;
|
|
evalPercent.textContent = "50%";
|
|
|
|
function cpToWinPercent(cp) {
|
|
return 50 + 50 * (2 / (1 + Math.exp(-0.00368208 * cp)) - 1);
|
|
}
|
|
|
|
function updateEvalBar(cp, isMate, sideToMove) {
|
|
let whiteCP = sideToMove === "w" ? cp : -cp;
|
|
let whitePercent, labelText;
|
|
|
|
if (isMate) {
|
|
if (cp === 0) {
|
|
// Position IS checkmate — the side to move has already been mated
|
|
whitePercent = sideToMove === "b" ? 98 : 2;
|
|
labelText = sideToMove === "b" ? "M0" : "-M0";
|
|
} else {
|
|
whitePercent = whiteCP > 0 ? 98 : 2;
|
|
labelText = whiteCP > 0 ? `M${Math.abs(cp)}` : `-M${Math.abs(cp)}`;
|
|
}
|
|
} else {
|
|
whitePercent = cpToWinPercent(whiteCP);
|
|
let v = (whiteCP / 100).toFixed(1);
|
|
labelText = whiteCP >= 0 ? `+${v}` : `${v}`;
|
|
}
|
|
|
|
evalFill.style.width = `${whitePercent}%`;
|
|
evalLabel.textContent = labelText;
|
|
evalPercent.textContent = `${Math.round(whitePercent)}%`;
|
|
}
|