source: AE/Installer/trunk/source/installer.cpp@ 364

Last change on this file since 364 was 325, checked in by iritscen, 16 years ago

Rolled installer.cpp code into mainwindow.cpp, do not build installer.cpp.
Also converted all newlines to Windows format just to be safe.

File size: 27.8 KB
Line 
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
30const string strInstallerVersion = "1.0";
31const bool SPLIT = 1;
32const bool NOT_SPLIT = 0;
33bool splitInstances = SPLIT;
34
35#ifdef WIN32
36const string strOniSplit = "Onisplit.exe";
37string strImportOption = "-import:nosep";
38const char* strClsCmd = "cls";
39const char* strPauseCmd = "PAUSE";
40#else // set up Mac equivalents since we're in Mac OS
41const string strOniSplit = "mono Onisplit.exe";
42string strImportOption = "-import:sep";
43const char* strClsCmd = "clear";
44const char* strPauseCmd = "read -n 1 -p \"Press any key to continue\"";
45#endif
46
47using namespace boost::filesystem;
48using 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
69int 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
141int 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
314int 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
395int 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
480int listInstalledPackages(void)
481{
482 cout << "\nThis feature not yet implemented.\n\n";
483
484 return 0;
485}
486
487int 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
497vector<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
531ModPackage 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
642void 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
786void 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
811vector<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...
834void 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
852void 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}
Note: See TracBrowser for help on using the repository browser.