- fixed cacheing scummvm covers

- fixed setting scummvm cover's color via plugin
- now scummvm list is cached like all the other lists. but still does not use custom titles or titles from the plugins data xml.
- fixed the random bug where covers sometimes were not cached.
- fixed minor memory leaks via gametdb.cpp
- fixed an issue with using custom backgrounds via source menu.
- added the ability to move to next and previous game while on game info menu by using the controllers '+' and '-' buttons
- added the ability to launch a game directly from the game info menu by pressing 'A' on the controller.
- added the abilty to launch super smash bros melee via nintendont slippi. manually edit wiiflow_lite.ini by adding use_slippi=yes under [GAMECUBE]. google nintendont slippi and slippi project to learn about it.
- upped to version 5.4.1
This commit is contained in:
Fledge68 2020-02-02 14:25:05 -06:00
parent 5b21e154e9
commit 53a06c0f8d
19 changed files with 278 additions and 215 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 MiB

After

Width:  |  Height:  |  Size: 3.6 MiB

View File

@ -1,6 +1,6 @@
#define APP_NAME "WiiFlow WFL"
#define APP_VERSION "5.4.0"
#define APP_VERSION "5.4.1"
#define APP_DATA_DIR "wiiflow"
#define APPS_DIR "apps/wiiflow"

View File

@ -72,6 +72,7 @@ u8 get_wii_language()
// Nintendont
NIN_CFG NinCfg;
bool slippi;
/* since Nintendont v1.98 argsboot is supported.
since v3.324 '$$Version:' string was added for loaders to detect.
@ -90,9 +91,13 @@ void Nintendont_SetOptions(const char *gamePath, const char *gameID, const char
u32 NIN_cfg_version = NIN_CFG_VERSION;
char NINVersion[7]= "";
u32 NINRev = 0;
const char *dol_path = NULL;
for(u8 i = SD; i < MAXDEVICES; ++i)
{
const char *dol_path = fmt(NIN_LOADER_PATH, DeviceName[i]);
if(slippi)
dol_path = fmt(NIN_SLIPPI_PATH, DeviceName[i]);
else
dol_path = fmt(NIN_LOADER_PATH, DeviceName[i]);
if(!fsop_FileExist(dol_path))
continue;
u8 *buffer = NULL;
@ -213,12 +218,17 @@ bool Nintendont_Installed()
return false;
}
bool Nintendont_GetLoader()
bool Nintendont_GetLoader(bool use_slippi)
{
slippi = use_slippi;
bool ret = false;
const char *dol_path = NULL;
for(u8 i = SD; i < MAXDEVICES; ++i)
{
const char *dol_path = fmt(NIN_LOADER_PATH, DeviceName[i]);
if(slippi)
dol_path = fmt(NIN_SLIPPI_PATH, DeviceName[i]);
else
dol_path = fmt(NIN_LOADER_PATH, DeviceName[i]);
ret = (LoadHomebrew(dol_path) == 1);
if(ret == true)
{

View File

@ -22,9 +22,10 @@
// Nintendont
#include "nin_cfg.h"
#define NIN_LOADER_PATH "%s:/apps/nintendont/boot.dol"
#define NIN_SLIPPI_PATH "%s:/apps/nintendont slippi/boot.dol"
bool Nintendont_Installed();
bool Nintendont_GetLoader();
bool Nintendont_GetLoader(bool use_slippi);
void Nintendont_SetOptions(const char *gamePath, const char *gameID, const char *CheatPath, u8 lang, u32 n_cfg,
u32 n_vm, s8 vidscale, s8 vidoffset, u8 netprofile);

View File

@ -841,6 +841,7 @@ int GameTDB::GetWifiPlayers(const char *id)
players = atoi(PlayersNode);
MEM2_free(data);
return players;
}
@ -912,6 +913,7 @@ int GameTDB::GetPlayers(const char *id)
players = atoi(PlayersNode);
MEM2_free(data);
return players;
}
@ -1005,15 +1007,16 @@ int GameTDB::GetCaseVersions(const char *id)
return altcase;
}
char *PlayersNode = GetNodeText(data, "case versions=\"", "\"");
if(!PlayersNode)
char *CaseVersionsNode = GetNodeText(data, "case versions=\"", "\"");
if(!CaseVersionsNode)
{
MEM2_free(data);
return altcase;
}
altcase = atoi(PlayersNode);
altcase = atoi(CaseVersionsNode);
MEM2_free(data);
return altcase;
}

View File

@ -272,7 +272,7 @@ void CVideo::setup2DProjection(bool setViewPort, bool noScale)
if (setViewPort)
_setViewPort(0, 0, m_rmode->fbWidth, m_rmode->efbHeight);
guOrtho(projMtx, y, height2D + y, x, width2D + x, 0.f, 1000.0f);
guOrtho(projMtx, y, height2D - 1 + y, x, width2D - 1 + x, 0.f, 1000.0f);
GX_LoadProjectionMtx(projMtx, GX_ORTHOGRAPHIC);
}
@ -299,7 +299,8 @@ void CVideo::set2DViewport(u32 w, u32 h, int x, int y)
}
/* this takes what is drawn in the frame buffer and copies it to make a new texture/image set as whatever TexData &tex is */
/* this is used by coverflow and updatebg */
/* this is used by updatebg to fade old bg into new bg */
/* and coverflow after drawing bg and covers to make mirror bg with blur */
void CVideo::renderToTexture(TexData &tex, bool clear)
{
if(tex.data == NULL)

View File

@ -296,7 +296,79 @@ static void Add_Plugin_Game(char *FullPath)
m_cacheList.push_back(ListElement);
}
/* note: scummvm games have list generator in plugin.cpp */
/* notes: "description" is used as the title because it basically is the title */
/* the [GameDomain] is used as the path even though it isn't the path */
/* the [GameDomain] is usually short without any '/' */
/* in scummvm.ini the path is the path without the exe or main app file added on */
void ListGenerator::ParseScummvmINI(Config &ini, const char *Device, const char *datadir, const char *platform, const string& DBName, bool UpdateCache)
{
Clear();
if(!DBName.empty())
{
if(UpdateCache)
fsop_deleteFile(DBName.c_str());
else
{
CCache(*this, DBName, LOAD);
if(!this->empty())
return;
fsop_deleteFile(DBName.c_str());
}
}
gprintf("Parsing scummvm.ini\n");
if(!ini.loaded())
return;
Config m_crc;
if(platform != NULL)
m_crc.load(fmt("%s/%s/%s.ini", datadir, platform, platform));
const char *GameDomain = ini.firstDomain().c_str();
while(1)
{
if(strlen(GameDomain) < 2)
break;
char GameName[64];
memset(GameName, 0, sizeof(GameName));
strncpy(GameName, ini.getString(GameDomain, "description").c_str(), 63);
if(strlen(GameName) < 2 || strncasecmp(Device, ini.getString(GameDomain, "path").c_str(), 2) != 0)
{
GameDomain = ini.nextDomain().c_str();
continue;
}
/* get shortName */
char *cp;
if((cp = strstr(GameName, " (")) != NULL)
*cp = '\0';
/* get Game ID */
string GameID = "PLUGIN";
// Get game ID based on GameName
if(m_crc.loaded() && m_crc.has(platform, GameName))
{
vector<string> searchID = m_crc.getStrings(platform, GameName, '|');
if(!searchID[0].empty())
GameID = searchID[0];
}
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
memcpy(ListElement.id, GameID.c_str(), 6);
mbstowcs(ListElement.title, GameName, 63);
strncpy(ListElement.path, GameDomain, sizeof(ListElement.path));
ListElement.settings[0] = m_cacheList.Magic; //scummvm magic
ListElement.casecolor = m_cacheList.Color;
ListElement.type = TYPE_PLUGIN;
m_cacheList.push_back(ListElement);
GameDomain = ini.nextDomain().c_str();
}
m_crc.unload();
if(!this->empty() && !DBName.empty()) /* Write a new Cache */
CCache(*this, DBName, SAVE);
}
/* note: scummvm games are parsed above */
void ListGenerator::CreateRomList(Config &platform_cfg, const string& romsDir, const vector<string>& FileTypes, const string& DBName, bool UpdateCache)
{
Clear();
@ -313,6 +385,7 @@ void ListGenerator::CreateRomList(Config &platform_cfg, const string& romsDir, c
}
}
platformName = "";
if(platform_cfg.loaded())
{
/* Search platform.ini to find plugin magic to get platformName */
@ -344,8 +417,7 @@ void ListGenerator::CreateRomList(Config &platform_cfg, const string& romsDir, c
CCache(*this, DBName, SAVE);
}
void ListGenerator::CreateList(u32 Flow, const string& Path, const vector<string>& FileTypes,
const string& DBName, bool UpdateCache)
void ListGenerator::CreateList(u32 Flow, const string& Path, const vector<string>& FileTypes, const string& DBName, bool UpdateCache)
{
Clear();
if(!DBName.empty())

View File

@ -37,6 +37,7 @@ public:
void createSFList(u8 maxBtns, Config &m_sourceMenuCfg, const string& sourceDir);
void Init(const char *settingsDir, const char *Language, const char *plgnsDataDir);
void Clear();
void ParseScummvmINI(Config &ini, const char *Device, const char *datadir, const char *platform, const string& DBName, bool UpdateCache);
void CreateRomList(Config &platform_cfg, const string& romsDir, const vector<string>& FileTypes, const string& DBName, bool UpdateCache);
void CreateList(u32 Flow, const string& Path, const vector<string>& FileTypes, const string& DBName, bool UpdateCache);
u32 Color;

View File

@ -1641,9 +1641,9 @@ void CMenu::_mainLoopCommon(bool withCF, bool adjusting)
MusicPlayer.Pause();//note - bg music is paused but sound thread is still running. so banner gamesound still plays
m_btnMgr.tick();
m_vid.prepare();
m_vid.setup2DProjection(false, true);
m_vid.setup2DProjection(false, true);// false = prepare() already set view port, true = no scaling - draw at 640x480
_updateBg();
m_vid.setup2DProjection();
m_vid.setup2DProjection();// this time set the view port and allow scaling
_drawBg();
m_btnMgr.draw();
m_vid.render();
@ -1680,7 +1680,6 @@ void CMenu::_mainLoopCommon(bool withCF, bool adjusting)
CoverFlow.draw();
m_vid.setup2DProjection(false, true);
CoverFlow.drawEffect();
//if(startGameSound == 1 && !m_soundThrdBusy && !m_banner.GetSelectedGame() && !m_snapshot_loaded)
if(!m_soundThrdBusy && !m_banner.GetSelectedGame() && !m_snapshot_loaded)
CoverFlow.drawText(adjusting);
m_vid.renderAAPass(i);
@ -2524,7 +2523,9 @@ bool CMenu::_loadPluginList()
}
else
{
vector<dir_discHdr> scummvmList;
string cachedListFile(fmt("%s/%s_%s.db", m_listCacheDir.c_str(), DeviceName[currentPartition], m_plugin.PluginMagicWord));
if(updateCache || !fsop_FileExist(cachedListFile.c_str()))
cacheCovers = true;
Config scummvm;
if(!scummvm.load(fmt("%s/scummvm.ini", m_pluginsDir.c_str())))
{
@ -2534,11 +2535,11 @@ bool CMenu::_loadPluginList()
string platformName = "";
if(m_platform.loaded())/* convert plugin magic to platform name */
platformName = m_platform.getString("PLUGINS", m_plugin.PluginMagicWord);
scummvmList = m_plugin.ParseScummvmINI(scummvm, DeviceName[currentPartition], Magic, m_pluginDataDir.c_str(), platformName.c_str());
for(vector<dir_discHdr>::iterator tmp_itr = scummvmList.begin(); tmp_itr != scummvmList.end(); tmp_itr++)
m_cacheList.Color = m_plugin.GetCaseColor(i);
m_cacheList.Magic = Magic;
m_cacheList.ParseScummvmINI(scummvm, DeviceName[currentPartition], m_pluginDataDir.c_str(), platformName.c_str(), cachedListFile, updateCache);
for(vector<dir_discHdr>::iterator tmp_itr = m_cacheList.begin(); tmp_itr != m_cacheList.end(); tmp_itr++)
m_gameList.push_back(*tmp_itr);
scummvmList.clear();
vector<dir_discHdr>().swap(scummvmList);
scummvm.unload();
}
}

View File

@ -660,6 +660,8 @@ private:
s16 m_gameinfoLblOverlay;
s16 m_gameLblSnap;
s16 m_gameLblOverlay;
TexData m_game_snap;
TexData m_game_overlay;
TexData m_snap;
TexData m_cart;
TexData m_overlay;
@ -1104,7 +1106,7 @@ private:
void _about(bool help = false);
bool _wbfsOp(WBFS_OP op);
void _cfTheme(void);
void _gameinfo(void);
bool _gameinfo(void);
void _gameSettings(const dir_discHdr *GameHdr, bool disc = false);
void _CoverBanner(void);
int _cacheCovers(void);
@ -1129,7 +1131,7 @@ private:
bool _srcTierBack(bool home);
void _srcTierLoad(string fn);
void _restoreSrcTiers();
void _setSrcFlowBg();
void _getSFlowBgTex();
void _mainLoopCommon(bool withCF = false, bool adjusting = false);
void _netInit();
void _loadDefaultFont(void);

View File

@ -505,8 +505,12 @@ void CMenu::_game(bool launch)
{
_hideGame();
m_banner.SetShowBanner(false);
_gameinfo();
m_gameSelected = false;
launch = _gameinfo();
m_gameSelected = true;
_showGame();
if(m_newGame)
startGameSound = -10;
m_banner.SetShowBanner(true);
}
/* play or stop a trailer video */
@ -930,8 +934,8 @@ void CMenu::_game(bool launch)
TexData emptyTex;
m_btnMgr.setTexture(m_gameLblSnap, emptyTex);
m_btnMgr.setTexture(m_gameLblOverlay, emptyTex);
TexHandle.Cleanup(m_snap);
TexHandle.Cleanup(m_overlay);
TexHandle.Cleanup(m_game_snap);
TexHandle.Cleanup(m_game_overlay);
m_gameSelected = false;
MEM2_free(hdr);
_hideGame();
@ -988,8 +992,8 @@ void CMenu::_initGameMenu()
m_gameBtnToggle = _addPicButton("GAME/TOOGLE_BTN", texToggleBanner, texToggleBanner, 385, 31, 246, 135);
m_gameBtnToggleFull = _addPicButton("GAME/TOOGLE_FULL_BTN", texToggleBanner, texToggleBanner, 20, 12, 608, 344);
m_gameLblSnapBg = _addLabel("GAME/SNAP_BG", theme.txtFont, L"", 385, 31, 246, 170, theme.txtFontColor, 0, texSnapShotBg);
m_gameLblSnap = _addLabel("GAME/SNAP", theme.txtFont, L"", 385, 31, 100, 100, theme.txtFontColor, 0, m_snap);
m_gameLblOverlay = _addLabel("GAME/OVERLAY", theme.txtFont, L"", 385, 31, 100, 100, theme.txtFontColor, 0, m_overlay);
m_gameLblSnap = _addLabel("GAME/SNAP", theme.txtFont, L"", 385, 31, 100, 100, theme.txtFontColor, 0, m_game_snap);
m_gameLblOverlay = _addLabel("GAME/OVERLAY", theme.txtFont, L"", 385, 31, 100, 100, theme.txtFontColor, 0, m_game_overlay);
// 8 pixel width frames
m_gameLblSnapFrame = _addLabel("GAME/SNAP_FRAME", theme.txtFont, L"", 377, 23, 262, 186, theme.txtFontColor, 0, texSnapShotFrame);
m_gameLblBannerFrame = _addLabel("GAME/BANNER_FRAME", theme.txtFont, L"", 377, 23, 262, 151, theme.txtFontColor, 0, texBannerFrame);
@ -1168,10 +1172,10 @@ void * CMenu::_gameSoundThread(void *obj)
if(fsop_FileExist(snap_path))
{
m->m_snapshot_loaded = true;
TexHandle.fromImageFile(m->m_snap, snap_path);
TexHandle.fromImageFile(m->m_game_snap, snap_path);
/* get snapshot position and dimensions to center it on the snap background */
int snap_w = m->m_snap.width;
int snap_h = m->m_snap.height;
int snap_w = m->m_game_snap.width;
int snap_h = m->m_game_snap.height;
int width_over = snap_w - m->snapbg_w;
int height_over = snap_h - m->snapbg_h;
float aspect_ratio = (float)snap_w / (float)snap_h;
@ -1191,24 +1195,24 @@ void * CMenu::_gameSoundThread(void *obj)
int x_pos = (m->snapbg_w - snap_w) / 2 + m->snapbg_x;
int y_pos = (m->snapbg_h - snap_h) / 2 + m->snapbg_y;
m_btnMgr.setTexture(m->m_gameLblSnap, m->m_snap, x_pos, y_pos, snap_w, snap_h);
m_btnMgr.setTexture(m->m_gameLblSnap, m->m_game_snap, x_pos, y_pos, snap_w, snap_h);
/* get possible overlay */
const char *overlay_path = fmt("%s/%s_overlay.png", m->m_snapDir.c_str(), platformName);
if(fsop_FileExist(overlay_path))
{
TexHandle.fromImageFile(m->m_overlay, overlay_path);
m_btnMgr.setTexture(m->m_gameLblOverlay, m->m_overlay, x_pos, y_pos, snap_w, snap_h);
TexHandle.fromImageFile(m->m_game_overlay, overlay_path);
m_btnMgr.setTexture(m->m_gameLblOverlay, m->m_game_overlay, x_pos, y_pos, snap_w, snap_h);
}
else
TexHandle.Cleanup(m->m_overlay);
TexHandle.Cleanup(m->m_game_overlay);
}
}
}
if(!m->m_snapshot_loaded)
{
TexHandle.Cleanup(m->m_snap);
TexHandle.Cleanup(m->m_overlay);
TexHandle.Cleanup(m->m_game_snap);
TexHandle.Cleanup(m->m_game_overlay);
}
}
if(custom_bnr_size == 0 || custom_bnr_file == NULL)

View File

@ -427,6 +427,9 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc)
u8 netprofile = 0;
if(!IsOnWiiU())
netprofile = m_gcfg2.getUInt(id, "net_profile", 0);
// project slippi is a mod of nintendont to play patched version of smash bros melee
bool use_slippi = (m_cfg.getBool(GC_DOMAIN, "use_slippi", false) && strncasecmp(hdr->id, "GAL", 3) == 0);
gprintf("use slippi %s\n", use_slippi ? "yes" : "no");
/* configs no longer needed */
m_gcfg1.save(true);
@ -434,7 +437,7 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc)
m_cat.save(true);
m_cfg.save(true);
bool ret = (Nintendont_GetLoader() && LoadAppBooter(fmt("%s/app_booter.bin", m_binsDir.c_str())));
bool ret = (Nintendont_GetLoader(use_slippi) && LoadAppBooter(fmt("%s/app_booter.bin", m_binsDir.c_str())));
if(ret == false)
{
error(_t("errgame14", L"app_booter.bin not found!"));

View File

@ -18,13 +18,14 @@ int synopsis_h;
int rominfo_h;
int rominfo_th = 0;
void CMenu::_gameinfo(void)
bool CMenu::_gameinfo(void)
{
u8 page = 1;
int pixels_to_skip = 10;
int amount_of_skips = 0;
int xtra_skips = 0;
int synopsis_th = 0;
bool launchGame = false;
SetupInput();
_showGameInfo();
@ -32,9 +33,35 @@ void CMenu::_gameinfo(void)
while(!m_exit)
{
_mainLoopCommon();
if(BTN_HOME_PRESSED || BTN_B_PRESSED || !tdb_found)
CoverFlow.tick();
if(BTN_HOME_PRESSED || BTN_B_PRESSED)
break;
if((BTN_DOWN_PRESSED || BTN_DOWN_HELD))
else if(BTN_PLUS_PRESSED)
{
_hideGameInfo(false);
CoverFlow.right();
m_newGame = true;
page = 1;
amount_of_skips = 0;
xtra_skips = 0;
_showGameInfo();
}
else if(BTN_MINUS_PRESSED)
{
_hideGameInfo(false);
CoverFlow.left();
m_newGame = true;
page = 1;
amount_of_skips = 0;
xtra_skips = 0;
_showGameInfo();
}
else if(BTN_A_PRESSED)
{
launchGame = true;
break;
}
else if((BTN_DOWN_PRESSED || BTN_DOWN_HELD))
{
if(page == 2 && synopsis_th > synopsis_h)
{
@ -179,11 +206,9 @@ void CMenu::_gameinfo(void)
}
_hideGameInfo(false);
TexHandle.Cleanup(m_cart);
if(m_banner.GetSelectedGame())// if banner is available we need to clear snap and overlay here.
{
TexHandle.Cleanup(m_snap);
TexHandle.Cleanup(m_overlay);
}
return launchGame;
}
void CMenu::_hideGameInfo(bool instant)
@ -221,11 +246,16 @@ void CMenu::_showGameInfo(void)
_textGameInfo();
if(tdb_found)
{
m_btnMgr.show(m_gameinfoLblTitle);
if(CoverFlow.getHdr()->type == TYPE_PLUGIN)
{
if(!tdb_found)
{
m_btnMgr.setText(m_gameinfoLblRomInfo, _t("errgame18", L"No game info!"));
m_btnMgr.show(m_gameinfoLblRomInfo);
}
else
{
m_btnMgr.reset(m_gameinfoLblRomInfo);
m_btnMgr.show(m_gameinfoLblRomInfo, false);
@ -235,6 +265,14 @@ void CMenu::_showGameInfo(void)
m_btnMgr.show(m_gameinfoLblCartDisk);
m_btnMgr.show(m_gameinfoLblOverlay);
}
}
else
{
if(!tdb_found)
{
m_btnMgr.setText(m_gameinfoLblID, _t("errgame18", L"No game info!"));
m_btnMgr.show(m_gameinfoLblID);
}
else
{
m_btnMgr.show(m_gameinfoLblID);
@ -246,6 +284,7 @@ void CMenu::_showGameInfo(void)
m_btnMgr.show(m_gameinfoLblGenre);
m_btnMgr.show(m_gameinfoLblWifiplayers);
}
}
for(u8 i = 0; i < ARRAY_SIZE(m_gameinfoLblUser); ++i)
if(i < ARRAY_SIZE(m_gameinfoLblUser) / 2)
@ -258,9 +297,6 @@ void CMenu::_showGameInfo(void)
for(u8 i = 0; i < ARRAY_SIZE(m_gameinfoLblControls); ++i)
if(m_gameinfoLblControls[i] != -1 && i < cnt_controls)
m_btnMgr.show(m_gameinfoLblControls[i]);
}
else
error(_t("errgame18", L"No game info!"));
}
void CMenu::_initGameInfoMenu()
@ -342,6 +378,9 @@ void CMenu::_textGameInfo(void)
// We can't use magic # directly since it'd require hardcoding values and a # can be several systems(genplus)
// We can't rely on coverfolder either. Different systems can share the same folder. Or combined plugins used for the same system.
// Get title
m_btnMgr.setText(m_gameinfoLblTitle, GameHdr->title);
/* is platform.ini available? */
if(!m_platform.loaded())
return;// no platform.ini found
@ -387,8 +426,6 @@ void CMenu::_textGameInfo(void)
m_btnMgr.setTexture(m_gameinfoLblCartDisk, emptyTex);
m_btnMgr.setTexture(m_gameinfoLblOverlay, emptyTex);
if(m_banner.GetSelectedGame())
{
const char *snap_path = NULL;
if(strcasestr(platformName, "ARCADE") || strcasestr(platformName, "CPS") || !strncasecmp(platformName, "NEOGEO", 6))
snap_path = fmt("%s/%s/%s.png", m_snapDir.c_str(), platformName, ShortName.c_str());
@ -403,21 +440,13 @@ void CMenu::_textGameInfo(void)
TexHandle.fromImageFile(m_snap, snap_path);
m_btnMgr.setTexture(m_gameinfoLblSnap, m_snap, m_snap.width, m_snap.height);
}
}
else if(m_snap.data != NULL)
m_btnMgr.setTexture(m_gameinfoLblSnap, m_snap, m_snap.width, m_snap.height);
if(m_banner.GetSelectedGame())
{
const char *overlay_path = fmt("%s/%s_overlay.png", m_snapDir.c_str(), platformName);
if(fsop_FileExist(overlay_path))
{
TexHandle.fromImageFile(m_overlay, overlay_path);
m_btnMgr.setTexture(m_gameinfoLblOverlay, m_overlay, m_overlay.width, m_overlay.height);
}
}
else if(m_overlay.data != NULL)
m_btnMgr.setTexture(m_gameinfoLblOverlay, m_overlay, m_overlay.width, m_overlay.height);
const char *cart_path = NULL;
if(strcasestr(platformName, "ARCADE") || strcasestr(platformName, "CPS") || !strncasecmp(platformName, "NEOGEO", 6))
@ -439,9 +468,6 @@ void CMenu::_textGameInfo(void)
else
TexHandle.Cleanup(m_cart);
// Get title
m_btnMgr.setText(m_gameinfoLblTitle, GameHdr->title);
// Get Synopsis
if(gametdb.GetSynopsis(GameID, TMP_Char))
gameinfo_Synopsis_w.fromUTF8(TMP_Char);
@ -545,6 +571,8 @@ void CMenu::_textGameInfo(void)
/******************* Wii and GameCube game infos **********************/
m_btnMgr.setText(m_gameinfoLblTitle, GameHdr->title);
gametdb.OpenFile(fmt("%s/wiitdb.xml", m_settingsDir.c_str()));
tdb_found = gametdb.IsLoaded();
if(!tdb_found)
@ -554,7 +582,6 @@ void CMenu::_textGameInfo(void)
strncpy(GameID, CoverFlow.getId(), 6);
m_btnMgr.setText(m_gameinfoLblTitle, GameHdr->title);
/*if(gametdb.GetTitle(GameID, TMP_Char))
{
gameinfo_Title_w.fromUTF8(TMP_Char);

View File

@ -498,11 +498,8 @@ int CMenu::_cacheCovers()
m_thrdMessage = wfmt(_fmt("dlmsg31", L"converting cover %i of %i"), index, total);
m_thrdMessageAdded = true;
/* get game name or ID */
const char *gameNameOrID = NULL;
gameNameOrID = CoverFlow.getFilenameId(&(*hdr));// &(*hdr) converts iterator to pointer to mem address
/* get cover png path */
bool blankCover = false;
bool fullCover = true;
strlcpy(coverPath, getBoxPath(&(*hdr)), sizeof(coverPath));
if(!fsop_FileExist(coverPath) || smallBox)
@ -513,7 +510,7 @@ int CMenu::_cacheCovers()
{
fullCover = true;
strlcpy(coverPath, getBlankCoverPath(&(*hdr)), sizeof(coverPath));
gameNameOrID = strrchr(coverPath, '/') + 1;
blankCover = true;
if(!fsop_FileExist(coverPath))
continue;
}
@ -529,6 +526,13 @@ int CMenu::_cacheCovers()
else
snprintf(cachePath, sizeof(cachePath), "%s", m_cacheDir.c_str());
/* get game name or ID */
const char *gameNameOrID = NULL;
if(!blankCover)
gameNameOrID = CoverFlow.getFilenameId(&(*hdr));// &(*hdr) converts iterator to pointer to mem address
else
gameNameOrID = strrchr(coverPath, '/') + 1;
/* get cover wfc path */
if(smallBox)
snprintf(wfcPath, sizeof(wfcPath), "%s/%s_small.wfc", cachePath, gameNameOrID);

View File

@ -44,14 +44,11 @@ void CMenu::_hideMain(bool instant)
void CMenu::_getCustomBgTex()
{
curCustBg += 1;
if(curCustBg == 2)
curCustBg = 0;
if(m_sourceflow)
_setSrcFlowBg();
_getSFlowBgTex();
else
{
TexHandle.Cleanup(m_mainCustomBg[curCustBg]);
curCustBg = loopNum(curCustBg + 1, 2);
string fn = "";
if(m_platform.loaded())
{
@ -94,6 +91,7 @@ void CMenu::_getCustomBgTex()
{
if(TexHandle.fromImageFile(m_mainCustomBg[curCustBg], fmt("%s/%s.jpg", m_bckgrndsDir.c_str(), fn.c_str())) != TE_OK)
{
curCustBg = loopNum(curCustBg + 1, 2);// reset it
customBg = false;
return;
}
@ -103,8 +101,11 @@ void CMenu::_getCustomBgTex()
customBg = true;
}
else
{
curCustBg = loopNum(curCustBg + 1, 2);// reset it
customBg = false;
}
}
}
void CMenu::_setMainBg()
@ -394,9 +395,12 @@ int CMenu::main(void)
gprintf("Bootup completed!\n");
m_refreshGameList = true;
if(!m_source_on_start)
{
_getCustomBgTex();
_showMain();
_setMainBg();
_showCF(true);
}
if(show_mem)
{
m_btnMgr.show(m_mem1FreeSize);
@ -421,15 +425,14 @@ int CMenu::main(void)
{
if(m_sourceflow)//back a tier or exit sourceflow
{
m_refreshGameList = true;
if(!_srcTierBack(false))// back a tier
if(!_srcTierBack(false))// not back a tier - exit sourceflow and return to coverflow
{
// not back a tier - exit sourceflow and return to coverflow
_restoreSrcTiers();
m_sourceflow = false;// if not back a tier then exit sourceflow
m_sourceflow = false;
}
_getCustomBgTex();
_showMain();
_setMainBg();
_showCF(true);//refresh coverflow or sourceflow list
continue;
}
else if(m_use_source)//if source_menu enabled
@ -437,12 +440,12 @@ int CMenu::main(void)
_hideMain();
if(m_cfg.getBool(SOURCEFLOW_DOMAIN, "enabled", false))//if sourceflow show it
{
m_refreshGameList = true;
sm_numbers_backup = m_cfg.getString(SOURCEFLOW_DOMAIN, "numbers");//backup for possible restore later
sm_tiers_backup = m_cfg.getString(SOURCEFLOW_DOMAIN, "tiers");
m_sourceflow = true;
_getCustomBgTex();
_showMain();
_setMainBg();
_showCF(true);//refresh sourceflow list
}
else //show source menu
{
@ -450,7 +453,8 @@ int CMenu::main(void)
if(BTN_B_HELD)
bUsed = true;
_getCustomBgTex();
_showMain();
_setMainBg();
_showCF(m_refreshGameList);//refresh coverflow list if new source selected
}
continue;
}
@ -460,14 +464,14 @@ int CMenu::main(void)
{
if(m_sourceflow)//back to base tier or exit sourceflow
{
m_refreshGameList = true;
if(!_srcTierBack(true))// if already on base tier exit sourceflow
{
_restoreSrcTiers();
m_sourceflow = false;
}
_getCustomBgTex();
_showMain();
_setMainBg();
_showCF(true);//refresh coverflow or sourceflow list
}
else
{
@ -608,10 +612,10 @@ int CMenu::main(void)
_hideMain();
if(m_sourceflow)
{
m_refreshGameList = true;
_sourceFlow();// set the source selected
_sourceFlow();// set the source selected or new source tier
_getCustomBgTex();
_showMain();
_setMainBg();
_showCF(true);// refresh coverflow or sourceflow list
continue;
}
else
@ -625,11 +629,10 @@ int CMenu::main(void)
bUsed = true;
}
_setMainBg();
if(m_refreshGameList)
if(m_refreshGameList)// if changes were made to favorites, parental lock, or categories
{
/* if changes were made to favorites, parental lock, or categories */
_initCF();
m_refreshGameList = false;
_initCF();
}
else
CoverFlow.cancel();

View File

@ -25,6 +25,11 @@ int curflow = 1;
bool sm_tier = false;
int channels_type;
static inline int loopNum(int i, int s)
{
return (i + s) % s;
}
/* this is what happens when a sourceflow cover is clicked on */
void CMenu::_sourceFlow()
{
@ -106,29 +111,7 @@ void CMenu::_sourceFlow()
m_cfg.setString(SOURCEFLOW_DOMAIN, "tiers", trs);
m_cfg.setString(SOURCEFLOW_DOMAIN, "numbers", numbers);
m_source.unload();
m_source.load(fmt("%s/%s", m_sourceDir.c_str(), fn.c_str()));
SF_cacheCovers = true;
fn.replace(fn.find("."), 4, "_flow");
if(m_source.has("general", "flow"))
curflow = m_source.getInt("general", "flow", 1);
else
curflow = m_cfg.getInt(SOURCEFLOW_DOMAIN, fn, m_cfg.getInt(SOURCEFLOW_DOMAIN, "last_cf_mode", 1));
/* get max source button # */
m_max_source_btn = 0;
const char *srcDomain = m_source.firstDomain().c_str();
while(1)
{
if(strlen(srcDomain) < 2)
break;
if(strrchr(srcDomain, '_') != NULL)
{
int srcBtnNumber = atoi(strrchr(srcDomain, '_') + 1);
if(srcBtnNumber > m_max_source_btn)
m_max_source_btn = srcBtnNumber;
}
srcDomain = m_source.nextDomain().c_str();
}
_srcTierLoad(fn);
return;
}
}
@ -198,6 +181,11 @@ void CMenu::_srcTierLoad(string fn)
curflow = m_source.getInt("general", "flow", 1);
else
curflow = m_cfg.getInt(SOURCEFLOW_DOMAIN, fn, m_cfg.getInt(SOURCEFLOW_DOMAIN, "last_cf_mode", 1));
if(m_source.has("general", "box_mode"))
m_cfg.setBool(SOURCEFLOW_DOMAIN, "box_mode", m_source.getBool("general", "box_mode", true));
if(m_source.has("general", "smallbox"))
m_cfg.setBool(SOURCEFLOW_DOMAIN, "smallbox", m_source.getBool("general", "smallbox", false));
SF_cacheCovers = true;
/* get max source button # */
m_max_source_btn = 0;
const char *srcDomain = m_source.firstDomain().c_str();
@ -234,10 +222,10 @@ void CMenu::_restoreSrcTiers()
_srcTierLoad(tiers[tiers.size() - 1]);
}
/* set custom sourceflow background image if available */
void CMenu::_setSrcFlowBg(void)
/* get custom sourceflow background image if available */
void CMenu::_getSFlowBgTex(void)
{
TexHandle.Cleanup(m_mainCustomBg[curCustBg]);
curCustBg = loopNum(curCustBg + 1, 2);
string fn = m_source.getString("general", "background", "");
if(fn.length() > 0)
{
@ -245,14 +233,18 @@ void CMenu::_setSrcFlowBg(void)
{
if(TexHandle.fromImageFile(m_mainCustomBg[curCustBg], fmt("%s/backgrounds/%s", m_sourceDir.c_str(), fn.c_str())) != TE_OK)
{
_setBg(m_mainBg, m_mainBgLQ);
curCustBg = loopNum(curCustBg + 1, 2);//reset it
customBg = false;
return;
}
}
_setBg(m_mainCustomBg[curCustBg], m_mainCustomBg[curCustBg]);
customBg = true;
}
else
_setBg(m_mainBg, m_mainBgLQ);
{
curCustBg = loopNum(curCustBg + 1, 2);//reset it
customBg = false;
}
}
/* end of sourceflow stuff - start of source menu stuff */

View File

@ -226,66 +226,6 @@ const vector<bool> &Plugin::GetEnabledPlugins(Config &cfg, u8 *num)
return enabledPlugins;
}
/* notes: "description" is used as the title because it basically is the title */
/* the [GameDomain] is used as the path even though it isn't the path */
/* the [GameDomain] is usually short without any '/' */
/* in scummvm.ini the path is the path without the exe or main app file added on */
vector<dir_discHdr> Plugin::ParseScummvmINI(Config &ini, const char *Device, u32 Magic, const char *datadir, const char *platform)
{
gprintf("Parsing scummvm.ini\n");
vector<dir_discHdr> ScummvmList;
if(!ini.loaded())
return ScummvmList;
Config m_crc;
if(platform != NULL)
m_crc.load(fmt("%s/%s/%s.ini", datadir, platform, platform));
dir_discHdr ListElement;
const char *GameDomain = ini.firstDomain().c_str();
while(1)
{
if(strlen(GameDomain) < 2)
break;
char GameName[64];
memset(GameName, 0, sizeof(GameName));
strncpy(GameName, ini.getString(GameDomain, "description").c_str(), 63);
if(strlen(GameName) < 2 || strncasecmp(Device, ini.getString(GameDomain, "path").c_str(), 2) != 0)
{
GameDomain = ini.nextDomain().c_str();
continue;
}
/* get shortName */
char *cp;
if((cp = strstr(GameName, " (")) != NULL)
*cp = '\0';
/* get Game ID */
string GameID = "PLUGIN";
// Get game ID based on GameName
if(m_crc.loaded() && m_crc.has(platform, GameName))
{
vector<string> searchID = m_crc.getStrings(platform, GameName, '|');
if(!searchID[0].empty())
GameID = searchID[0];
}
memset((void*)&ListElement, 0, sizeof(dir_discHdr));
memcpy(ListElement.id, GameID.c_str(), 6);
ListElement.casecolor = Plugins.back().caseColor;
mbstowcs(ListElement.title, GameName, 63);
strncpy(ListElement.path, GameDomain, sizeof(ListElement.path));
//gprintf("Found: %s\n", GameDomain);
ListElement.settings[0] = Magic;
ListElement.type = TYPE_PLUGIN;
ScummvmList.push_back(ListElement);
GameDomain = ini.nextDomain().c_str();
}
m_crc.unload();
return ScummvmList;
}
vector<string> Plugin::CreateArgs(const char *device, const char *path,
const char *title, const char *loader, u32 title_len_no_ext, u32 magic)
{

View File

@ -85,7 +85,6 @@ public:
vector<string> CreateArgs(const char *device, const char *path,
const char *title, const char *loader, u32 title_len_no_ext, u32 magic);
vector<dir_discHdr> ParseScummvmINI(Config &ini, const char *Device, u32 Magic, const char *datadir, const char *platform);
string GenerateCoverLink(dir_discHdr gameHeader, const string& constURL, Config &Checksums);
char PluginMagicWord[9];