From 927444a010597d22ccb08fe3d5111bb92070cbbe Mon Sep 17 00:00:00 2001 From: Francisco Salgueiro Date: Fri, 10 Nov 2023 13:34:15 +0000 Subject: [PATCH] allow for reversed game analysis --- src-tauri/src/chess.rs | 23 +++++++++++++++---- src/bindings.ts | 2 +- .../panels/analysis/ReportModal.tsx | 8 +++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src-tauri/src/chess.rs b/src-tauri/src/chess.rs index eb661287..f84cf017 100644 --- a/src-tauri/src/chess.rs +++ b/src-tauri/src/chess.rs @@ -423,6 +423,7 @@ pub struct AnalysisOptions { pub fen: String, pub annotate_novelties: bool, pub reference_db: Option, + pub reversed: bool, } #[tauri::command] @@ -452,6 +453,10 @@ pub async fn analyze_game( fens.push(Fen::from_position(chess.clone(), EnPassantMode::Legal)); }); + if options.reversed { + fens.reverse(); + } + let mut novelty_found = false; for (i, fen) in fens.iter().enumerate() { @@ -463,7 +468,6 @@ pub async fn analyze_game( finished: false, }, )?; - let query = PositionQuery::exact_from_fen(&fen.to_string())?; process .set_options(EngineOptions { @@ -490,19 +494,28 @@ pub async fn analyze_game( _ => {} } } + analysis.push(current_analysis); + } + + if options.reversed { + analysis.reverse(); + fens.reverse(); + } + + for (i, analysis) in analysis.iter_mut().enumerate() { + let fen = &fens[i]; + let query = PositionQuery::exact_from_fen(&fen.to_string())?; if options.annotate_novelties && !novelty_found { if let Some(reference) = options.reference_db.clone() { - current_analysis.novelty = - !is_position_in_db(reference, query, state.clone()).await?; - if current_analysis.novelty { + analysis.novelty = !is_position_in_db(reference, query, state.clone()).await?; + if analysis.novelty { novelty_found = true; } } else { return Err(Error::MissingReferenceDatabase); } } - analysis.push(current_analysis); } app.emit_all( "report_progress", diff --git a/src/bindings.ts b/src/bindings.ts index 08b4813d..7c15cbb1 100644 --- a/src/bindings.ts +++ b/src/bindings.ts @@ -62,7 +62,7 @@ bestMovesPayload: "plugin:tauri-specta:best-moves-payload" /** user-defined types **/ -export type AnalysisOptions = { fen: string; annotateNovelties: boolean; referenceDb: string | null } +export type AnalysisOptions = { fen: string; annotateNovelties: boolean; referenceDb: string | null; reversed: boolean } export type BestMoves = { depth: number; score: Score; uciMoves: string[]; sanMoves: string[]; multipv: number; nps: number } export type BestMovesPayload = { bestLines: BestMoves[]; engine: string; tab: string } export type EngineOption = { name: string; value: string } diff --git a/src/components/panels/analysis/ReportModal.tsx b/src/components/panels/analysis/ReportModal.tsx index 052add06..23a823d8 100644 --- a/src/components/panels/analysis/ReportModal.tsx +++ b/src/components/panels/analysis/ReportModal.tsx @@ -39,6 +39,7 @@ function ReportModal({ engine: engines[0]?.path ?? "", millisecondsPerMove: 500, novelty: true, + reversed: true }, validate: { @@ -70,6 +71,7 @@ function ReportModal({ annotateNovelties: form.values.novelty, fen: initialFen, referenceDb, + reversed: form.values.reversed } ) .then((analysis) => { @@ -111,6 +113,12 @@ function ReportModal({ {...form.getInputProps("millisecondsPerMove")} /> + +