mirror of
https://github.com/wiidev/usbloadergx.git
synced 2025-02-18 04:16:20 +01:00
*Addition per Game Lock Feature (Issue 1694) - Patch supplied by pjigar
This commit is contained in:
parent
c5c5708e12
commit
defd5f940b
@ -2,8 +2,8 @@
|
|||||||
<app version="1">
|
<app version="1">
|
||||||
<name> USB Loader GX</name>
|
<name> USB Loader GX</name>
|
||||||
<coder>USB Loader GX Team</coder>
|
<coder>USB Loader GX Team</coder>
|
||||||
<version>1.0 r979</version>
|
<version>1.0 r980</version>
|
||||||
<release_date>201009260941</release_date>
|
<release_date>201009281739</release_date>
|
||||||
<short_description>Loads games from USB-devices</short_description>
|
<short_description>Loads games from USB-devices</short_description>
|
||||||
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.
|
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.
|
||||||
The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller.
|
The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller.
|
||||||
|
@ -1115,6 +1115,35 @@ int WindowExitPrompt()
|
|||||||
return choice;
|
return choice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetupLockedButton(GuiButton *btnLocked, GuiImage *img, GuiSound *sndOver, GuiSound *sndClick,
|
||||||
|
GuiTrigger *trig)
|
||||||
|
{
|
||||||
|
btnLocked->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
||||||
|
//btnLocked->SetPosition(xPos, yPos);
|
||||||
|
btnLocked->SetPosition(125, 40);
|
||||||
|
btnLocked->SetImage(img);
|
||||||
|
btnLocked->SetSoundOver(sndOver);
|
||||||
|
btnLocked->SetSoundClick(sndClick);
|
||||||
|
btnLocked->SetTrigger(trig);
|
||||||
|
btnLocked->SetEffectGrow();
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 SetLocked(GuiButton *lock1, u8* gameId, u8 locked)
|
||||||
|
{
|
||||||
|
int LockStatus = (locked == GameStatistics.GetLockStatus(gameId)) ? 0 : locked; // Press the current rank to reset the rank
|
||||||
|
|
||||||
|
GameStatistics.SetLockStatus(gameId, LockStatus);
|
||||||
|
GameStatistics.Save();
|
||||||
|
|
||||||
|
return LockStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetLockedImage(const u8 * gameid, GuiImage *b1, GuiImageData *on, GuiImageData *off)
|
||||||
|
{
|
||||||
|
int lockedvar = GameStatistics.GetLockStatus(gameid);
|
||||||
|
b1->SetImage(lockedvar == 1 ? on : off);
|
||||||
|
}
|
||||||
|
|
||||||
void SetupFavoriteButton(GuiButton *btnFavorite, int xPos, GuiImage *img, GuiSound *sndOver, GuiSound *sndClick,
|
void SetupFavoriteButton(GuiButton *btnFavorite, int xPos, GuiImage *img, GuiSound *sndOver, GuiSound *sndClick,
|
||||||
GuiTrigger *trig)
|
GuiTrigger *trig)
|
||||||
{
|
{
|
||||||
@ -1176,6 +1205,9 @@ int GameWindowPrompt()
|
|||||||
|
|
||||||
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
||||||
|
|
||||||
|
GuiImageData imgLocked(Resources::GetFile("lock.png"), Resources::GetFileSize("lock.png"));
|
||||||
|
GuiImageData imgNotLocked(Resources::GetFile("unlock.png"), Resources::GetFileSize("unlock.png"));
|
||||||
|
|
||||||
GuiImageData imgFavorite(Resources::GetFile("favorite.png"), Resources::GetFileSize("favorite.png"));
|
GuiImageData imgFavorite(Resources::GetFile("favorite.png"), Resources::GetFileSize("favorite.png"));
|
||||||
GuiImageData imgNotFavorite(Resources::GetFile("not_favorite.png"), Resources::GetFileSize("not_favorite.png"));
|
GuiImageData imgNotFavorite(Resources::GetFile("not_favorite.png"), Resources::GetFileSize("not_favorite.png"));
|
||||||
|
|
||||||
@ -1315,6 +1347,11 @@ int GameWindowPrompt()
|
|||||||
SetupFavoriteButton(&btnFavorite4, -117, &btnFavoriteImg4, &btnSoundOver, btnClick2, &trigA);
|
SetupFavoriteButton(&btnFavorite4, -117, &btnFavoriteImg4, &btnSoundOver, btnClick2, &trigA);
|
||||||
SetupFavoriteButton(&btnFavorite5, -90, &btnFavoriteImg5, &btnSoundOver, btnClick2, &trigA);
|
SetupFavoriteButton(&btnFavorite5, -90, &btnFavoriteImg5, &btnSoundOver, btnClick2, &trigA);
|
||||||
|
|
||||||
|
GuiImage btnLockedImg;
|
||||||
|
btnLockedImg.SetWidescreen(Settings.widescreen);
|
||||||
|
GuiButton btnLocked(imgLocked.GetWidth(), imgLocked.GetHeight());
|
||||||
|
SetupLockedButton(&btnLocked, &btnLockedImg, &btnSoundOver, btnClick2, &trigA);
|
||||||
|
|
||||||
GuiImage btnLeftImg(&imgLeft);
|
GuiImage btnLeftImg(&imgLeft);
|
||||||
if (Settings.wsprompt == yes)
|
if (Settings.wsprompt == yes)
|
||||||
{
|
{
|
||||||
@ -1354,6 +1391,7 @@ int GameWindowPrompt()
|
|||||||
if (Settings.godmode == 1 && mountMethod != 2 && mountMethod != 3)
|
if (Settings.godmode == 1 && mountMethod != 2 && mountMethod != 3)
|
||||||
{
|
{
|
||||||
promptWindow.Append(&btn3);
|
promptWindow.Append(&btn3);
|
||||||
|
promptWindow.Append(&btnLocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
promptWindow.Append(&diskImg2);
|
promptWindow.Append(&diskImg2);
|
||||||
@ -1495,6 +1533,8 @@ int GameWindowPrompt()
|
|||||||
SetFavoriteImages(header->id, &btnFavoriteImg1, &btnFavoriteImg2, &btnFavoriteImg3, &btnFavoriteImg4, &btnFavoriteImg5,
|
SetFavoriteImages(header->id, &btnFavoriteImg1, &btnFavoriteImg2, &btnFavoriteImg3, &btnFavoriteImg4, &btnFavoriteImg5,
|
||||||
&imgFavorite, &imgNotFavorite);
|
&imgFavorite, &imgNotFavorite);
|
||||||
|
|
||||||
|
SetLockedImage(header->id, &btnLockedImg, &imgLocked, &imgNotLocked);
|
||||||
|
|
||||||
nameTxt.SetPosition(0, 1);
|
nameTxt.SetPosition(0, 1);
|
||||||
|
|
||||||
if (changed != 3 && changed != 4) // changed==3 or changed==4 --> only Resume the GUI
|
if (changed != 3 && changed != 4) // changed==3 or changed==4 --> only Resume the GUI
|
||||||
@ -1575,6 +1615,15 @@ int GameWindowPrompt()
|
|||||||
}
|
}
|
||||||
btnFavorite1.ResetState();
|
btnFavorite1.ResetState();
|
||||||
}
|
}
|
||||||
|
else if (btnLocked.GetState() == STATE_CLICKED) //switch locked
|
||||||
|
{
|
||||||
|
if (isInserted(bootDevice))
|
||||||
|
{
|
||||||
|
SetLocked(&btnLocked, header->id, 1);
|
||||||
|
SetLockedImage(header->id, &btnLockedImg, &imgLocked, &imgNotLocked);
|
||||||
|
}
|
||||||
|
btnLocked.ResetState();
|
||||||
|
}
|
||||||
else if (btnFavorite2.GetState() == STATE_CLICKED) //switch favorite
|
else if (btnFavorite2.GetState() == STATE_CLICKED) //switch favorite
|
||||||
{
|
{
|
||||||
if (isInserted(bootDevice))
|
if (isInserted(bootDevice))
|
||||||
|
@ -119,6 +119,7 @@ bool CGameStatistics::Save()
|
|||||||
{
|
{
|
||||||
fprintf(f, "game:%s = ", GameList[i].id);
|
fprintf(f, "game:%s = ", GameList[i].id);
|
||||||
fprintf(f, "FavoriteRank:%d; ", GameList[i].FavoriteRank);
|
fprintf(f, "FavoriteRank:%d; ", GameList[i].FavoriteRank);
|
||||||
|
fprintf(f, "LockStatus:%d; ", GameList[i].LockStatus);
|
||||||
fprintf(f, "PlayCount:%d;\n", GameList[i].PlayCount);
|
fprintf(f, "PlayCount:%d;\n", GameList[i].PlayCount);
|
||||||
}
|
}
|
||||||
fprintf(f, "# END\n");
|
fprintf(f, "# END\n");
|
||||||
@ -139,6 +140,14 @@ bool CGameStatistics::SetSetting(GameStatus & game, char *name, char *value)
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if(strcmp(name, "LockStatus") == 0)
|
||||||
|
{
|
||||||
|
if (sscanf(value, "%d", &i) == 1)
|
||||||
|
{
|
||||||
|
game.LockStatus = i;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else if(strcmp(name, "PlayCount") == 0)
|
else if(strcmp(name, "PlayCount") == 0)
|
||||||
{
|
{
|
||||||
if (sscanf(value, "%d", &i) == 1)
|
if (sscanf(value, "%d", &i) == 1)
|
||||||
@ -242,11 +251,15 @@ void CGameStatistics::SetPlayCount(const char * id, int count)
|
|||||||
GameStatus NewStatus;
|
GameStatus NewStatus;
|
||||||
snprintf(NewStatus.id, sizeof(NewStatus.id), id);
|
snprintf(NewStatus.id, sizeof(NewStatus.id), id);
|
||||||
NewStatus.FavoriteRank = 0;
|
NewStatus.FavoriteRank = 0;
|
||||||
|
NewStatus.LockStatus = 0;
|
||||||
NewStatus.PlayCount = count;
|
NewStatus.PlayCount = count;
|
||||||
|
|
||||||
GameStatus * game = GetGameStatus(id);
|
GameStatus * game = GetGameStatus(id);
|
||||||
if(game)
|
if(game)
|
||||||
|
{
|
||||||
NewStatus.FavoriteRank = game->FavoriteRank;
|
NewStatus.FavoriteRank = game->FavoriteRank;
|
||||||
|
NewStatus.LockStatus = game->LockStatus;
|
||||||
|
}
|
||||||
|
|
||||||
AddGame(NewStatus);
|
AddGame(NewStatus);
|
||||||
}
|
}
|
||||||
@ -259,11 +272,36 @@ void CGameStatistics::SetFavoriteRank(const char * id, int rank)
|
|||||||
GameStatus NewStatus;
|
GameStatus NewStatus;
|
||||||
snprintf(NewStatus.id, sizeof(NewStatus.id), id);
|
snprintf(NewStatus.id, sizeof(NewStatus.id), id);
|
||||||
NewStatus.FavoriteRank = rank;
|
NewStatus.FavoriteRank = rank;
|
||||||
|
NewStatus.LockStatus = 0;
|
||||||
NewStatus.PlayCount = 0;
|
NewStatus.PlayCount = 0;
|
||||||
|
|
||||||
GameStatus * game = GetGameStatus(id);
|
GameStatus * game = GetGameStatus(id);
|
||||||
if(game)
|
if(game)
|
||||||
|
{
|
||||||
|
NewStatus.PlayCount = game->PlayCount;
|
||||||
|
NewStatus.LockStatus = game->LockStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddGame(NewStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGameStatistics::SetLockStatus(const char * id, int lock)
|
||||||
|
{
|
||||||
|
if(!id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
GameStatus NewStatus;
|
||||||
|
snprintf(NewStatus.id, sizeof(NewStatus.id), id);
|
||||||
|
NewStatus.FavoriteRank = 0;
|
||||||
|
NewStatus.LockStatus = lock;
|
||||||
|
NewStatus.PlayCount = 0;
|
||||||
|
|
||||||
|
GameStatus * game = GetGameStatus(id);
|
||||||
|
if(game)
|
||||||
|
{
|
||||||
|
NewStatus.PlayCount = game->PlayCount;
|
||||||
NewStatus.FavoriteRank = game->FavoriteRank;
|
NewStatus.FavoriteRank = game->FavoriteRank;
|
||||||
|
}
|
||||||
|
|
||||||
AddGame(NewStatus);
|
AddGame(NewStatus);
|
||||||
}
|
}
|
||||||
@ -291,3 +329,16 @@ int CGameStatistics::GetFavoriteRank(const char * id)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CGameStatistics::GetLockStatus(const char * id)
|
||||||
|
{
|
||||||
|
if(!id)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
GameStatus * game = GetGameStatus(id);
|
||||||
|
if(game)
|
||||||
|
return game->LockStatus;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ typedef struct _Stats
|
|||||||
{
|
{
|
||||||
char id[7];
|
char id[7];
|
||||||
u8 FavoriteRank;
|
u8 FavoriteRank;
|
||||||
|
u8 LockStatus;
|
||||||
u8 PlayCount;
|
u8 PlayCount;
|
||||||
} GameStatus;
|
} GameStatus;
|
||||||
|
|
||||||
@ -49,6 +50,14 @@ class CGameStatistics
|
|||||||
int GetFavoriteRank(const char * id);
|
int GetFavoriteRank(const char * id);
|
||||||
int GetFavoriteRank(const u8 * id) { return GetFavoriteRank((const char *) id); };
|
int GetFavoriteRank(const u8 * id) { return GetFavoriteRank((const char *) id); };
|
||||||
int GetFavoriteRank(const struct discHdr * game) { if(!game) return 0; else return GetFavoriteRank(game->id); };
|
int GetFavoriteRank(const struct discHdr * game) { if(!game) return 0; else return GetFavoriteRank(game->id); };
|
||||||
|
//!Overloads for set LockStatus
|
||||||
|
void SetLockStatus(const char * id, int lock);
|
||||||
|
void SetLockStatus(const u8 * id, int lock) { SetLockStatus((const char *) id, lock); };
|
||||||
|
void SetLockStatus(const struct discHdr * game, int lock) { if(!game) return; SetLockStatus(game->id, lock); };
|
||||||
|
//!Overloads for get LockStatus
|
||||||
|
int GetLockStatus(const char * id);
|
||||||
|
int GetLockStatus(const u8 * id) { return GetLockStatus((const char *) id); };
|
||||||
|
int GetLockStatus(const struct discHdr * game) { if(!game) return 0; else return GetLockStatus(game->id); };
|
||||||
//!Get GameStatus
|
//!Get GameStatus
|
||||||
GameStatus * GetGameStatus(const char * id);
|
GameStatus * GetGameStatus(const char * id);
|
||||||
//!Overload
|
//!Overload
|
||||||
|
@ -80,6 +80,7 @@ void CSettings::SetDefault()
|
|||||||
tooltips = TooltipsOn;
|
tooltips = TooltipsOn;
|
||||||
gamesound = 1;
|
gamesound = 1;
|
||||||
parentalcontrol = 0;
|
parentalcontrol = 0;
|
||||||
|
lockedgames = 0;
|
||||||
cios = 249;
|
cios = 249;
|
||||||
xflip = no;
|
xflip = no;
|
||||||
quickboot = no;
|
quickboot = no;
|
||||||
@ -209,6 +210,7 @@ bool CSettings::Save()
|
|||||||
fprintf(file, "quickboot = %d\n ", quickboot);
|
fprintf(file, "quickboot = %d\n ", quickboot);
|
||||||
fprintf(file, "wsprompt = %d\n ", wsprompt);
|
fprintf(file, "wsprompt = %d\n ", wsprompt);
|
||||||
fprintf(file, "parentalcontrol = %d\n ", parentalcontrol);
|
fprintf(file, "parentalcontrol = %d\n ", parentalcontrol);
|
||||||
|
fprintf(file, "lockedgames = %d\n ", lockedgames);
|
||||||
fprintf(file, "covers_path = %s\n ", covers_path);
|
fprintf(file, "covers_path = %s\n ", covers_path);
|
||||||
fprintf(file, "covers2d_path = %s\n ", covers2d_path);
|
fprintf(file, "covers2d_path = %s\n ", covers2d_path);
|
||||||
fprintf(file, "theme_path = %s\n ", theme_path);
|
fprintf(file, "theme_path = %s\n ", theme_path);
|
||||||
@ -399,6 +401,11 @@ bool CSettings::SetSetting(char *name, char *value)
|
|||||||
if (sscanf(value, "%d", &i) == 1) parentalcontrol = i;
|
if (sscanf(value, "%d", &i) == 1) parentalcontrol = i;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (strcmp(name, "lockedgames") == 0)
|
||||||
|
{
|
||||||
|
if (sscanf(value, "%d", &i) == 1) lockedgames = i;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else if (strcmp(name, "screensaver") == 0)
|
else if (strcmp(name, "screensaver") == 0)
|
||||||
{
|
{
|
||||||
if (sscanf(value, "%d", &i) == 1) screensaver = i;
|
if (sscanf(value, "%d", &i) == 1) screensaver = i;
|
||||||
|
@ -82,6 +82,7 @@ class CSettings
|
|||||||
short tooltips;
|
short tooltips;
|
||||||
char unlockCode[20];
|
char unlockCode[20];
|
||||||
short parentalcontrol;
|
short parentalcontrol;
|
||||||
|
short lockedgames;
|
||||||
short cios;
|
short cios;
|
||||||
short quickboot;
|
short quickboot;
|
||||||
short wsprompt;
|
short wsprompt;
|
||||||
|
@ -55,6 +55,7 @@ static const char *opts_videomode[settings_language_max][2] = { { "", trNOOP( "D
|
|||||||
static const char *opts_language[settings_language_max] = { trNOOP( "Console Default" ), trNOOP( "Japanese" ),
|
static const char *opts_language[settings_language_max] = { trNOOP( "Console Default" ), trNOOP( "Japanese" ),
|
||||||
trNOOP( "English" ), trNOOP( "German" ), trNOOP( "French" ), trNOOP( "Spanish" ), trNOOP( "Italian" ),
|
trNOOP( "English" ), trNOOP( "German" ), trNOOP( "French" ), trNOOP( "Spanish" ), trNOOP( "Italian" ),
|
||||||
trNOOP( "Dutch" ), trNOOP( "SChinese" ), trNOOP( "TChinese" ), trNOOP( "Korean" ) };
|
trNOOP( "Dutch" ), trNOOP( "SChinese" ), trNOOP( "TChinese" ), trNOOP( "Korean" ) };
|
||||||
|
static const char *opts_lockedgames[2] = { trNOOP( "0 (Locked and Unlocked Games)" ), trNOOP( "1 (Unlocked Games Only)" ) };
|
||||||
static const char *opts_parentalcontrol[5] = { trNOOP( "0 (Everyone)" ), trNOOP( "1 (Child 7+)" ),
|
static const char *opts_parentalcontrol[5] = { trNOOP( "0 (Everyone)" ), trNOOP( "1 (Child 7+)" ),
|
||||||
trNOOP( "2 (Teen 12+)" ), trNOOP( "3 (Mature 16+)" ), trNOOP( "4 (Adults Only 18+)" ) };
|
trNOOP( "2 (Teen 12+)" ), trNOOP( "3 (Mature 16+)" ), trNOOP( "4 (Adults Only 18+)" ) };
|
||||||
static const char *opts_error002[3] = { trNOOP( "No" ), trNOOP( "Yes" ), trNOOP( "Anti" ) };
|
static const char *opts_error002[3] = { trNOOP( "No" ), trNOOP( "Yes" ), trNOOP( "Anti" ) };
|
||||||
@ -1316,6 +1317,16 @@ int MenuSettings()
|
|||||||
else options2.SetValue(Idx, "********");
|
else options2.SetValue(Idx, "********");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret == ++Idx || firstRun)
|
||||||
|
{
|
||||||
|
if (firstRun) options2.SetName(Idx, "%s", tr( "GamesLevel" ));
|
||||||
|
if (ret == Idx && Settings.godmode == 1 && ++Settings.lockedgames >= 2) Settings.lockedgames
|
||||||
|
= 0;
|
||||||
|
if (Settings.godmode == 1)
|
||||||
|
options2.SetValue(Idx, "%s", tr( opts_lockedgames[Settings.lockedgames] ));
|
||||||
|
else options2.SetValue(Idx, "********");
|
||||||
|
}
|
||||||
|
|
||||||
firstRun = false;
|
firstRun = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ int GameList::FilterList(const wchar_t * gameFilter)
|
|||||||
|
|
||||||
if (Settings.parentalcontrol && !Settings.godmode) if (get_block(header) >= Settings.parentalcontrol) continue;
|
if (Settings.parentalcontrol && !Settings.godmode) if (get_block(header) >= Settings.parentalcontrol) continue;
|
||||||
|
|
||||||
/* Other parental control method */
|
/* Rating based parental control method */
|
||||||
if (Settings.parentalcontrol == 0 && Settings.godmode == 0 && Settings.Parental.enabled == 1)
|
if (Settings.parentalcontrol == 0 && Settings.godmode == 0 && Settings.Parental.enabled == 1)
|
||||||
{
|
{
|
||||||
// Check game rating in WiiTDB, since the default Wii parental control setting is enabled
|
// Check game rating in WiiTDB, since the default Wii parental control setting is enabled
|
||||||
@ -140,6 +140,11 @@ int GameList::FilterList(const wchar_t * gameFilter)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Game lock based parental control method */
|
||||||
|
// If game lock is set to "1 (Unlocked Games Only)" and the game is locked, then skip
|
||||||
|
if(Settings.lockedgames == 1 && Settings.godmode == 0 && GameStatistics.GetLockStatus(header->id) == 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
wchar_t *gameName = charToWideChar(get_title(header));
|
wchar_t *gameName = charToWideChar(get_title(header));
|
||||||
|
|
||||||
if (gameName && *GameFilter.c_str())
|
if (gameName && *GameFilter.c_str())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user