mirror of
https://github.com/SourMesen/Mesen2.git
synced 2025-04-02 10:21:44 -04:00
65 lines
No EOL
1.8 KiB
C++
65 lines
No EOL
1.8 KiB
C++
#pragma once
|
|
#include "pch.h"
|
|
#include "Shared/Emulator.h"
|
|
#include "Shared/MessageManager.h"
|
|
#include "Utilities/VirtualFile.h"
|
|
#include "Utilities/FolderUtilities.h"
|
|
#include "Utilities/HexUtilities.h"
|
|
|
|
class RomFinder
|
|
{
|
|
private:
|
|
static string FindMatchingRom(Emulator* emu, string romName, uint32_t crc32)
|
|
{
|
|
if(emu->IsRunning() && emu->GetCrc32() == crc32) {
|
|
//Current game matches
|
|
return emu->GetRomInfo().RomFile;
|
|
}
|
|
|
|
string lcRomname = romName;
|
|
std::transform(lcRomname.begin(), lcRomname.end(), lcRomname.begin(), ::tolower);
|
|
|
|
vector<string> romFiles;
|
|
vector<string> folders = FolderUtilities::GetKnownGameFolders();
|
|
if(emu->IsRunning()) {
|
|
//Look in the same folder as the current game first
|
|
folders.insert(folders.begin(), emu->GetRomInfo().RomFile.GetFolderPath());
|
|
}
|
|
|
|
unordered_set<string> checkedFolders;
|
|
for(string folder : folders) {
|
|
if(!checkedFolders.emplace(folder).second) {
|
|
//Already checked this folder
|
|
continue;
|
|
}
|
|
|
|
for(string romFilename : FolderUtilities::GetFilesInFolder(folder, VirtualFile::RomExtensions, true)) {
|
|
string lcRomFile = romFilename;
|
|
std::transform(lcRomFile.begin(), lcRomFile.end(), lcRomFile.begin(), ::tolower);
|
|
|
|
if(FolderUtilities::GetFilename(lcRomname, false) == FolderUtilities::GetFilename(lcRomFile, false) && VirtualFile(romFilename).GetCrc32() == crc32) {
|
|
return romFilename;
|
|
}
|
|
}
|
|
}
|
|
|
|
MessageManager::Log("Could not find matching file: " + romName + " CRC32: " + HexUtilities::ToHex(crc32, true));
|
|
|
|
return "";
|
|
}
|
|
|
|
public:
|
|
static bool LoadMatchingRom(Emulator* emu, string romName, uint32_t crc32)
|
|
{
|
|
if(emu->IsRunning() && emu->GetCrc32() == crc32) {
|
|
//Current game matches
|
|
return true;
|
|
}
|
|
|
|
string match = FindMatchingRom(emu, romName, crc32);
|
|
if(!match.empty()) {
|
|
return emu->LoadRom(match, VirtualFile(""));
|
|
}
|
|
return false;
|
|
}
|
|
}; |