X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=564b95ea45faed2ac146d4ce9cf6bcbc8617c30a;hb=0a568b08637f0de830db645352ea96b6a1bcf866;hp=6442bea2c47f9cc261907b07d3ef99da6929c16b;hpb=025a668716d9220ada1d2e3b6b87c8517ac7899a;p=xboard.git diff --git a/backend.c b/backend.c index 6442bea..564b95e 100644 --- a/backend.c +++ b/backend.c @@ -270,6 +270,7 @@ char lastMsg[MSG_SIZ]; ChessSquare pieceSweep = EmptySquare; ChessSquare promoSweep = EmptySquare, defaultPromoChoice; int promoDefaultAltered; +int keepInfo = 0; /* [HGM] to protect PGN tags in auto-step game analysis */ /* States for ics_getting_history */ #define H_FALSE 0 @@ -7101,6 +7102,9 @@ LeftClick (ClickType clickType, int xPix, int yPix) return; } doubleClick = FALSE; + if(gameMode == AnalyzeMode && pausing && first.excludeMoves) { // use pause state to exclude moves + doubleClick = TRUE; gatingPiece = boards[currentMove][y][x]; + } fromX = x; fromY = y; toX = toY = -1; if(!appData.oneClick || !OnlyMove(&x, &y, FALSE) || // even if only move, we treat as normal when this would trigger a promotion popup, to allow sweep selection @@ -10202,9 +10206,10 @@ GetEngineLine (char *s, int n) char buf[MSG_SIZ]; extern char *icsNames; if(!s || !*s) return 0; - NamesToList(n == 10 ? icsNames : firstChessProgramNames, command, mnemonic, "all"); + NamesToList(n >= 10 ? icsNames : firstChessProgramNames, command, mnemonic, "all"); for(i=1; mnemonic[i]; i++) if(!strcmp(s, mnemonic[i])) break; if(!mnemonic[i]) return 0; + if(n == 11) return 1; // just testing if there was a match snprintf(buf, MSG_SIZ, "-%s %s", n == 10 ? "icshost" : "fcp", command[i]); if(n == 1) SwapEngines(n); ParseArgsFromString(buf); @@ -11007,6 +11012,11 @@ AutoPlayGameLoop () } } +void +AnalyzeNextGame() +{ + ReloadGame(1); // next game +} int AutoPlayOneMove () @@ -11028,7 +11038,14 @@ AutoPlayOneMove () } if (currentMove >= forwardMostMove) { - if(gameMode == AnalyzeFile) { ExitAnalyzeMode(); SendToProgram("force\n", &first); } + if(gameMode == AnalyzeFile) { + if(appData.loadGameIndex == -1) { + GameEnds(EndOfFile, NULL, GE_FILE); + ScheduleDelayedEvent(AnalyzeNextGame, 10); + } else { + ExitAnalyzeMode(); SendToProgram("force\n", &first); + } + } // gameMode = EndOfGame; // ModeHighlight(); @@ -11872,6 +11889,9 @@ LoadGame (FILE *f, int gameNumber, char *title, int useList) gn = 1; } else { + if(gameMode == AnalyzeFile && appData.loadGameIndex == -1) + appData.loadGameIndex = 0; // [HGM] suppress error message if we reach file end after auto-stepping analysis + else DisplayError(_("Game number out of range"), 0); return FALSE; } @@ -12265,7 +12285,10 @@ LoadGame (FILE *f, int gameNumber, char *title, int useList) if (oldGameMode == AnalyzeFile || oldGameMode == AnalyzeMode) { + appData.loadGameIndex = -1; // [HGM] order auto-stepping through games + keepInfo = 1; AnalyzeFileEvent(); + keepInfo = 0; } if (!matchMode && pos > 0) { @@ -13359,6 +13382,7 @@ PauseEvent () WhiteOnMove(forwardMostMove))) { StopClocks(); } + case AnalyzeMode: pausing = TRUE; ModeHighlight(); break; @@ -15053,6 +15077,8 @@ SetGameInfo () ChessMove r = GameUnfinished; char *p = NULL; + if(keepInfo) return; + if(gameMode == EditGame) { // [HGM] vari: do not erase result on EditGame r = gameInfo.result; p = gameInfo.resultDetails;