#include "menu.hpp" #include "types.h" #include "loader/wbfs.h" #include "libwbfs/wiidisc.h" #define ARRAY_SIZE(a) (sizeof a / sizeof a[0]) u8 m_configGameMaxPgs = 5; u8 m_configGamePage = 0; static const dir_discHdr *GameHdr; const CMenu::SOption CMenu::_GlobalVideoModes[6] = { { "vidgame", L"Game" }, { "vidsys", L"System" }, { "vidp50", L"PAL 50Hz" }, { "vidp60", L"PAL 60Hz" }, { "vidntsc", L"NTSC" }, { "vidprog", L"Progressive" }, }; const CMenu::SOption CMenu::_VideoModes[7] = { { "viddef", L"Default" }, { "vidgame", L"Game" }, { "vidsys", L"System" }, { "vidp50", L"PAL 50Hz" }, { "vidp60", L"PAL 60Hz" }, { "vidntsc", L"NTSC" }, { "vidprog", L"Progressive" }, }; const CMenu::SOption CMenu::_GlobalDeflickerOptions[6] = { { "df_norm", L"Normal" }, { "df_off", L"Off (Safe)" }, { "df_ext", L"Off (Extended)" }, { "df_low", L"On (Low)" }, { "df_med", L"On (Medium)" }, { "df_high", L"On (High)" }, }; const CMenu::SOption CMenu::_DeflickerOptions[7] = { { "df_def", L"Default" }, { "df_norm", L"Normal" }, { "df_off", L"Off (Safe)" }, { "df_ext", L"Off (Extended)" }, { "df_low", L"On (Low)" }, { "df_med", L"On (Medium)" }, { "df_high", L"On (High)" }, }; const CMenu::SOption CMenu::_languages[11] = { { "lngdef", L"Default" },// next should be console { "lngjap", L"Japanese" }, { "lngeng", L"English" }, { "lngger", L"German" }, { "lngfre", L"French" }, { "lngspa", L"Spanish" }, { "lngita", L"Italian" }, { "lngdut", L"Dutch" }, { "lngsch", L"S. Chinese" }, { "lngtch", L"T. Chinese" }, { "lngkor", L"Korean" } }; const CMenu::SOption CMenu::_ChannelsType[3] = { { "ChanReal", L"Real NAND" }, { "ChanEmu", L"Emu NAND" }, { "ChanBoth", L"Both" }, }; const CMenu::SOption CMenu::_NandEmu[2] = { { "NANDpart", L"Partial" }, { "NANDfull", L"Full" }, }; const CMenu::SOption CMenu::_GlobalSaveEmu[3] = { { "SaveOffG", L"Off" }, { "SavePartG", L"Game save" }, { "SaveFullG", L"Full" }, }; const CMenu::SOption CMenu::_SaveEmu[4] = { { "SaveDef", L"Default" }, { "SaveOff", L"Off" }, { "SavePart", L"Game save" }, { "SaveFull", L"Full" }, }; const CMenu::SOption CMenu::_AspectRatio[3] = { { "aspectDef", L"Default" }, { "aspect43", L"Force 4:3" }, { "aspect169", L"Force 16:9" }, }; const CMenu::SOption CMenu::_WidescreenWiiu[3] = { { "lngsys", L"System" }, { "aspect43", L"Force 4:3" }, { "aspect169", L"Force 16:9" }, }; const CMenu::SOption CMenu::_vidModePatch[4] = { { "vmpnone", L"None" }, { "vmpnormal", L"Normal" }, { "vmpmore", L"More" }, { "vmpall", L"All" } }; const CMenu::SOption CMenu::_hooktype[8] = { { "hook_auto", L"AUTO" }, { "hooktype1", L"VBI" }, { "hooktype2", L"KPAD read" }, { "hooktype3", L"Joypad" }, { "hooktype4", L"GXDraw" }, { "hooktype5", L"GXFlush" }, { "hooktype6", L"OSSleepThread" }, { "hooktype7", L"AXNextFrame" }, }; const CMenu::SOption CMenu::_debugger[3] = { { "disabled", L"Disabled" }, { "dbg_gecko", L"Gecko" }, { "dbgfwrite", L"OSReport" }, }; const CMenu::SOption CMenu::_privateServer[3] = { { "off", L"Off" }, { "ps_nossl", L"No SSL only" }, { "ps_wiimmfi", L"wiimmfi" }, }; template static inline T loopNum(T i, T s) { return (i + s) % s; } wstringEx CMenu::_optBoolToString(int i) { switch (i) { case 0: return _t("off", L"Off"); case 1: return _t("on", L"On"); default: return _t("def", L"Default"); } } void CMenu::_hideConfigGame(bool instant) { m_btnMgr.hide(m_gameSettingsLblTitle, instant); m_btnMgr.hide(m_gameSettingsBtnBack, instant); m_btnMgr.hide(m_gameSettingsLblPage, instant); m_btnMgr.hide(m_gameSettingsBtnPageM, instant); m_btnMgr.hide(m_gameSettingsBtnPageP, instant); for(u8 i = 0; i < ARRAY_SIZE(m_gameSettingsLblUser); ++i) if(m_gameSettingsLblUser[i] != -1) m_btnMgr.hide(m_gameSettingsLblUser[i], instant); _hideConfigButtons(instant); } void CMenu::_showConfigGame() { vector custom_servers = stringToVector(m_cfg.getString("custom_servers", "servers"), '|'); bool b; string adultDomain; if(GameHdr->type == TYPE_PLUGIN) adultDomain = "ADULTONLY_PLUGINS"; else adultDomain = "ADULTONLY"; u8 i; string id; char gameTitle[64]; memset(gameTitle, 0 , 64); if(GameHdr->type == TYPE_HOMEBREW) { wcstombs(gameTitle, GameHdr->title, 63); id = gameTitle; } else if(GameHdr->type == TYPE_PLUGIN) { strncpy(m_plugin.PluginMagicWord, fmt("%08x", GameHdr->settings[0]), 8); // if game has an id from the plugin database we use the new method which uses platform name/id if(strcmp(GameHdr->id, "PLUGIN") != 0 && !m_platform.getString("PLUGINS", m_plugin.PluginMagicWord, "").empty()) id =sfmt("%s/%s", m_platform.getString("PLUGINS", m_plugin.PluginMagicWord).c_str(), GameHdr->id); else // old pre 5.4.4 method which uses plugin magic/title of game { if(strrchr(GameHdr->path, '/') != NULL) wcstombs(gameTitle, GameHdr->title, 63); else memcpy(gameTitle, GameHdr->path, 63);// scummvm id = sfmt("%s/%s", m_plugin.PluginMagicWord, gameTitle); } } else id = GameHdr->id; _setBg(m_gameSettingsBg, m_gameSettingsBg); for(i = 0; i < ARRAY_SIZE(m_gameSettingsLblUser); ++i) if(m_gameSettingsLblUser[i] != -1) m_btnMgr.show(m_gameSettingsLblUser[i]); m_btnMgr.show(m_gameSettingsBtnBack); wstringEx title(_t("cfgg1", L"Settings")); if(!NoGameID(GameHdr->type)) title.append(wfmt(L" [%.6s]", id.c_str())); m_btnMgr.setText(m_gameSettingsLblTitle, title); m_btnMgr.show(m_gameSettingsLblTitle); if(GameHdr->type == TYPE_PLUGIN || GameHdr->type == TYPE_HOMEBREW) { m_configGameMaxPgs = 1; m_btnMgr.setText(m_configLbl1, _t("cfgg58", L"Adult only")); b = m_gcfg1.getBool(adultDomain, id, false); if(!b) m_gcfg1.remove(adultDomain, id); m_btnMgr.setText(m_configBtn1, b ? _t("yes", L"Yes") : _t("no", L"No")); m_btnMgr.show(m_configLbl1); m_btnMgr.show(m_configBtn1); m_btnMgr.setText(m_configLbl2, _t("cfgg62", L"Reload cached cover")); m_btnMgr.setText(m_configBtn2, _t("Yes", L"Yes")); m_btnMgr.show(m_configLbl2); m_btnMgr.show(m_configBtn2); return; } _hideConfigButtons(); m_configGameMaxPgs = IsOnWiiU() ? 6 : 5; m_btnMgr.setText(m_gameSettingsLblPage, wfmt(L"%i / %i", m_configGamePage, m_configGameMaxPgs)); m_btnMgr.show(m_gameSettingsLblPage); m_btnMgr.show(m_gameSettingsBtnPageM); m_btnMgr.show(m_gameSettingsBtnPageP); if(m_configGamePage == 1) { m_btnMgr.setText(m_configLbl1, _t("cfgg58", L"Adult only")); b = m_gcfg1.getBool(adultDomain, id, false); if(!b) m_gcfg1.remove(adultDomain, id); m_btnMgr.setText(m_configBtn1, b ? _t("yes", L"Yes") : _t("no", L"No")); m_btnMgr.setText(m_configLbl2, _t("cfgg10", L"IOS")); i = m_gcfg2.getUInt(id, "ios", 0); if(i && _installed_cios.size() > 0) { CIOSItr itr = _installed_cios.find(i); i = (itr == _installed_cios.end()) ? 0 : itr->first; } else i = 0; if(i > 0) m_btnMgr.setText(m_configLbl2Val, wfmt(L"%i", i)); else m_btnMgr.setText(m_configLbl2Val, L"AUTO"); i = min(m_gcfg2.getUInt(id, "language", 0), ARRAY_SIZE(CMenu::_languages) - 1u); m_btnMgr.setText(m_configLbl3Val, _t(CMenu::_languages[i].id, CMenu::_languages[i].text)); m_btnMgr.setText(m_configLbl3, _t("cfgg3", L"Language")); i = min(m_gcfg2.getUInt(id, "video_mode", 0), ARRAY_SIZE(CMenu::_VideoModes) - 1u); m_btnMgr.setText(m_configLbl4Val, _t(CMenu::_VideoModes[i].id, CMenu::_VideoModes[i].text)); m_btnMgr.setText(m_configLbl4, _t("cfgg2", L"Video mode")); m_btnMgr.show(m_configLbl1); m_btnMgr.show(m_configBtn1); m_btnMgr.show(m_configLbl2); m_btnMgr.show(m_configLbl2Val); m_btnMgr.show(m_configBtn2P); m_btnMgr.show(m_configBtn2M); m_btnMgr.show(m_configLbl3); m_btnMgr.show(m_configLbl3Val); m_btnMgr.show(m_configBtn3P); m_btnMgr.show(m_configBtn3M); m_btnMgr.show(m_configLbl4); m_btnMgr.show(m_configLbl4Val); m_btnMgr.show(m_configBtn4P); m_btnMgr.show(m_configBtn4M); } else if(m_configGamePage == 2) { i = min(m_gcfg2.getUInt(id, "debugger", 0), ARRAY_SIZE(CMenu::_debugger) - 1u); m_btnMgr.setText(m_configLbl1Val, _t(CMenu::_debugger[i].id, CMenu::_debugger[i].text)); m_btnMgr.setText(m_configLbl1, _t("cfgg22", L"Debugger")); i = min(m_gcfg2.getUInt(id, "hooktype", 0), ARRAY_SIZE(CMenu::_hooktype) - 1u); m_btnMgr.setText(m_configLbl2Val, _t(CMenu::_hooktype[i].id, CMenu::_hooktype[i].text)); m_btnMgr.setText(m_configLbl2, _t("cfgg18", L"Hook Type")); m_btnMgr.setText(m_configLbl3, _t("cfgg5", L"Ocarina")); m_btnMgr.setText(m_configBtn3, _optBoolToString(m_gcfg2.getOptBool(id, "cheat", 0))); m_btnMgr.setText(m_configLbl4, _t("cfgg15", L"Cheat Codes")); m_btnMgr.setText(m_configBtn4, _t("cfgg16", L"Select")); m_btnMgr.show(m_configLbl1); m_btnMgr.show(m_configLbl1Val); m_btnMgr.show(m_configBtn1P); m_btnMgr.show(m_configBtn1M); m_btnMgr.show(m_configLbl2); m_btnMgr.show(m_configLbl2Val); m_btnMgr.show(m_configBtn2M); m_btnMgr.show(m_configBtn2P); m_btnMgr.show(m_configLbl3); m_btnMgr.show(m_configBtn3); m_btnMgr.show(m_configLbl4); m_btnMgr.show(m_configBtn4); } else if(m_configGamePage == 3) { m_btnMgr.setText(m_configLbl1, _t("cfgg14", L"Patch video modes")); i = min(m_gcfg2.getUInt(id, "patch_video_modes", 0), ARRAY_SIZE(CMenu::_vidModePatch) - 1u); m_btnMgr.setText(m_configLbl1Val, _t(CMenu::_vidModePatch[i].id, CMenu::_vidModePatch[i].text)); m_btnMgr.setText(m_configLbl2, _t("cfgg7", L"Vipatch")); m_btnMgr.setText(m_configBtn2, _optBoolToString(m_gcfg2.getOptBool(id, "vipatch", 0))); m_btnMgr.setText(m_configLbl3, _t("cfgg4", L"Patch country strings")); m_btnMgr.setText(m_configBtn3, _optBoolToString(m_gcfg2.getOptBool(id, "country_patch", 0))); m_btnMgr.setText(m_configLbl4, _t("cfgg27", L"Aspect Ratio")); i = min(m_gcfg2.getUInt(id, "aspect_ratio", 0), ARRAY_SIZE(CMenu::_AspectRatio) - 1u); m_btnMgr.setText(m_configLbl4Val, _t(CMenu::_AspectRatio[i].id, CMenu::_AspectRatio[i].text)); m_btnMgr.show(m_configLbl1); m_btnMgr.show(m_configLbl1Val); m_btnMgr.show(m_configBtn1M); m_btnMgr.show(m_configBtn1P); m_btnMgr.show(m_configLbl2); m_btnMgr.show(m_configBtn2); m_btnMgr.show(m_configLbl3); m_btnMgr.show(m_configBtn3); m_btnMgr.show(m_configLbl4); m_btnMgr.show(m_configLbl4Val); m_btnMgr.show(m_configBtn4M); m_btnMgr.show(m_configBtn4P); } else if(m_configGamePage == 4) { m_btnMgr.setText(m_configLbl1, _t("cfgg40", L"Manage Cover and Banner")); m_btnMgr.setText(m_configBtn1, _t("cfgg41", L"Manage")); m_btnMgr.show(m_configLbl1); m_btnMgr.show(m_configBtn1); if(GameHdr->type == TYPE_CHANNEL || GameHdr->type == TYPE_EMUCHANNEL) { m_btnMgr.setText(m_configLbl2, _t("custom", L"Custom")); m_btnMgr.setText(m_configBtn2, _optBoolToString(m_gcfg2.getOptBool(id, "custom", 0))); m_btnMgr.show(m_configLbl2); m_btnMgr.show(m_configBtn2); m_btnMgr.setText(m_configLbl3, _t("cfgg37", L"Boot Apploader")); m_btnMgr.setText(m_configBtn3, _optBoolToString(m_gcfg2.getOptBool(id, "apploader", 0))); m_btnMgr.show(m_configLbl3); m_btnMgr.show(m_configBtn3); m_btnMgr.setText(m_configLbl4, _t("neek1", L"Launch Title with neek2o")); m_btnMgr.setText(m_configBtn4, _optBoolToString(m_gcfg2.getOptBool(id, "useneek", 0))); m_btnMgr.show(m_configLbl4); m_btnMgr.show(m_configBtn4); } else if(GameHdr->type == TYPE_WII_GAME) { m_btnMgr.setText(m_configLbl2, _t("cfgg24", L"NAND Emulation")); i = min(m_gcfg2.getUInt(id, "emulate_save", 0), ARRAY_SIZE(CMenu::_SaveEmu) - 1u); m_btnMgr.setText(m_configLbl2Val, _t(CMenu::_SaveEmu[i].id, CMenu::_SaveEmu[i].text)); m_btnMgr.show(m_configLbl2); m_btnMgr.show(m_configLbl2Val); m_btnMgr.show(m_configBtn2M); m_btnMgr.show(m_configBtn2P); m_btnMgr.setText(m_configLbl3, _t("cfgg30", L"Extract Save from NAND")); m_btnMgr.setText(m_configBtn3, _t("cfgg31", L"Extract")); m_btnMgr.show(m_configLbl3); m_btnMgr.show(m_configBtn3); m_btnMgr.setText(m_configLbl4, _t("cfgg32", L"Flash Save to NAND")); m_btnMgr.setText(m_configBtn4, _t("cfgg33", L"Flash")); m_btnMgr.show(m_configLbl4); m_btnMgr.show(m_configBtn4); } } else if(m_configGamePage == 5) { m_btnMgr.setText(m_configLbl1, _t("cfgg38", L"Activity LED")); m_btnMgr.setText(m_configBtn1, _optBoolToString(m_gcfg2.getOptBool(id, "led", 0))); m_btnMgr.show(m_configLbl1); m_btnMgr.show(m_configBtn1); m_btnMgr.setText(m_configLbl2, _t("cfgg45", L"Private Server")); i = min(m_gcfg2.getUInt(id, "private_server", 0), ARRAY_SIZE(CMenu::_privateServer) - 1u); if(i < 3) m_btnMgr.setText(m_configLbl2Val, _t(CMenu::_privateServer[i].id, CMenu::_privateServer[i].text)); else m_btnMgr.setText(m_configLbl2Val, custom_servers[i - 3]);//wstringEx() m_btnMgr.show(m_configLbl2); m_btnMgr.show(m_configLbl2Val); m_btnMgr.show(m_configBtn2P); m_btnMgr.show(m_configBtn2M); m_btnMgr.setText(m_configLbl3, _t("cfgg49", L"480p Pixel Patch")); m_btnMgr.setText(m_configLbl3Val, _optBoolToString(m_gcfg2.getOptBool(id, "fix480p", 2))); m_btnMgr.show(m_configLbl3); m_btnMgr.show(m_configLbl3Val); m_btnMgr.show(m_configBtn3P); m_btnMgr.show(m_configBtn3M); m_btnMgr.setText(m_configLbl4, _t("cfgg61", L"Deflicker Filter")); i = min(m_gcfg2.getUInt(id, "deflicker_wii", 0), ARRAY_SIZE(CMenu::_DeflickerOptions) - 1u); m_btnMgr.setText(m_configLbl4Val, _t(CMenu::_DeflickerOptions[i].id, CMenu::_DeflickerOptions[i].text)); m_btnMgr.show(m_configLbl4); m_btnMgr.show(m_configLbl4Val); m_btnMgr.show(m_configBtn4P); m_btnMgr.show(m_configBtn4M); } else if(m_configGamePage == 6) { m_btnMgr.setText(m_configLbl1, _t("cfgg46", L"WiiU Widescreen")); i = min(m_gcfg2.getUInt(id, "widescreen_wiiu", 0), ARRAY_SIZE(CMenu::_WidescreenWiiu) - 1u); m_btnMgr.setText(m_configLbl1Val, _t(CMenu::_WidescreenWiiu[i].id, CMenu::_WidescreenWiiu[i].text)); m_btnMgr.show(m_configLbl1); m_btnMgr.show(m_configLbl1Val); m_btnMgr.show(m_configBtn1P); m_btnMgr.show(m_configBtn1M); } } void CMenu::_configGame(const dir_discHdr *hdr, bool disc) { vector custom_servers = stringToVector(m_cfg.getString("custom_servers", "servers"), '|'); m_gcfg2.load(fmt("%s/" GAME_SETTINGS2_FILENAME, m_settingsDir.c_str())); GameHdr = hdr;// set for global use in other fuctions string adultDomain; if(hdr->type == TYPE_PLUGIN) adultDomain = "ADULTONLY_PLUGINS"; else adultDomain = "ADULTONLY"; u8 i; string id; //s8 direction; char gameTitle[64]; memset(gameTitle, 0 , 64); if(GameHdr->type == TYPE_HOMEBREW) { wcstombs(gameTitle, GameHdr->title, 63); id = gameTitle; } else if(GameHdr->type == TYPE_PLUGIN) { strncpy(m_plugin.PluginMagicWord, fmt("%08x", GameHdr->settings[0]), 8); // if game has an id from the plugin database we use the new method which uses platform name/id if(strcmp(GameHdr->id, "PLUGIN") != 0 && !m_platform.getString("PLUGINS", m_plugin.PluginMagicWord, "").empty()) id = sfmt("%s/%s", m_platform.getString("PLUGINS", m_plugin.PluginMagicWord).c_str(), GameHdr->id); else // old pre 5.4.4 method which uses plugin magic/title of game { if(strrchr(GameHdr->path, '/') != NULL) wcstombs(gameTitle, GameHdr->title, 63); else memcpy(gameTitle, GameHdr->path, 63);// scummvm id = sfmt("%s/%s", m_plugin.PluginMagicWord, gameTitle); } } else id = GameHdr->id; m_configGamePage = 1; _showConfigGame(); while(!m_exit) { _mainLoopCommon(); if(BTN_HOME_PRESSED || BTN_B_PRESSED) break; else if(BTN_UP_PRESSED) m_btnMgr.up(); else if(BTN_DOWN_PRESSED) m_btnMgr.down(); if(m_configGameMaxPgs > 1 && (BTN_MINUS_PRESSED || BTN_LEFT_PRESSED || (BTN_A_PRESSED && m_btnMgr.selected(m_gameSettingsBtnPageM)))) { if(m_configGamePage == 1) m_configGamePage = m_configGameMaxPgs; else --m_configGamePage; if(BTN_LEFT_PRESSED || BTN_MINUS_PRESSED) m_btnMgr.click(m_gameSettingsBtnPageM); _showConfigGame(); } else if(m_configGameMaxPgs > 1 && (BTN_PLUS_PRESSED || BTN_RIGHT_PRESSED || (BTN_A_PRESSED && m_btnMgr.selected(m_gameSettingsBtnPageP)))) { if(m_configGamePage == m_configGameMaxPgs) m_configGamePage = 1; else ++m_configGamePage; if(BTN_RIGHT_PRESSED || BTN_PLUS_PRESSED) m_btnMgr.click(m_gameSettingsBtnPageP); _showConfigGame(); } else if(BTN_A_PRESSED) { if(m_btnMgr.selected(m_gameSettingsBtnBack)) break; if(m_configGamePage == 1) { if(m_btnMgr.selected(m_configBtn1)) { if(disc) { _error(_t("cfgg57", L"Not allowed for disc!")); _showConfigGame(); } else { m_gcfg1.setBool(adultDomain, id, !m_gcfg1.getBool(adultDomain, id, false)); bool b = m_gcfg1.getBool(adultDomain, id); if(!b) m_gcfg1.remove(adultDomain, id); m_btnMgr.setText(m_configBtn1, b ? _t("yes", L"Yes") : _t("no", L"No")); } } else if(m_btnMgr.selected(m_configBtn2)) { _hideConfigGame(true); m_btnMgr.setText(m_downloadLblDialog, L""); m_btnMgr.show(m_downloadLblDialog); _start_pThread(); CoverFlow.stopCoverLoader(true); bool smallBox = false; if(m_current_view == COVERFLOW_HOMEBREW && !m_sourceflow) smallBox = m_cfg.getBool(HOMEBREW_DOMAIN, "smallbox", false); //else if(m_sourceflow) // smallBox = m_cfg.getBool(SOURCEFLOW_DOMAIN, "smallbox", false); else if(m_current_view == COVERFLOW_PLUGIN && !m_sourceflow) { if(enabledPluginsCount == 1 && m_plugin.GetEnabledStatus(HB_PMAGIC)) smallBox = m_cfg.getBool(HOMEBREW_DOMAIN, "smallbox", false); } //delete cached wfc const char *gameNameOrID = CoverFlow.getFilenameId(GameHdr); if(GameHdr->type == TYPE_PLUGIN) fsop_deleteFile(fmt("%s/%s/%s.wfc", m_cacheDir.c_str(), m_plugin.GetCoverFolderName(GameHdr->settings[0]), gameNameOrID)); else fsop_deleteFile(fmt("%s/homebrew/%s.wfc", m_cacheDir.c_str(), gameNameOrID)); //cache new cover m_thrdMessage = wfmt(_t("cfgg63", L"Converting cover please wait...")); m_thrdMessageAdded = true; _cacheCover(GameHdr, smallBox); _stop_pThread(); m_btnMgr.setText(m_downloadLblDialog, _t("dlmsg14", L"Done.")); u8 pause = 150; do { _mainLoopCommon(); pause--; if(pause == 0) m_btnMgr.hide(m_downloadLblDialog); }while(!m_exit && pause > 0); CoverFlow.startCoverLoader(); _showConfigGame(); } else if(m_btnMgr.selected(m_configBtn2M) || m_btnMgr.selected(m_configBtn2P)) { if(_installed_cios.size() > 0) { bool direction = m_btnMgr.selected(m_configBtn2P); CIOSItr itr = _installed_cios.find((u32)m_gcfg2.getInt(id, "ios", 0)); if(direction && itr == _installed_cios.end()) itr = _installed_cios.begin(); else if(!direction && itr == _installed_cios.begin()) itr = _installed_cios.end(); else if(direction) itr++; if(!direction) itr--; i = itr->first; m_gcfg2.setInt(id, "ios", i); if(i > 0) m_btnMgr.setText(m_configLbl2Val, wfmt(L"%i", i)); else m_btnMgr.setText(m_configLbl2Val, L"AUTO"); } } else if(m_btnMgr.selected(m_configBtn3P) || m_btnMgr.selected(m_configBtn3M)) { s8 direction = m_btnMgr.selected(m_configBtn3P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "language", 0) + direction, ARRAY_SIZE(CMenu::_languages)); m_gcfg2.setInt(id, "language", i); m_btnMgr.setText(m_configLbl3Val, _t(CMenu::_languages[i].id, CMenu::_languages[i].text)); } else if(m_btnMgr.selected(m_configBtn4P) || m_btnMgr.selected(m_configBtn4M)) { s8 direction = m_btnMgr.selected(m_configBtn4P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "video_mode", 0) + direction, ARRAY_SIZE(CMenu::_VideoModes)); m_gcfg2.setInt(id, "video_mode", i); m_btnMgr.setText(m_configLbl4Val, _t(CMenu::_VideoModes[i].id, CMenu::_VideoModes[i].text)); } } else if(m_configGamePage == 2) { if(m_btnMgr.selected(m_configBtn1P) || m_btnMgr.selected(m_configBtn1M)) { s8 direction = m_btnMgr.selected(m_configBtn1P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "debugger", 0) + direction, ARRAY_SIZE(CMenu::_debugger)); m_gcfg2.setInt(id, "debugger", i); m_btnMgr.setText(m_configLbl1Val, _t(CMenu::_debugger[i].id, CMenu::_debugger[i].text)); } else if(m_btnMgr.selected(m_configBtn2P) || m_btnMgr.selected(m_configBtn2M)) { s8 direction = m_btnMgr.selected(m_configBtn2P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "hooktype", 1) + direction, ARRAY_SIZE(CMenu::_hooktype)); m_gcfg2.setInt(id, "hooktype", i); m_btnMgr.setText(m_configLbl2Val, _t(CMenu::_hooktype[i].id, CMenu::_hooktype[i].text)); } else if(m_btnMgr.selected(m_configBtn3)) { m_gcfg2.setBool(id, "cheat", !m_gcfg2.getBool(id, "cheat", 0)); m_btnMgr.setText(m_configBtn3, _optBoolToString(m_gcfg2.getOptBool(id, "cheat", 0))); } else if(m_btnMgr.selected(m_configBtn4)) { _hideConfigGame(); _CheatSettings(); _showConfigGame(); } } else if(m_configGamePage == 3) { if(m_btnMgr.selected(m_configBtn1P) || m_btnMgr.selected(m_configBtn1M)) { s8 direction = m_btnMgr.selected(m_configBtn1P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "patch_video_modes", 0) + direction, ARRAY_SIZE(CMenu::_vidModePatch)); m_gcfg2.setInt(id, "patch_video_modes", i); m_btnMgr.setText(m_configLbl1Val, _t(CMenu::_vidModePatch[i].id, CMenu::_vidModePatch[i].text)); } else if(m_btnMgr.selected(m_configBtn2)) { m_gcfg2.setBool(id, "vipatch", !m_gcfg2.getBool(id, "vipatch", 0)); m_btnMgr.setText(m_configBtn2, _optBoolToString(m_gcfg2.getOptBool(id, "vipatch", 0))); } else if(m_btnMgr.selected(m_configBtn3)) { m_gcfg2.setBool(id, "country_patch", !m_gcfg2.getBool(id, "country_patch", 0)); m_btnMgr.setText(m_configBtn3, _optBoolToString(m_gcfg2.getOptBool(id, "country_patch", 0))); } else if(m_btnMgr.selected(m_configBtn4P) || m_btnMgr.selected(m_configBtn4M)) { s8 direction = m_btnMgr.selected(m_configBtn4P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "aspect_ratio", 0) + direction, ARRAY_SIZE(CMenu::_AspectRatio)); m_gcfg2.setInt(id, "aspect_ratio", i); m_btnMgr.setText(m_configLbl4Val, _t(CMenu::_AspectRatio[i].id, CMenu::_AspectRatio[i].text)); } } else if(m_configGamePage == 4) { if(m_btnMgr.selected(m_configBtn1)) { if(disc) _error(_t("cfgg57", L"Not allowed for disc!")); else { CoverFlow.stopCoverLoader(true); _hideConfigGame(); _CoverBanner(); CoverFlow.startCoverLoader(); } _showConfigGame(); } if(GameHdr->type == TYPE_CHANNEL || GameHdr->type == TYPE_EMUCHANNEL) { if(m_btnMgr.selected(m_configBtn2)) { m_gcfg2.setBool(id, "custom", !m_gcfg2.getBool(id, "custom", 0)); m_btnMgr.setText(m_configBtn2, _optBoolToString(m_gcfg2.getOptBool(id, "custom", 0))); } else if(m_btnMgr.selected(m_configBtn3)) { m_gcfg2.setBool(id, "apploader", !m_gcfg2.getBool(id, "apploader", 0)); m_btnMgr.setText(m_configBtn3, _optBoolToString(m_gcfg2.getOptBool(id, "apploader", 0))); } else if(m_btnMgr.selected(m_configBtn4)) { m_gcfg2.setBool(id, "useneek", !m_gcfg2.getBool(id, "useneek", 0)); m_btnMgr.setText(m_configBtn4, _optBoolToString(m_gcfg2.getOptBool(id, "useneek", 0))); } } else if(GameHdr->type == TYPE_WII_GAME) { if(m_btnMgr.selected(m_configBtn2P) || m_btnMgr.selected(m_configBtn2M)) { s8 direction = m_btnMgr.selected(m_configBtn2P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "emulate_save", 0) + direction, ARRAY_SIZE(CMenu::_SaveEmu)); m_gcfg2.setInt(id, "emulate_save", i); m_btnMgr.setText(m_configLbl2Val, _t(CMenu::_SaveEmu[i].id, CMenu::_SaveEmu[i].text)); } else if(m_btnMgr.selected(m_configBtn3)) { _hideConfigGame(); m_forceext = true; if(!_ExtractGameSave(id)) _error(_t("cfgg50", L"No save to extract!")); _showConfigGame(); } else if(m_btnMgr.selected(m_configBtn4)) { _hideConfigGame(); m_forceext = true; if(!_FlashGameSave(id)) _error(_t("cfgg51", L"No save to flash to real NAND!")); _showConfigGame(); } } } else if(m_configGamePage == 5) { if(m_btnMgr.selected(m_configBtn1)) { m_gcfg2.setBool(id, "led", !m_gcfg2.getBool(id, "led", 0)); m_btnMgr.setText(m_configBtn1, _optBoolToString(m_gcfg2.getOptBool(id, "led", 0))); } else if(m_btnMgr.selected(m_configBtn2P) || m_btnMgr.selected(m_configBtn2M)) { s8 direction = m_btnMgr.selected(m_configBtn2P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "private_server") + direction, ARRAY_SIZE(CMenu::_privateServer) + custom_servers.size()); m_gcfg2.setUInt(id, "private_server", i); if(i < 3) m_btnMgr.setText(m_configLbl2Val, _t(CMenu::_privateServer[i].id, CMenu::_privateServer[i].text)); else m_btnMgr.setText(m_configLbl2Val, custom_servers[i - 3]);//wstringEx() } else if(m_btnMgr.selected(m_configBtn3P) || m_btnMgr.selected(m_configBtn3M)) { s8 direction = m_btnMgr.selected(m_configBtn3P) ? 1 : -1; i = loopNum(m_gcfg2.getOptBool(id, "fix480p") + direction, 3); m_gcfg2.setOptBool(id, "fix480p", i); m_btnMgr.setText(m_configLbl3Val, _optBoolToString(m_gcfg2.getOptBool(id, "fix480p", 2))); } else if(m_btnMgr.selected(m_configBtn4P) || m_btnMgr.selected(m_configBtn4M)) { s8 direction = m_btnMgr.selected(m_configBtn4P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "deflicker_wii") + direction, ARRAY_SIZE(CMenu::_DeflickerOptions)); m_gcfg2.setInt(id, "deflicker_wii", i); m_btnMgr.setText(m_configLbl4Val, _t(CMenu::_DeflickerOptions[i].id, CMenu::_DeflickerOptions[i].text)); } } else if(m_configGamePage == 6) { if(m_btnMgr.selected(m_configBtn1P) || m_btnMgr.selected(m_configBtn1M)) { s8 direction = m_btnMgr.selected(m_configBtn1P) ? 1 : -1; i = loopNum(m_gcfg2.getUInt(id, "widescreen_wiiu", 0) + direction, ARRAY_SIZE(CMenu::_WidescreenWiiu)); m_gcfg2.setInt(id, "widescreen_wiiu", i); m_btnMgr.setText(m_configLbl1Val, _t(CMenu::_WidescreenWiiu[i].id, CMenu::_WidescreenWiiu[i].text)); } } } } if(!disc) m_gcfg2.save(true);// do not save changes for disc games _hideConfigGame(); } void CMenu::_initConfigGameMenu() { _addUserLabels(m_gameSettingsLblUser, ARRAY_SIZE(m_gameSettingsLblUser), "GAME_SETTINGS"); m_gameSettingsBg = _texture("GAME_SETTINGS/BG", "texture", theme.bg, false); m_gameSettingsLblTitle = _addLabel("GAME_SETTINGS/TITLE", theme.titleFont, L"", 0, 10, 640, 60, theme.titleFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE); m_gameSettingsLblPage = _addLabel("GAME_SETTINGS/PAGE_BTN", theme.btnFont, L"", 68, 400, 104, 48, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); m_gameSettingsBtnPageM = _addPicButton("GAME_SETTINGS/PAGE_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 20, 400, 48, 48); m_gameSettingsBtnPageP = _addPicButton("GAME_SETTINGS/PAGE_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 172, 400, 48, 48); m_gameSettingsBtnBack = _addButton("GAME_SETTINGS/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 48, theme.btnFontColor); _setHideAnim(m_gameSettingsLblTitle, "GAME_SETTINGS/TITLE", 0, 0, -2.f, 0.f); _setHideAnim(m_gameSettingsLblPage, "GAME_SETTINGS/PAGE_BTN", 0, 0, 1.f, -1.f); _setHideAnim(m_gameSettingsBtnPageM, "GAME_SETTINGS/PAGE_MINUS", 0, 0, 1.f, -1.f); _setHideAnim(m_gameSettingsBtnPageP, "GAME_SETTINGS/PAGE_PLUS", 0, 0, 1.f, -1.f); _setHideAnim(m_gameSettingsBtnBack, "GAME_SETTINGS/BACK_BTN", 0, 0, 1.f, -1.f); _hideConfigGame(true); _textConfigGame(); } void CMenu::_textConfigGame(void) { m_btnMgr.setText(m_gameSettingsLblTitle, _t("cfgg1", L"Settings")); m_btnMgr.setText(m_gameSettingsBtnBack, _t("cfgg8", L"Back")); }