mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2024-12-25 03:11:58 +01:00
-now gamecube view defaults to on if either devolution or nintendont are installed.
-removed setting emu paths and changing emu presets. -added select nand setting on page 2 of nand emulation settings. nands must be in a subfolder of nands folder on root of device. example - dev:/nands/nand1, dev:/nands/nand2 etc.. -nand select also works for saves nand in wii view. -nand emulation settings is only shown if in wii view or nand view. -if no nand is found wiiflow will create a nand named default in the nands folder. -rewrote coverloader code a little to make it easier to follow. but still couldn't fix it. honestly it appears there's nothing wrong. wiiflow just acts weird.
This commit is contained in:
parent
140999c2e3
commit
ac4012e708
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 |
@ -1012,6 +1012,7 @@ s32 Nand::CreateConfig()
|
||||
|
||||
s32 Nand::PreNandCfg(bool miis, bool realconfig)
|
||||
{
|
||||
/* create paths only if they don't exist */
|
||||
CreatePath(FullNANDPath);
|
||||
CreatePath("%s/shared2", FullNANDPath);
|
||||
CreatePath("%s/shared2/sys", FullNANDPath);
|
||||
@ -1245,16 +1246,9 @@ u8 *Nand::GetTMD(u64 title, u32 *size)
|
||||
void Nand::SetPaths(const char *emuPath, const char *currentPart)
|
||||
{
|
||||
memset(&NandPath, 0, sizeof(NandPath));
|
||||
if(emuPath[0] == '\0' || emuPath[0] == ' ')
|
||||
return;
|
||||
else if(emuPath[0] != '/' && emuPath[1] != '\0') //missing / before path
|
||||
strcat(NandPath, "/");
|
||||
for(u32 i = 0; emuPath[i] != '\0'; i++)
|
||||
{
|
||||
if(emuPath[i] == '/' && emuPath[i+1] == '\0')
|
||||
break;
|
||||
strncat(NandPath, &emuPath[i], 1);
|
||||
}
|
||||
|
||||
/* Our WiiFlow handle Path */
|
||||
memset(&FullNANDPath, 0, sizeof(FullNANDPath));
|
||||
strcat(FullNANDPath, fmt("%s:%s", currentPart, NandPath));
|
||||
|
@ -4,8 +4,7 @@
|
||||
#define APPDATA_DIR "wiiflow"
|
||||
#define APPDATA_DIR2 "apps/wiiflow_lite"
|
||||
|
||||
//#define EMU_NANDS_DIR "%s:/nands"
|
||||
#define STDEMU_DIR "/wiiflow/nandemu"
|
||||
#define EMU_NANDS_DIR "nands"
|
||||
#define GAMES_DIR "%s:/wbfs"
|
||||
#define HOMEBREW_DIR "%s:/apps"
|
||||
#define DF_GC_GAMES_DIR "%s:/games"
|
||||
|
@ -2643,17 +2643,17 @@ bool CCoverFlow::_loadCoverTexPNG(u32 i, bool box, bool hq, bool blankBoxCover)
|
||||
u8 *zBuffer = m_compressCache ? (u8*)MEM2_alloc(zBufferSize) : tex.data;
|
||||
if(zBuffer != NULL && (!m_compressCache || compress(zBuffer, &zBufferSize, tex.data, bufSize) == Z_OK))
|
||||
{
|
||||
const char *gamePath = NULL;
|
||||
const char *gameNameOrID = NULL;
|
||||
const char *coverDir = NULL;
|
||||
if(blankBoxCover)
|
||||
{
|
||||
const char *menuPath = mainMenu.getBlankCoverPath(m_items[i].hdr);
|
||||
if(menuPath != NULL && strrchr(menuPath, '/') != NULL)
|
||||
gamePath = strrchr(menuPath, '/') + 1;
|
||||
gameNameOrID = strrchr(menuPath, '/') + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gamePath = getPathId(m_items[i].hdr);
|
||||
gameNameOrID = getPathId(m_items[i].hdr);
|
||||
if(NoGameID(m_items[i].hdr->type))
|
||||
{
|
||||
if(m_pluginCacheFolders && m_items[i].hdr->type == TYPE_PLUGIN)
|
||||
@ -2664,7 +2664,7 @@ bool CCoverFlow::_loadCoverTexPNG(u32 i, bool box, bool hq, bool blankBoxCover)
|
||||
}
|
||||
|
||||
FILE *file = NULL;
|
||||
if(gamePath != NULL)
|
||||
if(gameNameOrID != NULL)
|
||||
{
|
||||
char *full_path = (char*)MEM2_alloc(MAX_FAT_PATH+1);
|
||||
if(full_path == NULL)
|
||||
@ -2675,7 +2675,7 @@ bool CCoverFlow::_loadCoverTexPNG(u32 i, bool box, bool hq, bool blankBoxCover)
|
||||
}
|
||||
memset(full_path, 0, MAX_FAT_PATH+1);
|
||||
if(coverDir == NULL || strlen(coverDir) == 0)
|
||||
strncpy(full_path, fmt("%s/%s.wfc", m_cachePath.c_str(), gamePath), MAX_FAT_PATH);
|
||||
strncpy(full_path, fmt("%s/%s.wfc", m_cachePath.c_str(), gameNameOrID), MAX_FAT_PATH);
|
||||
else
|
||||
{
|
||||
if(strchr(coverDir, '/') != NULL)
|
||||
@ -2694,7 +2694,7 @@ bool CCoverFlow::_loadCoverTexPNG(u32 i, bool box, bool hq, bool blankBoxCover)
|
||||
MEM2_free(tmp);
|
||||
}
|
||||
fsop_MakeFolder(fmt("%s/%s", m_cachePath.c_str(), coverDir));
|
||||
strncpy(full_path, fmt("%s/%s/%s.wfc", m_cachePath.c_str(), coverDir, gamePath), MAX_FAT_PATH);
|
||||
strncpy(full_path, fmt("%s/%s/%s.wfc", m_cachePath.c_str(), coverDir, gameNameOrID), MAX_FAT_PATH);
|
||||
}
|
||||
DCFlushRange(full_path, MAX_FAT_PATH+1);
|
||||
file = fopen(full_path, "wb");
|
||||
@ -2786,17 +2786,17 @@ CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq, bool blank
|
||||
// Try to find the texture in the cache
|
||||
if(!m_cachePath.empty())
|
||||
{
|
||||
const char *gamePath = NULL;
|
||||
const char *gameNameOrID = NULL;
|
||||
const char *coverDir = NULL;
|
||||
if(blankBoxCover)
|
||||
{
|
||||
const char *menuPath = mainMenu.getBlankCoverPath(m_items[i].hdr);
|
||||
if(menuPath != NULL && strrchr(menuPath, '/') != NULL)
|
||||
gamePath = strrchr(menuPath, '/') + 1;
|
||||
const char *blankCoverPath = mainMenu.getBlankCoverPath(m_items[i].hdr);
|
||||
if(blankCoverPath != NULL && strrchr(blankCoverPath, '/') != NULL)
|
||||
gameNameOrID = strrchr(blankCoverPath, '/') + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gamePath = getPathId(m_items[i].hdr);
|
||||
gameNameOrID = getPathId(m_items[i].hdr);
|
||||
if(NoGameID(m_items[i].hdr->type))
|
||||
{
|
||||
if(m_pluginCacheFolders && m_items[i].hdr->type == TYPE_PLUGIN)
|
||||
@ -2807,16 +2807,16 @@ CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq, bool blank
|
||||
}
|
||||
|
||||
FILE *fp = NULL;
|
||||
if(gamePath != NULL)
|
||||
if(gameNameOrID != NULL)
|
||||
{
|
||||
char *full_path = (char*)MEM2_alloc(MAX_FAT_PATH+1);
|
||||
if(full_path == NULL)
|
||||
return CL_NOMEM;
|
||||
memset(full_path, 0, MAX_FAT_PATH+1);
|
||||
if(coverDir == NULL || strlen(coverDir) == 0)
|
||||
strncpy(full_path, fmt("%s/%s.wfc", m_cachePath.c_str(), gamePath), MAX_FAT_PATH);
|
||||
strncpy(full_path, fmt("%s/%s.wfc", m_cachePath.c_str(), gameNameOrID), MAX_FAT_PATH);
|
||||
else
|
||||
strncpy(full_path, fmt("%s/%s/%s.wfc", m_cachePath.c_str(), coverDir, gamePath), MAX_FAT_PATH);
|
||||
strncpy(full_path, fmt("%s/%s/%s.wfc", m_cachePath.c_str(), coverDir, gameNameOrID), MAX_FAT_PATH);
|
||||
DCFlushRange(full_path, MAX_FAT_PATH+1);
|
||||
fp = fopen(full_path, "rb");
|
||||
MEM2_free(full_path);
|
||||
@ -2832,7 +2832,7 @@ CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq, bool blank
|
||||
{
|
||||
fread(&header, 1, sizeof(header), fp);
|
||||
//make sure wfc cache file matches what we want
|
||||
if(header.newFmt == 1 && (((header.full != 0) == box) && ((header.cmpr != 0) == m_compressTextures)))
|
||||
if(header.newFmt == 1 && (header.full != 0) == box && (header.cmpr != 0) == m_compressTextures)
|
||||
{
|
||||
TexData tex;
|
||||
tex.format = header.cmpr != 0 ? GX_TF_CMPR : GX_TF_RGB565;
|
||||
@ -2846,26 +2846,38 @@ CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq, bool blank
|
||||
u32 texLen = fixGX_GetTexBufferSize(tex.width, tex.height, tex.format, tex.maxLOD > 0 ? GX_TRUE : GX_FALSE, tex.maxLOD);
|
||||
|
||||
tex.data = (u8*)MEM2_alloc(texLen);
|
||||
u8 *ptrTex = (header.zipped != 0) ? (u8*)MEM2_alloc(bufSize) : tex.data;
|
||||
if(ptrTex == NULL || tex.data == NULL)
|
||||
|
||||
if(header.zipped != 0)//if it's compressed ie. zipped
|
||||
{
|
||||
u8 *ptrTex = (u8*)MEM2_alloc(bufSize);
|
||||
if(ptrTex == NULL)
|
||||
allocFailed = true;
|
||||
else
|
||||
{
|
||||
u8 *zBuffer = (header.zipped != 0) ? (u8*)MEM2_alloc(fileSize - sizeof(header)) : tex.data;
|
||||
if(zBuffer != NULL && ((header.zipped != 0) || fileSize - sizeof(header) == bufSize))
|
||||
u8 *zBuffer = (u8*)MEM2_alloc(fileSize - sizeof(header));
|
||||
if(zBuffer != NULL)
|
||||
{
|
||||
if(!header.zipped)
|
||||
fread(zBuffer, 1, fileSize - sizeof(header), fp);
|
||||
uLongf size = bufSize;
|
||||
if(uncompress(ptrTex, &size, zBuffer, fileSize - sizeof(header)) == Z_OK && size == bufSize)
|
||||
memcpy(tex.data, ptrTex + bufSize - texLen, texLen);
|
||||
free(zBuffer);
|
||||
free(ptrTex);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(tex.data == NULL)
|
||||
allocFailed = true;
|
||||
else
|
||||
{
|
||||
fseek(fp, fileSize - sizeof(header) - texLen, SEEK_CUR);
|
||||
fread(tex.data, 1, texLen, fp);
|
||||
}
|
||||
else
|
||||
fread(zBuffer, 1, fileSize - sizeof(header), fp);
|
||||
uLongf size = bufSize;
|
||||
if(header.zipped == 0 || (uncompress(ptrTex, &size, zBuffer, fileSize - sizeof(header)) == Z_OK && size == bufSize))
|
||||
}
|
||||
if(!allocFailed)
|
||||
{
|
||||
if(header.zipped != 0)
|
||||
memcpy(tex.data, ptrTex + bufSize - texLen, texLen);
|
||||
LockMutex lock(m_mutex);
|
||||
TexHandle.Cleanup(m_items[i].texture);
|
||||
m_items[i].texture = tex;
|
||||
@ -2874,15 +2886,6 @@ CCoverFlow::CLRet CCoverFlow::_loadCoverTex(u32 i, bool box, bool hq, bool blank
|
||||
m_items[i].boxTexture = header.full != 0;
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
if(header.zipped != 0)
|
||||
{
|
||||
if(zBuffer != NULL)
|
||||
free(zBuffer);
|
||||
if(ptrTex != NULL)
|
||||
free(ptrTex);
|
||||
}
|
||||
}
|
||||
if(!success && tex.data != NULL)
|
||||
{
|
||||
free(tex.data);
|
||||
|
@ -219,15 +219,21 @@ void CMenu::init()
|
||||
/* GameCube stuff */
|
||||
m_devo_installed = DEVO_Installed(m_dataDir.c_str());
|
||||
m_nintendont_installed = Nintendont_Installed();
|
||||
m_show_gc = !m_cfg.getBool(GC_DOMAIN, "disable", true);
|
||||
m_show_gc = !m_cfg.getBool(GC_DOMAIN, "disable", ((m_devo_installed || m_nintendont_installed) == false));
|
||||
memset(gc_games_dir, 0, 64);
|
||||
strncpy(gc_games_dir, m_cfg.getString(GC_DOMAIN, "gc_games_dir", DF_GC_GAMES_DIR).c_str(), 64);
|
||||
if(strncmp(gc_games_dir, "%s:/", 4) != 0)
|
||||
strcpy(gc_games_dir, DF_GC_GAMES_DIR);
|
||||
gprintf("GameCube Games Directory: %s\n", gc_games_dir);
|
||||
/* Create CHANNEL keys and set default values if key didn't exist */
|
||||
m_cfg.getString(CHANNEL_DOMAIN, "path", "");
|
||||
m_cfg.getInt(CHANNEL_DOMAIN, "partition", 1);
|
||||
int i;
|
||||
i = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0);
|
||||
if(i < 0 || i > 1)
|
||||
m_cfg.setInt(CHANNEL_DOMAIN, "partition", 0);
|
||||
i = m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0));
|
||||
if(i < 0 || i > 1)
|
||||
m_cfg.setInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0));
|
||||
m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default");
|
||||
m_cfg.getBool(CHANNEL_DOMAIN, "emu_nand", false);//emu_nand
|
||||
/* Load cIOS Map */
|
||||
_installed_cios.clear();
|
||||
@ -2104,25 +2110,24 @@ bool CMenu::_loadChannelList(void)
|
||||
{
|
||||
m_gameList.clear();
|
||||
string emuPath;//set via _FindEmuPart and used throughout wiiflow code
|
||||
string cacheDir;//real nand empty
|
||||
int emuPartition = -1; //real nand value
|
||||
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);
|
||||
emuPartition = _FindEmuPart(emuPath, false);//check if exist & has sysconf, settings.txt, & RFL_DB.dat
|
||||
if(emuPartition < 0)
|
||||
emuPartition = _FindEmuPart(emuPath, true);
|
||||
else
|
||||
{ /* only create folder struct if the partition really has a emu nand on it already */
|
||||
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));
|
||||
}
|
||||
if(emuPartition < 0)
|
||||
return false;
|
||||
|
||||
currentPartition = emuPartition;
|
||||
cacheDir = fmt("%s/%s_channels.db", m_listCacheDir.c_str(), DeviceName[currentPartition]);
|
||||
}
|
||||
bool updateCache = m_cfg.getBool(CHANNEL_DOMAIN, "update_cache");//real nand doesn't update
|
||||
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(),
|
||||
|
@ -1032,7 +1032,6 @@ private:
|
||||
CONFIG_PAGE_INC = 1,
|
||||
CONFIG_PAGE_BACK,
|
||||
};
|
||||
void _cfNeedsUpdate(void);
|
||||
void _game(bool launch = false);
|
||||
void _downloadUrl(const char *url, u8 **dl_file, u32 *dl_size);
|
||||
void _download(string gameId = string());
|
||||
|
@ -64,23 +64,19 @@ void CMenu::_showConfig(void)
|
||||
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 = disable ? CHANNEL_DOMAIN : DeviceName[m_emuSaveNand ? m_cfg.getInt(WII_DOMAIN, "savepartition", 0) : 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));
|
||||
|
||||
if(m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_WII)
|
||||
{
|
||||
m_btnMgr.show(m_configLblCfg4);
|
||||
m_btnMgr.show(m_configBtnCfg4);
|
||||
}
|
||||
}
|
||||
m_btnMgr.show(m_configLblParental);
|
||||
m_btnMgr.show(m_locked ? m_configBtnUnlock : m_configBtnSetCode);
|
||||
}
|
||||
|
||||
void CMenu::_cfNeedsUpdate(void)
|
||||
{
|
||||
if (!m_cfNeedsUpdate)
|
||||
CoverFlow.clear();
|
||||
m_cfNeedsUpdate = true;
|
||||
}
|
||||
|
||||
void CMenu::_config(int page)
|
||||
{
|
||||
m_cfNeedsUpdate = false;
|
||||
@ -176,7 +172,7 @@ int CMenu::_config1(void)
|
||||
{
|
||||
if (m_btnMgr.selected(m_configBtnDownload))
|
||||
{
|
||||
_cfNeedsUpdate();
|
||||
m_cfNeedsUpdate = true;
|
||||
CoverFlow.stopCoverLoader(true);
|
||||
_hideConfig();
|
||||
_download();
|
||||
@ -189,7 +185,7 @@ int CMenu::_config1(void)
|
||||
_hideConfig();
|
||||
if (_code(code) && memcmp(code, m_cfg.getString("GENERAL", "parent_code", "").c_str(), 4) == 0)
|
||||
{
|
||||
_cfNeedsUpdate();
|
||||
m_cfNeedsUpdate = true;
|
||||
m_locked = false;
|
||||
}
|
||||
else
|
||||
@ -202,7 +198,7 @@ int CMenu::_config1(void)
|
||||
_hideConfig();
|
||||
if (_code(code, true))
|
||||
{
|
||||
_cfNeedsUpdate();
|
||||
m_cfNeedsUpdate = true;
|
||||
m_cfg.setString("GENERAL", "parent_code", string(code, 4).c_str());
|
||||
m_locked = true;
|
||||
}
|
||||
@ -216,7 +212,7 @@ int CMenu::_config1(void)
|
||||
}
|
||||
else if (m_btnMgr.selected(m_configBtnCfg4) && m_current_view != COVERFLOW_MAX)
|
||||
{
|
||||
_cfNeedsUpdate();
|
||||
m_cfNeedsUpdate = true;
|
||||
CoverFlow.stopCoverLoader(true);
|
||||
_hideConfig();
|
||||
if(m_current_view != COVERFLOW_PLUGIN)
|
||||
|
@ -120,7 +120,6 @@ int CMenu::_configAdv(void)
|
||||
}
|
||||
else if(m_btnMgr.selected(m_configAdvBtnCurThemeP) || m_btnMgr.selected(m_configAdvBtnCurThemeM))
|
||||
{
|
||||
_cfNeedsUpdate();
|
||||
s8 direction = m_btnMgr.selected(m_configAdvBtnCurThemeP) ? 1 : -1;
|
||||
curTheme = loopNum(curTheme + direction, (int)themes.size());
|
||||
m_cfg.setString("GENERAL", "theme", themes[curTheme]);
|
||||
@ -135,7 +134,7 @@ int CMenu::_configAdv(void)
|
||||
}
|
||||
else if(m_btnMgr.selected(m_configAdvBtnCFTheme))
|
||||
{
|
||||
_cfNeedsUpdate();
|
||||
m_cfNeedsUpdate = true;
|
||||
_hideConfigAdv();
|
||||
_cfTheme();
|
||||
_showConfigAdv();
|
||||
|
@ -124,6 +124,7 @@ const CMenu::SOption CMenu::_GClanguages[8] = {
|
||||
};
|
||||
|
||||
const CMenu::SOption CMenu::_NandEmu[2] = {
|
||||
//{ "SaveOff", L"Off" },
|
||||
{ "NANDpart", L"Partial" },
|
||||
{ "NANDfull", L"Full" },
|
||||
};
|
||||
@ -1136,7 +1137,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr)
|
||||
m_gcfg1.setInt("PLAYCOUNT", id, m_gcfg1.getInt("PLAYCOUNT", id, 0) + 1);
|
||||
m_gcfg1.setUInt("LASTPLAYED", id, time(NULL));
|
||||
|
||||
string emuPath = m_cfg.getString(CHANNEL_DOMAIN, "path");
|
||||
string emuPath = fmt("/%s/%s", EMU_NANDS_DIR, m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default").c_str());
|
||||
int emulate_mode = min(max(0, m_cfg.getInt(CHANNEL_DOMAIN, "emulation", 1)), (int)ARRAY_SIZE(CMenu::_NandEmu) - 1);
|
||||
|
||||
int userIOS = m_gcfg2.getInt(id, "ios", 0);
|
||||
@ -1305,55 +1306,55 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
|
||||
int emuPartition = 0;
|
||||
|
||||
u8 emulate_mode = min((u32)m_gcfg2.getInt(id, "emulate_save", 0), ARRAY_SIZE(CMenu::_SaveEmu) - 1u);
|
||||
if(emulate_mode == 0)
|
||||
if(emulate_mode == 0)// default then use global
|
||||
{
|
||||
emulate_mode = min(max(0, m_cfg.getInt(WII_DOMAIN, "save_emulation", 0)), (int)ARRAY_SIZE(CMenu::_GlobalSaveEmu) - 1);
|
||||
if(emulate_mode != 0)
|
||||
emulate_mode++;
|
||||
if(emulate_mode != 0)//not off
|
||||
emulate_mode++;//then increase 1,2,3 to 2,3,4
|
||||
}
|
||||
else if(emulate_mode == 1)
|
||||
emulate_mode = 0;
|
||||
else if(emulate_mode == 1)//equals off
|
||||
emulate_mode = 0;// then off
|
||||
m_current_view = COVERFLOW_WII; // used for _FindEmuPart()
|
||||
if(emulate_mode && !dvd && !neek2o())
|
||||
{
|
||||
emuPartition = _FindEmuPart(emuPath, false);
|
||||
if(emuPartition < 0)
|
||||
{
|
||||
if(emulate_mode == 4)
|
||||
if(emulate_mode == 4)//full
|
||||
{
|
||||
_hideWaitMessage();
|
||||
while(true)
|
||||
{
|
||||
_AutoCreateNand();
|
||||
if(_TestEmuNand(m_cfg.getInt(WII_DOMAIN, "savepartition", 0), emuPath.c_str(), true))
|
||||
if(_TestEmuNand(m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0)), emuPath.c_str(), true))
|
||||
{
|
||||
emuPartition = m_cfg.getInt(WII_DOMAIN, "savepartition", -1);
|
||||
emuPath = m_cfg.getString(WII_DOMAIN, "savepath", m_cfg.getString(CHANNEL_DOMAIN, "path", ""));
|
||||
emuPartition = m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0));
|
||||
emuPath = fmt("/%s/%s", EMU_NANDS_DIR, m_cfg.getString(WII_DOMAIN, "current_save_emunand", m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default")).c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
_showWaitMessage();
|
||||
}
|
||||
else
|
||||
else//gamesave or regionswitch
|
||||
{
|
||||
emuPartition = _FindEmuPart(emuPath, true);
|
||||
NandHandle.CreatePath(fmt("%s:/%s", DeviceName[emuPartition], APPDATA_DIR));
|
||||
NandHandle.CreatePath(fmt("%s:/%s/nandemu", DeviceName[emuPartition], APPDATA_DIR));
|
||||
NandHandle.CreatePath(fmt("%s:/%s", DeviceName[emuPartition], EMU_NANDS_DIR));
|
||||
NandHandle.CreatePath(fmt("%s:/%s/default", DeviceName[emuPartition], EMU_NANDS_DIR));
|
||||
}
|
||||
}
|
||||
/* Set them */
|
||||
NANDemuView = true;
|
||||
m_cfg.setInt(WII_DOMAIN, "savepartition", emuPartition);
|
||||
m_cfg.setString(WII_DOMAIN, "savepath", emuPath);
|
||||
if(emulate_mode == 2)
|
||||
m_cfg.setString(WII_DOMAIN, "current_save_emunand", "default");
|
||||
if(emulate_mode == 2)//gamesave
|
||||
{
|
||||
m_forceext = false;
|
||||
_hideWaitMessage();
|
||||
if(!_AutoExtractSave(id))
|
||||
NandHandle.CreateTitleTMD(hdr);
|
||||
if(!_AutoExtractSave(id))//extract gamesave
|
||||
NandHandle.CreateTitleTMD(hdr);//if no save then create one
|
||||
_showWaitMessage();
|
||||
}
|
||||
else if(emulate_mode > 2)
|
||||
else if(emulate_mode > 2)//region switch or full
|
||||
{
|
||||
NandHandle.CreateConfig();
|
||||
NandHandle.Do_Region_Change(id, false);
|
||||
|
@ -276,7 +276,7 @@ bool CMenu::_LangSettings(void)
|
||||
}
|
||||
_hideLangSettings();
|
||||
if(lang_changed)
|
||||
_cfNeedsUpdate();
|
||||
m_cfNeedsUpdate = true;
|
||||
|
||||
if(lang_list_mem != NULL)
|
||||
free(lang_list_mem);
|
||||
|
@ -132,7 +132,7 @@ start_main:
|
||||
_hideMain();
|
||||
if(!_AutoCreateNand())
|
||||
{
|
||||
while(NANDemuView)
|
||||
while(NANDemuView)//keep calling _setPartition till NANDemuView is false and CHANNEL_DOMAIN, "emu_nand", false
|
||||
_setPartition(1);
|
||||
}
|
||||
_loadList();
|
||||
@ -1089,7 +1089,6 @@ void CMenu::_setPartition(s8 direction)
|
||||
{
|
||||
if(m_current_view == COVERFLOW_CHANNEL && neek2o())
|
||||
return;
|
||||
_cfNeedsUpdate();
|
||||
int FS_Type = 0;
|
||||
if(direction != 0)
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include "menu.hpp"
|
||||
#include "defines.h"
|
||||
#include "lockMutex.hpp"
|
||||
@ -23,14 +23,10 @@ s16 m_nandemuBtnAll;
|
||||
s16 m_nandemuBtnMissing;
|
||||
s16 m_nandemuLblNandDump;
|
||||
s16 m_nandemuBtnNandDump;
|
||||
s16 m_nandemuLblNandFolder;
|
||||
s16 m_nandemuBtnNandFolder;
|
||||
s16 m_nandemuLblNandSavesFolder;
|
||||
s16 m_nandemuBtnNandSavesFolder;
|
||||
s16 m_nandemuLblPresetNand;
|
||||
s16 m_nandemuLblPresetVal;
|
||||
s16 m_nandemuBtnPresetM;
|
||||
s16 m_nandemuBtnPresetP;
|
||||
s16 m_nandemuLblNandSelect;
|
||||
s16 m_nandemuLblNandSelectVal;
|
||||
s16 m_nandemuBtnNandSelectM;
|
||||
s16 m_nandemuBtnNandSelectP;
|
||||
s16 m_nandfileLblMessage;
|
||||
s16 m_nandemuLblMessage;
|
||||
s16 m_nandfileLblDialog;
|
||||
@ -57,6 +53,33 @@ static inline int loopNum(int i, int s)
|
||||
return (i + s) % s;
|
||||
}
|
||||
|
||||
static void listEmuNands(const char * path, vector<string> &emuNands)
|
||||
{
|
||||
DIR *d;
|
||||
struct dirent *dir;
|
||||
emuNands.clear();
|
||||
bool def = true;
|
||||
|
||||
d = opendir(path);
|
||||
if(d != 0)
|
||||
{
|
||||
while((dir = readdir(d)) != 0)
|
||||
{
|
||||
if(dir->d_name[0] == '.')
|
||||
continue;
|
||||
if(dir->d_type == DT_DIR)
|
||||
{
|
||||
emuNands.push_back(dir->d_name);
|
||||
def = false;
|
||||
}
|
||||
}
|
||||
closedir(d);
|
||||
}
|
||||
if(def)
|
||||
emuNands.push_back("default");
|
||||
sort(emuNands.begin(), emuNands.end());
|
||||
}
|
||||
|
||||
static bool _saveExists(const char *path)
|
||||
{
|
||||
DIR *d = opendir(path);
|
||||
@ -84,14 +107,14 @@ bool CMenu::_TestEmuNand(int epart, const char *path, bool indept)
|
||||
if(indept)
|
||||
{
|
||||
// Check Wiimotes && Region
|
||||
snprintf(testpath, sizeof(testpath), "%s:%s/shared2/sys/SYSCONF", DeviceName[epart], path);
|
||||
snprintf(testpath, sizeof(testpath), "%s/shared2/sys/SYSCONF", basepath);
|
||||
if(!fsop_FileExist(testpath))
|
||||
return false;
|
||||
snprintf(testpath, sizeof(testpath), "%s:%s/title/00000001/00000002/data/setting.txt", DeviceName[epart], path);
|
||||
snprintf(testpath, sizeof(testpath), "%s/title/00000001/00000002/data/setting.txt", basepath);
|
||||
if(!fsop_FileExist(testpath))
|
||||
return false;
|
||||
// Check Mii's
|
||||
snprintf(testpath, sizeof(testpath), "%s:%s/shared2/menu/FaceLib/RFL_DB.dat", DeviceName[epart], path);
|
||||
snprintf(testpath, sizeof(testpath), "%s/shared2/menu/FaceLib/RFL_DB.dat", basepath);
|
||||
if(!fsop_FileExist(testpath))
|
||||
return false;
|
||||
}
|
||||
@ -105,24 +128,12 @@ int CMenu::_FindEmuPart(string &emuPath, bool skipchecks)
|
||||
if(m_current_view == COVERFLOW_CHANNEL)
|
||||
{
|
||||
emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0);
|
||||
tmpPath = m_cfg.getString(CHANNEL_DOMAIN, "path", "").c_str();
|
||||
if(strlen(tmpPath) == 0)
|
||||
{
|
||||
tmpPath = STDEMU_DIR;
|
||||
m_cfg.setString(CHANNEL_DOMAIN, "path", STDEMU_DIR);
|
||||
}
|
||||
tmpPath = fmt("/%s/%s", EMU_NANDS_DIR, m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default").c_str());
|
||||
}
|
||||
else if(m_current_view == COVERFLOW_WII)
|
||||
{
|
||||
emuPart = m_cfg.getInt(WII_DOMAIN, "savepartition", -1);
|
||||
if(emuPart == -1)
|
||||
emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0);
|
||||
tmpPath = m_cfg.getString(WII_DOMAIN, "savepath", m_cfg.getString(CHANNEL_DOMAIN, "path", "")).c_str();
|
||||
if(strlen(tmpPath) == 0)
|
||||
{
|
||||
tmpPath = STDEMU_DIR;
|
||||
m_cfg.setString(WII_DOMAIN, "savepath", STDEMU_DIR);
|
||||
}
|
||||
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;
|
||||
@ -148,7 +159,7 @@ bool CMenu::_checkSave(string id, bool nand)
|
||||
}
|
||||
else
|
||||
{
|
||||
int emuPartition = m_cfg.getInt(WII_DOMAIN, "savepartition", -1);
|
||||
int emuPartition = m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0));
|
||||
string emuPath = m_cfg.getString(WII_DOMAIN, "savepath", "");
|
||||
if(emuPartition < 0 || emuPath.size() == 0)
|
||||
return false;
|
||||
@ -209,14 +220,10 @@ void CMenu::_hideNandEmu(bool instant)
|
||||
m_btnMgr.hide(m_nandemuBtnMissing, instant);
|
||||
m_btnMgr.hide(m_nandemuLblNandDump, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnNandDump, instant);
|
||||
m_btnMgr.hide(m_nandemuLblNandFolder, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnNandFolder, instant);
|
||||
m_btnMgr.hide(m_nandemuLblNandSavesFolder, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnNandSavesFolder, instant);
|
||||
m_btnMgr.hide(m_nandemuLblPresetNand, instant);
|
||||
m_btnMgr.hide(m_nandemuLblPresetVal, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnPresetP, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnPresetM, instant);
|
||||
m_btnMgr.hide(m_nandemuLblNandSelect, instant);
|
||||
m_btnMgr.hide(m_nandemuLblNandSelectVal, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnNandSelectP, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnNandSelectM, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnExtract, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnPartition, instant);
|
||||
m_btnMgr.hide(m_nandemuBtnDisable, instant);
|
||||
@ -249,8 +256,6 @@ void CMenu::_showNandEmu(void)
|
||||
m_btnMgr.show(m_nandemuBtnEmulationM);
|
||||
}
|
||||
|
||||
if((m_current_view == COVERFLOW_CHANNEL || m_current_view == COVERFLOW_WII))
|
||||
{
|
||||
m_btnMgr.show(m_nandemuLblSaveDump);
|
||||
m_btnMgr.show(m_nandemuBtnAll);
|
||||
m_btnMgr.show(m_nandemuBtnMissing);
|
||||
@ -267,35 +272,18 @@ void CMenu::_showNandEmu(void)
|
||||
m_btnMgr.setText(m_nandemuLblEmulationVal, _t(CMenu::_GlobalSaveEmu[i].id, CMenu::_GlobalSaveEmu[i].text));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
else //page 2
|
||||
{
|
||||
m_btnMgr.show(m_nandemuLblNandFolder);
|
||||
m_btnMgr.show(m_nandemuBtnNandFolder);
|
||||
m_btnMgr.show(m_nandemuLblNandSavesFolder);
|
||||
m_btnMgr.show(m_nandemuBtnNandSavesFolder);
|
||||
m_btnMgr.show(m_nandemuLblPresetNand);
|
||||
m_btnMgr.show(m_nandemuLblPresetVal);
|
||||
m_btnMgr.show(m_nandemuBtnPresetP);
|
||||
m_btnMgr.show(m_nandemuBtnPresetM);
|
||||
const char *presetPath = m_cfg.getString(CHANNEL_DOMAIN, fmt("path_%i", m_cfg.getInt(CHANNEL_DOMAIN, "current_preset", 1)), "").c_str();
|
||||
if(strlen(presetPath) > 0)
|
||||
{
|
||||
char tmpPath[64];
|
||||
memset(tmpPath, 0, 64);
|
||||
if(strchr(presetPath, '/') != strrchr(presetPath, '/'))
|
||||
{
|
||||
if(presetPath[strlen(presetPath) - 1] == '/')
|
||||
*strrchr(presetPath, '/') = '\0';
|
||||
strncpy(tmpPath, strrchr(presetPath, '/') + 1, 63);
|
||||
}
|
||||
else
|
||||
strcpy(tmpPath, presetPath);
|
||||
m_btnMgr.setText(m_nandemuLblPresetVal, wstringEx(tmpPath));
|
||||
}
|
||||
else
|
||||
m_btnMgr.setText(m_nandemuLblPresetVal, _t("cfgne38", L"Empty"));
|
||||
m_btnMgr.show(m_nandemuLblNandSelect);
|
||||
m_btnMgr.show(m_nandemuLblNandSelectVal);
|
||||
m_btnMgr.show(m_nandemuBtnNandSelectP);
|
||||
m_btnMgr.show(m_nandemuBtnNandSelectM);
|
||||
if(m_current_view == COVERFLOW_CHANNEL)
|
||||
m_btnMgr.setText(m_nandemuLblNandSelectVal, m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default"));
|
||||
else if(m_current_view == COVERFLOW_WII)
|
||||
m_btnMgr.setText(m_nandemuLblNandSelectVal, m_cfg.getString(WII_DOMAIN, "current_save_emunand", m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default")));
|
||||
}
|
||||
|
||||
for(u8 i = 0; i < ARRAY_SIZE(m_nandemuLblUser); ++i)
|
||||
if(m_nandemuLblUser[i] != -1)
|
||||
m_btnMgr.show(m_nandemuLblUser[i]);
|
||||
@ -304,8 +292,28 @@ void CMenu::_showNandEmu(void)
|
||||
int CMenu::_NandEmuCfg(void)
|
||||
{
|
||||
nandemuPage = 1;
|
||||
bool bothNands = m_cfg.getBool(CHANNEL_DOMAIN, "switch_both_nands", false);
|
||||
const char *path;
|
||||
|
||||
vector<string> emuNands;
|
||||
string prevEmuNand;
|
||||
int emuPart;
|
||||
if(m_current_view == COVERFLOW_CHANNEL)
|
||||
{
|
||||
prevEmuNand = m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default");
|
||||
emuPart = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
prevEmuNand = 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));
|
||||
}
|
||||
listEmuNands(fmt("%s:/%s", DeviceName[emuPart], EMU_NANDS_DIR), emuNands);
|
||||
int curEmuNand = 0;
|
||||
for(u8 i = 0; i < emuNands.size(); ++i)
|
||||
if(emuNands[i] == prevEmuNand)
|
||||
{
|
||||
curEmuNand = i;
|
||||
break;
|
||||
}
|
||||
|
||||
lwp_t thread = 0;
|
||||
SetupInput();
|
||||
@ -329,14 +337,10 @@ int CMenu::_NandEmuCfg(void)
|
||||
m_btnMgr.hide(m_nandemuBtnMissing, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandDump, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandDump, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandFolder, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandFolder, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandSavesFolder, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandSavesFolder, true);
|
||||
m_btnMgr.hide(m_nandemuLblPresetNand, true);
|
||||
m_btnMgr.hide(m_nandemuLblPresetVal, true);
|
||||
m_btnMgr.hide(m_nandemuBtnPresetP, true);
|
||||
m_btnMgr.hide(m_nandemuBtnPresetM, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandSelect, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandSelectVal, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandSelectP, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandSelectM, true);
|
||||
|
||||
nandemuPage = nandemuPage == 1 ? 2 : 1;
|
||||
_showNandEmu();
|
||||
@ -352,14 +356,10 @@ int CMenu::_NandEmuCfg(void)
|
||||
m_btnMgr.hide(m_nandemuBtnMissing, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandDump, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandDump, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandFolder, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandFolder, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandSavesFolder, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandSavesFolder, true);
|
||||
m_btnMgr.hide(m_nandemuLblPresetNand, true);
|
||||
m_btnMgr.hide(m_nandemuLblPresetVal, true);
|
||||
m_btnMgr.hide(m_nandemuBtnPresetP, true);
|
||||
m_btnMgr.hide(m_nandemuBtnPresetM, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandSelect, true);
|
||||
m_btnMgr.hide(m_nandemuLblNandSelectVal, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandSelectP, true);
|
||||
m_btnMgr.hide(m_nandemuBtnNandSelectM, true);
|
||||
|
||||
nandemuPage = nandemuPage == 1 ? 2 : 1;
|
||||
_showNandEmu();
|
||||
@ -415,121 +415,14 @@ int CMenu::_NandEmuCfg(void)
|
||||
m_thrdWorking = true;
|
||||
LWP_CreateThread(&thread, (void *(*)(void *))CMenu::_NandDumper, (void *)this, 0, 32768, 40);
|
||||
}
|
||||
else if(BTN_A_PRESSED && (m_btnMgr.selected(m_nandemuBtnNandFolder)))
|
||||
else if(BTN_A_PRESSED && (m_btnMgr.selected(m_nandemuBtnNandSelectP) || m_btnMgr.selected(m_nandemuBtnNandSelectM)))
|
||||
{
|
||||
_hideNandEmu(true);
|
||||
u8 tmpView = m_current_view;
|
||||
m_current_view = COVERFLOW_CHANNEL;
|
||||
string emuPath;
|
||||
_FindEmuPart(emuPath, true);
|
||||
path = _FolderExplorer(NandHandle.GetPath());
|
||||
m_current_view = tmpView;
|
||||
if(strlen(path) > 0)
|
||||
{
|
||||
char preset[256];
|
||||
memset(preset, 0, 256);
|
||||
strncpy(preset, path, strlen(path)-1);
|
||||
m_cfg.setString(CHANNEL_DOMAIN, fmt("path_%i", m_cfg.getInt(CHANNEL_DOMAIN, "current_preset", 1)), preset);
|
||||
if(strncmp(path, "sd:/", 4) == 0)
|
||||
{
|
||||
m_cfg.setInt(CHANNEL_DOMAIN, "partition", 0);
|
||||
if(bothNands)
|
||||
m_cfg.setInt(WII_DOMAIN, "savepartition", 0);
|
||||
}
|
||||
s8 direction = m_btnMgr.selected(m_nandemuBtnNandSelectP) ? 1 : -1;
|
||||
curEmuNand = loopNum(curEmuNand + direction, emuNands.size());
|
||||
if(m_current_view == COVERFLOW_CHANNEL)
|
||||
m_cfg.setString(CHANNEL_DOMAIN, "current_emunand", emuNands[curEmuNand]);
|
||||
else
|
||||
{
|
||||
const char *partval = &path[3];
|
||||
m_cfg.setInt(CHANNEL_DOMAIN, "partition", atoi(partval));
|
||||
if(bothNands)
|
||||
m_cfg.setInt(WII_DOMAIN, "savepartition", atoi(partval));
|
||||
}
|
||||
char tmpPath[MAX_FAT_PATH];
|
||||
memset(tmpPath, 0, MAX_FAT_PATH);
|
||||
strncpy(tmpPath, strchr(path, '/'), MAX_FAT_PATH-1);
|
||||
m_cfg.setString(CHANNEL_DOMAIN, "path", tmpPath);
|
||||
if(bothNands)
|
||||
m_cfg.setString(WII_DOMAIN, "savepath", tmpPath);
|
||||
m_cfg.setBool(CHANNEL_DOMAIN, "update_cache", true);
|
||||
if(m_cfg.getBool(CHANNEL_DOMAIN, "source"))
|
||||
m_load_view = true;
|
||||
}
|
||||
_showNandEmu();
|
||||
}
|
||||
else if(BTN_A_PRESSED && (m_btnMgr.selected(m_nandemuBtnNandSavesFolder)))
|
||||
{
|
||||
_hideNandEmu(true);
|
||||
u8 tmpView = m_current_view;
|
||||
m_current_view = COVERFLOW_WII;
|
||||
string emuPath;
|
||||
_FindEmuPart(emuPath, true);
|
||||
path = _FolderExplorer(NandHandle.GetPath());
|
||||
m_current_view = tmpView;
|
||||
if(strlen(path) > 0)
|
||||
{
|
||||
if(bothNands)
|
||||
{
|
||||
char preset[256];
|
||||
memset(preset, 0, 256);
|
||||
strncpy(preset, path, strlen(path)-1);
|
||||
m_cfg.setString(CHANNEL_DOMAIN, fmt("path_%i", m_cfg.getInt(CHANNEL_DOMAIN, "current_preset", 1)), preset);
|
||||
}
|
||||
if(strncmp(path, "sd:/", 4) == 0)
|
||||
{
|
||||
m_cfg.setInt(WII_DOMAIN, "savepartition", 0);
|
||||
if(bothNands)
|
||||
m_cfg.setInt(CHANNEL_DOMAIN, "partition", 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *partval = &path[3];
|
||||
m_cfg.setInt(WII_DOMAIN, "savepartition", atoi(partval));
|
||||
if(bothNands)
|
||||
m_cfg.setInt(CHANNEL_DOMAIN, "partition", atoi(partval));
|
||||
}
|
||||
char tmpPath[MAX_FAT_PATH];
|
||||
memset(tmpPath, 0, MAX_FAT_PATH);
|
||||
strncpy(tmpPath, strchr(path, '/'), MAX_FAT_PATH-1);
|
||||
m_cfg.setString(WII_DOMAIN, "savepath", tmpPath);
|
||||
if(bothNands)
|
||||
{
|
||||
m_cfg.setString(CHANNEL_DOMAIN, "path", tmpPath);
|
||||
m_cfg.setBool(CHANNEL_DOMAIN, "update_cache", true);
|
||||
if(m_cfg.getBool(CHANNEL_DOMAIN, "source"))
|
||||
m_load_view = true;
|
||||
}
|
||||
}
|
||||
_showNandEmu();
|
||||
}
|
||||
else if (BTN_A_PRESSED && (m_btnMgr.selected(m_nandemuBtnPresetP) || m_btnMgr.selected(m_nandemuBtnPresetM)))
|
||||
{
|
||||
s8 direction = m_btnMgr.selected(m_nandemuBtnPresetP) ? 1 : -1;
|
||||
m_cfg.setInt(CHANNEL_DOMAIN, "current_preset", ((int)loopNum((u32)(m_cfg.getInt(CHANNEL_DOMAIN, "current_preset", 1) - 1) + direction, 4)) + 1);
|
||||
path = m_cfg.getString(CHANNEL_DOMAIN, fmt("path_%i", m_cfg.getInt(CHANNEL_DOMAIN, "current_preset", 1)), "").c_str();
|
||||
if(strlen(path) > 0)
|
||||
{
|
||||
if(strncmp(path, "sd:/", 4) == 0)
|
||||
{
|
||||
m_cfg.setInt(CHANNEL_DOMAIN, "partition", 0);
|
||||
if(bothNands)
|
||||
m_cfg.setInt(WII_DOMAIN, "savepartition", 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *partval = &path[3];
|
||||
m_cfg.setInt(CHANNEL_DOMAIN, "partition", atoi(partval));
|
||||
if(bothNands)
|
||||
m_cfg.setInt(WII_DOMAIN, "savepartition", atoi(partval));
|
||||
}
|
||||
char tmpPath[MAX_FAT_PATH];
|
||||
memset(tmpPath, 0, MAX_FAT_PATH);
|
||||
strncpy(tmpPath, strchr(path, '/'), MAX_FAT_PATH-1);
|
||||
m_cfg.setString(CHANNEL_DOMAIN, "path", tmpPath);
|
||||
if(bothNands)
|
||||
m_cfg.setString(WII_DOMAIN, "savepath", tmpPath);
|
||||
m_cfg.setBool(CHANNEL_DOMAIN, "update_cache", true);
|
||||
if(m_cfg.getBool(CHANNEL_DOMAIN, "source"))
|
||||
m_load_view = true;
|
||||
}
|
||||
m_cfg.setString(WII_DOMAIN, "current_save_emunand", emuNands[curEmuNand]);
|
||||
_showNandEmu();
|
||||
}
|
||||
else if(BTN_A_PRESSED && (m_btnMgr.selected(m_nandemuBtnBack)))
|
||||
@ -565,6 +458,11 @@ int CMenu::_NandEmuCfg(void)
|
||||
}
|
||||
}
|
||||
_hideNandEmu();
|
||||
if(prevEmuNand != m_cfg.getString(CHANNEL_DOMAIN, "current_emunand") && m_current_view == COVERFLOW_CHANNEL)
|
||||
{
|
||||
m_cfg.setBool(CHANNEL_DOMAIN, "update_cache", true);
|
||||
m_load_view = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -572,7 +470,7 @@ int CMenu::_FlashSave(string gameId)
|
||||
{
|
||||
int emuPartition = m_cfg.getInt(WII_DOMAIN, "savepartition", m_cfg.getInt(CHANNEL_DOMAIN, "partition", 0));
|
||||
char basepath[MAX_FAT_PATH];
|
||||
snprintf(basepath, sizeof(basepath), "%s:%s", DeviceName[emuPartition], m_cfg.getString(WII_DOMAIN, "savepath", m_cfg.getString(CHANNEL_DOMAIN, "path", "")).c_str());
|
||||
snprintf(basepath, sizeof(basepath), "%s:/%s/%s", DeviceName[emuPartition], EMU_NANDS_DIR, m_cfg.getString(WII_DOMAIN, "current_save_emunand", m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default")).c_str());
|
||||
|
||||
if(!_checkSave(gameId, false))
|
||||
return 0;
|
||||
@ -762,7 +660,7 @@ int CMenu::_AutoCreateNand(void)
|
||||
m_btnMgr.setText(m_nandemuBtnExtract, _t("cfgne5", L"Extract NAND"));
|
||||
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_nandemuLblInit, _t("cfgne23", L"Welcome to WiiFlow. I have not found a valid NAND for NAND Emulation. 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 changing the partition to select the correct device/partition, click Extract to extract your NAND, or click disable to disable NAND Emulation."));
|
||||
m_btnMgr.show(m_nandemuBtnExtract);
|
||||
m_btnMgr.show(m_nandemuBtnDisable);
|
||||
m_btnMgr.show(m_nandemuBtnPartition);
|
||||
@ -802,6 +700,7 @@ int CMenu::_AutoCreateNand(void)
|
||||
_hideNandEmu();
|
||||
return 0;
|
||||
}
|
||||
//use partition btn from config so we don't have to show the whole main settings.
|
||||
else if(m_btnMgr.selected(m_nandemuBtnPartition))
|
||||
{
|
||||
if(m_current_view == COVERFLOW_WII)
|
||||
@ -1019,14 +918,10 @@ void CMenu::_initNandEmuMenu()
|
||||
m_nandemuLblNandDump = _addLabel("NANDEMU/NAND_DUMP", theme.lblFont, L"", 20, 305, 385, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE);
|
||||
m_nandemuBtnNandDump = _addButton("NANDEMU/NAND_DUMP_BTN", theme.btnFont, L"", 420, 310, 200, 48, theme.btnFontColor);
|
||||
|
||||
m_nandemuLblNandFolder = _addLabel("NANDEMU/NAND_FOLDER", theme.lblFont, L"", 20, 125, 385, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE);
|
||||
m_nandemuBtnNandFolder = _addButton("NANDEMU/NAND_FOLDER_BTN", theme.btnFont, L"", 420, 130, 200, 48, theme.btnFontColor);
|
||||
m_nandemuLblNandSavesFolder = _addLabel("NANDEMU/NAND_SAVES_FOLDER", theme.lblFont, L"", 20, 185, 385, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE);
|
||||
m_nandemuBtnNandSavesFolder = _addButton("NANDEMU/NAND_SAVES_FOLDER_BTN", theme.btnFont, L"", 420, 190, 200, 48, theme.btnFontColor);
|
||||
m_nandemuLblPresetNand = _addLabel("NANDEMU/PRESET_NAND", theme.lblFont, L"", 20, 245, 385, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE);
|
||||
m_nandemuLblPresetVal = _addLabel("NANDEMU/PRESET_NAND_BTN", theme.btnFont, L"", 468, 250, 104, 48, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC);
|
||||
m_nandemuBtnPresetM = _addPicButton("NANDEMU/PRESET_NAND_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 420, 250, 48, 48);
|
||||
m_nandemuBtnPresetP = _addPicButton("NANDEMU/PRESET_NAND_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 572, 250, 48, 48);
|
||||
m_nandemuLblNandSelect = _addLabel("NANDEMU/NAND_SELECT", theme.lblFont, L"", 20, 125, 385, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE);
|
||||
m_nandemuLblNandSelectVal = _addLabel("NANDEMU/NAND_SELECT_BTN", theme.btnFont, L"", 468, 130, 104, 48, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC);
|
||||
m_nandemuBtnNandSelectM = _addPicButton("NANDEMU/NAND_SELECT_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 420, 130, 48, 48);
|
||||
m_nandemuBtnNandSelectP = _addPicButton("NANDEMU/NAND_SELECT_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 572, 130, 48, 48);
|
||||
|
||||
m_nandemuBtnBack = _addButton("NANDEMU/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 48, theme.btnFontColor);
|
||||
m_nandemuLblPage = _addLabel("NANDEMU/PAGE_BTN", theme.btnFont, L"", 68, 400, 104, 48, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC);
|
||||
@ -1057,14 +952,10 @@ void CMenu::_initNandEmuMenu()
|
||||
_setHideAnim(m_nandemuLblNandDump, "NANDEMU/NAND_DUMP", 50, 0, -2.f, 0.f);
|
||||
_setHideAnim(m_nandemuBtnNandDump, "NANDEMU/NAND_DUMP_BTN", -50, 0, 1.f, 0.f);
|
||||
|
||||
_setHideAnim(m_nandemuLblNandFolder, "NANDEMU/NAND_FOLDER", 50, 0, -2.f, 0.f);
|
||||
_setHideAnim(m_nandemuBtnNandFolder, "NANDEMU/NAND_FOLDER_BTN", -50, 0, 1.f, 0.f);
|
||||
_setHideAnim(m_nandemuLblNandSavesFolder, "NANDEMU/NAND_SAVES_FOLDER", 50, 0, -2.f, 0.f);
|
||||
_setHideAnim(m_nandemuBtnNandSavesFolder, "NANDEMU/NAND_SAVES_FOLDER_BTN", -50, 0, 1.f, 0.f);
|
||||
_setHideAnim(m_nandemuLblPresetNand, "NANDEMU/PRESET_NAND", 50, 0, -2.f, 0.f);
|
||||
_setHideAnim(m_nandemuLblPresetVal, "NANDEMU/PRESET_NAND_BTN", -50, 0, 1.f, 0.f);
|
||||
_setHideAnim(m_nandemuBtnPresetM, "NANDEMU/PRESET_NAND_MINUS", -50, 0, 1.f, 0.f);
|
||||
_setHideAnim(m_nandemuBtnPresetP, "NANDEMU/PRESET_NAND_PLUS", -50, 0, 1.f, 0.f);
|
||||
_setHideAnim(m_nandemuLblNandSelect, "NANDEMU/NAND_SELECT", 50, 0, -2.f, 0.f);
|
||||
_setHideAnim(m_nandemuLblNandSelectVal, "NANDEMU/NAND_SELECT_BTN", -50, 0, 1.f, 0.f);
|
||||
_setHideAnim(m_nandemuBtnNandSelectM, "NANDEMU/NAND_SELECT_MINUS", -50, 0, 1.f, 0.f);
|
||||
_setHideAnim(m_nandemuBtnNandSelectP, "NANDEMU/NAND_SELECT_PLUS", -50, 0, 1.f, 0.f);
|
||||
|
||||
_setHideAnim(m_nandemuBtnBack, "NANDEMU/BACK_BTN", 0, 0, 1.f, -1.f);
|
||||
_setHideAnim(m_nandemuLblPage, "NANDEMU/PAGE_BTN", 0, 0, 1.f, -1.f);
|
||||
@ -1082,11 +973,7 @@ void CMenu::_initNandEmuMenu()
|
||||
|
||||
void CMenu::_textNandEmu(void)
|
||||
{
|
||||
m_btnMgr.setText(m_nandemuLblNandFolder, _t("cfgne32", L"Change Nand"));
|
||||
m_btnMgr.setText(m_nandemuLblNandSavesFolder, _t("cfgne33", L"Change Saves Nand"));
|
||||
m_btnMgr.setText(m_nandemuLblPresetNand, _t("cfgne37", L"Select Preset Nand"));
|
||||
m_btnMgr.setText(m_nandemuBtnNandFolder, _t("dl16", L"Set"));
|
||||
m_btnMgr.setText(m_nandemuBtnNandSavesFolder, _t("dl16", L"Set"));
|
||||
m_btnMgr.setText(m_nandemuLblNandSelect, _t("cfgne37", L"Select Nand"));
|
||||
m_btnMgr.setText(m_nandemuLblEmulation, _t("cfgne1", L"NAND Emulation"));
|
||||
m_btnMgr.setText(m_nandemuLblSaveDump, _t("cfgne2", L"Extract Game Saves"));
|
||||
m_btnMgr.setText(m_nandemuBtnAll, _t("cfgne3", L"All"));
|
||||
|
@ -450,7 +450,7 @@ void CMenu::_Wad(const char *wad_path)
|
||||
/* mios is real nand, chans are emu */
|
||||
if(mios == false)
|
||||
{
|
||||
const char *emu_char = m_cfg.getString(CHANNEL_DOMAIN, "path", "/").c_str();
|
||||
const char *emu_char = fmt("/%s/%s", EMU_NANDS_DIR, m_cfg.getString(CHANNEL_DOMAIN, "current_emunand", "default").c_str());
|
||||
NandHandle.SetPaths(emu_char, DeviceName[currentPartition]);
|
||||
}
|
||||
_start_pThread();
|
||||
|
Loading…
Reference in New Issue
Block a user