From 413850f7e5f548b9eeda341db355a7a7ce03caab Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sat, 6 Mar 2021 10:00:53 +0100 Subject: [PATCH 001/131] New translations: puzzleTheme.xml (Serbian (Cyrillic)) --- translation/dest/puzzleTheme/sr-SP.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/translation/dest/puzzleTheme/sr-SP.xml b/translation/dest/puzzleTheme/sr-SP.xml index 972a06dcc7..13d8c81c18 100644 --- a/translation/dest/puzzleTheme/sr-SP.xml +++ b/translation/dest/puzzleTheme/sr-SP.xml @@ -25,6 +25,7 @@ Уништавање Уочите противничку грубу грешку како бисте стекли огромну предност. (евалуација ≥ 600cp) Мат ловачким паром + Два нападајућа ловца на суседним дијагоналама матирају краља препреченог пријатељским фигурама. Дефлекција Маказе Партије мајстора From 100d463736af23238b96103c5a5aef4b5913625e Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sat, 6 Mar 2021 10:10:50 +0100 Subject: [PATCH 002/131] New translations: puzzleTheme.xml (Serbian (Cyrillic)) --- translation/dest/puzzleTheme/sr-SP.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/translation/dest/puzzleTheme/sr-SP.xml b/translation/dest/puzzleTheme/sr-SP.xml index 13d8c81c18..cd0e156926 100644 --- a/translation/dest/puzzleTheme/sr-SP.xml +++ b/translation/dest/puzzleTheme/sr-SP.xml @@ -26,6 +26,7 @@ Уочите противничку грубу грешку како бисте стекли огромну предност. (евалуација ≥ 600cp) Мат ловачким паром Два нападајућа ловца на суседним дијагоналама матирају краља препреченог пријатељским фигурама. + Коциов мат Дефлекција Маказе Партије мајстора From 37fa410d1bbf3d2c79d13f893c4425d39075c045 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sat, 6 Mar 2021 10:20:50 +0100 Subject: [PATCH 003/131] New translations: puzzleTheme.xml (Serbian (Cyrillic)) --- translation/dest/puzzleTheme/sr-SP.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/translation/dest/puzzleTheme/sr-SP.xml b/translation/dest/puzzleTheme/sr-SP.xml index cd0e156926..8bd4c14d99 100644 --- a/translation/dest/puzzleTheme/sr-SP.xml +++ b/translation/dest/puzzleTheme/sr-SP.xml @@ -27,6 +27,9 @@ Мат ловачким паром Два нападајућа ловца на суседним дијагоналама матирају краља препреченог пријатељским фигурама. Коциов мат + Дама матира суседног краља, чија су једина два излазна поља препречена његовим фигурама. + Изједначење + Вратите се из губитне позиције и осигурајте реми или изједначену позицију. (евалуација ≤ 200cp) Дефлекција Маказе Партије мајстора From 5d7d74fa96068d7f4794a5cfb7ed5ba4973910fd Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sat, 6 Mar 2021 10:30:58 +0100 Subject: [PATCH 004/131] New translations: learn.xml (Serbian (Cyrillic)) --- translation/dest/learn/sr-SP.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/translation/dest/learn/sr-SP.xml b/translation/dest/learn/sr-SP.xml index c7dba5731e..8d43135395 100644 --- a/translation/dest/learn/sr-SP.xml +++ b/translation/dest/learn/sr-SP.xml @@ -67,14 +67,14 @@ Основе Ношење Однесите противничке фигуре - Идентификујте небрањене противничке фигуре, и однесите их! + Идентификујте небрањене противничке фигуре и однесите их! Носите црне фигуре! Носите црне фигуре! И немојте изгубити своје. Честитамо! Знате како да се борите шаховским фигурама! Заштита Заштитите своје фигуре - Видите које фигуре Ваш противник напада, и одбраните их! + Видите које фигуре Ваш противник напада и одбраните их! Честитамо! Фигура коју не изгубите је фигура коју добијете! Ви сте под нападом! Избегните претњу! @@ -129,7 +129,7 @@ Честитамо! Знате да поставите шаховску таблу. Рокада Посебан краљев потез - Доведите свог краља на сигурно, и развијте вашег топа у напад! + Доведите свог краља на сигурно и развијте свог топа за напад! Померите свог краља за два поља да направите малу рокаду! Померите свог краља за два поља From 2c7e97b94a9ef89dc1573099313159fdf1191294 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sat, 6 Mar 2021 10:30:59 +0100 Subject: [PATCH 005/131] New translations: study.xml (Serbian (Cyrillic)) --- translation/dest/study/sr-SP.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translation/dest/study/sr-SP.xml b/translation/dest/study/sr-SP.xml index bb08024c63..52c3eb477b 100644 --- a/translation/dest/study/sr-SP.xml +++ b/translation/dest/study/sr-SP.xml @@ -33,7 +33,7 @@ %s Чланова Позовите у студију - Молимо вас да само позивате људе које познајете, и који активно желе да се придруже овој студији. + Молимо вас да само позивате људе које познајете и који активно желе да се придруже овој студији. Претражујте по корисничком имену Посматрач Cарадник From 57a05464c3fa0119e91e23b6f52504d9bcbdcaf5 Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Sat, 6 Mar 2021 11:30:12 +0100 Subject: [PATCH 006/131] ceval: no need to pass minDepth from ctrl --- ui/ceval/src/ctrl.ts | 2 -- ui/ceval/src/stockfishProtocol.ts | 8 +++++--- ui/ceval/src/types.ts | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ui/ceval/src/ctrl.ts b/ui/ceval/src/ctrl.ts index 995b5f104e..13d0d485bd 100644 --- a/ui/ceval/src/ctrl.ts +++ b/ui/ceval/src/ctrl.ts @@ -88,7 +88,6 @@ export default function (opts: CevalOpts): CevalCtrl { const maxHashSize = Math.min(((navigator.deviceMemory || 0.25) * 1024) / 8, growableSharedMem ? 1024 : 16); const hashSize = storedProp(storageKey('ceval.hash-size'), 16); - const minDepth = 6; const maxDepth = storedProp(storageKey('ceval.max-depth'), 18); const multiPv = storedProp(storageKey('ceval.multipv'), opts.multiPvDefault || 1); const infinite = storedProp('ceval.infinite', false); @@ -102,7 +101,6 @@ export default function (opts: CevalOpts): CevalCtrl { const isDeeper = prop(false); const protocolOpts = { - minDepth, variant: opts.variant.key, threads: (technology == 'hce' || technology == 'nnue') && (() => Math.min(parseInt(threads()), maxThreads)), hashSize: (technology == 'hce' || technology == 'nnue') && (() => Math.min(parseInt(hashSize()), maxHashSize)), diff --git a/ui/ceval/src/stockfishProtocol.ts b/ui/ceval/src/stockfishProtocol.ts index 4358f3d3db..6daaf7cd5f 100644 --- a/ui/ceval/src/stockfishProtocol.ts +++ b/ui/ceval/src/stockfishProtocol.ts @@ -3,7 +3,7 @@ import { ProtocolOpts, Work } from './types'; import { Deferred, defer } from 'common/defer'; import { Sync, sync } from 'common/sync'; -const EVAL_REGEX = new RegExp( +const evalRegex = new RegExp( '' + /^info depth (\d+) seldepth \d+ multipv (\d+) /.source + /score (cp|mate) ([-\d]+) /.source + @@ -12,6 +12,8 @@ const EVAL_REGEX = new RegExp( /pv (.+)/.source ); +const minDepth = 6; + export default class Protocol { private engineNameDeferred: Deferred = defer(); public engineName: Sync = sync(this.engineNameDeferred.promise); @@ -55,7 +57,7 @@ export default class Protocol { } if (!this.work || this.work.stopRequested) return; - const matches = text.match(EVAL_REGEX); + const matches = text.match(evalRegex); if (!matches) return; const depth = parseInt(matches[1]), @@ -73,7 +75,7 @@ export default class Protocol { // Track max pv index to determine when pv prints are done. if (this.expectedPvs < multiPv) this.expectedPvs = multiPv; - if (depth < this.opts.minDepth) return; + if (depth < minDepth) return; const pivot = this.work.threatMode ? 0 : 1; const ev = this.work.ply % 2 === pivot ? -povEv : povEv; diff --git a/ui/ceval/src/types.ts b/ui/ceval/src/types.ts index fb74d7cf54..e59327c536 100644 --- a/ui/ceval/src/types.ts +++ b/ui/ceval/src/types.ts @@ -13,7 +13,6 @@ export interface ProtocolOpts { variant: VariantKey; threads: false | (() => number | string); hashSize: false | (() => number | string); - minDepth: number; } export interface Work { From 7f00d6f521d9ebca85a631b9fd68647b6fbb87c1 Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Sat, 6 Mar 2021 13:13:37 +0100 Subject: [PATCH 007/131] ceval: detect standard material for nnue (fixes #8296, fixes #8290, closes #8314) thanks @benediktwerner --- ui/analyse/src/ctrl.ts | 20 +++++++++++++++++++- ui/ceval/src/ctrl.ts | 14 +++++++------- ui/ceval/src/types.ts | 3 ++- ui/ceval/src/worker.ts | 4 ---- ui/puzzle/src/ctrl.ts | 1 + 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/ui/analyse/src/ctrl.ts b/ui/analyse/src/ctrl.ts index f79b9163db..16cd474e98 100644 --- a/ui/analyse/src/ctrl.ts +++ b/ui/analyse/src/ctrl.ts @@ -33,7 +33,8 @@ import { make as makeRetro, RetroCtrl } from './retrospect/retroCtrl'; import { make as makeSocket, Socket } from './socket'; import { nextGlyphSymbol } from './nodeFinder'; import { opposite, parseUci, makeSquare, roleToChar } from 'chessops/util'; -import { Outcome, isNormal } from 'chessops/types'; +import { COLORS, Outcome, isNormal } from 'chessops/types'; +import { SquareSet } from 'chessops/squareSet'; import { parseFen } from 'chessops/fen'; import { Position, PositionError } from 'chessops/chess'; import { Result } from '@badrap/result'; @@ -610,6 +611,23 @@ export default class AnalyseCtrl { if (this.ceval) this.ceval.destroy(); const cfg: CevalOpts = { variant: this.data.game.variant, + standardMaterial: + !this.data.game.initialFen || + parseFen(this.data.game.initialFen).unwrap( + setup => + COLORS.every(color => { + const board = setup.board; + const pieces = board[color]; + const promotedPieces = + Math.max(board.queen.intersect(pieces).size() - 1, 0) + + Math.max(board.rook.intersect(pieces).size() - 2, 0) + + Math.max(board.knight.intersect(pieces).size() - 2, 0) + + Math.max(board.bishop.intersect(pieces).intersect(SquareSet.lightSquares()).size() - 1, 0) + + Math.max(board.bishop.intersect(pieces).intersect(SquareSet.darkSquares()).size() - 1, 0); + return board.pawn.intersect(pieces).size() + promotedPieces <= 8; + }), + _ => false + ), possible: !this.embed && (this.synthetic || !game.playable(this.data)), emit: (ev: Tree.ClientEval, work: CevalWork) => { this.onNewCeval(ev, work.path, work.threatMode); diff --git a/ui/ceval/src/ctrl.ts b/ui/ceval/src/ctrl.ts index 13d0d485bd..a0182b38e4 100644 --- a/ui/ceval/src/ctrl.ts +++ b/ui/ceval/src/ctrl.ts @@ -1,6 +1,6 @@ import { CevalCtrl, CevalOpts, CevalTechnology, Work, Step, Hovering, Started } from './types'; -import { AbstractWorker, WebWorker, ThreadedWasmWorker, officialStockfish } from './worker'; +import { AbstractWorker, WebWorker, ThreadedWasmWorker } from './worker'; import { prop } from 'common'; import { storedProp } from 'common/storage'; import throttle from 'common/throttle'; @@ -51,6 +51,8 @@ export default function (opts: CevalOpts): CevalCtrl { const enableNnue = storedProp(storageKey('ceval.enable-nnue'), !(navigator as any).connection?.saveData); // select nnue > hce > wasm > asmjs + const officialStockfish = + opts.standardMaterial && ['standard', 'fromPosition', 'chess960'].includes(opts.variant.key); let technology: CevalTechnology = 'asmjs'; let growableSharedMem = false; let supportsNnue = false; @@ -64,9 +66,7 @@ export default function (opts: CevalOpts): CevalCtrl { // i32x4.dot_i16x8_s const sourceWithSimd = Uint8Array.from([0, 97, 115, 109, 1, 0, 0, 0, 1, 5, 1, 96, 0, 1, 123, 3, 2, 1, 0, 7, 8, 1, 4, 116, 101, 115, 116, 0, 0, 10, 15, 1, 13, 0, 65, 0, 253, 17, 65, 0, 253, 17, 253, 186, 1, 11]); // prettier-ignore supportsNnue = WebAssembly.validate(sourceWithSimd); - if (supportsNnue && enableNnue() && officialStockfish(opts.variant.key)) { - technology = 'nnue'; - } + if (supportsNnue && officialStockfish && enableNnue()) technology = 'nnue'; try { sharedMem.grow(8); @@ -75,7 +75,7 @@ export default function (opts: CevalOpts): CevalCtrl { } } - const initialAllocationMaxThreads = officialStockfish(opts.variant.key) ? 2 : 1; + const initialAllocationMaxThreads = officialStockfish ? 2 : 1; const maxThreads = Math.min( Math.max((navigator.hardwareConcurrency || 1) - 1, 1), growableSharedMem ? 32 : initialAllocationMaxThreads @@ -231,8 +231,8 @@ export default function (opts: CevalOpts): CevalCtrl { }); else if (technology == 'hce') worker = new ThreadedWasmWorker(protocolOpts, { - baseUrl: officialStockfish(opts.variant.key) ? 'vendor/stockfish.wasm/' : 'vendor/stockfish-mv.wasm/', - module: officialStockfish(opts.variant.key) ? 'Stockfish' : 'StockfishMv', + baseUrl: officialStockfish ? 'vendor/stockfish.wasm/' : 'vendor/stockfish-mv.wasm/', + module: officialStockfish ? 'Stockfish' : 'StockfishMv', wasmMemory: sharedWasmMemory(1024, growableSharedMem ? 32768 : 1088), }); else diff --git a/ui/ceval/src/types.ts b/ui/ceval/src/types.ts index e59327c536..6a0888e16f 100644 --- a/ui/ceval/src/types.ts +++ b/ui/ceval/src/types.ts @@ -33,9 +33,10 @@ export interface CevalOpts { multiPvDefault?: number; possible: boolean; variant: Variant; + standardMaterial: boolean; emit: (ev: Tree.ClientEval, work: Work) => void; setAutoShapes: () => void; - redraw(): void; + redraw: () => void; } export interface Hovering { diff --git a/ui/ceval/src/worker.ts b/ui/ceval/src/worker.ts index 790bbff376..b322e0bd4f 100644 --- a/ui/ceval/src/worker.ts +++ b/ui/ceval/src/worker.ts @@ -2,10 +2,6 @@ import { sync, Sync } from 'common/sync'; import { ProtocolOpts, Work } from './types'; import Protocol from './stockfishProtocol'; -export function officialStockfish(variant: VariantKey): boolean { - return variant === 'standard' || variant === 'chess960'; -} - export abstract class AbstractWorker { protected protocol: Sync; diff --git a/ui/puzzle/src/ctrl.ts b/ui/puzzle/src/ctrl.ts index bed8cdc4a2..2f84c534e7 100644 --- a/ui/puzzle/src/ctrl.ts +++ b/ui/puzzle/src/ctrl.ts @@ -276,6 +276,7 @@ export default function (opts: PuzzleOpts, redraw: Redraw): Controller { name: 'Standard', key: 'standard', }, + standardMaterial: true, possible: true, emit: function (ev, work) { tree.updateAt(work.path, function (node) { From ca4690d3c78b6cfc132631f6401d7cae9431671d Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Sat, 6 Mar 2021 13:34:45 +0100 Subject: [PATCH 008/131] yarn run format test.html --- public/sound/test.html | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/public/sound/test.html b/public/sound/test.html index 351f71bcfb..ad0d0b52d6 100644 --- a/public/sound/test.html +++ b/public/sound/test.html @@ -34,13 +34,16 @@ -




+

+
+

- Puzzle Storm + + Puzzle Storm + - - +