2012-01-21 21:57:41 +01:00
|
|
|
|
|
|
|
#include <ogc/machine/processor.h>
|
2012-05-15 23:33:53 +02:00
|
|
|
#include <ogc/lwp_threads.h>
|
2012-01-21 21:57:41 +01:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <time.h>
|
2012-05-11 05:37:56 +02:00
|
|
|
#include <network.h>
|
|
|
|
#include <errno.h>
|
2018-06-27 14:47:03 +02:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <fcntl.h>
|
2012-05-11 05:37:56 +02:00
|
|
|
|
2012-08-05 15:48:15 +02:00
|
|
|
#include "menu.hpp"
|
2012-06-16 19:03:23 +02:00
|
|
|
#include "types.h"
|
2012-08-05 15:48:15 +02:00
|
|
|
#include "banner/BannerWindow.hpp"
|
2012-10-13 00:25:22 +02:00
|
|
|
#include "booter/external_booter.hpp"
|
2012-08-05 15:48:15 +02:00
|
|
|
#include "channel/channel_launcher.h"
|
|
|
|
#include "channel/channels.h"
|
|
|
|
#include "channel/nand.hpp"
|
2012-12-08 22:16:05 +01:00
|
|
|
#include "channel/identify.h"
|
2012-08-05 15:48:15 +02:00
|
|
|
#include "devicemounter/DeviceHandler.hpp"
|
2012-08-25 17:10:57 +02:00
|
|
|
#include "devicemounter/sdhc.h"
|
2012-07-14 18:19:41 +02:00
|
|
|
#include "devicemounter/usbstorage.h"
|
2012-08-05 15:48:15 +02:00
|
|
|
#include "gc/gc.hpp"
|
|
|
|
#include "gc/gcdisc.hpp"
|
|
|
|
#include "gui/WiiMovie.hpp"
|
|
|
|
#include "homebrew/homebrew.h"
|
|
|
|
#include "loader/alt_ios.h"
|
|
|
|
#include "loader/wdvd.h"
|
|
|
|
#include "loader/playlog.h"
|
|
|
|
#include "loader/wbfs.h"
|
|
|
|
#include "loader/wip.h"
|
|
|
|
#include "loader/frag.h"
|
|
|
|
#include "loader/fst.h"
|
|
|
|
#include "loader/cios.h"
|
|
|
|
#include "loader/nk.h"
|
2012-11-24 20:41:27 +01:00
|
|
|
#include "memory/memory.h"
|
2012-08-05 15:48:15 +02:00
|
|
|
#include "network/http.h"
|
|
|
|
#include "network/gcard.h"
|
2012-07-14 18:19:41 +02:00
|
|
|
|
2012-04-08 17:54:34 +02:00
|
|
|
//sounds
|
2012-02-17 15:45:59 +01:00
|
|
|
extern const u8 gc_ogg[];
|
|
|
|
extern const u32 gc_ogg_size;
|
|
|
|
|
2012-07-04 00:08:51 +02:00
|
|
|
bool m_zoom_banner = false;
|
2017-09-22 00:03:41 +02:00
|
|
|
bool m_banner_loaded = false;
|
2012-09-13 16:54:17 +02:00
|
|
|
s16 m_gameBtnPlayFull;
|
|
|
|
s16 m_gameBtnBackFull;
|
2016-04-02 19:19:19 +02:00
|
|
|
s16 m_gameBtnToggle;
|
|
|
|
s16 m_gameBtnToggleFull;
|
2012-07-03 18:26:49 +02:00
|
|
|
|
2012-06-28 15:05:31 +02:00
|
|
|
const CMenu::SOption CMenu::_GlobalVideoModes[6] = {
|
|
|
|
{ "vidgame", L"Game" },
|
|
|
|
{ "vidsys", L"System" },
|
|
|
|
{ "vidp50", L"PAL 50Hz" },
|
|
|
|
{ "vidp60", L"PAL 60Hz" },
|
|
|
|
{ "vidntsc", L"NTSC" },
|
|
|
|
{ "vidprog", L"Progressive" },
|
|
|
|
};
|
|
|
|
|
|
|
|
const CMenu::SOption CMenu::_VideoModes[7] = {
|
2012-01-21 21:57:41 +01:00
|
|
|
{ "viddef", L"Default" },
|
2012-06-28 15:05:31 +02:00
|
|
|
{ "vidgame", L"Game" },
|
|
|
|
{ "vidsys", L"System" },
|
2012-01-21 21:57:41 +01:00
|
|
|
{ "vidp50", L"PAL 50Hz" },
|
|
|
|
{ "vidp60", L"PAL 60Hz" },
|
|
|
|
{ "vidntsc", L"NTSC" },
|
2012-06-28 15:05:31 +02:00
|
|
|
{ "vidprog", L"Progressive" },
|
2012-01-21 21:57:41 +01:00
|
|
|
};
|
|
|
|
|
2017-04-18 01:23:50 +02:00
|
|
|
const CMenu::SOption CMenu::_GlobalGCvideoModes[6] = {
|
|
|
|
{ "vidgame", L"Game" },
|
|
|
|
{ "vidp50", L"PAL 50Hz" },
|
|
|
|
{ "vidp60", L"PAL 60Hz" },
|
|
|
|
{ "vidntsc", L"NTSC" },
|
2016-04-02 17:46:06 +02:00
|
|
|
{ "DMLmpal", L"MPAL" },
|
2017-04-18 01:23:50 +02:00
|
|
|
{ "vidprog", L"Progressive" },
|
2012-03-04 22:33:14 +01:00
|
|
|
};
|
|
|
|
|
2017-04-18 01:23:50 +02:00
|
|
|
const CMenu::SOption CMenu::_GCvideoModes[7] = {
|
|
|
|
{ "viddef", L"Default" },
|
|
|
|
{ "vidgame", L"Game" },
|
|
|
|
{ "vidp50", L"PAL 50Hz" },
|
|
|
|
{ "vidp60", L"PAL 60Hz" },
|
|
|
|
{ "vidntsc", L"NTSC" },
|
2016-04-02 17:46:06 +02:00
|
|
|
{ "DMLmpal", L"MPAL" },
|
2017-04-18 01:23:50 +02:00
|
|
|
{ "vidprog", L"Progressive" },
|
2012-03-04 22:33:14 +01:00
|
|
|
};
|
|
|
|
|
2018-10-15 16:23:34 +02:00
|
|
|
const CMenu::SOption CMenu::_languages[11] = {
|
|
|
|
{ "lngdef", L"Default" },// next should be console
|
|
|
|
{ "lngjap", L"Japanese" },
|
|
|
|
{ "lngeng", L"English" },
|
|
|
|
{ "lngger", L"German" },
|
|
|
|
{ "lngfre", L"French" },
|
|
|
|
{ "lngspa", L"Spanish" },
|
|
|
|
{ "lngita", L"Italian" },
|
|
|
|
{ "lngdut", L"Dutch" },
|
|
|
|
{ "lngsch", L"S. Chinese" },
|
|
|
|
{ "lngtch", L"T. Chinese" },
|
|
|
|
{ "lngkor", L"Korean" }
|
|
|
|
};
|
|
|
|
|
2012-03-04 22:33:14 +01:00
|
|
|
const CMenu::SOption CMenu::_GlobalGClanguages[7] = {
|
|
|
|
{ "lngsys", L"System" },
|
|
|
|
{ "lngeng", L"English" },
|
|
|
|
{ "lngger", L"German" },
|
|
|
|
{ "lngfre", L"French" },
|
|
|
|
{ "lngspa", L"Spanish" },
|
|
|
|
{ "lngita", L"Italian" },
|
|
|
|
{ "lngdut", L"Dutch" }
|
2012-01-22 01:10:20 +01:00
|
|
|
};
|
|
|
|
|
2012-03-04 22:33:14 +01:00
|
|
|
const CMenu::SOption CMenu::_GClanguages[8] = {
|
2012-02-02 23:37:21 +01:00
|
|
|
{ "lngdef", L"Default" },
|
2012-03-04 22:33:14 +01:00
|
|
|
{ "lngsys", L"System" },
|
2012-02-02 23:37:21 +01:00
|
|
|
{ "lngeng", L"English" },
|
|
|
|
{ "lngger", L"German" },
|
|
|
|
{ "lngfre", L"French" },
|
|
|
|
{ "lngspa", L"Spanish" },
|
|
|
|
{ "lngita", L"Italian" },
|
|
|
|
{ "lngdut", L"Dutch" }
|
2012-02-02 23:22:46 +01:00
|
|
|
};
|
|
|
|
|
2016-12-01 01:05:39 +01:00
|
|
|
const CMenu::SOption CMenu::_ChannelsType[3] = {
|
|
|
|
{ "ChanReal", L"Real NAND" },
|
|
|
|
{ "ChanEmu", L"Emu NAND" },
|
|
|
|
{ "ChanBoth", L"Both" },
|
|
|
|
};
|
|
|
|
|
2012-06-07 02:34:47 +02:00
|
|
|
const CMenu::SOption CMenu::_NandEmu[2] = {
|
2012-01-29 20:28:31 +01:00
|
|
|
{ "NANDpart", L"Partial" },
|
|
|
|
{ "NANDfull", L"Full" },
|
|
|
|
};
|
|
|
|
|
2017-09-22 00:03:41 +02:00
|
|
|
const CMenu::SOption CMenu::_GlobalSaveEmu[3] = {
|
2012-01-29 20:28:31 +01:00
|
|
|
{ "SaveOffG", L"Off" },
|
2012-03-13 00:57:59 +01:00
|
|
|
{ "SavePartG", L"Game save" },
|
2012-01-29 20:28:31 +01:00
|
|
|
{ "SaveFullG", L"Full" },
|
|
|
|
};
|
|
|
|
|
2017-09-22 00:03:41 +02:00
|
|
|
const CMenu::SOption CMenu::_SaveEmu[4] = {
|
2012-01-29 20:28:31 +01:00
|
|
|
{ "SaveDef", L"Default" },
|
|
|
|
{ "SaveOff", L"Off" },
|
2012-03-13 00:57:59 +01:00
|
|
|
{ "SavePart", L"Game save" },
|
2012-01-29 20:28:31 +01:00
|
|
|
{ "SaveFull", L"Full" },
|
2012-01-23 22:15:14 +01:00
|
|
|
};
|
|
|
|
|
2012-01-27 14:59:36 +01:00
|
|
|
const CMenu::SOption CMenu::_AspectRatio[3] = {
|
2012-01-29 20:28:31 +01:00
|
|
|
{ "aspectDef", L"Default" },
|
|
|
|
{ "aspect43", L"Force 4:3" },
|
|
|
|
{ "aspect169", L"Force 16:9" },
|
2012-01-27 14:59:36 +01:00
|
|
|
};
|
|
|
|
|
2016-04-02 18:58:12 +02:00
|
|
|
const CMenu::SOption CMenu::_NinEmuCard[5] = {
|
2018-10-15 16:23:34 +02:00
|
|
|
{ "NinMCDef", L"Default" },
|
|
|
|
{ "NinMCOff", L"Disabled" },
|
|
|
|
{ "NinMCon", L"Enabled" },
|
|
|
|
{ "NinMCMulti", L"Multi Saves" },
|
|
|
|
{ "NinMCdebug", L"Debug" },
|
2012-03-12 17:14:56 +01:00
|
|
|
};
|
|
|
|
|
2016-04-03 02:31:02 +02:00
|
|
|
const CMenu::SOption CMenu::_GlobalGCLoaders[2] = {
|
2013-09-24 23:24:03 +02:00
|
|
|
{ "GC_Devo", L"Devolution" },
|
|
|
|
{ "GC_Nindnt", L"Nintendont" },
|
2013-08-17 15:21:43 +02:00
|
|
|
};
|
|
|
|
|
2016-04-03 02:31:02 +02:00
|
|
|
const CMenu::SOption CMenu::_GCLoader[3] = {
|
2012-07-15 00:44:57 +02:00
|
|
|
{ "GC_Def", L"Default" },
|
2013-09-24 23:24:03 +02:00
|
|
|
{ "GC_Devo", L"Devolution" },
|
|
|
|
{ "GC_Nindnt", L"Nintendont" },
|
2012-07-15 00:44:57 +02:00
|
|
|
};
|
|
|
|
|
2012-01-21 21:57:41 +01:00
|
|
|
const CMenu::SOption CMenu::_vidModePatch[4] = {
|
|
|
|
{ "vmpnone", L"None" },
|
|
|
|
{ "vmpnormal", L"Normal" },
|
|
|
|
{ "vmpmore", L"More" },
|
|
|
|
{ "vmpall", L"All" }
|
|
|
|
};
|
|
|
|
|
|
|
|
const CMenu::SOption CMenu::_hooktype[8] = {
|
2013-05-21 14:43:14 +02:00
|
|
|
{ "hook_auto", L"AUTO" },
|
2012-01-21 21:57:41 +01:00
|
|
|
{ "hooktype1", L"VBI" },
|
|
|
|
{ "hooktype2", L"KPAD read" },
|
|
|
|
{ "hooktype3", L"Joypad" },
|
|
|
|
{ "hooktype4", L"GXDraw" },
|
|
|
|
{ "hooktype5", L"GXFlush" },
|
|
|
|
{ "hooktype6", L"OSSleepThread" },
|
|
|
|
{ "hooktype7", L"AXNextFrame" },
|
|
|
|
};
|
2012-05-03 01:08:11 +02:00
|
|
|
|
2013-05-21 14:43:14 +02:00
|
|
|
const CMenu::SOption CMenu::_debugger[3] = {
|
|
|
|
{ "disabled", L"Disabled" },
|
|
|
|
{ "dbg_gecko", L"Gecko" },
|
|
|
|
{ "dbgfwrite", L"OSReport" },
|
|
|
|
};
|
|
|
|
|
2012-01-21 21:57:41 +01:00
|
|
|
static inline int loopNum(int i, int s)
|
|
|
|
{
|
2016-04-03 03:03:39 +02:00
|
|
|
return (i + s) % s;
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
static int GetLanguage(const char *lang)
|
|
|
|
{
|
|
|
|
if (strncmp(lang, "JP", 2) == 0) return CONF_LANG_JAPANESE;
|
|
|
|
else if (strncmp(lang, "EN", 2) == 0) return CONF_LANG_ENGLISH;
|
|
|
|
else if (strncmp(lang, "DE", 2) == 0) return CONF_LANG_GERMAN;
|
|
|
|
else if (strncmp(lang, "FR", 2) == 0) return CONF_LANG_FRENCH;
|
|
|
|
else if (strncmp(lang, "ES", 2) == 0) return CONF_LANG_SPANISH;
|
|
|
|
else if (strncmp(lang, "IT", 2) == 0) return CONF_LANG_ITALIAN;
|
|
|
|
else if (strncmp(lang, "NL", 2) == 0) return CONF_LANG_DUTCH;
|
|
|
|
else if (strncmp(lang, "ZHTW", 4) == 0) return CONF_LANG_TRAD_CHINESE;
|
|
|
|
else if (strncmp(lang, "ZH", 2) == 0) return CONF_LANG_SIMP_CHINESE;
|
|
|
|
else if (strncmp(lang, "KO", 2) == 0) return CONF_LANG_KOREAN;
|
|
|
|
|
|
|
|
return CONF_LANG_ENGLISH; // Default to EN
|
|
|
|
}
|
|
|
|
|
2016-11-07 16:06:00 +01:00
|
|
|
static void setLanguage(int l)
|
|
|
|
{
|
|
|
|
if (l > 0 && l <= 10)
|
|
|
|
configbytes[0] = l - 1;
|
|
|
|
else
|
|
|
|
configbytes[0] = 0xCD;
|
|
|
|
}
|
|
|
|
|
2012-01-21 21:57:41 +01:00
|
|
|
static u8 GetRequestedGameIOS(dir_discHdr *hdr)
|
|
|
|
{
|
|
|
|
u8 IOS = 0;
|
|
|
|
|
2012-09-23 15:20:01 +02:00
|
|
|
DeviceHandle.OpenWBFS(currentPartition);
|
2012-11-14 17:58:14 +01:00
|
|
|
wbfs_disc_t *disc = WBFS_OpenDisc((u8*)&hdr->id, hdr->path);
|
2012-09-23 15:20:01 +02:00
|
|
|
if(disc != NULL)
|
|
|
|
{
|
2013-09-01 18:43:53 +02:00
|
|
|
void *titleTMD = NULL;
|
|
|
|
u32 tmd_size = wbfs_extract_file(disc, (char*)"TMD", &titleTMD);
|
|
|
|
if(titleTMD != NULL)
|
|
|
|
{
|
|
|
|
if(tmd_size > 0x18B)
|
|
|
|
IOS = *((u8*)titleTMD + 0x18B);
|
|
|
|
MEM2_free(titleTMD);
|
|
|
|
}
|
2012-09-23 15:20:01 +02:00
|
|
|
WBFS_CloseDisc(disc);
|
|
|
|
}
|
|
|
|
WBFS_Close();
|
2012-01-21 21:57:41 +01:00
|
|
|
return IOS;
|
|
|
|
}
|
|
|
|
|
2018-07-16 15:08:45 +02:00
|
|
|
void CMenu::_extractBnr(const dir_discHdr *hdr)
|
|
|
|
{
|
|
|
|
u32 size = 0;
|
|
|
|
DeviceHandle.OpenWBFS(currentPartition);
|
|
|
|
wbfs_disc_t *disc = WBFS_OpenDisc((u8 *) &hdr->id, (char *) hdr->path);
|
|
|
|
if(disc != NULL)
|
|
|
|
{
|
|
|
|
void *bnr = NULL;
|
|
|
|
size = wbfs_extract_file(disc, (char*)"opening.bnr", &bnr);
|
|
|
|
if(size > 0)
|
|
|
|
CurrentBanner.SetBanner((u8*)bnr, size, false, true);
|
|
|
|
WBFS_CloseDisc(disc);
|
|
|
|
}
|
|
|
|
WBFS_Close();
|
|
|
|
}
|
|
|
|
|
2017-05-15 19:50:24 +02:00
|
|
|
void CMenu::_setCurrentItem(const dir_discHdr *hdr)
|
|
|
|
{
|
2018-05-08 15:49:43 +02:00
|
|
|
const char *title = CoverFlow.getFilenameId(hdr, true);// with extension
|
2018-12-02 01:39:33 +01:00
|
|
|
if(m_current_view == COVERFLOW_PLUGIN)
|
|
|
|
{
|
|
|
|
if(hdr->type == TYPE_PLUGIN)
|
|
|
|
strncpy(m_plugin.PluginMagicWord, fmt("%08x", hdr->settings[0]), 8);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if(hdr->type == TYPE_WII_GAME)
|
|
|
|
strncpy(m_plugin.PluginMagicWord, "4E574949", 9);
|
|
|
|
else if(hdr->type == TYPE_GC_GAME)
|
|
|
|
strncpy(m_plugin.PluginMagicWord, "4E47434D", 9);
|
|
|
|
else
|
|
|
|
strncpy(m_plugin.PluginMagicWord, "4E414E44", 9);
|
|
|
|
}
|
|
|
|
m_cfg.setString(PLUGIN_DOMAIN, "cur_magic", m_plugin.PluginMagicWord);
|
|
|
|
m_cfg.setString("plugin_item", m_plugin.PluginMagicWord, title);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_cfg.setString(_domainFromView(), "current_item", title);
|
|
|
|
if(m_source_cnt > 1)
|
|
|
|
m_cfg.setInt("MULTI", "current_item_type", hdr->type);
|
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
}
|
|
|
|
|
2012-01-21 21:57:41 +01:00
|
|
|
void CMenu::_hideGame(bool instant)
|
|
|
|
{
|
2014-03-18 03:39:42 +01:00
|
|
|
_cleanupVideo();
|
2018-10-16 01:43:49 +02:00
|
|
|
m_fa.unload();
|
|
|
|
CoverFlow.showCover();
|
|
|
|
|
2012-01-21 21:57:41 +01:00
|
|
|
m_btnMgr.hide(m_gameBtnPlay, instant);
|
2012-07-04 00:08:51 +02:00
|
|
|
m_btnMgr.hide(m_gameBtnBack, instant);
|
|
|
|
m_btnMgr.hide(m_gameBtnPlayFull, instant);
|
|
|
|
m_btnMgr.hide(m_gameBtnBackFull, instant);
|
2012-01-21 21:57:41 +01:00
|
|
|
m_btnMgr.hide(m_gameBtnDelete, instant);
|
|
|
|
m_btnMgr.hide(m_gameBtnSettings, instant);
|
2016-04-02 19:19:19 +02:00
|
|
|
m_btnMgr.hide(m_gameBtnToggle, instant);
|
|
|
|
m_btnMgr.hide(m_gameBtnToggleFull, instant);
|
2012-01-21 21:57:41 +01:00
|
|
|
m_btnMgr.hide(m_gameBtnFavoriteOn, instant);
|
|
|
|
m_btnMgr.hide(m_gameBtnFavoriteOff, instant);
|
|
|
|
m_btnMgr.hide(m_gameBtnAdultOn, instant);
|
|
|
|
m_btnMgr.hide(m_gameBtnAdultOff, instant);
|
2012-07-05 15:15:23 +02:00
|
|
|
for(u8 i = 0; i < ARRAY_SIZE(m_gameLblUser); ++i)
|
2012-09-13 16:54:17 +02:00
|
|
|
if(m_gameLblUser[i] != -1)
|
2012-01-21 21:57:41 +01:00
|
|
|
m_btnMgr.hide(m_gameLblUser[i], instant);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CMenu::_showGame(void)
|
|
|
|
{
|
2018-10-16 01:43:49 +02:00
|
|
|
CoverFlow.showCover();
|
2018-10-17 20:01:54 +02:00
|
|
|
|
|
|
|
const dir_discHdr *GameHdr = CoverFlow.getHdr();
|
2018-10-17 16:00:01 +02:00
|
|
|
const char *coverDir = NULL;
|
|
|
|
const char *Path = NULL;
|
2018-10-17 20:01:54 +02:00
|
|
|
if(GameHdr->type == TYPE_PLUGIN)
|
|
|
|
coverDir = m_plugin.GetCoverFolderName(GameHdr->settings[0]);
|
2018-10-17 16:00:01 +02:00
|
|
|
|
|
|
|
if(coverDir == NULL || strlen(coverDir) == 0)
|
|
|
|
Path = fmt("%s", m_fanartDir.c_str());
|
|
|
|
else
|
|
|
|
Path = fmt("%s/%s", m_fanartDir.c_str(), coverDir);
|
2018-10-17 20:01:54 +02:00
|
|
|
if(m_fa.load(m_cfg, Path, CoverFlow.getFilenameId(GameHdr, false), GameHdr->type == TYPE_PLUGIN))
|
2018-10-16 01:43:49 +02:00
|
|
|
{
|
|
|
|
const TexData *bg = NULL;
|
|
|
|
const TexData *bglq = NULL;
|
|
|
|
m_fa.getBackground(bg, bglq);
|
|
|
|
if(bg != NULL && bglq != NULL)
|
|
|
|
_setBg(*bg, *bglq);
|
2018-10-25 00:05:02 +02:00
|
|
|
CoverFlow.hideCover();
|
2018-10-16 01:43:49 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
_setBg(m_gameBg, m_gameBgLQ);
|
2017-09-22 00:03:41 +02:00
|
|
|
return;
|
2018-10-17 20:01:54 +02:00
|
|
|
|
2012-07-04 00:08:51 +02:00
|
|
|
if(!m_zoom_banner)
|
|
|
|
{
|
2012-09-20 17:50:47 +02:00
|
|
|
for(u8 i = 0; i < ARRAY_SIZE(m_gameLblUser) - 1; ++i)
|
2012-09-13 16:54:17 +02:00
|
|
|
if(m_gameLblUser[i] != -1)
|
2012-07-04 00:08:51 +02:00
|
|
|
m_btnMgr.show(m_gameLblUser[i]);
|
2016-12-05 15:12:23 +01:00
|
|
|
|
2012-07-04 00:08:51 +02:00
|
|
|
m_btnMgr.show(m_gameBtnPlay);
|
|
|
|
m_btnMgr.show(m_gameBtnBack);
|
2016-04-02 19:19:19 +02:00
|
|
|
m_btnMgr.show(m_gameBtnToggle);
|
2012-07-04 00:08:51 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_btnMgr.show(m_gameBtnPlayFull);
|
|
|
|
m_btnMgr.show(m_gameBtnBackFull);
|
2016-04-02 19:19:19 +02:00
|
|
|
m_btnMgr.show(m_gameBtnToggleFull);
|
2012-07-04 00:08:51 +02:00
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
|
2014-03-18 03:39:42 +01:00
|
|
|
void CMenu::_cleanupBanner(bool gamechange)
|
|
|
|
{
|
|
|
|
//banner
|
|
|
|
m_gameSound.FreeMemory();
|
2017-04-18 01:23:50 +02:00
|
|
|
_stopGameSoundThread();// stop banner and gamesound loading
|
2014-03-18 03:39:42 +01:00
|
|
|
m_banner.DeleteBanner(gamechange);
|
|
|
|
//movie
|
|
|
|
_cleanupVideo();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CMenu::_cleanupVideo()
|
|
|
|
{
|
|
|
|
m_video_playing = false;
|
|
|
|
movie.DeInit();
|
|
|
|
}
|
|
|
|
|
2014-03-22 22:32:40 +01:00
|
|
|
static const char *getVideoPath(const string &videoDir, const char *videoId)
|
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
const char *coverDir = NULL;
|
2014-03-22 22:32:40 +01:00
|
|
|
const char *videoPath = NULL;
|
2017-05-15 19:50:24 +02:00
|
|
|
if(CoverFlow.getHdr()->type == TYPE_PLUGIN)
|
|
|
|
coverDir = m_plugin.GetCoverFolderName(CoverFlow.getHdr()->settings[0]);
|
|
|
|
|
2014-03-22 22:32:40 +01:00
|
|
|
if(coverDir == NULL || strlen(coverDir) == 0)
|
|
|
|
videoPath = fmt("%s/%s", videoDir.c_str(), videoId);
|
|
|
|
else
|
|
|
|
videoPath = fmt("%s/%s/%s", videoDir.c_str(), coverDir, videoId);
|
|
|
|
return videoPath;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *getVideoDefaultPath(const string &videoDir)
|
|
|
|
{
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
//strncpy(m_plugin.PluginMagicWord, fmt("%08x", CoverFlow.getHdr()->settings[0]), 8);
|
2016-04-03 03:03:39 +02:00
|
|
|
const char *videoPath = fmt("%s/%s", videoDir.c_str(), m_plugin.PluginMagicWord);
|
2014-03-22 22:32:40 +01:00
|
|
|
return videoPath;
|
|
|
|
}
|
|
|
|
|
2014-03-18 03:39:42 +01:00
|
|
|
bool CMenu::_startVideo()
|
|
|
|
{
|
2016-12-01 01:05:39 +01:00
|
|
|
const dir_discHdr *GameHdr = CoverFlow.getHdr();
|
2014-03-18 03:39:42 +01:00
|
|
|
char curId3[4];
|
|
|
|
memset(curId3, 0, 4);
|
2018-05-08 15:49:43 +02:00
|
|
|
const char *videoId = CoverFlow.getFilenameId(GameHdr);//title.ext
|
2016-12-01 01:05:39 +01:00
|
|
|
if(!NoGameID(GameHdr->type))
|
2014-03-18 03:39:42 +01:00
|
|
|
{ //id3
|
2016-12-01 01:05:39 +01:00
|
|
|
memcpy(curId3, GameHdr->id, 3);
|
2014-03-18 03:39:42 +01:00
|
|
|
videoId = curId3;
|
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
//dev:/wiiflow/trailers/{coverfolder}/title.ext.thp or dev:/wiiflow/trailers/id3.thp
|
2014-03-22 22:32:40 +01:00
|
|
|
const char *videoPath = getVideoPath(m_videoDir, videoId);
|
|
|
|
const char *THP_Path = fmt("%s.thp", videoPath);
|
2014-05-25 22:54:39 +02:00
|
|
|
if(!fsop_FileExist(THP_Path))
|
2014-03-22 22:32:40 +01:00
|
|
|
{
|
2016-12-01 01:05:39 +01:00
|
|
|
if(GameHdr->type == TYPE_PLUGIN)
|
2014-05-25 22:54:39 +02:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
//dev:/wiiflow/trailers/magic#.thp
|
2014-05-25 22:54:39 +02:00
|
|
|
videoPath = getVideoDefaultPath(m_videoDir);
|
|
|
|
THP_Path = fmt("%s.thp", videoPath);
|
|
|
|
}
|
2016-12-01 01:05:39 +01:00
|
|
|
else if(!NoGameID(GameHdr->type))
|
2014-05-25 22:54:39 +02:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
//id6
|
2016-12-01 01:05:39 +01:00
|
|
|
videoPath = getVideoPath(m_videoDir, GameHdr->id);
|
2014-05-25 22:54:39 +02:00
|
|
|
THP_Path = fmt("%s.thp", videoPath);
|
|
|
|
}
|
2014-03-22 22:32:40 +01:00
|
|
|
}
|
|
|
|
if(fsop_FileExist(THP_Path))
|
2014-03-18 03:39:42 +01:00
|
|
|
{
|
2014-03-22 22:32:40 +01:00
|
|
|
m_gameSound.FreeMemory();
|
2017-04-18 01:23:50 +02:00
|
|
|
_stopGameSoundThread();
|
2014-03-18 03:39:42 +01:00
|
|
|
m_banner.SetShowBanner(false);
|
|
|
|
/* Lets play the movie */
|
2014-03-22 22:32:40 +01:00
|
|
|
movie.Init(THP_Path);
|
|
|
|
m_gameSound.Load(fmt("%s.ogg", videoPath));
|
2014-03-18 03:39:42 +01:00
|
|
|
m_gameSound.SetVolume(m_cfg.getInt("GENERAL", "sound_volume_bnr", 255));
|
|
|
|
m_video_playing = true;
|
|
|
|
m_gameSound.Play();
|
|
|
|
movie.Play(true); //video loops sound doesnt
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-02-01 23:26:51 +01:00
|
|
|
void CMenu::_game(bool launch)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
m_banner_loaded = false;
|
2016-06-10 01:02:40 +02:00
|
|
|
bool coverFlipped = false;
|
|
|
|
int cf_version = 1;
|
|
|
|
string domain;
|
|
|
|
string key;
|
|
|
|
Vector3D v;
|
|
|
|
Vector3D savedv;
|
|
|
|
|
|
|
|
dir_discHdr *hdr = (dir_discHdr*)MEM2_alloc(sizeof(dir_discHdr));
|
|
|
|
memcpy(hdr, CoverFlow.getHdr(), sizeof(dir_discHdr));
|
2018-05-01 00:31:29 +02:00
|
|
|
if(hdr->type == TYPE_HOMEBREW)
|
|
|
|
launch = true;
|
2017-05-15 19:50:24 +02:00
|
|
|
_setCurrentItem(hdr);
|
2016-06-10 01:02:40 +02:00
|
|
|
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
const char *id = NULL;
|
2016-12-01 01:05:39 +01:00
|
|
|
char tmp1[74];// title/magic#
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
memset(tmp1, 0, 74);
|
|
|
|
char tmp2[64];
|
|
|
|
memset(tmp2, 0, 64);
|
|
|
|
if(hdr->type == TYPE_PLUGIN)
|
|
|
|
{
|
|
|
|
strncpy(m_plugin.PluginMagicWord, fmt("%08x", hdr->settings[0]), 8);
|
|
|
|
wcstombs(tmp2, hdr->title, 64);
|
|
|
|
strcat(tmp1, m_plugin.PluginMagicWord);
|
|
|
|
strcat(tmp1, fmt("/%s", tmp2));
|
|
|
|
id = tmp1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
id = hdr->id;
|
|
|
|
if(hdr->type == TYPE_GC_GAME && hdr->settings[0] == 1) /* disc 2 */
|
|
|
|
{
|
|
|
|
strcat(tmp1, fmt("%.6s_2", hdr->id));
|
|
|
|
id = tmp1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-18 03:39:42 +01:00
|
|
|
m_zoom_banner = m_cfg.getBool(_domainFromView(), "show_full_banner", false);
|
2017-05-15 19:50:24 +02:00
|
|
|
|
2014-03-18 03:39:42 +01:00
|
|
|
if(m_banner.GetZoomSetting() != m_zoom_banner)
|
2016-04-02 19:19:19 +02:00
|
|
|
m_banner.ToggleZoom();
|
2014-03-18 03:39:42 +01:00
|
|
|
|
2017-05-15 19:50:24 +02:00
|
|
|
if(m_banner.GetInGameSettings())
|
|
|
|
m_banner.ToggleGameSettings();
|
|
|
|
m_gameSelected = true;
|
2016-04-13 17:52:33 +02:00
|
|
|
s8 startGameSound = -7;
|
|
|
|
SetupInput();
|
2012-06-01 07:34:52 +02:00
|
|
|
|
2012-09-09 20:35:15 +02:00
|
|
|
while(!m_exit)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2018-10-25 00:05:02 +02:00
|
|
|
if(m_fa.isLoaded() && m_fa.isAnimationComplete())
|
|
|
|
{
|
|
|
|
if(m_fa.noLoop())
|
|
|
|
{
|
|
|
|
m_fa.unload();
|
|
|
|
CoverFlow.showCover();
|
|
|
|
_setBg(m_gameBg, m_gameBgLQ);
|
|
|
|
}
|
|
|
|
else //loop fanart
|
|
|
|
m_fa.reset();
|
|
|
|
}
|
2012-06-01 07:34:52 +02:00
|
|
|
if(startGameSound < 1)
|
|
|
|
startGameSound++;
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2012-06-01 07:34:52 +02:00
|
|
|
if(startGameSound == -5)
|
2018-10-25 00:05:02 +02:00
|
|
|
_showGame();// this also starts fanart with unloading previous fanart.
|
2016-04-13 16:16:41 +02:00
|
|
|
|
2016-04-13 17:52:33 +02:00
|
|
|
if(!launch)
|
|
|
|
_mainLoopCommon(true);
|
2017-04-18 01:23:50 +02:00
|
|
|
|
2012-06-01 07:34:52 +02:00
|
|
|
if(startGameSound == 0)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
|
|
|
startGameSound = 1;
|
2014-03-18 03:39:42 +01:00
|
|
|
_playGameSound();
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2016-12-01 01:05:39 +01:00
|
|
|
/* move and zoom flipped cover */
|
2017-05-15 19:50:24 +02:00
|
|
|
if(coverFlipped)
|
2016-06-10 01:02:40 +02:00
|
|
|
{
|
|
|
|
float step = 0.05f;
|
|
|
|
if(BTN_PLUS_PRESSED || BTN_MINUS_PRESSED)
|
|
|
|
{
|
|
|
|
if(BTN_MINUS_PRESSED)
|
|
|
|
step = -step;
|
|
|
|
v.z = min(max(-15.f, v.z + step), 15.f);
|
|
|
|
}
|
|
|
|
else if(BTN_LEFT_PRESSED || BTN_RIGHT_PRESSED)
|
|
|
|
{
|
2016-12-01 01:05:39 +01:00
|
|
|
if(BTN_RIGHT_PRESSED)
|
2016-06-10 01:02:40 +02:00
|
|
|
step = -step;
|
|
|
|
v.x = min(max(-15.f, v.x + step), 15.f);
|
|
|
|
}
|
|
|
|
else if(BTN_UP_PRESSED || BTN_DOWN_PRESSED)
|
|
|
|
{
|
|
|
|
if(BTN_UP_PRESSED)
|
|
|
|
step = -step;
|
|
|
|
v.y = min(max(-15.f, v.y + step), 15.f);
|
|
|
|
}
|
2016-06-20 23:03:40 +02:00
|
|
|
CoverFlow.setCoverFlipPos(v);
|
2016-06-10 01:02:40 +02:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
/* exit game menu */
|
|
|
|
if(BTN_HOME_PRESSED)
|
2012-05-04 21:31:05 +02:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
_cleanupBanner();// also cleans up trailer movie including trailer sound
|
|
|
|
break;
|
2012-05-04 21:31:05 +02:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
else if(BTN_B_PRESSED)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
/* de flip cover */
|
|
|
|
if(coverFlipped)
|
2016-06-22 21:34:58 +02:00
|
|
|
{
|
|
|
|
CoverFlow.flip();
|
|
|
|
coverFlipped = false;
|
2017-05-15 19:50:24 +02:00
|
|
|
m_banner.SetShowBanner(true);
|
|
|
|
}
|
|
|
|
/* if B on favorites btn goto game categories */
|
|
|
|
else if(m_btnMgr.selected(m_gameBtnFavoriteOn) || m_btnMgr.selected(m_gameBtnFavoriteOff))
|
|
|
|
{
|
|
|
|
_hideGame();
|
|
|
|
if(m_locked)
|
|
|
|
{
|
|
|
|
m_banner.SetShowBanner(false);
|
|
|
|
error(_t("errgame15", L"WiiFlow locked! Unlock WiiFlow to use this feature."));
|
|
|
|
m_banner.SetShowBanner(true);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// the mainloop handles drawing banner while in settings
|
|
|
|
m_banner.ToggleZoom();//zoom to full
|
|
|
|
m_banner.ToggleGameSettings();// dim brightness
|
|
|
|
_CategorySettings(true);
|
|
|
|
m_banner.ToggleGameSettings();//reset brightness
|
|
|
|
m_banner.ToggleZoom();//de zoom to small
|
|
|
|
}
|
|
|
|
_showGame();
|
|
|
|
if(m_newGame)
|
|
|
|
startGameSound = -10;
|
2016-06-22 21:34:58 +02:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
/* exit game selected menu */
|
2016-06-22 21:34:58 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
_cleanupBanner();
|
|
|
|
break;
|
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
/* display game info screen */
|
2018-12-30 23:00:51 +01:00
|
|
|
else if(BTN_PLUS_PRESSED && hdr->type != TYPE_HOMEBREW && hdr->type != TYPE_SOURCE && !coverFlipped && !m_video_playing)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
_hideGame();// stops trailer movie too
|
|
|
|
m_banner.SetShowBanner(false);
|
|
|
|
_gameinfo();
|
|
|
|
_showGame();
|
|
|
|
m_banner.SetShowBanner(true);
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
/* play or stop a trailer video */
|
|
|
|
else if(BTN_MINUS_PRESSED && !coverFlipped)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2014-03-18 03:39:42 +01:00
|
|
|
if(m_video_playing)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
|
|
|
m_video_playing = false;
|
2014-03-18 03:39:42 +01:00
|
|
|
movie.DeInit();
|
|
|
|
m_gameSound.FreeMemory();
|
2012-10-13 18:57:03 +02:00
|
|
|
m_banner.SetShowBanner(true);
|
2014-03-18 03:39:42 +01:00
|
|
|
if(!m_gameSound.IsPlaying())
|
2012-08-26 17:20:51 +02:00
|
|
|
startGameSound = -6;
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2014-03-18 03:39:42 +01:00
|
|
|
else
|
|
|
|
_startVideo();
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
/* switch coverflow layout */
|
|
|
|
else if((BTN_1_PRESSED || BTN_2_PRESSED) && !coverFlipped && !m_video_playing)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
|
|
|
s8 direction = BTN_1_PRESSED ? 1 : -1;
|
2016-11-07 16:06:00 +01:00
|
|
|
int cfVersion = loopNum((_getCFVersion() - 1) + direction, m_numCFVersions) + 1;
|
2012-01-21 21:57:41 +01:00
|
|
|
_loadCFLayout(cfVersion);
|
2012-11-11 19:28:03 +01:00
|
|
|
CoverFlow.applySettings();
|
2016-11-07 16:06:00 +01:00
|
|
|
_setCFVersion(cfVersion);
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2012-06-01 07:34:52 +02:00
|
|
|
else if(launch || BTN_A_PRESSED)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2018-10-25 00:05:02 +02:00
|
|
|
if(m_fa.isLoaded() && ShowPointer())
|
|
|
|
{
|
|
|
|
m_fa.unload();
|
|
|
|
CoverFlow.showCover();
|
|
|
|
_setBg(m_gameBg, m_gameBgLQ);
|
|
|
|
continue;
|
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
/* delete button */
|
2018-10-25 00:05:02 +02:00
|
|
|
else if(m_btnMgr.selected(m_gameBtnDelete))
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
_hideGame();
|
|
|
|
m_banner.SetShowBanner(false);
|
2016-12-01 01:05:39 +01:00
|
|
|
if(m_locked)
|
|
|
|
error(_t("errgame15", L"WiiFlow locked! Unlock WiiFlow to use this feature."));
|
|
|
|
else if(hdr->type == TYPE_CHANNEL)
|
|
|
|
error(_t("errgame17", L"Can not delete real NAND Channels!"));
|
2017-05-15 19:50:24 +02:00
|
|
|
else /* delete wii, gamecube, emunand game or plugin rom */
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
{
|
|
|
|
if(_wbfsOp(WO_REMOVE_GAME))
|
2016-06-10 01:02:40 +02:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
m_refreshGameList = false;
|
|
|
|
_setCurrentItem(CoverFlow.getNextHdr());
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
_cleanupBanner();
|
2017-05-15 19:50:24 +02:00
|
|
|
_loadList();
|
|
|
|
_initCF();
|
|
|
|
CoverFlow.select();
|
|
|
|
CoverFlow.applySettings();
|
|
|
|
startGameSound = -10;
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
}
|
2016-12-01 01:05:39 +01:00
|
|
|
_showGame();
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
m_banner.SetShowBanner(true);
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2016-12-01 01:05:39 +01:00
|
|
|
else if(m_btnMgr.selected(m_gameBtnSettings))
|
2016-11-07 16:06:00 +01:00
|
|
|
{
|
|
|
|
_hideGame();
|
2016-12-01 01:05:39 +01:00
|
|
|
if(m_locked)
|
|
|
|
{
|
|
|
|
m_banner.SetShowBanner(false);
|
|
|
|
error(_t("errgame15", L"WiiFlow locked! Unlock WiiFlow to use this feature."));
|
|
|
|
m_banner.SetShowBanner(true);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
// the mainloop handles drawing banner while in settings
|
|
|
|
m_banner.ToggleZoom();//zoom to full
|
|
|
|
m_banner.ToggleGameSettings();// dim brightness
|
2017-04-18 01:23:50 +02:00
|
|
|
_gameSettings(hdr);
|
2017-05-15 19:50:24 +02:00
|
|
|
m_banner.ToggleGameSettings();//reset brightness
|
|
|
|
m_banner.ToggleZoom();//de zoom to small
|
2016-12-01 01:05:39 +01:00
|
|
|
}
|
2016-11-07 16:06:00 +01:00
|
|
|
_showGame();
|
2017-05-15 19:50:24 +02:00
|
|
|
if(m_newGame)
|
|
|
|
startGameSound = -10;
|
2016-11-07 16:06:00 +01:00
|
|
|
}
|
2012-06-01 07:34:52 +02:00
|
|
|
else if(m_btnMgr.selected(m_gameBtnFavoriteOn) || m_btnMgr.selected(m_gameBtnFavoriteOff))
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
{
|
|
|
|
if(hdr->type == TYPE_PLUGIN)
|
|
|
|
m_gcfg1.setBool("FAVORITES_PLUGINS", id, !m_gcfg1.getBool("FAVORITES_PLUGINS", id, false));
|
|
|
|
else
|
|
|
|
m_gcfg1.setBool("FAVORITES", id, !m_gcfg1.getBool("FAVORITES", id, false));
|
2017-05-15 19:50:24 +02:00
|
|
|
if(m_favorites)
|
|
|
|
m_refreshGameList = true;
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
}
|
2016-12-01 01:05:39 +01:00
|
|
|
else if(m_btnMgr.selected(m_gameBtnAdultOn) || m_btnMgr.selected(m_gameBtnAdultOff))
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
{
|
2016-12-01 01:05:39 +01:00
|
|
|
if(m_locked)
|
|
|
|
{
|
|
|
|
m_banner.SetShowBanner(false);
|
|
|
|
error(_t("errgame15", L"WiiFlow locked! Unlock WiiFlow to use this feature."));
|
|
|
|
m_banner.SetShowBanner(true);
|
|
|
|
_showGame();
|
|
|
|
}
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
else
|
2016-12-01 01:05:39 +01:00
|
|
|
{
|
|
|
|
if(hdr->type == TYPE_PLUGIN)
|
|
|
|
m_gcfg1.setBool("ADULTONLY_PLUGINS", id, !m_gcfg1.getBool("ADULTONLY_PLUGINS", id, false));
|
|
|
|
else
|
|
|
|
m_gcfg1.setBool("ADULTONLY", id, !m_gcfg1.getBool("ADULTONLY", id, false));
|
2017-05-15 19:50:24 +02:00
|
|
|
if(m_locked)
|
|
|
|
m_refreshGameList = true;
|
2016-12-01 01:05:39 +01:00
|
|
|
}
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
}
|
2012-07-04 00:08:51 +02:00
|
|
|
else if(m_btnMgr.selected(m_gameBtnBack) || m_btnMgr.selected(m_gameBtnBackFull))
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2014-03-18 03:39:42 +01:00
|
|
|
_cleanupBanner();
|
2012-07-04 21:45:53 +02:00
|
|
|
break;
|
|
|
|
}
|
2017-09-22 00:03:41 +02:00
|
|
|
else if(m_btnMgr.selected(m_gameBtnToggle) || m_btnMgr.selected(m_gameBtnToggleFull))
|
2012-07-04 21:45:53 +02:00
|
|
|
{
|
2016-04-02 19:19:19 +02:00
|
|
|
m_zoom_banner = m_banner.ToggleZoom();
|
2012-07-04 13:56:02 +02:00
|
|
|
m_cfg.setBool(_domainFromView(), "show_full_banner", m_zoom_banner);
|
|
|
|
m_show_zone_game = false;
|
2012-12-24 16:33:53 +01:00
|
|
|
m_btnMgr.hide(m_gameBtnPlayFull);
|
|
|
|
m_btnMgr.hide(m_gameBtnBackFull);
|
2016-04-02 19:19:19 +02:00
|
|
|
m_btnMgr.hide(m_gameBtnToggleFull);
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
else if(launch || m_btnMgr.selected(m_gameBtnPlay) || m_btnMgr.selected(m_gameBtnPlayFull) ||
|
|
|
|
(!ShowPointer() && !m_video_playing && !coverFlipped))
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
|
|
|
_hideGame();
|
2018-08-01 14:27:12 +02:00
|
|
|
if(isWiiVC && (hdr->type == TYPE_WII_GAME || hdr->type == TYPE_EMUCHANNEL))
|
2013-01-15 14:54:33 +01:00
|
|
|
{
|
2018-08-01 14:27:12 +02:00
|
|
|
error(_t("errgame19", L"Can't launch in Wii virtual console mode!"));
|
|
|
|
launch = false;
|
|
|
|
_showGame();
|
2013-01-15 14:54:33 +01:00
|
|
|
}
|
2018-08-01 14:27:12 +02:00
|
|
|
else
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2018-08-01 14:27:12 +02:00
|
|
|
MusicPlayer.Stop();
|
|
|
|
_cleanupBanner();
|
|
|
|
m_cfg.setInt("GENERAL", "cat_startpage", m_catStartPage);
|
|
|
|
m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str()));
|
|
|
|
/* change to current game's partition */
|
|
|
|
switch(hdr->type)
|
2018-07-16 15:08:45 +02:00
|
|
|
{
|
2018-08-01 14:27:12 +02:00
|
|
|
case TYPE_CHANNEL:
|
|
|
|
case TYPE_EMUCHANNEL:
|
|
|
|
currentPartition = m_cfg.getInt(CHANNEL_DOMAIN, "partition", 1);
|
|
|
|
break;
|
|
|
|
case TYPE_HOMEBREW:
|
|
|
|
currentPartition = m_cfg.getInt(HOMEBREW_DOMAIN, "partition", 1);
|
|
|
|
break;
|
|
|
|
case TYPE_GC_GAME:
|
|
|
|
currentPartition = m_cfg.getInt(GC_DOMAIN, "partition", 1);
|
|
|
|
break;
|
|
|
|
case TYPE_WII_GAME:
|
|
|
|
currentPartition = m_cfg.getInt(WII_DOMAIN, "partition", 1);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
int romsPartition = m_plugin.GetRomPartition(m_plugin.GetPluginPosition(hdr->settings[0]));
|
|
|
|
if(romsPartition < 0)
|
|
|
|
romsPartition = m_cfg.getInt(PLUGIN_DOMAIN, "partition", 0);
|
|
|
|
currentPartition = romsPartition;
|
|
|
|
break;
|
2018-07-16 15:08:45 +02:00
|
|
|
}
|
2014-03-01 00:11:02 +01:00
|
|
|
|
2018-08-01 14:27:12 +02:00
|
|
|
/* Get Banner Title for Playlog */
|
|
|
|
if(hdr->type == TYPE_WII_GAME || hdr->type == TYPE_CHANNEL || hdr->type == TYPE_EMUCHANNEL)
|
|
|
|
{
|
|
|
|
NANDemuView = hdr->type == TYPE_EMUCHANNEL;
|
|
|
|
CurrentBanner.ClearBanner();
|
|
|
|
if(hdr->type == TYPE_CHANNEL || hdr->type == TYPE_EMUCHANNEL)
|
|
|
|
{
|
|
|
|
u64 chantitle = CoverFlow.getChanTitle();
|
|
|
|
ChannelHandle.GetBanner(chantitle);
|
|
|
|
}
|
|
|
|
else if(hdr->type == TYPE_WII_GAME)
|
|
|
|
_extractBnr(hdr);
|
|
|
|
u8 banner_title[84];
|
|
|
|
memset(banner_title, 0, 84);
|
|
|
|
if(CurrentBanner.IsValid())
|
|
|
|
CurrentBanner.GetName(banner_title, GetLanguage(m_loc.getString(m_curLanguage, "gametdb_code", "EN").c_str()));
|
|
|
|
if(Playlog_Update(hdr->id, banner_title) < 0)
|
|
|
|
Playlog_Delete();
|
|
|
|
CurrentBanner.ClearBanner();
|
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2018-08-01 14:27:12 +02:00
|
|
|
/* Finally boot it */
|
|
|
|
gprintf("Launching game %s\n", hdr->id);
|
2018-12-24 14:42:31 +01:00
|
|
|
if(hdr->type == TYPE_EMUCHANNEL)
|
|
|
|
gprintf("from emu nand\n");
|
|
|
|
else if(hdr->type == TYPE_CHANNEL)
|
|
|
|
gprintf("from real nand\n");
|
2018-08-01 14:27:12 +02:00
|
|
|
_launch(hdr);
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2018-08-01 14:27:12 +02:00
|
|
|
if(m_exit)
|
|
|
|
break;
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2018-08-01 14:27:12 +02:00
|
|
|
_hideWaitMessage();
|
|
|
|
launch = false;
|
|
|
|
|
|
|
|
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());
|
|
|
|
m_gcfg2.unload();
|
|
|
|
_showGame();
|
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2016-06-22 21:34:58 +02:00
|
|
|
else if(!coverFlipped)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
/* flip cover if mouse over */
|
2012-01-21 21:57:41 +01:00
|
|
|
for(int chan = WPAD_MAX_WIIMOTES-1; chan >= 0; chan--)
|
2016-06-10 01:02:40 +02:00
|
|
|
{
|
|
|
|
if(CoverFlow.mouseOver(m_cursor[chan].x(), m_cursor[chan].y()))
|
|
|
|
{
|
2016-11-07 16:06:00 +01:00
|
|
|
cf_version = _getCFVersion();
|
2016-06-10 01:02:40 +02:00
|
|
|
domain = fmt("%s_%i_S", cf_domain, cf_version);
|
|
|
|
key = "flip_pos";
|
|
|
|
if(!m_vid.wide())
|
|
|
|
key += "_4_3";
|
2016-06-22 21:34:58 +02:00
|
|
|
v = m_coverflow.getVector3D(domain, key);
|
|
|
|
coverFlipped = true;
|
|
|
|
CoverFlow.flip();
|
2017-05-15 19:50:24 +02:00
|
|
|
m_banner.SetShowBanner(false);
|
2016-06-10 01:02:40 +02:00
|
|
|
}
|
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
if(!coverFlipped && !m_video_playing)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
/* move to new cover if needed */
|
2016-06-10 01:02:40 +02:00
|
|
|
if((startGameSound == 1 || startGameSound < -8) && (BTN_UP_REPEAT || RIGHT_STICK_UP))
|
|
|
|
{
|
|
|
|
CoverFlow.up();
|
|
|
|
startGameSound = -10;
|
|
|
|
}
|
|
|
|
if((startGameSound == 1 || startGameSound < -8) && (BTN_RIGHT_REPEAT || RIGHT_STICK_RIGHT))
|
|
|
|
{
|
|
|
|
CoverFlow.right();
|
|
|
|
startGameSound = -10;
|
|
|
|
}
|
|
|
|
if((startGameSound == 1 || startGameSound < -8) && (BTN_DOWN_REPEAT || RIGHT_STICK_DOWN))
|
|
|
|
{
|
|
|
|
CoverFlow.down();
|
|
|
|
startGameSound = -10;
|
|
|
|
}
|
|
|
|
if((startGameSound == 1 || startGameSound < -8) && (BTN_LEFT_REPEAT || RIGHT_STICK_LEFT))
|
|
|
|
{
|
|
|
|
CoverFlow.left();
|
|
|
|
startGameSound = -10;
|
|
|
|
}
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
if(startGameSound == -10)// if -10 then we moved to new cover
|
2016-06-10 01:02:40 +02:00
|
|
|
{
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
memcpy(hdr, CoverFlow.getHdr(), sizeof(dir_discHdr));// get new game header
|
2017-05-15 19:50:24 +02:00
|
|
|
_setCurrentItem(hdr);
|
|
|
|
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
memset(tmp1, 0, 74);
|
|
|
|
memset(tmp2, 0, 64);
|
|
|
|
if(hdr->type == TYPE_PLUGIN)
|
|
|
|
{
|
|
|
|
strncpy(m_plugin.PluginMagicWord, fmt("%08x", hdr->settings[0]), 8);
|
|
|
|
wcstombs(tmp2, hdr->title, 64);
|
|
|
|
strcat(tmp1, m_plugin.PluginMagicWord);
|
|
|
|
strcat(tmp1, fmt("/%s", tmp2));
|
|
|
|
id = tmp1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
id = hdr->id;
|
|
|
|
if(hdr->type == TYPE_GC_GAME && hdr->settings[0] == 1) /* disc 2 */
|
|
|
|
{
|
|
|
|
strcat(tmp1, fmt("%.6s_2", hdr->id));
|
|
|
|
id = tmp1;
|
|
|
|
}
|
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
if(m_newGame)
|
2016-12-05 15:12:23 +01:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
m_newGame = false;
|
|
|
|
startGameSound = 1;
|
|
|
|
_playGameSound();
|
2016-12-05 15:12:23 +01:00
|
|
|
}
|
2016-06-10 01:02:40 +02:00
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
|
2017-09-22 00:03:41 +02:00
|
|
|
/* showing and hiding buttons based on banner zoomed state */
|
2018-10-25 00:05:02 +02:00
|
|
|
if(!m_zoom_banner && !m_fa.isLoaded())
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
/* always hide full banner buttons */
|
2016-12-01 01:05:39 +01:00
|
|
|
m_btnMgr.hide(m_gameBtnPlayFull);
|
|
|
|
m_btnMgr.hide(m_gameBtnBackFull);
|
|
|
|
m_btnMgr.hide(m_gameBtnToggleFull);
|
|
|
|
|
2017-09-22 00:03:41 +02:00
|
|
|
if(m_show_zone_game && !coverFlipped && !m_video_playing)
|
|
|
|
{
|
|
|
|
m_btnMgr.show(m_gameBtnPlay);
|
|
|
|
m_btnMgr.show(m_gameBtnBack);
|
|
|
|
m_btnMgr.show(m_gameBtnSettings);
|
|
|
|
m_btnMgr.show(m_gameBtnDelete);
|
|
|
|
bool b;
|
|
|
|
if(hdr->type == TYPE_PLUGIN)
|
|
|
|
b = m_gcfg1.getBool("FAVORITES_PLUGINS", id, false);
|
|
|
|
else
|
|
|
|
b = m_gcfg1.getBool("FAVORITES", id, false);
|
|
|
|
m_btnMgr.show(b ? m_gameBtnFavoriteOn : m_gameBtnFavoriteOff);
|
|
|
|
m_btnMgr.hide(b ? m_gameBtnFavoriteOff : m_gameBtnFavoriteOn);
|
|
|
|
if(hdr->type == TYPE_PLUGIN)
|
|
|
|
b = m_gcfg1.getBool("ADULTONLY_PLUGINS", id, false);
|
|
|
|
else
|
|
|
|
b = m_gcfg1.getBool("ADULTONLY", id, false);
|
|
|
|
m_btnMgr.show(b ? m_gameBtnAdultOn : m_gameBtnAdultOff);
|
|
|
|
m_btnMgr.hide(b ? m_gameBtnAdultOff : m_gameBtnAdultOn);
|
|
|
|
for(u8 i = 0; i < ARRAY_SIZE(m_gameLblUser) - 2; ++i)// #4 is used for banner frame
|
|
|
|
if(m_gameLblUser[i] != -1)
|
|
|
|
m_btnMgr.show(m_gameLblUser[i]);
|
|
|
|
}
|
2016-12-01 01:05:39 +01:00
|
|
|
else
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
|
|
|
m_btnMgr.hide(m_gameBtnFavoriteOn);
|
|
|
|
m_btnMgr.hide(m_gameBtnFavoriteOff);
|
|
|
|
m_btnMgr.hide(m_gameBtnAdultOn);
|
|
|
|
m_btnMgr.hide(m_gameBtnAdultOff);
|
|
|
|
m_btnMgr.hide(m_gameBtnSettings);
|
|
|
|
m_btnMgr.hide(m_gameBtnDelete);
|
|
|
|
m_btnMgr.hide(m_gameBtnPlay);
|
|
|
|
m_btnMgr.hide(m_gameBtnBack);
|
|
|
|
for(u8 i = 0; i < ARRAY_SIZE(m_gameLblUser) - 2; ++i)
|
|
|
|
if (m_gameLblUser[i] != -1)
|
|
|
|
m_btnMgr.hide(m_gameLblUser[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* show or hide small banner toggle btn and frame */
|
2018-10-17 16:00:01 +02:00
|
|
|
if(m_banner_loaded && !m_soundThrdBusy && !coverFlipped && !m_video_playing && !m_fa.isLoaded())
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
|
|
|
/* show only if the game has a banner */
|
|
|
|
m_btnMgr.show(m_gameBtnToggle);
|
|
|
|
if(m_gameLblUser[4] != -1)
|
|
|
|
m_btnMgr.show(m_gameLblUser[4]);
|
|
|
|
}
|
2016-12-01 01:05:39 +01:00
|
|
|
else
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
|
|
|
m_btnMgr.hide(m_gameBtnToggle);
|
|
|
|
if(m_gameLblUser[4] != -1)
|
|
|
|
m_btnMgr.hide(m_gameLblUser[4]);
|
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2018-10-25 00:05:02 +02:00
|
|
|
else if(!m_fa.isLoaded())// banner zoomed full screen
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
if(m_banner_loaded && !m_soundThrdBusy)// there is a banner
|
2012-07-04 00:08:51 +02:00
|
|
|
{
|
|
|
|
m_btnMgr.show(m_gameBtnPlayFull);
|
|
|
|
m_btnMgr.show(m_gameBtnBackFull);
|
2016-04-02 19:19:19 +02:00
|
|
|
m_btnMgr.show(m_gameBtnToggleFull);
|
2017-09-22 00:03:41 +02:00
|
|
|
|
|
|
|
m_btnMgr.hide(m_gameBtnFavoriteOn);
|
|
|
|
m_btnMgr.hide(m_gameBtnFavoriteOff);
|
|
|
|
m_btnMgr.hide(m_gameBtnAdultOn);
|
|
|
|
m_btnMgr.hide(m_gameBtnAdultOff);
|
|
|
|
m_btnMgr.hide(m_gameBtnSettings);
|
|
|
|
m_btnMgr.hide(m_gameBtnDelete);
|
|
|
|
m_btnMgr.hide(m_gameBtnPlay);
|
|
|
|
m_btnMgr.hide(m_gameBtnBack);
|
|
|
|
|
|
|
|
m_btnMgr.hide(m_gameBtnToggle);
|
2018-06-11 00:55:24 +02:00
|
|
|
for(u8 i = 0; i < ARRAY_SIZE(m_gameLblUser); ++i)
|
|
|
|
if(m_gameLblUser[i] != -1)
|
2017-09-22 00:03:41 +02:00
|
|
|
m_btnMgr.hide(m_gameLblUser[i]);
|
2012-07-04 00:08:51 +02:00
|
|
|
}
|
2017-09-22 00:03:41 +02:00
|
|
|
else // no banner for whatever reason
|
2017-05-15 19:50:24 +02:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
if(!m_soundThrdBusy)
|
|
|
|
{
|
|
|
|
m_btnMgr.hide(m_gameBtnPlayFull);
|
|
|
|
m_btnMgr.hide(m_gameBtnBackFull);
|
|
|
|
m_btnMgr.hide(m_gameBtnToggleFull);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(m_show_zone_game && !m_soundThrdBusy)
|
|
|
|
{
|
|
|
|
m_btnMgr.show(m_gameBtnPlay);
|
|
|
|
m_btnMgr.show(m_gameBtnBack);
|
|
|
|
m_btnMgr.show(m_gameBtnSettings);
|
|
|
|
m_btnMgr.show(m_gameBtnDelete);
|
|
|
|
bool b;
|
|
|
|
if(hdr->type == TYPE_PLUGIN)
|
|
|
|
b = m_gcfg1.getBool("FAVORITES_PLUGINS", id, false);
|
|
|
|
else
|
|
|
|
b = m_gcfg1.getBool("FAVORITES", id, false);
|
|
|
|
m_btnMgr.show(b ? m_gameBtnFavoriteOn : m_gameBtnFavoriteOff);
|
|
|
|
m_btnMgr.hide(b ? m_gameBtnFavoriteOff : m_gameBtnFavoriteOn);
|
|
|
|
if(hdr->type == TYPE_PLUGIN)
|
|
|
|
b = m_gcfg1.getBool("ADULTONLY_PLUGINS", id, false);
|
|
|
|
else
|
|
|
|
b = m_gcfg1.getBool("ADULTONLY", id, false);
|
|
|
|
m_btnMgr.show(b ? m_gameBtnAdultOn : m_gameBtnAdultOff);
|
|
|
|
m_btnMgr.hide(b ? m_gameBtnAdultOff : m_gameBtnAdultOn);
|
|
|
|
for(u8 i = 0; i < ARRAY_SIZE(m_gameLblUser) - 2; ++i)// don't include small banner frame
|
|
|
|
if(m_gameLblUser[i] != -1)
|
|
|
|
m_btnMgr.show(m_gameLblUser[i]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_btnMgr.hide(m_gameBtnFavoriteOn);
|
|
|
|
m_btnMgr.hide(m_gameBtnFavoriteOff);
|
|
|
|
m_btnMgr.hide(m_gameBtnAdultOn);
|
|
|
|
m_btnMgr.hide(m_gameBtnAdultOff);
|
|
|
|
m_btnMgr.hide(m_gameBtnSettings);
|
|
|
|
m_btnMgr.hide(m_gameBtnDelete);
|
|
|
|
m_btnMgr.hide(m_gameBtnPlay);
|
|
|
|
m_btnMgr.hide(m_gameBtnBack);
|
|
|
|
|
|
|
|
m_btnMgr.hide(m_gameBtnToggle);
|
|
|
|
for(u8 i = 0; i < ARRAY_SIZE(m_gameLblUser) - 1; ++i)
|
|
|
|
if (m_gameLblUser[i] != -1)
|
|
|
|
m_btnMgr.hide(m_gameLblUser[i]);
|
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
}
|
2016-06-10 01:02:40 +02:00
|
|
|
if(coverFlipped)
|
|
|
|
{
|
|
|
|
m_coverflow.setVector3D(domain, key, savedv);
|
2018-10-31 20:51:15 +01:00
|
|
|
_loadCFLayout(cf_version, true);// true?
|
2016-06-10 01:02:40 +02:00
|
|
|
CoverFlow.applySettings();
|
|
|
|
}
|
2016-12-01 01:05:39 +01:00
|
|
|
m_gameSelected = false;
|
2016-12-05 15:12:23 +01:00
|
|
|
MEM2_free(hdr);
|
2012-01-21 21:57:41 +01:00
|
|
|
_hideGame();
|
|
|
|
}
|
|
|
|
|
2016-12-01 01:05:39 +01:00
|
|
|
void CMenu::directlaunch(const char *GameID)// from boot arg for wii game only
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
|
|
|
m_directLaunch = true;
|
2012-10-03 23:34:37 +02:00
|
|
|
for(currentPartition = SD; currentPartition < USB8; currentPartition++)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2012-10-03 23:34:37 +02:00
|
|
|
if(!DeviceHandle.IsInserted(currentPartition))
|
|
|
|
continue;
|
|
|
|
DeviceHandle.OpenWBFS(currentPartition);
|
2013-08-06 23:31:25 +02:00
|
|
|
string gameDir(fmt(wii_games_dir, DeviceName[currentPartition]));
|
2012-10-04 17:25:35 +02:00
|
|
|
string cacheDir(fmt("%s/%s_wii.db", m_listCacheDir.c_str(), DeviceName[currentPartition]));
|
2016-06-20 23:03:40 +02:00
|
|
|
m_cacheList.CreateList(COVERFLOW_WII, currentPartition, gameDir,
|
2012-10-04 13:37:53 +02:00
|
|
|
stringToVector(".wbfs|.iso", '|'), cacheDir, false);
|
2012-10-03 23:34:37 +02:00
|
|
|
WBFS_Close();
|
2016-06-20 23:03:40 +02:00
|
|
|
for(u32 i = 0; i < m_cacheList.size(); i++)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2016-06-20 23:03:40 +02:00
|
|
|
if(strncasecmp(GameID, m_cacheList[i].id, 6) == 0)
|
2012-10-03 23:34:37 +02:00
|
|
|
{
|
2016-06-20 23:03:40 +02:00
|
|
|
_launchGame(&m_cacheList[i], false); // Launch will exit wiiflow
|
2012-10-03 23:34:37 +02:00
|
|
|
break;
|
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
}
|
2016-04-03 02:42:09 +02:00
|
|
|
error(wfmt(_fmt("errgame1", L"Cannot find the game with ID: %s"), GameID));
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
|
2013-03-23 18:06:06 +01:00
|
|
|
void CMenu::_launchShutdown()
|
|
|
|
{
|
|
|
|
CoverFlow.clear();
|
|
|
|
_showWaitMessage();
|
|
|
|
exitHandler(PRIILOADER_DEF); //Making wiiflow ready to boot something
|
|
|
|
}
|
|
|
|
|
2016-04-03 02:31:02 +02:00
|
|
|
bool gcLaunchFail = false;
|
2013-03-31 01:57:42 +01:00
|
|
|
void CMenu::_launch(const dir_discHdr *hdr)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2013-03-31 01:57:42 +01:00
|
|
|
dir_discHdr launchHdr;
|
|
|
|
memcpy(&launchHdr, hdr, sizeof(dir_discHdr));
|
2012-08-26 17:20:51 +02:00
|
|
|
/* Lets boot that shit */
|
2013-03-31 01:57:42 +01:00
|
|
|
if(launchHdr.type == TYPE_WII_GAME)
|
|
|
|
_launchGame(&launchHdr, false);
|
|
|
|
else if(launchHdr.type == TYPE_GC_GAME)
|
2016-04-03 02:31:02 +02:00
|
|
|
{
|
|
|
|
gcLaunchFail = false;
|
2013-03-31 01:57:42 +01:00
|
|
|
_launchGC(&launchHdr, false);
|
2016-04-03 02:31:02 +02:00
|
|
|
if(gcLaunchFail) return;
|
|
|
|
}
|
2016-06-20 23:03:40 +02:00
|
|
|
else if(launchHdr.type == TYPE_CHANNEL || launchHdr.type == TYPE_EMUCHANNEL)
|
2013-03-31 01:57:42 +01:00
|
|
|
_launchChannel(&launchHdr);
|
|
|
|
else if(launchHdr.type == TYPE_PLUGIN)
|
2012-04-08 17:54:34 +02:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
/* get dol name and name length for music plugin */
|
2013-03-31 01:57:42 +01:00
|
|
|
const char *plugin_dol_name = m_plugin.GetDolName(launchHdr.settings[0]);
|
2013-03-23 18:06:06 +01:00
|
|
|
u8 plugin_dol_len = strlen(plugin_dol_name);
|
2017-05-15 19:50:24 +02:00
|
|
|
/* check if music player plugin, if so set wiiflow's bckgrnd music player to play this song */
|
|
|
|
if(plugin_dol_len == 5 && strcasecmp(plugin_dol_name, "music") == 0)
|
|
|
|
{
|
2018-11-03 16:03:58 +01:00
|
|
|
if(strstr(launchHdr.path, ".pls") == NULL && strstr(launchHdr.path, ".m3u") == NULL)
|
|
|
|
MusicPlayer.LoadFile(launchHdr.path, false);
|
|
|
|
else
|
|
|
|
MusicPlayer.InitPlaylist(m_cfg, launchHdr.path, currentPartition);// maybe error msg if trouble loading playlist
|
2017-05-15 19:50:24 +02:00
|
|
|
m_exit = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
/* get title from hdr */
|
2013-05-30 19:35:03 +02:00
|
|
|
u32 title_len_no_ext = 0;
|
2018-05-08 15:49:43 +02:00
|
|
|
const char *title = CoverFlow.getFilenameId(hdr, true);// with extension
|
2017-05-15 19:50:24 +02:00
|
|
|
//m_cfg.setString(_domainFromView(), "current_item", title);
|
|
|
|
|
|
|
|
/* get path from hdr */
|
|
|
|
// example rom path - dev:/roms/super mario bros.zip
|
|
|
|
// example scummvm path - kq1-coco3
|
2013-03-23 18:06:06 +01:00
|
|
|
const char *path = NULL;
|
2016-04-02 18:58:12 +02:00
|
|
|
if(strchr(launchHdr.path, ':') != NULL)//it's a rom path
|
2012-04-12 00:01:41 +02:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
// if there's extension get length of title without extension
|
2016-12-01 01:05:39 +01:00
|
|
|
if(strchr(launchHdr.path, '.') != NULL)
|
2013-05-30 19:35:03 +02:00
|
|
|
title_len_no_ext = strlen(title) - strlen(strrchr(title, '.'));
|
2017-05-15 19:50:24 +02:00
|
|
|
// get path
|
2016-04-02 18:58:12 +02:00
|
|
|
*strrchr(launchHdr.path, '/') = '\0'; //cut title off end of path
|
2017-05-15 19:50:24 +02:00
|
|
|
path = strchr(launchHdr.path, '/') + 1; //cut dev:/ off of path
|
2012-04-12 00:01:41 +02:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
else // it's a scummvm game
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
path = launchHdr.path;// kq1-coco3
|
2016-04-03 02:31:02 +02:00
|
|
|
|
2017-05-15 19:50:24 +02:00
|
|
|
/* get device */
|
2012-12-27 21:22:40 +01:00
|
|
|
const char *device = (currentPartition == 0 ? "sd" : (DeviceHandle.GetFSType(currentPartition) == PART_FS_NTFS ? "ntfs" : "usb"));
|
2017-05-15 19:50:24 +02:00
|
|
|
|
|
|
|
/* get loader */
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
// I believe the loader is set just in case the user is using a old plugin where the arguments line still requires loader
|
2012-12-27 21:22:40 +01:00
|
|
|
const char *loader = fmt("%s:/%s/WiiFlowLoader.dol", device, strchr(m_pluginsDir.c_str(), '/') + 1);
|
2013-05-23 14:47:45 +02:00
|
|
|
|
2017-05-15 19:50:24 +02:00
|
|
|
/* set arguments */
|
2013-05-30 19:35:03 +02:00
|
|
|
vector<string> arguments = m_plugin.CreateArgs(device, path, title, loader, title_len_no_ext, launchHdr.settings[0]);
|
2017-05-15 19:50:24 +02:00
|
|
|
|
|
|
|
/* find plugin dol - it does not have to be in dev:/wiiflow/plugins */
|
|
|
|
const char *plugin_file = plugin_dol_name; // try full path
|
|
|
|
if(strchr(plugin_file, ':') == NULL || !fsop_FileExist(plugin_file)) // if not found try wiiflow plugin folder
|
2013-05-28 23:20:51 +02:00
|
|
|
{
|
2013-05-23 14:47:45 +02:00
|
|
|
plugin_file = fmt("%s/%s", m_pluginsDir.c_str(), plugin_dol_name);
|
2017-05-15 19:50:24 +02:00
|
|
|
if(!fsop_FileExist(plugin_file)) // not found - try device search
|
2013-05-28 23:20:51 +02:00
|
|
|
{
|
|
|
|
for(u8 i = SD; i < MAXDEVICES; ++i)
|
|
|
|
{
|
|
|
|
plugin_file = fmt("%s:/%s", DeviceName[i], plugin_dol_name);
|
|
|
|
if(fsop_FileExist(plugin_file))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
/* launch plugin with args */
|
2018-08-01 14:27:12 +02:00
|
|
|
gprintf("launching plugin app\n");
|
2013-05-23 14:47:45 +02:00
|
|
|
_launchHomebrew(plugin_file, arguments);
|
2012-04-08 17:54:34 +02:00
|
|
|
}
|
2013-03-31 01:57:42 +01:00
|
|
|
else if(launchHdr.type == TYPE_HOMEBREW)
|
2012-06-14 22:59:18 +02:00
|
|
|
{
|
2018-06-27 14:47:03 +02:00
|
|
|
const char *bootpath = fmt("%s/boot.dol", launchHdr.path);
|
|
|
|
if(!fsop_FileExist(bootpath))
|
|
|
|
bootpath = fmt("%s/boot.elf", launchHdr.path);
|
|
|
|
if(fsop_FileExist(bootpath))
|
2012-12-27 21:22:40 +01:00
|
|
|
{
|
2013-03-31 01:57:42 +01:00
|
|
|
m_cfg.setString(HOMEBREW_DOMAIN, "current_item", strrchr(launchHdr.path, '/') + 1);
|
2018-06-27 14:47:03 +02:00
|
|
|
vector<string> arguments = _getMetaXML(bootpath);
|
2018-08-01 14:27:12 +02:00
|
|
|
gprintf("launching homebrew app\n");
|
2018-06-27 14:47:03 +02:00
|
|
|
_launchHomebrew(bootpath, arguments);
|
2012-12-27 21:22:40 +01:00
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2012-12-27 21:22:40 +01:00
|
|
|
ShutdownBeforeExit();
|
|
|
|
Sys_Exit();
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2016-04-02 18:58:12 +02:00
|
|
|
|
2018-06-27 14:47:03 +02:00
|
|
|
void CMenu::_launchHomebrew(const char *filepath, vector<string> arguments)
|
|
|
|
{
|
|
|
|
/* clear coverflow, start wiiflow wait animation, set exit handler */
|
|
|
|
_launchShutdown();
|
|
|
|
m_gcfg1.save(true);
|
|
|
|
m_gcfg2.save(true);
|
|
|
|
m_cat.save(true);
|
|
|
|
m_cfg.save(true);
|
|
|
|
|
|
|
|
Playlog_Delete();
|
|
|
|
|
2018-08-01 14:27:12 +02:00
|
|
|
/* load boot.dol into memory and load app_booter.bin into memory */
|
2018-06-27 14:47:03 +02:00
|
|
|
bool ret = (LoadHomebrew(filepath) && LoadAppBooter(fmt("%s/app_booter.bin", m_binsDir.c_str())));
|
|
|
|
if(ret == false)
|
|
|
|
{
|
|
|
|
error(_t("errgame14", L"app_booter.bin not found!"));
|
|
|
|
_exitWiiflow();
|
|
|
|
}
|
|
|
|
/* no more error msgs - remove btns and sounds */
|
|
|
|
cleanup();
|
|
|
|
|
|
|
|
AddBootArgument(filepath);
|
|
|
|
for(u32 i = 0; i < arguments.size(); ++i)
|
|
|
|
{
|
2018-08-01 14:27:12 +02:00
|
|
|
gprintf("app argument: %s\n", arguments[i].c_str());
|
2018-06-27 14:47:03 +02:00
|
|
|
AddBootArgument(arguments[i].c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
ShutdownBeforeExit();// wifi and sd gecko doesnt work anymore after
|
|
|
|
loadIOS(58, false);
|
|
|
|
BootHomebrew();
|
|
|
|
Sys_Exit();
|
|
|
|
}
|
|
|
|
|
|
|
|
vector<string> CMenu::_getMetaXML(const char *bootpath)
|
|
|
|
{
|
|
|
|
char *meta_buf = NULL;
|
|
|
|
vector<string> args;
|
|
|
|
char meta_path[200];
|
|
|
|
char *p;
|
|
|
|
char *e, *end;
|
|
|
|
struct stat st;
|
|
|
|
|
|
|
|
/* load meta.xml */
|
|
|
|
|
|
|
|
p = strrchr(bootpath, '/');
|
|
|
|
snprintf(meta_path, sizeof(meta_path), "%.*smeta.xml", p ? p-bootpath+1 : 0, bootpath);
|
|
|
|
|
|
|
|
if (stat(meta_path, &st) != 0)
|
|
|
|
return args;
|
|
|
|
if (st.st_size > 64*1024)
|
|
|
|
return args;
|
|
|
|
|
|
|
|
meta_buf = (char *) calloc(st.st_size + 1, 1);// +1 so that the buf is 0 terminated
|
|
|
|
if (!meta_buf)
|
|
|
|
return args;
|
|
|
|
|
|
|
|
int fd = open(meta_path, O_RDONLY);
|
|
|
|
if (fd < 0)
|
|
|
|
{
|
|
|
|
free(meta_buf);
|
|
|
|
meta_buf = NULL;
|
|
|
|
return args;
|
|
|
|
}
|
|
|
|
read(fd, meta_buf, st.st_size);
|
|
|
|
close(fd);
|
|
|
|
|
|
|
|
/* strip comments */
|
|
|
|
|
|
|
|
p = meta_buf;
|
|
|
|
int len;
|
|
|
|
while (p && *p)
|
|
|
|
{
|
|
|
|
p = strstr(p, "<!--");
|
|
|
|
if (!p)
|
|
|
|
break;
|
|
|
|
e = strstr(p, "-->");
|
|
|
|
if (!e)
|
|
|
|
{
|
|
|
|
*p = 0; // terminate
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
e += 3;
|
|
|
|
len = strlen(e);
|
|
|
|
memmove(p, e, len + 1); // +1 for 0 termination
|
|
|
|
}
|
|
|
|
|
|
|
|
/* parse meta */
|
|
|
|
|
|
|
|
if (strstr(meta_buf, "<app") && strstr(meta_buf, "</app>") && strstr(meta_buf, "<arguments>") && strstr(meta_buf, "</arguments>"))
|
|
|
|
{
|
|
|
|
p = strstr(meta_buf, "<arguments>");
|
|
|
|
end = strstr(meta_buf, "</arguments>");
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
p = strstr(p, "<arg>");
|
|
|
|
if (!p)
|
|
|
|
break;
|
|
|
|
|
|
|
|
p += 5; //strlen("<arg>");
|
|
|
|
e = strstr(p, "</arg>");
|
|
|
|
if (!e)
|
|
|
|
break;
|
|
|
|
|
|
|
|
string arg(p, e-p);
|
|
|
|
args.push_back(arg);
|
|
|
|
p = e + 6;
|
|
|
|
}
|
|
|
|
while (p < end);
|
|
|
|
}
|
|
|
|
|
|
|
|
free(meta_buf);
|
|
|
|
meta_buf = NULL;
|
|
|
|
return args;
|
|
|
|
}
|
|
|
|
|
2012-07-14 18:55:14 +02:00
|
|
|
void CMenu::_launchGC(dir_discHdr *hdr, bool disc)
|
2012-03-05 11:01:07 +01:00
|
|
|
{
|
2017-04-18 01:23:50 +02:00
|
|
|
/* note for a disc boot hdr->id is set to the disc id before _launchGC is called */
|
2012-11-18 14:40:26 +01:00
|
|
|
const char *id = hdr->id;
|
2017-04-18 01:23:50 +02:00
|
|
|
|
|
|
|
/* Get loader choice*/
|
2018-05-08 15:49:43 +02:00
|
|
|
u8 loader = min(m_gcfg2.getUInt(id, "gc_loader", 0), ARRAY_SIZE(CMenu::_GCLoader) - 1u);
|
|
|
|
loader = (loader == 0) ? min(m_cfg.getUInt(GC_DOMAIN, "default_loader", 1), ARRAY_SIZE(CMenu::_GlobalGCLoaders) - 1u) : loader-1;
|
2016-04-03 02:31:02 +02:00
|
|
|
|
|
|
|
if(disc)
|
2016-12-01 01:05:39 +01:00
|
|
|
loader = NINTENDONT;
|
2017-04-18 01:23:50 +02:00
|
|
|
|
|
|
|
/* Check if loader installed */
|
2016-12-01 01:05:39 +01:00
|
|
|
if((loader == NINTENDONT && !m_nintendont_installed) || (loader == DEVOLUTION && !m_devo_installed))
|
2016-04-03 02:31:02 +02:00
|
|
|
{
|
|
|
|
error(_t("errgame11", L"GameCube Loader not found! Can't launch game."));
|
|
|
|
gcLaunchFail = true;
|
|
|
|
return;
|
|
|
|
}
|
2017-04-18 01:23:50 +02:00
|
|
|
|
2016-11-07 16:06:00 +01:00
|
|
|
/* clear coverflow, start wiiflow wait animation, set exit handler */
|
2016-04-03 02:31:02 +02:00
|
|
|
_launchShutdown();
|
2017-04-18 01:23:50 +02:00
|
|
|
|
2012-03-19 19:08:48 +01:00
|
|
|
m_gcfg1.setInt("PLAYCOUNT", id, m_gcfg1.getInt("PLAYCOUNT", id, 0) + 1);
|
|
|
|
m_gcfg1.setUInt("LASTPLAYED", id, time(NULL));
|
|
|
|
|
2012-02-11 14:05:18 +01:00
|
|
|
if(has_enabled_providers() && _initNetwork() == 0)
|
2012-11-18 14:40:26 +01:00
|
|
|
add_game_to_card(id);
|
2012-02-11 14:05:18 +01:00
|
|
|
|
2017-04-18 01:23:50 +02:00
|
|
|
/* Get game settings */
|
|
|
|
const char *path = NULL;
|
|
|
|
if(disc)
|
2018-05-01 00:31:29 +02:00
|
|
|
path = "di";
|
2017-04-18 01:23:50 +02:00
|
|
|
else
|
|
|
|
path = hdr->path;
|
|
|
|
|
2018-05-08 15:49:43 +02:00
|
|
|
u8 GClanguage = min(m_gcfg2.getUInt(id, "language", 0), ARRAY_SIZE(CMenu::_GClanguages) - 1u);
|
|
|
|
GClanguage = (GClanguage == 0) ? min(m_cfg.getUInt(GC_DOMAIN, "game_language", 0), ARRAY_SIZE(CMenu::_GlobalGClanguages) - 1u) : GClanguage-1;
|
2017-04-18 01:23:50 +02:00
|
|
|
// language selection only works for PAL games
|
2014-04-25 22:23:21 +02:00
|
|
|
if(id[3] == 'E' || id[3] == 'J')
|
|
|
|
GClanguage = 1; //=english
|
2016-04-03 02:31:02 +02:00
|
|
|
|
2018-05-08 15:49:43 +02:00
|
|
|
u8 videoMode = min(m_gcfg2.getUInt(id, "video_mode", 0), ARRAY_SIZE(CMenu::_GCvideoModes) - 1u);
|
|
|
|
videoMode = (videoMode == 0) ? min(m_cfg.getUInt(GC_DOMAIN, "video_mode", 0), ARRAY_SIZE(CMenu::_GlobalGCvideoModes) - 1u) : videoMode-1;
|
2012-03-25 21:52:35 +02:00
|
|
|
|
2016-04-03 02:31:02 +02:00
|
|
|
bool widescreen = m_gcfg2.getBool(id, "widescreen", false);
|
2017-04-18 01:23:50 +02:00
|
|
|
bool activity_led = m_gcfg2.getBool(id, "led", false);
|
|
|
|
|
|
|
|
if(loader == NINTENDONT)
|
2013-08-21 17:20:13 +02:00
|
|
|
{
|
2017-04-18 01:23:50 +02:00
|
|
|
/* might add here - if not a disc use path to check for disc2.iso - if so then we need to prompt disc 1 or disc 2? */
|
2018-05-08 15:49:43 +02:00
|
|
|
u8 emuMC = min(m_gcfg2.getUInt(id, "emu_memcard", 0), ARRAY_SIZE(CMenu::_NinEmuCard) - 1u);
|
|
|
|
emuMC = (emuMC == 0) ? m_cfg.getUInt(GC_DOMAIN, "emu_memcard", 1) : emuMC - 1;
|
2017-03-17 01:02:21 +01:00
|
|
|
|
2018-10-15 16:23:34 +02:00
|
|
|
// these 3 settings have global defaults in wfl main config
|
2017-03-17 01:02:21 +01:00
|
|
|
bool cc_rumble = m_gcfg2.testOptBool(id, "cc_rumble", m_cfg.getBool(GC_DOMAIN, "cc_rumble", false));
|
2016-12-01 01:05:39 +01:00
|
|
|
bool native_ctl = m_gcfg2.testOptBool(id, "native_ctl", m_cfg.getBool(GC_DOMAIN, "native_ctl", false));
|
2018-10-15 16:23:34 +02:00
|
|
|
bool wiiu_widescreen = m_gcfg2.testOptBool(id, "wiiu_widescreen", m_cfg.getBool(GC_DOMAIN, "wiiu_widescreen", false));
|
|
|
|
|
2017-03-17 01:02:21 +01:00
|
|
|
bool deflicker = m_gcfg2.getBool(id, "deflicker", false);
|
2016-12-01 01:05:39 +01:00
|
|
|
bool tri_arcade = m_gcfg2.getBool(id, "triforce_arcade", false);
|
2017-03-17 01:02:21 +01:00
|
|
|
bool ipl = m_gcfg2.getBool(id, "skip_ipl", false);
|
2017-04-18 01:23:50 +02:00
|
|
|
bool patch_pal50 = m_gcfg2.getBool(id, "patch_pal50", false);
|
|
|
|
bool NIN_Debugger = (m_gcfg2.getInt(id, "debugger", 0) == 2);
|
|
|
|
bool cheats = m_gcfg2.getBool(id, "cheat", false);
|
|
|
|
|
|
|
|
s8 vidscale = m_gcfg2.getInt(id, "nin_width", 127);
|
|
|
|
if(vidscale == 127)
|
|
|
|
vidscale = m_cfg.getInt(GC_DOMAIN, "nin_width", 0);
|
|
|
|
s8 vidoffset = m_gcfg2.getInt(id, "nin_pos", 127);
|
|
|
|
if(vidoffset == 127)
|
|
|
|
vidoffset = m_cfg.getInt(GC_DOMAIN, "nin_pos", 0);
|
|
|
|
|
|
|
|
/* configs no longer needed */
|
|
|
|
m_gcfg1.save(true);
|
|
|
|
m_gcfg2.save(true);
|
|
|
|
m_cat.save(true);
|
|
|
|
m_cfg.save(true);
|
|
|
|
|
|
|
|
bool ret = (Nintendont_GetLoader() && LoadAppBooter(fmt("%s/app_booter.bin", m_binsDir.c_str())));
|
|
|
|
if(ret == false)
|
2013-08-21 17:20:13 +02:00
|
|
|
{
|
2017-04-18 01:23:50 +02:00
|
|
|
error(_t("errgame14", L"app_booter.bin not found!"));
|
|
|
|
_exitWiiflow();
|
2013-08-21 17:20:13 +02:00
|
|
|
}
|
2017-04-18 01:23:50 +02:00
|
|
|
|
|
|
|
/* no more error msgs - remove btns and sounds */
|
|
|
|
cleanup();
|
|
|
|
|
|
|
|
//GameID for Video mode when booting a Disc
|
|
|
|
memcpy((u8*)Disc_ID, id, 6);
|
|
|
|
DCFlushRange((u8*)Disc_ID, 32);
|
|
|
|
|
|
|
|
/* set nintendont conifg options */
|
|
|
|
u32 n_config = 0;
|
|
|
|
n_config |= NIN_CFG_AUTO_BOOT;
|
|
|
|
|
|
|
|
if(DeviceHandle.PathToDriveType(path) != SD)
|
|
|
|
n_config |= NIN_CFG_USB;
|
|
|
|
|
|
|
|
char CheatPath[256];
|
|
|
|
CheatPath[0] = '\0';// set NULL in case cheats are off
|
|
|
|
if(cheats)
|
2013-08-21 17:20:13 +02:00
|
|
|
{
|
2017-04-18 01:23:50 +02:00
|
|
|
n_config |= NIN_CFG_CHEAT_PATH;
|
|
|
|
n_config |= NIN_CFG_CHEATS;
|
|
|
|
|
|
|
|
/* Generate Game Cheat path - usb1:/games/title [id]/ */
|
2016-04-03 02:31:02 +02:00
|
|
|
char GC_Path[256];
|
|
|
|
GC_Path[255] = '\0';
|
2018-05-01 00:31:29 +02:00
|
|
|
if(!disc)
|
2013-08-21 17:20:13 +02:00
|
|
|
{
|
2018-05-01 00:31:29 +02:00
|
|
|
strncpy(GC_Path, path, 255);
|
|
|
|
if(strcasestr(path, "boot.bin") != NULL)//usb1:/games/title [id]/sys/boot.bin
|
|
|
|
{
|
|
|
|
*strrchr(GC_Path, '/') = '\0'; //erase /boot.bin
|
|
|
|
*(strrchr(GC_Path, '/')+1) = '\0'; //erase sys folder
|
|
|
|
}
|
|
|
|
else //usb1:/games/title [id]/game.iso
|
|
|
|
*(strrchr(GC_Path, '/')+1) = '\0'; //erase game.iso
|
2013-08-21 17:20:13 +02:00
|
|
|
}
|
2017-04-18 01:23:50 +02:00
|
|
|
|
2018-05-01 00:31:29 +02:00
|
|
|
//use wiiflow cheat folder if is a disc or is on same partition as game folder
|
|
|
|
if(disc || strncasecmp(m_cheatDir.c_str(), DeviceName[currentPartition], strlen(DeviceName[currentPartition])) == 0)
|
2017-04-18 01:23:50 +02:00
|
|
|
snprintf(CheatPath, sizeof(CheatPath), "%s/%s", m_cheatDir.c_str(), fmt("%s.gct", id));
|
|
|
|
else
|
|
|
|
{
|
2018-05-01 00:31:29 +02:00
|
|
|
// otherwise copy cheat file from wiiflow cheat folder to Game folder
|
2018-05-29 11:59:57 +02:00
|
|
|
char GC_game_dir[strlen(GC_Path) + 11];
|
|
|
|
snprintf(GC_game_dir, sizeof(GC_game_dir), "%s%s.gct", GC_Path, id);
|
|
|
|
fsop_CopyFile(fmt("%s/%s.gct", m_cheatDir.c_str(), id), GC_game_dir, NULL, NULL);
|
2017-04-18 01:23:50 +02:00
|
|
|
//might add err msg here if copy error
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(NIN_Debugger && IsOnWiiU() == false) //wii only
|
|
|
|
n_config |= NIN_CFG_OSREPORT;
|
|
|
|
|
|
|
|
if(native_ctl && IsOnWiiU() == false) //wii only
|
|
|
|
n_config |= NIN_CFG_NATIVE_SI;
|
|
|
|
|
|
|
|
if(wiiu_widescreen && IsOnWiiU() == true) //wii u vwii only
|
|
|
|
n_config |= NIN_CFG_WIIU_WIDE;
|
|
|
|
|
|
|
|
if(widescreen)
|
|
|
|
n_config |= NIN_CFG_FORCE_WIDE;
|
|
|
|
|
|
|
|
if(activity_led && IsOnWiiU() == false) //wii only
|
|
|
|
n_config |= NIN_CFG_LED;
|
|
|
|
|
|
|
|
if(tri_arcade)
|
|
|
|
n_config |= NIN_CFG_ARCADE_MODE;
|
|
|
|
|
|
|
|
if(cc_rumble)
|
|
|
|
n_config |= NIN_CFG_BIT_CC_RUMBLE;
|
|
|
|
|
|
|
|
if(ipl)
|
|
|
|
n_config |= NIN_CFG_SKIP_IPL;
|
|
|
|
|
|
|
|
/* set memcard options */
|
|
|
|
if(emuMC > 0 || IsOnWiiU() == true) //force memcardemu for wii u vwii
|
|
|
|
n_config |= NIN_CFG_MEMCARDEMU;
|
|
|
|
|
|
|
|
if(emuMC > 1)
|
|
|
|
n_config |= NIN_CFG_MC_MULTI;
|
|
|
|
|
|
|
|
/* set nintendont video options */
|
|
|
|
u32 n_videomode = 0;
|
|
|
|
|
|
|
|
/* if video is not already forced and patch pal50 or deflicker are on then force to game video mode */
|
|
|
|
if(videoMode == 0 && (patch_pal50 || deflicker))
|
|
|
|
{
|
|
|
|
if(id[3] == 'E' || id[3] == 'J')
|
|
|
|
videoMode = 2; //NTSC 480i
|
|
|
|
else if (CONF_GetEuRGB60() > 0)
|
|
|
|
videoMode = 3; //PAL 480i
|
|
|
|
else
|
|
|
|
videoMode = 1; //PAL 576i
|
|
|
|
}
|
|
|
|
|
|
|
|
/* auto or forced */
|
|
|
|
if(videoMode == 0)
|
|
|
|
n_videomode |= NIN_VID_AUTO;
|
|
|
|
else
|
|
|
|
n_videomode |= NIN_VID_FORCE;
|
|
|
|
|
|
|
|
// patch_pal50 only works on pal50 games forced to mpal, NTSC, or progressive.
|
|
|
|
if(patch_pal50)
|
|
|
|
n_videomode |= NIN_VID_PATCH_PAL50;
|
|
|
|
|
|
|
|
// videomode must be forced to set deflicker
|
|
|
|
if(deflicker)
|
|
|
|
n_videomode |= NIN_VID_FORCE_DF;
|
|
|
|
|
|
|
|
// progressive only works with NTSC - Nintendont auto forces to NTSC if progressive on
|
|
|
|
if(videoMode == 5)
|
|
|
|
{
|
|
|
|
n_config |= NIN_CFG_FORCE_PROG;
|
|
|
|
n_videomode |= NIN_VID_PROG;
|
|
|
|
}
|
|
|
|
|
|
|
|
// rmode and rmode_reg are set by Nintendont
|
|
|
|
switch (videoMode)//if 0 nothing is forced
|
|
|
|
{
|
|
|
|
case 1:// PAL50
|
|
|
|
n_videomode |= NIN_VID_FORCE_PAL50;
|
|
|
|
break;
|
|
|
|
case 2:// PAL60 480i
|
|
|
|
n_videomode |= NIN_VID_FORCE_PAL60;
|
|
|
|
break;
|
|
|
|
case 3:// NTSC 480i
|
|
|
|
n_videomode |= NIN_VID_FORCE_NTSC;
|
|
|
|
break;
|
|
|
|
case 4:// MPAL
|
|
|
|
n_videomode |= NIN_VID_FORCE_MPAL;
|
|
|
|
break;
|
2013-08-21 17:20:13 +02:00
|
|
|
}
|
2017-04-18 01:23:50 +02:00
|
|
|
|
|
|
|
Nintendont_SetOptions(path, id, CheatPath, GClanguage, n_config, n_videomode, vidscale, vidoffset);
|
|
|
|
ShutdownBeforeExit();
|
2017-09-22 00:03:41 +02:00
|
|
|
loadIOS(58, false); //nintendont NEEDS ios58 and AHBPROT disabled
|
|
|
|
/* should be a check for error loading IOS58 and AHBPROT disabled */
|
2017-04-18 01:23:50 +02:00
|
|
|
BootHomebrew(); //regular dol
|
2016-11-07 16:06:00 +01:00
|
|
|
}
|
2017-04-18 01:23:50 +02:00
|
|
|
else // loader == DEVOLUTION
|
2016-11-07 16:06:00 +01:00
|
|
|
{
|
2017-04-18 01:23:50 +02:00
|
|
|
// devolution does not allow force video and progressive mode
|
2018-10-15 16:23:34 +02:00
|
|
|
// ignore video setting choice and use game region always
|
2017-04-18 01:23:50 +02:00
|
|
|
if(id[3] =='E' || id[3] =='J')
|
2016-11-07 16:06:00 +01:00
|
|
|
{
|
2017-04-18 01:23:50 +02:00
|
|
|
// if game is NTSC then video is based on console video
|
|
|
|
if(CONF_GetVideo() == CONF_VIDEO_PAL)
|
|
|
|
videoMode = 2; //PAL 480i
|
|
|
|
else
|
|
|
|
videoMode = 3; //NTSC 480i
|
2016-11-07 16:06:00 +01:00
|
|
|
}
|
2017-04-18 01:23:50 +02:00
|
|
|
else
|
|
|
|
videoMode = 1; //PAL 576i 50hz
|
|
|
|
|
|
|
|
bool memcard_emu = m_gcfg2.testOptBool(id, "devo_memcard_emu", m_cfg.getBool(GC_DOMAIN, "devo_memcard_emu", false));
|
|
|
|
|
|
|
|
/* configs no longer needed */
|
|
|
|
m_gcfg1.save(true);
|
|
|
|
m_gcfg2.save(true);
|
|
|
|
m_cat.save(true);
|
|
|
|
m_cfg.save(true);
|
2012-09-02 15:34:41 +02:00
|
|
|
|
2017-04-18 01:23:50 +02:00
|
|
|
/* remove btns and sounds */
|
|
|
|
cleanup();
|
|
|
|
|
|
|
|
DEVO_GetLoader(m_dataDir.c_str());
|
|
|
|
DEVO_SetOptions(path, id, videoMode, GClanguage, memcard_emu, widescreen, activity_led, m_use_wifi_gecko);
|
|
|
|
|
2017-09-22 00:03:41 +02:00
|
|
|
if(AHBPROT_Patched())
|
2012-08-25 17:10:57 +02:00
|
|
|
loadIOS(58, false);
|
|
|
|
else //use cIOS instead to make sure Devolution works anyways
|
|
|
|
loadIOS(mainIOS, false);
|
2012-09-02 15:34:41 +02:00
|
|
|
ShutdownBeforeExit();
|
|
|
|
DEVO_Boot();
|
2012-07-28 18:41:48 +02:00
|
|
|
}
|
2012-09-09 20:35:15 +02:00
|
|
|
Sys_Exit();
|
2012-01-21 22:15:45 +01:00
|
|
|
}
|
|
|
|
|
2016-11-07 16:06:00 +01:00
|
|
|
/* dont confuse loadIOS with _loadIOS */
|
2012-12-08 22:16:05 +01:00
|
|
|
int CMenu::_loadIOS(u8 gameIOS, int userIOS, string id, bool RealNAND_Channels)
|
2012-05-03 06:55:09 +02:00
|
|
|
{
|
2018-08-01 14:27:12 +02:00
|
|
|
gprintf("Game ID %s requested IOS %d.\nUser selected %d\n", id.c_str(), gameIOS, userIOS);
|
2018-07-16 00:12:56 +02:00
|
|
|
if(RealNAND_Channels && IOS_GetType(mainIOS) == IOS_TYPE_STUB)
|
2012-07-13 15:16:13 +02:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
/* doesn't use cIOS so we don't check userIOS */
|
|
|
|
bool ret = loadIOS(gameIOS, false);//load game requested IOS and patch nothing
|
|
|
|
_netInit();// needed after IOS change
|
2012-12-22 21:57:23 +01:00
|
|
|
if(ret == false)
|
2012-07-13 15:16:13 +02:00
|
|
|
{
|
2016-04-03 02:42:09 +02:00
|
|
|
error(wfmt(_fmt("errgame4", L"Couldn't load IOS %i"), gameIOS));
|
2012-07-13 15:16:13 +02:00
|
|
|
return LOAD_IOS_FAILED;
|
|
|
|
}
|
|
|
|
return LOAD_IOS_SUCCEEDED;
|
|
|
|
}
|
|
|
|
|
2017-09-22 00:03:41 +02:00
|
|
|
if(userIOS)// if IOS is not 'auto' and set to a specific cIOS then set gameIOS to that cIOS if it's installed
|
2012-05-03 06:55:09 +02:00
|
|
|
{
|
|
|
|
for(CIOSItr itr = _installed_cios.begin(); itr != _installed_cios.end(); itr++)
|
|
|
|
{
|
|
|
|
if(itr->second == userIOS || itr->first == userIOS)
|
|
|
|
{
|
|
|
|
gameIOS = itr->first;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-09-22 00:03:41 +02:00
|
|
|
else if(gameIOS != 57)// if IOS is 'auto' but gameIOS is not IOS57 then set gameIOS to wiiflow's mainIOS
|
|
|
|
gameIOS = mainIOS;// mainIOS is usually 249 unless changed by boot args or changed on startup settings menu
|
2012-07-01 23:25:32 +02:00
|
|
|
gprintf("Changed requested IOS to %d.\n", gameIOS);
|
2012-05-03 06:55:09 +02:00
|
|
|
|
2017-09-22 00:03:41 +02:00
|
|
|
// remap a gameIOS of IOS57 to a cIOS base 57 or if the specific cIOS selected is not installed then
|
|
|
|
// remap game IOS to a CIOS with the same base IOS
|
|
|
|
if(gameIOS < 0x64)// < 100
|
2012-05-03 06:55:09 +02:00
|
|
|
{
|
2012-05-24 00:09:11 +02:00
|
|
|
if(_installed_cios.size() <= 0)
|
2012-05-03 06:55:09 +02:00
|
|
|
{
|
2016-04-03 02:42:09 +02:00
|
|
|
error(_t("errgame2", L"No cIOS found!"));
|
2012-09-09 20:35:15 +02:00
|
|
|
Sys_Exit();
|
2012-05-12 19:14:25 +02:00
|
|
|
}
|
|
|
|
u8 IOS[3];
|
|
|
|
IOS[0] = gameIOS;
|
|
|
|
IOS[1] = 56;
|
|
|
|
IOS[2] = 57;
|
|
|
|
bool found = false;
|
2017-09-22 00:03:41 +02:00
|
|
|
// compare the base of each cios to the game ios
|
|
|
|
// if no match then find the first cios with base 56
|
|
|
|
// if no match then find the first cios with base 57
|
2012-05-12 19:14:25 +02:00
|
|
|
for(u8 num = 0; num < 3; num++)
|
|
|
|
{
|
|
|
|
if(found)
|
|
|
|
break;
|
|
|
|
if(IOS[num] == 0)
|
|
|
|
continue;
|
|
|
|
for(CIOSItr itr = _installed_cios.begin(); itr != _installed_cios.end(); itr++)
|
2012-05-03 06:55:09 +02:00
|
|
|
{
|
2012-05-12 19:14:25 +02:00
|
|
|
if(itr->second == IOS[num] || itr->first == IOS[num])
|
2012-05-03 06:55:09 +02:00
|
|
|
{
|
2012-05-12 19:14:25 +02:00
|
|
|
gameIOS = itr->first;
|
|
|
|
found = true;
|
|
|
|
break;
|
2012-05-03 06:55:09 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-05-12 19:14:25 +02:00
|
|
|
if(!found)
|
|
|
|
return LOAD_IOS_FAILED;
|
2012-05-03 06:55:09 +02:00
|
|
|
}
|
2017-09-22 00:03:41 +02:00
|
|
|
/* at this point gameIOS is a cIOS */
|
2012-08-11 14:27:38 +02:00
|
|
|
if(gameIOS != CurrentIOS.Version)
|
2012-05-12 19:14:25 +02:00
|
|
|
{
|
|
|
|
gprintf("Reloading IOS into %d\n", gameIOS);
|
2017-09-22 00:03:41 +02:00
|
|
|
bool ret = loadIOS(gameIOS, true);// cIOS patch everything
|
|
|
|
_netInit();// always seem to do netinit after changing IOS
|
2012-12-22 21:57:23 +01:00
|
|
|
if(ret == false)
|
2012-05-12 19:14:25 +02:00
|
|
|
{
|
2016-04-03 02:42:09 +02:00
|
|
|
error(wfmt(_fmt("errgame4", L"Couldn't load IOS %i"), gameIOS));
|
2012-05-12 19:14:25 +02:00
|
|
|
return LOAD_IOS_FAILED;
|
|
|
|
}
|
|
|
|
return LOAD_IOS_SUCCEEDED;
|
|
|
|
}
|
2012-05-03 06:55:09 +02:00
|
|
|
return LOAD_IOS_NOT_NEEDED;
|
|
|
|
}
|
|
|
|
|
2012-01-21 21:57:41 +01:00
|
|
|
void CMenu::_launchChannel(dir_discHdr *hdr)
|
|
|
|
{
|
2019-01-09 13:28:59 +01:00
|
|
|
NANDemuView = hdr->type == TYPE_EMUCHANNEL;
|
|
|
|
|
2016-11-07 16:06:00 +01:00
|
|
|
/* clear coverflow, start wiiflow wait animation, set exit handler */
|
2013-03-23 18:06:06 +01:00
|
|
|
_launchShutdown();
|
2012-07-08 15:35:59 +02:00
|
|
|
string id = string(hdr->id);
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2016-12-01 01:05:39 +01:00
|
|
|
/* WII_Launch is used for launching real nand channels */
|
2018-07-16 00:12:56 +02:00
|
|
|
bool WII_Launch = (m_gcfg2.getBool(id, "custom", false) && !NANDemuView);
|
2016-12-01 01:05:39 +01:00
|
|
|
/* use_dol = true to use the channels dol or false to use the old apploader method to boot channel */
|
2013-01-05 18:12:13 +01:00
|
|
|
bool use_dol = !m_gcfg2.getBool(id, "apploader", false);
|
2012-06-28 15:05:31 +02:00
|
|
|
|
2016-12-01 01:05:39 +01:00
|
|
|
bool vipatch = m_gcfg2.getBool(id, "vipatch", false);
|
|
|
|
bool cheat = m_gcfg2.getBool(id, "cheat", false);
|
|
|
|
bool countryPatch = m_gcfg2.getBool(id, "country_patch", false);
|
2012-06-28 15:05:31 +02:00
|
|
|
|
2018-05-08 15:49:43 +02:00
|
|
|
u8 videoMode = min(m_gcfg2.getUInt(id, "video_mode", 0), ARRAY_SIZE(CMenu::_VideoModes) - 1u);
|
|
|
|
videoMode = (videoMode == 0) ? min(m_cfg.getUInt("GENERAL", "video_mode", 0), ARRAY_SIZE(CMenu::_GlobalVideoModes) - 1u) : videoMode - 1;
|
2012-06-28 15:05:31 +02:00
|
|
|
|
2018-05-08 15:49:43 +02:00
|
|
|
int language = min(m_gcfg2.getUInt(id, "language", 0), ARRAY_SIZE(CMenu::_languages) - 1u);
|
|
|
|
language = (language == 0) ? min(m_cfg.getUInt("GENERAL", "game_language", 0), ARRAY_SIZE(CMenu::_languages) - 1u) : language;
|
2012-06-28 15:05:31 +02:00
|
|
|
|
2018-05-08 15:49:43 +02:00
|
|
|
u8 patchVidMode = min(m_gcfg2.getUInt(id, "patch_video_modes", 0), ARRAY_SIZE(CMenu::_vidModePatch) - 1u);
|
|
|
|
int aspectRatio = min(m_gcfg2.getUInt(id, "aspect_ratio", 0), ARRAY_SIZE(CMenu::_AspectRatio) - 1) - 1;// -1,0,1
|
2018-05-29 11:59:57 +02:00
|
|
|
|
2018-08-01 14:27:12 +02:00
|
|
|
u32 returnTo = 0;
|
2018-05-29 11:59:57 +02:00
|
|
|
const char *rtrn = m_cfg.getString("GENERAL", "returnto").c_str();
|
2018-08-01 14:27:12 +02:00
|
|
|
if(strlen(rtrn) == 4)
|
|
|
|
returnTo = rtrn[0] << 24 | rtrn[1] << 16 | rtrn[2] << 8 | rtrn[3];
|
2012-06-28 15:05:31 +02:00
|
|
|
|
2012-11-03 20:16:03 +01:00
|
|
|
u8 *cheatFile = NULL;
|
2012-09-07 22:45:04 +02:00
|
|
|
u32 cheatSize = 0;
|
2012-10-04 18:07:26 +02:00
|
|
|
if(!WII_Launch)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
|
|
|
hooktype = (u32) m_gcfg2.getInt(id, "hooktype", 0);
|
2013-05-21 14:43:14 +02:00
|
|
|
debuggerselect = m_gcfg2.getInt(id, "debugger", 0);
|
|
|
|
if((cheat || debuggerselect == 1) && hooktype == 0)
|
2012-06-07 02:34:47 +02:00
|
|
|
hooktype = 1;
|
2013-05-21 14:43:14 +02:00
|
|
|
else if(!cheat && debuggerselect != 1)
|
2012-06-07 02:34:47 +02:00
|
|
|
hooktype = 0;
|
2013-05-21 14:43:14 +02:00
|
|
|
|
|
|
|
if(cheat)
|
2012-09-07 22:45:04 +02:00
|
|
|
_loadFile(cheatFile, cheatSize, m_cheatDir.c_str(), fmt("%s.gct", id.c_str()));
|
2012-10-04 18:07:26 +02:00
|
|
|
if(has_enabled_providers() && _initNetwork() == 0)
|
|
|
|
add_game_to_card(id.c_str());
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
m_gcfg1.setInt("PLAYCOUNT", id, m_gcfg1.getInt("PLAYCOUNT", id, 0) + 1);
|
|
|
|
m_gcfg1.setUInt("LASTPLAYED", id, time(NULL));
|
|
|
|
|
2017-09-22 00:03:41 +02:00
|
|
|
//interesting - there is only a global option for nand emulation - no per game choice
|
2012-11-04 20:22:02 +01:00
|
|
|
int emulate_mode = min(max(0, m_cfg.getInt(CHANNEL_DOMAIN, "emulation", 1)), (int)ARRAY_SIZE(CMenu::_NandEmu) - 1);
|
2012-06-07 02:34:47 +02:00
|
|
|
|
2012-05-24 00:09:11 +02:00
|
|
|
int userIOS = m_gcfg2.getInt(id, "ios", 0);
|
2012-07-08 15:35:59 +02:00
|
|
|
u64 gameTitle = TITLE_ID(hdr->settings[0],hdr->settings[1]);
|
2018-07-16 00:12:56 +02:00
|
|
|
bool useNK2o = m_gcfg2.getBool(id, "useneek", false);//if not in neek2o and use neek is set
|
2013-01-19 21:48:07 +01:00
|
|
|
bool use_led = m_gcfg2.getBool(id, "led", false);
|
2013-08-23 03:10:20 +02:00
|
|
|
u32 gameIOS = ChannelHandle.GetRequestedIOS(gameTitle);
|
2012-05-12 19:14:25 +02:00
|
|
|
|
2018-07-16 00:12:56 +02:00
|
|
|
if(NANDemuView)
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
|
|
|
/* 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));
|
|
|
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand_miis", false);
|
|
|
|
m_cfg.setBool(CHANNEL_DOMAIN, "real_nand_config", false);
|
|
|
|
}
|
|
|
|
|
2016-11-07 16:06:00 +01:00
|
|
|
/* configs no longer needed */
|
2012-01-21 21:57:41 +01:00
|
|
|
m_gcfg1.save(true);
|
|
|
|
m_gcfg2.save(true);
|
|
|
|
m_cat.save(true);
|
|
|
|
m_cfg.save(true);
|
2012-10-20 15:24:30 +02:00
|
|
|
|
2018-07-16 00:12:56 +02:00
|
|
|
if(NANDemuView)
|
2012-07-22 20:02:56 +02:00
|
|
|
{
|
2012-10-04 18:24:52 +02:00
|
|
|
if(useNK2o)
|
2012-07-22 20:02:56 +02:00
|
|
|
{
|
2012-10-04 18:24:52 +02:00
|
|
|
if(!Load_Neek2o_Kernel())
|
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
error(_t("errneek1", L"Cannot launch neek2o. Verify your neek2o setup"));//kernal.bin not found
|
2016-11-07 16:06:00 +01:00
|
|
|
_exitWiiflow();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
const char *nkrtrn = NULL;
|
|
|
|
if(IsOnWiiU())
|
|
|
|
nkrtrn = "HCVA";// Return to WiiU system channel
|
|
|
|
else
|
|
|
|
nkrtrn = "NK2O";
|
|
|
|
u32 nkreturnTo = nkrtrn[0] << 24 | nkrtrn[1] << 16 | nkrtrn[2] << 8 | nkrtrn[3];
|
2016-11-07 16:06:00 +01:00
|
|
|
cleanup();
|
|
|
|
ShutdownBeforeExit();
|
2017-05-15 19:50:24 +02:00
|
|
|
if(IsOnWiiU())
|
|
|
|
Launch_nk(gameTitle, NandHandle.Get_NandPath(), ((u64)(0x00010002) << 32) | (nkreturnTo & 0xFFFFFFFF));
|
|
|
|
else
|
|
|
|
Launch_nk(gameTitle, NandHandle.Get_NandPath(), ((u64)(0x00010001) << 32) | (nkreturnTo & 0xFFFFFFFF));
|
2016-11-07 16:06:00 +01:00
|
|
|
while(1) usleep(500);
|
2012-10-04 18:24:52 +02:00
|
|
|
}
|
|
|
|
}
|
2012-07-10 13:25:27 +02:00
|
|
|
}
|
2014-03-24 19:59:24 +01:00
|
|
|
if(WII_Launch == false && ExternalBooter_LoadBins(m_binsDir.c_str()) == false)
|
2016-11-07 16:06:00 +01:00
|
|
|
{
|
|
|
|
error(_t("errgame15", L"Missing ext_loader.bin or ext_booter.bin!"));
|
|
|
|
_exitWiiflow();
|
|
|
|
}
|
2017-09-22 00:03:41 +02:00
|
|
|
if(_loadIOS(gameIOS, userIOS, id, !NANDemuView) == LOAD_IOS_FAILED)//in neek2o this will only load the game IOS not a cIOS
|
2016-11-07 16:06:00 +01:00
|
|
|
{
|
|
|
|
/* error message already shown */
|
|
|
|
_exitWiiflow();
|
|
|
|
}
|
2013-12-24 16:35:59 +01:00
|
|
|
|
2018-07-16 00:12:56 +02:00
|
|
|
if(CurrentIOS.Type == IOS_TYPE_D2X && returnTo != 0)
|
2012-07-10 23:24:38 +02:00
|
|
|
{
|
2012-10-20 15:24:30 +02:00
|
|
|
if(D2X_PatchReturnTo(returnTo) >= 0)
|
2017-09-22 00:03:41 +02:00
|
|
|
memset(&returnTo, 0, sizeof(u32));// not needed - always set to 0 in external booter below
|
2012-10-20 15:24:30 +02:00
|
|
|
}
|
2018-07-16 00:12:56 +02:00
|
|
|
if(NANDemuView)
|
2012-10-20 15:24:30 +02:00
|
|
|
{
|
2012-12-22 21:57:23 +01:00
|
|
|
/* Enable our Emu NAND */
|
2012-12-22 23:28:58 +01:00
|
|
|
DeviceHandle.UnMountAll();
|
2012-10-20 15:24:30 +02:00
|
|
|
if(emulate_mode == 1)
|
|
|
|
NandHandle.Set_FullMode(true);
|
|
|
|
else
|
|
|
|
NandHandle.Set_FullMode(false);
|
|
|
|
if(NandHandle.Enable_Emu() < 0)
|
|
|
|
{
|
|
|
|
NandHandle.Disable_Emu();
|
|
|
|
error(_t("errgame5", L"Enabling emu failed!"));
|
2016-11-07 16:06:00 +01:00
|
|
|
_exitWiiflow();
|
2012-10-20 15:24:30 +02:00
|
|
|
}
|
2012-12-22 23:28:58 +01:00
|
|
|
DeviceHandle.MountAll();
|
2012-07-10 23:24:38 +02:00
|
|
|
}
|
2016-11-07 16:06:00 +01:00
|
|
|
|
|
|
|
cleanup();//done with error menu can now cleanup
|
|
|
|
|
2012-10-04 18:07:26 +02:00
|
|
|
if(WII_Launch)
|
2012-08-12 23:26:24 +02:00
|
|
|
{
|
2012-09-02 13:51:26 +02:00
|
|
|
ShutdownBeforeExit();
|
2012-08-12 23:26:24 +02:00
|
|
|
WII_Initialize();
|
2012-09-09 20:35:15 +02:00
|
|
|
WII_LaunchTitle(gameTitle);
|
2012-08-12 23:26:24 +02:00
|
|
|
}
|
2012-10-04 18:07:26 +02:00
|
|
|
else
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
|
|
|
setLanguage(language);
|
2012-11-03 20:16:03 +01:00
|
|
|
ocarina_load_code(cheatFile, cheatSize);
|
2017-09-22 00:03:41 +02:00
|
|
|
NandHandle.Patch_AHB(); /* Identify maybe uses it so keep AHBPROT disabled */
|
2018-08-01 14:27:12 +02:00
|
|
|
PatchIOS(true, isWiiVC); /* Patch for everything */
|
2012-09-07 22:10:04 +02:00
|
|
|
Identify(gameTitle);
|
2013-12-24 16:35:59 +01:00
|
|
|
|
|
|
|
ExternalBooter_ChannelSetup(gameTitle, use_dol);
|
|
|
|
WiiFlow_ExternalBooter(videoMode, vipatch, countryPatch, patchVidMode, aspectRatio, 0, TYPE_CHANNEL, use_led);
|
2012-07-10 13:25:27 +02:00
|
|
|
}
|
2012-09-09 20:35:15 +02:00
|
|
|
Sys_Exit();
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
|
2017-04-18 01:23:50 +02:00
|
|
|
void CMenu::_launchGame(dir_discHdr *hdr, bool dvd, bool disc_cfg)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2012-07-08 16:44:21 +02:00
|
|
|
string id(hdr->id);
|
|
|
|
string path(hdr->path);
|
2012-07-13 15:16:13 +02:00
|
|
|
|
2012-07-08 16:44:21 +02:00
|
|
|
if(dvd)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
TempLoadIOS();// switch to cIOS if using IOS58 and not in neek2o
|
2012-01-21 21:57:41 +01:00
|
|
|
/* Open Disc */
|
2012-09-05 17:52:32 +02:00
|
|
|
if(Disc_Open(true) < 0)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2012-07-07 00:38:21 +02:00
|
|
|
error(_t("wbfsoperr2", L"Disc_Open failed"));
|
2012-09-09 20:35:15 +02:00
|
|
|
Sys_Exit();
|
2012-01-23 16:57:30 +01:00
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
/* Check disc */
|
2012-09-05 17:52:32 +02:00
|
|
|
if(Disc_IsWii() < 0)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2016-04-03 02:31:02 +02:00
|
|
|
if(Disc_IsGC() < 0)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2012-07-07 00:38:21 +02:00
|
|
|
error(_t("errgame9", L"This is not a Wii or GC disc"));
|
2012-09-09 20:35:15 +02:00
|
|
|
Sys_Exit();
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
else
|
2012-03-18 14:29:17 +01:00
|
|
|
{
|
|
|
|
/* Read GC disc header */
|
2012-11-18 14:40:26 +01:00
|
|
|
Disc_ReadGCHeader(&gc_hdr);
|
|
|
|
memcpy(hdr->id, gc_hdr.id, 6);
|
2017-04-18 01:23:50 +02:00
|
|
|
hdr->type = TYPE_GC_GAME;
|
2016-04-03 02:31:02 +02:00
|
|
|
|
2012-03-18 14:29:17 +01:00
|
|
|
/* Launching GC Game */
|
2016-04-03 02:31:02 +02:00
|
|
|
if(m_nintendont_installed)
|
2017-04-18 01:23:50 +02:00
|
|
|
{
|
|
|
|
if(disc_cfg)
|
|
|
|
_gameSettings(hdr, dvd);
|
|
|
|
MusicPlayer.Stop();
|
|
|
|
m_cfg.setInt("GENERAL", "cat_startpage", m_catStartPage);
|
|
|
|
if(!disc_cfg)
|
|
|
|
m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str()));
|
|
|
|
currentPartition = m_cfg.getInt(GC_DOMAIN, "partition", 1);
|
|
|
|
_launchGC(hdr, dvd);
|
|
|
|
}
|
2016-04-03 02:31:02 +02:00
|
|
|
else
|
|
|
|
error(_t("errgame12", L"Nintendont not found! Can't launch GC Disc."));
|
2012-11-18 14:40:26 +01:00
|
|
|
return;
|
2012-03-18 14:29:17 +01:00
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2012-07-08 16:44:21 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Read header */
|
2012-11-18 14:40:26 +01:00
|
|
|
Disc_ReadHeader(&wii_hdr);
|
2017-04-18 01:23:50 +02:00
|
|
|
memcpy(hdr->id, wii_hdr.id, 6);
|
2012-12-27 18:01:04 +01:00
|
|
|
id = string((const char*)wii_hdr.id, 6);
|
2017-04-18 01:23:50 +02:00
|
|
|
hdr->type = TYPE_WII_GAME;
|
|
|
|
if(disc_cfg)
|
|
|
|
_gameSettings(hdr, dvd);
|
|
|
|
MusicPlayer.Stop();
|
|
|
|
m_cfg.setInt("GENERAL", "cat_startpage", m_catStartPage);
|
|
|
|
if(!disc_cfg)
|
|
|
|
m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str()));
|
|
|
|
currentPartition = m_cfg.getInt(WII_DOMAIN, "partition", 1);
|
2012-07-08 16:44:21 +02:00
|
|
|
}
|
|
|
|
gprintf("Game ID: %s\n", id.c_str());
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2017-04-18 01:23:50 +02:00
|
|
|
|
|
|
|
/* clear coverflow, start wiiflow wait animation, set exit handler */
|
|
|
|
_launchShutdown();
|
2016-12-01 01:05:39 +01:00
|
|
|
bool vipatch = m_gcfg2.getBool(id, "vipatch", false);
|
|
|
|
bool countryPatch = m_gcfg2.getBool(id, "country_patch", false);
|
|
|
|
bool private_server = m_gcfg2.getBool(id, "private_server", false);
|
2012-06-28 15:05:31 +02:00
|
|
|
|
2018-05-08 15:49:43 +02:00
|
|
|
u8 videoMode = min(m_gcfg2.getUInt(id, "video_mode", 0), ARRAY_SIZE(CMenu::_VideoModes) - 1u);
|
|
|
|
videoMode = (videoMode == 0) ? min(m_cfg.getUInt("GENERAL", "video_mode", 0), ARRAY_SIZE(CMenu::_GlobalVideoModes) - 1u) : videoMode-1;
|
2012-06-28 15:05:31 +02:00
|
|
|
|
2018-05-08 15:49:43 +02:00
|
|
|
int language = min(m_gcfg2.getUInt(id, "language", 0), ARRAY_SIZE(CMenu::_languages) - 1u);
|
|
|
|
language = (language == 0) ? min(m_cfg.getUInt("GENERAL", "game_language", 0), ARRAY_SIZE(CMenu::_languages) - 1u) : language;
|
2012-06-28 15:05:31 +02:00
|
|
|
|
2018-08-01 14:27:12 +02:00
|
|
|
u32 returnTo = 0;
|
2018-05-29 11:59:57 +02:00
|
|
|
const char *rtrn = m_cfg.getString("GENERAL", "returnto").c_str();
|
2018-11-28 01:08:23 +01:00
|
|
|
/* this if is done in case "returnto" is set to disabled in which case rtrn would point to nothing */
|
2018-08-01 14:27:12 +02:00
|
|
|
if(strlen(rtrn) == 4)
|
|
|
|
returnTo = rtrn[0] << 24 | rtrn[1] << 16 | rtrn[2] << 8 | rtrn[3];
|
2018-05-29 11:59:57 +02:00
|
|
|
|
2018-05-08 15:49:43 +02:00
|
|
|
int aspectRatio = min(m_gcfg2.getUInt(id, "aspect_ratio", 0), ARRAY_SIZE(CMenu::_AspectRatio) - 1u) - 1;
|
|
|
|
u8 patchVidMode = min(m_gcfg2.getUInt(id, "patch_video_modes", 0), ARRAY_SIZE(CMenu::_vidModePatch) - 1u);
|
2012-01-27 14:59:36 +01:00
|
|
|
|
2018-05-08 15:49:43 +02:00
|
|
|
u8 emulate_mode = min(m_gcfg2.getUInt(id, "emulate_save", 0), ARRAY_SIZE(CMenu::_SaveEmu) - 1u);
|
2017-09-22 00:03:41 +02:00
|
|
|
u8 gameEmuMode = emulate_mode;
|
2016-04-21 02:05:28 +02:00
|
|
|
if(emulate_mode == 0)// default then use global
|
2012-11-04 20:22:02 +01:00
|
|
|
emulate_mode = min(max(0, m_cfg.getInt(WII_DOMAIN, "save_emulation", 0)), (int)ARRAY_SIZE(CMenu::_GlobalSaveEmu) - 1);
|
2016-04-25 02:04:38 +02:00
|
|
|
else
|
|
|
|
emulate_mode--;
|
2016-11-07 16:06:00 +01:00
|
|
|
|
2018-07-16 00:12:56 +02:00
|
|
|
if(emulate_mode && !dvd)
|
2012-08-25 17:10:57 +02:00
|
|
|
{
|
2018-07-09 16:53:35 +02:00
|
|
|
int emuPart = _FindEmuPart(SAVES_NAND, true);
|
2017-09-22 00:03:41 +02:00
|
|
|
if(emuPart == -1)//if savepartition is unusable
|
2012-05-03 01:08:11 +02:00
|
|
|
{
|
2016-04-25 02:04:38 +02:00
|
|
|
_hideWaitMessage();
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
error(_t("errgame13", L"EmuNAND for gamesave not found! Using real NAND."));
|
|
|
|
emulate_mode = 0;
|
2016-04-25 02:04:38 +02:00
|
|
|
_showWaitMessage();
|
2012-08-25 17:10:57 +02:00
|
|
|
}
|
2018-07-09 16:53:35 +02:00
|
|
|
else // partition is good so now check if save exists on savesnand
|
2012-03-13 00:57:59 +01:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
bool need_config = false;
|
|
|
|
bool need_miis = false;
|
2018-06-06 23:56:21 +02:00
|
|
|
const char *emuPath = NandHandle.Get_NandPath();
|
2017-09-22 00:03:41 +02:00
|
|
|
|
|
|
|
char basepath[MAX_FAT_PATH];
|
2018-06-06 23:56:21 +02:00
|
|
|
snprintf(basepath, sizeof(basepath), "%s:%s", DeviceName[emuPart], emuPath);
|
|
|
|
|
2018-05-29 11:59:57 +02:00
|
|
|
char testpath[strlen(basepath) + 42];
|
2017-09-22 00:03:41 +02:00
|
|
|
|
|
|
|
// does not check to see if actual tmd exist just if the folder exist
|
2018-07-09 16:53:35 +02:00
|
|
|
if(!_checkSave(id, SAVES_NAND))//if save is not on saves emunand
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
2018-07-09 16:53:35 +02:00
|
|
|
/* still use savesnand to create a new save on the savesnand */
|
|
|
|
/* make savesnand folders in case they don't already exist */
|
2017-09-22 00:03:41 +02:00
|
|
|
NandHandle.CreatePath("%s/import", basepath);
|
|
|
|
NandHandle.CreatePath("%s/meta", basepath);
|
|
|
|
NandHandle.CreatePath("%s/shared1", basepath);
|
|
|
|
NandHandle.CreatePath("%s/shared2", basepath);
|
|
|
|
NandHandle.CreatePath("%s/sys", basepath);
|
|
|
|
NandHandle.CreatePath("%s/title", basepath);
|
|
|
|
NandHandle.CreatePath("%s/ticket", basepath);
|
|
|
|
NandHandle.CreatePath("%s/tmp", basepath);
|
|
|
|
NandHandle.CreateTitleTMD(hdr);//setup emunand for wii gamesave
|
|
|
|
}
|
2018-07-09 16:53:35 +02:00
|
|
|
/* check if saves emulation is set to full per this game in case the global defualt is not full */
|
|
|
|
if(gameEmuMode == 3)// if is then we need to make sure the savesnand contains mii's and config files
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
|
|
|
//check config files
|
|
|
|
snprintf(testpath, sizeof(testpath), "%s/shared2/sys/SYSCONF", basepath);
|
|
|
|
if(!fsop_FileExist(testpath))
|
|
|
|
need_config = true;
|
|
|
|
snprintf(testpath, sizeof(testpath), "%s/title/00000001/00000002/data/setting.txt", basepath);
|
|
|
|
if(!fsop_FileExist(testpath))
|
|
|
|
need_config = true;
|
|
|
|
// Check Mii's
|
|
|
|
snprintf(testpath, sizeof(testpath), "%s/shared2/menu/FaceLib/RFL_DB.dat", basepath);
|
|
|
|
if(!fsop_FileExist(testpath))
|
|
|
|
need_miis = true;
|
|
|
|
|
|
|
|
NandHandle.PreNandCfg(need_miis, need_config);//copy to emunand if needed
|
|
|
|
}
|
2012-03-13 00:57:59 +01:00
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
else
|
2018-07-09 16:53:35 +02:00
|
|
|
emulate_mode = 0;//sets to off if we are using neek2o or launching a DVD game
|
2013-01-01 18:42:46 +01:00
|
|
|
|
2013-01-19 21:48:07 +01:00
|
|
|
bool use_led = m_gcfg2.getBool(id, "led", false);
|
2016-12-01 01:05:39 +01:00
|
|
|
bool cheat = m_gcfg2.getBool(id, "cheat", false);
|
2013-05-21 14:43:14 +02:00
|
|
|
debuggerselect = m_gcfg2.getInt(id, "debugger", 0); // debuggerselect is defined in fst.h
|
|
|
|
if((id == "RPWE41" || id == "RPWZ41" || id == "SPXP41") && debuggerselect == 1) // Prince of Persia, Rival Swords
|
|
|
|
debuggerselect = 0;
|
2012-10-20 15:24:30 +02:00
|
|
|
hooktype = (u32)m_gcfg2.getInt(id, "hooktype", 0); // hooktype is defined in patchcode.h
|
2013-05-21 14:43:14 +02:00
|
|
|
if((cheat || debuggerselect == 1) && hooktype == 0)
|
|
|
|
hooktype = 1;
|
|
|
|
else if(!cheat && debuggerselect != 1)
|
|
|
|
hooktype = 0;
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2012-11-03 20:16:03 +01:00
|
|
|
u8 *cheatFile = NULL;
|
|
|
|
u8 *gameconfig = NULL;
|
2018-05-29 11:59:57 +02:00
|
|
|
u32 cheatSize = 0, gameconfigSize = 0;
|
2012-01-21 21:57:41 +01:00
|
|
|
|
|
|
|
m_gcfg1.setInt("PLAYCOUNT", id, m_gcfg1.getInt("PLAYCOUNT", id, 0) + 1);
|
|
|
|
m_gcfg1.setUInt("LASTPLAYED", id, time(NULL));
|
2012-03-18 14:29:17 +01:00
|
|
|
|
2012-06-07 02:34:47 +02:00
|
|
|
if(has_enabled_providers() && _initNetwork() == 0)
|
2012-07-08 16:44:21 +02:00
|
|
|
add_game_to_card(id.c_str());
|
2012-01-21 21:57:41 +01:00
|
|
|
|
|
|
|
setLanguage(language);
|
|
|
|
|
2012-10-20 15:24:30 +02:00
|
|
|
load_wip_patches((u8 *)m_wipDir.c_str(), (u8 *) &id);
|
2012-05-12 18:03:14 +02:00
|
|
|
if(cheat)
|
2012-07-08 16:44:21 +02:00
|
|
|
_loadFile(cheatFile, cheatSize, m_cheatDir.c_str(), fmt("%s.gct", id.c_str()));
|
2012-01-21 21:57:41 +01:00
|
|
|
_loadFile(gameconfig, gameconfigSize, m_txtCheatDir.c_str(), "gameconfig.txt");
|
2012-09-20 16:15:53 +02:00
|
|
|
|
2013-01-19 21:48:07 +01:00
|
|
|
int userIOS = m_gcfg2.getInt(id, "ios", 0);
|
2018-07-16 00:12:56 +02:00
|
|
|
int gameIOS = dvd ? userIOS : GetRequestedGameIOS(hdr);
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2012-07-08 15:35:59 +02:00
|
|
|
m_gcfg1.save(true);
|
|
|
|
m_gcfg2.save(true);
|
|
|
|
m_cat.save(true);
|
|
|
|
m_cfg.save(true);
|
2012-09-20 16:15:53 +02:00
|
|
|
|
-updating wiiflow lite to beta 4.3.0
-fixed using categories to hide GC disc 2's. Apparently this has never really worked right for some time or ever.
-fixed deleting the cached cover texture file for plugin games. Delete cover for plugins only deletes the cached texture file (.wfc)
-fixed favorites and adultonly (parental lock) for plugin games. Apparently I may have broke this a few revisions back.
-favorites and adultonly for plugin games now have their own domains in gamecfg1- [FAVORITES_PLUGINS] and [ADULTONLY_PLUGINS]. just makes it more organized.
-only wii, GC, channels are added to [PLAYCOUNT] and [LAST_PLAYED] in gamecfg1.
-now loading gamecfg1 at startup and leaving it loaded till exit. no more loading it and unloading all the time.
-fixed scrolling for game_info synopsis, credits, and help text.
-made source menu buttons wider for wiiflow default. old 80x80, now 100x80. looks better.
-display music info now defaults to off
-screensaver_disabled now defaults to yes
-show GC view button is now on by default no matter what. the only way it is disabled is if you edit wiiflow.ini manually. this is how all the view buttons work.
-removed hiding homebrew button but if wiiflow locked it won't work or in sourceflow it won't show.
-dump_list is now under [GENERAL] instead of each view. Also only works for Wii, GC, and channels.
-sorting only works for Wii, GC, and Channels now. disabled for sourceflow, plugins, homebrew, and combined view.
-now if no games are found a message is shown with the current path so you can see where wiiflow is looking. (except for plugins)
-removed auto create emuNAND for emuNAND view if gamelist is empty. just go to settings>NAND settings if you want to extract or disable it.
-now when no games are found all buttons at bottom are still accessible allowing you to change the view or go to settings and change current partition or path and even extract your NAND to create a EmuNAND. Or go to Home Menu and Install a Wii or GC game.
-removed auto extract NAND to emuNAND when launching a Wii game with EmuNAND save. Now a message is diplayed saying 'emuNAND for saves not found - using real NAND'.
-made the speed at which cover titles fade in/out almost instantly.
-removed update button from Home Menu. online update code is still there but not used and probably won't be used any more as there just isn't a need for it now.
-removed ftp button from Home Menu and all code for the FTP server. I just use WiiXplorer's FTP server. it seems to work better for me.
-disabled keep USB Alive thread for now. i think there's a possibilty it might be the cause of my SD/USB files getting corrupted.
-removed Btn B and - combo to switch partitions. didn't seem useful anymore.
-redid nand emulation settings menu. looks like this now:
pg1
Select EmuNAND
EmuNAND Enulation
Select SaveNAND
SaveNAND Emulation
pg2
Extract Saves All
Missing
Extract NAND
Select Saves Partition
-no longer blocking Select Plugin menu and View icons when using source menu combined view
-now Select Plugins Menu is like switching to plugin view but you get to choose the plugins first
-now [PLUGIN] partition= is the default partition for all plugins. to change individual plugins add 'romPartition=x' to the plugin ini. x is the partition number 0 thru 8 with SD being 0. this is how my usbloadergx plugin mod works.
2016-10-05 01:44:13 +02:00
|
|
|
//this is a temp region change of real nand(rn) for gamesave or off or DVD if tempregionrn is set true
|
2014-03-01 00:11:02 +01:00
|
|
|
bool patchregion = false;
|
2018-07-16 00:12:56 +02:00
|
|
|
if(emulate_mode <= 1 && m_cfg.getBool("GENERAL", "tempregionrn", false))
|
2014-03-01 00:11:02 +01:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
gprintf("Temp region change applied\n");
|
|
|
|
// change real nand region to game ID[3] region. is reset when you turn wii off.
|
2014-03-01 00:11:02 +01:00
|
|
|
patchregion = NandHandle.Do_Region_Change(id, true);
|
|
|
|
}
|
2016-11-07 16:06:00 +01:00
|
|
|
//load external booter bin file
|
2014-03-24 19:59:24 +01:00
|
|
|
if(ExternalBooter_LoadBins(m_binsDir.c_str()) == false)
|
2016-11-07 16:06:00 +01:00
|
|
|
{
|
|
|
|
error(_t("errgame15", L"Missing ext_loader.bin or ext_booter.bin!"));
|
|
|
|
_exitWiiflow();
|
|
|
|
}
|
2018-07-16 00:12:56 +02:00
|
|
|
if(!dvd)
|
2012-09-20 16:15:53 +02:00
|
|
|
{
|
|
|
|
if(_loadIOS(gameIOS, userIOS, id) == LOAD_IOS_FAILED)
|
2016-11-07 16:06:00 +01:00
|
|
|
{
|
|
|
|
/* error message already shown */
|
|
|
|
_exitWiiflow();
|
|
|
|
}
|
2012-09-20 16:15:53 +02:00
|
|
|
}
|
2013-12-24 16:35:59 +01:00
|
|
|
|
2013-02-08 11:39:07 +01:00
|
|
|
if(CurrentIOS.Type == IOS_TYPE_D2X)
|
2012-10-13 18:57:03 +02:00
|
|
|
{
|
2013-02-08 11:39:07 +01:00
|
|
|
if(returnTo != 0 && !m_directLaunch && D2X_PatchReturnTo(returnTo) >= 0)
|
2017-09-22 00:03:41 +02:00
|
|
|
memset(&returnTo, 0, sizeof(u32));//set to null to keep external booter from setting it again if using d2x
|
2013-02-08 11:39:07 +01:00
|
|
|
if(emulate_mode)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2013-02-08 11:39:07 +01:00
|
|
|
/* Enable our Emu NAND */
|
|
|
|
DeviceHandle.UnMountAll();
|
2016-04-25 02:04:38 +02:00
|
|
|
if(emulate_mode == 2)
|
2013-02-08 11:39:07 +01:00
|
|
|
NandHandle.Set_FullMode(true);
|
|
|
|
else
|
|
|
|
NandHandle.Set_FullMode(false);
|
|
|
|
if(NandHandle.Enable_Emu() < 0)
|
|
|
|
{
|
|
|
|
NandHandle.Disable_Emu();
|
|
|
|
error(_t("errgame6", L"Enabling emu after reload failed!"));
|
|
|
|
Sys_Exit();
|
|
|
|
}
|
|
|
|
DeviceHandle.MountAll();
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
}
|
2016-11-07 16:06:00 +01:00
|
|
|
|
|
|
|
/* no more error msgs - clear btns and snds */
|
2017-09-22 00:03:41 +02:00
|
|
|
cleanup();
|
2016-11-07 16:06:00 +01:00
|
|
|
|
2012-09-28 19:24:04 +02:00
|
|
|
bool wbfs_partition = false;
|
2012-07-08 16:44:21 +02:00
|
|
|
if(!dvd)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2012-09-22 15:47:52 +02:00
|
|
|
DeviceHandle.OpenWBFS(currentPartition);
|
2012-09-28 19:24:04 +02:00
|
|
|
wbfs_partition = (DeviceHandle.GetFSType(currentPartition) == PART_FS_WBFS);
|
2012-09-22 15:47:52 +02:00
|
|
|
if(!wbfs_partition && get_frag_list((u8 *)id.c_str(), (char*)path.c_str(), currentPartition == 0 ? 0x200 : USBStorage2_GetSectorSize()) < 0)
|
|
|
|
Sys_Exit();
|
|
|
|
WBFS_Close();
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2012-11-03 20:16:03 +01:00
|
|
|
if(cheatFile != NULL)
|
2012-09-20 16:15:53 +02:00
|
|
|
{
|
2012-11-03 20:16:03 +01:00
|
|
|
ocarina_load_code(cheatFile, cheatSize);
|
|
|
|
free(cheatFile);
|
2012-09-20 16:15:53 +02:00
|
|
|
}
|
2012-11-03 20:16:03 +01:00
|
|
|
if(gameconfig != NULL)
|
2012-10-14 19:18:13 +02:00
|
|
|
{
|
2012-11-03 20:16:03 +01:00
|
|
|
app_gameconfig_load(id.c_str(), gameconfig, gameconfigSize);
|
|
|
|
free(gameconfig);
|
2012-10-14 19:18:13 +02:00
|
|
|
}
|
2013-11-19 16:27:52 +01:00
|
|
|
|
2016-04-02 17:46:06 +02:00
|
|
|
ExternalBooter_WiiGameSetup(wbfs_partition, dvd, patchregion, private_server, id.c_str());
|
2013-12-24 16:35:59 +01:00
|
|
|
WiiFlow_ExternalBooter(videoMode, vipatch, countryPatch, patchVidMode, aspectRatio, returnTo, TYPE_WII_GAME, use_led);
|
|
|
|
|
2013-11-19 16:27:52 +01:00
|
|
|
Sys_Exit();
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
|
2016-11-07 16:06:00 +01:00
|
|
|
void CMenu::_exitWiiflow()
|
|
|
|
{
|
|
|
|
//Exit WiiFlow, no game booted...
|
|
|
|
cleanup();// cleanup and clear memory
|
|
|
|
ShutdownBeforeExit();// unmount devices and close inputs
|
|
|
|
Sys_Exit();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-11-03 20:16:03 +01:00
|
|
|
void CMenu::_initGameMenu()
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2016-11-07 16:06:00 +01:00
|
|
|
//CColor fontColor(0xD0BFDFFF);
|
2013-11-04 20:46:23 +01:00
|
|
|
TexData texGameFavOn;
|
|
|
|
TexData texGameFavOnSel;
|
|
|
|
TexData texGameFavOff;
|
|
|
|
TexData texGameFavOffSel;
|
2012-12-28 15:19:40 +01:00
|
|
|
TexData texAdultOn;
|
|
|
|
TexData texAdultOnSel;
|
|
|
|
TexData texAdultOff;
|
|
|
|
TexData texAdultOffSel;
|
|
|
|
TexData texDelete;
|
|
|
|
TexData texDeleteSel;
|
|
|
|
TexData texSettings;
|
|
|
|
TexData texSettingsSel;
|
2013-11-19 16:27:52 +01:00
|
|
|
TexData texToggleBanner;
|
2012-12-28 15:19:40 +01:00
|
|
|
TexData bgLQ;
|
|
|
|
|
2013-11-19 16:27:52 +01:00
|
|
|
TexHandle.fromImageFile(texGameFavOn, fmt("%s/gamefavon.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texGameFavOnSel, fmt("%s/gamefavons.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texGameFavOff, fmt("%s/gamefavoff.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texGameFavOffSel, fmt("%s/gamefavoffs.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texAdultOn, fmt("%s/stopkidon.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texAdultOnSel, fmt("%s/stopkidons.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texAdultOff, fmt("%s/stopkidoff.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texAdultOffSel, fmt("%s/stopkidoffs.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texDelete, fmt("%s/delete.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texDeleteSel, fmt("%s/deletes.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texSettings, fmt("%s/btngamecfg.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texSettingsSel, fmt("%s/btngamecfgs.png", m_imgsDir.c_str()));
|
|
|
|
TexHandle.fromImageFile(texToggleBanner, fmt("%s/blank.png", m_imgsDir.c_str()));
|
2012-07-04 21:45:53 +02:00
|
|
|
|
2012-11-03 20:16:03 +01:00
|
|
|
_addUserLabels(m_gameLblUser, ARRAY_SIZE(m_gameLblUser), "GAME");
|
|
|
|
m_gameBg = _texture("GAME/BG", "texture", theme.bg, false);
|
2012-12-28 15:19:40 +01:00
|
|
|
if(m_theme.loaded() && TexHandle.fromImageFile(bgLQ, fmt("%s/%s", m_themeDataDir.c_str(), m_theme.getString("GAME/BG", "texture").c_str()), GX_TF_CMPR, 64, 64) == TE_OK)
|
2012-01-21 21:57:41 +01:00
|
|
|
m_gameBgLQ = bgLQ;
|
|
|
|
|
2013-11-04 20:46:23 +01:00
|
|
|
m_gameBtnPlay = _addButton("GAME/PLAY_BTN", theme.btnFont, L"", 420, 344, 200, 48, theme.btnFontColor);
|
|
|
|
m_gameBtnBack = _addButton("GAME/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 48, theme.btnFontColor);
|
|
|
|
m_gameBtnFavoriteOn = _addPicButton("GAME/FAVORITE_ON", texGameFavOn, texGameFavOnSel, 460, 200, 48, 48);
|
|
|
|
m_gameBtnFavoriteOff = _addPicButton("GAME/FAVORITE_OFF", texGameFavOff, texGameFavOffSel, 460, 200, 48, 48);
|
2012-11-03 20:16:03 +01:00
|
|
|
m_gameBtnAdultOn = _addPicButton("GAME/ADULTONLY_ON", texAdultOn, texAdultOnSel, 532, 200, 48, 48);
|
|
|
|
m_gameBtnAdultOff = _addPicButton("GAME/ADULTONLY_OFF", texAdultOff, texAdultOffSel, 532, 200, 48, 48);
|
|
|
|
m_gameBtnSettings = _addPicButton("GAME/SETTINGS_BTN", texSettings, texSettingsSel, 460, 272, 48, 48);
|
|
|
|
m_gameBtnDelete = _addPicButton("GAME/DELETE_BTN", texDelete, texDeleteSel, 532, 272, 48, 48);
|
|
|
|
m_gameBtnBackFull = _addButton("GAME/BACK_FULL_BTN", theme.btnFont, L"", 100, 390, 200, 56, theme.btnFontColor);
|
|
|
|
m_gameBtnPlayFull = _addButton("GAME/PLAY_FULL_BTN", theme.btnFont, L"", 340, 390, 200, 56, theme.btnFontColor);
|
2016-04-02 19:19:19 +02:00
|
|
|
m_gameBtnToggle = _addPicButton("GAME/TOOGLE_BTN", texToggleBanner, texToggleBanner, 385, 31, 236, 127);
|
|
|
|
m_gameBtnToggleFull = _addPicButton("GAME/TOOGLE_FULL_BTN", texToggleBanner, texToggleBanner, 20, 12, 608, 344);
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2018-10-17 16:00:01 +02:00
|
|
|
m_gameButtonsZone.x = m_theme.getInt("GAME/ZONES", "buttons_x", 380);
|
2012-01-21 21:57:41 +01:00
|
|
|
m_gameButtonsZone.y = m_theme.getInt("GAME/ZONES", "buttons_y", 0);
|
|
|
|
m_gameButtonsZone.w = m_theme.getInt("GAME/ZONES", "buttons_w", 640);
|
|
|
|
m_gameButtonsZone.h = m_theme.getInt("GAME/ZONES", "buttons_h", 480);
|
|
|
|
m_gameButtonsZone.hide = m_theme.getBool("GAME/ZONES", "buttons_hide", true);
|
|
|
|
|
2013-11-04 20:46:23 +01:00
|
|
|
_setHideAnim(m_gameBtnPlay, "GAME/PLAY_BTN", 0, 0, 1.f, -1.f);
|
|
|
|
_setHideAnim(m_gameBtnBack, "GAME/BACK_BTN", 0, 0, 1.f, -1.f);
|
|
|
|
_setHideAnim(m_gameBtnFavoriteOn, "GAME/FAVORITE_ON", 0, 0, 1.f, -1.f);
|
|
|
|
_setHideAnim(m_gameBtnFavoriteOff, "GAME/FAVORITE_OFF", 0, 0, 1.f, -1.f);
|
|
|
|
_setHideAnim(m_gameBtnAdultOn, "GAME/ADULTONLY_ON", 0, 0, 1.f, -1.f);
|
|
|
|
_setHideAnim(m_gameBtnAdultOff, "GAME/ADULTONLY_OFF", 0, 0, 1.f, -1.f);
|
|
|
|
_setHideAnim(m_gameBtnSettings, "GAME/SETTINGS_BTN", 0, 0, 1.f, -1.f);
|
|
|
|
_setHideAnim(m_gameBtnDelete, "GAME/DELETE_BTN", 0, 0, 1.f, -1.f);
|
2012-07-29 00:38:46 +02:00
|
|
|
_setHideAnim(m_gameBtnPlayFull, "GAME/PLAY_FULL_BTN", 0, 0, 1.f, 0.f);
|
|
|
|
_setHideAnim(m_gameBtnBackFull, "GAME/BACK_FULL_BTN", 0, 0, 1.f, 0.f);
|
2016-04-02 19:19:19 +02:00
|
|
|
_setHideAnim(m_gameBtnToggle, "GAME/TOOGLE_BTN", 200, 0, 1.f, 0.f);
|
|
|
|
_setHideAnim(m_gameBtnToggleFull, "GAME/TOOGLE_FULL_BTN", 200, 0, 1.f, 0.f);
|
2012-01-21 21:57:41 +01:00
|
|
|
_hideGame(true);
|
|
|
|
_textGame();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CMenu::_textGame(void)
|
|
|
|
{
|
|
|
|
m_btnMgr.setText(m_gameBtnPlay, _t("gm1", L"Play"));
|
|
|
|
m_btnMgr.setText(m_gameBtnBack, _t("gm2", L"Back"));
|
2012-07-04 00:08:51 +02:00
|
|
|
m_btnMgr.setText(m_gameBtnPlayFull, _t("gm1", L"Play"));
|
|
|
|
m_btnMgr.setText(m_gameBtnBackFull, _t("gm2", L"Back"));
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
struct IMD5Header
|
|
|
|
{
|
|
|
|
u32 fcc;
|
|
|
|
u32 filesize;
|
|
|
|
u8 zeroes[8];
|
|
|
|
u8 crypto[16];
|
2013-01-01 18:42:46 +01:00
|
|
|
} ATTRIBUTE_PACKED;
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2017-04-18 01:23:50 +02:00
|
|
|
// loads game banner and sound to be played by mainloop
|
2018-05-29 11:59:57 +02:00
|
|
|
void * CMenu::_gameSoundThread(void *obj)
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2018-05-29 11:59:57 +02:00
|
|
|
CMenu *m = (CMenu*)obj;
|
2012-11-04 15:13:42 +01:00
|
|
|
m->m_soundThrdBusy = true;
|
2012-08-13 07:09:40 +02:00
|
|
|
m->m_gamesound_changed = false;
|
2017-09-22 00:03:41 +02:00
|
|
|
CurrentBanner.ClearBanner();//clear current banner from memory
|
2012-11-04 15:13:42 +01:00
|
|
|
|
2012-07-04 15:45:39 +02:00
|
|
|
u8 *custom_bnr_file = NULL;
|
|
|
|
u32 custom_bnr_size = 0;
|
2017-09-22 00:03:41 +02:00
|
|
|
char custom_banner[256];
|
|
|
|
custom_banner[255] = '\0';
|
2012-07-05 18:18:23 +02:00
|
|
|
|
|
|
|
u8 *cached_bnr_file = NULL;
|
|
|
|
u32 cached_bnr_size = 0;
|
|
|
|
char cached_banner[256];
|
2012-10-15 21:16:14 +02:00
|
|
|
cached_banner[255] = '\0';
|
2018-12-28 01:47:00 +01:00
|
|
|
|
|
|
|
/* plugin individual game sound */
|
2018-10-17 20:01:54 +02:00
|
|
|
char game_sound[256];
|
|
|
|
game_sound[255] = '\0';
|
2017-09-22 00:03:41 +02:00
|
|
|
|
|
|
|
m_banner_loaded = false;
|
|
|
|
const dir_discHdr *GameHdr = CoverFlow.getHdr();
|
2017-05-15 19:50:24 +02:00
|
|
|
if(GameHdr->type == TYPE_PLUGIN)
|
2013-10-19 20:59:17 +02:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
const char *coverDir = NULL;
|
|
|
|
coverDir = m_plugin.GetCoverFolderName(GameHdr->settings[0]);
|
|
|
|
|
|
|
|
if(coverDir == NULL || strlen(coverDir) == 0)
|
2018-10-17 20:01:54 +02:00
|
|
|
{
|
2018-05-08 15:49:43 +02:00
|
|
|
strncpy(custom_banner, fmt("%s/%s.bnr", m->m_customBnrDir.c_str(), CoverFlow.getFilenameId(GameHdr)), 255);
|
2018-12-28 01:47:00 +01:00
|
|
|
strncpy(game_sound, fmt("%s/gamesounds/%s", m->m_dataDir.c_str(), CoverFlow.getFilenameId(GameHdr)), 251);//save for .ext
|
2018-10-17 20:01:54 +02:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
else
|
2018-10-17 20:01:54 +02:00
|
|
|
{
|
2018-05-08 15:49:43 +02:00
|
|
|
strncpy(custom_banner, fmt("%s/%s/%s.bnr", m->m_customBnrDir.c_str(), coverDir, CoverFlow.getFilenameId(GameHdr)), 255);
|
2018-12-28 01:47:00 +01:00
|
|
|
strncpy(game_sound, fmt("%s/gamesounds/%s/%s", m->m_dataDir.c_str(), coverDir, CoverFlow.getFilenameId(GameHdr)), 251);
|
2018-10-17 20:01:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* get plugin rom custom banner */
|
2017-05-15 19:50:24 +02:00
|
|
|
fsop_GetFileSizeBytes(custom_banner, &custom_bnr_size);
|
|
|
|
if(custom_bnr_size > 0)
|
|
|
|
{
|
|
|
|
custom_bnr_file = (u8*)MEM2_lo_alloc(custom_bnr_size);
|
|
|
|
if(custom_bnr_file != NULL)
|
|
|
|
{
|
|
|
|
fsop_ReadFileLoc(custom_banner, custom_bnr_size, (void*)custom_bnr_file);
|
2017-09-22 00:03:41 +02:00
|
|
|
m_banner_loaded = true;
|
2017-05-15 19:50:24 +02:00
|
|
|
}
|
|
|
|
}
|
2018-10-17 20:01:54 +02:00
|
|
|
else // if no banner get plugin rom gamesound or just the default plugin gamesound
|
2017-05-15 19:50:24 +02:00
|
|
|
{
|
|
|
|
m_banner.DeleteBanner();
|
2018-10-17 20:01:54 +02:00
|
|
|
bool found = false;
|
|
|
|
if(fsop_FileExist(fmt("%s.mp3", game_sound)))
|
|
|
|
{
|
2018-12-28 01:47:00 +01:00
|
|
|
strcat(game_sound, ".mp3");
|
2018-10-17 20:01:54 +02:00
|
|
|
found = true;
|
|
|
|
}
|
|
|
|
else if(fsop_FileExist(fmt("%s.wav", game_sound)))
|
|
|
|
{
|
2018-12-28 01:47:00 +01:00
|
|
|
strcat(game_sound, ".wav");
|
2018-10-17 20:01:54 +02:00
|
|
|
found = true;
|
|
|
|
}
|
|
|
|
else if(fsop_FileExist(fmt("%s.ogg", game_sound)))
|
|
|
|
{
|
2018-12-28 01:47:00 +01:00
|
|
|
strcat(game_sound, ".ogg");
|
2018-10-17 20:01:54 +02:00
|
|
|
found = true;
|
|
|
|
}
|
|
|
|
if(found)
|
|
|
|
{
|
|
|
|
u32 size = 0;
|
2018-12-28 01:47:00 +01:00
|
|
|
u8 *sf = fsop_ReadFile(game_sound, &size);
|
2018-10-17 20:01:54 +02:00
|
|
|
m->m_gameSound.Load(sf, size);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
m->m_gameSound.Load(m_plugin.GetBannerSound(GameHdr->settings[0]), m_plugin.GetBannerSoundSize());
|
2017-05-15 19:50:24 +02:00
|
|
|
if(m->m_gameSound.IsLoaded())
|
|
|
|
m->m_gamesound_changed = true;
|
|
|
|
m->m_soundThrdBusy = false;
|
2018-05-29 11:59:57 +02:00
|
|
|
return NULL;
|
2017-05-15 19:50:24 +02:00
|
|
|
}
|
2013-10-19 20:59:17 +02:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
else
|
2012-07-05 18:18:23 +02:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
/* check custom ID6 first */
|
|
|
|
strncpy(custom_banner, fmt("%s/%s.bnr", m->m_customBnrDir.c_str(), GameHdr->id), 255);
|
2013-10-19 20:59:17 +02:00
|
|
|
fsop_GetFileSizeBytes(custom_banner, &custom_bnr_size);
|
2014-03-01 00:11:02 +01:00
|
|
|
if(custom_bnr_size > 0)
|
2013-10-19 20:59:17 +02:00
|
|
|
{
|
2014-03-01 00:11:02 +01:00
|
|
|
custom_bnr_file = (u8*)MEM2_lo_alloc(custom_bnr_size);
|
|
|
|
if(custom_bnr_file != NULL)
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
2014-03-01 00:11:02 +01:00
|
|
|
fsop_ReadFileLoc(custom_banner, custom_bnr_size, (void*)custom_bnr_file);
|
2017-09-22 00:03:41 +02:00
|
|
|
m_banner_loaded = true;
|
|
|
|
}
|
2013-10-19 20:59:17 +02:00
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
else /* no custom ID6 or too big, try ID3 */
|
|
|
|
{
|
|
|
|
strncpy(custom_banner, fmt("%s/%.3s.bnr", m->m_customBnrDir.c_str(), GameHdr->id), 255);
|
|
|
|
fsop_GetFileSizeBytes(custom_banner, &custom_bnr_size);
|
|
|
|
if(custom_bnr_size > 0)
|
|
|
|
{
|
|
|
|
custom_bnr_file = (u8*)MEM2_lo_alloc(custom_bnr_size);
|
|
|
|
if(custom_bnr_file != NULL)
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
fsop_ReadFileLoc(custom_banner, custom_bnr_size, (void*)custom_bnr_file);
|
2017-09-22 00:03:41 +02:00
|
|
|
m_banner_loaded = true;
|
|
|
|
}
|
2017-05-15 19:50:24 +02:00
|
|
|
}
|
|
|
|
}
|
2013-10-28 19:36:52 +01:00
|
|
|
}
|
2017-09-22 00:03:41 +02:00
|
|
|
if(GameHdr->type == TYPE_GC_GAME && custom_bnr_file == NULL)
|
2013-10-28 19:36:52 +01:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
//get the gc game's opening.bnr from ISO - a 96x32 image to add to the gc banner included with wiiflow
|
2016-04-03 02:31:02 +02:00
|
|
|
GC_Disc_Reader.init(GameHdr->path);
|
|
|
|
u8 *opening_bnr = GC_Disc_Reader.GetGameCubeBanner();
|
|
|
|
if(opening_bnr != NULL)
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
|
|
|
//creategcbanner adds the opening.bnr image and game title to the wiiflow gc banner
|
2016-04-03 02:31:02 +02:00
|
|
|
m_banner.CreateGCBanner(opening_bnr, m->m_wbf1_font, m->m_wbf2_font, GameHdr->title);
|
2017-09-22 00:03:41 +02:00
|
|
|
m_banner_loaded = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
m_banner.DeleteBanner();
|
2016-04-03 02:31:02 +02:00
|
|
|
GC_Disc_Reader.clear();
|
2018-05-30 22:45:48 +02:00
|
|
|
if(m->m_gc_play_default_sound)
|
|
|
|
{
|
|
|
|
//get wiiflow gc ogg sound to play with banner
|
|
|
|
m->m_gameSound.Load(gc_ogg, gc_ogg_size, false);
|
|
|
|
if(m->m_gameSound.IsLoaded())
|
|
|
|
m->m_gamesound_changed = true;
|
|
|
|
}
|
2013-10-28 19:36:52 +01:00
|
|
|
m->m_soundThrdBusy = false;
|
2018-05-29 11:59:57 +02:00
|
|
|
return NULL;
|
2013-10-28 19:36:52 +01:00
|
|
|
}
|
2017-04-18 01:23:50 +02:00
|
|
|
if(custom_bnr_file == NULL)/* no custom and not GC game try cached banner id6 only*/
|
2013-10-28 19:36:52 +01:00
|
|
|
{
|
|
|
|
strncpy(cached_banner, fmt("%s/%s.bnr", m->m_bnrCacheDir.c_str(), GameHdr->id), 255);
|
|
|
|
fsop_GetFileSizeBytes(cached_banner, &cached_bnr_size);
|
2014-03-01 00:11:02 +01:00
|
|
|
if(cached_bnr_size > 0)
|
2012-10-15 21:16:14 +02:00
|
|
|
{
|
2014-03-01 00:11:02 +01:00
|
|
|
cached_bnr_file = (u8*)MEM2_lo_alloc(cached_bnr_size);
|
|
|
|
if(cached_bnr_file != NULL)
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
2014-03-01 00:11:02 +01:00
|
|
|
fsop_ReadFileLoc(cached_banner, cached_bnr_size, (void*)cached_bnr_file);
|
2017-09-22 00:03:41 +02:00
|
|
|
m_banner_loaded = true;
|
|
|
|
}
|
2012-10-15 21:16:14 +02:00
|
|
|
}
|
2012-07-05 18:18:23 +02:00
|
|
|
}
|
2012-10-15 21:16:14 +02:00
|
|
|
|
2013-10-28 19:36:52 +01:00
|
|
|
if(custom_bnr_file != NULL)
|
2014-03-01 00:11:02 +01:00
|
|
|
CurrentBanner.SetBanner(custom_bnr_file, custom_bnr_size, true, true);
|
2013-10-28 19:36:52 +01:00
|
|
|
else if(cached_bnr_file != NULL)
|
2014-03-01 00:11:02 +01:00
|
|
|
CurrentBanner.SetBanner(cached_bnr_file, cached_bnr_size, false, true);
|
2012-11-04 15:13:42 +01:00
|
|
|
else if(GameHdr->type == TYPE_WII_GAME)
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
2018-07-16 15:08:45 +02:00
|
|
|
m->_extractBnr(GameHdr);
|
2017-09-22 00:03:41 +02:00
|
|
|
m_banner_loaded = true;
|
|
|
|
}
|
2016-06-20 23:03:40 +02:00
|
|
|
else if(GameHdr->type == TYPE_CHANNEL || GameHdr->type == TYPE_EMUCHANNEL)
|
2017-09-22 00:03:41 +02:00
|
|
|
{
|
2018-07-16 15:08:45 +02:00
|
|
|
ChannelHandle.GetBanner(TITLE_ID(GameHdr->settings[0], GameHdr->settings[1]));
|
2017-09-22 00:03:41 +02:00
|
|
|
m_banner_loaded = true;
|
|
|
|
}
|
|
|
|
|
2012-10-15 21:16:14 +02:00
|
|
|
if(!CurrentBanner.IsValid())
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-09-22 00:03:41 +02:00
|
|
|
m_banner_loaded = false;
|
2012-08-16 00:33:54 +02:00
|
|
|
m->m_gameSound.FreeMemory();
|
2012-10-13 18:57:03 +02:00
|
|
|
m_banner.DeleteBanner();
|
2012-10-15 21:16:14 +02:00
|
|
|
CurrentBanner.ClearBanner();
|
2012-11-04 15:13:42 +01:00
|
|
|
m->m_soundThrdBusy = false;
|
2018-05-29 11:59:57 +02:00
|
|
|
return NULL;
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2017-04-18 01:23:50 +02:00
|
|
|
//save new wii or channel banner to cache folder, gc and custom banners are not cached
|
2013-06-29 18:54:21 +02:00
|
|
|
if(cached_bnr_file == NULL && custom_bnr_file == NULL)
|
|
|
|
fsop_WriteFile(cached_banner, CurrentBanner.GetBannerFile(), CurrentBanner.GetBannerFileSize());
|
|
|
|
|
2017-05-15 19:50:24 +02:00
|
|
|
//load and init banner
|
|
|
|
m_banner.LoadBanner(m->m_wbf1_font, m->m_wbf2_font);
|
|
|
|
|
2017-04-18 01:23:50 +02:00
|
|
|
//get sound from wii, channel, or custom banner and load it to play with the banner
|
2013-09-24 23:24:03 +02:00
|
|
|
u32 sndSize = 0;
|
|
|
|
u8 *soundBin = CurrentBanner.GetFile("sound.bin", &sndSize);
|
2018-12-26 21:24:01 +01:00
|
|
|
CurrentBanner.ClearBanner();// got sound.bin and banner for displaying is loaded so no longer need current banner.
|
2012-10-15 21:16:14 +02:00
|
|
|
|
2018-05-30 22:45:48 +02:00
|
|
|
if(soundBin != NULL && (GameHdr->type != TYPE_GC_GAME || m->m_gc_play_banner_sound))
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2012-10-10 19:09:23 +02:00
|
|
|
if(memcmp(&((IMD5Header *)soundBin)->fcc, "IMD5", 4) == 0)
|
2012-07-27 19:26:49 +02:00
|
|
|
{
|
2012-08-13 07:09:40 +02:00
|
|
|
u32 newSize = 0;
|
|
|
|
u8 *newSound = DecompressCopy(soundBin, sndSize, &newSize);
|
2018-12-26 21:24:01 +01:00
|
|
|
free(soundBin);// no longer needed, now using decompressed newSound
|
2012-08-16 00:33:54 +02:00
|
|
|
if(newSound == NULL || newSize == 0 || !m->m_gameSound.Load(newSound, newSize))
|
2012-08-13 07:09:40 +02:00
|
|
|
{
|
2018-12-26 21:24:01 +01:00
|
|
|
m->m_gameSound.FreeMemory();// frees newSound
|
|
|
|
m_banner.DeleteBanner();// the same as UnloadBanner
|
2012-11-04 15:13:42 +01:00
|
|
|
m->m_soundThrdBusy = false;
|
2018-05-29 11:59:57 +02:00
|
|
|
return NULL;
|
2012-08-13 07:09:40 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2012-08-16 00:33:54 +02:00
|
|
|
m->m_gameSound.Load(soundBin, sndSize);
|
2012-08-13 07:09:40 +02:00
|
|
|
|
2012-08-16 00:33:54 +02:00
|
|
|
if(m->m_gameSound.IsLoaded())
|
2012-08-13 07:09:40 +02:00
|
|
|
m->m_gamesound_changed = true;
|
|
|
|
else
|
|
|
|
{
|
2018-12-26 21:24:01 +01:00
|
|
|
m->m_gameSound.FreeMemory();// frees soundBin
|
2012-10-13 18:57:03 +02:00
|
|
|
m_banner.DeleteBanner();
|
2012-07-27 19:26:49 +02:00
|
|
|
}
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
2012-07-27 19:26:49 +02:00
|
|
|
else
|
2012-08-13 07:09:40 +02:00
|
|
|
{
|
2018-12-26 21:24:01 +01:00
|
|
|
if(soundBin != NULL)
|
|
|
|
free(soundBin);
|
|
|
|
//gprintf("WARNING: No sound found in banner!\n");
|
2012-07-27 19:26:49 +02:00
|
|
|
m->m_gamesound_changed = true;
|
2018-12-26 21:24:01 +01:00
|
|
|
m->m_gameSound.FreeMemory();// frees previous game sound
|
2012-08-13 07:09:40 +02:00
|
|
|
}
|
2012-11-04 15:13:42 +01:00
|
|
|
m->m_soundThrdBusy = false;
|
2018-05-29 11:59:57 +02:00
|
|
|
return NULL;
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
|
2012-11-17 18:30:24 +01:00
|
|
|
u8 *GameSoundStack = NULL;
|
|
|
|
u32 GameSoundSize = 0x10000; //64kb
|
2017-04-18 01:23:50 +02:00
|
|
|
void CMenu::_playGameSound(void)// starts banner and gamesound loading thread
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2017-05-15 19:50:24 +02:00
|
|
|
_cleanupBanner(true);
|
2012-01-21 21:57:41 +01:00
|
|
|
m_gamesound_changed = false;
|
2012-04-27 21:05:38 +02:00
|
|
|
if(m_bnrSndVol == 0)
|
|
|
|
return;
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2012-07-06 18:48:01 +02:00
|
|
|
if(m_gameSoundThread != LWP_THREAD_NULL)
|
2017-04-18 01:23:50 +02:00
|
|
|
_stopGameSoundThread();
|
2014-03-17 18:38:32 +01:00
|
|
|
GameSoundStack = (u8*)MEM2_lo_alloc(GameSoundSize);
|
2018-05-29 11:59:57 +02:00
|
|
|
LWP_CreateThread(&m_gameSoundThread, _gameSoundThread, this, GameSoundStack, GameSoundSize, 60);
|
2012-01-21 21:57:41 +01:00
|
|
|
}
|
|
|
|
|
2017-04-18 01:23:50 +02:00
|
|
|
void CMenu::_stopGameSoundThread()//stops banner and gamesound loading thread
|
2012-01-21 21:57:41 +01:00
|
|
|
{
|
2012-07-27 19:26:49 +02:00
|
|
|
if(m_gameSoundThread == LWP_THREAD_NULL)
|
|
|
|
return;
|
|
|
|
|
2012-02-19 00:04:15 +01:00
|
|
|
if(LWP_ThreadIsSuspended(m_gameSoundThread))
|
|
|
|
LWP_ResumeThread(m_gameSoundThread);
|
2012-01-21 21:57:41 +01:00
|
|
|
|
2012-11-04 15:13:42 +01:00
|
|
|
while(m_soundThrdBusy)
|
2014-03-17 18:38:32 +01:00
|
|
|
usleep(500);
|
2012-07-27 19:26:49 +02:00
|
|
|
|
2012-02-19 00:04:15 +01:00
|
|
|
LWP_JoinThread(m_gameSoundThread, NULL);
|
2012-05-19 14:29:24 +02:00
|
|
|
m_gameSoundThread = LWP_THREAD_NULL;
|
2012-11-17 18:30:24 +01:00
|
|
|
|
|
|
|
if(GameSoundStack)
|
2014-03-17 18:38:32 +01:00
|
|
|
MEM2_lo_free(GameSoundStack);
|
2012-11-17 18:30:24 +01:00
|
|
|
GameSoundStack = NULL;
|
2012-05-19 14:29:24 +02:00
|
|
|
}
|