X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=c830d4ee972020f724c530520f26d1a6e426cf8c;hb=c3dccf9e44678d2c0330f28dccdb7ec8fca9e593;hp=28d40009867e5039945dfaac0675607c2cd4e4ed;hpb=d799da343a7c2b6aff3d676f63093d4831ba3976;p=xboard.git diff --git a/backend.c b/backend.c index 28d4000..c830d4e 100644 --- a/backend.c +++ b/backend.c @@ -222,6 +222,7 @@ int Pairing P((int nr, int nPlayers, int *w, int *b, int *sync)); FILE *WriteTourneyFile P((char *results, FILE *f)); void DisplayTwoMachinesTitle P(()); static void ExcludeClick P((int index)); +void ToggleSecond P((void)); #ifdef WIN32 extern void ConsoleCreate(); @@ -269,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 @@ -2509,6 +2511,14 @@ PlotSeekAd (int i) } void +PlotSingleSeekAd (int i) +{ + DrawSeekOpen(); + PlotSeekAd(i); + DrawSeekClose(); +} + +void AddAd (char *handle, char *rating, int base, int inc, char rated, char *type, int nr, Boolean plot) { char buf[MSG_SIZ], *ext = ""; @@ -2528,7 +2538,7 @@ AddAd (char *handle, char *rating, int base, int inc, char rated, char *type, i seekNrList[nrOfSeekAds] = nr; zList[nrOfSeekAds] = 0; seekAdList[nrOfSeekAds++] = StrSave(buf); - if(plot) PlotSeekAd(nrOfSeekAds-1); + if(plot) PlotSingleSeekAd(nrOfSeekAds-1); } } @@ -2592,6 +2602,7 @@ DrawSeekGraph () h = BOARD_HEIGHT * (squareSize + lineGap) + lineGap; w = BOARD_WIDTH * (squareSize + lineGap) + lineGap; + DrawSeekOpen(); DrawSeekBackground(0, 0, w, h); DrawSeekAxis(hMargin, h-1-vMargin, w-5, h-1-vMargin); DrawSeekAxis(hMargin, h-1-vMargin, hMargin, 5); @@ -2616,6 +2627,7 @@ DrawSeekGraph () } } for(i=0; i= strlen(buf)) return FALSE; // sanity lastX = x; lastY = y; @@ -5462,12 +5482,12 @@ LoadMultiPV (int x, int y, char *buf, int index, int *start, int *end) do{ while(buf[index] && buf[index] != '\n') index++; } while(buf[index] == '\n' && buf[index+1] == '\\' && buf[index+2] == ' ' && index++); // join kibitzed PV continuation line buf[index] = 0; - if(lineStart == 0 && gameMode == AnalyzeMode && (multi = MultiPV(&first)) >= 0) { - int n = first.option[multi].value; + if(lineStart == 0 && gameMode == AnalyzeMode && (multi = MultiPV(cps)) >= 0) { + int n = cps->option[multi].value; if(origIndex > 17 && origIndex < 24) { if(n>1) n--; } else if(origIndex > index - 6) n++; snprintf(buf2, MSG_SIZ, "option MultiPV=%d\n", n); - if(first.option[multi].value != n) SendToProgram(buf2, &first); - first.option[multi].value = n; + if(cps->option[multi].value != n) SendToProgram(buf2, cps); + cps->option[multi].value = n; *start = *end = 0; return FALSE; } else if(strstr(buf+lineStart, "exclude:") == buf+lineStart) { // exclude moves clicked @@ -6219,7 +6239,7 @@ ExcludeOneMove (int fromY, int fromX, int toY, int toX, char promoChar, char sta // inform engine snprintf(buf, MSG_SIZ, "%sclude ", state == '+' ? "in" : "ex"); CoordsToComputerAlgebraic(fromY, fromX, toY, toX, promoChar, buf+8); - SendToProgram(buf, &first); + SendToBoth(buf); return (state == '+'); } @@ -6232,16 +6252,16 @@ ExcludeClick (int index) if(index < 13) { // none: include all WriteMap(0); // clear map for(i=0; i 18) { // tail if(exclusionHeader[19] == '-') { // tail was excluded - SendToProgram("include all\n", &first); + SendToBoth("include all\n"); WriteMap(0); // clear map completely // now re-exclude selected moves for(i=0; i= 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); + if(n == 1) SwapEngines(n); + if(n == 0 && *appData.secondChessProgram == NULLCHAR) { + SwapEngines(1); // set second same as first if not yet set (to suppress WB startup dialog) + ParseArgsFromString(buf); + } + return 1; +} + +int SetPlayer (int player, char *p) { // [HGM] find the engine line of the partcipant given by number, and parse its options. int i; @@ -10943,6 +11022,11 @@ AutoPlayGameLoop () } } +void +AnalyzeNextGame() +{ + ReloadGame(1); // next game +} int AutoPlayOneMove () @@ -10964,7 +11048,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(); @@ -11808,6 +11899,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; } @@ -12201,7 +12295,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) { @@ -13295,6 +13392,7 @@ PauseEvent () WhiteOnMove(forwardMostMove))) { StopClocks(); } + case AnalyzeMode: pausing = TRUE; ModeHighlight(); break; @@ -13329,8 +13427,25 @@ EditTagsEvent () } void +ToggleSecond () +{ + if(second.analyzing) { + SendToProgram("exit\n", &second); + second.analyzing = FALSE; + } else { + if (second.pr == NoProc) StartChessProgram(&second); + InitChessProgram(&second, FALSE); + FeedMovesToProgram(&second, currentMove); + + SendToProgram("analyze\n", &second); + second.analyzing = TRUE; + } +} + +void AnalyzeModeEvent () { + if (gameMode == AnalyzeMode) { ToggleSecond(); return; } if (appData.noChessProgram || gameMode == AnalyzeMode) return; @@ -13928,8 +14043,8 @@ ExitAnalyzeMode () DisplayMessage("",_("Close ICS engine analyze...")); } if (first.analysisSupport && first.analyzing) { - SendToProgram("exit\n", &first); - first.analyzing = FALSE; + SendToBoth("exit\n"); + first.analyzing = second.analyzing = FALSE; } thinkOutput[0] = NULLCHAR; } @@ -14514,6 +14629,7 @@ ForwardInner (int target) gameMode == Training || gameMode == PlayFromGameFile || gameMode == AnalyzeFile) { while (currentMove < target) { + if(second.analyzing) SendMoveToProgram(currentMove, &second); SendMoveToProgram(currentMove++, &first); } } else { @@ -14625,10 +14741,14 @@ BackwardInner (int target) if(moveList[i-1][1] == '@' && moveList[i-1][0] == '@') break; } SendBoard(&first, i); - for(currentMove=i; currentMove