25 Commits
Author SHA1 Message Date
nastys ef43d22686 Auto Databank: support Extra Extreme 2025-05-01 12:52:26 +02:00
nastys 6ba220cc29 Add Blackwell and Volta info 2025-05-01 12:50:14 +02:00
nastys b20fc255dc Optimize Auto Databank code 2025-03-05 21:49:41 +01:00
nastys cf26061123 Auto Databank, hide status icons checkbox 2025-03-05 20:11:49 +01:00
korenkonder 3d422e4743 [ShaderPatch] Fix for Toon_Lines_Improve 2025-01-11 22:50:53 +01:00
nastys a4216507d6 [ShaderPatch] GB = NVIDIA Blackwell 2025-01-08 20:18:47 +01:00
nastys 4fc2af2878 Update reflection resolution options 2024-09-23 08:38:30 +02:00
hiki8man 87d453081b Update DualShock4.h
add HORI HATSUNE MIKU 39S CONTROLLER guid to suooprt switch hori controller
2024-08-04 14:26:11 +02:00
nastys 158c90ef84 Merge pull request #17 from korenkonder/dev
[TLAC]: Pause patches. Fix of stuff moving 1 frame after pause
2024-05-01 21:46:59 +02:00
korenkonder a766413a5d [TLAC]: Pause patches. Fix of stuff moving 1 frame after pause 2024-05-01 22:28:30 +03:00
nastys 430e650d0d Improve GPU checks 2024-04-23 19:08:28 +02:00
nastys be29f090f3 Update and move DivaGL plugin conflict checks to launcher 2024-04-10 20:00:12 +02:00
nastys c6ceb61636 Attempt to fix DivaGL detection code crashing 2024-03-30 22:14:38 +01:00
nastys 232ac31190 DivaGL, glut32, and conflict detection in Launcher 2024-03-30 21:07:17 +01:00
nastys eb6964d0b9 Launcher DivaGL detection fixes 2024-03-29 05:40:08 +01:00
nastys b6fc62bbf1 Change DivaGL detection method, fix non_nv_name 2024-03-26 20:16:40 +01:00
nastys 2c10f27ab0 DivaGL detection, Ada Lovelace "support" 2024-03-26 00:25:30 +01:00
nastys 360305357b Fix lag compensation triggering ConfigChanged every time 2024-03-20 22:37:47 +01:00
nastys 26c6dc76c7 Merge pull request #16 from korenkonder/dev
Fixed -wqhd behaviour for 7.10 and restored old behaviour for 6.00
2024-03-19 14:27:08 +01:00
korenkonder b746ddf001 Fixed -wqhd behaviour for 7.10 and restored old behaviour for 6.00 2024-03-19 16:23:03 +03:00
nastys 4cfd925af4 Merge pull request #15 from korenkonder/dev
Fixed Auth3D not appearing when disabling Reflections
2024-03-19 13:38:27 +01:00
korenkonder d70e20496a Fixed Auth3D not appearing when disabling Reflections 2024-03-19 15:35:09 +03:00
somewhatlurker 0b7083edad new hook for UpdateDraw2D (should be compatible with DivaGL) 2024-02-04 01:21:18 +11:00
nastys 60958cc3c1 Cleanup 2024-02-03 13:48:22 +01:00
nastys 3b6bd03c49 Render.dva: don't force WQHD 2024-02-03 13:46:52 +01:00
27 changed files with 1088 additions and 443 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 17
VisualStudioVersion = 16.0.28922.388 VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PD-Loader", "source\PD-Loader\PD-Loader.vcxproj", "{CA479467-D518-46A2-AC86-3098ADA99FE5}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PD-Loader", "source\PD-Loader\PD-Loader.vcxproj", "{CA479467-D518-46A2-AC86-3098ADA99FE5}"
EndProject EndProject
+16 -12
View File
@@ -25,25 +25,28 @@ Toon_Hair_Improve=0
Toon_Hair_Improve_Val1=1.25 Toon_Hair_Improve_Val1=1.25
# Lyb's toon shader improvements (24 sept 2019) # Lyb's toon shader improvements (24 sept 2019)
# Fixes by korenkonder (11 jan 2025)
# Toon_Lines_Improve: Adjusts toon shader outlines # Toon_Lines_Improve: Adjusts toon shader outlines
Toon_Lines_Improve=0 Toon_Lines_Improve=0
# ??? # Skin Shadow Strength
Toon_Lines_Improve_Val1=0.75 Toon_Lines_Improve_Val1=0.05
# Thickness Multiplier(?) # Skin Outline Strength
Toon_Lines_Improve_Val2=0.75 Toon_Lines_Improve_Val2=0.9
# Thickness Offset(?) # Outline Strength Multiplier
Toon_Lines_Improve_Val3=0.75 Toon_Lines_Improve_Val3=0.7
# Outline Strength Offset
Toon_Lines_Improve_Val4=0.25
[Patches] [Patches]
# Compatibility patches: # Compatibility patches:
# Star Story (and etc.) stage corruption (Maxwell+) # Star Story (and etc.) stage corruption (Maxwell+)
blinn_per_vert\.0010010[23]00[01]\.fp=arch:GA,TU,GP,GV,GM||cfg:compat||from:TEX tex_col, a_tex_color0, texture\[0\], 2D; ALIAS||to:TEX tex_col, a_tex_color0, texture[0], 2D; MUL tex_col, 1, tex_col; ALIAS blinn_per_vert\.0010010[23]00[01]\.fp=arch:GB,AD,GA,GV,TU,GP,GM||cfg:compat||from:TEX tex_col, a_tex_color0, texture\[0\], 2D; ALIAS||to:TEX tex_col, a_tex_color0, texture[0], 2D; MUL tex_col, 1, tex_col; ALIAS
# Turing shading lines (new patch by samyuu, hopefully ported to here correctly) # Turing shading lines (new patch by samyuu, hopefully ported to here correctly)
.*=arch:GA,TU||cfg:compat||from:SHORT ||to: .*=arch:GB,AD,GA,GV,TU||cfg:compat||from:SHORT ||to:
# Turing NPR cloth noise # Turing NPR cloth noise
cloth_npr1.*=arch:GA,TU||cfg:compat||from:SSG _tmp0.yw, ybr.xxzz;||to:TEMP _tmpForSSG; SGE _tmpForSSG.xz, ybr.xxzz, 0; SUB _tmpForSSG.xz, _tmpForSSG.xxzz, 1; SGT _tmpForSSG.yw, ybr.xxzz, 0; ADD _tmp0.yw, _tmpForSSG.xxzz, _tmpForSSG.yyww; cloth_npr1.*=arch:GB,AD,GA,GV,TU||cfg:compat||from:SSG _tmp0.yw, ybr.xxzz;||to:TEMP _tmpForSSG; SGE _tmpForSSG.xz, ybr.xxzz, 0; SUB _tmpForSSG.xz, _tmpForSSG.xxzz, 1; SGT _tmpForSSG.yw, ybr.xxzz, 0; ADD _tmp0.yw, _tmpForSSG.xxzz, _tmpForSSG.yyww;
# Turing auto-exposure fix by samyuu # Turing auto-exposure fix by samyuu
stage_blinn.*\.fp=arch:GA,TU||cfg:compat||from:NRMH normal, a_normal;||to:NRM normal, a_normal; stage_blinn.*\.fp=arch:GB,AD,GA,GV,TU||cfg:compat||from:NRMH normal, a_normal;||to:NRM normal, a_normal;
# Lyb's toon shader improvements: # Lyb's toon shader improvements:
cloth_npr1.*=cfg:toon_improve||from:MAD tmp.y, lc.z, 1.2, -0.5;||to:MAD tmp.y, lc.z, <val1>, <val2>; cloth_npr1.*=cfg:toon_improve||from:MAD tmp.y, lc.z, 1.2, -0.5;||to:MAD tmp.y, lc.z, <val1>, <val2>;
@@ -51,8 +54,9 @@ skin_default.*=cfg:toon_improve||from:MAD diff.xyz, spec, spec_ratio, diff;||to:
.*eye.*=cfg:toon_eyes_improve||from:ADD o_color_f0.w, diff.x, diff.y;||to: .*eye.*=cfg:toon_eyes_improve||from:ADD o_color_f0.w, diff.x, diff.y;||to:
.*eye.*=cfg:toon_eyes_improve||from:ADD result.color.w, diff.x, diff.y;||to: .*eye.*=cfg:toon_eyes_improve||from:ADD result.color.w, diff.x, diff.y;||to:
hair_npr1.*=cfg:toon_hair_improve||from:MUL spec.x, tmp.x, 0.7;||to:MUL spec.x, tmp.x, 0.7; MUL diff, diff, <val1>; hair_npr1.*=cfg:toon_hair_improve||from:MUL spec.x, tmp.x, 0.7;||to:MUL spec.x, tmp.x, 0.7; MUL diff, diff, <val1>;
tone_map_npr1.*=cfg:toon_lines_improve||from:MUL density.y, density.y, 0.25;||to:MUL density.y, density.y, <val1>; tone_map_npr1.*=cfg:toon_lines_improve||from:MUL density.y, density.y, 0.05;||to:MUL density.y, density.y, <val1>;
tone_map_npr1.*=cfg:toon_lines_improve||from:MAD density.w, density.x, 0.7, 0.25;||to:MAD density.w, density.x, <val2>, <val3>; tone_map_npr1.*=cfg:toon_lines_improve||from:MUL density.y, density.y, 0.9;||to:MUL density.y, density.y, <val2>;
tone_map_npr1.*=cfg:toon_lines_improve||from:MAD density.w, density.x, 0.7, 0.25;||to:MAD density.w, density.x, <val3>, <val4>;
# Intel related patches # Intel related patches
(?:movie|sprite|imgfilter).*=cfg:intel||from:; ||to:;\n (?:movie|sprite|imgfilter).*=cfg:intel||from:; ||to:;\n
@@ -22,14 +22,17 @@ Toon_Hair_Improve=0
Toon_Hair_Improve_Val1=1.25 Toon_Hair_Improve_Val1=1.25
# Lyb's toon shader improvements (24 sept 2019) # Lyb's toon shader improvements (24 sept 2019)
# Fixes by korenkonder (11 jan 2025)
# Toon_Lines_Improve: Adjusts toon shader outlines # Toon_Lines_Improve: Adjusts toon shader outlines
Toon_Lines_Improve=0 Toon_Lines_Improve=0
# ??? # Skin Shadow Strength
Toon_Lines_Improve_Val1=0.75 Toon_Lines_Improve_Val1=0.05
# Thickness Multiplier(?) # Skin Outline Strength
Toon_Lines_Improve_Val2=0.75 Toon_Lines_Improve_Val2=0.9
# Thickness Offset(?) # Outline Strength Multiplier
Toon_Lines_Improve_Val3=0.75 Toon_Lines_Improve_Val3=0.7
# Outline Strength Offset
Toon_Lines_Improve_Val4=0.25
# Debug patches: # Debug patches:
# Nametags # Nametags
+5 -1
View File
@@ -7,7 +7,7 @@
Enable=1 Enable=1
[GPU] [GPU]
# Force GPU model -- -1=auto, 0=Kepler, 1=Maxwell/Pascal, 2=Turing, 3=Ampere # Force GPU model -- -1=auto, 0=Kepler, 1=Maxwell/Pascal, 2=Turing, 3=Ampere, 4=Ada Lovelace, 5=Blackwell
Model=-1 Model=-1
[Launcher] [Launcher]
@@ -35,6 +35,8 @@ Stereo=1
Quick_Start=0 Quick_Start=0
#Disable the scrolling sound effect #Disable the scrolling sound effect
No_Scrolling_SFX=0 No_Scrolling_SFX=0
#Automatically generate databank for missing entries and allow multiple PVList files to be used
Auto_Databank=1
#Enhanced Stage Manager (sets a custom number of stages; "stage_manager" should be disabled in "components.ini") #Enhanced Stage Manager (sets a custom number of stages; "stage_manager" should be disabled in "components.ini")
#Number of stages (0 = disabled) #Number of stages (0 = disabled)
Enhanced_Stage_Manager=0 Enhanced_Stage_Manager=0
@@ -60,6 +62,8 @@ Hide_Volume=0
No_PV_UI=0 No_PV_UI=0
#Hide the watermark that's usually shown in PV viewing mode #Hide the watermark that's usually shown in PV viewing mode
Hide_PV_Watermark=0 Hide_PV_Watermark=0
#Hide the top-right corner status icons
Hide_Status_Icons=0
#Set the card reader and network status icons -- 0=default, 1=hidden, 2=error, 3=OK, 4=partial OK #Set the card reader and network status icons -- 0=default, 1=hidden, 2=error, 3=OK, 4=partial OK
Status_Icons=0 Status_Icons=0
#Disable showing lyrics #Disable showing lyrics
+9 -3
View File
@@ -34,9 +34,9 @@ namespace GPUModel
// note that the used GL context may differ // note that the used GL context may differ
std::string getGpuName() std::string getGpuName()
{ {
// detected model can be overridden -- 0: Kepler, 1: Maxwell, 2: Turing, 3: Ampere // detected model can be overridden -- 0: Kepler, 1: Maxwell, 2: Turing, 3: Ampere, 4: Ada Lovelace, 5: Blackwell
int nGPUModel = GetPrivateProfileIntW(L"gpu", L"model", -1, CONFIG_FILE); int nGPUModel = GetPrivateProfileIntW(L"gpu", L"model", -1, CONFIG_FILE);
if (nGPUModel >= 0 && nGPUModel <= 3) if (nGPUModel >= 0 && nGPUModel <= 4)
{ {
std::string arch; std::string arch;
switch (nGPUModel) switch (nGPUModel)
@@ -53,6 +53,12 @@ namespace GPUModel
case 3: case 3:
arch = "GA000"; arch = "GA000";
break; break;
case 4:
arch = "AD000";
break;
case 5:
arch = "GB000";
break;
} }
printf("[GPUModel] GPU Model override: %s\n", arch.c_str()); printf("[GPUModel] GPU Model override: %s\n", arch.c_str());
@@ -65,7 +71,7 @@ namespace GPUModel
//DWORD dwAttrib = GetFileAttributesW(L"amdgfxinfo64.dll"); //DWORD dwAttrib = GetFileAttributesW(L"amdgfxinfo64.dll");
//if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) //if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
struct stat buffer; // for some reason winapi version wasn't working struct stat buffer; // for some reason winapi version wasn't working
if (stat("amdgfxinfo64.dll", &buffer) == 0); if (stat("amdgfxinfo64.dll", &buffer) == 0)
{ {
non_nv_name = "AMD"; non_nv_name = "AMD";
} }
@@ -609,6 +609,7 @@ public:
int _defaultVal; int _defaultVal;
int _indexOffset; int _indexOffset;
std::vector<LPCWSTR> _valueStrings; std::vector<LPCWSTR> _valueStrings;
System::IntPtr labelHandle;
DropdownOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, int defaultVal, std::vector<LPCWSTR> valueStrings, int indexOffset=0) DropdownOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, int defaultVal, std::vector<LPCWSTR> valueStrings, int indexOffset=0)
{ {
@@ -628,6 +629,7 @@ public:
ComboBox^ combobox = gcnew ComboBox(); ComboBox^ combobox = gcnew ComboBox();
label->Text = gcnew String(_friendlyName); label->Text = gcnew String(_friendlyName);
labelHandle = label->Handle;
label->Left = left; label->Left = left;
label->Top = top + 3; label->Top = top + 3;
label->Width = Col1Width; label->Width = Col1Width;
@@ -1087,9 +1089,10 @@ class PluginOption : public ConfigOptionBase
{ {
public: public:
bool _defaultVal; bool _defaultVal;
std::wstring _builddate;
std::vector<ConfigOptionBase*> _configopts; std::vector<ConfigOptionBase*> _configopts;
PluginOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, bool defaultVal, std::vector<ConfigOptionBase*> configopts) PluginOption(LPCWSTR iniVarName, LPCWSTR iniSectionName, LPCWSTR iniFilePath, LPCWSTR friendlyName, LPCWSTR description, bool defaultVal, std::vector<ConfigOptionBase*> configopts, std::wstring builddate = L"Unknown")
{ {
_iniVarName = iniVarName; _iniVarName = iniVarName;
_iniSectionName = iniSectionName; _iniSectionName = iniSectionName;
@@ -1098,6 +1101,7 @@ public:
_description = description; _description = description;
_defaultVal = defaultVal; _defaultVal = defaultVal;
_configopts = configopts; _configopts = configopts;
_builddate = builddate;
} }
virtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip) virtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)
@@ -166,13 +166,13 @@ ConfigOptionBase* internalResolutionArray[] = {
}; };
ConfigOptionBase* graphicsArray[] = { ConfigOptionBase* graphicsArray[] = {
new DropdownOption(L"model", L"GPU", CONFIG_FILE, L"NVIDIA GPU:", L"Select your NVIDIA GPU's architecture to apply the necessary workarounds.\n\nNOTE: Automatic detection does not currently work on GNU/Linux.", -1, std::vector<LPCWSTR>({ L"Automatic", L"Kepler", L"Maxwell/Pascal", L"Turing", L"Ampere" }), -1), new DropdownOption(L"model", L"GPU", CONFIG_FILE, L"Nvidia GPU:", L"Select your Nvidia GPU's architecture to apply the necessary workarounds.\n\nNOTE: Automatic detection does not currently work on GNU/Linux.", -1, std::vector<LPCWSTR>({ L"Automatic", L"Kepler", L"Maxwell/Pascal", L"Turing", L"Ampere", L"Ada Lovelace", L"Blackwell or newer"}), -1),
new BooleanOption(L"TAA", GRAPHICS_SECTION, CONFIG_FILE, L"TAA", L"Temporal Anti-Aliasing", true, false), 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"MLAA", GRAPHICS_SECTION, CONFIG_FILE, L"MLAA", L"Morphological Anti-Aliasing", true, false),
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<LPCWSTR>({ L"Bilinear", L"Nearest-neighbour", L"Sharpen", L"Cone" })), 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<LPCWSTR>({ 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"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 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>({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, RESOPT_NONE), 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>({resolution(256,256), resolution(512,256), resolution(512,512), resolution(640,480), resolution(854,480), resolution(960,540), resolution(1280,720), resolution(1366,768), resolution(1600,900), resolution(1920,1080), resolution(2560,1440), resolution(3200,1800), resolution(3840,2160), resolution(5120,2880), resolution(7680,4320)}), true, RESOPT_NONE),
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>({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, RESOPT_NONE), 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>({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, RESOPT_NONE),
new BooleanOption(L"shadows", GRAPHICS_SECTION, CONFIG_FILE, L"Shadows", L"Enable or disable shadows.", true, false), new BooleanOption(L"shadows", GRAPHICS_SECTION, CONFIG_FILE, L"Shadows", L"Enable or disable shadows.", true, false),
new ResolutionOption(L"shadow_res_width", L"shadow_res_height", GRAPHICS_SECTION, CONFIG_FILE, L"Shadow Res:", L"Sets the shadow buffer resolution (instead of 2048x2048).", resolution(2048, 2048), std::vector<resolution>({resolution(256,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096), resolution(8192,8192)}), true, RESOPT_NONE), new ResolutionOption(L"shadow_res_width", L"shadow_res_height", GRAPHICS_SECTION, CONFIG_FILE, L"Shadow Res:", L"Sets the shadow buffer resolution (instead of 2048x2048).", resolution(2048, 2048), std::vector<resolution>({resolution(256,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096), resolution(8192,8192)}), true, RESOPT_NONE),
@@ -212,6 +212,7 @@ ConfigOptionBase* optionsArray[] = {
new OptionMetaSpacer(8), new OptionMetaSpacer(8),
new OptionMetaSectionLabel(L"Stages/Songs"), new OptionMetaSectionLabel(L"Stages/Songs"),
new BooleanOption(L"Auto_Databank", PATCHES_SECTION, CONFIG_FILE, L"Auto Databank", L"Automatically generate databank for missing entries and allow multiple PvList files to be used.", true, false),
new NumericOption(L"Enhanced_Stage_Manager", PATCHES_SECTION, CONFIG_FILE, L"Number of Stages:", L"Set the number of stages (0 = default).", 0, 0, INT_MAX), new NumericOption(L"Enhanced_Stage_Manager", PATCHES_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 encore stages.", true, false), new BooleanOption(L"Enhanced_Stage_Manager_Encore", PATCHES_SECTION, CONFIG_FILE, L"Encore", L"Enable encore stages.", true, false),
new BooleanOption(L"sing_missed", PATCHES_SECTION, CONFIG_FILE, L"Sing Missed", L"Sing missed notes.", false, false), new BooleanOption(L"sing_missed", PATCHES_SECTION, CONFIG_FILE, L"Sing Missed", L"Sing missed notes.", false, false),
@@ -233,7 +234,8 @@ ConfigOptionBase* optionsArray[] = {
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"hide_volume", PATCHES_SECTION, CONFIG_FILE, L"Hide Volume Buttons", L"Hide the volume and SE control buttons.", 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_pv_ui", PATCHES_SECTION, CONFIG_FILE, L"Disable PV UI", L"Remove the photo controls during PV playback.", 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"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 DropdownOption(L"status_icons", PATCHES_SECTION, CONFIG_FILE, L"Top-Right Network Icons:", L"Set the state of card reader and network status icons.", 3, std::vector<LPCWSTR>({ L"Default", L"Hidden", L"Error", L"OK", L"Partial OK" })), new BooleanOption(L"hide_status_icons", PATCHES_SECTION, CONFIG_FILE, L"Hide Network Icons", L"Hide the top-right corner status icons.", false, false), // technically reduntant, but somehow a lot of users miss the dropdown
new DropdownOption(L"status_icons", PATCHES_SECTION, CONFIG_FILE, L"Network Icons Status:", L"Set the state of card reader and network status icons.", 3, std::vector<LPCWSTR>({ L"Default", L"Hidden", L"Error", L"OK", L"Partial OK" })),
new BooleanOption(L"no_lyrics", PATCHES_SECTION, CONFIG_FILE, L"Disable Lyrics", L"Disable showing lyrics.", false, false), new BooleanOption(L"no_lyrics", PATCHES_SECTION, CONFIG_FILE, L"Disable Lyrics", L"Disable showing lyrics.", 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"no_error", PATCHES_SECTION, CONFIG_FILE, L"Disable Error Banner", L"Disable the error banner on the attract screen.", true, false),
new BooleanOption(L"hide_freeplay", PATCHES_SECTION, CONFIG_FILE, L"Hide \"FREE PLAY\"/\"CREDIT(S)\"", L"Hide the \"FREE PLAY\"/\"CREDIT(S)\" text.", false, false), new BooleanOption(L"hide_freeplay", PATCHES_SECTION, CONFIG_FILE, L"Hide \"FREE PLAY\"/\"CREDIT(S)\"", L"Hide the \"FREE PLAY\"/\"CREDIT(S)\" text.", false, false),
@@ -474,7 +476,7 @@ std::vector<PluginOption*> GetPluginOptions(std::vector<PluginInfo>* plugins)
for (PluginInfo &pi : *plugins) for (PluginInfo &pi : *plugins)
{ {
PluginOption* opt = new PluginOption(pi.filename.c_str(), L"plugins", CONFIG_FILE, pi.name.c_str(), pi.description.c_str(), true, pi.configopts); PluginOption* opt = new PluginOption(pi.filename.c_str(), L"plugins", CONFIG_FILE, pi.name.c_str(), pi.description.c_str(), true, pi.configopts, pi.builddate);
outvec.push_back(opt); outvec.push_back(opt);
} }
+278 -100
View File
@@ -190,6 +190,7 @@ namespace Launcher {
updateStyle(); updateStyle();
checkHasInvalidGLUT();
glutInit(&argc, argv); glutInit(&argc, argv);
int window = glutCreateWindow("glut"); // a context must be created to use glGetString int window = glutCreateWindow("glut"); // a context must be created to use glGetString
@@ -198,8 +199,12 @@ namespace Launcher {
String^ vendor = gcnew String((char*)glGetString(GL_VENDOR)); String^ vendor = gcnew String((char*)glGetString(GL_VENDOR));
vendor = vendor->Replace(" Corporation", ""); // this is useless.. remove it to help ensure the GPU type line fits vendor = vendor->Replace(" Corporation", ""); // this is useless.. remove it to help ensure the GPU type line fits
String^ renderer = gcnew String((char*)glGetString(GL_RENDERER)); String^ renderer = gcnew String((char*)glGetString(GL_RENDERER));
renderer = renderer->Replace("Apple ", ""); // "Apple Apple M1" -> "Apple M1"
String^ version = gcnew String((char*)glGetString(GL_VERSION)); String^ version = gcnew String((char*)glGetString(GL_VERSION));
version = version->Replace(" Profile Context", ""); // we don't need this, either version = version->Replace(" Profile Context", "") // we don't need this, either
// misleading - the Metal layer always provides 2.1 as well as 4.1 Core (with the forwards compatiblity bit)
// even though the GLUT context is technically 2.1, inform the user that 4.1 fwcompat is supported (in case they want to use mods)
->Replace("2.1 Metal", "2.1/4.1 (forward-compatible) Metal");
String^ gpuModel = gcnew String(GPUModel::getGpuName().c_str()); String^ gpuModel = gcnew String(GPUModel::getGpuName().c_str());
@@ -232,139 +237,220 @@ namespace Launcher {
int linkStart = this->labelGPU->Text->Length; int linkStart = this->labelGPU->Text->Length;
bool showGpuDialog = false; bool showGpuDialog = false;
if (vendor->Contains("AMD") || vendor->Contains("ATI")) // check OpenGL to get actual GPU being used for vendor check (to get accurate results for iGPU) bool showGpuTypeWarning = false;
bool hasNovidia = false;
bool novidiaEnabled = false;
bool hasDivaGL = false;
bool divaGLEnabled = false;
for (PluginInfo i : AllPlugins)
{ {
bool hasNovidia = false; if (i.name == L"Novidia")
for (PluginInfo i : AllPlugins)
{ {
if (i.name == L"Novidia") hasNovidia = true;
hasNovidia = true; novidiaEnabled = GetIniBool(L"plugins", i.filename.c_str(), 1, CONFIG_FILE);
}
else if (i.name == L"DivaGL")
{
hasDivaGL = true;
divaGLEnabled = GetIniBool(L"plugins", i.filename.c_str(), 1, CONFIG_FILE);
} }
if (hasNovidia) if (hasNovidia && hasDivaGL) break;
}
if (divaGLEnabled)
{
this->labelGPU->Text += L"Rendering provided by DivaGL.";
GPUIssueText = L"Please check DivaGL's requirements to ensure compatibility with your graphics driver.";
this->labelGPU->LinkColor = System::Drawing::Color::HotPink;
}
else
{
if (vendor->Contains("AMD") || vendor->Contains("ATI")) // check OpenGL to get actual GPU being used for vendor check (to get accurate results for iGPU)
{ {
if (wineVersion == "" && (driver_version_major < 21 || (driver_version_major == 21 && driver_version_minor < 6))) if (hasNovidia)
{ {
if (driver_version_major == 21 && driver_version_minor == 5) if (novidiaEnabled)
{ {
this->labelGPU->Text += L"Driver may have issues."; if (wineVersion == "" && (driver_version_major < 21 || (driver_version_major == 21 && driver_version_minor < 6)))
GPUIssueText = L"The graphics driver you're using should be able to play movies without issues, but may crash while loading a song after playing multiple stages in one session.\nIf possible, please install the latest driver from your GPU vendor's website.\nHowever, note that if your GPU is old, you may not be able to install a more recent driver."; {
if (driver_version_major == 21 && driver_version_minor == 5)
{
this->labelGPU->Text += L"Driver may have issues.";
GPUIssueText = L"The graphics driver you're using should be able to play movies without issues, but may crash while loading a song after playing multiple stages in one session.\nIf possible, please install the latest driver from your GPU vendor's website.\nHowever, note that if your GPU is old, you may not be able to install a more recent driver.";
}
else
{
this->labelGPU->Text += L"Driver has known issues.";
GPUIssueText = L"The graphics driver you're using has known issues. Movies may not play back correctly.\nPlease install the latest driver from your GPU vendor's website.";
showGpuDialog = true;
}
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
}
else if (wineVersion == "" && (driver_version_major > 22 || (driver_version_major == 22 && driver_version_minor > 6)))
{
this->labelGPU->Text += "Issues: Unsupported GPU driver.";
GPUIssueText = "The graphics driver you're using is too new for Novidia.\nThe game will not run unless you install driver version 22.6.1 or earlier from AMD's website.\n\nAlternatively, you can try mods such as DivaGL.";
this->labelGPU->LinkColor = System::Drawing::Color::Red;
showGpuDialog = true;
}
else
{
this->labelGPU->Text += "Issues: AMD GPU support is unofficial.";
GPUIssueText = "AMD GPUs are not supported without mods.\nThe PD Loader AMDPack seems to be installed, but please keep in mind that it may have issues.";
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
} }
else else
{ {
this->labelGPU->Text += L"Driver has known issues."; this->labelGPU->Text += "Issues: Mods needed for AMD compatibility!";
GPUIssueText = L"The graphics driver you're using has known issues. Movies may not play back correctly.\nPlease install the latest driver from your GPU vendor's website."; GPUIssueText = "AMD GPUs are not supported without mods.\n" +
(hasDivaGL ? "DivaGL/" : "") + "Novidia is installed, but disabled; please enable it to use your AMD GPU.\n\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.";
this->labelGPU->LinkColor = System::Drawing::Color::Red;
showGpuDialog = true; showGpuDialog = true;
} }
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
} }
else if (wineVersion == "" && (driver_version_major > 22 || (driver_version_major == 22 && driver_version_minor > 6))) else if (hasDivaGL)
{ {
this->labelGPU->Text += "Issues: Unsupported GPU driver."; this->labelGPU->Text += "Issues: Mods needed for AMD compatibility!";
GPUIssueText = "The graphics driver you're using is too new for Novidia.\nThe game will not run unless you install driver version 22.6.1 or earlier from AMD's website."; GPUIssueText = "AMD GPUs are not supported without mods.\nDivaGL is installed, but disabled; please enable it to use your AMD GPU.\n\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.";
this->labelGPU->LinkColor = System::Drawing::Color::Red; this->labelGPU->LinkColor = System::Drawing::Color::Red;
showGpuDialog = true; showGpuDialog = true;
} }
else else
{ {
this->labelGPU->Text += "Issues: AMD GPU support is unofficial."; this->labelGPU->Text += "Issues: Mods needed for AMD compatibility!";
GPUIssueText = "AMD GPUs are not supported without mods.\nThe PD Loader AMDPack seems to be installed, but please keep in mind that it may have issues."; GPUIssueText = "AMD GPUs are not supported without mods.\nEither DivaGL or Novidia is required. Please download either plugin and check its requirements to ensure compatibility with your graphics driver.\n\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.";
this->labelGPU->LinkColor = System::Drawing::Color::Yellow; this->labelGPU->LinkColor = System::Drawing::Color::Red;
showGpuDialog = true;
} }
} }
else else if (vendor->Contains("NVIDIA"))
{ {
this->labelGPU->Text += "Issues: Mods needed for AMD compatibility!"; if (wineVersion == "" && (driver_version_major < 391 || (driver_version_major > 446 && driver_version_major < 460)))
GPUIssueText = "AMD GPUs are not supported without mods.\nThe PD Loader AMDPack can be used to make 3D rendering work. Please download it and follow the included instructions.\n\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.";
this->labelGPU->LinkColor = System::Drawing::Color::Red;
showGpuDialog = true;
}
}
else if (vendor->Contains("NVIDIA"))
{
if (wineVersion == "" && (driver_version_major < 391 || (driver_version_major > 446 && driver_version_major < 460)))
{
this->labelGPU->Text += L"Driver has known issues.";
GPUIssueText = L"The graphics driver you're using has known issues. Please install the latest driver from your GPU vendor's website.";
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true;
}
else if (gpuModel->StartsWith("GA")) // unconfirmed??
{
this->labelGPU->Text += L"Issues: Ampere GPU detected! Possible noise.\n(Click for more information)";
GPUIssueText = L"On Ampere GPUs (RTX 30xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled.";
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else if (gpuModel->StartsWith("TU") || gpuModel->StartsWith("GV")) // let's assume Volta is like Turing for now
{
this->labelGPU->Text += L"Issues: Turing GPU detected! Possible noise.\n(Click for more information)";
GPUIssueText = L"On Turing GPUs (GTX 16xx/RTX 20xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled.";
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else if (gpuModel->StartsWith("GM") || gpuModel->StartsWith("GP"))
{
this->labelGPU->Text += L"Issues: May have minor noise on some stages.\n(Click for more information)";
GPUIssueText = L"On Maxwell GPUs (~GTX 900) and newer, some minor stage shaders create noise.\nPlease make sure the ShaderPatch plugin is enabled.";
this->labelGPU->LinkColor = System::Drawing::Color::Teal;
}
else if (gpuModel->StartsWith("GK"))
{
this->labelGPU->Text += L"Issues: None.";
GPUIssueText = L"Your GPU should have no issues running the game.";
this->labelGPU->LinkColor = System::Drawing::Color::LightBlue;
}
else if (gpuModel->StartsWith("GF"))
{
if (version[0] < '4')
{ {
this->labelGPU->Text += L"Issues: Driver too old."; this->labelGPU->Text += L"Driver has known issues.";
GPUIssueText = L"Your GPU should be able to run the game, but it looks like your OpenGL version is too old.\nA driver update should fix this."; GPUIssueText = L"The graphics driver you're using has known issues. Please install the latest driver from your GPU vendor's website.";
this->labelGPU->LinkColor = System::Drawing::Color::Orange; this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true; showGpuDialog = true;
} }
else else if (gpuModel->StartsWith("GB")) // unconfirmed??
{ {
this->labelGPU->Text += L"Issues: No known issues."; this->labelGPU->Text += L"Issues: Blackwell GPU detected! Possible noise.\n(Click for more information)";
GPUIssueText = L"Your GPU should have no issues running the game, but it is older than the GPU the game was originally designed for (GTX 650 Ti).\nThere may be some issues with graphics.\nPlease report any issues so that they can be analysed and potentially fixed."; GPUIssueText = L"On Blackwell GPUs (RTX 50xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled.";
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else if (gpuModel->StartsWith("AD"))
{
this->labelGPU->Text += L"Issues: Ada Lovelace GPU detected! Possible noise.\n(Click for more information)";
GPUIssueText = L"On Ada Lovelace GPUs (RTX 40xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled.";
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else if (gpuModel->StartsWith("GA"))
{
this->labelGPU->Text += L"Issues: Ampere GPU detected! Possible noise.\n(Click for more information)";
GPUIssueText = L"On Ampere GPUs (RTX 30xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled.";
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else if (gpuModel->StartsWith("TU"))
{
this->labelGPU->Text += L"Issues: Turing GPU detected! Possible noise.\n(Click for more information)";
GPUIssueText = L"On Turing GPUs (GTX 16xx/RTX 20xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled.";
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else if (gpuModel->StartsWith("GV"))
{
this->labelGPU->Text += L"Issues: Volta GPU detected! Possible noise.\n(Click for more information)";
GPUIssueText = L"On Volta GPUs (TITAN V), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled.";
this->labelGPU->LinkColor = System::Drawing::Color::Yellow;
}
else if (gpuModel->StartsWith("GM") || gpuModel->StartsWith("GP"))
{
this->labelGPU->Text += L"Issues: May have minor noise on some stages.\n(Click for more information)";
GPUIssueText = L"On Maxwell GPUs (~GTX 900) and newer, some minor stage shaders create noise.\nPlease make sure the ShaderPatch plugin is enabled.";
this->labelGPU->LinkColor = System::Drawing::Color::Teal; this->labelGPU->LinkColor = System::Drawing::Color::Teal;
} }
else if (gpuModel->StartsWith("GK"))
{
this->labelGPU->Text += L"Issues: None.";
GPUIssueText = L"Your GPU should have no issues running the game.";
this->labelGPU->LinkColor = System::Drawing::Color::LightBlue;
}
else if (gpuModel->StartsWith("GF"))
{
if (version[0] < '4')
{
this->labelGPU->Text += L"Issues: Driver too old.";
GPUIssueText = L"Your GPU should be able to run the game, but it looks like your OpenGL version is too old.\nA driver update should fix this.";
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true;
}
else
{
this->labelGPU->Text += L"Issues: No known issues.";
GPUIssueText = L"Your GPU should have no issues running the game, but it is older than the GPU the game was originally designed for (GTX 650 Ti).\nThere may be some issues with graphics.\nPlease report any issues so that they can be analysed and potentially fixed.";
this->labelGPU->LinkColor = System::Drawing::Color::Teal;
}
}
else if (gpuModel->StartsWith("G") || gpuModel->StartsWith("NV") || gpuModel->StartsWith("NB") || gpuModel->StartsWith("N10") || gpuModel->StartsWith("MCP"))
{
this->labelGPU->Text += L"Issues: GPU too old! 3D rendering might be broken.\n(Click for more information)";
GPUIssueText = L"Your GPU is very old and does not support rendering techniques used by the game.\nYou may be able to play, but graphics will likely have major issues.\nPlease upgrade to a GTX 600 series or later GPU.";
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true;
}
else if (version[0] >= '4' && gpuModel->Length > 0 && !gpuModel->StartsWith("Unk") && !gpuModel->StartsWith("Oth"))
{
this->labelGPU->Text += L"Issues: GPU may be too new.\n(Click for more information)";
GPUIssueText = L"It looks like your GPU may be too new. Only up to Ada Lovelace (RTX 40xx) is currently supported.\nYou will likely see lines/noise on important character shaders and some minor stage shaders.\nPlease report any issues so that ShaderPatch can be updated.\n\nTo try to get rid of any artifacts, try selecting a specific GPU architecture in Graphics -> Nvidia GPU (e.g. \"Ada or newer\"), or use DivaGL.";
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true;
showGpuTypeWarning = true;
}
else
{
this->labelGPU->Text += L"Issues: Unable to detect GPU architecture.\n(Click for more information)";
GPUIssueText = L"It looks like you have an NVIDIA GPU, but something went wrong while trying to determine your GPU's architecture (type).\nThis may be a caused by a bug, but it probably indicates potential issues.\nPlease make sure you have a GTX 600 series or later GPU. (GTX 400 series or later should also work)\n\nIf the game runs but has artifacts, try selecting a specific GPU architecture in Graphics -> Nvidia GPU (e.g. \"Ada or newer\"), or use DivaGL.";
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true;
showGpuTypeWarning = true;
}
} }
else if (gpuModel->StartsWith("G") || gpuModel->StartsWith("NV") || gpuModel->StartsWith("NB") || gpuModel->StartsWith("N10") || gpuModel->StartsWith("MCP")) else //if (gpuModel->Length == 0 || gpuModel->StartsWith("Unk") || gpuModel->StartsWith("Oth"))
{ {
this->labelGPU->Text += L"Issues: GPU too old! 3D rendering might be broken.\n(Click for more information)"; this->labelGPU->Text += L"Issues: UNSUPPORTED GPU!";
GPUIssueText = L"Your GPU is very old and does not support rendering techniques used by the game.\nYou may be able to play, but graphics will likely have major issues.\nPlease upgrade to a GTX 600 series or later GPU."; GPUIssueText = L"Your graphics card is not supported. Only NVIDIA GPUs are recommended (though others can be used with mods).\nPlease use a GTX 600 series or later NVIDIA GPU.\n\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.\n\nOwners of other GPUs may be able to run the game using plugins or mods, such as DivaGL, Novidia, or DivaImGui.";
this->labelGPU->LinkColor = System::Drawing::Color::Orange; this->labelGPU->LinkColor = System::Drawing::Color::Red;
showGpuDialog = true; showGpuDialog = true;
} }
else if (version[0] >= '4' && gpuModel->Length > 0 && !gpuModel->StartsWith("Unk") && !gpuModel->StartsWith("Oth"))
{
this->labelGPU->Text += L"Issues: GPU may be too new.\n(Click for more information)";
GPUIssueText = L"It looks like your GPU may be too new. Only up to Ampere (RTX 30xx) is currently supported.\nGood news: the game should be capable of running, but shader patches (probably needed) may not support it yet.\nYou will likely see lines/noise on important character shaders and some minor stage shaders.\nPlease report any issues so that ShaderPatch can be updated.\nYou can also try forcing a specific GPU workaround type.";
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
}
else
{
this->labelGPU->Text += L"Issues: Unable to detect GPU architecture.\n(Click for more information)";
GPUIssueText = L"It looks like you have an NVIDIA GPU, but something went wrong while trying to determine your GPU's architecture (type).\nThis may be a caused by a bug, but it probably indicates potential issues.\nPlease make sure you have a GTX 600 series or later GPU. (GTX 400 series or later should also work)";
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
showGpuDialog = true;
}
}
else //if (gpuModel->Length == 0 || gpuModel->StartsWith("Unk") || gpuModel->StartsWith("Oth"))
{
this->labelGPU->Text += L"Issues: UNSUPPORTED GPU!";
GPUIssueText = L"Your graphics card is not supported. Only NVIDIA GPUs are recommended (though AMD ones can be used with mods).\nPlease use a GTX 600 series or later NVIDIA GPU.\n\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.\n\nOwners of other GPUs may be able to run the game using plugins or mods, but 3D graphics will probably not work.";
this->labelGPU->LinkColor = System::Drawing::Color::Red;
showGpuDialog = true;
} }
int linkEnd = this->labelGPU->Text->Length - linkStart; int linkEnd = this->labelGPU->Text->Length - linkStart;
this->labelGPU->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::LinkLabelLinkClickedGPUIssueHandler); this->labelGPU->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::LinkLabelLinkClickedGPUIssueHandler);
this->labelGPU->LinkArea = System::Windows::Forms::LinkArea(linkStart, linkEnd); this->labelGPU->LinkArea = System::Windows::Forms::LinkArea(linkStart, linkEnd);
if (showGpuDialog && !nNoGPUDialog) if (!nNoGPUDialog)
SkinnedMessageBox::Show(this, GPUIssueText + "\n\nYou can disable this message from the options tab.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning); {
if (showGpuDialog)
SkinnedMessageBox::Show(this, GPUIssueText + "\n\nYou can disable this message from the Options tab.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning);
if (showGpuTypeWarning)
{
Label^ gpuTypeLabel = ((Label^)Control::FromHandle(((DropdownOption*)(graphicsArray[0]))->labelHandle));
ComboBox^ gpuTypeCtrl = ((ComboBox^)Control::FromHandle(((DropdownOption*)(graphicsArray[0]))->mainControlHandle));
gpuTypeLabel->Text = "/!\\ " + gpuTypeLabel->Text;
gpuTypeLabel->BackColor = System::Drawing::Color::Gold;
gpuTypeLabel->ForeColor = System::Drawing::Color::Crimson;
gpuTypeCtrl->Items[0] = "SELECT ONE";
gpuTypeCtrl->BackColor = System::Drawing::Color::Gold;
gpuTypeCtrl->ForeColor = System::Drawing::Color::Crimson;
gpuTypeCtrl->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
}
}
} }
protected: protected:
@@ -663,7 +749,7 @@ private: System::Windows::Forms::Button^ button_Wiki;
this->trackBar_LagCompensation->Size = System::Drawing::Size(500, 90); this->trackBar_LagCompensation->Size = System::Drawing::Size(500, 90);
this->trackBar_LagCompensation->TabIndex = 0; this->trackBar_LagCompensation->TabIndex = 0;
this->trackBar_LagCompensation->TickStyle = System::Windows::Forms::TickStyle::None; this->trackBar_LagCompensation->TickStyle = System::Windows::Forms::TickStyle::None;
this->trackBar_LagCompensation->ValueChanged += gcnew System::EventHandler(this, &ui::trackBar_LagCompensation_ValueChanged); this->trackBar_LagCompensation->Scroll += gcnew System::EventHandler(this, &ui::trackBar_LagCompensation_Scroll);
// //
// groupBox_Details // groupBox_Details
// //
@@ -1042,10 +1128,104 @@ private: System::Void SaveSettings() {
private: System::Void Button_Help_Click(System::Object^ sender, System::EventArgs^ e) { private: System::Void Button_Help_Click(System::Object^ sender, System::EventArgs^ e) {
System::Diagnostics::Process::Start("https://github.com/PDModdingCommunity/PD-Loader/wiki"); System::Diagnostics::Process::Start("https://github.com/PDModdingCommunity/PD-Loader/wiki");
} }
private: System::Boolean hasInvalidGLUT = false;
private: System::Void checkHasInvalidGLUT()
{
HMODULE glutHm = GetModuleHandleW(L"glut32.dll");
hasInvalidGLUT = glutHm != NULL && GetProcAddress(glutHm, "__glutGetFCB") == NULL;
if (hasInvalidGLUT)
{
SkinnedMessageBox::Show(this, "Support for custom versions of \"glut32.dll\" is deprecated and will be removed in future versions of PD Loader.\nPlease restore a valid copy of the original file, then validate your files and make sure \"glut32.dll\" passes.\n\nPlease DO NOT ASK for a copy of the file in our support channels!\nWe cannot provide it to you.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning);
}
}
private: System::Boolean hasInvalidSettings()
{
bool divaGLEnabled = false;
bool novidiaEnabled = false;
bool shaderPatchEnabled = false;
//bool divaImGuiEnabled = false;
bool divaImGuiOldEnabled = false;
for (PluginOption* option : AllPluginOpts)
{
if (lstrcmpW(option->_friendlyName, L"DivaGL") == 0)
{
divaGLEnabled = ((CheckBox^)CheckBox::FromHandle(option->mainControlHandle))->Checked;
if (divaGLEnabled)
{
if (hasInvalidGLUT) goto divagl_freeglut;
else if (novidiaEnabled || shaderPatchEnabled) goto divagl_novidia;
else if (divaImGuiOldEnabled) goto divagl_divaimguiold;
}
}
else if (lstrcmpW(option->_friendlyName, L"Novidia") == 0)
{
novidiaEnabled = ((CheckBox^)CheckBox::FromHandle(option->mainControlHandle))->Checked;
if (novidiaEnabled && divaGLEnabled) goto divagl_novidia;
}
else if (lstrcmpW(option->_friendlyName, L"ShaderPatch") == 0)
{
shaderPatchEnabled = ((CheckBox^)CheckBox::FromHandle(option->mainControlHandle))->Checked;
if (shaderPatchEnabled && divaGLEnabled) goto divagl_novidia;
}
else if (lstrcmpW(option->_friendlyName, L"DivaImGui") == 0)
{
//divaImGuiEnabled = ((CheckBox^)CheckBox::FromHandle(option->mainControlHandle))->Checked;
if (option->_builddate == L"Unknown")
{
divaImGuiOldEnabled = ((CheckBox^)CheckBox::FromHandle(option->mainControlHandle))->Checked;
if (divaImGuiOldEnabled && divaGLEnabled) goto divagl_divaimguiold;
}
}
}
//if (divaImGuiEnabled)
//{
// for (ConfigOptionBase* option : graphicsArray)
// {
// if (option->_iniSectionName == GRAPHICS_SECTION && option->_iniVarName == L"2D")
// {
// if (((CheckBox^)CheckBox::FromHandle(option->mainControlHandle))->Checked)
// {
// SkinnedMessageBox::Show(this, "Graphics: \"Disable 3D rendering\" must be disabled if DivaImGui is enabled.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Error);
// return true;
// }
// break;
// }
// }
//}
return false;
divagl_freeglut:
SkinnedMessageBox::Show(this, "Plugins: DivaGL does not support custom versions of \"glut32.dll\".\nPlease restore a valid copy of the original file, then validate your files and make sure \"glut32.dll\" passes.\n\nPlease DO NOT ASK for a copy of the file in our support channels!\nWe cannot provide it to you.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Error);
return true;
divagl_novidia:
if (SkinnedMessageBox::Show(this, "Plugins: Novidia and ShaderPatch should be disabled if DivaGL is enabled.\n\nLaunch anyway?", "PD Launcher", MessageBoxButtons::YesNo, MessageBoxIcon::Error) != System::Windows::Forms::DialogResult::Yes)
return true;
divagl_divaimguiold:
SkinnedMessageBox::Show(this, "Plugins: Your version of DivaImGui is too old for DivaGL; please either update or disable it.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Error);
return true;
}
private: System::Boolean warnCheck()
{
if (((ComboBox^)Control::FromHandle(((DropdownOption*)(graphicsArray[0]))->mainControlHandle))->Text == "SELECT ONE" &&
SkinnedMessageBox::Show(this, L"GPU detection has failed and no Nvidia GPU architecture has been selected.\nAs such, characters and stages may exhibit artifacts, such as noisy shadows and stages.\nIf unsure, try all of the options starting from Kepler.\n\nLaunch anyway?", "PD Launcher", MessageBoxButtons::YesNo, MessageBoxIcon::Error) != System::Windows::Forms::DialogResult::OK)
return false;
return true;
}
private: System::Void Button_Launch_Click(System::Object^ sender, System::EventArgs^ e) { private: System::Void Button_Launch_Click(System::Object^ sender, System::EventArgs^ e) {
//SkinnedMessageBox::Show(this, "It looks like the executable has been tampered with, or the version of the game is not 7.10.\n\nPlease use the \"patches\" folder instead of modifying the executable directly (or disable verification).", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Error); //SkinnedMessageBox::Show(this, "It looks like the executable has been tampered with, or the version of the game is not 7.10.\n\nPlease use the \"patches\" folder instead of modifying the executable directly (or disable verification).", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Error);
if (!warnCheck()) return;
if (hasInvalidSettings()) return;
SaveSettings(); SaveSettings();
if (GetPrivateProfileIntW(LAUNCHER_SECTION, L"use_divahook_bat", FALSE, CONFIG_FILE)) if (GetPrivateProfileIntW(LAUNCHER_SECTION, L"use_divahook_bat", FALSE, CONFIG_FILE))
@@ -1203,9 +1383,9 @@ private: bool AnyConfigChanged() {
private: String^ GPUIssueText; private: String^ GPUIssueText;
private: System::Void LinkLabelLinkClickedGPUIssueHandler(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) { private: System::Void LinkLabelLinkClickedGPUIssueHandler(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) {
SkinnedMessageBox::Show(this, GPUIssueText, "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning); SkinnedMessageBox::Show(this, GPUIssueText, "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Information);
} }
private: System::Void trackBar_LagCompensation_ValueChanged(System::Object^ sender, System::EventArgs^ e) { private: System::Void trackBar_LagCompensation_Scroll(System::Object^ sender, System::EventArgs^ e) {
*LagCompensationConfigChanged = true; *LagCompensationConfigChanged = true;
updateLagCompMsec(); updateLagCompMsec();
@@ -1215,7 +1395,5 @@ private: System::Void tabPage_Resolution_Click(System::Object^ sender, System::E
private: System::Void button_Wiki_Click(System::Object^ sender, System::EventArgs^ e) { private: System::Void button_Wiki_Click(System::Object^ sender, System::EventArgs^ e) {
System::Diagnostics::Process::Start("https://github.com/PDModdingCommunity/PD-Loader/wiki"); System::Diagnostics::Process::Start("https://github.com/PDModdingCommunity/PD-Loader/wiki");
} }
private: System::Void trackBar_LagCompensation_Scroll(System::Object^ sender, System::EventArgs^ e) {
}
}; };
} }
@@ -1,8 +1,13 @@
#pragma once #pragma once
#include "glStuff.h" //#define WIN32_LEAN_AND_MEAN
//#include <windows.h>
//#include <psapi.h>
#include <vector> #include <vector>
#include "glStuff.h"
// use this as a hook to perform initialisation // use this as a hook to perform initialisation
void(__cdecl* glutSetCursor)(int cursor) = *(void(__cdecl**)(int))0x140966068; void(__cdecl* glutSetCursor)(int cursor) = *(void(__cdecl**)(int))0x140966068;
void(__cdecl* uploadModelTransformBuf)(DWORD* a1, int a2) = (void(__cdecl*)(DWORD * a1, int a2))0x140444fa0; void(__cdecl* uploadModelTransformBuf)(DWORD* a1, int a2) = (void(__cdecl*)(DWORD * a1, int a2))0x140444fa0;
@@ -113,3 +118,37 @@ void InjectCode(void* address, const std::vector<uint8_t> data)
memcpy(address, data.data(), byteCount); memcpy(address, data.data(), byteCount);
VirtualProtect(address, byteCount, oldProtect, nullptr); VirtualProtect(address, byteCount, oldProtect, nullptr);
} }
//bool hasConflicts()
//{
// printf("[Novidia] Checking for conflicts...\n");
//
// HMODULE* hModules = new HMODULE[USHRT_MAX];
// HANDLE hProcess;
// DWORD cbNeeded;
//
// hProcess = GetCurrentProcess();
//
// if (EnumProcessModules(hProcess, hModules, sizeof(hModules), &cbNeeded)) {
// for (unsigned long long i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
// auto pNameFunc = (LPCWSTR(*)())GetProcAddress(hModules[i], "GetPluginName");
// if (pNameFunc) {
// LPCWSTR name = pNameFunc();
// if (name && lstrcmpW(name, L"DivaGL") == 0)
// {
// // detected DivaGL
// printf("[Novidia] Detected DivaGL! Quitting!\n");
//#ifdef _DEBUG
// MessageBoxExW(NULL, L"Detected DivaGL! Quitting!\n", L"Novidia", MB_OK, 0);
//#endif
// delete[] hModules;
// return true;
// }
// }
// }
// }
//
// printf("[Novidia] No conflicts found.\n");
// delete[] hModules;
// return false;
//}
@@ -161,12 +161,18 @@ class PatchApplier600 : public PatchApplier {
printf("[Patches] Cursor enabled\n");*/ printf("[Patches] Cursor enabled\n");*/
} }
// Override status icon states to be invalid (hides them) // Override status icon states to be invalid (hides them)
if (nStatusIcons > 0) if (nHideStatusIcons || nStatusIcons > 0)
{ {
std::vector<uint8_t> cardIcon = { 0xFD, 0x0A }; std::vector<uint8_t> cardIcon = { 0xFD, 0x0A };
std::vector<uint8_t> networkIcon = { 0x9E, 0x1E }; std::vector<uint8_t> networkIcon = { 0x9E, 0x1E };
if (nStatusIcons == 2) // 2 for error icons if (nHideStatusIcons || nStatusIcons == 1 || nStatusIcons >= 5) // 1 or invalid for hidden
{
cardIcon = { 0xFD, 0x0A };
networkIcon = { 0x9E, 0x1E };
printf("[Patches] Status icons hidden\n");
}
else if (nStatusIcons == 2) // 2 for error icons
{ {
cardIcon = { 0xFA, 0x0A }; cardIcon = { 0xFA, 0x0A };
networkIcon = { 0x9F, 0x1E }; networkIcon = { 0x9F, 0x1E };
@@ -184,12 +190,6 @@ class PatchApplier600 : public PatchApplier {
networkIcon = { 0xA1, 0x1E }; networkIcon = { 0xA1, 0x1E };
printf("[Patches] Status icons set to partial OK state\n"); printf("[Patches] Status icons set to partial OK state\n");
} }
else // 1 or invalid for hidden
{
cardIcon = { 0xFD, 0x0A };
networkIcon = { 0x9E, 0x1E };
printf("[Patches] Status icons hidden\n");
}
// card icon // card icon
InjectCode((void*)0x00000001403A0C9E, cardIcon); // error state InjectCode((void*)0x00000001403A0C9E, cardIcon); // error state
@@ -180,12 +180,18 @@ class PatchApplier710 : public PatchApplier {
printf("[Patches] Cursor enabled\n"); printf("[Patches] Cursor enabled\n");
} }
// Override status icon states to be invalid (hides them) // Override status icon states to be invalid (hides them)
if (nStatusIcons > 0) if (nHideStatusIcons || nStatusIcons > 0)
{ {
std::vector<uint8_t> cardIcon = { 0xFD, 0x0A }; std::vector<uint8_t> cardIcon = { 0xFD, 0x0A };
std::vector<uint8_t> networkIcon = { 0x9E, 0x1E }; std::vector<uint8_t> networkIcon = { 0x9E, 0x1E };
if (nStatusIcons == 2) // 2 for error icons if (nHideStatusIcons || nStatusIcons == 1 || nStatusIcons >= 5) // 1 or invalid for hidden
{
cardIcon = { 0xFD, 0x0A };
networkIcon = { 0x9E, 0x1E };
printf("[Patches] Status icons hidden\n");
}
else if (nStatusIcons == 2) // 2 for error icons
{ {
cardIcon = { 0xFA, 0x0A }; cardIcon = { 0xFA, 0x0A };
networkIcon = { 0x9F, 0x1E }; networkIcon = { 0x9F, 0x1E };
@@ -203,12 +209,6 @@ class PatchApplier710 : public PatchApplier {
networkIcon = { 0xA1, 0x1E }; networkIcon = { 0xA1, 0x1E };
printf("[Patches] Status icons set to partial OK state\n"); printf("[Patches] Status icons set to partial OK state\n");
} }
else // 1 or invalid for hidden
{
cardIcon = { 0xFD, 0x0A };
networkIcon = { 0x9E, 0x1E };
printf("[Patches] Status icons hidden\n");
}
// card icon // card icon
InjectCode((void*)0x00000001403B9D6E, cardIcon); // error state InjectCode((void*)0x00000001403B9D6E, cardIcon); // error state
@@ -555,7 +555,7 @@ class PatchApplier710 : public PatchApplier {
// Reflections // Reflections
if (!nReflections) if (!nReflections)
{ {
InjectCode((void*)0x1406477C0, { 0xE9, 0xF3, 0x00, 0x00, 0x00, 0x90 }); InjectCode((void*)0x1406477C6, { 0xE9, 0xE9, 0x00, 0x00, 0x00, 0x90, 0x90, 0x90 });
InjectCode((void*)0x1411ADAFC, { 0x00 }); InjectCode((void*)0x1411ADAFC, { 0x00 });
} }
// Shadows // Shadows
@@ -100,13 +100,17 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="databank.cpp" />
<ClCompile Include="dllmain.cpp" /> <ClCompile Include="dllmain.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="databank.h" />
<ClInclude Include="framework.h" /> <ClInclude Include="framework.h" />
<ClInclude Include="PatchApplier.h" /> <ClInclude Include="PatchApplier.h" />
<ClInclude Include="PatchApplier600.h" /> <ClInclude Include="PatchApplier600.h" />
<ClInclude Include="PatchApplier710.h" /> <ClInclude Include="PatchApplier710.h" />
<ClInclude Include="storage.h" />
<ClInclude Include="urlutil.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
@@ -18,6 +18,9 @@
<ClCompile Include="dllmain.cpp"> <ClCompile Include="dllmain.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="databank.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="framework.h"> <ClInclude Include="framework.h">
@@ -32,5 +35,14 @@
<ClInclude Include="PatchApplier710.h"> <ClInclude Include="PatchApplier710.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="databank.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="storage.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="urlutil.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>
@@ -0,0 +1,132 @@
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include "databank.h"
#include "urlutil.h"
namespace Databank
{
bool PvList::readFromStr(std::string& str)
{
std::string decoded = urlDecode(urlDecode(str));
std::vector<std::string> tokens;
std::stringstream ss(decoded);
std::string token;
while (std::getline(ss, token, ','))
{
if (!token.empty())
{
tokens.push_back(token);
}
}
if (tokens.size() % 7 != 0)
{
std::cerr << "[Patches] Databank error: Token count (" << tokens.size() << ") is not a multiple of 7." << std::endl;
return false;
}
for (size_t i = 0; i < tokens.size(); i += 7)
{
try
{
PvEntry entry;
std::tuple<int, int> id(std::stoi(tokens[i]), std::stoi(tokens[i + 2]));
entry.unk1 = std::stoi(tokens[i + 1]);
entry.advStart = tokens[i + 3];
entry.advEnd = tokens[i + 4];
entry.start = tokens[i + 5];
entry.end = tokens[i + 6];
entries.insert({ id, entry });
}
catch (const std::exception& e)
{
std::cerr << "[Patches] Databank parse error: " << e.what() << std::endl;
return false;
}
}
return true;
}
bool PvList::readFromFile(const std::string& filename)
{
try
{
std::ifstream file(filename, std::ios::in | std::ios::binary);
if (!file)
{
std::cerr << "[Patches] Failed to open databank " + filename << std::endl;
return false;
}
std::string contents = std::string((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
return readFromStr(contents);
}
catch (const std::exception& e)
{
std::cerr << "[Patches] Databank file read error: " << e.what() << std::endl;
return false;
}
}
void PvList::addEntry(int id, int extra, PvEntry& entry)
{
entries.insert({ std::tuple<int, int>(id, extra), entry });
}
void PvList::generateMissingEntries()
{
PvEntry entry = PvEntry();
for (int i = 0; i <= 999; i++)
{
entry.advStart = "2000-01-01";
entry.advEnd = "2029-01-01";
entry.start = "2000-01-01";
entry.end = "2029-01-01";
entries.insert({ std::tuple<int, int>(i, 0), entry });
entries.insert({ std::tuple<int, int>(i, 1), entry });
}
}
std::string PvList::finalize()
{
std::ostringstream csvStream;
if (entries.empty())
{
return "%2A%2A%2A"; // ***
//checksum = "5341";
}
else
{
bool first = true;
for (const auto& entryMap : entries)
{
std::ostringstream entryStream;
if (!first)
{
csvStream << ",";
}
first = false;
const PvEntry& entry = entryMap.second;
entryStream << std::get<0>(entryMap.first) << ","
<< entry.unk1 << ","
<< std::get<1>(entryMap.first) << ","
<< entry.advStart << ","
<< entry.advEnd << ","
<< entry.start << ","
<< entry.end;
csvStream << urlEncode(entryStream.str());
}
return urlEncode(csvStream.str());
//checksum = std::to_string(crc16_ccitt(finalString));
}
}
}
@@ -0,0 +1,26 @@
#pragma once
#include <map>
#include "databank.h"
namespace Databank
{
struct PvEntry
{
int unk1 = 1;
std::string advStart, advEnd, start, end;
};
class PvList
{
protected:
std::map<std::tuple<int, int>, PvEntry> entries;
public:
bool readFromStr(std::string& str);
bool readFromFile(const std::string& filename);
void addEntry(int id, int extra, PvEntry& entry);
void generateMissingEntries();
std::string finalize();
};
}
+60 -4
View File
@@ -7,13 +7,16 @@
#include <filesystem> #include <filesystem>
#include <sstream> #include <sstream>
#include <iomanip> #include <iomanip>
#include <regex>
#include <detours.h>
#include "PluginConfigApi.h" #include "PluginConfigApi.h"
#include "PatchApplier.h" #include "PatchApplier.h"
#include "PatchApplier600.h" #include "PatchApplier600.h"
#include "PatchApplier710.h" #include "PatchApplier710.h"
#include <detours.h>
#include "framework.h" #include "framework.h"
#include "storage.h"
#include "databank.h"
#pragma comment(lib, "detours.lib") #pragma comment(lib, "detours.lib")
unsigned short game_version = 710; unsigned short game_version = 710;
@@ -22,7 +25,9 @@ void InjectCode(void* address, const std::vector<uint8_t> data);
void ApplyPatches(); void ApplyPatches();
void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING); void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING);
constexpr uint64_t PVLIST_INIT_ADDRESS = 0x000000014001EC80;
void(__fastcall* divaPvListInitializer)(void* pvListContainer) = (void(__fastcall*)(void* pvListContainer))PVLIST_INIT_ADDRESS;
void initPvListContainerHook();
HMODULE *hModulePtr; HMODULE *hModulePtr;
@@ -98,6 +103,11 @@ void ApplyPatches() {
std::cout << "[Patches] All custom patches applied\n"; std::cout << "[Patches] All custom patches applied\n";
} }
if (nAutoDatabank)
{
initPvListContainerHook();
}
} }
@@ -244,7 +254,7 @@ void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING)
if (echo) std::cout << std::endl; if (echo) std::cout << std::endl;
else if (comment_string.length() > 0) else if (comment_string.length() > 0)
{ {
std::cout << "[Patches]";; std::cout << "[Patches]";
if (comment_string.at(0) != ' ') std::cout << ' '; if (comment_string.at(0) != ' ') std::cout << ' ';
std::cout << comment_string << std::endl; std::cout << comment_string << std::endl;
} }
@@ -254,6 +264,52 @@ void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING)
fileStream.close(); fileStream.close();
} }
Databank::PvList lists[5] = {};
void hookedPvListInitializer(void* pvListContainer)
{
Storage::FileRecord* records = (Storage::FileRecord*)((uint64_t)pvListContainer + 0xA0);
for (int i = 0; i <= 4; i++)
{
std::regex pattern("(PvList" + std::to_string(i) +"_SBZV_7.10_.*_.*\\.dat)");
try
{
for (const auto& entry : std::filesystem::directory_iterator("ram/databank/"))
{
if (entry.is_regular_file() && std::regex_match(entry.path().filename().string(), pattern))
{
std::string path = entry.path().string();
std::cout << "[Patches] Reading databank: " << path << std::endl;
lists[i].readFromFile(path);
}
}
}
catch (const std::filesystem::filesystem_error& e)
{
std::cerr << "[Patches] Databank filesystem error: " << e.what() << std::endl;
}
if (i != 4) lists[i].generateMissingEntries();
std::string finalString = lists[i].finalize();
Storage::customAddStringContainer(&records[i], finalString.c_str());
}
*(uint8_t*)(0x140CDB1D9) = 0x01; // enables databank
}
void initPvListContainerHook()
{
if (game_version != 710) return;
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)divaPvListInitializer, (PVOID)(hookedPvListInitializer));
DetourTransactionCommit();
std::cout << "[Patch] Auto Databank enabled" << std::endl;
}
using namespace PluginConfig; using namespace PluginConfig;
@@ -3,6 +3,14 @@
#include <string> #include <string>
#include <vector> #include <vector>
typedef uint16_t(__fastcall* p_crc16_ccitt)(void* data, int len);
p_crc16_ccitt o_crc16_ccitt = (p_crc16_ccitt)0x140011A90;
uint16_t crc16_ccitt(std::string& str)
{
return o_crc16_ccitt(str.data(), str.size());
}
std::string TrimString(const std::string& str, const std::string& whitespace) std::string TrimString(const std::string& str, const std::string& whitespace)
{ {
const size_t strBegin = str.find_first_not_of(whitespace); const size_t strBegin = str.find_first_not_of(whitespace);
@@ -91,6 +99,7 @@ auto nCursor = GetPrivateProfileIntW(L"patches", L"cursor", TRUE, CONFIG_FILE);
auto nHideFreeplay = GetPrivateProfileIntW(L"patches", L"hide_freeplay", FALSE, CONFIG_FILE); auto nHideFreeplay = GetPrivateProfileIntW(L"patches", L"hide_freeplay", FALSE, CONFIG_FILE);
auto nFreeplay = GetPrivateProfileIntW(L"patches", L"freeplay", TRUE, CONFIG_FILE); auto nFreeplay = GetPrivateProfileIntW(L"patches", L"freeplay", TRUE, CONFIG_FILE);
auto nPDLoaderText = GetPrivateProfileIntW(L"patches", L"pdloadertext", TRUE, CONFIG_FILE); auto nPDLoaderText = GetPrivateProfileIntW(L"patches", L"pdloadertext", TRUE, CONFIG_FILE);
auto nHideStatusIcons = GetPrivateProfileIntW(L"patches", L"hide_status_icons", FALSE, CONFIG_FILE);
auto nStatusIcons = GetPrivateProfileIntW(L"patches", L"status_icons", 0, 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 nHidePVWatermark = GetPrivateProfileIntW(L"patches", L"hide_pv_watermark", FALSE, CONFIG_FILE);
auto nNoPVUi = GetPrivateProfileIntW(L"patches", L"no_pv_ui", FALSE, CONFIG_FILE); auto nNoPVUi = GetPrivateProfileIntW(L"patches", L"no_pv_ui", FALSE, CONFIG_FILE);
@@ -101,6 +110,7 @@ auto nMP4Movies = GetPrivateProfileIntW(L"patches", L"mp4_movies", FALSE, CONFIG
auto nNoError = GetPrivateProfileIntW(L"patches", L"no_error", FALSE, CONFIG_FILE); auto nNoError = GetPrivateProfileIntW(L"patches", L"no_error", FALSE, CONFIG_FILE);
auto nNoTimer = GetPrivateProfileIntW(L"patches", L"no_timer", TRUE, CONFIG_FILE); auto nNoTimer = GetPrivateProfileIntW(L"patches", L"no_timer", TRUE, CONFIG_FILE);
auto nNoTimerSprite = GetPrivateProfileIntW(L"patches", L"no_timer_sprite", TRUE, CONFIG_FILE); auto nNoTimerSprite = GetPrivateProfileIntW(L"patches", L"no_timer_sprite", TRUE, CONFIG_FILE);
auto nAutoDatabank = GetPrivateProfileIntW(L"patches", L"auto_databank", TRUE, CONFIG_FILE);
auto nEStageManager = GetPrivateProfileIntW(L"patches", L"enhanced_stage_manager", 0, 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 nEStageManagerEncore = GetPrivateProfileIntW(L"patches", L"enhanced_stage_manager_encore", TRUE, CONFIG_FILE);
auto nUnlockPseudo = GetPrivateProfileIntW(L"patches", L"unlock_pseudo", FALSE, CONFIG_FILE); auto nUnlockPseudo = GetPrivateProfileIntW(L"patches", L"unlock_pseudo", FALSE, CONFIG_FILE);
@@ -0,0 +1,46 @@
#pragma once
#include <cstdint>
namespace Storage
{
struct FileRecord
{
union
{
void* pData; // used if allocSize is >= 16
char inlineData[16]; // used if allocSize is < 16; [8-15] not normally cleared when expanded
};
uint64_t dataLength = 0;
uint64_t allocSize = 15;
};
//void(__fastcall* divaAddStringContainer)(void*, void**) = (void(__fastcall*)(void* container, void** src))0x01400C0A40;
void customAddStringContainer(void* container, const char* str)
{
uint64_t addr = (uint64_t)container;
while (*(uint64_t*)addr != 0)
{
addr += sizeof(FileRecord);
}
FileRecord* record = (FileRecord*)addr;
size_t length = strlen(str) + 1;
if (length > 0 && length < 16)
{
memcpy_s(record->inlineData, length, str, length);
record->dataLength = length;
record->allocSize = 0;
}
else if (length >= 16)
{
char* alloc = (char*)malloc(length);
memcpy_s(alloc, length, str, length);
record->pData = alloc;
record->dataLength = length;
record->allocSize = length;
}
}
};
@@ -0,0 +1,56 @@
#pragma once
#include <string>
#include <sstream>
#include <iomanip>
std::string urlDecode(const std::string& encoded)
{
std::string decoded;
char ch;
for (size_t i = 0; i < encoded.length(); i++)
{
if (encoded[i] == '%')
{
if (i + 2 < encoded.length())
{
std::string hex = encoded.substr(i + 1, 2);
ch = static_cast<char>(std::strtol(hex.c_str(), nullptr, 16));
decoded.push_back(ch);
i += 2;
}
else
{
decoded.push_back('%');
}
}
else if (encoded[i] == '+')
{
decoded.push_back(' ');
}
else
{
decoded.push_back(encoded[i]);
}
}
return decoded;
}
std::string urlEncode(const std::string& str)
{
std::ostringstream escaped;
escaped.fill('0');
escaped << std::hex;
for (unsigned char c : str)
{
if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~')
{
escaped << c;
}
else
{
escaped << '%' << std::setw(2) << std::uppercase << static_cast<int>(c);
}
}
return escaped.str();
}
+50 -41
View File
@@ -135,8 +135,8 @@ __int64 hookedParseParameters(int a1, __int64* a2)
case 600: case 600:
*resolutionType_600 = 15; *resolutionType_600 = 15;
break; break;
default: //default:
*resolutionType_710 = 15; // *resolutionType_710 = 15;
} }
// Return to the original function // Return to the original function
switch (game_version) switch (game_version)
@@ -144,8 +144,8 @@ __int64 hookedParseParameters(int a1, __int64* a2)
case 600: case 600:
return divaParseParameters_600(a1, a2); return divaParseParameters_600(a1, a2);
break; break;
default: //default:
return divaParseParameters_710(a1, a2); // return divaParseParameters_710(a1, a2);
} }
} }
@@ -231,6 +231,40 @@ __int64 __fastcall limiterFuncLight(__int64 a1)
} }
} }
#define WRITE_MEMORY_INT(address, data) \
{ \
DWORD oldProtect, bck; \
VirtualProtect((BYTE*)(address), 4, PAGE_EXECUTE_READWRITE, &oldProtect); \
*((int*)(address)) = (data); \
VirtualProtect((BYTE*)(address), 4, oldProtect, &bck); \
}
void __fastcall hookedInitRender(int ssaa, int hd_res, int ss_alpha_mask, __int8 npr) {
if (nIntRes)
{
const __int64 widthAddress = 0x0000000140EDA8B0 + 0x0C;
const __int64 heightAddress = 0x0000000140EDA8B0 + 0x10;
const __int64 intWidthAddress = 0x0000000140EDA8D8 + 0x0C;
const __int64 intHeightAddress = 0x0000000140EDA8D8 + 0x10;
int originalWidth = *(int*)widthAddress;
int originalHeight = *(int*)heightAddress;
int originalIntWidth = *(int*)intWidthAddress;
int originalIntHeight = *(int*)intHeightAddress;
WRITE_MEMORY_INT(widthAddress, nIntResWidth);
WRITE_MEMORY_INT(heightAddress, nIntResHeight);
WRITE_MEMORY_INT(intWidthAddress, nIntResWidth);
WRITE_MEMORY_INT(intHeightAddress, nIntResHeight);
divaInitRender_710(ssaa, hd_res, ss_alpha_mask, npr);
WRITE_MEMORY_INT(widthAddress, originalWidth);
WRITE_MEMORY_INT(heightAddress, originalHeight);
WRITE_MEMORY_INT(intWidthAddress, originalIntWidth);
WRITE_MEMORY_INT(intHeightAddress, originalIntHeight);
}
else
divaInitRender_710(ssaa, hd_res, ss_alpha_mask, npr);
}
__int64 __fastcall hookedEngineUpdate(__int64 a1) __int64 __fastcall hookedEngineUpdate(__int64 a1)
{ {
if (nFpsLimit < 1) if (nFpsLimit < 1)
@@ -284,17 +318,17 @@ BOOL APIENTRY DllMain(HMODULE hModule,
} }
DetourTransactionCommit(); DetourTransactionCommit();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
switch (game_version) switch (game_version)
{ {
case 600: case 600:
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)divaParseParameters_600, hookedParseParameters); DetourAttach(&(PVOID&)divaParseParameters_600, hookedParseParameters);
DetourTransactionCommit();
break; break;
default: //default:
DetourAttach(&(PVOID&)divaParseParameters_710, hookedParseParameters); // DetourAttach(&(PVOID&)divaParseParameters_710, hookedParseParameters);
} }
DetourTransactionCommit();
// set sleep time resolution to 2ms or device minimum (whichever's lower) // set sleep time resolution to 2ms or device minimum (whichever's lower)
@@ -340,39 +374,14 @@ BOOL APIENTRY DllMain(HMODULE hModule,
switch (game_version) switch (game_version)
{ {
case 600: case 600:
{ WRITE_MEMORY_INT(0x0000000140980954, nIntResWidth);
DWORD oldProtect, bck; WRITE_MEMORY_INT(0x0000000140980958, nIntResWidth);
VirtualProtect((BYTE*)0x0000000140980954, 4, PAGE_EXECUTE_READWRITE, &oldProtect); break;
*((int*)0x0000000140980954) = nIntResWidth;
VirtualProtect((BYTE*)0x0000000140980954, 6, oldProtect, &bck);
}
{
DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x0000000140980958, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
*((int*)0x0000000140980958) = nIntResHeight;
VirtualProtect((BYTE*)0x0000000140980958, 6, oldProtect, &bck);
}
break;
default: default:
{ DetourTransactionBegin();
DWORD oldProtect, bck; DetourUpdateThread(GetCurrentThread());
VirtualProtect((BYTE*)0x00000001409B8B68, 4, PAGE_EXECUTE_READWRITE, &oldProtect); DetourAttach(&(PVOID&)divaInitRender_710, hookedInitRender);
*((int*)0x00000001409B8B68) = nIntResWidth; DetourTransactionCommit();
VirtualProtect((BYTE*)0x00000001409B8B68, 6, oldProtect, &bck);
}
{
DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x00000001409B8B6C, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
*((int*)0x00000001409B8B6C) = nIntResHeight;
VirtualProtect((BYTE*)0x00000001409B8B6C, 6, oldProtect, &bck);
}
//*((int*)0x00000001409B8B6C) = maxHeight;
//*((int*)0x00000001409B8B14) = maxWidth;
//*((int*)0x00000001409B8B18) = maxHeight;
//*((int*)0x00000001409B8B1C) = maxWidth; // No parameters width?
//*((int*)0x00000001409B8B20) = maxHeight; // No parameters height?
} }
} }
} }
@@ -6,11 +6,12 @@
#include <string> #include <string>
static int(__cdecl* divaCreateWindow_710)(const char* title, void(__cdecl* exitfunc)(int)) = (int(__cdecl*)(const char* title, void(__cdecl * exitfunc)(int)))0x140194D00; static int(__cdecl* divaCreateWindow_710)(const char* title, void(__cdecl* exitfunc)(int)) = (int(__cdecl*)(const char* title, void(__cdecl * exitfunc)(int)))0x140194D00;
__int64 (__fastcall* divaParseParameters_710)(int a1, __int64* a2) = (__int64(__fastcall*)(int a1, __int64* a2))0x140193630; void(__fastcall* divaInitRender_710)(int ssaa, int hd_res, int ss_alpha_mask, __int8 npr) = (void(__fastcall *)(int ssaa, int hd_res, int ss_alpha_mask, __int8 npr))0x0000000140502A10;
//__int64 (__fastcall* divaParseParameters_710)(int a1, __int64* a2) = (__int64(__fastcall*)(int a1, __int64* a2))0x140193630;
__int64(__fastcall* divaEngineUpdate_710)(__int64 a1) = (__int64(__fastcall*)(__int64 a1))0x140194CD0; __int64(__fastcall* divaEngineUpdate_710)(__int64 a1) = (__int64(__fastcall*)(__int64 a1))0x140194CD0;
uint8_t* fullScreenFlag_710 = (uint8_t*)0x140EDA5D1; uint8_t* fullScreenFlag_710 = (uint8_t*)0x140EDA5D1;
DWORD* resolutionType_710 = (DWORD*)0x140EDA5D4; //DWORD* resolutionType_710 = (DWORD*)0x140EDA5D4;
static int(__cdecl* divaCreateWindow_600)(const char* title, void(__cdecl* exitfunc)(int)) = (int(__cdecl*)(const char* title, void(__cdecl * exitfunc)(int)))0x14018CD00; static int(__cdecl* divaCreateWindow_600)(const char* title, void(__cdecl* exitfunc)(int)) = (int(__cdecl*)(const char* title, void(__cdecl * exitfunc)(int)))0x14018CD00;
@@ -1,6 +1,7 @@
#pragma once #pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers //#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h> //#include <windows.h>
//#include <psapi.h>
#include <string> #include <string>
#include <vector> #include <vector>
#include <map> #include <map>
@@ -127,3 +128,36 @@ LPCWSTR DATA_FILE = DATA_FILE_STRING.c_str();
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\ShaderPatchConfig.ini"; std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\ShaderPatchConfig.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str(); LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
//bool hasConflicts()
//{
// printf("[ShaderPatch] Checking for conflicts...\n");
//
// HMODULE* hModules = new HMODULE[USHRT_MAX];
// HANDLE hProcess;
// DWORD cbNeeded;
//
// hProcess = GetCurrentProcess();
//
// if (EnumProcessModules(hProcess, hModules, sizeof(hModules), &cbNeeded)) {
// for (unsigned long long i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
// auto pNameFunc = (LPCWSTR(*)())GetProcAddress(hModules[i], "GetPluginName");
// if (pNameFunc) {
// LPCWSTR name = pNameFunc();
// if (name && lstrcmpW(name, L"DivaGL") == 0)
// {
// // detected DivaGL
// printf("[ShaderPatch] Detected DivaGL! Quitting!\n");
//#ifdef _DEBUG
// MessageBoxExW(NULL, L"Detected DivaGL! Quitting!\n", L"ShaderPatch", MB_OK, 0);
//#endif
// delete[] hModules;
// return true;
// }
// }
// }
// }
//
// printf("[ShaderPatch] No conflicts found.\n");
// delete[] hModules;
// return false;
//}
@@ -32,9 +32,13 @@ namespace TLAC::Components
Pause::menusets Pause::curMenuSet = MENUSET_MAIN; Pause::menusets Pause::curMenuSet = MENUSET_MAIN;
std::chrono::time_point<std::chrono::high_resolution_clock> Pause::menuItemMoveTime; std::chrono::time_point<std::chrono::high_resolution_clock> Pause::menuItemMoveTime;
std::vector<uint8_t> Pause::origAetMovOp; std::vector<uint8_t> Pause::origAetMovOp;
float_t Pause::origDeltaFrameHistory = 0.0f;
int32_t Pause::origDeltaFrameHistoryInt = 0;
uint8_t* Pause::aetMovPatchAddress = (uint8_t*)0x1401703b3; uint8_t* Pause::aetMovPatchAddress = (uint8_t*)0x1401703b3;
std::vector<uint8_t> Pause::origFramespeedOp; std::vector<uint8_t> Pause::origFramespeedOp;
uint8_t* Pause::framespeedPatchAddress = (uint8_t*)0x140192D50; uint8_t* Pause::framespeedPatchAddress = (uint8_t*)0x140192D50;
float_t* Pause::deltaFrameHistoryAddress = (float_t*)0x140EDA6C0;
int32_t* Pause::deltaFrameHistoryIntAddress = (int32_t*)0x140EDA6C4;
std::vector<uint8_t> Pause::origAgeageHairOp; std::vector<uint8_t> Pause::origAgeageHairOp;
uint8_t* Pause::ageageHairPatchAddress = (uint8_t*)0x14054352c; uint8_t* Pause::ageageHairPatchAddress = (uint8_t*)0x14054352c;
std::vector<bool> Pause::streamPlayStates; std::vector<bool> Pause::streamPlayStates;
@@ -136,6 +140,12 @@ namespace TLAC::Components
InjectCode(framespeedPatchAddress, { 0x0f, 0x57, 0xc0, 0xc3 }); // XORPS XMM0,XMM0; RET InjectCode(framespeedPatchAddress, { 0x0f, 0x57, 0xc0, 0xc3 }); // XORPS XMM0,XMM0; RET
InjectCode(ageageHairPatchAddress, { 0x0f, 0x57, 0xdb }); // XORPS XMM3,XMM3 InjectCode(ageageHairPatchAddress, { 0x0f, 0x57, 0xdb }); // XORPS XMM3,XMM3
origDeltaFrameHistory = *deltaFrameHistoryAddress;
origDeltaFrameHistoryInt = *deltaFrameHistoryIntAddress;
*deltaFrameHistoryAddress = 0.0f;
*deltaFrameHistoryIntAddress = 0;
uint64_t audioMixerAddr = *(uint64_t*)(AUDIO_MAIN_CLASS_ADDRESS + 0x70); uint64_t audioMixerAddr = *(uint64_t*)(AUDIO_MAIN_CLASS_ADDRESS + 0x70);
uint64_t audioStreamsAddress = *(uint64_t*)(audioMixerAddr + 0x18); uint64_t audioStreamsAddress = *(uint64_t*)(audioMixerAddr + 0x18);
int nAudioStreams = *(uint64_t*)(audioMixerAddr + 0x20); int nAudioStreams = *(uint64_t*)(audioMixerAddr + 0x20);
@@ -279,6 +289,9 @@ namespace TLAC::Components
InjectCode(framespeedPatchAddress, origFramespeedOp); InjectCode(framespeedPatchAddress, origFramespeedOp);
InjectCode(ageageHairPatchAddress, origAgeageHairOp); InjectCode(ageageHairPatchAddress, origAgeageHairOp);
*deltaFrameHistoryAddress = origDeltaFrameHistory;
*deltaFrameHistoryIntAddress = origDeltaFrameHistoryInt;
uint64_t audioMixerAddr = *(uint64_t*)(AUDIO_MAIN_CLASS_ADDRESS + 0x70); uint64_t audioMixerAddr = *(uint64_t*)(AUDIO_MAIN_CLASS_ADDRESS + 0x70);
uint64_t audioStreamsAddress = *(uint64_t*)(audioMixerAddr + 0x18); uint64_t audioStreamsAddress = *(uint64_t*)(audioMixerAddr + 0x18);
int nAudioStreams = *(uint64_t*)(audioMixerAddr + 0x20); int nAudioStreams = *(uint64_t*)(audioMixerAddr + 0x20);
@@ -47,6 +47,10 @@ namespace TLAC::Components
static std::vector<uint8_t> origFramespeedOp; static std::vector<uint8_t> origFramespeedOp;
static uint8_t* framespeedPatchAddress; static uint8_t* framespeedPatchAddress;
static float_t origDeltaFrameHistory;
static int32_t origDeltaFrameHistoryInt;
static float_t* deltaFrameHistoryAddress;
static int32_t* deltaFrameHistoryIntAddress;
static std::vector<uint8_t> origAgeageHairOp; static std::vector<uint8_t> origAgeageHairOp;
static uint8_t* ageageHairPatchAddress; static uint8_t* ageageHairPatchAddress;
+1 -1
View File
@@ -8,7 +8,7 @@ constexpr uint8_t JNE_OPCODE = 0x85;
//constexpr uint64_t ENGINE_UPDATE_HOOK_TARGET_ADDRESS = 0x000000014018CC40; //constexpr uint64_t ENGINE_UPDATE_HOOK_TARGET_ADDRESS = 0x000000014018CC40;
constexpr uint64_t ENGINE_UPDATE_INPUT_ADDRESS = 0x000000014018CBB0; constexpr uint64_t ENGINE_UPDATE_INPUT_ADDRESS = 0x000000014018CBB0;
constexpr uint64_t ENGINE_DRAW_2D_ADDRESS = 0x0000000140501F70; constexpr uint64_t ENGINE_STAGE_DISP_SHADOW_ADDRESS = 0x0000000140649840;
constexpr uint64_t ENGINE_FINISH_DRAW_ADDRESS = 0x0000000140192730; constexpr uint64_t ENGINE_FINISH_DRAW_ADDRESS = 0x0000000140192730;
constexpr uint64_t CURRENT_GAME_STATE_ADDRESS = 0x0000000140EDA810; constexpr uint64_t CURRENT_GAME_STATE_ADDRESS = 0x0000000140EDA810;
@@ -21,7 +21,9 @@ namespace TLAC::Input
// Hori F2nd Miniboard (Hatsune Miku Sho): {00490F0D-0000-0000-0000-504944564944} // Hori F2nd Miniboard (Hatsune Miku Sho): {00490F0D-0000-0000-0000-504944564944}
{ 0x00490F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }, { 0x00490F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },
// Hori FT Senyou: {013C0F0D-0000-0000-0000-504944564944} // Hori FT Senyou: {013C0F0D-0000-0000-0000-504944564944}
{ 0x013C0F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } } { 0x013C0F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },
// HORI HATSUNE MIKU 39S CONTROLLER: {00FB0F0D-0000-0000-0000-504944564944}
{ 0x00FB0F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }
}; };
class DualShock4 : public Controller, public IInputDevice class DualShock4 : public Controller, public IInputDevice
+4 -4
View File
@@ -22,7 +22,7 @@
#pragma comment(lib, "detours.lib") #pragma comment(lib, "detours.lib")
void(__cdecl* divaEngineUpdate)() = (void(__cdecl*)())0x14018CC40; void(__cdecl* divaEngineUpdate)() = (void(__cdecl*)())0x14018CC40;
void(__cdecl* divaEngineDraw2D)(void* addr) = (void(__cdecl*)(void* addr))ENGINE_DRAW_2D_ADDRESS; void(__cdecl* divaEngineStageDispShadow)() = (void(__cdecl*)())ENGINE_STAGE_DISP_SHADOW_ADDRESS;
LRESULT CALLBACK MessageWindowProcessCallback(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MessageWindowProcessCallback(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI WindowMessageDispatcher(LPVOID); DWORD WINAPI WindowMessageDispatcher(LPVOID);
@@ -396,10 +396,10 @@ void hookedEngineUpdate()
//divaEngineUpdate(); //divaEngineUpdate();
} }
void hookedEngineDraw2D(void* addr) void hookedEngineStageDispShadow()
{ {
divaEngineStageDispShadow();
TLAC::UpdateDraw2D(); TLAC::UpdateDraw2D();
divaEngineDraw2D(addr);
} }
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
@@ -425,7 +425,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReser
DetourTransactionBegin(); DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread()); DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)divaEngineDraw2D, hookedEngineDraw2D); DetourAttach(&(PVOID&)divaEngineStageDispShadow, hookedEngineStageDispShadow);
DetourTransactionCommit(); DetourTransactionCommit();
//TLAC::InitializeExtraSettings(); //TLAC::InitializeExtraSettings();