//
// Matthew E. Moses
//
-// $Revision: 1.12 $
-// $Date: 2002/07/02 00:02:40 $
+// $Revision: 1.11 $
+// $Date: 1998/09/10 19:57:17 $
//
-// $Author: tridge $
+// $Author: mlong $
// $Locker: $
//
// $Log: Tourney.cc,v $
-// Revision 1.12 2002/07/02 00:02:40 tridge
-// - fixed compile on g++ 2.96
-// - updated for lasker 'rmatch'
-//
// Revision 1.11 1998/09/10 19:57:17 mlong
// lots of little bug fixes and a few new features
//
//
//--------------------------------------------------------------------------
-//static char RCSid[] = "$Id: Tourney.cc,v 1.12 2002/07/02 00:02:40 tridge Exp $";
+//static char RCSid[] = "$Id: Tourney.cc,v 1.11 1998/09/10 19:57:17 mlong Exp $";
#include "Tourney.hh"
#include "Mamer.hh"
lastCshouted = 0;
status = NEW;
+ paused = FALSE;
}
//- Deconstructor ---------------------------------------------------------
i=0;
while((tp = playerIter.Next())) {
(tp->activeFlag) ? tp->sortValue = (tp->score + tp->rating/10000.0) : tp->sortValue = -1.0;
- tp->ClearWhites();
- tp->ClearBlacks();
+ // tp->ClearWhites();
+ // tp->ClearBlacks();
if((status == OPEN) && (i < (GetPlayerCount()/2)))
(i % 2) ? tp->AddWhite() : tp->AddBlack();
i++;
//- CloseAndStart ----------------------------------------------------------
void Tourney::CloseAndStart(void) {
+ TourneyPlayers *tp = NULL;
status = CLOSED;
params.currentRound = 0;
+ LinkListIter<TourneyPlayers> playerIter(playerList);
+
startDate = time(0);
cout << "tourney started at: " << ctime(&startDate) << endl;
// this is to stop a 4 player tourney from having 2 rounds
params.rounds = (params.rounds < MINIMUM_ROUNDS) ? MINIMUM_ROUNDS : params.rounds;
+ playerIter.Reset(); // [HGM] this code moved here from SortPlayers
+ while((tp = playerIter.Next())) {
+ tp->ClearWhites();
+ tp->ClearBlacks();
+ tp->ClearTotalWhites();
+ tp->ClearTotalBlacks();
+ }
+
MakeAssignments();
TellThemWhoTheyPlay(); // tell them who they play
}
playerIter.Reset();
while((opponent = playerIter.Next())) {
if(strcmp(tp->name, opponent->name) && (tp->activeFlag !=0)) { // If this isn't MY name & I am active
- if((!tp->AlreadyPlayed(opponent->name)) && (!opponent->IsPaired()) && (opponent->activeFlag != 0)) {
+ if((!tp->AlreadyPlayed(opponent->name)) && (!opponent->IsPaired()) && (opponent->activeFlag != 0)
+ && (tp->ColorDue() != opponent->ColorDue() // they are due different color, never a problem
+ || tp->ColorDue() ? // both are due white. Check if one of them could accept black without breaking 'absolute' color rules
+ tp->GetConsecutiveBlacks() < 2 &&
+ tp->GetTotalBlacks() - tp->GetTotalWhites() < 2 ||
+ opponent->GetConsecutiveBlacks() < 2 &&
+ opponent->GetTotalBlacks() - opponent->GetTotalWhites() < 2
+ : // both are due black. Check if any of them can accept white
+ tp->GetConsecutiveWhites() < 2 &&
+ tp->GetTotalWhites() - tp->GetTotalBlacks() < 2 ||
+ opponent->GetConsecutiveWhites() < 2 &&
+ opponent->GetTotalWhites() - opponent->GetTotalBlacks() < 2
+ )
+ ) {
// and I haven't played this person and this person is active. (not forfeited)
t = GetSortPlayer(opponent->name);
score = ((abs(t->value - (me->value + offset))) * 1000);
Game *g = NULL;
Player *opp1 = NULL, *opp2 = NULL;
+ cerr << "P1: " << p1->name << " due=" << p1->ColorDue() << " total=" << p1->GetTotalWhites() << "/" << p1->GetTotalBlacks()
+ << " consecutive=" << p1->GetConsecutiveWhites() << "/" << p1->GetConsecutiveBlacks() << endl;
+ cerr << "P2: " << p2->name << " due=" << p2->ColorDue() << " total=" << p2->GetTotalWhites() << "/" << p2->GetTotalBlacks()
+ << " consecutive=" << p2->GetConsecutiveWhites() << "/" << p2->GetConsecutiveBlacks() << endl;
if(params.mode != 'r') { rated = 0; }
if(intcmp(p1->ColorDue(), p2->ColorDue()) != 0) {
if(p1->ColorDue()) { p1Color = 1; }
while((opp2 = opponentIter2.Next())) {
if(!strcasecmp(opp2->name, p1->name)) { break; }
}
+ cerr << "assigned color = " << p1Color << endl;
if(p1Color) {
p1->AddWhite(); p2->AddBlack();
opp1->value = 1;
status = DONE;
}//- End EndTourney
+//- IsPaused --------------------------------------------------------
+int Tourney::IsPaused(void) {
+ return paused;
+}
+
+//- SetPause -----------------------
+void Tourney::SetPause(int x) {
+ paused = x;
+}//- End SetPause
+
//- Announce ----------------------------------------------------------
void Tourney::Announce(void) {
char temp[128];
while((g = gameIter.Next())) {
/* note that we rely on rmatch and on the ; separated commands from lasker */
+ sleep(2);
gMamer.XServerCom("rmatch %s %s %i %i %c %s white ; rmatch %s %s %i %i %c %s black\n",
g->whiteName, g->blackName, g->time, g->inc, params.mode, Variant,
g->blackName, g->whiteName, g->time, g->inc, params.mode, Variant);