diff --git a/out/boot.dol b/out/boot.dol index fa19c0b7..90074002 100644 Binary files a/out/boot.dol and b/out/boot.dol differ diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index d7b4b1aa..9a52b765 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -2018,88 +2018,124 @@ void CMenu::_initCF(void) CoverFlow.clear(); CoverFlow.reserve(m_gameList.size()); - string requiredCats; - string selectedCats; - string hiddenCats; - char id[74]; - char catID[64]; + char cfgKey1[74]; + char cfgKey2[74]; + char catKey1[64]; + char catKey2[64]; - // filter list based on categories and favorites + // filter list based on categories, favorites, and adult only for(vector::iterator hdr = m_gameList.begin(); hdr != m_gameList.end(); ++hdr) { - requiredCats = m_cat.getString("GENERAL", "required_categories", ""); - selectedCats = m_cat.getString("GENERAL", "selected_categories", ""); - hiddenCats = m_cat.getString("GENERAL", "hidden_categories", ""); - - const char *favDomain = "FAVORITES"; - const char *adultDomain = "ADULTONLY"; - - memset(id, 0, 74); - memset(catID, 0, 64); - - if(m_sourceflow) + if(m_sourceflow && !m_source.getBool(sfmt("button_%i", hdr->settings[0]), "hidden", false)) { - if(m_source.getBool(sfmt("button_%i", hdr->settings[0]), "hidden", false) == false) - CoverFlow.addItem(&(*hdr), 0, 0); + CoverFlow.addItem(&(*hdr), 0, 0);// no filtering for sourceflow continue; } - else if(hdr->type == TYPE_HOMEBREW) + + string favDomain = "FAVORITES"; + string adultDomain = "ADULTONLY"; + if(hdr->type == TYPE_PLUGIN) { - wcstombs(id, hdr->title, 63); - strcpy(catID, id); + favDomain = "FAVORITES_PLUGINS"; + adultDomain = "ADULTONLY_PLUGINS"; } + + // 1 is the one used. 2 is a temp copied to 1. + string catDomain1 = ""; + string catDomain2 = ""; + memset(catKey1, 0, 64); + memset(catKey2, 0, 64); + memset(cfgKey1, 0, 74); + memset(cfgKey2, 0, 74); + + if(hdr->type == TYPE_HOMEBREW) + wcstombs(cfgKey1, hdr->title, 63);// uses title which is the folder name in apps. else if(hdr->type == TYPE_PLUGIN) { - if(m_cat.hasDomain("PLUGINS"))// if using new style categories_lite.ini + strncpy(m_plugin.PluginMagicWord, fmt("%08x", hdr->settings[0]), 8); + + // old pre 5.4.4 method which uses plugin magic/title of game + if(strrchr(hdr->path, '/') != NULL) + wcstombs(catKey1, hdr->title, 63); + else + memcpy(catKey1, hdr->path, 63);// scummvm + strcpy(cfgKey1, fmt("%s/%s", m_plugin.PluginMagicWord, catKey1)); + + // if game has an id from the plugin database we use the new method which uses platform name/id + if(strcmp(hdr->id, "PLUGIN") != 0 && !m_platform.getString("PLUGINS", m_plugin.PluginMagicWord, "").empty()) + { + strcpy(cfgKey2, fmt("%s/%s", m_platform.getString("PLUGINS", m_plugin.PluginMagicWord).c_str(), hdr->id)); + if(m_gcfg1.has(favDomain, cfgKey1) && !m_gcfg1.has(favDomain, cfgKey2))// convert old [DOMAIN] key= to new [DOMAIN] key= + { + m_gcfg1.setString(favDomain, cfgKey2, m_gcfg1.getString(favDomain, cfgKey1)); + m_gcfg1.remove(favDomain, cfgKey1);// remove old method from cfg1 + } + if(m_gcfg1.has(adultDomain, cfgKey1) && !m_gcfg1.has(adultDomain, cfgKey2))// convert old [DOMAIN] key= to new [DOMAIN] key= + { + m_gcfg1.setString(adultDomain, cfgKey2, m_gcfg1.getString(adultDomain, cfgKey1)); + m_gcfg1.remove(adultDomain, cfgKey1);// remove old method from cfg1 + } + strcpy(cfgKey1, cfgKey2);// copy 2 temp to 1 to use. + } + } + else // wii, gc, channels + strcpy(cfgKey1, hdr->id); + + if((!m_favorites || m_gcfg1.getBool(favDomain, cfgKey1, false)) + && (!m_locked || !m_gcfg1.getBool(adultDomain, cfgKey1, false))) + { + string requiredCats = m_cat.getString("GENERAL", "required_categories", ""); + string selectedCats = m_cat.getString("GENERAL", "selected_categories", ""); + string hiddenCats = m_cat.getString("GENERAL", "hidden_categories", ""); + + if(hdr->type == TYPE_PLUGIN && m_cat.hasDomain("PLUGINS"))// if using the optional PLUGINS domain for categories_lite.ini { requiredCats = m_cat.getString("PLUGINS", "required_categories", ""); selectedCats = m_cat.getString("PLUGINS", "selected_categories", ""); hiddenCats = m_cat.getString("PLUGINS", "hidden_categories", ""); } - strncpy(m_plugin.PluginMagicWord, fmt("%08x", hdr->settings[0]), 8); - if(strrchr(hdr->path, '/') != NULL) - wcstombs(catID, hdr->title, 63); - else - strncpy(catID, hdr->path, 63);// scummvm - strcpy(id, m_plugin.PluginMagicWord); - strcat(id, fmt("/%s", catID)); - favDomain = "FAVORITES_PLUGINS"; - adultDomain = "ADULTONLY_PLUGINS"; - } - else // wii, gc, channels - { - strcpy(id, hdr->id); - strcpy(catID, id); - } - - u8 numReqCats = requiredCats.length(); - u8 numSelCats = selectedCats.length(); - u8 numHidCats = hiddenCats.length(); - - if((!m_favorites || m_gcfg1.getBool(favDomain, id, false)) - && (!m_locked || !m_gcfg1.getBool(adultDomain, id, false))) - { - string catDomain = ""; + u8 numReqCats = requiredCats.length(); + u8 numSelCats = selectedCats.length(); + u8 numHidCats = hiddenCats.length(); + if(hdr->type == TYPE_CHANNEL) - catDomain = "NAND"; + catDomain1 = "NAND"; else if(hdr->type == TYPE_EMUCHANNEL) - catDomain = "CHANNELS"; + catDomain1 = "CHANNELS"; else if(hdr->type == TYPE_GC_GAME) - catDomain = "GAMECUBE"; + catDomain1 = "GAMECUBE"; else if(hdr->type == TYPE_WII_GAME) - catDomain = "WII"; + catDomain1 = "WII"; else if(hdr->type == TYPE_HOMEBREW) - catDomain = "HOMEBREW"; - else - catDomain = m_plugin.PluginMagicWord; + catDomain1 = "HOMEBREW"; + else //hdr->type == TYPE_PLUGIN + { + // old categories method use [MAGIC] and game title as the key. + catDomain1 = m_plugin.PluginMagicWord; + // catKey1 already set above + + // if game has an id from the plugin database we use the new method which uses [platform name] and id as the key + if(strcmp(hdr->id, "PLUGIN") != 0 && !m_platform.getString("PLUGINS", m_plugin.PluginMagicWord, "").empty()) + { + catDomain2 = m_platform.getString("PLUGINS", m_plugin.PluginMagicWord); + strcpy(catKey2, hdr->id); + if(m_cat.has(catDomain1, catKey1) && !m_cat.has(catDomain2, catKey2))// convert old [DOMAIN] key= to new [DOMAIN] key= + { + m_cat.setString(catDomain2, catKey2, m_cat.getString(catDomain1, catKey1)); + m_cat.remove(catDomain1, catKey1);// remove old method from categories cfg + } + strcpy(catKey1, catKey2);// copy 2 temp to 1 to use. + catDomain1 = catDomain2; + } + } if(numReqCats != 0 || numSelCats != 0 || numHidCats != 0) // if all 0 skip checking cats and show all games { - string idCats= m_cat.getString(catDomain, catID, ""); + string idCats= m_cat.getString(catDomain1, catKey1, ""); u8 numIdCats = idCats.length(); if(numIdCats == 0) - m_cat.remove(catDomain, catID); + m_cat.remove(catDomain1, catKey1); bool inaCat = false; bool inHiddenCat = false; int reqMatch = 0; @@ -2162,41 +2198,23 @@ void CMenu::_initCF(void) } } - if(dumpGameLst && !NoGameID(hdr->type)) - { - const char *domain = NULL; - switch(hdr->type) - { - case TYPE_CHANNEL: - domain = "NAND"; - break; - case TYPE_EMUCHANNEL: - domain = "CHANNELS"; - break; - case TYPE_GC_GAME: - domain = "GAMECUBE"; - break; - default: - domain = "WII"; - break; - } - dump.setWString(domain, id, hdr->title); - } + if(dumpGameLst && (!NoGameID(hdr->type) || (hdr->type == TYPE_PLUGIN && strcmp(hdr->id, "PLUGIN") != 0))) + dump.setWString(catDomain1, catKey1, hdr->title); if(hdr->type == TYPE_PLUGIN && m_plugin.GetEnabledStatus(m_plugin.GetPluginPosition(hdr->settings[0]))) CoverFlow.addItem(&(*hdr), 0, 0); else { - int playcount = m_gcfg1.getInt("PLAYCOUNT", id, 0); - unsigned int lastPlayed = m_gcfg1.getUInt("LASTPLAYED", id, 0); + int playcount = m_gcfg1.getInt("PLAYCOUNT", cfgKey1, 0); + unsigned int lastPlayed = m_gcfg1.getUInt("LASTPLAYED", cfgKey1, 0); CoverFlow.addItem(&(*hdr), playcount, lastPlayed); } } /* remove them if false to keep file short */ - if(!m_gcfg1.getBool(favDomain, id)) - m_gcfg1.remove(favDomain, id); - if(!m_gcfg1.getBool(adultDomain, id)) - m_gcfg1.remove(adultDomain, id); + if(!m_gcfg1.getBool(favDomain, cfgKey1)) + m_gcfg1.remove(favDomain, cfgKey1); + if(!m_gcfg1.getBool(adultDomain, cfgKey1)) + m_gcfg1.remove(adultDomain, cfgKey1); } if(CoverFlow.empty()) @@ -2208,7 +2226,7 @@ void CMenu::_initCF(void) if(dumpGameLst) { dump.save(true); - m_cfg.setBool("GENERAL", "dump_list", false); + //m_cfg.setBool("GENERAL", "dump_list", false); } /*********************** sort coverflow list ***********************/ diff --git a/source/menu/menu_categories.cpp b/source/menu/menu_categories.cpp index 6e2ce430..835b426e 100644 --- a/source/menu/menu_categories.cpp +++ b/source/menu/menu_categories.cpp @@ -14,7 +14,7 @@ TexData m_categoryBg; vector m_categories; static u8 curPage; char id[64]; -const char *catDomain = NULL; +string catDomain; bool gameSet; string genDomain; @@ -134,6 +134,7 @@ void CMenu::_updateCatCheckboxes(void) void CMenu::_getGameCategories(void) { const dir_discHdr *hdr = CoverFlow.getHdr(); + /* get the domain text [TEXT] */ switch(hdr->type) { case TYPE_CHANNEL: @@ -152,20 +153,27 @@ void CMenu::_getGameCategories(void) catDomain = "WII"; break; default: - catDomain = m_plugin.PluginMagicWord; + if(strcmp(hdr->id, "PLUGIN") != 0 && !m_platform.getString("PLUGINS", m_plugin.PluginMagicWord, "").empty()) + catDomain = m_platform.getString("PLUGINS", m_plugin.PluginMagicWord);// console/platform from platform.ini + else + catDomain = m_plugin.PluginMagicWord;// no platform.ini - we use plugin magic } + /* get KEY text (before =) */ memset(id, 0, 64); - if(NoGameID(hdr->type)) + if(hdr->type == TYPE_HOMEBREW) + wcstombs(id, hdr->title, sizeof(id) - 1);//we use title(folder) because no ID and filenames are all boot.dol or boot.elf + else if(hdr->type == TYPE_PLUGIN && strcmp(hdr->id, "PLUGIN") == 0)// no ID from plugin database files { if(strrchr(hdr->path, '/') != NULL) - wcstombs(id, hdr->title, sizeof(id) - 1); + wcstombs(id, hdr->title, sizeof(id) - 1);// without ID we can't use database files. title is the rom filename without extension or custom title. else - strcpy(id, hdr->path);// scummvm + memcpy(id, hdr->path, 63);// scummvm } else - strcpy(id, hdr->id); + strcpy(id, hdr->id);// wii, gc, channels, and plugin games with an ID from database files + /* get the game's categories uing the domain and key */ const char *gameCats = m_cat.getString(catDomain, id, "").c_str(); if(strlen(gameCats) > 0) { diff --git a/source/menu/menu_config_game.cpp b/source/menu/menu_config_game.cpp index a6840e9f..68247e29 100644 --- a/source/menu/menu_config_game.cpp +++ b/source/menu/menu_config_game.cpp @@ -162,9 +162,18 @@ void CMenu::_hideConfigGame(bool instant) void CMenu::_showConfigGame() { vector custom_servers = stringToVector(m_cfg.getString("custom_servers", "servers"), '|'); + + bool b; + string adultDomain; + if(GameHdr->type == TYPE_PLUGIN) + adultDomain = "ADULTONLY_PLUGINS"; + else + adultDomain = "ADULTONLY"; + u8 i; string id; char gameTitle[64]; + memset(gameTitle, 0 , 64); if(GameHdr->type == TYPE_HOMEBREW) { @@ -174,18 +183,20 @@ void CMenu::_showConfigGame() else if(GameHdr->type == TYPE_PLUGIN) { strncpy(m_plugin.PluginMagicWord, fmt("%08x", GameHdr->settings[0]), 8); - if(strrchr(GameHdr->path, '/') != NULL) + // if game has an id from the plugin database we use the new method which uses platform name/id + if(strcmp(GameHdr->id, "PLUGIN") != 0 && !m_platform.getString("PLUGINS", m_plugin.PluginMagicWord, "").empty()) + id =sfmt("%s/%s", m_platform.getString("PLUGINS", m_plugin.PluginMagicWord).c_str(), GameHdr->id); + else // old pre 5.4.4 method which uses plugin magic/title of game { - wcstombs(gameTitle, GameHdr->title, 63); - id = string(m_plugin.PluginMagicWord) + "/" + string(gameTitle); + if(strrchr(GameHdr->path, '/') != NULL) + wcstombs(gameTitle, GameHdr->title, 63); + else + memcpy(gameTitle, GameHdr->path, 63);// scummvm + id = sfmt("%s/%s", m_plugin.PluginMagicWord, gameTitle); } - else - id = string(m_plugin.PluginMagicWord) + "/" + GameHdr->path; } else - { id = GameHdr->id; - } _setBg(m_gameSettingsBg, m_gameSettingsBg); for(i = 0; i < ARRAY_SIZE(m_gameSettingsLblUser); ++i) @@ -203,10 +214,10 @@ void CMenu::_showConfigGame() { m_configGameMaxPgs = 1; m_btnMgr.setText(m_configLbl1, _t("cfgg58", L"Adult only")); - if(GameHdr->type == TYPE_PLUGIN) - m_btnMgr.setText(m_configBtn1, m_gcfg1.getBool("ADULTONLY_PLUGINS", id, false) ? _t("yes", L"Yes") : _t("no", L"No")); - else - m_btnMgr.setText(m_configBtn1, m_gcfg1.getBool("ADULTONLY", id, false) ? _t("yes", L"Yes") : _t("no", L"No")); + b = m_gcfg1.getBool(adultDomain, id, false); + if(!b) + m_gcfg1.remove(adultDomain, id); + m_btnMgr.setText(m_configBtn1, b ? _t("yes", L"Yes") : _t("no", L"No")); m_btnMgr.show(m_configLbl1); m_btnMgr.show(m_configBtn1); @@ -228,7 +239,10 @@ void CMenu::_showConfigGame() if(m_configGamePage == 1) { m_btnMgr.setText(m_configLbl1, _t("cfgg58", L"Adult only")); - m_btnMgr.setText(m_configBtn1, m_gcfg1.getBool("ADULTONLY", id, false) ? _t("yes", L"Yes") : _t("no", L"No")); + b = m_gcfg1.getBool(adultDomain, id, false); + if(!b) + m_gcfg1.remove(adultDomain, id); + m_btnMgr.setText(m_configBtn1, b ? _t("yes", L"Yes") : _t("no", L"No")); m_btnMgr.setText(m_configLbl2, _t("cfgg10", L"IOS")); i = m_gcfg2.getUInt(id, "ios", 0); @@ -430,10 +444,16 @@ void CMenu::_configGame(const dir_discHdr *hdr, bool disc) vector custom_servers = stringToVector(m_cfg.getString("custom_servers", "servers"), '|'); m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str())); GameHdr = hdr;// set for global use in other fuctions + string adultDomain; + if(hdr->type == TYPE_PLUGIN) + adultDomain = "ADULTONLY_PLUGINS"; + else + adultDomain = "ADULTONLY"; u8 i; string id; //s8 direction; char gameTitle[64]; + memset(gameTitle, 0 , 64); if(GameHdr->type == TYPE_HOMEBREW) { @@ -443,18 +463,20 @@ void CMenu::_configGame(const dir_discHdr *hdr, bool disc) else if(GameHdr->type == TYPE_PLUGIN) { strncpy(m_plugin.PluginMagicWord, fmt("%08x", GameHdr->settings[0]), 8); - if(strrchr(GameHdr->path, '/') != NULL) + // if game has an id from the plugin database we use the new method which uses platform name/id + if(strcmp(GameHdr->id, "PLUGIN") != 0 && !m_platform.getString("PLUGINS", m_plugin.PluginMagicWord, "").empty()) + id =sfmt("%s/%s", m_platform.getString("PLUGINS", m_plugin.PluginMagicWord).c_str(), GameHdr->id); + else // old pre 5.4.4 method which uses plugin magic/title of game { - wcstombs(gameTitle, GameHdr->title, 63); - id = string(m_plugin.PluginMagicWord) + "/" + string(gameTitle); + if(strrchr(GameHdr->path, '/') != NULL) + wcstombs(gameTitle, GameHdr->title, 63); + else + memcpy(gameTitle, GameHdr->path, 63);// scummvm + id = sfmt("%s/%s", m_plugin.PluginMagicWord, gameTitle); } - else - id = string(m_plugin.PluginMagicWord) + "/" + GameHdr->path; } else - { id = GameHdr->id; - } m_configGamePage = 1; _showConfigGame(); @@ -502,11 +524,11 @@ void CMenu::_configGame(const dir_discHdr *hdr, bool disc) } else { - if(GameHdr->type == TYPE_PLUGIN) - m_gcfg1.setBool("ADULTONLY_PLUGINS", id, !m_gcfg1.getBool("ADULTONLY_PLUGINS", id, false)); - else - m_gcfg1.setBool("ADULTONLY", id, !m_gcfg1.getBool("ADULTONLY", id, false)); - m_btnMgr.setText(m_configBtn1, m_gcfg1.getBool("ADULTONLY", id, false) ? _t("yes", L"Yes") : _t("no", L"No")); + m_gcfg1.setBool(adultDomain, id, !m_gcfg1.getBool(adultDomain, id, false)); + bool b = m_gcfg1.getBool(adultDomain, id); + if(!b) + m_gcfg1.remove(adultDomain, id); + m_btnMgr.setText(m_configBtn1, b ? _t("yes", L"Yes") : _t("no", L"No")); } } else if(m_btnMgr.selected(m_configBtn2)) diff --git a/source/menu/menu_game.cpp b/source/menu/menu_game.cpp index 4184d5e0..db29ffb0 100644 --- a/source/menu/menu_game.cpp +++ b/source/menu/menu_game.cpp @@ -208,27 +208,31 @@ void CMenu::_game(bool launch) memcpy(hdr, CoverFlow.getHdr(), sizeof(dir_discHdr)); _setCurrentItem(hdr); - char id[74]; - char catID[64]; - memset(id, 0, 74); - memset(catID, 0, 64); + char gcfg1Key[74]; + char gameTitle[64]; + memset(gcfg1Key, 0, sizeof(gcfg1Key)); + memset(gameTitle, 0, sizeof(gameTitle)); if(hdr->type == TYPE_HOMEBREW) - wcstombs(id, hdr->title, 63); + wcstombs(gcfg1Key, hdr->title, 63);// uses title which is the folder name in apps. else if(hdr->type == TYPE_PLUGIN) { strncpy(m_plugin.PluginMagicWord, fmt("%08x", hdr->settings[0]), 8); - if(strrchr(hdr->path, '/') != NULL) - wcstombs(catID, hdr->title, 63); - else - strcpy(catID, hdr->path);// scummvm - strcpy(id, m_plugin.PluginMagicWord); - strcat(id, fmt("/%s", catID)); - } - else - { - strcpy(id, hdr->id); + + // if game has an id from the plugin database we use the new method which uses platform name/id + if(strcmp(hdr->id, "PLUGIN") != 0 && !m_platform.getString("PLUGINS", m_plugin.PluginMagicWord, "").empty()) + strncpy(gcfg1Key, fmt("%s/%s", m_platform.getString("PLUGINS", m_plugin.PluginMagicWord).c_str(), hdr->id), 73); + else // old pre 5.4.4 method which uses plugin magic/title of game + { + if(strrchr(hdr->path, '/') != NULL) + wcstombs(gameTitle, hdr->title, 63); + else + memcpy(gameTitle, hdr->path, 63);// scummvm + strncpy(gcfg1Key, fmt("%s/%s", m_plugin.PluginMagicWord, gameTitle), 73); + } } + else // wii, gc, channels + strcpy(gcfg1Key, hdr->id); m_zoom_banner = m_cfg.getBool(_domainFromView(), "show_full_banner", false); @@ -432,9 +436,17 @@ void CMenu::_game(bool launch) else if(m_btnMgr.selected(m_gameBtnFavoriteOn) || m_btnMgr.selected(m_gameBtnFavoriteOff)) { if(hdr->type == TYPE_PLUGIN) - m_gcfg1.setBool("FAVORITES_PLUGINS", id, !m_gcfg1.getBool("FAVORITES_PLUGINS", id, false)); + { + m_gcfg1.setBool("FAVORITES_PLUGINS", gcfg1Key, !m_gcfg1.getBool("FAVORITES_PLUGINS", gcfg1Key, false)); + if(!m_gcfg1.getBool("FAVORITES_PLUGINS", gcfg1Key, false)) + m_gcfg1.remove("FAVORITES_PLUGINS", gcfg1Key); + } else - m_gcfg1.setBool("FAVORITES", id, !m_gcfg1.getBool("FAVORITES", id, false)); + { + m_gcfg1.setBool("FAVORITES", gcfg1Key, !m_gcfg1.getBool("FAVORITES", gcfg1Key, false)); + if(!m_gcfg1.getBool("FAVORITES", gcfg1Key, false)) + m_gcfg1.remove("FAVORITES", gcfg1Key); + } if(m_favorites) m_refreshGameList = true; } @@ -549,25 +561,30 @@ void CMenu::_game(bool launch) memcpy(hdr, CoverFlow.getHdr(), sizeof(dir_discHdr));// get new game header _setCurrentItem(hdr); - memset(id, 0, 74); - memset(catID, 0, 64); - + memset(gcfg1Key, 0, sizeof(gcfg1Key)); + memset(gameTitle, 0, sizeof(gameTitle)); + if(hdr->type == TYPE_HOMEBREW) - wcstombs(id, hdr->title, 64); + wcstombs(gcfg1Key, hdr->title, 63);// uses title which is the folder name in apps. else if(hdr->type == TYPE_PLUGIN) { strncpy(m_plugin.PluginMagicWord, fmt("%08x", hdr->settings[0]), 8); - if(strrchr(hdr->path, '/') != NULL) - wcstombs(catID, hdr->title, 63); - else - strcpy(catID, hdr->path);// scummvm - strcpy(id, m_plugin.PluginMagicWord); - strcat(id, fmt("/%s", catID)); - } - else - { - strcpy(id, hdr->id); + + // if game has an id from the plugin database we use the new method which uses platform name/id + if(strcmp(hdr->id, "PLUGIN") != 0 && !m_platform.getString("PLUGINS", m_plugin.PluginMagicWord, "").empty()) + strncpy(gcfg1Key, fmt("%s/%s", m_platform.getString("PLUGINS", m_plugin.PluginMagicWord).c_str(), hdr->id), 73); + else // old pre 5.4.4 method which uses plugin magic/title of game + { + if(strrchr(hdr->path, '/') != NULL) + wcstombs(gameTitle, hdr->title, 63); + else + memcpy(gameTitle, hdr->path, 63);// scummvm + strncpy(gcfg1Key, fmt("%s/%s", m_plugin.PluginMagicWord, gameTitle), 73); + } } + else // wii, gc, channels + strcpy(gcfg1Key, hdr->id); + if(m_newGame) { m_newGame = false; @@ -614,9 +631,15 @@ void CMenu::_game(bool launch) m_btnMgr.show(m_gameBtnCategories); bool b; if(hdr->type == TYPE_PLUGIN) - b = m_gcfg1.getBool("FAVORITES_PLUGINS", id, false); + { + b = m_gcfg1.getBool("FAVORITES_PLUGINS", gcfg1Key, false); + if(!b) m_gcfg1.remove("FAVORITES_PLUGINS", gcfg1Key); + } else - b = m_gcfg1.getBool("FAVORITES", id, false); + { + b = m_gcfg1.getBool("FAVORITES", gcfg1Key, false); + if(!b) m_gcfg1.remove("FAVORITES", gcfg1Key); + } m_btnMgr.show(b ? m_gameBtnFavoriteOn : m_gameBtnFavoriteOff); m_btnMgr.hide(b ? m_gameBtnFavoriteOff : m_gameBtnFavoriteOn); for(u8 i = 0; i < ARRAY_SIZE(m_gameLblUser); ++i)