ultimatepp/uppdev/VegaTeam5/Newtournament.cpp
cxl 4a1c627474 Adding uppdev....
git-svn-id: svn://ultimatepp.org/upp/trunk@328 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-08-15 08:36:24 +00:00

520 lines
17 KiB
C++

#include "VegaMain.h"
#include "Tournament.h"
extern RoundData TD;
extern TeamArchive player[N_PLAYER_MAX+1];
extern VectorMap<String, TeamArchive> db;
bool Contains(const String& text, const String& substr)
{
for(const char *s = text; s <= text.End() - substr.GetLength(); s++)
if(strncmp(s, substr, substr.GetLength()) == 0)
return true;
return false;
}
int FilterSpace(int c)
{
if (c == ';' || c ==' ' || c == '.' || c == ',') return false;
else return c;
}
// check once more the inserted data and create a new tournament
// flag = 1 for a new torneo
// flag = 0 to modify it
// flag = 2 to export tournament
NewTournamentDlg::NewTournamentDlg(int option)
{ int i, j;
String dir;
// Label dv___30, dv___32, dv___34;
flag = option;
switch (flag)
{ case 0: CtrlLayout(*this, t_("Modify Tournament")); break;
case 1: CtrlLayout(*this, t_("New Tournament")); break;
case 2: CtrlLayout(*this, t_("Export Tournament")); break;
}
editTourn <<= TD.NAMETORNEO;
editPlace <<= TD.PLACETORNEO;
editFed <<= TD.HOSTFEDERATION;
editFed.Tip(t_("Federation FIDE code"));
editBeginDate <<= TD.DATATORNEO_B;
editBeginDate.Tip(t_("ddmmyyyy for FIDE\nyyyymmdd for USCF"));
editEndDate <<= TD.DATATORNEO_E;
editEndDate.Tip(t_("ddmmyyyy for FIDE\nyyyymmdd for USCF"));
btnIsFIDE <<= TD.IS_FIDE_TOURNAMENT;
btnIsFIDE.Tip(t_("Check it if pairing (swiss system)\nand rating calculation are made with\nthe FIDE rating"));
editArbiter <<= TD.ARBITER;
editBoards <<= 4;
editBoards.Tip( t_("Total number of players for each team") );
editSystem.Add("Round Robin Single");
editSystem.Add("Round Robin Double");
editSystem.Add("Swiss Dubov FIDE");
editSystem.Add("Swiss Vega");
editSystem.Add("Swiss USCF");
editSystem.Add("Swiss Lim FIDE");
switch (TD.PLAY_SYSTEM) {
case DUBOV: editSystem <<= "Swiss Dubov FIDE"; break;
case ROUND_ROBIN2: editSystem <<= "Round Robin Double"; break;
case ROUND_ROBIN: editSystem <<= "Round Robin Single"; break;
case VEGA: editSystem <<= "Swiss Vega"; break;
case USCF: editSystem <<= "Swiss USCF"; break;
case LIM: editSystem <<= "Swiss Lim FIDE"; break;
}
editFirstScore.Add("Sum points");
editFirstScore.Add("Match points");
if (TD.SCORE_TYPE == 1) editFirstScore <<= "Sum points";
else editFirstScore <<= "Match points";
editFirstScore.Tip("Sum points: sum of all points made by players\nMatch points: made by the team");
editScore.Add("0 - ½ - 1");
editScore.Add("0 - 1 - 3");
// editScore.Add("0 -0.4- 1");
editScore.Add("0 - 2 - 5");
if ( (int) (10*TD.DRAW)==4) editScore <<= "0 -0.4- 1";
else if ( (int) TD.WON==1 ) editScore <<= "0 - ½ - 1";
else if ( (int) TD.WON==3 ) editScore <<= "0 - 1 - 3";
else editScore <<= "0 - 2 - 5";
editRound <<= TD.NRounds;
editRound.Tip(t_("Max 20 rounds for Swiss System\nCalculated by Vega for round robin"));
editAccRound.Add("0");
editAccRound.Add("1");
editAccRound.Add("2");
editAccRound <<= AsString(TD.NAccRound);
//set the option button
for (i=1; i<=NUM_BTN; i++) {
Add(opt[i]);
opt[i].LeftPosZ(80, 130).TopPosZ(192 + (i-1)*20, 15);
opt[i].WhenAction = THISBACK1(AddTyebreak, i);
}
opt[1].SetLabel("Bucholz Cut 1");
opt[2].SetLabel("Bucholz Total");
opt[3].SetLabel("Bucholz Median");
opt[4].SetLabel("Sonneborn-Berger");
opt[5].SetLabel("Cumulative");
opt[6].SetLabel("Average Rating Opp.");
opt[7].SetLabel("Most Blacks");
opt[8].SetLabel("Most Wins");
opt[9].SetLabel("Av. Perf. Rat. Opp.");
for (j=1; j<=NUM_BTN; j++) {
if ( TD.tyebreakorder[j] ) opt[ TD.tyebreakorder[j] ] <<= true;
}
//set the arrayctrl with the selected tyebreak
collist.AddColumn("TB", t_("Selected Tie Breaks"), 18); //0
//current setting
for (j=1; j<=NUM_BTN; j++) {
if ( TD.tyebreakorder[j] == 1 ) collist.Add("1: Buccholz Cut 1");
else if ( TD.tyebreakorder[j] == 2 ) collist.Add("2: Buccholz Total");
else if ( TD.tyebreakorder[j] == 3 ) collist.Add("3: Buccholz Median");
else if ( TD.tyebreakorder[j] == 4 ) collist.Add("4: Sonneborn-Berger");
else if ( TD.tyebreakorder[j] == 5 ) collist.Add("5: Cumulative");
else if ( TD.tyebreakorder[j] == 6 ) collist.Add("6: Average Rat. Opp.");
else if ( TD.tyebreakorder[j] == 7 ) collist.Add("7: Most Blacks");
else if ( TD.tyebreakorder[j] == 8 ) collist.Add("8: Most Wins");
else if ( TD.tyebreakorder[j] == 9 ) collist.Add("9: Av. Perf. Rat. Opp.");
}
editTFN <<= TD.FILETORNEO;
editTFN.SetFilter(FilterSpace).MaxChars(8); //added filter
dir = TD.PATHDIR; // it has a final slash that should be removed
if ( dir.Right(1) == "\\" || dir.Right(1) == "/" )
dir.Remove( dir.GetLength() - 1, 1); // remove the final '\' or '/'
editDir <<= dir;
if (flag == 2) { // export tournament
Add(dv___30);
dv___30.SetLabel(t_("Export players in this")).SetAlign(ALIGN_RIGHT).SetInk(SLtRed).HSizePosZ(12, 368).TopPosZ(435, 19);
Add(dropRating);
dropRating.LeftPosZ(140, 88).TopPosZ(435, 19);
dropRating.Add(t_("FIDE"));
dropRating.Add(t_("National"));
dropRating.Add(t_("FIDE & Nat"));
dropRating <<= "FIDE";
Add(dv___32);
dv___32.SetLabel(t_("rating interval: Min")).SetAlign(ALIGN_CENTER).HSizePosZ(236, 168).TopPosZ(435, 19);
Add(edtmin);
edtmin.Min(0).Max(9999).LeftPosZ(340, 48).TopPosZ(435, 19);
Add(dv___34);
dv___34.SetLabel(t_("- Max ")).SetAlign(ALIGN_CENTER).HSizePosZ(396, 72).TopPosZ(435, 19);
Add(edtmax);
edtmax.Min(0).Max(9999).LeftPosZ(436, 48).TopPosZ(435, 19);
}
btnDir.WhenAction = THISBACK1(SetTournamentDir, dir);
btnClose <<= Breaker(999); //.WhenAction = THISBACK(Close);
if (flag == 2) btnDone.WhenAction = THISBACK(ExportDlg); // export tournament
else btnDone.WhenAction = THISBACK(DoneDlg);
}
void NewTournamentDlg::DoneDlg()
{ String e0, e1, ehf, e2, e2end, e6, es, e3, e4, e5, f1, oe;
int aux, nitem, a, j;
bool fd;
e0 = AsString(~editTourn);
if ( IsNull(TrimLeft( e0 )) ) {
PromptOK( t_("Set a name for the tournament") );
editTourn.SetFocus();
return;
}
e1 = AsString(~editPlace);
if ( IsNull(TrimLeft( e1 )) ) {
PromptOK( t_("Set the place/city of the tournament") );
editPlace.SetFocus();
return;
}
ehf = AsString(~editFed);
if ( IsNull(TrimLeft( ehf )) ) {
PromptOK( t_("Set the Federation FIDE code") );
editFed.SetFocus();
return;
}
e2 = AsString(~editBeginDate);
if ( IsNull(TrimLeft( e2 )) ) {
PromptOK( t_("Set the begin date") );
return;
}
e2end = AsString(~editEndDate);
if ( IsNull(TrimLeft( e2end )) ) {
PromptOK( t_("Set the end date") );
editEndDate.SetFocus();
return;
}
e6 = AsString(~editArbiter);
if ( IsNull(TrimLeft( e6 ) ) ) {
PromptOK( t_("Set the name of the arbiter") );
editArbiter.SetFocus();
return;
}
es = AsString(~editSystem);
if ( Contains(es, "Dubov")) aux = DUBOV; //1;
else if ( Contains(es, "Robin S")) aux = ROUND_ROBIN; //2;
else if ( Contains(es, "Vega")) aux = VEGA; //3;
else if ( Contains(es, "USCF")) aux = USCF; //4;
else if ( Contains(es, "Robin D")) aux = ROUND_ROBIN2; //5;
else if ( Contains(es, "Lim")) aux = LIM;
if (flag==0 && !TD.IS_SWISS && TD.PLAY_SYSTEM != aux && TD.IS_CLOSED_REGISTRATION) { // cannot change a round robin with another
Exclamation( t_("You cannot change Play system") );
return;
}
else if (flag==0 && TD.IS_SWISS
&& (aux == ROUND_ROBIN || aux == ROUND_ROBIN2) && TD.IS_CLOSED_REGISTRATION) { // cannot change a swiss with a round robin
Exclamation( t_("You cannot change Play system") );
return;
}
else TD.PLAY_SYSTEM = aux; //new tournament or trying to modify its setting
a = StrIntValue(AsString(~editRound));
oe = AsString(~editScore);
if ( oe == "0 - ½ - 1") { TD.WON = 1.0; TD.DRAW = 0.5;}
else if ( oe == "0 - 2 - 5") { TD.WON = 5.0; TD.DRAW = 2.0;}
else if ( oe == "0 - 1 - 3") { TD.WON = 3.0; TD.DRAW = 1.0;}
else { TD.WON = 1.0; TD.DRAW = 0.4;} // "0 -0.4- 5"
e4 = AsString(~editDir);
if ( IsNull(e4) ) {
PromptOK( t_("Set the tournament directory") );
btnDir.SetFocus();
return;
}
e5 = AsString(~editTFN);
if ( IsNull(TrimLeft( e5 )) ) {
PromptOK( t_("Set the Tournament File Name") );
editTFN.SetFocus();
return;
}
// set the tye break sort priority
nitem = collist.GetCount();
for (j=1; j<=nitem; j++) {
TD.tyebreakorder[j] = StrIntValue ( AsString(collist.Get(j-1, "TB")) );
}
for (j=nitem+1; j<=NUM_BTN; j++) TD.tyebreakorder[j] = 0; // set default value ATTENTO AL 10=nitemmax
fd = ~btnIsFIDE;
if (flag==0 && TD.IS_FIDE_TOURNAMENT != fd && TD.IS_CLOSED_REGISTRATION) { // avoid change of system when the tourn is started
Exclamation( t_("Change not permitted") );
return;
} else
TD.IS_FIDE_TOURNAMENT = fd;
//set values
TD.NAMETORNEO = e0;
TD.PLACETORNEO = e1;
TD.HOSTFEDERATION = ehf;
TD.DATATORNEO_B = e2;
TD.DATATORNEO_E = e2end;
TD.NRounds = a;
TD.NAccRound = StrIntValue(AsString(~editAccRound));
TD.PATHDIR = AsString(~editDir);
#ifdef PLATFORM_WIN32
TD.PATHDIR << "\\";
#endif
#ifdef PLATFORM_POSIX
TD.PATHDIR << "/";
#endif
TD.FILETORNEO = e5;
TD.ARBITER = e6;
TD.NEW_TORNEO = true;
#ifdef PLATFORM_WIN32
f1 = TD.PATHDIR + "www" + TD.FILETORNEO;
// mkdir(f1);
CreateDirectory (f1,NULL);
TD.PATHDIRWWW = TD.PATHDIR + "www" + TD.FILETORNEO + "\\";
#endif
#ifdef PLATFORM_POSIX
f1 = "mkdir " + TD.PATHDIR + "www" + TD.FILETORNEO;
system( f1 );
TD.PATHDIRWWW = TD.PATHDIR + "www" + TD.FILETORNEO + "/";
#endif
if (flag == 1) { // new tournament
TD.Reset();
TD.StartSystem(aux);
TD.PLAY_SYSTEM = aux;
}
//Exclamation( AsString(aux) );
Close();
}
void NewTournamentDlg::ExportDlg()
{ String e0, e1, ehf, e2, e2end, e6, es, e3, e4, e5, f1, oe, eb;
int aux, nitem, acc, a, i, j, min, max, flagrat, count=0, pl[N_PLAYER_MAX], tb[15];
double w, d;
bool fd;
e0 = AsString(~editTourn);
if ( IsNull(TrimLeft( e0 )) ) {
PromptOK( t_("Set a name for the tournament") );
return;
}
e1 = AsString(~editPlace);
if ( IsNull(TrimLeft( e1 )) ) {
PromptOK( t_("Set the place/city of the tournament") );
return;
}
ehf = AsString(~editFed);
if ( IsNull(TrimLeft( ehf )) ) {
PromptOK( t_("Set the Federation FIDE code") );
return;
}
e2 = AsString(~editBeginDate);
if ( IsNull(TrimLeft( e2 )) ) {
PromptOK( t_("Set the begin date") );
return;
}
e2end = AsString(~editEndDate);
if ( IsNull(TrimLeft( e2end )) ) {
PromptOK( t_("Set the end date") );
return;
}
e6 = AsString(~editArbiter);
if ( IsNull(TrimLeft( e6 )) ) {
PromptOK( t_("Set the name of the arbiter") );
return;
}
es = AsString(~editSystem);
if ( Contains(es, "Dubov")) aux = DUBOV; //1;
else if ( Contains(es, "Robin S")) aux = ROUND_ROBIN; //2;
else if ( Contains(es, "Vega")) aux = VEGA; //3;
else if ( Contains(es, "USCF")) aux = USCF; //4;
else if ( Contains(es, "Robin D")) aux = ROUND_ROBIN2; //5;
else if ( Contains(es, "Lim")) aux = LIM;
es = AsString( ~editFirstScore );
if ( Contains(es, "Sum")) TD.SCORE_TYPE = 1;
else if ( Contains(es, "Match")) TD.SCORE_TYPE = 2;
a = StrIntValue(AsString(~editRound));
oe = AsString(~editScore);
if ( oe == "0 - ½ - 1") { w = 1.0; d = 0.5;}
else if ( oe == "0 - 2 - 5") { w = 5.0; d = 2.0;}
else if ( oe == "0 - 1 - 3") { w = 3.0; d = 1.0;}
else { w = 1.0; d = 0.4;} // "0 -0.4- 5"
eb = AsString(~editBoards);
if ( IsNull(eb) ) {
PromptOK( t_("Set the number of player for each team") );
return;
}
e4 = AsString(~editDir);
if ( IsNull(e4) ) {
PromptOK( t_("Set the tournament directory") );
return;
}
e5 = AsString(~editTFN);
if ( IsNull(TrimLeft( e5 )) ) {
PromptOK( t_("Set the Tournament File Name") );
return;
}
// set the tye break sort priority
nitem = collist.GetCount();
for (j=1; j<=nitem; j++) {
TD.tyebreakorder[j] = StrIntValue ( AsString(collist.Get(j-1, "TB")) );
}
for (j=nitem+1; j<=NUM_BTN; j++) TD.tyebreakorder[j] = 0; // set default value ATTENTO AL 10=nitemmax
fd = ~btnIsFIDE;
acc = StrIntValue(AsString(~editAccRound));
#ifdef PLATFORM_WIN32
e4 << "\\";
#endif
#ifdef PLATFORM_POSIX
e4 << "/";
#endif
// retrieve information about what to export
min = StrIntValue(AsString ( ~edtmin) );
max = StrIntValue(AsString ( ~edtmax) );
if (min>max) {
Exclamation( t_("Set the rating interval") );
return;
}
oe = AsString(~dropRating);
if ( oe == "National" ) flagrat = 1;
else if (oe == "FIDE" ) flagrat = 2;
else flagrat = 3;
// now starts the export tournament
String stringa = e4 + e5 + ".veg";
FileIn in(stringa);
if ( in.IsOpen() ) {
in.Close();
Exclamation( t_("A file with the same name already exist!&Choose another name") );
return;
}
#ifdef PLATFORM_WIN32
f1 = e4 + "www" + TD.FILETORNEO;
// mkdir(f1);
CreateDirectory (f1,NULL);
#endif
#ifdef PLATFORM_POSIX
f1 = "mkdir " + e4 + "www" + TD.FILETORNEO;
system( f1 );
#endif
FileOut out(stringa);
String s;
s = VERSION; s << " # Do not edit this file!" ;
out.PutLine( s );
out.PutLine( e0 );
// out.PutLine( e1 );
// out.PutLine( ehf );
out.PutLine( NFormat("%-20.20s %s", e1, ehf ) );
out.PutLine( e2 + ", " + e2end);
out.PutLine( e6 );
out.PutLine( NFormat("%3.1f %3.1f", d, w ) );
// set the tye break sort priority
nitem = collist.GetCount();
for (j=1; j<=nitem; j++) {
tb[j] = StrIntValue ( AsString(collist.Get(j-1, "TB")) );
}
for (j=nitem+1; j<=NUM_BTN+1; j++) tb[j] = 0;
out.PutLine( NFormat(" %d %d %d %d %d %d %d %d %d %d",
tb[1], tb[2], tb[3], tb[4], tb[5], tb[6], tb[7], tb[8], tb[9], tb[10]) );
out.PutLine( e5 );
out.PutLine( NFormat("%d %d %d %d", a, aux, fd, acc) );
out.PutLine( NFormat("%d", 0) );
for (i=1; i<=TD.NPlayer; i++) // count player to export
{ if (flagrat==1 && (player[i].ratingnat>=min && player[i].ratingnat<=max) )
{ count++; pl[count]=i; }
if (flagrat==2 && (player[i].ratingfide>=min && player[i].ratingfide<=max) )
{ count++; pl[count]=i; }
if ( flagrat==3 &&
( (player[i].ratingfide>=min && player[i].ratingfide<=max) ||
(player[i].ratingnat>=min && player[i].ratingnat<=max)
) )
{ count++; pl[count]=i; }
}
out.PutLine( NFormat("%d", count) );
out.PutLine( "NAME; COUNTRY;BIRTHDAY;G;TITLE;IDFIDE;ELOFIDE; IDNAT;ELONAT;K;ISAVAL");
for (j=1; j<=count; j++)
{ i = pl[j];
String s;
s = NFormat( "%-25.25s;", player[i].name);
s << NFormat( "%3.3s;", player[i].country);
s << NFormat( "%8.8s;", player[i].data);
s << NFormat( "%s;", player[i].sex);
s << NFormat( "%3.3s;", player[i].codetitle);
s << NFormat( "%8d;", player[i].idfide);
s << NFormat( "%5d;", player[i].ratingfide);
s << NFormat( "%8d;", player[i].idnat);
s << NFormat( "%5d;", player[i].ratingnat);
s << NFormat( "%2d;", player[i].kcoeff);
s << NFormat( "%2s", player[i].isAvailable);
out.PutLine(s);
}
out.Close();
s = NFormat("Exported %d players", count);
Exclamation( s );
Close();
}
void NewTournamentDlg::SetTournamentDir( String dir)
{ String directory;
FileSel fs;
fs.dir <<= dir;
fs.ExecuteSelectDir();
directory = ~fs;
if ( !IsNull(directory) ) editDir <<= directory;
else if ( IsNull(~editDir) ) Exclamation( t_("You have not selected a directory"));
}
void NewTournamentDlg::AddTyebreak(int idbtn)
{ int checkstatus;
checkstatus = ~opt[idbtn];
if (checkstatus) { // button checked: ON
switch (idbtn)
{ case 1: collist.Add("1: Buccholz Cut 1"); break;
case 2: collist.Add("2: Buccholz Total"); break;
case 3: collist.Add("3: Buccholz Median"); break;
case 4: collist.Add("4: Sonneborn-Berger"); break;
case 5: collist.Add("5: Cumulative"); break;
case 6: collist.Add("6: Average Rat. Opp."); break;
case 7: collist.Add("7: Most Blacks"); break;
case 8: collist.Add("8: Most Wins"); break;
case 9: collist.Add("9: Av. Perf. Rat. Opp."); break;
}
}
else { // button uncked: OFF
for(int i = 0; i < collist.GetCount(); i++)
if( Contains(collist.Get(i, 0), AsString(idbtn) ) ) collist.Remove( i );
}
}