Subversion Repositories spk

Rev

Rev 241 | Rev 249 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 241 Rev 248
Line 391... Line 391...
391
					if ( cmd == L"<script>" )
391
					if ( cmd == L"<script>" )
392
					{
392
					{
393
						if ( packageFile->IsMod() && packageFile->IsEnabled() )
393
						if ( packageFile->IsMod() && packageFile->IsEnabled() )
394
							m_pEnabledMod = packageFile;
394
							m_pEnabledMod = packageFile;
395
 
395
 
396
						m_lPackages.push_back(packageFile);
396
						
397
						this->ConvertOldPackage(packageFile);
397
						_processAddPackage(packageFile);
398
						packageFile = new CSpkFile();
398
						packageFile = new CSpkFile();
399
						iStatus = READ_SCRIPT;
399
						iStatus = READ_SCRIPT;
400
 
400
 
401
					}
401
					}
402
					else if ( cmd == L"<ship>" )
402
					else if ( cmd == L"<ship>" )
403
					{
403
					{
404
						m_lPackages.push_back(packageFile);
-
 
405
						this->ConvertOldPackage(packageFile);
404
						_processAddPackage(packageFile);
406
						packageFile = new CXspFile();
405
						packageFile = new CXspFile();
407
						iStatus = READ_SCRIPT;
406
						iStatus = READ_SCRIPT;
408
					}
407
					}
409
					else if ( cmd == L"<base>" )
408
					else if ( cmd == L"<base>" )
410
					{
409
					{
411
						m_lPackages.push_back(packageFile);
-
 
412
						this->ConvertOldPackage(packageFile);
410
						_processAddPackage(packageFile);
413
						packageFile = new CBaseFile();
411
						packageFile = new CBaseFile();
414
						iStatus = READ_SCRIPT;
412
						iStatus = READ_SCRIPT;
415
					}
413
					}
416
					else if ( cmd == L"<archive>" )
414
					else if ( cmd == L"<archive>" )
417
					{
415
					{
418
						m_lPackages.push_back(packageFile);
-
 
419
						this->ConvertOldPackage(packageFile);
416
						_processAddPackage(packageFile);
420
						packageFile = new CArchiveFile();
417
						packageFile = new CArchiveFile();
421
						iStatus = READ_SCRIPT;
418
						iStatus = READ_SCRIPT;
422
					}
419
					}
423
					else if ( cmd == L"<;/scripts>" )
420
					else if (cmd == L"<;/scripts>")
424
					{
421
					{
425
						if ( packageFile->IsMod() && packageFile->IsEnabled() )
422
						if ( packageFile->IsMod() && packageFile->IsEnabled() )
426
							m_pEnabledMod = packageFile;
423
							m_pEnabledMod = packageFile;
427
 
424
 
428
						m_lPackages.push_back(packageFile);
-
 
429
						this->ConvertOldPackage(packageFile);
425
						_processAddPackage(packageFile);
430
					}
426
					}
431
					else
427
					else
432
					{
428
					{
433
						int fileNum = line.token(L"::", 1).toLong();
429
						int fileNum = line.token(L"::", 1).toLong();
434
						if ( fileNum >= 0 && fileNum < m_lFiles.size() )
430
						if ( fileNum >= 0 && fileNum < m_lFiles.size() )
Line 678... Line 674...
678
 
674
 
679
void CPackages::PurgeWares()
675
void CPackages::PurgeWares()
680
{
676
{
681
	// mark all delete wares as available
677
	// mark all delete wares as available
682
	for ( int i = 0; i < WAREBUFFERS; i++ )
678
	for ( int i = 0; i < WAREBUFFERS; i++ )
683
	{
679
	{
684
		for ( CListNode<SGameWare> *node = m_lGameWares[i].Front(); node; node = node->next() )
680
		for ( CListNode<SGameWare> *node = m_lGameWares[i].Front(); node; node = node->next() )
685
		{
681
		{
686
			SGameWare *w = node->Data();
682
			SGameWare *w = node->Data();
687
			if ( !w ) continue;
683
			if ( !w ) continue;
688
			if ( w->iType == WARETYPE_DELETED )
684
			if ( w->iType == WARETYPE_DELETED )
Line 730... Line 726...
730
				logDir = m_sMyDoc + L"/" + exe->sMyDoc;
726
				logDir = m_sMyDoc + L"/" + exe->sMyDoc;
731
		}
727
		}
732
	}
728
	}
733
 
729
 
734
	return CFileIO(logDir).fullFilename();
730
	return CFileIO(logDir).fullFilename();
735
}
731
}
736
 
732
 
737
Utils::WString CPackages::saveDirectory()
733
Utils::WString CPackages::saveDirectory()
738
{
734
{
739
	Utils::WString logDir = this->logDirectory();
735
	Utils::WString logDir = this->logDirectory();
740
	if ( m_iGameFlags & EXEFLAG_NOSAVESUBDIR )
736
	if ( m_iGameFlags & EXEFLAG_NOSAVESUBDIR )
741
		return logDir;
737
		return logDir;
Line 764... Line 760...
764
		Utils::WString file = Utils::WString::PadNumber(m_iFakePatch, 2);
760
		Utils::WString file = Utils::WString::PadNumber(m_iFakePatch, 2);
765
		if (checkValidPluginManagerFile(file))
761
		if (checkValidPluginManagerFile(file))
766
			useFile = file;
762
			useFile = file;
767
		else if (checkIfPluginManagerFile(file))
763
		else if (checkIfPluginManagerFile(file))
768
			useFile = file;
764
			useFile = file;
769
	}
765
	}
770
 
766
 
771
	if ( useFile.empty() )
767
	if ( useFile.empty() )
772
	{
768
	{
773
		int nextfree = this->findNextFakePatch();
769
		int nextfree = this->findNextFakePatch();
774
		--nextfree; // gets the end fake patch
770
		--nextfree; // gets the end fake patch
775
 
771
 
Line 782... Line 778...
782
				useFile = file;
778
				useFile = file;
783
				break;
779
				break;
784
			}
780
			}
785
			--nextfree;
781
			--nextfree;
786
		}
782
		}
787
	}
783
	}
788
 
784
 
789
	Utils::WString addonDir = this->getAddonDir();
785
	Utils::WString addonDir = this->getAddonDir();
790
 
786
 
791
	// couldn't find the correct file, lets search for it
787
	// couldn't find the correct file, lets search for it
792
	if ( useFile.empty() ) {
788
	if ( useFile.empty() ) {
793
		int nextfree = this->findNextFakePatch();
789
		int nextfree = this->findNextFakePatch();
Line 817... Line 813...
817
			if ( files )
813
			if ( files )
818
			{
814
			{
819
				Utils::WString useAddonDir = addonDir;
815
				Utils::WString useAddonDir = addonDir;
820
				if ( !useAddonDir.empty() ) useAddonDir += L"\\";
816
				if ( !useAddonDir.empty() ) useAddonDir += L"\\";
821
				for (auto itr = files->cbegin(); itr != files->cend(); itr++)
817
				for (auto itr = files->cbegin(); itr != files->cend(); itr++)
822
				{
818
				{
823
					if ((*itr)->sFile.Compare(L"PlugMan\\TFake.pck") )
819
					if ((*itr)->sFile.Compare(L"PlugMan\\TFake.pck") )
824
						continue;
820
						continue;
825
					if ((*itr)->sFile.Compare(useAddonDir + L"t\\44" + Utils::WString::PadNumber(PMTEXTFILE, 4) + L".pck"))
821
					if ((*itr)->sFile.Compare(useAddonDir + L"t\\44" + Utils::WString::PadNumber(PMTEXTFILE, 4) + L".pck"))
826
						continue;
822
						continue;
827
					if ((*itr)->sFile.Compare(useAddonDir + L"t\\" + Utils::WString::PadNumber(PMTEXTFILE, 4) + L"-L044.pck"))
823
					if ((*itr)->sFile.Compare(useAddonDir + L"t\\" + Utils::WString::PadNumber(PMTEXTFILE, 4) + L"-L044.pck"))
828
						continue;
824
						continue;
829
 
825
 
830
					found = true;
826
					found = true;
831
					break;
827
					break;
832
				}
828
				}
833
			}
829
			}
834
 
830
 
835
			// no files, jsut delete them
831
			// no files, jsut delete them
836
			CFileIO catFile(m_sCurrentDir + L"/" + useFile + L".cat");
832
			CFileIO catFile(m_sCurrentDir + L"/" + useFile + L".cat");
837
			if ( !files || !found )
833
			if ( !files || !found )
838
			{
834
			{
839
				if ( catFile.remove() )
835
				if ( catFile.remove() )
840
				{
836
				{
841
					CFileIO datFile(m_sCurrentDir + L"/" + useFile + L".dat");
837
					CFileIO datFile(m_sCurrentDir + L"/" + useFile + L".dat");
842
					if ( datFile.remove() )
838
					if ( datFile.remove() )
843
						return true;
839
						return true;
844
				}
840
				}
845
			}
841
			}
846
			else
842
			else
847
			{
843
			{
848
				if ( catFile.Rename(m_sCurrentDir + L"/PluginManager/PlugMan_Fake.cat") )
844
				if ( catFile.Rename(m_sCurrentDir + L"/PluginManager/PlugMan_Fake.cat") )
849
				{
845
				{
850
					CFileIO datFile(m_sCurrentDir + L"/" + useFile + L".dat");
846
					CFileIO datFile(m_sCurrentDir + L"/" + useFile + L".dat");
851
 
847
 
852
					if ( datFile.Rename(m_sCurrentDir + L"/PluginManager/PlugMan_Fake.dat") )
848
					if ( datFile.Rename(m_sCurrentDir + L"/PluginManager/PlugMan_Fake.dat") )
853
						return true;
849
						return true;
854
 
850
 
855
					// TODO: it failed, restore cat file and do error
851
					// TODO: it failed, restore cat file and do error
856
				}
852
				}
857
			}
853
			}
858
		}
854
		}
859
 
855
 
860
		// if we're here, we tryed, and failed
856
		// if we're here, we tryed, and failed
861
		return false;
857
		return false;
862
	}
858
	}
Line 904... Line 900...
904
				}
900
				}
905
			}
901
			}
906
 
902
 
907
			if ( (count && !noncount) || (count > noncount) )
903
			if ( (count && !noncount) || (count > noncount) )
908
				found = true;
904
				found = true;
909
		}
905
		}
910
	}
906
	}
911
 
907
 
912
	return found;
908
	return found;
913
}
909
}
914
 
910
 
Line 955... Line 951...
955
	}
951
	}
956
 
952
 
957
	if ( package->forumLink().empty() && package->webSite().contains(L"forum.egosoft")) {
953
	if ( package->forumLink().empty() && package->webSite().contains(L"forum.egosoft")) {
958
		package->setForumLink(package->webSite());
954
		package->setForumLink(package->webSite());
959
		package->setWebSite(L"");
955
		package->setWebSite(L"");
960
	}
956
	}
961
 
957
 
962
	// convert the version
958
	// convert the version
963
	if ( package->GetType() == TYPE_SPK )
959
	if ( package->GetType() == TYPE_SPK )
964
	{
960
	{
965
		CSpkFile *spk = (CSpkFile *)package;
961
		CSpkFile *spk = (CSpkFile *)package;
Line 1004... Line 1000...
1004
				spk->SetLibrary();
1000
				spk->SetLibrary();
1005
			}
1001
			}
1006
 
1002
 
1007
			if ( spk->GetScriptType() != CSpkFile::SCRIPTTYPE_CUSTOM )
1003
			if ( spk->GetScriptType() != CSpkFile::SCRIPTTYPE_CUSTOM )
1008
				spk->setScriptType(L"");
1004
				spk->setScriptType(L"");
1009
		}
1005
		}
1010
	}
1006
	}
1011
	else if ( package->GetType() == TYPE_XSP )
1007
	else if ( package->GetType() == TYPE_XSP )
1012
	{
1008
	{
1013
		CXspFile *xsp = (CXspFile *)package;
1009
		CXspFile *xsp = (CXspFile *)package;
1014
		Utils::WString data = xsp->shipData();
1010
		Utils::WString data = xsp->shipData();
1015
 
1011
 
Line 1025... Line 1021...
1025
		xsp->setShipData(data);
1021
		xsp->setShipData(data);
1026
	}
1022
	}
1027
 
1023
 
1028
	// any extra files that are in director folder
1024
	// any extra files that are in director folder
1029
	if ( package->AnyFileType(FILETYPE_EXTRA) )
1025
	if ( package->AnyFileType(FILETYPE_EXTRA) )
1030
	{
1026
	{
1031
		for ( C_File *f = package->GetFirstFile(FILETYPE_EXTRA); f; f = package->GetNextFile(f) )
1027
		for ( C_File *f = package->GetFirstFile(FILETYPE_EXTRA); f; f = package->GetNextFile(f) )
1032
		{
1028
		{
1033
			if ( !f->dir().Compare(L"director") )
1029
			if ( !f->dir().Compare(L"director") )
1034
				continue;
1030
				continue;
1035
			if (f->checkFileExt(L"xml") || f->checkFileExt(L"pck"))
1031
			if (f->checkFileExt(L"xml") || f->checkFileExt(L"pck"))
1036
			{
1032
			{
1037
				f->setDir(L"");
1033
				f->setDir(L"");
1038
				f->setFileType(FILETYPE_MISSION);
1034
				f->setFileType(FILETYPE_MISSION);
1039
			}
1035
			}
1040
		}
1036
		}
-
 
1037
	}
-
 
1038
}
-
 
1039
 
-
 
1040
void CPackages::_processAddPackage(CBaseFile* p)
-
 
1041
{
-
 
1042
	if (p)
-
 
1043
	{
-
 
1044
		this->ConvertOldPackage(p);
-
 
1045
		p->completeFile();
-
 
1046
		m_lPackages.push_back(p);
1041
	}
1047
	}
1042
}
1048
}
1043
 
1049
 
1044
void CPackages::UpdatePackage(CBaseFile *p)
1050
void CPackages::UpdatePackage(CBaseFile *p)
1045
{
1051
{
Line 1232... Line 1238...
1232
					node->Data()->SetLoadError(error);
1238
					node->Data()->SetLoadError(error);
1233
					errorPackageList->push_back(p);
1239
					errorPackageList->push_back(p);
1234
				}
1240
				}
1235
				else
1241
				else
1236
					++count;
1242
					++count;
1237
			}
1243
			}
1238
		}
1244
		}
1239
		packageList.clear();
1245
		packageList.clear();
1240
	}
1246
	}
1241
 
1247
 
1242
	for ( SMultiSpkFile *ms = package->GetFileList()->First(); ms; ms = package->GetFileList()->Next() )
1248
	for ( SMultiSpkFile *ms = package->GetFileList()->First(); ms; ms = package->GetFileList()->Next() )
Line 1509... Line 1515...
1509
 
1515
 
1510
	bool shuffle = package->anyFakePatchOrder();
1516
	bool shuffle = package->anyFakePatchOrder();
1511
 
1517
 
1512
	// merge the update into the old package
1518
	// merge the update into the old package
1513
	bool dontAdd = false;
1519
	bool dontAdd = false;
1514
	if ( package->GetType() == TYPE_SPK )
1520
	if ( package->GetType() == TYPE_SPK )
1515
	{
1521
	{
1516
		if ( ((CSpkFile *)package)->IsPackageUpdate() )
1522
		if ( ((CSpkFile *)package)->IsPackageUpdate() )
1517
		{
1523
		{
1518
			// now copy any files from a mod
1524
			// now copy any files from a mod
1519
			for ( CListNode<C_File> *f = package->GetFileList()->Front(); f; f = f->next() )
1525
			for ( CListNode<C_File> *f = package->GetFileList()->Front(); f; f = f->next() )
Line 1786... Line 1792...
1786
 
1792
 
1787
	// store enabled mod
1793
	// store enabled mod
1788
	if ( package->IsMod() && !disabled ) {
1794
	if ( package->IsMod() && !disabled ) {
1789
		m_pEnabledMod = package;
1795
		m_pEnabledMod = package;
1790
		CLog::log(CLog::Log_Install, 1, L"Setting package as primary mod");
1796
		CLog::log(CLog::Log_Install, 1, L"Setting package as primary mod");
1791
	}
1797
	}
1792
 
1798
 
1793
	package->updateTextDB();
1799
	package->updateTextDB();
-
 
1800
	package->completeFile();
1794
 
1801
 
1795
	m_bRemoveDir = true;
1802
	m_bRemoveDir = true;
1796
 
1803
 
1797
	CLog::log(CLog::Log_Install, 1, L"Saving data to file");
1804
	CLog::log(CLog::Log_Install, 1, L"Saving data to file");
1798
	this->WriteData();
1805
	this->WriteData();
Line 1832... Line 1839...
1832
						this->PrepareDisablePackage(depP);
1839
						this->PrepareDisablePackage(depP);
1833
				}
1840
				}
1834
 
1841
 
1835
				if ( m_lDisableList.size() )
1842
				if ( m_lDisableList.size() )
1836
					this->disablePreparedPackages(errors, progress, disabledPackages);
1843
					this->disablePreparedPackages(errors, progress, disabledPackages);
1837
			}
1844
			}
1838
		}
1845
		}
1839
	}
1846
	}
1840
 
1847
 
1841
	// interate through all the files in the package
1848
	// interate through all the files in the package
1842
	int fileCount = 0;
1849
	int fileCount = 0;
1843
	for ( CListNode<C_File> *node = fileList.Front(); node; node = node->next() )
1850
	for ( CListNode<C_File> *node = fileList.Front(); node; node = node->next() )
1844
	{
1851
	{
1845
		C_File *f = node->Data();
1852
		C_File *f = node->Data();
1846
 
1853
 
1847
		// display progress if needed
1854
		// display progress if needed
1848
		if ( progress )
1855
		if ( progress )
1849
		{
1856
		{
1850
			progress->UpdateProgress(fileCount++, maxFiles);
1857
			progress->UpdateProgress(fileCount++, maxFiles);
1851
			progress->UpdateFile(f);
1858
			progress->UpdateFile(f);
1852
		}
1859
		}
1853
 
1860
 
1854
		// skip uninstall files
1861
		// skip uninstall files
1855
		if ( f->GetFileType() == FILETYPE_UNINSTALL )
1862
		if ( f->GetFileType() == FILETYPE_UNINSTALL )
1856
		{
1863
		{
1857
			uninstallFiles.push_back(f);
1864
			uninstallFiles.push_back(f);
1858
			continue;
1865
			continue;
1859
		}
1866
		}
1860
 
1867
 
1861
		// only delete files that are not used
1868
		// only delete files that are not used
Line 1916... Line 1923...
1916
 
1923
 
1917
		if ( uninstalledPackages )
1924
		if ( uninstalledPackages )
1918
			uninstalledPackages->push_back(p);
1925
			uninstalledPackages->push_back(p);
1919
		else
1926
		else
1920
			delete p;
1927
			delete p;
-
 
1928
 
-
 
1929
		for (CListNode<SGameShip>* wNode = m_lGameShips.Front(); wNode; wNode = wNode->next())
-
 
1930
		{
-
 
1931
			if (wNode->Data()->pPackage == p)
-
 
1932
			{
-
 
1933
				wNode->Data()->pPackage = NULL;
-
 
1934
				break;
-
 
1935
			}
-
 
1936
		}
1921
	}
1937
	}
1922
 
1938
 
1923
	m_lInstallList.clear();
1939
	m_lInstallList.clear();
1924
 
1940
 
1925
	// check unistall files
1941
	// check unistall files
Line 2479... Line 2495...
2479
		if ( m_iGame == GAME_X3 && m_pEnabledMod )
2495
		if ( m_iGame == GAME_X3 && m_pEnabledMod )
2480
		{
2496
		{
2481
			C_File *fDat = m_pEnabledMod->GetFirstFile(FILETYPE_MOD);
2497
			C_File *fDat = m_pEnabledMod->GetFirstFile(FILETYPE_MOD);
2482
			while (fDat && !fDat->IsFakePatch() && !fDat->checkFileExt(L"dat"))
2498
			while (fDat && !fDat->IsFakePatch() && !fDat->checkFileExt(L"dat"))
2483
				fDat = m_pEnabledMod->GetNextFile(fDat);
2499
				fDat = m_pEnabledMod->GetNextFile(fDat);
2484
 
2500
 
2485
			if ( fDat )
2501
			if ( fDat )
2486
			{
2502
			{
2487
				C_File *fCat = m_pEnabledMod->GetFirstFile(FILETYPE_MOD);
2503
				C_File *fCat = m_pEnabledMod->GetFirstFile(FILETYPE_MOD);
2488
				while ( fCat && !fCat->IsFakePatch() && !fCat->checkFileExt(L"cat") && !fCat->baseName().Compare(fDat->baseName()) )
2504
				while ( fCat && !fCat->IsFakePatch() && !fCat->checkFileExt(L"cat") && !fCat->baseName().Compare(fDat->baseName()) )
2489
					fCat = m_pEnabledMod->GetNextFile(fCat);
2505
					fCat = m_pEnabledMod->GetNextFile(fCat);
Line 2528... Line 2544...
2528
	{
2544
	{
2529
		m_bRemoveDir = false;
2545
		m_bRemoveDir = false;
2530
		Utils::WStringList removeDirs;
2546
		Utils::WStringList removeDirs;
2531
		removeDirs.pushBack(L".");
2547
		removeDirs.pushBack(L".");
2532
		removeUnusedDirectories(removeDirs, errors);
2548
		removeUnusedDirectories(removeDirs, errors);
2533
	}
2549
	}
2534
 
2550
 
2535
	this->setCurrentDir(L"");
2551
	this->setCurrentDir(L"");
2536
		 
2552
		 
2537
	m_bLoaded = false;
2553
	m_bLoaded = false;
2538
	return true;
2554
	return true;
2539
}
2555
}
2540
 
2556
 
2541
Utils::WString CPackages::getModKey() const
2557
Utils::WString CPackages::getModKey() const
2542
{
2558
{
2543
	return m_gameExe.getModKey(m_iGame - 1);
2559
	return m_gameExe.getModKey(m_iGame - 1);
2544
}
2560
}
Line 2546... Line 2562...
2546
{
2562
{
2547
	if ( !m_pEnabledMod )
2563
	if ( !m_pEnabledMod )
2548
	{
2564
	{
2549
		if ( m_sSetMod.empty() && m_iGame == GAME_X3 )
2565
		if ( m_sSetMod.empty() && m_iGame == GAME_X3 )
2550
			return L"PluginManager";
2566
			return L"PluginManager";
2551
		return m_sSetMod;
2567
		return m_sSetMod;
2552
	}
2568
	}
2553
 
2569
 
2554
	if ( !m_pEnabledMod->IsEnabled() )
2570
	if ( !m_pEnabledMod->IsEnabled() )
2555
		return m_sSetMod;
2571
		return m_sSetMod;
2556
 
2572
 
Line 2596... Line 2612...
2596
		std::vector<Utils::WString> lines;
2612
		std::vector<Utils::WString> lines;
2597
		lines.push_back(L"//pluginmanager fake patch");
2613
		lines.push_back(L"//pluginmanager fake patch");
2598
		CLog::log(CLog::Log_Directory, 3, L"Writing pluginmanagerfake.txt file to add to Fake Patch");
2614
		CLog::log(CLog::Log_Directory, 3, L"Writing pluginmanagerfake.txt file to add to Fake Patch");
2599
		if ( !fakeFile.writeFile(lines) ) {
2615
		if ( !fakeFile.writeFile(lines) ) {
2600
			CLog::log(CLog::Log_Directory, 3, L"Writing pluginmanagerfake.txt failed!!");
2616
			CLog::log(CLog::Log_Directory, 3, L"Writing pluginmanagerfake.txt failed!!");
2601
		}
2617
		}
2602
		else {
2618
		else {
2603
			CLog::log(CLog::Log_Directory, 2, "Adding TFake.pck file into FakePatch");
2619
			CLog::log(CLog::Log_Directory, 2, "Adding TFake.pck file into FakePatch");
2604
			CCatFile fakePatch;
2620
			CCatFile fakePatch;
2605
			if (fakePatch.open(catFile.fullFilename(), this->getAddonDir(), CATREAD_DAT, true) == CATERR_NONE)
2621
			if (fakePatch.open(catFile.fullFilename(), this->getAddonDir(), CATREAD_DAT, true) == CATERR_NONE)
2606
			{
2622
			{
2607
				fakePatch.appendFile(fakeFile.fullFilename(), L"PlugMan\\TFake.pck", true, false);
2623
				fakePatch.appendFile(fakeFile.fullFilename(), L"PlugMan\\TFake.pck", true, false);
2608
				fakePatch.WriteCatFile();
2624
				fakePatch.WriteCatFile();
2609
			}
2625
			}
2610
		}
2626
		}
2611
 
2627
 
2612
		// backup existing mod files incase something happens to them
2628
		// backup existing mod files incase something happens to them
2613
		if ( !datFile.exists() || !catFile.exists() ) {
2629
		if ( !datFile.exists() || !catFile.exists() ) {
2614
			CLog::log(CLog::Log_Directory, 2, Utils::WString("ERROR: ") + (!catFile.exists() ? L"cat" : L"dat") + L" file appears to be missing");
2630
			CLog::log(CLog::Log_Directory, 2, Utils::WString("ERROR: ") + (!catFile.exists() ? L"cat" : L"dat") + L" file appears to be missing");
2615
		}
2631
		}
2616
		else {
2632
		else {
2617
			catFile.GetDirIO().create(L"Backup");
2633
			catFile.GetDirIO().create(L"Backup");
2618
			catFile.copy(catFile.dir() + L"/Backup/" + catFile.filename());
2634
			catFile.copy(catFile.dir() + L"/Backup/" + catFile.filename());
2619
			datFile.copy(datFile.dir() + L"/Backup/" + datFile.filename());
2635
			datFile.copy(datFile.dir() + L"/Backup/" + datFile.filename());
2620
		}
2636
		}
2621
 
2637
 
2622
 
2638
 
2623
 
2639
 
2624
		// find next available fake patch
2640
		// find next available fake patch
2625
		m_iFakePatch = this->findNextFakePatch();
2641
		m_iFakePatch = this->findNextFakePatch();
2626
		CLog::log(CLog::Log_Directory, 2, L"Finding next available fake patch number: " + (long)m_iFakePatch);
2642
		CLog::log(CLog::Log_Directory, 2, L"Finding next available fake patch number: " + (long)m_iFakePatch);
2627
 
2643
 
Line 2684... Line 2700...
2684
		lines.pushBack(L"SurpressProtectedWarning");
2700
		lines.pushBack(L"SurpressProtectedWarning");
2685
	if ( !m_sSetMod.empty() )
2701
	if ( !m_sSetMod.empty() )
2686
		lines.pushBack(L"SetMod: " + m_sSetMod);
2702
		lines.pushBack(L"SetMod: " + m_sSetMod);
2687
	if (!_sSaveDir.empty())
2703
	if (!_sSaveDir.empty())
2688
		lines.pushBack(L"SaveDir: " + _sSaveDir);
2704
		lines.pushBack(L"SaveDir: " + _sSaveDir);
2689
	lines.pushBack(L"ShipBuffer: " + (long)m_iShipBuffer);
2705
	lines.pushBack(L"ShipBuffer: " + Utils::WString::Number(m_iShipBuffer));
2690
	Utils::WString wareBuffer = L"WareBuffers:";
2706
	Utils::WString wareBuffer = L"WareBuffers:";
2691
	for ( int i = 0; i < WAREBUFFERS; i++ )
2707
	for ( int i = 0; i < WAREBUFFERS; i++ )
2692
		wareBuffer += Utils::WString(L" ") + (long)m_iWareBuffer[i];
2708
		wareBuffer += Utils::WString(L" ") + (long)m_iWareBuffer[i];
2693
	lines.pushBack(wareBuffer);
2709
	lines.pushBack(wareBuffer);
2694
	for ( int i = 0; i < WAREBUFFERS; i++ )
2710
	for ( int i = 0; i < WAREBUFFERS; i++ )
Line 5041... Line 5057...
5041
	{
5057
	{
5042
		m_gameExe.parseExe(L"x2.exe|0:5:1:NOSAVESUBDIR:HKCU/Software/EgoSoftware/X2/ModName:X2 The Threat:!GAMEDIR!:2:1604608!2150400:1.4 Artifical Life:1974272:1.5 Uplink");
5058
		m_gameExe.parseExe(L"x2.exe|0:5:1:NOSAVESUBDIR:HKCU/Software/EgoSoftware/X2/ModName:X2 The Threat:!GAMEDIR!:2:1604608!2150400:1.4 Artifical Life:1974272:1.5 Uplink");
5043
		m_gameExe.parseExe(L"x3.exe|30:5:1:0:HKCU/Software/Egosoft/X3/ModName:X3 Reunion:Egosoft/X3:2:2347008:2.0 Bala Gi:2367488!2375680:2.5 Uplink");
5059
		m_gameExe.parseExe(L"x3.exe|30:5:1:0:HKCU/Software/Egosoft/X3/ModName:X3 Reunion:Egosoft/X3:2:2347008:2.0 Bala Gi:2367488!2375680:2.5 Uplink");
5044
		m_gameExe.parseExe(L"x3tc.exe|35:5:1:NO_XOR|TC_TEXT|MYDOCLOG:HKCU/Software/Egosoft/X3TC/ModName:X3 Terran Conflict:Egosoft/X3TC:3:1933464!1933520:2.0 Aldrin Expansion:-1:2.5 A New Home (Superbox):-1:3.0 Balance of Power");
5060
		m_gameExe.parseExe(L"x3tc.exe|35:5:1:NO_XOR|TC_TEXT|MYDOCLOG:HKCU/Software/Egosoft/X3TC/ModName:X3 Terran Conflict:Egosoft/X3TC:3:1933464!1933520:2.0 Aldrin Expansion:-1:2.5 A New Home (Superbox):-1:3.0 Balance of Power");
5045
		m_gameExe.parseExe(L"x3ap.exe|38:2:2:NO_XOR|TC_TEXT|MYDOCLOG|ADDON:HKCU/Software/Egosoft/X3AP/ModName:X3 Albion Prelude:Egosoft/X3AP:addon!x3tc.exe:3:-1:2.0 The War Continues:-1:2.5 Operation Loose Ends:-1:3.0 Shady Business");
5061
		m_gameExe.parseExe(L"x3ap.exe|38:2:2:NO_XOR|TC_TEXT|MYDOCLOG|ADDON:HKCU/Software/Egosoft/X3AP/ModName:X3 Albion Prelude:Egosoft/X3AP:addon!x3tc.exe:3:-1:2.0 The War Continues:-1:2.5 Operation Loose Ends:-1:3.0 Shady Business");
5046
		m_gameExe.parseExe(L"x3fl.exe|39:3:3:NO_XOR|TC_TEXT|MYDOCLOG|ADDON:HKCU/Software/Egosoft/X3FL/ModName:X3 Farnham's Legacy:Egosoft/X3FL:addon2!x3tc.exe:0");
5062
		m_gameExe.parseExe(L"x3fl.exe|39:3:3:NO_XOR|TC_TEXT|SETTINGFILE|MYDOCLOG|ADDON:HKCU/Software/Egosoft/X3FL/ModName:X3 Farnham's Legacy:Egosoft/X3FL:addon2!x3tc.exe:0");
5047
	}
5063
	}
5048
}
5064
}
5049
void CPackages::startup(const Utils::WString &dir, const Utils::WString &tempDir, const Utils::WString &myDoc, const Utils::WString &mod)
5065
void CPackages::startup(const Utils::WString &dir, const Utils::WString &tempDir, const Utils::WString &myDoc, const Utils::WString &mod)
5050
{
5066
{
5051
	startup(dir, tempDir, myDoc);
5067
	startup(dir, tempDir, myDoc);
Line 5958... Line 5974...
5958
 
5974
 
5959
			// write shipyard info
5975
			// write shipyard info
5960
			if ( gs->pPackage )
5976
			if ( gs->pPackage )
5961
			{
5977
			{
5962
				int doStart = start + 5;
5978
				int doStart = start + 5;
5963
				for ( int i = SHIPYARD_ARGON; i &lt;= SHIPYARD_MAX; i *= 2 )
5979
				for (ShipyardRace i = ShipyardRace::Argon; i <= ShipyardRace::Max; i = static_cast<ShipyardRace>(static_cast<unsigned int&gt;(i) * 2))
5964
				{
5980
				{
5965
					writeData.push_back(Utils::WString(L"		<t id=\"") + (long)(doStart) + L"\">" + ((gs->pPackage->IsShipyard(i)) ? Utils::WString::Number(1) : Utils::WString::Number(0)) + L"</t>");
5981
					writeData.push_back(Utils::WString(L"		<t id=\"") + (long)(doStart) + L"\">" + ((gs->pPackage->isShipyard(i)) ? Utils::WString::Number(1) : Utils::WString::Number(0)) + L"</t>");
5966
					++doStart;
5982
					++doStart;
5967
				}
5983
				}
5968
			}
5984
			}
5969
 
5985
 
5970
			start += 20;
5986
			start += 20;
Line 6040... Line 6056...
6040
			pckFile.WriteData((char *)pckData, newFileSize);
6056
			pckFile.WriteData((char *)pckData, newFileSize);
6041
			this->addCreatedFile(pckFile.fullFilename());
6057
			this->addCreatedFile(pckFile.fullFilename());
6042
		}
6058
		}
6043
	}
6059
	}
6044
	textFile.remove();
6060
	textFile.remove();
-
 
6061
 
-
 
6062
	// write out the settings file
-
 
6063
	if (m_iGameFlags & EXEFLAG_SETTINGFILE)
-
 
6064
	{
-
 
6065
		CDirIO Dir(m_sCurrentDir);
-
 
6066
		if (!Dir.exists(L"types"))
-
 
6067
			Dir.create(L"types");
-
 
6068
		Dir.cd(L"types");
-
 
6069
 
-
 
6070
		std::vector<Utils::WString> writeData;
-
 
6071
		CFileIO dataFile(Dir.file(L"manager.txt"));
-
 
6072
		if (dataFile.exists())
-
 
6073
			dataFile.remove();
-
 
6074
 
-
 
6075
		writeData.push_back(L"Data;" + Utils::WString::Number(m_iLastUpdated) + L";" + Utils::WString::Number(this->countPackages(TYPE_SPK, true)) + L";" + Utils::WString::Number(lWares.size()) + L";" + Utils::WString::Number(lShips.size()) + L";");
-
 
6076
 
-
 
6077
		for (CListNode<CBaseFile>* node = m_lPackages.Front(); node; node = node->next())
-
 
6078
		{
-
 
6079
			CBaseFile* p = node->Data();
-
 
6080
			if (!p->IsEnabled())
-
 
6081
				continue;
-
 
6082
 
-
 
6083
			if (p->GetType() != TYPE_SPK)
-
 
6084
				continue;
-
 
6085
 
-
 
6086
			CSpkFile* spk = (CSpkFile*)p;
-
 
6087
 
-
 
6088
			// count text files
-
 
6089
			Utils::WStringList textEntries;
-
 
6090
			C_File* f = p->GetFirstFile(FILETYPE_TEXT);
-
 
6091
			while (f)
-
 
6092
			{
-
 
6093
				Utils::WString sLang;
-
 
6094
				Utils::WString id;
-
 
6095
				if (m_iGameFlags & EXEFLAG_TCTEXT)
-
 
6096
				{
-
 
6097
					id = f->baseName().token(L"-", 1);
-
 
6098
					sLang = f->baseName().token(L"-", 2);
-
 
6099
					if (sLang.empty())
-
 
6100
						sLang = L"NULL";
-
 
6101
					else
-
 
6102
						sLang = sLang.erase(0, 1);  // remove the "L"
-
 
6103
				}
-
 
6104
				else
-
 
6105
				{
-
 
6106
					sLang = f->baseName().left((int)f->baseName().length() - 4).padNumber(3);
-
 
6107
					id = f->baseName().mid(((int)f->baseName().length() - 4) + 1, 4);
-
 
6108
				}
-
 
6109
 
-
 
6110
				if (sLang != L"NULL")
-
 
6111
				{
-
 
6112
					if (sLang.toInt() == lang)
-
 
6113
						textEntries.pushBack(id);
-
 
6114
				}
-
 
6115
				f = p->GetNextFile(f);
-
 
6116
			}
-
 
6117
 
-
 
6118
			CLinkList<SSettingType>* settings = spk->settingsList();
-
 
6119
 
-
 
6120
			Utils::WString str = L"Script;" + spk->name() + L";" + spk->author() + L";" + spk->version() + L";" + spk->name(lang) + L";" + Utils::WString::Number(textEntries.size());
-
 
6121
 
-
 
6122
			for (auto itr = textEntries.begin(); itr != textEntries.end(); itr++)
-
 
6123
				str += L";" + (*itr)->str;
-
 
6124
 
-
 
6125
			str += L";" + Utils::WString::Number(settings ? settings->size() : 0);
-
 
6126
			if (settings)
-
 
6127
			{
-
 
6128
				for (CListNode<SSettingType>* sNode = settings->Front(); sNode; sNode = sNode->next())
-
 
6129
				{
-
 
6130
					SSettingType* st = sNode->Data();
-
 
6131
					str += L";" + st->sKey + L";" + spk->getSetting(st);
-
 
6132
				}
-
 
6133
			}
-
 
6134
			writeData.push_back(str + L";");
-
 
6135
		}
-
 
6136
 
-
 
6137
		for (CListNode<SGameWare>* node = lWares.Front(); node; node = node->next())
-
 
6138
		{
-
 
6139
			SGameWare* w = node->Data();
-
 
6140
			Utils::WString str;
-
 
6141
			if (w->pWare && w->iType == WARETYPE_ADDED)
-
 
6142
				str = this->convertTextString(w->sWareName);
-
 
6143
			else
-
 
6144
				str = L"-1";
-
 
6145
			str += L";" + Utils::WString(w->cType) + L";" + Utils::WString::Number(w->iPos);
-
 
6146
			writeData.push_back(L"Ware;" + str + L";");
-
 
6147
		}
-
 
6148
 
-
 
6149
		for (CListNode<SGameShip>* node = lShips.Front(); node; node = node->next())
-
 
6150
		{
-
 
6151
			SGameShip* gs = node->Data();
-
 
6152
			if (gs->iType == WARETYPE_NONE)
-
 
6153
				continue;
-
 
6154
 
-
 
6155
			Utils::WString str;
-
 
6156
			if (gs->pPackage && gs->iType == WARETYPE_ADDED)
-
 
6157
				str = gs->sShipID;
-
 
6158
			else
-
 
6159
				str = L"-1";
-
 
6160
				
-
 
6161
			str += L";" + Utils::WString::Number(gs->iPos);
-
 
6162
 
-
 
6163
			// write shipyard info
-
 
6164
			if (gs->pPackage && gs->iType == WARETYPE_ADDED)
-
 
6165
			{
-
 
6166
				for (ShipyardRace i = ShipyardRace::Argon; i <= ShipyardRace::Max; i = static_cast<ShipyardRace>(static_cast<unsigned int>(i) * 2))
-
 
6167
				{
-
 
6168
					if (gs->pPackage->isShipyard(i))
-
 
6169
						str += L";" + GetShipyardName(i);
-
 
6170
				}
-
 
6171
			}
-
 
6172
			writeData.push_back(L"Ship;" + str + L";");
-
 
6173
		}
-
 
6174
 
-
 
6175
		dataFile.writeFileUTF(&writeData);
-
 
6176
	}
6045
}
6177
}
6046
 
6178
 
6047
bool CPackages::isCurrentDir(const Utils::WString &dir) const
6179
bool CPackages::isCurrentDir(const Utils::WString &dir) const
6048
{
6180
{
6049
	Utils::WString cur = m_sCurrentDir;
6181
	Utils::WString cur = m_sCurrentDir;
Line 6287... Line 6419...
6287
			{
6419
			{
6288
				SDummy *dummy = dNode->Data();
6420
				SDummy *dummy = dNode->Data();
6289
				SDummyEntry *found = NULL;
6421
				SDummyEntry *found = NULL;
6290
				for ( CListNode<SDummyEntry> *eNode = dummyList.Front(); eNode; eNode = eNode->next() )
6422
				for ( CListNode<SDummyEntry> *eNode = dummyList.Front(); eNode; eNode = eNode->next() )
6291
				{
6423
				{
6292
					if ( eNode->Data()->sSection.Compare(dummy->sSection) )
6424
					if ( eNode->Data()->sSection.Compare(dummy->sSection) )
6293
					{
6425
					{
6294
						found = eNode->Data();
6426
						found = eNode->Data();
6295
						break;
6427
						break;
6296
					}
6428
					}
6297
				}
6429
				}
6298
				if ( !found )
6430
				if ( !found )
6299
				{
6431
				{
6300
					found = new SDummyEntry;
6432
					found = new SDummyEntry;
6301
					found->sSection = dummy->sSection;
6433
					found->sSection = dummy->sSection;
6302
					dummyList.push_back(found);
6434
					dummyList.push_back(found);
6303
				}
6435
				}
6304
				// check if its already on the list
6436
				// check if its already on the list
Line 7049... Line 7181...
7049
{
7181
{
7050
	for(CListNode<SWarePriceOverride> *node = m_lWarePrices.Front(); node; node = node->next()) {
7182
	for(CListNode<SWarePriceOverride> *node = m_lWarePrices.Front(); node; node = node->next()) {
7051
		if ( node->Data()->type == type ) {
7183
		if ( node->Data()->type == type ) {
7052
			if ( node->Data()->type == Ware_Custom && id.Compare(node->Data()->id) ) return node->Data()->relval;
7184
			if ( node->Data()->type == Ware_Custom && id.Compare(node->Data()->id) ) return node->Data()->relval;
7053
			else if ( node->Data()->type != Ware_Custom && node->Data()->pos == pos ) return node->Data()->relval;
7185
			else if ( node->Data()->type != Ware_Custom && node->Data()->pos == pos ) return node->Data()->relval;
7054
		}
7186
		}
7055
	}
7187
	}
7056
	return 0;
7188
	return 0;
7057
}
7189
}
7058
 
7190
 
7059
bool CPackages::_wareNotoOverride(enum WareTypes type, int pos, const Utils::WString &id, int *noto)
7191
bool CPackages::_wareNotoOverride(enum WareTypes type, int pos, const Utils::WString &id, int *noto)
7060
{
7192
{
7061
	for(CListNode<SWarePriceOverride> *node = m_lWarePrices.Front(); node; node = node->next()) {
7193
	for(CListNode<SWarePriceOverride> *node = m_lWarePrices.Front(); node; node = node->next()) {
7062
		if ( node->Data()->type == type && node->Data()->bNotority ) {
7194
		if ( node->Data()->type == type && node->Data()->bNotority ) {
Line 9235... Line 9367...
9235
	// make sure we can open the zip file
9367
	// make sure we can open the zip file
9236
	CBaseFile *archive = NULL;
9368
	CBaseFile *archive = NULL;
9237
#ifdef _RAR
9369
#ifdef _RAR
9238
	HANDLE hArcData;
9370
	HANDLE hArcData;
9239
	int RHCode,PFCode;
9371
	int RHCode,PFCode;
9240
	char CmtBuf[16384];
9372
	wchar_t CmtBuf[16384];
9241
	struct RARHeaderDataEx HeaderData;
9373
	struct RARHeaderDataEx HeaderData;
9242
	struct RAROpenArchiveDataEx OpenArchiveData;
9374
	struct RAROpenArchiveDataEx OpenArchiveData;
9243
 
9375
 
9244
	// find the pluginmanager text to covnert to spkfile
9376
	// find the pluginmanager text to covnert to spkfile
9245
	if ( toInstall ) {
9377
	if ( toInstall ) {
9246
		memset(&OpenArchiveData,0,sizeof(OpenArchiveData));
9378
		memset(&OpenArchiveData,0,sizeof(OpenArchiveData));
9247
		OpenArchiveData.ArcName=(char *)filename.c_str();
9379
		OpenArchiveData.ArcNameW=(wchar_t *)filename.c_str();
9248
		OpenArchiveData.CmtBuf=CmtBuf;
9380
		OpenArchiveData.CmtBufW=CmtBuf;
9249
		OpenArchiveData.CmtBufSize=sizeof(CmtBuf);
9381
		OpenArchiveData.CmtBufSize = sizeof(CmtBuf) / sizeof(CmtBuf[0]);
9250
		OpenArchiveData.OpenMode=RAR_OM_LIST;
9382
		OpenArchiveData.OpenMode=RAR_OM_LIST;
9251
		hArcData=RAROpenArchiveEx(&OpenArchiveData);
9383
		hArcData=RAROpenArchiveEx(&OpenArchiveData);
9252
 
9384
 
9253
		if (OpenArchiveData.OpenResult!=0) return NULL;
9385
		if (OpenArchiveData.OpenResult!=0) return NULL;
9254
 
9386
 
Line 9261... Line 9393...
9261
				break;
9393
				break;
9262
			}
9394
			}
9263
		}
9395
		}
9264
		RARCloseArchive(hArcData);
9396
		RARCloseArchive(hArcData);
9265
	}
9397
	}
9266
 
-
 
9267
	if ( toInstall )
-
 
9268
		archive = new CArchiveFile(); // just installing an archive file
-
 
9269
	else
-
 
9270
		archive = new CSpkFile(); // converting to a spk file
-
 
9271
 
9398
 
9272
	memset(&OpenArchiveData,0,sizeof(OpenArchiveData));
9399
	memset(&OpenArchiveData,0,sizeof(OpenArchiveData));
9273
	OpenArchiveData.ArcName=(char *)filename.c_str();
9400
	OpenArchiveData.ArcNameW = (wchar_t*)filename.c_str();
9274
	OpenArchiveData.CmtBuf=CmtBuf;
9401
	OpenArchiveData.CmtBufW = CmtBuf;
9275
	OpenArchiveData.CmtBufSize=sizeof(CmtBuf);
9402
	OpenArchiveData.CmtBufSize = sizeof(CmtBuf) / sizeof(CmtBuf[0]);
9276
	OpenArchiveData.OpenMode=RAR_OM_EXTRACT;
9403
	OpenArchiveData.OpenMode=RAR_OM_EXTRACT;
9277
	OpenArchiveData.UserData=EXTRACT;
9404
	OpenArchiveData.UserData=EXTRACT;
9278
	hArcData=RAROpenArchiveEx(&OpenArchiveData);
9405
	hArcData=RAROpenArchiveEx(&OpenArchiveData);
9279
 
9406
 
9280
	if (OpenArchiveData.OpenResult!=0) return NULL;
9407
	if (OpenArchiveData.OpenResult!=0) return NULL;
-
 
9408
 
-
 
9409
	if (toInstall)
-
 
9410
		archive = new CArchiveFile(); // just installing an archive file
-
 
9411
	else
-
 
9412
		archive = new CSpkFile(); // converting to a spk file
-
 
9413
 
9281
 
9414
 
9282
	HeaderData.CmtBuf=NULL;
9415
	HeaderData.CmtBuf=NULL;
9283
	memset(&OpenArchiveData.Reserved,0,sizeof(OpenArchiveData.Reserved));
9416
	memset(&OpenArchiveData.Reserved,0,sizeof(OpenArchiveData.Reserved));
9284
 
9417
 
9285
	bool error = false;
9418
	bool error = false;
9286
	Utils::WString extractedFile = CDirIO(m_sTempDir).file(L"extracted.tst").findReplace(L"/", L"\\").findReplace(L"\\\\", L"\\");
9419
	Utils::WString extractedFile = CDirIO(m_sTempDir).file(L"extracted.tst").findReplace(L"/", L"\\").findReplace(L"\\\\", L"\\");
9287
	while ((RHCode=RARReadHeaderEx(hArcData,&HeaderData))==0)
9420
	while ((RHCode=RARReadHeaderEx(hArcData,&HeaderData))==0)
9288
	{
9421
	{
9289
		Utils::WString fileName = HeaderData.FileName;
9422
		Utils::WString fileName(HeaderData.FileNameW);
9290
 
9423
 
9291
		if ( HeaderData.FileAttr == 16 )
9424
		if ( HeaderData.FileAttr == 16 )
9292
			continue;
9425
			continue;
9293
		PFCode=RARProcessFileW(hArcData, RAR_EXTRACT, NULL, NULL);
9426
		PFCode=RARProcessFileW(hArcData, RAR_EXTRACT, NULL, NULL);
9294
		if (PFCode!=0)
9427
		if (PFCode!=0)