diff --git a/out/bins/ext_booter.bin b/out/bins/ext_booter.bin index 73be9c3a..f8fa9d63 100644 Binary files a/out/bins/ext_booter.bin and b/out/bins/ext_booter.bin differ diff --git a/out/boot.dol b/out/boot.dol index 7cd88140..44daf26d 100644 Binary files a/out/boot.dol and b/out/boot.dol differ diff --git a/resources/wiiflow_game_booter/source/ChannelHandler.cpp b/resources/wiiflow_game_booter/source/ChannelHandler.cpp index 4dd2dfda..f94f63e7 100644 --- a/resources/wiiflow_game_booter/source/ChannelHandler.cpp +++ b/resources/wiiflow_game_booter/source/ChannelHandler.cpp @@ -206,7 +206,7 @@ u32 LoadChannel(u64 title, bool dol, u32 *IOS) } void PatchChannel(u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, - u32 returnTo, u8 private_server, const char *server_addr, bool patchFix480p, u8 deflicker, u8 bootType) + u32 returnTo, u8 private_server, const char *server_addr, u8 videoWidth, bool patchFix480p, u8 deflicker, u8 bootType) { u8 vfilter_off[7] = {0, 0, 21, 22, 21, 0, 0}; u8 vfilter_low[7] = {4, 4, 16, 16, 16, 4, 4}; @@ -232,6 +232,9 @@ void PatchChannel(u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryStrin if(hooktype != 0 && hookpatched == false) hookpatched = dogamehooks(dolchunkoffset[i], dolchunksize[i], true); + if (videoWidth == WIDTH_FRAMEBUFFER) + patch_width(dolchunkoffset[i], dolchunksize[i]); + if (deflicker == DEFLICKER_ON_LOW) { patch_vfilters(dolchunkoffset[i], dolchunksize[i], vfilter_low); diff --git a/resources/wiiflow_game_booter/source/ChannelHandler.hpp b/resources/wiiflow_game_booter/source/ChannelHandler.hpp index f3b00e62..bd556e60 100644 --- a/resources/wiiflow_game_booter/source/ChannelHandler.hpp +++ b/resources/wiiflow_game_booter/source/ChannelHandler.hpp @@ -14,7 +14,7 @@ typedef struct _dolheader } ATTRIBUTE_PACKED dolheader; void PatchChannel(u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, - u32 returnTo, u8 private_server, const char *server_addr, bool patchFix480p, u8 deflicker, u8 bootType); + u32 returnTo, u8 private_server, const char *server_addr, u8 videoWidth, bool patchFix480p, u8 deflicker, u8 bootType); u32 LoadChannel(u64 title, bool dol, u32 *IOS); extern bool isForwarder; diff --git a/resources/wiiflow_game_booter/source/Config.hpp b/resources/wiiflow_game_booter/source/Config.hpp index 30eabe21..1d165f48 100644 --- a/resources/wiiflow_game_booter/source/Config.hpp +++ b/resources/wiiflow_game_booter/source/Config.hpp @@ -49,6 +49,7 @@ struct the_CFG { s8 aspectRatio; bool patchFix480p; u8 deflicker; + u8 videoWidth; u8 private_server; char server_addr[24]; u8 *cheats; diff --git a/resources/wiiflow_game_booter/source/apploader.c b/resources/wiiflow_game_booter/source/apploader.c index 4fa6451e..4f315234 100644 --- a/resources/wiiflow_game_booter/source/apploader.c +++ b/resources/wiiflow_game_booter/source/apploader.c @@ -26,8 +26,8 @@ static u8 *appldr = (u8*)0x81200000; static const char *GameID = (const char*)0x80000000; /* Constants */ -#define APPLDR_OFFSET 0x910 -#define APPLDR_CODE 0x918 +#define APPLDR_OFFSET 0x910// usblgx uses 0x2440 -huh? +#define APPLDR_CODE 0x918// usblgx uses APPLDR_OFFSET + 0x20 - huh? void maindolpatches(void *dst, int len, u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, u32 returnTo, bool patchregion, u8 private_server, const char *server_addr, u8 deflicker, u8 bootType); @@ -39,18 +39,19 @@ static void NewSuperMarioBrosPatch(); static void Patch_23400_and_MKWii_vulnerability(); bool hookpatched = false; +// wiiflow uses a struct to hold the appldr hdr and usblgx uses a u32 buffer[32] array to hold it. /* Thanks Tinyload */ static struct { - char revision[16]; - void *entry; - s32 size; - s32 trailersize; - s32 padding; -} apploader_hdr ATTRIBUTE_ALIGN(32); + char revision[16];//[0-3] 16 divided by 4 bytes = 4 + void *entry;// [4] 4 bytes + s32 size;//[5] 4 bytes + s32 trailersize;// [6] 4 bytes + s32 padding;// [7] 4 bytes +} apploader_hdr ATTRIBUTE_ALIGN(32);// 16+4+4+4+4=32 bytes u32 Apploader_Run(u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, u32 returnTo, - bool patchregion , u8 private_server, const char *server_addr, bool patchFix480p, u8 deflicker, u8 bootType) + bool patchregion , u8 private_server, const char *server_addr, u8 videoWidth, bool patchFix480p, u8 deflicker, u8 bootType) { //! Disable private server for games that still have official servers. if(memcmp(GameID, "SC7", 3) == 0 || memcmp(GameID, "RJA", 3) == 0 || @@ -118,6 +119,12 @@ u32 Apploader_Run(u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryStrin prog(20); } free_wip(); + + patch_kirby((u8 *)0x80000000);// can't be done during maindolpatches. + + if(videoWidth == WIDTH_FRAMEBUFFER) + patch_width((void*)0x80000000, 0x900000); + if(hooktype != 0 && hookpatched) ocarina_do_code(); @@ -153,36 +160,28 @@ void maindolpatches(void *dst, int len, u8 vidMode, GXRModeObj *vmode, bool vipa u8 vfilter_medium[7] = {4, 8, 12, 16, 12, 8, 4}; u8 vfilter_high[7] = {8, 8, 10, 12, 10, 8, 8}; - patch_kirby((u8 *)0x80000000); - do_wip_code((u8 *)dst, len); - Remove_001_Protection(dst, len); - if(CurrentIOS.Type == IOS_TYPE_WANIN && CurrentIOS.Revision < 13) - Anti_002_fix(dst, len); - if((CurrentIOS.Type == IOS_TYPE_WANIN && CurrentIOS.Revision < 13) || CurrentIOS.Type == IOS_TYPE_HERMES) - patch_NoDiscinDrive(dst, len); patchVideoModes(dst, len, vidMode, vmode, patchVidModes, bootType); if(debuggerselect == 2) Patch_fwrite(dst, len); if(hooktype != 0 && hookpatched == false) hookpatched = dogamehooks(dst, len, false); - if(patchVidModes > 0) - PatchVideoSneek(dst, len); if(vipatch) vidolpatcher(dst, len); + if(patchVidModes > 0) + PatchVideoSneek(dst, len); if(configbytes[0] != 0xCD) langpatcher(dst, len); if(countryString) PatchCountryStrings(dst, len); // Country Patch by WiiPower - if(aspectRatio != -1) - PatchAspectRatio(dst, len, aspectRatio); - if(returnTo) - PatchReturnTo(dst, len, returnTo); + do_wip_code((u8 *)dst, len); + Remove_001_Protection(dst, len); + if(CurrentIOS.Type == IOS_TYPE_WANIN && CurrentIOS.Revision < 13) + Anti_002_fix(dst, len); + if((CurrentIOS.Type == IOS_TYPE_WANIN && CurrentIOS.Revision < 13) || CurrentIOS.Type == IOS_TYPE_HERMES) + patch_NoDiscinDrive(dst, len); if(patchregion) PatchRegion(dst, len); - if(private_server) - PrivateServerPatcher(dst, len, private_server, serverAddr); - if(deflicker == DEFLICKER_ON_LOW) { patch_vfilters(dst, len, vfilter_low); @@ -206,6 +205,12 @@ void maindolpatches(void *dst, int len, u8 vidMode, GXRModeObj *vmode, bool vipa if (deflicker == DEFLICKER_OFF_EXTENDED) deflicker_patch(dst, len); } + if(returnTo) + PatchReturnTo(dst, len, returnTo); + if(aspectRatio != -1) + PatchAspectRatio(dst, len, aspectRatio); + if(private_server) + PrivateServerPatcher(dst, len, private_server, serverAddr); } static void patch_NoDiscinDrive(void *buffer, u32 len) diff --git a/resources/wiiflow_game_booter/source/apploader.h b/resources/wiiflow_game_booter/source/apploader.h index 395f5037..8ad8031b 100644 --- a/resources/wiiflow_game_booter/source/apploader.h +++ b/resources/wiiflow_game_booter/source/apploader.h @@ -7,7 +7,7 @@ extern "C" { /* Prototypes */ u32 Apploader_Run(u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, u32 returnTo, - bool patchregion, u8 private_server, const char * server_addr, bool patchFix480p, u8 deflicker, u8 bootType); + bool patchregion, u8 private_server, const char * server_addr, u8 videoWidth, bool patchFix480p, u8 deflicker, u8 bootType); enum { @@ -28,6 +28,13 @@ enum DEFLICKER_ON_HIGH }; +enum +{ + WIDTH_AUTO, + WIDTH_FRAMEBUFFER, + WIDTH_MAX +}; + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/resources/wiiflow_game_booter/source/main.cpp b/resources/wiiflow_game_booter/source/main.cpp index 1743c3b5..3c8b816d 100644 --- a/resources/wiiflow_game_booter/source/main.cpp +++ b/resources/wiiflow_game_booter/source/main.cpp @@ -107,8 +107,8 @@ int main() if(normalCFG.vidMode == 5) normalCFG.patchVidMode = 1; //progressive mode requires this vmode = Disc_SelectVMode(normalCFG.vidMode, &vmode_reg);// requires Disc_ID[3] - AppEntrypoint = Apploader_Run(normalCFG.vidMode, vmode, normalCFG.vipatch, normalCFG.countryString, normalCFG.patchVidMode, normalCFG.aspectRatio, - normalCFG.returnTo, normalCFG.patchregion, normalCFG.private_server, normalCFG.server_addr, normalCFG.patchFix480p, normalCFG.deflicker, normalCFG.BootType); + AppEntrypoint = Apploader_Run(normalCFG.vidMode, vmode, normalCFG.vipatch, normalCFG.countryString, normalCFG.patchVidMode, normalCFG.aspectRatio, normalCFG.returnTo, + normalCFG.patchregion, normalCFG.private_server, normalCFG.server_addr, normalCFG.videoWidth, normalCFG.patchFix480p, normalCFG.deflicker, normalCFG.BootType); WDVD_Close(); } else if(normalCFG.BootType == TYPE_CHANNEL) @@ -118,7 +118,7 @@ int main() ISFS_Deinitialize(); vmode = Disc_SelectVMode(normalCFG.vidMode, &vmode_reg);// requires Disc_ID[3] PatchChannel(normalCFG.vidMode, vmode, normalCFG.vipatch, normalCFG.countryString, normalCFG.patchVidMode, normalCFG.aspectRatio, - normalCFG.returnTo, normalCFG.private_server, normalCFG.server_addr, normalCFG.patchFix480p, normalCFG.deflicker, normalCFG.BootType); + normalCFG.returnTo, normalCFG.private_server, normalCFG.server_addr, normalCFG.videoWidth, normalCFG.patchFix480p, normalCFG.deflicker, normalCFG.BootType); } gprintf("Entrypoint: %08x, Requested Game IOS: %i\n", AppEntrypoint, GameIOS); setprog(320); diff --git a/resources/wiiflow_game_booter/source/patchcode.c b/resources/wiiflow_game_booter/source/patchcode.c index b00ec66c..4ed08b40 100644 --- a/resources/wiiflow_game_booter/source/patchcode.c +++ b/resources/wiiflow_game_booter/source/patchcode.c @@ -1337,7 +1337,7 @@ u32 do_new_wiimmfi() { // Deflicker filter patching by wiidev (blackb0x @ GBAtemp) void patch_vfilters(void *addr, u32 len, u8 *vfilter) { - u8 *addr_start = addr; + u8 *addr_start = (u8 *)addr; while (len >= sizeof(GXRModeObj)) { GXRModeObj *vidmode = (GXRModeObj *)addr_start; @@ -1369,8 +1369,8 @@ void patch_vfilters_rogue(void *addr, u32 len, u8 *vfilter) {4, 4, 16, 16, 16, 4, 4}, {2, 2, 17, 22, 17, 2, 2} }; - u8 *addr_start = addr; - u8 *addr_end = addr + len - 8; + u8 *addr_start = (u8 *)addr; + u8 *addr_end = addr_start + len - 8; while (addr_start <= addr_end) { u8 known_vfilter[7]; @@ -1400,8 +1400,8 @@ void deflicker_patch(void *addr, u32 len) 0x508BC00E, 0x99498000, 0x500CC00E, 0x90698000, 0x99498000, 0x90E98000, 0x99498000, 0x91098000, 0x41820040}; - u8 *addr_start = addr; - u8 *addr_end = addr + len - sizeof(SearchPattern); + u8 *addr_start = (u8 *)addr; + u8 *addr_end = addr_start + len - sizeof(SearchPattern); while (addr_start <= addr_end) { if (memcmp(addr_start, SearchPattern, sizeof(SearchPattern)) == 0) @@ -1413,3 +1413,51 @@ void deflicker_patch(void *addr, u32 len) addr_start += 4; } } + +void patch_width(void *addr, u32 len) +{ + u8 SearchPattern[32] = { + 0x40, 0x82, 0x00, 0x08, 0x48, 0x00, 0x00, 0x1C, + 0x28, 0x09, 0x00, 0x03, 0x40, 0x82, 0x00, 0x08, + 0x48, 0x00, 0x00, 0x10, 0x2C, 0x03, 0x00, 0x00, + 0x40, 0x82, 0x00, 0x08, 0x54, 0xA5, 0x0C, 0x3C}; + u8 *addr_start = (u8 *)addr; + u8 *addr_end = addr_start + len - sizeof(SearchPattern); + while (addr_start <= addr_end) + { + if (memcmp(addr_start, SearchPattern, sizeof(SearchPattern)) == 0) + { + if (addr_start[-0x70] == 0xA0 && addr_start[-0x6E] == 0x00 && addr_start[-0x6D] == 0x0A) + { + if (addr_start[-0x44] == 0xA0 && addr_start[-0x42] == 0x00 && addr_start[-0x41] == 0x0E) + { + u8 reg_a = (addr_start[-0x6F] >> 5); + u8 reg_b = (addr_start[-0x43] >> 5); + + // Patch to the framebuffer resolution + addr_start[-0x41] = 0x04; + + // Center the image + void *offset = addr_start - 0x70; + + u32 old_heap_ptr = *(u32 *)0x80003110; + *(u32 *)0x80003110 = old_heap_ptr - 0x40; + u32 heap_space = old_heap_ptr - 0x40; + + u32 org_address = (addr_start[-0x70] << 24) | (addr_start[-0x6F] << 16); + *(u32 *)(heap_space + 0x00) = org_address | 4; + *(u32 *)(heap_space + 0x04) = 0x200002D0 | (reg_b << 21) | (reg_a << 16); + *(u32 *)(heap_space + 0x08) = 0x38000002 | (reg_a << 21); + *(u32 *)(heap_space + 0x0C) = 0x7C000396 | (reg_a << 21) | (reg_b << 16) | (reg_a << 11); + + *(u32 *)offset = 0x48000000 + ((heap_space - (u32)offset) & 0x3ffffff); + *(u32 *)(heap_space + 0x10) = 0x48000000 + ((((u32)offset + 0x04) - (heap_space + 0x10)) & 0x3ffffff); + + gprintf("Patched resolution. Branched from 0x%x to 0x%x\n", offset, heap_space); + return; + } + } + } + addr_start += 4; + } +} diff --git a/resources/wiiflow_game_booter/source/patchcode.h b/resources/wiiflow_game_booter/source/patchcode.h index 9092ae47..e4f75640 100644 --- a/resources/wiiflow_game_booter/source/patchcode.h +++ b/resources/wiiflow_game_booter/source/patchcode.h @@ -33,6 +33,7 @@ extern u8 configbytes[2]; void deflicker_patch(void *addr, u32 len); void patch_vfilters(void *addr, u32 len, u8 *vfilter); void patch_vfilters_rogue(void *addr, u32 len, u8 *vfilter); +void patch_width(void *addr, u32 len); bool dogamehooks(void *addr, u32 len, bool channel); void langpatcher(void *addr, u32 len); void vidolpatcher(void *addr, u32 len); diff --git a/source/booter/Config.h b/source/booter/Config.h index 7cb40644..e836020f 100644 --- a/source/booter/Config.h +++ b/source/booter/Config.h @@ -49,6 +49,7 @@ struct the_CFG { s8 aspectRatio; bool patchFix480p; u8 deflicker; + u8 videoWidth; u8 private_server; char server_addr[24]; u8 *cheats; diff --git a/source/booter/external_booter.cpp b/source/booter/external_booter.cpp index 61ea26c5..2aabb95a 100644 --- a/source/booter/external_booter.cpp +++ b/source/booter/external_booter.cpp @@ -62,7 +62,7 @@ u8 *booter_ptr = NULL; u32 booter_size = 0; void WiiFlow_ExternalBooter(u8 vidMode, bool vipatch, bool countryString, u8 patchVidMode, s8 aspectRatio, u8 private_server, const char *server_addr, - bool patchFix480p, u8 deflicker, u32 returnTo, u8 BootType, bool use_led) + u8 videoWidth, bool patchFix480p, u8 deflicker, u32 returnTo, u8 BootType, bool use_led) { normalCFG.vidMode = vidMode; normalCFG.vipatch = vipatch; @@ -73,6 +73,7 @@ void WiiFlow_ExternalBooter(u8 vidMode, bool vipatch, bool countryString, u8 pat strncpy(normalCFG.server_addr, server_addr, 23); normalCFG.patchFix480p = patchFix480p; normalCFG.deflicker = deflicker; + normalCFG.videoWidth = videoWidth; normalCFG.returnTo = returnTo; normalCFG.configbytes[0] = configbytes[0]; normalCFG.configbytes[1] = configbytes[1]; diff --git a/source/booter/external_booter.hpp b/source/booter/external_booter.hpp index 2c9b9bc0..66793614 100644 --- a/source/booter/external_booter.hpp +++ b/source/booter/external_booter.hpp @@ -29,7 +29,7 @@ extern u32 hooktype; #endif void WiiFlow_ExternalBooter(u8 vidMode, bool vipatch, bool countryString, u8 patchVidMode, s8 aspectRatio, u8 private_server, const char *server_addr, - bool patchFix480p, u8 deflicker, u32 returnTo, u8 BootType, bool use_led); + u8 videoWidth, bool patchFix480p, u8 deflicker, u32 returnTo, u8 BootType, bool use_led); bool ExternalBooter_LoadBins(const char *binDir); void ExternalBooter_ChannelSetup(u64 title, bool dol); void ExternalBooter_WiiGameSetup(bool wbfs, bool dvd, bool patchregion, const char *ID); diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index 6733fab8..bca84f48 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -1018,6 +1018,8 @@ private: static const SOption _languages[11]; static const SOption _GlobalDeflickerOptions[6]; static const SOption _DeflickerOptions[7]; + static const SOption _GlobalVideoWidths[2]; + static const SOption _VideoWidths[3]; static const SOption _AspectRatio[3]; static const SOption _WidescreenWiiu[3]; static const SOption _vidModePatch[4]; diff --git a/source/menu/menu_config_game.cpp b/source/menu/menu_config_game.cpp index c5a548d0..e4a3f9d7 100644 --- a/source/menu/menu_config_game.cpp +++ b/source/menu/menu_config_game.cpp @@ -48,6 +48,17 @@ const CMenu::SOption CMenu::_DeflickerOptions[7] = { { "df_high", L"On (High)" }, }; +const CMenu::SOption CMenu::_GlobalVideoWidths[2] = { + { "vw_auto", L"Auto" }, + { "vw_frmbuf", L"Framebuffer" }, +}; + +const CMenu::SOption CMenu::_VideoWidths[3] = { + { "vw_def", L"Default" }, + { "vw_auto", L"Auto" }, + { "vw_frmbuf", L"Framebuffer" }, +}; + const CMenu::SOption CMenu::_languages[11] = { { "lngdef", L"Default" },// next should be console { "lngjap", L"Japanese" }, @@ -253,7 +264,6 @@ void CMenu::_showConfigGame() } else i = 0; - if(i > 0) m_btnMgr.setText(m_configLbl2Val, wfmt(L"%i", i)); else @@ -396,17 +406,20 @@ void CMenu::_showConfigGame() } 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")); + m_btnMgr.setText(m_configLbl1, _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)); + m_btnMgr.setText(m_configLbl1Val, _t(CMenu::_privateServer[i].id, CMenu::_privateServer[i].text)); else - m_btnMgr.setText(m_configLbl2Val, custom_servers[i - 3]);//wstringEx() + m_btnMgr.setText(m_configLbl1Val, custom_servers[i - 3]);//wstringEx() + m_btnMgr.show(m_configLbl1); + m_btnMgr.show(m_configLbl1Val); + m_btnMgr.show(m_configBtn1P); + m_btnMgr.show(m_configBtn1M); + + m_btnMgr.setText(m_configLbl2, _t("cfgg65", L"Video Width")); + i = min(m_gcfg2.getUInt(id, "video_width", 0), ARRAY_SIZE(CMenu::_VideoWidths) - 1u); + m_btnMgr.setText(m_configLbl2Val, _t(CMenu::_VideoWidths[i].id, CMenu::_VideoWidths[i].text)); m_btnMgr.show(m_configLbl2); m_btnMgr.show(m_configLbl2Val); m_btnMgr.show(m_configBtn2P); @@ -444,6 +457,13 @@ void CMenu::_showConfigGame() m_btnMgr.show(m_configBtn2P); m_btnMgr.show(m_configBtn2M); } + else // wii only + { + m_btnMgr.setText(m_configLbl2, _t("cfgg38", L"Activity LED")); + m_btnMgr.setText(m_configBtn2, _optBoolToString(m_gcfg2.getOptBool(id, "led", 0))); + m_btnMgr.show(m_configLbl2); + m_btnMgr.show(m_configBtn2); + } } } @@ -739,20 +759,22 @@ void CMenu::_configGame(const dir_discHdr *hdr, bool disc) } else if(m_configGamePage == 5) { - if(m_btnMgr.selected(m_configBtn1)) + if(m_btnMgr.selected(m_configBtn1P) || m_btnMgr.selected(m_configBtn1M)) { - m_gcfg2.setBool(id, "led", !m_gcfg2.getBool(id, "led", 0)); - m_btnMgr.setText(m_configBtn1, _optBoolToString(m_gcfg2.getOptBool(id, "led", 0))); + s8 direction = m_btnMgr.selected(m_configBtn1P) ? 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_configLbl1Val, _t(CMenu::_privateServer[i].id, CMenu::_privateServer[i].text)); + else + m_btnMgr.setText(m_configLbl1Val, custom_servers[i - 3]);//wstringEx() } 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() + i = loopNum(m_gcfg2.getUInt(id, "video_width") + direction, ARRAY_SIZE(CMenu::_VideoWidths)); + m_gcfg2.setInt(id, "video_width", i); + m_btnMgr.setText(m_configLbl2Val, _t(CMenu::_VideoWidths[i].id, CMenu::_VideoWidths[i].text)); } else if(m_btnMgr.selected(m_configBtn3P) || m_btnMgr.selected(m_configBtn3M)) { @@ -798,13 +820,18 @@ void CMenu::_configGame(const dir_discHdr *hdr, bool disc) _error(_t("dlmsg14", L"Done.")); _showConfigGame(); } - else if(m_btnMgr.selected(m_configBtn2P) || m_btnMgr.selected(m_configBtn2M)) + else if(m_btnMgr.selected(m_configBtn2P) || m_btnMgr.selected(m_configBtn2M))// wii u only { s8 direction = m_btnMgr.selected(m_configBtn2P) ? 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_configLbl2Val, _t(CMenu::_WidescreenWiiu[i].id, CMenu::_WidescreenWiiu[i].text)); } + else if(m_btnMgr.selected(m_configBtn2))// wii only + { + m_gcfg2.setBool(id, "led", !m_gcfg2.getBool(id, "led", 0)); + m_btnMgr.setText(m_configBtn2, _optBoolToString(m_gcfg2.getOptBool(id, "led", 0))); + } } } } diff --git a/source/menu/menu_config_main.cpp b/source/menu/menu_config_main.cpp index 8be34414..a562c05f 100644 --- a/source/menu/menu_config_main.cpp +++ b/source/menu/menu_config_main.cpp @@ -122,8 +122,7 @@ void CMenu::_showConfigMain() { m_btnMgr.show(m_configLbl1); m_btnMgr.show(m_configLbl3); - if(mainCfg_curPage != 14) - m_btnMgr.show(m_configLbl4); + m_btnMgr.show(m_configLbl4); } if(mainCfg_curPage == 1) @@ -409,6 +408,9 @@ void CMenu::_showConfigMain() m_btnMgr.show(m_configLbl3Val); m_btnMgr.show(m_configBtn3M); m_btnMgr.show(m_configBtn3P); + m_btnMgr.show(m_configLbl4Val); + m_btnMgr.show(m_configBtn4M); + m_btnMgr.show(m_configBtn4P); m_btnMgr.setText(m_configLbl1, _t("cfg729", L"Use system proxy settings")); m_btnMgr.setText(m_configBtn1, m_cfg.getBool("PROXY", "proxy_use_system") ? _t("on", L"On") : _t("off", L"Off")); m_btnMgr.setText(m_configLbl2, _t("cfg730", L"Always show main icons")); @@ -416,6 +418,9 @@ void CMenu::_showConfigMain() m_btnMgr.setText(m_configLbl3, _t("cfgg61", L"Deflicker Filter")); int i = min(max(0, m_cfg.getInt("GENERAL", "deflicker_wii", 0)), (int)ARRAY_SIZE(CMenu::_GlobalDeflickerOptions) - 1); m_btnMgr.setText(m_configLbl3Val, _t(CMenu::_GlobalDeflickerOptions[i].id, CMenu::_GlobalDeflickerOptions[i].text)); + m_btnMgr.setText(m_configLbl4, _t("cfgg65", L"Video Width")); + i = min(max(0, m_cfg.getInt("GENERAL", "video_width", 0)), (int)ARRAY_SIZE(CMenu::_GlobalVideoWidths) - 1); + m_btnMgr.setText(m_configLbl4Val, _t(CMenu::_GlobalVideoWidths[i].id, CMenu::_GlobalVideoWidths[i].text)); } } @@ -961,6 +966,13 @@ void CMenu::_configMain(void) int val = m_cfg.getInt("GENERAL", "deflicker_wii"); m_btnMgr.setText(m_configLbl3Val, _t(CMenu::_GlobalDeflickerOptions[val].id, CMenu::_GlobalDeflickerOptions[val].text)); } + else if(m_btnMgr.selected(m_configBtn4P) || m_btnMgr.selected(m_configBtn4M)) + { + s8 direction = m_btnMgr.selected(m_configBtn4P) ? 1 : -1; + m_cfg.setInt("GENERAL", "video_width", loopNum(m_cfg.getUInt("GENERAL", "video_width") + direction, ARRAY_SIZE(CMenu::_GlobalVideoWidths))); + int val = m_cfg.getInt("GENERAL", "video_width"); + m_btnMgr.setText(m_configLbl4Val, _t(CMenu::_GlobalVideoWidths[val].id, CMenu::_GlobalVideoWidths[val].text)); + } } } } diff --git a/source/menu/menu_game_boot.cpp b/source/menu/menu_game_boot.cpp index 5f49a031..81a1260f 100644 --- a/source/menu/menu_game_boot.cpp +++ b/source/menu/menu_game_boot.cpp @@ -861,6 +861,9 @@ void CMenu::_launchChannel(dir_discHdr *hdr) u8 deflicker = min(m_gcfg2.getUInt(id, "deflicker_wii", 0), ARRAY_SIZE(CMenu::_DeflickerOptions) - 1u); deflicker = (deflicker == 0) ? min(m_cfg.getUInt("GENERAL", "deflicker_wii", 0), ARRAY_SIZE(CMenu::_GlobalDeflickerOptions) - 1u) : deflicker - 1; + u8 videoWidth = min(m_gcfg2.getUInt(id, "video_width", 0), ARRAY_SIZE(CMenu::_VideoWidths) - 1u); + videoWidth = (videoWidth == 0) ? min(m_cfg.getUInt("GENERAL", "video_width", 0), ARRAY_SIZE(CMenu::_GlobalVideoWidths) - 1u) : videoWidth-1; + u8 private_server = m_gcfg2.getUInt(id, "private_server", 0); string server_addr = ""; if(private_server > 2) @@ -1010,7 +1013,7 @@ void CMenu::_launchChannel(dir_discHdr *hdr) ExternalBooter_ChannelSetup(gameTitle, use_dol); WiiFlow_ExternalBooter(videoMode, vipatch, countryPatch, patchVidMode, aspectRatio, private_server, server_addr.c_str(), - fix480p, deflicker, 0, TYPE_CHANNEL, use_led); + videoWidth, fix480p, deflicker, 0, TYPE_CHANNEL, use_led); Sys_Exit(); } @@ -1116,6 +1119,9 @@ void CMenu::_launchWii(dir_discHdr *hdr, bool dvd, bool disc_cfg) u8 deflicker = min(m_gcfg2.getUInt(id, "deflicker_wii", 0), ARRAY_SIZE(CMenu::_DeflickerOptions) - 1u); deflicker = (deflicker == 0) ? min(m_cfg.getUInt("GENERAL", "deflicker_wii", 0), ARRAY_SIZE(CMenu::_GlobalDeflickerOptions) - 1u) : deflicker-1; + u8 videoWidth = min(m_gcfg2.getUInt(id, "video_width", 0), ARRAY_SIZE(CMenu::_VideoWidths) - 1u); + videoWidth = (videoWidth == 0) ? min(m_cfg.getUInt("GENERAL", "video_width", 0), ARRAY_SIZE(CMenu::_GlobalVideoWidths) - 1u) : videoWidth-1; + u8 private_server = m_gcfg2.getUInt(id, "private_server", 0); string server_addr = ""; if(private_server > 2) @@ -1331,7 +1337,7 @@ void CMenu::_launchWii(dir_discHdr *hdr, bool dvd, bool disc_cfg) ExternalBooter_WiiGameSetup(wbfs_partition, dvd, patchregion, id.c_str()); WiiFlow_ExternalBooter(videoMode, vipatch, countryPatch, patchVidMode, aspectRatio, private_server, server_addr.c_str(), - fix480p, deflicker, returnTo, TYPE_WII_GAME, use_led); + videoWidth, fix480p, deflicker, returnTo, TYPE_WII_GAME, use_led); Sys_Exit(); } diff --git a/wii/wiiflow/Languages/brazilian.ini b/wii/wiiflow/Languages/brazilian.ini index 095feb77..13480dda 100644 --- a/wii/wiiflow/Languages/brazilian.ini +++ b/wii/wiiflow/Languages/brazilian.ini @@ -164,6 +164,7 @@ cfgg57=Não permitido para disco! cfgg58=Somente adultos cfgg59=Emulação BBA cfgg60=Perfil BBA Net +cfgg65=Video Width cfgg4=Patch strings de países cfgg5=Ocarina cfgg6= @@ -478,6 +479,9 @@ vmpall=Todas vmpmore=Mais vmpnone=Nenhum vmpnormal=Normal +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=Instalar WAD wad2=Ok wad3= diff --git a/wii/wiiflow/Languages/dutch.ini b/wii/wiiflow/Languages/dutch.ini index dc49b0f7..e48ddd2e 100644 --- a/wii/wiiflow/Languages/dutch.ini +++ b/wii/wiiflow/Languages/dutch.ini @@ -167,6 +167,7 @@ cfgg57=Niet toegestaan voor schijf! cfgg58=Alleen volwassenen cfgg59=BBA-emulatie cfgg60=BBA Net Profile +cfgg65=Video Width cfgg4=Landinstellingenpatch cfgg5=Ocarina cfgg6= @@ -483,6 +484,9 @@ vmpall=Alles vmpmore=Meer vmpnone=Geen vmpnormal=Normaal +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=WAD installeren wad2=Starten wad3= diff --git a/wii/wiiflow/Languages/english.ini b/wii/wiiflow/Languages/english.ini index 958b1d14..2b576176 100644 --- a/wii/wiiflow/Languages/english.ini +++ b/wii/wiiflow/Languages/english.ini @@ -169,6 +169,7 @@ cfgg61=Deflicker Filter cfgg62=Reload cached cover cfgg63=Converting cover please wait... cfgg64=Reset Settings to Defaults +cfgg65=Video Width cfgg4=Patch country strings cfgg5=Ocarina cfgg6= @@ -487,6 +488,9 @@ vmpall=All vmpmore=More vmpnone=None vmpnormal=Normal +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=Install WAD wad2=Go wad3= diff --git a/wii/wiiflow/Languages/french.ini b/wii/wiiflow/Languages/french.ini index 2872d075..d42254f1 100644 --- a/wii/wiiflow/Languages/french.ini +++ b/wii/wiiflow/Languages/french.ini @@ -164,6 +164,7 @@ cfgg57=Non-Autorisé pour ce Disque! cfgg58=Résérvé aux Adultes cfgg59=Emulation BBA cfgg60=Profil Net BBA +cfgg65=Video Width cfgg4=Patcher Jeux Import cfgg5=Ocarina cfgg6= @@ -469,6 +470,9 @@ vmpall=Tout vmpmore=Plus vmpnone=Aucun vmpnormal=Normal +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=Installer WAD wad2=Aller wad3= diff --git a/wii/wiiflow/Languages/german.ini b/wii/wiiflow/Languages/german.ini index 15553f8e..f2176bdb 100644 --- a/wii/wiiflow/Languages/german.ini +++ b/wii/wiiflow/Languages/german.ini @@ -168,6 +168,7 @@ cfgg58=Nur für Erwachsene cfgg59=BBA-Emulation cfgg60=BBA-Netzprofil cfgg61=Entflimmer-Filter +cfgg65=Video Width cfgg4=Länder-Strings patchen cfgg5=Ocarina cfgg6= @@ -500,6 +501,9 @@ vmpall=Alle vmpmore=Mehr vmpnone=Keinen vmpnormal=Normal +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=WAD Installieren wad2=Start wad3= diff --git a/wii/wiiflow/Languages/italian.ini b/wii/wiiflow/Languages/italian.ini index 4b121a80..9e419008 100644 --- a/wii/wiiflow/Languages/italian.ini +++ b/wii/wiiflow/Languages/italian.ini @@ -160,6 +160,7 @@ cfgg57=Non consentito per i dischi! cfgg58=solo adulti cfgg59=Emulazione BBA cfgg60=BBA Profilo di Rete +cfgg65=Video Width cfgg7=Vipatch cfgg8=Indietro cfghb1=Impostazioni Homebrew @@ -462,6 +463,9 @@ vmpall=Tutte vmpmore=Di più vmpnone=Nessuna vmpnormal=Normale +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=Installa WAD wad2=Avvia wad3=Selezionato %s, dopo l'installazione ritornerai all'explorer diff --git a/wii/wiiflow/Languages/korean.ini b/wii/wiiflow/Languages/korean.ini index fad536b5..f0fb790b 100644 --- a/wii/wiiflow/Languages/korean.ini +++ b/wii/wiiflow/Languages/korean.ini @@ -168,6 +168,7 @@ cfgg58=성인용 cfgg59=BBA 에뮬레이션 cfgg60=BBA 넷 프로파일 cfgg61=디플리커 필터 +cfgg65=Video Width cfgg4=국가 문자열 패치 cfgg5=오카리나 cfgg6= @@ -491,6 +492,9 @@ vmpall=모두 vmpmore=더 많은 vmpnone=없음 vmpnormal=보통 +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=WAD 설치 wad2=가기 wad3= diff --git a/wii/wiiflow/Languages/polish.ini b/wii/wiiflow/Languages/polish.ini index fa75c240..2179ed03 100644 --- a/wii/wiiflow/Languages/polish.ini +++ b/wii/wiiflow/Languages/polish.ini @@ -167,6 +167,7 @@ cfgg57=Niedozwolone przez płytę! cfgg58=Ustaw znacznik tylko dla dorosłych cfgg59=Emulacja BBA cfgg60=Profil Net BBA +cfgg65=Video Width cfgg4=Spatchuj ustawienia kraju cfgg5=Ocarina cfgg6= @@ -481,6 +482,9 @@ vmpall=Wszystkie vmpmore=Więcej vmpnone=Żadne vmpnormal=Normal +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=Zainstaluj plik WAD wad2=Rozpocznij wad3= diff --git a/wii/wiiflow/Languages/russian.ini b/wii/wiiflow/Languages/russian.ini index 2f87c799..1e40821d 100644 --- a/wii/wiiflow/Languages/russian.ini +++ b/wii/wiiflow/Languages/russian.ini @@ -169,6 +169,7 @@ cfgg61=Фильтр подавления мерцания cfgg62=Перезагрузить кэшированную обложку cfgg63=Конвертирование обложки, подождите... cfgg64=Сбросить настройки до значений по умолчанию +cfgg65=Video Width cfgg4=Патч Country Strings cfgg5=Ocarina cfgg6= @@ -487,6 +488,9 @@ vmpall=Все vmpmore=Больше vmpnone=Отсутствует vmpnormal=Обычное +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=Установить WAD wad2=Перейти wad3= diff --git a/wii/wiiflow/Languages/spanish.ini b/wii/wiiflow/Languages/spanish.ini index eb131450..3d8859e3 100644 --- a/wii/wiiflow/Languages/spanish.ini +++ b/wii/wiiflow/Languages/spanish.ini @@ -165,6 +165,7 @@ cfgg58=Solo para adultos cfgg59=Emulación BBA cfgg60=Perfil de red BBA cfgg61=Filtro Antiparpadeo de video +cfgg65=Video Width cfgg4=Parchar cadenas de país cfgg5=Ocarina cfgg6= @@ -480,6 +481,9 @@ vmpall=Todos vmpmore=Más vmpnone=Ninguno vmpnormal=Normal +vw_auto=Auto +vw_def=Default +vw_frmbuf=Framebuffer wad1=Instalar WAD wad2=Empezar wad3=