Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Tools/DynamicTeamTactic/TacticEntry.cpp

Go to the documentation of this file.
00001 /**
00002  * @file TacticEntry.cpp
00003  * 
00004  * Declaration of class TacticEntry
00005  * @author <A href=mailto:b@tchman.de>Mathias Hülsbusch</A>
00006  * @author <A href=mailto:frank.rossdeutscher@uni-dortmund.de>Frank Rossdeutscher</A>
00007  */ 
00008 
00009 #include "TacticEntry.h"
00010 #include "Platform/GTAssert.h"
00011 
00012 
00013 TacticEntry::TacticEntry() 
00014 {
00015   followingEntryCount = 0;
00016   sprintf(name,"noname");
00017 }
00018 
00019 TacticEntry::TacticEntry(int folEntCount) 
00020 {
00021   followingEntryCount = folEntCount;
00022   if (followingEntryCount > 0) {
00023     followingEntrys       = new int[followingEntryCount];
00024     followingEntryWeights = new double[followingEntryCount];
00025   }
00026   sprintf(name,"noname");
00027 }
00028 
00029 TacticEntry::~TacticEntry() 
00030 {
00031   if (followingEntryCount > 0) {
00032     delete[] followingEntrys;
00033     delete[] followingEntryWeights;
00034   }
00035 }
00036 
00037 void TacticEntry::setFollowingEntryCount(int count)
00038 {
00039   if (followingEntryCount > 0) {
00040     delete[] followingEntrys;
00041     delete[] followingEntryWeights;
00042   }
00043   followingEntryCount = count;
00044   if (followingEntryCount > 0) {
00045     followingEntrys       = new int[followingEntryCount];
00046     followingEntryWeights = new double[followingEntryCount];
00047   }
00048 }
00049 
00050 
00051 
00052 
00053 TacticEntryArray::TacticEntryArray() 
00054 {
00055   entryCount = 0;
00056 }
00057 
00058 TacticEntryArray::TacticEntryArray(int count) 
00059 {
00060   entryCount = count;
00061   // creating new entries
00062   if (entryCount > 0)
00063     entrys = new TacticEntry[entryCount];
00064 }
00065 
00066 TacticEntryArray::~TacticEntryArray() 
00067 {
00068   if (entryCount > 0)
00069     delete[] entrys;
00070 }
00071 
00072 void TacticEntryArray::setEntryCount(int count)
00073 {
00074   if (entryCount > 0)
00075     delete[] entrys;
00076   entryCount = count;
00077   // creating new entries
00078   if (entryCount > 0)
00079     entrys = new TacticEntry[entryCount];
00080 }
00081 
00082 
00083 
00084 In& operator>>(In& stream,TacticEntryArray& tacticEntryArray)
00085 {
00086   unsigned int chunkid;
00087   int chunksize;
00088   int entryIdx      = -1;
00089   int readPlayerNum =  0;
00090   int readGANum     =  0;
00091   char* tmpstr = new char[50];
00092   while (!stream.eof()) {
00093     stream >> chunkid;
00094     stream >> chunksize;
00095 
00096     switch (chunkid) {
00097 
00098       case 0x00414554 : // "TEA\0" TacticEntryArray
00099       {
00100         // deleting old entries
00101         if (tacticEntryArray.entryCount > 0)
00102           delete[] tacticEntryArray.entrys;
00103 
00104         // reading the number of entries
00105         stream >> tacticEntryArray.entryCount;
00106 
00107         // reading the number of playerNumbers
00108         stream >> readPlayerNum;
00109 
00110         // creating new entries
00111         if (tacticEntryArray.entryCount > 0)
00112           tacticEntryArray.entrys = new TacticEntry[tacticEntryArray.entryCount];
00113 
00114         // setting entrie "pointer" before first entry
00115         entryIdx = -1;
00116       } break;
00117 
00118       case 0x00544E45 : // "ENT\0" Entry
00119       {
00120         ++entryIdx; // point to the next tacticEntry
00121         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00122       } break;
00123 
00124       case 0x00504F4E : // "NOP\0" neededOptions
00125       {
00126         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00127         int i;
00128         for (i = 0; i < readPlayerNum; ++i)
00129         {
00130           stream >> tmpstr;
00131           if (i < Player::numOfPlayerNumbers)
00132             tacticEntryArray.entrys[entryIdx].neededOptions[i] =
00133                                                    RateableOptions::getOptionID(tmpstr);
00134         }
00135         // if we read not enough entries fill the rest with doNothing
00136         for (i = readPlayerNum; i < Player::numOfPlayerNumbers; ++i)
00137           tacticEntryArray.entrys[entryIdx].neededOptions[i] =
00138                                                    RateableOptions::doNothing;
00139 
00140         // generating isOptionClass Array
00141         for (i = 0; i < Player::numOfPlayerNumbers; ++i)
00142           tacticEntryArray.entrys[entryIdx].isOptionClass[i] =
00143             RateableOptions::isOptionClass(
00144                                tacticEntryArray.entrys[entryIdx].neededOptions[i]);
00145       } break;
00146 
00147       case 0x00474441 : // "ADG\0" allowedDogs
00148       {
00149         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00150         int i,j;
00151         bool tmpbool;
00152         for (i = 0; i < readPlayerNum; ++i)
00153           for (j = 0; j < readPlayerNum; ++j)
00154           {
00155             stream.read(&tmpbool,sizeof(bool));
00156             if ((i < Player::numOfPlayerNumbers) && (j < Player::numOfPlayerNumbers))
00157               tacticEntryArray.entrys[entryIdx].allowedDogs[i][j] = tmpbool;
00158           }
00159         // if we read not enough entries fill the rest with true
00160         for (i = 0; i < Player::numOfPlayerNumbers; ++i)
00161           for (j = 0; j < Player::numOfPlayerNumbers; ++j)
00162             if ((i >= readPlayerNum) || (j >= readPlayerNum))
00163               tacticEntryArray.entrys[entryIdx].allowedDogs[i][j] = true;
00164       } break;
00165 
00166       case 0x00544757 : // "WGT\0" weight
00167       {
00168         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00169         stream >> tacticEntryArray.entrys[entryIdx].weight;
00170       } break;
00171 
00172       case 0x0047574F : // "OWG\0" optionWeights
00173       {
00174         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00175         int i;
00176         double tmpdouble;
00177         for (i = 0; i < readPlayerNum; ++i)
00178         {
00179           stream >> tmpdouble;
00180           if (i < Player::numOfPlayerNumbers)
00181             tacticEntryArray.entrys[entryIdx].optionWeights[i] = tmpdouble;
00182         }
00183         // if we read not enough entries fill the rest with doNothing
00184         for (i = readPlayerNum; i < Player::numOfPlayerNumbers; ++i)
00185           tacticEntryArray.entrys[entryIdx].optionWeights[i] = 0.0;
00186       } break;
00187 
00188       case 0x0056584D : // "MXV\0" maxVal
00189       {
00190         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00191         stream >> tacticEntryArray.entrys[entryIdx].maxVal;
00192       } break;
00193 
00194       case 0x00434546 : // "FEC\0" followingEntryCount
00195       {
00196         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00197         if (tacticEntryArray.entrys[entryIdx].followingEntryCount > 0) {
00198           delete[] tacticEntryArray.entrys[entryIdx].followingEntrys;
00199           delete[] tacticEntryArray.entrys[entryIdx].followingEntryWeights;
00200         }
00201         stream >> tacticEntryArray.entrys[entryIdx].followingEntryCount;
00202         if (tacticEntryArray.entrys[entryIdx].followingEntryCount > 0) {
00203           tacticEntryArray.entrys[entryIdx].followingEntrys =
00204             new int[tacticEntryArray.entrys[entryIdx].followingEntryCount];
00205           tacticEntryArray.entrys[entryIdx].followingEntryWeights =
00206             new double[tacticEntryArray.entrys[entryIdx].followingEntryCount];
00207         }
00208       } break;
00209 
00210       case 0x004E4546 : // "FEN\0" followingEntrys
00211       {
00212         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00213         int i;
00214         for (i = 0; i < tacticEntryArray.entrys[entryIdx].followingEntryCount; ++i)
00215           stream >> tacticEntryArray.entrys[entryIdx].followingEntrys[i];
00216       } break;
00217 
00218       case 0x00574546 : // "FEW\0" followingEntryWeights
00219       {
00220         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00221         int i;
00222         for (i = 0; i < tacticEntryArray.entrys[entryIdx].followingEntryCount; ++i)
00223           stream >> tacticEntryArray.entrys[entryIdx].followingEntryWeights[i];
00224       } break;
00225 
00226       case 0x00434147 : // "GAC\0" globalAnalysersCount
00227       {
00228         stream >> readGANum;
00229       } break;
00230 
00231       case 0x00494147 : // "GAI\0" globalAnalysersInfo
00232       {
00233         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00234         int i,tmpint;
00235         for (i = 0; i < readGANum; ++i)
00236         {
00237           stream >> tmpint;
00238           if (i < RateableOptions::numOfGlobalAnalysers)
00239             tacticEntryArray.entrys[entryIdx].globalAnalysersInfo[i] =
00240               (RateableOptions::TacticEntryTypeID)tmpint;
00241         }
00242         // if we read not enough entries fill the rest with 0
00243         for (i = readGANum; i < RateableOptions::numOfGlobalAnalysers; ++i)
00244           tacticEntryArray.entrys[entryIdx].globalAnalysersInfo[i] =
00245   RateableOptions::getGlobalAnalyserNeutralTETID((RateableOptions::GlobalAnalyserID)i);
00246 
00247       } break;
00248 
00249       case 0x004D414E : // "NAM\0" name
00250       {
00251         ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00252         stream >> tacticEntryArray.entrys[entryIdx].name;
00253       } break;
00254 
00255 
00256       default :
00257       {
00258         stream.skip(chunksize); 
00259       }
00260 
00261     } // switch
00262   } // while
00263 
00264   delete[] tmpstr;
00265 
00266   return stream;
00267 }
00268 
00269 Out& operator<<(Out& stream, const TacticEntryArray& tacticEntryArray)
00270 {
00271   stream << (unsigned int) 0x00414554;            // "TEA\0"
00272   stream << (int)(2 * sizeof(int));               // "size of chunk"
00273   
00274   // writing the number of entries
00275   stream << tacticEntryArray.entryCount;
00276   
00277   // writing the number of playerNumbers
00278   stream << (int)(Player::numOfPlayerNumbers);
00279 
00280   // writing the entries ..
00281   for (int i = 0; i < tacticEntryArray.entryCount; ++i) {
00282     int j,k,tmp;
00283 
00284     stream << (unsigned int) 0x00544E45;                       // "ENT\0" Entry
00285     stream << (int) 0;                                         // "size of chunk"
00286   
00287     stream << (unsigned int) 0x00504F4E;                       // "NOP\0" neededOptions
00288     tmp = Player::numOfPlayerNumbers * 4;                      // die strings werden mit einem führenden int abgespeichert
00289     for (j = 0; j < Player::numOfPlayerNumbers; ++j)           
00290       tmp += strlen(RateableOptions::getOptionName(
00291                                        tacticEntryArray.entrys[i].neededOptions[j]));
00292     stream << tmp;                                             // "size of chunk"
00293 
00294     for (j = 0; j < Player::numOfPlayerNumbers; ++j) 
00295       stream << RateableOptions::getOptionName(
00296                                    tacticEntryArray.entrys[i].neededOptions[j]);
00297     
00298     stream << (unsigned int) 0x00474441;                       // "ADG\0" allowedDogs
00299     stream << (int)((Player::numOfPlayerNumbers*
00300                      Player::numOfPlayerNumbers ) * sizeof(bool)); // "size of chunk"
00301 
00302     // there are some warnings when using streaming ops for bool, so we use the
00303     // read/write methods
00304     for (j = 0; j < Player::numOfPlayerNumbers; ++j) 
00305       for (k = 0; k < Player::numOfPlayerNumbers; ++k) 
00306         stream.write(&(tacticEntryArray.entrys[i].allowedDogs[j][k]),sizeof(bool));
00307 
00308     stream << (unsigned int) 0x00544757;                       // "WGT\0" weight
00309     stream << (int)(sizeof(double));                           // "size of chunk"
00310     stream << tacticEntryArray.entrys[i].weight;
00311 
00312     stream << (unsigned int) 0x0047574F;                          // "OWG\0" optionWeights
00313     stream << (int)(Player::numOfPlayerNumbers * sizeof(double)); // "size of chunk"
00314 
00315     for (j = 0; j < Player::numOfPlayerNumbers; ++j) 
00316       stream << tacticEntryArray.entrys[i].optionWeights[j];
00317 
00318     stream << (unsigned int) 0x0056584D;                       // "MXV\0" maxVal
00319     stream << (int)(sizeof(double));                           // "size of chunk"
00320     stream << tacticEntryArray.entrys[i].maxVal;
00321 
00322     stream << (unsigned int) 0x00434546;                       // "FEC\0" followingOptionCount
00323     stream << (int)(sizeof(int));                              // "size of chunk"
00324     stream << tacticEntryArray.entrys[i].followingEntryCount;
00325 
00326     stream << (unsigned int) 0x004E4546;                       // "FEN\0" followingEntries
00327     stream << (int)(tacticEntryArray.entrys[i].followingEntryCount * sizeof(int));
00328 
00329     for (j = 0; j < tacticEntryArray.entrys[i].followingEntryCount; ++j) 
00330       stream << tacticEntryArray.entrys[i].followingEntrys[j];
00331     
00332     stream << (unsigned int) 0x00574546;                          // "FEW\0" optionWeights
00333     stream << (int)(tacticEntryArray.entrys[i].followingEntryCount * sizeof(double)); // "size of chunk"
00334 
00335     for (j = 0; j < tacticEntryArray.entrys[i].followingEntryCount; ++j) 
00336       stream << tacticEntryArray.entrys[i].followingEntryWeights[j];
00337 
00338     stream << (unsigned int) 0x00434147;                       // "GAC\0" globalAnalysersCount
00339     stream << (int)(sizeof(int));                              // "size of chunk"
00340     stream << RateableOptions::numOfGlobalAnalysers;
00341 
00342     stream << (unsigned int) 0x00494147;                       // "GAI\0" globalAnalysersInfo
00343     stream << (int)(RateableOptions::numOfGlobalAnalysers * sizeof(int)); // "size of chunk"
00344 
00345     for (j = 0; j < RateableOptions::numOfGlobalAnalysers; ++j) 
00346       stream << tacticEntryArray.entrys[i].globalAnalysersInfo[j];
00347 
00348     stream << (unsigned int) 0x004D414E;                       // "NAM\0" name
00349     tmp = 4 + strlen(tacticEntryArray.entrys[i].name);         // die strings werden mit einem führenden int abgespeichert
00350     stream << tmp;                                             // "size of chunk"
00351 
00352     stream << tacticEntryArray.entrys[i].name;
00353 
00354   }
00355 
00356 
00357   return stream;
00358 } 
00359 
00360 /*
00361  * Change log :
00362  * $Log: TacticEntry.cpp,v $
00363  * Revision 1.3  2004/07/22 22:38:35  kerdels
00364  * added DTT used by Open Challenge, RIP and Xabsl-Options will follow
00365  *
00366  *
00367  */
00368 

Generated on Thu Sep 23 19:57:37 2004 for GT2004 by doxygen 1.3.6