diff --git a/source-code/data/plugins/config.ini b/source-code/data/plugins/config.ini index 8b24f95..6932c46 100644 --- a/source-code/data/plugins/config.ini +++ b/source-code/data/plugins/config.ini @@ -9,23 +9,29 @@ Skip=0 [Patches] #Enable or disable mouse cursor Cursor=1 -#Hide Freeplay text +#Hide "CREDIT(S)"/"FREE PLAY" Hide_Freeplay=0 +#Show "FREE PLAY" instead of "CREDIT(S)" +Freeplay=1 +#Show "PD Loader " instead of "FREE PLAY" +PDLoaderText=1 #Set the card reader and network status icons -- 0=default, 1=hidden, 2=error, 3=OK, 4=partial OK Status_Icons=0 #Hide the watermark that's usually shown in PV viewing mode Hide_PV_Watermark=0 #Permanently the photo controls during PV playback No_PV_UI=0 -#Disables showing lyrics +#Disable showing lyrics No_Lyrics=0 -#Disables movies (enable this if the game hangs when loading certain PVs) +#Disable movies (enable this if the game hangs when loading certain PVs) No_Movies=0 +#Enable custom MP4 adv movies (experimental) +MP4_Movies=0 #Hide the volume and SE control buttons Hide_Volume=0 -#Disables the error banner +#Disable the error banner No_Error=1 -#Allows using a real arcade slider attached to COM11 +#Allow using a real arcade slider attached to COM11 Hardware_Slider=0 #Enhanced Stage Manager (sets a custom number of stages; "stage_manager" should be disabled in "components.ini") #Number of stages (0 = disabled) diff --git a/source-code/source/plugins/Launcher/framework.h b/source-code/source/plugins/Launcher/framework.h index 431eb7f..d1ec5f3 100644 --- a/source-code/source/plugins/Launcher/framework.h +++ b/source-code/source/plugins/Launcher/framework.h @@ -147,15 +147,21 @@ ConfigOptionBase* optionsArray[] = { new BooleanOption(L"TAA", GRAPHICS_SECTION, CONFIG_FILE, L"TAA", L"Temporal Anti-Aliasing", true, false), new BooleanOption(L"MLAA", GRAPHICS_SECTION, CONFIG_FILE, L"MLAA", L"Morphological Anti-Aliasing", true, false), - new BooleanOption(L"hide_freeplay", PATCHES_SECTION, CONFIG_FILE, L"Hide Freeplay", L"Hide Freeplay text.", false, false), + new BooleanOption(L"hide_freeplay", PATCHES_SECTION, CONFIG_FILE, L"Hide \"CREDIT(S)\"", L"Hide the \"CREDIT(S)\" text.", false, false), + new BooleanOption(L"freeplay", PATCHES_SECTION, CONFIG_FILE, L"FREE PLAY", L"Show \"FREE PLAY\" instead of \"CREDIT(S)\".", false, false), + new BooleanOption(L"pdloadertext", PATCHES_SECTION, CONFIG_FILE, L"PD Loader FREE PLAY", L"Show the version of PD Loader instead of \"FREE PLAY\".", false, false), new BooleanOption(L"hide_volume", PATCHES_SECTION, CONFIG_FILE, L"Hide Volume Buttons", L"Hide the volume and SE control buttons.", false, false), - new BooleanOption(L"no_movies", PATCHES_SECTION, CONFIG_FILE, L"Disable Movies", L"Disables movies (enable this if the game hangs when loading certain PVs).", false, false), - new BooleanOption(L"no_pv_ui", PATCHES_SECTION, CONFIG_FILE, L"Disable PV UI", L"Removes the photo controls during PV playback.", false, false), - new BooleanOption(L"no_lyrics", PATCHES_SECTION, CONFIG_FILE, L"Disable Lyrics", L"Disables showing lyrics.", false, false), - new BooleanOption(L"hide_pv_watermark", PATCHES_SECTION, CONFIG_FILE, L"Hide PV Watermark", L"Hides the watermark that's usually shown in PV viewing mode.", false, false), - new BooleanOption(L"no_error", PATCHES_SECTION, CONFIG_FILE, L"Disable Error Banner", L"Disables the error banner on the attract screen.", true, false), + new BooleanOption(L"no_movies", PATCHES_SECTION, CONFIG_FILE, L"Disable Movies", L"Disable movies (enable this if the game hangs when loading certain PVs).", false, false), + new BooleanOption(L"mp4_movies", PATCHES_SECTION, CONFIG_FILE, L"Custom MP4 Adv Movies", L"Enable custom MP4 adv movies (experimental).", false, false), + new BooleanOption(L"no_pv_ui", PATCHES_SECTION, CONFIG_FILE, L"Disable PV UI", L"Remove the photo controls during PV playback.", false, false), + new BooleanOption(L"no_lyrics", PATCHES_SECTION, CONFIG_FILE, L"Disable Lyrics", L"Disable showing lyrics.", false, false), + new BooleanOption(L"hide_pv_watermark", PATCHES_SECTION, CONFIG_FILE, L"Hide PV Watermark", L"Hide the watermark that's usually shown in PV viewing mode.", false, false), + new BooleanOption(L"no_error", PATCHES_SECTION, CONFIG_FILE, L"Disable Error Banner", L"Disable the error banner on the attract screen.", true, false), new BooleanOption(L"hardware_slider", PATCHES_SECTION, CONFIG_FILE, L"Use Hardware Slider", L"Enable this if using a real arcade slider.\n(set the slider to port COM11)", false, false), + new NumericOption(L"Enhanced_Stage_Manager", GRAPHICS_SECTION, CONFIG_FILE, L"Number of stages:", L"Set the number of stages (0 = default).", 0, 0, INT_MAX), + new BooleanOption(L"Enhanced_Stage_Manager_Encore", PATCHES_SECTION, CONFIG_FILE, L"Encore", L"Enable the Encore stage.", false, false), + new BooleanOption(L"skip", LAUNCHER_SECTION, CONFIG_FILE, L"Skip Launcher", L"Forces the launcher to be skipped, you can also use the --launch parameter instead of this.", false, false), new DropdownOption(L"status_icons", PATCHES_SECTION, CONFIG_FILE, L"Status Icons:", L"Set the state of card reader and network status icons.", 3, std::vector({ L"Default", L"Hidden", L"Error", L"OK", L"Partial OK" })), diff --git a/source-code/source/plugins/Patches/dllmain.cpp b/source-code/source/plugins/Patches/dllmain.cpp index 1a1d4ef..2283018 100644 --- a/source-code/source/plugins/Patches/dllmain.cpp +++ b/source-code/source/plugins/Patches/dllmain.cpp @@ -2,6 +2,10 @@ #include "vector" #include #include +#include +#include +#include +#include void InjectCode(void* address, const std::vector data); void ApplyPatches(); @@ -25,6 +29,30 @@ BOOL APIENTRY DllMain(HMODULE hModule, return TRUE; } +void patchMovieExt(std::string moviefile, void* address) +{ + bool isinmdata = 0; + for (int i = 0; i < 1000; i++) + { + std::stringstream ss; + ss << std::setw(3) << std::setfill('0') << i; + if (std::filesystem::exists("../mdata/M" + ss.str() + "/rom/movie/" + moviefile + ".mp4")) + { + isinmdata = 1; + //std::cout << "Movie " << moviefile << ".mp4 found in M" << ss.str() << std::endl; + break; + } + } + if (isinmdata || std::filesystem::exists("../rom/movie/" + moviefile + ".mp4")) + { + InjectCode(address, { 0x6D, 0x70, 0x34 }); + std::cout << "Movie " << moviefile << " patched to mp4\n"; + return; + } + //std::cout << "Movie " << moviefile << " NOT patched to mp4\n"; + return; +} + void ApplyPatches() { const struct { void* Address; std::vector Data; } patches[] = @@ -68,8 +96,6 @@ void ApplyPatches() { { (void*)0x0000000140136CFA,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } }, // enable module selector without use_card { (void*)0x00000001405C513B, { 0x01 } }, - // Show Freeplay instead - { (void*)0x00000001403BABEA, { 0x75 } }, // Force Hide IDs { (void*)0x00000001409A5918, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { (void*)0x00000001409A5928, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } @@ -81,22 +107,48 @@ void ApplyPatches() { auto nCursor = GetPrivateProfileIntW(L"patches", L"cursor", TRUE, CONFIG_FILE); auto nHideFreeplay = GetPrivateProfileIntW(L"patches", L"hide_freeplay", FALSE, CONFIG_FILE); + auto nFreeplay = GetPrivateProfileIntW(L"patches", L"freeplay", TRUE, CONFIG_FILE); + auto nPDLoaderText = GetPrivateProfileIntW(L"patches", L"pdloader_text", TRUE, CONFIG_FILE); auto nStatusIcons = GetPrivateProfileIntW(L"patches", L"status_icons", 0, CONFIG_FILE); auto nHidePVWatermark = GetPrivateProfileIntW(L"patches", L"hide_pv_watermark", FALSE, CONFIG_FILE); auto nNoPVUi = GetPrivateProfileIntW(L"patches", L"no_pv_ui", FALSE, CONFIG_FILE); auto nHideVolCtrl = GetPrivateProfileIntW(L"patches", L"hide_volume", FALSE, CONFIG_FILE); auto nNoLyrics = GetPrivateProfileIntW(L"patches", L"no_lyrics", FALSE, CONFIG_FILE); auto nNoMovies = GetPrivateProfileIntW(L"patches", L"no_movies", FALSE, CONFIG_FILE); + auto nMP4Movies = GetPrivateProfileIntW(L"patches", L"mp4_movies", FALSE, CONFIG_FILE); auto nNoError = GetPrivateProfileIntW(L"patches", L"no_error", FALSE, CONFIG_FILE); auto nEStageManager = GetPrivateProfileIntW(L"patches", L"enhanced_stage_manager", 0, CONFIG_FILE); auto nEStageManagerEncore = GetPrivateProfileIntW(L"patches", L"enhanced_stage_manager_encore", TRUE, CONFIG_FILE); auto nHardwareSlider = GetPrivateProfileIntW(L"patches", L"hardware_slider", FALSE, CONFIG_FILE); - // Hides the Freeplay text + // Replace the hardcoded videos with MP4s, if they exist + if (nMP4Movies) + { + patchMovieExt("adv_cm_01", (void*)0x00000001409A53CC); + patchMovieExt("adv_cm_02", (void*)0x00000001409A53E4); + patchMovieExt("adv_cm_03", (void*)0x00000001409A53FC); + patchMovieExt("adv_cfm_cm", (void*)0x00000001409C22CD); + patchMovieExt("adv_sega_cm", (void*)0x00000001409C22EE); + patchMovieExt("diva_adv02", (void*)0x00000001409FF455); + patchMovieExt("diva_adv", (void*)0x00000001409FF483); + } + // Hide "FREE PLAY" if (nHideFreeplay) { InjectCode((void*)0x00000001403BABEF, { 0x06, 0xB6 }); - printf("[Patches] Hide Freeplay enabled\n"); + printf("[Patches] Hide FREE PLAY/CREDIT(S) enabled\n"); + } + // Enable "FREE PLAY" mode + else if (nFreeplay) + { + InjectCode((void*)0x00000001403BABEA, { 0x75 }); + printf("[Patches] Show FREE PLAY instead of CREDIT(S)\n"); + + if (nPDLoaderText) + { + InjectCode((void*)0x00000001409F61F0, { 0x50, 0x44, 0x20, 0x4C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x20, 0x41, 0x4C, 0x50, 0x48, 0x41}); + printf("[Patches] Show PD Loader version\n"); + } } // Use GLUT_CURSOR_RIGHT_ARROW instead of GLUT_CURSOR_NONE if (nCursor)