-more powerful detection if gamecube game is installed on

sd card by reading the sd card directory (bit slower though)
-made list cache a bit smaller again by using more general
settings, dont forget to reload list cache
This commit is contained in:
fix94.1 2012-06-17 10:22:00 +00:00
parent c90f7ff49b
commit 18373f9f3d
7 changed files with 63 additions and 35 deletions

View File

@ -1492,7 +1492,8 @@ u64 CCoverFlow::getChanTitle(void) const
{ {
if (m_covers.empty() || m_items.empty()) return 0; if (m_covers.empty() || m_items.empty()) return 0;
return m_items[loopNum(m_covers[m_range / 2].index + m_jump, m_items.size())].hdr->chantitle; return TITLE_ID(m_items[loopNum(m_covers[m_range / 2].index + m_jump, m_items.size())].hdr->settings[0],
m_items[loopNum(m_covers[m_range / 2].index + m_jump, m_items.size())].hdr->settings[1]);
} }

View File

@ -129,6 +129,9 @@ void CList<dir_discHdr>::GetHeaders(vector<string> pathlist, vector<dir_discHdr>
headerlist.reserve(pathlist.size() + headerlist.size()); headerlist.reserve(pathlist.size() + headerlist.size());
gprintf("Getting headers for paths in pathlist (%d)\n", pathlist.size()); gprintf("Getting headers for paths in pathlist (%d)\n", pathlist.size());
vector<char*> GC_SD_IDs;
bool GC_SD_IDs_loaded = false;
dir_discHdr tmp; dir_discHdr tmp;
u32 count = 0; u32 count = 0;
string GTitle; string GTitle;
@ -182,7 +185,7 @@ void CList<dir_discHdr>::GetHeaders(vector<string> pathlist, vector<dir_discHdr>
Asciify(tmp.title); Asciify(tmp.title);
//gprintf("Found: %ls\n", tmp.title); //gprintf("Found: %ls\n", tmp.title);
sscanf(plugin.getString("PLUGIN","magic","").c_str(), "%08x", &tmp.plugin_magic); //Plugin magic sscanf(plugin.getString("PLUGIN","magic","").c_str(), "%08x", &tmp.settings[0]); //Plugin magic
tmp.type = TYPE_PLUGIN; tmp.type = TYPE_PLUGIN;
headerlist.push_back(tmp); headerlist.push_back(tmp);
break; break;
@ -238,8 +241,27 @@ void CList<dir_discHdr>::GetHeaders(vector<string> pathlist, vector<dir_discHdr>
wcslcat(tmp.title, L" disc 2", sizeof(tmp.title)); wcslcat(tmp.title, L" disc 2", sizeof(tmp.title));
if(strncmp(dml_partition, "sd", 2) != 0) if(strncmp(dml_partition, "sd", 2) != 0)
{ {
if(GC_GameIsInstalled(tmp.id, DeviceName[SD], DML_DIR) || GC_GameIsInstalled((char*)fmt("%s [%s]", tmp.title, tmp.id), DeviceName[SD], DML_DIR) || GC_GameIsInstalled(tmp.path, DeviceName[SD], DML_DIR)) if(!GC_SD_IDs_loaded)
wcslcat(tmp.title, L" \n(on SD)", sizeof(tmp.title)); {
CList<dir_discHdr> tmplist;
vector<string> pathlist;
tmplist.GetPaths(pathlist, ".iso|.bin", "sd:/games", false, true);
vector<dir_discHdr> tmpGameList;
tmplist.GetHeaders(pathlist, tmpGameList, settingsDir, curLanguage, DMLgameUSBDir, plugin);
for(u8 i = 0; i < tmpGameList.size(); i++)
GC_SD_IDs.push_back(tmpGameList.at(i).id);
GC_SD_IDs_loaded = true;
}
tmp.settings[0] = 0;
for(u8 i = 0; i < GC_SD_IDs.size(); i++)
{
if(strncasecmp(GC_SD_IDs.at(i), tmp.id, 6) == 0)
{
tmp.settings[0] = 1; //Later Checks can use this as easy information
wcslcat(tmp.title, L" \n(on SD)", sizeof(tmp.title));
break;
}
}
} }
Asciify(tmp.title); Asciify(tmp.title);
@ -427,7 +449,8 @@ void CList<dir_discHdr>::GetChannels(vector<dir_discHdr> &headerlist, string set
tmp.index = headerlist.size(); tmp.index = headerlist.size();
tmp.casecolor = 1; tmp.casecolor = 1;
tmp.chantitle = chan->title; tmp.settings[0] = TITLE_UPPER(chan->title);
tmp.settings[1] = TITLE_LOWER(chan->title);
strncpy(tmp.id, chan->id, 4); strncpy(tmp.id, chan->id, 4);
int ccolor = custom_titles.getColor("COVERS", tmp.id, tmp.casecolor).intVal(); int ccolor = custom_titles.getColor("COVERS", tmp.id, tmp.casecolor).intVal();

View File

@ -77,9 +77,8 @@ struct dir_discHdr
char path[256]; char path[256];
wchar_t title[64]; wchar_t title[64];
u64 chantitle; u32 settings[2]; //chantitle, plugin magic, crc32, gamecube game on sd, etc
u32 plugin_magic;
u8 type; u8 type;
u32 casecolor; u32 casecolor;

View File

@ -1508,7 +1508,7 @@ void CMenu::_initCF(void)
{ {
string id; string id;
string tempname(m_gameList[i].path); string tempname(m_gameList[i].path);
u64 chantitle = m_gameList[i].chantitle; u64 chantitle = TITLE_ID(m_gameList[i].settings[0],m_gameList[i].settings[1]);
if(m_gameList[i].type == TYPE_HOMEBREW) if(m_gameList[i].type == TYPE_HOMEBREW)
{ {
tempname.assign(&tempname[tempname.find_last_of('/') + 1]); tempname.assign(&tempname[tempname.find_last_of('/') + 1]);
@ -1516,7 +1516,7 @@ void CMenu::_initCF(void)
} }
else if(m_gameList[i].type == TYPE_PLUGIN) else if(m_gameList[i].type == TYPE_PLUGIN)
{ {
if(!m_plugin.isScummVM(m_gameList[i].plugin_magic)) if(!m_plugin.isScummVM(m_gameList[i].settings[0]))
{ {
if(tempname.empty() || tempname.find_first_of('/') == string::npos) if(tempname.empty() || tempname.find_first_of('/') == string::npos)
{ {
@ -1661,14 +1661,14 @@ void CMenu::_initCF(void)
string tempname(m_gameList[i].path); string tempname(m_gameList[i].path);
if(tempname.find_last_of("/") != string::npos) if(tempname.find_last_of("/") != string::npos)
tempname.assign(&tempname[tempname.find_last_of("/") + 1]); tempname.assign(&tempname[tempname.find_last_of("/") + 1]);
string coverFolder(m_plugin.GetCoverFolderName(m_gameList[i].plugin_magic)); string coverFolder(m_plugin.GetCoverFolderName(m_gameList[i].settings[0]));
if(EnabledPlugins.size() == 0) //all plugins if(EnabledPlugins.size() == 0) //all plugins
m_cf.addItem(&m_gameList[i], fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder.c_str(), tempname.c_str()), playcount, lastPlayed); m_cf.addItem(&m_gameList[i], fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder.c_str(), tempname.c_str()), playcount, lastPlayed);
else else
{ {
for(u8 j = 0; j < EnabledPlugins.size(); j++) for(u8 j = 0; j < EnabledPlugins.size(); j++)
{ {
if(EnabledPlugins[j] == true && m_gameList[i].plugin_magic == m_plugin.getPluginMagic(j)) if(EnabledPlugins[j] == true && m_gameList[i].settings[0] == m_plugin.getPluginMagic(j))
{ {
m_cf.addItem(&m_gameList[i], fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder.c_str(), tempname.c_str()), playcount, lastPlayed); m_cf.addItem(&m_gameList[i], fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder.c_str(), tempname.c_str()), playcount, lastPlayed);
break; break;

View File

@ -476,19 +476,24 @@ void CMenu::_game(bool launch)
dir_discHdr *hdr = m_cf.getHdr(); dir_discHdr *hdr = m_cf.getHdr();
if(currentPartition != SD && hdr->type == TYPE_GC_GAME) if(currentPartition != SD && hdr->type == TYPE_GC_GAME)
{ {
char gcfolder[300]; bool foundOnSD;
snprintf(gcfolder, sizeof(gcfolder), "%s [%s]", m_cf.getTitle().toUTF8().c_str(), (char *)hdr->id); CList<dir_discHdr> tmplist;
if(GC_GameIsInstalled((char *)hdr->id, DeviceName[SD], DML_DIR)) vector<string> pathlist;
tmplist.GetPaths(pathlist, ".iso|.bin", "sd:/games", false, true);
vector<dir_discHdr> tmpGameList;
Config nullCfg;
tmplist.GetHeaders(pathlist, tmpGameList, m_settingsDir, m_curLanguage, m_DMLgameDir, nullCfg);
for(u8 i = 0; i < tmpGameList.size(); i++)
{ {
memset(hdr->path, 0, sizeof(hdr->path)); if(strncasecmp(tmpGameList.at(i).id, hdr->id, 6) == 0)
strncpy(hdr->path, (char*)hdr->id, sizeof(hdr->path)); {
foundOnSD = true;
memset(hdr->path, 0, sizeof(hdr->path));
strncpy(hdr->path, tmpGameList.at(i).path, sizeof(hdr->path));
break;
}
} }
else if(GC_GameIsInstalled(gcfolder, DeviceName[SD], DML_DIR)) if(!foundOnSD && !_wbfsOp(CMenu::WO_COPY_GAME))
{
memset(hdr->path, 0, sizeof(hdr->path));
strncpy(hdr->path, gcfolder, sizeof(hdr->path));
}
else if(!GC_GameIsInstalled(hdr->path, DeviceName[SD], DML_DIR) && !_wbfsOp(CMenu::WO_COPY_GAME))
break; break;
currentPartition = SD; currentPartition = SD;
} }
@ -647,7 +652,7 @@ void CMenu::_launch(dir_discHdr *hdr)
string path((char*)hdr->path, size_t(strlen((char*)hdr->path) - title.size())); string path((char*)hdr->path, size_t(strlen((char*)hdr->path) - title.size()));
vector<string> arguments; vector<string> arguments;
gprintf("Game title: %s\n", title.c_str()); gprintf("Game title: %s\n", title.c_str());
if(m_plugin.isMplayerCE(hdr->plugin_magic)) if(m_plugin.isMplayerCE(hdr->settings[0]))
arguments = m_plugin.CreateMplayerCEArguments(string(hdr->path).c_str()); arguments = m_plugin.CreateMplayerCEArguments(string(hdr->path).c_str());
else if(strstr(path.c_str(), ":/") != NULL) else if(strstr(path.c_str(), ":/") != NULL)
{ {
@ -655,7 +660,7 @@ void CMenu::_launch(dir_discHdr *hdr)
path.erase(3,1); path.erase(3,1);
arguments.push_back(path); arguments.push_back(path);
arguments.push_back(title); arguments.push_back(title);
if(m_plugin.UseReturnLoader(hdr->plugin_magic)) if(m_plugin.UseReturnLoader(hdr->settings[0]))
arguments.push_back(sfmt("%s/WiiFlowLoader.dol",m_pluginsDir.c_str())); arguments.push_back(sfmt("%s/WiiFlowLoader.dol",m_pluginsDir.c_str()));
else else
arguments.push_back(wiiflow_dol); arguments.push_back(wiiflow_dol);
@ -668,7 +673,7 @@ void CMenu::_launch(dir_discHdr *hdr)
wcstombs(gametitle, hdr->title, sizeof(gametitle)); wcstombs(gametitle, hdr->title, sizeof(gametitle));
m_cfg.setString("EMULATOR", "current_item", gametitle); m_cfg.setString("EMULATOR", "current_item", gametitle);
} }
_launchHomebrew(fmt("%s/%s", m_pluginsDir.c_str(), m_plugin.GetDolName(hdr->plugin_magic)), arguments); _launchHomebrew(fmt("%s/%s", m_pluginsDir.c_str(), m_plugin.GetDolName(hdr->settings[0])), arguments);
return; return;
} }
else if(hdr->type == TYPE_HOMEBREW) else if(hdr->type == TYPE_HOMEBREW)
@ -980,7 +985,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
if(!forwarder) if(!forwarder)
{ {
entry = channel.Load(hdr->chantitle, &ios); entry = channel.Load(TITLE_ID(hdr->settings[0],hdr->settings[1]), &ios);
setLanguage(language); setLanguage(language);
SmartBuf cheatFile; SmartBuf cheatFile;
@ -1072,11 +1077,11 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
if(forwarder) if(forwarder)
{ {
WII_Initialize(); WII_Initialize();
if(WII_LaunchTitle(hdr->chantitle) < 0) if(WII_LaunchTitle(TITLE_ID(hdr->settings[0],hdr->settings[1])) < 0)
Sys_LoadMenu(); Sys_LoadMenu();
} }
if(!BootChannel(entry, hdr->chantitle, ios, videoMode, vipatch, countryPatch, patchVidMode, aspectRatio)) if(!BootChannel(entry, TITLE_ID(hdr->settings[0],hdr->settings[1]), ios, videoMode, vipatch, countryPatch, patchVidMode, aspectRatio))
Sys_LoadMenu(); Sys_LoadMenu();
} }
@ -1442,7 +1447,7 @@ void CMenu::_gameSoundThread(CMenu *m)
} }
else if(m->m_cf.getHdr()->type == TYPE_PLUGIN) else if(m->m_cf.getHdr()->type == TYPE_PLUGIN)
{ {
m->m_gameSound.Load(m->m_plugin.GetBannerSound(m->m_cf.getHdr()->plugin_magic), m->m_plugin.GetBannerSoundSize(), false); m->m_gameSound.Load(m->m_plugin.GetBannerSound(m->m_cf.getHdr()->settings[0]), m->m_plugin.GetBannerSoundSize(), false);
m->m_gamesound_changed = true; m->m_gamesound_changed = true;
return; return;
} }
@ -1453,7 +1458,7 @@ void CMenu::_gameSoundThread(CMenu *m)
Banner *banner = m->m_gameSoundHdr->type == TYPE_WII_GAME ? Banner *banner = m->m_gameSoundHdr->type == TYPE_WII_GAME ?
_extractBnr(m->m_gameSoundHdr) : m->m_gameSoundHdr->type == TYPE_CHANNEL ? _extractBnr(m->m_gameSoundHdr) : m->m_gameSoundHdr->type == TYPE_CHANNEL ?
_extractChannelBnr(m->m_gameSoundHdr->chantitle) : NULL; _extractChannelBnr(TITLE_ID(m->m_gameSoundHdr->settings[0],m->m_gameSoundHdr->settings[1])) : NULL;
m->m_gameSoundHdr = NULL; m->m_gameSoundHdr = NULL;
if (banner == NULL || !banner->IsValid()) if (banner == NULL || !banner->IsValid())

View File

@ -329,13 +329,13 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
{ {
Disc_ReadHeader(&header); Disc_ReadHeader(&header);
if (_searchGamesByID((const char *) header.id).size() != 0) if(_searchGamesByID((const char *) header.id).size() != 0)
{ {
error(_t("wbfsoperr4", L"Game already installed")); error(_t("wbfsoperr4", L"Game already installed"));
out = true; out = true;
break; break;
} }
cfPos = string((char *) header.id); cfPos = string((char *)header.id);
m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wbfsop6", L"Installing [%s] %s..."), string((const char *)header.id, sizeof header.id).c_str(), string((const char *)header.title, sizeof header.title).c_str())); m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wbfsop6", L"Installing [%s] %s..."), string((const char *)header.id, sizeof header.id).c_str(), string((const char *)header.title, sizeof header.title).c_str()));
done = true; done = true;
upd_usb = true; upd_usb = true;
@ -352,7 +352,7 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
char dmlgamedir[50]; char dmlgamedir[50];
strncpy(dmlgamedir, (currentPartition != SD) ? m_DMLgameDir.c_str() : DML_DIR, sizeof(dmlgamedir)); strncpy(dmlgamedir, (currentPartition != SD) ? m_DMLgameDir.c_str() : DML_DIR, sizeof(dmlgamedir));
snprintf(gcfolder, sizeof(gcfolder), "%s [%s]", gcheader.title, (char *)gcheader.id); snprintf(gcfolder, sizeof(gcfolder), "%s [%s]", gcheader.title, (char *)gcheader.id);
if (_searchGamesByID((const char *) gcheader.id).size() != 0 || GC_GameIsInstalled((char *)gcheader.id, DeviceName[currentPartition], dmlgamedir) || GC_GameIsInstalled(gcfolder, DeviceName[currentPartition], dmlgamedir)) if(_searchGamesByID((const char *) gcheader.id).size() != 0)
{ {
error(_t("wbfsoperr4", L"Game already installed")); error(_t("wbfsoperr4", L"Game already installed"));
out = true; out = true;

View File

@ -221,7 +221,7 @@ vector<dir_discHdr> Plugin::ParseScummvmINI(Config &ini, string Device)
wcsncpy(tmp.title, tmpString.c_str(), 64); wcsncpy(tmp.title, tmpString.c_str(), 64);
strncpy(tmp.path, game.c_str(), sizeof(tmp.path)); strncpy(tmp.path, game.c_str(), sizeof(tmp.path));
gprintf("Found: %ls\n", tmp.title); gprintf("Found: %ls\n", tmp.title);
tmp.plugin_magic = Plugins.back().magicWord; tmp.settings[0] = Plugins.back().magicWord;
tmp.type = TYPE_PLUGIN; tmp.type = TYPE_PLUGIN;
gameHeader.push_back(tmp); gameHeader.push_back(tmp);
game = ini.nextDomain(); game = ini.nextDomain();
@ -281,7 +281,7 @@ bool Plugin::isScummVM(u32 magic)
string Plugin::GenerateCoverLink(dir_discHdr gameHeader, string url) string Plugin::GenerateCoverLink(dir_discHdr gameHeader, string url)
{ {
Plugin_Pos = GetPluginPosition(gameHeader.plugin_magic); Plugin_Pos = GetPluginPosition(gameHeader.settings[0]);
if(url.find(TAG_LOC) != url.npos) if(url.find(TAG_LOC) != url.npos)
url.replace(url.find(TAG_LOC), strlen(TAG_LOC), "EN"); url.replace(url.find(TAG_LOC), strlen(TAG_LOC), "EN");