00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "Kampagne.hpp"
00019
00020 #include <boost/format.hpp>
00021
00022 #include <libintl.h>
00023 #define _(string) gettext(string)
00024
00025 std::size_t CKampagne::get_MissionIndex()
00026 {
00027 std::size_t result = 0;
00028 std::list<CMission*>::iterator tmp = m_Missions.begin();
00029
00030 while (tmp != m_ActualMission)
00031 {
00032 if(tmp == m_Missions.end())
00033 {
00034 return 0;
00035 }
00036 else
00037 {
00038 tmp++;
00039 result++;
00040 }
00041 }
00042 return result;
00043 }
00044
00045 bool CKampagne::set_MissionIndex(int index)
00046 {
00047 std::list<CMission*>::iterator tmp = m_Missions.begin();
00048 while(index--)
00049 {
00050 tmp++;
00051 if (tmp == m_Missions.end())
00052 {
00053 LOG4CXX_ERROR(log_, _("Invalid Index"));
00054 return false;
00055 }
00056 }
00057 m_ActualMission = tmp;
00058 return true;
00059 }
00060
00061 void CKampagne::clearMissions()
00062 {
00063 if (m_Missions.size() == 0) return;
00064 std::list<CMission*>::iterator tmp = m_Missions.begin();
00065 while (tmp != m_Missions.end())
00066 {
00067 delete (*tmp);
00068 m_Missions.erase(tmp++);
00069 }
00070 }
00071
00072 bool CKampagne::init(std::string filename)
00073 {
00074 LOG4CXX_DEBUG(log_, boost::format(_("Reading CKampagne %1%")) % filename);
00075 clearMissions();
00076 errorCode result = readFile(filename);
00077
00078 if (m_Missions.size() == 0) LOG4CXX_ERROR(log_, _("No Mission found"));
00079 m_ActualMission = m_Missions.begin();
00080
00081
00082
00083 switch (result)
00084 {
00085 case FAILED_OPEN:
00086 LOG4CXX_ERROR(log_, boost::format(_("Error while opening File %1%!")) % filename);
00087 break;
00088 case WRONG_SYNTAX:
00089 LOG4CXX_ERROR(log_, boost::format(_("invalid Syntax in File %1%!")) % filename);
00090 break;
00091 case MISSING_ATTRIBUTE:
00092 LOG4CXX_ERROR(log_, boost::format(_("Missing Attributes in File %1%!")) % filename);
00093 break;
00094 }
00095
00096 LOG4CXX_DEBUG(log_, boost::format(_("%1% Missions loaded"))%m_Missions.size());
00097
00098 return (result == SUCCESS);
00099 }
00100
00101 bool CKampagne::nextMission()
00102 {
00103 LOG4CXX_DEBUG(log_, _("Starting New Mission"));
00104 if (++m_ActualMission == m_Missions.end())
00105 return false;
00106 else
00107 return true;
00108 }
00109
00110 errorCode CKampagne::readFile(std::string filename)
00111 {
00112 char buffer[255];
00113
00114 std::string Buffer;
00115 std::string Tag;
00116 std::string enemy_file_wave;
00117 std::string enemy_file_params;
00118 std::string Beschreibung;
00119 std::string Titel;
00120 std::string PShip;
00121 std::string image;
00122 int framecount;
00123 int framedelay;
00124 std::string playlist[2];
00125
00126 FILE* theFile = fopen(filename.c_str(),"r");
00127
00128 if(theFile == NULL)
00129 {
00130 return FAILED_OPEN;
00131 }
00132
00133 while(std::feof(theFile) == 0)
00134 {
00135 std::fscanf(theFile, "%s", buffer);
00136
00137 Buffer = buffer;
00138
00139 if (Buffer == "<intro>")
00140 {
00141 while(1)
00142 {
00143 if(std::feof(theFile) != 0)
00144 return UNEXPECTED_ENDING;
00145
00146 std::fscanf(theFile, "%s", buffer);
00147 Buffer = buffer;
00148 if(Buffer != "</intro>")
00149 {
00150 m_Intro += " ";
00151 m_Intro += Buffer;
00152 }
00153 else
00154 break;
00155 }
00156 }
00157 else if (Buffer == "<img>")
00158 {
00159 std::fscanf(theFile, "%s", buffer);
00160 m_ImgFile = buffer;
00161 std::fscanf(theFile, "%s", buffer);
00162 Buffer = buffer;
00163 if (Buffer != "</img>")
00164 {
00165 return WRONG_SYNTAX;
00166 }
00167 }
00168 else if (Buffer == "<framecount>")
00169 {
00170 std::fscanf(theFile, "%d", &m_framecount);
00171 std::fscanf(theFile, "%s", buffer);
00172 Buffer = buffer;
00173 if (Buffer != "</framecount>")
00174 {
00175 return WRONG_SYNTAX;
00176 }
00177 }
00178 else if (Buffer == "<framedelay>")
00179 {
00180 std::fscanf(theFile, "%d", &m_framedelay);
00181 std::fscanf(theFile, "%s", buffer);
00182 Buffer = buffer;
00183 if (Buffer != "</framedelay>")
00184 {
00185 return WRONG_SYNTAX;
00186 }
00187 }
00188 else if (Buffer == "<leben>")
00189 {
00190 std::fscanf(theFile, "%d", &m_leben);
00191 std::fscanf(theFile, "%s", buffer);
00192 Buffer = buffer;
00193 if (Buffer != "</leben>")
00194 {
00195 return WRONG_SYNTAX;
00196 }
00197 }
00198 else if (Buffer == "<title>")
00199 {
00200 while(1)
00201 {
00202 if(feof(theFile) != 0)
00203 return UNEXPECTED_ENDING;
00204
00205 std::fscanf(theFile, "%s", buffer);
00206 Buffer = buffer;
00207 if(Buffer != "</title>")
00208 {
00209 m_Title += " ";
00210 m_Title += Buffer;
00211 }
00212 else
00213 break;
00214 }
00215 }
00216 else if (Buffer == "<epilog>")
00217 {
00218 while(1)
00219 {
00220 if(std::feof(theFile) != 0)
00221 return UNEXPECTED_ENDING;
00222
00223 std::fscanf(theFile, "%s", buffer);
00224 Buffer = buffer;
00225 if(Buffer != "</epilog>")
00226 {
00227 m_Epilog += " ";
00228 m_Epilog += Buffer;
00229 }
00230 else
00231 break;
00232 }
00233 }
00234 else if (Buffer == "<niederlage>")
00235 {
00236 while(1)
00237 {
00238 if(std::feof(theFile) != 0)
00239 return UNEXPECTED_ENDING;
00240
00241 std::fscanf(theFile, "%s", buffer);
00242 Buffer = buffer;
00243 if(Buffer != "</niederlage>")
00244 {
00245 m_Niederlage += " ";
00246 m_Niederlage += Buffer;
00247 }
00248 else
00249 break;
00250 }
00251 }
00252 else if (Buffer == "<mission>")
00253 {
00254 Beschreibung = "";
00255 enemy_file_wave = "";
00256 enemy_file_params = "";
00257 Titel = "";
00258 image = "";
00259 framecount = 1;
00260 framedelay = 10;
00261 while (std::fscanf(theFile, "%s", buffer))
00262 {
00263 Buffer = buffer;
00264
00265 if (Buffer == "</mission>") break;
00266
00267 if (Buffer == "<ai>")
00268 {
00269 while (Buffer != "</ai>")
00270 {
00271 std::fscanf(theFile, "%s", buffer);
00272 Buffer = buffer;
00273
00274 if (Buffer == "<wavefile>")
00275 {
00276 std::fscanf(theFile, "%s", buffer);
00277 enemy_file_wave = buffer;
00278 std::fscanf(theFile, "%s", buffer);
00279 Tag = buffer;
00280 if (Tag != "</wavefile>")
00281 {
00282 std::printf("1!");
00283 return WRONG_SYNTAX;
00284 }
00285 }
00286 else if (Buffer == "<parameterfile>")
00287 {
00288 std::fscanf(theFile, "%s", buffer);
00289 enemy_file_params = buffer;
00290 std::fscanf(theFile, "%s", buffer);
00291 Tag = buffer;
00292 if (Tag != "</parameterfile>")
00293 {
00294 std::printf("2!");
00295 return WRONG_SYNTAX;
00296 }
00297 }
00298 if(std::feof(theFile) != 0)
00299 return UNEXPECTED_ENDING;
00300 }
00301 }
00302 else if (Buffer == "<playlist>")
00303 {
00304 while (Buffer != "</playlist>")
00305 {
00306 std::fscanf(theFile, "%s", buffer);
00307 Buffer = buffer;
00308
00309 if (Buffer == "<boss>")
00310 {
00311 std::fscanf(theFile, "%s", buffer);
00312 playlist[1] = buffer;
00313 std::fscanf(theFile, "%s", buffer);
00314 Tag = buffer;
00315 if (Tag != "</boss>")
00316 {
00317 std::printf("1!");
00318 return WRONG_SYNTAX;
00319 }
00320 }
00321 else if (Buffer == "<normal>")
00322 {
00323 std::fscanf(theFile, "%s", buffer);
00324 playlist[0] = buffer;
00325 std::fscanf(theFile, "%s", buffer);
00326 Tag = buffer;
00327 if (Tag != "</normal>")
00328 {
00329 std::printf("2!");
00330 return WRONG_SYNTAX;
00331 }
00332 }
00333 if(feof(theFile) != 0)
00334 return UNEXPECTED_ENDING;
00335 }
00336 }
00337 else if (Buffer == "<deskription>")
00338 {
00339 while(1)
00340 {
00341 if(std::feof(theFile) != 0)
00342 return UNEXPECTED_ENDING;
00343
00344 std::fscanf(theFile, "%s", buffer);
00345 Buffer = buffer;
00346 if(Buffer != "</deskription>")
00347 {
00348 Beschreibung += " ";
00349 Beschreibung += Buffer;
00350 }
00351 else
00352 break;
00353 }
00354 }
00355 else if (Buffer == "<title>")
00356 {
00357 while(1)
00358 {
00359 if(std::feof(theFile) != 0)
00360 return UNEXPECTED_ENDING;
00361
00362 std::fscanf(theFile, "%s", buffer);
00363 Buffer = buffer;
00364 if(Buffer != "</title>")
00365 {
00366 Titel += " ";
00367 Titel += Buffer;
00368 }
00369 else
00370 break;
00371 }
00372 }
00373 else if (Buffer == "<playership>")
00374 {
00375 std::fscanf(theFile, "%s", buffer);
00376 PShip = buffer;
00377 std::fscanf(theFile, "%s", buffer);
00378 Buffer = buffer;
00379 if (Buffer != "</playership>")
00380 {
00381 return WRONG_SYNTAX;
00382 }
00383 }
00384 else if (Buffer == "<img>")
00385 {
00386 std::fscanf(theFile, "%s", buffer);
00387 image = buffer;
00388 std::fscanf(theFile, "%s", buffer);
00389 Buffer = buffer;
00390 if (Buffer != "</img>")
00391 {
00392 return WRONG_SYNTAX;
00393 }
00394 }
00395 else if (Buffer == "<framecount>")
00396 {
00397 std::fscanf(theFile, "%d", &framecount);
00398 std::fscanf(theFile, "%s", buffer);
00399 Buffer = buffer;
00400 if (Buffer != "</framecount>")
00401 {
00402 return WRONG_SYNTAX;
00403 }
00404 }
00405 else if (Buffer == "<framedelay>")
00406 {
00407 std::fscanf(theFile, "%d", &framedelay);
00408 std::fscanf(theFile, "%s", buffer);
00409 Buffer = buffer;
00410 if (Buffer != "</framedelay>")
00411 {
00412 return WRONG_SYNTAX;
00413 }
00414 }
00415 else if (Buffer == "<!--")
00416 {
00417 do
00418 {
00419 std::fscanf(theFile, "%s", buffer);
00420 Buffer = buffer;
00421 }
00422 while(Buffer != "-->");
00423 }
00424 }
00425
00426 if (Buffer != "</mission>")
00427 {
00428 std::printf("3!");
00429 return WRONG_SYNTAX;
00430 }
00431 if (enemy_file_wave != "" && enemy_file_params != "")
00432 {
00433 m_Missions.push_back(new CMission(enemy_file_wave, enemy_file_params, Beschreibung, Titel, PShip, playlist, image, framecount, framedelay));
00434 }
00435 else
00436 return MISSING_ATTRIBUTE;
00437 }
00438 else if (Buffer == "<!--")
00439 {
00440 do
00441 {
00442 std::fscanf(theFile, "%s", buffer);
00443 Buffer = buffer;
00444 }
00445 while(Buffer != "-->");
00446 }
00447 else if (Buffer == "</mission>")
00448 {
00449 LOG4CXX_DEBUG(log_, boost::format(_("Superstitous </mission>")) % filename);
00450 }
00451 else
00452 {
00453 LOG4CXX_ERROR(log_, Buffer);
00454 LOG4CXX_ERROR(log_, boost::format("%1% %2% %3% %4% %5%") % m_Intro % m_ImgFile % m_Epilog % m_Niederlage % m_Title);
00455 return WRONG_SYNTAX;
00456 }
00457 }
00458 std::fclose(theFile);
00459 return SUCCESS;
00460
00461 }