⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileloader.cpp

📁 VIGASOCO (VIdeo GAmes SOurce COde) Windows port (v0.01)
💻 CPP
字号:
// FileLoader.cpp
//
/////////////////////////////////////////////////////////////////////////////

#include <cassert>
#include "GameDataEntity.h"
#include "FileLoader.h"
#include "ILoader.h"
#include "UncompressedLoader.h"

/////////////////////////////////////////////////////////////////////////////
// initialization and cleanup
/////////////////////////////////////////////////////////////////////////////

FileLoader::FileLoader()
{
	// adds the default loader and path
	addLoader(new UncompressedLoader());
	addPath("roms");
}

FileLoader::~FileLoader()
{
	// deallocate loaders
	for (Loaders::iterator i = _loaders.begin(); i != _loaders.end(); i++){
		delete *i;
	}
}

/////////////////////////////////////////////////////////////////////////////
// loaders management
/////////////////////////////////////////////////////////////////////////////

void FileLoader::addLoader(ILoader *l)
{
	_loaders.push_back(l);
}

void FileLoader::removeLoader(ILoader *l)
{
	_loaders.remove(l);
}

void FileLoader::addPath(std::string path)
{
	_paths.push_back(path);
}


bool FileLoader::loadGameData(std::string game, GameDataEntity *gde)
{
	// allocate memory to keep track of allocated files
	bool *fileLoaded = new bool[gde->getNumFiles()];

	for (int num = 0; num < gde->getNumFiles(); num++){
		fileLoaded[num] = false;
	}

	Loaders::iterator i;

	gde->preProcess();

	// try to load all available files from each loader before trying the next one
	for (i = _loaders.begin(); i != _loaders.end(); i++){
		ILoader *loader = *i;
		Paths::iterator pathIter;

		for (pathIter = _paths.begin(); pathIter != _paths.end(); pathIter++){

			// if all the files have been loaded, exit
			bool loadComplete = true;
			for (int num = 0; num < gde->getNumFiles(); num++){
				if (!fileLoaded[num]){
					loadComplete = false;
					break;
				}
			}

			if (loadComplete){
				break;
			}

			// otherwise, try to load the remaining files with this loader
			loader->open(*pathIter, game);

			for (int num = 0; num < gde->getNumFiles(); num++){
				const GameFile *gf = gde->getFile(num);

				if (!fileLoaded[num]){
					UINT8 *data;

					data = loader->load(gf->fileName, gf->fileSize, gf->CRC32);

					if (data){
						fileLoaded[num] = true;

						// send the data back to the GameDataEntity to be processed
						gde->loadData(num, data);

						// makes the loader to dispose the memory it reserved
						loader->dispose(data);
					}
				}
			}

			loader->close();
		}
	}

	gde->postProcess();

	// check if all the files have been loaded
	bool loadComplete = true;
	for (int num = 0; num < gde->getNumFiles(); num++){
		if (!fileLoaded[num]){
			loadComplete = false;
			break;
		}
	}

	return loadComplete;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -