- Plugin game list generator now gets rom title and ID from wiimpathy's plugins database files. a 'reload cache' will need to be done for each plugin source so the title and ID can be added to the current cached list. custom titles still work and will override plugin database files. titles are based on custom titles file then plugins database file and finally the rom filename. if the ID is not found in the plugins database files it will have an ID of 'PLUGIN' and no game info will be displayed on the game info screen.

arcade rom clones are not included in the plugins database files to keep the files short. Any arcade rom clones you have will either not be found or will aquire the same ID and title as the parent rom when the CRC of the clone rom is included in the parent roms list of CRC's. you will need to manually edit both the CRC list file and xml database file to include the rom info on any clone you have in order for them to display the correct title and game info. i would think only a small handfull of your roms would be clones.

reload cache may take longer now to create the cached list. I found zipped roms for snes, nes, and others are no problem because even if the filename can't be found the crc does not need to be calculated. it is merely taken from the zip file which already holds the crc. on the other hand, half of my gba roms are unzipped with a gba extension. so my gba list takes 10 seconds or so to make because the crc of the unzipped roms does need to be calculated. mame roms use the filename but if it's a clone then it will calculate the crc of the rom zip file. thus any clones will slow things down unless you add them to the database files mentioned above. I imagine megaCD and PS1 cd games will be slow to reload cache. but at least you only need to do it once or whenever you add or delete a game.

wiimpathy's database files use the no intro naming convention. i'm not crazy about it because it moves any leading 'the' to the end preceded by a comma. in this case i use custom titles ini to put the title the way i want.
This commit is contained in:
Fledge68 2019-09-11 15:57:16 -05:00
parent d4579b57c3
commit 13e65956fe
9 changed files with 199 additions and 136 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 MiB

After

Width:  |  Height:  |  Size: 3.4 MiB

View File

@ -28,9 +28,12 @@
ListGenerator m_cacheList; ListGenerator m_cacheList;
Config CustomTitles; Config CustomTitles;
GameTDB gameTDB; GameTDB gameTDB;
Config romNamesDB;
string platformName;
string pluginsDataDir;
dir_discHdr ListElement; dir_discHdr ListElement;
void ListGenerator::Init(const char *settingsDir, const char *Language) void ListGenerator::Init(const char *settingsDir, const char *Language, const char *plgnsDataDir)
{ {
if(settingsDir != NULL) if(settingsDir != NULL)
{ {
@ -38,6 +41,7 @@ void ListGenerator::Init(const char *settingsDir, const char *Language)
CustomTitlesPath = fmt("%s/" CTITLES_FILENAME, settingsDir); CustomTitlesPath = fmt("%s/" CTITLES_FILENAME, settingsDir);
} }
if(Language != NULL) gameTDB_Language = Language; if(Language != NULL) gameTDB_Language = Language;
if(plgnsDataDir != NULL) pluginsDataDir = fmt("%s", plgnsDataDir);
} }
void ListGenerator::Clear(void) void ListGenerator::Clear(void)
@ -179,36 +183,6 @@ static void Add_GameCube_Game(char *FullPath)
} }
} }
/* add plugin rom, song, or video to the list */
const char *RomTitle = NULL;
static void Add_Plugin_Game(char *FullPath)
{
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
strncpy(ListElement.path, FullPath, sizeof(ListElement.path) - 1);
memcpy(ListElement.id, "PLUGIN", 6);
RomTitle = strrchr(FullPath, '/') + 1;
*strrchr(RomTitle, '.') = '\0';
char PluginMagicWord[9];
memset(PluginMagicWord, 0, sizeof(PluginMagicWord));
strncpy(PluginMagicWord, fmt("%08x", m_cacheList.Magic), 8);
char CustomTitle[64];
memset(CustomTitle, 0, sizeof(CustomTitle));
strncpy(CustomTitle, CustomTitles.getString(PluginMagicWord, RomTitle).c_str(), 63);
if(strlen(CustomTitle) > 0)
mbstowcs(ListElement.title, CustomTitle, 63);
else
mbstowcs(ListElement.title, RomTitle, 63);
Asciify(ListElement.title);
ListElement.settings[0] = m_cacheList.Magic; //Plugin magic
ListElement.casecolor = m_cacheList.Color;
ListElement.type = TYPE_PLUGIN;
m_cacheList.push_back(ListElement);
}
/* add homebrew boot.dol to the list */ /* add homebrew boot.dol to the list */
static void Add_Homebrew_Dol(char *FullPath) static void Add_Homebrew_Dol(char *FullPath)
{ {
@ -278,6 +252,105 @@ static void Create_Channel_List(bool realNAND)
} }
} }
/* add plugin rom, song, or video to the list. */
static void Add_Plugin_Game(char *FullPath)
{
/* Get roms's title without the extra ()'s or []'s */
string ShortName = m_plugin.GetRomName(FullPath);
//gprintf("shortName=%s\n", ShortName.c_str());
/* get rom's ID */
string romID = "";
if(gameTDB.IsLoaded())
{
/* Get 6 character unique romID (from Screenscraper.fr) using shortName. if fails then use CRC or CD serial to get romID */
romID = m_plugin.GetRomId(FullPath, m_cacheList.Magic, romNamesDB, pluginsDataDir.c_str(), platformName.c_str(), ShortName.c_str());
}
if(romID.empty())
romID = "PLUGIN";
//gprintf("romID=%s\n", romID.c_str());
/* add rom to list */
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
strncpy(ListElement.path, FullPath, sizeof(ListElement.path) - 1);
strncpy(ListElement.id, romID.c_str(), 6);
/* Get titles - Rom filename, custom title, and database xml title */
const char *RomFilename = strrchr(FullPath, '/') + 1;
*strrchr(RomFilename, '.') = '\0';
char CustomTitle[64];
memset(CustomTitle, 0, sizeof(CustomTitle));
strncpy(CustomTitle, CustomTitles.getString(m_plugin.PluginMagicWord, RomFilename).c_str(), 63);
const char *gameTDB_Title = NULL;
if(gameTDB.IsLoaded() && strlen(CustomTitle) == 0)
gameTDB.GetName(ListElement.id, gameTDB_Title);
/* set the roms title */
if(strlen(CustomTitle) > 0)
mbstowcs(ListElement.title, CustomTitle, 63);
else if(gameTDB_Title != NULL && gameTDB_Title[0] != '\0')
mbstowcs(ListElement.title, gameTDB_Title, 63);
else
mbstowcs(ListElement.title, RomFilename, 63);
Asciify(ListElement.title);
ListElement.settings[0] = m_cacheList.Magic; //Plugin magic
ListElement.casecolor = m_cacheList.Color;
ListElement.type = TYPE_PLUGIN;
m_cacheList.push_back(ListElement);
}
/* note: scummvm games have list generator in plugin.cpp */
void ListGenerator::CreateRomList(Config &platform_cfg, const string& romsDir, const vector<string>& FileTypes, const string& DBName, bool UpdateCache)
{
Clear();
if(!DBName.empty())
{
if(UpdateCache)
fsop_deleteFile(DBName.c_str());
else
{
CCache(*this, DBName, LOAD);
if(!this->empty())
return;
fsop_deleteFile(DBName.c_str());
}
}
if(platform_cfg.loaded())
{
/* Search platform.ini to find plugin magic to get platformName */
platformName = platform_cfg.getString("PLUGINS", m_plugin.PluginMagicWord);
if(!platformName.empty())
{
/* check COMBINED for platform names that mean the same system just different region */
/* some platforms have different names per country (ex. Genesis/Megadrive) */
/* but we use only one platform name for both */
string newName = platform_cfg.getString("COMBINED", platformName);
if(newName.empty())
platform_cfg.remove("COMBINED", platformName);
else
platformName = newName;
/* Load rom names and crc database */
romNamesDB.load(fmt("%s/%s/%s.ini", pluginsDataDir.c_str(), platformName.c_str(), platformName.c_str()));
/* Load platform name.xml database to get game's info using the gameID */
gameTDB.OpenFile(fmt("%s/%s/%s.xml", pluginsDataDir.c_str(), platformName.c_str(), platformName.c_str()));
if(gameTDB.IsLoaded())
gameTDB.SetLanguageCode(gameTDB_Language.c_str());
}
}
CustomTitles.load(CustomTitlesPath.c_str());
GetFiles(romsDir.c_str(), FileTypes, Add_Plugin_Game, false, 30);//wow 30 subfolders! really?
CloseConfigs();
romNamesDB.unload();
if(!this->empty() && !DBName.empty()) /* Write a new Cache */
CCache(*this, DBName, SAVE);
}
void ListGenerator::CreateList(u32 Flow, u32 Device, const string& Path, const vector<string>& FileTypes, void ListGenerator::CreateList(u32 Flow, u32 Device, const string& Path, const vector<string>& FileTypes,
const string& DBName, bool UpdateCache) const string& DBName, bool UpdateCache)
{ {
@ -314,8 +387,6 @@ void ListGenerator::CreateList(u32 Flow, u32 Device, const string& Path, const v
{ {
if(Flow == COVERFLOW_GAMECUBE) if(Flow == COVERFLOW_GAMECUBE)
GetFiles(Path.c_str(), FileTypes, Add_GameCube_Game, true);// true means to look for a folder (/root) GetFiles(Path.c_str(), FileTypes, Add_GameCube_Game, true);// true means to look for a folder (/root)
else if(Flow == COVERFLOW_PLUGIN)
GetFiles(Path.c_str(), FileTypes, Add_Plugin_Game, false, 30);//wow 30 subfolders! really?
else if(Flow == COVERFLOW_HOMEBREW) else if(Flow == COVERFLOW_HOMEBREW)
GetFiles(Path.c_str(), FileTypes, Add_Homebrew_Dol, false); GetFiles(Path.c_str(), FileTypes, Add_Homebrew_Dol, false);
} }

View File

@ -27,6 +27,7 @@
#include "loader/wbfs.h" #include "loader/wbfs.h"
#include "loader/disc.h" #include "loader/disc.h"
#include "gui/GameTDB.hpp" #include "gui/GameTDB.hpp"
#include "plugin/plugin.hpp"
using namespace std; using namespace std;
@ -34,8 +35,9 @@ class ListGenerator : public vector<dir_discHdr>
{ {
public: public:
void createSFList(u8 maxBtns, Config &m_sourceMenuCfg, const string& sourceDir); void createSFList(u8 maxBtns, Config &m_sourceMenuCfg, const string& sourceDir);
void Init(const char *settingsDir, const char *Language); void Init(const char *settingsDir, const char *Language, const char *plgnsDataDir);
void Clear(); void Clear();
void CreateRomList(Config &platform_cfg, const string& romsDir, const vector<string>& FileTypes, const string& DBName, bool UpdateCache);
void CreateList(u32 Flow, u32 Device, const string& Path, const vector<string>& FileTypes, void CreateList(u32 Flow, u32 Device, const string& Path, const vector<string>& FileTypes,
const string& DBName, bool UpdateCache); const string& DBName, bool UpdateCache);
u32 Color; u32 Color;

View File

@ -369,7 +369,7 @@ bool CMenu::init()
} }
/* Init gametdb and custom titles for game list making */ /* Init gametdb and custom titles for game list making */
m_cacheList.Init(m_settingsDir.c_str(), m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()); m_cacheList.Init(m_settingsDir.c_str(), m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str(), m_pluginDataDir.c_str());
/* Init the onscreen pointer */ /* Init the onscreen pointer */
m_aa = 3; m_aa = 3;
@ -2434,7 +2434,7 @@ bool CMenu::_loadPluginList()
for(u8 i = 0; m_plugin.PluginExist(i); ++i) for(u8 i = 0; m_plugin.PluginExist(i); ++i)
{ {
u32 Magic = m_plugin.getPluginMagic(i); u32 Magic = m_plugin.getPluginMagic(i);
if(!m_plugin.GetEnableStatus(m_cfg, Magic)) if(!m_plugin.GetEnableStatus(m_cfg, Magic))// m_plugin.PluginMagicWord is set here.
continue; continue;
int romsPartition = m_plugin.GetRomPartition(i); int romsPartition = m_plugin.GetRomPartition(i);
if(romsPartition < 0) if(romsPartition < 0)
@ -2479,29 +2479,31 @@ bool CMenu::_loadPluginList()
} }
else else
{ {
string gameDir(fmt("%s:/%s", DeviceName[currentPartition], romDir)); string romsDir(fmt("%s:/%s", DeviceName[currentPartition], romDir));
string cacheDir(fmt("%s/%s_%s.db", m_listCacheDir.c_str(), DeviceName[currentPartition], m_plugin.PluginMagicWord)); string cachedListFile(fmt("%s/%s_%s.db", m_listCacheDir.c_str(), DeviceName[currentPartition], m_plugin.PluginMagicWord));
if(updateCache || !fsop_FileExist(cacheDir.c_str())) if(updateCache || !fsop_FileExist(cachedListFile.c_str()))
cacheCovers = true; cacheCovers = true;
vector<string> FileTypes = stringToVector(m_plugin.GetFileTypes(i), '|'); vector<string> FileTypes = stringToVector(m_plugin.GetFileTypes(i), '|');
m_cacheList.Color = m_plugin.GetCaseColor(i); m_cacheList.Color = m_plugin.GetCaseColor(i);
m_cacheList.Magic = Magic; m_cacheList.Magic = Magic;
m_cacheList.CreateList(COVERFLOW_PLUGIN, currentPartition, gameDir, FileTypes, cacheDir, updateCache); m_cacheList.CreateRomList(m_platform, romsDir, FileTypes, cachedListFile, updateCache);
for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++) for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++)
m_gameList.push_back(*tmp_itr); m_gameList.push_back(*tmp_itr);
} }
} }
else else
{ {
Config scummvm;
vector<dir_discHdr> scummvmList; vector<dir_discHdr> scummvmList;
Config scummvm;
if(!scummvm.load(fmt("%s/scummvm.ini", m_pluginsDir.c_str()))) if(!scummvm.load(fmt("%s/scummvm.ini", m_pluginsDir.c_str())))
{ {
if(!scummvm.load(fmt("%s/scummvm/scummvm.ini", m_pluginsDir.c_str()))) if(!scummvm.load(fmt("%s/scummvm/scummvm.ini", m_pluginsDir.c_str())))
scummvm.load(fmt("%s:/apps/scummvm/scummvm.ini", DeviceName[currentPartition])); scummvm.load(fmt("%s:/apps/scummvm/scummvm.ini", DeviceName[currentPartition]));
} }
//also check if in apps folder string platformName = "";
scummvmList = m_plugin.ParseScummvmINI(scummvm, DeviceName[currentPartition], Magic); if(m_platform.loaded())/* convert plugin magic to platform name */
platformName = m_platform.getString("PLUGINS", m_plugin.PluginMagicWord);
scummvmList = m_plugin.ParseScummvmINI(scummvm, DeviceName[currentPartition], Magic, m_pluginDataDir.c_str(), platformName.c_str());
for(vector<dir_discHdr>::iterator tmp_itr = scummvmList.begin(); tmp_itr != scummvmList.end(); tmp_itr++) for(vector<dir_discHdr>::iterator tmp_itr = scummvmList.begin(); tmp_itr != scummvmList.end(); tmp_itr++)
m_gameList.push_back(*tmp_itr); m_gameList.push_back(*tmp_itr);
scummvmList.clear(); scummvmList.clear();

View File

@ -176,7 +176,7 @@ int CMenu::_configAdv(void)
_hideConfigAdv(); _hideConfigAdv();
if(m_curLanguage != prevLanguage) if(m_curLanguage != prevLanguage)
{ {
m_cacheList.Init(m_settingsDir.c_str(), m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()); m_cacheList.Init(m_settingsDir.c_str(), m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str(), m_pluginDataDir.c_str());
fsop_deleteFolder(m_listCacheDir.c_str());// delete cache lists folder and remake it so all lists update. fsop_deleteFolder(m_listCacheDir.c_str());// delete cache lists folder and remake it so all lists update.
fsop_MakeFolder(m_listCacheDir.c_str()); fsop_MakeFolder(m_listCacheDir.c_str());
m_refreshGameList = true; m_refreshGameList = true;

View File

@ -343,7 +343,8 @@ void CMenu::_textGameInfo(void)
snprintf(platformName, sizeof(platformName), "%s", m_platform.getString("PLUGINS", m_plugin.PluginMagicWord).c_str()); snprintf(platformName, sizeof(platformName), "%s", m_platform.getString("PLUGINS", m_plugin.PluginMagicWord).c_str());
if(strstr(platformName, "multi") != NULL)// if multi platform ie. vbagx, genplusgx, get file extension if(strstr(platformName, "multi") != NULL)// if multi platform ie. vbagx, genplusgx, get file extension
{ {
char ext[4]; return; //if multi found (old platform.ini)
/*char ext[4];
if(strstr(GameHdr->path, ".zip") != NULL)// if zip get internal filename extension if(strstr(GameHdr->path, ".zip") != NULL)// if zip get internal filename extension
{ {
ZipFile zFile(GameHdr->path); ZipFile zFile(GameHdr->path);
@ -354,7 +355,7 @@ void CMenu::_textGameInfo(void)
{ {
strcpy(ext, strrchr(GameHdr->path, '.') + 1); strcpy(ext, strrchr(GameHdr->path, '.') + 1);
} }
snprintf(platformName, sizeof(platformName), "%s", m_platform.getString("ext", ext).c_str()); snprintf(platformName, sizeof(platformName), "%s", m_platform.getString("ext", ext).c_str());*/
} }
if(strlen(platformName) == 0) if(strlen(platformName) == 0)
return;// no platform name found to match plugin magic # return;// no platform name found to match plugin magic #
@ -369,17 +370,12 @@ void CMenu::_textGameInfo(void)
snprintf(platformName, sizeof(platformName), "%s", newName.c_str()); snprintf(platformName, sizeof(platformName), "%s", newName.c_str());
/* Get roms's title without the extra ()'s or []'s */ /* Get roms's title without the extra ()'s or []'s */
string ShortName = m_plugin.GetRomName(GameHdr); string ShortName = m_plugin.GetRomName(GameHdr->path);
/* Get 6 character unique romID (from Screenscraper.fr) using shortName. if fails then use CRC or CD serial */
string romID;
if(!ShortName.empty())
romID = m_plugin.GetRomId(GameHdr, m_pluginDataDir.c_str(), platformName, ShortName);
else
return;// no romID. short name and crc/serial not found
/* copy rom ID to be used as gameID to get game info from xml */ /* copy rom ID to be used as gameID to get game info from xml */
strncpy(GameID, romID.c_str(), 6); strncpy(GameID, GameHdr->id, 6);
if(strcasecmp(GameID, "PLUGIN") == 0)
return;
/* Load platform name.xml database to get game's info using the gameID */ /* Load platform name.xml database to get game's info using the gameID */
gametdb.OpenFile(fmt("%s/%s/%s.xml", m_pluginDataDir.c_str(), platformName, platformName)); gametdb.OpenFile(fmt("%s/%s/%s.xml", m_pluginDataDir.c_str(), platformName, platformName));

View File

@ -227,18 +227,22 @@ const vector<bool> &Plugin::GetEnabledPlugins(Config &cfg, u8 *num)
} }
/* notes: "description" is used as the title because it basically is the title */ /* notes: "description" is used as the title because it basically is the title */
/* the [GameDomain] is used as the path even thought it isn't the path */ /* the [GameDomain] is used as the path even though it isn't the path */
/* the [GameDomain] is usually short without any '/' */ /* the [GameDomain] is usually short without any '/' */
/* in scummvm.ini the path is the path without the exe or main app file added on */ /* in scummvm.ini the path is the path without the exe or main app file added on */
vector<dir_discHdr> Plugin::ParseScummvmINI(Config &ini, const char *Device, u32 Magic) vector<dir_discHdr> Plugin::ParseScummvmINI(Config &ini, const char *Device, u32 Magic, const char *datadir, const char *platform)
{ {
gprintf("Parsing scummvm.ini\n"); gprintf("Parsing scummvm.ini\n");
vector<dir_discHdr> gameHeader; vector<dir_discHdr> ScummvmList;
if(!ini.loaded()) if(!ini.loaded())
return gameHeader; return ScummvmList;
Config m_crc;
if(platform != NULL)
m_crc.load(fmt("%s/%s/%s.ini", datadir, platform, platform));
dir_discHdr ListElement;
const char *GameDomain = ini.firstDomain().c_str(); const char *GameDomain = ini.firstDomain().c_str();
dir_discHdr ListElement;
while(1) while(1)
{ {
if(strlen(GameDomain) < 2) if(strlen(GameDomain) < 2)
@ -251,18 +255,35 @@ vector<dir_discHdr> Plugin::ParseScummvmINI(Config &ini, const char *Device, u32
GameDomain = ini.nextDomain().c_str(); GameDomain = ini.nextDomain().c_str();
continue; continue;
} }
/* get shortName */
char *cp;
if((cp = strstr(GameName, " (")) != NULL)
*cp = '\0';
/* get Game ID */
string GameID = "PLUGIN";
// Get game ID based on GameName
if(m_crc.loaded() && m_crc.has(platform, GameName))
{
vector<string> searchID = m_crc.getStrings(platform, GameName, '|');
if(!searchID[0].empty())
GameID = searchID[0];
}
memset((void*)&ListElement, 0, sizeof(dir_discHdr)); memset((void*)&ListElement, 0, sizeof(dir_discHdr));
memcpy(ListElement.id, PLUGIN, 6); memcpy(ListElement.id, GameID.c_str(), 6);
ListElement.casecolor = Plugins.back().caseColor; ListElement.casecolor = Plugins.back().caseColor;
mbstowcs(ListElement.title, GameName, 63); mbstowcs(ListElement.title, GameName, 63);
strncpy(ListElement.path, GameDomain, sizeof(ListElement.path)); strncpy(ListElement.path, GameDomain, sizeof(ListElement.path));
gprintf("Found: %s\n", GameDomain); //gprintf("Found: %s\n", GameDomain);
ListElement.settings[0] = Magic; ListElement.settings[0] = Magic;
ListElement.type = TYPE_PLUGIN; ListElement.type = TYPE_PLUGIN;
gameHeader.push_back(ListElement); ScummvmList.push_back(ListElement);
GameDomain = ini.nextDomain().c_str(); GameDomain = ini.nextDomain().c_str();
} }
return gameHeader; m_crc.unload();
return ScummvmList;
} }
vector<string> Plugin::CreateArgs(const char *device, const char *path, vector<string> Plugin::CreateArgs(const char *device, const char *path,
@ -292,12 +313,9 @@ vector<string> Plugin::CreateArgs(const char *device, const char *path,
} }
/* Give the current game a simplified name */ /* Give the current game a simplified name */
string Plugin::GetRomName(const dir_discHdr *gameHeader) string Plugin::GetRomName(const char *FullPath)
{ {
if(strrchr(gameHeader->path, '/') != NULL) string FullName = strrchr(FullPath, '/') + 1;
{
// Remove extension
string FullName = strrchr(gameHeader->path, '/') + 1;
FullName = FullName.substr(0, FullName.find_last_of(".")); FullName = FullName.substr(0, FullName.find_last_of("."));
// Remove common suffixes and replace unwanted characters. // Remove common suffixes and replace unwanted characters.
@ -305,19 +323,6 @@ string Plugin::GetRomName(const dir_discHdr *gameHeader)
replace(ShortName.begin(), ShortName.end(), '_', ' '); replace(ShortName.begin(), ShortName.end(), '_', ' ');
return ShortName; return ShortName;
} }
else
{
// ScummVM
char title[64];
wcstombs(title, gameHeader->title, 63);
title[63] = '\0';
string FullName = title;
string ShortName = FullName.substr(0, FullName.find(" (")).substr(0, FullName.find(" ["));
return ShortName;
}
}
/* Get serial from PS1 header's iso (Borrowed from Retroarch with a few c++ changes)*/ /* Get serial from PS1 header's iso (Borrowed from Retroarch with a few c++ changes)*/
static int GetSerialPS1(const char *path, string &Serial, int sub_channel_mixed) static int GetSerialPS1(const char *path, string &Serial, int sub_channel_mixed)
@ -460,39 +465,26 @@ void GetSerialMegaCD(const char *path, string &Serial)
* and can also be used for snapshots/cartriges/discs images. * and can also be used for snapshots/cartriges/discs images.
* The Game ID is a 6 length alphanumerical value. It's screenscraper ID filled with 'A' letter. * The Game ID is a 6 length alphanumerical value. It's screenscraper ID filled with 'A' letter.
*/ */
string Plugin::GetRomId(const dir_discHdr *gameHeader, const char *datadir, char *platform, const string &name) string Plugin::GetRomId(char *romPath, u32 Magic, Config &m_crc, const char *datadir, const char *platform, const char *name)
{ {
string GameID; string GameID = "";
string CRC_Serial(12, '*'); string CRC_Serial(12, '*');// 12 digits because of ps1 and megaCD serials which can be 10 or more digits
// Load a platform list that is used to identify the current game. // Search a platform list that is used to identify the current game.
// It contains a default filename(preferably No-intro without region flag), the GameID and then all known CRC32/serials. // It contains a default filename(preferably No-intro without region flag), the GameID and then all known CRC32/serials.
// filename=GameID|crc1|crc2|etc... // filename=GameID|crc1|crc2|etc...
// For example in SUPERNES.ini : Super Aleste=2241AA|5CA5781B|... // For example in SUPERNES.ini : Super Aleste=2241AA|5CA5781B|...
Config m_crc;
m_crc.unload();
m_crc.load(fmt("%s/%s/%s.ini", datadir, platform, platform) );
bool found_name = false;
found_name = m_crc.has(platform, name.c_str());
// Get game ID based on the filename // Get game ID based on the filename
if(found_name) if(m_crc.has(platform, name))
{
vector<string> searchID = m_crc.getStrings(platform, name.c_str(), '|');
if(!searchID.empty())
{ {
vector<string> searchID = m_crc.getStrings(platform, name, '|');
if(!searchID[0].empty())
GameID = searchID[0]; GameID = searchID[0];
} }
m_crc.unload();
}
// Get game ID by CRC or serial // Get game ID by CRC or serial
else else
{ {
m_crc.unload();
char crc_string[9]; char crc_string[9];
crc_string[0] = '\0'; crc_string[0] = '\0';
u32 buffer; u32 buffer;
@ -501,15 +493,15 @@ string Plugin::GetRomId(const dir_discHdr *gameHeader, const char *datadir, char
// For arcade games use the crc zip // For arcade games use the crc zip
if(strcasestr(platform, "ARCADE") || strcasestr(platform, "CPS") || !strncasecmp(platform, "NEOGEO", 6)) if(strcasestr(platform, "ARCADE") || strcasestr(platform, "CPS") || !strncasecmp(platform, "NEOGEO", 6))
{ {
strncpy(crc_string, fmt("%08x", crc32file(gameHeader->path)), 8); strncpy(crc_string, fmt("%08x", crc32file(romPath)), 8);
crc_string[8] = '\0'; crc_string[8] = '\0';
} }
else else
{ {
// Look for for the file's crc inside the archive // Look for for the file's crc inside the archive
if(strstr(gameHeader->path, ".zip") != NULL) if(strstr(romPath, ".zip") != NULL)
{ {
infile.open(gameHeader->path, ios::binary); infile.open(romPath, ios::binary);
infile.seekg(0x0e, ios::beg); infile.seekg(0x0e, ios::beg);
infile.read((char*)&buffer, 8); infile.read((char*)&buffer, 8);
infile.close(); infile.close();
@ -522,19 +514,19 @@ string Plugin::GetRomId(const dir_discHdr *gameHeader, const char *datadir, char
// CRC calculation would take up to 30 seconds! // CRC calculation would take up to 30 seconds!
if(!strcasecmp(platform, "MEGACD")) if(!strcasecmp(platform, "MEGACD"))
{ {
GetSerialMegaCD(gameHeader->path, CRC_Serial); GetSerialMegaCD(romPath, CRC_Serial);
} }
else if(!strcasecmp(platform, "PS1")) else if(!strcasecmp(platform, "PS1"))
{ {
bool found; bool found;
found = GetSerialPS1(gameHeader->path, CRC_Serial, 0); found = GetSerialPS1(romPath, CRC_Serial, 0);
if(!found) if(!found)
GetSerialPS1(gameHeader->path, CRC_Serial, 1); GetSerialPS1(romPath, CRC_Serial, 1);
} }
else if(!strcasecmp(platform, "ATARIST")) else if(!strcasecmp(platform, "ATARIST"))
{ {
s8 pos = m_plugin.GetPluginPosition(gameHeader->settings[0]); s8 pos = m_plugin.GetPluginPosition(Magic);
string FileTypes = m_plugin.GetFileTypes(pos); string FileTypes = m_plugin.GetFileTypes(pos);
string path; string path;
@ -543,7 +535,7 @@ string Plugin::GetRomId(const dir_discHdr *gameHeader, const char *datadir, char
{ {
Config m_cfg; Config m_cfg;
m_cfg.unload(); m_cfg.unload();
m_cfg.load(fmt("%s", gameHeader->path) ); m_cfg.load(fmt("%s", romPath) );
path = m_cfg.getString("Floppy", "szDiskAFileName", ""); path = m_cfg.getString("Floppy", "szDiskAFileName", "");
m_cfg.unload(); m_cfg.unload();
@ -555,7 +547,7 @@ string Plugin::GetRomId(const dir_discHdr *gameHeader, const char *datadir, char
} }
else else
{ {
path = gameHeader->path; path = romPath;
} }
if (path.find(".zip") != std::string::npos) if (path.find(".zip") != std::string::npos)
@ -575,13 +567,13 @@ string Plugin::GetRomId(const dir_discHdr *gameHeader, const char *datadir, char
} }
else if(!strcasecmp(platform, "DOS")) else if(!strcasecmp(platform, "DOS"))
{ {
s8 pos = m_plugin.GetPluginPosition(gameHeader->settings[0]); s8 pos = m_plugin.GetPluginPosition(Magic);
string FileTypes = m_plugin.GetFileTypes(pos); string FileTypes = m_plugin.GetFileTypes(pos);
if(strcasestr(FileTypes.c_str(), ".conf")) if(strcasestr(FileTypes.c_str(), ".conf"))
{ {
ifstream inputFile; ifstream inputFile;
inputFile.open(gameHeader->path, std::ios::binary); inputFile.open(romPath, std::ios::binary);
string line; string line;
std::string dospath; std::string dospath;
std::string temp; std::string temp;
@ -646,17 +638,22 @@ string Plugin::GetRomId(const dir_discHdr *gameHeader, const char *datadir, char
}// Just check CRC for a regular file on any other system. }// Just check CRC for a regular file on any other system.
else else
{ {
strncpy(crc_string, fmt("%08x", crc32file(gameHeader->path)), 8); strncpy(crc_string, fmt("%08x", crc32file(romPath)), 8);
crc_string[8] = '\0'; crc_string[8] = '\0';
} }
} }
} }
if(crc_string[0] != '\0') if(crc_string[0] != '\0')
{
CRC_Serial = crc_string; CRC_Serial = crc_string;
//gprintf("romCRC=%s\n", crc_string);
}
// Now search ID with the obtained CRC/Serial /****************************************************************/
// Just add 2 pipes in the pattern to be sure we don't find a crc instead of ID /* Now search ID with the obtained CRC/Serial */
/* Just add 2 pipes in the pattern to be sure we don't find a crc instead of ID */
/* note crc's are 8 digits but serials can be more, thats why we use idx for CRC_Serial length */
size_t idx; size_t idx;
idx=CRC_Serial.length(); idx=CRC_Serial.length();
CRC_Serial.insert(0, "|").insert(idx+1, "|"); CRC_Serial.insert(0, "|").insert(idx+1, "|");
@ -667,24 +664,19 @@ string Plugin::GetRomId(const dir_discHdr *gameHeader, const char *datadir, char
while(getline(inputFile, line)) while(getline(inputFile, line))
{ {
// FIXME ahem, ignore case... // FIXME ahem, ignore case... - line could contain a mix of lower and upper case. if so this 'if' will not work
if(line.find(lowerCase( CRC_Serial ), 0) != string::npos || line.find(upperCase( CRC_Serial ), 0) != string::npos) if(line.find(lowerCase( CRC_Serial ), 0) != string::npos || line.find(upperCase( CRC_Serial ), 0) != string::npos)
{ {
unsigned first = (line.find('=') + 1); unsigned first = (line.find('=') + 1);
unsigned last = line.find_first_of('|'); unsigned last = line.find_first_of('|');// we could just use first + 6 since all ID's are 6 digits
string ID = line.substr (first,last-first); string ID = line.substr (first,last-first);
if(ID.empty()) if(!ID.empty())
{
return "";
}
GameID = ID; GameID = ID;
break; break;
} }
} }
} }
return GameID; return GameID;
} }

View File

@ -65,8 +65,8 @@ public:
const char *GetDolName(u32 magic); const char *GetDolName(u32 magic);
const char *GetCoverFolderName(u32 magic); const char *GetCoverFolderName(u32 magic);
const char *GetRomDir(u8 pos); const char *GetRomDir(u8 pos);
string GetRomName(const dir_discHdr *gameHeader); string GetRomName(const char *FullPath);
string GetRomId(const dir_discHdr *gameHeader,const char *datadir, char *platform, const string &name); string GetRomId(char *romPath, u32 Magic, Config &m_crc, const char *datadir, const char *platform, const char *name);
int GetRomPartition(u8 pos); int GetRomPartition(u8 pos);
const string& GetFileTypes(u8 pos); const string& GetFileTypes(u8 pos);
wstringEx GetPluginName(u8 pos); wstringEx GetPluginName(u8 pos);
@ -85,7 +85,7 @@ public:
vector<string> CreateArgs(const char *device, const char *path, vector<string> CreateArgs(const char *device, const char *path,
const char *title, const char *loader, u32 title_len_no_ext, u32 magic); const char *title, const char *loader, u32 title_len_no_ext, u32 magic);
vector<dir_discHdr> ParseScummvmINI(Config &ini, const char *Device, u32 Magic); vector<dir_discHdr> ParseScummvmINI(Config &ini, const char *Device, u32 Magic, const char *datadir, const char *platform);
string GenerateCoverLink(dir_discHdr gameHeader, const string& constURL, Config &Checksums); string GenerateCoverLink(dir_discHdr gameHeader, const string& constURL, Config &Checksums);
char PluginMagicWord[9]; char PluginMagicWord[9];

View File

@ -1 +1 @@
<pd><ViewState><e p="Wiiflow\portlibs" x="false"></e><e p="Wiiflow\source\cheats" x="false"></e><e p="Wiiflow\docs" x="false"></e><e p="Wiiflow\source\fileOps" x="false"></e><e p="Wiiflow\source\gecko" x="false"></e><e p="Wiiflow\source\homebrew" x="false"></e><e p="Wiiflow\source\loader" x="false"></e><e p="Wiiflow\source\wstringEx" x="false"></e><e p="Wiiflow\source\gc" x="false"></e><e p="Wiiflow\source\list" x="false"></e><e p="Wiiflow\source\music" x="false"></e><e p="Wiiflow\source\banner" x="false"></e><e p="Wiiflow\source\config" x="false"></e><e p="Wiiflow\source\libwbfs" x="false"></e><e p="Wiiflow\source\memory" x="false"></e><e p="Wiiflow\source\sicksaxis-wrapper" x="false"></e><e p="Wiiflow\source" x="true"></e><e p="Wiiflow\source\channel" x="false"></e><e p="Wiiflow\source\hw" x="false"></e><e p="Wiiflow\source\menu" x="true"></e><e p="Wiiflow\source\network" x="false"></e><e p="Wiiflow\source\plugin" x="false"></e><e p="Wiiflow\source\unzip" x="false"></e><e p="Wiiflow\wii" x="false"></e><e p="Wiiflow\data" x="false"></e><e p="Wiiflow\resources" x="false"></e><e p="Wiiflow\scripts" x="false"></e><e p="Wiiflow\source\booter" x="false"></e><e p="Wiiflow\source\devicemounter" x="false"></e><e p="Wiiflow\source\gui" x="true"></e><e p="Wiiflow" x="true"></e></ViewState></pd> <pd><ViewState><e p="Wiiflow\portlibs" x="false"></e><e p="Wiiflow\source\cheats" x="false"></e><e p="Wiiflow\docs" x="false"></e><e p="Wiiflow\source\fileOps" x="false"></e><e p="Wiiflow\source\gecko" x="false"></e><e p="Wiiflow\source\homebrew" x="false"></e><e p="Wiiflow\source\loader" x="false"></e><e p="Wiiflow\source\wstringEx" x="false"></e><e p="Wiiflow\source\gc" x="false"></e><e p="Wiiflow\source\list" x="true"></e><e p="Wiiflow\source\music" x="false"></e><e p="Wiiflow\source\banner" x="false"></e><e p="Wiiflow\source\config" x="true"></e><e p="Wiiflow\source\libwbfs" x="false"></e><e p="Wiiflow\source\memory" x="false"></e><e p="Wiiflow\source\sicksaxis-wrapper" x="false"></e><e p="Wiiflow\source" x="true"></e><e p="Wiiflow\source\channel" x="false"></e><e p="Wiiflow\source\hw" x="false"></e><e p="Wiiflow\source\menu" x="true"></e><e p="Wiiflow\source\network" x="false"></e><e p="Wiiflow\source\plugin" x="true"></e><e p="Wiiflow\source\unzip" x="false"></e><e p="Wiiflow\wii" x="false"></e><e p="Wiiflow\data" x="false"></e><e p="Wiiflow\resources" x="false"></e><e p="Wiiflow\scripts" x="false"></e><e p="Wiiflow\source\booter" x="false"></e><e p="Wiiflow\source\devicemounter" x="false"></e><e p="Wiiflow\source\gui" x="false"></e><e p="Wiiflow" x="true"></e></ViewState></pd>