From 72fee232c7a568ad942fca2f7c3f5433cbcd24f9 Mon Sep 17 00:00:00 2001 From: libertyernie Date: Sat, 28 Jul 2018 16:26:19 -0500 Subject: [PATCH] Fix compilation errors with latest libOGC/devkitPPC (Partially ported from snes9xgx: https://github.com/dborth/snes9xgx/commit/a4177458176bfdf2881aebf3204c0a4fb5083640) --- source/filebrowser.cpp | 1312 +++--- source/filebrowser.h | 154 +- source/fileop.cpp | 12 +- source/menu.cpp | 9718 ++++++++++++++++++++-------------------- source/networkop.cpp | 2 +- source/preferences.cpp | 6 +- source/vbagx.cpp | 3 +- source/vbagx.h | 1 + source/video.cpp | 2 +- 9 files changed, 5607 insertions(+), 5603 deletions(-) diff --git a/source/filebrowser.cpp b/source/filebrowser.cpp index 820fb3f..97c3625 100644 --- a/source/filebrowser.cpp +++ b/source/filebrowser.cpp @@ -1,656 +1,656 @@ -/**************************************************************************** - * Visual Boy Advance GX - * - * Tantric September 2008 - * - * filebrowser.cpp - * - * Generic file routines - reading, writing, browsing - ***************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include - -#ifdef HW_RVL -#include -#endif - -#include "vbagx.h" -#include "vbasupport.h" -#include "vmmem.h" -#include "filebrowser.h" -#include "menu.h" -#include "video.h" -#include "networkop.h" -#include "fileop.h" -#include "input.h" -#include "gcunzip.h" - -BROWSERINFO browser; -BROWSERENTRY * browserList = NULL; // list of files/folders in browser - -char szpath[MAXPATHLEN]; -char szname[MAXPATHLEN]; -bool inSz = false; - -char ROMFilename[512]; -bool ROMLoaded = false; -bool loadingFile = false; - -/**************************************************************************** -* autoLoadMethod() -* Auto-determines and sets the load device -* Returns device set -****************************************************************************/ -int autoLoadMethod() -{ - ShowAction ("Attempting to determine load device..."); - - int device = DEVICE_AUTO; - - if(ChangeInterface(DEVICE_SD, SILENT)) - device = DEVICE_SD; - else if(ChangeInterface(DEVICE_USB, SILENT)) - device = DEVICE_USB; - else if(ChangeInterface(DEVICE_SD_SLOTA, SILENT)) - device = DEVICE_SD_SLOTA; - else if(ChangeInterface(DEVICE_SD_SLOTB, SILENT)) - device = DEVICE_SD_SLOTB; - else if(ChangeInterface(DEVICE_DVD, SILENT)) - device = DEVICE_DVD; - else if(ChangeInterface(DEVICE_SMB, SILENT)) - device = DEVICE_SMB; - else - ErrorPrompt("Unable to locate a load device!"); - - if(GCSettings.LoadMethod == DEVICE_AUTO) - GCSettings.LoadMethod = device; // save device found for later use - CancelAction(); - return device; -} - -/**************************************************************************** -* autoSaveMethod() -* Auto-determines and sets the save device -* Returns device set -****************************************************************************/ -int autoSaveMethod(bool silent) -{ - if(!silent) - ShowAction ("Attempting to determine save device..."); - - int device = DEVICE_AUTO; - - if(ChangeInterface(DEVICE_SD, SILENT)) - device = DEVICE_SD; - else if(ChangeInterface(DEVICE_USB, SILENT)) - device = DEVICE_USB; - else if(ChangeInterface(DEVICE_SD_SLOTA, SILENT)) - device = DEVICE_SD_SLOTA; - else if(ChangeInterface(DEVICE_SD_SLOTB, SILENT)) - device = DEVICE_SD_SLOTB; - else if(ChangeInterface(DEVICE_SMB, SILENT)) - device = DEVICE_SMB; - else if(!silent) - ErrorPrompt("Unable to locate a save device!"); - - if(GCSettings.SaveMethod == DEVICE_AUTO) - GCSettings.SaveMethod = device; // save device found for later use - - CancelAction(); - return device; -} - -/**************************************************************************** - * ResetBrowser() - * Clears the file browser memory, and allocates one initial entry - ***************************************************************************/ -void ResetBrowser() -{ - browser.numEntries = 0; - browser.selIndex = 0; - browser.pageIndex = 0; - browser.size = 0; -} - -bool AddBrowserEntry() -{ - if(browser.size >= MAX_BROWSER_SIZE) - { - ErrorPrompt("Out of memory: too many files!"); - return false; // out of space - } - - memset(&(browserList[browser.size]), 0, sizeof(BROWSERENTRY)); // clear the new entry - browser.size++; - return true; -} - -/**************************************************************************** - * CleanupPath() - * Cleans up the filepath, removing double // and replacing \ with / - ***************************************************************************/ -static void CleanupPath(char * path) -{ - if(!path || path[0] == 0) - return; - - int pathlen = strlen(path); - int j = 0; - for(int i=0; i < pathlen && i < MAXPATHLEN; i++) - { - if(path[i] == '\\') - path[i] = '/'; - - if(j == 0 || !(path[j-1] == '/' && path[i] == '/')) - path[j++] = path[i]; - } - path[j] = 0; -} - -bool IsDeviceRoot(char * path) -{ - if(path == NULL || path[0] == 0) - return false; - - if( strcmp(path, "sd:/") == 0 || - strcmp(path, "usb:/") == 0 || - strcmp(path, "dvd:/") == 0 || - strcmp(path, "smb:/") == 0 || - strcmp(path, "carda:/") == 0 || - strcmp(path, "cardb:/") == 0) - { - return true; - } - return false; -} - -/**************************************************************************** - * UpdateDirName() - * Update curent directory name for file browser - ***************************************************************************/ -int UpdateDirName() -{ - int size=0; - char * test; - char temp[1024]; - int device = 0; - - if(browser.numEntries == 0) - return 1; - - FindDevice(browser.dir, &device); - - /* current directory doesn't change */ - if (strcmp(browserList[browser.selIndex].filename,".") == 0) - { - return 0; - } - /* go up to parent directory */ - else if (strcmp(browserList[browser.selIndex].filename,"..") == 0) - { - // already at the top level - if(IsDeviceRoot(browser.dir)) - { - browser.dir[0] = 0; // remove device - we are going to the device listing screen - } - else - { - /* determine last subdirectory namelength */ - sprintf(temp,"%s",browser.dir); - test = strtok(temp,"/"); - while (test != NULL) - { - size = strlen(test); - test = strtok(NULL,"/"); - } - - /* remove last subdirectory name */ - size = strlen(browser.dir) - size - 1; - strncpy(GCSettings.LastFileLoaded, &browser.dir[size], strlen(browser.dir) - size - 1); //set as loaded file the previous dir - GCSettings.LastFileLoaded[strlen(browser.dir) - size - 1] = 0; - browser.dir[size] = 0; - } - - return 1; - } - /* Open a directory */ - else - { - /* test new directory namelength */ - if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) < MAXPATHLEN) - { - /* update current directory name */ - sprintf(browser.dir, "%s%s/",browser.dir, browserList[browser.selIndex].filename); - return 1; - } - else - { - ErrorPrompt("Directory name is too long!"); - return -1; - } - } -} - -bool MakeFilePath(char filepath[], int type, char * filename, int filenum) -{ - char file[512]; - char folder[1024]; - char ext[4]; - char temppath[MAXPATHLEN]; - - if(type == FILE_ROM) - { - // Check path length - if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) >= MAXPATHLEN) - { - ErrorPrompt("Maximum filepath length reached!"); - filepath[0] = 0; - return false; - } - else - { - sprintf(temppath, "%s%s",browser.dir,browserList[browser.selIndex].filename); - } - } - else if (type == FILE_BORDER_PNG) - { - const char* loadedpath = filename; - if (loadedpath == NULL) loadedpath = "default"; - // Ensure that loadedname contains only the filename, not the path - const char* loadedname = strrchr(loadedpath, '/'); - if (loadedname == NULL) loadedname = loadedpath; - - // Check path length - if ((strlen(pathPrefix[GCSettings.LoadMethod]) + strlen(GCSettings.BorderFolder) + strlen(loadedname)) >= MAXPATHLEN) { - ErrorPrompt("Maximum filepath length reached!"); - filepath[0] = 0; - return false; - } - - StripExt(file, loadedname); - sprintf(temppath, "%s%s/%s.png", pathPrefix[GCSettings.LoadMethod], GCSettings.BorderFolder, file); - } - else - { - if(GCSettings.SaveMethod == DEVICE_AUTO) - GCSettings.SaveMethod = autoSaveMethod(SILENT); - - if(GCSettings.SaveMethod == DEVICE_AUTO) - return false; - - switch(type) - { - case FILE_SRAM: - case FILE_SNAPSHOT: - sprintf(folder, GCSettings.SaveFolder); - - if(type == FILE_SRAM) sprintf(ext, "sav"); - else sprintf(ext, "sgm"); - - if(filenum >= -1) - { - if(filenum == -1) - sprintf(file, "%s.%s", filename, ext); - else if(filenum == 0) - if (GCSettings.AppendAuto <= 0) - { - sprintf(file, "%s.%s", filename, ext); - } - else - { - sprintf(file, "%s Auto.%s", filename, ext); - } - else - sprintf(file, "%s %i.%s", filename, filenum, ext); - } - else - { - sprintf(file, "%s", filename); - } - break; - } - sprintf (temppath, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], folder, file); - } - CleanupPath(temppath); // cleanup path - snprintf(filepath, MAXPATHLEN, "%s", temppath); - return true; -} - -/**************************************************************************** - * FileSortCallback - * - * Quick sort callback to sort file entries with the following order: - * . - * .. - * - * - ***************************************************************************/ -int FileSortCallback(const void *f1, const void *f2) -{ - /* Special case for implicit directories */ - if(((BROWSERENTRY *)f1)->filename[0] == '.' || ((BROWSERENTRY *)f2)->filename[0] == '.') - { - if(strcmp(((BROWSERENTRY *)f1)->filename, ".") == 0) { return -1; } - if(strcmp(((BROWSERENTRY *)f2)->filename, ".") == 0) { return 1; } - if(strcmp(((BROWSERENTRY *)f1)->filename, "..") == 0) { return -1; } - if(strcmp(((BROWSERENTRY *)f2)->filename, "..") == 0) { return 1; } - } - - /* If one is a file and one is a directory the directory is first. */ - if(((BROWSERENTRY *)f1)->isdir && !(((BROWSERENTRY *)f2)->isdir)) return -1; - if(!(((BROWSERENTRY *)f1)->isdir) && ((BROWSERENTRY *)f2)->isdir) return 1; - - return stricmp(((BROWSERENTRY *)f1)->filename, ((BROWSERENTRY *)f2)->filename); -} - -/**************************************************************************** - * IsSz - * - * Checks if the specified file is a 7z - ***************************************************************************/ -bool IsSz() -{ - if (strlen(browserList[browser.selIndex].filename) > 4) - { - char * p = strrchr(browserList[browser.selIndex].filename, '.'); - - if (p != NULL) - if(stricmp(p, ".7z") == 0) - return true; - } - return false; -} - -/**************************************************************************** - * StripExt - * - * Strips an extension from a filename - ***************************************************************************/ -void StripExt(char* returnstring, const char * inputstring) -{ - char* loc_dot; - - snprintf(returnstring, MAXJOLIET, "%s", inputstring); - - if(inputstring == NULL || strlen(inputstring) < 4) - return; - - loc_dot = strrchr(returnstring,'.'); - if (loc_dot != NULL) - *loc_dot = 0; // strip file extension -} - -// Shorten a ROM filename by removing the extension, URLs, id numbers and other rubbish -void ShortenFilename(char * returnstring, char * inputstring) -{ - if (!inputstring) { - returnstring[0] = '\0'; - return; - } - // skip URLs in brackets - char * dotcom = (char *) strstr(inputstring, ".com)"); - char * url = NULL; - if (dotcom) { - url = (char *) strchr(inputstring, '('); - if (url >= dotcom) { - url = NULL; - dotcom = NULL; - } else dotcom+= 5; // point to after ')' - } - // skip URLs not in brackets - if (!dotcom) { - dotcom = (char *) strstr(inputstring, ".com"); - url = NULL; - if (dotcom) { - url = (char *) strstr(inputstring, "www"); - if (url >= dotcom) { - url = NULL; - dotcom = NULL; - } else dotcom+= 4; // point to after ')' - } - } - // skip file extension - char * loc_dot = (char *)strrchr(inputstring,'.'); - char * s = (char *)inputstring; - char * r = (char *)returnstring; - // skip initial whitespace, numbers, - and _ ... - while ((*s!='\0' && *s<=' ') || *s=='-' || *s=='_' || *s=='+') s++; - // ... except those that SHOULD begin with numbers - if (strncmp(s,"3D",2)==0) for (int i=0; i<2; i++, r++, s++) *r=*s; - if (strncmp(s,"1st",3)==0 || strncmp(s,"2nd",3)==0 || strncmp(s,"3rd",3)==0 || strncmp(s,"4th",3)==0) for (int i=0; i<3; i++, r++, s++) *r=*s; - if (strncmp(s,"199",3)==0 || strncmp(s,"007",3)==0 || strncmp(s,"4x4",3)==0 || strncmp(s,"720",3)==0 || strncmp(s,"10 ",3)==0) for (int i=0; i<3; i++, r++, s++) *r=*s; - if (strncmp(s,"102 ",4)==0 || strncmp(s,"1942",4)==0 || strncmp(s,"3 Ch",4)==0) for (int i=0; i<4; i++, r++, s++) *r=*s; - if (strncmp(s,"2 in 1",6)==0 || strncmp(s,"3 in 1",6)==0 || strncmp(s,"4 in 1",6)==0) for (int i=0; i<6; i++, r++, s++) *r=*s; - if (strncmp(s,"2-in-1",6)==0 || strncmp(s,"3-in-1",6)==0 || strncmp(s,"4-in-1",6)==0) for (int i=0; i<6; i++, r++, s++) *r=*s; - while (*s>='0' && *s<='9') s++; - if (r==(char *)returnstring) while ((*s!='\0' && *s<=' ') || *s=='-' || *s=='_' || *s=='+') s++; - // now go through rest of string until we get to the end or the extension - while (*s!='\0' && (loc_dot==NULL || s'\0' && *s<=' ') || *s=='-' || *s=='_') s++; - while (*s>='0' && *s<='9') s++; - while ((*s>'\0' && *s<=' ') || *s=='-' || *s=='_') s++; - } - // skip all but 1 '-', '_' or space in a row - char c = s[0]; - if (c==s[1] && (c=='-' || c=='_' || c==' ')) s++; - // skip space before hyphen - if (*s==' ' && s[1]=='-') s++; - // copy character to result - if (*s=='_') *r=' '; - else *r = *s; - // skip spaces after hyphen - if (*s=='-') while (s[1]==' ') s++; - s++; r++; - } - *r = '\0'; - // if the result is too short, abandon what we did and just strip the ext instead - if (strlen(returnstring) <= 4) StripExt(returnstring, inputstring); -} - -/**************************************************************************** - * BrowserLoadSz - * - * Opens the selected 7z file, and parses a listing of the files within - ***************************************************************************/ -int BrowserLoadSz() -{ - memset(szpath, 0, MAXPATHLEN); - strncpy(szpath, browser.dir, strlen(browser.dir) - 1); - - strncpy(szname, strrchr(szpath, '/') + 1, strrchr(szpath, '.') - strrchr(szpath, '/')); - *strrchr(szname, '.') = '\0'; - - int szfiles = SzParse(szpath); - if(szfiles) - { - browser.numEntries = szfiles; - inSz = true; - } - else - ErrorPrompt("Error opening archive!"); - - return szfiles; -} - -/**************************************************************************** - * BrowserLoadFile - * - * Loads the selected ROM - ***************************************************************************/ -int BrowserLoadFile() -{ - int device; - - if(!FindDevice(browser.dir, &device)) - return 0; - - // store the filename (w/o ext) - used for sram/freeze naming - StripExt(ROMFilename, browserList[browser.selIndex].filename); - snprintf(GCSettings.LastFileLoaded, MAXPATHLEN, "%s", browserList[browser.selIndex].filename); - - loadingFile = true; - ROMLoaded = LoadVBAROM(); - loadingFile = false; - - if (!ROMLoaded) - { - if(inSz) - { - browser.selIndex = 0; - BrowserChangeFolder(); - } - ErrorPrompt("Error loading game!"); - } - else - { - if (GCSettings.AutoLoad == 1) - LoadBatteryOrStateAuto(FILE_SRAM, SILENT); - else if (GCSettings.AutoLoad == 2) - LoadBatteryOrStateAuto(FILE_SNAPSHOT, SILENT); - - ResetBrowser(); - } - CancelAction(); - return ROMLoaded; -} - -/**************************************************************************** - * BrowserChangeFolder - * - * Update current directory and set new entry list if directory has changed - ***************************************************************************/ -int BrowserChangeFolder() -{ - int device = 0; - FindDevice(browser.dir, &device); - - if(inSz && browser.selIndex == 0) // inside a 7z, requesting to leave - { - inSz = false; - SzClose(); - } - - if(!UpdateDirName()) - return -1; - - HaltParseThread(); - CleanupPath(browser.dir); - ResetBrowser(); - - if(browser.dir[0] != 0) - { - if(strstr(browser.dir, ".7z")) - { - BrowserLoadSz(); - } - else - { - ParseDirectory(true, true); - } - FindAndSelectLastLoadedFile(); - } - - if(browser.numEntries == 0) - { - browser.dir[0] = 0; - int i=0; - -#ifdef HW_RVL - AddBrowserEntry(); - sprintf(browserList[i].filename, "sd:/"); - sprintf(browserList[i].displayname, "SD Card"); - browserList[i].length = 0; - browserList[i].isdir = 1; - browserList[i].icon = ICON_SD; - i++; - - AddBrowserEntry(); - sprintf(browserList[i].filename, "usb:/"); - sprintf(browserList[i].displayname, "USB Mass Storage"); - browserList[i].length = 0; - browserList[i].isdir = 1; - browserList[i].icon = ICON_USB; - i++; -#else - AddBrowserEntry(); - sprintf(browserList[i].filename, "carda:/"); - sprintf(browserList[i].displayname, "SD Gecko Slot A"); - browserList[i].length = 0; - browserList[i].isdir = 1; - browserList[i].icon = ICON_SD; - i++; - - AddBrowserEntry(); - sprintf(browserList[i].filename, "cardb:/"); - sprintf(browserList[i].displayname, "SD Gecko Slot B"); - browserList[i].length = 0; - browserList[i].isdir = 1; - browserList[i].icon = ICON_SD; - i++; -#endif - AddBrowserEntry(); - sprintf(browserList[i].filename, "smb:/"); - sprintf(browserList[i].displayname, "Network Share"); - browserList[i].length = 0; - browserList[i].isdir = 1; - browserList[i].icon = ICON_SMB; - i++; - - AddBrowserEntry(); - sprintf(browserList[i].filename, "dvd:/"); - sprintf(browserList[i].displayname, "Data DVD"); - browserList[i].length = 0; - browserList[i].isdir = 1; - browserList[i].icon = ICON_DVD; - i++; - - browser.numEntries += i; - } - - if(browser.dir[0] == 0) - { - GCSettings.LoadFolder[0] = 0; - GCSettings.LoadMethod = 0; - } - else - { - char * path = StripDevice(browser.dir); - if(path != NULL) - strcpy(GCSettings.LoadFolder, path); - FindDevice(browser.dir, &GCSettings.LoadMethod); - } - - return browser.numEntries; -} - -/**************************************************************************** - * OpenROM - * Displays a list of ROMS on load device - ***************************************************************************/ -int -OpenGameList () -{ - int device = GCSettings.LoadMethod; - - if(device == DEVICE_AUTO && strlen(GCSettings.LoadFolder) > 0) - device = autoLoadMethod(); - - // change current dir to roms directory - if(device > 0) - sprintf(browser.dir, "%s%s/", pathPrefix[device], GCSettings.LoadFolder); - else - browser.dir[0] = 0; - - BrowserChangeFolder(); - return browser.numEntries; -} +/**************************************************************************** + * Visual Boy Advance GX + * + * Tantric September 2008 + * + * filebrowser.cpp + * + * Generic file routines - reading, writing, browsing + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef HW_RVL +#include +#endif + +#include "vbagx.h" +#include "vbasupport.h" +#include "vmmem.h" +#include "filebrowser.h" +#include "menu.h" +#include "video.h" +#include "networkop.h" +#include "fileop.h" +#include "input.h" +#include "gcunzip.h" + +BROWSERINFO browser; +BROWSERENTRY * browserList = NULL; // list of files/folders in browser + +char szpath[MAXPATHLEN]; +char szname[MAXPATHLEN]; +bool inSz = false; + +char ROMFilename[512]; +bool ROMLoaded = false; +bool loadingFile = false; + +/**************************************************************************** +* autoLoadMethod() +* Auto-determines and sets the load device +* Returns device set +****************************************************************************/ +int autoLoadMethod() +{ + ShowAction ("Attempting to determine load device..."); + + int device = DEVICE_AUTO; + + if(ChangeInterface(DEVICE_SD, SILENT)) + device = DEVICE_SD; + else if(ChangeInterface(DEVICE_USB, SILENT)) + device = DEVICE_USB; + else if(ChangeInterface(DEVICE_SD_SLOTA, SILENT)) + device = DEVICE_SD_SLOTA; + else if(ChangeInterface(DEVICE_SD_SLOTB, SILENT)) + device = DEVICE_SD_SLOTB; + else if(ChangeInterface(DEVICE_DVD, SILENT)) + device = DEVICE_DVD; + else if(ChangeInterface(DEVICE_SMB, SILENT)) + device = DEVICE_SMB; + else + ErrorPrompt("Unable to locate a load device!"); + + if(GCSettings.LoadMethod == DEVICE_AUTO) + GCSettings.LoadMethod = device; // save device found for later use + CancelAction(); + return device; +} + +/**************************************************************************** +* autoSaveMethod() +* Auto-determines and sets the save device +* Returns device set +****************************************************************************/ +int autoSaveMethod(bool silent) +{ + if(!silent) + ShowAction ("Attempting to determine save device..."); + + int device = DEVICE_AUTO; + + if(ChangeInterface(DEVICE_SD, SILENT)) + device = DEVICE_SD; + else if(ChangeInterface(DEVICE_USB, SILENT)) + device = DEVICE_USB; + else if(ChangeInterface(DEVICE_SD_SLOTA, SILENT)) + device = DEVICE_SD_SLOTA; + else if(ChangeInterface(DEVICE_SD_SLOTB, SILENT)) + device = DEVICE_SD_SLOTB; + else if(ChangeInterface(DEVICE_SMB, SILENT)) + device = DEVICE_SMB; + else if(!silent) + ErrorPrompt("Unable to locate a save device!"); + + if(GCSettings.SaveMethod == DEVICE_AUTO) + GCSettings.SaveMethod = device; // save device found for later use + + CancelAction(); + return device; +} + +/**************************************************************************** + * ResetBrowser() + * Clears the file browser memory, and allocates one initial entry + ***************************************************************************/ +void ResetBrowser() +{ + browser.numEntries = 0; + browser.selIndex = 0; + browser.pageIndex = 0; + browser.size = 0; +} + +bool AddBrowserEntry() +{ + if(browser.size >= MAX_BROWSER_SIZE) + { + ErrorPrompt("Out of memory: too many files!"); + return false; // out of space + } + + memset(&(browserList[browser.size]), 0, sizeof(BROWSERENTRY)); // clear the new entry + browser.size++; + return true; +} + +/**************************************************************************** + * CleanupPath() + * Cleans up the filepath, removing double // and replacing \ with / + ***************************************************************************/ +static void CleanupPath(char * path) +{ + if(!path || path[0] == 0) + return; + + int pathlen = strlen(path); + int j = 0; + for(int i=0; i < pathlen && i < MAXPATHLEN; i++) + { + if(path[i] == '\\') + path[i] = '/'; + + if(j == 0 || !(path[j-1] == '/' && path[i] == '/')) + path[j++] = path[i]; + } + path[j] = 0; +} + +bool IsDeviceRoot(char * path) +{ + if(path == NULL || path[0] == 0) + return false; + + if( strcmp(path, "sd:/") == 0 || + strcmp(path, "usb:/") == 0 || + strcmp(path, "dvd:/") == 0 || + strcmp(path, "smb:/") == 0 || + strcmp(path, "carda:/") == 0 || + strcmp(path, "cardb:/") == 0) + { + return true; + } + return false; +} + +/**************************************************************************** + * UpdateDirName() + * Update curent directory name for file browser + ***************************************************************************/ +int UpdateDirName() +{ + int size=0; + char * test; + char temp[1024]; + int device = 0; + + if(browser.numEntries == 0) + return 1; + + FindDevice(browser.dir, &device); + + /* current directory doesn't change */ + if (strcmp(browserList[browser.selIndex].filename,".") == 0) + { + return 0; + } + /* go up to parent directory */ + else if (strcmp(browserList[browser.selIndex].filename,"..") == 0) + { + // already at the top level + if(IsDeviceRoot(browser.dir)) + { + browser.dir[0] = 0; // remove device - we are going to the device listing screen + } + else + { + /* determine last subdirectory namelength */ + sprintf(temp,"%s",browser.dir); + test = strtok(temp,"/"); + while (test != NULL) + { + size = strlen(test); + test = strtok(NULL,"/"); + } + + /* remove last subdirectory name */ + size = strlen(browser.dir) - size - 1; + strncpy(GCSettings.LastFileLoaded, &browser.dir[size], strlen(browser.dir) - size - 1); //set as loaded file the previous dir + GCSettings.LastFileLoaded[strlen(browser.dir) - size - 1] = 0; + browser.dir[size] = 0; + } + + return 1; + } + /* Open a directory */ + else + { + /* test new directory namelength */ + if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) < MAXPATHLEN) + { + /* update current directory name */ + sprintf(browser.dir, "%s%s/",browser.dir, browserList[browser.selIndex].filename); + return 1; + } + else + { + ErrorPrompt("Directory name is too long!"); + return -1; + } + } +} + +bool MakeFilePath(char filepath[], int type, char * filename, int filenum) +{ + char file[512]; + char folder[1024]; + char ext[4]; + char temppath[MAXPATHLEN]; + + if(type == FILE_ROM) + { + // Check path length + if ((strlen(browser.dir)+1+strlen(browserList[browser.selIndex].filename)) >= MAXPATHLEN) + { + ErrorPrompt("Maximum filepath length reached!"); + filepath[0] = 0; + return false; + } + else + { + sprintf(temppath, "%s%s",browser.dir,browserList[browser.selIndex].filename); + } + } + else if (type == FILE_BORDER_PNG) + { + const char* loadedpath = filename; + if (loadedpath == NULL) loadedpath = "default"; + // Ensure that loadedname contains only the filename, not the path + const char* loadedname = strrchr(loadedpath, '/'); + if (loadedname == NULL) loadedname = loadedpath; + + // Check path length + if ((strlen(pathPrefix[GCSettings.LoadMethod]) + strlen(GCSettings.BorderFolder) + strlen(loadedname)) >= MAXPATHLEN) { + ErrorPrompt("Maximum filepath length reached!"); + filepath[0] = 0; + return false; + } + + StripExt(file, loadedname); + sprintf(temppath, "%s%s/%s.png", pathPrefix[GCSettings.LoadMethod], GCSettings.BorderFolder, file); + } + else + { + if(GCSettings.SaveMethod == DEVICE_AUTO) + GCSettings.SaveMethod = autoSaveMethod(SILENT); + + if(GCSettings.SaveMethod == DEVICE_AUTO) + return false; + + switch(type) + { + case FILE_SRAM: + case FILE_SNAPSHOT: + sprintf(folder, GCSettings.SaveFolder); + + if(type == FILE_SRAM) sprintf(ext, "sav"); + else sprintf(ext, "sgm"); + + if(filenum >= -1) + { + if(filenum == -1) + sprintf(file, "%s.%s", filename, ext); + else if(filenum == 0) + if (GCSettings.AppendAuto <= 0) + { + sprintf(file, "%s.%s", filename, ext); + } + else + { + sprintf(file, "%s Auto.%s", filename, ext); + } + else + sprintf(file, "%s %i.%s", filename, filenum, ext); + } + else + { + sprintf(file, "%s", filename); + } + break; + } + sprintf (temppath, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], folder, file); + } + CleanupPath(temppath); // cleanup path + snprintf(filepath, MAXPATHLEN, "%s", temppath); + return true; +} + +/**************************************************************************** + * FileSortCallback + * + * Quick sort callback to sort file entries with the following order: + * . + * .. + * + * + ***************************************************************************/ +int FileSortCallback(const void *f1, const void *f2) +{ + /* Special case for implicit directories */ + if(((BROWSERENTRY *)f1)->filename[0] == '.' || ((BROWSERENTRY *)f2)->filename[0] == '.') + { + if(strcmp(((BROWSERENTRY *)f1)->filename, ".") == 0) { return -1; } + if(strcmp(((BROWSERENTRY *)f2)->filename, ".") == 0) { return 1; } + if(strcmp(((BROWSERENTRY *)f1)->filename, "..") == 0) { return -1; } + if(strcmp(((BROWSERENTRY *)f2)->filename, "..") == 0) { return 1; } + } + + /* If one is a file and one is a directory the directory is first. */ + if(((BROWSERENTRY *)f1)->isdir && !(((BROWSERENTRY *)f2)->isdir)) return -1; + if(!(((BROWSERENTRY *)f1)->isdir) && ((BROWSERENTRY *)f2)->isdir) return 1; + + return strcasecmp(((BROWSERENTRY *)f1)->filename, ((BROWSERENTRY *)f2)->filename); +} + +/**************************************************************************** + * IsSz + * + * Checks if the specified file is a 7z + ***************************************************************************/ +bool IsSz() +{ + if (strlen(browserList[browser.selIndex].filename) > 4) + { + char * p = strrchr(browserList[browser.selIndex].filename, '.'); + + if (p != NULL) + if(strcasecmp(p, ".7z") == 0) + return true; + } + return false; +} + +/**************************************************************************** + * StripExt + * + * Strips an extension from a filename + ***************************************************************************/ +void StripExt(char* returnstring, const char * inputstring) +{ + char* loc_dot; + + snprintf(returnstring, MAXJOLIET, "%s", inputstring); + + if(inputstring == NULL || strlen(inputstring) < 4) + return; + + loc_dot = strrchr(returnstring,'.'); + if (loc_dot != NULL) + *loc_dot = 0; // strip file extension +} + +// Shorten a ROM filename by removing the extension, URLs, id numbers and other rubbish +void ShortenFilename(char * returnstring, char * inputstring) +{ + if (!inputstring) { + returnstring[0] = '\0'; + return; + } + // skip URLs in brackets + char * dotcom = (char *) strstr(inputstring, ".com)"); + char * url = NULL; + if (dotcom) { + url = (char *) strchr(inputstring, '('); + if (url >= dotcom) { + url = NULL; + dotcom = NULL; + } else dotcom+= 5; // point to after ')' + } + // skip URLs not in brackets + if (!dotcom) { + dotcom = (char *) strstr(inputstring, ".com"); + url = NULL; + if (dotcom) { + url = (char *) strstr(inputstring, "www"); + if (url >= dotcom) { + url = NULL; + dotcom = NULL; + } else dotcom+= 4; // point to after ')' + } + } + // skip file extension + char * loc_dot = (char *)strrchr(inputstring,'.'); + char * s = (char *)inputstring; + char * r = (char *)returnstring; + // skip initial whitespace, numbers, - and _ ... + while ((*s!='\0' && *s<=' ') || *s=='-' || *s=='_' || *s=='+') s++; + // ... except those that SHOULD begin with numbers + if (strncmp(s,"3D",2)==0) for (int i=0; i<2; i++, r++, s++) *r=*s; + if (strncmp(s,"1st",3)==0 || strncmp(s,"2nd",3)==0 || strncmp(s,"3rd",3)==0 || strncmp(s,"4th",3)==0) for (int i=0; i<3; i++, r++, s++) *r=*s; + if (strncmp(s,"199",3)==0 || strncmp(s,"007",3)==0 || strncmp(s,"4x4",3)==0 || strncmp(s,"720",3)==0 || strncmp(s,"10 ",3)==0) for (int i=0; i<3; i++, r++, s++) *r=*s; + if (strncmp(s,"102 ",4)==0 || strncmp(s,"1942",4)==0 || strncmp(s,"3 Ch",4)==0) for (int i=0; i<4; i++, r++, s++) *r=*s; + if (strncmp(s,"2 in 1",6)==0 || strncmp(s,"3 in 1",6)==0 || strncmp(s,"4 in 1",6)==0) for (int i=0; i<6; i++, r++, s++) *r=*s; + if (strncmp(s,"2-in-1",6)==0 || strncmp(s,"3-in-1",6)==0 || strncmp(s,"4-in-1",6)==0) for (int i=0; i<6; i++, r++, s++) *r=*s; + while (*s>='0' && *s<='9') s++; + if (r==(char *)returnstring) while ((*s!='\0' && *s<=' ') || *s=='-' || *s=='_' || *s=='+') s++; + // now go through rest of string until we get to the end or the extension + while (*s!='\0' && (loc_dot==NULL || s'\0' && *s<=' ') || *s=='-' || *s=='_') s++; + while (*s>='0' && *s<='9') s++; + while ((*s>'\0' && *s<=' ') || *s=='-' || *s=='_') s++; + } + // skip all but 1 '-', '_' or space in a row + char c = s[0]; + if (c==s[1] && (c=='-' || c=='_' || c==' ')) s++; + // skip space before hyphen + if (*s==' ' && s[1]=='-') s++; + // copy character to result + if (*s=='_') *r=' '; + else *r = *s; + // skip spaces after hyphen + if (*s=='-') while (s[1]==' ') s++; + s++; r++; + } + *r = '\0'; + // if the result is too short, abandon what we did and just strip the ext instead + if (strlen(returnstring) <= 4) StripExt(returnstring, inputstring); +} + +/**************************************************************************** + * BrowserLoadSz + * + * Opens the selected 7z file, and parses a listing of the files within + ***************************************************************************/ +int BrowserLoadSz() +{ + memset(szpath, 0, MAXPATHLEN); + strncpy(szpath, browser.dir, strlen(browser.dir) - 1); + + strncpy(szname, strrchr(szpath, '/') + 1, strrchr(szpath, '.') - strrchr(szpath, '/')); + *strrchr(szname, '.') = '\0'; + + int szfiles = SzParse(szpath); + if(szfiles) + { + browser.numEntries = szfiles; + inSz = true; + } + else + ErrorPrompt("Error opening archive!"); + + return szfiles; +} + +/**************************************************************************** + * BrowserLoadFile + * + * Loads the selected ROM + ***************************************************************************/ +int BrowserLoadFile() +{ + int device; + + if(!FindDevice(browser.dir, &device)) + return 0; + + // store the filename (w/o ext) - used for sram/freeze naming + StripExt(ROMFilename, browserList[browser.selIndex].filename); + snprintf(GCSettings.LastFileLoaded, MAXPATHLEN, "%s", browserList[browser.selIndex].filename); + + loadingFile = true; + ROMLoaded = LoadVBAROM(); + loadingFile = false; + + if (!ROMLoaded) + { + if(inSz) + { + browser.selIndex = 0; + BrowserChangeFolder(); + } + ErrorPrompt("Error loading game!"); + } + else + { + if (GCSettings.AutoLoad == 1) + LoadBatteryOrStateAuto(FILE_SRAM, SILENT); + else if (GCSettings.AutoLoad == 2) + LoadBatteryOrStateAuto(FILE_SNAPSHOT, SILENT); + + ResetBrowser(); + } + CancelAction(); + return ROMLoaded; +} + +/**************************************************************************** + * BrowserChangeFolder + * + * Update current directory and set new entry list if directory has changed + ***************************************************************************/ +int BrowserChangeFolder() +{ + int device = 0; + FindDevice(browser.dir, &device); + + if(inSz && browser.selIndex == 0) // inside a 7z, requesting to leave + { + inSz = false; + SzClose(); + } + + if(!UpdateDirName()) + return -1; + + HaltParseThread(); + CleanupPath(browser.dir); + ResetBrowser(); + + if(browser.dir[0] != 0) + { + if(strstr(browser.dir, ".7z")) + { + BrowserLoadSz(); + } + else + { + ParseDirectory(true, true); + } + FindAndSelectLastLoadedFile(); + } + + if(browser.numEntries == 0) + { + browser.dir[0] = 0; + int i=0; + +#ifdef HW_RVL + AddBrowserEntry(); + sprintf(browserList[i].filename, "sd:/"); + sprintf(browserList[i].displayname, "SD Card"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_SD; + i++; + + AddBrowserEntry(); + sprintf(browserList[i].filename, "usb:/"); + sprintf(browserList[i].displayname, "USB Mass Storage"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_USB; + i++; +#else + AddBrowserEntry(); + sprintf(browserList[i].filename, "carda:/"); + sprintf(browserList[i].displayname, "SD Gecko Slot A"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_SD; + i++; + + AddBrowserEntry(); + sprintf(browserList[i].filename, "cardb:/"); + sprintf(browserList[i].displayname, "SD Gecko Slot B"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_SD; + i++; +#endif + AddBrowserEntry(); + sprintf(browserList[i].filename, "smb:/"); + sprintf(browserList[i].displayname, "Network Share"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_SMB; + i++; + + AddBrowserEntry(); + sprintf(browserList[i].filename, "dvd:/"); + sprintf(browserList[i].displayname, "Data DVD"); + browserList[i].length = 0; + browserList[i].isdir = 1; + browserList[i].icon = ICON_DVD; + i++; + + browser.numEntries += i; + } + + if(browser.dir[0] == 0) + { + GCSettings.LoadFolder[0] = 0; + GCSettings.LoadMethod = 0; + } + else + { + char * path = StripDevice(browser.dir); + if(path != NULL) + strcpy(GCSettings.LoadFolder, path); + FindDevice(browser.dir, &GCSettings.LoadMethod); + } + + return browser.numEntries; +} + +/**************************************************************************** + * OpenROM + * Displays a list of ROMS on load device + ***************************************************************************/ +int +OpenGameList () +{ + int device = GCSettings.LoadMethod; + + if(device == DEVICE_AUTO && strlen(GCSettings.LoadFolder) > 0) + device = autoLoadMethod(); + + // change current dir to roms directory + if(device > 0) + sprintf(browser.dir, "%s%s/", pathPrefix[device], GCSettings.LoadFolder); + else + browser.dir[0] = 0; + + BrowserChangeFolder(); + return browser.numEntries; +} diff --git a/source/filebrowser.h b/source/filebrowser.h index 2b050f7..c1eb169 100644 --- a/source/filebrowser.h +++ b/source/filebrowser.h @@ -1,77 +1,77 @@ -/**************************************************************************** - * Visual Boy Advance GX - * - * Tantric September 2008 - * - * filebrowser.h - * - * Generic file routines - reading, writing, browsing - ****************************************************************************/ - -#ifndef _FILEBROWSER_H_ -#define _FILEBROWSER_H_ - -#include -#include - -#define MAXJOLIET 255 -#ifdef HW_DOL -#define MAX_BROWSER_SIZE 1000 -#else -#define MAX_BROWSER_SIZE 3000 -#endif - -typedef struct -{ - char dir[MAXPATHLEN + 1]; // directory path of browserList - int numEntries; // # of entries in browserList - int selIndex; // currently selected index of browserList - int pageIndex; // starting index of browserList page display - int size; // # of entries browerList has space allocated to store -} BROWSERINFO; - -typedef struct -{ - size_t length; // file length - int isdir; // 0 - file, 1 - directory - char filename[MAXJOLIET + 1]; // full filename - char displayname[MAXJOLIET + 1]; // name for browser display - int filenum; // file # (for 7z support) - int icon; // icon to display -} BROWSERENTRY; - -extern BROWSERINFO browser; -extern BROWSERENTRY * browserList; -extern char ROMFilename[512]; -extern bool ROMLoaded; -extern bool loadingFile; -extern char szpath[MAXPATHLEN]; -extern bool inSz; -extern char szname[MAXPATHLEN]; - -enum -{ - ICON_NONE, - ICON_FOLDER, - ICON_SD, - ICON_USB, - ICON_DVD, - ICON_SMB -}; - -bool MakeFilePath(char filepath[], int type, char * filename = NULL, int filenum = -2); -int UpdateDirName(); -int OpenGameList(); -int autoLoadMethod(); -int autoSaveMethod(bool silent); -int FileSortCallback(const void *f1, const void *f2); -void StripExt(char* returnstring, const char* inputstring); -bool IsSz(); -void ResetBrowser(); -bool AddBrowserEntry(); -bool IsDeviceRoot(char * path); -int BrowserLoadSz(); -int BrowserChangeFolder(); -int BrowserLoadFile(); - -#endif +/**************************************************************************** + * Visual Boy Advance GX + * + * Tantric September 2008 + * + * filebrowser.h + * + * Generic file routines - reading, writing, browsing + ****************************************************************************/ + +#ifndef _FILEBROWSER_H_ +#define _FILEBROWSER_H_ + +#include +#include + +#define MAXJOLIET 255 +#ifdef HW_DOL +#define MAX_BROWSER_SIZE 1000 +#else +#define MAX_BROWSER_SIZE 3000 +#endif + +typedef struct +{ + char dir[MAXPATHLEN + 1]; // directory path of browserList + int numEntries; // # of entries in browserList + int selIndex; // currently selected index of browserList + int pageIndex; // starting index of browserList page display + int size; // # of entries browerList has space allocated to store +} BROWSERINFO; + +typedef struct +{ + size_t length; // file length + int isdir; // 0 - file, 1 - directory + char filename[MAXJOLIET + 1]; // full filename + char displayname[MAXJOLIET + 1]; // name for browser display + int filenum; // file # (for 7z support) + int icon; // icon to display +} BROWSERENTRY; + +extern BROWSERINFO browser; +extern BROWSERENTRY * browserList; +extern char ROMFilename[512]; +extern bool ROMLoaded; +extern bool loadingFile; +extern char szpath[MAXPATHLEN]; +extern bool inSz; +extern char szname[MAXPATHLEN]; + +enum +{ + ICON_NONE, + ICON_FOLDER, + ICON_SD, + ICON_USB, + ICON_DVD, + ICON_SMB +}; + +bool MakeFilePath(char filepath[], int type, char * filename = NULL, int filenum = -2); +int UpdateDirName(); +int OpenGameList(); +int autoLoadMethod(); +int autoSaveMethod(bool silent); +int FileSortCallback(const void *f1, const void *f2); +void StripExt(char* returnstring, const char* inputstring); +bool IsSz(); +void ResetBrowser(); +bool AddBrowserEntry(); +bool IsDeviceRoot(char * path); +int BrowserLoadSz(); +int BrowserChangeFolder(); +int BrowserLoadFile(); + +#endif diff --git a/source/fileop.cpp b/source/fileop.cpp index e9ac29c..5e3f776 100644 --- a/source/fileop.cpp +++ b/source/fileop.cpp @@ -563,12 +563,12 @@ static bool ParseDirEntries() if(ext == NULL) continue; - if( stricmp(ext, "agb") != 0 && stricmp(ext, "gba") != 0 && - stricmp(ext, "bin") != 0 && stricmp(ext, "elf") != 0 && - stricmp(ext, "mb") != 0 && stricmp(ext, "dmg") != 0 && - stricmp(ext, "gb") != 0 && stricmp(ext, "gbc") != 0 && - stricmp(ext, "cgb") != 0 && stricmp(ext, "sgb") != 0 && - stricmp(ext, "zip") != 0 && stricmp(ext, "7z") != 0) + if( strcasecmp(ext, "agb") != 0 && strcasecmp(ext, "gba") != 0 && + strcasecmp(ext, "bin") != 0 && strcasecmp(ext, "elf") != 0 && + strcasecmp(ext, "mb") != 0 && strcasecmp(ext, "dmg") != 0 && + strcasecmp(ext, "gb") != 0 && strcasecmp(ext, "gbc") != 0 && + strcasecmp(ext, "cgb") != 0 && strcasecmp(ext, "sgb") != 0 && + strcasecmp(ext, "zip") != 0 && strcasecmp(ext, "7z") != 0) continue; } } diff --git a/source/menu.cpp b/source/menu.cpp index da0d147..36215e0 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -1,4859 +1,4859 @@ -/**************************************************************************** - * Visual Boy Advance GX - * - * Tantric 2008-2009 - * - * menu.cpp - * - * Menu flow routines - handles all menu logic - ***************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef HW_RVL -#include -#endif - -#include "vbagx.h" -#include "vbasupport.h" -#include "video.h" -#include "filebrowser.h" -#include "gcunzip.h" -#include "networkop.h" -#include "fileop.h" -#include "preferences.h" -#include "button_mapping.h" -#include "input.h" -#include "filelist.h" -#include "menu.h" -#include "gamesettings.h" -#include "gui/gui.h" -#include "utils/gettext.h" - -#define THREAD_SLEEP 100 - -#ifdef HW_RVL -GuiImageData * pointer[4]; -#endif - -#ifdef HW_RVL - #include "mem2.h" - - #define MEM_ALLOC(A) (u8*)mem2_malloc(A) - #define MEM_DEALLOC(A) mem2_free(A) -#else - #define MEM_ALLOC(A) (u8*)memalign(32, A) - #define MEM_DEALLOC(A) free(A) -#endif - -static GuiTrigger * trigA = NULL; -static GuiTrigger * trig2 = NULL; - -static GuiButton * btnLogo = NULL; -static GuiImageData * gameScreen = NULL; -static GuiImage * gameScreenImg = NULL; -static GuiImage * bgTopImg = NULL; -static GuiImage * bgBottomImg = NULL; -static GuiSound * bgMusic = NULL; -static GuiSound * enterSound = NULL; -static GuiSound * exitSound = NULL; -static GuiWindow * mainWindow = NULL; -static GuiText * settingText = NULL; -static GuiText * settingText2 = NULL; -static int lastMenu = MENU_NONE; -static int mapMenuCtrl = 0; -static int wiiuproCtrl = 0; - -static lwp_t guithread = LWP_THREAD_NULL; -static lwp_t progressthread = LWP_THREAD_NULL; -#ifdef HW_RVL -static lwp_t updatethread = LWP_THREAD_NULL; -#endif -static bool guiHalt = true; -static int showProgress = 0; - -static char progressTitle[101]; -static char progressMsg[201]; -static int progressDone = 0; -static int progressTotal = 0; - -/**************************************************************************** - * ResumeGui - * - * Signals the GUI thread to start, and resumes the thread. This is called - * after finishing the removal/insertion of new elements, and after initial - * GUI setup. - ***************************************************************************/ -static void -ResumeGui() -{ - guiHalt = false; - LWP_ResumeThread (guithread); -} - -/**************************************************************************** - * HaltGui - * - * Signals the GUI thread to stop, and waits for GUI thread to stop - * This is necessary whenever removing/inserting new elements into the GUI. - * This eliminates the possibility that the GUI is in the middle of accessing - * an element that is being changed. - ***************************************************************************/ -static void -HaltGui() -{ - guiHalt = true; - - // wait for thread to finish - while(!LWP_ThreadIsSuspended(guithread)) - usleep(THREAD_SLEEP); -} - -void ResetText() -{ - LoadLanguage(); - - if(mainWindow) - mainWindow->ResetText(); -} - -/**************************************************************************** - * WindowPrompt - * - * Displays a prompt window to user, with information, an error message, or - * presenting a user with a choice - ***************************************************************************/ -int -WindowPrompt(const char *title, const char *msg, const char *btn1Label, const char *btn2Label, bool btn1Default) -{ - if(!mainWindow || ExitRequested || ShutdownRequested) - return 0; - - int choice = -1; - - GuiWindow promptWindow(448,288); - promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - promptWindow.SetPosition(0, -10); - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_prompt_png); - GuiImageData btnOutlineOver(button_prompt_over_png); - - GuiImageData dialogBox(dialogue_box_png); - GuiImage dialogBoxImg(&dialogBox); - - GuiText titleTxt(title, 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - titleTxt.SetPosition(0,14); - GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255}); - msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - msgTxt.SetPosition(0,-20); - msgTxt.SetWrap(true, 430); - - GuiText btn1Txt(btn1Label, 22, (GXColor){0, 0, 0, 255}); - GuiImage btn1Img(&btnOutline); - GuiImage btn1ImgOver(&btnOutlineOver); - GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight()); - - if(btn2Label) - { - btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - btn1.SetPosition(20, -25); - } - else - { - btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); - btn1.SetPosition(0, -25); - } - - btn1.SetLabel(&btn1Txt); - btn1.SetImage(&btn1Img); - btn1.SetImageOver(&btn1ImgOver); - btn1.SetSoundOver(&btnSoundOver); - btn1.SetSoundClick(&btnSoundClick); - btn1.SetTrigger(trigA); - btn1.SetTrigger(trig2); - btn1.SetState(STATE_SELECTED); - btn1.SetEffectGrow(); - - GuiText btn2Txt(btn2Label, 22, (GXColor){0, 0, 0, 255}); - GuiImage btn2Img(&btnOutline); - GuiImage btn2ImgOver(&btnOutlineOver); - GuiButton btn2(btnOutline.GetWidth(), btnOutline.GetHeight()); - btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - btn2.SetPosition(-20, -25); - btn2.SetLabel(&btn2Txt); - btn2.SetImage(&btn2Img); - btn2.SetImageOver(&btn2ImgOver); - btn2.SetSoundOver(&btnSoundOver); - btn2.SetSoundClick(&btnSoundClick); - btn2.SetTrigger(trigA); - btn2.SetTrigger(trig2); - btn2.SetEffectGrow(); - - promptWindow.Append(&dialogBoxImg); - promptWindow.Append(&titleTxt); - promptWindow.Append(&msgTxt); - promptWindow.Append(&btn1); - - if(btn2Label) - promptWindow.Append(&btn2); - - promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50); - CancelAction(); - HaltGui(); - mainWindow->SetState(STATE_DISABLED); - mainWindow->Append(&promptWindow); - mainWindow->ChangeFocus(&promptWindow); - if(btn2Label) - { - if (btn1Default) - { - btn2.ResetState(); - btn1.SetState(STATE_SELECTED); - } - else - { - btn1.ResetState(); - btn2.SetState(STATE_SELECTED); - } - } - ResumeGui(); - - while(choice == -1) - { - usleep(THREAD_SLEEP); - - if(btn1.GetState() == STATE_CLICKED) - choice = 1; - else if(btn2.GetState() == STATE_CLICKED) - choice = 0; - } - - promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50); - while(promptWindow.GetEffect() > 0) usleep(THREAD_SLEEP); - HaltGui(); - mainWindow->Remove(&promptWindow); - mainWindow->SetState(STATE_DEFAULT); - ResumeGui(); - return choice; -} - -int -WindowPrompt(const char *title, const char *msg, const char *btn1Label, const char *btn2Label) -{ - return WindowPrompt(title, msg, btn1Label, btn2Label, false); -} - -#ifdef HW_RVL -/**************************************************************************** - * EmulatorUpdate - * - * Prompts for confirmation, and downloads/installs updates - ***************************************************************************/ -static void * -EmulatorUpdate (void *arg) -{ - bool installUpdate = WindowPrompt( - "Update Available", - "An update is available!", - "Update now", - "Update later"); - if(installUpdate) - if(DownloadUpdate()) - ExitRequested = 1; - return NULL; -} -#endif - -/**************************************************************************** - * UpdateGUI - * - * Primary thread to allow GUI to respond to state changes, and draws GUI - ***************************************************************************/ -static void * -UpdateGUI (void *arg) -{ - int i; - - while(1) - { - if(guiHalt) - LWP_SuspendThread(guithread); - - UpdatePads(); - mainWindow->Draw(); - - if (mainWindow->GetState() != STATE_DISABLED) - mainWindow->DrawTooltip(); - - #ifdef HW_RVL - i = 3; - do - { - if(userInput[i].wpad->ir.valid) - Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48, - 96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255); - DoRumble(i); - --i; - } while(i>=0); - #endif - - Menu_Render(); - - mainWindow->Update(&userInput[3]); - mainWindow->Update(&userInput[2]); - mainWindow->Update(&userInput[1]); - mainWindow->Update(&userInput[0]); - - #ifdef HW_RVL - if(updateFound) - { - updateFound = false; - if(!loadingFile) - LWP_CreateThread (&updatethread, EmulatorUpdate, NULL, NULL, 0, 70); - } - #endif - - if(ExitRequested || ShutdownRequested) - { - for(i = 0; i <= 255; i += 15) - { - mainWindow->Draw(); - Menu_DrawRectangle(0,0,screenwidth,screenheight,(GXColor){0, 0, 0, (u8)i},1); - Menu_Render(); - } - ExitApp(); - } - usleep(THREAD_SLEEP); - } - return NULL; -} - -/**************************************************************************** - * ProgressWindow - * - * Opens a window, which displays progress to the user. Can either display a - * progress bar showing % completion, or a throbber that only shows that an - * action is in progress. - ***************************************************************************/ -static int progsleep = 0; - -static void -ProgressWindow(char *title, char *msg) -{ - GuiWindow promptWindow(448,288); - promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - promptWindow.SetPosition(0, -10); - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - - GuiImageData dialogBox(dialogue_box_png); - GuiImage dialogBoxImg(&dialogBox); - - GuiImageData progressbarOutline(progressbar_outline_png); - GuiImage progressbarOutlineImg(&progressbarOutline); - progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - progressbarOutlineImg.SetPosition(25, 40); - - GuiImageData progressbarEmpty(progressbar_empty_png); - GuiImage progressbarEmptyImg(&progressbarEmpty); - progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - progressbarEmptyImg.SetPosition(25, 40); - progressbarEmptyImg.SetTile(100); - - GuiImageData progressbar(progressbar_png); - GuiImage progressbarImg(&progressbar); - progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - progressbarImg.SetPosition(25, 40); - - GuiImageData throbber(throbber_png); - GuiImage throbberImg(&throbber); - throbberImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - throbberImg.SetPosition(0, 40); - - GuiText titleTxt(title, 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - titleTxt.SetPosition(0,14); - GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255}); - msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - msgTxt.SetPosition(0,80); - - promptWindow.Append(&dialogBoxImg); - promptWindow.Append(&titleTxt); - promptWindow.Append(&msgTxt); - - if(showProgress == 1) - { - promptWindow.Append(&progressbarEmptyImg); - promptWindow.Append(&progressbarImg); - promptWindow.Append(&progressbarOutlineImg); - } - else - { - promptWindow.Append(&throbberImg); - } - - // wait to see if progress flag changes soon - progsleep = 800000; - - while(progsleep > 0) - { - if(!showProgress) - break; - usleep(THREAD_SLEEP); - progsleep -= THREAD_SLEEP; - } - - if(!showProgress) - return; - - HaltGui(); - int oldState = mainWindow->GetState(); - mainWindow->SetState(STATE_DISABLED); - mainWindow->Append(&promptWindow); - mainWindow->ChangeFocus(&promptWindow); - ResumeGui(); - - float angle = 0; - u32 count = 0; - - while(showProgress) - { - progsleep = 20000; - - while(progsleep > 0) - { - if(!showProgress) - break; - usleep(THREAD_SLEEP); - progsleep -= THREAD_SLEEP; - } - - if(showProgress == 1) - { - progressbarImg.SetTile(100*progressDone/progressTotal); - } - else if(showProgress == 2) - { - if(count % 5 == 0) - { - angle+=45.0f; - if(angle >= 360.0f) - angle = 0; - throbberImg.SetAngle(angle); - } - ++count; - } - } - - HaltGui(); - mainWindow->Remove(&promptWindow); - mainWindow->SetState(oldState); - ResumeGui(); -} - -static void * ProgressThread (void *arg) -{ - while(1) - { - if(!showProgress) - LWP_SuspendThread (progressthread); - - ProgressWindow(progressTitle, progressMsg); - usleep(THREAD_SLEEP); - } - return NULL; -} - -/**************************************************************************** - * InitGUIThread - * - * Startup GUI threads - ***************************************************************************/ -void -InitGUIThreads() -{ - LWP_CreateThread (&guithread, UpdateGUI, NULL, NULL, 0, 70); - LWP_CreateThread (&progressthread, ProgressThread, NULL, NULL, 0, 40); -} - -/**************************************************************************** - * CancelAction - * - * Signals the GUI progress window thread to halt, and waits for it to - * finish. Prevents multiple progress window events from interfering / - * overriding each other. - ***************************************************************************/ -void -CancelAction() -{ - showProgress = 0; - - // wait for thread to finish - while(!LWP_ThreadIsSuspended(progressthread)) - usleep(THREAD_SLEEP); -} - -/**************************************************************************** - * ShowProgress - * - * Updates the variables used by the progress window for drawing a progress - * bar. Also resumes the progress window thread if it is suspended. - ***************************************************************************/ -void -ShowProgress (const char *msg, int done, int total) -{ - if(!mainWindow || ExitRequested || ShutdownRequested) - return; - - if(total < (256*1024)) - return; - - if(done > total) // this shouldn't happen - done = total; - - if(showProgress != 1) - CancelAction(); // wait for previous progress window to finish - - snprintf(progressMsg, 200, "%s", msg); - sprintf(progressTitle, "Please Wait"); - showProgress = 1; - progressTotal = total; - progressDone = done; - LWP_ResumeThread (progressthread); -} - -/**************************************************************************** - * ShowAction - * - * Shows that an action is underway. Also resumes the progress window thread - * if it is suspended. - ***************************************************************************/ -void -ShowAction (const char *msg) -{ - if(!mainWindow || ExitRequested || ShutdownRequested) - return; - - if(showProgress != 0) - CancelAction(); // wait for previous progress window to finish - - snprintf(progressMsg, 200, "%s", msg); - sprintf(progressTitle, "Please Wait"); - showProgress = 2; - progressDone = 0; - progressTotal = 0; - LWP_ResumeThread (progressthread); -} - -void ErrorPrompt(const char *msg) -{ - WindowPrompt("Error", msg, "OK", NULL); -} - -int ErrorPromptRetry(const char *msg) -{ - return WindowPrompt("Error", msg, "Retry", "Cancel"); -} - -void InfoPrompt(const char *msg) -{ - WindowPrompt("Information", msg, "OK", NULL); -} - -int YesNoPrompt(const char *msg, bool yesDefault) -{ - return WindowPrompt("Goomba", msg, "Yes", "No", yesDefault); -} - -/**************************************************************************** - * OnScreenKeyboard - * - * Opens an on-screen keyboard window, with the data entered being stored - * into the specified variable. - ***************************************************************************/ -static void OnScreenKeyboard(char * var, u32 maxlen) -{ - int save = -1; - - GuiKeyboard keyboard(var, maxlen); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - - GuiText okBtnTxt("OK", 22, (GXColor){0, 0, 0, 255}); - GuiImage okBtnImg(&btnOutline); - GuiImage okBtnImgOver(&btnOutlineOver); - GuiButton okBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - - okBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - okBtn.SetPosition(25, -25); - - okBtn.SetLabel(&okBtnTxt); - okBtn.SetImage(&okBtnImg); - okBtn.SetImageOver(&okBtnImgOver); - okBtn.SetSoundOver(&btnSoundOver); - okBtn.SetSoundClick(&btnSoundClick); - okBtn.SetTrigger(trigA); - okBtn.SetTrigger(trig2); - okBtn.SetEffectGrow(); - - GuiText cancelBtnTxt("Cancel", 22, (GXColor){0, 0, 0, 255}); - GuiImage cancelBtnImg(&btnOutline); - GuiImage cancelBtnImgOver(&btnOutlineOver); - GuiButton cancelBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - cancelBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - cancelBtn.SetPosition(-25, -25); - cancelBtn.SetLabel(&cancelBtnTxt); - cancelBtn.SetImage(&cancelBtnImg); - cancelBtn.SetImageOver(&cancelBtnImgOver); - cancelBtn.SetSoundOver(&btnSoundOver); - cancelBtn.SetSoundClick(&btnSoundClick); - cancelBtn.SetTrigger(trigA); - cancelBtn.SetTrigger(trig2); - cancelBtn.SetEffectGrow(); - - keyboard.Append(&okBtn); - keyboard.Append(&cancelBtn); - - HaltGui(); - mainWindow->SetState(STATE_DISABLED); - mainWindow->Append(&keyboard); - mainWindow->ChangeFocus(&keyboard); - ResumeGui(); - - while(save == -1) - { - usleep(THREAD_SLEEP); - - if(okBtn.GetState() == STATE_CLICKED) - save = 1; - else if(cancelBtn.GetState() == STATE_CLICKED) - save = 0; - } - - if(save) - { - snprintf(var, maxlen, "%s", keyboard.kbtextstr); - } - - HaltGui(); - mainWindow->Remove(&keyboard); - mainWindow->SetState(STATE_DEFAULT); - ResumeGui(); -} - -/**************************************************************************** - * SettingWindow - * - * Opens a new window, with the specified window element appended. Allows - * for a customizable prompted setting. - ***************************************************************************/ -static int -SettingWindow(const char * title, GuiWindow * w) -{ - int save = -1; - - GuiWindow promptWindow(448,288); - promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - - GuiImageData dialogBox(dialogue_box_png); - GuiImage dialogBoxImg(&dialogBox); - - GuiText titleTxt(title, 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - titleTxt.SetPosition(0,14); - - GuiText okBtnTxt("OK", 22, (GXColor){0, 0, 0, 255}); - GuiImage okBtnImg(&btnOutline); - GuiImage okBtnImgOver(&btnOutlineOver); - GuiButton okBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - - okBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - okBtn.SetPosition(20, -25); - - okBtn.SetLabel(&okBtnTxt); - okBtn.SetImage(&okBtnImg); - okBtn.SetImageOver(&okBtnImgOver); - okBtn.SetSoundOver(&btnSoundOver); - okBtn.SetSoundClick(&btnSoundClick); - okBtn.SetTrigger(trigA); - okBtn.SetTrigger(trig2); - okBtn.SetEffectGrow(); - - GuiText cancelBtnTxt("Cancel", 22, (GXColor){0, 0, 0, 255}); - GuiImage cancelBtnImg(&btnOutline); - GuiImage cancelBtnImgOver(&btnOutlineOver); - GuiButton cancelBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - cancelBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - cancelBtn.SetPosition(-20, -25); - cancelBtn.SetLabel(&cancelBtnTxt); - cancelBtn.SetImage(&cancelBtnImg); - cancelBtn.SetImageOver(&cancelBtnImgOver); - cancelBtn.SetSoundOver(&btnSoundOver); - cancelBtn.SetSoundClick(&btnSoundClick); - cancelBtn.SetTrigger(trigA); - cancelBtn.SetTrigger(trig2); - cancelBtn.SetEffectGrow(); - - promptWindow.Append(&dialogBoxImg); - promptWindow.Append(&titleTxt); - promptWindow.Append(&okBtn); - promptWindow.Append(&cancelBtn); - - HaltGui(); - mainWindow->SetState(STATE_DISABLED); - mainWindow->Append(&promptWindow); - mainWindow->Append(w); - mainWindow->ChangeFocus(w); - ResumeGui(); - - while(save == -1) - { - usleep(THREAD_SLEEP); - - if(okBtn.GetState() == STATE_CLICKED) - save = 1; - else if(cancelBtn.GetState() == STATE_CLICKED) - save = 0; - } - HaltGui(); - mainWindow->Remove(&promptWindow); - mainWindow->Remove(w); - mainWindow->SetState(STATE_DEFAULT); - ResumeGui(); - return save; -} - -/**************************************************************************** - * WindowCredits - * Display credits, legal copyright and licence - * - * THIS MUST NOT BE REMOVED OR DISABLED IN ANY DERIVATIVE WORK - ***************************************************************************/ -static void WindowCredits(void * ptr) -{ - if(btnLogo->GetState() != STATE_CLICKED) - return; - - btnLogo->ResetState(); - - bool exit = false; - int i = 0; - int y = 20; - - GuiWindow creditsWindow(screenwidth,screenheight); - GuiWindow creditsWindowBox(580,448); - creditsWindowBox.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - - GuiImageData creditsBox(credits_box_png); - GuiImage creditsBoxImg(&creditsBox); - creditsBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - creditsWindowBox.Append(&creditsBoxImg); - - int numEntries = 25; - GuiText * txt[numEntries]; - - txt[i] = new GuiText("Credits", 20, (GXColor){0, 0, 0, 255}); - txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=24; - - txt[i] = new GuiText("Official Site: https://github.com/dborth/vbagx", 20, (GXColor){0, 0, 0, 255}); - txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=32; - - txt[i]->SetPresets(20, (GXColor){0, 0, 0, 255}, 0, - FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP); - - txt[i] = new GuiText("Main developer"); - txt[i]->SetPosition(40,y); i++; - txt[i] = new GuiText("Tantric"); - txt[i]->SetPosition(250,y); i++; y+=48; - - txt[i] = new GuiText("Additional coding"); - txt[i]->SetPosition(40,y); i++; - txt[i] = new GuiText("Zopenko, Glitch, libertyernie"); - txt[i]->SetPosition(250,y); i++; y+=24; - txt[i] = new GuiText("cebolleto, bgK, Carl Kenner, dancinninjac"); - txt[i]->SetPosition(250,y); i++; y+=48; - - txt[i] = new GuiText("Menu artwork"); - txt[i]->SetPosition(40,y); i++; - txt[i] = new GuiText("the3seashells"); - txt[i]->SetPosition(250,y); i++; y+=24; - txt[i] = new GuiText("Menu sound"); - txt[i]->SetPosition(40,y); i++; - txt[i] = new GuiText("Peter de Man"); - txt[i]->SetPosition(250,y); i++; y+=32; - - txt[i] = new GuiText("VBA GameCube"); - txt[i]->SetPosition(40,y); i++; - txt[i] = new GuiText("SoftDev, emukidid"); - txt[i]->SetPosition(250,y); i++; y+=24; - txt[i] = new GuiText("Visual Boy Advance - M"); - txt[i]->SetPosition(40,y); i++; - txt[i] = new GuiText("VBA-M Team"); - txt[i]->SetPosition(250,y); i++; y+=24; - txt[i] = new GuiText("Visual Boy Advance"); - txt[i]->SetPosition(40,y); i++; - txt[i] = new GuiText("Forgotten"); - txt[i]->SetPosition(250,y); i++; y+=24; - - txt[i] = new GuiText("libogc / devkitPPC"); - txt[i]->SetPosition(40,y); i++; - txt[i] = new GuiText("shagkur & wintermute"); - txt[i]->SetPosition(250,y); i++; y+=24; - txt[i] = new GuiText("FreeTypeGX"); - txt[i]->SetPosition(40,y); i++; - txt[i] = new GuiText("Armin Tamzarian"); - txt[i]->SetPosition(250,y); i++; y+=32; - - txt[i]->SetPresets(18, (GXColor){0, 0, 0, 255}, 0, - FTGX_JUSTIFY_CENTER | FTGX_ALIGN_TOP, ALIGN_CENTRE, ALIGN_TOP); - - txt[i] = new GuiText("This software is open source and may be copied,"); - txt[i]->SetPosition(0,y); i++; y+=20; - txt[i] = new GuiText("distributed, or modified under the terms of the"); - txt[i]->SetPosition(0,y); i++; y+=20; - txt[i] = new GuiText("GNU General Public License (GPL) Version 2."); - txt[i]->SetPosition(0,y); i++; y+=20; - - char iosVersion[20]; - -#ifdef HW_RVL - sprintf(iosVersion, "IOS: %d", IOS_GetVersion()); -#endif - - txt[i] = new GuiText(iosVersion, 18, (GXColor){0, 0, 0, 255}); - txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - txt[i]->SetPosition(20,-20); - - for(i=0; i < numEntries; i++) - creditsWindowBox.Append(txt[i]); - - creditsWindow.Append(&creditsWindowBox); - - while(!exit) - { - UpdatePads(); - - gameScreenImg->Draw(); - bgBottomImg->Draw(); - bgTopImg->Draw(); - creditsWindow.Draw(); - - #ifdef HW_RVL - i = 3; - do { - if(userInput[i].wpad->ir.valid) - Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48, - 96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255); - DoRumble(i); - --i; - } while(i >= 0); - #endif - - Menu_Render(); - - if((userInput[0].wpad->btns_d || userInput[0].pad.btns_d || userInput[0].wupcdata.btns_d) || - (userInput[1].wpad->btns_d || userInput[1].pad.btns_d || userInput[1].wupcdata.btns_d) || - (userInput[2].wpad->btns_d || userInput[2].pad.btns_d || userInput[2].wupcdata.btns_d) || - (userInput[3].wpad->btns_d || userInput[3].pad.btns_d || userInput[3].wupcdata.btns_d)) - { - exit = true; - } - usleep(THREAD_SLEEP); - } - - // clear buttons pressed - for(i=0; i < 4; i++) - { - userInput[i].wupcdata.btns_d = 0; - userInput[i].wpad->btns_d = 0; - userInput[i].pad.btns_d = 0; - } - - for(i=0; i < numEntries; i++) - delete txt[i]; -} - -/**************************************************************************** - * MenuGameSelection - * - * Displays a list of games on the specified load device, and allows the user - * to browse and select from this list. - ***************************************************************************/ -static int MenuGameSelection() -{ - int menu = MENU_NONE; - bool res; - int i; - - GuiText titleTxt("Choose Game", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData iconHome(icon_home_png); - GuiImageData iconSettings(icon_settings_png); - GuiImageData btnOutline(button_long_png); - GuiImageData btnOutlineOver(button_long_over_png); - GuiImageData bgPreviewImg(bg_preview_png); - - GuiTrigger trigHome; - trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); - - GuiText settingsBtnTxt("Settings", 22, (GXColor){0, 0, 0, 255}); - GuiImage settingsBtnIcon(&iconSettings); - settingsBtnIcon.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - settingsBtnIcon.SetPosition(14,0); - GuiImage settingsBtnImg(&btnOutline); - GuiImage settingsBtnImgOver(&btnOutlineOver); - GuiButton settingsBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - settingsBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - settingsBtn.SetPosition(90, -35); - settingsBtn.SetLabel(&settingsBtnTxt); - settingsBtn.SetIcon(&settingsBtnIcon); - settingsBtn.SetImage(&settingsBtnImg); - settingsBtn.SetImageOver(&settingsBtnImgOver); - settingsBtn.SetSoundOver(&btnSoundOver); - settingsBtn.SetSoundClick(&btnSoundClick); - settingsBtn.SetTrigger(trigA); - settingsBtn.SetTrigger(trig2); - settingsBtn.SetEffectGrow(); - - GuiText exitBtnTxt("Exit", 22, (GXColor){0, 0, 0, 255}); - GuiImage exitBtnIcon(&iconHome); - exitBtnIcon.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - exitBtnIcon.SetPosition(14,0); - GuiImage exitBtnImg(&btnOutline); - GuiImage exitBtnImgOver(&btnOutlineOver); - GuiButton exitBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - exitBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - exitBtn.SetPosition(-90, -35); - exitBtn.SetLabel(&exitBtnTxt); - exitBtn.SetIcon(&exitBtnIcon); - exitBtn.SetImage(&exitBtnImg); - exitBtn.SetImageOver(&exitBtnImgOver); - exitBtn.SetSoundOver(&btnSoundOver); - exitBtn.SetSoundClick(&btnSoundClick); - exitBtn.SetTrigger(trigA); - exitBtn.SetTrigger(trig2); - exitBtn.SetTrigger(&trigHome); - exitBtn.SetEffectGrow(); - - GuiWindow buttonWindow(screenwidth, screenheight); - buttonWindow.Append(&settingsBtn); - buttonWindow.Append(&exitBtn); - - GuiFileBrowser gameBrowser(330, 268); - gameBrowser.SetPosition(30, 98); - ResetBrowser(); - - GuiImage bgPreview(&bgPreviewImg); - bgPreview.SetPosition(365, 98); - - GuiImage preview; - preview.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - preview.SetPosition(174, -8); - u8* imgBuffer = MEM_ALLOC(512 * 512 * 4); - int previousBrowserIndex = -1; - char imagePath[MAXJOLIET + 1]; - - HaltGui(); - btnLogo->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - btnLogo->SetPosition(-50, 24); - mainWindow->Append(&titleTxt); - mainWindow->Append(&gameBrowser); - mainWindow->Append(&buttonWindow); - mainWindow->Append(&bgPreview); - mainWindow->Append(&preview); - ResumeGui(); - - #ifdef HW_RVL - ShutoffRumble(); - #endif - - // populate initial directory listing - selectLoadedFile = 1; - OpenGameList(); - - gameBrowser.ResetState(); - gameBrowser.fileList[0]->SetState(STATE_SELECTED); - gameBrowser.TriggerUpdate(); - titleTxt.SetText(inSz ? szname : "Choose Game"); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - if(selectLoadedFile == 2) - { - selectLoadedFile = 0; - mainWindow->ChangeFocus(&gameBrowser); - gameBrowser.TriggerUpdate(); - } - - //update gamelist image - if(previousBrowserIndex != browser.selIndex) - { - previousBrowserIndex = browser.selIndex; - snprintf(imagePath, MAXJOLIET, "%s%s/%s.png", pathPrefix[GCSettings.LoadMethod], GCSettings.ImageFolder, browserList[browser.selIndex].displayname); - - AllocSaveBuffer(); - int width, height; - if(LoadFile(imagePath, SILENT)) - { - if(DecodePNG(savebuffer, &width, &height, imgBuffer, 512, 512)) - { - preview.SetImage(imgBuffer, width, height); - preview.SetScale( MIN(225.0f / width, 235.0f / height) ); - } - else - { - preview.SetImage(NULL, 0, 0); - } - } - else - { - preview.SetImage(NULL, 0, 0); - - } - FreeSaveBuffer(); - } - - // update gameWindow based on arrow buttons - // set MENU_EXIT if A button pressed on a game - for(i=0; i < FILE_PAGESIZE; i++) - { - if(gameBrowser.fileList[i]->GetState() == STATE_CLICKED) - { - gameBrowser.fileList[i]->ResetState(); - - // check corresponding browser entry - if(browserList[browser.selIndex].isdir || IsSz()) - { - HaltGui(); - res = BrowserChangeFolder(); - if(res) - { - gameBrowser.ResetState(); - gameBrowser.fileList[0]->SetState(STATE_SELECTED); - gameBrowser.TriggerUpdate(); - previousBrowserIndex = -1; - } - else - { - menu = MENU_GAMESELECTION; - break; - } - - - titleTxt.SetText(inSz ? szname : "Choose Game"); - - ResumeGui(); - } - else - { - #ifdef HW_RVL - ShutoffRumble(); - #endif - mainWindow->SetState(STATE_DISABLED); - SavePrefs(SILENT); - if(BrowserLoadFile()) - menu = MENU_EXIT; - else - mainWindow->SetState(STATE_DEFAULT); - } - } - } - - - - if(settingsBtn.GetState() == STATE_CLICKED) - menu = MENU_SETTINGS; - else if(exitBtn.GetState() == STATE_CLICKED) - ExitRequested = 1; - } - - HaltParseThread(); // halt parsing - HaltGui(); - ResetBrowser(); - mainWindow->Remove(&titleTxt); - mainWindow->Remove(&buttonWindow); - mainWindow->Remove(&gameBrowser); - mainWindow->Remove(&preview); - mainWindow->Remove(&bgPreview); - MEM_DEALLOC(imgBuffer); - return menu; -} - -extern char DebugStr[50]; - -/**************************************************************************** - * MenuGame - * - * Menu displayed when returning to the menu from in-game. - ***************************************************************************/ -static int MenuGame() -{ - int menu = MENU_NONE; - - // Weather menu if a game with Boktai solar sensor - bool isBoktai = ((RomIdCode & 0xFF)=='U'); - char s[64]; - - GuiText titleTxt(ROMFilename, 22, (GXColor){255, 255, 255, 255}); - if (DebugStr[0]) titleTxt.SetText(DebugStr); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - GuiImageData btnCloseOutline(button_small_png); - GuiImageData btnCloseOutlineOver(button_small_over_png); - GuiImageData btnLargeOutline(button_large_png); - GuiImageData btnLargeOutlineOver(button_large_over_png); - GuiImageData iconGameSettings(icon_game_settings_png); - GuiImageData iconLoad(icon_game_load_png); - GuiImageData iconSave(icon_game_save_png); - GuiImageData iconDelete(icon_game_delete_png); - GuiImageData iconReset(icon_game_reset_png); - - GuiImageData battery(battery_png); - GuiImageData batteryRed(battery_red_png); - GuiImageData batteryBar(battery_bar_png); - - GuiTrigger trigHome; - trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); - - int xOffset=125; - if (isBoktai) - xOffset=200; - - GuiText saveBtnTxt("Save", 22, (GXColor){0, 0, 0, 255}); - GuiImage saveBtnImg(&btnLargeOutline); - GuiImage saveBtnImgOver(&btnLargeOutlineOver); - GuiImage saveBtnIcon(&iconSave); - GuiButton saveBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - saveBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - saveBtn.SetPosition(-200, 120); - saveBtn.SetLabel(&saveBtnTxt); - saveBtn.SetImage(&saveBtnImg); - saveBtn.SetImageOver(&saveBtnImgOver); - saveBtn.SetIcon(&saveBtnIcon); - saveBtn.SetSoundOver(&btnSoundOver); - saveBtn.SetSoundClick(&btnSoundClick); - saveBtn.SetTrigger(trigA); - saveBtn.SetTrigger(trig2); - saveBtn.SetEffectGrow(); - - GuiText loadBtnTxt("Load", 22, (GXColor){0, 0, 0, 255}); - GuiImage loadBtnImg(&btnLargeOutline); - GuiImage loadBtnImgOver(&btnLargeOutlineOver); - GuiImage loadBtnIcon(&iconLoad); - GuiButton loadBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - loadBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - loadBtn.SetPosition(0, 120); - loadBtn.SetLabel(&loadBtnTxt); - loadBtn.SetImage(&loadBtnImg); - loadBtn.SetImageOver(&loadBtnImgOver); - loadBtn.SetIcon(&loadBtnIcon); - loadBtn.SetSoundOver(&btnSoundOver); - loadBtn.SetSoundClick(&btnSoundClick); - loadBtn.SetTrigger(trigA); - loadBtn.SetTrigger(trig2); - loadBtn.SetEffectGrow(); - - GuiText deleteBtnTxt("Delete", 22, (GXColor){0, 0, 0, 255}); - GuiImage deleteBtnImg(&btnLargeOutline); - GuiImage deleteBtnImgOver(&btnLargeOutlineOver); - GuiImage deleteBtnIcon(&iconDelete); - GuiButton deleteBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - deleteBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - deleteBtn.SetPosition(200, 120); - deleteBtn.SetLabel(&deleteBtnTxt); - deleteBtn.SetImage(&deleteBtnImg); - deleteBtn.SetImageOver(&deleteBtnImgOver); - deleteBtn.SetIcon(&deleteBtnIcon); - deleteBtn.SetSoundOver(&btnSoundOver); - deleteBtn.SetSoundClick(&btnSoundClick); - deleteBtn.SetTrigger(trigA); - deleteBtn.SetTrigger(trig2); - deleteBtn.SetEffectGrow(); - - // Boktai adds an extra button for setting the sun. - GuiText *sunBtnTxt = NULL; - GuiImage *sunBtnImg = NULL; - GuiImage *sunBtnImgOver = NULL; - GuiButton *sunBtn = NULL; - if (isBoktai) - { - struct tm *newtime; - time_t long_time; - - // regardless of the weather, there should be no sun at night time! - time(&long_time); // Get time as long integer. - newtime = localtime(&long_time); // Convert to local time. - if (newtime->tm_hour > 21 || newtime->tm_hour < 5) - { - sprintf(s, "Weather: Night Time"); - } - else - sprintf(s, "Weather: %d%% sun", SunBars*10); - - sunBtnTxt = new GuiText(s, 22, (GXColor){0, 0, 0, 255}); - sunBtnTxt->SetWrap(true, btnLargeOutline.GetWidth()-30); - sunBtnImg = new GuiImage(&btnLargeOutline); - sunBtnImgOver = new GuiImage(&btnLargeOutlineOver); - sunBtn = new GuiButton(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - sunBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - sunBtn->SetPosition(0, 250); - sunBtn->SetLabel(sunBtnTxt); - sunBtn->SetImage(sunBtnImg); - sunBtn->SetImageOver(sunBtnImgOver); - sunBtn->SetSoundOver(&btnSoundOver); - sunBtn->SetSoundClick(&btnSoundClick); - sunBtn->SetTrigger(trigA); - sunBtn->SetTrigger(trig2); - sunBtn->SetEffectGrow(); - } - - GuiText resetBtnTxt("Reset", 22, (GXColor){0, 0, 0, 255}); - GuiImage resetBtnImg(&btnLargeOutline); - GuiImage resetBtnImgOver(&btnLargeOutlineOver); - GuiImage resetBtnIcon(&iconReset); - GuiButton resetBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - resetBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - resetBtn.SetPosition(xOffset, 250); - resetBtn.SetLabel(&resetBtnTxt); - resetBtn.SetImage(&resetBtnImg); - resetBtn.SetImageOver(&resetBtnImgOver); - resetBtn.SetIcon(&resetBtnIcon); - resetBtn.SetSoundOver(&btnSoundOver); - resetBtn.SetSoundClick(&btnSoundClick); - resetBtn.SetTrigger(trigA); - resetBtn.SetTrigger(trig2); - resetBtn.SetEffectGrow(); - - GuiText gameSettingsBtnTxt("Game Settings", 22, (GXColor){0, 0, 0, 255}); - gameSettingsBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); - GuiImage gameSettingsBtnImg(&btnLargeOutline); - GuiImage gameSettingsBtnImgOver(&btnLargeOutlineOver); - GuiImage gameSettingsBtnIcon(&iconGameSettings); - GuiButton gameSettingsBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - gameSettingsBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - gameSettingsBtn.SetPosition(-xOffset, 250); - gameSettingsBtn.SetLabel(&gameSettingsBtnTxt); - gameSettingsBtn.SetImage(&gameSettingsBtnImg); - gameSettingsBtn.SetImageOver(&gameSettingsBtnImgOver); - gameSettingsBtn.SetIcon(&gameSettingsBtnIcon); - gameSettingsBtn.SetSoundOver(&btnSoundOver); - gameSettingsBtn.SetSoundClick(&btnSoundClick); - gameSettingsBtn.SetTrigger(trigA); - gameSettingsBtn.SetTrigger(trig2); - gameSettingsBtn.SetEffectGrow(); - - GuiText mainmenuBtnTxt("Main Menu", 22, (GXColor){0, 0, 0, 255}); - GuiImage mainmenuBtnImg(&btnOutline); - GuiImage mainmenuBtnImgOver(&btnOutlineOver); - GuiButton mainmenuBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - mainmenuBtn.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); - mainmenuBtn.SetPosition(0, -35); - mainmenuBtn.SetLabel(&mainmenuBtnTxt); - mainmenuBtn.SetImage(&mainmenuBtnImg); - mainmenuBtn.SetImageOver(&mainmenuBtnImgOver); - mainmenuBtn.SetSoundOver(&btnSoundOver); - mainmenuBtn.SetSoundClick(&btnSoundClick); - mainmenuBtn.SetTrigger(trigA); - mainmenuBtn.SetTrigger(trig2); - mainmenuBtn.SetEffectGrow(); - - GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); - GuiImage closeBtnImg(&btnCloseOutline); - GuiImage closeBtnImgOver(&btnCloseOutlineOver); - GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - closeBtn.SetPosition(-50, 35); - closeBtn.SetLabel(&closeBtnTxt); - closeBtn.SetImage(&closeBtnImg); - closeBtn.SetImageOver(&closeBtnImgOver); - closeBtn.SetSoundOver(&btnSoundOver); - closeBtn.SetSoundClick(&btnSoundClick); - closeBtn.SetTrigger(trigA); - closeBtn.SetTrigger(trig2); - closeBtn.SetTrigger(&trigHome); - closeBtn.SetEffectGrow(); - - #ifdef HW_RVL - int i; - char txt[3]; - bool status[4] = { false, false, false, false }; - int level[4] = { 0, 0, 0, 0 }; - bool newStatus; - int newLevel; - GuiText * batteryTxt[4]; - GuiImage * batteryImg[4]; - GuiImage * batteryBarImg[4]; - GuiButton * batteryBtn[4]; - - for(i=0; i < 4; ++i) - { - sprintf(txt, "P%d", i+1); - - batteryTxt[i] = new GuiText(txt, 20, (GXColor){255, 255, 255, 255}); - batteryTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - batteryImg[i] = new GuiImage(&battery); - batteryImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - batteryImg[i]->SetPosition(30, 0); - batteryBarImg[i] = new GuiImage(&batteryBar); - batteryBarImg[i]->SetTile(0); - batteryBarImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - batteryBarImg[i]->SetPosition(34, 0); - - batteryBtn[i] = new GuiButton(70, 20); - batteryBtn[i]->SetLabel(batteryTxt[i]); - batteryBtn[i]->SetImage(batteryImg[i]); - batteryBtn[i]->SetIcon(batteryBarImg[i]); - batteryBtn[i]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - batteryBtn[i]->SetRumble(false); - batteryBtn[i]->SetSelectable(false); - batteryBtn[i]->SetAlpha(150); - } - - batteryBtn[0]->SetPosition(45, -65); - batteryBtn[1]->SetPosition(135, -65); - batteryBtn[2]->SetPosition(45, -40); - batteryBtn[3]->SetPosition(135, -40); - #endif - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&titleTxt); - w.Append(&saveBtn); - w.Append(&loadBtn); - w.Append(&deleteBtn); - w.Append(&resetBtn); - w.Append(&gameSettingsBtn); - if (isBoktai) - w.Append(sunBtn); - - #ifdef HW_RVL - w.Append(batteryBtn[0]); - w.Append(batteryBtn[1]); - w.Append(batteryBtn[2]); - w.Append(batteryBtn[3]); - #endif - - w.Append(&mainmenuBtn); - w.Append(&closeBtn); - - btnLogo->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - btnLogo->SetPosition(-50, -40); - mainWindow->Append(&w); - - if(lastMenu == MENU_NONE) - { - enterSound->Play(); - bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 35); - closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 35); - titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 35); - mainmenuBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); - bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); - btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); - #ifdef HW_RVL - batteryBtn[0]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); - batteryBtn[1]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); - batteryBtn[2]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); - batteryBtn[3]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); - #endif - - w.SetEffect(EFFECT_FADE, 15); - } - - ResumeGui(); - - if(lastMenu == MENU_NONE) - { - if (GCSettings.AutoSave == 1) - { - SaveBatteryOrStateAuto(FILE_SRAM, SILENT); // save battery - } - else if (GCSettings.AutoSave == 2) - { - if (WindowPrompt("Save", "Save Snapshot?", "Save", "Don't Save") ) - SaveBatteryOrStateAuto(FILE_SNAPSHOT, NOTSILENT); // save state - } - else if (GCSettings.AutoSave == 3) - { - if (WindowPrompt("Save", "Save SRAM and Snapshot?", "Save", "Don't Save") ) - { - SaveBatteryOrStateAuto(FILE_SRAM, NOTSILENT); // save battery - SaveBatteryOrStateAuto(FILE_SNAPSHOT, NOTSILENT); // save state - } - } - } - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - #ifdef HW_RVL - for(i=0; i < 4; i++) - { - if(WPAD_Probe(i, NULL) == WPAD_ERR_NONE) - { - newStatus = true; - newLevel = (userInput[i].wpad->battery_level / 100.0) * 4; - if(newLevel > 4) newLevel = 4; - } - else - { - struct WUPCData *data = WUPC_Data(i); - if(data != NULL) - { - newStatus = true; - newLevel = data->battery; - } - else - { - newStatus = false; - newLevel = 0; - } - } - - if(status[i] != newStatus || level[i] != newLevel) - { - if(newStatus == true) // controller connected - { - batteryBtn[i]->SetAlpha(255); - batteryBarImg[i]->SetTile(newLevel); - - if(newLevel == 0) - batteryImg[i]->SetImage(&batteryRed); - else - batteryImg[i]->SetImage(&battery); - } - else // controller not connected - { - batteryBtn[i]->SetAlpha(150); - batteryBarImg[i]->SetTile(0); - batteryImg[i]->SetImage(&battery); - } - status[i] = newStatus; - level[i] = newLevel; - } - } - #endif - - if (isBoktai) - { - if (sunBtn->GetState() == STATE_CLICKED) - { - ++SunBars; - if (SunBars>10) SunBars=0; - menu = MENU_GAME; - } - } - - if(saveBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAME_SAVE; - } - else if(loadBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAME_LOAD; - } - else if(deleteBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAME_DELETE; - } - else if(resetBtn.GetState() == STATE_CLICKED) - { - if (WindowPrompt("Reset Game", "Reset this game? Any unsaved progress will be lost.", "OK", "Cancel")) - { - emulator.emuReset(); - menu = MENU_EXIT; - } - } - else if(gameSettingsBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESETTINGS; - } - else if(mainmenuBtn.GetState() == STATE_CLICKED) - { - if (WindowPrompt("Quit Game", "Quit this game? Any unsaved progress will be lost.", "OK", "Cancel")) - { - HaltGui(); - mainWindow->Remove(gameScreenImg); - delete gameScreenImg; - delete gameScreen; - gameScreen = NULL; - free(gameScreenPng); - gameScreenPng = NULL; - gameScreenImg = new GuiImage(screenwidth, screenheight, (GXColor){236, 226, 238, 255}); - gameScreenImg->ColorStripe(10); - mainWindow->Insert(gameScreenImg, 0); - ResumeGui(); - #ifndef NO_SOUND - bgMusic->Play(); // startup music - #endif - menu = MENU_GAMESELECTION; - } - } - else if(closeBtn.GetState() == STATE_CLICKED) - { - menu = MENU_EXIT; - - exitSound->Play(); - bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - mainmenuBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - #ifdef HW_RVL - batteryBtn[0]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - batteryBtn[1]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - batteryBtn[2]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - batteryBtn[3]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - #endif - - w.SetEffect(EFFECT_FADE, -15); - usleep(350000); // wait for effects to finish - } - } - - HaltGui(); - - if (isBoktai) { - delete sunBtnTxt; - delete sunBtnImg; - delete sunBtnImgOver; - delete sunBtn; - } - - #ifdef HW_RVL - for(i=0; i < 4; ++i) - { - delete batteryTxt[i]; - delete batteryImg[i]; - delete batteryBarImg[i]; - delete batteryBtn[i]; - } - #endif - - mainWindow->Remove(&w); - return menu; -} - -/**************************************************************************** - * FindGameSaveNum - * - * Determines the save file number of the given file name - * Returns -1 if none is found - ***************************************************************************/ -static int FindGameSaveNum(char * savefile, int method) -{ - int n = -1; - int romlen = strlen(ROMFilename); - int savelen = strlen(savefile); - int diff = savelen-romlen; - - if(strncmp(savefile, ROMFilename, romlen) != 0) - return -1; - - if(savefile[romlen] == ' ') - { - if(diff == 5 && strncmp(&savefile[romlen+1], "Auto", 4) == 0) - n = 0; // found Auto save - else if(diff == 2 || diff == 3) - n = atoi(&savefile[romlen+1]); - } - - if(n >= 0 && n < MAX_SAVES) - return n; - else - return -1; -} - -/**************************************************************************** - * MenuGameSaves - * - * Allows the user to load or save progress. - ***************************************************************************/ -static int MenuGameSaves(int action) -{ - SaveList saves; - struct stat filestat; - struct tm * timeinfo; - - int menu = MENU_NONE; - int ret, result; - int i, n, type, len, len2; - int j = 0; - - char filepath[1024]; - char deletepath[1024]; - char scrfile[1024]; - char tmp[MAXJOLIET+1]; - - int method = GCSettings.SaveMethod; - - if(method == DEVICE_AUTO) - autoSaveMethod(NOTSILENT); - - if(!ChangeInterface(method, NOTSILENT)) - return MENU_GAME; - - GuiText titleTxt(NULL, 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - if(action == 0) - titleTxt.SetText("Load Game"); - else if (action == 2) - titleTxt.SetText("Delete Saves"); - else - titleTxt.SetText("Save Game"); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - GuiImageData btnCloseOutline(button_small_png); - GuiImageData btnCloseOutlineOver(button_small_over_png); - - GuiTrigger trigHome; - trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(50, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); - GuiImage closeBtnImg(&btnCloseOutline); - GuiImage closeBtnImgOver(&btnCloseOutlineOver); - GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - closeBtn.SetPosition(-50, 35); - closeBtn.SetLabel(&closeBtnTxt); - closeBtn.SetImage(&closeBtnImg); - closeBtn.SetImageOver(&closeBtnImgOver); - closeBtn.SetSoundOver(&btnSoundOver); - closeBtn.SetSoundClick(&btnSoundClick); - closeBtn.SetTrigger(trigA); - closeBtn.SetTrigger(trig2); - closeBtn.SetTrigger(&trigHome); - closeBtn.SetEffectGrow(); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&backBtn); - w.Append(&closeBtn); - mainWindow->Append(&w); - mainWindow->Append(&titleTxt); - ResumeGui(); - - memset(&saves, 0, sizeof(saves)); - - sprintf(browser.dir, "%s%s", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder); - ParseDirectory(true, false); - - len = strlen(ROMFilename); - - // find matching files - AllocSaveBuffer(); - - for(i=0; i < browser.numEntries; i++) - { - len2 = strlen(browserList[i].filename); - - if(len2 < 6 || len2-len < 5) - continue; - - if(strncmp(&browserList[i].filename[len2-4], ".sav", 4) == 0) - type = FILE_SRAM; - else if(strncmp(&browserList[i].filename[len2-4], ".sgm", 4) == 0) - type = FILE_SNAPSHOT; - else - continue; - - strcpy(tmp, browserList[i].filename); - tmp[len2-4] = 0; - n = FindGameSaveNum(tmp, method); - - if(n >= 0) - { - saves.type[j] = type; - saves.files[saves.type[j]][n] = 1; - strcpy(saves.filename[j], browserList[i].filename); - - if(saves.type[j] == FILE_SNAPSHOT) - { - sprintf(scrfile, "%s%s/%s.png", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, tmp); - - memset(savebuffer, 0, SAVEBUFFERSIZE); - if(LoadFile(scrfile, SILENT)) - saves.previewImg[j] = new GuiImageData(savebuffer, 64, 48); - } - snprintf(filepath, 1024, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, saves.filename[j]); - if (stat(filepath, &filestat) == 0) - { - timeinfo = localtime(&filestat.st_mtime); - strftime(saves.date[j], 20, "%a %b %d", timeinfo); - strftime(saves.time[j], 10, "%I:%M %p", timeinfo); - } - ++j; - } - } - - FreeSaveBuffer(); - saves.length = j; - - if((saves.length == 0 && action == 0) || (saves.length == 0 && action == 2)) - { - InfoPrompt("No game saves found."); - menu = MENU_GAME; - } - - GuiSaveBrowser saveBrowser(552, 248, &saves, action); - saveBrowser.SetPosition(0, 108); - saveBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - - HaltGui(); - mainWindow->Append(&saveBrowser); - mainWindow->ChangeFocus(&saveBrowser); - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - ret = saveBrowser.GetClickedSave(); - - // load, save and delete save games - if(ret > -3) - { - result = 0; - - if(action == 0) // load - { - MakeFilePath(filepath, saves.type[ret], saves.filename[ret]); - switch(saves.type[ret]) - { - case FILE_SRAM: - result = LoadBatteryOrState(filepath, saves.type[ret], NOTSILENT); - emulator.emuReset(); - break; - case FILE_SNAPSHOT: - result = LoadBatteryOrState(filepath, saves.type[ret], NOTSILENT); - break; - } - if(result) - menu = MENU_EXIT; - } - else if(action == 2) // delete SRAM/Snapshot - { - if (WindowPrompt("Delete File", "Delete this save file? Deleted files can not be restored.", "OK", "Cancel")) - { - MakeFilePath(filepath, saves.type[ret], saves.filename[ret]); - switch(saves.type[ret]) - { - case FILE_SRAM: - strncpy(deletepath, filepath, 1024); - deletepath[strlen(deletepath)-4] = 0; - sprintf(deletepath, "%s.sav", deletepath); - remove(deletepath); // Delete the *.srm file (Battery save file) - break; - case FILE_SNAPSHOT: - strncpy(deletepath, filepath, 1024); - deletepath[strlen(deletepath)-4] = 0; - sprintf(deletepath, "%s.png", deletepath); - remove(deletepath); // Delete the *.png file (Screenshot file) - strncpy(deletepath, filepath, 1024); - deletepath[strlen(deletepath)-4] = 0; - sprintf(deletepath, "%s.sgm", deletepath); - remove(deletepath); // Delete the *.frz file (Save State file) - break; - } - } - menu = MENU_GAME_DELETE; - - - } - else // save - { - if(ret == -2) // new SRAM - { - for(i=1; i < 100; i++) - if(saves.files[FILE_SRAM][i] == 0) - break; - - if(i < 100) - { - MakeFilePath(filepath, FILE_SRAM, ROMFilename, i); - SaveBatteryOrState(filepath, FILE_SRAM, NOTSILENT); - menu = MENU_GAME_SAVE; - } - } - else if(ret == -1) // new Snapshot - { - for(i=1; i < 100; i++) - if(saves.files[FILE_SNAPSHOT][i] == 0) - break; - - if(i < 100) - { - MakeFilePath(filepath, FILE_SNAPSHOT, ROMFilename, i); - SaveBatteryOrState(filepath, FILE_SNAPSHOT, NOTSILENT); - menu = MENU_GAME_SAVE; - } - } - else // overwrite SRAM/Snapshot - { - MakeFilePath(filepath, saves.type[ret], saves.filename[ret]); - switch(saves.type[ret]) - { - case FILE_SRAM: - SaveBatteryOrState(filepath, FILE_SRAM, NOTSILENT); - break; - case FILE_SNAPSHOT: - SaveBatteryOrState(filepath, FILE_SNAPSHOT, NOTSILENT); - break; - } - menu = MENU_GAME_SAVE; - } - } - } - - if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAME; - } - else if(closeBtn.GetState() == STATE_CLICKED) - { - menu = MENU_EXIT; - - exitSound->Play(); - bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - backBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - - w.SetEffect(EFFECT_FADE, -15); - - usleep(350000); // wait for effects to finish - } - } - - HaltGui(); - - for(i=0; i < saves.length; i++) - if(saves.previewImg[i]) - delete saves.previewImg[i]; - - mainWindow->Remove(&saveBrowser); - mainWindow->Remove(&w); - mainWindow->Remove(&titleTxt); - ResetBrowser(); - return menu; -} - - -/**************************************************************************** - * MenuGameSettings - ***************************************************************************/ -static int MenuGameSettings() -{ - int menu = MENU_NONE; - char s[4]; - char filepath[1024]; - - GuiText titleTxt("Game Settings", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - GuiImageData btnLargeOutline(button_large_png); - GuiImageData btnLargeOutlineOver(button_large_over_png); - GuiImageData iconMappings(icon_settings_mappings_png); - GuiImageData iconVideo(icon_settings_video_png); -#ifdef HW_RVL - GuiImageData iconWiiControls(icon_settings_nunchuk_png); -#else - GuiImageData iconWiiControls(icon_settings_gamecube_png); -#endif - GuiImageData iconScreenshot(icon_settings_screenshot_png); - GuiImageData btnCloseOutline(button_small_png); - GuiImageData btnCloseOutlineOver(button_small_over_png); - - GuiTrigger trigHome; - trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); - - GuiText mappingBtnTxt("Button Mappings", 22, (GXColor){0, 0, 0, 255}); - mappingBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); - GuiImage mappingBtnImg(&btnLargeOutline); - GuiImage mappingBtnImgOver(&btnLargeOutlineOver); - GuiImage mappingBtnIcon(&iconMappings); - GuiButton mappingBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - mappingBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - mappingBtn.SetPosition(-125, 120); - mappingBtn.SetLabel(&mappingBtnTxt); - mappingBtn.SetImage(&mappingBtnImg); - mappingBtn.SetImageOver(&mappingBtnImgOver); - mappingBtn.SetIcon(&mappingBtnIcon); - mappingBtn.SetSoundOver(&btnSoundOver); - mappingBtn.SetSoundClick(&btnSoundClick); - mappingBtn.SetTrigger(trigA); - mappingBtn.SetTrigger(trig2); - mappingBtn.SetEffectGrow(); - - GuiText videoBtnTxt("Video", 22, (GXColor){0, 0, 0, 255}); - videoBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); - GuiImage videoBtnImg(&btnLargeOutline); - GuiImage videoBtnImgOver(&btnLargeOutlineOver); - GuiImage videoBtnIcon(&iconVideo); - GuiButton videoBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - videoBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - videoBtn.SetPosition(125, 120); - videoBtn.SetLabel(&videoBtnTxt); - videoBtn.SetImage(&videoBtnImg); - videoBtn.SetImageOver(&videoBtnImgOver); - videoBtn.SetIcon(&videoBtnIcon); - videoBtn.SetSoundOver(&btnSoundOver); - videoBtn.SetSoundClick(&btnSoundClick); - videoBtn.SetTrigger(trigA); - videoBtn.SetTrigger(trig2); - videoBtn.SetEffectGrow(); - - #ifdef HW_RVL - GuiText wiiControlsBtnTxt1("Match Wii Controls", 22, (GXColor){0, 0, 0, 255}); - #else - GuiText wiiControlsBtnTxt1("Match GC Controls", 22, (GXColor){0, 0, 0, 255}); - #endif - if (GCSettings.WiiControls) sprintf(s, "ON"); - else sprintf(s, "OFF"); - GuiText wiiControlsBtnTxt2(s, 18, (GXColor){0, 0, 0, 255}); - wiiControlsBtnTxt1.SetPosition(0, -10); - wiiControlsBtnTxt1.SetWrap(true, btnLargeOutline.GetWidth()-30); - wiiControlsBtnTxt2.SetPosition(0, +30); - GuiImage wiiControlsBtnImg(&btnLargeOutline); - GuiImage wiiControlsBtnImgOver(&btnLargeOutlineOver); - GuiImage wiiControlsBtnIcon(&iconWiiControls); - GuiButton wiiControlsBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - wiiControlsBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - wiiControlsBtn.SetPosition(-125, 250); - wiiControlsBtn.SetLabel(&wiiControlsBtnTxt1, 0); - wiiControlsBtn.SetLabel(&wiiControlsBtnTxt2, 1); - wiiControlsBtn.SetImage(&wiiControlsBtnImg); - wiiControlsBtn.SetImageOver(&wiiControlsBtnImgOver); - wiiControlsBtn.SetIcon(&wiiControlsBtnIcon); - wiiControlsBtn.SetSoundOver(&btnSoundOver); - wiiControlsBtn.SetSoundClick(&btnSoundClick); - wiiControlsBtn.SetTrigger(trigA); - wiiControlsBtn.SetTrigger(trig2); - wiiControlsBtn.SetEffectGrow(); - - GuiText screenshotBtnTxt("Screenshot", 22, (GXColor){0, 0, 0, 255}); - GuiImage screenshotBtnImg(&btnLargeOutline); - GuiImage screenshotBtnImgOver(&btnLargeOutlineOver); - GuiImage screenshotBtnIcon(&iconScreenshot); - GuiButton screenshotBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - screenshotBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - screenshotBtn.SetPosition(125, 250); - screenshotBtn.SetLabel(&screenshotBtnTxt); - screenshotBtn.SetImage(&screenshotBtnImg); - screenshotBtn.SetImageOver(&screenshotBtnImgOver); - screenshotBtn.SetIcon(&screenshotBtnIcon); - screenshotBtn.SetSoundOver(&btnSoundOver); - screenshotBtn.SetSoundClick(&btnSoundClick); - screenshotBtn.SetTrigger(trigA); - screenshotBtn.SetTrigger(trig2); - screenshotBtn.SetEffectGrow(); - - GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); - GuiImage closeBtnImg(&btnCloseOutline); - GuiImage closeBtnImgOver(&btnCloseOutlineOver); - GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - closeBtn.SetPosition(-50, 35); - closeBtn.SetLabel(&closeBtnTxt); - closeBtn.SetImage(&closeBtnImg); - closeBtn.SetImageOver(&closeBtnImgOver); - closeBtn.SetSoundOver(&btnSoundOver); - closeBtn.SetSoundClick(&btnSoundClick); - closeBtn.SetTrigger(trigA); - closeBtn.SetTrigger(trig2); - closeBtn.SetTrigger(&trigHome); - closeBtn.SetEffectGrow(); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(50, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&titleTxt); - w.Append(&mappingBtn); - w.Append(&videoBtn); - w.Append(&wiiControlsBtn); - w.Append(&screenshotBtn); - w.Append(&closeBtn); - w.Append(&backBtn); - - mainWindow->Append(&w); - - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - if(mappingBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESETTINGS_MAPPINGS; - } - else if(videoBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESETTINGS_VIDEO; - } - else if(wiiControlsBtn.GetState() == STATE_CLICKED) - { - GCSettings.WiiControls ^= 1; - if (GCSettings.WiiControls) sprintf(s, "ON"); - else sprintf(s, "OFF"); - wiiControlsBtnTxt2.SetText(s); - wiiControlsBtn.ResetState(); - } - else if(screenshotBtn.GetState() == STATE_CLICKED) - { - if (WindowPrompt("Preview Screenshot", "Save a new Preview Screenshot? Current Screenshot image will be overwritten.", "OK", "Cancel")) - { - snprintf(filepath, 1024, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], GCSettings.ScreenshotsFolder, ROMFilename); - SavePreviewImg(filepath, SILENT); - } - } - else if(closeBtn.GetState() == STATE_CLICKED) - { - menu = MENU_EXIT; - - exitSound->Play(); - bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - backBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - - w.SetEffect(EFFECT_FADE, -15); - - usleep(350000); // wait for effects to finish - } - else if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAME; - } - } - - HaltGui(); - mainWindow->Remove(&w); - return menu; -} - -/**************************************************************************** - * MenuSettingsMappings - ***************************************************************************/ -static int MenuSettingsMappings() -{ - int menu = MENU_NONE; - - GuiText titleTxt("Game Settings - Button Mappings", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - GuiImageData btnLargeOutline(button_large_png); - GuiImageData btnLargeOutlineOver(button_large_over_png); - GuiImageData iconWiimote(icon_settings_wiimote_png); - GuiImageData iconClassic(icon_settings_classic_png); - GuiImageData iconGamecube(icon_settings_gamecube_png); - GuiImageData iconNunchuk(icon_settings_nunchuk_png); - GuiImageData iconWiiupro(icon_settings_wiiupro_png); - - GuiText gamecubeBtnTxt("GameCube Controller", 22, (GXColor){0, 0, 0, 255}); - gamecubeBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); - GuiImage gamecubeBtnImg(&btnLargeOutline); - GuiImage gamecubeBtnImgOver(&btnLargeOutlineOver); - GuiImage gamecubeBtnIcon(&iconGamecube); - GuiButton gamecubeBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - gamecubeBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - gamecubeBtn.SetPosition(-125, 120); - gamecubeBtn.SetLabel(&gamecubeBtnTxt); - gamecubeBtn.SetImage(&gamecubeBtnImg); - gamecubeBtn.SetImageOver(&gamecubeBtnImgOver); - gamecubeBtn.SetIcon(&gamecubeBtnIcon); - gamecubeBtn.SetSoundOver(&btnSoundOver); - gamecubeBtn.SetSoundClick(&btnSoundClick); - gamecubeBtn.SetTrigger(trigA); - gamecubeBtn.SetTrigger(trig2); - gamecubeBtn.SetEffectGrow(); - - GuiText wiimoteBtnTxt("Wiimote", 22, (GXColor){0, 0, 0, 255}); - GuiImage wiimoteBtnImg(&btnLargeOutline); - GuiImage wiimoteBtnImgOver(&btnLargeOutlineOver); - GuiImage wiimoteBtnIcon(&iconWiimote); - GuiButton wiimoteBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - wiimoteBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - wiimoteBtn.SetPosition(125, 120); - wiimoteBtn.SetLabel(&wiimoteBtnTxt); - wiimoteBtn.SetImage(&wiimoteBtnImg); - wiimoteBtn.SetImageOver(&wiimoteBtnImgOver); - wiimoteBtn.SetIcon(&wiimoteBtnIcon); - wiimoteBtn.SetSoundOver(&btnSoundOver); - wiimoteBtn.SetSoundClick(&btnSoundClick); - wiimoteBtn.SetTrigger(trigA); - wiimoteBtn.SetTrigger(trig2); - wiimoteBtn.SetEffectGrow(); - - GuiText classicBtnTxt("Classic Controller", 22, (GXColor){0, 0, 0, 255}); - classicBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); - GuiImage classicBtnImg(&btnLargeOutline); - GuiImage classicBtnImgOver(&btnLargeOutlineOver); - GuiImage classicBtnIcon(&iconClassic); - GuiButton classicBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - classicBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - classicBtn.SetPosition(-200, 250); - classicBtn.SetLabel(&classicBtnTxt); - classicBtn.SetImage(&classicBtnImg); - classicBtn.SetImageOver(&classicBtnImgOver); - classicBtn.SetIcon(&classicBtnIcon); - classicBtn.SetSoundOver(&btnSoundOver); - classicBtn.SetSoundClick(&btnSoundClick); - classicBtn.SetTrigger(trigA); - classicBtn.SetTrigger(trig2); - classicBtn.SetEffectGrow(); - - GuiText wiiuproBtnTxt("Wii U Pro Controller", 22, (GXColor){0, 0, 0, 255}); - wiiuproBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); - GuiImage wiiuproBtnImg(&btnLargeOutline); - GuiImage wiiuproBtnImgOver(&btnLargeOutlineOver); - GuiImage wiiuproBtnIcon(&iconWiiupro); - GuiButton wiiuproBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - wiiuproBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - wiiuproBtn.SetPosition(0, 250); - wiiuproBtn.SetLabel(&wiiuproBtnTxt); - wiiuproBtn.SetImage(&wiiuproBtnImg); - wiiuproBtn.SetImageOver(&wiiuproBtnImgOver); - wiiuproBtn.SetIcon(&wiiuproBtnIcon); - wiiuproBtn.SetSoundOver(&btnSoundOver); - wiiuproBtn.SetSoundClick(&btnSoundClick); - wiiuproBtn.SetTrigger(trigA); - wiiuproBtn.SetTrigger(trig2); - wiiuproBtn.SetEffectGrow(); - - GuiText nunchukBtnTxt1("Wiimote", 22, (GXColor){0, 0, 0, 255}); - GuiText nunchukBtnTxt2("&", 18, (GXColor){0, 0, 0, 255}); - GuiText nunchukBtnTxt3("Nunchuk", 22, (GXColor){0, 0, 0, 255}); - nunchukBtnTxt1.SetPosition(0, -20); - nunchukBtnTxt3.SetPosition(0, +20); - GuiImage nunchukBtnImg(&btnLargeOutline); - GuiImage nunchukBtnImgOver(&btnLargeOutlineOver); - GuiImage nunchukBtnIcon(&iconNunchuk); - GuiButton nunchukBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - nunchukBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - nunchukBtn.SetPosition(200, 250); - nunchukBtn.SetLabel(&nunchukBtnTxt1, 0); - nunchukBtn.SetLabel(&nunchukBtnTxt2, 1); - nunchukBtn.SetLabel(&nunchukBtnTxt3, 2); - nunchukBtn.SetImage(&nunchukBtnImg); - nunchukBtn.SetImageOver(&nunchukBtnImgOver); - nunchukBtn.SetIcon(&nunchukBtnIcon); - nunchukBtn.SetSoundOver(&btnSoundOver); - nunchukBtn.SetSoundClick(&btnSoundClick); - nunchukBtn.SetTrigger(trigA); - nunchukBtn.SetTrigger(trig2); - nunchukBtn.SetEffectGrow(); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(50, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&titleTxt); - - w.Append(&gamecubeBtn); -#ifdef HW_RVL - w.Append(&wiimoteBtn); - w.Append(&nunchukBtn); - w.Append(&classicBtn); - w.Append(&wiiuproBtn); -#endif - w.Append(&backBtn); - - mainWindow->Append(&w); - - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - if(wiimoteBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESETTINGS_MAPPINGS_MAP; - mapMenuCtrl = CTRLR_WIIMOTE; - } - else if(nunchukBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESETTINGS_MAPPINGS_MAP; - mapMenuCtrl = CTRLR_NUNCHUK; - } - else if(classicBtn.GetState() == STATE_CLICKED) - { - wiiuproCtrl = 0; - menu = MENU_GAMESETTINGS_MAPPINGS_MAP; - mapMenuCtrl = CTRLR_CLASSIC; - } - else if(wiiuproBtn.GetState() == STATE_CLICKED) - { - wiiuproCtrl = 1; - menu = MENU_GAMESETTINGS_MAPPINGS_MAP; - mapMenuCtrl = CTRLR_CLASSIC; - } - else if(gamecubeBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESETTINGS_MAPPINGS_MAP; - mapMenuCtrl = CTRLR_GCPAD; - } - else if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESETTINGS; - } - } - HaltGui(); - mainWindow->Remove(&w); - return menu; -} - -/**************************************************************************** - * ButtonMappingWindow - ***************************************************************************/ -static u32 -ButtonMappingWindow() -{ - GuiWindow promptWindow(448,288); - promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - promptWindow.SetPosition(0, -10); - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - - GuiImageData dialogBox(dialogue_box_png); - GuiImage dialogBoxImg(&dialogBox); - - GuiText titleTxt("Button Mapping", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - titleTxt.SetPosition(0,14); - - char msg[200]; - - switch(mapMenuCtrl) - { - case CTRLR_GCPAD: - #ifdef HW_RVL - sprintf(msg, "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping."); - #else - sprintf(msg, "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping."); - #endif - break; - case CTRLR_WIIMOTE: - sprintf(msg, "Press any button on the Wiimote now. Press Home to clear the existing mapping."); - break; - case CTRLR_CLASSIC: - if(wiiuproCtrl == 1) - { - sprintf(msg, "Press any button on the Wii U Pro Controller now. Press Home to clear the existing mapping."); - } - else - { - sprintf(msg, "Press any button on the Classic Controller now. Press Home to clear the existing mapping."); - } - break; - case CTRLR_NUNCHUK: - sprintf(msg, "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping."); - break; - } - - GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255}); - msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - msgTxt.SetPosition(0,-20); - msgTxt.SetWrap(true, 430); - - promptWindow.Append(&dialogBoxImg); - promptWindow.Append(&titleTxt); - promptWindow.Append(&msgTxt); - - HaltGui(); - mainWindow->SetState(STATE_DISABLED); - mainWindow->Append(&promptWindow); - mainWindow->ChangeFocus(&promptWindow); - ResumeGui(); - - u32 pressed = 0; - - while(pressed == 0) - { - usleep(THREAD_SLEEP); - - if(mapMenuCtrl == CTRLR_GCPAD) - { - pressed = userInput[0].pad.btns_d; - - - if(userInput[0].pad.substickX < -70 || - userInput[0].pad.substickX > 70 || - userInput[0].pad.substickY < -70 || - userInput[0].pad.substickY > 70) - pressed = WPAD_BUTTON_HOME; - - if(userInput[0].wpad->btns_d == WPAD_BUTTON_HOME) - pressed = WPAD_BUTTON_HOME; - } - else - { - pressed = userInput[0].wpad->btns_d; - - // always allow Home button to be pressed to cancel - if(pressed != WPAD_BUTTON_HOME) - { - switch(mapMenuCtrl) - { - case CTRLR_WIIMOTE: - if(pressed > 0x1000) - pressed = 0; // not a valid input - break; - - case CTRLR_CLASSIC: - if(userInput[0].wpad->exp.type != WPAD_EXP_CLASSIC) - pressed = 0; // not a valid input - else if(pressed <= 0x1000) - pressed = 0; - break; - - case CTRLR_NUNCHUK: - if(userInput[0].wpad->exp.type != WPAD_EXP_NUNCHUK) - pressed = 0; // not a valid input - break; - } - } - if(pressed == 0) - pressed = userInput[0].wupcdata.btns_d; - } - } - - if(pressed == WPAD_BUTTON_HOME || pressed == WPAD_CLASSIC_BUTTON_HOME) - pressed = 0; - - HaltGui(); - mainWindow->Remove(&promptWindow); - mainWindow->SetState(STATE_DEFAULT); - ResumeGui(); - - return pressed; -} - -static int MenuSettingsMappingsMap() -{ - int menu = MENU_NONE; - int ret,i,j; - bool firstRun = true; - OptionList options; - - char menuTitle[100]; - char menuSubtitle[100]; - sprintf(menuTitle, "Game Settings - Button Mappings"); - - GuiText titleTxt(menuTitle, 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,30); - - if(wiiuproCtrl == 1) - { - sprintf(menuSubtitle, "%s", "Wii U Pro Controller"); - } - else - { - sprintf(menuSubtitle, "%s", ctrlrName[mapMenuCtrl]); - } - GuiText subtitleTxt(menuSubtitle, 20, (GXColor){255, 255, 255, 255}); - subtitleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - subtitleTxt.SetPosition(50,60); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - GuiImageData btnShortOutline(button_short_png); - GuiImageData btnShortOutlineOver(button_short_over_png); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(50, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - GuiText resetBtnTxt("Reset", 22, (GXColor){0, 0, 0, 255}); - GuiImage resetBtnImg(&btnShortOutline); - GuiImage resetBtnImgOver(&btnShortOutlineOver); - GuiButton resetBtn(btnShortOutline.GetWidth(), btnShortOutline.GetHeight()); - resetBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - resetBtn.SetPosition(260, -35); - resetBtn.SetLabel(&resetBtnTxt); - resetBtn.SetImage(&resetBtnImg); - resetBtn.SetImageOver(&resetBtnImgOver); - resetBtn.SetSoundOver(&btnSoundOver); - resetBtn.SetSoundClick(&btnSoundClick); - resetBtn.SetTrigger(trigA); - resetBtn.SetTrigger(trig2); - resetBtn.SetEffectGrow(); - - i=0; - sprintf(options.name[i++], "B"); - sprintf(options.name[i++], "A"); - sprintf(options.name[i++], "Select"); - sprintf(options.name[i++], "Start"); - sprintf(options.name[i++], "Up"); - sprintf(options.name[i++], "Down"); - sprintf(options.name[i++], "Left"); - sprintf(options.name[i++], "Right"); - sprintf(options.name[i++], "L"); - sprintf(options.name[i++], "R"); - options.length = i; - - for(i=0; i < options.length; i++) - options.value[i][0] = 0; - - GuiOptionBrowser optionBrowser(552, 248, &options); - optionBrowser.SetPosition(0, 108); - optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - optionBrowser.SetCol2Position(215); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&backBtn); - w.Append(&resetBtn); - mainWindow->Append(&optionBrowser); - mainWindow->Append(&w); - mainWindow->Append(&titleTxt); - mainWindow->Append(&subtitleTxt); - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESETTINGS_MAPPINGS; - } - else if(resetBtn.GetState() == STATE_CLICKED) - { - resetBtn.ResetState(); - - int choice = WindowPrompt( - "Reset Mappings", - "Are you sure that you want to reset your mappings?", - "Yes", - "No"); - - if(choice == 1) - { - ResetControls(mapMenuCtrl); - firstRun = true; - } - } - - ret = optionBrowser.GetClickedOption(); - - if(ret >= 0) - { - // get a button selection from user - btnmap[mapMenuCtrl][ret] = ButtonMappingWindow(); - } - - if(ret >= 0 || firstRun) - { - firstRun = false; - - for(i=0; i < options.length; i++) - { - for(j=0; j < ctrlr_def[mapMenuCtrl].num_btns; j++) - { - if(btnmap[mapMenuCtrl][i] == 0) - { - options.value[i][0] = 0; - } - else if(btnmap[mapMenuCtrl][i] == - ctrlr_def[mapMenuCtrl].map[j].btn) - { - if(strcmp(options.value[i], ctrlr_def[mapMenuCtrl].map[j].name) != 0) - sprintf(options.value[i], ctrlr_def[mapMenuCtrl].map[j].name); - break; - } - } - } - optionBrowser.TriggerUpdate(); - } - } - wiiuproCtrl = 0; - HaltGui(); - mainWindow->Remove(&optionBrowser); - mainWindow->Remove(&w); - mainWindow->Remove(&titleTxt); - mainWindow->Remove(&subtitleTxt); - return menu; -} - -/**************************************************************************** - * MenuSettingsVideo - ***************************************************************************/ - -static void ScreenZoomWindowUpdate(void * ptr, float h, float v) -{ - GuiButton * b = (GuiButton *)ptr; - if(b->GetState() == STATE_CLICKED) - { - char zoom[10], zoom2[10]; - - if(IsGBAGame()) - { - GCSettings.gbaZoomHor += h; - GCSettings.gbaZoomVert += v; - sprintf(zoom, "%.2f%%", GCSettings.gbaZoomHor*100); - sprintf(zoom2, "%.2f%%", GCSettings.gbaZoomVert*100); - } - else - { - GCSettings.gbZoomHor += h; - GCSettings.gbZoomVert += v; - sprintf(zoom, "%.2f%%", GCSettings.gbZoomHor*100); - sprintf(zoom2, "%.2f%%", GCSettings.gbZoomVert*100); - } - - settingText->SetText(zoom); - settingText2->SetText(zoom2); - b->ResetState(); - } -} - -static void ScreenZoomWindowLeftClick(void * ptr) { ScreenZoomWindowUpdate(ptr, -0.01, 0); } -static void ScreenZoomWindowRightClick(void * ptr) { ScreenZoomWindowUpdate(ptr, +0.01, 0); } -static void ScreenZoomWindowUpClick(void * ptr) { ScreenZoomWindowUpdate(ptr, 0, +0.01); } -static void ScreenZoomWindowDownClick(void * ptr) { ScreenZoomWindowUpdate(ptr, 0, -0.01); } - -static void ScreenZoomWindow() -{ - GuiWindow * w = new GuiWindow(200,200); - w->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - - GuiTrigger trigLeft; - trigLeft.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); - - GuiTrigger trigRight; - trigRight.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); - - GuiTrigger trigUp; - trigUp.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP, PAD_BUTTON_UP); - - GuiTrigger trigDown; - trigDown.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN, PAD_BUTTON_DOWN); - - GuiImageData arrowLeft(button_arrow_left_png); - GuiImage arrowLeftImg(&arrowLeft); - GuiImageData arrowLeftOver(button_arrow_left_over_png); - GuiImage arrowLeftOverImg(&arrowLeftOver); - GuiButton arrowLeftBtn(arrowLeft.GetWidth(), arrowLeft.GetHeight()); - arrowLeftBtn.SetImage(&arrowLeftImg); - arrowLeftBtn.SetImageOver(&arrowLeftOverImg); - arrowLeftBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - arrowLeftBtn.SetPosition(50, 0); - arrowLeftBtn.SetTrigger(trigA); - arrowLeftBtn.SetTrigger(trig2); - arrowLeftBtn.SetTrigger(&trigLeft); - arrowLeftBtn.SetSelectable(false); - arrowLeftBtn.SetUpdateCallback(ScreenZoomWindowLeftClick); - - GuiImageData arrowRight(button_arrow_right_png); - GuiImage arrowRightImg(&arrowRight); - GuiImageData arrowRightOver(button_arrow_right_over_png); - GuiImage arrowRightOverImg(&arrowRightOver); - GuiButton arrowRightBtn(arrowRight.GetWidth(), arrowRight.GetHeight()); - arrowRightBtn.SetImage(&arrowRightImg); - arrowRightBtn.SetImageOver(&arrowRightOverImg); - arrowRightBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - arrowRightBtn.SetPosition(164, 0); - arrowRightBtn.SetTrigger(trigA); - arrowRightBtn.SetTrigger(trig2); - arrowRightBtn.SetTrigger(&trigRight); - arrowRightBtn.SetSelectable(false); - arrowRightBtn.SetUpdateCallback(ScreenZoomWindowRightClick); - - GuiImageData arrowUp(button_arrow_up_png); - GuiImage arrowUpImg(&arrowUp); - GuiImageData arrowUpOver(button_arrow_up_over_png); - GuiImage arrowUpOverImg(&arrowUpOver); - GuiButton arrowUpBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); - arrowUpBtn.SetImage(&arrowUpImg); - arrowUpBtn.SetImageOver(&arrowUpOverImg); - arrowUpBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - arrowUpBtn.SetPosition(-76, -27); - arrowUpBtn.SetTrigger(trigA); - arrowUpBtn.SetTrigger(trig2); - arrowUpBtn.SetTrigger(&trigUp); - arrowUpBtn.SetSelectable(false); - arrowUpBtn.SetUpdateCallback(ScreenZoomWindowUpClick); - - GuiImageData arrowDown(button_arrow_down_png); - GuiImage arrowDownImg(&arrowDown); - GuiImageData arrowDownOver(button_arrow_down_over_png); - GuiImage arrowDownOverImg(&arrowDownOver); - GuiButton arrowDownBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); - arrowDownBtn.SetImage(&arrowDownImg); - arrowDownBtn.SetImageOver(&arrowDownOverImg); - arrowDownBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - arrowDownBtn.SetPosition(-76, 27); - arrowDownBtn.SetTrigger(trigA); - arrowDownBtn.SetTrigger(trig2); - arrowDownBtn.SetTrigger(&trigDown); - arrowDownBtn.SetSelectable(false); - arrowDownBtn.SetUpdateCallback(ScreenZoomWindowDownClick); - - GuiImageData screenPosition(screen_position_png); - GuiImage screenPositionImg(&screenPosition); - screenPositionImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - screenPositionImg.SetPosition(0, 0); - - settingText = new GuiText(NULL, 20, (GXColor){0, 0, 0, 255}); - settingText2 = new GuiText(NULL, 20, (GXColor){0, 0, 0, 255}); - char zoom[10], zoom2[10]; - float currentZoomHor, currentZoomVert; - - if(IsGBAGame()) - { - sprintf(zoom, "%.2f%%", GCSettings.gbaZoomHor*100); - sprintf(zoom2, "%.2f%%", GCSettings.gbaZoomVert*100); - currentZoomHor = GCSettings.gbaZoomHor; - currentZoomVert = GCSettings.gbaZoomVert; - } - else - { - sprintf(zoom, "%.2f%%", GCSettings.gbZoomHor*100); - sprintf(zoom2, "%.2f%%", GCSettings.gbZoomVert*100); - currentZoomHor = GCSettings.gbZoomHor; - currentZoomVert = GCSettings.gbZoomVert; - } - - settingText->SetText(zoom); - settingText->SetPosition(108, 0); - settingText2->SetText(zoom2); - settingText2->SetPosition(-76, 0); - - w->Append(&arrowLeftBtn); - w->Append(&arrowRightBtn); - w->Append(&arrowUpBtn); - w->Append(&arrowDownBtn); - w->Append(&screenPositionImg); - w->Append(settingText); - w->Append(settingText2); - - char windowName[20]; - if(IsGBAGame()) - sprintf(windowName, "GBA Screen Zoom"); - else - sprintf(windowName, "GB Screen Zoom"); - - if(!SettingWindow(windowName,w)) - { - // undo changes - if(IsGBAGame()) - { - GCSettings.gbaZoomHor = currentZoomHor; - GCSettings.gbaZoomVert = currentZoomVert; - } - else - { - GCSettings.gbZoomHor = currentZoomHor; - GCSettings.gbZoomVert = currentZoomVert; - } - } - - delete(w); - delete(settingText); - delete(settingText2); -} - -static void ScreenPositionWindowUpdate(void * ptr, int x, int y) -{ - GuiButton * b = (GuiButton *)ptr; - if(b->GetState() == STATE_CLICKED) - { - GCSettings.xshift += x; - GCSettings.yshift += y; - - char shift[10]; - sprintf(shift, "%i, %i", GCSettings.xshift, GCSettings.yshift); - settingText->SetText(shift); - b->ResetState(); - } -} - -static void ScreenPositionWindowLeftClick(void * ptr) { ScreenPositionWindowUpdate(ptr, -1, 0); } -static void ScreenPositionWindowRightClick(void * ptr) { ScreenPositionWindowUpdate(ptr, +1, 0); } -static void ScreenPositionWindowUpClick(void * ptr) { ScreenPositionWindowUpdate(ptr, 0, -1); } -static void ScreenPositionWindowDownClick(void * ptr) { ScreenPositionWindowUpdate(ptr, 0, +1); } - -static void ScreenPositionWindow() -{ - GuiWindow * w = new GuiWindow(150,150); - w->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - w->SetPosition(0, -10); - - GuiTrigger trigLeft; - trigLeft.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); - - GuiTrigger trigRight; - trigRight.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); - - GuiTrigger trigUp; - trigUp.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP, PAD_BUTTON_UP); - - GuiTrigger trigDown; - trigDown.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN, PAD_BUTTON_DOWN); - - GuiImageData arrowLeft(button_arrow_left_png); - GuiImage arrowLeftImg(&arrowLeft); - GuiImageData arrowLeftOver(button_arrow_left_over_png); - GuiImage arrowLeftOverImg(&arrowLeftOver); - GuiButton arrowLeftBtn(arrowLeft.GetWidth(), arrowLeft.GetHeight()); - arrowLeftBtn.SetImage(&arrowLeftImg); - arrowLeftBtn.SetImageOver(&arrowLeftOverImg); - arrowLeftBtn.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - arrowLeftBtn.SetTrigger(trigA); - arrowLeftBtn.SetTrigger(trig2); - arrowLeftBtn.SetTrigger(&trigLeft); - arrowLeftBtn.SetSelectable(false); - arrowLeftBtn.SetUpdateCallback(ScreenPositionWindowLeftClick); - - GuiImageData arrowRight(button_arrow_right_png); - GuiImage arrowRightImg(&arrowRight); - GuiImageData arrowRightOver(button_arrow_right_over_png); - GuiImage arrowRightOverImg(&arrowRightOver); - GuiButton arrowRightBtn(arrowRight.GetWidth(), arrowRight.GetHeight()); - arrowRightBtn.SetImage(&arrowRightImg); - arrowRightBtn.SetImageOver(&arrowRightOverImg); - arrowRightBtn.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); - arrowRightBtn.SetTrigger(trigA); - arrowRightBtn.SetTrigger(trig2); - arrowRightBtn.SetTrigger(&trigRight); - arrowRightBtn.SetSelectable(false); - arrowRightBtn.SetUpdateCallback(ScreenPositionWindowRightClick); - - GuiImageData arrowUp(button_arrow_up_png); - GuiImage arrowUpImg(&arrowUp); - GuiImageData arrowUpOver(button_arrow_up_over_png); - GuiImage arrowUpOverImg(&arrowUpOver); - GuiButton arrowUpBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); - arrowUpBtn.SetImage(&arrowUpImg); - arrowUpBtn.SetImageOver(&arrowUpOverImg); - arrowUpBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - arrowUpBtn.SetTrigger(trigA); - arrowUpBtn.SetTrigger(trig2); - arrowUpBtn.SetTrigger(&trigUp); - arrowUpBtn.SetSelectable(false); - arrowUpBtn.SetUpdateCallback(ScreenPositionWindowUpClick); - - GuiImageData arrowDown(button_arrow_down_png); - GuiImage arrowDownImg(&arrowDown); - GuiImageData arrowDownOver(button_arrow_down_over_png); - GuiImage arrowDownOverImg(&arrowDownOver); - GuiButton arrowDownBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); - arrowDownBtn.SetImage(&arrowDownImg); - arrowDownBtn.SetImageOver(&arrowDownOverImg); - arrowDownBtn.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); - arrowDownBtn.SetTrigger(trigA); - arrowDownBtn.SetTrigger(trig2); - arrowDownBtn.SetTrigger(&trigDown); - arrowDownBtn.SetSelectable(false); - arrowDownBtn.SetUpdateCallback(ScreenPositionWindowDownClick); - - GuiImageData screenPosition(screen_position_png); - GuiImage screenPositionImg(&screenPosition); - screenPositionImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - - settingText = new GuiText(NULL, 20, (GXColor){0, 0, 0, 255}); - char shift[10]; - sprintf(shift, "%i, %i", GCSettings.xshift, GCSettings.yshift); - settingText->SetText(shift); - - int currentX = GCSettings.xshift; - int currentY = GCSettings.yshift; - - w->Append(&arrowLeftBtn); - w->Append(&arrowRightBtn); - w->Append(&arrowUpBtn); - w->Append(&arrowDownBtn); - w->Append(&screenPositionImg); - w->Append(settingText); - - if(!SettingWindow("Screen Position",w)) - { - // undo changes - GCSettings.xshift = currentX; - GCSettings.yshift = currentY; - } - - delete(w); - delete(settingText); -} - -static int MenuSettingsVideo() -{ - int menu = MENU_NONE; - int ret; - int i = 0; - bool firstRun = true; - OptionList options; - - sprintf(options.name[i++], "Rendering"); - sprintf(options.name[i++], "Scaling"); - if(IsGBAGame()) { - sprintf(options.name[i++], "GBA Screen Zoom"); - sprintf(options.name[i++], "GBA Fixed Pixel Ratio"); - } else { - sprintf(options.name[i++], "GB Screen Zoom"); - sprintf(options.name[i++], "GB Fixed Pixel Ratio"); - } - sprintf(options.name[i++], "Screen Position"); - sprintf(options.name[i++], "Video Mode"); - sprintf(options.name[i++], "GB Mono Colorization"); - sprintf(options.name[i++], "GB Palette"); - sprintf(options.name[i++], "GBA Frameskip"); - options.length = i; - - for(i=0; i < options.length; i++) - options.value[i][0] = 0; - - if(IsGBAGame()) - options.name[6][0] = 0; - - if(!IsGameboyGame()) - options.name[7][0] = 0; // disable palette option for GBA/GBC - - GuiText titleTxt("Game Settings - Video", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(50, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - GuiOptionBrowser optionBrowser(552, 248, &options); - optionBrowser.SetPosition(0, 108); - optionBrowser.SetCol2Position(240); - optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&backBtn); - mainWindow->Append(&optionBrowser); - mainWindow->Append(&w); - mainWindow->Append(&titleTxt); - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - ret = optionBrowser.GetClickedOption(); - - switch (ret) - { - case 0: - GCSettings.render++; - if (GCSettings.render > 4) - GCSettings.render = 1; - break; - - case 1: - GCSettings.scaling++; - if (GCSettings.scaling > 3) - GCSettings.scaling = 0; - // disable Widescreen correction in Wii mode - determined automatically - #ifdef HW_RVL - if(GCSettings.scaling == 3) - GCSettings.scaling = 0; - #endif - break; - - case 2: - ScreenZoomWindow(); - break; - - case 3: - if(IsGBAGame()) { - GCSettings.gbaFixed++; - if(GCSettings.gbaFixed > 3) - GCSettings.gbaFixed = 0; - } else { - GCSettings.gbFixed++; - if(GCSettings.gbFixed > 3) - GCSettings.gbFixed = 0; - } - break; - - case 4: - ScreenPositionWindow(); - break; - - case 5: - GCSettings.videomode++; - if(GCSettings.videomode > 6) - GCSettings.videomode = 0; - break; - - case 6: - GCSettings.colorize ^= 1; - break; - - case 7: - menu = MENU_GAMESETTINGS_PALETTE; - break; - - case 8: - GCSettings.gbaFrameskip ^= 1; - break; - } - - if(ret >= 0 || firstRun) - { - firstRun = false; - - if (GCSettings.render == 0) - sprintf (options.value[0], "Original"); - else if (GCSettings.render == 1) - sprintf (options.value[0], "Filtered (Auto)"); - else if (GCSettings.render == 2) - sprintf (options.value[0], "Unfiltered"); - else if (GCSettings.render == 3) - sprintf (options.value[0], "Filtered (Sharp)"); - else if (GCSettings.render == 4) - sprintf (options.value[0], "Filtered (Soft)"); - - if (GCSettings.scaling == 0) - sprintf (options.value[1], "Maintain Aspect Ratio"); - else if (GCSettings.scaling == 1) - sprintf (options.value[1], "Partial Stretch"); - else if (GCSettings.scaling == 2) - sprintf (options.value[1], "Stretch to Fit"); - else if (GCSettings.scaling == 3) - sprintf (options.value[1], "16:9 Correction"); - - int fixed; - if(IsGBAGame()) { - sprintf (options.value[2], "%.2f%%, %.2f%%", GCSettings.gbaZoomHor*100, GCSettings.gbaZoomVert*100); - fixed = GCSettings.gbaFixed; - } else { - sprintf (options.value[2], "%.2f%%, %.2f%%", GCSettings.gbZoomHor*100, GCSettings.gbZoomVert*100); - fixed = GCSettings.gbFixed; - } - - if (fixed) { - int w = fixed / 10; - int ratio = fixed % 10; - const char* widescreen = w - ? "(16:9 Correction)" - : ""; - - sprintf (options.value[3], "%dx %s", ratio, widescreen); - } else { - sprintf (options.value[3], "Disabled"); - } - - sprintf (options.value[4], "%d, %d", GCSettings.xshift, GCSettings.yshift); - - switch(GCSettings.videomode) - { - case 0: - sprintf (options.value[5], "Automatic (Recommended)"); break; - case 1: - sprintf (options.value[5], "NTSC (480i)"); break; - case 2: - sprintf (options.value[5], "NTSC (480p)"); break; - case 3: - sprintf (options.value[5], "PAL (576i)"); break; - case 4: - sprintf (options.value[5], "European RGB (240i)"); break; - case 5: - sprintf (options.value[5], "NTSC (240p)"); break; - case 6: - sprintf (options.value[5], "European RGB (240p)"); break; - } - - if (GCSettings.colorize) - sprintf (options.value[6], "On"); - else - sprintf (options.value[6], "Off"); - - if(strcmp(CurrentPalette.gameName, "default")) - sprintf(options.value[7], "Custom"); - else - sprintf(options.value[7], "Default"); - - if (GCSettings.gbaFrameskip) - sprintf (options.value[8], "On"); - else - sprintf (options.value[8], "Off"); - - optionBrowser.TriggerUpdate(); - } - - if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESETTINGS; - } - } - HaltGui(); - mainWindow->Remove(&optionBrowser); - mainWindow->Remove(&w); - mainWindow->Remove(&titleTxt); - return menu; -} - -static int MenuSettingsEmulation() -{ - int menu = MENU_NONE; - int ret; - int i = 0; - bool firstRun = true; - OptionList options; - - sprintf(options.name[i++], "Hardware (GB/GBC)"); - sprintf(options.name[i++], "Super Game Boy border"); - sprintf(options.name[i++], "Offset from UTC (hours)"); - sprintf(options.name[i++], "GB Screen Palette"); - options.length = i; - - for(i=0; i < options.length; i++) - options.value[i][0] = 0; - - GuiText titleTxt("Game Settings - Emulation", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(50, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - GuiOptionBrowser optionBrowser(552, 248, &options); - optionBrowser.SetPosition(0, 108); - optionBrowser.SetCol2Position(240); - optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&backBtn); - mainWindow->Append(&optionBrowser); - mainWindow->Append(&w); - mainWindow->Append(&titleTxt); - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - ret = optionBrowser.GetClickedOption(); - - switch (ret) - { - case 0: - GCSettings.GBHardware++; - if (GCSettings.GBHardware > 5) - GCSettings.GBHardware = 0; - break; - - case 1: - GCSettings.SGBBorder++; - if (GCSettings.SGBBorder > 2) - GCSettings.SGBBorder = 0; - break; - - case 2: - GCSettings.OffsetMinutesUTC += 15; - if (GCSettings.OffsetMinutesUTC > 60*14) { - GCSettings.OffsetMinutesUTC = -60*12; - } - break; - case 3: - GCSettings.BasicPalette ^= 1; - break; - } - - if(ret >= 0 || firstRun) - { - firstRun = false; - - if (GCSettings.GBHardware == 0) - sprintf (options.value[0], "Auto"); - else if (GCSettings.GBHardware == 1) - sprintf (options.value[0], "Game Boy Color"); - else if (GCSettings.GBHardware == 2) - sprintf (options.value[0], "Super Game Boy"); - else if (GCSettings.GBHardware == 3) - sprintf (options.value[0], "Game Boy"); - else if (GCSettings.GBHardware == 4) - sprintf (options.value[0], "Game Boy Advance"); - else if (GCSettings.GBHardware == 5) - sprintf (options.value[0], "Super Game Boy 2"); - - if (GCSettings.SGBBorder == 0) - sprintf (options.value[1], "Off"); - else if (GCSettings.SGBBorder == 1) - sprintf (options.value[1], "From game (SGB only)"); - else if (GCSettings.SGBBorder == 2) - sprintf (options.value[1], "From .png file"); - - sprintf (options.value[2], "%+.2f", GCSettings.OffsetMinutesUTC / 60.0); - - if (GCSettings.BasicPalette == 0) - sprintf (options.value[3], "Green Screen"); - else - sprintf (options.value[3], "Monochrome Screen"); - - - optionBrowser.TriggerUpdate(); - } - - if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_SETTINGS; - } - } - HaltGui(); - InitialisePalette(); - mainWindow->Remove(&optionBrowser); - mainWindow->Remove(&w); - mainWindow->Remove(&titleTxt); - return menu; -} - -/**************************************************************************** - * MenuSettings - ***************************************************************************/ -static int MenuSettings() -{ - int menu = MENU_NONE; - - GuiText titleTxt("Settings", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_long_png); - GuiImageData btnOutlineOver(button_long_over_png); - GuiImageData btnLargeOutline(button_large_png); - GuiImageData btnLargeOutlineOver(button_large_over_png); - GuiImageData iconFile(icon_settings_file_png); - GuiImageData iconMenu(icon_settings_menu_png); - GuiImageData iconNetwork(icon_settings_network_png); - GuiImageData iconEmulation(icon_game_settings_png); - - GuiText savingBtnTxt1("Saving", 22, (GXColor){0, 0, 0, 255}); - GuiText savingBtnTxt2("&", 18, (GXColor){0, 0, 0, 255}); - GuiText savingBtnTxt3("Loading", 22, (GXColor){0, 0, 0, 255}); - savingBtnTxt1.SetPosition(0, -20); - savingBtnTxt3.SetPosition(0, +20); - GuiImage savingBtnImg(&btnLargeOutline); - GuiImage savingBtnImgOver(&btnLargeOutlineOver); - GuiImage fileBtnIcon(&iconFile); - GuiButton savingBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - savingBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - savingBtn.SetPosition(-125, 120); - savingBtn.SetLabel(&savingBtnTxt1, 0); - savingBtn.SetLabel(&savingBtnTxt2, 1); - savingBtn.SetLabel(&savingBtnTxt3, 2); - savingBtn.SetImage(&savingBtnImg); - savingBtn.SetImageOver(&savingBtnImgOver); - savingBtn.SetIcon(&fileBtnIcon); - savingBtn.SetSoundOver(&btnSoundOver); - savingBtn.SetSoundClick(&btnSoundClick); - savingBtn.SetTrigger(trigA); - savingBtn.SetTrigger(trig2); - savingBtn.SetEffectGrow(); - - GuiText menuBtnTxt("Menu", 22, (GXColor){0, 0, 0, 255}); - menuBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); - GuiImage menuBtnImg(&btnLargeOutline); - GuiImage menuBtnImgOver(&btnLargeOutlineOver); - GuiImage menuBtnIcon(&iconMenu); - GuiButton menuBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - menuBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - menuBtn.SetPosition(125, 120); - menuBtn.SetLabel(&menuBtnTxt); - menuBtn.SetImage(&menuBtnImg); - menuBtn.SetImageOver(&menuBtnImgOver); - menuBtn.SetIcon(&menuBtnIcon); - menuBtn.SetSoundOver(&btnSoundOver); - menuBtn.SetSoundClick(&btnSoundClick); - menuBtn.SetTrigger(trigA); - menuBtn.SetTrigger(trig2); - menuBtn.SetEffectGrow(); - - GuiText networkBtnTxt("Network", 22, (GXColor){0, 0, 0, 255}); - networkBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); - GuiImage networkBtnImg(&btnLargeOutline); - GuiImage networkBtnImgOver(&btnLargeOutlineOver); - GuiImage networkBtnIcon(&iconNetwork); - GuiButton networkBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - networkBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - networkBtn.SetPosition(-125, 250); - networkBtn.SetLabel(&networkBtnTxt); - networkBtn.SetImage(&networkBtnImg); - networkBtn.SetImageOver(&networkBtnImgOver); - networkBtn.SetIcon(&networkBtnIcon); - networkBtn.SetSoundOver(&btnSoundOver); - networkBtn.SetSoundClick(&btnSoundClick); - networkBtn.SetTrigger(trigA); - networkBtn.SetTrigger(trig2); - networkBtn.SetEffectGrow(); - - GuiText emulationBtnTxt("Emulation", 22, (GXColor){0, 0, 0, 255}); - GuiImage emulationBtnImg(&btnLargeOutline); - GuiImage emulationBtnImgOver(&btnLargeOutlineOver); - GuiImage emulationBtnIcon(&iconEmulation); - GuiButton emulationBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); - emulationBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - emulationBtn.SetPosition(125, 250); - emulationBtn.SetLabel(&emulationBtnTxt); - emulationBtn.SetImage(&emulationBtnImg); - emulationBtn.SetImageOver(&emulationBtnImgOver); - emulationBtn.SetIcon(&emulationBtnIcon); - emulationBtn.SetSoundOver(&btnSoundOver); - emulationBtn.SetSoundClick(&btnSoundClick); - emulationBtn.SetTrigger(trigA); - emulationBtn.SetEffectGrow(); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(90, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - GuiText resetBtnTxt("Reset Settings", 22, (GXColor){0, 0, 0, 255}); - GuiImage resetBtnImg(&btnOutline); - GuiImage resetBtnImgOver(&btnOutlineOver); - GuiButton resetBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - resetBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); - resetBtn.SetPosition(-90, -35); - resetBtn.SetLabel(&resetBtnTxt); - resetBtn.SetImage(&resetBtnImg); - resetBtn.SetImageOver(&resetBtnImgOver); - resetBtn.SetSoundOver(&btnSoundOver); - resetBtn.SetSoundClick(&btnSoundClick); - resetBtn.SetTrigger(trigA); - resetBtn.SetTrigger(trig2); - resetBtn.SetEffectGrow(); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&titleTxt); - w.Append(&savingBtn); - w.Append(&menuBtn); - w.Append(&networkBtn); - w.Append(&emulationBtn); - w.Append(&backBtn); - w.Append(&resetBtn); - - mainWindow->Append(&w); - - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - if(savingBtn.GetState() == STATE_CLICKED) - { - menu = MENU_SETTINGS_FILE; - } - else if(menuBtn.GetState() == STATE_CLICKED) - { - menu = MENU_SETTINGS_MENU; - } - else if(networkBtn.GetState() == STATE_CLICKED) - { - menu = MENU_SETTINGS_NETWORK; - } - else if(emulationBtn.GetState() == STATE_CLICKED) - { - menu = MENU_SETTINGS_EMULATION; - } - else if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_GAMESELECTION; - } - else if(resetBtn.GetState() == STATE_CLICKED) - { - resetBtn.ResetState(); - - int choice = WindowPrompt( - "Reset Settings", - "Are you sure that you want to reset your settings?", - "Yes", - "No"); - - if(choice == 1) - DefaultSettings(); - } - } - - HaltGui(); - mainWindow->Remove(&w); - return menu; -} - -/**************************************************************************** - * MenuSettingsFile - ***************************************************************************/ - -static int MenuSettingsFile() -{ - int menu = MENU_NONE; - int ret; - int i = 0; - bool firstRun = true; - OptionList options; - sprintf(options.name[i++], "Load Device"); - sprintf(options.name[i++], "Save Device"); - sprintf(options.name[i++], "Load Folder"); - sprintf(options.name[i++], "Save Folder"); - sprintf(options.name[i++], "Screenshots Folder"); - sprintf(options.name[i++], "Covers Folder"); - sprintf(options.name[i++], "Artworks Folder"); - sprintf(options.name[i++], "Auto Load"); - sprintf(options.name[i++], "Auto Save"); - sprintf(options.name[i++], "Append Auto to .SAV Files"); - options.length = i; - - for(i=0; i < options.length; i++) - options.value[i][0] = 0; - - GuiText titleTxt("Settings - Saving & Loading", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_long_png); - GuiImageData btnOutlineOver(button_long_over_png); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(90, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - GuiOptionBrowser optionBrowser(552, 248, &options); - optionBrowser.SetPosition(0, 108); - optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - optionBrowser.SetCol2Position(215); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&backBtn); - mainWindow->Append(&optionBrowser); - mainWindow->Append(&w); - mainWindow->Append(&titleTxt); - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - ret = optionBrowser.GetClickedOption(); - - switch (ret) - { - case 0: - GCSettings.LoadMethod++; - break; - - case 1: - GCSettings.SaveMethod++; - break; - - case 2: - OnScreenKeyboard(GCSettings.LoadFolder, MAXPATHLEN); - break; - - case 3: - OnScreenKeyboard(GCSettings.SaveFolder, MAXPATHLEN); - break; - - case 4: - OnScreenKeyboard(GCSettings.ScreenshotsFolder, MAXPATHLEN); - break; - - case 5: - OnScreenKeyboard(GCSettings.CoverFolder, MAXPATHLEN); - break; - - case 6: - OnScreenKeyboard(GCSettings.ArtworkFolder, MAXPATHLEN); - break; - - case 7: - GCSettings.AutoLoad++; - if (GCSettings.AutoLoad > 2) - GCSettings.AutoLoad = 0; - break; - - case 8: - GCSettings.AutoSave++; - if (GCSettings.AutoSave > 3) - GCSettings.AutoSave = 0; - break; - - case 9: - GCSettings.AppendAuto++; - if (GCSettings.AppendAuto > 1) - GCSettings.AppendAuto = 0; - break; - } - - if(ret >= 0 || firstRun) - { - firstRun = false; - - // some load/save methods are not implemented - here's where we skip them - // they need to be skipped in the order they were enumerated - - // no SD/USB ports on GameCube - #ifdef HW_DOL - if(GCSettings.LoadMethod == DEVICE_SD) - GCSettings.LoadMethod++; - if(GCSettings.SaveMethod == DEVICE_SD) - GCSettings.SaveMethod++; - if(GCSettings.LoadMethod == DEVICE_USB) - GCSettings.LoadMethod++; - if(GCSettings.SaveMethod == DEVICE_USB) - GCSettings.SaveMethod++; - #endif - - // saving to DVD is impossible - if(GCSettings.SaveMethod == DEVICE_DVD) - GCSettings.SaveMethod++; - - // don't allow SD Gecko on Wii - #ifdef HW_RVL - if(GCSettings.LoadMethod == DEVICE_SD_SLOTA) - GCSettings.LoadMethod++; - if(GCSettings.SaveMethod == DEVICE_SD_SLOTA) - GCSettings.SaveMethod++; - if(GCSettings.LoadMethod == DEVICE_SD_SLOTB) - GCSettings.LoadMethod++; - if(GCSettings.SaveMethod == DEVICE_SD_SLOTB) - GCSettings.SaveMethod++; - #endif - - // correct load/save methods out of bounds - if(GCSettings.LoadMethod > 6) - GCSettings.LoadMethod = 0; - if(GCSettings.SaveMethod > 6) - GCSettings.SaveMethod = 0; - - if (GCSettings.LoadMethod == DEVICE_AUTO) sprintf (options.value[0],"Auto Detect"); - else if (GCSettings.LoadMethod == DEVICE_SD) sprintf (options.value[0],"SD"); - else if (GCSettings.LoadMethod == DEVICE_USB) sprintf (options.value[0],"USB"); - else if (GCSettings.LoadMethod == DEVICE_DVD) sprintf (options.value[0],"DVD"); - else if (GCSettings.LoadMethod == DEVICE_SMB) sprintf (options.value[0],"Network"); - else if (GCSettings.LoadMethod == DEVICE_SD_SLOTA) sprintf (options.value[0],"SD Gecko Slot A"); - else if (GCSettings.LoadMethod == DEVICE_SD_SLOTB) sprintf (options.value[0],"SD Gecko Slot B"); - - if (GCSettings.SaveMethod == DEVICE_AUTO) sprintf (options.value[1],"Auto Detect"); - else if (GCSettings.SaveMethod == DEVICE_SD) sprintf (options.value[1],"SD"); - else if (GCSettings.SaveMethod == DEVICE_USB) sprintf (options.value[1],"USB"); - else if (GCSettings.SaveMethod == DEVICE_SMB) sprintf (options.value[1],"Network"); - else if (GCSettings.SaveMethod == DEVICE_SD_SLOTA) sprintf (options.value[1],"SD Gecko Slot A"); - else if (GCSettings.SaveMethod == DEVICE_SD_SLOTB) sprintf (options.value[1],"SD Gecko Slot B"); - - snprintf (options.value[2], 35, "%s", GCSettings.LoadFolder); - snprintf (options.value[3], 35, "%s", GCSettings.SaveFolder); - snprintf (options.value[4], 35, "%s", GCSettings.ScreenshotsFolder); - snprintf (options.value[5], 35, "%s", GCSettings.CoverFolder); - snprintf (options.value[6], 35, "%s", GCSettings.ArtworkFolder); - - if (GCSettings.AutoLoad == 0) sprintf (options.value[7],"Off"); - else if (GCSettings.AutoLoad == 1) sprintf (options.value[7],"SRAM"); - else if (GCSettings.AutoLoad == 2) sprintf (options.value[7],"Snapshot"); - - if (GCSettings.AutoSave == 0) sprintf (options.value[8],"Off"); - else if (GCSettings.AutoSave == 1) sprintf (options.value[8],"SRAM"); - else if (GCSettings.AutoSave == 2) sprintf (options.value[8],"Snapshot"); - else if (GCSettings.AutoSave == 3) sprintf (options.value[8],"Both"); - - if (GCSettings.AppendAuto == 0) sprintf (options.value[9],"Off"); - else if (GCSettings.AppendAuto == 1) sprintf (options.value[9],"On"); - - optionBrowser.TriggerUpdate(); - } - - if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_SETTINGS; - } - } - HaltGui(); - mainWindow->Remove(&optionBrowser); - mainWindow->Remove(&w); - mainWindow->Remove(&titleTxt); - return menu; -} - -/**************************************************************************** - * MenuSettingsMenu - ***************************************************************************/ -static int MenuSettingsMenu() -{ - int menu = MENU_NONE; - int ret; - int i = 0; - bool firstRun = true; - OptionList options; - - sprintf(options.name[i++], "Exit Action"); - sprintf(options.name[i++], "Wiimote Orientation"); - sprintf(options.name[i++], "Music Volume"); - sprintf(options.name[i++], "Sound Effects Volume"); - sprintf(options.name[i++], "Rumble"); - sprintf(options.name[i++], "Language"); - sprintf(options.name[i++], "Preview Image"); - options.length = i; - - for(i=0; i < options.length; i++) - options.value[i][0] = 0; - - GuiText titleTxt("Settings - Menu", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_long_png); - GuiImageData btnOutlineOver(button_long_over_png); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(90, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - GuiOptionBrowser optionBrowser(552, 248, &options); - optionBrowser.SetPosition(0, 108); - optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - optionBrowser.SetCol2Position(275); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&backBtn); - mainWindow->Append(&optionBrowser); - mainWindow->Append(&w); - mainWindow->Append(&titleTxt); - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - ret = optionBrowser.GetClickedOption(); - - switch (ret) - { - case 0: - GCSettings.ExitAction++; - if(GCSettings.ExitAction > 3) - GCSettings.ExitAction = 0; - break; - case 1: - GCSettings.WiimoteOrientation ^= 1; - break; - case 2: - GCSettings.MusicVolume += 10; - if(GCSettings.MusicVolume > 100) - GCSettings.MusicVolume = 0; - bgMusic->SetVolume(GCSettings.MusicVolume); - break; - case 3: - GCSettings.SFXVolume += 10; - if(GCSettings.SFXVolume > 100) - GCSettings.SFXVolume = 0; - break; - case 4: - GCSettings.Rumble ^= 1; - break; - case 5: - GCSettings.language++; - - if(GCSettings.language >= LANG_LENGTH) - GCSettings.language = LANG_JAPANESE; - - if(GCSettings.language == LANG_SIMP_CHINESE) - GCSettings.language = LANG_PORTUGUESE; - else if(GCSettings.language == LANG_JAPANESE) - GCSettings.language = LANG_ENGLISH; - break; - case 6: - GCSettings.PreviewImage++; - if(GCSettings.PreviewImage > 2) - GCSettings.PreviewImage = 0; - break; - } - - if(ret >= 0 || firstRun) - { - firstRun = false; - - #ifdef HW_RVL - if (GCSettings.ExitAction == 1) - sprintf (options.value[0], "Return to Wii Menu"); - else if (GCSettings.ExitAction == 2) - sprintf (options.value[0], "Power off Wii"); - else if (GCSettings.ExitAction == 3) - sprintf (options.value[0], "Return to Loader"); - else - sprintf (options.value[0], "Auto"); - #else // GameCube - if(GCSettings.ExitAction > 1) - GCSettings.ExitAction = 0; - if (GCSettings.ExitAction == 0) - sprintf (options.value[0], "Return to Loader"); - else - sprintf (options.value[0], "Reboot"); - - options.name[1][0] = 0; // Wiimote - options.name[2][0] = 0; // Music - options.name[3][0] = 0; // Sound Effects - options.name[4][0] = 0; // Rumble - #endif - - if (GCSettings.WiimoteOrientation == 0) - sprintf (options.value[1], "Vertical"); - else if (GCSettings.WiimoteOrientation == 1) - sprintf (options.value[1], "Horizontal"); - - if(GCSettings.MusicVolume > 0) - sprintf(options.value[2], "%d%%", GCSettings.MusicVolume); - else - sprintf(options.value[2], "Mute"); - - if(GCSettings.SFXVolume > 0) - sprintf(options.value[3], "%d%%", GCSettings.SFXVolume); - else - sprintf(options.value[3], "Mute"); - - if (GCSettings.Rumble == 1) - sprintf (options.value[4], "Enabled"); - else - sprintf (options.value[4], "Disabled"); - - switch(GCSettings.language) - { - case LANG_JAPANESE: sprintf(options.value[5], "Japanese"); break; - case LANG_ENGLISH: sprintf(options.value[5], "English"); break; - case LANG_GERMAN: sprintf(options.value[5], "German"); break; - case LANG_FRENCH: sprintf(options.value[5], "French"); break; - case LANG_SPANISH: sprintf(options.value[5], "Spanish"); break; - case LANG_ITALIAN: sprintf(options.value[5], "Italian"); break; - case LANG_DUTCH: sprintf(options.value[5], "Dutch"); break; - case LANG_SIMP_CHINESE: sprintf(options.value[5], "Chinese (Simplified)"); break; - case LANG_TRAD_CHINESE: sprintf(options.value[5], "Chinese (Traditional)"); break; - case LANG_KOREAN: sprintf(options.value[5], "Korean"); break; - case LANG_PORTUGUESE: sprintf(options.value[5], "Portuguese"); break; - case LANG_BRAZILIAN_PORTUGUESE: sprintf(options.value[5], "Brazilian Portuguese"); break; - case LANG_CATALAN: sprintf(options.value[5], "Catalan"); break; - case LANG_TURKISH: sprintf(options.value[5], "Turkish"); break; - } - - switch(GCSettings.PreviewImage) - { - case 0: - sprintf(options.value[6], "Screenshots"); - snprintf(GCSettings.ImageFolder, MAXJOLIET, "%s", GCSettings.ScreenshotsFolder); - break; - case 1: - sprintf(options.value[6], "Covers"); - snprintf(GCSettings.ImageFolder, MAXJOLIET, "%s", GCSettings.CoverFolder); - break; - case 2: - sprintf(options.value[6], "Artworks"); - snprintf(GCSettings.ImageFolder, MAXJOLIET, "%s", GCSettings.ArtworkFolder); - break; - } - optionBrowser.TriggerUpdate(); - } - - if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_SETTINGS; - } - } - HaltGui(); - mainWindow->Remove(&optionBrowser); - mainWindow->Remove(&w); - mainWindow->Remove(&titleTxt); - ResetText(); - return menu; -} - -/**************************************************************************** - * MenuSettingsNetwork - ***************************************************************************/ -static int MenuSettingsNetwork() -{ - int menu = MENU_NONE; - int ret; - int i = 0; - bool firstRun = true; - OptionList options; - sprintf(options.name[i++], "SMB Share IP"); - sprintf(options.name[i++], "SMB Share Name"); - sprintf(options.name[i++], "SMB Share Username"); - sprintf(options.name[i++], "SMB Share Password"); - options.length = i; - - for(i=0; i < options.length; i++) - options.value[i][0] = 0; - - GuiText titleTxt("Settings - Network", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_long_png); - GuiImageData btnOutlineOver(button_long_over_png); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(90, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - GuiOptionBrowser optionBrowser(552, 248, &options); - optionBrowser.SetPosition(0, 108); - optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - optionBrowser.SetCol2Position(290); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&backBtn); - mainWindow->Append(&optionBrowser); - mainWindow->Append(&w); - mainWindow->Append(&titleTxt); - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - ret = optionBrowser.GetClickedOption(); - - switch (ret) - { - case 0: - OnScreenKeyboard(GCSettings.smbip, 16); - break; - - case 1: - OnScreenKeyboard(GCSettings.smbshare, 20); - break; - - case 2: - OnScreenKeyboard(GCSettings.smbuser, 20); - break; - - case 3: - OnScreenKeyboard(GCSettings.smbpwd, 20); - break; - } - - if(ret >= 0 || firstRun) - { - firstRun = false; - snprintf (options.value[0], 25, "%s", GCSettings.smbip); - snprintf (options.value[1], 19, "%s", GCSettings.smbshare); - snprintf (options.value[2], 19, "%s", GCSettings.smbuser); - snprintf (options.value[3], 19, "%s", GCSettings.smbpwd); - optionBrowser.TriggerUpdate(); - } - - if(backBtn.GetState() == STATE_CLICKED) - { - menu = MENU_SETTINGS; - } - } - HaltGui(); - mainWindow->Remove(&optionBrowser); - mainWindow->Remove(&w); - mainWindow->Remove(&titleTxt); - CloseShare(); - return menu; -} - - -static int redAmount=128, greenAmount=128, blueAmount=128; -static GuiText *redText; -static GuiText *greenText; -static GuiText *blueText; -static GuiText *sampleText; - -static void RGBWindowUpdate(void * ptr, int red, int green, int blue) -{ - GuiButton * b = (GuiButton *)ptr; - if(b->GetState() == STATE_CLICKED) - { - redAmount += red; - if (redAmount>255) redAmount=255; - else if (redAmount<0) redAmount=0; - greenAmount += green; - if (greenAmount>255) greenAmount=255; - else if (greenAmount<0) greenAmount=0; - blueAmount += blue; - if (blueAmount>255) blueAmount=255; - else if (blueAmount<0) blueAmount=0; - - redText->SetColor((GXColor){(u8)redAmount, 0, 0, 0xFF}); - greenText->SetColor((GXColor){0, (u8)greenAmount, 0, 0xFF}); - blueText->SetColor((GXColor){0, 0, (u8)blueAmount, 0xFF}); - sampleText->SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - - char shift[10]; - sprintf(shift, "%2x", redAmount); - redText->SetText(shift); - sprintf(shift, "%2x", greenAmount); - greenText->SetText(shift); - sprintf(shift, "%2x", blueAmount); - blueText->SetText(shift); - - b->ResetState(); - } -} - -static void LessRedClick(void * ptr) { RGBWindowUpdate(ptr, -8, 0, 0); } -static void LessGreenClick(void * ptr) { RGBWindowUpdate(ptr, 0, -8, 0); } -static void LessBlueClick(void * ptr) { RGBWindowUpdate(ptr, 0, 0, -8); } -static void MoreRedClick(void * ptr) { RGBWindowUpdate(ptr, +8, 0, 0); } -static void MoreGreenClick(void * ptr) { RGBWindowUpdate(ptr, 0, +8, 0); } -static void MoreBlueClick(void * ptr) { RGBWindowUpdate(ptr, 0, 0, +8); } - -static void PaletteWindow(const char *name) -{ - GuiWindow * w = new GuiWindow(500,480); - w->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - w->SetPosition(0, -10); - - GuiImageData arrowUp(button_arrow_up_png); - GuiImageData arrowDown(button_arrow_down_png); - GuiImageData arrowUpOver(button_arrow_up_over_png); - GuiImageData arrowDownOver(button_arrow_down_over_png); - - GuiImage moreRedImg(&arrowUp); - GuiImage moreRedOverImg(&arrowUpOver); - GuiButton moreRedBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); - moreRedBtn.SetImage(&moreRedImg); - moreRedBtn.SetImageOver(&moreRedOverImg); - moreRedBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - moreRedBtn.SetPosition(-150,-60); - moreRedBtn.SetTrigger(trigA); - moreRedBtn.SetTrigger(trig2); - moreRedBtn.SetSelectable(true); - moreRedBtn.SetUpdateCallback(MoreRedClick); - - GuiImage lessRedImg(&arrowDown); - GuiImage lessRedOverImg(&arrowDownOver); - GuiButton lessRedBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); - lessRedBtn.SetImage(&lessRedImg); - lessRedBtn.SetImageOver(&lessRedOverImg); - lessRedBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - lessRedBtn.SetPosition(-150,+50); - lessRedBtn.SetTrigger(trigA); - lessRedBtn.SetTrigger(trig2); - lessRedBtn.SetSelectable(true); - lessRedBtn.SetUpdateCallback(LessRedClick); - - GuiImage moreGreenImg(&arrowUp); - GuiImage moreGreenOverImg(&arrowUpOver); - GuiButton moreGreenBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); - moreGreenBtn.SetImage(&moreGreenImg); - moreGreenBtn.SetImageOver(&moreGreenOverImg); - moreGreenBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - moreGreenBtn.SetPosition(-50,-60); - moreGreenBtn.SetTrigger(trigA); - moreGreenBtn.SetTrigger(trig2); - moreGreenBtn.SetSelectable(true); - moreGreenBtn.SetUpdateCallback(MoreGreenClick); - - GuiImage lessGreenImg(&arrowDown); - GuiImage lessGreenOverImg(&arrowDownOver); - GuiButton lessGreenBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); - lessGreenBtn.SetImage(&lessGreenImg); - lessGreenBtn.SetImageOver(&lessGreenOverImg); - lessGreenBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - lessGreenBtn.SetPosition(-50,+50); - lessGreenBtn.SetTrigger(trigA); - lessGreenBtn.SetTrigger(trig2); - lessGreenBtn.SetSelectable(true); - lessGreenBtn.SetUpdateCallback(LessGreenClick); - - GuiImage moreBlueImg(&arrowUp); - GuiImage moreBlueOverImg(&arrowUpOver); - GuiButton moreBlueBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); - moreBlueBtn.SetImage(&moreBlueImg); - moreBlueBtn.SetImageOver(&moreBlueOverImg); - moreBlueBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - moreBlueBtn.SetPosition(50,-60); - moreBlueBtn.SetTrigger(trigA); - moreBlueBtn.SetTrigger(trig2); - moreBlueBtn.SetSelectable(true); - moreBlueBtn.SetUpdateCallback(MoreBlueClick); - - GuiImage lessBlueImg(&arrowDown); - GuiImage lessBlueOverImg(&arrowDownOver); - GuiButton lessBlueBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); - lessBlueBtn.SetImage(&lessBlueImg); - lessBlueBtn.SetImageOver(&lessBlueOverImg); - lessBlueBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - lessBlueBtn.SetPosition(50,+50); - lessBlueBtn.SetTrigger(trigA); - lessBlueBtn.SetTrigger(trig2); - lessBlueBtn.SetSelectable(true); - lessBlueBtn.SetUpdateCallback(LessBlueClick); - - GuiImageData box(screen_position_png); - - GuiImage redBoxImg(&box); - redBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - redBoxImg.SetPosition(-150, 0); - - GuiImage greenBoxImg(&box); - greenBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - greenBoxImg.SetPosition(-50, 0); - - GuiImage blueBoxImg(&box); - blueBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - blueBoxImg.SetPosition(+50, 0); - - char shift[10]; - redText = new GuiText(NULL, 20, (GXColor){128, 0, 0, 255}); - redText->SetPosition(-150,0); - sprintf(shift, "%2x", redAmount); - redText->SetText(shift); - - greenText = new GuiText(NULL, 20, (GXColor){0, 128, 0, 255}); - greenText->SetPosition(-50, 0); - sprintf(shift, "%2x", greenAmount); - greenText->SetText(shift); - - blueText = new GuiText(NULL, 20, (GXColor){0, 0, 128, 255}); - blueText->SetPosition(+50,0); - sprintf(shift, "%2x", blueAmount); - blueText->SetText(shift); - - sampleText = new GuiText(NULL, 20, (GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - sampleText->SetPosition(+150,0); - sampleText->SetText(name); - - int currentRed = redAmount; - int currentGreen = greenAmount; - int currentBlue = blueAmount; - - w->Append(&lessRedBtn); - w->Append(&moreRedBtn); - w->Append(&lessGreenBtn); - w->Append(&moreGreenBtn); - w->Append(&lessBlueBtn); - w->Append(&moreBlueBtn); - - w->Append(&redBoxImg); - w->Append(&greenBoxImg); - w->Append(&blueBoxImg); - - w->Append(sampleText); - w->Append(redText); - w->Append(greenText); - w->Append(blueText); - - if(!SettingWindow("Red Green Blue",w)) - { - redAmount = currentRed; // undo changes - greenAmount = currentGreen; - blueAmount = currentBlue; - } - - delete(w); - delete(redText); - delete(greenText); - delete(blueText); -} - -GXColor GetCol(int i) { - int c = 0; - u8 r=0, g=0, b=0; - if (unsigned(i) <= 13) - { - c = CurrentPalette.palette[i]; - r = (c >> 16) & 255; - g = (c >> 8) & 255; - b = (c) & 255; - - } - return (GXColor){r,g,b,255}; -} - -/**************************************************************************** - * MenuPalette - * - * Menu displayed when returning to the menu from in-game. - ***************************************************************************/ -static int MenuPalette() -{ - // We are now using a custom palette - strncpy(CurrentPalette.gameName, RomTitle, 17); - - int menu = MENU_NONE; - - GuiText titleTxt("Palette", 26, (GXColor){255, 255, 255, 255}); - titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); - titleTxt.SetPosition(50,50); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData btnOutline(button_png); - GuiImageData btnOutlineOver(button_over_png); - GuiImageData btnLargeOutline(button_large_png); - GuiImageData btnLargeOutlineOver(button_large_over_png); - GuiImageData btnCloseOutline(button_small_png); - GuiImageData btnCloseOutlineOver(button_small_over_png); - - GuiTrigger trigHome; - trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); - - GuiText bg0BtnTxt("BG 0", 24, GetCol(0)); - GuiImage bg0BtnImg(&btnCloseOutline); - GuiImage bg0BtnImgOver(&btnCloseOutlineOver); - GuiButton bg0Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - bg0Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - bg0Btn.SetPosition(-200, 120); - bg0Btn.SetLabel(&bg0BtnTxt); - bg0Btn.SetImage(&bg0BtnImg); - bg0Btn.SetImageOver(&bg0BtnImgOver); - bg0Btn.SetSoundOver(&btnSoundOver); - bg0Btn.SetSoundClick(&btnSoundClick); - bg0Btn.SetTrigger(trigA); - bg0Btn.SetTrigger(trig2); - bg0Btn.SetEffectGrow(); - - GuiText bg1BtnTxt("BG 1", 24, GetCol(1)); - GuiImage bg1BtnImg(&btnCloseOutline); - GuiImage bg1BtnImgOver(&btnCloseOutlineOver); - GuiButton bg1Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - bg1Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - bg1Btn.SetPosition(-200, 180); - bg1Btn.SetLabel(&bg1BtnTxt); - bg1Btn.SetImage(&bg1BtnImg); - bg1Btn.SetImageOver(&bg1BtnImgOver); - bg1Btn.SetSoundOver(&btnSoundOver); - bg1Btn.SetSoundClick(&btnSoundClick); - bg1Btn.SetTrigger(trigA); - bg1Btn.SetTrigger(trig2); - bg1Btn.SetEffectGrow(); - - GuiText bg2BtnTxt("BG 2", 24, GetCol(2)); - GuiImage bg2BtnImg(&btnCloseOutline); - GuiImage bg2BtnImgOver(&btnCloseOutlineOver); - GuiButton bg2Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - bg2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - bg2Btn.SetPosition(-200, 240); - bg2Btn.SetLabel(&bg2BtnTxt); - bg2Btn.SetImage(&bg2BtnImg); - bg2Btn.SetImageOver(&bg2BtnImgOver); - bg2Btn.SetSoundOver(&btnSoundOver); - bg2Btn.SetSoundClick(&btnSoundClick); - bg2Btn.SetTrigger(trigA); - bg2Btn.SetTrigger(trig2); - bg2Btn.SetEffectGrow(); - - GuiText bg3BtnTxt("BG 3", 24, GetCol(3)); - GuiImage bg3BtnImg(&btnCloseOutline); - GuiImage bg3BtnImgOver(&btnCloseOutlineOver); - GuiButton bg3Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - bg3Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - bg3Btn.SetPosition(-200, 300); - bg3Btn.SetLabel(&bg3BtnTxt); - bg3Btn.SetImage(&bg3BtnImg); - bg3Btn.SetImageOver(&bg3BtnImgOver); - bg3Btn.SetSoundOver(&btnSoundOver); - bg3Btn.SetSoundClick(&btnSoundClick); - bg3Btn.SetTrigger(trigA); - bg3Btn.SetTrigger(trig2); - bg3Btn.SetEffectGrow(); - - GuiText win0BtnTxt("WIN 0", 24, GetCol(4)); - GuiImage win0BtnImg(&btnCloseOutline); - GuiImage win0BtnImgOver(&btnCloseOutlineOver); - GuiButton win0Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - win0Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - win0Btn.SetPosition(-70, 120); - win0Btn.SetLabel(&win0BtnTxt); - win0Btn.SetImage(&win0BtnImg); - win0Btn.SetImageOver(&win0BtnImgOver); - win0Btn.SetSoundOver(&btnSoundOver); - win0Btn.SetSoundClick(&btnSoundClick); - win0Btn.SetTrigger(trigA); - win0Btn.SetTrigger(trig2); - win0Btn.SetEffectGrow(); - - GuiText win1BtnTxt("WIN 1", 24, GetCol(5)); - GuiImage win1BtnImg(&btnCloseOutline); - GuiImage win1BtnImgOver(&btnCloseOutlineOver); - GuiButton win1Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - win1Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - win1Btn.SetPosition(-70, 180); - win1Btn.SetLabel(&win1BtnTxt); - win1Btn.SetImage(&win1BtnImg); - win1Btn.SetImageOver(&win1BtnImgOver); - win1Btn.SetSoundOver(&btnSoundOver); - win1Btn.SetSoundClick(&btnSoundClick); - win1Btn.SetTrigger(trigA); - win1Btn.SetTrigger(trig2); - win1Btn.SetEffectGrow(); - - GuiText win2BtnTxt("WIN 2", 24, GetCol(6)); - GuiImage win2BtnImg(&btnCloseOutline); - GuiImage win2BtnImgOver(&btnCloseOutlineOver); - GuiButton win2Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - win2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - win2Btn.SetPosition(-70, 240); - win2Btn.SetLabel(&win2BtnTxt); - win2Btn.SetImage(&win2BtnImg); - win2Btn.SetImageOver(&win2BtnImgOver); - win2Btn.SetSoundOver(&btnSoundOver); - win2Btn.SetSoundClick(&btnSoundClick); - win2Btn.SetTrigger(trigA); - win2Btn.SetTrigger(trig2); - win2Btn.SetEffectGrow(); - - GuiText win3BtnTxt("WIN 3", 24, GetCol(7)); - GuiImage win3BtnImg(&btnCloseOutline); - GuiImage win3BtnImgOver(&btnCloseOutlineOver); - GuiButton win3Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - win3Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - win3Btn.SetPosition(-70, 300); - win3Btn.SetLabel(&win3BtnTxt); - win3Btn.SetImage(&win3BtnImg); - win3Btn.SetImageOver(&win3BtnImgOver); - win3Btn.SetSoundOver(&btnSoundOver); - win3Btn.SetSoundClick(&btnSoundClick); - win3Btn.SetTrigger(trigA); - win3Btn.SetTrigger(trig2); - win3Btn.SetEffectGrow(); - - GuiText obj0BtnTxt("OBJ 0", 24, GetCol(8)); - GuiImage obj0BtnImg(&btnCloseOutline); - GuiImage obj0BtnImgOver(&btnCloseOutlineOver); - GuiButton obj0Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - obj0Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - obj0Btn.SetPosition(+70, 120); - obj0Btn.SetLabel(&obj0BtnTxt); - obj0Btn.SetImage(&obj0BtnImg); - obj0Btn.SetImageOver(&obj0BtnImgOver); - obj0Btn.SetSoundOver(&btnSoundOver); - obj0Btn.SetSoundClick(&btnSoundClick); - obj0Btn.SetTrigger(trigA); - obj0Btn.SetTrigger(trig2); - obj0Btn.SetEffectGrow(); - - GuiText obj1BtnTxt("OBJ 1", 24, GetCol(9)); - GuiImage obj1BtnImg(&btnCloseOutline); - GuiImage obj1BtnImgOver(&btnCloseOutlineOver); - GuiButton obj1Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - obj1Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - obj1Btn.SetPosition(+70, 180); - obj1Btn.SetLabel(&obj1BtnTxt); - obj1Btn.SetImage(&obj1BtnImg); - obj1Btn.SetImageOver(&obj1BtnImgOver); - obj1Btn.SetSoundOver(&btnSoundOver); - obj1Btn.SetSoundClick(&btnSoundClick); - obj1Btn.SetTrigger(trigA); - obj1Btn.SetTrigger(trig2); - obj1Btn.SetEffectGrow(); - - GuiText obj2BtnTxt("OBJ 2", 24, GetCol(10)); - GuiImage obj2BtnImg(&btnCloseOutline); - GuiImage obj2BtnImgOver(&btnCloseOutlineOver); - GuiButton obj2Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - obj2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - obj2Btn.SetPosition(+70, 240); - obj2Btn.SetLabel(&obj2BtnTxt); - obj2Btn.SetImage(&obj2BtnImg); - obj2Btn.SetImageOver(&obj2BtnImgOver); - obj2Btn.SetSoundOver(&btnSoundOver); - obj2Btn.SetSoundClick(&btnSoundClick); - obj2Btn.SetTrigger(trigA); - obj2Btn.SetTrigger(trig2); - obj2Btn.SetEffectGrow(); - - GuiText spr0BtnTxt("SPR 0", 24, GetCol(11)); - GuiImage spr0BtnImg(&btnCloseOutline); - GuiImage spr0BtnImgOver(&btnCloseOutlineOver); - GuiButton spr0Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - spr0Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - spr0Btn.SetPosition(+200, 120); - spr0Btn.SetLabel(&spr0BtnTxt); - spr0Btn.SetImage(&spr0BtnImg); - spr0Btn.SetImageOver(&spr0BtnImgOver); - spr0Btn.SetSoundOver(&btnSoundOver); - spr0Btn.SetSoundClick(&btnSoundClick); - spr0Btn.SetTrigger(trigA); - spr0Btn.SetTrigger(trig2); - spr0Btn.SetEffectGrow(); - - GuiText spr1BtnTxt("SPR 1", 24, GetCol(12)); - GuiImage spr1BtnImg(&btnCloseOutline); - GuiImage spr1BtnImgOver(&btnCloseOutlineOver); - GuiButton spr1Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - spr1Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - spr1Btn.SetPosition(+200, 180); - spr1Btn.SetLabel(&spr1BtnTxt); - spr1Btn.SetImage(&spr1BtnImg); - spr1Btn.SetImageOver(&spr1BtnImgOver); - spr1Btn.SetSoundOver(&btnSoundOver); - spr1Btn.SetSoundClick(&btnSoundClick); - spr1Btn.SetTrigger(trigA); - spr1Btn.SetTrigger(trig2); - spr1Btn.SetEffectGrow(); - - GuiText spr2BtnTxt("SPR 2", 24, GetCol(13)); - GuiImage spr2BtnImg(&btnCloseOutline); - GuiImage spr2BtnImgOver(&btnCloseOutlineOver); - GuiButton spr2Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - spr2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - spr2Btn.SetPosition(+200, 240); - spr2Btn.SetLabel(&spr2BtnTxt); - spr2Btn.SetImage(&spr2BtnImg); - spr2Btn.SetImageOver(&spr2BtnImgOver); - spr2Btn.SetSoundOver(&btnSoundOver); - spr2Btn.SetSoundClick(&btnSoundClick); - spr2Btn.SetTrigger(trigA); - spr2Btn.SetTrigger(trig2); - spr2Btn.SetEffectGrow(); - - GuiText importBtnTxt("Load / Save", 22, (GXColor){0, 0, 0, 255}); - importBtnTxt.SetWrap(true, btnOutline.GetWidth()-30); - GuiImage importBtnImg(&btnOutline); - GuiImage importBtnImgOver(&btnOutlineOver); - GuiButton importBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - importBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - importBtn.SetPosition(140, 300); - importBtn.SetLabel(&importBtnTxt); - importBtn.SetImage(&importBtnImg); - importBtn.SetImageOver(&importBtnImgOver); - importBtn.SetSoundOver(&btnSoundOver); - importBtn.SetSoundClick(&btnSoundClick); - importBtn.SetTrigger(trigA); - importBtn.SetTrigger(trig2); - importBtn.SetEffectGrow(); - - GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); - GuiImage closeBtnImg(&btnCloseOutline); - GuiImage closeBtnImgOver(&btnCloseOutlineOver); - GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); - closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - closeBtn.SetPosition(-50, 35); - closeBtn.SetLabel(&closeBtnTxt); - closeBtn.SetImage(&closeBtnImg); - closeBtn.SetImageOver(&closeBtnImgOver); - closeBtn.SetSoundOver(&btnSoundOver); - closeBtn.SetSoundClick(&btnSoundClick); - closeBtn.SetTrigger(trigA); - closeBtn.SetTrigger(trig2); - closeBtn.SetTrigger(&trigHome); - closeBtn.SetEffectGrow(); - - GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); - GuiImage backBtnImg(&btnOutline); - GuiImage backBtnImgOver(&btnOutlineOver); - GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); - backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - backBtn.SetPosition(100, -35); - backBtn.SetLabel(&backBtnTxt); - backBtn.SetImage(&backBtnImg); - backBtn.SetImageOver(&backBtnImgOver); - backBtn.SetSoundOver(&btnSoundOver); - backBtn.SetSoundClick(&btnSoundClick); - backBtn.SetTrigger(trigA); - backBtn.SetTrigger(trig2); - backBtn.SetEffectGrow(); - - HaltGui(); - GuiWindow w(screenwidth, screenheight); - w.Append(&titleTxt); - w.Append(&bg0Btn); - w.Append(&bg1Btn); - w.Append(&bg2Btn); - w.Append(&bg3Btn); - w.Append(&win0Btn); - w.Append(&win1Btn); - w.Append(&win2Btn); - w.Append(&win3Btn); - w.Append(&obj0Btn); - w.Append(&obj1Btn); - w.Append(&obj2Btn); - w.Append(&spr0Btn); - w.Append(&spr1Btn); - w.Append(&spr2Btn); - w.Append(&importBtn); - w.Append(&closeBtn); - w.Append(&backBtn); - - mainWindow->Append(&w); - - ResumeGui(); - - while(menu == MENU_NONE) - { - usleep(THREAD_SLEEP); - - if(bg0Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[0] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[0] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[0] >> 0) & 0xFF; - PaletteWindow("BG 0"); - CurrentPalette.palette[0] = redAmount << 16 | greenAmount << 8 | blueAmount; - bg0BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - bg0Btn.ResetState(); - } - else if(bg1Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[1] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[1] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[1] >> 0) & 0xFF; - PaletteWindow("BG 1"); - CurrentPalette.palette[1] = redAmount << 16 | greenAmount << 8 | blueAmount; - bg1BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - bg1Btn.ResetState(); - } - else if(bg2Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[2] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[2] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[2] >> 0) & 0xFF; - PaletteWindow("BG 2"); - CurrentPalette.palette[2] = redAmount << 16 | greenAmount << 8 | blueAmount; - bg2BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - bg2Btn.ResetState(); - } - else if(bg3Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[3] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[3] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[3] >> 0) & 0xFF; - PaletteWindow("BG 3"); - CurrentPalette.palette[3] = redAmount << 16 | greenAmount << 8 | blueAmount; - bg3BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - bg3Btn.ResetState(); - } - else if(win0Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[4] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[4] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[4] >> 0) & 0xFF; - PaletteWindow("WIN 0"); - CurrentPalette.palette[4] = redAmount << 16 | greenAmount << 8 | blueAmount; - win0BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - win0Btn.ResetState(); - } - else if(win1Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[5] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[5] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[5] >> 0) & 0xFF; - PaletteWindow("WIN 1"); - CurrentPalette.palette[5] = redAmount << 16 | greenAmount << 8 | blueAmount; - win1BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - win1Btn.ResetState(); - } - else if(win2Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[6] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[6] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[6] >> 0) & 0xFF; - PaletteWindow("WIN 2"); - CurrentPalette.palette[6] = redAmount << 16 | greenAmount << 8 | blueAmount; - win2BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - win2Btn.ResetState(); - } - else if(win3Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[7] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[7] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[7] >> 0) & 0xFF; - PaletteWindow("WIN 3"); - CurrentPalette.palette[7] = redAmount << 16 | greenAmount << 8 | blueAmount; - win3BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - win3Btn.ResetState(); - } - else if(obj0Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[8] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[8] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[8] >> 0) & 0xFF; - PaletteWindow("OBJ 0"); - CurrentPalette.palette[8] = redAmount << 16 | greenAmount << 8 | blueAmount; - obj0BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - obj0Btn.ResetState(); - } - else if(obj1Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[9] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[9] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[9] >> 0) & 0xFF; - PaletteWindow("OBJ 1"); - CurrentPalette.palette[9] = redAmount << 16 | greenAmount << 8 | blueAmount; - obj1BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - obj1Btn.ResetState(); - } - else if(obj2Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[10] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[10] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[10] >> 0) & 0xFF; - PaletteWindow("OBJ 2"); - CurrentPalette.palette[10] = redAmount << 16 | greenAmount << 8 | blueAmount; - obj2BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - obj2Btn.ResetState(); - } - else if(spr0Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[11] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[11] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[11] >> 0) & 0xFF; - PaletteWindow("SPR 0"); - CurrentPalette.palette[11] = redAmount << 16 | greenAmount << 8 | blueAmount; - spr0BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - spr0Btn.ResetState(); - } - else if(spr1Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[12] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[12] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[12] >> 0) & 0xFF; - PaletteWindow("SPR 1"); - CurrentPalette.palette[12] = redAmount << 16 | greenAmount << 8 | blueAmount; - spr1BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - spr1Btn.ResetState(); - } - else if(spr2Btn.GetState() == STATE_CLICKED) - { - redAmount = (CurrentPalette.palette[13] >> 16) & 0xFF; - greenAmount = (CurrentPalette.palette[13] >> 8) & 0xFF; - blueAmount = (CurrentPalette.palette[13] >> 0) & 0xFF; - PaletteWindow("SPR 2"); - CurrentPalette.palette[13] = redAmount << 16 | greenAmount << 8 | blueAmount; - spr2BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); - spr2Btn.ResetState(); - } - else if(importBtn.GetState() == STATE_CLICKED) - { - SavePaletteAs(NOTSILENT, RomTitle); - menu = MENU_GAMESETTINGS_PALETTE; - } - else if(closeBtn.GetState() == STATE_CLICKED) - { - menu = MENU_EXIT; - SavePaletteAs(SILENT, RomTitle); - - exitSound->Play(); - bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); - backBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); - - w.SetEffect(EFFECT_FADE, -15); - - usleep(350000); // wait for effects to finish - } - else if(backBtn.GetState() == STATE_CLICKED) - { - SavePaletteAs(SILENT, RomTitle); - menu = MENU_GAMESETTINGS_VIDEO; - } - } - - HaltGui(); - mainWindow->Remove(&w); - return menu; -} - -/**************************************************************************** - * MainMenu - ***************************************************************************/ -void -MainMenu (int menu) -{ - static bool init = false; - int currentMenu = menu; - lastMenu = MENU_NONE; - - if(!init) - { - init = true; - #ifdef HW_RVL - pointer[0] = new GuiImageData(player1_point_png); - pointer[1] = new GuiImageData(player2_point_png); - pointer[2] = new GuiImageData(player3_point_png); - pointer[3] = new GuiImageData(player4_point_png); - #endif - - trigA = new GuiTrigger; - trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - trig2 = new GuiTrigger; - trig2->SetSimpleTrigger(-1, WPAD_BUTTON_2, 0); - } - - mainWindow = new GuiWindow(screenwidth, screenheight); - - if(menu == MENU_GAME) - { - gameScreen = new GuiImageData(gameScreenPng); - gameScreenImg = new GuiImage(gameScreen); - gameScreenImg->SetAlpha(192); - gameScreenImg->ColorStripe(30); - gameScreenImg->SetScaleX(screenwidth/(float)vmode->fbWidth); - gameScreenImg->SetScaleY(screenheight/(float)vmode->efbHeight); - } - else - { - gameScreenImg = new GuiImage(screenwidth, screenheight, (GXColor){236, 226, 238, 255}); - gameScreenImg->ColorStripe(10); - } - - mainWindow->Append(gameScreenImg); - - GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); - GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); - GuiImageData bgTop(bg_top_png); - bgTopImg = new GuiImage(&bgTop); - GuiImageData bgBottom(bg_bottom_png); - bgBottomImg = new GuiImage(&bgBottom); - bgBottomImg->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); - GuiImageData logo(logo_png); - GuiImage logoImg(&logo); - GuiImageData logoOver(logo_over_png); - GuiImage logoImgOver(&logoOver); - GuiText logoTxt(APPVERSION, 18, (GXColor){255, 255, 255, 255}); - logoTxt.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - logoTxt.SetPosition(0, 4); - btnLogo = new GuiButton(logoImg.GetWidth(), logoImg.GetHeight()); - btnLogo->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - btnLogo->SetPosition(-50, 24); - btnLogo->SetImage(&logoImg); - btnLogo->SetImageOver(&logoImgOver); - btnLogo->SetLabel(&logoTxt); - btnLogo->SetSoundOver(&btnSoundOver); - btnLogo->SetSoundClick(&btnSoundClick); - btnLogo->SetTrigger(trigA); - btnLogo->SetTrigger(trig2); - btnLogo->SetUpdateCallback(WindowCredits); - - mainWindow->Append(bgTopImg); - mainWindow->Append(bgBottomImg); - mainWindow->Append(btnLogo); - - if(currentMenu == MENU_GAMESELECTION) - ResumeGui(); - - // Load preferences - if(!LoadPrefs()) - SavePrefs(SILENT); - -#ifdef HW_RVL - static bool checkIOS = true; - - if(checkIOS) - { - u32 ios = IOS_GetVersion(); - - if(!SupportedIOS(ios)) - ErrorPrompt("The current IOS is unsupported. Functionality and/or stability may be adversely affected."); - else if(!SaneIOS(ios)) - ErrorPrompt("The current IOS has been altered (fake-signed). Functionality and/or stability may be adversely affected."); - } - - checkIOS = false; -#endif - - // Load palettes - LoadPalettes(); - - #ifndef NO_SOUND - bgMusic = new GuiSound(bg_music_ogg, bg_music_ogg_size, SOUND_OGG); - bgMusic->SetVolume(GCSettings.MusicVolume); - bgMusic->SetLoop(true); - enterSound = new GuiSound(enter_ogg, enter_ogg_size, SOUND_OGG); - enterSound->SetVolume(GCSettings.SFXVolume); - exitSound = new GuiSound(exit_ogg, exit_ogg_size, SOUND_OGG); - exitSound->SetVolume(GCSettings.SFXVolume); - if(currentMenu == MENU_GAMESELECTION) bgMusic->Play(); // startup music - #endif - - while(currentMenu != MENU_EXIT || !ROMLoaded) - { - switch (currentMenu) - { - case MENU_GAMESELECTION: - currentMenu = MenuGameSelection(); - break; - case MENU_GAME: - currentMenu = MenuGame(); - break; - case MENU_GAME_LOAD: - currentMenu = MenuGameSaves(0); - break; - case MENU_GAME_SAVE: - currentMenu = MenuGameSaves(1); - break; - case MENU_GAME_DELETE: - currentMenu = MenuGameSaves(2); - break; - case MENU_GAMESETTINGS: - currentMenu = MenuGameSettings(); - break; - case MENU_GAMESETTINGS_MAPPINGS: - currentMenu = MenuSettingsMappings(); - break; - case MENU_GAMESETTINGS_MAPPINGS_MAP: - currentMenu = MenuSettingsMappingsMap(); - break; - case MENU_GAMESETTINGS_VIDEO: - currentMenu = MenuSettingsVideo(); - break; - case MENU_GAMESETTINGS_PALETTE: - currentMenu = MenuPalette(); - break; - case MENU_SETTINGS: - currentMenu = MenuSettings(); - break; - case MENU_SETTINGS_FILE: - currentMenu = MenuSettingsFile(); - break; - case MENU_SETTINGS_MENU: - currentMenu = MenuSettingsMenu(); - break; - case MENU_SETTINGS_NETWORK: - currentMenu = MenuSettingsNetwork(); - break; - case MENU_SETTINGS_EMULATION: - currentMenu = MenuSettingsEmulation(); - break; - default: // unrecognized menu - currentMenu = MenuGameSelection(); - break; - } - lastMenu = currentMenu; - usleep(THREAD_SLEEP); - } - - #ifdef HW_RVL - ShutoffRumble(); - #endif - - CancelAction(); - HaltGui(); - - #ifdef HW_RVL - if(updatethread != LWP_THREAD_NULL) - LWP_JoinThread(updatethread, NULL); - #endif - - #ifndef NO_SOUND - delete bgMusic; - delete enterSound; - delete exitSound; - #endif - - delete btnLogo; - delete gameScreenImg; - delete bgTopImg; - delete bgBottomImg; - delete mainWindow; - - mainWindow = NULL; - - if(gameScreen) - delete gameScreen; - - if(gameScreenPng) - { - free(gameScreenPng); - gameScreenPng = NULL; - } - - // wait for keys to be depressed - while(MenuRequested()) - { - UpdatePads(); - usleep(THREAD_SLEEP); - } -} +/**************************************************************************** + * Visual Boy Advance GX + * + * Tantric 2008-2009 + * + * menu.cpp + * + * Menu flow routines - handles all menu logic + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#ifdef HW_RVL +#include +#include +#include +#endif + +#include "vbagx.h" +#include "vbasupport.h" +#include "video.h" +#include "filebrowser.h" +#include "gcunzip.h" +#include "networkop.h" +#include "fileop.h" +#include "preferences.h" +#include "button_mapping.h" +#include "input.h" +#include "filelist.h" +#include "menu.h" +#include "gamesettings.h" +#include "gui/gui.h" +#include "utils/gettext.h" + +#define THREAD_SLEEP 100 + +#ifdef HW_RVL +GuiImageData * pointer[4]; +#endif + +#ifdef HW_RVL + #include "mem2.h" + + #define MEM_ALLOC(A) (u8*)mem2_malloc(A) + #define MEM_DEALLOC(A) mem2_free(A) +#else + #define MEM_ALLOC(A) (u8*)memalign(32, A) + #define MEM_DEALLOC(A) free(A) +#endif + +static GuiTrigger * trigA = NULL; +static GuiTrigger * trig2 = NULL; + +static GuiButton * btnLogo = NULL; +static GuiImageData * gameScreen = NULL; +static GuiImage * gameScreenImg = NULL; +static GuiImage * bgTopImg = NULL; +static GuiImage * bgBottomImg = NULL; +static GuiSound * bgMusic = NULL; +static GuiSound * enterSound = NULL; +static GuiSound * exitSound = NULL; +static GuiWindow * mainWindow = NULL; +static GuiText * settingText = NULL; +static GuiText * settingText2 = NULL; +static int lastMenu = MENU_NONE; +static int mapMenuCtrl = 0; +static int wiiuproCtrl = 0; + +static lwp_t guithread = LWP_THREAD_NULL; +static lwp_t progressthread = LWP_THREAD_NULL; +#ifdef HW_RVL +static lwp_t updatethread = LWP_THREAD_NULL; +#endif +static bool guiHalt = true; +static int showProgress = 0; + +static char progressTitle[101]; +static char progressMsg[201]; +static int progressDone = 0; +static int progressTotal = 0; + +/**************************************************************************** + * ResumeGui + * + * Signals the GUI thread to start, and resumes the thread. This is called + * after finishing the removal/insertion of new elements, and after initial + * GUI setup. + ***************************************************************************/ +static void +ResumeGui() +{ + guiHalt = false; + LWP_ResumeThread (guithread); +} + +/**************************************************************************** + * HaltGui + * + * Signals the GUI thread to stop, and waits for GUI thread to stop + * This is necessary whenever removing/inserting new elements into the GUI. + * This eliminates the possibility that the GUI is in the middle of accessing + * an element that is being changed. + ***************************************************************************/ +static void +HaltGui() +{ + guiHalt = true; + + // wait for thread to finish + while(!LWP_ThreadIsSuspended(guithread)) + usleep(THREAD_SLEEP); +} + +void ResetText() +{ + LoadLanguage(); + + if(mainWindow) + mainWindow->ResetText(); +} + +/**************************************************************************** + * WindowPrompt + * + * Displays a prompt window to user, with information, an error message, or + * presenting a user with a choice + ***************************************************************************/ +int +WindowPrompt(const char *title, const char *msg, const char *btn1Label, const char *btn2Label, bool btn1Default) +{ + if(!mainWindow || ExitRequested || ShutdownRequested) + return 0; + + int choice = -1; + + GuiWindow promptWindow(448,288); + promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + promptWindow.SetPosition(0, -10); + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_prompt_png); + GuiImageData btnOutlineOver(button_prompt_over_png); + + GuiImageData dialogBox(dialogue_box_png); + GuiImage dialogBoxImg(&dialogBox); + + GuiText titleTxt(title, 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + titleTxt.SetPosition(0,14); + GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255}); + msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + msgTxt.SetPosition(0,-20); + msgTxt.SetWrap(true, 430); + + GuiText btn1Txt(btn1Label, 22, (GXColor){0, 0, 0, 255}); + GuiImage btn1Img(&btnOutline); + GuiImage btn1ImgOver(&btnOutlineOver); + GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight()); + + if(btn2Label) + { + btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + btn1.SetPosition(20, -25); + } + else + { + btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); + btn1.SetPosition(0, -25); + } + + btn1.SetLabel(&btn1Txt); + btn1.SetImage(&btn1Img); + btn1.SetImageOver(&btn1ImgOver); + btn1.SetSoundOver(&btnSoundOver); + btn1.SetSoundClick(&btnSoundClick); + btn1.SetTrigger(trigA); + btn1.SetTrigger(trig2); + btn1.SetState(STATE_SELECTED); + btn1.SetEffectGrow(); + + GuiText btn2Txt(btn2Label, 22, (GXColor){0, 0, 0, 255}); + GuiImage btn2Img(&btnOutline); + GuiImage btn2ImgOver(&btnOutlineOver); + GuiButton btn2(btnOutline.GetWidth(), btnOutline.GetHeight()); + btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + btn2.SetPosition(-20, -25); + btn2.SetLabel(&btn2Txt); + btn2.SetImage(&btn2Img); + btn2.SetImageOver(&btn2ImgOver); + btn2.SetSoundOver(&btnSoundOver); + btn2.SetSoundClick(&btnSoundClick); + btn2.SetTrigger(trigA); + btn2.SetTrigger(trig2); + btn2.SetEffectGrow(); + + promptWindow.Append(&dialogBoxImg); + promptWindow.Append(&titleTxt); + promptWindow.Append(&msgTxt); + promptWindow.Append(&btn1); + + if(btn2Label) + promptWindow.Append(&btn2); + + promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50); + CancelAction(); + HaltGui(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&promptWindow); + mainWindow->ChangeFocus(&promptWindow); + if(btn2Label) + { + if (btn1Default) + { + btn2.ResetState(); + btn1.SetState(STATE_SELECTED); + } + else + { + btn1.ResetState(); + btn2.SetState(STATE_SELECTED); + } + } + ResumeGui(); + + while(choice == -1) + { + usleep(THREAD_SLEEP); + + if(btn1.GetState() == STATE_CLICKED) + choice = 1; + else if(btn2.GetState() == STATE_CLICKED) + choice = 0; + } + + promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50); + while(promptWindow.GetEffect() > 0) usleep(THREAD_SLEEP); + HaltGui(); + mainWindow->Remove(&promptWindow); + mainWindow->SetState(STATE_DEFAULT); + ResumeGui(); + return choice; +} + +int +WindowPrompt(const char *title, const char *msg, const char *btn1Label, const char *btn2Label) +{ + return WindowPrompt(title, msg, btn1Label, btn2Label, false); +} + +#ifdef HW_RVL +/**************************************************************************** + * EmulatorUpdate + * + * Prompts for confirmation, and downloads/installs updates + ***************************************************************************/ +static void * +EmulatorUpdate (void *arg) +{ + bool installUpdate = WindowPrompt( + "Update Available", + "An update is available!", + "Update now", + "Update later"); + if(installUpdate) + if(DownloadUpdate()) + ExitRequested = 1; + return NULL; +} +#endif + +/**************************************************************************** + * UpdateGUI + * + * Primary thread to allow GUI to respond to state changes, and draws GUI + ***************************************************************************/ +static void * +UpdateGUI (void *arg) +{ + int i; + + while(1) + { + if(guiHalt) + LWP_SuspendThread(guithread); + + UpdatePads(); + mainWindow->Draw(); + + if (mainWindow->GetState() != STATE_DISABLED) + mainWindow->DrawTooltip(); + + #ifdef HW_RVL + i = 3; + do + { + if(userInput[i].wpad->ir.valid) + Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48, + 96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255); + DoRumble(i); + --i; + } while(i>=0); + #endif + + Menu_Render(); + + mainWindow->Update(&userInput[3]); + mainWindow->Update(&userInput[2]); + mainWindow->Update(&userInput[1]); + mainWindow->Update(&userInput[0]); + + #ifdef HW_RVL + if(updateFound) + { + updateFound = false; + if(!loadingFile) + LWP_CreateThread (&updatethread, EmulatorUpdate, NULL, NULL, 0, 70); + } + #endif + + if(ExitRequested || ShutdownRequested) + { + for(i = 0; i <= 255; i += 15) + { + mainWindow->Draw(); + Menu_DrawRectangle(0,0,screenwidth,screenheight,(GXColor){0, 0, 0, (u8)i},1); + Menu_Render(); + } + ExitApp(); + } + usleep(THREAD_SLEEP); + } + return NULL; +} + +/**************************************************************************** + * ProgressWindow + * + * Opens a window, which displays progress to the user. Can either display a + * progress bar showing % completion, or a throbber that only shows that an + * action is in progress. + ***************************************************************************/ +static int progsleep = 0; + +static void +ProgressWindow(char *title, char *msg) +{ + GuiWindow promptWindow(448,288); + promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + promptWindow.SetPosition(0, -10); + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiImageData dialogBox(dialogue_box_png); + GuiImage dialogBoxImg(&dialogBox); + + GuiImageData progressbarOutline(progressbar_outline_png); + GuiImage progressbarOutlineImg(&progressbarOutline); + progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + progressbarOutlineImg.SetPosition(25, 40); + + GuiImageData progressbarEmpty(progressbar_empty_png); + GuiImage progressbarEmptyImg(&progressbarEmpty); + progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + progressbarEmptyImg.SetPosition(25, 40); + progressbarEmptyImg.SetTile(100); + + GuiImageData progressbar(progressbar_png); + GuiImage progressbarImg(&progressbar); + progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + progressbarImg.SetPosition(25, 40); + + GuiImageData throbber(throbber_png); + GuiImage throbberImg(&throbber); + throbberImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + throbberImg.SetPosition(0, 40); + + GuiText titleTxt(title, 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + titleTxt.SetPosition(0,14); + GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255}); + msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + msgTxt.SetPosition(0,80); + + promptWindow.Append(&dialogBoxImg); + promptWindow.Append(&titleTxt); + promptWindow.Append(&msgTxt); + + if(showProgress == 1) + { + promptWindow.Append(&progressbarEmptyImg); + promptWindow.Append(&progressbarImg); + promptWindow.Append(&progressbarOutlineImg); + } + else + { + promptWindow.Append(&throbberImg); + } + + // wait to see if progress flag changes soon + progsleep = 800000; + + while(progsleep > 0) + { + if(!showProgress) + break; + usleep(THREAD_SLEEP); + progsleep -= THREAD_SLEEP; + } + + if(!showProgress) + return; + + HaltGui(); + int oldState = mainWindow->GetState(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&promptWindow); + mainWindow->ChangeFocus(&promptWindow); + ResumeGui(); + + float angle = 0; + u32 count = 0; + + while(showProgress) + { + progsleep = 20000; + + while(progsleep > 0) + { + if(!showProgress) + break; + usleep(THREAD_SLEEP); + progsleep -= THREAD_SLEEP; + } + + if(showProgress == 1) + { + progressbarImg.SetTile(100*progressDone/progressTotal); + } + else if(showProgress == 2) + { + if(count % 5 == 0) + { + angle+=45.0f; + if(angle >= 360.0f) + angle = 0; + throbberImg.SetAngle(angle); + } + ++count; + } + } + + HaltGui(); + mainWindow->Remove(&promptWindow); + mainWindow->SetState(oldState); + ResumeGui(); +} + +static void * ProgressThread (void *arg) +{ + while(1) + { + if(!showProgress) + LWP_SuspendThread (progressthread); + + ProgressWindow(progressTitle, progressMsg); + usleep(THREAD_SLEEP); + } + return NULL; +} + +/**************************************************************************** + * InitGUIThread + * + * Startup GUI threads + ***************************************************************************/ +void +InitGUIThreads() +{ + LWP_CreateThread (&guithread, UpdateGUI, NULL, NULL, 0, 70); + LWP_CreateThread (&progressthread, ProgressThread, NULL, NULL, 0, 40); +} + +/**************************************************************************** + * CancelAction + * + * Signals the GUI progress window thread to halt, and waits for it to + * finish. Prevents multiple progress window events from interfering / + * overriding each other. + ***************************************************************************/ +void +CancelAction() +{ + showProgress = 0; + + // wait for thread to finish + while(!LWP_ThreadIsSuspended(progressthread)) + usleep(THREAD_SLEEP); +} + +/**************************************************************************** + * ShowProgress + * + * Updates the variables used by the progress window for drawing a progress + * bar. Also resumes the progress window thread if it is suspended. + ***************************************************************************/ +void +ShowProgress (const char *msg, int done, int total) +{ + if(!mainWindow || ExitRequested || ShutdownRequested) + return; + + if(total < (256*1024)) + return; + + if(done > total) // this shouldn't happen + done = total; + + if(showProgress != 1) + CancelAction(); // wait for previous progress window to finish + + snprintf(progressMsg, 200, "%s", msg); + sprintf(progressTitle, "Please Wait"); + showProgress = 1; + progressTotal = total; + progressDone = done; + LWP_ResumeThread (progressthread); +} + +/**************************************************************************** + * ShowAction + * + * Shows that an action is underway. Also resumes the progress window thread + * if it is suspended. + ***************************************************************************/ +void +ShowAction (const char *msg) +{ + if(!mainWindow || ExitRequested || ShutdownRequested) + return; + + if(showProgress != 0) + CancelAction(); // wait for previous progress window to finish + + snprintf(progressMsg, 200, "%s", msg); + sprintf(progressTitle, "Please Wait"); + showProgress = 2; + progressDone = 0; + progressTotal = 0; + LWP_ResumeThread (progressthread); +} + +void ErrorPrompt(const char *msg) +{ + WindowPrompt("Error", msg, "OK", NULL); +} + +int ErrorPromptRetry(const char *msg) +{ + return WindowPrompt("Error", msg, "Retry", "Cancel"); +} + +void InfoPrompt(const char *msg) +{ + WindowPrompt("Information", msg, "OK", NULL); +} + +int YesNoPrompt(const char *msg, bool yesDefault) +{ + return WindowPrompt("Goomba", msg, "Yes", "No", yesDefault); +} + +/**************************************************************************** + * OnScreenKeyboard + * + * Opens an on-screen keyboard window, with the data entered being stored + * into the specified variable. + ***************************************************************************/ +static void OnScreenKeyboard(char * var, u32 maxlen) +{ + int save = -1; + + GuiKeyboard keyboard(var, maxlen); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiText okBtnTxt("OK", 22, (GXColor){0, 0, 0, 255}); + GuiImage okBtnImg(&btnOutline); + GuiImage okBtnImgOver(&btnOutlineOver); + GuiButton okBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + + okBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + okBtn.SetPosition(25, -25); + + okBtn.SetLabel(&okBtnTxt); + okBtn.SetImage(&okBtnImg); + okBtn.SetImageOver(&okBtnImgOver); + okBtn.SetSoundOver(&btnSoundOver); + okBtn.SetSoundClick(&btnSoundClick); + okBtn.SetTrigger(trigA); + okBtn.SetTrigger(trig2); + okBtn.SetEffectGrow(); + + GuiText cancelBtnTxt("Cancel", 22, (GXColor){0, 0, 0, 255}); + GuiImage cancelBtnImg(&btnOutline); + GuiImage cancelBtnImgOver(&btnOutlineOver); + GuiButton cancelBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + cancelBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + cancelBtn.SetPosition(-25, -25); + cancelBtn.SetLabel(&cancelBtnTxt); + cancelBtn.SetImage(&cancelBtnImg); + cancelBtn.SetImageOver(&cancelBtnImgOver); + cancelBtn.SetSoundOver(&btnSoundOver); + cancelBtn.SetSoundClick(&btnSoundClick); + cancelBtn.SetTrigger(trigA); + cancelBtn.SetTrigger(trig2); + cancelBtn.SetEffectGrow(); + + keyboard.Append(&okBtn); + keyboard.Append(&cancelBtn); + + HaltGui(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&keyboard); + mainWindow->ChangeFocus(&keyboard); + ResumeGui(); + + while(save == -1) + { + usleep(THREAD_SLEEP); + + if(okBtn.GetState() == STATE_CLICKED) + save = 1; + else if(cancelBtn.GetState() == STATE_CLICKED) + save = 0; + } + + if(save) + { + snprintf(var, maxlen, "%s", keyboard.kbtextstr); + } + + HaltGui(); + mainWindow->Remove(&keyboard); + mainWindow->SetState(STATE_DEFAULT); + ResumeGui(); +} + +/**************************************************************************** + * SettingWindow + * + * Opens a new window, with the specified window element appended. Allows + * for a customizable prompted setting. + ***************************************************************************/ +static int +SettingWindow(const char * title, GuiWindow * w) +{ + int save = -1; + + GuiWindow promptWindow(448,288); + promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiImageData dialogBox(dialogue_box_png); + GuiImage dialogBoxImg(&dialogBox); + + GuiText titleTxt(title, 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + titleTxt.SetPosition(0,14); + + GuiText okBtnTxt("OK", 22, (GXColor){0, 0, 0, 255}); + GuiImage okBtnImg(&btnOutline); + GuiImage okBtnImgOver(&btnOutlineOver); + GuiButton okBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + + okBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + okBtn.SetPosition(20, -25); + + okBtn.SetLabel(&okBtnTxt); + okBtn.SetImage(&okBtnImg); + okBtn.SetImageOver(&okBtnImgOver); + okBtn.SetSoundOver(&btnSoundOver); + okBtn.SetSoundClick(&btnSoundClick); + okBtn.SetTrigger(trigA); + okBtn.SetTrigger(trig2); + okBtn.SetEffectGrow(); + + GuiText cancelBtnTxt("Cancel", 22, (GXColor){0, 0, 0, 255}); + GuiImage cancelBtnImg(&btnOutline); + GuiImage cancelBtnImgOver(&btnOutlineOver); + GuiButton cancelBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + cancelBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + cancelBtn.SetPosition(-20, -25); + cancelBtn.SetLabel(&cancelBtnTxt); + cancelBtn.SetImage(&cancelBtnImg); + cancelBtn.SetImageOver(&cancelBtnImgOver); + cancelBtn.SetSoundOver(&btnSoundOver); + cancelBtn.SetSoundClick(&btnSoundClick); + cancelBtn.SetTrigger(trigA); + cancelBtn.SetTrigger(trig2); + cancelBtn.SetEffectGrow(); + + promptWindow.Append(&dialogBoxImg); + promptWindow.Append(&titleTxt); + promptWindow.Append(&okBtn); + promptWindow.Append(&cancelBtn); + + HaltGui(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&promptWindow); + mainWindow->Append(w); + mainWindow->ChangeFocus(w); + ResumeGui(); + + while(save == -1) + { + usleep(THREAD_SLEEP); + + if(okBtn.GetState() == STATE_CLICKED) + save = 1; + else if(cancelBtn.GetState() == STATE_CLICKED) + save = 0; + } + HaltGui(); + mainWindow->Remove(&promptWindow); + mainWindow->Remove(w); + mainWindow->SetState(STATE_DEFAULT); + ResumeGui(); + return save; +} + +/**************************************************************************** + * WindowCredits + * Display credits, legal copyright and licence + * + * THIS MUST NOT BE REMOVED OR DISABLED IN ANY DERIVATIVE WORK + ***************************************************************************/ +static void WindowCredits(void * ptr) +{ + if(btnLogo->GetState() != STATE_CLICKED) + return; + + btnLogo->ResetState(); + + bool exit = false; + int i = 0; + int y = 20; + + GuiWindow creditsWindow(screenwidth,screenheight); + GuiWindow creditsWindowBox(580,448); + creditsWindowBox.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + + GuiImageData creditsBox(credits_box_png); + GuiImage creditsBoxImg(&creditsBox); + creditsBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + creditsWindowBox.Append(&creditsBoxImg); + + int numEntries = 25; + GuiText * txt[numEntries]; + + txt[i] = new GuiText("Credits", 20, (GXColor){0, 0, 0, 255}); + txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=24; + + txt[i] = new GuiText("Official Site: https://github.com/dborth/vbagx", 20, (GXColor){0, 0, 0, 255}); + txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=32; + + txt[i]->SetPresets(20, (GXColor){0, 0, 0, 255}, 0, + FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP); + + txt[i] = new GuiText("Main developer"); + txt[i]->SetPosition(40,y); i++; + txt[i] = new GuiText("Tantric"); + txt[i]->SetPosition(250,y); i++; y+=48; + + txt[i] = new GuiText("Additional coding"); + txt[i]->SetPosition(40,y); i++; + txt[i] = new GuiText("Zopenko, Glitch, libertyernie"); + txt[i]->SetPosition(250,y); i++; y+=24; + txt[i] = new GuiText("cebolleto, bgK, Carl Kenner, dancinninjac"); + txt[i]->SetPosition(250,y); i++; y+=48; + + txt[i] = new GuiText("Menu artwork"); + txt[i]->SetPosition(40,y); i++; + txt[i] = new GuiText("the3seashells"); + txt[i]->SetPosition(250,y); i++; y+=24; + txt[i] = new GuiText("Menu sound"); + txt[i]->SetPosition(40,y); i++; + txt[i] = new GuiText("Peter de Man"); + txt[i]->SetPosition(250,y); i++; y+=32; + + txt[i] = new GuiText("VBA GameCube"); + txt[i]->SetPosition(40,y); i++; + txt[i] = new GuiText("SoftDev, emukidid"); + txt[i]->SetPosition(250,y); i++; y+=24; + txt[i] = new GuiText("Visual Boy Advance - M"); + txt[i]->SetPosition(40,y); i++; + txt[i] = new GuiText("VBA-M Team"); + txt[i]->SetPosition(250,y); i++; y+=24; + txt[i] = new GuiText("Visual Boy Advance"); + txt[i]->SetPosition(40,y); i++; + txt[i] = new GuiText("Forgotten"); + txt[i]->SetPosition(250,y); i++; y+=24; + + txt[i] = new GuiText("libogc / devkitPPC"); + txt[i]->SetPosition(40,y); i++; + txt[i] = new GuiText("shagkur & wintermute"); + txt[i]->SetPosition(250,y); i++; y+=24; + txt[i] = new GuiText("FreeTypeGX"); + txt[i]->SetPosition(40,y); i++; + txt[i] = new GuiText("Armin Tamzarian"); + txt[i]->SetPosition(250,y); i++; y+=32; + + txt[i]->SetPresets(18, (GXColor){0, 0, 0, 255}, 0, + FTGX_JUSTIFY_CENTER | FTGX_ALIGN_TOP, ALIGN_CENTRE, ALIGN_TOP); + + txt[i] = new GuiText("This software is open source and may be copied,"); + txt[i]->SetPosition(0,y); i++; y+=20; + txt[i] = new GuiText("distributed, or modified under the terms of the"); + txt[i]->SetPosition(0,y); i++; y+=20; + txt[i] = new GuiText("GNU General Public License (GPL) Version 2."); + txt[i]->SetPosition(0,y); i++; y+=20; + + char iosVersion[20]; + +#ifdef HW_RVL + sprintf(iosVersion, "IOS: %d", IOS_GetVersion()); +#endif + + txt[i] = new GuiText(iosVersion, 18, (GXColor){0, 0, 0, 255}); + txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + txt[i]->SetPosition(20,-20); + + for(i=0; i < numEntries; i++) + creditsWindowBox.Append(txt[i]); + + creditsWindow.Append(&creditsWindowBox); + + while(!exit) + { + UpdatePads(); + + gameScreenImg->Draw(); + bgBottomImg->Draw(); + bgTopImg->Draw(); + creditsWindow.Draw(); + + #ifdef HW_RVL + i = 3; + do { + if(userInput[i].wpad->ir.valid) + Menu_DrawImg(userInput[i].wpad->ir.x-48, userInput[i].wpad->ir.y-48, + 96, 96, pointer[i]->GetImage(), userInput[i].wpad->ir.angle, 1, 1, 255); + DoRumble(i); + --i; + } while(i >= 0); + #endif + + Menu_Render(); + + if((userInput[0].wpad->btns_d || userInput[0].pad.btns_d || userInput[0].wupcdata.btns_d) || + (userInput[1].wpad->btns_d || userInput[1].pad.btns_d || userInput[1].wupcdata.btns_d) || + (userInput[2].wpad->btns_d || userInput[2].pad.btns_d || userInput[2].wupcdata.btns_d) || + (userInput[3].wpad->btns_d || userInput[3].pad.btns_d || userInput[3].wupcdata.btns_d)) + { + exit = true; + } + usleep(THREAD_SLEEP); + } + + // clear buttons pressed + for(i=0; i < 4; i++) + { + userInput[i].wupcdata.btns_d = 0; + userInput[i].wpad->btns_d = 0; + userInput[i].pad.btns_d = 0; + } + + for(i=0; i < numEntries; i++) + delete txt[i]; +} + +/**************************************************************************** + * MenuGameSelection + * + * Displays a list of games on the specified load device, and allows the user + * to browse and select from this list. + ***************************************************************************/ +static int MenuGameSelection() +{ + int menu = MENU_NONE; + bool res; + int i; + + GuiText titleTxt("Choose Game", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData iconHome(icon_home_png); + GuiImageData iconSettings(icon_settings_png); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + GuiImageData bgPreviewImg(bg_preview_png); + + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + GuiText settingsBtnTxt("Settings", 22, (GXColor){0, 0, 0, 255}); + GuiImage settingsBtnIcon(&iconSettings); + settingsBtnIcon.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + settingsBtnIcon.SetPosition(14,0); + GuiImage settingsBtnImg(&btnOutline); + GuiImage settingsBtnImgOver(&btnOutlineOver); + GuiButton settingsBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + settingsBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + settingsBtn.SetPosition(90, -35); + settingsBtn.SetLabel(&settingsBtnTxt); + settingsBtn.SetIcon(&settingsBtnIcon); + settingsBtn.SetImage(&settingsBtnImg); + settingsBtn.SetImageOver(&settingsBtnImgOver); + settingsBtn.SetSoundOver(&btnSoundOver); + settingsBtn.SetSoundClick(&btnSoundClick); + settingsBtn.SetTrigger(trigA); + settingsBtn.SetTrigger(trig2); + settingsBtn.SetEffectGrow(); + + GuiText exitBtnTxt("Exit", 22, (GXColor){0, 0, 0, 255}); + GuiImage exitBtnIcon(&iconHome); + exitBtnIcon.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + exitBtnIcon.SetPosition(14,0); + GuiImage exitBtnImg(&btnOutline); + GuiImage exitBtnImgOver(&btnOutlineOver); + GuiButton exitBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + exitBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + exitBtn.SetPosition(-90, -35); + exitBtn.SetLabel(&exitBtnTxt); + exitBtn.SetIcon(&exitBtnIcon); + exitBtn.SetImage(&exitBtnImg); + exitBtn.SetImageOver(&exitBtnImgOver); + exitBtn.SetSoundOver(&btnSoundOver); + exitBtn.SetSoundClick(&btnSoundClick); + exitBtn.SetTrigger(trigA); + exitBtn.SetTrigger(trig2); + exitBtn.SetTrigger(&trigHome); + exitBtn.SetEffectGrow(); + + GuiWindow buttonWindow(screenwidth, screenheight); + buttonWindow.Append(&settingsBtn); + buttonWindow.Append(&exitBtn); + + GuiFileBrowser gameBrowser(330, 268); + gameBrowser.SetPosition(30, 98); + ResetBrowser(); + + GuiImage bgPreview(&bgPreviewImg); + bgPreview.SetPosition(365, 98); + + GuiImage preview; + preview.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + preview.SetPosition(174, -8); + u8* imgBuffer = MEM_ALLOC(512 * 512 * 4); + int previousBrowserIndex = -1; + char imagePath[MAXJOLIET + 1]; + + HaltGui(); + btnLogo->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + btnLogo->SetPosition(-50, 24); + mainWindow->Append(&titleTxt); + mainWindow->Append(&gameBrowser); + mainWindow->Append(&buttonWindow); + mainWindow->Append(&bgPreview); + mainWindow->Append(&preview); + ResumeGui(); + + #ifdef HW_RVL + ShutoffRumble(); + #endif + + // populate initial directory listing + selectLoadedFile = 1; + OpenGameList(); + + gameBrowser.ResetState(); + gameBrowser.fileList[0]->SetState(STATE_SELECTED); + gameBrowser.TriggerUpdate(); + titleTxt.SetText(inSz ? szname : "Choose Game"); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(selectLoadedFile == 2) + { + selectLoadedFile = 0; + mainWindow->ChangeFocus(&gameBrowser); + gameBrowser.TriggerUpdate(); + } + + //update gamelist image + if(previousBrowserIndex != browser.selIndex) + { + previousBrowserIndex = browser.selIndex; + snprintf(imagePath, MAXJOLIET, "%s%s/%s.png", pathPrefix[GCSettings.LoadMethod], GCSettings.ImageFolder, browserList[browser.selIndex].displayname); + + AllocSaveBuffer(); + int width, height; + if(LoadFile(imagePath, SILENT)) + { + if(DecodePNG(savebuffer, &width, &height, imgBuffer, 512, 512)) + { + preview.SetImage(imgBuffer, width, height); + preview.SetScale( MIN(225.0f / width, 235.0f / height) ); + } + else + { + preview.SetImage(NULL, 0, 0); + } + } + else + { + preview.SetImage(NULL, 0, 0); + + } + FreeSaveBuffer(); + } + + // update gameWindow based on arrow buttons + // set MENU_EXIT if A button pressed on a game + for(i=0; i < FILE_PAGESIZE; i++) + { + if(gameBrowser.fileList[i]->GetState() == STATE_CLICKED) + { + gameBrowser.fileList[i]->ResetState(); + + // check corresponding browser entry + if(browserList[browser.selIndex].isdir || IsSz()) + { + HaltGui(); + res = BrowserChangeFolder(); + if(res) + { + gameBrowser.ResetState(); + gameBrowser.fileList[0]->SetState(STATE_SELECTED); + gameBrowser.TriggerUpdate(); + previousBrowserIndex = -1; + } + else + { + menu = MENU_GAMESELECTION; + break; + } + + + titleTxt.SetText(inSz ? szname : "Choose Game"); + + ResumeGui(); + } + else + { + #ifdef HW_RVL + ShutoffRumble(); + #endif + mainWindow->SetState(STATE_DISABLED); + SavePrefs(SILENT); + if(BrowserLoadFile()) + menu = MENU_EXIT; + else + mainWindow->SetState(STATE_DEFAULT); + } + } + } + + + + if(settingsBtn.GetState() == STATE_CLICKED) + menu = MENU_SETTINGS; + else if(exitBtn.GetState() == STATE_CLICKED) + ExitRequested = 1; + } + + HaltParseThread(); // halt parsing + HaltGui(); + ResetBrowser(); + mainWindow->Remove(&titleTxt); + mainWindow->Remove(&buttonWindow); + mainWindow->Remove(&gameBrowser); + mainWindow->Remove(&preview); + mainWindow->Remove(&bgPreview); + MEM_DEALLOC(imgBuffer); + return menu; +} + +extern char DebugStr[50]; + +/**************************************************************************** + * MenuGame + * + * Menu displayed when returning to the menu from in-game. + ***************************************************************************/ +static int MenuGame() +{ + int menu = MENU_NONE; + + // Weather menu if a game with Boktai solar sensor + bool isBoktai = ((RomIdCode & 0xFF)=='U'); + char s[64]; + + GuiText titleTxt(ROMFilename, 22, (GXColor){255, 255, 255, 255}); + if (DebugStr[0]) titleTxt.SetText(DebugStr); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnCloseOutline(button_small_png); + GuiImageData btnCloseOutlineOver(button_small_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData iconGameSettings(icon_game_settings_png); + GuiImageData iconLoad(icon_game_load_png); + GuiImageData iconSave(icon_game_save_png); + GuiImageData iconDelete(icon_game_delete_png); + GuiImageData iconReset(icon_game_reset_png); + + GuiImageData battery(battery_png); + GuiImageData batteryRed(battery_red_png); + GuiImageData batteryBar(battery_bar_png); + + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + int xOffset=125; + if (isBoktai) + xOffset=200; + + GuiText saveBtnTxt("Save", 22, (GXColor){0, 0, 0, 255}); + GuiImage saveBtnImg(&btnLargeOutline); + GuiImage saveBtnImgOver(&btnLargeOutlineOver); + GuiImage saveBtnIcon(&iconSave); + GuiButton saveBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + saveBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + saveBtn.SetPosition(-200, 120); + saveBtn.SetLabel(&saveBtnTxt); + saveBtn.SetImage(&saveBtnImg); + saveBtn.SetImageOver(&saveBtnImgOver); + saveBtn.SetIcon(&saveBtnIcon); + saveBtn.SetSoundOver(&btnSoundOver); + saveBtn.SetSoundClick(&btnSoundClick); + saveBtn.SetTrigger(trigA); + saveBtn.SetTrigger(trig2); + saveBtn.SetEffectGrow(); + + GuiText loadBtnTxt("Load", 22, (GXColor){0, 0, 0, 255}); + GuiImage loadBtnImg(&btnLargeOutline); + GuiImage loadBtnImgOver(&btnLargeOutlineOver); + GuiImage loadBtnIcon(&iconLoad); + GuiButton loadBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + loadBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + loadBtn.SetPosition(0, 120); + loadBtn.SetLabel(&loadBtnTxt); + loadBtn.SetImage(&loadBtnImg); + loadBtn.SetImageOver(&loadBtnImgOver); + loadBtn.SetIcon(&loadBtnIcon); + loadBtn.SetSoundOver(&btnSoundOver); + loadBtn.SetSoundClick(&btnSoundClick); + loadBtn.SetTrigger(trigA); + loadBtn.SetTrigger(trig2); + loadBtn.SetEffectGrow(); + + GuiText deleteBtnTxt("Delete", 22, (GXColor){0, 0, 0, 255}); + GuiImage deleteBtnImg(&btnLargeOutline); + GuiImage deleteBtnImgOver(&btnLargeOutlineOver); + GuiImage deleteBtnIcon(&iconDelete); + GuiButton deleteBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + deleteBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + deleteBtn.SetPosition(200, 120); + deleteBtn.SetLabel(&deleteBtnTxt); + deleteBtn.SetImage(&deleteBtnImg); + deleteBtn.SetImageOver(&deleteBtnImgOver); + deleteBtn.SetIcon(&deleteBtnIcon); + deleteBtn.SetSoundOver(&btnSoundOver); + deleteBtn.SetSoundClick(&btnSoundClick); + deleteBtn.SetTrigger(trigA); + deleteBtn.SetTrigger(trig2); + deleteBtn.SetEffectGrow(); + + // Boktai adds an extra button for setting the sun. + GuiText *sunBtnTxt = NULL; + GuiImage *sunBtnImg = NULL; + GuiImage *sunBtnImgOver = NULL; + GuiButton *sunBtn = NULL; + if (isBoktai) + { + struct tm *newtime; + time_t long_time; + + // regardless of the weather, there should be no sun at night time! + time(&long_time); // Get time as long integer. + newtime = localtime(&long_time); // Convert to local time. + if (newtime->tm_hour > 21 || newtime->tm_hour < 5) + { + sprintf(s, "Weather: Night Time"); + } + else + sprintf(s, "Weather: %d%% sun", SunBars*10); + + sunBtnTxt = new GuiText(s, 22, (GXColor){0, 0, 0, 255}); + sunBtnTxt->SetWrap(true, btnLargeOutline.GetWidth()-30); + sunBtnImg = new GuiImage(&btnLargeOutline); + sunBtnImgOver = new GuiImage(&btnLargeOutlineOver); + sunBtn = new GuiButton(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + sunBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + sunBtn->SetPosition(0, 250); + sunBtn->SetLabel(sunBtnTxt); + sunBtn->SetImage(sunBtnImg); + sunBtn->SetImageOver(sunBtnImgOver); + sunBtn->SetSoundOver(&btnSoundOver); + sunBtn->SetSoundClick(&btnSoundClick); + sunBtn->SetTrigger(trigA); + sunBtn->SetTrigger(trig2); + sunBtn->SetEffectGrow(); + } + + GuiText resetBtnTxt("Reset", 22, (GXColor){0, 0, 0, 255}); + GuiImage resetBtnImg(&btnLargeOutline); + GuiImage resetBtnImgOver(&btnLargeOutlineOver); + GuiImage resetBtnIcon(&iconReset); + GuiButton resetBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + resetBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + resetBtn.SetPosition(xOffset, 250); + resetBtn.SetLabel(&resetBtnTxt); + resetBtn.SetImage(&resetBtnImg); + resetBtn.SetImageOver(&resetBtnImgOver); + resetBtn.SetIcon(&resetBtnIcon); + resetBtn.SetSoundOver(&btnSoundOver); + resetBtn.SetSoundClick(&btnSoundClick); + resetBtn.SetTrigger(trigA); + resetBtn.SetTrigger(trig2); + resetBtn.SetEffectGrow(); + + GuiText gameSettingsBtnTxt("Game Settings", 22, (GXColor){0, 0, 0, 255}); + gameSettingsBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); + GuiImage gameSettingsBtnImg(&btnLargeOutline); + GuiImage gameSettingsBtnImgOver(&btnLargeOutlineOver); + GuiImage gameSettingsBtnIcon(&iconGameSettings); + GuiButton gameSettingsBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + gameSettingsBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + gameSettingsBtn.SetPosition(-xOffset, 250); + gameSettingsBtn.SetLabel(&gameSettingsBtnTxt); + gameSettingsBtn.SetImage(&gameSettingsBtnImg); + gameSettingsBtn.SetImageOver(&gameSettingsBtnImgOver); + gameSettingsBtn.SetIcon(&gameSettingsBtnIcon); + gameSettingsBtn.SetSoundOver(&btnSoundOver); + gameSettingsBtn.SetSoundClick(&btnSoundClick); + gameSettingsBtn.SetTrigger(trigA); + gameSettingsBtn.SetTrigger(trig2); + gameSettingsBtn.SetEffectGrow(); + + GuiText mainmenuBtnTxt("Main Menu", 22, (GXColor){0, 0, 0, 255}); + GuiImage mainmenuBtnImg(&btnOutline); + GuiImage mainmenuBtnImgOver(&btnOutlineOver); + GuiButton mainmenuBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + mainmenuBtn.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); + mainmenuBtn.SetPosition(0, -35); + mainmenuBtn.SetLabel(&mainmenuBtnTxt); + mainmenuBtn.SetImage(&mainmenuBtnImg); + mainmenuBtn.SetImageOver(&mainmenuBtnImgOver); + mainmenuBtn.SetSoundOver(&btnSoundOver); + mainmenuBtn.SetSoundClick(&btnSoundClick); + mainmenuBtn.SetTrigger(trigA); + mainmenuBtn.SetTrigger(trig2); + mainmenuBtn.SetEffectGrow(); + + GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); + GuiImage closeBtnImg(&btnCloseOutline); + GuiImage closeBtnImgOver(&btnCloseOutlineOver); + GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + closeBtn.SetPosition(-50, 35); + closeBtn.SetLabel(&closeBtnTxt); + closeBtn.SetImage(&closeBtnImg); + closeBtn.SetImageOver(&closeBtnImgOver); + closeBtn.SetSoundOver(&btnSoundOver); + closeBtn.SetSoundClick(&btnSoundClick); + closeBtn.SetTrigger(trigA); + closeBtn.SetTrigger(trig2); + closeBtn.SetTrigger(&trigHome); + closeBtn.SetEffectGrow(); + + #ifdef HW_RVL + int i; + char txt[3]; + bool status[4] = { false, false, false, false }; + int level[4] = { 0, 0, 0, 0 }; + bool newStatus; + int newLevel; + GuiText * batteryTxt[4]; + GuiImage * batteryImg[4]; + GuiImage * batteryBarImg[4]; + GuiButton * batteryBtn[4]; + + for(i=0; i < 4; ++i) + { + sprintf(txt, "P%d", i+1); + + batteryTxt[i] = new GuiText(txt, 20, (GXColor){255, 255, 255, 255}); + batteryTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + batteryImg[i] = new GuiImage(&battery); + batteryImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + batteryImg[i]->SetPosition(30, 0); + batteryBarImg[i] = new GuiImage(&batteryBar); + batteryBarImg[i]->SetTile(0); + batteryBarImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + batteryBarImg[i]->SetPosition(34, 0); + + batteryBtn[i] = new GuiButton(70, 20); + batteryBtn[i]->SetLabel(batteryTxt[i]); + batteryBtn[i]->SetImage(batteryImg[i]); + batteryBtn[i]->SetIcon(batteryBarImg[i]); + batteryBtn[i]->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + batteryBtn[i]->SetRumble(false); + batteryBtn[i]->SetSelectable(false); + batteryBtn[i]->SetAlpha(150); + } + + batteryBtn[0]->SetPosition(45, -65); + batteryBtn[1]->SetPosition(135, -65); + batteryBtn[2]->SetPosition(45, -40); + batteryBtn[3]->SetPosition(135, -40); + #endif + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + w.Append(&saveBtn); + w.Append(&loadBtn); + w.Append(&deleteBtn); + w.Append(&resetBtn); + w.Append(&gameSettingsBtn); + if (isBoktai) + w.Append(sunBtn); + + #ifdef HW_RVL + w.Append(batteryBtn[0]); + w.Append(batteryBtn[1]); + w.Append(batteryBtn[2]); + w.Append(batteryBtn[3]); + #endif + + w.Append(&mainmenuBtn); + w.Append(&closeBtn); + + btnLogo->SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + btnLogo->SetPosition(-50, -40); + mainWindow->Append(&w); + + if(lastMenu == MENU_NONE) + { + enterSound->Play(); + bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 35); + closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 35); + titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 35); + mainmenuBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + #ifdef HW_RVL + batteryBtn[0]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + batteryBtn[1]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + batteryBtn[2]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + batteryBtn[3]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 35); + #endif + + w.SetEffect(EFFECT_FADE, 15); + } + + ResumeGui(); + + if(lastMenu == MENU_NONE) + { + if (GCSettings.AutoSave == 1) + { + SaveBatteryOrStateAuto(FILE_SRAM, SILENT); // save battery + } + else if (GCSettings.AutoSave == 2) + { + if (WindowPrompt("Save", "Save Snapshot?", "Save", "Don't Save") ) + SaveBatteryOrStateAuto(FILE_SNAPSHOT, NOTSILENT); // save state + } + else if (GCSettings.AutoSave == 3) + { + if (WindowPrompt("Save", "Save SRAM and Snapshot?", "Save", "Don't Save") ) + { + SaveBatteryOrStateAuto(FILE_SRAM, NOTSILENT); // save battery + SaveBatteryOrStateAuto(FILE_SNAPSHOT, NOTSILENT); // save state + } + } + } + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + #ifdef HW_RVL + for(i=0; i < 4; i++) + { + if(WPAD_Probe(i, NULL) == WPAD_ERR_NONE) + { + newStatus = true; + newLevel = (userInput[i].wpad->battery_level / 100.0) * 4; + if(newLevel > 4) newLevel = 4; + } + else + { + struct WUPCData *data = WUPC_Data(i); + if(data != NULL) + { + newStatus = true; + newLevel = data->battery; + } + else + { + newStatus = false; + newLevel = 0; + } + } + + if(status[i] != newStatus || level[i] != newLevel) + { + if(newStatus == true) // controller connected + { + batteryBtn[i]->SetAlpha(255); + batteryBarImg[i]->SetTile(newLevel); + + if(newLevel == 0) + batteryImg[i]->SetImage(&batteryRed); + else + batteryImg[i]->SetImage(&battery); + } + else // controller not connected + { + batteryBtn[i]->SetAlpha(150); + batteryBarImg[i]->SetTile(0); + batteryImg[i]->SetImage(&battery); + } + status[i] = newStatus; + level[i] = newLevel; + } + } + #endif + + if (isBoktai) + { + if (sunBtn->GetState() == STATE_CLICKED) + { + ++SunBars; + if (SunBars>10) SunBars=0; + menu = MENU_GAME; + } + } + + if(saveBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAME_SAVE; + } + else if(loadBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAME_LOAD; + } + else if(deleteBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAME_DELETE; + } + else if(resetBtn.GetState() == STATE_CLICKED) + { + if (WindowPrompt("Reset Game", "Reset this game? Any unsaved progress will be lost.", "OK", "Cancel")) + { + emulator.emuReset(); + menu = MENU_EXIT; + } + } + else if(gameSettingsBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS; + } + else if(mainmenuBtn.GetState() == STATE_CLICKED) + { + if (WindowPrompt("Quit Game", "Quit this game? Any unsaved progress will be lost.", "OK", "Cancel")) + { + HaltGui(); + mainWindow->Remove(gameScreenImg); + delete gameScreenImg; + delete gameScreen; + gameScreen = NULL; + free(gameScreenPng); + gameScreenPng = NULL; + gameScreenImg = new GuiImage(screenwidth, screenheight, (GXColor){236, 226, 238, 255}); + gameScreenImg->ColorStripe(10); + mainWindow->Insert(gameScreenImg, 0); + ResumeGui(); + #ifndef NO_SOUND + bgMusic->Play(); // startup music + #endif + menu = MENU_GAMESELECTION; + } + } + else if(closeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_EXIT; + + exitSound->Play(); + bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + mainmenuBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + #ifdef HW_RVL + batteryBtn[0]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + batteryBtn[1]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + batteryBtn[2]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + batteryBtn[3]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + #endif + + w.SetEffect(EFFECT_FADE, -15); + usleep(350000); // wait for effects to finish + } + } + + HaltGui(); + + if (isBoktai) { + delete sunBtnTxt; + delete sunBtnImg; + delete sunBtnImgOver; + delete sunBtn; + } + + #ifdef HW_RVL + for(i=0; i < 4; ++i) + { + delete batteryTxt[i]; + delete batteryImg[i]; + delete batteryBarImg[i]; + delete batteryBtn[i]; + } + #endif + + mainWindow->Remove(&w); + return menu; +} + +/**************************************************************************** + * FindGameSaveNum + * + * Determines the save file number of the given file name + * Returns -1 if none is found + ***************************************************************************/ +static int FindGameSaveNum(char * savefile, int method) +{ + int n = -1; + int romlen = strlen(ROMFilename); + int savelen = strlen(savefile); + int diff = savelen-romlen; + + if(strncmp(savefile, ROMFilename, romlen) != 0) + return -1; + + if(savefile[romlen] == ' ') + { + if(diff == 5 && strncmp(&savefile[romlen+1], "Auto", 4) == 0) + n = 0; // found Auto save + else if(diff == 2 || diff == 3) + n = atoi(&savefile[romlen+1]); + } + + if(n >= 0 && n < MAX_SAVES) + return n; + else + return -1; +} + +/**************************************************************************** + * MenuGameSaves + * + * Allows the user to load or save progress. + ***************************************************************************/ +static int MenuGameSaves(int action) +{ + SaveList saves; + struct stat filestat; + struct tm * timeinfo; + + int menu = MENU_NONE; + int ret, result; + int i, n, type, len, len2; + int j = 0; + + char filepath[1024]; + char deletepath[1024]; + char scrfile[1024]; + char tmp[MAXJOLIET+1]; + + int method = GCSettings.SaveMethod; + + if(method == DEVICE_AUTO) + autoSaveMethod(NOTSILENT); + + if(!ChangeInterface(method, NOTSILENT)) + return MENU_GAME; + + GuiText titleTxt(NULL, 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + if(action == 0) + titleTxt.SetText("Load Game"); + else if (action == 2) + titleTxt.SetText("Delete Saves"); + else + titleTxt.SetText("Save Game"); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnCloseOutline(button_small_png); + GuiImageData btnCloseOutlineOver(button_small_over_png); + + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); + GuiImage closeBtnImg(&btnCloseOutline); + GuiImage closeBtnImgOver(&btnCloseOutlineOver); + GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + closeBtn.SetPosition(-50, 35); + closeBtn.SetLabel(&closeBtnTxt); + closeBtn.SetImage(&closeBtnImg); + closeBtn.SetImageOver(&closeBtnImgOver); + closeBtn.SetSoundOver(&btnSoundOver); + closeBtn.SetSoundClick(&btnSoundClick); + closeBtn.SetTrigger(trigA); + closeBtn.SetTrigger(trig2); + closeBtn.SetTrigger(&trigHome); + closeBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + w.Append(&closeBtn); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + memset(&saves, 0, sizeof(saves)); + + sprintf(browser.dir, "%s%s", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder); + ParseDirectory(true, false); + + len = strlen(ROMFilename); + + // find matching files + AllocSaveBuffer(); + + for(i=0; i < browser.numEntries; i++) + { + len2 = strlen(browserList[i].filename); + + if(len2 < 6 || len2-len < 5) + continue; + + if(strncmp(&browserList[i].filename[len2-4], ".sav", 4) == 0) + type = FILE_SRAM; + else if(strncmp(&browserList[i].filename[len2-4], ".sgm", 4) == 0) + type = FILE_SNAPSHOT; + else + continue; + + strcpy(tmp, browserList[i].filename); + tmp[len2-4] = 0; + n = FindGameSaveNum(tmp, method); + + if(n >= 0) + { + saves.type[j] = type; + saves.files[saves.type[j]][n] = 1; + strcpy(saves.filename[j], browserList[i].filename); + + if(saves.type[j] == FILE_SNAPSHOT) + { + sprintf(scrfile, "%s%s/%s.png", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, tmp); + + memset(savebuffer, 0, SAVEBUFFERSIZE); + if(LoadFile(scrfile, SILENT)) + saves.previewImg[j] = new GuiImageData(savebuffer, 64, 48); + } + snprintf(filepath, 1024, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, saves.filename[j]); + if (stat(filepath, &filestat) == 0) + { + timeinfo = localtime(&filestat.st_mtime); + strftime(saves.date[j], 20, "%a %b %d", timeinfo); + strftime(saves.time[j], 10, "%I:%M %p", timeinfo); + } + ++j; + } + } + + FreeSaveBuffer(); + saves.length = j; + + if((saves.length == 0 && action == 0) || (saves.length == 0 && action == 2)) + { + InfoPrompt("No game saves found."); + menu = MENU_GAME; + } + + GuiSaveBrowser saveBrowser(552, 248, &saves, action); + saveBrowser.SetPosition(0, 108); + saveBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + + HaltGui(); + mainWindow->Append(&saveBrowser); + mainWindow->ChangeFocus(&saveBrowser); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = saveBrowser.GetClickedSave(); + + // load, save and delete save games + if(ret > -3) + { + result = 0; + + if(action == 0) // load + { + MakeFilePath(filepath, saves.type[ret], saves.filename[ret]); + switch(saves.type[ret]) + { + case FILE_SRAM: + result = LoadBatteryOrState(filepath, saves.type[ret], NOTSILENT); + emulator.emuReset(); + break; + case FILE_SNAPSHOT: + result = LoadBatteryOrState(filepath, saves.type[ret], NOTSILENT); + break; + } + if(result) + menu = MENU_EXIT; + } + else if(action == 2) // delete SRAM/Snapshot + { + if (WindowPrompt("Delete File", "Delete this save file? Deleted files can not be restored.", "OK", "Cancel")) + { + MakeFilePath(filepath, saves.type[ret], saves.filename[ret]); + switch(saves.type[ret]) + { + case FILE_SRAM: + strncpy(deletepath, filepath, 1024); + deletepath[strlen(deletepath)-4] = 0; + sprintf(deletepath, "%s.sav", deletepath); + remove(deletepath); // Delete the *.srm file (Battery save file) + break; + case FILE_SNAPSHOT: + strncpy(deletepath, filepath, 1024); + deletepath[strlen(deletepath)-4] = 0; + sprintf(deletepath, "%s.png", deletepath); + remove(deletepath); // Delete the *.png file (Screenshot file) + strncpy(deletepath, filepath, 1024); + deletepath[strlen(deletepath)-4] = 0; + sprintf(deletepath, "%s.sgm", deletepath); + remove(deletepath); // Delete the *.frz file (Save State file) + break; + } + } + menu = MENU_GAME_DELETE; + + + } + else // save + { + if(ret == -2) // new SRAM + { + for(i=1; i < 100; i++) + if(saves.files[FILE_SRAM][i] == 0) + break; + + if(i < 100) + { + MakeFilePath(filepath, FILE_SRAM, ROMFilename, i); + SaveBatteryOrState(filepath, FILE_SRAM, NOTSILENT); + menu = MENU_GAME_SAVE; + } + } + else if(ret == -1) // new Snapshot + { + for(i=1; i < 100; i++) + if(saves.files[FILE_SNAPSHOT][i] == 0) + break; + + if(i < 100) + { + MakeFilePath(filepath, FILE_SNAPSHOT, ROMFilename, i); + SaveBatteryOrState(filepath, FILE_SNAPSHOT, NOTSILENT); + menu = MENU_GAME_SAVE; + } + } + else // overwrite SRAM/Snapshot + { + MakeFilePath(filepath, saves.type[ret], saves.filename[ret]); + switch(saves.type[ret]) + { + case FILE_SRAM: + SaveBatteryOrState(filepath, FILE_SRAM, NOTSILENT); + break; + case FILE_SNAPSHOT: + SaveBatteryOrState(filepath, FILE_SNAPSHOT, NOTSILENT); + break; + } + menu = MENU_GAME_SAVE; + } + } + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAME; + } + else if(closeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_EXIT; + + exitSound->Play(); + bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + backBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + + w.SetEffect(EFFECT_FADE, -15); + + usleep(350000); // wait for effects to finish + } + } + + HaltGui(); + + for(i=0; i < saves.length; i++) + if(saves.previewImg[i]) + delete saves.previewImg[i]; + + mainWindow->Remove(&saveBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + ResetBrowser(); + return menu; +} + + +/**************************************************************************** + * MenuGameSettings + ***************************************************************************/ +static int MenuGameSettings() +{ + int menu = MENU_NONE; + char s[4]; + char filepath[1024]; + + GuiText titleTxt("Game Settings", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData iconMappings(icon_settings_mappings_png); + GuiImageData iconVideo(icon_settings_video_png); +#ifdef HW_RVL + GuiImageData iconWiiControls(icon_settings_nunchuk_png); +#else + GuiImageData iconWiiControls(icon_settings_gamecube_png); +#endif + GuiImageData iconScreenshot(icon_settings_screenshot_png); + GuiImageData btnCloseOutline(button_small_png); + GuiImageData btnCloseOutlineOver(button_small_over_png); + + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + GuiText mappingBtnTxt("Button Mappings", 22, (GXColor){0, 0, 0, 255}); + mappingBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); + GuiImage mappingBtnImg(&btnLargeOutline); + GuiImage mappingBtnImgOver(&btnLargeOutlineOver); + GuiImage mappingBtnIcon(&iconMappings); + GuiButton mappingBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + mappingBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + mappingBtn.SetPosition(-125, 120); + mappingBtn.SetLabel(&mappingBtnTxt); + mappingBtn.SetImage(&mappingBtnImg); + mappingBtn.SetImageOver(&mappingBtnImgOver); + mappingBtn.SetIcon(&mappingBtnIcon); + mappingBtn.SetSoundOver(&btnSoundOver); + mappingBtn.SetSoundClick(&btnSoundClick); + mappingBtn.SetTrigger(trigA); + mappingBtn.SetTrigger(trig2); + mappingBtn.SetEffectGrow(); + + GuiText videoBtnTxt("Video", 22, (GXColor){0, 0, 0, 255}); + videoBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); + GuiImage videoBtnImg(&btnLargeOutline); + GuiImage videoBtnImgOver(&btnLargeOutlineOver); + GuiImage videoBtnIcon(&iconVideo); + GuiButton videoBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + videoBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + videoBtn.SetPosition(125, 120); + videoBtn.SetLabel(&videoBtnTxt); + videoBtn.SetImage(&videoBtnImg); + videoBtn.SetImageOver(&videoBtnImgOver); + videoBtn.SetIcon(&videoBtnIcon); + videoBtn.SetSoundOver(&btnSoundOver); + videoBtn.SetSoundClick(&btnSoundClick); + videoBtn.SetTrigger(trigA); + videoBtn.SetTrigger(trig2); + videoBtn.SetEffectGrow(); + + #ifdef HW_RVL + GuiText wiiControlsBtnTxt1("Match Wii Controls", 22, (GXColor){0, 0, 0, 255}); + #else + GuiText wiiControlsBtnTxt1("Match GC Controls", 22, (GXColor){0, 0, 0, 255}); + #endif + if (GCSettings.WiiControls) sprintf(s, "ON"); + else sprintf(s, "OFF"); + GuiText wiiControlsBtnTxt2(s, 18, (GXColor){0, 0, 0, 255}); + wiiControlsBtnTxt1.SetPosition(0, -10); + wiiControlsBtnTxt1.SetWrap(true, btnLargeOutline.GetWidth()-30); + wiiControlsBtnTxt2.SetPosition(0, +30); + GuiImage wiiControlsBtnImg(&btnLargeOutline); + GuiImage wiiControlsBtnImgOver(&btnLargeOutlineOver); + GuiImage wiiControlsBtnIcon(&iconWiiControls); + GuiButton wiiControlsBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + wiiControlsBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + wiiControlsBtn.SetPosition(-125, 250); + wiiControlsBtn.SetLabel(&wiiControlsBtnTxt1, 0); + wiiControlsBtn.SetLabel(&wiiControlsBtnTxt2, 1); + wiiControlsBtn.SetImage(&wiiControlsBtnImg); + wiiControlsBtn.SetImageOver(&wiiControlsBtnImgOver); + wiiControlsBtn.SetIcon(&wiiControlsBtnIcon); + wiiControlsBtn.SetSoundOver(&btnSoundOver); + wiiControlsBtn.SetSoundClick(&btnSoundClick); + wiiControlsBtn.SetTrigger(trigA); + wiiControlsBtn.SetTrigger(trig2); + wiiControlsBtn.SetEffectGrow(); + + GuiText screenshotBtnTxt("Screenshot", 22, (GXColor){0, 0, 0, 255}); + GuiImage screenshotBtnImg(&btnLargeOutline); + GuiImage screenshotBtnImgOver(&btnLargeOutlineOver); + GuiImage screenshotBtnIcon(&iconScreenshot); + GuiButton screenshotBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + screenshotBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + screenshotBtn.SetPosition(125, 250); + screenshotBtn.SetLabel(&screenshotBtnTxt); + screenshotBtn.SetImage(&screenshotBtnImg); + screenshotBtn.SetImageOver(&screenshotBtnImgOver); + screenshotBtn.SetIcon(&screenshotBtnIcon); + screenshotBtn.SetSoundOver(&btnSoundOver); + screenshotBtn.SetSoundClick(&btnSoundClick); + screenshotBtn.SetTrigger(trigA); + screenshotBtn.SetTrigger(trig2); + screenshotBtn.SetEffectGrow(); + + GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); + GuiImage closeBtnImg(&btnCloseOutline); + GuiImage closeBtnImgOver(&btnCloseOutlineOver); + GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + closeBtn.SetPosition(-50, 35); + closeBtn.SetLabel(&closeBtnTxt); + closeBtn.SetImage(&closeBtnImg); + closeBtn.SetImageOver(&closeBtnImgOver); + closeBtn.SetSoundOver(&btnSoundOver); + closeBtn.SetSoundClick(&btnSoundClick); + closeBtn.SetTrigger(trigA); + closeBtn.SetTrigger(trig2); + closeBtn.SetTrigger(&trigHome); + closeBtn.SetEffectGrow(); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + w.Append(&mappingBtn); + w.Append(&videoBtn); + w.Append(&wiiControlsBtn); + w.Append(&screenshotBtn); + w.Append(&closeBtn); + w.Append(&backBtn); + + mainWindow->Append(&w); + + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(mappingBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS; + } + else if(videoBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_VIDEO; + } + else if(wiiControlsBtn.GetState() == STATE_CLICKED) + { + GCSettings.WiiControls ^= 1; + if (GCSettings.WiiControls) sprintf(s, "ON"); + else sprintf(s, "OFF"); + wiiControlsBtnTxt2.SetText(s); + wiiControlsBtn.ResetState(); + } + else if(screenshotBtn.GetState() == STATE_CLICKED) + { + if (WindowPrompt("Preview Screenshot", "Save a new Preview Screenshot? Current Screenshot image will be overwritten.", "OK", "Cancel")) + { + snprintf(filepath, 1024, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], GCSettings.ScreenshotsFolder, ROMFilename); + SavePreviewImg(filepath, SILENT); + } + } + else if(closeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_EXIT; + + exitSound->Play(); + bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + backBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + + w.SetEffect(EFFECT_FADE, -15); + + usleep(350000); // wait for effects to finish + } + else if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAME; + } + } + + HaltGui(); + mainWindow->Remove(&w); + return menu; +} + +/**************************************************************************** + * MenuSettingsMappings + ***************************************************************************/ +static int MenuSettingsMappings() +{ + int menu = MENU_NONE; + + GuiText titleTxt("Game Settings - Button Mappings", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData iconWiimote(icon_settings_wiimote_png); + GuiImageData iconClassic(icon_settings_classic_png); + GuiImageData iconGamecube(icon_settings_gamecube_png); + GuiImageData iconNunchuk(icon_settings_nunchuk_png); + GuiImageData iconWiiupro(icon_settings_wiiupro_png); + + GuiText gamecubeBtnTxt("GameCube Controller", 22, (GXColor){0, 0, 0, 255}); + gamecubeBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); + GuiImage gamecubeBtnImg(&btnLargeOutline); + GuiImage gamecubeBtnImgOver(&btnLargeOutlineOver); + GuiImage gamecubeBtnIcon(&iconGamecube); + GuiButton gamecubeBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + gamecubeBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + gamecubeBtn.SetPosition(-125, 120); + gamecubeBtn.SetLabel(&gamecubeBtnTxt); + gamecubeBtn.SetImage(&gamecubeBtnImg); + gamecubeBtn.SetImageOver(&gamecubeBtnImgOver); + gamecubeBtn.SetIcon(&gamecubeBtnIcon); + gamecubeBtn.SetSoundOver(&btnSoundOver); + gamecubeBtn.SetSoundClick(&btnSoundClick); + gamecubeBtn.SetTrigger(trigA); + gamecubeBtn.SetTrigger(trig2); + gamecubeBtn.SetEffectGrow(); + + GuiText wiimoteBtnTxt("Wiimote", 22, (GXColor){0, 0, 0, 255}); + GuiImage wiimoteBtnImg(&btnLargeOutline); + GuiImage wiimoteBtnImgOver(&btnLargeOutlineOver); + GuiImage wiimoteBtnIcon(&iconWiimote); + GuiButton wiimoteBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + wiimoteBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + wiimoteBtn.SetPosition(125, 120); + wiimoteBtn.SetLabel(&wiimoteBtnTxt); + wiimoteBtn.SetImage(&wiimoteBtnImg); + wiimoteBtn.SetImageOver(&wiimoteBtnImgOver); + wiimoteBtn.SetIcon(&wiimoteBtnIcon); + wiimoteBtn.SetSoundOver(&btnSoundOver); + wiimoteBtn.SetSoundClick(&btnSoundClick); + wiimoteBtn.SetTrigger(trigA); + wiimoteBtn.SetTrigger(trig2); + wiimoteBtn.SetEffectGrow(); + + GuiText classicBtnTxt("Classic Controller", 22, (GXColor){0, 0, 0, 255}); + classicBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); + GuiImage classicBtnImg(&btnLargeOutline); + GuiImage classicBtnImgOver(&btnLargeOutlineOver); + GuiImage classicBtnIcon(&iconClassic); + GuiButton classicBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + classicBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + classicBtn.SetPosition(-200, 250); + classicBtn.SetLabel(&classicBtnTxt); + classicBtn.SetImage(&classicBtnImg); + classicBtn.SetImageOver(&classicBtnImgOver); + classicBtn.SetIcon(&classicBtnIcon); + classicBtn.SetSoundOver(&btnSoundOver); + classicBtn.SetSoundClick(&btnSoundClick); + classicBtn.SetTrigger(trigA); + classicBtn.SetTrigger(trig2); + classicBtn.SetEffectGrow(); + + GuiText wiiuproBtnTxt("Wii U Pro Controller", 22, (GXColor){0, 0, 0, 255}); + wiiuproBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-20); + GuiImage wiiuproBtnImg(&btnLargeOutline); + GuiImage wiiuproBtnImgOver(&btnLargeOutlineOver); + GuiImage wiiuproBtnIcon(&iconWiiupro); + GuiButton wiiuproBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + wiiuproBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + wiiuproBtn.SetPosition(0, 250); + wiiuproBtn.SetLabel(&wiiuproBtnTxt); + wiiuproBtn.SetImage(&wiiuproBtnImg); + wiiuproBtn.SetImageOver(&wiiuproBtnImgOver); + wiiuproBtn.SetIcon(&wiiuproBtnIcon); + wiiuproBtn.SetSoundOver(&btnSoundOver); + wiiuproBtn.SetSoundClick(&btnSoundClick); + wiiuproBtn.SetTrigger(trigA); + wiiuproBtn.SetTrigger(trig2); + wiiuproBtn.SetEffectGrow(); + + GuiText nunchukBtnTxt1("Wiimote", 22, (GXColor){0, 0, 0, 255}); + GuiText nunchukBtnTxt2("&", 18, (GXColor){0, 0, 0, 255}); + GuiText nunchukBtnTxt3("Nunchuk", 22, (GXColor){0, 0, 0, 255}); + nunchukBtnTxt1.SetPosition(0, -20); + nunchukBtnTxt3.SetPosition(0, +20); + GuiImage nunchukBtnImg(&btnLargeOutline); + GuiImage nunchukBtnImgOver(&btnLargeOutlineOver); + GuiImage nunchukBtnIcon(&iconNunchuk); + GuiButton nunchukBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + nunchukBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + nunchukBtn.SetPosition(200, 250); + nunchukBtn.SetLabel(&nunchukBtnTxt1, 0); + nunchukBtn.SetLabel(&nunchukBtnTxt2, 1); + nunchukBtn.SetLabel(&nunchukBtnTxt3, 2); + nunchukBtn.SetImage(&nunchukBtnImg); + nunchukBtn.SetImageOver(&nunchukBtnImgOver); + nunchukBtn.SetIcon(&nunchukBtnIcon); + nunchukBtn.SetSoundOver(&btnSoundOver); + nunchukBtn.SetSoundClick(&btnSoundClick); + nunchukBtn.SetTrigger(trigA); + nunchukBtn.SetTrigger(trig2); + nunchukBtn.SetEffectGrow(); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + + w.Append(&gamecubeBtn); +#ifdef HW_RVL + w.Append(&wiimoteBtn); + w.Append(&nunchukBtn); + w.Append(&classicBtn); + w.Append(&wiiuproBtn); +#endif + w.Append(&backBtn); + + mainWindow->Append(&w); + + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(wiimoteBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_WIIMOTE; + } + else if(nunchukBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_NUNCHUK; + } + else if(classicBtn.GetState() == STATE_CLICKED) + { + wiiuproCtrl = 0; + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_CLASSIC; + } + else if(wiiuproBtn.GetState() == STATE_CLICKED) + { + wiiuproCtrl = 1; + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_CLASSIC; + } + else if(gamecubeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS_MAP; + mapMenuCtrl = CTRLR_GCPAD; + } + else if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&w); + return menu; +} + +/**************************************************************************** + * ButtonMappingWindow + ***************************************************************************/ +static u32 +ButtonMappingWindow() +{ + GuiWindow promptWindow(448,288); + promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + promptWindow.SetPosition(0, -10); + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiImageData dialogBox(dialogue_box_png); + GuiImage dialogBoxImg(&dialogBox); + + GuiText titleTxt("Button Mapping", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + titleTxt.SetPosition(0,14); + + char msg[200]; + + switch(mapMenuCtrl) + { + case CTRLR_GCPAD: + #ifdef HW_RVL + sprintf(msg, "Press any button on the GameCube Controller now. Press Home or the C-Stick in any direction to clear the existing mapping."); + #else + sprintf(msg, "Press any button on the GameCube Controller now. Press the C-Stick in any direction to clear the existing mapping."); + #endif + break; + case CTRLR_WIIMOTE: + sprintf(msg, "Press any button on the Wiimote now. Press Home to clear the existing mapping."); + break; + case CTRLR_CLASSIC: + if(wiiuproCtrl == 1) + { + sprintf(msg, "Press any button on the Wii U Pro Controller now. Press Home to clear the existing mapping."); + } + else + { + sprintf(msg, "Press any button on the Classic Controller now. Press Home to clear the existing mapping."); + } + break; + case CTRLR_NUNCHUK: + sprintf(msg, "Press any button on the Wiimote or Nunchuk now. Press Home to clear the existing mapping."); + break; + } + + GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255}); + msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + msgTxt.SetPosition(0,-20); + msgTxt.SetWrap(true, 430); + + promptWindow.Append(&dialogBoxImg); + promptWindow.Append(&titleTxt); + promptWindow.Append(&msgTxt); + + HaltGui(); + mainWindow->SetState(STATE_DISABLED); + mainWindow->Append(&promptWindow); + mainWindow->ChangeFocus(&promptWindow); + ResumeGui(); + + u32 pressed = 0; + + while(pressed == 0) + { + usleep(THREAD_SLEEP); + + if(mapMenuCtrl == CTRLR_GCPAD) + { + pressed = userInput[0].pad.btns_d; + + + if(userInput[0].pad.substickX < -70 || + userInput[0].pad.substickX > 70 || + userInput[0].pad.substickY < -70 || + userInput[0].pad.substickY > 70) + pressed = WPAD_BUTTON_HOME; + + if(userInput[0].wpad->btns_d == WPAD_BUTTON_HOME) + pressed = WPAD_BUTTON_HOME; + } + else + { + pressed = userInput[0].wpad->btns_d; + + // always allow Home button to be pressed to cancel + if(pressed != WPAD_BUTTON_HOME) + { + switch(mapMenuCtrl) + { + case CTRLR_WIIMOTE: + if(pressed > 0x1000) + pressed = 0; // not a valid input + break; + + case CTRLR_CLASSIC: + if(userInput[0].wpad->exp.type != WPAD_EXP_CLASSIC) + pressed = 0; // not a valid input + else if(pressed <= 0x1000) + pressed = 0; + break; + + case CTRLR_NUNCHUK: + if(userInput[0].wpad->exp.type != WPAD_EXP_NUNCHUK) + pressed = 0; // not a valid input + break; + } + } + if(pressed == 0) + pressed = userInput[0].wupcdata.btns_d; + } + } + + if(pressed == WPAD_BUTTON_HOME || pressed == WPAD_CLASSIC_BUTTON_HOME) + pressed = 0; + + HaltGui(); + mainWindow->Remove(&promptWindow); + mainWindow->SetState(STATE_DEFAULT); + ResumeGui(); + + return pressed; +} + +static int MenuSettingsMappingsMap() +{ + int menu = MENU_NONE; + int ret,i,j; + bool firstRun = true; + OptionList options; + + char menuTitle[100]; + char menuSubtitle[100]; + sprintf(menuTitle, "Game Settings - Button Mappings"); + + GuiText titleTxt(menuTitle, 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,30); + + if(wiiuproCtrl == 1) + { + sprintf(menuSubtitle, "%s", "Wii U Pro Controller"); + } + else + { + sprintf(menuSubtitle, "%s", ctrlrName[mapMenuCtrl]); + } + GuiText subtitleTxt(menuSubtitle, 20, (GXColor){255, 255, 255, 255}); + subtitleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + subtitleTxt.SetPosition(50,60); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnShortOutline(button_short_png); + GuiImageData btnShortOutlineOver(button_short_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiText resetBtnTxt("Reset", 22, (GXColor){0, 0, 0, 255}); + GuiImage resetBtnImg(&btnShortOutline); + GuiImage resetBtnImgOver(&btnShortOutlineOver); + GuiButton resetBtn(btnShortOutline.GetWidth(), btnShortOutline.GetHeight()); + resetBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + resetBtn.SetPosition(260, -35); + resetBtn.SetLabel(&resetBtnTxt); + resetBtn.SetImage(&resetBtnImg); + resetBtn.SetImageOver(&resetBtnImgOver); + resetBtn.SetSoundOver(&btnSoundOver); + resetBtn.SetSoundClick(&btnSoundClick); + resetBtn.SetTrigger(trigA); + resetBtn.SetTrigger(trig2); + resetBtn.SetEffectGrow(); + + i=0; + sprintf(options.name[i++], "B"); + sprintf(options.name[i++], "A"); + sprintf(options.name[i++], "Select"); + sprintf(options.name[i++], "Start"); + sprintf(options.name[i++], "Up"); + sprintf(options.name[i++], "Down"); + sprintf(options.name[i++], "Left"); + sprintf(options.name[i++], "Right"); + sprintf(options.name[i++], "L"); + sprintf(options.name[i++], "R"); + options.length = i; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + optionBrowser.SetCol2Position(215); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + w.Append(&resetBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + mainWindow->Append(&subtitleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS_MAPPINGS; + } + else if(resetBtn.GetState() == STATE_CLICKED) + { + resetBtn.ResetState(); + + int choice = WindowPrompt( + "Reset Mappings", + "Are you sure that you want to reset your mappings?", + "Yes", + "No"); + + if(choice == 1) + { + ResetControls(mapMenuCtrl); + firstRun = true; + } + } + + ret = optionBrowser.GetClickedOption(); + + if(ret >= 0) + { + // get a button selection from user + btnmap[mapMenuCtrl][ret] = ButtonMappingWindow(); + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + + for(i=0; i < options.length; i++) + { + for(j=0; j < ctrlr_def[mapMenuCtrl].num_btns; j++) + { + if(btnmap[mapMenuCtrl][i] == 0) + { + options.value[i][0] = 0; + } + else if(btnmap[mapMenuCtrl][i] == + ctrlr_def[mapMenuCtrl].map[j].btn) + { + if(strcmp(options.value[i], ctrlr_def[mapMenuCtrl].map[j].name) != 0) + sprintf(options.value[i], ctrlr_def[mapMenuCtrl].map[j].name); + break; + } + } + } + optionBrowser.TriggerUpdate(); + } + } + wiiuproCtrl = 0; + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + mainWindow->Remove(&subtitleTxt); + return menu; +} + +/**************************************************************************** + * MenuSettingsVideo + ***************************************************************************/ + +static void ScreenZoomWindowUpdate(void * ptr, float h, float v) +{ + GuiButton * b = (GuiButton *)ptr; + if(b->GetState() == STATE_CLICKED) + { + char zoom[10], zoom2[10]; + + if(IsGBAGame()) + { + GCSettings.gbaZoomHor += h; + GCSettings.gbaZoomVert += v; + sprintf(zoom, "%.2f%%", GCSettings.gbaZoomHor*100); + sprintf(zoom2, "%.2f%%", GCSettings.gbaZoomVert*100); + } + else + { + GCSettings.gbZoomHor += h; + GCSettings.gbZoomVert += v; + sprintf(zoom, "%.2f%%", GCSettings.gbZoomHor*100); + sprintf(zoom2, "%.2f%%", GCSettings.gbZoomVert*100); + } + + settingText->SetText(zoom); + settingText2->SetText(zoom2); + b->ResetState(); + } +} + +static void ScreenZoomWindowLeftClick(void * ptr) { ScreenZoomWindowUpdate(ptr, -0.01, 0); } +static void ScreenZoomWindowRightClick(void * ptr) { ScreenZoomWindowUpdate(ptr, +0.01, 0); } +static void ScreenZoomWindowUpClick(void * ptr) { ScreenZoomWindowUpdate(ptr, 0, +0.01); } +static void ScreenZoomWindowDownClick(void * ptr) { ScreenZoomWindowUpdate(ptr, 0, -0.01); } + +static void ScreenZoomWindow() +{ + GuiWindow * w = new GuiWindow(200,200); + w->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + + GuiTrigger trigLeft; + trigLeft.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); + + GuiTrigger trigRight; + trigRight.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); + + GuiTrigger trigUp; + trigUp.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP, PAD_BUTTON_UP); + + GuiTrigger trigDown; + trigDown.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN, PAD_BUTTON_DOWN); + + GuiImageData arrowLeft(button_arrow_left_png); + GuiImage arrowLeftImg(&arrowLeft); + GuiImageData arrowLeftOver(button_arrow_left_over_png); + GuiImage arrowLeftOverImg(&arrowLeftOver); + GuiButton arrowLeftBtn(arrowLeft.GetWidth(), arrowLeft.GetHeight()); + arrowLeftBtn.SetImage(&arrowLeftImg); + arrowLeftBtn.SetImageOver(&arrowLeftOverImg); + arrowLeftBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + arrowLeftBtn.SetPosition(50, 0); + arrowLeftBtn.SetTrigger(trigA); + arrowLeftBtn.SetTrigger(trig2); + arrowLeftBtn.SetTrigger(&trigLeft); + arrowLeftBtn.SetSelectable(false); + arrowLeftBtn.SetUpdateCallback(ScreenZoomWindowLeftClick); + + GuiImageData arrowRight(button_arrow_right_png); + GuiImage arrowRightImg(&arrowRight); + GuiImageData arrowRightOver(button_arrow_right_over_png); + GuiImage arrowRightOverImg(&arrowRightOver); + GuiButton arrowRightBtn(arrowRight.GetWidth(), arrowRight.GetHeight()); + arrowRightBtn.SetImage(&arrowRightImg); + arrowRightBtn.SetImageOver(&arrowRightOverImg); + arrowRightBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + arrowRightBtn.SetPosition(164, 0); + arrowRightBtn.SetTrigger(trigA); + arrowRightBtn.SetTrigger(trig2); + arrowRightBtn.SetTrigger(&trigRight); + arrowRightBtn.SetSelectable(false); + arrowRightBtn.SetUpdateCallback(ScreenZoomWindowRightClick); + + GuiImageData arrowUp(button_arrow_up_png); + GuiImage arrowUpImg(&arrowUp); + GuiImageData arrowUpOver(button_arrow_up_over_png); + GuiImage arrowUpOverImg(&arrowUpOver); + GuiButton arrowUpBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); + arrowUpBtn.SetImage(&arrowUpImg); + arrowUpBtn.SetImageOver(&arrowUpOverImg); + arrowUpBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + arrowUpBtn.SetPosition(-76, -27); + arrowUpBtn.SetTrigger(trigA); + arrowUpBtn.SetTrigger(trig2); + arrowUpBtn.SetTrigger(&trigUp); + arrowUpBtn.SetSelectable(false); + arrowUpBtn.SetUpdateCallback(ScreenZoomWindowUpClick); + + GuiImageData arrowDown(button_arrow_down_png); + GuiImage arrowDownImg(&arrowDown); + GuiImageData arrowDownOver(button_arrow_down_over_png); + GuiImage arrowDownOverImg(&arrowDownOver); + GuiButton arrowDownBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); + arrowDownBtn.SetImage(&arrowDownImg); + arrowDownBtn.SetImageOver(&arrowDownOverImg); + arrowDownBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + arrowDownBtn.SetPosition(-76, 27); + arrowDownBtn.SetTrigger(trigA); + arrowDownBtn.SetTrigger(trig2); + arrowDownBtn.SetTrigger(&trigDown); + arrowDownBtn.SetSelectable(false); + arrowDownBtn.SetUpdateCallback(ScreenZoomWindowDownClick); + + GuiImageData screenPosition(screen_position_png); + GuiImage screenPositionImg(&screenPosition); + screenPositionImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + screenPositionImg.SetPosition(0, 0); + + settingText = new GuiText(NULL, 20, (GXColor){0, 0, 0, 255}); + settingText2 = new GuiText(NULL, 20, (GXColor){0, 0, 0, 255}); + char zoom[10], zoom2[10]; + float currentZoomHor, currentZoomVert; + + if(IsGBAGame()) + { + sprintf(zoom, "%.2f%%", GCSettings.gbaZoomHor*100); + sprintf(zoom2, "%.2f%%", GCSettings.gbaZoomVert*100); + currentZoomHor = GCSettings.gbaZoomHor; + currentZoomVert = GCSettings.gbaZoomVert; + } + else + { + sprintf(zoom, "%.2f%%", GCSettings.gbZoomHor*100); + sprintf(zoom2, "%.2f%%", GCSettings.gbZoomVert*100); + currentZoomHor = GCSettings.gbZoomHor; + currentZoomVert = GCSettings.gbZoomVert; + } + + settingText->SetText(zoom); + settingText->SetPosition(108, 0); + settingText2->SetText(zoom2); + settingText2->SetPosition(-76, 0); + + w->Append(&arrowLeftBtn); + w->Append(&arrowRightBtn); + w->Append(&arrowUpBtn); + w->Append(&arrowDownBtn); + w->Append(&screenPositionImg); + w->Append(settingText); + w->Append(settingText2); + + char windowName[20]; + if(IsGBAGame()) + sprintf(windowName, "GBA Screen Zoom"); + else + sprintf(windowName, "GB Screen Zoom"); + + if(!SettingWindow(windowName,w)) + { + // undo changes + if(IsGBAGame()) + { + GCSettings.gbaZoomHor = currentZoomHor; + GCSettings.gbaZoomVert = currentZoomVert; + } + else + { + GCSettings.gbZoomHor = currentZoomHor; + GCSettings.gbZoomVert = currentZoomVert; + } + } + + delete(w); + delete(settingText); + delete(settingText2); +} + +static void ScreenPositionWindowUpdate(void * ptr, int x, int y) +{ + GuiButton * b = (GuiButton *)ptr; + if(b->GetState() == STATE_CLICKED) + { + GCSettings.xshift += x; + GCSettings.yshift += y; + + char shift[10]; + sprintf(shift, "%i, %i", GCSettings.xshift, GCSettings.yshift); + settingText->SetText(shift); + b->ResetState(); + } +} + +static void ScreenPositionWindowLeftClick(void * ptr) { ScreenPositionWindowUpdate(ptr, -1, 0); } +static void ScreenPositionWindowRightClick(void * ptr) { ScreenPositionWindowUpdate(ptr, +1, 0); } +static void ScreenPositionWindowUpClick(void * ptr) { ScreenPositionWindowUpdate(ptr, 0, -1); } +static void ScreenPositionWindowDownClick(void * ptr) { ScreenPositionWindowUpdate(ptr, 0, +1); } + +static void ScreenPositionWindow() +{ + GuiWindow * w = new GuiWindow(150,150); + w->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + w->SetPosition(0, -10); + + GuiTrigger trigLeft; + trigLeft.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT); + + GuiTrigger trigRight; + trigRight.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT); + + GuiTrigger trigUp; + trigUp.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP, PAD_BUTTON_UP); + + GuiTrigger trigDown; + trigDown.SetButtonOnlyInFocusTrigger(-1, WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN, PAD_BUTTON_DOWN); + + GuiImageData arrowLeft(button_arrow_left_png); + GuiImage arrowLeftImg(&arrowLeft); + GuiImageData arrowLeftOver(button_arrow_left_over_png); + GuiImage arrowLeftOverImg(&arrowLeftOver); + GuiButton arrowLeftBtn(arrowLeft.GetWidth(), arrowLeft.GetHeight()); + arrowLeftBtn.SetImage(&arrowLeftImg); + arrowLeftBtn.SetImageOver(&arrowLeftOverImg); + arrowLeftBtn.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + arrowLeftBtn.SetTrigger(trigA); + arrowLeftBtn.SetTrigger(trig2); + arrowLeftBtn.SetTrigger(&trigLeft); + arrowLeftBtn.SetSelectable(false); + arrowLeftBtn.SetUpdateCallback(ScreenPositionWindowLeftClick); + + GuiImageData arrowRight(button_arrow_right_png); + GuiImage arrowRightImg(&arrowRight); + GuiImageData arrowRightOver(button_arrow_right_over_png); + GuiImage arrowRightOverImg(&arrowRightOver); + GuiButton arrowRightBtn(arrowRight.GetWidth(), arrowRight.GetHeight()); + arrowRightBtn.SetImage(&arrowRightImg); + arrowRightBtn.SetImageOver(&arrowRightOverImg); + arrowRightBtn.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); + arrowRightBtn.SetTrigger(trigA); + arrowRightBtn.SetTrigger(trig2); + arrowRightBtn.SetTrigger(&trigRight); + arrowRightBtn.SetSelectable(false); + arrowRightBtn.SetUpdateCallback(ScreenPositionWindowRightClick); + + GuiImageData arrowUp(button_arrow_up_png); + GuiImage arrowUpImg(&arrowUp); + GuiImageData arrowUpOver(button_arrow_up_over_png); + GuiImage arrowUpOverImg(&arrowUpOver); + GuiButton arrowUpBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); + arrowUpBtn.SetImage(&arrowUpImg); + arrowUpBtn.SetImageOver(&arrowUpOverImg); + arrowUpBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + arrowUpBtn.SetTrigger(trigA); + arrowUpBtn.SetTrigger(trig2); + arrowUpBtn.SetTrigger(&trigUp); + arrowUpBtn.SetSelectable(false); + arrowUpBtn.SetUpdateCallback(ScreenPositionWindowUpClick); + + GuiImageData arrowDown(button_arrow_down_png); + GuiImage arrowDownImg(&arrowDown); + GuiImageData arrowDownOver(button_arrow_down_over_png); + GuiImage arrowDownOverImg(&arrowDownOver); + GuiButton arrowDownBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); + arrowDownBtn.SetImage(&arrowDownImg); + arrowDownBtn.SetImageOver(&arrowDownOverImg); + arrowDownBtn.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); + arrowDownBtn.SetTrigger(trigA); + arrowDownBtn.SetTrigger(trig2); + arrowDownBtn.SetTrigger(&trigDown); + arrowDownBtn.SetSelectable(false); + arrowDownBtn.SetUpdateCallback(ScreenPositionWindowDownClick); + + GuiImageData screenPosition(screen_position_png); + GuiImage screenPositionImg(&screenPosition); + screenPositionImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + + settingText = new GuiText(NULL, 20, (GXColor){0, 0, 0, 255}); + char shift[10]; + sprintf(shift, "%i, %i", GCSettings.xshift, GCSettings.yshift); + settingText->SetText(shift); + + int currentX = GCSettings.xshift; + int currentY = GCSettings.yshift; + + w->Append(&arrowLeftBtn); + w->Append(&arrowRightBtn); + w->Append(&arrowUpBtn); + w->Append(&arrowDownBtn); + w->Append(&screenPositionImg); + w->Append(settingText); + + if(!SettingWindow("Screen Position",w)) + { + // undo changes + GCSettings.xshift = currentX; + GCSettings.yshift = currentY; + } + + delete(w); + delete(settingText); +} + +static int MenuSettingsVideo() +{ + int menu = MENU_NONE; + int ret; + int i = 0; + bool firstRun = true; + OptionList options; + + sprintf(options.name[i++], "Rendering"); + sprintf(options.name[i++], "Scaling"); + if(IsGBAGame()) { + sprintf(options.name[i++], "GBA Screen Zoom"); + sprintf(options.name[i++], "GBA Fixed Pixel Ratio"); + } else { + sprintf(options.name[i++], "GB Screen Zoom"); + sprintf(options.name[i++], "GB Fixed Pixel Ratio"); + } + sprintf(options.name[i++], "Screen Position"); + sprintf(options.name[i++], "Video Mode"); + sprintf(options.name[i++], "GB Mono Colorization"); + sprintf(options.name[i++], "GB Palette"); + sprintf(options.name[i++], "GBA Frameskip"); + options.length = i; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + if(IsGBAGame()) + options.name[6][0] = 0; + + if(!IsGameboyGame()) + options.name[7][0] = 0; // disable palette option for GBA/GBC + + GuiText titleTxt("Game Settings - Video", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetCol2Position(240); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + switch (ret) + { + case 0: + GCSettings.render++; + if (GCSettings.render > 4) + GCSettings.render = 1; + break; + + case 1: + GCSettings.scaling++; + if (GCSettings.scaling > 3) + GCSettings.scaling = 0; + // disable Widescreen correction in Wii mode - determined automatically + #ifdef HW_RVL + if(GCSettings.scaling == 3) + GCSettings.scaling = 0; + #endif + break; + + case 2: + ScreenZoomWindow(); + break; + + case 3: + if(IsGBAGame()) { + GCSettings.gbaFixed++; + if(GCSettings.gbaFixed > 3) + GCSettings.gbaFixed = 0; + } else { + GCSettings.gbFixed++; + if(GCSettings.gbFixed > 3) + GCSettings.gbFixed = 0; + } + break; + + case 4: + ScreenPositionWindow(); + break; + + case 5: + GCSettings.videomode++; + if(GCSettings.videomode > 6) + GCSettings.videomode = 0; + break; + + case 6: + GCSettings.colorize ^= 1; + break; + + case 7: + menu = MENU_GAMESETTINGS_PALETTE; + break; + + case 8: + GCSettings.gbaFrameskip ^= 1; + break; + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + + if (GCSettings.render == 0) + sprintf (options.value[0], "Original"); + else if (GCSettings.render == 1) + sprintf (options.value[0], "Filtered (Auto)"); + else if (GCSettings.render == 2) + sprintf (options.value[0], "Unfiltered"); + else if (GCSettings.render == 3) + sprintf (options.value[0], "Filtered (Sharp)"); + else if (GCSettings.render == 4) + sprintf (options.value[0], "Filtered (Soft)"); + + if (GCSettings.scaling == 0) + sprintf (options.value[1], "Maintain Aspect Ratio"); + else if (GCSettings.scaling == 1) + sprintf (options.value[1], "Partial Stretch"); + else if (GCSettings.scaling == 2) + sprintf (options.value[1], "Stretch to Fit"); + else if (GCSettings.scaling == 3) + sprintf (options.value[1], "16:9 Correction"); + + int fixed; + if(IsGBAGame()) { + sprintf (options.value[2], "%.2f%%, %.2f%%", GCSettings.gbaZoomHor*100, GCSettings.gbaZoomVert*100); + fixed = GCSettings.gbaFixed; + } else { + sprintf (options.value[2], "%.2f%%, %.2f%%", GCSettings.gbZoomHor*100, GCSettings.gbZoomVert*100); + fixed = GCSettings.gbFixed; + } + + if (fixed) { + int w = fixed / 10; + int ratio = fixed % 10; + const char* widescreen = w + ? "(16:9 Correction)" + : ""; + + sprintf (options.value[3], "%dx %s", ratio, widescreen); + } else { + sprintf (options.value[3], "Disabled"); + } + + sprintf (options.value[4], "%d, %d", GCSettings.xshift, GCSettings.yshift); + + switch(GCSettings.videomode) + { + case 0: + sprintf (options.value[5], "Automatic (Recommended)"); break; + case 1: + sprintf (options.value[5], "NTSC (480i)"); break; + case 2: + sprintf (options.value[5], "NTSC (480p)"); break; + case 3: + sprintf (options.value[5], "PAL (576i)"); break; + case 4: + sprintf (options.value[5], "European RGB (240i)"); break; + case 5: + sprintf (options.value[5], "NTSC (240p)"); break; + case 6: + sprintf (options.value[5], "European RGB (240p)"); break; + } + + if (GCSettings.colorize) + sprintf (options.value[6], "On"); + else + sprintf (options.value[6], "Off"); + + if(strcmp(CurrentPalette.gameName, "default")) + sprintf(options.value[7], "Custom"); + else + sprintf(options.value[7], "Default"); + + if (GCSettings.gbaFrameskip) + sprintf (options.value[8], "On"); + else + sprintf (options.value[8], "Off"); + + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + return menu; +} + +static int MenuSettingsEmulation() +{ + int menu = MENU_NONE; + int ret; + int i = 0; + bool firstRun = true; + OptionList options; + + sprintf(options.name[i++], "Hardware (GB/GBC)"); + sprintf(options.name[i++], "Super Game Boy border"); + sprintf(options.name[i++], "Offset from UTC (hours)"); + sprintf(options.name[i++], "GB Screen Palette"); + options.length = i; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiText titleTxt("Game Settings - Emulation", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(50, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetCol2Position(240); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + switch (ret) + { + case 0: + GCSettings.GBHardware++; + if (GCSettings.GBHardware > 5) + GCSettings.GBHardware = 0; + break; + + case 1: + GCSettings.SGBBorder++; + if (GCSettings.SGBBorder > 2) + GCSettings.SGBBorder = 0; + break; + + case 2: + GCSettings.OffsetMinutesUTC += 15; + if (GCSettings.OffsetMinutesUTC > 60*14) { + GCSettings.OffsetMinutesUTC = -60*12; + } + break; + case 3: + GCSettings.BasicPalette ^= 1; + break; + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + + if (GCSettings.GBHardware == 0) + sprintf (options.value[0], "Auto"); + else if (GCSettings.GBHardware == 1) + sprintf (options.value[0], "Game Boy Color"); + else if (GCSettings.GBHardware == 2) + sprintf (options.value[0], "Super Game Boy"); + else if (GCSettings.GBHardware == 3) + sprintf (options.value[0], "Game Boy"); + else if (GCSettings.GBHardware == 4) + sprintf (options.value[0], "Game Boy Advance"); + else if (GCSettings.GBHardware == 5) + sprintf (options.value[0], "Super Game Boy 2"); + + if (GCSettings.SGBBorder == 0) + sprintf (options.value[1], "Off"); + else if (GCSettings.SGBBorder == 1) + sprintf (options.value[1], "From game (SGB only)"); + else if (GCSettings.SGBBorder == 2) + sprintf (options.value[1], "From .png file"); + + sprintf (options.value[2], "%+.2f", GCSettings.OffsetMinutesUTC / 60.0); + + if (GCSettings.BasicPalette == 0) + sprintf (options.value[3], "Green Screen"); + else + sprintf (options.value[3], "Monochrome Screen"); + + + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS; + } + } + HaltGui(); + InitialisePalette(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + return menu; +} + +/**************************************************************************** + * MenuSettings + ***************************************************************************/ +static int MenuSettings() +{ + int menu = MENU_NONE; + + GuiText titleTxt("Settings", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData iconFile(icon_settings_file_png); + GuiImageData iconMenu(icon_settings_menu_png); + GuiImageData iconNetwork(icon_settings_network_png); + GuiImageData iconEmulation(icon_game_settings_png); + + GuiText savingBtnTxt1("Saving", 22, (GXColor){0, 0, 0, 255}); + GuiText savingBtnTxt2("&", 18, (GXColor){0, 0, 0, 255}); + GuiText savingBtnTxt3("Loading", 22, (GXColor){0, 0, 0, 255}); + savingBtnTxt1.SetPosition(0, -20); + savingBtnTxt3.SetPosition(0, +20); + GuiImage savingBtnImg(&btnLargeOutline); + GuiImage savingBtnImgOver(&btnLargeOutlineOver); + GuiImage fileBtnIcon(&iconFile); + GuiButton savingBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + savingBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + savingBtn.SetPosition(-125, 120); + savingBtn.SetLabel(&savingBtnTxt1, 0); + savingBtn.SetLabel(&savingBtnTxt2, 1); + savingBtn.SetLabel(&savingBtnTxt3, 2); + savingBtn.SetImage(&savingBtnImg); + savingBtn.SetImageOver(&savingBtnImgOver); + savingBtn.SetIcon(&fileBtnIcon); + savingBtn.SetSoundOver(&btnSoundOver); + savingBtn.SetSoundClick(&btnSoundClick); + savingBtn.SetTrigger(trigA); + savingBtn.SetTrigger(trig2); + savingBtn.SetEffectGrow(); + + GuiText menuBtnTxt("Menu", 22, (GXColor){0, 0, 0, 255}); + menuBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); + GuiImage menuBtnImg(&btnLargeOutline); + GuiImage menuBtnImgOver(&btnLargeOutlineOver); + GuiImage menuBtnIcon(&iconMenu); + GuiButton menuBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + menuBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + menuBtn.SetPosition(125, 120); + menuBtn.SetLabel(&menuBtnTxt); + menuBtn.SetImage(&menuBtnImg); + menuBtn.SetImageOver(&menuBtnImgOver); + menuBtn.SetIcon(&menuBtnIcon); + menuBtn.SetSoundOver(&btnSoundOver); + menuBtn.SetSoundClick(&btnSoundClick); + menuBtn.SetTrigger(trigA); + menuBtn.SetTrigger(trig2); + menuBtn.SetEffectGrow(); + + GuiText networkBtnTxt("Network", 22, (GXColor){0, 0, 0, 255}); + networkBtnTxt.SetWrap(true, btnLargeOutline.GetWidth()-30); + GuiImage networkBtnImg(&btnLargeOutline); + GuiImage networkBtnImgOver(&btnLargeOutlineOver); + GuiImage networkBtnIcon(&iconNetwork); + GuiButton networkBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + networkBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + networkBtn.SetPosition(-125, 250); + networkBtn.SetLabel(&networkBtnTxt); + networkBtn.SetImage(&networkBtnImg); + networkBtn.SetImageOver(&networkBtnImgOver); + networkBtn.SetIcon(&networkBtnIcon); + networkBtn.SetSoundOver(&btnSoundOver); + networkBtn.SetSoundClick(&btnSoundClick); + networkBtn.SetTrigger(trigA); + networkBtn.SetTrigger(trig2); + networkBtn.SetEffectGrow(); + + GuiText emulationBtnTxt("Emulation", 22, (GXColor){0, 0, 0, 255}); + GuiImage emulationBtnImg(&btnLargeOutline); + GuiImage emulationBtnImgOver(&btnLargeOutlineOver); + GuiImage emulationBtnIcon(&iconEmulation); + GuiButton emulationBtn(btnLargeOutline.GetWidth(), btnLargeOutline.GetHeight()); + emulationBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + emulationBtn.SetPosition(125, 250); + emulationBtn.SetLabel(&emulationBtnTxt); + emulationBtn.SetImage(&emulationBtnImg); + emulationBtn.SetImageOver(&emulationBtnImgOver); + emulationBtn.SetIcon(&emulationBtnIcon); + emulationBtn.SetSoundOver(&btnSoundOver); + emulationBtn.SetSoundClick(&btnSoundClick); + emulationBtn.SetTrigger(trigA); + emulationBtn.SetEffectGrow(); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(90, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiText resetBtnTxt("Reset Settings", 22, (GXColor){0, 0, 0, 255}); + GuiImage resetBtnImg(&btnOutline); + GuiImage resetBtnImgOver(&btnOutlineOver); + GuiButton resetBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + resetBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM); + resetBtn.SetPosition(-90, -35); + resetBtn.SetLabel(&resetBtnTxt); + resetBtn.SetImage(&resetBtnImg); + resetBtn.SetImageOver(&resetBtnImgOver); + resetBtn.SetSoundOver(&btnSoundOver); + resetBtn.SetSoundClick(&btnSoundClick); + resetBtn.SetTrigger(trigA); + resetBtn.SetTrigger(trig2); + resetBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + w.Append(&savingBtn); + w.Append(&menuBtn); + w.Append(&networkBtn); + w.Append(&emulationBtn); + w.Append(&backBtn); + w.Append(&resetBtn); + + mainWindow->Append(&w); + + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(savingBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS_FILE; + } + else if(menuBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS_MENU; + } + else if(networkBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS_NETWORK; + } + else if(emulationBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS_EMULATION; + } + else if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_GAMESELECTION; + } + else if(resetBtn.GetState() == STATE_CLICKED) + { + resetBtn.ResetState(); + + int choice = WindowPrompt( + "Reset Settings", + "Are you sure that you want to reset your settings?", + "Yes", + "No"); + + if(choice == 1) + DefaultSettings(); + } + } + + HaltGui(); + mainWindow->Remove(&w); + return menu; +} + +/**************************************************************************** + * MenuSettingsFile + ***************************************************************************/ + +static int MenuSettingsFile() +{ + int menu = MENU_NONE; + int ret; + int i = 0; + bool firstRun = true; + OptionList options; + sprintf(options.name[i++], "Load Device"); + sprintf(options.name[i++], "Save Device"); + sprintf(options.name[i++], "Load Folder"); + sprintf(options.name[i++], "Save Folder"); + sprintf(options.name[i++], "Screenshots Folder"); + sprintf(options.name[i++], "Covers Folder"); + sprintf(options.name[i++], "Artworks Folder"); + sprintf(options.name[i++], "Auto Load"); + sprintf(options.name[i++], "Auto Save"); + sprintf(options.name[i++], "Append Auto to .SAV Files"); + options.length = i; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiText titleTxt("Settings - Saving & Loading", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(90, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + optionBrowser.SetCol2Position(215); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + switch (ret) + { + case 0: + GCSettings.LoadMethod++; + break; + + case 1: + GCSettings.SaveMethod++; + break; + + case 2: + OnScreenKeyboard(GCSettings.LoadFolder, MAXPATHLEN); + break; + + case 3: + OnScreenKeyboard(GCSettings.SaveFolder, MAXPATHLEN); + break; + + case 4: + OnScreenKeyboard(GCSettings.ScreenshotsFolder, MAXPATHLEN); + break; + + case 5: + OnScreenKeyboard(GCSettings.CoverFolder, MAXPATHLEN); + break; + + case 6: + OnScreenKeyboard(GCSettings.ArtworkFolder, MAXPATHLEN); + break; + + case 7: + GCSettings.AutoLoad++; + if (GCSettings.AutoLoad > 2) + GCSettings.AutoLoad = 0; + break; + + case 8: + GCSettings.AutoSave++; + if (GCSettings.AutoSave > 3) + GCSettings.AutoSave = 0; + break; + + case 9: + GCSettings.AppendAuto++; + if (GCSettings.AppendAuto > 1) + GCSettings.AppendAuto = 0; + break; + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + + // some load/save methods are not implemented - here's where we skip them + // they need to be skipped in the order they were enumerated + + // no SD/USB ports on GameCube + #ifdef HW_DOL + if(GCSettings.LoadMethod == DEVICE_SD) + GCSettings.LoadMethod++; + if(GCSettings.SaveMethod == DEVICE_SD) + GCSettings.SaveMethod++; + if(GCSettings.LoadMethod == DEVICE_USB) + GCSettings.LoadMethod++; + if(GCSettings.SaveMethod == DEVICE_USB) + GCSettings.SaveMethod++; + #endif + + // saving to DVD is impossible + if(GCSettings.SaveMethod == DEVICE_DVD) + GCSettings.SaveMethod++; + + // don't allow SD Gecko on Wii + #ifdef HW_RVL + if(GCSettings.LoadMethod == DEVICE_SD_SLOTA) + GCSettings.LoadMethod++; + if(GCSettings.SaveMethod == DEVICE_SD_SLOTA) + GCSettings.SaveMethod++; + if(GCSettings.LoadMethod == DEVICE_SD_SLOTB) + GCSettings.LoadMethod++; + if(GCSettings.SaveMethod == DEVICE_SD_SLOTB) + GCSettings.SaveMethod++; + #endif + + // correct load/save methods out of bounds + if(GCSettings.LoadMethod > 6) + GCSettings.LoadMethod = 0; + if(GCSettings.SaveMethod > 6) + GCSettings.SaveMethod = 0; + + if (GCSettings.LoadMethod == DEVICE_AUTO) sprintf (options.value[0],"Auto Detect"); + else if (GCSettings.LoadMethod == DEVICE_SD) sprintf (options.value[0],"SD"); + else if (GCSettings.LoadMethod == DEVICE_USB) sprintf (options.value[0],"USB"); + else if (GCSettings.LoadMethod == DEVICE_DVD) sprintf (options.value[0],"DVD"); + else if (GCSettings.LoadMethod == DEVICE_SMB) sprintf (options.value[0],"Network"); + else if (GCSettings.LoadMethod == DEVICE_SD_SLOTA) sprintf (options.value[0],"SD Gecko Slot A"); + else if (GCSettings.LoadMethod == DEVICE_SD_SLOTB) sprintf (options.value[0],"SD Gecko Slot B"); + + if (GCSettings.SaveMethod == DEVICE_AUTO) sprintf (options.value[1],"Auto Detect"); + else if (GCSettings.SaveMethod == DEVICE_SD) sprintf (options.value[1],"SD"); + else if (GCSettings.SaveMethod == DEVICE_USB) sprintf (options.value[1],"USB"); + else if (GCSettings.SaveMethod == DEVICE_SMB) sprintf (options.value[1],"Network"); + else if (GCSettings.SaveMethod == DEVICE_SD_SLOTA) sprintf (options.value[1],"SD Gecko Slot A"); + else if (GCSettings.SaveMethod == DEVICE_SD_SLOTB) sprintf (options.value[1],"SD Gecko Slot B"); + + snprintf (options.value[2], 35, "%s", GCSettings.LoadFolder); + snprintf (options.value[3], 35, "%s", GCSettings.SaveFolder); + snprintf (options.value[4], 35, "%s", GCSettings.ScreenshotsFolder); + snprintf (options.value[5], 35, "%s", GCSettings.CoverFolder); + snprintf (options.value[6], 35, "%s", GCSettings.ArtworkFolder); + + if (GCSettings.AutoLoad == 0) sprintf (options.value[7],"Off"); + else if (GCSettings.AutoLoad == 1) sprintf (options.value[7],"SRAM"); + else if (GCSettings.AutoLoad == 2) sprintf (options.value[7],"Snapshot"); + + if (GCSettings.AutoSave == 0) sprintf (options.value[8],"Off"); + else if (GCSettings.AutoSave == 1) sprintf (options.value[8],"SRAM"); + else if (GCSettings.AutoSave == 2) sprintf (options.value[8],"Snapshot"); + else if (GCSettings.AutoSave == 3) sprintf (options.value[8],"Both"); + + if (GCSettings.AppendAuto == 0) sprintf (options.value[9],"Off"); + else if (GCSettings.AppendAuto == 1) sprintf (options.value[9],"On"); + + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + return menu; +} + +/**************************************************************************** + * MenuSettingsMenu + ***************************************************************************/ +static int MenuSettingsMenu() +{ + int menu = MENU_NONE; + int ret; + int i = 0; + bool firstRun = true; + OptionList options; + + sprintf(options.name[i++], "Exit Action"); + sprintf(options.name[i++], "Wiimote Orientation"); + sprintf(options.name[i++], "Music Volume"); + sprintf(options.name[i++], "Sound Effects Volume"); + sprintf(options.name[i++], "Rumble"); + sprintf(options.name[i++], "Language"); + sprintf(options.name[i++], "Preview Image"); + options.length = i; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiText titleTxt("Settings - Menu", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(90, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + optionBrowser.SetCol2Position(275); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + switch (ret) + { + case 0: + GCSettings.ExitAction++; + if(GCSettings.ExitAction > 3) + GCSettings.ExitAction = 0; + break; + case 1: + GCSettings.WiimoteOrientation ^= 1; + break; + case 2: + GCSettings.MusicVolume += 10; + if(GCSettings.MusicVolume > 100) + GCSettings.MusicVolume = 0; + bgMusic->SetVolume(GCSettings.MusicVolume); + break; + case 3: + GCSettings.SFXVolume += 10; + if(GCSettings.SFXVolume > 100) + GCSettings.SFXVolume = 0; + break; + case 4: + GCSettings.Rumble ^= 1; + break; + case 5: + GCSettings.language++; + + if(GCSettings.language >= LANG_LENGTH) + GCSettings.language = LANG_JAPANESE; + + if(GCSettings.language == LANG_SIMP_CHINESE) + GCSettings.language = LANG_PORTUGUESE; + else if(GCSettings.language == LANG_JAPANESE) + GCSettings.language = LANG_ENGLISH; + break; + case 6: + GCSettings.PreviewImage++; + if(GCSettings.PreviewImage > 2) + GCSettings.PreviewImage = 0; + break; + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + + #ifdef HW_RVL + if (GCSettings.ExitAction == 1) + sprintf (options.value[0], "Return to Wii Menu"); + else if (GCSettings.ExitAction == 2) + sprintf (options.value[0], "Power off Wii"); + else if (GCSettings.ExitAction == 3) + sprintf (options.value[0], "Return to Loader"); + else + sprintf (options.value[0], "Auto"); + #else // GameCube + if(GCSettings.ExitAction > 1) + GCSettings.ExitAction = 0; + if (GCSettings.ExitAction == 0) + sprintf (options.value[0], "Return to Loader"); + else + sprintf (options.value[0], "Reboot"); + + options.name[1][0] = 0; // Wiimote + options.name[2][0] = 0; // Music + options.name[3][0] = 0; // Sound Effects + options.name[4][0] = 0; // Rumble + #endif + + if (GCSettings.WiimoteOrientation == 0) + sprintf (options.value[1], "Vertical"); + else if (GCSettings.WiimoteOrientation == 1) + sprintf (options.value[1], "Horizontal"); + + if(GCSettings.MusicVolume > 0) + sprintf(options.value[2], "%d%%", GCSettings.MusicVolume); + else + sprintf(options.value[2], "Mute"); + + if(GCSettings.SFXVolume > 0) + sprintf(options.value[3], "%d%%", GCSettings.SFXVolume); + else + sprintf(options.value[3], "Mute"); + + if (GCSettings.Rumble == 1) + sprintf (options.value[4], "Enabled"); + else + sprintf (options.value[4], "Disabled"); + + switch(GCSettings.language) + { + case LANG_JAPANESE: sprintf(options.value[5], "Japanese"); break; + case LANG_ENGLISH: sprintf(options.value[5], "English"); break; + case LANG_GERMAN: sprintf(options.value[5], "German"); break; + case LANG_FRENCH: sprintf(options.value[5], "French"); break; + case LANG_SPANISH: sprintf(options.value[5], "Spanish"); break; + case LANG_ITALIAN: sprintf(options.value[5], "Italian"); break; + case LANG_DUTCH: sprintf(options.value[5], "Dutch"); break; + case LANG_SIMP_CHINESE: sprintf(options.value[5], "Chinese (Simplified)"); break; + case LANG_TRAD_CHINESE: sprintf(options.value[5], "Chinese (Traditional)"); break; + case LANG_KOREAN: sprintf(options.value[5], "Korean"); break; + case LANG_PORTUGUESE: sprintf(options.value[5], "Portuguese"); break; + case LANG_BRAZILIAN_PORTUGUESE: sprintf(options.value[5], "Brazilian Portuguese"); break; + case LANG_CATALAN: sprintf(options.value[5], "Catalan"); break; + case LANG_TURKISH: sprintf(options.value[5], "Turkish"); break; + } + + switch(GCSettings.PreviewImage) + { + case 0: + sprintf(options.value[6], "Screenshots"); + snprintf(GCSettings.ImageFolder, MAXJOLIET, "%s", GCSettings.ScreenshotsFolder); + break; + case 1: + sprintf(options.value[6], "Covers"); + snprintf(GCSettings.ImageFolder, MAXJOLIET, "%s", GCSettings.CoverFolder); + break; + case 2: + sprintf(options.value[6], "Artworks"); + snprintf(GCSettings.ImageFolder, MAXJOLIET, "%s", GCSettings.ArtworkFolder); + break; + } + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + ResetText(); + return menu; +} + +/**************************************************************************** + * MenuSettingsNetwork + ***************************************************************************/ +static int MenuSettingsNetwork() +{ + int menu = MENU_NONE; + int ret; + int i = 0; + bool firstRun = true; + OptionList options; + sprintf(options.name[i++], "SMB Share IP"); + sprintf(options.name[i++], "SMB Share Name"); + sprintf(options.name[i++], "SMB Share Username"); + sprintf(options.name[i++], "SMB Share Password"); + options.length = i; + + for(i=0; i < options.length; i++) + options.value[i][0] = 0; + + GuiText titleTxt("Settings - Network", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_long_png); + GuiImageData btnOutlineOver(button_long_over_png); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(90, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + GuiOptionBrowser optionBrowser(552, 248, &options); + optionBrowser.SetPosition(0, 108); + optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + optionBrowser.SetCol2Position(290); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&backBtn); + mainWindow->Append(&optionBrowser); + mainWindow->Append(&w); + mainWindow->Append(&titleTxt); + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + ret = optionBrowser.GetClickedOption(); + + switch (ret) + { + case 0: + OnScreenKeyboard(GCSettings.smbip, 16); + break; + + case 1: + OnScreenKeyboard(GCSettings.smbshare, 20); + break; + + case 2: + OnScreenKeyboard(GCSettings.smbuser, 20); + break; + + case 3: + OnScreenKeyboard(GCSettings.smbpwd, 20); + break; + } + + if(ret >= 0 || firstRun) + { + firstRun = false; + snprintf (options.value[0], 25, "%s", GCSettings.smbip); + snprintf (options.value[1], 19, "%s", GCSettings.smbshare); + snprintf (options.value[2], 19, "%s", GCSettings.smbuser); + snprintf (options.value[3], 19, "%s", GCSettings.smbpwd); + optionBrowser.TriggerUpdate(); + } + + if(backBtn.GetState() == STATE_CLICKED) + { + menu = MENU_SETTINGS; + } + } + HaltGui(); + mainWindow->Remove(&optionBrowser); + mainWindow->Remove(&w); + mainWindow->Remove(&titleTxt); + CloseShare(); + return menu; +} + + +static int redAmount=128, greenAmount=128, blueAmount=128; +static GuiText *redText; +static GuiText *greenText; +static GuiText *blueText; +static GuiText *sampleText; + +static void RGBWindowUpdate(void * ptr, int red, int green, int blue) +{ + GuiButton * b = (GuiButton *)ptr; + if(b->GetState() == STATE_CLICKED) + { + redAmount += red; + if (redAmount>255) redAmount=255; + else if (redAmount<0) redAmount=0; + greenAmount += green; + if (greenAmount>255) greenAmount=255; + else if (greenAmount<0) greenAmount=0; + blueAmount += blue; + if (blueAmount>255) blueAmount=255; + else if (blueAmount<0) blueAmount=0; + + redText->SetColor((GXColor){(u8)redAmount, 0, 0, 0xFF}); + greenText->SetColor((GXColor){0, (u8)greenAmount, 0, 0xFF}); + blueText->SetColor((GXColor){0, 0, (u8)blueAmount, 0xFF}); + sampleText->SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + + char shift[10]; + sprintf(shift, "%2x", redAmount); + redText->SetText(shift); + sprintf(shift, "%2x", greenAmount); + greenText->SetText(shift); + sprintf(shift, "%2x", blueAmount); + blueText->SetText(shift); + + b->ResetState(); + } +} + +static void LessRedClick(void * ptr) { RGBWindowUpdate(ptr, -8, 0, 0); } +static void LessGreenClick(void * ptr) { RGBWindowUpdate(ptr, 0, -8, 0); } +static void LessBlueClick(void * ptr) { RGBWindowUpdate(ptr, 0, 0, -8); } +static void MoreRedClick(void * ptr) { RGBWindowUpdate(ptr, +8, 0, 0); } +static void MoreGreenClick(void * ptr) { RGBWindowUpdate(ptr, 0, +8, 0); } +static void MoreBlueClick(void * ptr) { RGBWindowUpdate(ptr, 0, 0, +8); } + +static void PaletteWindow(const char *name) +{ + GuiWindow * w = new GuiWindow(500,480); + w->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + w->SetPosition(0, -10); + + GuiImageData arrowUp(button_arrow_up_png); + GuiImageData arrowDown(button_arrow_down_png); + GuiImageData arrowUpOver(button_arrow_up_over_png); + GuiImageData arrowDownOver(button_arrow_down_over_png); + + GuiImage moreRedImg(&arrowUp); + GuiImage moreRedOverImg(&arrowUpOver); + GuiButton moreRedBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); + moreRedBtn.SetImage(&moreRedImg); + moreRedBtn.SetImageOver(&moreRedOverImg); + moreRedBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + moreRedBtn.SetPosition(-150,-60); + moreRedBtn.SetTrigger(trigA); + moreRedBtn.SetTrigger(trig2); + moreRedBtn.SetSelectable(true); + moreRedBtn.SetUpdateCallback(MoreRedClick); + + GuiImage lessRedImg(&arrowDown); + GuiImage lessRedOverImg(&arrowDownOver); + GuiButton lessRedBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); + lessRedBtn.SetImage(&lessRedImg); + lessRedBtn.SetImageOver(&lessRedOverImg); + lessRedBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + lessRedBtn.SetPosition(-150,+50); + lessRedBtn.SetTrigger(trigA); + lessRedBtn.SetTrigger(trig2); + lessRedBtn.SetSelectable(true); + lessRedBtn.SetUpdateCallback(LessRedClick); + + GuiImage moreGreenImg(&arrowUp); + GuiImage moreGreenOverImg(&arrowUpOver); + GuiButton moreGreenBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); + moreGreenBtn.SetImage(&moreGreenImg); + moreGreenBtn.SetImageOver(&moreGreenOverImg); + moreGreenBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + moreGreenBtn.SetPosition(-50,-60); + moreGreenBtn.SetTrigger(trigA); + moreGreenBtn.SetTrigger(trig2); + moreGreenBtn.SetSelectable(true); + moreGreenBtn.SetUpdateCallback(MoreGreenClick); + + GuiImage lessGreenImg(&arrowDown); + GuiImage lessGreenOverImg(&arrowDownOver); + GuiButton lessGreenBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); + lessGreenBtn.SetImage(&lessGreenImg); + lessGreenBtn.SetImageOver(&lessGreenOverImg); + lessGreenBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + lessGreenBtn.SetPosition(-50,+50); + lessGreenBtn.SetTrigger(trigA); + lessGreenBtn.SetTrigger(trig2); + lessGreenBtn.SetSelectable(true); + lessGreenBtn.SetUpdateCallback(LessGreenClick); + + GuiImage moreBlueImg(&arrowUp); + GuiImage moreBlueOverImg(&arrowUpOver); + GuiButton moreBlueBtn(arrowUp.GetWidth(), arrowUp.GetHeight()); + moreBlueBtn.SetImage(&moreBlueImg); + moreBlueBtn.SetImageOver(&moreBlueOverImg); + moreBlueBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + moreBlueBtn.SetPosition(50,-60); + moreBlueBtn.SetTrigger(trigA); + moreBlueBtn.SetTrigger(trig2); + moreBlueBtn.SetSelectable(true); + moreBlueBtn.SetUpdateCallback(MoreBlueClick); + + GuiImage lessBlueImg(&arrowDown); + GuiImage lessBlueOverImg(&arrowDownOver); + GuiButton lessBlueBtn(arrowDown.GetWidth(), arrowDown.GetHeight()); + lessBlueBtn.SetImage(&lessBlueImg); + lessBlueBtn.SetImageOver(&lessBlueOverImg); + lessBlueBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + lessBlueBtn.SetPosition(50,+50); + lessBlueBtn.SetTrigger(trigA); + lessBlueBtn.SetTrigger(trig2); + lessBlueBtn.SetSelectable(true); + lessBlueBtn.SetUpdateCallback(LessBlueClick); + + GuiImageData box(screen_position_png); + + GuiImage redBoxImg(&box); + redBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + redBoxImg.SetPosition(-150, 0); + + GuiImage greenBoxImg(&box); + greenBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + greenBoxImg.SetPosition(-50, 0); + + GuiImage blueBoxImg(&box); + blueBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); + blueBoxImg.SetPosition(+50, 0); + + char shift[10]; + redText = new GuiText(NULL, 20, (GXColor){128, 0, 0, 255}); + redText->SetPosition(-150,0); + sprintf(shift, "%2x", redAmount); + redText->SetText(shift); + + greenText = new GuiText(NULL, 20, (GXColor){0, 128, 0, 255}); + greenText->SetPosition(-50, 0); + sprintf(shift, "%2x", greenAmount); + greenText->SetText(shift); + + blueText = new GuiText(NULL, 20, (GXColor){0, 0, 128, 255}); + blueText->SetPosition(+50,0); + sprintf(shift, "%2x", blueAmount); + blueText->SetText(shift); + + sampleText = new GuiText(NULL, 20, (GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + sampleText->SetPosition(+150,0); + sampleText->SetText(name); + + int currentRed = redAmount; + int currentGreen = greenAmount; + int currentBlue = blueAmount; + + w->Append(&lessRedBtn); + w->Append(&moreRedBtn); + w->Append(&lessGreenBtn); + w->Append(&moreGreenBtn); + w->Append(&lessBlueBtn); + w->Append(&moreBlueBtn); + + w->Append(&redBoxImg); + w->Append(&greenBoxImg); + w->Append(&blueBoxImg); + + w->Append(sampleText); + w->Append(redText); + w->Append(greenText); + w->Append(blueText); + + if(!SettingWindow("Red Green Blue",w)) + { + redAmount = currentRed; // undo changes + greenAmount = currentGreen; + blueAmount = currentBlue; + } + + delete(w); + delete(redText); + delete(greenText); + delete(blueText); +} + +GXColor GetCol(int i) { + int c = 0; + u8 r=0, g=0, b=0; + if (unsigned(i) <= 13) + { + c = CurrentPalette.palette[i]; + r = (c >> 16) & 255; + g = (c >> 8) & 255; + b = (c) & 255; + + } + return (GXColor){r,g,b,255}; +} + +/**************************************************************************** + * MenuPalette + * + * Menu displayed when returning to the menu from in-game. + ***************************************************************************/ +static int MenuPalette() +{ + // We are now using a custom palette + strncpy(CurrentPalette.gameName, RomTitle, 17); + + int menu = MENU_NONE; + + GuiText titleTxt("Palette", 26, (GXColor){255, 255, 255, 255}); + titleTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP); + titleTxt.SetPosition(50,50); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData btnOutline(button_png); + GuiImageData btnOutlineOver(button_over_png); + GuiImageData btnLargeOutline(button_large_png); + GuiImageData btnLargeOutlineOver(button_large_over_png); + GuiImageData btnCloseOutline(button_small_png); + GuiImageData btnCloseOutlineOver(button_small_over_png); + + GuiTrigger trigHome; + trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0); + + GuiText bg0BtnTxt("BG 0", 24, GetCol(0)); + GuiImage bg0BtnImg(&btnCloseOutline); + GuiImage bg0BtnImgOver(&btnCloseOutlineOver); + GuiButton bg0Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + bg0Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + bg0Btn.SetPosition(-200, 120); + bg0Btn.SetLabel(&bg0BtnTxt); + bg0Btn.SetImage(&bg0BtnImg); + bg0Btn.SetImageOver(&bg0BtnImgOver); + bg0Btn.SetSoundOver(&btnSoundOver); + bg0Btn.SetSoundClick(&btnSoundClick); + bg0Btn.SetTrigger(trigA); + bg0Btn.SetTrigger(trig2); + bg0Btn.SetEffectGrow(); + + GuiText bg1BtnTxt("BG 1", 24, GetCol(1)); + GuiImage bg1BtnImg(&btnCloseOutline); + GuiImage bg1BtnImgOver(&btnCloseOutlineOver); + GuiButton bg1Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + bg1Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + bg1Btn.SetPosition(-200, 180); + bg1Btn.SetLabel(&bg1BtnTxt); + bg1Btn.SetImage(&bg1BtnImg); + bg1Btn.SetImageOver(&bg1BtnImgOver); + bg1Btn.SetSoundOver(&btnSoundOver); + bg1Btn.SetSoundClick(&btnSoundClick); + bg1Btn.SetTrigger(trigA); + bg1Btn.SetTrigger(trig2); + bg1Btn.SetEffectGrow(); + + GuiText bg2BtnTxt("BG 2", 24, GetCol(2)); + GuiImage bg2BtnImg(&btnCloseOutline); + GuiImage bg2BtnImgOver(&btnCloseOutlineOver); + GuiButton bg2Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + bg2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + bg2Btn.SetPosition(-200, 240); + bg2Btn.SetLabel(&bg2BtnTxt); + bg2Btn.SetImage(&bg2BtnImg); + bg2Btn.SetImageOver(&bg2BtnImgOver); + bg2Btn.SetSoundOver(&btnSoundOver); + bg2Btn.SetSoundClick(&btnSoundClick); + bg2Btn.SetTrigger(trigA); + bg2Btn.SetTrigger(trig2); + bg2Btn.SetEffectGrow(); + + GuiText bg3BtnTxt("BG 3", 24, GetCol(3)); + GuiImage bg3BtnImg(&btnCloseOutline); + GuiImage bg3BtnImgOver(&btnCloseOutlineOver); + GuiButton bg3Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + bg3Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + bg3Btn.SetPosition(-200, 300); + bg3Btn.SetLabel(&bg3BtnTxt); + bg3Btn.SetImage(&bg3BtnImg); + bg3Btn.SetImageOver(&bg3BtnImgOver); + bg3Btn.SetSoundOver(&btnSoundOver); + bg3Btn.SetSoundClick(&btnSoundClick); + bg3Btn.SetTrigger(trigA); + bg3Btn.SetTrigger(trig2); + bg3Btn.SetEffectGrow(); + + GuiText win0BtnTxt("WIN 0", 24, GetCol(4)); + GuiImage win0BtnImg(&btnCloseOutline); + GuiImage win0BtnImgOver(&btnCloseOutlineOver); + GuiButton win0Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + win0Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + win0Btn.SetPosition(-70, 120); + win0Btn.SetLabel(&win0BtnTxt); + win0Btn.SetImage(&win0BtnImg); + win0Btn.SetImageOver(&win0BtnImgOver); + win0Btn.SetSoundOver(&btnSoundOver); + win0Btn.SetSoundClick(&btnSoundClick); + win0Btn.SetTrigger(trigA); + win0Btn.SetTrigger(trig2); + win0Btn.SetEffectGrow(); + + GuiText win1BtnTxt("WIN 1", 24, GetCol(5)); + GuiImage win1BtnImg(&btnCloseOutline); + GuiImage win1BtnImgOver(&btnCloseOutlineOver); + GuiButton win1Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + win1Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + win1Btn.SetPosition(-70, 180); + win1Btn.SetLabel(&win1BtnTxt); + win1Btn.SetImage(&win1BtnImg); + win1Btn.SetImageOver(&win1BtnImgOver); + win1Btn.SetSoundOver(&btnSoundOver); + win1Btn.SetSoundClick(&btnSoundClick); + win1Btn.SetTrigger(trigA); + win1Btn.SetTrigger(trig2); + win1Btn.SetEffectGrow(); + + GuiText win2BtnTxt("WIN 2", 24, GetCol(6)); + GuiImage win2BtnImg(&btnCloseOutline); + GuiImage win2BtnImgOver(&btnCloseOutlineOver); + GuiButton win2Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + win2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + win2Btn.SetPosition(-70, 240); + win2Btn.SetLabel(&win2BtnTxt); + win2Btn.SetImage(&win2BtnImg); + win2Btn.SetImageOver(&win2BtnImgOver); + win2Btn.SetSoundOver(&btnSoundOver); + win2Btn.SetSoundClick(&btnSoundClick); + win2Btn.SetTrigger(trigA); + win2Btn.SetTrigger(trig2); + win2Btn.SetEffectGrow(); + + GuiText win3BtnTxt("WIN 3", 24, GetCol(7)); + GuiImage win3BtnImg(&btnCloseOutline); + GuiImage win3BtnImgOver(&btnCloseOutlineOver); + GuiButton win3Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + win3Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + win3Btn.SetPosition(-70, 300); + win3Btn.SetLabel(&win3BtnTxt); + win3Btn.SetImage(&win3BtnImg); + win3Btn.SetImageOver(&win3BtnImgOver); + win3Btn.SetSoundOver(&btnSoundOver); + win3Btn.SetSoundClick(&btnSoundClick); + win3Btn.SetTrigger(trigA); + win3Btn.SetTrigger(trig2); + win3Btn.SetEffectGrow(); + + GuiText obj0BtnTxt("OBJ 0", 24, GetCol(8)); + GuiImage obj0BtnImg(&btnCloseOutline); + GuiImage obj0BtnImgOver(&btnCloseOutlineOver); + GuiButton obj0Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + obj0Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + obj0Btn.SetPosition(+70, 120); + obj0Btn.SetLabel(&obj0BtnTxt); + obj0Btn.SetImage(&obj0BtnImg); + obj0Btn.SetImageOver(&obj0BtnImgOver); + obj0Btn.SetSoundOver(&btnSoundOver); + obj0Btn.SetSoundClick(&btnSoundClick); + obj0Btn.SetTrigger(trigA); + obj0Btn.SetTrigger(trig2); + obj0Btn.SetEffectGrow(); + + GuiText obj1BtnTxt("OBJ 1", 24, GetCol(9)); + GuiImage obj1BtnImg(&btnCloseOutline); + GuiImage obj1BtnImgOver(&btnCloseOutlineOver); + GuiButton obj1Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + obj1Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + obj1Btn.SetPosition(+70, 180); + obj1Btn.SetLabel(&obj1BtnTxt); + obj1Btn.SetImage(&obj1BtnImg); + obj1Btn.SetImageOver(&obj1BtnImgOver); + obj1Btn.SetSoundOver(&btnSoundOver); + obj1Btn.SetSoundClick(&btnSoundClick); + obj1Btn.SetTrigger(trigA); + obj1Btn.SetTrigger(trig2); + obj1Btn.SetEffectGrow(); + + GuiText obj2BtnTxt("OBJ 2", 24, GetCol(10)); + GuiImage obj2BtnImg(&btnCloseOutline); + GuiImage obj2BtnImgOver(&btnCloseOutlineOver); + GuiButton obj2Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + obj2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + obj2Btn.SetPosition(+70, 240); + obj2Btn.SetLabel(&obj2BtnTxt); + obj2Btn.SetImage(&obj2BtnImg); + obj2Btn.SetImageOver(&obj2BtnImgOver); + obj2Btn.SetSoundOver(&btnSoundOver); + obj2Btn.SetSoundClick(&btnSoundClick); + obj2Btn.SetTrigger(trigA); + obj2Btn.SetTrigger(trig2); + obj2Btn.SetEffectGrow(); + + GuiText spr0BtnTxt("SPR 0", 24, GetCol(11)); + GuiImage spr0BtnImg(&btnCloseOutline); + GuiImage spr0BtnImgOver(&btnCloseOutlineOver); + GuiButton spr0Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + spr0Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + spr0Btn.SetPosition(+200, 120); + spr0Btn.SetLabel(&spr0BtnTxt); + spr0Btn.SetImage(&spr0BtnImg); + spr0Btn.SetImageOver(&spr0BtnImgOver); + spr0Btn.SetSoundOver(&btnSoundOver); + spr0Btn.SetSoundClick(&btnSoundClick); + spr0Btn.SetTrigger(trigA); + spr0Btn.SetTrigger(trig2); + spr0Btn.SetEffectGrow(); + + GuiText spr1BtnTxt("SPR 1", 24, GetCol(12)); + GuiImage spr1BtnImg(&btnCloseOutline); + GuiImage spr1BtnImgOver(&btnCloseOutlineOver); + GuiButton spr1Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + spr1Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + spr1Btn.SetPosition(+200, 180); + spr1Btn.SetLabel(&spr1BtnTxt); + spr1Btn.SetImage(&spr1BtnImg); + spr1Btn.SetImageOver(&spr1BtnImgOver); + spr1Btn.SetSoundOver(&btnSoundOver); + spr1Btn.SetSoundClick(&btnSoundClick); + spr1Btn.SetTrigger(trigA); + spr1Btn.SetTrigger(trig2); + spr1Btn.SetEffectGrow(); + + GuiText spr2BtnTxt("SPR 2", 24, GetCol(13)); + GuiImage spr2BtnImg(&btnCloseOutline); + GuiImage spr2BtnImgOver(&btnCloseOutlineOver); + GuiButton spr2Btn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + spr2Btn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + spr2Btn.SetPosition(+200, 240); + spr2Btn.SetLabel(&spr2BtnTxt); + spr2Btn.SetImage(&spr2BtnImg); + spr2Btn.SetImageOver(&spr2BtnImgOver); + spr2Btn.SetSoundOver(&btnSoundOver); + spr2Btn.SetSoundClick(&btnSoundClick); + spr2Btn.SetTrigger(trigA); + spr2Btn.SetTrigger(trig2); + spr2Btn.SetEffectGrow(); + + GuiText importBtnTxt("Load / Save", 22, (GXColor){0, 0, 0, 255}); + importBtnTxt.SetWrap(true, btnOutline.GetWidth()-30); + GuiImage importBtnImg(&btnOutline); + GuiImage importBtnImgOver(&btnOutlineOver); + GuiButton importBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + importBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + importBtn.SetPosition(140, 300); + importBtn.SetLabel(&importBtnTxt); + importBtn.SetImage(&importBtnImg); + importBtn.SetImageOver(&importBtnImgOver); + importBtn.SetSoundOver(&btnSoundOver); + importBtn.SetSoundClick(&btnSoundClick); + importBtn.SetTrigger(trigA); + importBtn.SetTrigger(trig2); + importBtn.SetEffectGrow(); + + GuiText closeBtnTxt("Close", 20, (GXColor){0, 0, 0, 255}); + GuiImage closeBtnImg(&btnCloseOutline); + GuiImage closeBtnImgOver(&btnCloseOutlineOver); + GuiButton closeBtn(btnCloseOutline.GetWidth(), btnCloseOutline.GetHeight()); + closeBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + closeBtn.SetPosition(-50, 35); + closeBtn.SetLabel(&closeBtnTxt); + closeBtn.SetImage(&closeBtnImg); + closeBtn.SetImageOver(&closeBtnImgOver); + closeBtn.SetSoundOver(&btnSoundOver); + closeBtn.SetSoundClick(&btnSoundClick); + closeBtn.SetTrigger(trigA); + closeBtn.SetTrigger(trig2); + closeBtn.SetTrigger(&trigHome); + closeBtn.SetEffectGrow(); + + GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255}); + GuiImage backBtnImg(&btnOutline); + GuiImage backBtnImgOver(&btnOutlineOver); + GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight()); + backBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + backBtn.SetPosition(100, -35); + backBtn.SetLabel(&backBtnTxt); + backBtn.SetImage(&backBtnImg); + backBtn.SetImageOver(&backBtnImgOver); + backBtn.SetSoundOver(&btnSoundOver); + backBtn.SetSoundClick(&btnSoundClick); + backBtn.SetTrigger(trigA); + backBtn.SetTrigger(trig2); + backBtn.SetEffectGrow(); + + HaltGui(); + GuiWindow w(screenwidth, screenheight); + w.Append(&titleTxt); + w.Append(&bg0Btn); + w.Append(&bg1Btn); + w.Append(&bg2Btn); + w.Append(&bg3Btn); + w.Append(&win0Btn); + w.Append(&win1Btn); + w.Append(&win2Btn); + w.Append(&win3Btn); + w.Append(&obj0Btn); + w.Append(&obj1Btn); + w.Append(&obj2Btn); + w.Append(&spr0Btn); + w.Append(&spr1Btn); + w.Append(&spr2Btn); + w.Append(&importBtn); + w.Append(&closeBtn); + w.Append(&backBtn); + + mainWindow->Append(&w); + + ResumeGui(); + + while(menu == MENU_NONE) + { + usleep(THREAD_SLEEP); + + if(bg0Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[0] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[0] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[0] >> 0) & 0xFF; + PaletteWindow("BG 0"); + CurrentPalette.palette[0] = redAmount << 16 | greenAmount << 8 | blueAmount; + bg0BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + bg0Btn.ResetState(); + } + else if(bg1Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[1] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[1] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[1] >> 0) & 0xFF; + PaletteWindow("BG 1"); + CurrentPalette.palette[1] = redAmount << 16 | greenAmount << 8 | blueAmount; + bg1BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + bg1Btn.ResetState(); + } + else if(bg2Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[2] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[2] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[2] >> 0) & 0xFF; + PaletteWindow("BG 2"); + CurrentPalette.palette[2] = redAmount << 16 | greenAmount << 8 | blueAmount; + bg2BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + bg2Btn.ResetState(); + } + else if(bg3Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[3] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[3] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[3] >> 0) & 0xFF; + PaletteWindow("BG 3"); + CurrentPalette.palette[3] = redAmount << 16 | greenAmount << 8 | blueAmount; + bg3BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + bg3Btn.ResetState(); + } + else if(win0Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[4] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[4] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[4] >> 0) & 0xFF; + PaletteWindow("WIN 0"); + CurrentPalette.palette[4] = redAmount << 16 | greenAmount << 8 | blueAmount; + win0BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + win0Btn.ResetState(); + } + else if(win1Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[5] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[5] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[5] >> 0) & 0xFF; + PaletteWindow("WIN 1"); + CurrentPalette.palette[5] = redAmount << 16 | greenAmount << 8 | blueAmount; + win1BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + win1Btn.ResetState(); + } + else if(win2Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[6] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[6] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[6] >> 0) & 0xFF; + PaletteWindow("WIN 2"); + CurrentPalette.palette[6] = redAmount << 16 | greenAmount << 8 | blueAmount; + win2BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + win2Btn.ResetState(); + } + else if(win3Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[7] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[7] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[7] >> 0) & 0xFF; + PaletteWindow("WIN 3"); + CurrentPalette.palette[7] = redAmount << 16 | greenAmount << 8 | blueAmount; + win3BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + win3Btn.ResetState(); + } + else if(obj0Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[8] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[8] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[8] >> 0) & 0xFF; + PaletteWindow("OBJ 0"); + CurrentPalette.palette[8] = redAmount << 16 | greenAmount << 8 | blueAmount; + obj0BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + obj0Btn.ResetState(); + } + else if(obj1Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[9] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[9] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[9] >> 0) & 0xFF; + PaletteWindow("OBJ 1"); + CurrentPalette.palette[9] = redAmount << 16 | greenAmount << 8 | blueAmount; + obj1BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + obj1Btn.ResetState(); + } + else if(obj2Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[10] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[10] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[10] >> 0) & 0xFF; + PaletteWindow("OBJ 2"); + CurrentPalette.palette[10] = redAmount << 16 | greenAmount << 8 | blueAmount; + obj2BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + obj2Btn.ResetState(); + } + else if(spr0Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[11] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[11] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[11] >> 0) & 0xFF; + PaletteWindow("SPR 0"); + CurrentPalette.palette[11] = redAmount << 16 | greenAmount << 8 | blueAmount; + spr0BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + spr0Btn.ResetState(); + } + else if(spr1Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[12] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[12] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[12] >> 0) & 0xFF; + PaletteWindow("SPR 1"); + CurrentPalette.palette[12] = redAmount << 16 | greenAmount << 8 | blueAmount; + spr1BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + spr1Btn.ResetState(); + } + else if(spr2Btn.GetState() == STATE_CLICKED) + { + redAmount = (CurrentPalette.palette[13] >> 16) & 0xFF; + greenAmount = (CurrentPalette.palette[13] >> 8) & 0xFF; + blueAmount = (CurrentPalette.palette[13] >> 0) & 0xFF; + PaletteWindow("SPR 2"); + CurrentPalette.palette[13] = redAmount << 16 | greenAmount << 8 | blueAmount; + spr2BtnTxt.SetColor((GXColor){(u8)redAmount, (u8)greenAmount, (u8)blueAmount, 0xFF}); + spr2Btn.ResetState(); + } + else if(importBtn.GetState() == STATE_CLICKED) + { + SavePaletteAs(NOTSILENT, RomTitle); + menu = MENU_GAMESETTINGS_PALETTE; + } + else if(closeBtn.GetState() == STATE_CLICKED) + { + menu = MENU_EXIT; + SavePaletteAs(SILENT, RomTitle); + + exitSound->Play(); + bgTopImg->SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 15); + backBtn.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + bgBottomImg->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + btnLogo->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 15); + + w.SetEffect(EFFECT_FADE, -15); + + usleep(350000); // wait for effects to finish + } + else if(backBtn.GetState() == STATE_CLICKED) + { + SavePaletteAs(SILENT, RomTitle); + menu = MENU_GAMESETTINGS_VIDEO; + } + } + + HaltGui(); + mainWindow->Remove(&w); + return menu; +} + +/**************************************************************************** + * MainMenu + ***************************************************************************/ +void +MainMenu (int menu) +{ + static bool init = false; + int currentMenu = menu; + lastMenu = MENU_NONE; + + if(!init) + { + init = true; + #ifdef HW_RVL + pointer[0] = new GuiImageData(player1_point_png); + pointer[1] = new GuiImageData(player2_point_png); + pointer[2] = new GuiImageData(player3_point_png); + pointer[3] = new GuiImageData(player4_point_png); + #endif + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trig2 = new GuiTrigger; + trig2->SetSimpleTrigger(-1, WPAD_BUTTON_2, 0); + } + + mainWindow = new GuiWindow(screenwidth, screenheight); + + if(menu == MENU_GAME) + { + gameScreen = new GuiImageData(gameScreenPng); + gameScreenImg = new GuiImage(gameScreen); + gameScreenImg->SetAlpha(192); + gameScreenImg->ColorStripe(30); + gameScreenImg->SetScaleX(screenwidth/(float)vmode->fbWidth); + gameScreenImg->SetScaleY(screenheight/(float)vmode->efbHeight); + } + else + { + gameScreenImg = new GuiImage(screenwidth, screenheight, (GXColor){236, 226, 238, 255}); + gameScreenImg->ColorStripe(10); + } + + mainWindow->Append(gameScreenImg); + + GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM); + GuiSound btnSoundClick(button_click_pcm, button_click_pcm_size, SOUND_PCM); + GuiImageData bgTop(bg_top_png); + bgTopImg = new GuiImage(&bgTop); + GuiImageData bgBottom(bg_bottom_png); + bgBottomImg = new GuiImage(&bgBottom); + bgBottomImg->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM); + GuiImageData logo(logo_png); + GuiImage logoImg(&logo); + GuiImageData logoOver(logo_over_png); + GuiImage logoImgOver(&logoOver); + GuiText logoTxt(APPVERSION, 18, (GXColor){255, 255, 255, 255}); + logoTxt.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + logoTxt.SetPosition(0, 4); + btnLogo = new GuiButton(logoImg.GetWidth(), logoImg.GetHeight()); + btnLogo->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + btnLogo->SetPosition(-50, 24); + btnLogo->SetImage(&logoImg); + btnLogo->SetImageOver(&logoImgOver); + btnLogo->SetLabel(&logoTxt); + btnLogo->SetSoundOver(&btnSoundOver); + btnLogo->SetSoundClick(&btnSoundClick); + btnLogo->SetTrigger(trigA); + btnLogo->SetTrigger(trig2); + btnLogo->SetUpdateCallback(WindowCredits); + + mainWindow->Append(bgTopImg); + mainWindow->Append(bgBottomImg); + mainWindow->Append(btnLogo); + + if(currentMenu == MENU_GAMESELECTION) + ResumeGui(); + + // Load preferences + if(!LoadPrefs()) + SavePrefs(SILENT); + +#ifdef HW_RVL + static bool checkIOS = true; + + if(checkIOS) + { + u32 ios = IOS_GetVersion(); + + if(!SupportedIOS(ios)) + ErrorPrompt("The current IOS is unsupported. Functionality and/or stability may be adversely affected."); + else if(!SaneIOS(ios)) + ErrorPrompt("The current IOS has been altered (fake-signed). Functionality and/or stability may be adversely affected."); + } + + checkIOS = false; +#endif + + // Load palettes + LoadPalettes(); + + #ifndef NO_SOUND + bgMusic = new GuiSound(bg_music_ogg, bg_music_ogg_size, SOUND_OGG); + bgMusic->SetVolume(GCSettings.MusicVolume); + bgMusic->SetLoop(true); + enterSound = new GuiSound(enter_ogg, enter_ogg_size, SOUND_OGG); + enterSound->SetVolume(GCSettings.SFXVolume); + exitSound = new GuiSound(exit_ogg, exit_ogg_size, SOUND_OGG); + exitSound->SetVolume(GCSettings.SFXVolume); + if(currentMenu == MENU_GAMESELECTION) bgMusic->Play(); // startup music + #endif + + while(currentMenu != MENU_EXIT || !ROMLoaded) + { + switch (currentMenu) + { + case MENU_GAMESELECTION: + currentMenu = MenuGameSelection(); + break; + case MENU_GAME: + currentMenu = MenuGame(); + break; + case MENU_GAME_LOAD: + currentMenu = MenuGameSaves(0); + break; + case MENU_GAME_SAVE: + currentMenu = MenuGameSaves(1); + break; + case MENU_GAME_DELETE: + currentMenu = MenuGameSaves(2); + break; + case MENU_GAMESETTINGS: + currentMenu = MenuGameSettings(); + break; + case MENU_GAMESETTINGS_MAPPINGS: + currentMenu = MenuSettingsMappings(); + break; + case MENU_GAMESETTINGS_MAPPINGS_MAP: + currentMenu = MenuSettingsMappingsMap(); + break; + case MENU_GAMESETTINGS_VIDEO: + currentMenu = MenuSettingsVideo(); + break; + case MENU_GAMESETTINGS_PALETTE: + currentMenu = MenuPalette(); + break; + case MENU_SETTINGS: + currentMenu = MenuSettings(); + break; + case MENU_SETTINGS_FILE: + currentMenu = MenuSettingsFile(); + break; + case MENU_SETTINGS_MENU: + currentMenu = MenuSettingsMenu(); + break; + case MENU_SETTINGS_NETWORK: + currentMenu = MenuSettingsNetwork(); + break; + case MENU_SETTINGS_EMULATION: + currentMenu = MenuSettingsEmulation(); + break; + default: // unrecognized menu + currentMenu = MenuGameSelection(); + break; + } + lastMenu = currentMenu; + usleep(THREAD_SLEEP); + } + + #ifdef HW_RVL + ShutoffRumble(); + #endif + + CancelAction(); + HaltGui(); + + #ifdef HW_RVL + if(updatethread != LWP_THREAD_NULL) + LWP_JoinThread(updatethread, NULL); + #endif + + #ifndef NO_SOUND + delete bgMusic; + delete enterSound; + delete exitSound; + #endif + + delete btnLogo; + delete gameScreenImg; + delete bgTopImg; + delete bgBottomImg; + delete mainWindow; + + mainWindow = NULL; + + if(gameScreen) + delete gameScreen; + + if(gameScreenPng) + { + free(gameScreenPng); + gameScreenPng = NULL; + } + + // wait for keys to be depressed + while(MenuRequested()) + { + UpdatePads(); + usleep(THREAD_SLEEP); + } +} diff --git a/source/networkop.cpp b/source/networkop.cpp index e98f53d..36e70a7 100644 --- a/source/networkop.cpp +++ b/source/networkop.cpp @@ -313,7 +313,7 @@ bool InitializeNetwork(bool silent) break; } #else - networkInit = !(if_config(wiiIP, NULL, NULL, true) < 0); + networkInit = !(if_config(wiiIP, NULL, NULL, true, 10) < 0); #endif CancelAction(); diff --git a/source/preferences.cpp b/source/preferences.cpp index 2d6100e..8f3d3b1 100644 --- a/source/preferences.cpp +++ b/source/preferences.cpp @@ -82,7 +82,7 @@ static void createXMLSetting(const char * name, const char * description, const mxmlElementSetAttr(item, "description", description); } -static void createXMLController(unsigned int controller[], const char * name, const char * description) +static void createXMLController(u32 controller[], const char * name, const char * description) { item = mxmlNewElement(section, "controller"); mxmlElementSetAttr(item, "name", name); @@ -201,7 +201,9 @@ preparePrefsData () createXMLSection("Menu", "Menu Settings"); +#ifdef HW_RVL createXMLSetting("WiimoteOrientation", "Wiimote Orientation", toStr(GCSettings.WiimoteOrientation)); +#endif createXMLSetting("ExitAction", "Exit Action", toStr(GCSettings.ExitAction)); createXMLSetting("MusicVolume", "Music Volume", toStr(GCSettings.MusicVolume)); createXMLSetting("SFXVolume", "Sound Effects Volume", toStr(GCSettings.SFXVolume)); @@ -331,7 +333,7 @@ static void loadXMLSetting(float * var, const char * name) * Load XML elements into variables for a controller mapping ***************************************************************************/ -static void loadXMLController(unsigned int controller[], const char * name) +static void loadXMLController(u32 controller[], const char * name) { item = mxmlFindElement(xml, xml, "controller", "name", name, MXML_DESCEND); diff --git a/source/vbagx.cpp b/source/vbagx.cpp index da2af7c..118eb0b 100644 --- a/source/vbagx.cpp +++ b/source/vbagx.cpp @@ -41,6 +41,7 @@ #include "vba/gba/Sound.h" extern "C" { +extern char* strcasestr(const char *, const char *); extern void __exception_setreload(int t); } @@ -272,7 +273,7 @@ bool SaneIOS(u32 ios) static bool gecko = false; static mutex_t gecko_mutex = 0; -static ssize_t __out_write(struct _reent *r, int fd, const char *ptr, size_t len) +static ssize_t __out_write(struct _reent *r, void* fd, const char *ptr, size_t len) { if (!gecko || len == 0) return len; diff --git a/source/vbagx.h b/source/vbagx.h index 0b59f90..3994004 100644 --- a/source/vbagx.h +++ b/source/vbagx.h @@ -11,6 +11,7 @@ #define _VBAGX_H_ #include +#include #include "filelist.h" #include "utils/FreeTypeGX.h" diff --git a/source/video.cpp b/source/video.cpp index 97015eb..bcbd75b 100644 --- a/source/video.cpp +++ b/source/video.cpp @@ -32,7 +32,7 @@ u32 FrameTimer = 0; /*** External 2D Video ***/ /*** 2D Video Globals ***/ GXRModeObj *vmode = NULL; // Graphics Mode Object -unsigned int *xfb[2] = { NULL, NULL }; // Framebuffers +u32 *xfb[2] = { NULL, NULL }; // Framebuffers int whichfb = 0; // Frame buffer toggle static Mtx GXmodelView2D;