X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=6764bea714deaeceb6adc30559d6299fedda72f0;hb=869f98444437c60d1178e217db0a45530e37b945;hp=d04fd3d5193f68ee37f153dd53addd327e2576a3;hpb=0fd972d551d13b21ee43524c2e6d36691710b7ba;p=xboard.git diff --git a/backend.c b/backend.c index d04fd3d..6764bea 100644 --- a/backend.c +++ b/backend.c @@ -493,7 +493,7 @@ int nrCastlingRights; // For TwoKings, or to implement castling-unknown status int initialRulePlies, FENrulePlies; FILE *serverMoves = NULL; // next two for broadcasting (/serverMoves option) int loadFlag = 0; -int shuffleOpenings; +Boolean shuffleOpenings; int mute; // mute all sounds // [HGM] vari: next 12 to save and restore variations @@ -861,6 +861,7 @@ ReplaceEngine(ChessProgramState *cps, int n) appData.noChessProgram = FALSE; appData.clockMode = TRUE; InitEngine(cps, n); + UpdateLogos(TRUE); if(n) return; // only startup first engine immediately; second can wait savCps = cps; // parameter to LoadEngine passed as globals, to allow scheduled calling :-( LoadEngine(); @@ -1550,6 +1551,8 @@ InitBackEnd3 P((void)) if(f = fopen(appData.tourneyFile, "r")) { ParseArgsFromFile(f); // make sure tourney parmeters re known fclose(f); + appData.clockMode = TRUE; + SetGNUMode(); } else appData.tourneyFile[0] = NULLCHAR; // for now ignore bad tourney file } MatchEvent(TRUE); @@ -7133,6 +7136,15 @@ void SendProgramStatsToFrontend( ChessProgramState * cps, ChessProgramStats * cp SetProgramStats( &stats ); } +void +ClearEngineOutputPane(int which) +{ + static FrontEndProgramStats dummyStats; + dummyStats.which = which; + dummyStats.pv = "#"; + SetProgramStats( &dummyStats ); +} + #define MAXPLAYERS 500 char * @@ -7142,6 +7154,8 @@ TourneyStandings(int display) int score[MAXPLAYERS], ranking[MAXPLAYERS], points[MAXPLAYERS], games[MAXPLAYERS]; char result, *p, *names[MAXPLAYERS]; + if(appData.tourneyType < 0 && !strchr(appData.results, '*')) + return strdup(_("Swiss tourney finished")); // standings of Swiss yet TODO names[0] = p = strdup(appData.participants); while(p = strchr(p, '\n')) *p++ = NULLCHAR, names[++nPlayers] = p; // count participants @@ -7164,7 +7178,6 @@ TourneyStandings(int display) games[b]++; nr++; } - if(appData.tourneyType < 0) return strdup("Swiss tourney finished"); // standings of Swiss yet TODO if(appData.tourneyType > 0) nPlayers = appData.tourneyType; // in gauntlet, list only gauntlet engine(s) for(w=0; winitDone = TRUE; + ClearEngineOutputPane(cps == &second); } @@ -9642,6 +9659,7 @@ CreateTourney(char *name) return 0; } ASSIGN(appData.tourneyFile, name); + if(appData.tourneyType < 0) appData.defaultMatchGames = 1; // Swiss forces games/pairing = 1 if((f = WriteTourneyFile("")) == NULL) return 0; } fclose(f); @@ -9774,22 +9792,7 @@ NextTourneyGame(int nr, int *swapColors) InitTimeControls(); // TC might be altered from tourney file nPlayers = CountPlayers(appData.participants); // count participants - if(appData.tourneyType < 0 && appData.pairingEngine[0]) { - if(nr>=0 && !pairingReceived) { - char buf[1<<16]; - if(pairing.pr == NoProc) StartChessProgram(&pairing); - snprintf(buf, 1<<16, "results %d %s\n", nPlayers, appData.results); - SendToProgram(buf, &pairing); - snprintf(buf, 1<<16, "pairing %d\n", nr+1); - SendToProgram(buf, &pairing); - return 0; // wait for pairing engine to answer (which causes NextTourneyGame to be called again... - } - pairingReceived = 0; // ... so we continue here - syncInterval = nPlayers/2; *swapColors = 0; - appData.matchGames = appData.tourneyCycles * syncInterval - 1; - whitePlayer = savedWhitePlayer-1; blackPlayer = savedBlackPlayer-1; - matchGame = 1; roundNr = nr / syncInterval + 1; - } else + if(appData.tourneyType < 0) syncInterval = nPlayers/2; else *swapColors = Pairing(nr<0 ? 0 : nr, nPlayers, &whitePlayer, &blackPlayer, &syncInterval); if(syncInterval) { @@ -9804,6 +9807,29 @@ NextTourneyGame(int nr, int *swapColors) waitingForGame = FALSE; } + if(appData.tourneyType < 0) { + if(nr>=0 && !pairingReceived) { + char buf[1<<16]; + if(pairing.pr == NoProc) { + if(!appData.pairingEngine[0]) { + DisplayFatalError(_("No pairing engine specified"), 0, 1); + return 0; + } + StartChessProgram(&pairing); // starts the pairing engine + } + snprintf(buf, 1<<16, "results %d %s\n", nPlayers, appData.results); + SendToProgram(buf, &pairing); + snprintf(buf, 1<<16, "pairing %d\n", nr+1); + SendToProgram(buf, &pairing); + return 0; // wait for pairing engine to answer (which causes NextTourneyGame to be called again... + } + pairingReceived = 0; // ... so we continue here + *swapColors = 0; + appData.matchGames = appData.tourneyCycles * syncInterval - 1; + whitePlayer = savedWhitePlayer-1; blackPlayer = savedBlackPlayer-1; + matchGame = 1; roundNr = nr / syncInterval + 1; + } + if(first.pr != NoProc) return 1; // engines already loaded // redefine engines, engine dir, etc. @@ -9815,6 +9841,7 @@ NextTourneyGame(int nr, int *swapColors) InitEngine(&first, 0); // initialize ChessProgramStates based on new settings. InitEngine(&second, 1); CommonEngineInit(); // after this TwoMachinesEvent will create correct engine processes + UpdateLogos(FALSE); // leave display to ModeHiglight() return 1; } @@ -10247,11 +10274,13 @@ GameEnds(result, resultDetails, whosays) if(popupRequested) { // [HGM] crash: this calls GameEnds recursively through ExitEvent! Make it a harmless tail recursion. if(matchMode == TRUE) { // match through command line: exit with or without popup if(ranking) { + ToNrEvent(forwardMostMove); if(strcmp(ranking, "busy")) DisplayFatalError(ranking, 0, 0); else ExitEvent(0); } else DisplayFatalError(buf, 0, 0); } else { // match through menu; just stop, with or without popup matchMode = FALSE; appData.matchGames = matchGame = roundNr = 0; + ModeHighlight(); if(ranking){ if(strcmp(ranking, "busy")) DisplayNote(ranking); } else DisplayNote(buf); @@ -12830,7 +12859,7 @@ TwoMachinesEvent P((void)) gameMode = TwoMachinesPlay; pausing = FALSE; - ModeHighlight(); + ModeHighlight(); // [HGM] logo: this triggers display update of logos SetGameInfo(); DisplayTwoMachinesTitle(); firstMove = TRUE;