From bc925fd514a6e917c526f617ae420d09aa74fdde Mon Sep 17 00:00:00 2001 From: nastys <@> Date: Wed, 29 Sep 2021 18:13:11 +0200 Subject: [PATCH] 2.6.2: maximum hand size 100X, pv customization toggle, fix typo in Credits, option for disabling custom refract/refrect res, version in-game --- source-code/data/plugins/config_template.bin | 4 +- .../source/plugins/Launcher/ConfigOption.h | 12 +- .../source/plugins/Launcher/framework.h | 7 +- source-code/source/plugins/Launcher/ui.h | 2 +- source-code/source/plugins/Launcher/ui.resx | 2 +- .../source/plugins/Patches/PatchApplier710.h | 305 +++++++++--------- .../source/plugins/Patches/framework.h | 1 + 7 files changed, 176 insertions(+), 157 deletions(-) diff --git a/source-code/data/plugins/config_template.bin b/source-code/data/plugins/config_template.bin index 1b3b29c..e6572fb 100644 --- a/source-code/data/plugins/config_template.bin +++ b/source-code/data/plugins/config_template.bin @@ -46,6 +46,8 @@ No_Scrolling_SFX=0 Enhanced_Stage_Manager=0 #Use encore stages or not Enhanced_Stage_Manager_Encore=1 +#Enable PV Customization below +Enable_PV_Customization=0 #Change the mouth animations -- 0=default, 1=force PDA, 2=force FT Force_Mouth=0 #Change the expressions -- 0=default, 1=force PDA, 2=force FT @@ -54,7 +56,7 @@ Force_Expressions=0 Force_Look=0 #Disable hand scaling No_Hand_Scaling=0 -#Default hand size -- 0-10000=default, 12200=PDA +#Default hand size -- 0-10000=default, 12200=PDA, 1000000=maximum Default_Hand_Size_uint=0 #Sing missed notes Sing_Missed=0 diff --git a/source-code/source/plugins/Launcher/ConfigOption.h b/source-code/source/plugins/Launcher/ConfigOption.h index 243560e..f91d95e 100644 --- a/source-code/source/plugins/Launcher/ConfigOption.h +++ b/source-code/source/plugins/Launcher/ConfigOption.h @@ -33,6 +33,7 @@ Panel^ MakePanel(int width, int height, std::vector &cfg, Too #define RESOPT_MATCH_WINDOW_TEXT "Match Window" #define RESOPT_MATCH_SCREEN_TEXT "Match Screen" +#define RESOPT_DEFAULT_TEXT "Default" ref class ComboboxValidation { @@ -81,7 +82,7 @@ public: { System::String^ text = cb->Text; - if (text == RESOPT_MATCH_WINDOW_TEXT || text == RESOPT_MATCH_SCREEN_TEXT) + if (text == RESOPT_MATCH_WINDOW_TEXT || text == RESOPT_MATCH_SCREEN_TEXT || text == RESOPT_DEFAULT_TEXT) return; cli::array^ digitsarray = gcnew cli::array{ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7', L'8', L'9' }; @@ -888,7 +889,8 @@ enum ResolutionOptionOpts { RESOPT_NONE, RESOPT_INCLUDE_MATCH_WINDOW, - RESOPT_INCLUDE_MATCH_SCREEN + RESOPT_INCLUDE_MATCH_SCREEN, + RESOPT_INCLUDE_DEFAULT }; class ResolutionOption : public ConfigOptionBase @@ -932,6 +934,8 @@ public: combobox->Items->Add(RESOPT_MATCH_WINDOW_TEXT); else if (_opts & RESOPT_INCLUDE_MATCH_SCREEN) combobox->Items->Add(RESOPT_MATCH_SCREEN_TEXT); + else if (_opts & RESOPT_INCLUDE_DEFAULT) + combobox->Items->Add(RESOPT_DEFAULT_TEXT); for (resolution& choice : _valueResolutions) { tempSysStr = Convert::ToInt32(choice.width).ToString() + L"x" + Convert::ToInt32(choice.height).ToString(); @@ -954,6 +958,8 @@ public: combobox->Text = RESOPT_MATCH_WINDOW_TEXT; else if (_opts & RESOPT_INCLUDE_MATCH_SCREEN) combobox->Text = RESOPT_MATCH_SCREEN_TEXT; + else if (_opts & RESOPT_INCLUDE_DEFAULT) + combobox->Text = RESOPT_DEFAULT_TEXT; } else { tempSysStr = Convert::ToInt32(width).ToString() + L"x" + Convert::ToInt32(height).ToString(); @@ -1014,7 +1020,7 @@ public: tempSysStr = ((ComboBox^)ComboBox::FromHandle(mainControlHandle))->Text; // Match window/screen -> -1x-1 - if (tempSysStr == RESOPT_MATCH_WINDOW_TEXT || tempSysStr == RESOPT_MATCH_SCREEN_TEXT) + if (tempSysStr == RESOPT_MATCH_WINDOW_TEXT || tempSysStr == RESOPT_MATCH_SCREEN_TEXT || tempSysStr == RESOPT_DEFAULT_TEXT) tempSysStr = "-1x-1"; resolutionArray = tempSysStr->Split('x'); diff --git a/source-code/source/plugins/Launcher/framework.h b/source-code/source/plugins/Launcher/framework.h index 57fbf73..1792539 100644 --- a/source-code/source/plugins/Launcher/framework.h +++ b/source-code/source/plugins/Launcher/framework.h @@ -172,8 +172,8 @@ ConfigOptionBase* graphicsArray[] = { new DropdownOption(L"MAG", GRAPHICS_SECTION, CONFIG_FILE, L"Filter:", L"Image filter.\n\nBilinear: default filter\nNearest-neighbour: sharpest, but blocky\nSharpen: sharp filter\nCone: smooth filter", 0, std::vector({ L"Bilinear", L"Nearest-neighbour", L"Sharpen", L"Cone" })), new BooleanOption(L"DOF", GRAPHICS_SECTION, CONFIG_FILE, L"Depth of Field", L"Blurs the background. Disable for better performance.", true, false), new BooleanOption(L"reflections", GRAPHICS_SECTION, CONFIG_FILE, L"Reflections", L"Enable or disable reflections.", true, false), - new ResolutionOption(L"reflect_res_width", L"reflect_res_height", GRAPHICS_SECTION, CONFIG_FILE, L"Reflection Res:", L"Sets the reflection buffer resolution (instead of 512x256).", resolution(512, 256), std::vector({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, (ResolutionOptionOpts)0), - new ResolutionOption(L"refract_res_width", L"refract_res_height", GRAPHICS_SECTION, CONFIG_FILE, L"Refraction Res:", L"Sets the refraction buffer resolution (instead of 512x256).", resolution(512, 256), std::vector({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, (ResolutionOptionOpts)0), + new ResolutionOption(L"reflect_res_width", L"reflect_res_height", GRAPHICS_SECTION, CONFIG_FILE, L"Reflection Res:", L"Sets the reflection buffer resolution (instead of 512x256).", resolution(-1, -1), std::vector({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, RESOPT_INCLUDE_DEFAULT), + new ResolutionOption(L"refract_res_width", L"refract_res_height", GRAPHICS_SECTION, CONFIG_FILE, L"Refraction Res:", L"Sets the refraction buffer resolution (instead of 512x256).", resolution(-1, -1), std::vector({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, RESOPT_INCLUDE_DEFAULT), new NumericOption(L"gamma", GRAPHICS_SECTION, CONFIG_FILE, L"Gamma:", L"Increase to darken shadows.\nSet to 125 for a console-like experience.\n\nDefault: 0 or 100", 100, 0, 200), new BooleanOption(L"shadows", GRAPHICS_SECTION, CONFIG_FILE, L"Shadows", L"Enable or disable shadows.", true, false), new BooleanOption(L"punchthrough", GRAPHICS_SECTION, CONFIG_FILE, L"Transparent Meshes", L"Show transparent meshes.", true, false), @@ -219,11 +219,12 @@ ConfigOptionBase* optionsArray[] = { new OptionMetaSpacer(8), new OptionMetaSectionLabel(L"PV Customization"), + new BooleanOption(L"enable_pv_customization", PATCHES_SECTION, CONFIG_FILE, L"Enable PV Customization", L"Enable the options below.", false, false), new DropdownOption(L"force_mouth", PATCHES_SECTION, CONFIG_FILE, L"Mouth Type:", L"Change the mouth animations.", 0, std::vector({ L"Default", L"Force PDA", L"Force FT" })), new DropdownOption(L"force_expressions", PATCHES_SECTION, CONFIG_FILE, L"Expression Type:", L"Change the expressions.", 0, std::vector({ L"Default", L"Force PDA", L"Force FT" })), new DropdownOption(L"force_look", PATCHES_SECTION, CONFIG_FILE, L"Look Type:", L"Change the look animations.", 0, std::vector({ L"Default", L"Force PDA", L"Force FT" })), new BooleanOption(L"no_hand_scaling", PATCHES_SECTION, CONFIG_FILE, L"No Hand Scaling", L"Disable hand scaling.", false, false), - new NumericOption(L"default_hand_size_uint", PATCHES_SECTION, CONFIG_FILE, L"Default Hand Size:", L"0-10000: default\n12200: PDA", 0, 0, INT_MAX), + new NumericOption(L"default_hand_size_uint", PATCHES_SECTION, CONFIG_FILE, L"Default Hand Size:", L"0-10000: default\n12200: PDA\n1000000: maximum", 0, 0, 1000000), new OptionMetaSeparator(), new OptionMetaSpacer(8), diff --git a/source-code/source/plugins/Launcher/ui.h b/source-code/source/plugins/Launcher/ui.h index 5d5d12e..06f311d 100644 --- a/source-code/source/plugins/Launcher/ui.h +++ b/source-code/source/plugins/Launcher/ui.h @@ -938,7 +938,7 @@ private: System::Windows::Forms::Button^ button_Wiki; this->MaximizeBox = false; this->Name = L"ui"; this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen; - this->Text = L"PD Launcher (2.6b)"; + this->Text = L"PD Launcher (2.6.2)"; this->TransparencyKey = System::Drawing::Color::Magenta; this->FormClosing += gcnew System::Windows::Forms::FormClosingEventHandler(this, &ui::Ui_FormClosing); this->FormClosed += gcnew System::Windows::Forms::FormClosedEventHandler(this, &ui::Ui_FormClosed); diff --git a/source-code/source/plugins/Launcher/ui.resx b/source-code/source/plugins/Launcher/ui.resx index 0a3b9ec..3eab281 100644 --- a/source-code/source/plugins/Launcher/ui.resx +++ b/source-code/source/plugins/Launcher/ui.resx @@ -120,7 +120,7 @@ PD Loader is intended for educational purposes only; not for piracy. Users should possess a legally-obtained dump of the game to use this software. -Please check your local laws/regulataions to verify the legality of tampering +Please check your local laws/regulations to verify the legality of tampering with and dumping data from protected arcade machine hardware. Project Contributors: diff --git a/source-code/source/plugins/Patches/PatchApplier710.h b/source-code/source/plugins/Patches/PatchApplier710.h index 969ee8a..0620f4e 100644 --- a/source-code/source/plugins/Patches/PatchApplier710.h +++ b/source-code/source/plugins/Patches/PatchApplier710.h @@ -166,7 +166,8 @@ class PatchApplier710 : public PatchApplier { if (nPDLoaderText && !nHideFreeplay) { - InjectCode((void*)0x00000001409F61F0, { 0x50, 0x44, 0x20, 0x4C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x20, 0x00 }); + InjectCode((void*)0x00000001409F61F0, { 0x50, 0x44, 0x20, 0x4C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x20, 0x00, 0x20, + '2', '.', '6', '.', '2'}); printf("[Patches] Show PD Loader text\n"); } } @@ -373,31 +374,121 @@ class PatchApplier710 : public PatchApplier { { InjectCode((void*)0x00000001405C84B3, { 0x90, 0x90, 0x90, 0x90, 0x90 }); } - // Disable hand scaling - if (nNoHandScaling) + if (nEnablePvCustomization) { - InjectCode((void*)0x0000000140120709, { 0xE9, 0x82, 0x0A, 0x00 }); - } - // Default hand size - if (nDefaultHandSize >= 10000) - { - printf("[Patches] Changing default hand size...\n"); - const float num = (float)nDefaultHandSize / 10000.0; - DWORD oldProtect; - float* addr1 = (float*)(0x140506B59); - float* addr2 = (float*)(0x140506B60); - /*float* addr3 = (float*)(0x140506B67); - float* addr4 = (float*)(0x140506B71);*/ - VirtualProtect(addr1, 4, PAGE_EXECUTE_READWRITE, &oldProtect); - VirtualProtect(addr2, 4, PAGE_EXECUTE_READWRITE, &oldProtect); - /*VirtualProtect(addr3, 4, PAGE_EXECUTE_READWRITE, &oldProtect); - VirtualProtect(addr4, 4, PAGE_EXECUTE_READWRITE, &oldProtect);*/ - *addr1 = *addr2 /*= *addr3 = *addr4*/ = num; - VirtualProtect(addr1, 4, oldProtect, nullptr); - VirtualProtect(addr2, 4, oldProtect, nullptr); - /*VirtualProtect(addr3, 4, oldProtect, nullptr); - VirtualProtect(addr4, 4, oldProtect, nullptr);*/ - printf("[Patches] New default hand size: %f\n", num); + // Disable hand scaling + if (nNoHandScaling) + { + InjectCode((void*)0x0000000140120709, { 0xE9, 0x82, 0x0A, 0x00 }); + } + // Default hand size + if (nDefaultHandSize >= 10000 && nDefaultHandSize <= 1000000) + { + printf("[Patches] Changing default hand size...\n"); + const float num = (float)nDefaultHandSize / 10000.0; + DWORD oldProtect; + float* addr1 = (float*)(0x140506B59); + float* addr2 = (float*)(0x140506B60); + /*float* addr3 = (float*)(0x140506B67); + float* addr4 = (float*)(0x140506B71);*/ + VirtualProtect(addr1, 4, PAGE_EXECUTE_READWRITE, &oldProtect); + VirtualProtect(addr2, 4, PAGE_EXECUTE_READWRITE, &oldProtect); + /*VirtualProtect(addr3, 4, PAGE_EXECUTE_READWRITE, &oldProtect); + VirtualProtect(addr4, 4, PAGE_EXECUTE_READWRITE, &oldProtect);*/ + *addr1 = *addr2 /*= *addr3 = *addr4*/ = num; + VirtualProtect(addr1, 4, oldProtect, nullptr); + VirtualProtect(addr2, 4, oldProtect, nullptr); + /*VirtualProtect(addr3, 4, oldProtect, nullptr); + VirtualProtect(addr4, 4, oldProtect, nullptr);*/ + printf("[Patches] New default hand size: %f\n", num); + } + // Force mouth animations + { + if (nForceMouth == 1) // PDA + { + printf("[Patches] Forcing PDA mouth...\n"); + int* mouth_table = (int*)(0x1409A1DC0); + DWORD oldProtect; + VirtualProtect(mouth_table, 44, PAGE_EXECUTE_READWRITE, &oldProtect); + for (int i = 0; i < 11; i++) + { + mouth_table[i]++; + } + VirtualProtect(mouth_table, 44, oldProtect, nullptr); + printf("[Patches] PDA mouth forced\n"); + } + else if (nForceMouth == 2) // FT + { + printf("[Patches] Forcing FT mouth...\n"); + int* mouth_table_oldid = (int*)(0x1409A1E1C); + DWORD oldProtect; + VirtualProtect(mouth_table_oldid, 44, PAGE_EXECUTE_READWRITE, &oldProtect); + for (int i = 0; i < 11; i++) + { + mouth_table_oldid[i]--; + } + VirtualProtect(mouth_table_oldid, 44, oldProtect, nullptr); + printf("[Patches] FT mouth forced\n"); + } + } + // Force expressions + { + if (nForceExpressions == 1) // PDA + { + printf("[Patches] Forcing PDA expressions...\n"); + int* exp_table = (int*)(0x140A21900); + DWORD oldProtect; + VirtualProtect(exp_table, 104, PAGE_EXECUTE_READWRITE, &oldProtect); + for (int i = 0; i < 26; i++) + { + exp_table[i] += 2; + } + VirtualProtect(exp_table, 104, oldProtect, nullptr); + printf("[Patches] PDA expressions forced\n"); + } + else if (nForceExpressions == 2) // FT + { + printf("[Patches] Forcing FT expressions...\n"); + int* exp_table_oldid = (int*)(0x140A219D0); + DWORD oldProtect; + VirtualProtect(exp_table_oldid, 104, PAGE_EXECUTE_READWRITE, &oldProtect); + for (int i = 0; i < 26; i++) + { + exp_table_oldid[i] -= 2; + } + VirtualProtect(exp_table_oldid, 104, oldProtect, nullptr); + printf("[Patches] FT expressions forced\n"); + } + } + // Force look animations + { + if (nForceLook == 1) // PDA + { + printf("[Patches] Forcing PDA look...\n"); + int* look_table = (int*)(0x1409A1D70); + DWORD oldProtect; + VirtualProtect(look_table, 36, PAGE_EXECUTE_READWRITE, &oldProtect); + for (int i = 0; i < 9; i++) + { + look_table[i]++; + } + VirtualProtect(look_table, 36, oldProtect, nullptr); + printf("[Patches] PDA look forced\n"); + } + else if (nForceLook == 2) // FT + { + printf("[Patches] Forcing FT look...\n"); + int* look_table_oldid = (int*)(0x1409A1D9C); + DWORD oldProtect; + VirtualProtect(look_table_oldid, 36, PAGE_EXECUTE_READWRITE, &oldProtect); + for (int i = 0; i < 9; i++) + { + look_table_oldid[i]--; + } + VirtualProtect(look_table_oldid, 36, oldProtect, nullptr); + printf("[Patches] FT look forced\n"); + } + } } // Sing missed notes if (nSingMissed) @@ -406,93 +497,6 @@ class PatchApplier710 : public PatchApplier { // Breaks border: // InjectCode((void*)0x140109096, { 0xEB }); } - // Force mouth animations - { - if (nForceMouth == 1) // PDA - { - printf("[Patches] Forcing PDA mouth...\n"); - int* mouth_table = (int*)(0x1409A1DC0); - DWORD oldProtect; - VirtualProtect(mouth_table, 44, PAGE_EXECUTE_READWRITE, &oldProtect); - for (int i = 0; i < 11; i++) - { - mouth_table[i]++; - } - VirtualProtect(mouth_table, 44, oldProtect, nullptr); - printf("[Patches] PDA mouth forced\n"); - } - else if (nForceMouth == 2) // FT - { - printf("[Patches] Forcing FT mouth...\n"); - int* mouth_table_oldid = (int*)(0x1409A1E1C); - DWORD oldProtect; - VirtualProtect(mouth_table_oldid, 44, PAGE_EXECUTE_READWRITE, &oldProtect); - for (int i = 0; i < 11; i++) - { - mouth_table_oldid[i]--; - } - VirtualProtect(mouth_table_oldid, 44, oldProtect, nullptr); - printf("[Patches] FT mouth forced\n"); - } - } - // Force expressions - { - if (nForceExpressions == 1) // PDA - { - printf("[Patches] Forcing PDA expressions...\n"); - int* exp_table = (int*)(0x140A21900); - DWORD oldProtect; - VirtualProtect(exp_table, 104, PAGE_EXECUTE_READWRITE, &oldProtect); - for (int i = 0; i < 26; i++) - { - exp_table[i] += 2; - } - VirtualProtect(exp_table, 104, oldProtect, nullptr); - printf("[Patches] PDA expressions forced\n"); - } - else if (nForceExpressions == 2) // FT - { - printf("[Patches] Forcing FT expressions...\n"); - int* exp_table_oldid = (int*)(0x140A219D0); - DWORD oldProtect; - VirtualProtect(exp_table_oldid, 104, PAGE_EXECUTE_READWRITE, &oldProtect); - for (int i = 0; i < 26; i++) - { - exp_table_oldid[i] -= 2; - } - VirtualProtect(exp_table_oldid, 104, oldProtect, nullptr); - printf("[Patches] FT expressions forced\n"); - } - } - // Force look animations - { - if (nForceLook == 1) // PDA - { - printf("[Patches] Forcing PDA look...\n"); - int* look_table = (int*)(0x1409A1D70); - DWORD oldProtect; - VirtualProtect(look_table, 36, PAGE_EXECUTE_READWRITE, &oldProtect); - for (int i = 0; i < 9; i++) - { - look_table[i]++; - } - VirtualProtect(look_table, 36, oldProtect, nullptr); - printf("[Patches] PDA look forced\n"); - } - else if (nForceLook == 2) // FT - { - printf("[Patches] Forcing FT look...\n"); - int* look_table_oldid = (int*)(0x1409A1D9C); - DWORD oldProtect; - VirtualProtect(look_table_oldid, 36, PAGE_EXECUTE_READWRITE, &oldProtect); - for (int i = 0; i < 9; i++) - { - look_table_oldid[i]--; - } - VirtualProtect(look_table_oldid, 36, oldProtect, nullptr); - printf("[Patches] FT look forced\n"); - } - } // NPR1 { if (nNpr1 == 1) // force on @@ -645,48 +649,53 @@ class PatchApplier710 : public PatchApplier { } // patch refract and reflect buffer sizes - // no need to really check anything before injecting, because reinjecting defaults is fine - InjectCode((void*)(0x140a24424), std::vector((uint8_t*)&nRefractResWidth, (uint8_t*)((int64_t)&nRefractResWidth + 4))); - InjectCode((void*)(0x140a24428), std::vector((uint8_t*)&nRefractResHeight, (uint8_t*)((int64_t)&nRefractResHeight + 4))); - InjectCode((void*)(0x140a2443c), std::vector((uint8_t*)&nReflectResWidth, (uint8_t*)((int64_t)&nReflectResWidth + 4))); - InjectCode((void*)(0x140a24440), std::vector((uint8_t*)&nReflectResHeight, (uint8_t*)((int64_t)&nReflectResHeight + 4))); - // for large reflect resolutions, adjust blur effect amount to not lose the effect - // scaling is based on a 1024 width instead of the original 512px - // because we don't wanna make it too blurry when just being used to smooth jaggies - if (nReflectResWidth >= 2048) + if (nRefractResWidth > 0 && nRefractResHeight > 0) { - int blurAmount = nReflectResWidth / 1024; + InjectCode((void*)(0x140a24424), std::vector((uint8_t*)&nRefractResWidth, (uint8_t*)((int64_t)&nRefractResWidth + 4))); + InjectCode((void*)(0x140a24428), std::vector((uint8_t*)&nRefractResHeight, (uint8_t*)((int64_t)&nRefractResHeight + 4))); + } + if (nReflectResWidth > 0 && nReflectResHeight > 0) + { + InjectCode((void*)(0x140a2443c), std::vector((uint8_t*)&nReflectResWidth, (uint8_t*)((int64_t)&nReflectResWidth + 4))); + InjectCode((void*)(0x140a24440), std::vector((uint8_t*)&nReflectResHeight, (uint8_t*)((int64_t)&nReflectResHeight + 4))); + // for large reflect resolutions, adjust blur effect amount to not lose the effect + // scaling is based on a 1024 width instead of the original 512px + // because we don't wanna make it too blurry when just being used to smooth jaggies + if (nReflectResWidth >= 2048) + { + int blurAmount = nReflectResWidth / 1024; - // multiply blur setting - // ECX has blur amount, EDX has blur type - InjectCode((void*)(0x140503000), { 0x89, 0x15, 0x3a, 0xa3, 0xca, 0x00 }); // MOV dword ptr [0x1411ad340], EDX - InjectCode((void*)(0x140503006), { 0xb8 }); // MOV EAX, blurAmount - InjectCode((void*)(0x140503007), std::vector((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4))); - InjectCode((void*)(0x14050300b), { 0xf7, 0xe1 }); // MUL (EDX:EAX,)ECX - InjectCode((void*)(0x14050300d), { 0xeb, 0x09 }); // JMP 0x140503018 - InjectCode((void*)(0x140503018), { 0x89, 0x05, 0x1e, 0xa3, 0xca, 0x00 }); // MOV dword ptr [0x1411ad33c], EAX - InjectCode((void*)(0x14050301e), { 0xc3 }); // RET + // multiply blur setting + // ECX has blur amount, EDX has blur type + InjectCode((void*)(0x140503000), { 0x89, 0x15, 0x3a, 0xa3, 0xca, 0x00 }); // MOV dword ptr [0x1411ad340], EDX + InjectCode((void*)(0x140503006), { 0xb8 }); // MOV EAX, blurAmount + InjectCode((void*)(0x140503007), std::vector((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4))); + InjectCode((void*)(0x14050300b), { 0xf7, 0xe1 }); // MUL (EDX:EAX,)ECX + InjectCode((void*)(0x14050300d), { 0xeb, 0x09 }); // JMP 0x140503018 + InjectCode((void*)(0x140503018), { 0x89, 0x05, 0x1e, 0xa3, 0xca, 0x00 }); // MOV dword ptr [0x1411ad33c], EAX + InjectCode((void*)(0x14050301e), { 0xc3 }); // RET - // divide dwgui blur amount getting - // RDX gets type, RCX gets amount - InjectCode((void*)(0x140502910), { 0x48, 0x85, 0xd2 }); // TEST RDX, RDX - InjectCode((void*)(0x140502913), { 0x74, 0x08 }); // JZ 0x14050291d - InjectCode((void*)(0x140502915), { 0x8b, 0x05, 0x25, 0xaa, 0xca, 0x00 }); // MOV EAX, dword ptr [0x1411ad340] - InjectCode((void*)(0x14050291b), { 0x89, 0x02 }); // MOV dword ptr [RDX], EAX + // divide dwgui blur amount getting + // RDX gets type, RCX gets amount + InjectCode((void*)(0x140502910), { 0x48, 0x85, 0xd2 }); // TEST RDX, RDX + InjectCode((void*)(0x140502913), { 0x74, 0x08 }); // JZ 0x14050291d + InjectCode((void*)(0x140502915), { 0x8b, 0x05, 0x25, 0xaa, 0xca, 0x00 }); // MOV EAX, dword ptr [0x1411ad340] + InjectCode((void*)(0x14050291b), { 0x89, 0x02 }); // MOV dword ptr [RDX], EAX - InjectCode((void*)(0x14050291d), { 0x48, 0x85, 0xc9 }); // TEST RCX, RCX - InjectCode((void*)(0x140502920), { 0x74, 0x2d }); // JZ 0x14050294f - InjectCode((void*)(0x140502922), { 0x8b, 0x05, 0x14, 0xaa, 0xca, 0x00 }); // MOV EAX, dword ptr [0x1411ad33c] + InjectCode((void*)(0x14050291d), { 0x48, 0x85, 0xc9 }); // TEST RCX, RCX + InjectCode((void*)(0x140502920), { 0x74, 0x2d }); // JZ 0x14050294f + InjectCode((void*)(0x140502922), { 0x8b, 0x05, 0x14, 0xaa, 0xca, 0x00 }); // MOV EAX, dword ptr [0x1411ad33c] - InjectCode((void*)(0x140502928), { 0xeb, 0x0d }); // JMP 0x140502937 - InjectCode((void*)(0x140502937), { 0x49, 0xc7, 0xc0 }); // MOV R8, blurAmount - InjectCode((void*)(0x14050293a), std::vector((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4))); - InjectCode((void*)(0x14050293e), { 0xeb, 0x08 }); // JMP 0x140502948 - InjectCode((void*)(0x140502948), { 0x31, 0xd2 }); // XOR EDX,EDX - InjectCode((void*)(0x14050294a), { 0x49, 0xf7, 0xf0 }); // DIV (EDX:EAX,)R8 + InjectCode((void*)(0x140502928), { 0xeb, 0x0d }); // JMP 0x140502937 + InjectCode((void*)(0x140502937), { 0x49, 0xc7, 0xc0 }); // MOV R8, blurAmount + InjectCode((void*)(0x14050293a), std::vector((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4))); + InjectCode((void*)(0x14050293e), { 0xeb, 0x08 }); // JMP 0x140502948 + InjectCode((void*)(0x140502948), { 0x31, 0xd2 }); // XOR EDX,EDX + InjectCode((void*)(0x14050294a), { 0x49, 0xf7, 0xf0 }); // DIV (EDX:EAX,)R8 - InjectCode((void*)(0x14050294d), { 0x89, 0x01 }); // MOV dword ptr [RCX], EAX - InjectCode((void*)(0x14050294f), { 0xc3 }); // RET + InjectCode((void*)(0x14050294d), { 0x89, 0x01 }); // MOV dword ptr [RCX], EAX + InjectCode((void*)(0x14050294f), { 0xc3 }); // RET + } } // lag compensation diff --git a/source-code/source/plugins/Patches/framework.h b/source-code/source/plugins/Patches/framework.h index b5a510c..86bccb3 100644 --- a/source-code/source/plugins/Patches/framework.h +++ b/source-code/source/plugins/Patches/framework.h @@ -109,6 +109,7 @@ auto nStereo = GetPrivateProfileIntW(L"patches", L"stereo", TRUE, CONFIG_FILE); auto nCustomPatches = GetPrivateProfileIntW(L"patches", L"custom_patches", TRUE, CONFIG_FILE); auto nQuickStart = GetPrivateProfileIntW(L"patches", L"quick_start", 1, CONFIG_FILE); auto nNoScrollingSfx = GetPrivateProfileIntW(L"patches", L"no_scrolling_sfx", FALSE, CONFIG_FILE); +auto nEnablePvCustomization = GetPrivateProfileIntW(L"patches", L"enable_pv_customization", FALSE, CONFIG_FILE); auto nNoHandScaling = GetPrivateProfileIntW(L"patches", L"no_hand_scaling", FALSE, CONFIG_FILE); auto nDefaultHandSize = GetPrivateProfileIntW(L"patches", L"default_hand_size_uint", 0, CONFIG_FILE); auto nSingMissed = GetPrivateProfileIntW(L"patches", L"sing_missed", FALSE, CONFIG_FILE);