From e44e3c817c97a9985a664c013efaae79cb18c8f7 Mon Sep 17 00:00:00 2001 From: dimok321 <15055714+dimok789@users.noreply.github.com> Date: Fri, 24 Sep 2010 21:22:01 +0000 Subject: [PATCH] *Seperated game settings from cfg.c into it's own class. Some stuff might be broken and need adjustments. --- HBC/META.XML | 4 +- gui.pnproj | 2 +- source/menu.cpp | 34 ++- source/menu/menu_disclist.cpp | 49 +--- source/settings/CGameSettings.cpp | 387 ++++++++++++++++++++++++++ source/settings/CGameSettings.h | 68 +++++ source/settings/CSettings.cpp | 8 +- source/settings/Settings.cpp | 200 ++++++-------- source/settings/Settings.h | 3 +- source/settings/cfg.c | 434 +----------------------------- source/settings/cfg.h | 61 ++--- source/usbloader/alternatedol.c | 10 +- source/usbloader/apploader.c | 6 +- source/usbloader/apploader.h | 4 +- source/usbloader/disc.c | 8 +- source/usbloader/disc.h | 4 +- source/xml/xml.cpp | 4 +- 17 files changed, 616 insertions(+), 670 deletions(-) create mode 100644 source/settings/CGameSettings.cpp create mode 100644 source/settings/CGameSettings.h diff --git a/HBC/META.XML b/HBC/META.XML index 46280094..8f0a1780 100644 --- a/HBC/META.XML +++ b/HBC/META.XML @@ -2,8 +2,8 @@ USB Loader GX USB Loader GX Team - 1.0 r970 - 201009241642 + 1.0 r971 + 201009241958 Loads games from USB-devices USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller. diff --git a/gui.pnproj b/gui.pnproj index 8cbfcf36..d9095992 100644 --- a/gui.pnproj +++ b/gui.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/menu.cpp b/source/menu.cpp index 06fa82d5..9f5acc1f 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -19,6 +19,7 @@ #include "network/networkops.h" #include "patches/patchcode.h" #include "settings/Settings.h" +#include "settings/CGameSettings.h" #include "themes/CTheme.h" #include "themes/Theme_Downloader.h" #include "usbloader/disc.h" @@ -417,7 +418,19 @@ int MainMenu(int menu) int ret = 0; header = (mountMethod ? dvdheader : gameList[gameSelected]); - struct Game_CFG* game_cfg = CFG_get_game_opt(header->id); + u8 videoChoice = Settings.videomode; + u8 languageChoice = Settings.language; + u8 ocarinaChoice = Settings.ocarina; + u8 viChoice = Settings.videopatch; + u8 iosChoice = Settings.cios; + u8 fix002 = Settings.error002; + u8 countrystrings = Settings.patchcountrystrings; + u8 alternatedol = off; + u32 alternatedoloffset = 0; + u8 reloadblock = off; + u8 returnToLoaderGV = 1; + + GameCFG * game_cfg = GameSettings.GetGameCFG(header->id); if (game_cfg) { @@ -436,23 +449,6 @@ int MainMenu(int menu) reloadblock = game_cfg->iosreloadblock; returnToLoaderGV = game_cfg->returnTo; } - else - { - videoChoice = Settings.videomode; - languageChoice = Settings.language; - ocarinaChoice = Settings.ocarina; - viChoice = Settings.videopatch; - iosChoice = Settings.cios; - fix002 = Settings.error002; - countrystrings = Settings.patchcountrystrings; - if (!altdoldefault) - { - alternatedol = off; - alternatedoloffset = 0; - } - reloadblock = off; - returnToLoaderGV = 1; - } if (!mountMethod) { @@ -623,7 +619,7 @@ int MainMenu(int menu) gprintf("\tDisc_wiiBoot\n"); ret = Disc_WiiBoot(Settings.dolpath, videoselected, cheat, vipatch, countrystrings, errorfixer002, - alternatedol, alternatedoloffset, channel); + alternatedol, alternatedoloffset, channel, fix002); if (ret < 0) { Sys_LoadMenu(); diff --git a/source/menu/menu_disclist.cpp b/source/menu/menu_disclist.cpp index c01b1620..a9f23d4c 100644 --- a/source/menu/menu_disclist.cpp +++ b/source/menu/menu_disclist.cpp @@ -9,6 +9,7 @@ #include "prompts/DiscBrowser.h" #include "prompts/TitleBrowser.h" #include "settings/Settings.h" +#include "settings/CGameSettings.h" #include "themes/CTheme.h" #include "wpad.h" #include "sys.h" @@ -1656,8 +1657,10 @@ int MenuDiscList() header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); //reset header snprintf(IDfull, sizeof(IDfull), "%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2], header->id[3], header->id[4], header->id[5]); - struct Game_CFG* game_cfg = CFG_get_game_opt(header->id); - + GameCFG* game_cfg = GameSettings.GetGameCFG(header->id); + u8 alternatedol; + u8 ocarinaChoice; + if (game_cfg) { alternatedol = game_cfg->loadalternatedol; @@ -1799,7 +1802,7 @@ int MenuDiscList() //re-evaluate header now in case they changed games while on the game prompt header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); - int settret = GameSettings(header); + int settret = MenuGameSettings(header); /* unneeded for now, kept in case database gets a separate language setting //menu = MENU_DISCLIST; // refresh titles (needed if the language setting has changed) */ @@ -1884,45 +1887,7 @@ int MenuDiscList() } covertOld = covert; } - - // set alt dol default - if (menu == MENU_EXIT && altdoldefault) - { - struct discHdr *header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]); - struct Game_CFG* game_cfg = CFG_get_game_opt(header->id); - // use default only if no alt dol was selected manually - if (game_cfg) - { - if (game_cfg->alternatedolstart != 0) altdoldefault = false; - } - if (altdoldefault) - { - int autodol = autoSelectDol((char*) header->id, true); - if (autodol > 0) - { - alternatedol = 2; - alternatedoloffset = autodol; - char temp[20]; - sprintf(temp, "%d", autodol); - } - else - { - // alt dol menu for games that require more than a single alt dol - int autodol = autoSelectDolMenu((char*) header->id, true); - if (autodol > 0) - { - alternatedol = 2; - alternatedoloffset = autodol; - } - } - } - } - //no need to close sd here. we still need to get settings and codes and shit - /*if (menu == MENU_EXIT) { - SDCard_deInit(); - }*/ - //if (Settings.gameDisplay==list) {startat=gameBrowser->GetOffset(), offset=startat;}//save the variables in case we are refreshing the list - //gprintf("\n\tstartat:%d offset:%d",startat,offset); + HaltGui(); mainWindow->RemoveAll(); mainWindow->Append(bgImg); diff --git a/source/settings/CGameSettings.cpp b/source/settings/CGameSettings.cpp new file mode 100644 index 00000000..ee8a50f0 --- /dev/null +++ b/source/settings/CGameSettings.cpp @@ -0,0 +1,387 @@ +/**************************************************************************** + * Copyright (C) 2010 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#include +#include +#include +#include + +#include "CGameSettings.h" +#include "listfiles.h" + +CGameSettings GameSettings; + +const char * VideoMap[] = +{ + "system", + "game", + "patch", + "pal50", + "pal60", + "ntsc", + NULL +}; + +const char * LanguageMap[] = +{ + "console", + "japanese", + "english", + "german", + "french", + "spanish", + "italian", + "dutch", + "schinese", + "tchinese", + "korean", + NULL +}; + + +CGameSettings::CGameSettings() +{ +} + +CGameSettings::~CGameSettings() +{ +} + +GameCFG * CGameSettings::GetGameCFG(const char * id) +{ + if(!id) + return NULL; + + for(u32 i = 0; i < GameList.size(); ++i) + { + if(strncmp(id, GameList[i].id, 6) == 0) + { + return &GameList[i]; + } + } + + return NULL; +} + +bool CGameSettings::AddGame(const GameCFG * NewGame) +{ + if(!NewGame) + return false; + + for(u32 i = 0; i < GameList.size(); ++i) + { + if(strncmp(NewGame->id, GameList[i].id, 6) == 0) + { + memcpy(&GameList[i], NewGame, sizeof(GameCFG)); + return Save(); + } + } + + GameList.push_back(*NewGame); + + return Save(); +} + +bool CGameSettings::RemoveAll() +{ + GameList.clear(); + std::vector().swap(GameList); + + return Save(); +} + +bool CGameSettings::Remove(const char * id) +{ + if(!id) + return false; + + for(u32 i = 0; i < GameList.size(); ++i) + { + if(strncmp(id, GameList[i].id, 6) == 0) + { + GameList.erase(GameList.begin()+i); + break; + } + } + + return Save(); +} + +bool CGameSettings::Load(const char * path) +{ + char line[1024]; + char filepath[300]; + snprintf(filepath, sizeof(filepath), "%s/config/GXCGameSettings.cfg", path); + + ConfigPath = filepath; + + FILE *file = fopen(filepath, "r"); + if (!file) return false; + + while (fgets(line, sizeof(line), file)) + { + if (line[0] == '#') + continue; + + this->ParseLine(line); + } + fclose(file); + + return true; +} + +bool CGameSettings::Save() +{ + char filepath[300]; + strcpy(filepath, ConfigPath.c_str()); + + char * ptr = strrchr(filepath, '/'); + if(ptr) + ptr[0] = 0; + + subfoldercreate(filepath); + + FILE * f = fopen(ConfigPath.c_str(), "w"); + if (!f) return false; + + fprintf(f, "# USB Loader settings file\n"); + fprintf(f, "# note: this file is automatically generated\n"); + fprintf(f, "# Num Games: %d\n", GameList.size()); + for (u32 i = 0; i < GameList.size(); ++i) + { + fprintf(f, "game:%s = ", GameList[i].id); + fprintf(f, "video:%s; ", VideoMap[GameList[i].video]); + fprintf(f, "language:%s; ", LanguageMap[GameList[i].language]); + fprintf(f, "ocarina:%d; ", GameList[i].ocarina); + fprintf(f, "vipatch:%d; ", GameList[i].vipatch); + fprintf(f, "ios:%d; ", GameList[i].ios); + fprintf(f, "parentalcontrol:%d; ", GameList[i].parentalcontrol); + fprintf(f, "errorfix002:%d; ", GameList[i].errorfix002); + fprintf(f, "iosreloadblock:%d; ", GameList[i].iosreloadblock); + fprintf(f, "patchcountrystrings:%d; ", GameList[i].patchcountrystrings); + fprintf(f, "loadalternatedol:%d; ", GameList[i].loadalternatedol); + fprintf(f, "alternatedolstart:%d; ", GameList[i].alternatedolstart); + fprintf(f, "alternatedolname:%s; ", GameList[i].alternatedolname); + fprintf(f, "returnTo:%d;\n", GameList[i].returnTo); + } + fprintf(f, "# END\n"); + fclose(f); + + return true; +} + +bool CGameSettings::SetSetting(GameCFG & game, char *name, char *value) +{ + int i = 0; + + if (strcmp(name, "video") == 0) + { + for(i = 0; VideoMap[i] != NULL; ++i) + { + if(strcasecmp(value, VideoMap[i]) == 0) + { + game.video = i; + break; + } + } + return true; + } + else if(strcmp(name, "language") == 0) + { + for(i = 0; LanguageMap[i] != NULL; ++i) + { + if(strcasecmp(value, LanguageMap[i]) == 0) + { + game.language = i; + break; + } + } + return true; + } + else if(strcmp(name, "ocarina") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.ocarina = i; + } + return true; + } + else if(strcmp(name, "vipatch") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.vipatch = i; + } + return true; + } + else if(strcmp(name, "ios") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.ios = i; + } + return true; + } + else if(strcmp(name, "parentalcontrol") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.parentalcontrol = i; + } + return true; + } + else if(strcmp(name, "errorfix002") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.errorfix002 = i; + } + return true; + } + else if(strcmp(name, "iosreloadblock") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.iosreloadblock = i; + } + return true; + } + else if(strcmp(name, "loadalternatedol") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.loadalternatedol = i; + } + return true; + } + else if(strcmp(name, "alternatedolstart") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.alternatedolstart = i; + } + return true; + } + else if(strcmp(name, "patchcountrystrings") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.patchcountrystrings = i; + } + return true; + } + else if(strcmp(name, "alternatedolname") == 0) + { + snprintf(game.alternatedolname, sizeof(game.alternatedolname), value); + return true; + } + else if(strcmp(name, "returnTo") == 0) + { + if (sscanf(value, "%d", &i) == 1) + { + game.returnTo = i; + } + return true; + } + + return false; +} + +bool CGameSettings::ReadGameID(const char * src, char * GameID, int size) +{ + if(strncasecmp(src, "game:", 5) != 0) + return false; + + char * ptr = strchr(src, ':'); + if(!ptr) + return false; + + ptr++; + + int i = 0; + + for(i = 0; i < size; i++, ptr++) + { + if(*ptr == ' ' || *ptr == '\0') + break; + + GameID[i] = *ptr; + } + + GameID[i] = 0; + + return true; +} + +void CGameSettings::ParseLine(char *line) +{ + char name[1024], value[1024]; + char GameID[8]; + + if(!ReadGameID(line, GameID, 6)) + return; + + int pos = GameList.size(); + + GameList.resize(pos+1); + memset(&GameList[pos], 0, sizeof(GameCFG)); + + strcpy(GameList[pos].id, GameID); + + char * LinePtr = strchr(line, '='); + + while(LinePtr != NULL) + { + LinePtr++; + + char * eq = strchr(LinePtr, ':'); + + if (!eq) return; + + this->TrimLine(name, LinePtr, sizeof(name)); + this->TrimLine(value, eq + 1, sizeof(value)); + + SetSetting(GameList[pos], name, value); + + LinePtr = strchr(LinePtr, ';'); + } +} + +void CGameSettings::TrimLine(char *dest, const char *src, int size) +{ + while (*src == ' ') + src++; + + int i = 0; + + for(i = 0; i < size; i++, src++) + { + if(*src == ';' || *src == '\n' || + *src == '\r' || *src == '\0') + break; + + dest[i] = *src; + } + + dest[i] = '\0'; +} diff --git a/source/settings/CGameSettings.h b/source/settings/CGameSettings.h new file mode 100644 index 00000000..096d44e6 --- /dev/null +++ b/source/settings/CGameSettings.h @@ -0,0 +1,68 @@ +#ifndef _GAME_SETTINGS_H_ +#define _GAME_SETTINGS_H_ + +#include +#include +#include +#include +#include "usbloader/disc.h" + +typedef struct _GameCFG +{ + char id[7]; + u8 video; + u8 language; + u8 ocarina; + u8 vipatch; + u8 ios; + u8 parentalcontrol; + u8 errorfix002; + u8 iosreloadblock; + u8 loadalternatedol; + u32 alternatedolstart; + u8 patchcountrystrings; + char alternatedolname[40]; + u8 returnTo; +} GameCFG; + +class CGameSettings +{ + public: + //!Constructor + CGameSettings(); + //!Destructor + ~CGameSettings(); + //!Load + bool Load(const char * path); + //!Save + bool Save(); + //!AddGame + bool AddGame(const GameCFG * NewGame); + //!Reset + bool RemoveAll(); + //!Overload Reset for one Game + bool Remove(const char * id); + bool Remove(const u8 * id) { return Remove((const char *) id); }; + bool Remove(const struct discHdr * game) { if(!game) return false; else return Remove(game->id); }; + //!Get GameCFG + GameCFG * GetGameCFG(const char * id); + //!Overload + GameCFG * GetGameCFG(const u8 * id) { return GetGameCFG((const char *) id); }; + //!Overload + GameCFG * GetGameCFG(const struct discHdr * game) { if(!game) return NULL; else return GetGameCFG(game->id); }; + + protected: + bool ReadGameID(const char * src, char * GameID, int size); + bool SetSetting(GameCFG & game, char *name, char *value); + //!Find the config file in the default paths + bool FindConfig(); + + void ParseLine(char *line); + void TrimLine(char *dest, const char *src, int size); + std::string ConfigPath; + std::vector GameList; +}; + +extern CGameSettings GameSettings; + +#endif diff --git a/source/settings/CSettings.cpp b/source/settings/CSettings.cpp index 70c364cc..96840b5c 100644 --- a/source/settings/CSettings.cpp +++ b/source/settings/CSettings.cpp @@ -84,7 +84,7 @@ void CSettings::SetDefault() parentalcontrol = 0; cios = 249; xflip = no; - qboot = no; + quickboot = no; wiilight = 1; autonetwork = 0; discart = 0; @@ -204,7 +204,7 @@ bool CSettings::Save() fprintf(file, "keyset = %d\n ", keyset); fprintf(file, "xflip = %d\n ", xflip); fprintf(file, "gridRows = %d\n ", gridRows); - fprintf(file, "qboot = %d\n ", qboot); + fprintf(file, "quickboot = %d\n ", quickboot); fprintf(file, "wsprompt = %d\n ", wsprompt); fprintf(file, "parentalcontrol = %d\n ", parentalcontrol); fprintf(file, "cover_path = %s\n ", covers_path); @@ -372,9 +372,9 @@ bool CSettings::SetSetting(char *name, char *value) if (sscanf(value, "%d", &i) == 1) gridRows = i; return true; } - else if (strcmp(name, "qboot") == 0) + else if (strcmp(name, "quickboot") == 0) { - if (sscanf(value, "%d", &i) == 1) qboot = i; + if (sscanf(value, "%d", &i) == 1) quickboot = i; return true; } else if (strcmp(name, "partition") == 0) diff --git a/source/settings/Settings.cpp b/source/settings/Settings.cpp index e6532ed6..5216e8d1 100644 --- a/source/settings/Settings.cpp +++ b/source/settings/Settings.cpp @@ -8,6 +8,7 @@ #include "prompts/PromptWindows.h" #include "prompts/DiscBrowser.h" #include "settings/SettingsPrompts.h" +#include "settings/CGameSettings.h" #include "prompts/filebrowser.h" #include "cheats/cheatmenu.h" #include "themes/CTheme.h" @@ -2275,7 +2276,7 @@ int MenuSettings() /******************************************************************************** *Game specific settings *********************************************************************************/ -int GameSettings(struct discHdr * header) +int MenuGameSettings(struct discHdr * header) { int menu = MENU_NONE; int ret; @@ -2433,8 +2434,32 @@ int GameSettings(struct discHdr * header) optionBrowser2.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); GuiWindow w(screenwidth, screenheight); - //int opt_lang = languageChoice; // backup language setting - struct Game_CFG* game_cfg = CFG_get_game_opt(header->id); + + GameCFG game_cfg; + + GameCFG* existCFG = GameSettings.GetGameCFG(header->id); + + if (existCFG) + { + memcpy(&game_cfg, existCFG, sizeof(GameCFG)); + } + else + { + snprintf(game_cfg.id, sizeof(game_cfg.id), "%s", (char *) header->id); + game_cfg.video = Settings.videomode; + game_cfg.language = Settings.language; + game_cfg.ocarina = Settings.ocarina; + game_cfg.vipatch = Settings.videopatch; + game_cfg.ios = Settings.cios; + game_cfg.parentalcontrol = 0; + game_cfg.errorfix002 = Settings.error002; + game_cfg.patchcountrystrings = Settings.patchcountrystrings; + game_cfg.loadalternatedol = off; + game_cfg.alternatedolstart = 0; + game_cfg.iosreloadblock = off; + strcpy(game_cfg.alternatedolname, ""); + game_cfg.returnTo = 1; + } int pageToDisplay = 1; while (pageToDisplay > 0) @@ -2495,39 +2520,6 @@ int GameSettings(struct discHdr * header) mainWindow->Append(&w); - if (game_cfg) //if there are saved settings for this game use them - { - videoChoice = game_cfg->video; - languageChoice = game_cfg->language; - ocarinaChoice = game_cfg->ocarina; - viChoice = game_cfg->vipatch; - iosChoice = game_cfg->ios; - parentalcontrolChoice = game_cfg->parentalcontrol; - fix002 = game_cfg->errorfix002; - countrystrings = game_cfg->patchcountrystrings; - alternatedol = game_cfg->loadalternatedol; - alternatedoloffset = game_cfg->alternatedolstart; - reloadblock = game_cfg->iosreloadblock; - strlcpy(alternatedname, game_cfg->alternatedolname, sizeof(alternatedname)); - returnToLoaderGV = game_cfg->returnTo; - } - else - { - videoChoice = Settings.videomode; - languageChoice = Settings.language; - ocarinaChoice = Settings.ocarina; - viChoice = Settings.videopatch; - iosChoice = Settings.cios; - parentalcontrolChoice = 0; - fix002 = Settings.error002; - countrystrings = Settings.patchcountrystrings; - alternatedol = off; - alternatedoloffset = 0; - reloadblock = off; - strcpy(alternatedname, ""); - returnToLoaderGV = 1; - } - ResumeGui(); while (MainButton1.GetEffect() > 0) @@ -2610,25 +2602,12 @@ int GameSettings(struct discHdr * header) else if (saveBtn.GetState() == STATE_CLICKED) { - if (isInserted(bootDevice)) + if (GameSettings.AddGame(&game_cfg)) { - if (CFG_save_game_opt(header->id)) - { - /* commented because the database language now depends on the main language setting, this could be enabled again if there is a separate language setting for the database - // if game language has changed when saving game settings, reload titles - int opt_langnew = 0; - game_cfg = CFG_get_game_opt(header->id); - if (game_cfg) opt_langnew = game_cfg->language; - if (Settings.titlesOverride==1 && opt_lang != opt_langnew) - OpenXMLDatabase(Settings.titlestxt_path, Settings.db_language, Settings.db_JPtoEN, true, true, false); // open file, reload titles, do not keep in memory - // titles are refreshed in menu.cpp as soon as this function returns - */ - game_cfg = CFG_get_game_opt(header->id); // needed here for "if (game_cfg)" earlier in case it's the first time settings are saved for a game - WindowPrompt(tr( "Successfully Saved" ), 0, tr( "OK" )); - } - else WindowPrompt(tr( "Save Failed" ), 0, tr( "OK" )); + WindowPrompt(tr( "Successfully Saved" ), 0, tr( "OK" )); } - else WindowPrompt(tr( "No SD-Card inserted!" ), tr( "Insert an SD-Card to save." ), tr( "OK" )); + else + WindowPrompt(tr( "Save Failed. No device inserted?" ), 0, tr( "OK" )); saveBtn.ResetState(); optionBrowser2.SetFocus(1); @@ -2643,31 +2622,31 @@ int GameSettings(struct discHdr * header) if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "%s", tr( "Video Mode" )); - if (ret == Idx && ++videoChoice >= settings_video_max) videoChoice = 0; - options2.SetValue(Idx, "%s%s", opts_videomode[videoChoice][0], - tr( opts_videomode[videoChoice][1] )); + if (ret == Idx && ++game_cfg.video >= settings_video_max) game_cfg.video = 0; + options2.SetValue(Idx, "%s%s", opts_videomode[game_cfg.video][0], + tr( opts_videomode[game_cfg.video][1] )); } if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "%s", tr( "VIDTV Patch" )); - if (ret == Idx && ++viChoice >= settings_off_on_max) viChoice = 0; - options2.SetValue(Idx, "%s", tr( opts_off_on[viChoice] )); + if (ret == Idx && ++game_cfg.vipatch >= settings_off_on_max) game_cfg.vipatch = 0; + options2.SetValue(Idx, "%s", tr( opts_off_on[game_cfg.vipatch] )); } if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "%s", tr( "Game Language" )); - if (ret == Idx && ++languageChoice >= settings_language_max) languageChoice = 0; - options2.SetValue(Idx, "%s", tr( opts_language[languageChoice] )); + if (ret == Idx && ++game_cfg.language >= settings_language_max) game_cfg.language = 0; + options2.SetValue(Idx, "%s", tr( opts_language[game_cfg.language] )); } if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "Ocarina"); - if (ret == Idx && ++ocarinaChoice >= settings_off_on_max) ocarinaChoice = 0; - options2.SetValue(Idx, "%s", tr( opts_off_on[ocarinaChoice] )); + if (ret == Idx && ++game_cfg.ocarina >= settings_off_on_max) game_cfg.ocarina = 0; + options2.SetValue(Idx, "%s", tr( opts_off_on[game_cfg.ocarina] )); } if (ret == ++Idx || firstRun) @@ -2675,54 +2654,54 @@ int GameSettings(struct discHdr * header) if (firstRun) options2.SetName(Idx, "IOS"); if (ret == Idx) { - switch (iosChoice) + switch (game_cfg.ios) { case 222: - iosChoice = 223; + game_cfg.ios = 223; break; case 223: - iosChoice = 224; + game_cfg.ios = 224; break; case 224: - iosChoice = 249; + game_cfg.ios = 249; break; case 249: - iosChoice = 250; + game_cfg.ios = 250; break; case 250: - iosChoice = 222; + game_cfg.ios = 222; break; default: - iosChoice = 222; + game_cfg.ios = 222; break; } } - options2.SetValue(Idx, "IOS %i", iosChoice); + options2.SetValue(Idx, "IOS %i", game_cfg.ios); } if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "%s", tr( "Parental Control" )); - if (ret == Idx && ++parentalcontrolChoice >= 5) parentalcontrolChoice = 0; - options2.SetValue(Idx, "%s", tr( opts_parentalcontrol[parentalcontrolChoice] )); + if (ret == Idx && ++game_cfg.parentalcontrol >= 5) game_cfg.parentalcontrol = 0; + options2.SetValue(Idx, "%s", tr( opts_parentalcontrol[game_cfg.parentalcontrol] )); } if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "%s", tr( "Error 002 fix" )); - if (ret == Idx && ++fix002 >= 3) fix002 = 0; - options2.SetValue(Idx, "%s", tr( opts_error002[fix002] )); + if (ret == Idx && ++game_cfg.errorfix002 >= 3) game_cfg.errorfix002 = 0; + options2.SetValue(Idx, "%s", tr( opts_error002[game_cfg.errorfix002] )); } if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "%s", tr( "Return To" )); - if (ret == Idx && ++returnToLoaderGV >= settings_off_on_max) returnToLoaderGV = 0; + if (ret == Idx && ++game_cfg.returnTo >= settings_off_on_max) game_cfg.returnTo = 0; char text[IMET_MAX_NAME_LEN]; int channel = NandTitles.FindU32(Settings.returnTo);//is the channel set in the global settings actually installed? - if (!returnToLoaderGV || channel < 0)//channel is not installed or the uer wants to not use it + if (!game_cfg.returnTo || channel < 0)//channel is not installed or the uer wants to not use it sprintf(text, "%s", tr( opts_off_on[ 0 ] )); else snprintf(text, sizeof(text), "%s", NandTitles.NameFromIndex(channel)); @@ -2733,19 +2712,19 @@ int GameSettings(struct discHdr * header) if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "%s", tr( "Patch Country Strings" )); - if (ret == Idx && ++countrystrings >= settings_off_on_max) countrystrings = 0; - options2.SetValue(Idx, "%s", tr( opts_off_on[countrystrings] )); + if (ret == Idx && ++game_cfg.patchcountrystrings >= settings_off_on_max) game_cfg.patchcountrystrings = 0; + options2.SetValue(Idx, "%s", tr( opts_off_on[game_cfg.patchcountrystrings] )); } if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "%s", tr( "Alternate DOL" )); - int last_alternatedol = alternatedol; - if (ret == Idx && (alternatedol = (alternatedol + 2) % 3) >= 3) // 0->2->1->0 - alternatedol = 0; + int last_alternatedol = game_cfg.loadalternatedol; + if (ret == Idx && (game_cfg.loadalternatedol = (game_cfg.loadalternatedol + 2) % 3) >= 3) // 0->2->1->0 + game_cfg.loadalternatedol = 0; static const char *opts[] = { trNOOP( "Default" ), trNOOP( "Load From SD/USB" ), trNOOP( "Select a DOL" ) }; - options2.SetValue(Idx, "%s", tr( opts[alternatedol] )); + options2.SetValue(Idx, "%s", tr( opts[game_cfg.loadalternatedol] )); if (last_alternatedol != 1) { firstRun = true; // force re-init follow Entries @@ -2753,28 +2732,27 @@ int GameSettings(struct discHdr * header) } } - if (alternatedol == 2 && (ret == ++Idx || firstRun)) + if (game_cfg.loadalternatedol == 2 && (ret == ++Idx || firstRun)) { if (firstRun) options2.SetName(Idx, "%s", tr( "Selected DOL" )); if (ret == Idx) { - if (alternatedol == 2) + if (game_cfg.loadalternatedol == 2) { char filename[10]; - snprintf(filename, sizeof(filename), "%c%c%c%c%c%c", header->id[0], header->id[1], - header->id[2], header->id[3], header->id[4], header->id[5]); + snprintf(filename, 7, "%s", (char *) header->id); int dolchoice = 0; //alt dol menu for games that require more than a single alt dol int autodol = autoSelectDolMenu(filename, false); if (autodol > 0) { - alternatedoloffset = autodol; + game_cfg.alternatedolstart = autodol; snprintf(alternatedname, sizeof(alternatedname), "%s <%i>", tr( "AUTO" ), autodol); } else if (autodol == 0) - alternatedol = 0; // default was chosen + game_cfg.loadalternatedol = 0; // default was chosen else { //check to see if we already know the offset of the correct dol @@ -2788,10 +2766,10 @@ int GameSettings(struct discHdr * header) tr( "Do you want to use the alternate DOL that is known to be correct?" ), tr( "Yes" ), tr( "Pick from a list" ), tr( "Cancel" )); if (dolchoice == 0) - alternatedol = 0; + game_cfg.loadalternatedol = 0; else if (dolchoice == 1) { - alternatedoloffset = autodol; + game_cfg.alternatedolstart = autodol; snprintf(alternatedname, sizeof(alternatedname), "%s <%i>", tr( "AUTO" ), autodol); } @@ -2799,7 +2777,7 @@ int GameSettings(struct discHdr * header) { int res = DiscBrowse(header); if ((res >= 0) && (res != 696969)) //if res==696969 they pressed the back button - alternatedoloffset = res; + game_cfg.alternatedolstart = res; } } else @@ -2807,21 +2785,21 @@ int GameSettings(struct discHdr * header) int res = DiscBrowse(header); if ((res >= 0) && (res != 696969)) { - alternatedoloffset = res; + game_cfg.alternatedolstart = res; char tmp[170]; snprintf( tmp, sizeof(tmp), "%s %s - %i", tr( "It seems that you have some information that will be helpful to us. Please pass this information along to the DEV team." ), - filename, alternatedoloffset); + filename, game_cfg.alternatedolstart); WindowPrompt(0, tmp, tr( "OK" )); } } } } } - if (alternatedol == 0) + if (game_cfg.loadalternatedol == 0) { firstRun = true; // force re-init follow Entries options2.SetLength(Idx--); // remove this Entry @@ -2833,8 +2811,8 @@ int GameSettings(struct discHdr * header) if (ret == ++Idx || firstRun) { if (firstRun) options2.SetName(Idx, "%s", tr( "Block IOS Reload" )); - if (ret == Idx && ++reloadblock >= settings_off_on_max) reloadblock = 0; - options2.SetValue(Idx, "%s", tr( opts_off_on[reloadblock] )); + if (ret == Idx && ++game_cfg.iosreloadblock >= settings_off_on_max) game_cfg.iosreloadblock = 0; + options2.SetValue(Idx, "%s", tr( opts_off_on[game_cfg.iosreloadblock] )); } firstRun = false; @@ -2926,7 +2904,7 @@ int GameSettings(struct discHdr * header) tr( "Yes" ), tr( "Cancel" )); if (choice1 == 1 && !mountMethod) { - CFG_forget_game_opt(header->id); + GameSettings.Remove(header->id); CFG_forget_game_num(header->id); ret = WBFS_RemoveGame(header->id); if (ret < 0) @@ -3057,20 +3035,20 @@ int GameSettings(struct discHdr * header) int choice1 = WindowPrompt(tr( "Are you sure?" ), 0, tr( "Yes" ), tr( "Cancel" )); if (choice1 == 1) { - videoChoice = Settings.videomode; - viChoice = Settings.videopatch; - languageChoice = Settings.language; - ocarinaChoice = Settings.ocarina; - fix002 = Settings.error002; - countrystrings = Settings.patchcountrystrings; - alternatedol = off; - alternatedoloffset = 0; - reloadblock = off; - iosChoice = Settings.cios; - parentalcontrolChoice = 0; - strcpy(alternatedname, ""); - returnToLoaderGV = 1; - CFG_forget_game_opt(header->id); + game_cfg.video = Settings.videomode; + game_cfg.vipatch = Settings.videopatch; + game_cfg.language = Settings.language; + game_cfg.ocarina = Settings.ocarina; + game_cfg.errorfix002 = Settings.error002; + game_cfg.patchcountrystrings = Settings.patchcountrystrings; + game_cfg.loadalternatedol = off; + game_cfg.alternatedolstart = 0; + game_cfg.iosreloadblock = off; + game_cfg.ios = Settings.cios; + game_cfg.parentalcontrol = 0; + strcpy(game_cfg.alternatedolname, ""); + game_cfg.returnTo = 1; + GameSettings.Remove(header->id); } pageToDisplay = 1; diff --git a/source/settings/Settings.h b/source/settings/Settings.h index 3cec126e..9eb367ec 100644 --- a/source/settings/Settings.h +++ b/source/settings/Settings.h @@ -9,5 +9,6 @@ #define _SETTINGS_H_ int MenuSettings(); -int GameSettings(struct discHdr * header); +int MenuGameSettings(struct discHdr * header); + #endif diff --git a/source/settings/cfg.c b/source/settings/cfg.c index c9f54fa3..3d879600 100644 --- a/source/settings/cfg.c +++ b/source/settings/cfg.c @@ -55,102 +55,10 @@ struct ID_Title *cfg_title = NULL; int num_control = 0; struct ID_Control *cfg_control = NULL; -#define MAX_SAVED_GAMES 1000 #define MAX_SAVED_GAME_NUM 1000 -int num_saved_games = 0; int num_saved_game_num = 0; -struct Game_CFG cfg_game[MAX_SAVED_GAMES]; struct Game_NUM cfg_game_num[MAX_SAVED_GAME_NUM]; -/* For Mapping */ - -static char *cfg_name, *cfg_val; - -struct TextMap -{ - char *name; - int id; -}; - -struct TextMap map_video[] = { { "system", CFG_VIDEO_SYS }, { "game", CFG_VIDEO_GAME }, { "patch", CFG_VIDEO_PATCH }, { - "pal50", CFG_VIDEO_PAL50 }, { "pal60", CFG_VIDEO_PAL60 }, { "ntsc", CFG_VIDEO_NTSC }, { NULL, -1 } }; - -struct TextMap map_language[] = { { "console", CFG_LANG_CONSOLE }, { "japanese", CFG_LANG_JAPANESE }, { "english", - CFG_LANG_ENGLISH }, { "german", CFG_LANG_GERMAN }, { "french", CFG_LANG_FRENCH }, - { "spanish", CFG_LANG_SPANISH }, { "italian", CFG_LANG_ITALIAN }, { "dutch", CFG_LANG_DUTCH }, { "schinese", - CFG_LANG_S_CHINESE }, // without a dot between s and chinese to match the language filename "schinese.lang" - { "tchinese", CFG_LANG_T_CHINESE }, { "korean", CFG_LANG_KOREAN }, { NULL, -1 } }; - -int map_get_id(struct TextMap *map, char *name) -{ - int i; - for (i = 0; map[i].name != NULL; i++) - { - if (strcmp(name, map[i].name) == 0) return map[i].id; - } - return -1; -} - -char* map_get_name(struct TextMap *map, short id) -{ - int i; - for (i = 0; map[i].name != NULL; i++) - { - if (id == map[i].id) return map[i].name; - } - return NULL; -} - -bool map_auto(char *name, char *name2, char *val, struct TextMap *map, short *var) -{ - if (strcmp(name, name2) != 0) return false; - int id = map_get_id(map, val); - if (id == -1) - { - //printf("MAP FAIL: %s=%s : %d\n", name, val, id); sleep(1); - return false; - } - *var = id; - //printf("MAP AUTO: %s=%s : %d\n", name, val, id); sleep(1); - return true; -} - -bool cfg_map_auto(char *name, struct TextMap *map, short *var) -{ - return map_auto(name, cfg_name, cfg_val, map, var); -} - -bool cfg_map(char *name, char *val, short *var, short id) -{ - if (strcmp(name, cfg_name) == 0 && strcmpi(val, cfg_val) == 0) - { - *var = id; - return true; - } - return false; -} - -bool cfg_bool(char *name, short *var) -{ - return (cfg_map(name, "0", var, 0) || cfg_map(name, "1", var, 1)); -} - -void cfg_int(char *name, short *var, int count) -{ - char tmp[6]; - short i; - - if (count > 10) //avoid overflow - return; - - for (i = 0; i < count; i++) - { - sprintf(tmp, "%d", i); - cfg_map(name, tmp, var, i); - } -} - - char *cfg_get_title(u8 *id) { if (!id) return NULL; @@ -387,64 +295,6 @@ bool cfg_parsetitlefile(char *fname, void(*set_func)(char*, char*, u8)) return true; } -/* - void cfg_parsearg(int argc, char **argv) - { - int i; - char *eq; - char pathname[200]; - for (i=1; ivideo = opt_v; - } - if (map_auto("language", opt_name, opt_val, map_language, &opt_l)) - { - // valid option, assign - game->language = opt_l; - } - if (strcmp("ocarina", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->ocarina = opt_c; - } - } - if (strcmp("vipatch", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->vipatch = opt_c; - } - } - if (strcmp("ios", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->ios = opt_c; - } - } - if (strcmp("pctrl", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->parentalcontrol = opt_c; - } - } - if (strcmp("errorfix002", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->errorfix002 = opt_c; - } - } - if (strcmp("iosreloadblock", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->iosreloadblock = opt_c; - } - } - if (strcmp("patchcountrystrings", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->patchcountrystrings = opt_c; - } - } - if (strcmp("loadalternatedol", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->loadalternatedol = opt_c; - } - } - if (strcmp("alternatedolstart", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->alternatedolstart = opt_c; - } - } - if (strcmp("alternatedolname", opt_name) == 0) - { - strlcpy(game->alternatedolname, opt_val, sizeof(game->alternatedolname)); - } - if (strcmp("returnTo", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - game->returnTo = opt_c; - } - } - } - // next opt - if (np) - p = np + 1; - else p = NULL; - } -} - -void parental_set(char *name, char *val) -{ - // sample line: - // game:RTNP41 = video:game; language:english; ocarina:0; - // game:RYWP01 = video:patch; language:console; ocarina:1; - //printf("GAME: '%s=%s'\n", name, val); - u8 id[8]; - - if (strncmp(name, "game:", 5) != 0) return; - trimcopy((char*) id, name + 5, sizeof(id)); - - // parse val - // first split options by ; - char opt[200], *p, *np; - p = val; - - while (p) - { - np = strchr(p, ';'); - if (np) - trim_n_copy(opt, p, np - p, sizeof(opt)); - else trimcopy(opt, p, sizeof(opt)); - //printf("GAME(%s) (%s)\n", id, opt); sleep(1); - // parse opt 'language:english' - char opt_name[200], opt_val[200]; - if (trimsplit(opt, opt_name, opt_val, ':', sizeof(opt_name))) - { - //printf("GAME(%s) (%s=%s)\n", id, opt_name, opt_val); sleep(1); - short opt_c; - - if (strcmp("pctrl", opt_name) == 0) - { - if (sscanf(opt_val, "%hd", &opt_c) == 1) - { - cfg_control = realloc(cfg_control, (num_control + 1) * sizeof(struct ID_Control)); - if (!cfg_control) - { - // error - num_control = 0; - return; - } - // add - strcpy(cfg_control[num_control].id, (char*) id); - cfg_control[num_control].block = opt_c; - num_control++; - } - } - - } - // next opt - if (np) - p = np + 1; - else p = NULL; - } -} - void game_set_num(char *name, char *val) { u8 id[8]; @@ -694,13 +363,6 @@ void game_set_num(char *name, char *val) } } -bool cfg_load_games() -{ - char GXGameSettings_cfg[32]; - sprintf(GXGameSettings_cfg, "%s/config/GXGameSettings.cfg", bootDevice); - return cfg_parsefile(GXGameSettings_cfg, &game_set); -} - bool cfg_load_game_num() { char GXGameFavorites_cfg[32]; @@ -708,55 +370,6 @@ bool cfg_load_game_num() return cfg_parsefile(GXGameFavorites_cfg, &game_set_num); } -bool cfg_save_games() -{ - FILE *f; - int i; - char GXGameSettings_cfg[50]; - sprintf(GXGameSettings_cfg, "%s/config", bootDevice); - mkdir(GXGameSettings_cfg, 0777); - - sprintf(GXGameSettings_cfg, "%s/config/GXGameSettings.cfg", bootDevice); - f = fopen(GXGameSettings_cfg, "w"); - if (!f) - { - printf("Error saving %s\n", "GXGameSettings.cfg"); - sleep(1); - return false; - } - fprintf(f, "# USB Loader settings file\n"); - fprintf(f, "# note: this file is automatically generated\n"); - fclose(f); - /* Closing and reopening because of a write issue we are having right now */ - f = fopen(GXGameSettings_cfg, "w"); - fprintf(f, "# USB Loader settings file\n"); - fprintf(f, "# note: this file is automatically generated\n"); - fprintf(f, "# Num Games: %d\n", num_saved_games); - for (i = 0; i < num_saved_games; i++) - { - char *s; - fprintf(f, "game:%s = ", cfg_game[i].id); - s = map_get_name(map_video, cfg_game[i].video); - if (s) fprintf(f, "video:%s; ", s); - s = map_get_name(map_language, cfg_game[i].language); - if (s) fprintf(f, "language:%s; ", s); - fprintf(f, "ocarina:%d; ", cfg_game[i].ocarina); - fprintf(f, "vipatch:%d; ", cfg_game[i].vipatch); - fprintf(f, "ios:%d; ", cfg_game[i].ios); - fprintf(f, "pctrl:%d; ", cfg_game[i].parentalcontrol); - fprintf(f, "errorfix002:%d; ", cfg_game[i].errorfix002); - fprintf(f, "iosreloadblock:%d; ", cfg_game[i].iosreloadblock); - fprintf(f, "patchcountrystrings:%d; ", cfg_game[i].patchcountrystrings); - fprintf(f, "loadalternatedol:%d;", cfg_game[i].loadalternatedol); - fprintf(f, "alternatedolstart:%d;", cfg_game[i].alternatedolstart); - fprintf(f, "alternatedolname:%s;\n", cfg_game[i].alternatedolname); - fprintf(f, "returnTo:%d;\n", cfg_game[i].returnTo); - } - fprintf(f, "# END\n"); - fclose(f); - return true; -} - bool cfg_save_game_num() { FILE *f; @@ -827,19 +440,6 @@ bool CFG_reset_all_playcounters() return true; } -struct Game_CFG* CFG_get_game_opt(const u8 *id) -{ - int i; - for (i = 0; i < num_saved_games; i++) - { - if (memcmp(id, cfg_game[i].id, 6) == 0) - { - return &cfg_game[i]; - } - } - return NULL; -} - struct Game_NUM* CFG_get_game_num(const u8 *id) { int i; @@ -853,14 +453,6 @@ struct Game_NUM* CFG_get_game_num(const u8 *id) return NULL; } -bool CFG_save_game_opt(u8 *id) -{ - struct Game_CFG *game = cfg_get_game(id); - if (!game) return false; - cfg_set_game_opt(game, id); - return cfg_save_games(); -} - bool CFG_save_game_num(u8 *id) { struct Game_NUM *game = cfg_get_game_num(id); @@ -869,21 +461,6 @@ bool CFG_save_game_num(u8 *id) return cfg_save_game_num(); } -bool CFG_forget_game_opt(u8 *id) -{ - struct Game_CFG *game = CFG_get_game_opt(id); - int i; - if (!game) return true; - // move entries down - num_saved_games--; - for (i = game - cfg_game; i < num_saved_games; i++) - { - cfg_game[i] = cfg_game[i + 1]; - } - memset(&cfg_game[num_saved_games], 0, sizeof(struct Game_CFG)); - return cfg_save_games(); -} - bool CFG_forget_game_num(u8 *id) { struct Game_NUM *game = CFG_get_game_num(id); @@ -893,21 +470,14 @@ bool CFG_forget_game_num(u8 *id) num_saved_game_num--; for (i = game - cfg_game_num; i < num_saved_game_num; i++) { - cfg_game[i] = cfg_game[i + 1]; + cfg_game_num[i] = cfg_game_num[i + 1]; } - memset(&cfg_game[num_saved_game_num], 0, sizeof(struct Game_NUM)); + memset(&cfg_game_num[num_saved_game_num], 0, sizeof(struct Game_NUM)); return cfg_save_game_num(); } void CFG_LoadGameNum() { - char pathname[200]; - - snprintf(pathname, sizeof(pathname), "%s/config/GXGameSettings.cfg", bootDevice); - cfg_parsefile(pathname, &parental_set); - - // load per-game settings - cfg_load_games(); cfg_load_game_num(); } diff --git a/source/settings/cfg.h b/source/settings/cfg.h index c79781dd..5d7c44ed 100644 --- a/source/settings/cfg.h +++ b/source/settings/cfg.h @@ -37,29 +37,30 @@ extern "C" extern char bootDevice[10]; - extern u8 ocarinaChoice; - extern u16 playcnt; - extern u8 videoChoice; - extern u8 languageChoice; - extern u8 viChoice; - extern u8 iosChoice; - extern u8 parentalcontrolChoice; - extern u8 fix002; - extern u8 reloadblock; - extern u8 countrystrings; - extern u8 alternatedol; - extern u32 alternatedoloffset; - extern u8 xflip; - extern u8 qboot; - extern u8 sort; - extern u8 fave; - extern u8 wsprompt; - extern u8 keyset; - extern u8 gameDisplay; +// extern u8 ocarinaChoice; +// extern u16 playcnt; +// +// extern u8 videoChoice; +// extern u8 languageChoice; +// extern u8 viChoice; +// extern u8 iosChoice; +// extern u8 parentalcontrolChoice; +// extern u8 fix002; +// extern u8 reloadblock; +// extern u8 countrystrings; +// extern u8 alternatedol; +// extern u32 alternatedoloffset; +// extern u8 xflip; +// extern u8 qboot; +// extern u8 sort; +// extern u8 fave; +// extern u8 wsprompt; +// extern u8 keyset; +// extern u8 gameDisplay; extern u16 playcount; extern u8 favoritevar; extern char alternatedname[40]; - extern u8 returnToLoaderGV; +// extern u8 returnToLoaderGV; enum { @@ -67,23 +68,6 @@ extern "C" // always the last entry }; - struct Game_CFG - { - u8 id[8]; - u8 video; - u8 language; - u8 ocarina; - u8 vipatch; - u8 ios; - u8 parentalcontrol; - u8 errorfix002; - u8 iosreloadblock; - u8 loadalternatedol; - u32 alternatedolstart; - u8 patchcountrystrings; - char alternatedolname[40]; - u8 returnTo; - }; struct Game_NUM { u8 id[8]; @@ -92,12 +76,9 @@ extern "C" }; void CFG_LoadGameNum(); // -1 = non forced mode - struct Game_CFG* CFG_get_game_opt(const u8 *id); struct Game_NUM* CFG_get_game_num(const u8 *id); - bool CFG_save_game_opt(u8 *id); bool CFG_save_game_num(u8 *id); bool CFG_reset_all_playcounters(); - bool CFG_forget_game_opt(u8 *id); bool CFG_forget_game_num(u8 *id); enum diff --git a/source/usbloader/alternatedol.c b/source/usbloader/alternatedol.c index 32bc337c..48a86f67 100644 --- a/source/usbloader/alternatedol.c +++ b/source/usbloader/alternatedol.c @@ -106,7 +106,7 @@ typedef struct _dolheader static dolheader *dolfile; -u32 load_dol_image(void *dolstart, u8 videoSelected, u8 patchcountrystring, u8 vipatch, u8 cheat) +u32 load_dol_image(void *dolstart, u8 videoSelected, u8 patchcountrystring, u8 vipatch, u8 cheat, u8 fix002) { u32 i; @@ -121,7 +121,7 @@ u32 load_dol_image(void *dolstart, u8 videoSelected, u8 patchcountrystring, u8 v ICInvalidateRange((void *) dolfile->text_start[i], dolfile->text_size[i]); memmove((void *) dolfile->text_start[i], dolstart + dolfile->text_pos[i], dolfile->text_size[i]); gamepatches((void *) dolfile->text_start[i], dolfile->text_size[i], videoSelected, patchcountrystring, - vipatch, cheat); + vipatch, cheat, fix002); Remove_001_Protection((void *) dolfile->data_start[i], dolfile->data_size[i]); } @@ -131,7 +131,7 @@ u32 load_dol_image(void *dolstart, u8 videoSelected, u8 patchcountrystring, u8 v memmove((void *) dolfile->data_start[i], dolstart + dolfile->data_pos[i], dolfile->data_size[i]); gamepatches((void *) dolfile->data_start[i], dolfile->data_size[i], videoSelected, patchcountrystring, - vipatch, cheat); + vipatch, cheat, fix002); Remove_001_Protection((void *) dolfile->data_start[i], dolfile->data_size[i]); DCFlushRangeNoSync((void *) dolfile->data_start[i], dolfile->data_size[i]); } @@ -224,7 +224,7 @@ void __dvd_readidcb(s32 result) { dvddone = result; } -u32 Load_Dol_from_disc(u32 doloffset, u8 videoSelected, u8 patchcountrystring, u8 vipatch, u8 cheat) +u32 Load_Dol_from_disc(u32 doloffset, u8 videoSelected, u8 patchcountrystring, u8 vipatch, u8 cheat, u8 fix002) { int ret; void *dol_header; @@ -265,7 +265,7 @@ u32 Load_Dol_from_disc(u32 doloffset, u8 videoSelected, u8 patchcountrystring, u { ret = WDVD_Read(offset, len, (doloffset << 2) + pos); - gamepatches(offset, len, videoSelected, patchcountrystring, vipatch, cheat); + gamepatches(offset, len, videoSelected, patchcountrystring, vipatch, cheat, fix002); Remove_001_Protection(offset, len); diff --git a/source/usbloader/apploader.c b/source/usbloader/apploader.c index c38dcef6..973adfcf 100644 --- a/source/usbloader/apploader.c +++ b/source/usbloader/apploader.c @@ -33,7 +33,7 @@ static u8 *appldr = (u8 *) 0x81200000; /* Variables */ static u32 buffer[0x20] ATTRIBUTE_ALIGN( 32 ); -void gamepatches(u8 * dst, int len, u8 videoSelected, u8 patchcountrystring, u8 vipatch, u8 cheat) +void gamepatches(u8 * dst, int len, u8 videoSelected, u8 patchcountrystring, u8 vipatch, u8 cheat, u8 fix002) { VideoModePatcher(dst, len, videoSelected); @@ -55,7 +55,7 @@ void gamepatches(u8 * dst, int len, u8 videoSelected, u8 patchcountrystring, u8 } s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected, u8 vipatch, u8 patchcountrystring, - u8 error002fix, u8 alternatedol, u32 alternatedoloffset, u32 returnTo) + u8 error002fix, u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002) { app_entry appldr_entry; app_init appldr_init; @@ -111,7 +111,7 @@ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected /* Read data from DVD */ WDVD_Read(dst, len, (u64) (offset << 2)); - gamepatches(dst, len, videoSelected, patchcountrystring, vipatch, cheat); + gamepatches(dst, len, videoSelected, patchcountrystring, vipatch, cheat, fix002); DCFlushRange(dst, len); if ((u32) dst < dolStart) dolStart = (u32) dst; diff --git a/source/usbloader/apploader.h b/source/usbloader/apploader.h index 9a312c1e..4977507a 100644 --- a/source/usbloader/apploader.h +++ b/source/usbloader/apploader.h @@ -11,8 +11,8 @@ extern "C" /* Prototypes */ s32 Apploader_Run(entry_point *entry, char * dolpath, u8 cheat, u8 videoSelected, u8 vipatch, - u8 patchcountrystring, u8 error002fix, u8 alternatedol, u32 alternatedoloffset, u32 returnTo); - void gamepatches(u8 * dst, int len, u8 videoSelected, u8 patchcountrystring, u8 vipatch, u8 cheat); + u8 patchcountrystring, u8 error002fix, u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002); + void gamepatches(u8 * dst, int len, u8 videoSelected, u8 patchcountrystring, u8 vipatch, u8 cheat, u8 fix002); #ifdef __cplusplus } diff --git a/source/usbloader/disc.c b/source/usbloader/disc.c index 8d322c38..dac51c66 100644 --- a/source/usbloader/disc.c +++ b/source/usbloader/disc.c @@ -287,7 +287,7 @@ s32 Disc_IsWii(void) } s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 cheat, u8 vipatch, u8 patchcountrystring, - u8 error002fix, u8 alternatedol, u32 alternatedoloffset, u32 returnTo) + u8 error002fix, u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002) { gprintf("booting partition IOS %u v%u\n", IOS_GetVersion(), IOS_GetRevision()); entry_point p_entry; @@ -312,7 +312,7 @@ s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 cheat, u /* Run apploader */ ret = Apploader_Run(&p_entry, dolpath, cheat, videoselected, vipatch, patchcountrystring, error002fix, - alternatedol, alternatedoloffset, returnTo); + alternatedol, alternatedoloffset, returnTo, fix002); if (ret < 0) return ret; free_wip(); @@ -387,7 +387,7 @@ s32 Disc_BootPartition(u64 offset, char * dolpath, u8 videoselected, u8 cheat, u } s32 Disc_WiiBoot(char * dolpath, u8 videoselected, u8 cheat, u8 vipatch, u8 patchcountrystring, u8 error002fix, - u8 alternatedol, u32 alternatedoloffset, u32 returnTo) + u8 alternatedol, u32 alternatedoloffset, u32 returnTo, u8 fix002) { u64 offset; s32 ret; @@ -398,7 +398,7 @@ s32 Disc_WiiBoot(char * dolpath, u8 videoselected, u8 cheat, u8 vipatch, u8 patc /* Boot partition */ return Disc_BootPartition(offset, dolpath, videoselected, cheat, vipatch, patchcountrystring, error002fix, - alternatedol, alternatedoloffset, returnTo); + alternatedol, alternatedoloffset, returnTo, fix002); } void PatchCountryStrings(void *Address, int Size) diff --git a/source/usbloader/disc.h b/source/usbloader/disc.h index cd75ec65..e2639b1b 100644 --- a/source/usbloader/disc.h +++ b/source/usbloader/disc.h @@ -50,8 +50,8 @@ extern "C" s32 Disc_SetUSB(const u8 *); s32 Disc_ReadHeader(void *); s32 Disc_IsWii(void); - s32 Disc_BootPartition(u64, char *, u8, u8, u8, u8, u8, u8, u32, u32 returnTo); - s32 Disc_WiiBoot(char *, u8, u8, u8, u8, u8, u8, u32, u32 returnTo); + s32 Disc_BootPartition(u64, char *, u8, u8, u8, u8, u8, u8, u32, u32 returnTo, u8 fix002); + s32 Disc_WiiBoot(char *, u8, u8, u8, u8, u8, u8, u32, u32 returnTo, u8 fix002); s32 __Disc_FindPartition(u64 *outbuf); void PatchCountryStrings(void *Address, int Size); s32 __Disc_FindPartition(u64 *outbuf); diff --git a/source/xml/xml.cpp b/source/xml/xml.cpp index 52d016e2..e4f1925b 100644 --- a/source/xml/xml.cpp +++ b/source/xml/xml.cpp @@ -7,6 +7,7 @@ #include #include #include "settings/CSettings.h" +#include "settings/CGameSettings.h" #include "xml/xml.h" extern "C" @@ -189,8 +190,7 @@ bool OpenXMLFile(char *filename) char *GetLangSettingFromGame(char *gameid) { int langcode; - struct Game_CFG *game_cfg = NULL; - game_cfg = CFG_get_game_opt((u8*) gameid); + GameCFG *game_cfg = GameSettings.GetGameCFG((u8*) gameid); if (game_cfg) { langcode = game_cfg->language;