if arguments are passed to the emu to autoboot a game, then the main

menu button should be labelled Exit, and leave the emu instead of going
back to the main menu. cleanup autoboot code.
This commit is contained in:
Daryl Borth 2018-08-30 10:11:11 -06:00
parent eabe325fb0
commit c64e7a2f70
6 changed files with 118 additions and 127 deletions

View File

@ -31,6 +31,10 @@
#include "input.h" #include "input.h"
#include "gcunzip.h" #include "gcunzip.h"
extern "C" {
extern char* strcasestr(const char *, const char *);
}
BROWSERINFO browser; BROWSERINFO browser;
BROWSERENTRY * browserList = NULL; // list of files/folders in browser BROWSERENTRY * browserList = NULL; // list of files/folders in browser
@ -654,3 +658,32 @@ OpenGameList ()
BrowserChangeFolder(); BrowserChangeFolder();
return browser.numEntries; return browser.numEntries;
} }
bool AutoloadGame(char* filepath, char* filename) {
ResetBrowser();
selectLoadedFile = 1;
std::string dir(filepath);
dir.assign(&dir[dir.find_last_of(":") + 2]);
strncpy(GCSettings.LoadFolder, dir.c_str(), sizeof(GCSettings.LoadFolder));
OpenGameList();
for(int i = 0; i < browser.numEntries; i++) {
// Skip it
if (strcmp(browserList[i].filename, ".") == 0 || strcmp(browserList[i].filename, "..") == 0) {
continue;
}
if(strcasestr(browserList[i].filename, filename) != NULL) {
browser.selIndex = i;
if(IsSz()) {
BrowserLoadSz();
browser.selIndex = 1;
}
break;
}
}
if(BrowserLoadFile() > 0) {
return true;
}
return false;
}

View File

@ -73,5 +73,6 @@ bool IsDeviceRoot(char * path);
int BrowserLoadSz(); int BrowserLoadSz();
int BrowserChangeFolder(); int BrowserChangeFolder();
int BrowserLoadFile(); int BrowserLoadFile();
bool AutoloadGame(char* filepath, char* filename);
#endif #endif

View File

@ -1227,6 +1227,9 @@ static int MenuGame()
gameSettingsBtn.SetEffectGrow(); gameSettingsBtn.SetEffectGrow();
GuiText mainmenuBtnTxt("Main Menu", 22, (GXColor){0, 0, 0, 255}); GuiText mainmenuBtnTxt("Main Menu", 22, (GXColor){0, 0, 0, 255});
if(GCSettings.AutoloadGame) {
mainmenuBtnTxt.SetText("Exit");
}
GuiImage mainmenuBtnImg(&btnOutline); GuiImage mainmenuBtnImg(&btnOutline);
GuiImage mainmenuBtnImgOver(&btnOutlineOver); GuiImage mainmenuBtnImgOver(&btnOutlineOver);
GuiButton mainmenuBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); GuiButton mainmenuBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
@ -1454,14 +1457,19 @@ static int MenuGame()
gameScreen = NULL; gameScreen = NULL;
free(gameScreenPng); free(gameScreenPng);
gameScreenPng = NULL; gameScreenPng = NULL;
gameScreenImg = new GuiImage(screenwidth, screenheight, (GXColor){236, 226, 238, 255}); if(GCSettings.AutoloadGame) {
gameScreenImg->ColorStripe(10); ExitApp();
mainWindow->Insert(gameScreenImg, 0); }
ResumeGui(); else {
#ifndef NO_SOUND gameScreenImg = new GuiImage(screenwidth, screenheight, (GXColor){236, 226, 238, 255});
bgMusic->Play(); // startup music gameScreenImg->ColorStripe(10);
#endif mainWindow->Insert(gameScreenImg, 0);
menu = MENU_GAMESELECTION; ResumeGui();
#ifndef NO_SOUND
bgMusic->Play(); // startup music
#endif
menu = MENU_GAMESELECTION;
}
} }
} }
else if(closeBtn.GetState() == STATE_CLICKED) else if(closeBtn.GetState() == STATE_CLICKED)

View File

@ -665,6 +665,7 @@ DefaultSettings ()
GCSettings.WiimoteOrientation = 0; GCSettings.WiimoteOrientation = 0;
GCSettings.ExitAction = 0; GCSettings.ExitAction = 0;
GCSettings.AutoloadGame = 0;
GCSettings.MusicVolume = 20; GCSettings.MusicVolume = 20;
GCSettings.SFXVolume = 40; GCSettings.SFXVolume = 40;
GCSettings.Rumble = 1; GCSettings.Rumble = 1;

View File

@ -78,26 +78,6 @@ static void ExitCleanup()
void (*PSOReload) () = (void (*)()) 0x80001800; void (*PSOReload) () = (void (*)()) 0x80001800;
#endif #endif
void ExitToWiiflow()
{
ShutoffRumble();
SavePrefs(SILENT);
if (ROMLoaded && !ConfigRequested && GCSettings.AutoSave == 1)
SaveBatteryOrStateAuto(FILE_SRAM, SILENT);
ExitCleanup();
if( !!*(u32*)0x80001800 )
{
// Were we launched via HBC? (or via wiiflows stub replacement? :P)
exit(1);
}
else
{
// Wii channel support
SYS_ResetSystem( SYS_RETURNTOMENU, 0, 0 );
}
}
void ExitApp() void ExitApp()
{ {
#ifdef HW_RVL #ifdef HW_RVL
@ -111,49 +91,63 @@ void ExitApp()
ExitCleanup(); ExitCleanup();
if(ShutdownRequested) if(ShutdownRequested) {
SYS_ResetSystem(SYS_POWEROFF_STANDBY, 0, 0); SYS_ResetSystem(SYS_POWEROFF_STANDBY, 0, 0);
}
#ifdef HW_RVL else if(GCSettings.AutoloadGame) {
if(GCSettings.ExitAction == 0) // Auto if( !!*(u32*)0x80001800 )
{ {
char * sig = (char *)0x80001804; // Were we launched via HBC? (or via wiiflows stub replacement? :P)
if( exit(1);
sig[0] == 'S' && }
sig[1] == 'T' &&
sig[2] == 'U' &&
sig[3] == 'B' &&
sig[4] == 'H' &&
sig[5] == 'A' &&
sig[6] == 'X' &&
sig[7] == 'X')
GCSettings.ExitAction = 3; // Exit to HBC
else else
GCSettings.ExitAction = 1; // HBC not found {
// Wii channel support
SYS_ResetSystem( SYS_RETURNTOMENU, 0, 0 );
}
} }
#endif else {
#ifdef HW_RVL
if(GCSettings.ExitAction == 0) // Auto
{
char * sig = (char *)0x80001804;
if(
sig[0] == 'S' &&
sig[1] == 'T' &&
sig[2] == 'U' &&
sig[3] == 'B' &&
sig[4] == 'H' &&
sig[5] == 'A' &&
sig[6] == 'X' &&
sig[7] == 'X')
GCSettings.ExitAction = 3; // Exit to HBC
else
GCSettings.ExitAction = 1; // HBC not found
}
#endif
if(GCSettings.ExitAction == 1) // Exit to Menu if(GCSettings.ExitAction == 1) // Exit to Menu
{ {
#ifdef HW_RVL #ifdef HW_RVL
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
#else #else
#define SOFTRESET_ADR ((volatile u32*)0xCC003024) #define SOFTRESET_ADR ((volatile u32*)0xCC003024)
*SOFTRESET_ADR = 0x00000000; *SOFTRESET_ADR = 0x00000000;
#endif #endif
} }
else if(GCSettings.ExitAction == 2) // Shutdown Wii else if(GCSettings.ExitAction == 2) // Shutdown Wii
{ {
SYS_ResetSystem(SYS_POWEROFF_STANDBY, 0, 0); SYS_ResetSystem(SYS_POWEROFF_STANDBY, 0, 0);
} }
else // Exit to Loader else // Exit to Loader
{ {
#ifdef HW_RVL #ifdef HW_RVL
exit(0); exit(0);
#else #else
if (psoid[0] == PSOSDLOADID) if (psoid[0] == PSOSDLOADID)
PSOReload(); PSOReload();
#endif #endif
}
} }
} }
@ -399,10 +393,7 @@ int main(int argc, char *argv[])
InitGUIThreads(); InitGUIThreads();
bool autoboot = false; bool autoboot = false;
if(argc > 2 && argv[1] != NULL && argv[2] != NULL) if(argc > 2 && argv[1] != NULL && argv[2] != NULL) {
{
autoboot = true;
ResetBrowser();
LoadPrefs(); LoadPrefs();
if(strcasestr(argv[1], "sd:/") != NULL) if(strcasestr(argv[1], "sd:/") != NULL)
{ {
@ -415,69 +406,29 @@ int main(int argc, char *argv[])
GCSettings.LoadMethod = DEVICE_USB; GCSettings.LoadMethod = DEVICE_USB;
} }
SavePrefs(SILENT); SavePrefs(SILENT);
selectLoadedFile = 1;
std::string dir(argv[1]); GCSettings.AutoloadGame = AutoloadGame(argv[1], argv[2]);
dir.assign(&dir[dir.find_last_of(":") + 2]); autoboot = GCSettings.AutoloadGame;
char arg_filename[1024];
strncpy(arg_filename, argv[2], sizeof(arg_filename));
strncpy(GCSettings.LoadFolder, dir.c_str(), sizeof(GCSettings.LoadFolder));
OpenGameList();
strncpy(GCSettings.Exit_Dol_File, argc > 3 && argv[3] != NULL ? argv[3] : "", sizeof(GCSettings.Exit_Dol_File));
if(argc > 5 && argv[4] != NULL && argv[5] != NULL)
{
sscanf(argv[4], "%08x", &GCSettings.Exit_Channel[0]);
sscanf(argv[5], "%08x", &GCSettings.Exit_Channel[1]);
}
else
{
GCSettings.Exit_Channel[0] = 0x00010008;
GCSettings.Exit_Channel[1] = 0x57494948;
}
if(argc > 6 && argv[6] != NULL)
strncpy(GCSettings.LoaderName, argv[6], sizeof(GCSettings.LoaderName));
else
snprintf(GCSettings.LoaderName, sizeof(GCSettings.LoaderName), "WiiFlow");
for(int i = 0; i < browser.numEntries; i++)
{
// Skip it
if (strcmp(browserList[i].filename, ".") == 0 || strcmp(browserList[i].filename, "..") == 0)
continue;
if(strcasestr(browserList[i].filename, arg_filename) != NULL)
{
browser.selIndex = i;
if(IsSz())
{
BrowserLoadSz();
browser.selIndex = 1;
}
break;
}
}
BrowserLoadFile();
} }
while(1) // main loop while(1) // main loop
{ {
// go back to checking if devices were inserted/removed if(!autoboot) {
// since we're entering the menu // go back to checking if devices were inserted/removed
ResumeDeviceThread(); // since we're entering the menu
ResumeDeviceThread();
SwitchAudioMode(1); SwitchAudioMode(1);
if(!autoboot)
{
if(!ROMLoaded) if(!ROMLoaded)
MainMenu(MENU_GAMESELECTION); MainMenu(MENU_GAMESELECTION);
else else
MainMenu(MENU_GAME); MainMenu(MENU_GAME);
ConfigRequested = 0;
ScreenshotRequested = 0;
} }
else if(ROMLoaded && autoboot)
autoboot = false; autoboot = false;
else ConfigRequested = 0;
ExitApp(); ScreenshotRequested = 0;
SwitchAudioMode(0); SwitchAudioMode(0);

View File

@ -94,6 +94,7 @@ struct SGCSettings
int Rumble; int Rumble;
int language; int language;
int PreviewImage; int PreviewImage;
int AutoloadGame;
int OffsetMinutesUTC; // Used for clock on MBC3 and TAMA5 int OffsetMinutesUTC; // Used for clock on MBC3 and TAMA5
int GBHardware; // Mapped to gbEmulatorType in VBA int GBHardware; // Mapped to gbEmulatorType in VBA
@ -109,10 +110,6 @@ struct SGCSettings
char ImageFolder[MAXPATHLEN]; //Saved image folder path char ImageFolder[MAXPATHLEN]; //Saved image folder path
char BorderFolder[MAXPATHLEN]; // Path to Super Game Boy border files char BorderFolder[MAXPATHLEN]; // Path to Super Game Boy border files
char Exit_Dol_File[MAXPATHLEN]; // Exit Path
char LoaderName[20]; // Menu Loader Name
u32 Exit_Channel[2]; // Exit Channel
char smbip[80]; char smbip[80];
char smbuser[20]; char smbuser[20];
char smbpwd[20]; char smbpwd[20];