- Added Auto MIOS installing for GC/QF games. put your MIOS in dev:/wiiflow/mios. name them qfsd.wad, qfusb.wad, dm.wad, and dml.wad. set your QuadForce games GC loader to AUTO or just set the global GC Loader to auto for all games. Bits of code taken from PL4 by stfour, thanks.

Note: if you don't want to use it then leave everything alone and don't put any wads in the mios folder.
Note2: if you install a mios outside of wiiflow and use this feature be sure to set current_auto_mios = 0 under [DML] in wiiflow.ini
This commit is contained in:
fledge68 2013-08-21 15:20:13 +00:00
parent c4f82bfdc3
commit f45da114bc
5 changed files with 117 additions and 51 deletions

View File

@ -300,6 +300,7 @@ void CMenu::init()
m_app_update_zip = fmt("%s/update.zip", m_appDir.c_str()); m_app_update_zip = fmt("%s/update.zip", m_appDir.c_str());
m_data_update_zip = fmt("%s/update.zip", m_dataDir.c_str()); m_data_update_zip = fmt("%s/update.zip", m_dataDir.c_str());
m_miosDir = m_cfg.getString("GENERAL", "dir_mios", fmt("%s/mios", m_dataDir.c_str()));
m_customBnrDir = m_cfg.getString("GENERAL", "dir_custom_banners", fmt("%s/custom_banners", m_dataDir.c_str())); m_customBnrDir = m_cfg.getString("GENERAL", "dir_custom_banners", fmt("%s/custom_banners", m_dataDir.c_str()));
m_pluginsDir = m_cfg.getString("GENERAL", "dir_plugins", fmt("%s/plugins", m_dataDir.c_str())); m_pluginsDir = m_cfg.getString("GENERAL", "dir_plugins", fmt("%s/plugins", m_dataDir.c_str()));
@ -359,6 +360,7 @@ void CMenu::init()
/* Create our Folder Structure */ /* Create our Folder Structure */
fsop_MakeFolder(m_dataDir.c_str()); //D'OH! fsop_MakeFolder(m_dataDir.c_str()); //D'OH!
fsop_MakeFolder(m_miosDir.c_str());
fsop_MakeFolder(m_customBnrDir.c_str()); fsop_MakeFolder(m_customBnrDir.c_str());
fsop_MakeFolder(m_pluginsDir.c_str()); fsop_MakeFolder(m_pluginsDir.c_str());

View File

@ -96,6 +96,7 @@ private:
u8 m_numCFVersions; u8 m_numCFVersions;
string m_miosDir;
string m_themeDataDir; string m_themeDataDir;
string m_appDir; string m_appDir;
string m_dataDir; string m_dataDir;
@ -1028,7 +1029,7 @@ private:
void _CoverBanner(void); void _CoverBanner(void);
void _Explorer(void); void _Explorer(void);
const char *_FolderExplorer(const char *startPath); const char *_FolderExplorer(const char *startPath);
void _Wad(const char *wad_path = NULL); void _Wad(const char *wad_path = NULL, bool autoInstall = false);
void _CheatSettings(); void _CheatSettings();
bool _Source(); bool _Source();
void _PluginSettings(); void _PluginSettings();
@ -1172,8 +1173,8 @@ private:
static const SOption _AspectRatio[3]; static const SOption _AspectRatio[3];
static const SOption _NMM[4]; static const SOption _NMM[4];
static const SOption _NoDVD[3]; static const SOption _NoDVD[3];
static const SOption _GlobalGCLoaders[2]; static const SOption _GlobalGCLoaders[3];
static const SOption _GCLoader[3]; static const SOption _GCLoader[4];
static const SOption _vidModePatch[4]; static const SOption _vidModePatch[4];
static const SOption _debugger[3]; static const SOption _debugger[3];
static const SOption _hooktype[8]; static const SOption _hooktype[8];

View File

@ -173,15 +173,17 @@ const CMenu::SOption CMenu::_NoDVD[3] = {
{ "NoDVDon", L"Enabled" }, { "NoDVDon", L"Enabled" },
}; };
const CMenu::SOption CMenu::_GlobalGCLoaders[2] = { const CMenu::SOption CMenu::_GlobalGCLoaders[3] = {
{ "GC_DM", L"DIOS-MIOS" }, { "GC_DM", L"DIOS-MIOS" },
{ "GC_Devo", L"Devolution" }, { "GC_Devo", L"Devolution" },
{ "GC_Auto", L"Auto" },
}; };
const CMenu::SOption CMenu::_GCLoader[3] = { const CMenu::SOption CMenu::_GCLoader[4] = {
{ "GC_Def", L"Default" }, { "GC_Def", L"Default" },
{ "GC_DM", L"DIOS-MIOS" }, { "GC_DM", L"DIOS-MIOS" },
{ "GC_Devo", L"Devolution" }, { "GC_Devo", L"Devolution" },
{ "GC_Auto", L"Auto" },
}; };
const CMenu::SOption CMenu::_vidModePatch[4] = { const CMenu::SOption CMenu::_vidModePatch[4] = {
@ -567,47 +569,6 @@ void CMenu::_game(bool launch)
} }
currentPartition = m_cfg.getInt(PLUGIN_DOMAIN, "partition", 1); currentPartition = m_cfg.getInt(PLUGIN_DOMAIN, "partition", 1);
} }
if(currentPartition != SD && hdr->type == TYPE_GC_GAME && m_show_dml == 2 && (strstr(hdr->path, ".iso") == NULL ||
!m_devo_installed || min((u32)m_gcfg2.getInt(hdr->id, "gc_loader", 0), ARRAY_SIZE(CMenu::_GCLoader) - 1u) == 1))
{
bool foundOnSD = false;
ListGenerator SD_List;
string gameDir(fmt(DML_DIR, DeviceName[SD]));
string cacheDir(fmt("%s/%s_gamecube.db", m_listCacheDir.c_str(), DeviceName[SD]));
SD_List.CreateList(COVERFLOW_DML, SD, gameDir,
stringToVector(".iso|root", '|'), cacheDir, false);
for(vector<dir_discHdr>::iterator List = SD_List.begin(); List != SD_List.end(); List++)
{
if(strncasecmp(hdr->id, List->id, 6) == 0)
{
foundOnSD = true;
memset(hdr->path, 0, sizeof(hdr->path));
strncpy(hdr->path, List->path, sizeof(hdr->path));
break;
}
}
SD_List.clear();
if(!foundOnSD)
{
if(_wbfsOp(CMenu::WO_COPY_GAME))
{
char folder[50];
string GC_Path(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());
u32 Place = GC_Path.find_last_of("/");
GC_Path = hdr->path;
memset(hdr->path, 0, sizeof(hdr->path));
snprintf(folder, sizeof(folder), DML_DIR, DeviceName[SD]);
snprintf(hdr->path, sizeof(hdr->path), "%s/%s", folder, &GC_Path[Place]+1);
}
else
break;
}
currentPartition = SD;
}
/* Get Banner Title for Playlog */ /* Get Banner Title for Playlog */
CurrentBanner.ClearBanner(); CurrentBanner.ClearBanner();
if(hdr->type == TYPE_CHANNEL) if(hdr->type == TYPE_CHANNEL)
@ -853,10 +814,19 @@ void CMenu::_launch(const dir_discHdr *hdr)
ShutdownBeforeExit(); ShutdownBeforeExit();
Sys_Exit(); Sys_Exit();
} }
// taken from Postloader by Stfour
#define QFIDN 6
static const char *qfid[QFIDN] = {
"GGPE01", //Mario Kart Arcade GP
"GGPE02", //Mario Kart Arcade GP
"GFZJ8P", //F-Zero AX
"GVSJ8P", // VirtuaStriker4
"GVS46E", // Virtua Striker 4 Ver.2006
"GVS46J", // Virtua Striker 4 Ver.2006
};
void CMenu::_launchGC(dir_discHdr *hdr, bool disc) void CMenu::_launchGC(dir_discHdr *hdr, bool disc)
{ {
_launchShutdown();
const char *id = hdr->id; const char *id = hdr->id;
memcpy((u8*)Disc_ID, id, 6); memcpy((u8*)Disc_ID, id, 6);
DCFlushRange((u8*)Disc_ID, 32); DCFlushRange((u8*)Disc_ID, 32);
@ -888,7 +858,7 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc)
bool memcard_emu = m_gcfg2.getBool(id, "devo_memcard_emu", false); bool memcard_emu = m_gcfg2.getBool(id, "devo_memcard_emu", false);
bool widescreen = m_gcfg2.getBool(id, "dm_widescreen", false); bool widescreen = m_gcfg2.getBool(id, "dm_widescreen", false);
bool activity_led = m_gcfg2.getBool(id, "led", false); bool activity_led = m_gcfg2.getBool(id, "led", false);
//if GC disc use DIOS MIOS to launch it
if(disc) if(disc)
{ {
loader = 0; loader = 0;
@ -897,6 +867,94 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc)
} }
else else
m_cfg.setString(GC_DOMAIN, "current_item", id); m_cfg.setString(GC_DOMAIN, "current_item", id);
u8 m_current_mios = m_cfg.getInt(GC_DOMAIN, "current_auto_mios", 0);
u8 req_mios = 0;
bool isqf = false;
const char *mios_wad = NULL;
if(loader == 2 || (loader == 0 && m_current_mios > 0))//auto or (DM and auto prev used)
{
for(int i = 0; i < QFIDN; i++)
if(strncmp(id, qfid[i], strlen(qfid[i])) == 0)
isqf = true;
if(isqf)
{
if(currentPartition == SD)
{
req_mios = 4;
mios_wad = fmt("%s/qfsd.wad", m_miosDir.c_str());
}
else if(currentPartition != SD)
{
req_mios = 3;
mios_wad = fmt("%s/qfusb.wad", m_miosDir.c_str());
}
}
else
{
if(currentPartition == SD)
{
req_mios = 2;
mios_wad = fmt("%s/dml.wad", m_miosDir.c_str());
}
else if(currentPartition != SD)
{
req_mios = 1;
mios_wad = fmt("%s/dm.wad", m_miosDir.c_str());
}
}
if(m_current_mios != req_mios && fsop_FileExist(mios_wad))
{
m_cfg.setInt(GC_DOMAIN, "current_auto_mios", req_mios);
_Wad(mios_wad, true);//install mios
}
loader = 0;
}
//copy DML game from USB to SD if needed for DML
m_show_dml = MIOSisDML();
if(currentPartition != SD && m_show_dml == 2 && (strstr(hdr->path, ".iso") == NULL || !m_devo_installed || loader == 0))
{
bool foundOnSD = false;
ListGenerator SD_List;
string gameDir(fmt(DML_DIR, DeviceName[SD]));
string cacheDir(fmt("%s/%s_gamecube.db", m_listCacheDir.c_str(), DeviceName[SD]));
SD_List.CreateList(COVERFLOW_DML, SD, gameDir,
stringToVector(".iso|root", '|'), cacheDir, false);
for(vector<dir_discHdr>::iterator List = SD_List.begin(); List != SD_List.end(); List++)
{
if(strncasecmp(hdr->id, List->id, 6) == 0)
{
foundOnSD = true;
memset(hdr->path, 0, sizeof(hdr->path));
strncpy(hdr->path, List->path, sizeof(hdr->path));
break;
}
}
SD_List.clear();
if(!foundOnSD)
{
if(_wbfsOp(CMenu::WO_COPY_GAME))
{
char folder[50];
string GC_Path(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());
u32 Place = GC_Path.find_last_of("/");
GC_Path = hdr->path;
memset(hdr->path, 0, sizeof(hdr->path));
snprintf(folder, sizeof(folder), DML_DIR, DeviceName[SD]);
snprintf(hdr->path, sizeof(hdr->path), "%s/%s", folder, &GC_Path[Place]+1);
}
else
return;
}
currentPartition = SD;
}
_launchShutdown();
bool DIOSMIOS = false; bool DIOSMIOS = false;
if(loader == 0 || strcasestr(path, "boot.bin") != NULL) if(loader == 0 || strcasestr(path, "boot.bin") != NULL)
{ {

View File

@ -414,7 +414,7 @@ void CMenu::update_pThread(u64 added)
} }
} }
void CMenu::_Wad(const char *wad_path) void CMenu::_Wad(const char *wad_path, bool autoInstall)
{ {
if(wad_path == NULL) if(wad_path == NULL)
return; return;
@ -448,9 +448,9 @@ void CMenu::_Wad(const char *wad_path)
_mainLoopCommon(); _mainLoopCommon();
if(BTN_HOME_PRESSED || BTN_B_PRESSED) if(BTN_HOME_PRESSED || BTN_B_PRESSED)
break; break;
else if(BTN_A_PRESSED) else if(BTN_A_PRESSED || autoInstall)
{ {
if(m_btnMgr.selected(m_wadBtnInstall)) if(m_btnMgr.selected(m_wadBtnInstall) || autoInstall)
{ {
_hideWad(true); _hideWad(true);
m_btnMgr.setProgress(m_wbfsPBar, 0.f); m_btnMgr.setProgress(m_wbfsPBar, 0.f);
@ -473,7 +473,11 @@ void CMenu::_Wad(const char *wad_path)
if(result < 0) if(result < 0)
m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wad5", L"Installation error %i!"), result)); m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wad5", L"Installation error %i!"), result));
else else
{
m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wad6", L"Installation finished with %i hash fails."), result)); m_btnMgr.setText(m_wbfsLblDialog, wfmt(_fmt("wad6", L"Installation finished with %i hash fails."), result));
if(autoInstall)
break;
}
} }
else if((m_btnMgr.selected(m_configBtnPartitionP) || m_btnMgr.selected(m_configBtnPartitionM))) else if((m_btnMgr.selected(m_configBtnPartitionP) || m_btnMgr.selected(m_configBtnPartitionM)))
{ {

View File

@ -251,6 +251,7 @@ gametdb_code=EN
GC_Def=Default GC_Def=Default
GC_DM=DIOS-MIOS GC_DM=DIOS-MIOS
GC_Devo=Devolution GC_Devo=Devolution
GC_Auto=Auto
genesis=Sega Genesis genesis=Sega Genesis
gm1=Play gm1=Play
gm2=Back gm2=Back