00001
00002
00003
00004
00005
00006
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
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
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 :
00099 {
00100
00101 if (tacticEntryArray.entryCount > 0)
00102 delete[] tacticEntryArray.entrys;
00103
00104
00105 stream >> tacticEntryArray.entryCount;
00106
00107
00108 stream >> readPlayerNum;
00109
00110
00111 if (tacticEntryArray.entryCount > 0)
00112 tacticEntryArray.entrys = new TacticEntry[tacticEntryArray.entryCount];
00113
00114
00115 entryIdx = -1;
00116 } break;
00117
00118 case 0x00544E45 :
00119 {
00120 ++entryIdx;
00121 ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00122 } break;
00123
00124 case 0x00504F4E :
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
00136 for (i = readPlayerNum; i < Player::numOfPlayerNumbers; ++i)
00137 tacticEntryArray.entrys[entryIdx].neededOptions[i] =
00138 RateableOptions::doNothing;
00139
00140
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 :
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
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 :
00167 {
00168 ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00169 stream >> tacticEntryArray.entrys[entryIdx].weight;
00170 } break;
00171
00172 case 0x0047574F :
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
00184 for (i = readPlayerNum; i < Player::numOfPlayerNumbers; ++i)
00185 tacticEntryArray.entrys[entryIdx].optionWeights[i] = 0.0;
00186 } break;
00187
00188 case 0x0056584D :
00189 {
00190 ASSERT((entryIdx < tacticEntryArray.entryCount) && (entryIdx >= 0));
00191 stream >> tacticEntryArray.entrys[entryIdx].maxVal;
00192 } break;
00193
00194 case 0x00434546 :
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 :
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 :
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 :
00227 {
00228 stream >> readGANum;
00229 } break;
00230
00231 case 0x00494147 :
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
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 :
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 }
00262 }
00263
00264 delete[] tmpstr;
00265
00266 return stream;
00267 }
00268
00269 Out& operator<<(Out& stream, const TacticEntryArray& tacticEntryArray)
00270 {
00271 stream << (unsigned int) 0x00414554;
00272 stream << (int)(2 * sizeof(int));
00273
00274
00275 stream << tacticEntryArray.entryCount;
00276
00277
00278 stream << (int)(Player::numOfPlayerNumbers);
00279
00280
00281 for (int i = 0; i < tacticEntryArray.entryCount; ++i) {
00282 int j,k,tmp;
00283
00284 stream << (unsigned int) 0x00544E45;
00285 stream << (int) 0;
00286
00287 stream << (unsigned int) 0x00504F4E;
00288 tmp = Player::numOfPlayerNumbers * 4;
00289 for (j = 0; j < Player::numOfPlayerNumbers; ++j)
00290 tmp += strlen(RateableOptions::getOptionName(
00291 tacticEntryArray.entrys[i].neededOptions[j]));
00292 stream << tmp;
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;
00299 stream << (int)((Player::numOfPlayerNumbers*
00300 Player::numOfPlayerNumbers ) * sizeof(bool));
00301
00302
00303
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;
00309 stream << (int)(sizeof(double));
00310 stream << tacticEntryArray.entrys[i].weight;
00311
00312 stream << (unsigned int) 0x0047574F;
00313 stream << (int)(Player::numOfPlayerNumbers * sizeof(double));
00314
00315 for (j = 0; j < Player::numOfPlayerNumbers; ++j)
00316 stream << tacticEntryArray.entrys[i].optionWeights[j];
00317
00318 stream << (unsigned int) 0x0056584D;
00319 stream << (int)(sizeof(double));
00320 stream << tacticEntryArray.entrys[i].maxVal;
00321
00322 stream << (unsigned int) 0x00434546;
00323 stream << (int)(sizeof(int));
00324 stream << tacticEntryArray.entrys[i].followingEntryCount;
00325
00326 stream << (unsigned int) 0x004E4546;
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;
00333 stream << (int)(tacticEntryArray.entrys[i].followingEntryCount * sizeof(double));
00334
00335 for (j = 0; j < tacticEntryArray.entrys[i].followingEntryCount; ++j)
00336 stream << tacticEntryArray.entrys[i].followingEntryWeights[j];
00337
00338 stream << (unsigned int) 0x00434147;
00339 stream << (int)(sizeof(int));
00340 stream << RateableOptions::numOfGlobalAnalysers;
00341
00342 stream << (unsigned int) 0x00494147;
00343 stream << (int)(RateableOptions::numOfGlobalAnalysers * sizeof(int));
00344
00345 for (j = 0; j < RateableOptions::numOfGlobalAnalysers; ++j)
00346 stream << tacticEntryArray.entrys[i].globalAnalysersInfo[j];
00347
00348 stream << (unsigned int) 0x004D414E;
00349 tmp = 4 + strlen(tacticEntryArray.entrys[i].name);
00350 stream << tmp;
00351
00352 stream << tacticEntryArray.entrys[i].name;
00353
00354 }
00355
00356
00357 return stream;
00358 }
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368