mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 22:02:58 -06:00
545 lines
15 KiB
C++
545 lines
15 KiB
C++
#include "VegaMain.h"
|
|
#include "Tournament.h"
|
|
|
|
////////////////// SECTION USCF Rating report ////////////////////////////////
|
|
|
|
USCFSectionReport::USCFSectionReport()
|
|
{ String str;
|
|
CtrlLayout(*this, "");
|
|
|
|
edit0 <<= TD.NAMETORNEO;
|
|
edit0.Tip("optional\n(can be empty)");
|
|
|
|
edit1 <<= "F";
|
|
edit1.Add("F");
|
|
edit1.Add("H");
|
|
edit1.Add("Q");
|
|
edit1.Tip("F full\nH half\nQ quick");
|
|
|
|
edit2 <<= "R";
|
|
edit2.Add("R");
|
|
edit2.Add("D");
|
|
edit2.Add("Q");
|
|
edit2.Tip("R regular\nD dual\nQ quick");
|
|
|
|
edit3 <<= "";
|
|
edit3.Tip("optional\n(can be empty)");
|
|
|
|
edit4 <<= "";
|
|
edit4.Tip("optional\n(can be empty)");
|
|
|
|
if (TD.PLAY_SYSTEM==ROUND_ROBIN ) str = "R";
|
|
// else if (PLAY_SYSTEM==ROUND_ROBIN2) strcpy(str, "D");
|
|
else str = "S";
|
|
edit5 <<= str;
|
|
edit5.Add("S");
|
|
edit5.Add("M");
|
|
edit5.Add("R");
|
|
edit5.Add("C");
|
|
edit5.Tip("S swiss system\nM match\nR round robin\nC cum swiss");
|
|
|
|
edit6 <<= AsString(TD.currentRound);
|
|
edit6.Disable();
|
|
|
|
edit7 <<= AsString(TD.NPlayer);
|
|
edit7.Disable();
|
|
|
|
edit8 <<= "VC";
|
|
edit8.Disable();
|
|
|
|
edit9 <<= "#";
|
|
edit9.Disable();
|
|
|
|
btnClose <<= THISBACK(Close);
|
|
btnDone <<= THISBACK(DoneCB);
|
|
}
|
|
|
|
|
|
void USCFSectionReport::DoneCB()
|
|
{ int i, j, index, rec_seq=1;
|
|
String stringa;
|
|
int *roundRes;
|
|
// short int *playerCol;
|
|
int *playerOpp;
|
|
|
|
FileOut out(TD.PATHDIR + "uscfsctn.txt");
|
|
|
|
out << NFormat("%d %d\n", TD.NPlayer, TD.currentRound);
|
|
|
|
// section file record
|
|
out << NFormat("%s\t", AsString(~edit0));
|
|
out << NFormat("%s\t", AsString(~edit1));
|
|
out << NFormat("%s\t", AsString(~edit2));
|
|
out << NFormat("%s\t", AsString(~edit3));
|
|
out << NFormat("%s\t", AsString(~edit4));
|
|
out << NFormat("%s\t", AsString(~edit5));
|
|
out << NFormat("%s\t", AsString(~edit6));
|
|
out << NFormat("%s\t", AsString(~edit7));
|
|
out << "???????\t";
|
|
out << NFormat("%s\t", AsString(~edit8));
|
|
out << NFormat("%s\t", AsString(~edit9));
|
|
out << "\n"; // close the section record
|
|
|
|
// detail file records
|
|
if (TD.IS_SWISS) {
|
|
playerOpp = &TD.playerOpponent[0][0];
|
|
roundRes = &TD.roundResult[0][0];
|
|
}
|
|
else { playerOpp = &TD.playerOpponentRR[0][0];
|
|
roundRes = &TD.roundResultRR[0][0];
|
|
}
|
|
|
|
if (TD.currentRound>10) rec_seq=2;
|
|
for (i=1; i<=TD.NPlayer; i++)
|
|
{
|
|
out << NFormat("\t%d\t%d\t%d", i, rec_seq, player[i].idnat);
|
|
for(j=1; j<=TD.currentRound; j++)
|
|
{ if (TD.IS_SWISS) index = i*(N_ROUND_MAX+1) + j;
|
|
else index = i*(N_ROUND_MAX_RR+1) + j;
|
|
|
|
if (playerOpp[index]==0 && roundRes[index]==3) { //BYE: 1F - 0
|
|
out << "\tB 0";
|
|
}
|
|
else if (playerOpp[index]==0 && roundRes[index]==4) { //lost unplayed game: BYE: 0 - 1F
|
|
out << "\tF 0";
|
|
}
|
|
else if (playerOpp[index]==0 && (roundRes[index]==6 || roundRes[index]==8)) { //for BYE: XF
|
|
out << "\tH 0";
|
|
}
|
|
else if (playerOpp[index]!=0 ) {
|
|
if (roundRes[index]==0) out << NFormat("\tL%4d", playerOpp[index]);
|
|
else if (roundRes[index]==4) out << "\tF 0";
|
|
else if (roundRes[index]==1) out << NFormat("\tW%4d", playerOpp[index]);
|
|
else if (roundRes[index]==3) out << "\tX 0";
|
|
else if (roundRes[index]==2) out << NFormat( "\tD%4d", playerOpp[index]);
|
|
else if (roundRes[index]==6 || roundRes[index]==8) out << "\tZ 0";
|
|
}
|
|
else out << "\tU 0"; //default case: unplayed
|
|
}
|
|
out << "\n";
|
|
}
|
|
out.Close();
|
|
Close();
|
|
}
|
|
////////////////// TOURNAMENT USCF Rating report collect sections ////////////////////////////////
|
|
|
|
USCFReport::USCFReport()
|
|
{
|
|
CtrlLayout(*this, "Tournament Report");
|
|
Ndirectory = max_rounds = 0;
|
|
|
|
btnOpen.Tip("Read the list of the sections");
|
|
btnSave.Tip("Save the list of the sections");
|
|
btnAdd.Tip("Select a tournament section");
|
|
btnRemove.Tip("Remove the selected section");
|
|
|
|
btnAdd.WhenAction = THISBACK(AddCB);
|
|
btnRemove.WhenAction = THISBACK(RemoveCB);
|
|
btnOpen.WhenAction = THISBACK(OpenFileCB);
|
|
btnSave.WhenAction = THISBACK(SaveFileCB);
|
|
btnClose.WhenAction = THISBACK(Close);
|
|
btnDone.WhenAction = THISBACK(DoneCB);
|
|
}
|
|
|
|
|
|
void USCFReport::OpenFileCB()
|
|
{ String line, name;
|
|
int i;
|
|
|
|
#ifdef PLATFORM_WIN32
|
|
name = TD.PATHVEGAPRG + "\\" + "savedpath.txt";
|
|
#endif
|
|
#ifdef PLATFORM_POSIX
|
|
name = TD.PATHVEGAPRG + "/" + "savedpath.txt";
|
|
#endif
|
|
|
|
FileIn in(name);
|
|
if (in) {
|
|
list.Clear();
|
|
line = in.GetLine();
|
|
Ndirectory = StrIntValue(line);
|
|
for(i=1; i<=Ndirectory; i++)
|
|
{ line = in.GetLine();
|
|
list.Add(line);
|
|
}
|
|
in.Close();
|
|
}
|
|
else Exclamation("I can't read the file");
|
|
}
|
|
|
|
void USCFReport::SaveFileCB()
|
|
{ String name;
|
|
int i;
|
|
|
|
if (Ndirectory<1) {
|
|
Exclamation("There aren't Sections to save");
|
|
return; // nothing to retrive
|
|
}
|
|
|
|
#ifdef PLATFORM_WIN32
|
|
name = TD.PATHVEGAPRG + "\\" + "savedpath.txt";
|
|
#endif
|
|
#ifdef PLATFORM_POSIX
|
|
name = TD.PATHVEGAPRG + "/" + "savedpath.txt";
|
|
#endif
|
|
|
|
FileOut out(name);
|
|
out << Ndirectory << "\n";
|
|
for(i=1; i<=Ndirectory; i++) out << AsString( list.Get(i-1) ) << "\n";
|
|
out.Close();
|
|
}
|
|
|
|
void USCFReport::RemoveCB()
|
|
{
|
|
int ans, i=list.GetCursor();
|
|
|
|
if (Ndirectory < 1 || i < 0) return;
|
|
ans = PromptYesNo("Do you want to remove the selected section?");
|
|
if (ans == 1 ) list.Remove( i );
|
|
Ndirectory--;
|
|
}
|
|
|
|
|
|
void USCFReport::AddCB()
|
|
{ String stringa, directory;
|
|
FileSel fs;
|
|
if (Ndirectory) fs.dir <<= AsString(list.Get(Ndirectory - 1)); //start with the last directory
|
|
fs.ExecuteSelectDir();
|
|
directory = ~fs;
|
|
if ( !IsNull(directory) ) {
|
|
list.Add(directory);
|
|
Ndirectory++;
|
|
}
|
|
else Exclamation( t_("You have not selected a directory"));
|
|
}
|
|
|
|
void USCFReport::DoneCB()
|
|
{ String s, str, name, stringa;
|
|
int i, n, rounds;
|
|
String bdate, edate, listfile[20];
|
|
|
|
// Ndirectory = list.GetColumnItems();
|
|
if (Ndirectory<1)
|
|
{ Exclamation("Please select at least one section!");
|
|
return;
|
|
}
|
|
for(i=1; i<=Ndirectory; i++) { // legge i file dei singoli tornei
|
|
#ifdef PLATFORM_WIN32
|
|
name = AsString(list.Get(i-1)) + "\\" + "uscfsctn.txt";
|
|
#endif
|
|
#ifdef PLATFORM_POSIX
|
|
name = AsString(list.Get(i-1)) + "/" + "uscfsctn.txt";
|
|
#endif
|
|
listfile[i] = name; // remind the section files
|
|
|
|
FileIn in(name);
|
|
if (in) {
|
|
Vector<String> field = Split( in.GetLine(), ' ', true);
|
|
n = StrIntValue(field[0]);
|
|
rounds = StrIntValue(field[1]);
|
|
if (rounds>max_rounds) max_rounds=rounds;
|
|
in.Close();
|
|
}
|
|
else Exclamation("I can't read the &" + name + " &Please generate it");
|
|
}
|
|
Close();
|
|
USCFTournamentReport USCFreport(Ndirectory, max_rounds, listfile);
|
|
USCFreport.Execute();
|
|
}
|
|
|
|
////////////////// TOURNAMENT USCF Rating report generator ////////////////////////////////
|
|
|
|
|
|
USCFTournamentReport::USCFTournamentReport(int SectionNumber, int max_r, String listfile[])
|
|
{ int i;
|
|
CtrlLayout(*this, "");
|
|
Ndirectory = SectionNumber;
|
|
max_rounds = max_r;
|
|
String str, strdate;
|
|
|
|
for (i=1; i<=SectionNumber; i++) filesection[i] = listfile[i];
|
|
|
|
edit0.AutoFormat(false);
|
|
edit0.Tip("enter Year, Month and Day:\nyymmdd (six digit!)");
|
|
edit2 <<= Ndirectory;
|
|
edit3.Tip("yyyymmdd");
|
|
edit4.Tip("yyyymmdd");
|
|
edit5 <<= 0;
|
|
edit9 <<= "USA";
|
|
|
|
edit10 <<= "T";
|
|
edit10.Add("T");
|
|
edit10.Add("A");
|
|
edit10.Add("N");
|
|
edit10.Tip("T tournament director\nA affiliate\nN do not send cross tables");
|
|
|
|
edit11 <<= "N";
|
|
edit11.Add("Y");
|
|
edit11.Add("N");
|
|
edit11.Tip("Y scholastic\nN non scholastic");
|
|
|
|
btnDone.WhenAction = THISBACK(DoneCB);
|
|
btnClose.WhenAction = THISBACK(Close);
|
|
}
|
|
|
|
|
|
void USCFTournamentReport::DoneCB()
|
|
{ int i, j, n, rounds, k, S_DTLREC01=1;
|
|
String bdate, edate, stringa, s, f1;
|
|
String currdir, string;
|
|
|
|
#ifdef PLATFORM_WIN32
|
|
currdir = TD.PATHVEGAPRG + "\\";
|
|
#endif
|
|
#ifdef PLATFORM_POSIX
|
|
currdir = TD.PATHVEGAPRG + "/";
|
|
#endif
|
|
|
|
FileOut out(currdir + "thexport.txt");
|
|
if (out.IsError())
|
|
{ Exclamation("Cannot save the Tournament Header File");
|
|
return;
|
|
}
|
|
/*
|
|
H_EVENT_ID,C,9 yymmddccc
|
|
H_NAME,C,35
|
|
H_TOT_SECT,N,2,0 # sections
|
|
H_BEG_DATE,D MM/DD/YYYY
|
|
H_END_DATE,D MM/DD/YYYY
|
|
H_RCV_DATE,D N/A
|
|
H_ENT_DATE,D N/A
|
|
H_AFF_ID,C,8 affiliate
|
|
H_CITY,C,21
|
|
H_STATE,C,2
|
|
H_ZIPCODE,C,10 nnnnn or nnnnn-nnnn
|
|
H_COUNTRY,C,21 "USA" (optional?)
|
|
H_SENDCROS,C,1 T, A, N (TD, Aff, none)
|
|
H_SCHOLAST,C,1 Y, N (scholastic, non)
|
|
H_SECREC01,N,7,0 "1" section record number if more than one event
|
|
*/
|
|
|
|
out << "15\n";
|
|
out << "H_EVENT_ID C 9\n";
|
|
out << "H_NAME C 35\n";
|
|
out << "H_TOT_SECT N 2\n";
|
|
out << "H_BEG_DATE D 8\n";
|
|
out << "H_END_DATE D 8\n";
|
|
out << "H_RCV_DATE D 8\n";
|
|
out << "H_ENT_DATE D 8\n";
|
|
out << "H_AFF_ID C 8\n";
|
|
out << "H_CITY C 21\n";
|
|
out << "H_STATE C 2\n";
|
|
out << "H_ZIPCODE C 10\n";
|
|
out << "H_COUNTRY C 21\n";
|
|
out << "H_SENDCROS C 1\n";
|
|
out << "H_SCHOLAST C 1\n";
|
|
out << "H_SECREC01 N 7\n";
|
|
|
|
string = NFormat("%06d", StrIntValue(AsString( ~edit0 )));
|
|
if ( string.GetLength() < 6) {
|
|
Exclamation( "Please fills the Event ID field with 6 digits" );
|
|
out.Close();
|
|
return;
|
|
} else out << string + "001\t";
|
|
|
|
string = TrimLeft(AsString(~edit1));
|
|
if ( string.GetLength() < 1) {
|
|
Exclamation( "There can't be empty fields!&Please fill all fields with some value");
|
|
out.Close();
|
|
return;
|
|
} else out << string + "\t";
|
|
|
|
string = TrimLeft(AsString(~edit2));
|
|
if ( string.GetLength() < 1) {
|
|
Exclamation( "There can't be empty fields!&Please fill all fields with some value");
|
|
out.Close();
|
|
return;
|
|
} else out << string + "\t";
|
|
|
|
string = TrimLeft(AsString(~edit3));
|
|
if ( string.GetLength() < 8) {
|
|
Exclamation( "Set a correct begin date");
|
|
out.Close();
|
|
return;
|
|
} else out << string + "\t";
|
|
|
|
string = TrimLeft(AsString(~edit4));
|
|
if ( string.GetLength() < 8) {
|
|
Exclamation( "Set a correct end date");
|
|
out.Close();
|
|
return;
|
|
} else out << string + "\t";
|
|
|
|
out << "\t\t"; // RCV_DATE e ENT_DATE
|
|
|
|
string = TrimLeft(AsString(~edit5));
|
|
if ( string.GetLength() < 1) {
|
|
Exclamation( "There can't be empty fields!&Please fill all fields with some value");
|
|
out.Close();
|
|
return;
|
|
} else out << string + "\t";
|
|
|
|
string = TrimLeft(AsString(~edit6));
|
|
if ( string.GetLength() < 1) {
|
|
Exclamation( "There can't be empty fields!&Please fill all fields with some value");
|
|
out.Close();
|
|
return;
|
|
} else out << string + "\t";
|
|
|
|
string = TrimLeft(AsString(~edit7));
|
|
if ( string.GetLength() < 1) {
|
|
Exclamation( "There can't be empty fields!&Please fill all fields with some value");
|
|
out.Close();
|
|
return;
|
|
} else out << string + "\t";
|
|
|
|
string = TrimLeft(AsString(~edit8));
|
|
if ( string.GetLength() < 1) {
|
|
Exclamation( "There can't be empty fields!&Please fill all fields with some value");
|
|
out.Close();
|
|
return;
|
|
} else out << string + "\t";
|
|
|
|
string = TrimLeft(AsString(~edit9));
|
|
if ( string.GetLength() < 1) {
|
|
Exclamation( "There can't be empty fields!&Please fill all fields with some value");
|
|
out.Close();
|
|
return;
|
|
} else out << string + "\t";
|
|
|
|
string = AsString(~edit10);
|
|
out << string + "\t";
|
|
|
|
string = AsString(~edit11);
|
|
out << string + "\t";
|
|
|
|
out << "1\n"; //SECREC01
|
|
out.Close();
|
|
|
|
// generate Tournament Section File
|
|
/*
|
|
S_EVENT_ID,C,9 same as H_EVENT_ID
|
|
S_SEC_NUM,C,2 1-n
|
|
S_SEC_NAME,C,10 (optional)
|
|
S_K_FACTOR,C,1 F, Q (full, quick) ### test H (half)
|
|
S_R_SYSTEM,C,1 R, Q (regular, quick) ### test D (dual)
|
|
S_CTD_ID,C,8 (optional)
|
|
S_ATD_ID,C,8 (optional)
|
|
S_TRN_TYPE,C,1 S, R, M, C (swiss, round robin, match, cum swiss)
|
|
S_TOT_RNDS,N,2,0 Max 20. For R, enter # players
|
|
S_LST_PAIR,N,4,0 Last pairing number for section
|
|
S_DTLREC01,N,7,0 "1" for section 1, previous section's S_LST_PAIR + S_DTLREC01
|
|
S_OPER,C,2 XX (disk) ### test UU (??)
|
|
S_STATUS,C,1 "#"
|
|
*/
|
|
|
|
out.Open(currdir + "tsexport.txt");
|
|
if (out.IsError())
|
|
{ Exclamation("Cannot save the Tournament Section File");
|
|
return;
|
|
}
|
|
out << "13\n";
|
|
out << "S_EVENT_ID C 9\n";
|
|
out << "S_SEC_NUM C 2\n";
|
|
out << "S_SEC_NAME C 10\n";
|
|
out << "S_K_FACTOR C 1\n";
|
|
out << "S_R_SYSTEM C 1\n";
|
|
out << "S_CTD_ID C 8\n";
|
|
out << "S_ATD_ID C 8\n";
|
|
out << "S_TRN_TYPE C 1\n";
|
|
out << "S_TOT_RNDS N 2\n";
|
|
out << "S_LST_PAIR N 4\n";
|
|
out << "S_DTLREC01 N 7\n";
|
|
out << "S_OPER C 2\n";
|
|
out << "S_STATUS C 1\n";
|
|
|
|
for(i=1; i<=Ndirectory; i++) {
|
|
String s, s1, s2, sss;
|
|
int l, lsss;
|
|
FileIn in(filesection[i]);
|
|
if (in) {
|
|
Vector<String> field = Split( in.GetLine(), ' ', true);
|
|
n = StrIntValue(field[0]);
|
|
rounds = StrIntValue(field[1]);
|
|
sss = in.GetLine();
|
|
lsss = sss.GetLength();
|
|
l = sss.Find("???????");
|
|
s1 = sss.Mid(0,l);
|
|
s2 = sss.Mid(l+7,lsss-l+7);
|
|
|
|
s = NFormat("%s%d%s", s1, S_DTLREC01, s2); // remove '???????'
|
|
out << NFormat("%s001\t%d\t", NFormat("%06d", StrIntValue(AsString( ~edit0 ))), i);
|
|
out << s + "\n";
|
|
|
|
in.Close();
|
|
S_DTLREC01 += n;
|
|
}
|
|
else { Exclamation("I can't read the uscfsctn.txt file");
|
|
return;
|
|
}
|
|
}
|
|
out.Close();
|
|
|
|
// generate Tournament Detail File
|
|
|
|
/*
|
|
D_EVENT_ID,C,9 same as H_EVENT_ID
|
|
D_SEC_NUM,C,2
|
|
D_PAIR_NUM,C,4 1-n
|
|
D_REC_SEQ,C,1 if rds 1-10 "1", 11-20 "2"
|
|
D_MEM_ID,C,8 (optional)
|
|
D_RND01,C,5 W=win D=draw L=loss
|
|
D_RND02,C,5 X= Forfeit win Z= Forfeit draw F= forfeit loss
|
|
D_RND03,C,5 B= 1 pt bye H= 1/2 pt bye U= unplayed game
|
|
D_RND04,C,5 Cnnnn, where n is pair num left-padded with space
|
|
D_RND05,C,5 Unplayed C...0
|
|
D_RND06,C,5 No round ....0
|
|
D_RND07,C,5 (all optional)
|
|
D_RND08,C,5
|
|
D_RND09,C,5
|
|
D_RND10,C,5
|
|
*/
|
|
|
|
stringa = currdir + "tdexport.txt";
|
|
out.Open(stringa);
|
|
if (out.IsError())
|
|
{ Exclamation("Cannot save the Tournament Detail File");
|
|
return;
|
|
}
|
|
out << 5 + max_rounds << "\n";
|
|
out << "D_EVENT_ID C 9\n";
|
|
out << "D_SEC_NUM C 2\n";
|
|
out << "D_PAIR_NUM C 4\n";
|
|
out << "D_REC_SEQ C 1\n";
|
|
out << "D_MEM_ID C 8\n";
|
|
for (k=1; k<=max_rounds; k++) out << NFormat("D_RND%02d C 5\n", k);
|
|
|
|
for(i=1; i<=Ndirectory; i++) {
|
|
//stringa = PATHDIR[i] + "uscfsctn.txt"; //built the whole file name
|
|
FileIn in(filesection[i]);
|
|
if ( in ) {
|
|
Vector<String> field = Split( in.GetLine(), ' ', true);
|
|
n = StrIntValue(field[0]);
|
|
rounds = StrIntValue(field[1]);
|
|
in.GetLine(); // skip second row
|
|
for (j=1; j<=n; j++) {
|
|
out << NFormat("%06d", StrIntValue(AsString( ~edit0 ))) + "001\t" ;
|
|
//TrimLeft(AsString(~edit0)) + "001\t";
|
|
out << i;
|
|
s = in.GetLine();
|
|
out << s;
|
|
for (k=rounds+1; k<=max_rounds; k++) out << "\t 0";
|
|
out << "\n";
|
|
}
|
|
in.Close();
|
|
}
|
|
else { Exclamation("I can't read the uscfsctn.txt file");
|
|
return;
|
|
}
|
|
}
|
|
out.Close();
|
|
|
|
f1 = currdir + "convert.exe";
|
|
system(f1);
|
|
Close();
|
|
}
|