mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2025-01-11 19:39:09 +01:00
- Now disabling Plugin Select menu if you're using the source menu/flow. (no need for both)
- Now disabling View Select icon/button on main screen if you are using Source Menu with multi source select. (easier to handle this way) - Fixed Source Menu multi select. Now using 'A' button instead of '+' button to select sources. '+' and '-' can now be used to change pages just like all other menus. Added Clear button to clear all source buttons. If none selected defaults to Wii. After making selections use Back button or 'B' to go back. - Added the ability to select both NAND and EmuNAND Channels at the same time. Three options to do this. 1. Use Source Menu multi select. 2. Switch to Channels View then press 'B' while pointing at Settings icon on main screen. If you keep pressing 'B' it will cycle you thru NAND, EmuNAND, and Both. 3. Use the Plugin Select menu with the new emuchannels.ini plugin and the channels.ini plugin to select one or both. (in plugin view of course) - Other code cleanup and minor changes here and there to make things work with being able to select both real nand and emu nand together. - Still have a few things to change but this should be fine for now.
This commit is contained in:
parent
7a5c6f5fec
commit
ce0108939d
BIN
out/boot.dol
BIN
out/boot.dol
Binary file not shown.
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 3.1 MiB |
@ -556,6 +556,16 @@ void CCoverFlow::setCoverFlipping(const Vector3D &pos, const Vector3D &angle, co
|
|||||||
m_flipCoverScale = scale;
|
m_flipCoverScale = scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CCoverFlow::setCoverFlipPos(const Vector3D &pos)
|
||||||
|
{
|
||||||
|
if (m_covers == NULL || !m_selected) return;
|
||||||
|
LockMutex lock(m_mutex);
|
||||||
|
|
||||||
|
CCoverFlow::CCover &cvr = m_covers[m_range / 2];
|
||||||
|
m_flipCoverPos = pos;
|
||||||
|
cvr.targetPos = m_loSelected.centerPos + m_flipCoverPos;
|
||||||
|
}
|
||||||
|
|
||||||
void CCoverFlow::setBlur(u32 blurResolution, u32 blurRadius, float blurFactor)
|
void CCoverFlow::setBlur(u32 blurResolution, u32 blurRadius, float blurFactor)
|
||||||
{
|
{
|
||||||
static const struct { u32 x; u32 y; } blurRes[] = {
|
static const struct { u32 x; u32 y; } blurRes[] = {
|
||||||
|
@ -115,6 +115,7 @@ public:
|
|||||||
void setRowDeltaAngles(bool selected, const Vector3D &top, const Vector3D &bottom);
|
void setRowDeltaAngles(bool selected, const Vector3D &top, const Vector3D &bottom);
|
||||||
void setRowAngles(bool selected, const Vector3D &top, const Vector3D &bottom);
|
void setRowAngles(bool selected, const Vector3D &top, const Vector3D &bottom);
|
||||||
void setCoverFlipping(const Vector3D &pos, const Vector3D &angle, const Vector3D &scale);
|
void setCoverFlipping(const Vector3D &pos, const Vector3D &angle, const Vector3D &scale);
|
||||||
|
void setCoverFlipPos(const Vector3D &pos);
|
||||||
void setBlur(u32 blurResolution, u32 blurRadius, float blurFactor);
|
void setBlur(u32 blurResolution, u32 blurRadius, float blurFactor);
|
||||||
void setSorting(Sorting sorting);
|
void setSorting(Sorting sorting);
|
||||||
//
|
//
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "gui/coverflow.hpp"
|
#include "gui/coverflow.hpp"
|
||||||
#include "gui/text.hpp"
|
#include "gui/text.hpp"
|
||||||
|
|
||||||
ListGenerator m_gameList;
|
ListGenerator m_cacheList;
|
||||||
Config CustomTitles;
|
Config CustomTitles;
|
||||||
GameTDB gameTDB;
|
GameTDB gameTDB;
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ static void AddISO(const char *GameID, const char *GameTitle, const char *GamePa
|
|||||||
u32 GameColor, u8 Type)
|
u32 GameColor, u8 Type)
|
||||||
{
|
{
|
||||||
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
||||||
ListElement.index = m_gameList.size();
|
ListElement.index = m_cacheList.size();
|
||||||
if(GameID != NULL) strncpy(ListElement.id, GameID, 6);
|
if(GameID != NULL) strncpy(ListElement.id, GameID, 6);
|
||||||
if(GamePath != NULL) strncpy(ListElement.path, GamePath, sizeof(ListElement.path) - 1);
|
if(GamePath != NULL) strncpy(ListElement.path, GamePath, sizeof(ListElement.path) - 1);
|
||||||
ListElement.casecolor = CustomTitles.getColor("COVERS", ListElement.id, GameColor).intVal();
|
ListElement.casecolor = CustomTitles.getColor("COVERS", ListElement.id, GameColor).intVal();
|
||||||
@ -92,7 +92,7 @@ static void AddISO(const char *GameID, const char *GameTitle, const char *GamePa
|
|||||||
Asciify(ListElement.title);
|
Asciify(ListElement.title);
|
||||||
|
|
||||||
ListElement.type = Type;
|
ListElement.type = Type;
|
||||||
m_gameList.push_back(ListElement);
|
m_cacheList.push_back(ListElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Create_Wii_WBFS_List(wbfs_t *handle)
|
static void Create_Wii_WBFS_List(wbfs_t *handle)
|
||||||
@ -145,8 +145,8 @@ static void Create_GC_List(char *FullPath)
|
|||||||
fread(gc_disc, 1, 1, fp);
|
fread(gc_disc, 1, 1, fp);
|
||||||
if(gc_disc[0])
|
if(gc_disc[0])
|
||||||
{
|
{
|
||||||
wcslcat(m_gameList.back().title, L" disc 2", 63);
|
wcslcat(m_cacheList.back().title, L" disc 2", 63);
|
||||||
m_gameList.back().settings[0] = 1;
|
m_cacheList.back().settings[0] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@ -166,7 +166,7 @@ static void Create_Plugin_List(char *FullPath)
|
|||||||
|
|
||||||
char PluginMagicWord[9];
|
char PluginMagicWord[9];
|
||||||
memset(PluginMagicWord, 0, sizeof(PluginMagicWord));
|
memset(PluginMagicWord, 0, sizeof(PluginMagicWord));
|
||||||
strncpy(PluginMagicWord, fmt("%08x", m_gameList.Magic), 8);
|
strncpy(PluginMagicWord, fmt("%08x", m_cacheList.Magic), 8);
|
||||||
const char *CustomTitle = CustomTitles.getString(PluginMagicWord, FolderTitle).c_str();
|
const char *CustomTitle = CustomTitles.getString(PluginMagicWord, FolderTitle).c_str();
|
||||||
if(CustomTitle != NULL && CustomTitle[0] != '\0')
|
if(CustomTitle != NULL && CustomTitle[0] != '\0')
|
||||||
mbstowcs(ListElement.title, CustomTitle, 63);
|
mbstowcs(ListElement.title, CustomTitle, 63);
|
||||||
@ -174,10 +174,10 @@ static void Create_Plugin_List(char *FullPath)
|
|||||||
mbstowcs(ListElement.title, FolderTitle, 63);
|
mbstowcs(ListElement.title, FolderTitle, 63);
|
||||||
Asciify(ListElement.title);
|
Asciify(ListElement.title);
|
||||||
|
|
||||||
ListElement.settings[0] = m_gameList.Magic; //Plugin magic
|
ListElement.settings[0] = m_cacheList.Magic; //Plugin magic
|
||||||
ListElement.casecolor = m_gameList.Color;
|
ListElement.casecolor = m_cacheList.Color;
|
||||||
ListElement.type = TYPE_PLUGIN;
|
ListElement.type = TYPE_PLUGIN;
|
||||||
m_gameList.push_back(ListElement);
|
m_cacheList.push_back(ListElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Create_Homebrew_List(char *FullPath)
|
static void Create_Homebrew_List(char *FullPath)
|
||||||
@ -185,7 +185,7 @@ static void Create_Homebrew_List(char *FullPath)
|
|||||||
if(strcasestr(FullPath, "boot.") == NULL)
|
if(strcasestr(FullPath, "boot.") == NULL)
|
||||||
return;
|
return;
|
||||||
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
||||||
ListElement.index = m_gameList.size();
|
ListElement.index = m_cacheList.size();
|
||||||
*strrchr(FullPath, '/') = '\0';
|
*strrchr(FullPath, '/') = '\0';
|
||||||
strncpy(ListElement.path, FullPath, sizeof(ListElement.path) - 1);
|
strncpy(ListElement.path, FullPath, sizeof(ListElement.path) - 1);
|
||||||
strncpy(ListElement.id, "HB_APP", 6);
|
strncpy(ListElement.id, "HB_APP", 6);
|
||||||
@ -200,11 +200,11 @@ static void Create_Homebrew_List(char *FullPath)
|
|||||||
Asciify(ListElement.title);
|
Asciify(ListElement.title);
|
||||||
|
|
||||||
ListElement.type = TYPE_HOMEBREW;
|
ListElement.type = TYPE_HOMEBREW;
|
||||||
m_gameList.push_back(ListElement);
|
m_cacheList.push_back(ListElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel *chan = NULL;
|
Channel *chan = NULL;
|
||||||
static void Create_Channel_List()
|
static void Create_Channel_List(bool realNAND)
|
||||||
{
|
{
|
||||||
for(u32 i = 0; i < ChannelHandle.Count(); i++)
|
for(u32 i = 0; i < ChannelHandle.Count(); i++)
|
||||||
{
|
{
|
||||||
@ -212,7 +212,7 @@ static void Create_Channel_List()
|
|||||||
if(chan->id == NULL)
|
if(chan->id == NULL)
|
||||||
continue; // Skip invalid channels
|
continue; // Skip invalid channels
|
||||||
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
||||||
ListElement.index = m_gameList.size();
|
ListElement.index = m_cacheList.size();
|
||||||
ListElement.settings[0] = TITLE_UPPER(chan->title);
|
ListElement.settings[0] = TITLE_UPPER(chan->title);
|
||||||
ListElement.settings[1] = TITLE_LOWER(chan->title);
|
ListElement.settings[1] = TITLE_LOWER(chan->title);
|
||||||
strncpy(ListElement.id, chan->id, 4);
|
strncpy(ListElement.id, chan->id, 4);
|
||||||
@ -231,8 +231,11 @@ static void Create_Channel_List()
|
|||||||
mbstowcs(ListElement.title, CustomTitle, 63);
|
mbstowcs(ListElement.title, CustomTitle, 63);
|
||||||
else
|
else
|
||||||
wcsncpy(ListElement.title, chan->name, 64);
|
wcsncpy(ListElement.title, chan->name, 64);
|
||||||
|
if(realNAND)
|
||||||
ListElement.type = TYPE_CHANNEL;
|
ListElement.type = TYPE_CHANNEL;
|
||||||
m_gameList.push_back(ListElement);
|
else
|
||||||
|
ListElement.type = TYPE_EMUCHANNEL;
|
||||||
|
m_cacheList.push_back(ListElement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,7 +266,10 @@ void ListGenerator::CreateList(u32 Flow, u32 Device, const string& Path, const v
|
|||||||
else if(Flow == COVERFLOW_CHANNEL)
|
else if(Flow == COVERFLOW_CHANNEL)
|
||||||
{
|
{
|
||||||
ChannelHandle.Init(gameTDB_Language);
|
ChannelHandle.Init(gameTDB_Language);
|
||||||
Create_Channel_List();
|
if(Device == 9)
|
||||||
|
Create_Channel_List(true);
|
||||||
|
else
|
||||||
|
Create_Channel_List(false);
|
||||||
}
|
}
|
||||||
else if(DeviceHandle.GetFSType(Device) != PART_FS_WBFS)
|
else if(DeviceHandle.GetFSType(Device) != PART_FS_WBFS)
|
||||||
{
|
{
|
||||||
@ -366,7 +372,7 @@ void ListGenerator::createSFList(u8 maxBtns, Config &m_sourceMenuCfg, bool show_
|
|||||||
continue;
|
continue;
|
||||||
const char *path = fmt("%s/%s", sourceDir.c_str(), m_sourceMenuCfg.getString(btn_selected, "image", "").c_str());
|
const char *path = fmt("%s/%s", sourceDir.c_str(), m_sourceMenuCfg.getString(btn_selected, "image", "").c_str());
|
||||||
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
|
||||||
ListElement.index = m_gameList.size();
|
ListElement.index = m_cacheList.size();
|
||||||
strncpy(ListElement.id, "SOURCE", 6);
|
strncpy(ListElement.id, "SOURCE", 6);
|
||||||
strncpy(ListElement.path, path, sizeof(ListElement.path) - 1);
|
strncpy(ListElement.path, path, sizeof(ListElement.path) - 1);
|
||||||
ListElement.casecolor = 0xFFFFFF;
|
ListElement.casecolor = 0xFFFFFF;
|
||||||
@ -375,7 +381,7 @@ void ListGenerator::createSFList(u8 maxBtns, Config &m_sourceMenuCfg, bool show_
|
|||||||
const char *title = m_sourceMenuCfg.getString(btn_selected, "title", fmt("title_%i", i)).c_str();
|
const char *title = m_sourceMenuCfg.getString(btn_selected, "title", fmt("title_%i", i)).c_str();
|
||||||
mbstowcs(ListElement.title, title, 63);
|
mbstowcs(ListElement.title, title, 63);
|
||||||
Asciify(ListElement.title);
|
Asciify(ListElement.title);
|
||||||
m_gameList.push_back(ListElement);
|
m_cacheList.push_back(ListElement);
|
||||||
}
|
}
|
||||||
if(!this->empty() && !DBName.empty()) /* Write a new Cache */
|
if(!this->empty() && !DBName.empty()) /* Write a new Cache */
|
||||||
CCache(*this, DBName, SAVE);
|
CCache(*this, DBName, SAVE);
|
||||||
|
@ -50,6 +50,6 @@ private:
|
|||||||
typedef void (*FileAdder)(char *Path);
|
typedef void (*FileAdder)(char *Path);
|
||||||
void GetFiles(const char *Path, const vector<string>& FileTypes,
|
void GetFiles(const char *Path, const vector<string>& FileTypes,
|
||||||
FileAdder AddFile, bool CompareFolders, u32 max_depth = 2, u32 depth = 1);
|
FileAdder AddFile, bool CompareFolders, u32 max_depth = 2, u32 depth = 1);
|
||||||
extern ListGenerator m_gameList;
|
extern ListGenerator m_cacheList;
|
||||||
|
|
||||||
#endif /*_LISTGENERATOR_HPP_*/
|
#endif /*_LISTGENERATOR_HPP_*/
|
||||||
|
@ -121,10 +121,11 @@ void CMenu::init()
|
|||||||
/* Clear Playlog */
|
/* Clear Playlog */
|
||||||
Playlog_Delete();
|
Playlog_Delete();
|
||||||
|
|
||||||
|
/* Find the first partition with apps/wiiflow folder */
|
||||||
const char *drive = "empty";
|
const char *drive = "empty";
|
||||||
const char *check = "empty";
|
const char *check = "empty";
|
||||||
struct stat dummy;
|
struct stat dummy;
|
||||||
for(int i = SD; i <= USB8; i++) //Find the first partition with apps/wiiflow folder
|
for(int i = SD; i <= USB8; i++)
|
||||||
{
|
{
|
||||||
if(DeviceHandle.IsInserted(i) && DeviceHandle.GetFSType(i) != PART_FS_WBFS && stat(fmt("%s:/%s", DeviceName[i], APPS_DIR), &dummy) == 0)
|
if(DeviceHandle.IsInserted(i) && DeviceHandle.GetFSType(i) != PART_FS_WBFS && stat(fmt("%s:/%s", DeviceName[i], APPS_DIR), &dummy) == 0)
|
||||||
{
|
{
|
||||||
@ -133,7 +134,7 @@ void CMenu::init()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loadDefaultFont();
|
loadDefaultFont();// load default font
|
||||||
if(drive == check) // Should not happen
|
if(drive == check) // Should not happen
|
||||||
{
|
{
|
||||||
_buildMenus();
|
_buildMenus();
|
||||||
@ -216,6 +217,7 @@ void CMenu::init()
|
|||||||
if(strncmp(wii_games_dir, "%s:/", 4) != 0)
|
if(strncmp(wii_games_dir, "%s:/", 4) != 0)
|
||||||
strcpy(wii_games_dir, GAMES_DIR);
|
strcpy(wii_games_dir, GAMES_DIR);
|
||||||
gprintf("Wii Games Directory: %s\n", wii_games_dir);
|
gprintf("Wii Games Directory: %s\n", wii_games_dir);
|
||||||
|
|
||||||
/* GameCube stuff */
|
/* GameCube stuff */
|
||||||
m_devo_installed = DEVO_Installed(m_dataDir.c_str());
|
m_devo_installed = DEVO_Installed(m_dataDir.c_str());
|
||||||
m_nintendont_installed = Nintendont_Installed();
|
m_nintendont_installed = Nintendont_Installed();
|
||||||
@ -309,21 +311,24 @@ void CMenu::init()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check emuNAND paths even if not being used */
|
/* Emu nands init even if not being used */
|
||||||
m_current_view = COVERFLOW_CHANNEL;
|
_checkEmuNandSettings(false);// emu nand
|
||||||
_validateEmuNand();
|
_checkEmuNandSettings(true);// saves nand
|
||||||
m_current_view = COVERFLOW_WII;
|
m_cfg.getBool(CHANNEL_DOMAIN, "real_nand", true);
|
||||||
_validateEmuNand();
|
m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false);
|
||||||
|
|
||||||
/* Cache Reload Checks - Disabled for now
|
/* Cache Reload Checks */
|
||||||
int ini_rev = m_cfg.getInt("GENERAL", "ini_rev", 0);
|
int ini_rev = m_cfg.getInt("GENERAL", "ini_rev", 0);
|
||||||
if(ini_rev != SVN_REV_NUM)
|
if(ini_rev != SVN_REV_NUM)
|
||||||
|
{
|
||||||
fsop_deleteFolder(m_listCacheDir.c_str());
|
fsop_deleteFolder(m_listCacheDir.c_str());
|
||||||
m_cfg.setInt("GENERAL", "ini_rev", SVN_REV_NUM);*/
|
fsop_MakeFolder(m_listCacheDir.c_str());
|
||||||
|
}
|
||||||
|
m_cfg.setInt("GENERAL", "ini_rev", SVN_REV_NUM);
|
||||||
|
|
||||||
CoverFlow.init(m_base_font, m_base_font_size, m_vid.vid_50hz());
|
CoverFlow.init(m_base_font, m_base_font_size, m_vid.vid_50hz());
|
||||||
|
|
||||||
//load categories and theme INI files
|
/* Load categories and theme INI files */
|
||||||
m_cat.load(fmt("%s/" CAT_FILENAME, m_settingsDir.c_str()));
|
m_cat.load(fmt("%s/" CAT_FILENAME, m_settingsDir.c_str()));
|
||||||
string themeName = m_cfg.getString("GENERAL", "theme", "default");
|
string themeName = m_cfg.getString("GENERAL", "theme", "default");
|
||||||
m_themeDataDir = fmt("%s/%s", m_themeDir.c_str(), themeName.c_str());
|
m_themeDataDir = fmt("%s/%s", m_themeDir.c_str(), themeName.c_str());
|
||||||
@ -397,8 +402,10 @@ void CMenu::init()
|
|||||||
m_loc.unload();
|
m_loc.unload();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_gameList.Init(m_settingsDir.c_str(), m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
|
/* 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());
|
||||||
|
|
||||||
|
/* Init the onscreen pointer */
|
||||||
m_aa = 3;
|
m_aa = 3;
|
||||||
CColor pShadowColor = m_theme.getColor("GENERAL", "pointer_shadow_color", CColor(0x3F000000));
|
CColor pShadowColor = m_theme.getColor("GENERAL", "pointer_shadow_color", CColor(0x3F000000));
|
||||||
float pShadowX = m_theme.getFloat("GENERAL", "pointer_shadow_x", 3.f);
|
float pShadowX = m_theme.getFloat("GENERAL", "pointer_shadow_x", 3.f);
|
||||||
@ -412,14 +419,17 @@ void CMenu::init()
|
|||||||
WPAD_SetVRes(chan, m_vid.width() + m_cursor[chan].width(), m_vid.height() + m_cursor[chan].height());
|
WPAD_SetVRes(chan, m_vid.width() + m_cursor[chan].width(), m_vid.height() + m_cursor[chan].height());
|
||||||
}
|
}
|
||||||
|
|
||||||
m_btnMgr.init();
|
/* Init background Music Player and song info */
|
||||||
MusicPlayer.Init(m_cfg, m_musicDir, fmt("%s/music", m_themeDataDir.c_str()));
|
MusicPlayer.Init(m_cfg, m_musicDir, fmt("%s/music", m_themeDataDir.c_str()));
|
||||||
m_music_info = m_cfg.getBool("GENERAL", "display_music_info", true);
|
m_music_info = m_cfg.getBool("GENERAL", "display_music_info", true);
|
||||||
|
|
||||||
|
/* Init Button Manager and build the menus */
|
||||||
|
m_btnMgr.init();
|
||||||
|
m_btnMgr.setRumble(m_cfg.getBool("GENERAL", "rumble", true));
|
||||||
_buildMenus();
|
_buildMenus();
|
||||||
|
|
||||||
|
/* Check if locked, set return to, set exit to, and init multi threading */
|
||||||
m_locked = m_cfg.getString("GENERAL", "parent_code", "").size() >= 4;
|
m_locked = m_cfg.getString("GENERAL", "parent_code", "").size() >= 4;
|
||||||
m_btnMgr.setRumble(m_cfg.getBool("GENERAL", "rumble", true));
|
|
||||||
|
|
||||||
if(m_cfg.getString("GENERAL", "returnto", "WFLA") == "DWFA")
|
if(m_cfg.getString("GENERAL", "returnto", "WFLA") == "DWFA")
|
||||||
m_cfg.setString("GENERAL", "returnto", "WFLA");
|
m_cfg.setString("GENERAL", "returnto", "WFLA");
|
||||||
@ -433,11 +443,13 @@ void CMenu::init()
|
|||||||
|
|
||||||
LWP_MutexInit(&m_mutex, 0);
|
LWP_MutexInit(&m_mutex, 0);
|
||||||
|
|
||||||
|
/* set sound volumes */
|
||||||
CoverFlow.setSoundVolume(m_cfg.getInt("GENERAL", "sound_volume_coverflow", 255));
|
CoverFlow.setSoundVolume(m_cfg.getInt("GENERAL", "sound_volume_coverflow", 255));
|
||||||
m_btnMgr.setSoundVolume(m_cfg.getInt("GENERAL", "sound_volume_gui", 255));
|
m_btnMgr.setSoundVolume(m_cfg.getInt("GENERAL", "sound_volume_gui", 255));
|
||||||
m_bnrSndVol = m_cfg.getInt("GENERAL", "sound_volume_bnr", 255);
|
m_bnrSndVol = m_cfg.getInt("GENERAL", "sound_volume_bnr", 255);
|
||||||
m_bnr_settings = m_cfg.getBool("GENERAL", "banner_in_settings", true);
|
m_bnr_settings = m_cfg.getBool("GENERAL", "banner_in_settings", true);
|
||||||
|
|
||||||
|
/* Init gamer tags */
|
||||||
m_cfg.setString("GAMERCARD", "gamercards", "wiinnertag|dutag");
|
m_cfg.setString("GAMERCARD", "gamercards", "wiinnertag|dutag");
|
||||||
m_cfg.getString("GAMERCARD", "wiinnertag_url", WIINNERTAG_URL);
|
m_cfg.getString("GAMERCARD", "wiinnertag_url", WIINNERTAG_URL);
|
||||||
m_cfg.getString("GAMERCARD", "wiinnertag_key", "");
|
m_cfg.getString("GAMERCARD", "wiinnertag_key", "");
|
||||||
@ -1621,198 +1633,6 @@ void CMenu::_addUserLabels(s16 *ids, u32 start, u32 size, const char *domain)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMenu::_initCF(void)
|
|
||||||
{
|
|
||||||
Config dump;
|
|
||||||
const char *domain = _domainFromView();
|
|
||||||
|
|
||||||
CoverFlow.clear();
|
|
||||||
CoverFlow.reserve(m_gameList.size());
|
|
||||||
|
|
||||||
bool dumpGameLst = m_cfg.getBool(domain, "dump_list", true);
|
|
||||||
if(dumpGameLst) dump.load(fmt("%s/" TITLES_DUMP_FILENAME, m_settingsDir.c_str()));
|
|
||||||
|
|
||||||
m_gcfg1.load(fmt("%s/" GAME_SETTINGS1_FILENAME, m_settingsDir.c_str()));
|
|
||||||
|
|
||||||
const vector<bool> &EnabledPlugins = m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount);
|
|
||||||
|
|
||||||
for(vector<dir_discHdr>::iterator element = m_gameList.begin(); element != m_gameList.end(); ++element)
|
|
||||||
{
|
|
||||||
char tmp[MAX_FAT_PATH];
|
|
||||||
memset(tmp, 0, MAX_FAT_PATH);
|
|
||||||
const char *id = NULL;
|
|
||||||
u64 chantitle = TITLE_ID(element->settings[0],element->settings[1]);
|
|
||||||
if(m_sourceflow)
|
|
||||||
{
|
|
||||||
char srctmp[63] = "source/";
|
|
||||||
memcpy(tmp, srctmp, 63);
|
|
||||||
wcstombs(srctmp, element->title, 63);
|
|
||||||
strcat(tmp, srctmp);
|
|
||||||
id = tmp;
|
|
||||||
}
|
|
||||||
else if(element->type == TYPE_HOMEBREW)
|
|
||||||
id = strrchr(element->path, '/') + 1;
|
|
||||||
else if(element->type == TYPE_PLUGIN)
|
|
||||||
{
|
|
||||||
if(strstr(element->path, ":/") != NULL)
|
|
||||||
{
|
|
||||||
if(*(strchr(element->path, '/') + 1) != '\0')
|
|
||||||
strcat(tmp, strchr(element->path, '/') + 1);
|
|
||||||
else
|
|
||||||
strcat(tmp, element->path);
|
|
||||||
if(strchr(tmp, '/') != NULL)
|
|
||||||
*(strchr(tmp, '/') + 1) = '\0';
|
|
||||||
}
|
|
||||||
strcat(tmp, fmt("%ls",element->title));
|
|
||||||
id = tmp;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(element->type == TYPE_CHANNEL && chantitle == HBC_108)
|
|
||||||
strncpy(element->id, "JODI", 6);
|
|
||||||
id = element->id;
|
|
||||||
if(element->type == TYPE_GC_GAME && element->settings[0] == 1) /* disc 2 */
|
|
||||||
{
|
|
||||||
strcat(tmp, fmt("%.6s_2", element->id));
|
|
||||||
id = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if((!m_favorites || m_gcfg1.getBool("FAVORITES", id, false))
|
|
||||||
&& (!m_locked || !m_gcfg1.getBool("ADULTONLY", id, false)))
|
|
||||||
{
|
|
||||||
string catDomain;
|
|
||||||
switch(element->type)
|
|
||||||
{
|
|
||||||
case TYPE_CHANNEL:
|
|
||||||
catDomain = "CHANNELS";
|
|
||||||
break;
|
|
||||||
case TYPE_HOMEBREW:
|
|
||||||
case TYPE_SOURCE:
|
|
||||||
catDomain = "HOMEBREW";
|
|
||||||
break;
|
|
||||||
case TYPE_GC_GAME:
|
|
||||||
catDomain = "GAMECUBE";
|
|
||||||
break;
|
|
||||||
case TYPE_WII_GAME:
|
|
||||||
catDomain = "WII";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
catDomain = (m_plugin.GetPluginName(m_plugin.GetPluginPosition(element->settings[0]))).toUTF8();
|
|
||||||
}
|
|
||||||
const char *requiredCats = m_cat.getString("GENERAL", "required_categories").c_str();
|
|
||||||
const char *selectedCats = m_cat.getString("GENERAL", "selected_categories").c_str();
|
|
||||||
const char *hiddenCats = m_cat.getString("GENERAL", "hidden_categories").c_str();
|
|
||||||
u8 numReqCats = strlen(requiredCats);
|
|
||||||
u8 numSelCats = strlen(selectedCats);
|
|
||||||
u8 numHidCats = strlen(hiddenCats);
|
|
||||||
if(numReqCats != 0 || numSelCats != 0 || numHidCats != 0) // if all 0 skip checking cats and show all games
|
|
||||||
{
|
|
||||||
const char *idCats = m_cat.getString(catDomain, id).c_str();
|
|
||||||
u8 numIdCats = strlen(idCats);
|
|
||||||
bool inaCat = false;
|
|
||||||
bool inHiddenCat = false;
|
|
||||||
int reqMatch = 0;
|
|
||||||
if(numIdCats != 0)
|
|
||||||
{
|
|
||||||
for(u8 j = 0; j < numIdCats; ++j)
|
|
||||||
{
|
|
||||||
int k = (static_cast<int>(idCats[j])) - 32;
|
|
||||||
if(k <= 0)
|
|
||||||
continue;
|
|
||||||
bool match = false;
|
|
||||||
if(numReqCats != 0)
|
|
||||||
{
|
|
||||||
for(u8 l = 0; l < numReqCats; ++l)
|
|
||||||
{
|
|
||||||
if(k == (static_cast<int>(requiredCats[l]) - 32))
|
|
||||||
{
|
|
||||||
match = true;
|
|
||||||
reqMatch++;
|
|
||||||
inaCat = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(match)
|
|
||||||
continue;
|
|
||||||
if(numSelCats != 0)
|
|
||||||
{
|
|
||||||
for(u8 l = 0; l < numSelCats; ++l)
|
|
||||||
{
|
|
||||||
if(k == (static_cast<int>(selectedCats[l]) - 32))
|
|
||||||
{
|
|
||||||
match = true;
|
|
||||||
inaCat = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(match)
|
|
||||||
continue;
|
|
||||||
if(numHidCats != 0)
|
|
||||||
{
|
|
||||||
for(u8 l = 0; l < numHidCats; ++l)
|
|
||||||
{
|
|
||||||
if(k == (static_cast<int>(hiddenCats[l]) - 32))
|
|
||||||
inHiddenCat = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//continue; means don't add game to list (don't show)
|
|
||||||
if(inHiddenCat)
|
|
||||||
continue;
|
|
||||||
if(numReqCats != reqMatch)
|
|
||||||
continue;
|
|
||||||
if(!inaCat)
|
|
||||||
{
|
|
||||||
if(numHidCats == 0)
|
|
||||||
continue;
|
|
||||||
else if(numSelCats > 0)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int playcount = m_gcfg1.getInt("PLAYCOUNT", id, 0);
|
|
||||||
unsigned int lastPlayed = m_gcfg1.getUInt("LASTPLAYED", id, 0);
|
|
||||||
|
|
||||||
if(dumpGameLst)
|
|
||||||
dump.setWString(domain, id, element->title);
|
|
||||||
|
|
||||||
if(element->type == TYPE_PLUGIN && EnabledPlugins.size() > 0)
|
|
||||||
{
|
|
||||||
for(u8 j = 0; j < EnabledPlugins.size(); j++)
|
|
||||||
{
|
|
||||||
if(EnabledPlugins.at(j) == true && element->settings[0] == m_plugin.getPluginMagic(j))
|
|
||||||
{
|
|
||||||
CoverFlow.addItem(&(*element), playcount, lastPlayed);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
CoverFlow.addItem(&(*element), playcount, lastPlayed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_gcfg1.unload();
|
|
||||||
if(dumpGameLst)
|
|
||||||
{
|
|
||||||
dump.save(true);
|
|
||||||
m_cfg.setBool(domain, "dump_list", false);
|
|
||||||
}
|
|
||||||
CoverFlow.setBoxMode(m_cfg.getBool("GENERAL", "box_mode", true));
|
|
||||||
CoverFlow.setCompression(m_cfg.getBool("GENERAL", "allow_texture_compression", true));
|
|
||||||
CoverFlow.setBufferSize(m_cfg.getInt("GENERAL", "cover_buffer", 20));
|
|
||||||
CoverFlow.setSorting((Sorting)m_cfg.getInt(domain, "sort", 0));
|
|
||||||
CoverFlow.setHQcover(m_cfg.getBool("GENERAL", "cover_use_hq", false));
|
|
||||||
CoverFlow.start(m_imgsDir);
|
|
||||||
|
|
||||||
if(!CoverFlow.empty())
|
|
||||||
{
|
|
||||||
bool path = m_sourceflow || m_current_view == COVERFLOW_PLUGIN || m_current_view == COVERFLOW_HOMEBREW;
|
|
||||||
if(m_current_view == COVERFLOW_MAX || !CoverFlow.findId(m_cfg.getString(domain, "current_item").c_str(), true, path))
|
|
||||||
CoverFlow.defaultLoad();
|
|
||||||
CoverFlow.startCoverLoader();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CMenu::_mainLoopCommon(bool withCF, bool adjusting)
|
void CMenu::_mainLoopCommon(bool withCF, bool adjusting)
|
||||||
{
|
{
|
||||||
if(withCF)
|
if(withCF)
|
||||||
@ -2118,86 +1938,240 @@ const wstringEx CMenu::_fmt(const char *key, const wchar_t *def)
|
|||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMenu::_loadChannelList(void)
|
void CMenu::_initCF(void)
|
||||||
{
|
{
|
||||||
m_gameList.clear();
|
Config dump;
|
||||||
string emuPath;//set via _FindEmuPart and used throughout wiiflow code
|
const char *domain = _domainFromView();
|
||||||
string cacheDir;//left empty for real nand and not used
|
|
||||||
int emuPartition = -1; //left at -1 for real nand
|
|
||||||
NANDemuView = (neek2o() || m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false));
|
|
||||||
if(NANDemuView)
|
|
||||||
{
|
|
||||||
emuPartition = _FindEmuPart(emuPath, false);//check if exist & has sysconf, settings.txt, & RFL_DB.dat
|
|
||||||
//if(emuPartition < 0)
|
|
||||||
//emuPartition = _FindEmuPart(emuPath, true);//check if exist without those files
|
|
||||||
if(emuPartition < 0)
|
|
||||||
return false;// emu nand not found - menu_main will ask user to extract nand, disable emunand, or change partition
|
|
||||||
/* copy real NAND sysconf, settings.txt, & RFL_DB.dat if you want to, they are replaced if they already exist */
|
|
||||||
NandHandle.PreNandCfg(m_cfg.getBool(CHANNEL_DOMAIN, "real_nand_miis", false),
|
|
||||||
m_cfg.getBool(CHANNEL_DOMAIN, "real_nand_config", false));
|
|
||||||
|
|
||||||
currentPartition = emuPartition;
|
CoverFlow.clear();
|
||||||
cacheDir = fmt("%s/%s_channels.db", m_listCacheDir.c_str(), DeviceName[currentPartition]);
|
CoverFlow.reserve(m_gameList.size());
|
||||||
|
|
||||||
|
bool dumpGameLst = m_cfg.getBool(domain, "dump_list", true);
|
||||||
|
if(dumpGameLst) dump.load(fmt("%s/" TITLES_DUMP_FILENAME, m_settingsDir.c_str()));
|
||||||
|
|
||||||
|
m_gcfg1.load(fmt("%s/" GAME_SETTINGS1_FILENAME, m_settingsDir.c_str()));
|
||||||
|
|
||||||
|
const vector<bool> &EnabledPlugins = m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount);
|
||||||
|
|
||||||
|
for(vector<dir_discHdr>::iterator element = m_gameList.begin(); element != m_gameList.end(); ++element)
|
||||||
|
{
|
||||||
|
char tmp[MAX_FAT_PATH];
|
||||||
|
memset(tmp, 0, MAX_FAT_PATH);
|
||||||
|
const char *id = NULL;
|
||||||
|
u64 chantitle = TITLE_ID(element->settings[0],element->settings[1]);
|
||||||
|
if(m_sourceflow)
|
||||||
|
{
|
||||||
|
char srctmp[63] = "source/";
|
||||||
|
memcpy(tmp, srctmp, 63);
|
||||||
|
wcstombs(srctmp, element->title, 63);
|
||||||
|
strcat(tmp, srctmp);
|
||||||
|
id = tmp;
|
||||||
|
}
|
||||||
|
else if(element->type == TYPE_HOMEBREW)
|
||||||
|
id = strrchr(element->path, '/') + 1;
|
||||||
|
else if(element->type == TYPE_PLUGIN)
|
||||||
|
{
|
||||||
|
if(strstr(element->path, ":/") != NULL)
|
||||||
|
{
|
||||||
|
if(*(strchr(element->path, '/') + 1) != '\0')
|
||||||
|
strcat(tmp, strchr(element->path, '/') + 1);
|
||||||
|
else
|
||||||
|
strcat(tmp, element->path);
|
||||||
|
if(strchr(tmp, '/') != NULL)
|
||||||
|
*(strchr(tmp, '/') + 1) = '\0';
|
||||||
|
}
|
||||||
|
strcat(tmp, fmt("%ls",element->title));
|
||||||
|
id = tmp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if((element->type == TYPE_CHANNEL || element->type == TYPE_EMUCHANNEL) && chantitle == HBC_108)
|
||||||
|
strncpy(element->id, "JODI", 6);
|
||||||
|
id = element->id;
|
||||||
|
if(element->type == TYPE_GC_GAME && element->settings[0] == 1) /* disc 2 */
|
||||||
|
{
|
||||||
|
strcat(tmp, fmt("%.6s_2", element->id));
|
||||||
|
id = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if((!m_favorites || m_gcfg1.getBool("FAVORITES", id, false))
|
||||||
|
&& (!m_locked || !m_gcfg1.getBool("ADULTONLY", id, false)))
|
||||||
|
{
|
||||||
|
string catDomain;
|
||||||
|
switch(element->type)
|
||||||
|
{
|
||||||
|
case TYPE_CHANNEL:
|
||||||
|
catDomain = "NAND";
|
||||||
|
break;
|
||||||
|
case TYPE_EMUCHANNEL:
|
||||||
|
catDomain = "CHANNELS";
|
||||||
|
break;
|
||||||
|
case TYPE_HOMEBREW:
|
||||||
|
case TYPE_SOURCE:
|
||||||
|
catDomain = "HOMEBREW";
|
||||||
|
break;
|
||||||
|
case TYPE_GC_GAME:
|
||||||
|
catDomain = "GAMECUBE";
|
||||||
|
break;
|
||||||
|
case TYPE_WII_GAME:
|
||||||
|
catDomain = "WII";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
catDomain = (m_plugin.GetPluginName(m_plugin.GetPluginPosition(element->settings[0]))).toUTF8();
|
||||||
|
}
|
||||||
|
const char *requiredCats = m_cat.getString("GENERAL", "required_categories").c_str();
|
||||||
|
const char *selectedCats = m_cat.getString("GENERAL", "selected_categories").c_str();
|
||||||
|
const char *hiddenCats = m_cat.getString("GENERAL", "hidden_categories").c_str();
|
||||||
|
u8 numReqCats = strlen(requiredCats);
|
||||||
|
u8 numSelCats = strlen(selectedCats);
|
||||||
|
u8 numHidCats = strlen(hiddenCats);
|
||||||
|
if(numReqCats != 0 || numSelCats != 0 || numHidCats != 0) // if all 0 skip checking cats and show all games
|
||||||
|
{
|
||||||
|
const char *idCats = m_cat.getString(catDomain, id).c_str();
|
||||||
|
u8 numIdCats = strlen(idCats);
|
||||||
|
bool inaCat = false;
|
||||||
|
bool inHiddenCat = false;
|
||||||
|
int reqMatch = 0;
|
||||||
|
if(numIdCats != 0)
|
||||||
|
{
|
||||||
|
for(u8 j = 0; j < numIdCats; ++j)
|
||||||
|
{
|
||||||
|
int k = (static_cast<int>(idCats[j])) - 32;
|
||||||
|
if(k <= 0)
|
||||||
|
continue;
|
||||||
|
bool match = false;
|
||||||
|
if(numReqCats != 0)
|
||||||
|
{
|
||||||
|
for(u8 l = 0; l < numReqCats; ++l)
|
||||||
|
{
|
||||||
|
if(k == (static_cast<int>(requiredCats[l]) - 32))
|
||||||
|
{
|
||||||
|
match = true;
|
||||||
|
reqMatch++;
|
||||||
|
inaCat = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(match)
|
||||||
|
continue;
|
||||||
|
if(numSelCats != 0)
|
||||||
|
{
|
||||||
|
for(u8 l = 0; l < numSelCats; ++l)
|
||||||
|
{
|
||||||
|
if(k == (static_cast<int>(selectedCats[l]) - 32))
|
||||||
|
{
|
||||||
|
match = true;
|
||||||
|
inaCat = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(match)
|
||||||
|
continue;
|
||||||
|
if(numHidCats != 0)
|
||||||
|
{
|
||||||
|
for(u8 l = 0; l < numHidCats; ++l)
|
||||||
|
{
|
||||||
|
if(k == (static_cast<int>(hiddenCats[l]) - 32))
|
||||||
|
inHiddenCat = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//continue; means don't add game to list (don't show)
|
||||||
|
if(inHiddenCat)
|
||||||
|
continue;
|
||||||
|
if(numReqCats != reqMatch)
|
||||||
|
continue;
|
||||||
|
if(!inaCat)
|
||||||
|
{
|
||||||
|
if(numHidCats == 0)
|
||||||
|
continue;
|
||||||
|
else if(numSelCats > 0)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int playcount = m_gcfg1.getInt("PLAYCOUNT", id, 0);
|
||||||
|
unsigned int lastPlayed = m_gcfg1.getUInt("LASTPLAYED", id, 0);
|
||||||
|
|
||||||
|
if(dumpGameLst)
|
||||||
|
dump.setWString(domain, id, element->title);
|
||||||
|
|
||||||
|
if(element->type == TYPE_PLUGIN && EnabledPlugins.size() > 0)
|
||||||
|
{
|
||||||
|
for(u8 j = 0; j < EnabledPlugins.size(); j++)
|
||||||
|
{
|
||||||
|
if(EnabledPlugins.at(j) == true && element->settings[0] == m_plugin.getPluginMagic(j))
|
||||||
|
{
|
||||||
|
CoverFlow.addItem(&(*element), playcount, lastPlayed);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
CoverFlow.addItem(&(*element), playcount, lastPlayed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_gcfg1.unload();
|
||||||
|
if(dumpGameLst)
|
||||||
|
{
|
||||||
|
dump.save(true);
|
||||||
|
m_cfg.setBool(domain, "dump_list", false);
|
||||||
|
}
|
||||||
|
CoverFlow.setBoxMode(m_cfg.getBool("GENERAL", "box_mode", true));
|
||||||
|
CoverFlow.setCompression(m_cfg.getBool("GENERAL", "allow_texture_compression", true));
|
||||||
|
CoverFlow.setBufferSize(m_cfg.getInt("GENERAL", "cover_buffer", 20));
|
||||||
|
CoverFlow.setSorting((Sorting)m_cfg.getInt(domain, "sort", 0));
|
||||||
|
CoverFlow.setHQcover(m_cfg.getBool("GENERAL", "cover_use_hq", false));
|
||||||
|
CoverFlow.start(m_imgsDir);
|
||||||
|
|
||||||
|
if(!CoverFlow.empty())
|
||||||
|
{
|
||||||
|
bool path = m_sourceflow || m_current_view == COVERFLOW_PLUGIN || m_current_view == COVERFLOW_HOMEBREW;
|
||||||
|
if(m_current_view == COVERFLOW_MAX || !CoverFlow.findId(m_cfg.getString(domain, "current_item").c_str(), true, path))
|
||||||
|
CoverFlow.defaultLoad();
|
||||||
|
CoverFlow.startCoverLoader();
|
||||||
}
|
}
|
||||||
bool updateCache = m_cfg.getBool(CHANNEL_DOMAIN, "update_cache");//real nand doesn't update because cacheDir is left empty
|
|
||||||
/* CreateList checks if cacheDir is empty if so then doesn't update/create cache .db file */
|
|
||||||
vector<string> NullVector;
|
|
||||||
m_gameList.CreateList(COVERFLOW_CHANNEL, currentPartition, std::string(),
|
|
||||||
NullVector, cacheDir, updateCache);
|
|
||||||
m_cfg.remove(CHANNEL_DOMAIN, "update_cache");
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMenu::_loadList(void)
|
bool CMenu::_loadList(void)
|
||||||
{
|
{
|
||||||
CoverFlow.clear();
|
CoverFlow.clear();
|
||||||
|
m_cacheList.clear();
|
||||||
m_gameList.clear();
|
m_gameList.clear();
|
||||||
vector<dir_discHdr> combinedList;
|
|
||||||
NANDemuView = false;
|
NANDemuView = false;
|
||||||
gprintf("Creating Gamelist\n");
|
|
||||||
|
|
||||||
|
if(m_sourceflow)
|
||||||
|
{
|
||||||
|
string cacheDir(fmt("%s/sourceflow.db", m_listCacheDir.c_str()));
|
||||||
|
bool updateCache = m_cfg.getBool("SOURCEFLOW", "update_cache");
|
||||||
|
u8 maxBtns = m_cfg.getInt("GENERAL", "max_source_buttons", 71);
|
||||||
|
m_cacheList.createSFList(maxBtns, m_source, show_homebrew, show_channel, show_plugin, show_gamecube, m_sourceDir, cacheDir, updateCache);
|
||||||
|
m_cfg.remove("SOURCEFLOW", "update_cache");
|
||||||
|
for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++)
|
||||||
|
m_gameList.push_back(*tmp_itr);
|
||||||
|
m_cacheList.clear();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if(m_current_view == COVERFLOW_HOMEBREW)
|
if(m_current_view == COVERFLOW_HOMEBREW)
|
||||||
{
|
{
|
||||||
_loadHomebrewList();
|
_loadHomebrewList();
|
||||||
gprintf("Games found: %i\n", m_gameList.size());
|
gprintf("Apps found: %i\n", m_gameList.size());
|
||||||
return m_gameList.size() > 0 ? true : false;
|
return m_gameList.size() > 0 ? true : false;
|
||||||
}
|
}
|
||||||
|
gprintf("Creating Gamelist\n");
|
||||||
if(m_current_view == COVERFLOW_PLUGIN || (m_combined_view && m_cfg.getBool(PLUGIN_DOMAIN, "source")))
|
if(m_current_view == COVERFLOW_PLUGIN || (m_combined_view && m_cfg.getBool(PLUGIN_DOMAIN, "source")))
|
||||||
{
|
|
||||||
_loadPluginList();
|
_loadPluginList();
|
||||||
if(m_combined_view)
|
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
|
||||||
combinedList.push_back(*tmp_itr);
|
|
||||||
}
|
|
||||||
if(m_current_view == COVERFLOW_WII || (m_combined_view && m_cfg.getBool(WII_DOMAIN, "source")))
|
if(m_current_view == COVERFLOW_WII || (m_combined_view && m_cfg.getBool(WII_DOMAIN, "source")))
|
||||||
{
|
|
||||||
_loadWiiList();
|
_loadWiiList();
|
||||||
if(m_combined_view)
|
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
|
||||||
combinedList.push_back(*tmp_itr);
|
|
||||||
}
|
|
||||||
if(m_current_view == COVERFLOW_CHANNEL || (m_combined_view && m_cfg.getBool(CHANNEL_DOMAIN, "source")))
|
if(m_current_view == COVERFLOW_CHANNEL || (m_combined_view && m_cfg.getBool(CHANNEL_DOMAIN, "source")))
|
||||||
{
|
|
||||||
_loadChannelList();
|
_loadChannelList();
|
||||||
if(m_combined_view)
|
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
|
||||||
combinedList.push_back(*tmp_itr);
|
|
||||||
}
|
|
||||||
if(m_current_view == COVERFLOW_GAMECUBE || (m_combined_view && m_cfg.getBool(GC_DOMAIN, "source")))
|
if(m_current_view == COVERFLOW_GAMECUBE || (m_combined_view && m_cfg.getBool(GC_DOMAIN, "source")))
|
||||||
{
|
|
||||||
_loadGamecubeList();
|
_loadGamecubeList();
|
||||||
if(m_combined_view)
|
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
m_cacheList.clear();
|
||||||
combinedList.push_back(*tmp_itr);
|
|
||||||
}
|
|
||||||
if(m_combined_view)
|
|
||||||
{
|
|
||||||
m_current_view = COVERFLOW_MAX;
|
|
||||||
m_gameList.clear();
|
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = combinedList.begin(); tmp_itr != combinedList.end(); tmp_itr++)
|
|
||||||
m_gameList.push_back(*tmp_itr);
|
|
||||||
combinedList.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
gprintf("Games found: %i\n", m_gameList.size());
|
gprintf("Games found: %i\n", m_gameList.size());
|
||||||
return m_gameList.size() > 0 ? true : false;
|
return m_gameList.size() > 0 ? true : false;
|
||||||
@ -2209,14 +2183,16 @@ bool CMenu::_loadWiiList(void)
|
|||||||
if(!DeviceHandle.IsInserted(currentPartition))
|
if(!DeviceHandle.IsInserted(currentPartition))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_gameList.clear();
|
m_cacheList.clear();
|
||||||
DeviceHandle.OpenWBFS(currentPartition);
|
DeviceHandle.OpenWBFS(currentPartition);
|
||||||
string gameDir(fmt(wii_games_dir, DeviceName[currentPartition]));
|
string gameDir(fmt(wii_games_dir, DeviceName[currentPartition]));
|
||||||
string cacheDir(fmt("%s/%s_wii.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
|
string cacheDir(fmt("%s/%s_wii.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
|
||||||
bool updateCache = m_cfg.getBool(WII_DOMAIN, "update_cache");
|
bool updateCache = m_cfg.getBool(WII_DOMAIN, "update_cache");
|
||||||
m_gameList.CreateList(COVERFLOW_WII, currentPartition, gameDir, stringToVector(".wbfs|.iso", '|'), cacheDir, updateCache);
|
m_cacheList.CreateList(COVERFLOW_WII, currentPartition, gameDir, stringToVector(".wbfs|.iso", '|'), cacheDir, updateCache);
|
||||||
WBFS_Close();
|
WBFS_Close();
|
||||||
m_cfg.remove(WII_DOMAIN, "update_cache");
|
m_cfg.remove(WII_DOMAIN, "update_cache");
|
||||||
|
for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++)
|
||||||
|
m_gameList.push_back(*tmp_itr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2226,12 +2202,14 @@ bool CMenu::_loadHomebrewList()
|
|||||||
if(!DeviceHandle.IsInserted(currentPartition))
|
if(!DeviceHandle.IsInserted(currentPartition))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_gameList.clear();
|
m_cacheList.clear();
|
||||||
string gameDir(fmt(HOMEBREW_DIR, DeviceName[currentPartition]));
|
string gameDir(fmt(HOMEBREW_DIR, DeviceName[currentPartition]));
|
||||||
string cacheDir(fmt("%s/%s_homebrew.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
|
string cacheDir(fmt("%s/%s_homebrew.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
|
||||||
bool updateCache = m_cfg.getBool(HOMEBREW_DOMAIN, "update_cache");
|
bool updateCache = m_cfg.getBool(HOMEBREW_DOMAIN, "update_cache");
|
||||||
m_gameList.CreateList(COVERFLOW_HOMEBREW, currentPartition, gameDir, stringToVector(".dol|.elf", '|'), cacheDir, updateCache);
|
m_cacheList.CreateList(COVERFLOW_HOMEBREW, currentPartition, gameDir, stringToVector(".dol|.elf", '|'), cacheDir, updateCache);
|
||||||
m_cfg.remove(HOMEBREW_DOMAIN, "update_cache");
|
m_cfg.remove(HOMEBREW_DOMAIN, "update_cache");
|
||||||
|
for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++)
|
||||||
|
m_gameList.push_back(*tmp_itr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2241,12 +2219,52 @@ bool CMenu::_loadGamecubeList()
|
|||||||
if(!DeviceHandle.IsInserted(currentPartition))
|
if(!DeviceHandle.IsInserted(currentPartition))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_gameList.clear();
|
m_cacheList.clear();
|
||||||
string gameDir(fmt(gc_games_dir, DeviceName[currentPartition]));
|
string gameDir(fmt(gc_games_dir, DeviceName[currentPartition]));
|
||||||
string cacheDir(fmt("%s/%s_gamecube.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
|
string cacheDir(fmt("%s/%s_gamecube.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
|
||||||
bool updateCache = m_cfg.getBool(GC_DOMAIN, "update_cache");
|
bool updateCache = m_cfg.getBool(GC_DOMAIN, "update_cache");
|
||||||
m_gameList.CreateList(COVERFLOW_GAMECUBE, currentPartition, gameDir, stringToVector(".iso|root", '|'), cacheDir, updateCache);
|
m_cacheList.CreateList(COVERFLOW_GAMECUBE, currentPartition, gameDir, stringToVector(".iso|root", '|'), cacheDir, updateCache);
|
||||||
m_cfg.remove(GC_DOMAIN, "update_cache");
|
m_cfg.remove(GC_DOMAIN, "update_cache");
|
||||||
|
for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++)
|
||||||
|
m_gameList.push_back(*tmp_itr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CMenu::_loadChannelList(void)
|
||||||
|
{
|
||||||
|
vector<string> NullVector;
|
||||||
|
if(m_cfg.getBool(CHANNEL_DOMAIN, "real_nand"))
|
||||||
|
{
|
||||||
|
NANDemuView = false;
|
||||||
|
m_cacheList.clear();
|
||||||
|
m_cacheList.CreateList(COVERFLOW_CHANNEL, 9, std::string(), NullVector, std::string(), false);
|
||||||
|
for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++)
|
||||||
|
m_gameList.push_back(*tmp_itr);
|
||||||
|
}
|
||||||
|
if(m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand"))
|
||||||
|
{
|
||||||
|
NANDemuView = true;
|
||||||
|
m_cacheList.clear();
|
||||||
|
string emuPath;
|
||||||
|
int emuPartition = _FindEmuPart(emuPath, false, false);//check if exist & has sysconf, settings.txt, & RFL_DB.dat
|
||||||
|
//if(emuPartition < 0)// && m_nand_view != "both")
|
||||||
|
// return false;// emu nand not found - menu_main will ask user to extract nand, disable emunand, or change partition
|
||||||
|
if(emuPartition >= 0)
|
||||||
|
{
|
||||||
|
/* copy real NAND sysconf, settings.txt, & RFL_DB.dat if you want to, they are replaced if they already exist */
|
||||||
|
NandHandle.PreNandCfg(m_cfg.getBool(CHANNEL_DOMAIN, "real_nand_miis", false),
|
||||||
|
m_cfg.getBool(CHANNEL_DOMAIN, "real_nand_config", false));
|
||||||
|
|
||||||
|
currentPartition = emuPartition;
|
||||||
|
string cacheDir = fmt("%s/%s_channels.db", m_listCacheDir.c_str(), DeviceName[currentPartition]);
|
||||||
|
bool updateCache = m_cfg.getBool(CHANNEL_DOMAIN, "update_cache");
|
||||||
|
m_cacheList.CreateList(COVERFLOW_CHANNEL, currentPartition, std::string(), NullVector, cacheDir, updateCache);
|
||||||
|
m_cfg.remove(CHANNEL_DOMAIN, "update_cache");
|
||||||
|
for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++)
|
||||||
|
m_gameList.push_back(*tmp_itr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_cacheList.clear();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2259,12 +2277,12 @@ bool CMenu::_loadPluginList()
|
|||||||
bool addGamecube = false;
|
bool addGamecube = false;
|
||||||
bool addWii = false;
|
bool addWii = false;
|
||||||
bool addChannel = false;
|
bool addChannel = false;
|
||||||
|
bool addEmuChannel = false;
|
||||||
bool updateCache = m_cfg.getBool(PLUGIN_DOMAIN, "update_cache");
|
bool updateCache = m_cfg.getBool(PLUGIN_DOMAIN, "update_cache");
|
||||||
vector<dir_discHdr> pluginList;
|
|
||||||
|
|
||||||
for(u8 i = 0; i < m_numPlugins; ++i)
|
for(u8 i = 0; i < m_numPlugins; ++i)
|
||||||
{
|
{
|
||||||
m_gameList.clear();
|
m_cacheList.clear();
|
||||||
u32 Magic = m_plugin.getPluginMagic(i);
|
u32 Magic = m_plugin.getPluginMagic(i);
|
||||||
strncpy(m_plugin.PluginMagicWord, fmt("%08x", Magic), 8);
|
strncpy(m_plugin.PluginMagicWord, fmt("%08x", Magic), 8);
|
||||||
if(!m_cfg.getBool(PLUGIN_ENABLED, m_plugin.PluginMagicWord, true))
|
if(!m_cfg.getBool(PLUGIN_ENABLED, m_plugin.PluginMagicWord, true))
|
||||||
@ -2287,14 +2305,19 @@ bool CMenu::_loadPluginList()
|
|||||||
addChannel = true;
|
addChannel = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if(string(m_plugin.PluginMagicWord) == "454e414e")
|
||||||
|
{
|
||||||
|
addEmuChannel = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
string gameDir(fmt("%s:/%s", DeviceName[currentPartition], m_plugin.GetRomDir(i)));
|
string gameDir(fmt("%s:/%s", DeviceName[currentPartition], m_plugin.GetRomDir(i)));
|
||||||
string cacheDir(fmt("%s/%s_%s.db", m_listCacheDir.c_str(), DeviceName[currentPartition], m_plugin.PluginMagicWord));
|
string cacheDir(fmt("%s/%s_%s.db", m_listCacheDir.c_str(), DeviceName[currentPartition], m_plugin.PluginMagicWord));
|
||||||
vector<string> FileTypes = stringToVector(m_plugin.GetFileTypes(i), '|');
|
vector<string> FileTypes = stringToVector(m_plugin.GetFileTypes(i), '|');
|
||||||
m_gameList.Color = m_plugin.GetCaseColor(i);
|
m_cacheList.Color = m_plugin.GetCaseColor(i);
|
||||||
m_gameList.Magic = Magic;
|
m_cacheList.Magic = Magic;
|
||||||
m_gameList.CreateList(COVERFLOW_PLUGIN, currentPartition, gameDir, FileTypes, cacheDir, updateCache);
|
m_cacheList.CreateList(COVERFLOW_PLUGIN, currentPartition, gameDir, FileTypes, cacheDir, updateCache);
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++)
|
||||||
pluginList.push_back(*tmp_itr);
|
m_gameList.push_back(*tmp_itr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2303,35 +2326,23 @@ bool CMenu::_loadPluginList()
|
|||||||
scummvm.load(fmt("%s/%s", m_pluginsDir.c_str(), "scummvm.ini"));
|
scummvm.load(fmt("%s/%s", m_pluginsDir.c_str(), "scummvm.ini"));
|
||||||
scummvmList = m_plugin.ParseScummvmINI(scummvm, DeviceName[currentPartition], Magic);
|
scummvmList = m_plugin.ParseScummvmINI(scummvm, DeviceName[currentPartition], Magic);
|
||||||
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++)
|
||||||
pluginList.push_back(*tmp_itr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_gameList.clear();
|
|
||||||
if(addGamecube)
|
|
||||||
{
|
|
||||||
_loadGamecubeList();
|
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
|
||||||
pluginList.push_back(*tmp_itr);
|
|
||||||
}
|
|
||||||
if(addWii)
|
|
||||||
{
|
|
||||||
_loadWiiList();
|
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
|
||||||
pluginList.push_back(*tmp_itr);
|
|
||||||
}
|
|
||||||
if(addChannel)
|
|
||||||
{
|
|
||||||
_loadChannelList();
|
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = m_gameList.begin(); tmp_itr != m_gameList.end(); tmp_itr++)
|
|
||||||
pluginList.push_back(*tmp_itr);
|
|
||||||
}
|
|
||||||
m_gameList.clear();
|
|
||||||
for(vector<dir_discHdr>::iterator tmp_itr = pluginList.begin(); tmp_itr != pluginList.end(); tmp_itr++)
|
|
||||||
{
|
|
||||||
tmp_itr->index = m_gameList.size();
|
|
||||||
m_gameList.push_back(*tmp_itr);
|
m_gameList.push_back(*tmp_itr);
|
||||||
}
|
}
|
||||||
pluginList.clear();
|
}
|
||||||
|
m_cacheList.clear();
|
||||||
|
if(addGamecube)
|
||||||
|
_loadGamecubeList();
|
||||||
|
|
||||||
|
if(addWii)
|
||||||
|
_loadWiiList();
|
||||||
|
|
||||||
|
if(addChannel || addEmuChannel)
|
||||||
|
{
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", addChannel ? true : false);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", addEmuChannel ? true : false);
|
||||||
|
_loadChannelList();
|
||||||
|
}
|
||||||
|
m_cacheList.clear();
|
||||||
m_cfg.remove(PLUGIN_DOMAIN, "update_cache");
|
m_cfg.remove(PLUGIN_DOMAIN, "update_cache");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2578,6 +2589,7 @@ const char *CMenu::getBlankCoverPath(const dir_discHdr *element)
|
|||||||
switch(element->type)
|
switch(element->type)
|
||||||
{
|
{
|
||||||
case TYPE_CHANNEL:
|
case TYPE_CHANNEL:
|
||||||
|
case TYPE_EMUCHANNEL:
|
||||||
blankCoverKey = "channels";
|
blankCoverKey = "channels";
|
||||||
break;
|
break;
|
||||||
case TYPE_HOMEBREW:
|
case TYPE_HOMEBREW:
|
||||||
|
@ -56,6 +56,12 @@ public:
|
|||||||
u8 enabledPluginsCount;
|
u8 enabledPluginsCount;
|
||||||
u8 m_catStartPage;
|
u8 m_catStartPage;
|
||||||
bool m_clearCats;
|
bool m_clearCats;
|
||||||
|
bool show_homebrew;
|
||||||
|
bool parental_homebrew;
|
||||||
|
bool show_channel;
|
||||||
|
bool show_plugin;
|
||||||
|
bool show_gamecube;
|
||||||
|
vector<dir_discHdr> m_gameList;
|
||||||
private:
|
private:
|
||||||
struct SZone
|
struct SZone
|
||||||
{
|
{
|
||||||
@ -1157,6 +1163,7 @@ private:
|
|||||||
static void _ShowProgress(int dumpstat, int dumpprog, int filestat, int fileprog, int files, int folders, const char *tmess, void *user_data);
|
static void _ShowProgress(int dumpstat, int dumpprog, int filestat, int fileprog, int files, int folders, const char *tmess, void *user_data);
|
||||||
static int _gameInstaller(void *obj);
|
static int _gameInstaller(void *obj);
|
||||||
static int _GCcopyGame(void *obj);
|
static int _GCcopyGame(void *obj);
|
||||||
|
bool _searchGamesByID(const char *gameId);
|
||||||
int _GCgameInstaller();
|
int _GCgameInstaller();
|
||||||
float m_progress;
|
float m_progress;
|
||||||
float m_fprogress;
|
float m_fprogress;
|
||||||
@ -1170,10 +1177,10 @@ private:
|
|||||||
void _stopSounds(void);
|
void _stopSounds(void);
|
||||||
static int _NandDumper(void *obj);
|
static int _NandDumper(void *obj);
|
||||||
static int _NandFlasher(void *obj);
|
static int _NandFlasher(void *obj);
|
||||||
int _FindEmuPart(string &emuPath, bool searchvalid);
|
int _FindEmuPart(string &emuPath, bool searchvalid, bool savesnand);
|
||||||
bool _checkSave(string id, bool nand);
|
bool _checkSave(string id, bool nand);
|
||||||
bool _TestEmuNand(int epart, const char *path, bool indept);
|
bool _TestEmuNand(int epart, const char *path, bool indept);
|
||||||
void _validateEmuNand(void);
|
void _checkEmuNandSettings(bool savesnand);
|
||||||
|
|
||||||
static u32 _downloadCheatFileAsync(void *obj);
|
static u32 _downloadCheatFileAsync(void *obj);
|
||||||
static u32 _downloadBannerAsync(void *obj);
|
static u32 _downloadBannerAsync(void *obj);
|
||||||
|
@ -115,6 +115,9 @@ void CMenu::_getIDCats(void)
|
|||||||
switch(hdr->type)
|
switch(hdr->type)
|
||||||
{
|
{
|
||||||
case TYPE_CHANNEL:
|
case TYPE_CHANNEL:
|
||||||
|
catDomain = "NAND";
|
||||||
|
break;
|
||||||
|
case TYPE_EMUCHANNEL:
|
||||||
catDomain = "CHANNELS";
|
catDomain = "CHANNELS";
|
||||||
break;
|
break;
|
||||||
case TYPE_HOMEBREW:
|
case TYPE_HOMEBREW:
|
||||||
|
@ -63,16 +63,12 @@ void CMenu::_showConfig(void)
|
|||||||
if(m_configLblUser[i] != -1)
|
if(m_configLblUser[i] != -1)
|
||||||
m_btnMgr.show(m_configLblUser[i]);
|
m_btnMgr.show(m_configLblUser[i]);
|
||||||
|
|
||||||
bool disable = (m_current_view == COVERFLOW_CHANNEL) && (!m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false) || neek2o()) && !m_emuSaveNand;
|
const char *partitionname = DeviceName[m_cfg.getInt(_domainFromView(), "partition", 0)];
|
||||||
const char *partitionname = disable ? CHANNEL_DOMAIN : DeviceName[m_emuSaveNand ? m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0)) : m_cfg.getInt(_domainFromView(), "partition", 0)];
|
|
||||||
m_btnMgr.setText(m_configLblPartition, upperCase(partitionname));
|
m_btnMgr.setText(m_configLblPartition, upperCase(partitionname));
|
||||||
|
|
||||||
if(m_current_view != COVERFLOW_HOMEBREW && m_current_view != COVERFLOW_GAMECUBE && m_current_view != COVERFLOW_MAX)
|
|
||||||
{
|
|
||||||
m_btnMgr.show(m_configLblCfg4);
|
m_btnMgr.show(m_configLblCfg4);
|
||||||
m_btnMgr.show(m_configBtnCfg4);
|
m_btnMgr.show(m_configBtnCfg4);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
m_btnMgr.show(m_configLblParental);
|
m_btnMgr.show(m_configLblParental);
|
||||||
m_btnMgr.show(m_locked ? m_configBtnUnlock : m_configBtnSetCode);
|
m_btnMgr.show(m_locked ? m_configBtnUnlock : m_configBtnSetCode);
|
||||||
}
|
}
|
||||||
@ -206,7 +202,7 @@ int CMenu::_config1(void)
|
|||||||
m_load_view = true;
|
m_load_view = true;
|
||||||
CoverFlow.stopCoverLoader(true);
|
CoverFlow.stopCoverLoader(true);
|
||||||
_hideConfig();
|
_hideConfig();
|
||||||
if(m_current_view != COVERFLOW_PLUGIN)
|
if(m_current_view != COVERFLOW_PLUGIN || m_use_source)
|
||||||
_NandEmuCfg();
|
_NandEmuCfg();
|
||||||
else
|
else
|
||||||
_PluginSettings();
|
_PluginSettings();
|
||||||
@ -273,7 +269,7 @@ void CMenu::_textConfig(void)
|
|||||||
m_btnMgr.setText(m_configBtnSetCode, _t("cfg7", L"Set code"));
|
m_btnMgr.setText(m_configBtnSetCode, _t("cfg7", L"Set code"));
|
||||||
m_btnMgr.setText(m_configLblPartitionName, _t("cfgp1", L"Game Partition"));
|
m_btnMgr.setText(m_configLblPartitionName, _t("cfgp1", L"Game Partition"));
|
||||||
m_btnMgr.setText(m_configBtnBack, _t("cfg10", L"Back"));
|
m_btnMgr.setText(m_configBtnBack, _t("cfg10", L"Back"));
|
||||||
if(m_current_view != COVERFLOW_PLUGIN)
|
if(m_current_view != COVERFLOW_PLUGIN || m_use_source)
|
||||||
{
|
{
|
||||||
m_btnMgr.setText(m_configLblCfg4, _t("cfg13", L"NAND Emulation Settings"));
|
m_btnMgr.setText(m_configLblCfg4, _t("cfg13", L"NAND Emulation Settings"));
|
||||||
m_btnMgr.setText(m_configBtnCfg4, _t("cfg14", L"Set"));
|
m_btnMgr.setText(m_configBtnCfg4, _t("cfg14", L"Set"));
|
||||||
|
@ -365,7 +365,7 @@ void CMenu::_showGameSettings(void)
|
|||||||
m_btnMgr.show(m_gameSettingsBtnAspectRatioP);
|
m_btnMgr.show(m_gameSettingsBtnAspectRatioP);
|
||||||
m_btnMgr.show(m_gameSettingsBtnAspectRatioM);
|
m_btnMgr.show(m_gameSettingsBtnAspectRatioM);
|
||||||
}
|
}
|
||||||
else if(GameHdr->type == TYPE_CHANNEL)
|
else if(GameHdr->type == TYPE_CHANNEL || GameHdr->type == TYPE_EMUCHANNEL)
|
||||||
{
|
{
|
||||||
m_btnMgr.show(m_gameSettingsLblApploader);
|
m_btnMgr.show(m_gameSettingsLblApploader);
|
||||||
m_btnMgr.show(m_gameSettingsBtnApploader);
|
m_btnMgr.show(m_gameSettingsBtnApploader);
|
||||||
@ -390,7 +390,7 @@ void CMenu::_showGameSettings(void)
|
|||||||
}
|
}
|
||||||
if(m_gameSettingsPage == 4)
|
if(m_gameSettingsPage == 4)
|
||||||
{
|
{
|
||||||
if(GameHdr->type == TYPE_CHANNEL)
|
if(GameHdr->type == TYPE_CHANNEL || GameHdr->type == TYPE_EMUCHANNEL)
|
||||||
{
|
{
|
||||||
m_btnMgr.show(m_gameSettingsLblCustom);
|
m_btnMgr.show(m_gameSettingsLblCustom);
|
||||||
m_btnMgr.show(m_gameSettingsBtnCustom);
|
m_btnMgr.show(m_gameSettingsBtnCustom);
|
||||||
|
@ -2017,7 +2017,6 @@ int CMenu::_gametdbDownloaderAsync()
|
|||||||
fsop_deleteFile(fmt("%s/gametdb_offsets.bin", m_settingsDir.c_str()));
|
fsop_deleteFile(fmt("%s/gametdb_offsets.bin", m_settingsDir.c_str()));
|
||||||
|
|
||||||
// Update cache
|
// Update cache
|
||||||
//m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
|
|
||||||
UpdateCache();
|
UpdateCache();
|
||||||
|
|
||||||
LWP_MutexLock(m_mutex);
|
LWP_MutexLock(m_mutex);
|
||||||
|
@ -493,10 +493,8 @@ void CMenu::_game(bool launch)
|
|||||||
step = -step;
|
step = -step;
|
||||||
v.y = min(max(-15.f, v.y + step), 15.f);
|
v.y = min(max(-15.f, v.y + step), 15.f);
|
||||||
}
|
}
|
||||||
m_coverflow.setVector3D(domain, key, v);
|
CoverFlow.setCoverFlipPos(v);
|
||||||
_loadCFLayout(cf_version, true);
|
//CoverFlow.flip(true, true);
|
||||||
CoverFlow.applySettings();
|
|
||||||
CoverFlow.flip(true, true);
|
|
||||||
}
|
}
|
||||||
if(BTN_B_PRESSED && !m_locked && (m_btnMgr.selected(m_gameBtnFavoriteOn) || m_btnMgr.selected(m_gameBtnFavoriteOff)))
|
if(BTN_B_PRESSED && !m_locked && (m_btnMgr.selected(m_gameBtnFavoriteOn) || m_btnMgr.selected(m_gameBtnFavoriteOff)))
|
||||||
{
|
{
|
||||||
@ -624,12 +622,13 @@ void CMenu::_game(bool launch)
|
|||||||
MusicPlayer.Stop();
|
MusicPlayer.Stop();
|
||||||
_cleanupBanner();
|
_cleanupBanner();
|
||||||
m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str()));
|
m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str()));
|
||||||
// change to current games partition and set last_view for recall later
|
// change to current game's partition and set last_view for recall later
|
||||||
m_cfg.setInt("GENERAL", "last_view", m_current_view);
|
m_cfg.setInt("GENERAL", "last_view", m_current_view);
|
||||||
m_cfg.setInt("GENERAL", "cat_startpage", m_catStartPage);
|
m_cfg.setInt("GENERAL", "cat_startpage", m_catStartPage);
|
||||||
switch(hdr->type)
|
switch(hdr->type)
|
||||||
{
|
{
|
||||||
case TYPE_CHANNEL:
|
case TYPE_CHANNEL:
|
||||||
|
case TYPE_EMUCHANNEL:
|
||||||
currentPartition = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 1);
|
currentPartition = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 1);
|
||||||
break;
|
break;
|
||||||
case TYPE_HOMEBREW:
|
case TYPE_HOMEBREW:
|
||||||
@ -654,7 +653,9 @@ void CMenu::_game(bool launch)
|
|||||||
}
|
}
|
||||||
/* Get Banner Title for Playlog */
|
/* Get Banner Title for Playlog */
|
||||||
CurrentBanner.ClearBanner();
|
CurrentBanner.ClearBanner();
|
||||||
if(hdr->type == TYPE_CHANNEL)
|
NANDemuView = false;
|
||||||
|
if(hdr->type == TYPE_EMUCHANNEL) NANDemuView = true;
|
||||||
|
if(hdr->type == TYPE_CHANNEL || hdr->type == TYPE_EMUCHANNEL)
|
||||||
{
|
{
|
||||||
u64 chantitle = CoverFlow.getChanTitle();
|
u64 chantitle = CoverFlow.getChanTitle();
|
||||||
_extractChannelBnr(chantitle);
|
_extractChannelBnr(chantitle);
|
||||||
@ -663,7 +664,7 @@ void CMenu::_game(bool launch)
|
|||||||
_extractBnr(hdr);
|
_extractBnr(hdr);
|
||||||
if(CurrentBanner.IsValid())
|
if(CurrentBanner.IsValid())
|
||||||
_extractBannerTitle(GetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()));
|
_extractBannerTitle(GetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()));
|
||||||
if(hdr->type == TYPE_WII_GAME || hdr->type == TYPE_CHANNEL)
|
if(hdr->type == TYPE_WII_GAME || hdr->type == TYPE_CHANNEL || hdr->type == TYPE_EMUCHANNEL)
|
||||||
{
|
{
|
||||||
if(Playlog_Update(hdr->id, banner_title) < 0)
|
if(Playlog_Update(hdr->id, banner_title) < 0)
|
||||||
Playlog_Delete();
|
Playlog_Delete();
|
||||||
@ -705,9 +706,7 @@ void CMenu::_game(bool launch)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_coverflow.setVector3D(domain, key, savedv);
|
CoverFlow.setCoverFlipPos(savedv);
|
||||||
_loadCFLayout(cf_version, true);
|
|
||||||
CoverFlow.applySettings();
|
|
||||||
CoverFlow.flip(true, false);
|
CoverFlow.flip(true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -777,8 +776,7 @@ void CMenu::_game(bool launch)
|
|||||||
m_btnMgr.hide(b ? m_gameBtnAdultOff : m_gameBtnAdultOn);
|
m_btnMgr.hide(b ? m_gameBtnAdultOff : m_gameBtnAdultOn);
|
||||||
m_btnMgr.show(m_gameBtnSettings);
|
m_btnMgr.show(m_gameBtnSettings);
|
||||||
}
|
}
|
||||||
if((hdr->type != TYPE_HOMEBREW && (hdr->type != TYPE_CHANNEL ||
|
if(hdr->type != TYPE_HOMEBREW && hdr->type != TYPE_CHANNEL && !m_locked)
|
||||||
(m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false) && hdr->type == TYPE_CHANNEL))) && !m_locked)
|
|
||||||
m_btnMgr.show(m_gameBtnDelete);
|
m_btnMgr.show(m_gameBtnDelete);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -830,14 +828,14 @@ void CMenu::directlaunch(const char *GameID)
|
|||||||
DeviceHandle.OpenWBFS(currentPartition);
|
DeviceHandle.OpenWBFS(currentPartition);
|
||||||
string gameDir(fmt(wii_games_dir, DeviceName[currentPartition]));
|
string gameDir(fmt(wii_games_dir, DeviceName[currentPartition]));
|
||||||
string cacheDir(fmt("%s/%s_wii.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
|
string cacheDir(fmt("%s/%s_wii.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
|
||||||
m_gameList.CreateList(COVERFLOW_WII, currentPartition, gameDir,
|
m_cacheList.CreateList(COVERFLOW_WII, currentPartition, gameDir,
|
||||||
stringToVector(".wbfs|.iso", '|'), cacheDir, false);
|
stringToVector(".wbfs|.iso", '|'), cacheDir, false);
|
||||||
WBFS_Close();
|
WBFS_Close();
|
||||||
for(u32 i = 0; i < m_gameList.size(); i++)
|
for(u32 i = 0; i < m_cacheList.size(); i++)
|
||||||
{
|
{
|
||||||
if(strncasecmp(GameID, m_gameList[i].id, 6) == 0)
|
if(strncasecmp(GameID, m_cacheList[i].id, 6) == 0)
|
||||||
{
|
{
|
||||||
_launchGame(&m_gameList[i], false); // Launch will exit wiiflow
|
_launchGame(&m_cacheList[i], false); // Launch will exit wiiflow
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -866,7 +864,7 @@ void CMenu::_launch(const dir_discHdr *hdr)
|
|||||||
_launchGC(&launchHdr, false);
|
_launchGC(&launchHdr, false);
|
||||||
if(gcLaunchFail) return;
|
if(gcLaunchFail) return;
|
||||||
}
|
}
|
||||||
else if(launchHdr.type == TYPE_CHANNEL)
|
else if(launchHdr.type == TYPE_CHANNEL || launchHdr.type == TYPE_EMUCHANNEL)
|
||||||
_launchChannel(&launchHdr);
|
_launchChannel(&launchHdr);
|
||||||
else if(launchHdr.type == TYPE_PLUGIN)
|
else if(launchHdr.type == TYPE_PLUGIN)
|
||||||
{
|
{
|
||||||
@ -1181,8 +1179,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
|
|||||||
_launchShutdown();
|
_launchShutdown();
|
||||||
string id = string(hdr->id);
|
string id = string(hdr->id);
|
||||||
|
|
||||||
bool NAND_Emu = m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false);
|
bool WII_Launch = (m_gcfg2.getBool(id, "custom", false) && (!NANDemuView || neek2o()));
|
||||||
bool WII_Launch = (m_gcfg2.getBool(id, "custom", false) && (!NAND_Emu || neek2o()));
|
|
||||||
bool use_dol = !m_gcfg2.getBool(id, "apploader", false);
|
bool use_dol = !m_gcfg2.getBool(id, "apploader", false);
|
||||||
|
|
||||||
bool vipatch = m_gcfg2.testOptBool(id, "vipatch", m_cfg.getBool("GENERAL", "vipatch", false));
|
bool vipatch = m_gcfg2.testOptBool(id, "vipatch", m_cfg.getBool("GENERAL", "vipatch", false));
|
||||||
@ -1235,9 +1232,8 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
|
|||||||
m_cfg.save(true);
|
m_cfg.save(true);
|
||||||
cleanup();
|
cleanup();
|
||||||
|
|
||||||
if(NAND_Emu && !neek2o())
|
if(NANDemuView && !neek2o())
|
||||||
{
|
{
|
||||||
NANDemuView = true;
|
|
||||||
if(useNK2o)
|
if(useNK2o)
|
||||||
{
|
{
|
||||||
if(!Load_Neek2o_Kernel())
|
if(!Load_Neek2o_Kernel())
|
||||||
@ -1246,14 +1242,13 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
|
|||||||
Sys_Exit();
|
Sys_Exit();
|
||||||
}
|
}
|
||||||
ShutdownBeforeExit();
|
ShutdownBeforeExit();
|
||||||
Launch_nk(gameTitle, NandHandle.Get_NandPath(),
|
Launch_nk(gameTitle, NandHandle.Get_NandPath(), returnTo ? (((u64)(0x00010001) << 32) | (returnTo & 0xFFFFFFFF)) : 0);
|
||||||
returnTo ? (((u64)(0x00010001) << 32) | (returnTo & 0xFFFFFFFF)) : 0);
|
|
||||||
while(1) usleep(500);
|
while(1) usleep(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(WII_Launch == false && ExternalBooter_LoadBins(m_binsDir.c_str()) == false)
|
if(WII_Launch == false && ExternalBooter_LoadBins(m_binsDir.c_str()) == false)
|
||||||
Sys_Exit();
|
Sys_Exit();
|
||||||
if(_loadIOS(gameIOS, userIOS, id, !NAND_Emu) == LOAD_IOS_FAILED)
|
if(_loadIOS(gameIOS, userIOS, id, !NANDemuView) == LOAD_IOS_FAILED)
|
||||||
Sys_Exit();
|
Sys_Exit();
|
||||||
|
|
||||||
if((CurrentIOS.Type == IOS_TYPE_D2X || neek2o()) && returnTo != 0)
|
if((CurrentIOS.Type == IOS_TYPE_D2X || neek2o()) && returnTo != 0)
|
||||||
@ -1261,7 +1256,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
|
|||||||
if(D2X_PatchReturnTo(returnTo) >= 0)
|
if(D2X_PatchReturnTo(returnTo) >= 0)
|
||||||
memset(&returnTo, 0, sizeof(u32));
|
memset(&returnTo, 0, sizeof(u32));
|
||||||
}
|
}
|
||||||
if(NAND_Emu && !neek2o())
|
if(NANDemuView && !neek2o())
|
||||||
{
|
{
|
||||||
/* Enable our Emu NAND */
|
/* Enable our Emu NAND */
|
||||||
DeviceHandle.UnMountAll();
|
DeviceHandle.UnMountAll();
|
||||||
@ -1394,10 +1389,9 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
|
|||||||
else
|
else
|
||||||
emulate_mode--;
|
emulate_mode--;
|
||||||
|
|
||||||
m_current_view = COVERFLOW_WII; //set this in case of multisource mode
|
|
||||||
if(emulate_mode && !dvd && !neek2o())
|
if(emulate_mode && !dvd && !neek2o())
|
||||||
{
|
{
|
||||||
emuPartition = _FindEmuPart(emuPath, false);
|
emuPartition = _FindEmuPart(emuPath, false, true);
|
||||||
if(emuPartition < 0)//if savepartition and/or nand folder no good
|
if(emuPartition < 0)//if savepartition and/or nand folder no good
|
||||||
{
|
{
|
||||||
_hideWaitMessage();
|
_hideWaitMessage();
|
||||||
@ -1721,7 +1715,7 @@ void CMenu::_gameSoundThread(CMenu *m)
|
|||||||
CurrentBanner.SetBanner(cached_bnr_file, cached_bnr_size, false, true);
|
CurrentBanner.SetBanner(cached_bnr_file, cached_bnr_size, false, true);
|
||||||
else if(GameHdr->type == TYPE_WII_GAME)
|
else if(GameHdr->type == TYPE_WII_GAME)
|
||||||
_extractBnr(GameHdr);
|
_extractBnr(GameHdr);
|
||||||
else if(GameHdr->type == TYPE_CHANNEL)
|
else if(GameHdr->type == TYPE_CHANNEL || GameHdr->type == TYPE_EMUCHANNEL)
|
||||||
_extractChannelBnr(TITLE_ID(GameHdr->settings[0],
|
_extractChannelBnr(TITLE_ID(GameHdr->settings[0],
|
||||||
GameHdr->settings[1]));
|
GameHdr->settings[1]));
|
||||||
if(!CurrentBanner.IsValid())
|
if(!CurrentBanner.IsValid())
|
||||||
|
@ -67,7 +67,6 @@ bool CMenu::_Home(void)
|
|||||||
}
|
}
|
||||||
else if(m_btnMgr.selected(m_homeBtnReloadCache))
|
else if(m_btnMgr.selected(m_homeBtnReloadCache))
|
||||||
{
|
{
|
||||||
//m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
|
|
||||||
UpdateCache(m_current_view);
|
UpdateCache(m_current_view);
|
||||||
m_load_view = true;
|
m_load_view = true;
|
||||||
break;
|
break;
|
||||||
|
@ -20,18 +20,11 @@ static inline int loopNum(int i, int s)
|
|||||||
return (i + s) % s;
|
return (i + s) % s;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool show_homebrew = true;
|
|
||||||
static bool parental_homebrew = false;
|
|
||||||
static bool show_channel = true;
|
|
||||||
static bool show_plugin = true;
|
|
||||||
static bool show_gamecube = true;
|
|
||||||
|
|
||||||
void CMenu::_hideMain(bool instant)
|
void CMenu::_hideMain(bool instant)
|
||||||
{
|
{
|
||||||
m_btnMgr.hide(m_mainBtnNext, instant);
|
m_btnMgr.hide(m_mainBtnNext, instant);
|
||||||
m_btnMgr.hide(m_mainBtnPrev, instant);
|
m_btnMgr.hide(m_mainBtnPrev, instant);
|
||||||
m_btnMgr.hide(m_mainBtnConfig, instant);
|
m_btnMgr.hide(m_mainBtnConfig, instant);
|
||||||
//m_btnMgr.hide(m_mainBtnInfo, instant);
|
|
||||||
m_btnMgr.hide(m_mainBtnQuit, instant);
|
m_btnMgr.hide(m_mainBtnQuit, instant);
|
||||||
m_btnMgr.hide(m_mainBtnHomebrew, instant);
|
m_btnMgr.hide(m_mainBtnHomebrew, instant);
|
||||||
m_btnMgr.hide(m_mainBtnChannel, instant);
|
m_btnMgr.hide(m_mainBtnChannel, instant);
|
||||||
@ -73,27 +66,18 @@ start_main:
|
|||||||
m_btnMgr.show(m_mainBtnChannel);
|
m_btnMgr.show(m_mainBtnChannel);
|
||||||
else if(show_plugin)
|
else if(show_plugin)
|
||||||
m_btnMgr.show(m_mainBtnPlugin);
|
m_btnMgr.show(m_mainBtnPlugin);
|
||||||
//else if(show_homebrew)
|
|
||||||
// m_btnMgr.show(m_mainBtnHomebrew);
|
|
||||||
else
|
else
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
m_btnMgr.show(m_mainBtnWii);
|
||||||
break;
|
break;
|
||||||
case COVERFLOW_CHANNEL:
|
case COVERFLOW_CHANNEL:
|
||||||
if(show_plugin)
|
if(show_plugin)
|
||||||
m_btnMgr.show(m_mainBtnPlugin);
|
m_btnMgr.show(m_mainBtnPlugin);
|
||||||
//else if(show_homebrew)
|
else
|
||||||
// m_btnMgr.show(m_mainBtnHomebrew);
|
|
||||||
//else
|
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
m_btnMgr.show(m_mainBtnWii);
|
||||||
break;
|
break;
|
||||||
case COVERFLOW_MAX:
|
case COVERFLOW_MAX:
|
||||||
case COVERFLOW_HOMEBREW:
|
case COVERFLOW_HOMEBREW:
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
|
||||||
break;
|
|
||||||
case COVERFLOW_PLUGIN:
|
case COVERFLOW_PLUGIN:
|
||||||
//if(show_homebrew)
|
|
||||||
// m_btnMgr.show(m_mainBtnHomebrew);
|
|
||||||
//else
|
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
m_btnMgr.show(m_mainBtnWii);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -103,8 +87,6 @@ start_main:
|
|||||||
m_btnMgr.show(m_mainBtnChannel);
|
m_btnMgr.show(m_mainBtnChannel);
|
||||||
else if(show_plugin)
|
else if(show_plugin)
|
||||||
m_btnMgr.show(m_mainBtnPlugin);
|
m_btnMgr.show(m_mainBtnPlugin);
|
||||||
//else if(show_homebrew)
|
|
||||||
// m_btnMgr.show(m_mainBtnHomebrew);
|
|
||||||
else
|
else
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
m_btnMgr.show(m_mainBtnWii);
|
||||||
break;
|
break;
|
||||||
@ -131,8 +113,9 @@ start_main:
|
|||||||
_hideMain();
|
_hideMain();
|
||||||
if(!_AutoCreateNand())
|
if(!_AutoCreateNand())
|
||||||
{
|
{
|
||||||
while(NANDemuView)//keep calling _setPartition till NANDemuView is false and CHANNEL_DOMAIN, "emu_nand", false
|
// if emu nand disabled set to real nand only
|
||||||
_setPartition(1);
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", false);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", true);
|
||||||
}
|
}
|
||||||
_loadList();
|
_loadList();
|
||||||
goto start_main;
|
goto start_main;
|
||||||
@ -174,6 +157,8 @@ void CMenu::LoadView(void)
|
|||||||
cf_domain = "_COVERFLOW";
|
cf_domain = "_COVERFLOW";
|
||||||
if(m_current_view == COVERFLOW_HOMEBREW && m_cfg.getBool(HOMEBREW_DOMAIN, "smallbox", false))
|
if(m_current_view == COVERFLOW_HOMEBREW && m_cfg.getBool(HOMEBREW_DOMAIN, "smallbox", false))
|
||||||
cf_domain = "_SMALLFLOW";
|
cf_domain = "_SMALLFLOW";
|
||||||
|
if(m_sourceflow && m_cfg.getBool(_domainFromView(), "smallbox", true))
|
||||||
|
cf_domain = "_SMALLFLOW";
|
||||||
if(m_current_view == COVERFLOW_PLUGIN)
|
if(m_current_view == COVERFLOW_PLUGIN)
|
||||||
{
|
{
|
||||||
vector<bool> pluginsEnabled = m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount);
|
vector<bool> pluginsEnabled = m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount);
|
||||||
@ -204,20 +189,6 @@ void CMenu::LoadView(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_sourceflow)
|
|
||||||
{
|
|
||||||
if(m_cfg.getBool(_domainFromView(), "smallbox", true))
|
|
||||||
cf_domain = "_SMALLFLOW";
|
|
||||||
else
|
|
||||||
cf_domain = "_COVERFLOW";
|
|
||||||
m_gameList.clear();
|
|
||||||
string cacheDir(fmt("%s/sourceflow.db", m_listCacheDir.c_str()));
|
|
||||||
bool updateCache = m_cfg.getBool("SOURCEFLOW", "update_cache");
|
|
||||||
u8 maxBtns = m_cfg.getInt("GENERAL", "max_source_buttons", 71);
|
|
||||||
m_gameList.createSFList(maxBtns, m_source, show_homebrew, show_channel, show_plugin, show_gamecube, m_sourceDir, cacheDir, updateCache);
|
|
||||||
m_cfg.remove("SOURCEFLOW", "update_cache");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_loadList();
|
_loadList();
|
||||||
|
|
||||||
if(m_source_autoboot == true)
|
if(m_source_autoboot == true)
|
||||||
@ -228,6 +199,7 @@ void CMenu::LoadView(void)
|
|||||||
switch(m_autoboot_hdr.type)
|
switch(m_autoboot_hdr.type)
|
||||||
{
|
{
|
||||||
case TYPE_CHANNEL:
|
case TYPE_CHANNEL:
|
||||||
|
case TYPE_EMUCHANNEL:
|
||||||
case TYPE_WII_GAME:
|
case TYPE_WII_GAME:
|
||||||
case TYPE_GC_GAME:
|
case TYPE_GC_GAME:
|
||||||
if(strcmp(m_autoboot_hdr.id, element->id) == 0)
|
if(strcmp(m_autoboot_hdr.id, element->id) == 0)
|
||||||
@ -255,20 +227,35 @@ void CMenu::LoadView(void)
|
|||||||
/* fail */
|
/* fail */
|
||||||
m_source_autoboot = false;
|
m_source_autoboot = false;
|
||||||
}
|
}
|
||||||
// Coverflow Count
|
|
||||||
m_numCFVersions = min(max(1, m_coverflow.getInt(cf_domain, "number_of_modes", 1)), 15);
|
m_numCFVersions = min(max(1, m_coverflow.getInt(cf_domain, "number_of_modes", 1)), 15);
|
||||||
_showMain();
|
_showMain();
|
||||||
_initCF();
|
_initCF();
|
||||||
_loadCFLayout(min(max(1, m_cfg.getInt(_domainFromView(), "last_cf_mode", 1)), (int)m_numCFVersions));
|
_loadCFLayout(min(max(1, m_cfg.getInt(_domainFromView(), "last_cf_mode", 1)), (int)m_numCFVersions));
|
||||||
CoverFlow.applySettings();
|
CoverFlow.applySettings();
|
||||||
|
|
||||||
if(m_sourceflow)
|
if(m_sourceflow || m_current_view == COVERFLOW_HOMEBREW)
|
||||||
return;
|
return;
|
||||||
const char *mode = (m_current_view == COVERFLOW_CHANNEL && !m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false))
|
|
||||||
? CHANNEL_DOMAIN : DeviceName[currentPartition];
|
|
||||||
|
|
||||||
m_showtimer = 120;
|
m_showtimer = 120;
|
||||||
m_btnMgr.setText(m_mainLblNotice, sfmt("%s (%u) [%s]", _domainFromView(), m_gameList.size(), upperCase(mode).c_str()));
|
if(m_current_view == COVERFLOW_CHANNEL)
|
||||||
|
{
|
||||||
|
if(m_cfg.getBool(CHANNEL_DOMAIN, "real_nand"))
|
||||||
|
{
|
||||||
|
if(m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand"))
|
||||||
|
m_btnMgr.setText(m_mainLblNotice, sfmt("Total Channels: %u", m_gameList.size()));
|
||||||
|
else
|
||||||
|
m_btnMgr.setText(m_mainLblNotice, sfmt("NAND Channels: %u", m_gameList.size()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_btnMgr.setText(m_mainLblNotice, sfmt("EmuNand Channels: %u", m_gameList.size()));
|
||||||
|
}
|
||||||
|
else if(m_current_view == COVERFLOW_MAX || m_current_view == COVERFLOW_PLUGIN)
|
||||||
|
{
|
||||||
|
m_btnMgr.setText(m_mainLblNotice, sfmt("Total Games: %u", m_gameList.size()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_btnMgr.setText(m_mainLblNotice, sfmt("%s Games: %u", _domainFromView(), m_gameList.size()));
|
||||||
m_btnMgr.show(m_mainLblNotice);
|
m_btnMgr.show(m_mainLblNotice);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,15 +359,15 @@ int CMenu::main(void)
|
|||||||
}
|
}
|
||||||
else //show source menu
|
else //show source menu
|
||||||
{
|
{
|
||||||
if(!_Source()) //if different source selected
|
|
||||||
LoadView();
|
bool newSource = _Source();
|
||||||
else
|
|
||||||
{
|
|
||||||
if(BTN_B_HELD)
|
if(BTN_B_HELD)
|
||||||
bUsed = true;
|
bUsed = true;
|
||||||
|
if(newSource) //if different source selected
|
||||||
|
LoadView();
|
||||||
|
else
|
||||||
_showMain();
|
_showMain();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -436,6 +423,7 @@ int CMenu::main(void)
|
|||||||
}
|
}
|
||||||
else if(m_btnMgr.selected(m_mainBtnChannel) || m_btnMgr.selected(m_mainBtnWii) || m_btnMgr.selected(m_mainBtnGamecube) || m_btnMgr.selected(m_mainBtnPlugin))
|
else if(m_btnMgr.selected(m_mainBtnChannel) || m_btnMgr.selected(m_mainBtnWii) || m_btnMgr.selected(m_mainBtnGamecube) || m_btnMgr.selected(m_mainBtnPlugin))
|
||||||
{
|
{
|
||||||
|
if(m_multisource) continue;
|
||||||
if(m_current_view == COVERFLOW_WII)
|
if(m_current_view == COVERFLOW_WII)
|
||||||
m_current_view = show_gamecube ? COVERFLOW_GAMECUBE : (show_channel ? COVERFLOW_CHANNEL : (show_plugin ? COVERFLOW_PLUGIN : COVERFLOW_WII));
|
m_current_view = show_gamecube ? COVERFLOW_GAMECUBE : (show_channel ? COVERFLOW_CHANNEL : (show_plugin ? COVERFLOW_PLUGIN : COVERFLOW_WII));
|
||||||
else if(m_current_view == COVERFLOW_GAMECUBE)
|
else if(m_current_view == COVERFLOW_GAMECUBE)
|
||||||
@ -444,12 +432,13 @@ int CMenu::main(void)
|
|||||||
m_current_view = show_plugin ? COVERFLOW_PLUGIN : COVERFLOW_WII;
|
m_current_view = show_plugin ? COVERFLOW_PLUGIN : COVERFLOW_WII;
|
||||||
else if(m_current_view == COVERFLOW_PLUGIN)
|
else if(m_current_view == COVERFLOW_PLUGIN)
|
||||||
m_current_view = COVERFLOW_WII;
|
m_current_view = COVERFLOW_WII;
|
||||||
else if(m_current_view == COVERFLOW_MAX)
|
|
||||||
m_current_view = COVERFLOW_WII;
|
|
||||||
_clearSources();
|
_clearSources();
|
||||||
m_cfg.setBool(_domainFromView(), "source", true);
|
m_cfg.setBool(_domainFromView(), "source", true);
|
||||||
m_catStartPage = 1;
|
m_catStartPage = 1;
|
||||||
m_combined_view = false;
|
m_combined_view = false;
|
||||||
|
if(m_current_view == COVERFLOW_CHANNEL
|
||||||
|
&& !m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand") && !m_cfg.getBool(CHANNEL_DOMAIN, "real_nand"))
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", true);
|
||||||
LoadView();
|
LoadView();
|
||||||
}
|
}
|
||||||
else if(m_btnMgr.selected(m_mainBtnInstall))//used when no games found
|
else if(m_btnMgr.selected(m_mainBtnInstall))//used when no games found
|
||||||
@ -561,6 +550,24 @@ int CMenu::main(void)
|
|||||||
_showMain();
|
_showMain();
|
||||||
_initCF();
|
_initCF();
|
||||||
}
|
}
|
||||||
|
else if(m_btnMgr.selected(m_mainBtnConfig) && m_current_view == COVERFLOW_CHANNEL)
|
||||||
|
{
|
||||||
|
bUsed = true;
|
||||||
|
if(m_cfg.getBool(CHANNEL_DOMAIN, "real_nand"))
|
||||||
|
{
|
||||||
|
if(m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand"))
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", false);// shows emunand
|
||||||
|
else
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", true);// shows both
|
||||||
|
}
|
||||||
|
else //if(m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand")) doesn't matter
|
||||||
|
{
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", true);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", false);// show real
|
||||||
|
}
|
||||||
|
LoadView();
|
||||||
|
|
||||||
|
}
|
||||||
else if(m_btnMgr.selected(m_mainBtnNext) || m_btnMgr.selected(m_mainBtnPrev))
|
else if(m_btnMgr.selected(m_mainBtnNext) || m_btnMgr.selected(m_mainBtnPrev))
|
||||||
{
|
{
|
||||||
bUsed = true;
|
bUsed = true;
|
||||||
@ -711,23 +718,10 @@ int CMenu::main(void)
|
|||||||
else if(BTN_MINUS_PRESSED && !m_locked && !m_sourceflow && m_current_view != COVERFLOW_HOMEBREW)
|
else if(BTN_MINUS_PRESSED && !m_locked && !m_sourceflow && m_current_view != COVERFLOW_HOMEBREW)
|
||||||
{
|
{
|
||||||
bUsed = true;
|
bUsed = true;
|
||||||
//const char *partition = NULL;
|
_showWaitMessage();
|
||||||
//_showWaitMessage();
|
_hideMain();
|
||||||
//_hideMain();
|
|
||||||
_setPartition(1);
|
_setPartition(1);
|
||||||
/*if(m_current_view == COVERFLOW_CHANNEL && (!m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false) || neek2o()))
|
|
||||||
partition = "NAND";
|
|
||||||
else
|
|
||||||
partition = DeviceName[currentPartition];*/
|
|
||||||
LoadView();
|
LoadView();
|
||||||
/*//gprintf("Next item: %s\n", partition);
|
|
||||||
_loadList();
|
|
||||||
_showMain();
|
|
||||||
_initCF();
|
|
||||||
refresh AFTER reloading
|
|
||||||
m_showtimer = 120;
|
|
||||||
m_btnMgr.setText(m_mainLblNotice, sfmt("%s (%u) [%s]", _domainFromView(), m_gameList.size(), upperCase(partition).c_str()));
|
|
||||||
m_btnMgr.show(m_mainLblNotice);*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,26 +773,17 @@ int CMenu::main(void)
|
|||||||
m_btnMgr.show(m_mainBtnChannel);
|
m_btnMgr.show(m_mainBtnChannel);
|
||||||
else if(show_plugin)
|
else if(show_plugin)
|
||||||
m_btnMgr.show(m_mainBtnPlugin);
|
m_btnMgr.show(m_mainBtnPlugin);
|
||||||
//else if(show_homebrew)
|
|
||||||
// m_btnMgr.show(m_mainBtnHomebrew);
|
|
||||||
else
|
else
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
m_btnMgr.show(m_mainBtnWii);
|
||||||
break;
|
break;
|
||||||
case COVERFLOW_CHANNEL:
|
case COVERFLOW_CHANNEL:
|
||||||
if(show_plugin)
|
if(show_plugin)
|
||||||
m_btnMgr.show(m_mainBtnPlugin);
|
m_btnMgr.show(m_mainBtnPlugin);
|
||||||
//else if(show_homebrew)
|
|
||||||
// m_btnMgr.show(m_mainBtnHomebrew);
|
|
||||||
else
|
else
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
m_btnMgr.show(m_mainBtnWii);
|
||||||
break;
|
break;
|
||||||
case COVERFLOW_PLUGIN:
|
case COVERFLOW_PLUGIN:
|
||||||
//if(show_homebrew)
|
case COVERFLOW_HOMEBREW:
|
||||||
// m_btnMgr.show(m_mainBtnHomebrew);
|
|
||||||
//else
|
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
|
||||||
break;
|
|
||||||
//case COVERFLOW_HOMEBREW:
|
|
||||||
case COVERFLOW_MAX:
|
case COVERFLOW_MAX:
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
m_btnMgr.show(m_mainBtnWii);
|
||||||
break;
|
break;
|
||||||
@ -809,8 +794,6 @@ int CMenu::main(void)
|
|||||||
m_btnMgr.show(m_mainBtnChannel);
|
m_btnMgr.show(m_mainBtnChannel);
|
||||||
else if(show_plugin)
|
else if(show_plugin)
|
||||||
m_btnMgr.show(m_mainBtnPlugin);
|
m_btnMgr.show(m_mainBtnPlugin);
|
||||||
//else if(show_homebrew)
|
|
||||||
// m_btnMgr.show(m_mainBtnHomebrew);
|
|
||||||
else
|
else
|
||||||
m_btnMgr.show(m_mainBtnWii);
|
m_btnMgr.show(m_mainBtnWii);
|
||||||
}
|
}
|
||||||
@ -862,8 +845,7 @@ int CMenu::main(void)
|
|||||||
if(!m_cfg.getBool(CHANNEL_DOMAIN, "neek_return_default", false))
|
if(!m_cfg.getBool(CHANNEL_DOMAIN, "neek_return_default", false))
|
||||||
{
|
{
|
||||||
string emuPath;
|
string emuPath;
|
||||||
m_current_view = COVERFLOW_CHANNEL; /* So we get the path */
|
_FindEmuPart(emuPath, false, false);
|
||||||
_FindEmuPart(emuPath, false);
|
|
||||||
ReturnPath = NandHandle.Get_NandPath();
|
ReturnPath = NandHandle.Get_NandPath();
|
||||||
}
|
}
|
||||||
Sys_SetNeekPath(ReturnPath);
|
Sys_SetNeekPath(ReturnPath);
|
||||||
@ -1121,36 +1103,22 @@ void CMenu::_setPartition(s8 direction)
|
|||||||
if(m_current_view == COVERFLOW_CHANNEL && neek2o())
|
if(m_current_view == COVERFLOW_CHANNEL && neek2o())
|
||||||
return;
|
return;
|
||||||
int FS_Type = 0;
|
int FS_Type = 0;
|
||||||
|
/* change partition if direction is not zero */
|
||||||
if(direction != 0)
|
if(direction != 0)
|
||||||
{
|
{
|
||||||
bool switch_to_real = true;
|
|
||||||
if(m_current_view == COVERFLOW_CHANNEL && !NANDemuView)
|
|
||||||
{
|
|
||||||
NANDemuView = true;
|
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", true);
|
|
||||||
switch_to_real = false;
|
|
||||||
}
|
|
||||||
bool NeedFAT = m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_GAMECUBE;
|
bool NeedFAT = m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_GAMECUBE;
|
||||||
|
|
||||||
u8 limiter = 0;
|
u8 limiter = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
currentPartition = loopNum(currentPartition + direction, 10);
|
currentPartition = loopNum(currentPartition + direction, 9);
|
||||||
FS_Type = DeviceHandle.GetFSType(currentPartition);
|
FS_Type = DeviceHandle.GetFSType(currentPartition);
|
||||||
if(m_current_view == COVERFLOW_CHANNEL && switch_to_real && FS_Type == -1)
|
|
||||||
break;
|
|
||||||
limiter++;
|
limiter++;
|
||||||
}
|
}
|
||||||
while(limiter < 12 && (!DeviceHandle.IsInserted(currentPartition) ||
|
while(limiter < 9 && (!DeviceHandle.IsInserted(currentPartition) ||
|
||||||
(m_current_view != COVERFLOW_WII && FS_Type == PART_FS_WBFS) ||
|
(m_current_view != COVERFLOW_WII && FS_Type == PART_FS_WBFS) ||
|
||||||
(NeedFAT && FS_Type != PART_FS_FAT)));
|
(NeedFAT && FS_Type != PART_FS_FAT)));
|
||||||
|
|
||||||
if(m_current_view == COVERFLOW_CHANNEL && FS_Type == -1)
|
|
||||||
{
|
|
||||||
NANDemuView = false;
|
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
/* set partition to currentPartition */
|
||||||
if(m_emuSaveNand)
|
if(m_emuSaveNand)
|
||||||
m_cfg.setInt(WII_DOMAIN, "savepartition", currentPartition);
|
m_cfg.setInt(WII_DOMAIN, "savepartition", currentPartition);
|
||||||
else
|
else
|
||||||
@ -1158,6 +1126,8 @@ void CMenu::_setPartition(s8 direction)
|
|||||||
if(direction == 0 || (direction != 0 && (m_current_view != COVERFLOW_CHANNEL ||
|
if(direction == 0 || (direction != 0 && (m_current_view != COVERFLOW_CHANNEL ||
|
||||||
(FS_Type != -1 && DeviceHandle.IsInserted(currentPartition)))))
|
(FS_Type != -1 && DeviceHandle.IsInserted(currentPartition)))))
|
||||||
m_cfg.setInt(_domainFromView(), "partition", currentPartition);
|
m_cfg.setInt(_domainFromView(), "partition", currentPartition);
|
||||||
|
if(m_current_view == COVERFLOW_PLUGIN)
|
||||||
|
{
|
||||||
vector<bool> plugin_list = m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount);
|
vector<bool> plugin_list = m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount);
|
||||||
if(enabledPluginsCount == 1)
|
if(enabledPluginsCount == 1)
|
||||||
{
|
{
|
||||||
@ -1172,3 +1142,4 @@ void CMenu::_setPartition(s8 direction)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -82,11 +82,11 @@ static void listEmuNands(const char * path, vector<string> &emuNands)
|
|||||||
sort(emuNands.begin(), emuNands.end());
|
sort(emuNands.begin(), emuNands.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMenu::_validateEmuNand(void)
|
void CMenu::_checkEmuNandSettings(bool savesnand)
|
||||||
{
|
{
|
||||||
string emuNand;
|
string emuNand;
|
||||||
int emuPart;
|
int emuPart;
|
||||||
if(m_current_view == COVERFLOW_CHANNEL)
|
if(!savesnand)
|
||||||
{
|
{
|
||||||
emuNand = m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default");
|
emuNand = m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default");
|
||||||
emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0);
|
emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0);
|
||||||
@ -96,13 +96,14 @@ void CMenu::_validateEmuNand(void)
|
|||||||
emuNand = m_cfg.getString(WII_DOMAIN, "current_save_emunand", m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default"));
|
emuNand = m_cfg.getString(WII_DOMAIN, "current_save_emunand", m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default"));
|
||||||
emuPart = m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0));
|
emuPart = m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0));
|
||||||
}
|
}
|
||||||
if(!DeviceHandle.PartitionUsableForNandEmu(emuPart))
|
/* check if partition is FAT */
|
||||||
|
if(!DeviceHandle.PartitionUsableForNandEmu(emuPart))// if not then find a FAT partition
|
||||||
{
|
{
|
||||||
for(emuPart = SD; emuPart <= USB8; emuPart++)
|
for(emuPart = SD; emuPart <= USB8; emuPart++)
|
||||||
{
|
{
|
||||||
if(DeviceHandle.PartitionUsableForNandEmu(emuPart))
|
if(DeviceHandle.PartitionUsableForNandEmu(emuPart))
|
||||||
{
|
{
|
||||||
if(m_current_view == COVERFLOW_CHANNEL)
|
if(!savesnand)
|
||||||
m_cfg.setInt(CHANNEL_DOMAIN, "partition", emuPart);
|
m_cfg.setInt(CHANNEL_DOMAIN, "partition", emuPart);
|
||||||
else
|
else
|
||||||
m_cfg.setInt(WII_DOMAIN, "savepartition", emuPart);
|
m_cfg.setInt(WII_DOMAIN, "savepartition", emuPart);
|
||||||
@ -110,26 +111,41 @@ void CMenu::_validateEmuNand(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* check directory */
|
||||||
const char *tmpPath = fmt("/%s/%s", EMU_NANDS_DIR, emuNand.c_str());
|
const char *tmpPath = fmt("/%s/%s", EMU_NANDS_DIR, emuNand.c_str());
|
||||||
if(!_TestEmuNand(emuPart, tmpPath, false))
|
if(!_TestEmuNand(emuPart, tmpPath, false))// if doesn't exist set to default
|
||||||
{
|
{
|
||||||
if(m_current_view == COVERFLOW_CHANNEL)
|
if(!savesnand)
|
||||||
m_cfg.setString(CHANNEL_DOMAIN, "current_emunand", "default");
|
m_cfg.setString(CHANNEL_DOMAIN, "current_emunand", "default");
|
||||||
else
|
else
|
||||||
m_cfg.setString(WII_DOMAIN, "current_save_emunand", "default");
|
m_cfg.setString(WII_DOMAIN, "current_save_emunand", "default");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _saveExists(const char *path)
|
int CMenu::_FindEmuPart(string &emuPath, bool skipchecks, bool savesnand)
|
||||||
{
|
{
|
||||||
DIR *d = opendir(path);
|
int emuPart = -1;
|
||||||
if(!d)
|
const char *tmpPath = NULL;
|
||||||
return false;
|
if(!savesnand)
|
||||||
|
{
|
||||||
|
emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0);
|
||||||
|
tmpPath = fmt("/%s/%s", EMU_NANDS_DIR, m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default").c_str());
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
closedir(d);
|
emuPart = m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0));
|
||||||
return true;
|
tmpPath = fmt("/%s/%s", EMU_NANDS_DIR, m_cfg.getString(WII_DOMAIN, "current_save_emunand", m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default")).c_str());
|
||||||
}
|
}
|
||||||
|
if(!DeviceHandle.PartitionUsableForNandEmu(emuPart))
|
||||||
|
return -1;
|
||||||
|
else if((skipchecks || _TestEmuNand(emuPart, tmpPath, true)))
|
||||||
|
{
|
||||||
|
NandHandle.SetNANDEmu(emuPart);
|
||||||
|
NandHandle.SetPaths(tmpPath, DeviceName[emuPart]);
|
||||||
|
emuPath = tmpPath;
|
||||||
|
return emuPart;
|
||||||
|
}
|
||||||
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMenu::_TestEmuNand(int epart, const char *path, bool indept)
|
bool CMenu::_TestEmuNand(int epart, const char *path, bool indept)
|
||||||
@ -161,30 +177,16 @@ bool CMenu::_TestEmuNand(int epart, const char *path, bool indept)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CMenu::_FindEmuPart(string &emuPath, bool skipchecks)
|
static bool _saveExists(const char *path)
|
||||||
{
|
{
|
||||||
int emuPart = -1;
|
DIR *d = opendir(path);
|
||||||
const char *tmpPath = NULL;
|
if(!d)
|
||||||
if(m_current_view == COVERFLOW_CHANNEL)
|
return false;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0);
|
closedir(d);
|
||||||
tmpPath = fmt("/%s/%s", EMU_NANDS_DIR, m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default").c_str());
|
return true;
|
||||||
}
|
}
|
||||||
else if(m_current_view == COVERFLOW_WII)
|
|
||||||
{
|
|
||||||
emuPart = m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0));
|
|
||||||
tmpPath = fmt("/%s/%s", EMU_NANDS_DIR, m_cfg.getString(WII_DOMAIN, "current_save_emunand", m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default")).c_str());
|
|
||||||
}
|
|
||||||
if(!DeviceHandle.PartitionUsableForNandEmu(emuPart))
|
|
||||||
return -1;
|
|
||||||
else if((skipchecks || _TestEmuNand(emuPart, tmpPath, true)))
|
|
||||||
{
|
|
||||||
NandHandle.SetNANDEmu(emuPart);
|
|
||||||
NandHandle.SetPaths(tmpPath, DeviceName[emuPart]);
|
|
||||||
emuPath = tmpPath;
|
|
||||||
return emuPart;
|
|
||||||
}
|
|
||||||
return -2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMenu::_checkSave(string id, bool nand)
|
bool CMenu::_checkSave(string id, bool nand)
|
||||||
@ -586,9 +588,9 @@ int CMenu::_FlashSave(string gameId)
|
|||||||
int CMenu::_AutoExtractSave(string gameId)
|
int CMenu::_AutoExtractSave(string gameId)
|
||||||
{
|
{
|
||||||
string emuPath;
|
string emuPath;
|
||||||
int emuPartition = _FindEmuPart(emuPath, false);
|
int emuPartition = _FindEmuPart(emuPath, false, true);
|
||||||
if(emuPartition < 0)
|
if(emuPartition < 0)
|
||||||
emuPartition = _FindEmuPart(emuPath, true);
|
emuPartition = _FindEmuPart(emuPath, true, true);
|
||||||
if(!_checkSave(gameId, true))//if save not on real nand
|
if(!_checkSave(gameId, true))//if save not on real nand
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@ -704,7 +706,6 @@ int CMenu::_AutoCreateNand(void)
|
|||||||
m_btnMgr.setText(m_nandemuBtnDisable, _t("cfgne22", L"Disable NAND Emulation"));
|
m_btnMgr.setText(m_nandemuBtnDisable, _t("cfgne22", L"Disable NAND Emulation"));
|
||||||
m_btnMgr.setText(m_nandemuBtnPartition, _t("cfgne31", L"Select Partition"));
|
m_btnMgr.setText(m_nandemuBtnPartition, _t("cfgne31", L"Select Partition"));
|
||||||
//might add change nand button
|
//might add change nand button
|
||||||
//m_btnMgr.setText(m_nandemuLblInit, _t("cfgne23", L"Emu NAND not found. Try changing the partition to select the correct device/partition, click Extract to extract your NAND, or click disable to disable NAND Emulation."));
|
|
||||||
m_btnMgr.setText(m_nandemuLblInit, _t("cfgne23", L"Emu NAND not found. Try one of these options to fix the problem."));
|
m_btnMgr.setText(m_nandemuLblInit, _t("cfgne23", L"Emu NAND not found. Try one of these options to fix the problem."));
|
||||||
m_btnMgr.show(m_nandemuBtnExtract);
|
m_btnMgr.show(m_nandemuBtnExtract);
|
||||||
m_btnMgr.show(m_nandemuBtnDisable);
|
m_btnMgr.show(m_nandemuBtnDisable);
|
||||||
@ -836,7 +837,7 @@ int CMenu::_NandFlasher(void *obj)
|
|||||||
char dest[ISFS_MAXPATH];
|
char dest[ISFS_MAXPATH];
|
||||||
|
|
||||||
const char *SaveGameID = m.m_saveExtGameId.c_str();
|
const char *SaveGameID = m.m_saveExtGameId.c_str();
|
||||||
int emuPartition = m._FindEmuPart(emuPath, false);
|
int emuPartition = m._FindEmuPart(emuPath, false, true);
|
||||||
int flashID = SaveGameID[0] << 24 | SaveGameID[1] << 16 | SaveGameID[2] << 8 | SaveGameID[3];
|
int flashID = SaveGameID[0] << 24 | SaveGameID[1] << 16 | SaveGameID[2] << 8 | SaveGameID[3];
|
||||||
|
|
||||||
if(_saveExists(fmt("%s:%s/title/00010000/%08x", DeviceName[emuPartition], emuPath.c_str(), flashID)))
|
if(_saveExists(fmt("%s:%s/title/00010000/%08x", DeviceName[emuPartition], emuPath.c_str(), flashID)))
|
||||||
@ -876,7 +877,7 @@ int CMenu::_NandDumper(void *obj)
|
|||||||
m.m_foldersdone = 0;
|
m.m_foldersdone = 0;
|
||||||
|
|
||||||
NandHandle.ResetCounters();
|
NandHandle.ResetCounters();
|
||||||
emuPartition = m._FindEmuPart(emuPath, true);
|
emuPartition = m._FindEmuPart(emuPath, true, (m.m_current_view == COVERFLOW_WII));
|
||||||
|
|
||||||
if(emuPartition < 0)
|
if(emuPartition < 0)
|
||||||
{
|
{
|
||||||
@ -908,14 +909,16 @@ int CMenu::_NandDumper(void *obj)
|
|||||||
if(m.m_saveExtGameId.empty())
|
if(m.m_saveExtGameId.empty())
|
||||||
{
|
{
|
||||||
m.m_nandexentry = 0;
|
m.m_nandexentry = 0;
|
||||||
saveList.reserve(m_gameList.size());
|
saveList.reserve(m.m_gameList.size());
|
||||||
for(u32 i = 0; i < m_gameList.size() && !m.m_thrdStop; ++i)
|
for(u32 i = 0; i < m.m_gameList.size() && !m.m_thrdStop; ++i)
|
||||||
{
|
{
|
||||||
LWP_MutexLock(m.m_mutex);
|
LWP_MutexLock(m.m_mutex);
|
||||||
m._setDumpMsg(m._t("cfgne18", L"Listing game saves to extract..."), 0.f, 0.f);
|
m._setDumpMsg(m._t("cfgne18", L"Listing game saves to extract..."), 0.f, 0.f);
|
||||||
LWP_MutexUnlock(m.m_mutex);
|
LWP_MutexUnlock(m.m_mutex);
|
||||||
|
|
||||||
string id((const char *)m_gameList[i].id, 4);
|
if(m.m_gameList[i].type == TYPE_CHANNEL)
|
||||||
|
{
|
||||||
|
string id((const char *)m.m_gameList[i].id, 4);
|
||||||
|
|
||||||
if(!missingOnly || !m._checkSave(id, false))
|
if(!missingOnly || !m._checkSave(id, false))
|
||||||
{
|
{
|
||||||
@ -927,6 +930,7 @@ int CMenu::_NandDumper(void *obj)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m.m_nandexentry = 1;
|
m.m_nandexentry = 1;
|
||||||
|
@ -10,18 +10,13 @@ s16 m_sourceLblPage;
|
|||||||
s16 m_sourceBtnPageM;
|
s16 m_sourceBtnPageM;
|
||||||
s16 m_sourceBtnPageP;
|
s16 m_sourceBtnPageP;
|
||||||
s16 m_sourceBtnBack;
|
s16 m_sourceBtnBack;
|
||||||
|
s16 m_sourceBtnClear;
|
||||||
s16 m_sourceLblTitle;
|
s16 m_sourceLblTitle;
|
||||||
s16 m_sourceBtnSource[12];
|
s16 m_sourceBtnSource[12];
|
||||||
s16 m_sourceLblUser[4];
|
s16 m_sourceLblUser[4];
|
||||||
|
|
||||||
TexData m_sourceBg;
|
TexData m_sourceBg;
|
||||||
|
|
||||||
static bool show_homebrew = true;
|
|
||||||
static bool parental_homebrew = false;
|
|
||||||
static bool show_channel = true;
|
|
||||||
static bool show_plugin = true;
|
|
||||||
static bool show_gamecube = true;
|
|
||||||
|
|
||||||
string source, themeName;
|
string source, themeName;
|
||||||
bool exitSource = false;
|
bool exitSource = false;
|
||||||
u8 sourceBtn;
|
u8 sourceBtn;
|
||||||
@ -68,14 +63,16 @@ void CMenu::_sourceFlow()
|
|||||||
else if(source == "emunand")
|
else if(source == "emunand")
|
||||||
{
|
{
|
||||||
m_current_view = COVERFLOW_CHANNEL;
|
m_current_view = COVERFLOW_CHANNEL;
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", true);
|
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "source", true);
|
m_cfg.setBool(CHANNEL_DOMAIN, "source", true);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", true);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", false);
|
||||||
}
|
}
|
||||||
else if(source == "realnand")
|
else if(source == "realnand")
|
||||||
{
|
{
|
||||||
m_current_view = COVERFLOW_CHANNEL;
|
m_current_view = COVERFLOW_CHANNEL;
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", false);
|
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "source", true);
|
m_cfg.setBool(CHANNEL_DOMAIN, "source", true);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", true);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", false);
|
||||||
}
|
}
|
||||||
else if(source == "homebrew")
|
else if(source == "homebrew")
|
||||||
{
|
{
|
||||||
@ -122,6 +119,7 @@ void CMenu::_hideSource(bool instant)
|
|||||||
m_btnMgr.hide(m_sourceBtnPageM, instant);
|
m_btnMgr.hide(m_sourceBtnPageM, instant);
|
||||||
m_btnMgr.hide(m_sourceBtnPageP, instant);
|
m_btnMgr.hide(m_sourceBtnPageP, instant);
|
||||||
m_btnMgr.hide(m_sourceBtnBack, instant);
|
m_btnMgr.hide(m_sourceBtnBack, instant);
|
||||||
|
m_btnMgr.hide(m_sourceBtnClear, instant);
|
||||||
|
|
||||||
for(i = 0; i < ARRAY_SIZE(m_sourceLblUser); ++i)
|
for(i = 0; i < ARRAY_SIZE(m_sourceLblUser); ++i)
|
||||||
{
|
{
|
||||||
@ -148,6 +146,8 @@ void CMenu::_showSource(void)
|
|||||||
|
|
||||||
m_btnMgr.show(m_sourceLblTitle);
|
m_btnMgr.show(m_sourceLblTitle);
|
||||||
m_btnMgr.show(m_sourceBtnBack);
|
m_btnMgr.show(m_sourceBtnBack);
|
||||||
|
if(m_multisource)
|
||||||
|
m_btnMgr.show(m_sourceBtnClear);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMenu::_updateSourceBtns(void)
|
void CMenu::_updateSourceBtns(void)
|
||||||
@ -165,8 +165,8 @@ void CMenu::_updateSourceBtns(void)
|
|||||||
selectedBtns = 0;
|
selectedBtns = 0;
|
||||||
for(i = 0; i < ((numPages - 1) * 12 + 12); ++i)
|
for(i = 0; i < ((numPages - 1) * 12 + 12); ++i)
|
||||||
{
|
{
|
||||||
if(i < 12)
|
//if(i < 12)
|
||||||
m_btnMgr.hide(m_sourceBtnSource[i], true);
|
// m_btnMgr.hide(m_sourceBtnSource[i], true);
|
||||||
memset(current_btn, 0, 16);
|
memset(current_btn, 0, 16);
|
||||||
strncpy(current_btn, fmt("BUTTON_%i", i), 15);
|
strncpy(current_btn, fmt("BUTTON_%i", i), 15);
|
||||||
string btnSource = m_source.getString(current_btn, "source", "");
|
string btnSource = m_source.getString(current_btn, "source", "");
|
||||||
@ -191,16 +191,18 @@ void CMenu::_updateSourceBtns(void)
|
|||||||
magicNums.clear();
|
magicNums.clear();
|
||||||
magicNums = m_source.getStrings(current_btn, "magic", ',');
|
magicNums = m_source.getStrings(current_btn, "magic", ',');
|
||||||
u32 magic = strtoul(magicNums.at(0).c_str(), NULL, 16);
|
u32 magic = strtoul(magicNums.at(0).c_str(), NULL, 16);
|
||||||
if(m_cfg.getBool(PLUGIN_DOMAIN, "source", false) && m_plugin.GetEnableStatus(m_cfg, magic))
|
if(m_plugin.GetEnableStatus(m_cfg, magic))
|
||||||
{
|
{
|
||||||
|
m_cfg.setBool(PLUGIN_DOMAIN, "source", true);
|
||||||
sourceBtn = i;
|
sourceBtn = i;
|
||||||
selectedBtns++;
|
selectedBtns++;
|
||||||
btn_image = btn_imageSel;
|
btn_image = btn_imageSel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(((btnSource == "realnand" && !m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand")) ||
|
else if((btnSource == "realnand" && m_cfg.getBool(CHANNEL_DOMAIN, "real_nand", false)) ||
|
||||||
(btnSource == "emunand" && m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand"))) && m_cfg.getBool(CHANNEL_DOMAIN, "source", false))
|
(btnSource == "emunand" && m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false)))
|
||||||
{
|
{
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "source", true);
|
||||||
sourceBtn = i;
|
sourceBtn = i;
|
||||||
selectedBtns++;
|
selectedBtns++;
|
||||||
btn_image = btn_imageSel;
|
btn_image = btn_imageSel;
|
||||||
@ -225,9 +227,9 @@ void CMenu::_updateSourceBtns(void)
|
|||||||
if(TexHandle.fromImageFile(texConsoleImg, fmt("%s/%s", m_sourceDir.c_str(), btn_image)) != TE_OK)
|
if(TexHandle.fromImageFile(texConsoleImg, fmt("%s/%s", m_sourceDir.c_str(), btn_image)) != TE_OK)
|
||||||
TexHandle.fromImageFile(texConsoleImg, fmt("%s/favoriteson.png", m_imgsDir.c_str()));
|
TexHandle.fromImageFile(texConsoleImg, fmt("%s/favoriteson.png", m_imgsDir.c_str()));
|
||||||
}
|
}
|
||||||
if(TexHandle.fromImageFile(texConsoleImgs, fmt("%s/%s/%s", m_sourceDir.c_str(), themeName.c_str(), btn_imageSel)) != TE_OK)
|
if(TexHandle.fromImageFile(texConsoleImgs, fmt("%s/%s/%s", m_sourceDir.c_str(), themeName.c_str(), btn_image)) != TE_OK)
|
||||||
{
|
{
|
||||||
if(TexHandle.fromImageFile(texConsoleImgs, fmt("%s/%s", m_sourceDir.c_str(), btn_imageSel)) != TE_OK)
|
if(TexHandle.fromImageFile(texConsoleImgs, fmt("%s/%s", m_sourceDir.c_str(), btn_image)) != TE_OK)
|
||||||
TexHandle.fromImageFile(texConsoleImgs, fmt("%s/favoritesons.png", m_imgsDir.c_str()));
|
TexHandle.fromImageFile(texConsoleImgs, fmt("%s/favoritesons.png", m_imgsDir.c_str()));
|
||||||
}
|
}
|
||||||
m_btnMgr.setBtnTexture(m_sourceBtnSource[i - j], texConsoleImg, texConsoleImgs);
|
m_btnMgr.setBtnTexture(m_sourceBtnSource[i - j], texConsoleImg, texConsoleImgs);
|
||||||
@ -245,12 +247,7 @@ void CMenu::_showSourceNotice(void)
|
|||||||
|
|
||||||
bool CMenu::_Source()
|
bool CMenu::_Source()
|
||||||
{
|
{
|
||||||
parental_homebrew = m_cfg.getBool(HOMEBREW_DOMAIN, "parental", false);
|
bool newSource = false;
|
||||||
show_homebrew = (!m_cfg.getBool(HOMEBREW_DOMAIN, "disable", false) && (parental_homebrew || !m_locked));
|
|
||||||
show_channel = !m_cfg.getBool(CHANNEL_DOMAIN, "disable", false);
|
|
||||||
show_plugin = !m_cfg.getBool(PLUGIN_DOMAIN, "disable", false);
|
|
||||||
show_gamecube = m_show_gc;
|
|
||||||
bool noChanges = true;
|
|
||||||
bool updateSource = false;
|
bool updateSource = false;
|
||||||
exitSource = false;
|
exitSource = false;
|
||||||
m_showtimer = 0;
|
m_showtimer = 0;
|
||||||
@ -282,6 +279,8 @@ bool CMenu::_Source()
|
|||||||
_CfgSrc();
|
_CfgSrc();
|
||||||
if(m_cfg.getBool("SOURCEFLOW", "enabled"))
|
if(m_cfg.getBool("SOURCEFLOW", "enabled"))
|
||||||
return true;
|
return true;
|
||||||
|
if(m_multisource)
|
||||||
|
newSource = true;
|
||||||
_showSource();
|
_showSource();
|
||||||
_updateSourceBtns();
|
_updateSourceBtns();
|
||||||
}
|
}
|
||||||
@ -340,7 +339,7 @@ bool CMenu::_Source()
|
|||||||
m_btnMgr.up();
|
m_btnMgr.up();
|
||||||
else if(BTN_DOWN_PRESSED)
|
else if(BTN_DOWN_PRESSED)
|
||||||
m_btnMgr.down();
|
m_btnMgr.down();
|
||||||
else if(((BTN_LEFT_PRESSED || (!m_multisource && BTN_MINUS_PRESSED)) && numPages > 1)
|
else if(((BTN_LEFT_PRESSED || BTN_MINUS_PRESSED) && numPages > 1)
|
||||||
|| (BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnPageM)))
|
|| (BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnPageM)))
|
||||||
{
|
{
|
||||||
curPage--;
|
curPage--;
|
||||||
@ -350,7 +349,7 @@ bool CMenu::_Source()
|
|||||||
m_btnMgr.click(m_sourceBtnPageM);
|
m_btnMgr.click(m_sourceBtnPageM);
|
||||||
_updateSourceBtns();
|
_updateSourceBtns();
|
||||||
}
|
}
|
||||||
else if(((BTN_RIGHT_PRESSED || (!m_multisource && BTN_PLUS_PRESSED)) && numPages > 1)
|
else if(((BTN_RIGHT_PRESSED || BTN_PLUS_PRESSED) && numPages > 1)
|
||||||
|| (BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnPageP)))
|
|| (BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnPageP)))
|
||||||
{
|
{
|
||||||
curPage++;
|
curPage++;
|
||||||
@ -360,7 +359,16 @@ bool CMenu::_Source()
|
|||||||
m_btnMgr.click(m_sourceBtnPageP);
|
m_btnMgr.click(m_sourceBtnPageP);
|
||||||
_updateSourceBtns();
|
_updateSourceBtns();
|
||||||
}
|
}
|
||||||
else if(BTN_A_PRESSED || (BTN_PLUS_PRESSED && m_multisource))
|
else if(BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnClear))
|
||||||
|
{
|
||||||
|
_clearSources();
|
||||||
|
for(u8 j = 0; m_plugin.PluginExist(j); j++)
|
||||||
|
m_plugin.SetEnablePlugin(m_cfg, j, 1);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", false);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", false);
|
||||||
|
updateSource = true;
|
||||||
|
}
|
||||||
|
else if(BTN_A_PRESSED)
|
||||||
{
|
{
|
||||||
j = (curPage - 1) * 12;
|
j = (curPage - 1) * 12;
|
||||||
for(i = 0; i < 12; ++i)
|
for(i = 0; i < 12; ++i)
|
||||||
@ -370,18 +378,15 @@ bool CMenu::_Source()
|
|||||||
memset(btn_selected, 0, 16);
|
memset(btn_selected, 0, 16);
|
||||||
strncpy(btn_selected, fmt("BUTTON_%i", i + j), 15);
|
strncpy(btn_selected, fmt("BUTTON_%i", i + j), 15);
|
||||||
source = m_source.getString(btn_selected, "source", "");
|
source = m_source.getString(btn_selected, "source", "");
|
||||||
if(BTN_A_PRESSED)
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!m_multisource && i <12)
|
||||||
{
|
{
|
||||||
_clearSources();
|
_clearSources();
|
||||||
exitSource = true;
|
exitSource = true;
|
||||||
m_catStartPage = 1;
|
m_catStartPage = 1;
|
||||||
if(source == "wii")
|
if(source == "dml")
|
||||||
{
|
|
||||||
m_cfg.setBool(WII_DOMAIN, "source", true);
|
|
||||||
m_current_view = COVERFLOW_WII;
|
|
||||||
_setSrcOptions();
|
|
||||||
}
|
|
||||||
else if(source == "dml")
|
|
||||||
{
|
{
|
||||||
if(!show_gamecube)
|
if(!show_gamecube)
|
||||||
_showSourceNotice();
|
_showSourceNotice();
|
||||||
@ -399,10 +404,19 @@ bool CMenu::_Source()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(source == "emunand")
|
if(source == "emunand")
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", true);
|
{
|
||||||
else
|
m_current_view = COVERFLOW_CHANNEL;
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", false);
|
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "source", true);
|
m_cfg.setBool(CHANNEL_DOMAIN, "source", true);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", true);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_current_view = COVERFLOW_CHANNEL;
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "source", true);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", false);
|
||||||
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", true);
|
||||||
|
}
|
||||||
m_current_view = COVERFLOW_CHANNEL;
|
m_current_view = COVERFLOW_CHANNEL;
|
||||||
_setSrcOptions();
|
_setSrcOptions();
|
||||||
}
|
}
|
||||||
@ -436,28 +450,36 @@ bool CMenu::_Source()
|
|||||||
if(!show_plugin)
|
if(!show_plugin)
|
||||||
_showSourceNotice();
|
_showSourceNotice();
|
||||||
else
|
else
|
||||||
{
|
|
||||||
magicNums.clear();
|
|
||||||
magicNums = m_source.getStrings(btn_selected, "magic", ',');
|
|
||||||
if(magicNums.size() > 0)//may need to handle if zero magic #s
|
|
||||||
{
|
{
|
||||||
m_cfg.setBool(PLUGIN_DOMAIN, "source", true);
|
m_cfg.setBool(PLUGIN_DOMAIN, "source", true);
|
||||||
m_current_view = COVERFLOW_PLUGIN;
|
m_current_view = COVERFLOW_PLUGIN;
|
||||||
_setSrcOptions();
|
_setSrcOptions();
|
||||||
for(k = 0; k < m_numPlugins; ++k)
|
for(k = 0; k < m_numPlugins; ++k)
|
||||||
m_plugin.SetEnablePlugin(m_cfg, k, 1); /* force disable */
|
m_plugin.SetEnablePlugin(m_cfg, k, 1); /* force disable */
|
||||||
|
magicNums.clear();
|
||||||
|
magicNums = m_source.getStrings(btn_selected, "magic", ',');
|
||||||
|
if(magicNums.size() > 0)
|
||||||
|
{
|
||||||
for(vector<string>::iterator itr = magicNums.begin(); itr != magicNums.end(); itr++)
|
for(vector<string>::iterator itr = magicNums.begin(); itr != magicNums.end(); itr++)
|
||||||
{
|
{
|
||||||
s8 exist = m_plugin.GetPluginPosition(strtoul(itr->c_str(), NULL, 16));
|
s8 exist = m_plugin.GetPluginPosition(strtoul(itr->c_str(), NULL, 16));// make sure magic# is valid
|
||||||
if(exist >= 0)
|
if(exist >= 0)
|
||||||
m_plugin.SetEnablePlugin(m_cfg, exist, 2);
|
m_plugin.SetEnablePlugin(m_cfg, exist, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount);
|
||||||
|
if(enabledPluginsCount == 0) // zero magic #'s or invalid ones so default to first plugin in list
|
||||||
|
m_plugin.SetEnablePlugin(m_cfg, 0, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;//what if source string was invalid or empty?
|
else //if(source == "wii") or source is invalid or empty default to wii
|
||||||
|
{
|
||||||
|
m_cfg.setBool(WII_DOMAIN, "source", true);
|
||||||
|
m_current_view = COVERFLOW_WII;
|
||||||
|
_setSrcOptions();
|
||||||
}
|
}
|
||||||
else /* m_multisource */
|
}
|
||||||
|
if(m_multisource && i < 12) /* m_multisource */
|
||||||
{
|
{
|
||||||
updateSource = true;
|
updateSource = true;
|
||||||
if(source == "wii")
|
if(source == "wii")
|
||||||
@ -469,20 +491,18 @@ bool CMenu::_Source()
|
|||||||
if(show_gamecube)
|
if(show_gamecube)
|
||||||
m_cfg.setBool(GC_DOMAIN, "source", !m_cfg.getBool(GC_DOMAIN, "source"));
|
m_cfg.setBool(GC_DOMAIN, "source", !m_cfg.getBool(GC_DOMAIN, "source"));
|
||||||
}
|
}
|
||||||
else if(source == "emunand")
|
else if(source == "emunand" || source == "realnand")
|
||||||
{
|
{
|
||||||
if(show_channel)
|
if(show_channel)
|
||||||
{
|
{
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", true);
|
if(source == "realnand")
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "source", !m_cfg.getBool(CHANNEL_DOMAIN, "source"));
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand", !m_cfg.getBool(CHANNEL_DOMAIN, "real_nand"));
|
||||||
}
|
else
|
||||||
}
|
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", !m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand"));
|
||||||
else if(source == "realnand")
|
if(m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand") || m_cfg.getBool(CHANNEL_DOMAIN, "real_nand"))
|
||||||
{
|
m_cfg.setBool(CHANNEL_DOMAIN, "source", true);
|
||||||
if(show_channel)
|
else
|
||||||
{
|
m_cfg.setBool(CHANNEL_DOMAIN, "source", false);
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "emu_nand", false);
|
|
||||||
m_cfg.setBool(CHANNEL_DOMAIN, "source", !m_cfg.getBool(CHANNEL_DOMAIN, "source"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(source == "homebrew")
|
else if(source == "homebrew")
|
||||||
@ -523,20 +543,17 @@ bool CMenu::_Source()
|
|||||||
m_cfg.setBool(PLUGIN_DOMAIN, "source", enabledPluginsCount > 0 ? true : false);
|
m_cfg.setBool(PLUGIN_DOMAIN, "source", enabledPluginsCount > 0 ? true : false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(exitSource)
|
if(exitSource)
|
||||||
{
|
{
|
||||||
m_combined_view = false;
|
m_combined_view = false;
|
||||||
noChanges = false;
|
newSource = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(updateSource)
|
if(updateSource)
|
||||||
{
|
{
|
||||||
noChanges = false;
|
newSource = true;
|
||||||
_updateSourceBtns();
|
_updateSourceBtns();
|
||||||
}
|
}
|
||||||
if(m_showtimer > 0)
|
if(m_showtimer > 0)
|
||||||
@ -546,7 +563,7 @@ bool CMenu::_Source()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_hideSource(true);
|
_hideSource(true);
|
||||||
return noChanges;
|
return newSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
//letters in lower case only
|
//letters in lower case only
|
||||||
@ -618,7 +635,10 @@ void CMenu::_setSrcOptions(void)
|
|||||||
memset(&m_autoboot_hdr, 0, sizeof(dir_discHdr));
|
memset(&m_autoboot_hdr, 0, sizeof(dir_discHdr));
|
||||||
if(source == "emunand" || source == "realnand")
|
if(source == "emunand" || source == "realnand")
|
||||||
{
|
{
|
||||||
|
if(source == "realnand")
|
||||||
m_autoboot_hdr.type = TYPE_CHANNEL;
|
m_autoboot_hdr.type = TYPE_CHANNEL;
|
||||||
|
else
|
||||||
|
m_autoboot_hdr.type = TYPE_EMUCHANNEL;
|
||||||
memcpy(m_autoboot_hdr.id, autoboot, 4);
|
memcpy(m_autoboot_hdr.id, autoboot, 4);
|
||||||
}
|
}
|
||||||
else if(source == "wii")
|
else if(source == "wii")
|
||||||
@ -677,6 +697,7 @@ void CMenu::_initSourceMenu()
|
|||||||
m_sourceBtnPageM = _addPicButton("SOURCE/PAGE_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 20, 400, 48, 48);
|
m_sourceBtnPageM = _addPicButton("SOURCE/PAGE_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 20, 400, 48, 48);
|
||||||
m_sourceBtnPageP = _addPicButton("SOURCE/PAGE_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 172, 400, 48, 48);
|
m_sourceBtnPageP = _addPicButton("SOURCE/PAGE_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 172, 400, 48, 48);
|
||||||
m_sourceBtnBack = _addButton("SOURCE/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 48, theme.btnFontColor);
|
m_sourceBtnBack = _addButton("SOURCE/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 48, theme.btnFontColor);
|
||||||
|
m_sourceBtnClear = _addButton("SOURCE/ALL_BTN", theme.btnFont, L"", 270, 400, 100, 48, theme.btnFontColor);
|
||||||
|
|
||||||
int row;
|
int row;
|
||||||
int col;
|
int col;
|
||||||
@ -710,6 +731,7 @@ void CMenu::_initSourceMenu()
|
|||||||
_setHideAnim(m_sourceBtnPageM, "SOURCE/PAGE_MINUS", 0, 0, 1.f, -1.f);
|
_setHideAnim(m_sourceBtnPageM, "SOURCE/PAGE_MINUS", 0, 0, 1.f, -1.f);
|
||||||
_setHideAnim(m_sourceBtnPageP, "SOURCE/PAGE_PLUS", 0, 0, 1.f, -1.f);
|
_setHideAnim(m_sourceBtnPageP, "SOURCE/PAGE_PLUS", 0, 0, 1.f, -1.f);
|
||||||
_setHideAnim(m_sourceBtnBack, "SOURCE/BACK_BTN", 0, 0, 1.f, -1.f);
|
_setHideAnim(m_sourceBtnBack, "SOURCE/BACK_BTN", 0, 0, 1.f, -1.f);
|
||||||
|
_setHideAnim(m_sourceBtnClear, "SOURCE/ALL_BTN", 0, 0, 1.f, -1.f);
|
||||||
|
|
||||||
_textSource();
|
_textSource();
|
||||||
_hideSource(true);
|
_hideSource(true);
|
||||||
@ -720,4 +742,5 @@ void CMenu::_textSource(void)
|
|||||||
m_btnMgr.setText(m_sourceLblTitle, _t("stup1", L"Select Source"));
|
m_btnMgr.setText(m_sourceLblTitle, _t("stup1", L"Select Source"));
|
||||||
m_btnMgr.setText(m_sourceLblNotice, _t("stup2", L"** DISABLED **"));
|
m_btnMgr.setText(m_sourceLblNotice, _t("stup2", L"** DISABLED **"));
|
||||||
m_btnMgr.setText(m_sourceBtnBack, _t("cfg10", L"Back"));
|
m_btnMgr.setText(m_sourceBtnBack, _t("cfg10", L"Back"));
|
||||||
|
m_btnMgr.setText(m_sourceBtnClear, _t("cat2", L"Clear"));
|
||||||
}
|
}
|
||||||
|
@ -77,10 +77,11 @@ void CMenu::_addDiscProgress(int status, int total, void *user_data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool _searchGamesByID(const char *gameId)
|
bool CMenu::_searchGamesByID(const char *gameId)
|
||||||
{
|
{
|
||||||
for(vector<dir_discHdr>::const_iterator itr = m_gameList.begin(); itr != m_gameList.end(); ++itr)
|
for(vector<dir_discHdr>::iterator itr = m_gameList.begin(); itr != m_gameList.end(); ++itr)
|
||||||
{
|
{
|
||||||
|
if(itr->type == TYPE_WII_GAME || itr->type == TYPE_GC_GAME)
|
||||||
if(strncmp(itr->id, gameId, 6) == 0)
|
if(strncmp(itr->id, gameId, 6) == 0)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -416,7 +417,7 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
|
|||||||
WBFS_Close();
|
WBFS_Close();
|
||||||
upd_wii = true;
|
upd_wii = true;
|
||||||
}
|
}
|
||||||
else if(CF_Hdr->type == TYPE_CHANNEL && m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false))
|
else if(CF_Hdr->type == TYPE_EMUCHANNEL)
|
||||||
{
|
{
|
||||||
if(CF_Hdr->settings[0] != 0x00010001)
|
if(CF_Hdr->settings[0] != 0x00010001)
|
||||||
{
|
{
|
||||||
@ -450,30 +451,6 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
|
|||||||
case WO_FORMAT:
|
case WO_FORMAT:
|
||||||
break;
|
break;
|
||||||
case WO_COPY_GAME:
|
case WO_COPY_GAME:
|
||||||
string GC_Path(CF_Hdr->path);
|
|
||||||
if(strcasestr(GC_Path.c_str(), "boot.bin") != NULL)
|
|
||||||
GC_Path.erase(GC_Path.end() - 13, GC_Path.end());
|
|
||||||
else
|
|
||||||
GC_Path.erase(GC_Path.end() - 9, GC_Path.end());
|
|
||||||
if(fsop_GetFreeSpaceKb("sd:/") < fsop_GetFolderKb(GC_Path.c_str()))
|
|
||||||
{
|
|
||||||
m_btnMgr.hide(m_wbfsBtnGo);
|
|
||||||
_setThrdMsg(wfmt(_fmt("wbfsop24", L"Not enough space: %d blocks needed, %d available"), fsop_GetFolderKb(GC_Path.c_str()), fsop_GetFreeSpaceKb("sd:/")), 0.f);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m_btnMgr.show(m_wbfsPBar, true);
|
|
||||||
m_btnMgr.setProgress(m_wbfsPBar, 0.f, true);
|
|
||||||
m_btnMgr.hide(m_wbfsBtnGo, true);
|
|
||||||
m_btnMgr.show(m_wbfsLblMessage, true);
|
|
||||||
m_btnMgr.setText(m_wbfsLblMessage, L"");
|
|
||||||
strncpy(cfPos, CF_Hdr->id, 6);
|
|
||||||
m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wbfsop10", L"Copying [%s] %s..."), CF_Hdr->id, CoverFlow.getTitle().toUTF8().c_str()));
|
|
||||||
done = true;
|
|
||||||
upd_gc = true;
|
|
||||||
m_thrdWorking = true;
|
|
||||||
m_thrdProgress = 0.f;
|
|
||||||
m_thrdMessageAdded = false;
|
|
||||||
LWP_CreateThread(&thread, (void *(*)(void *))_GCcopyGame, (void *)this, 0, 8 * 1024, 64);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(out)
|
if(out)
|
||||||
@ -506,10 +483,15 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_hideWBFS();
|
_hideWBFS();
|
||||||
if(done && (op == WO_REMOVE_GAME || op == WO_ADD_GAME))
|
if(done)
|
||||||
{
|
{
|
||||||
//m_gameList.SetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str());
|
if(op == WO_ADD_GAME)
|
||||||
_showWaitMessage();
|
{
|
||||||
|
if(CF_Hdr->type == TYPE_WII_GAME)
|
||||||
|
m_cfg.setString(WII_DOMAIN, "current_item", cfPos);
|
||||||
|
else
|
||||||
|
m_cfg.setString(GC_DOMAIN, "current_item", cfPos);
|
||||||
|
}
|
||||||
if(upd_gc)
|
if(upd_gc)
|
||||||
UpdateCache(COVERFLOW_GAMECUBE);
|
UpdateCache(COVERFLOW_GAMECUBE);
|
||||||
if(upd_wii)
|
if(upd_wii)
|
||||||
@ -518,28 +500,13 @@ bool CMenu::_wbfsOp(CMenu::WBFS_OP op)
|
|||||||
UpdateCache(COVERFLOW_PLUGIN);
|
UpdateCache(COVERFLOW_PLUGIN);
|
||||||
if(upd_chan)
|
if(upd_chan)
|
||||||
UpdateCache(COVERFLOW_CHANNEL);
|
UpdateCache(COVERFLOW_CHANNEL);
|
||||||
//_loadList();
|
|
||||||
_hideWaitMessage();
|
|
||||||
//_initCF();
|
|
||||||
//CoverFlow.findId(cfPos, true);
|
|
||||||
m_load_view = true;
|
m_load_view = true;
|
||||||
|
/* restart inputs to resolve an issue */
|
||||||
Close_Inputs();
|
Close_Inputs();
|
||||||
Open_Inputs();
|
Open_Inputs();
|
||||||
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--)
|
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--)
|
||||||
WPAD_SetVRes(chan, m_vid.width() + m_cursor[chan].width(), m_vid.height() + m_cursor[chan].height());
|
WPAD_SetVRes(chan, m_vid.width() + m_cursor[chan].width(), m_vid.height() + m_cursor[chan].height());
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if(done && op == WO_COPY_GAME)
|
|
||||||
{
|
|
||||||
UpdateCache(COVERFLOW_GAMECUBE);
|
|
||||||
currentPartition = SD;
|
|
||||||
UpdateCache(COVERFLOW_GAMECUBE);
|
|
||||||
}
|
|
||||||
//_loadList();
|
|
||||||
//_initCF();
|
|
||||||
m_load_view = true;
|
|
||||||
}
|
|
||||||
return done;
|
return done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ enum
|
|||||||
TYPE_PLUGIN,
|
TYPE_PLUGIN,
|
||||||
TYPE_HOMEBREW,
|
TYPE_HOMEBREW,
|
||||||
TYPE_SOURCE,
|
TYPE_SOURCE,
|
||||||
|
TYPE_EMUCHANNEL,
|
||||||
TYPE_END
|
TYPE_END
|
||||||
};
|
};
|
||||||
#define NoGameID(x) (x == TYPE_PLUGIN || x == TYPE_HOMEBREW || x == TYPE_SOURCE)
|
#define NoGameID(x) (x == TYPE_PLUGIN || x == TYPE_HOMEBREW || x == TYPE_SOURCE)
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
<app version="1">
|
<app version="1">
|
||||||
<name> WiiFlow Lite</name>
|
<name> WiiFlow Lite</name>
|
||||||
<coder>Fledge68</coder>
|
<coder>Fledge68</coder>
|
||||||
<version>4.2.2 r1094</version>
|
<version>4.2.2 r1123</version>
|
||||||
<release_date>20161104000000</release_date>
|
<release_date>20162006000000</release_date>
|
||||||
<short_description>USB Loader / Nand Emulator</short_description>
|
<short_description>USB Loader / Nand Emulator</short_description>
|
||||||
<long_description>
|
<long_description>
|
||||||
WiiFlow Lite is a Wii Game, Channel, Wiiware, Virtual Console, and Savegame Emulator intended for use with legal backups.
|
WiiFlow Lite is a Wii Game, Channel, Wiiware, Virtual Console, and Savegame Emulator intended for use with legal backups.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user