use fixed tb move categories from server

hotfix-tablebase
Niklas Fiekas 2021-09-12 18:12:01 +02:00
parent f5185fc650
commit c8f2b3325a
3 changed files with 23 additions and 38 deletions

View File

@ -7,7 +7,7 @@ export function colorOf(fen: Fen): Color {
export function winnerOf(fen: Fen, move: TablebaseMoveStats): Color | undefined {
const stm = colorOf(fen);
if (move.checkmate || move.variant_loss || move.wdl! < 0) return stm;
if (move.variant_win || move.wdl! > 0) return opposite(stm);
if (move.checkmate || move.variant_loss || (move.dtz && move.dtz < 0)) return stm;
if (move.variant_win || (move.dtz && move.dtz > 0)) return opposite(stm);
return undefined;
}

View File

@ -9,6 +9,7 @@ import AnalyseCtrl from '../ctrl';
import {
isOpening,
isTablebase,
TablebaseCategory,
TablebaseMoveStats,
OpeningData,
OpeningMoveStats,
@ -334,16 +335,6 @@ function showGameEnd(ctrl: AnalyseCtrl, title: string): VNode {
let lastShow: MaybeVNode;
type TablebaseMoveCategory =
| 'win'
| 'unknown'
| 'maybe-win'
| 'cursed-win'
| 'draw'
| 'blessed-loss'
| 'maybe-loss'
| 'loss';
function show(ctrl: AnalyseCtrl): MaybeVNode {
const trans = ctrl.trans.noarg,
data = ctrl.explorer.current();
@ -371,39 +362,23 @@ function show(ctrl: AnalyseCtrl): MaybeVNode {
]);
else lastShow = showEmpty(ctrl, data.opening);
} else if (data && isTablebase(data)) {
const halfmovesBefore = parseInt(data.fen.split(' ')[4], 10);
const moveCategory: (m: TablebaseMoveStats) => TablebaseMoveCategory = m => {
const dtz = m.zeroing || m.checkmate || m.variant_loss || m.variant_win ? 0 : m.dtz;
const halfmovesAfter = m.zeroing ? 0 : halfmovesBefore + 1;
if ((m.stalemate || m.insufficient_material || m.wdl === 0) && !m.variant_loss && !m.variant_win) return 'draw';
else if (m.checkmate || m.variant_loss || (m.dtz && m.dtz < 0)) {
if (halfmovesBefore >= 100 || (dtz && dtz - halfmovesAfter < -100)) return 'cursed-win';
if ((dtz && dtz - halfmovesAfter > -100) || (m.zeroing && m.wdl === -2) || m.checkmate || m.variant_win)
return 'win';
return 'maybe-win';
} else if (m.variant_win || (m.dtz && m.dtz > 0)) {
if (halfmovesBefore >= 100 || (dtz && dtz + halfmovesAfter > 100)) return 'blessed-loss';
if ((dtz && dtz + halfmovesAfter < 100) || (m.zeroing && m.wdl === 2) || m.variant_win) return 'loss';
return 'maybe-loss';
} else return 'unknown';
};
const row = (category: TablebaseMoveCategory, title: string) =>
const row = (category: TablebaseCategory, title: string) =>
showTablebase(
ctrl,
data.fen,
title,
data.moves.filter(m => moveCategory(m) === category)
data.moves.filter(m => m.category == category)
);
if (data.moves.length)
lastShow = h('div.data', [
...row('win', trans('winning')),
...row('loss', trans('winning')),
...row('unknown', trans('unknown')),
...row('maybe-win', 'Winning or 50 moves by prior mistake'),
...row('cursed-win', trans('winPreventedBy50MoveRule')),
...row('maybe-loss', 'Winning or 50 moves by prior mistake'),
...row('blessed-loss', trans('winPreventedBy50MoveRule')),
...row('draw', trans('drawn')),
...row('blessed-loss', trans('lossSavedBy50MoveRule')),
...row('maybe-loss', 'Losing or 50 moves by prior mistake'),
...row('loss', trans('losing')),
...row('cursed-win', trans('lossSavedBy50MoveRule')),
...row('maybe-win', 'Losing or 50 moves by prior mistake'),
...row('win', trans('losing')),
]);
else if (data.checkmate) lastShow = showGameEnd(ctrl, trans('checkmate'));
else if (data.stalemate) lastShow = showGameEnd(ctrl, trans('stalemate'));

View File

@ -74,9 +74,18 @@ interface OpeningPlayer {
rating: number;
}
export type TablebaseCategory =
| 'loss'
| 'unknown'
| 'maybe-loss'
| 'blessed-loss'
| 'draw'
| 'cursed-win'
| 'maybe-win'
| 'win';
export interface TablebaseData extends ExplorerData {
moves: TablebaseMoveStats[];
wdl: number | null;
dtz: number | null;
dtm: number | null;
checkmate: boolean;
@ -84,6 +93,7 @@ export interface TablebaseData extends ExplorerData {
variant_win: boolean;
variant_loss: boolean;
insufficient_material: boolean;
category: TablebaseCategory;
}
export interface MoveStats {
@ -98,7 +108,6 @@ export interface OpeningMoveStats extends MoveStats {
averageRating: number;
}
export interface TablebaseMoveStats extends MoveStats {
wdl: number | null;
dtz: number | null;
dtm: number | null;
checkmate: boolean;
@ -107,6 +116,7 @@ export interface TablebaseMoveStats extends MoveStats {
variant_loss: boolean;
insufficient_material: boolean;
zeroing: boolean;
category: TablebaseCategory;
}
export function isOpening(m: ExplorerData): m is OpeningData {