diff --git a/out/boot.dol b/out/boot.dol index 09819208..8b1a5587 100644 Binary files a/out/boot.dol and b/out/boot.dol differ diff --git a/source/gc/gc.cpp b/source/gc/gc.cpp index 007dca4e..d4e84ec2 100644 --- a/source/gc/gc.cpp +++ b/source/gc/gc.cpp @@ -79,7 +79,7 @@ since wiiflow lite doesn't support versions less than v3.358 we will use argsboot and version detection every time. */ void Nintendont_SetOptions(const char *gamePath, const char *gameID, const char *CheatPath, u8 lang, - u32 n_cfg, u32 n_vm, s8 vidscale, s8 vidoffset) + u32 n_cfg, u32 n_vm, s8 vidscale, s8 vidoffset, u8 netprofile) { memset(&NinCfg, 0, sizeof(NIN_CFG)); NinCfg.Magicbytes = 0x01070CF6; @@ -123,6 +123,8 @@ void Nintendont_SetOptions(const char *gamePath, const char *gameID, const char NIN_cfg_version = 6; else if(NINRev >= 424 && NINRev < 431) NIN_cfg_version = 7; + else if(NINRev >= 431 && NINRev < 487) + NIN_cfg_version = 8; NinCfg.Version = NIN_cfg_version; @@ -134,6 +136,9 @@ void Nintendont_SetOptions(const char *gamePath, const char *gameID, const char NinCfg.VideoScale = vidscale; NinCfg.VideoOffset = vidoffset; + + /* bba network profile */ + NinCfg.NetworkProfile = netprofile; /* language setup */ if(lang == 0) diff --git a/source/gc/gc.hpp b/source/gc/gc.hpp index 90f58cbc..009ea869 100644 --- a/source/gc/gc.hpp +++ b/source/gc/gc.hpp @@ -26,7 +26,7 @@ bool Nintendont_Installed(); bool Nintendont_GetLoader(); void Nintendont_SetOptions(const char *gamePath, const char *gameID, const char *CheatPath, u8 lang, u32 n_cfg, - u32 n_vm, s8 vidscale, s8 vidoffset); + u32 n_vm, s8 vidscale, s8 vidoffset, u8 netprofile); // Devolution #define DEVO_LOADER_PATH "%s/loader.bin" diff --git a/source/gc/nin_cfg.h b/source/gc/nin_cfg.h index c8722390..366402ca 100644 --- a/source/gc/nin_cfg.h +++ b/source/gc/nin_cfg.h @@ -2,7 +2,7 @@ #ifndef __COMMON_CONFIG_H__ #define __COMMON_CONFIG_H__ -#define NIN_CFG_VERSION 0x00000008 +#define NIN_CFG_VERSION 0x00000009 #define NIN_CFG_MAXPAD 4 #define MEM_CARD_MAX (5) #define MEM_CARD_CODE(x) (1<<(x+2)) @@ -13,7 +13,7 @@ typedef struct NIN_CFG { unsigned int Magicbytes; // 0x01070CF6 - unsigned int Version; // v3 since rev135, v4 since v3.354, v5 since v3.358, v6 since v3.368, v7 since v4.424, v8 since v4.431 + unsigned int Version; // v3 since rev135, v4 since v3.354, v5 since v3.358, v6 since v3.368, v7 since v4.424, v8 since v4.431, v9 since v6.487 unsigned int Config; unsigned int VideoMode; unsigned int Language; @@ -24,7 +24,7 @@ typedef struct NIN_CFG unsigned char MemCardBlocks; signed char VideoScale; // 40 to 120 or 0 for auto, is added to 600 for 640 to 720 signed char VideoOffset;// -20 to 20 or 0 for center - unsigned char Unused; + unsigned char NetworkProfile; } NIN_CFG; // NIN_CFG_REMLIMIT is disc read speed limt enabled by default. It keeps loading speed at GC speed. @@ -51,6 +51,7 @@ enum ninconfig NIN_CFG_ARCADE_MODE = (1<<16), // v4.424 cfg version 7 NIN_CFG_BIT_CC_RUMBLE = (1<<17), // v4.431 cfg version 8 NIN_CFG_SKIP_IPL = (1<<18), // v4.435 cfg version 8 + NIN_CFG_BBA_EMU = (1<<19), // v6.487 cfg version 9 }; enum ninvideomode diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index edff0230..082b5aa6 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -531,6 +531,14 @@ private: s16 m_gameSettingsLblPosVal; s16 m_gameSettingsBtnPosP; s16 m_gameSettingsBtnPosM; + + s16 m_gameSettingsLblBBA; + s16 m_gameSettingsBtnBBA; + + s16 m_gameSettingsLblNetProf; + s16 m_gameSettingsLblNetProfVal; + s16 m_gameSettingsBtnNetProfP; + s16 m_gameSettingsBtnNetProfM; s16 m_gameSettingsLblGCLoader; s16 m_gameSettingsLblGCLoader_Val; diff --git a/source/menu/menu_config_game.cpp b/source/menu/menu_config_game.cpp index 2ff988d8..1043e8cb 100644 --- a/source/menu/menu_config_game.cpp +++ b/source/menu/menu_config_game.cpp @@ -138,6 +138,12 @@ void CMenu::_hideGameSettingsPg(bool instant) m_btnMgr.hide(m_gameSettingsLblPos, instant); m_btnMgr.hide(m_gameSettingsBtnPosP, instant); m_btnMgr.hide(m_gameSettingsBtnPosM, instant); + m_btnMgr.hide(m_gameSettingsLblBBA, instant); + m_btnMgr.hide(m_gameSettingsBtnBBA, instant); + m_btnMgr.hide(m_gameSettingsLblNetProfVal, instant); + m_btnMgr.hide(m_gameSettingsLblNetProf, instant); + m_btnMgr.hide(m_gameSettingsBtnNetProfP, instant); + m_btnMgr.hide(m_gameSettingsBtnNetProfM, instant); // Channels only m_btnMgr.hide(m_gameSettingsLblApploader, instant); m_btnMgr.hide(m_gameSettingsBtnApploader, instant); @@ -206,8 +212,13 @@ void CMenu::_showGameSettings() } m_gameSettingsMaxPgs = 5; - if(GameHdr->type == TYPE_GC_GAME && GCLoader == DEVOLUTION) - m_gameSettingsMaxPgs = 2; + if(GameHdr->type == TYPE_GC_GAME) + { + if(GCLoader == DEVOLUTION) + m_gameSettingsMaxPgs = 2; + else + m_gameSettingsMaxPgs = 6; + } m_btnMgr.setText(m_gameSettingsLblPage, wfmt(L"%i / %i", m_gameSettingsPage, m_gameSettingsMaxPgs)); m_btnMgr.show(m_gameSettingsLblPage); @@ -401,11 +412,22 @@ void CMenu::_showGameSettings() { m_btnMgr.show(m_gameSettingsLblPrivateServer); m_btnMgr.show(m_gameSettingsBtnPrivateServer); + m_btnMgr.show(m_gameSettingsLblFix480p); m_btnMgr.show(m_gameSettingsBtnFix480p); } } } + if(m_gameSettingsPage == 6) + { + m_btnMgr.show(m_gameSettingsLblBBA); + m_btnMgr.show(m_gameSettingsBtnBBA); + + m_btnMgr.show(m_gameSettingsLblNetProfVal); + m_btnMgr.show(m_gameSettingsLblNetProf); + m_btnMgr.show(m_gameSettingsBtnNetProfP); + m_btnMgr.show(m_gameSettingsBtnNetProfM); + } m_btnMgr.setText(m_gameSettingsBtnAdultOnly, m_gcfg1.getBool("ADULTONLY", id, false) ? _t("yes", L"Yes") : _t("no", L"No")); m_btnMgr.setText(m_gameSettingsBtnOcarina, _optBoolToString(m_gcfg2.getOptBool(id, "cheat", 0))); @@ -426,6 +448,13 @@ void CMenu::_showGameSettings() m_btnMgr.setText(m_gameSettingsBtnArcade, _optBoolToString(m_gcfg2.getOptBool(id, "triforce_arcade", 0))); m_btnMgr.setText(m_gameSettingsBtnSkip_IPL, _optBoolToString(m_gcfg2.getOptBool(id, "skip_ipl", 0))); m_btnMgr.setText(m_gameSettingsBtnPatch50, _optBoolToString(m_gcfg2.getOptBool(id, "patch_pal50", 0))); + m_btnMgr.setText(m_gameSettingsBtnBBA, _optBoolToString(m_gcfg2.getOptBool(id, "bba_emu", 0))); + + u8 netprofile = m_gcfg2.getUInt(id, "net_profile", 0); + if(netprofile == 0) + m_btnMgr.setText(m_gameSettingsLblNetProfVal, _t("GC_Auto", L"Auto")); + else + m_btnMgr.setText(m_gameSettingsLblNetProfVal, wfmt(L"%i", netprofile)); if(videoScale == 0) m_btnMgr.setText(m_gameSettingsLblWidthVal, _t("GC_Auto", L"Auto")); @@ -788,6 +817,17 @@ void CMenu::_gameSettings(const dir_discHdr *hdr, bool disc) m_gcfg2.setBool(id, "patch_pal50", !m_gcfg2.getBool(id, "patch_pal50", 0)); _showGameSettings(); } + else if(m_btnMgr.selected(m_gameSettingsBtnBBA)) + { + m_gcfg2.setBool(id, "bba_emu", !m_gcfg2.getBool(id, "bba_emu", 0)); + _showGameSettings(); + } + else if(m_btnMgr.selected(m_gameSettingsBtnNetProfP) || m_btnMgr.selected(m_gameSettingsBtnNetProfM)) + { + s8 direction = m_btnMgr.selected(m_gameSettingsBtnNetProfP) ? 1 : -1; + m_gcfg2.setInt(id, "net_profile", loopNum(m_gcfg2.getInt(id, "net_profile") + direction, 4)); + _showGameSettings(); + } else if(m_btnMgr.selected(m_gameSettingsBtnPrivateServer)) { m_gcfg2.setBool(id, "private_server", !m_gcfg2.getBool(id, "private_server", 0)); @@ -983,6 +1023,15 @@ void CMenu::_initGameSettingsMenu() m_gameSettingsLblPatch50 = _addLabel("GAME_SETTINGS/PATCH_PAL50", theme.lblFont, L"", 20, 305, 385, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); m_gameSettingsBtnPatch50 = _addButton("GAME_SETTINGS/PATCH_PAL50_BTN", theme.btnFont, L"", 420, 310, 200, 48, theme.btnFontColor); +//Page 6 GC only + m_gameSettingsLblBBA = _addLabel("GAME_SETTINGS/BBA", theme.lblFont, L"", 20, 125, 385, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + m_gameSettingsBtnBBA = _addButton("GAME_SETTINGS/BBA_BTN", theme.btnFont, L"", 420, 130, 200, 48, theme.btnFontColor); + + m_gameSettingsLblNetProf = _addLabel("GAME_SETTINGS/NET_PROFILE", theme.lblFont, L"", 20, 185, 385, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + m_gameSettingsLblNetProfVal = _addLabel("GAME_SETTINGS/NET_PROFILE_BTN", theme.btnFont, L"", 468, 190, 104, 48, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); + m_gameSettingsBtnNetProfM = _addPicButton("GAME_SETTINGS/NET_PROFILE_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 420, 190, 48, 48); + m_gameSettingsBtnNetProfP = _addPicButton("GAME_SETTINGS/NET_PROFILE_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 572, 190, 48, 48); + //Footer 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); @@ -1092,6 +1141,14 @@ void CMenu::_initGameSettingsMenu() _setHideAnim(m_gameSettingsBtnPosM, "GAME_SETTINGS/NIN_POS_MINUS", -50, 0, 1.f, 0.f); _setHideAnim(m_gameSettingsBtnPosP, "GAME_SETTINGS/NIN_POS_PLUS", -50, 0, 1.f, 0.f); + _setHideAnim(m_gameSettingsLblBBA, "GAME_SETTINGS/BBA", 50, 0, -2.f, 0.f); + _setHideAnim(m_gameSettingsBtnBBA, "GAME_SETTINGS/BBA_BTN", -50, 0, 1.f, 0.f); + + _setHideAnim(m_gameSettingsLblNetProf, "GAME_SETTINGS/NET_PROFILE", 50, 0, -2.f, 0.f); + _setHideAnim(m_gameSettingsLblNetProfVal, "GAME_SETTINGS/NET_PROFILE_BTN", -50, 0, 1.f, 0.f); + _setHideAnim(m_gameSettingsBtnNetProfM, "GAME_SETTINGS/NET_PROFILE_MINUS", -50, 0, 1.f, 0.f); + _setHideAnim(m_gameSettingsBtnNetProfP, "GAME_SETTINGS/NET_PROFILE_PLUS", -50, 0, 1.f, 0.f); + _setHideAnim(m_gameSettingsLblGCLoader, "GAME_SETTINGS/GC_LOADER", 50, 0, -2.f, 0.f); _setHideAnim(m_gameSettingsLblGCLoader_Val, "GAME_SETTINGS/GC_LOADER_BTN", -50, 0, 1.f, 0.f); _setHideAnim(m_gameSettingsBtnGCLoader_P, "GAME_SETTINGS/GC_LOADER_PLUS", -50, 0, 1.f, 0.f); @@ -1162,6 +1219,8 @@ void CMenu::_textGameSettings(void) m_btnMgr.setText(m_gameSettingsLblNATIVE_CTL, _t("cfgg43", L"Native Control")); m_btnMgr.setText(m_gameSettingsLblSkip_IPL, _t("cfgg53", L"Skip IPL BIOS")); m_btnMgr.setText(m_gameSettingsLblPatch50, _t("cfgg56", L"Patch PAL50")); + m_btnMgr.setText(m_gameSettingsLblBBA, _t("cfgg59", L"BBA Emulation")); + m_btnMgr.setText(m_gameSettingsLblNetProf, _t("cfgg60", L"BBA Net Profile")); m_btnMgr.setText(m_gameSettingsLblArcade, _t("cfgg48", L"Triforce Arcade Mode")); m_btnMgr.setText(m_gameSettingsLblEmulation, _t("cfgg24", L"NAND Emulation")); diff --git a/source/menu/menu_game_boot.cpp b/source/menu/menu_game_boot.cpp index 808759b5..4e216228 100644 --- a/source/menu/menu_game_boot.cpp +++ b/source/menu/menu_game_boot.cpp @@ -338,7 +338,7 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc) u8 GClanguage = min(m_gcfg2.getUInt(id, "language", 0), ARRAY_SIZE(CMenu::_GClanguages) - 1u); GClanguage = (GClanguage == 0) ? min(m_cfg.getUInt(GC_DOMAIN, "game_language", 0), ARRAY_SIZE(CMenu::_GlobalGClanguages) - 1u) : GClanguage-1; - // language selection only works for PAL games + // language selection only works for PAL games. E and J are always set to english. if(id[3] == 'E' || id[3] == 'J') GClanguage = 1; //=english @@ -362,6 +362,7 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc) bool deflicker = m_gcfg2.getBool(id, "deflicker", false); bool tri_arcade = m_gcfg2.getBool(id, "triforce_arcade", false); bool ipl = m_gcfg2.getBool(id, "skip_ipl", false); + bool bba = m_gcfg2.getBool(id, "bba_emu", false); bool patch_pal50 = m_gcfg2.getBool(id, "patch_pal50", false); bool NIN_Debugger = (m_gcfg2.getInt(id, "debugger", 0) == 2); bool cheats = m_gcfg2.getBool(id, "cheat", false); @@ -372,6 +373,9 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc) s8 vidoffset = m_gcfg2.getInt(id, "nin_pos", 127); if(vidoffset == 127) vidoffset = m_cfg.getInt(GC_DOMAIN, "nin_pos", 0); + u8 netprofile = 0; + if(!IsOnWiiU()) + netprofile = m_gcfg2.getUInt(id, "net_profile", 0); /* configs no longer needed */ m_gcfg1.save(true); @@ -458,7 +462,10 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc) if(ipl) n_config |= NIN_CFG_SKIP_IPL; - + + if(bba) + n_config |= NIN_CFG_BBA_EMU; + /* set memcard options */ if(emuMC > 0 || IsOnWiiU() == true) //force memcardemu for wii u vwii n_config |= NIN_CFG_MEMCARDEMU; @@ -518,7 +525,7 @@ void CMenu::_launchGC(dir_discHdr *hdr, bool disc) break; } - Nintendont_SetOptions(path, id, CheatPath, GClanguage, n_config, n_videomode, vidscale, vidoffset); + Nintendont_SetOptions(path, id, CheatPath, GClanguage, n_config, n_videomode, vidscale, vidoffset, netprofile); loadIOS(58, false); //nintendont NEEDS ios58 and AHBPROT disabled /* should be a check for error loading IOS58 and AHBPROT disabled */ diff --git a/wii/wiiflow/Languages/english.ini b/wii/wiiflow/Languages/english.ini index 6678d6c7..6e5b423d 100644 --- a/wii/wiiflow/Languages/english.ini +++ b/wii/wiiflow/Languages/english.ini @@ -160,6 +160,8 @@ cfgg55=Video Position cfgg56=Patch PAL50 cfgg57=Not allowed for disc! cfgg58=Adult only +cfgg59=BBA Emulation +cfgg60=BBA Net Profile cfgg4=Patch country strings cfgg5=Ocarina cfgg6=