// Filename: Dograce.cpp #include // Provides floor, ceil #include "dogclass.h" #include "dograce.h" // Provides Dog class #include "unit1.h" // ***((*(*(**((*( CONSTRUCTOR/DESTRUCTOR *((*((*(*(**(( Dograce::Dograce(FILE* &ins) { int i; char *ugh; float rec; int dist; int index; AnsiString str,blah; header = " "; eatheader(ins); Form1->Label10->Caption = header; // get the Record Time from the header index = header.Pos('.'); ugh = header.c_str(); if (isdigit(ugh[index-2])) { str = AnsiString(header[index-2]); str += AnsiString(header[index-1]); str += AnsiString(header[index]); str += AnsiString(header[index+1]); str += AnsiString(header[index+2]); rec = str.ToDouble(); } else // needed incase there is a second decimal in header... { blah = header.SubString(index+1,160); index = blah.Pos('.'); str = AnsiString(blah[index-2]); str += AnsiString(blah[index-1]); str += AnsiString(blah[index]); str += AnsiString(blah[index+1]); str += AnsiString(blah[index+2]); rec = str.ToDouble(); } index = header.Pos("Distance"); str = AnsiString(header[index+9]); str += AnsiString(header[index+10]); str += AnsiString(header[index+11]); str += AnsiString(header[index+12]); dist = str.ToInt(); for (i=0;i<8;i++) { dog[i] = new Dog(rec,dist); score[i] = 0; // init score array } } // --------------------------- Dograce::~Dograce(void) { int i; for (i=0;i<8;i++) delete dog[i]; } //--------------------------------------------------- void Dograce::filldogs(FILE* &ins) { int i; for (i=0;i<8;i++) { dog[i]->getinfo(ins); if (!(Form1->RunPrefBox->Checked)) dog[i]->setinout('n'); if (!(Form1->ChargeBox->Checked)) dog[i]->setcharge(0.0); if (!(Form1->TimeBox->Checked)) dog[i]->setspeed(10.0); if (!(Form1->FrontBox->Checked)) dog[i]->setstyle('b'); if (!(Form1->BackBox->Checked)) dog[i]->setstyle('f'); } } //---------------------------------------------------- int Dograce::round(float num) { if ((num - (float)(floor(num))) < .5) return floor(num); else return ceil(num); } //---------------------------------------------------- void Dograce::getname(char *name[]) { int i; for (i=0;i<8;i++) name[i] = dog[i]->dogname; } //---------------------------------------------------- void Dograce::getscore(int score[]) { char tempch; int dognum,topgrade=15; int topspeed=25, topscore=0,difference=0; float topclose = -3.0; int addpts = 50,runpts = 0; // Points for grade for (dognum=0;dognum < 8;dognum++) if (dog[dognum]->grade() < topgrade) topgrade = dog[dognum]->grade(); while (topgrade < 16) { for (dognum=0;dognum < 8;dognum++) if (topgrade == dog[dognum]->grade()) score[dognum] += addpts; topgrade++; addpts-=10; } // Points for form for (dognum=0;dognum < 8;dognum++) { tempch = dog[dognum]->curform(); if ((tempch == 'g') || (tempch == 'G')) score[dognum] += 10; else if ((tempch == 'o') || (tempch == 'O')) score[dognum] -= 10; else if ((tempch == 'i') || (tempch == 'I')) score[dognum] += 5; } // Points for speed for (dognum=0;dognum < 8;dognum++) if (round(dog[dognum]->speed()) < topspeed) topspeed = round(dog[dognum]->speed()); for (dognum=0;dognum < 8;dognum++) score[dognum]+= 30 - (3*(round(dog[dognum]->speed()) - round(topspeed))); // Points for run style for (dognum=0;dognum < 8;dognum++) if ((dog[dognum]->runstyle() == 'f')||(dog[dognum]->runstyle() == 'F')) { if ((dog[dognum]->runpref() == 'i')||(dog[dognum]->runpref() == 'I')) { if ((dognum==0)||(dognum==1)) runpts= 10; else if (dognum==2) runpts= 5; else if (dognum==5) runpts= -5; else if ((dognum==6)||(dognum==7)) runpts= -10; } else if ((dog[dognum]->runpref()=='o')||(dog[dognum]->runpref()=='O')) { if ((dognum==0)||(dognum==1)) runpts= -10; else if (dognum==2) runpts= -5; else if (dognum==5) runpts= 5; else if ((dognum==6)||(dognum==7)) runpts= 10; } score[dognum]+= runpts; // STEP 2 ADJUSTMENTS if ((runpts < 0) && (dog[dognum]->earlyspeed() <= 6)) { if ((runpts == -10) && (dog[dognum]->earlyspeed() == 3)) score[dognum]-=5; else if ((runpts == -10) && (dog[dognum]->earlyspeed() >= 4)) score[dognum]-=10; else if ((runpts == -5) && (dog[dognum]->earlyspeed() >= 4)) score[dognum]-=5; } runpts = 0; } // BACK RUNNERS.... else if((dog[dognum]->runstyle() == 'b')||(dog[dognum]->runstyle() == 'B')) { score[dognum]+= (10 - round(dog[dognum]->oneeigth()) ); if (dog[dognum]->closingspeed() > topclose) topclose = dog[dognum]->closingspeed(); } for (dognum=0;dognum < 8;dognum++) if ((dog[dognum]->runstyle() == 'b')||(dog[dognum]->runstyle() == 'B')) score[dognum] += 20-round(10*(topclose - dog[dognum]->closingspeed())); // Points for Kennel??? // Adj Total for (dognum=0;dognum < 8;dognum++) if (score[dognum] > topscore) topscore = score[dognum]; difference = 100 - topscore; for (dognum=0;dognum < 8;dognum++) score[dognum]+= difference; } //---------------------------------------------------------------------- /// burn 3 lines of header... void Dograce::eatheader(FILE*& ins) { char ch = 'd'; while (ch != '\n') { ch = (char)fgetc(ins); header = header + AnsiString(ch); } ch = 'd'; while (ch != '\n') { ch = (char)fgetc(ins); header = header + AnsiString(ch); } ch = 'd'; while (ch != '\n') { ch = (char)fgetc(ins); header = header + AnsiString(ch); } ch = 'd'; while (ch != '\n') { ch = (char)fgetc(ins); header = header + AnsiString(ch); } ch = 'd'; // Line w/ the track Record below while (ch != '\n') { ch = (char)fgetc(ins); header = header + AnsiString(ch); } ch = 'd'; while (ch != '\n') { ch = (char)fgetc(ins); header = header + AnsiString(ch); } while (fgetc(ins) != '\n') {} while (fgetc(ins) != '\n') {} while (fgetc(ins) != '\n') {} } //------------------------------------------------- void Dograce::getinout(char inout[]) { int i; for (i=0;i<8;i++) inout[i] = dog[i]->runpref(); } //------------------------------------------------- void Dograce::getstyle(char style[]) { int i; for (i=0;i<8;i++) style[i] = dog[i]->runstyle(); } //------------------------------------------------- void Dograce::getspeed(float speed[]) { int i; for (i=0;i<8;i++) speed[i] = dog[i]->speed(); } //------------------------------------------------- void Dograce::getform(char form[]) { int i; for (i=0;i<8;i++) form[i] = dog[i]->curform(); } //------------------------------------------------- void Dograce::getclosing(float close[]) { int i; for (i=0;i<8;i++) close[i] = dog[i]->closingspeed(); } //------------------------------------------------- void Dograce::geteffgrade(AnsiString grade[]) { int i; for (i=0;i<8;i++) { switch(dog[i]->grade()) { case 1: { grade[i]="A+"; break; } case 2: { grade[i]="A"; break; } case 3: { grade[i]="A-"; break; } case 4: { grade[i]="B+"; break; } case 5: { grade[i]="B"; break; } case 6: { grade[i]="B-"; break; } case 7: { grade[i]="C+"; break; } case 8: { grade[i]="C"; break; } case 9: { grade[i]="C-"; break; } case 10: { grade[i]="D+"; break; } case 11: { grade[i]="D"; break; } case 12: { grade[i]="D-"; break; } case 13: { grade[i]="E+"; break; } case 14: { grade[i]="E"; break; } default: grade[i]="E-"; } } }