Changeset 325 for AE/Installer
- Timestamp:
- May 26, 2009, 8:51:14 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
AE/Installer/trunk/source/main_window.cpp
r324 r325 1 #include "installer.cpp" 1 /* 2 AE/Mod Installer 3 v1.0 4 by Gumby and Iritscen 5 */ 6 7 #define DEBUG 8 #include <stdio.h> 9 //#include <conio.h> 10 //#include <process.h> 11 #include <string> 12 #include <iostream> 13 #include <cctype> 14 #include <vector> 15 #include <fstream> 16 #include <errno.h> 17 #include <sstream> 18 19 #include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations 20 21 #include "installer.h" 22 23 #ifdef WIN32 24 #include <windows.h> 25 #else // assume we're on Mac 26 #include <stdlib.h> 27 #include <dirent.h> 28 #endif 29 30 const string strInstallerVersion = "1.0"; 31 const bool SPLIT = 1; 32 const bool NOT_SPLIT = 0; 33 bool splitInstances = SPLIT; 34 35 #ifdef WIN32 36 const string strOniSplit = "Onisplit.exe"; 37 string strImportOption = "-import:nosep"; 38 const char* strClsCmd = "cls"; 39 const char* strPauseCmd = "PAUSE"; 40 #else // set up Mac equivalents since we're in Mac OS 41 const string strOniSplit = "mono Onisplit.exe"; 42 string strImportOption = "-import:sep"; 43 const char* strClsCmd = "clear"; 44 const char* strPauseCmd = "read -n 1 -p \"Press any key to continue\""; 45 #endif 46 47 using namespace boost::filesystem; 48 using namespace std; 49 50 51 /* 52 int main(void) 53 { 54 if ( exists( "../../GameDataFolder/level0_Final.sep" ) ) splitInstances = NOT_SPLIT; 55 else splitInstances = NOT_SPLIT; 56 // SetConsoleTitle("AE Installer"); windows junk, convert to SDL 57 #ifdef WIN32 58 system("color 0A"); 59 #endif 60 cout << "\nWelcome to the AE installer!\n"; 61 cout << "\nWhat would you like to do?\n"; 62 63 return mainMenu(); 64 } 65 */ 66 67 68 69 int mainMenu(void) 70 { 71 char choice = '0'; 72 bool exit = false; 73 int err = 0; 74 do 75 { 76 if( exists( "../GameDataFolder" ) ) { 77 cout << "\n1. Add new packages\n"; 78 cout << "2. Remove packages\n"; 79 cout << "3. See what is installed\n"; 80 cout << "4. Globalize data\n"; 81 cout << "5. About AE\n"; 82 cout << "6. Quit\n\n"; 83 84 choice = cin.get(); 85 cin.ignore(128, '\n'); 86 switch(choice) 87 { 88 case '1': 89 err = installPackages(); 90 break; 91 case '2': 92 err = uninstallPackages(); 93 break; 94 case '3': 95 err = listInstalledPackages(); 96 break; 97 case '4': 98 err = globalizeData(); 99 break; 100 case '5': 101 err = printInstallerInfo(); 102 break; 103 case '6': 104 exit = true; 105 break; 106 default: 107 cout << "Please choose one of the above numbers, and press Enter.\n\n"; 108 } 109 if (err) // if something fatal happened 110 exit = true; 111 } 112 else { 113 cout << "\n1. Globalize data\n"; 114 cout << "2. About AE\n"; 115 cout << "3. Quit\n\n"; 116 117 choice = cin.get(); 118 cin.ignore(128, '\n'); 119 switch(choice) 120 { 121 case '1': 122 err = globalizeData(); 123 break; 124 case '2': 125 err = printInstallerInfo(); 126 break; 127 case '3': 128 exit = true; 129 break; 130 default: 131 cout << "Please choose one of the above numbers, and press Enter.\n\n"; 132 } 133 if (err) // if something fatal happened 134 exit = true; 135 } 136 } while(!exit); 137 138 return err; 139 } 140 141 int globalizeData(void) 142 { 143 int err = 0; 144 145 try { 146 int levels[15] = {0, 1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 18, 19}; // the levels Oni has 147 char choice = 0; 148 149 //SetCurrentDirectory("C:/Program Files/Oni/edition/install"); 150 char levelnum[3]; 151 path Characters = "../GameDataFolder/level0_Characters"; 152 path Particles = "../GameDataFolder/level0_Particles"; 153 path Archive = "../GameDataFolder/Archive"; 154 path Textures = "../GameDataFolder/level0_Textures"; 155 path Sounds = "../GameDataFolder/level0_Sounds"; 156 path Animations = "../GameDataFolder/level0_Animations"; 157 path TRAC = Animations / "level0_TRAC"; 158 path TRAM = Animations / "level0_TRAM"; 159 /* 160 if (exists("../GameDataFolder/")) 161 { 162 //cout << "\nIt looks like you've already globalized Oni's data.\nDo you want to re-globalize?\n(This will erase existing mods installed to the AE's game data.)" 163 // << "\n1. Re-globalize" 164 // << "\n2. Return to main menu\n"; 165 //choice = cin.get(); 166 cin.ignore(128, '\n'); 167 if (choice == '1') 168 remove_all("../GameDataFolder"); // remove AE GDF 169 if (choice == '2') 170 return 0; 171 } 172 */ 173 create_directory( "../GameDataFolder/" ); 174 create_directory( "packages" ); 175 if (exists("packages/VanillaDats")) remove_all("packages/VanillaDats"); 176 create_directory( "packages/VanillaDats" ); 177 178 create_directory( "packages/VanillaDats/level0_Final/" ); 179 create_directory( Characters ); 180 create_directory( Particles ); 181 create_directory( Archive ); 182 create_directory( Textures ); 183 create_directory( Sounds ); 184 create_directory( Animations ); 185 create_directory( TRAC ); 186 create_directory( TRAM ); 187 188 for(int i = 0; i < 15; i++) 189 { 190 sprintf(levelnum,"%d",levels[i]); // int to char array 191 exists("../../GameDataFolder/level" + (string)levelnum + "_Final"); 192 system((strOniSplit + " -export ../GameDataFolder/level" + (string)levelnum + "_Final ../../GameDataFolder/level" + (string)levelnum + "_Final.dat").c_str()); 193 194 create_directory( "packages/VanillaDats/level" + (string)levelnum + "_Final" ); //remember to cast your arrays as strings :) 195 create_directory( "packages/VanillaDats/level" + (string)levelnum + "_Final/level" + (string)levelnum + "_Final" ); 196 197 directory_iterator end_iter; 198 for ( directory_iterator dir_itr( "../GameDataFolder/level" + (string)levelnum + "_Final" ); dir_itr != end_iter; ++dir_itr ) 199 { 200 //cout << dir_itr->path().filename(); 201 if ( is_regular_file( dir_itr->status() ) ) 202 { 203 204 if ( dir_itr->path().filename().substr(0,8) == "TXMPfail" || 205 dir_itr->path().filename().substr(0,9) == "TXMPlevel" || 206 ( dir_itr->path().filename().substr(0,4) == "TXMP" && dir_itr->path().filename().find("intro")!=string::npos) || 207 dir_itr->path().filename().substr(0,4) == "TXMB" || 208 dir_itr->path().filename() == "M3GMpowerup_lsi.oni" || 209 dir_itr->path().filename() == "TXMPlsi_icon.oni" || 210 ( dir_itr->path().filename().substr(0,4) == "TXMB" && dir_itr->path().filename().find("splash_screen.oni")!=string::npos) ) 211 { 212 cout <<dir_itr->path().filename() << "\n"; 213 create_directory( dir_itr->path().parent_path() / "NoGlobal"); 214 if(!exists( dir_itr->path().parent_path() / "NoGlobal" / dir_itr->filename())) rename(dir_itr->path(), dir_itr->path().parent_path() / "NoGlobal" / 215 dir_itr->filename()); 216 else remove(dir_itr->path()); 217 } 218 else if (dir_itr->path().filename().substr(0,4) == "TRAC") { 219 cout <<dir_itr->path().filename() << "\n"; 220 if(!exists( TRAC / dir_itr->filename())) rename(dir_itr->path(), TRAC / dir_itr->filename()); 221 else remove(dir_itr->path()); 222 } 223 else if (dir_itr->path().filename().substr(0,4) == "TRAM") { 224 cout <<dir_itr->path().filename() << "\n"; 225 if(!exists( TRAM / dir_itr->filename())) rename(dir_itr->path(), TRAM / dir_itr->filename()); 226 else remove(dir_itr->path()); 227 } 228 else if (dir_itr->path().filename().substr(0,4) == "ONSK" || 229 dir_itr->path().filename().substr(0,4) == "TXMP") { 230 cout <<dir_itr->path().filename() << "\n";\ 231 create_directory( dir_itr->path().parent_path() / "TexFix"); 232 if(!exists( Textures / dir_itr->filename())) rename(dir_itr->path(), Textures / dir_itr->filename()); 233 //rename(dir_itr->path(), dir_itr->path().parent_path() / "TexFix" / dir_itr->filename()); 234 } 235 else if (dir_itr->path().filename().substr(0,4) == "ONCC" 236 || dir_itr->path().filename().substr(0,4) == "TRBS" 237 || dir_itr->path().filename().substr(0,4) == "TRMA" 238 || dir_itr->path().filename().substr(0,4) == "TRSC" 239 || dir_itr->path().filename().substr(0,4) == "TRAS") { 240 cout <<dir_itr->path().filename() << "\n"; 241 if(!exists( Characters / dir_itr->filename())) rename(dir_itr->path(), Characters / dir_itr->filename()); 242 else remove(dir_itr->path()); 243 } 244 else if (dir_itr->path().filename().substr(0,4) == "OSBD" 245 || dir_itr->path().filename().substr(0,4) == "SNDD") { 246 cout << dir_itr->path().filename() << "\n"; 247 if(!exists( Sounds / dir_itr->filename())) rename(dir_itr->path(), Sounds / dir_itr->filename()); 248 else remove(dir_itr->path()); 249 } 250 else if (dir_itr->path().filename().substr(0,5) == "BINA3" 251 || dir_itr->path().filename().substr(0,10) == "M3GMdebris" 252 || dir_itr->path().filename() == "M3GMtoxic_bubble.oni" 253 || dir_itr->path().filename().substr(0,8) == "M3GMelec" 254 || dir_itr->path().filename().substr(0,7) == "M3GMrat" 255 || dir_itr->path().filename().substr(0,7) == "M3GMjet" 256 || dir_itr->path().filename().substr(0,9) == "M3GMbomb_" 257 || dir_itr->path().filename() == "M3GMbarab_swave.oni" 258 || dir_itr->path().filename() == "M3GMbloodyfoot.oni" 259 ){ 260 cout <<dir_itr->path().filename() << "\n"; 261 if(!exists( Particles / dir_itr->filename())) rename(dir_itr->path(), Particles / dir_itr->filename()); 262 else remove(dir_itr->path()); 263 } 264 else if (dir_itr->path().filename().substr(0,4) == "AGDB" 265 || dir_itr->path().filename().substr(0,4) == "TRCM") { 266 cout <<dir_itr->path().filename() << "\n"; 267 268 if(!exists( Archive / dir_itr->filename())) rename(dir_itr->path(), Archive / dir_itr->filename()); 269 else remove(dir_itr->path()); 270 } 271 } 272 273 274 } 275 system( (strOniSplit + " -move:delete " + Textures.string() + " ../GameDataFolder/level" + (string)levelnum + "_Final/TXMP*.oni").c_str()); 276 277 } 278 279 for (int i = 0; i < 15; i++) 280 { 281 sprintf(levelnum,"%d",levels[i]); 282 system( (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levelnum + "_Final packages/VanillaDats/level" + levelnum + "_Final/level" 283 + levelnum + "_Final/level" + levelnum + "_Final.oni").c_str()); 284 } 285 path VanillaCharacters = "packages/VanillaDats/level0_Final/level0_Characters/level0_Characters.oni"; 286 path VanillaParticles = "packages/VanillaDats/level0_Final/level0_Particles/level0_Particles.oni"; 287 path VanillaTextures = "packages/VanillaDats/level0_Final/level0_Textures/level0_Textures.oni"; 288 path VanillaSounds = "packages/VanillaDats/level0_Final/level0_Sounds/level0_Sounds.oni"; 289 path VanillaAnimations = "packages/VanillaDats/level0_Final/level0_Animations/level0_Animations.oni"; 290 path VanillaTRAC = "packages/VanillaDats/level0_Final/level0_Animations/level0_TRAC.oni"; 291 path VanillaTRAM = "packages/VanillaDats/level0_Final/level0_Animations/level0_TRAM.oni"; 292 create_directory( VanillaCharacters.parent_path() ); 293 create_directory( VanillaParticles.parent_path() ); 294 create_directory( VanillaTextures.parent_path() ); 295 create_directory( VanillaSounds.parent_path() ); 296 create_directory( VanillaAnimations.remove_filename() ); 297 system((strOniSplit + " " + strImportOption + " " + Characters.string() + " " + VanillaCharacters.string()).c_str()); 298 system((strOniSplit + " " + strImportOption + " " + Particles.string() + " " + VanillaParticles.string()).c_str()); 299 system((strOniSplit + " " + strImportOption + " " + Textures.string() + " " + VanillaTextures.string()).c_str()); 300 //system((strOniSplit + " " + strImportOption + (string)" " + Animations.string() + (string)" " + VanillaAnimations.string()).c_str()); 301 system((strOniSplit + " " + strImportOption + " " + TRAC.string() + " " + VanillaTRAC.string()).c_str()); 302 system((strOniSplit + " " + strImportOption + " " + Sounds.string() + " " + VanillaSounds.string()).c_str()); 303 system((strOniSplit + " " + strImportOption + " " + TRAM.string() + " " + VanillaTRAM.string()).c_str()); 304 305 create_directory("../GameDataFolder/IGMD"); 306 copy((path)"packages/VanillaBSL/IGMD", (path)"../GameDataFolder"); 307 } 308 catch (exception ex) { 309 cout << ex.what(); 310 } 311 return err; 312 } 313 314 int installPackages(void) 315 { 316 bool installed_something = 0; 317 int err = 0; 318 ModPackage package; 319 vector<string> installed_packages; 320 vector<ModPackage> packages; 321 vector<ModPackage>::iterator iter; 322 vector<string> installString; 323 324 iter = packages.begin(); 325 packages = getPackages(); 326 vector<string> installedMods = getInstallString(); 327 328 if (packages.empty()) 329 { 330 cout << "Error: You have no packages!\n"; 331 return 0; 332 } 333 334 cout << "Detecting installed packages...\n"; 335 336 int index = 1; 337 char choice = '0'; 338 339 for (vector<ModPackage>::iterator package_iter = packages.begin(); package_iter != packages.end(); ++package_iter) 340 { 341 if (!binary_search(installedMods.begin(), installedMods.end(), package_iter->modStringName)) 342 { //package_iter->isInstalled :< I forgot about this... 343 //cout << index << " "; 344 system(strClsCmd); 345 cout << (*package_iter).name << "\n"; 346 for (int character = 1; character <= (*package_iter).name.length() - 1; character++) cout << '-'; 347 cout << "\n" 348 << (*package_iter).readme << "\n\n" 349 << "Please enter a number choice\n" 350 << " 1. Add\n" 351 << " 2. Don't Add\n" 352 << ""; 353 index++; 354 choice = 0; 355 356 do 357 { 358 choice = cin.get(); 359 cin.ignore(1280, '\n'); 360 } while(choice == 0); 361 362 if (choice == '1') 363 { 364 cout << "\nInstalling...\n\n"; 365 if (package_iter->hasOnis || (package_iter->hasDeltas /*(*package_iter).isUnpacked */ )) 366 { 367 installed_something = 1; 368 installedMods.push_back(package_iter->modStringName); 369 system(strPauseCmd); 370 } 371 } 372 } 373 } 374 if (index == 1) 375 { 376 cout << "Warning: All packages are already installed\n"; 377 //would you like to recombine your data? 378 return 0; 379 } 380 if (installed_something == 0) 381 { 382 cout << "Warning: You didn't add anything!\n"; 383 //would you like to recombine your data? 384 return 0; 385 } 386 387 sort(installedMods.begin(), installedMods.end()); 388 //system(Onisplit.c_str()); 389 recompileAll(installedMods); 390 system(strPauseCmd); 391 392 return err; 393 } 394 395 int uninstallPackages(void) 396 { 397 int err = 0; 398 ModPackage package; 399 vector<string> installed_packages; 400 vector<ModPackage> packages; 401 vector<ModPackage>::iterator iter; 402 vector<string> installString; 403 404 iter = packages.begin(); 405 packages = getPackages(); 406 407 408 cout << "Detecting installed packages...\n"; 409 410 vector<string> installedMods = getInstallString(); 411 412 if (packages.empty()) 413 { 414 cout << "Error: You have no packages!\n"; 415 return 0; 416 } 417 418 int index = 0; 419 int uninstalled_something = 0; 420 char choice = '0'; 421 422 for (vector<ModPackage>::iterator package_iter = packages.begin(); package_iter != packages.end(); ++package_iter) 423 { 424 if (binary_search(installedMods.begin(), installedMods.end(), package_iter->modStringName)) 425 { //package_iter->isInstalled :< I forgot about this... 426 //cout << index << " "; 427 system(strClsCmd); 428 cout << (*package_iter).name << "\n"; 429 for (int character = 1; character <= (*package_iter).name.length() - 1; character++) cout << '-'; 430 cout << "\n" 431 << (*package_iter).readme << "\n\n" 432 << "Please enter a number choice\n" 433 << " 1. Remove\n" 434 << " 2. Don't Remove\n" 435 << ""; 436 437 choice = 0; 438 439 do 440 { 441 choice = cin.get(); 442 cin.ignore(1280, '\n'); 443 } while(choice == 0); 444 445 if (choice == '1') 446 { 447 cout << "\nUninstalling...\n\n"; 448 installedMods.erase( installedMods.begin() + (index) ); 449 system(strPauseCmd); 450 uninstalled_something = 1; 451 452 } 453 else { 454 index++; 455 } 456 } 457 } 458 if ( uninstalled_something == 0 ) 459 { 460 if (index == 0) //bad practice, I need to implement a second vector or something. Meh. 461 { 462 cout << "\nWarning: You have no installed packages!"; 463 } 464 else 465 { 466 cout << "\nWarning: You didn't remove anything!"; 467 } 468 //would you like to recombine your data? 469 return 0; 470 471 } 472 sort(installedMods.begin(), installedMods.end()); 473 //system(Onisplit.c_str()); 474 recompileAll(installedMods); 475 system(strPauseCmd); 476 477 return err; 478 } 479 480 int listInstalledPackages(void) 481 { 482 cout << "\nThis feature not yet implemented.\n\n"; 483 484 return 0; 485 } 486 487 int printInstallerInfo(void) 488 { 489 cout << "\nAE/Mod Installer\n"; 490 cout << "version " << strInstallerVersion << "\n"; 491 cout << "by Gumby & Iritscen\n"; 492 cout << "see http://oni.bungie.org/community/forums for more info\n\n"; 493 494 return 0; 495 } 496 497 vector<ModPackage> getPackages(void) 498 { 499 vector<ModPackage> packages; 500 packages.reserve(65536); // come on, we shouldn't need this much space...right?! 501 fstream file; 502 string filename = "\0"; 503 string MODINFO_CFG = "Mod_Info.cfg"; 504 505 try 506 { 507 directory_iterator end_iter; 508 for (directory_iterator dir_itr("./packages"); dir_itr != end_iter; ++dir_itr) 509 { 510 file.open((dir_itr->path().string() + "/" + MODINFO_CFG).c_str()); 511 //cout << filename << "\n"; 512 513 if(!file.fail()) 514 { 515 //cout << dir_itr->path().string() + MODINFO_CFG; 516 //would prefer to push a pointer to a package, but this will do for now 517 packages.push_back(fileToModPackage(file)); 518 } 519 file.close(); 520 file.clear(); 521 } 522 } 523 catch (const std::exception & ex) 524 { 525 cout << "Warning, something odd happened!\n"; 526 } 527 528 return packages; 529 } 530 531 ModPackage fileToModPackage(fstream &file) 532 { 533 /* 534 This converts a file to a ModPackage struct. 535 536 A few notes... 537 "iter" is the current word we are on. I should have named it "token" or something, but I don't have multiple iterators, so its ok. 538 I refer to (*iter) at the beginning of each if statement block. I could probably store it as a variable, but I'm pretty sure that dereferencing a pointer\iterator isn't much 539 slower than reading a variable. 540 */ 541 ModPackage package; 542 string line; 543 static string NameOfMod = "NameOfMod"; //used for comparing to the current token... 544 //I could have done it in reverse (*iter).compare("ModString") or 545 static string ARROW = "->"; //did something like "ModString".compare(*iter), and it would have been 546 static string ModString = "ModString"; //functionably the same. 547 static string HasOnis = "HasOnis"; 548 static string HasDeltas = "HasDeltas"; 549 static string HasBSL = "HasBSL"; 550 static string HasDats = "HasDats"; 551 static string IsEngine = "IsEngine"; 552 static string Readme = "Readme"; 553 static string GlobalNeeded = "GlobalNeeded"; 554 static string Category = "Category"; 555 static string Creator = "Creator"; 556 while (! file.eof() ) 557 { 558 getline (file,line); 559 vector<string> tokens; 560 vector<string>::iterator iter; 561 tokenize(line, tokens); //string to vector of "words" 562 if (tokens.capacity() >= 2) { //make sure they are using enough stuff 563 iter = tokens.begin(); //what word we are on, starts at first word 564 /* 565 if (!AEInstallVersion.compare(*iter)) 566 If mod is too old, skip this mod. 567 */ 568 /*else*/if (!NameOfMod.compare(*iter)) { //if it contains the name 569 for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) { //interates through the words, ends if it reaches the end of the line or a "//" comment 570 if (ARROW.compare(*iter) && NameOfMod.compare(*iter)) { //ignores "->" and "NameOfMod" 571 //cout << *iter; 572 //cout << " "; 573 package.name += *iter + " "; 574 } 575 } 576 577 } 578 else if (!ModString.compare(*iter)) { 579 iter++; iter++; 580 package.modStringName = *iter; 581 iter++; 582 package.modStringVersion = atoi((*iter).c_str()); 583 } 584 else if (!HasOnis.compare(*iter)) { 585 iter++; iter++; 586 if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasOnis = 1; //Gotta love c++'s lack of a standard case-insensitive 587 else if (!HasBSL.compare(*iter)) { // string comparer...I know my implementation here sucks. I need to change it to check each character one by one. At the moment, 588 iter++; iter++;} // using "YFR" would probably set it off. :< 589 590 if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasBSL = 1; 591 } 592 else if (!HasDeltas.compare(*iter)) { 593 iter++; iter++; 594 if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDeltas = 1; 595 } 596 else if (!HasDats.compare(*iter)) { 597 iter++; iter++; 598 if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDats = 1; 599 } 600 else if (!IsEngine.compare(*iter)) { 601 iter++; iter++; 602 if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.isEngine = 1; 603 } 604 else if (!GlobalNeeded.compare(*iter)) { 605 iter++; iter++; 606 if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.globalNeeded = 1; 607 else if (toupper((*iter)[0]) + toupper((*iter)[1]) == 'N' + 'O') package.globalNeeded = 1; //Really the only place where checking for "No" is important atm. 608 } 609 else if (!Category.compare(*iter)) { 610 for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) { //interates through the words, ends if it reaches the end of the line or a "//" comment 611 if (ARROW.compare(*iter) && Category.compare(*iter)) { //ignores "->" and "Category" 612 //cout << *iter; 613 //cout << " "; 614 package.category += *iter + " "; 615 } 616 } 617 } 618 else if (!Creator.compare(*iter)) { //if it contains the name 619 for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) { //interates through the words, ends if it reaches the end of the line or a "//" comment 620 if (ARROW.compare(*iter) && Creator.compare(*iter)) { //ignores "->" and "Category" 621 //cout << *iter; 622 //cout << " "; 623 package.creator += *iter + " "; 624 } 625 } 626 } 627 else if (!Readme.compare(*iter)) { //if it contains the name 628 for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) { //interates through the words, ends if it reaches the end of the line or a "//" comment 629 if (ARROW.compare(*iter) && Readme.compare(*iter)) { //ignores "->" and "Category" 630 if(!(*iter).compare("\\n")) package.readme += '\n'; 631 else package.readme += *iter + " "; 632 } 633 } 634 } 635 } 636 637 } 638 package.doOutput(); 639 return package; 640 } 641 642 void recompileAll(vector<string> installedMods) 643 { 644 #ifdef WIN32 645 RedirectIOToConsole(); 646 HWND hWnd = GetConsoleWindow(); 647 ShowWindow( hWnd, SW_HIDE ); 648 #endif 649 setStatusArea("Importing levels..."); 650 //setStatusArea("Recompiling Data..."); 651 path vanilla_dir = "./packages/VanillaDats/"; 652 string importCommand = ""; 653 char statusString[128]; 654 int numberOfDats = 0; 655 int j = 1; 656 string datString; 657 std::stringstream out; 658 659 660 clearOldDats(); 661 remove("Onisplit.log"); 662 if(splitInstances == SPLIT){ 663 recursive_directory_iterator end_iter; 664 665 for ( recursive_directory_iterator dir_itr( vanilla_dir ); 666 dir_itr != end_iter; 667 ++dir_itr ) 668 { 669 try{ 670 if ( is_directory( dir_itr->status() ) && dir_itr.level() == 1) 671 { 672 numberOfDats++; 673 } 674 } 675 catch(exception ex) { 676 677 } 678 } 679 680 //recursive_directory_iterator end_iter; 681 682 683 out << numberOfDats; 684 datString = out.str(); 685 try { 686 for ( recursive_directory_iterator dir_itr( vanilla_dir ); 687 dir_itr != end_iter; 688 ++dir_itr ) 689 { 690 try 691 { 692 if ( is_directory( dir_itr->status() ) && dir_itr.level() == 1) 693 { 694 importCommand = strOniSplit + " " + strImportOption + " " + dir_itr->path().parent_path().string() + '/' + dir_itr->path().filename(); 695 for (int i = 0; i < installedMods.size(); ++i) { 696 if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename() )) 697 importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename(); 698 699 //else cout << " packages/VanillaDats/" + installedMods[i] + "/oni/"; 700 } 701 importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Onisplit.log"; 702 703 sprintf(statusString,"%d/%i\0",j,numberOfDats); 704 setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats 705 setStatusArea("Importing " + dir_itr->path().filename() + " " + statusString); 706 707 system(importCommand.c_str()); 708 //Sleep(1000); 709 //cout << importCommand << "\n"; 710 j++; 711 712 } 713 } 714 catch ( const std::exception & ex ) 715 { 716 cout << "Warning, exception " << ex.what() << "!"; 717 } 718 } 719 720 } 721 catch( const std::exception & ex ) { 722 cout << "Warning, exception " << ex.what() << "!\n" 723 << "You probably need to re-globalize."; 724 //create_directory( "./packages/VanillaDats" ); 725 } 726 727 } 728 else if(splitInstances == NOT_SPLIT){ 729 directory_iterator end_iter; 730 731 for ( directory_iterator dir_itr( vanilla_dir ); 732 dir_itr != end_iter; 733 ++dir_itr ) 734 { 735 736 if ( is_directory( dir_itr->status() ) ) 737 { 738 numberOfDats++; 739 } 740 741 742 } 743 744 out << numberOfDats; 745 datString = out.str(); 746 747 for ( directory_iterator dir_itr( vanilla_dir ); 748 dir_itr != end_iter; 749 ++dir_itr ) 750 { 751 try 752 { 753 if ( is_directory( dir_itr->status() ) ) 754 { 755 importCommand = strOniSplit + " " + strImportOption + " " + vanilla_dir.string() + dir_itr->path().filename() + " " + "../GameDataFolder/" + dir_itr->path().filename() 756 + ".dat"; 757 for (int i = 0; i < installedMods.size(); ++i) { 758 if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename() )) 759 importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename(); 760 } 761 importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat"; 762 763 sprintf(statusString,"%d/%i\0",j,numberOfDats); 764 setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats 765 setStatusArea("Importing " + dir_itr->path().filename() + " " + statusString); 766 767 system(importCommand.c_str()); 768 769 j++; 770 } 771 } 772 catch ( const std::exception & ex ) 773 { 774 cout << "Warning, something odd happened!\n"; 775 } 776 } 777 } 778 writeInstalledMods(installedMods); 779 setProgressBar(1000); 780 setStatusArea("Done!"); 781 sleep(1000); 782 setProgressBar(0); 783 784 } 785 786 void writeInstalledMods(vector<string> installedMods) 787 { 788 789 if ( exists( strInstallCfg ) ) 790 { 791 remove( strInstallCfg ); 792 } 793 794 ofstream file(strInstallCfg.c_str()); 795 796 vector<string>list = installedMods; 797 vector<string>::iterator begin_iter = list.begin(); 798 vector<string>::iterator end_iter = list.end(); 799 800 sort( list.begin(), list.end() ); 801 802 for( ; begin_iter != end_iter; ++begin_iter) { 803 file << *begin_iter << " "; 804 } 805 806 file.close(); 807 file.clear(); 808 809 } 810 811 vector<string> getInstallString(string Cfg) 812 { 813 //system(strPauseCmd); 814 vector<string> returnval; 815 816 string line; 817 fstream file; 818 819 if (exists( Cfg )) 820 { 821 file.open(Cfg.c_str()); 822 getline(file, line); 823 tokenize(line, returnval); 824 file.close(); 825 file.clear(); 826 sort(returnval.begin(), returnval.end()); 827 } 828 else cout << "fail"; 829 830 return returnval; 831 } 832 833 //stolen token function... 834 void tokenize(const string& str, vector<string>& tokens, const string& delimiters) 835 { 836 // Skip delimiters at beginning. 837 string::size_type lastPos = str.find_first_not_of(delimiters, 0); 838 // Find first "non-delimiter". 839 string::size_type pos = str.find_first_of(delimiters, lastPos); 840 841 while (string::npos != pos || string::npos != lastPos) 842 { 843 // Found a token, add it to the vector. 844 tokens.push_back(str.substr(lastPos, pos - lastPos)); 845 // Skip delimiters. Note the "not_of" 846 lastPos = str.find_first_not_of(delimiters, pos); 847 // Find next "non-delimiter" 848 pos = str.find_first_of(delimiters, lastPos); 849 } 850 } 851 852 void clearOldDats(void) { 853 directory_iterator end_iter_gdf; 854 for ( directory_iterator dir_itr_gdf( "../GameDataFolder" ); 855 dir_itr_gdf != end_iter_gdf; 856 ++dir_itr_gdf ) 857 { 858 //cout << dir_itr_gdf->path().extension() << "\n"; 859 if ( dir_itr_gdf->path().extension() == ".dat" || dir_itr_gdf->path().extension() == ".raw" || dir_itr_gdf->path().extension() == ".sep" ) { 860 remove( dir_itr_gdf->path() ); 861 } 862 863 } 864 865 } 2 866 3 867 vector<string> globalInstalledMods;
Note:
See TracChangeset
for help on using the changeset viewer.