From dbefd0b844ba51e9292f52d5c1a2c784daba1ef7 Mon Sep 17 00:00:00 2001 From: GuillaumeSD Date: Sun, 10 Mar 2024 17:46:49 +0100 Subject: [PATCH] feat : great & brilliant v1 --- src/lib/chess.ts | 12 ++++++--- src/lib/engine/helpers/moveClassification.ts | 27 ++++++++++++------- src/lib/lichess.ts | 15 ++--------- .../analysis/board/squareRenderer.tsx | 2 +- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/lib/chess.ts b/src/lib/chess.ts index 7586e08..c7a5673 100644 --- a/src/lib/chess.ts +++ b/src/lib/chess.ts @@ -130,19 +130,25 @@ export const getIsPieceSacrifice = ( playedMove: string, bestLinePvToPlay: string[] ): boolean => { - if (playedMove.slice(2, 4) !== bestLinePvToPlay[0].slice(2, 4)) return false; + const exchangeSquare = playedMove.slice(2, 4); + if (bestLinePvToPlay[0].slice(2, 4) !== exchangeSquare) return false; const game = new Chess(fen); const whiteToPlay = game.turn() === "w"; const startingMaterialDifference = getMaterialDifference(fen); + game.move(uciMoveParams(playedMove)); - game.move(uciMoveParams(bestLinePvToPlay[0])); + for (const move of bestLinePvToPlay) { + if (move.slice(2, 4) !== exchangeSquare) break; + game.move(uciMoveParams(move)); + } + const endingMaterialDifference = getMaterialDifference(game.fen()); const materialDiff = endingMaterialDifference - startingMaterialDifference; const materialDiffPlayerRelative = whiteToPlay ? materialDiff : -materialDiff; - return materialDiffPlayerRelative < 0; + return materialDiffPlayerRelative < -1; }; export const getMaterialDifference = (fen: string): number => { diff --git a/src/lib/engine/helpers/moveClassification.ts b/src/lib/engine/helpers/moveClassification.ts index 54fa9b8..4c7174f 100644 --- a/src/lib/engine/helpers/moveClassification.ts +++ b/src/lib/engine/helpers/moveClassification.ts @@ -47,11 +47,13 @@ export const getMovesClassification = ( if ( isBrilliantMove( + lastPositionWinPercentage, positionWinPercentage, isWhiteMove, playedMove, bestLinePvToPlay, - fens[index - 1] + fens[index - 1], + lastPositionAlternativeLineWinPercentage ) ) { return { @@ -117,26 +119,34 @@ const getMoveBasicClassification = ( }; const isBrilliantMove = ( + lastPositionWinPercentage: number, positionWinPercentage: number, isWhiteMove: boolean, playedMove: string, bestLinePvToPlay: string[], - fen: string + fen: string, + lastPositionAlternativeLineWinPercentage: number | undefined ): boolean => { + if (!lastPositionAlternativeLineWinPercentage) return false; + + const winPercentageDiff = + (positionWinPercentage - lastPositionWinPercentage) * + (isWhiteMove ? 1 : -1); + if (winPercentageDiff < -2) return false; + const isPieceSacrifice = getIsPieceSacrifice( fen, playedMove, bestLinePvToPlay ); - if (!isPieceSacrifice) return false; const isNotLosing = isWhiteMove - ? positionWinPercentage > 50 - : positionWinPercentage < 50; + ? positionWinPercentage >= 50 + : positionWinPercentage <= 50; const isAlternateCompletelyWinning = isWhiteMove - ? positionWinPercentage > 70 - : positionWinPercentage < 30; + ? lastPositionAlternativeLineWinPercentage > 70 + : lastPositionAlternativeLineWinPercentage < 30; return isNotLosing && !isAlternateCompletelyWinning; }; @@ -152,7 +162,6 @@ const isGreatMove = ( const winPercentageDiff = (positionWinPercentage - lastPositionWinPercentage) * (isWhiteMove ? 1 : -1); - if (winPercentageDiff < -2) return false; const hasChangedGameOutcome = getHasChangedGameOutcome( @@ -167,7 +176,7 @@ const isGreatMove = ( isWhiteMove ); - return hasChangedGameOutcome && isTheOnlyGoodMove; + return hasChangedGameOutcome || isTheOnlyGoodMove; }; const getHasChangedGameOutcome = ( diff --git a/src/lib/lichess.ts b/src/lib/lichess.ts index 46ef28b..bb32569 100644 --- a/src/lib/lichess.ts +++ b/src/lib/lichess.ts @@ -36,23 +36,12 @@ export const getLichessEval = async ( })); lines.sort(sortLines); + const isWhiteToPlay = fen.split(" ")[1] === "w"; + if (!isWhiteToPlay) lines.reverse(); const bestMove = lines[0].pv[0]; const linesToKeep = lines.slice(0, multiPv); - const isWhiteToPlay = fen.split(" ")[1] === "w"; - - if (!isWhiteToPlay) { - return { - bestMove, - lines: linesToKeep.map((line) => ({ - ...line, - cp: line.cp ? -line.cp : line.cp, - mate: line.mate ? -line.mate : line.mate, - })), - }; - } - return { bestMove, lines: linesToKeep, diff --git a/src/sections/analysis/board/squareRenderer.tsx b/src/sections/analysis/board/squareRenderer.tsx index 98fbf9b..c123151 100644 --- a/src/sections/analysis/board/squareRenderer.tsx +++ b/src/sections/analysis/board/squareRenderer.tsx @@ -60,7 +60,7 @@ export default SquareRenderer; export const moveClassificationColors: Record = { [MoveClassification.Book]: "#d5a47d", [MoveClassification.Brilliant]: "#26c2a3", - [MoveClassification.Great]: "#749bbf", + [MoveClassification.Great]: "#4099ed", [MoveClassification.Best]: "#3aab18", [MoveClassification.Excellent]: "#3aab18", [MoveClassification.Good]: "#81b64c",