X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=6764bea714deaeceb6adc30559d6299fedda72f0;hb=82c76bd978d29f9ec59ccf37df741936e71f278b;hp=6645db166a7d7b3b69e7ad8991b418d9a1cc0979;hpb=84704f266e28a5bbb0e10a7282db30b9983b87ea;p=xboard.git diff --git a/backend.c b/backend.c index 6645db1..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); @@ -9746,9 +9764,9 @@ Pairing(int nr, int nPlayers, int *whitePlayer, int *blackPlayer, int *syncInter *whitePlayer = curRound; *blackPlayer = nPlayers - 1; // this is the 'bye' when nPlayer is odd } else { - *whitePlayer = curRound - pairingsPerRound + curPairing; + *whitePlayer = curRound - (nPlayers-1)/2 + curPairing; if(*whitePlayer < 0) *whitePlayer += nPlayers-1+(nPlayers&1); - *blackPlayer = curRound + pairingsPerRound - curPairing; + *blackPlayer = curRound + (nPlayers-1)/2 - curPairing; if(*blackPlayer >= nPlayers-1+(nPlayers&1)) *blackPlayer -= nPlayers-1+(nPlayers&1); } } else if(appData.tourneyType > 0) { @@ -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;