Compare commits
58
Commits
old_unstable
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef43d22686 | ||
|
|
6ba220cc29 | ||
|
|
b20fc255dc | ||
|
|
cf26061123 | ||
|
|
3d422e4743 | ||
|
|
a4216507d6 | ||
|
|
4fc2af2878 | ||
|
|
87d453081b | ||
|
|
158c90ef84 | ||
|
|
a766413a5d | ||
|
|
430e650d0d | ||
|
|
be29f090f3 | ||
|
|
c6ceb61636 | ||
|
|
232ac31190 | ||
|
|
eb6964d0b9 | ||
|
|
b6fc62bbf1 | ||
|
|
2c10f27ab0 | ||
|
|
360305357b | ||
|
|
26c6dc76c7 | ||
|
|
b746ddf001 | ||
|
|
4cfd925af4 | ||
|
|
d70e20496a | ||
|
|
0b7083edad | ||
|
|
60958cc3c1 | ||
|
|
3b6bd03c49 | ||
|
|
d7dfc57192 | ||
|
|
af017ecc4e | ||
|
|
902f0c3421 | ||
|
|
501bb2de61 | ||
|
|
f498fee877 | ||
|
|
5a72210023 | ||
|
|
49c69de847 | ||
|
|
5652879f74 | ||
|
|
0a3b41977e | ||
|
|
057a267fe8 | ||
|
|
ede1039f43 | ||
|
|
2bac4de81d | ||
|
|
74e2c9a31d | ||
|
|
25a2a5f6f6 | ||
|
|
1c026e2661 | ||
|
|
bef5d481a5 | ||
|
|
ea159ed465 | ||
|
|
8b5b514368 | ||
|
|
66db5deb2b | ||
|
|
e8c2ac672a | ||
|
|
7df98ea648 | ||
|
|
162cc52c6b | ||
|
|
c2343f79f2 | ||
|
|
ea968b1762 | ||
|
|
4149a3c8e9 | ||
|
|
d8693781ba | ||
|
|
49e2b03159 | ||
|
|
bc925fd514 | ||
|
|
b511bf64c3 | ||
|
|
db159fde81 | ||
|
|
4ebc4b3f85 | ||
|
|
f93dab0b9a | ||
|
|
eb17a30a06 |
+1
-1
@@ -1,7 +1,7 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
* binary
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
._*
|
||||
.DS_Store
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
|
||||
+2
-2
@@ -15000,8 +15000,8 @@ source code}{}}}\rtlch\dbch\af8\hich\af5 \ltrch\fs22\lang16\ulnone\ulc0\b0\loch\
|
||||
\par \pard\plain \s0\dbch\af6\langfe1081\dbch\af7\afs24\alang1081\ql\nowidctlpar\hyphpar0\ltrpar\cf0\loch\f3\fs24\lang1040\kerning1\sl276\slmult1\ql\sb0\sa200{\rtlch\dbch\af8\hich\af5 \ltrch\fs22\lang16\ulnone\ulc0\b0\loch\f5\loch
|
||||
For information on getting and installing the latest release,}
|
||||
\par \pard\plain \s0\dbch\af6\langfe1081\dbch\af7\afs24\alang1081\ql\nowidctlpar\hyphpar0\ltrpar\cf0\loch\f3\fs24\lang1040\kerning1\sl276\slmult1\ql\sb0\sa200{\rtlch\dbch\af8\hich\af5 \ltrch\fs22\lang16\ulnone\ulc0\b0\loch\f5\loch
|
||||
please read the wiki at }{{\field{\*\fldinst HYPERLINK "https://notabug.org/PDModdingCommunity/PD-Loader/wiki" }{\fldrslt {\rtlch\dbch\af8\hich\af5 \ltrch\langfe255\cf9\lang255\ul\ulc0\fs22\lang16\ulnone\ulc0\b0\loch\f5\loch
|
||||
https://notabug.org/PDModdingCommunity/PD-Loader/wiki}}}}
|
||||
please read the wiki at }{{\field{\*\fldinst HYPERLINK "https://github.com/PDModdingCommunity/PD-Loader/wiki" }{\fldrslt {\rtlch\dbch\af8\hich\af5 \ltrch\langfe255\cf9\lang255\ul\ulc0\fs22\lang16\ulnone\ulc0\b0\loch\f5\loch
|
||||
https://github.com/PDModdingCommunity/PD-Loader/wiki}}}}
|
||||
\par \pard\plain \s0\dbch\af6\langfe1081\dbch\af7\afs24\alang1081\ql\nowidctlpar\hyphpar0\ltrpar\cf0\loch\f3\fs24\lang1040\kerning1\sl276\slmult1\ql\sb0\sa200{\rtlch\dbch\af8\hich\af5 \ltrch\fs22\lang16\ulnone\ulc0\b0\loch\f5\loch
|
||||
If you've already read it, pay more attention and you'll find the right link.}
|
||||
\par \pard\plain \s0\dbch\af6\langfe1081\dbch\af7\afs24\alang1081\ql\nowidctlpar\hyphpar0\ltrpar\cf0\loch\f3\fs24\lang1040\kerning1\sl276\slmult1\ql\sb0\sa200\rtlch\dbch\af8\hich\af5 \ltrch\fs22\lang16\ulnone\ulc0\b0\loch\f5\loch
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ If you just wanted to play the game, you downloaded the wrong thing.
|
||||
Do not click the download button next to the git URL, that's for the source code.
|
||||
|
||||
For information on getting and installing the latest release,
|
||||
please read the wiki at https://notabug.org/nastys/PD-Loader/wiki
|
||||
please read the wiki at https://github.com/nastys/PD-Loader/wiki
|
||||
If you've already read it, pay more attention and you'll find the right link.
|
||||
|
||||
You should also read the wiki if you have any issues, before asking questions.
|
||||
+2
-8
@@ -18,7 +18,7 @@ after_build:
|
||||
|
||||
md %TMP%\full\ram\
|
||||
|
||||
md %TMP%\full\ram\databank_template\
|
||||
md %TMP%\full\ram\databank_template_v2\
|
||||
|
||||
|
||||
|
||||
@@ -30,19 +30,13 @@ after_build:
|
||||
|
||||
copy %APPVEYOR_BUILD_FOLDER%\source-code\data\verify_base_game.sfv %TMP%\full\
|
||||
|
||||
copy %APPVEYOR_BUILD_FOLDER%\source-code\data\verify_base_game.md5 %TMP%\full\
|
||||
|
||||
copy %APPVEYOR_BUILD_FOLDER%\source-code\data\verify_mount_data.sfv %TMP%\full\
|
||||
|
||||
copy %APPVEYOR_BUILD_FOLDER%\source-code\data\verify_mount_data.md5 %TMP%\full\
|
||||
|
||||
copy %APPVEYOR_BUILD_FOLDER%\source-code\data\glut32.dll %TMP%\full\
|
||||
|
||||
copy %APPVEYOR_BUILD_FOLDER%\source-code\data\plugins\*.* %TMP%\full\plugins\
|
||||
|
||||
copy "%APPVEYOR_BUILD_FOLDER%\source-code\data\plugins\Novidia Shaders\*.*" "%TMP%\full\plugins\Novidia Shaders\"
|
||||
|
||||
copy %APPVEYOR_BUILD_FOLDER%\source-code\data\ram\databank_template\*.dat %TMP%\full\ram\databank_template\
|
||||
copy %APPVEYOR_BUILD_FOLDER%\source-code\data\ram\databank_template_v2\*.dat %TMP%\full\ram\databank_template_v2\
|
||||
|
||||
copy %APPVEYOR_BUILD_FOLDER%\source-code\data\patches\custom_freeplay_text_example.p %TMP%\full\patches\
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.28922.388
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.12.35527.113
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PD-Loader", "source\PD-Loader\PD-Loader.vcxproj", "{CA479467-D518-46A2-AC86-3098ADA99FE5}"
|
||||
EndProject
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
[InternetShortcut]
|
||||
URL=https://dotnet.microsoft.com/download/dotnet-framework/net48
|
||||
@@ -0,0 +1,2 @@
|
||||
[InternetShortcut]
|
||||
URL=https://www.quicksfv.org/qsfv236x64.exe
|
||||
@@ -0,0 +1,2 @@
|
||||
[InternetShortcut]
|
||||
URL=https://aka.ms/vs/16/release/vc_redist.x64.exe
|
||||
@@ -2,5 +2,5 @@
|
||||
Prop3=19,11
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=https://notabug.org/PDModdingCommunity/PD-Loader/wiki
|
||||
URL=https://github.com/PDModdingCommunity/PD-Loader/wiki
|
||||
HotKey=0
|
||||
|
||||
Binary file not shown.
@@ -25,25 +25,28 @@ Toon_Hair_Improve=0
|
||||
Toon_Hair_Improve_Val1=1.25
|
||||
|
||||
# Lyb's toon shader improvements (24 sept 2019)
|
||||
# Fixes by korenkonder (11 jan 2025)
|
||||
# Toon_Lines_Improve: Adjusts toon shader outlines
|
||||
Toon_Lines_Improve=0
|
||||
# ???
|
||||
Toon_Lines_Improve_Val1=0.75
|
||||
# Thickness Multiplier(?)
|
||||
Toon_Lines_Improve_Val2=0.75
|
||||
# Thickness Offset(?)
|
||||
Toon_Lines_Improve_Val3=0.75
|
||||
# Skin Shadow Strength
|
||||
Toon_Lines_Improve_Val1=0.05
|
||||
# Skin Outline Strength
|
||||
Toon_Lines_Improve_Val2=0.9
|
||||
# Outline Strength Multiplier
|
||||
Toon_Lines_Improve_Val3=0.7
|
||||
# Outline Strength Offset
|
||||
Toon_Lines_Improve_Val4=0.25
|
||||
|
||||
[Patches]
|
||||
# Compatibility patches:
|
||||
# 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)
|
||||
.*=arch:GA,TU||cfg:compat||from:SHORT ||to:
|
||||
.*=arch:GB,AD,GA,GV,TU||cfg:compat||from:SHORT ||to:
|
||||
# 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
|
||||
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:
|
||||
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 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>;
|
||||
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: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.05;||to:MUL density.y, density.y, <val1>;
|
||||
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
|
||||
(?:movie|sprite|imgfilter).*=cfg:intel||from:; ||to:;\n
|
||||
|
||||
@@ -22,14 +22,17 @@ Toon_Hair_Improve=0
|
||||
Toon_Hair_Improve_Val1=1.25
|
||||
|
||||
# Lyb's toon shader improvements (24 sept 2019)
|
||||
# Fixes by korenkonder (11 jan 2025)
|
||||
# Toon_Lines_Improve: Adjusts toon shader outlines
|
||||
Toon_Lines_Improve=0
|
||||
# ???
|
||||
Toon_Lines_Improve_Val1=0.75
|
||||
# Thickness Multiplier(?)
|
||||
Toon_Lines_Improve_Val2=0.75
|
||||
# Thickness Offset(?)
|
||||
Toon_Lines_Improve_Val3=0.75
|
||||
# Skin Shadow Strength
|
||||
Toon_Lines_Improve_Val1=0.05
|
||||
# Skin Outline Strength
|
||||
Toon_Lines_Improve_Val2=0.9
|
||||
# Outline Strength Multiplier
|
||||
Toon_Lines_Improve_Val3=0.7
|
||||
# Outline Strength Offset
|
||||
Toon_Lines_Improve_Val4=0.25
|
||||
|
||||
# Debug patches:
|
||||
# Nametags
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
Enable=1
|
||||
|
||||
[GPU]
|
||||
# Force GPU model -- -1=auto, 0=Kepler, 1=Maxwell, 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
|
||||
|
||||
[Launcher]
|
||||
@@ -17,15 +17,9 @@ Skip=0
|
||||
No_GPU_Dialog=0
|
||||
# Sets the dark colour scheme in the launcher.
|
||||
Dark_Launcher=0
|
||||
# Enables acrylic blur in the launcher on Windows 10 20H2 or later.
|
||||
Acrylic_Blur=0
|
||||
#Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing
|
||||
OpenGL_Patch_A=0
|
||||
#Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing
|
||||
OpenGL_Patch_B=0
|
||||
# Command line arguments
|
||||
Command_Line=
|
||||
# Launches divahook.bat intead of diva.exe.
|
||||
# Launches divahook.bat/start.bat intead of diva.exe.
|
||||
Use_divahook_bat=0
|
||||
|
||||
[Patches]
|
||||
@@ -38,14 +32,18 @@ Cursor=1
|
||||
#Use 2 channels instead of 4 (when not using DivaSound)
|
||||
Stereo=1
|
||||
#Skip one or more menus -- 0=disabled, 1=guest, 2=guest+normal
|
||||
Quick_Start=1
|
||||
Quick_Start=0
|
||||
#Disable the scrolling sound effect
|
||||
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")
|
||||
#Number of stages (0 = disabled)
|
||||
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,8 +52,8 @@ Force_Expressions=0
|
||||
Force_Look=0
|
||||
#Disable hand scaling
|
||||
No_Hand_Scaling=0
|
||||
#Default hand size -- -1=default, 12200=PDA
|
||||
Default_Hand_Size=-1
|
||||
#Default hand size -- 0-10000=default, 12200=PDA, 1000000=maximum
|
||||
Default_Hand_Size_uint=0
|
||||
#Sing missed notes
|
||||
Sing_Missed=0
|
||||
#Hide the volume and SE control buttons
|
||||
@@ -64,6 +62,8 @@ Hide_Volume=0
|
||||
No_PV_UI=0
|
||||
#Hide the watermark that's usually shown in PV viewing mode
|
||||
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
|
||||
Status_Icons=0
|
||||
#Disable showing lyrics
|
||||
@@ -88,8 +88,6 @@ Card=0
|
||||
Hardware_Slider=0
|
||||
#Enable custom patches
|
||||
Custom_Patches=1
|
||||
#Prevent data deletion
|
||||
Prevent_Data_Deletion=0
|
||||
|
||||
[Graphics]
|
||||
# Lag Compensation
|
||||
@@ -111,6 +109,8 @@ MAG=0
|
||||
DOF=1
|
||||
# Reflections
|
||||
Reflections=1
|
||||
# Gamma -- 0 or 100=default, 125=console-like
|
||||
Gamma=100
|
||||
# Shadows
|
||||
Shadows=1
|
||||
# Transparent Meshes
|
||||
|
||||
@@ -25,6 +25,8 @@ PID = C216
|
||||
|
||||
# Rumble (Xinput)
|
||||
rumble = true
|
||||
xinput_rumble_intensity_left = 8000
|
||||
xinput_rumble_intensity_right = 4000
|
||||
|
||||
# Pause when focus is lost
|
||||
autopause =true
|
||||
@@ -59,7 +61,9 @@ MENU_L = Left, Up, Ds4_L1, XINPUT_LS, Ds4_DPad_Left, Ds4_DPad_Up, XINPUT_LEFT, X
|
||||
MENU_R = Right, Down, Ds4_R1, XINPUT_RS, Ds4_DPad_Right, Ds4_DPad_Down, XINPUT_RIGHT, XINPUT_DOWN, E, O, Ds4_L_Stick_Right, XINPUT_LRIGHT, Ds4_L_Stick_Down, XINPUT_LDOWN, Ds4_R_Stick_Right, XINPUT_RRIGHT, Ds4_R_Stick_Down, XINPUT_RDOWN
|
||||
MENU_CIRCLE = Spacebar
|
||||
|
||||
TOON = F9
|
||||
COIN = F10
|
||||
WIREFRAME = Backspace
|
||||
|
||||
# Touch Slider:
|
||||
LEFT_SIDE_SLIDE_LEFT = Q, Ds4_L_Stick_Left, XINPUT_LLEFT
|
||||
@@ -91,6 +95,7 @@ RIGHT_SIDE_SLIDE_RIGHT = O, Ds4_R_Stick_Right, XINPUT_RRIGHT
|
||||
|
||||
# - Special Keys
|
||||
# "Enter", "Tab", "Backspace", "Spacebar", "Insert", "Delete", "Home", "End", "PageUp", "PageDown", "Escape"
|
||||
# "Comma", "Period", "Colon", "Slash", "Tilde", "LeftBracket", "Backslash", "RightBracket", "SingleDoubleQuote", "OEM_8"
|
||||
|
||||
# --- MOUSE BUTTON NAMES: ---
|
||||
# "MouseLeft", "MouseMiddle", "MouseRight", "MouseX1", "MouseX2"
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
%2A%2A%$A
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
%2A%2A%2A
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+1864
-1854
File diff suppressed because it is too large
Load Diff
@@ -34,9 +34,9 @@ namespace GPUModel
|
||||
// note that the used GL context may differ
|
||||
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);
|
||||
if (nGPUModel >= 0 && nGPUModel <= 2)
|
||||
if (nGPUModel >= 0 && nGPUModel <= 4)
|
||||
{
|
||||
std::string arch;
|
||||
switch (nGPUModel)
|
||||
@@ -53,6 +53,12 @@ namespace GPUModel
|
||||
case 3:
|
||||
arch = "GA000";
|
||||
break;
|
||||
case 4:
|
||||
arch = "AD000";
|
||||
break;
|
||||
case 5:
|
||||
arch = "GB000";
|
||||
break;
|
||||
}
|
||||
|
||||
printf("[GPUModel] GPU Model override: %s\n", arch.c_str());
|
||||
@@ -65,7 +71,7 @@ namespace GPUModel
|
||||
//DWORD dwAttrib = GetFileAttributesW(L"amdgfxinfo64.dll");
|
||||
//if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
|
||||
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";
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ void LoadDVA(std::wstring &path, LPCWSTR dir, LPCWSTR fileName)
|
||||
msg.append(L"\n\nIs the Microsoft Visual C++ Redistributable for Visual Studio 2019 (x64) installed?");
|
||||
break;
|
||||
case 998:
|
||||
msg.append(L"\n\nAre all dependencies installed?\nIf the problem persists, please disable this plugin.");
|
||||
msg.append(L"\n\nPossible causes:\n- a dependency is not installed; or\n- GPU detection failed (select the GPU Type manually/force Novidia in its Config).");
|
||||
break;
|
||||
default:
|
||||
msg.append(L"\n\nAre all dependencies installed?");
|
||||
@@ -215,6 +215,8 @@ void FindFiles(WIN32_FIND_DATAW* fd)
|
||||
do {
|
||||
if (!(fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
if (fd->cFileName[0] == '.' && fd->cFileName[1] == '_') continue; // exclude macOS metadata
|
||||
|
||||
auto pos = wcslen(fd->cFileName);
|
||||
|
||||
if (fd->cFileName[pos - 4] == '.' &&
|
||||
@@ -771,7 +773,7 @@ void Init()
|
||||
(PathFileExistsW(SHADERPATCH_TEMPLATE) && !PathFileExistsW(SHADERPATCH)) ||
|
||||
(PathFileExistsW(SHADERPATCHCONFIG_TEMPLATE) && !PathFileExistsW(SHADERPATCHCONFIG))
|
||||
)
|
||||
MessageBoxW(0, L"Could not install configuration files. Is the game in a read-only folder?", L"PD Loader", MB_ICONWARNING);
|
||||
MessageBoxW(0, L"Could not install configuration files. Possible causes:\n\n- PD Loader was not installed correctly\n- The game is on a read-only drive\n- No privileges to write in the folder", L"PD Loader", MB_ICONWARNING);
|
||||
|
||||
CreateDirectoryW(L"plugins\\pv_equip", NULL);
|
||||
const auto eq_modules = L"plugins\\pv_equip\\modules.ini";
|
||||
@@ -796,7 +798,7 @@ void Init()
|
||||
stream.close();
|
||||
}
|
||||
|
||||
const std::filesystem::path databank_template = L"ram\\databank_template";
|
||||
const std::filesystem::path databank_template = L"ram\\databank_template_v2";
|
||||
const std::filesystem::path databank = L"ram\\databank";
|
||||
if (!std::filesystem::exists(databank)&&std::filesystem::exists(databank_template))
|
||||
{
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\..\..\dependencies\simpleini;..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
@@ -72,7 +72,7 @@
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<AdditionalIncludeDirectories>..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\..\..\dependencies\simpleini;..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
|
||||
</ClCompile>
|
||||
|
||||
@@ -10,8 +10,9 @@
|
||||
#include <mfapi.h>
|
||||
#include <mferror.h>
|
||||
#include <mftransform.h>
|
||||
#include <SimpleIni.h>
|
||||
|
||||
bool forceSoftwareDecoding = false, debug = false;
|
||||
bool forceSoftwareDecoding = false, forceHybridDecoding = false, debug = false;
|
||||
|
||||
IDirect3DDeviceManager9* deviceManager;
|
||||
|
||||
@@ -146,6 +147,22 @@ VTABLE_HOOK(HRESULT, IMFTransform, ProcessMessage, MFT_MESSAGE_TYPE eMessage, UL
|
||||
if (SUCCEEDED(result))
|
||||
INSTALL_VTABLE_HOOK(This, ProcessOutput, 25);
|
||||
}
|
||||
else if (!forceHybridDecoding && eMessage == MFT_MESSAGE_SET_D3D_MANAGER && result == 0)
|
||||
{
|
||||
static bool warn = false;
|
||||
if (!warn)
|
||||
{
|
||||
MessageBoxW(0, L"Your system supports DXVA hardware decoding and Force Hybrid Decoding is disabled.\nDivaMovie will be disabled.\n\nIt is HIGHLY recommended to restart the game now.", L"DivaMovie", MB_ICONINFORMATION);
|
||||
|
||||
CSimpleIniW ini_reader;
|
||||
ini_reader.SetUnicode(false);
|
||||
ini_reader.LoadFile(MASTER_CONFIG_FILE);
|
||||
ini_reader.SetValue(L"plugins", L"DivaMovie.dva", L"0");
|
||||
ini_reader.SaveFile(MASTER_CONFIG_FILE);
|
||||
|
||||
warn = true;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -177,6 +194,7 @@ HOOK(HRESULT, DXVA2CreateDirect3DDeviceManager, PROC_ADDRESS("dxva2.dll", "DXVA2
|
||||
|
||||
void loadConfig() {
|
||||
forceSoftwareDecoding = GetPrivateProfileIntW(L"general", L"force_software_decoding", 0, CONFIG_FILE) > 0 ? true : false;
|
||||
forceHybridDecoding = GetPrivateProfileIntW(L"general", L"force_hybrid_decoding", 0, CONFIG_FILE) > 0 ? true : false;
|
||||
debug = GetPrivateProfileIntW(L"general", L"debug", 0, CONFIG_FILE) > 0 ? true : false;
|
||||
}
|
||||
|
||||
@@ -194,7 +212,8 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
||||
|
||||
PluginConfig::PluginConfigOption config[] = {
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"force_software_decoding", L"general", CONFIG_FILE, L"Force Software Decoding", L"Use software decoding even on systems that support DXVA hardware decoding.", false } },
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"debug", L"general", CONFIG_FILE, L"Debug", L"Enable PRINT (possibly at the cost of performance).", false } },
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"force_hybrid_decoding", L"general", CONFIG_FILE, L"Force Hybrid Decoding", L"Do not disable DivaMovie on systems that support DXVA hardware decoding.\nCan cause issues on recent drivers.", false } },
|
||||
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"debug", L"general", CONFIG_FILE, L"Debug (slow!)", L"Enable PRINT (possibly at the cost of performance).", false } },
|
||||
};
|
||||
|
||||
extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
|
||||
@@ -204,7 +223,7 @@ extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
|
||||
|
||||
extern "C" __declspec(dllexport) LPCWSTR GetPluginDescription(void)
|
||||
{
|
||||
return L"DivaMovie Plugin by Skyth\n\nDivaMovie enables movies on systems that does not support DXVA hardware decoding.";
|
||||
return L"DivaMovie Plugin by Skyth\n\nDivaMovie enables movies on systems that do not support DXVA hardware decoding.";
|
||||
}
|
||||
|
||||
extern "C" __declspec(dllexport) PluginConfig::PluginConfigArray GetPluginOptions(void)
|
||||
|
||||
@@ -22,6 +22,9 @@ std::wstring DirPath() {
|
||||
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\DivaMovie.ini";
|
||||
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
|
||||
|
||||
std::wstring MASTER_CONFIG_FILE_STRING = DirPath() + L"\\plugins\\config.ini";
|
||||
LPCWSTR MASTER_CONFIG_FILE = MASTER_CONFIG_FILE_STRING.c_str();
|
||||
|
||||
#define PRINT(value, ...) if (debug) printf(value, __VA_ARGS__);
|
||||
|
||||
#define PROC_ADDRESS(libraryName, procName) \
|
||||
|
||||
@@ -7,33 +7,36 @@
|
||||
#include <tchar.h>
|
||||
#include <thread>
|
||||
|
||||
#define HEAD_ACCESSORY 0
|
||||
#define HAIR 1
|
||||
#define UNKNOWN_1 2
|
||||
#define UNKNOWN_2 3
|
||||
#define FACE_ACCESSORY 4
|
||||
#define UNKNOWN_3 5
|
||||
#define FACE_TEXTURES 6
|
||||
#define UNKNOWN_4 7
|
||||
#define CHEST_ACCESSORY 8
|
||||
#define UNKNOWN_5 9
|
||||
#define BODY 10
|
||||
#define UNKNOWN_6 11
|
||||
#define UNKNOWN_7 12
|
||||
#define UNKNOWN_8 13
|
||||
#define HANDS 14,
|
||||
#define UNKNOWN_9 15
|
||||
#define BACK_ACCESSORY 16
|
||||
#define UNKNOWN_10 17
|
||||
#define UNKNOWN_11 18
|
||||
#define UNKNOWN_12 19
|
||||
#define UNKNOWN_13 20
|
||||
#define UNKNOWN_14 21
|
||||
#define UNKNOWN_15 22
|
||||
#define UNKNOWN_16 23
|
||||
#define HEAD 24
|
||||
#define ALL -1
|
||||
#define NONE -2
|
||||
static const enum module_part
|
||||
{
|
||||
HEAD_ACCESSORY,
|
||||
HAIR,
|
||||
UNKNOWN_1,
|
||||
UNKNOWN_2,
|
||||
FACE_ACCESSORY,
|
||||
UNKNOWN_3,
|
||||
FACE_TEXTURES,
|
||||
UNKNOWN_4,
|
||||
CHEST_ACCESSORY,
|
||||
UNKNOWN_5,
|
||||
BODY,
|
||||
UNKNOWN_6,
|
||||
UNKNOWN_7,
|
||||
UNKNOWN_8,
|
||||
HANDS,
|
||||
UNKNOWN_9,
|
||||
BACK_ACCESSORY,
|
||||
UNKNOWN_10,
|
||||
UNKNOWN_11,
|
||||
UNKNOWN_12,
|
||||
UNKNOWN_13,
|
||||
UNKNOWN_14,
|
||||
UNKNOWN_15,
|
||||
UNKNOWN_16,
|
||||
HEAD,
|
||||
ALL = -1,
|
||||
NONE = -2
|
||||
};
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ Panel^ MakePanel(int width, int height, std::vector<ConfigOptionBase*> &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<Char>^ digitsarray = gcnew cli::array<Char>{ L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7', L'8', L'9' };
|
||||
@@ -285,6 +286,43 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class OptionMetaSectionLabel : public ConfigOptionBase
|
||||
{
|
||||
public:
|
||||
OptionMetaSectionLabel(LPCWSTR friendlyName)
|
||||
{
|
||||
_friendlyName = friendlyName;
|
||||
}
|
||||
|
||||
virtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)
|
||||
{
|
||||
Label^ lab = gcnew Label();
|
||||
|
||||
lab->Text = gcnew String(_friendlyName);
|
||||
lab->Left = left + 2;
|
||||
lab->Top = top;
|
||||
lab->Font = gcnew System::Drawing::Font(lab->Font->Name, 12.0f, System::Drawing::FontStyle::Bold);
|
||||
lab->AutoSize = true;
|
||||
|
||||
Form^ RootForm = panel->FindForm();
|
||||
float ScaleWidth = 1.0f;
|
||||
float ScaleHeight = 1.0f;
|
||||
if (RootForm)
|
||||
{
|
||||
Drawing::SizeF CurrentScaleSize = RootForm->CurrentAutoScaleDimensions;
|
||||
ScaleWidth = CurrentScaleSize.Width / BaseScaleSize;
|
||||
ScaleHeight = CurrentScaleSize.Height / BaseScaleSize;
|
||||
}
|
||||
lab->Scale(ScaleWidth, ScaleHeight);
|
||||
|
||||
panel->Controls->Add(lab);
|
||||
mainControlHandle = lab->Handle;
|
||||
|
||||
int ControlHeight = lab->Font->Height / ScaleHeight;
|
||||
return ControlHeight + ControlSpacing;
|
||||
}
|
||||
};
|
||||
|
||||
class OptionMetaSpacer : public ConfigOptionBase
|
||||
{
|
||||
public:
|
||||
@@ -571,6 +609,7 @@ public:
|
||||
int _defaultVal;
|
||||
int _indexOffset;
|
||||
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)
|
||||
{
|
||||
@@ -590,6 +629,7 @@ public:
|
||||
ComboBox^ combobox = gcnew ComboBox();
|
||||
|
||||
label->Text = gcnew String(_friendlyName);
|
||||
labelHandle = label->Handle;
|
||||
label->Left = left;
|
||||
label->Top = top + 3;
|
||||
label->Width = Col1Width;
|
||||
@@ -849,8 +889,10 @@ public:
|
||||
|
||||
enum ResolutionOptionOpts
|
||||
{
|
||||
RESOPT_INCLUDE_MATCH_WINDOW = 1,
|
||||
RESOPT_INCLUDE_MATCH_SCREEN = 2
|
||||
RESOPT_NONE,
|
||||
RESOPT_INCLUDE_MATCH_WINDOW,
|
||||
RESOPT_INCLUDE_MATCH_SCREEN,
|
||||
RESOPT_INCLUDE_DEFAULT = 4
|
||||
};
|
||||
|
||||
class ResolutionOption : public ConfigOptionBase
|
||||
@@ -894,6 +936,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();
|
||||
@@ -916,6 +960,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();
|
||||
@@ -976,7 +1022,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');
|
||||
@@ -1043,9 +1089,10 @@ class PluginOption : public ConfigOptionBase
|
||||
{
|
||||
public:
|
||||
bool _defaultVal;
|
||||
std::wstring _builddate;
|
||||
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;
|
||||
_iniSectionName = iniSectionName;
|
||||
@@ -1054,6 +1101,7 @@ public:
|
||||
_description = description;
|
||||
_defaultVal = defaultVal;
|
||||
_configopts = configopts;
|
||||
_builddate = builddate;
|
||||
}
|
||||
|
||||
virtual int AddToPanel(Panel^ panel, unsigned int left, unsigned int top, ToolTip^ tooltip)
|
||||
|
||||
@@ -95,6 +95,11 @@ std::vector<resolution> getScreenResolutionsVec(std::vector<DEVMODEW> &screenMod
|
||||
}
|
||||
}
|
||||
|
||||
const resolution defaultres(1280, 720);
|
||||
if (std::find(outVec.begin(), outVec.end(), defaultres) == outVec.end()) {
|
||||
outVec.push_back(defaultres);
|
||||
}
|
||||
|
||||
std::sort(outVec.begin(), outVec.end());
|
||||
|
||||
return outVec;
|
||||
@@ -139,19 +144,21 @@ static std::vector<int> getScreenRatesVec(std::vector<DEVMODEW> &screenModes) {
|
||||
|
||||
std::vector<DEVMODEW> screenModes = getScreenModes();
|
||||
|
||||
const std::vector<resolution> internalResOptions = { resolution(320,240), resolution(426,240), 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) };
|
||||
|
||||
DropdownOption* DisplayModeDropdown = new DropdownOption(L"display", RESOLUTION_SECTION, CONFIG_FILE, L"Display:", L"Sets the window/screen mode.", 1, std::vector<LPCWSTR>({ L"Windowed", L"Fast", L"Exclusive", L"Safe" }));
|
||||
ResolutionOption* DisplayResolutionOption = new ResolutionOption(L"width", L"height", RESOLUTION_SECTION, CONFIG_FILE, L"Resolution:", L"Sets the display resolution.", resolution(-1, -1), getScreenResolutionsVec(screenModes), true, RESOPT_INCLUDE_MATCH_SCREEN);
|
||||
DropdownNumberOption* RefreshRateOption = new DropdownNumberOption(L"refreshrate", RESOLUTION_SECTION, CONFIG_FILE, L"Refresh Rate:", L"Sets the display refresh rate.", 60, getScreenRatesVec(screenModes), true);
|
||||
|
||||
ConfigOptionBase* screenResolutionArray[] = {
|
||||
DisplayModeDropdown,
|
||||
DisplayResolutionOption,
|
||||
//new DropdownNumberOption(L"bitdepth", RESOLUTION_SECTION, CONFIG_FILE, L"Bit Depth:", L"Sets the display bit depth.", 32, getScreenDepthsVec(screenModes), true),
|
||||
new DropdownNumberOption(L"refreshrate", RESOLUTION_SECTION, CONFIG_FILE, L"Refresh Rate:", L"Sets the display refresh rate.", 60, getScreenRatesVec(screenModes), true),
|
||||
RefreshRateOption,
|
||||
};
|
||||
|
||||
BooleanOption* InternalResolutionCheckbox = new BooleanOption(L"r.enable", RESOLUTION_SECTION, CONFIG_FILE, L"Enable", L"Enable or disable custom internal resolution.", false, false);
|
||||
ResolutionOption* InternalResolutionOption = new ResolutionOption(L"r.width", L"r.height", RESOLUTION_SECTION, CONFIG_FILE, L"Resolution:", L"Sets the internal resolution (instead of 1280x720).", resolution(1920, 1080), std::vector<resolution>({ resolution(1,1), resolution(320,240), resolution(426,240), 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_INCLUDE_MATCH_WINDOW);
|
||||
ResolutionOption* InternalResolutionOption = new ResolutionOption(L"r.width", L"r.height", RESOLUTION_SECTION, CONFIG_FILE, L"Resolution:", L"Sets the internal resolution (instead of 1280x720).", resolution(1920, 1080), internalResOptions, true, RESOPT_INCLUDE_MATCH_WINDOW);
|
||||
|
||||
ConfigOptionBase* internalResolutionArray[] = {
|
||||
InternalResolutionCheckbox,
|
||||
@@ -159,15 +166,17 @@ ConfigOptionBase* internalResolutionArray[] = {
|
||||
};
|
||||
|
||||
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", 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"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 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>({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>({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(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 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 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"punchthrough", GRAPHICS_SECTION, CONFIG_FILE, L"Transparent Meshes", L"Show transparent meshes.", true, false),
|
||||
new BooleanOption(L"glare", GRAPHICS_SECTION, CONFIG_FILE, L"Glare", L"Enable or disable glare.", true, false),
|
||||
new BooleanOption(L"shader", GRAPHICS_SECTION, CONFIG_FILE, L"Shader", L"Enable or disable high-quality shaders.", true, false),
|
||||
@@ -177,6 +186,7 @@ ConfigOptionBase* graphicsArray[] = {
|
||||
};
|
||||
|
||||
ConfigOptionBase* optionsArray[] = {
|
||||
new OptionMetaSectionLabel(L"Compatibility"),
|
||||
new BooleanOption(L"no_movies", PATCHES_SECTION, CONFIG_FILE, L"Disable Movies", L"Disable movies (enable this if the game hangs when loading certain PVs).", false, false),
|
||||
new BooleanOption(L"mp4_movies", PATCHES_SECTION, CONFIG_FILE, L"Custom MP4 Adv Movies", L"Enable MP4 (instead of WMV) advertise/attract movies.", false, false),
|
||||
new BooleanOption(L"cursor", PATCHES_SECTION, CONFIG_FILE, L"Cursor", L"Enable or disable the mouse cursor.", true, false),
|
||||
@@ -184,29 +194,48 @@ ConfigOptionBase* optionsArray[] = {
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
new OptionMetaSectionLabel(L"Controller Options"),
|
||||
new BooleanOption(L"rumble", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"XInput Rumble", L"Enables rumble during chainslides.", true, true),
|
||||
new NumericOption(L"xinput_rumble_intensity_left", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"Left motor:", L"Left rumble motor intensity (XInput).\n\nDefault: 8000", 8000, 0, USHRT_MAX),
|
||||
new NumericOption(L"xinput_rumble_intensity_right", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"Right motor:", L"Right rumble motor intensity (XInput).\n\nDefault: 4000", 4000, 0, USHRT_MAX),
|
||||
new NumericOption(L"xinput_preferred", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"XInput Controller Num:", L"Sets the preferred XInput controller.\nIf unavailable, the next connected controller is used.", 0, 0, 3),
|
||||
new BooleanOption(L"hardware_slider", PATCHES_SECTION, CONFIG_FILE, L"Use Hardware Slider", L"Enable this if using a real arcade slider.\n(set the slider to port COM11)", false, false),
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
new OptionMetaSectionLabel(L"PV Selector"),
|
||||
new DropdownOption(L"quick_start", PATCHES_SECTION, CONFIG_FILE, L"Quick Start:", L"Skip one or more menus.", 1, std::vector<LPCWSTR>({ L"Disabled", L"Guest", L"Guest + Normal" })),
|
||||
new BooleanOption(L"no_scrolling_sfx", PATCHES_SECTION, CONFIG_FILE, L"Disable Scrolling SFX", L"Disable the scrolling sound effect.", false, false),
|
||||
new BooleanOption(L"unlock_pseudo", PATCHES_SECTION, CONFIG_FILE, L"Unlock PSEUDO modules (incomplete)", L"Lets you play any PV with any performer.\n(incomplete, recommended modules will default to Miku)", false, false),
|
||||
new BooleanOption(L"card", PATCHES_SECTION, CONFIG_FILE, L"Unlock card menu (incomplete)", L"Enables the card menu.\n(incomplete, it doesn't bypass the card prompt)", false, false),
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
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 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"autopause", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"Pause Automatically", L"Pause when focus is lost.", true, true),
|
||||
new OptionMetaSeparator(),
|
||||
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<LPCWSTR>({ 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<LPCWSTR>({ 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<LPCWSTR>({ 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", PATCHES_SECTION, CONFIG_FILE, L"Default Hand Size:", L"-1: default\n12200: PDA", -1, -1, INT_MAX),
|
||||
new BooleanOption(L"sing_missed", PATCHES_SECTION, CONFIG_FILE, L"Sing Missed", L"Sing missed notes.", false, false),
|
||||
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),
|
||||
|
||||
new OptionMetaSectionLabel(L"UI Elements"),
|
||||
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"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 Corner 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_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),
|
||||
@@ -217,46 +246,32 @@ ConfigOptionBase* optionsArray[] = {
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
new BooleanOption(L"unlock_pseudo", PATCHES_SECTION, CONFIG_FILE, L"Unlock PSEUDO modules (incomplete)", L"Lets you play any PV with any performer.\n(incomplete, recommended modules will default to Miku)", false, false),
|
||||
new BooleanOption(L"card", PATCHES_SECTION, CONFIG_FILE, L"Unlock card menu (incomplete)", L"Enables the card menu.\n(incomplete, it doesn't bypass the card prompt)", false, false),
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
new OptionMetaSectionLabel(L"Framerate"),
|
||||
new BooleanOption(L"FPS.Limit.LightMode", GRAPHICS_SECTION, CONFIG_FILE, L"Use Lightweight Limiter", L"Makes the FPS limiter use less CPU.\nMay have less consistent performance.", true, false),
|
||||
new NumericOption(L"FPS.Limit", GRAPHICS_SECTION, CONFIG_FILE, L"FPS Limit:", L"Allows you to set a frame rate cap. Set to -1 to unlock the frame rate.", 60, -1, INT_MAX),
|
||||
new NumericOption(L"frm.motion.rate", GRAPHICS_SECTION, CONFIG_FILE, L"FRM Motion Rate:", L"Sets the motion rate (fps) for the Frame Rate Manager component.\nLarger values should be smoother, but more CPU intensive and possibly buggier.", 300, 1, INT_MAX),
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
new BooleanOption(L"autopause", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"Pause Automatically", L"Pause when focus is lost.", true, true),
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
new BooleanOption(L"rumble", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"XInput Rumble", L"Enables rumble during chainslides.", true, true),
|
||||
new NumericOption(L"xinput_preferred", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"XInput Controller Num:", L"Sets the preferred XInput controller.\nIf unavailable, the next connected controller is used.", 0, 0, 3),
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
new BooleanOption(L"hardware_slider", PATCHES_SECTION, CONFIG_FILE, L"Use Hardware Slider", L"Enable this if using a real arcade slider.\n(set the slider to port COM11)", false, false),
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
new BooleanOption(L"opengl_patch_a", LAUNCHER_SECTION, CONFIG_FILE, L"OpenGL Patch A", L"Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing.", false, false),
|
||||
new BooleanOption(L"opengl_patch_b", LAUNCHER_SECTION, CONFIG_FILE, L"OpenGL Patch B", L"Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing.", false, false),
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
//new OptionMetaSectionLabel(L"Advanced Compatibility"),
|
||||
//new BooleanOption(L"opengl_patch_a", LAUNCHER_SECTION, CONFIG_FILE, L"OpenGL Patch A", L"Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing.", false, false),
|
||||
//new BooleanOption(L"opengl_patch_b", LAUNCHER_SECTION, CONFIG_FILE, L"OpenGL Patch B", L"Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing.", false, false),
|
||||
//new OptionMetaSeparator(),
|
||||
//new OptionMetaSpacer(8),
|
||||
|
||||
new OptionMetaSectionLabel(L"Loader"),
|
||||
new BooleanOption(L"custom_patches", PATCHES_SECTION, CONFIG_FILE, L"Enable Custom Patches", L"Enables all custom patches.", true, false),
|
||||
//new BooleanOption(L"ignore_exe_checksum", PATCHES_SECTION, CONFIG_FILE, L"Ignore exe checksum", L"Use at your own risk.", false, false),
|
||||
new BooleanOption(L"prevent_data_deletion", PATCHES_SECTION, CONFIG_FILE, L"Prevent Data Deletion", L"Prevents the game from deleting files.", false, false),
|
||||
new StringOption(L"command_line", LAUNCHER_SECTION, CONFIG_FILE, L"Command Line:", L"Allows setting command line parameters for the game when using the launcher.\nDisabling the launcher will bypass this.", L"", false),
|
||||
new BooleanOption(L"use_divahook_bat", LAUNCHER_SECTION, CONFIG_FILE, L"Use divahook.bat", L"Launches divahook.bat intead of diva.exe.", false, false),
|
||||
//new BooleanOption(L"prevent_data_deletion", PATCHES_SECTION, CONFIG_FILE, L"Prevent Data Deletion", L"Prevents the game from deleting files.", false, false),
|
||||
new OptionMetaSeparator(),
|
||||
new OptionMetaSpacer(8),
|
||||
|
||||
new OptionMetaSectionLabel(L"Launcher"),
|
||||
new BooleanOption(L"dark_launcher", LAUNCHER_SECTION, CONFIG_FILE, L"Dark Launcher", L"Sets the dark colour scheme in the launcher.", false, false),
|
||||
new BooleanOption(L"acrylic_blur", LAUNCHER_SECTION, CONFIG_FILE, L"Acrylic Blur", L"Enables acrylic blur in the launcher on Windows 10 20H2 or later.", false, false),
|
||||
//new BooleanOption(L"acrylic_blur", LAUNCHER_SECTION, CONFIG_FILE, L"Acrylic Blur", L"Enables acrylic blur in the launcher on Windows 10 20H2 or later.", false, false),
|
||||
new BooleanOption(L"no_gpu_dialog", LAUNCHER_SECTION, CONFIG_FILE, L"Disable GPU Warning", L"Disables the warning dialog for unsupported GPUs.", false, false),
|
||||
//new BooleanOption(L"ignore_exe_checksum", PATCHES_SECTION, CONFIG_FILE, L"Ignore exe checksum", L"Use at your own risk.", false, false),
|
||||
new StringOption(L"command_line", LAUNCHER_SECTION, CONFIG_FILE, L"Command Line:", L"Allows setting command line parameters for the game when using the launcher.\nDisabling the launcher will bypass this.", L"", false),
|
||||
new BooleanOption(L"use_divahook_bat", LAUNCHER_SECTION, CONFIG_FILE, L"Use divahook.bat/start.bat", L"Launches divahook.bat/start.bat intead of diva.exe.", false, false),
|
||||
};
|
||||
|
||||
ConfigOptionBase* playerdataArray[] = {
|
||||
@@ -277,11 +292,11 @@ ConfigOptionBase* playerdataArray[] = {
|
||||
new BooleanOption(L"border_excellent", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Clear Border (Excellent)", L"Shows the clear border for an excellent rating on the progress bar.", true, true),
|
||||
new BooleanOption(L"border_rival", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Clear Border (Rival)", L"Shows the clear border for beating your rival on the progress bar.", false, true),
|
||||
|
||||
new BooleanOption(L"use_card", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Use Card", L"Enables IC card. This allows module selection.", false, true),
|
||||
new BooleanOption(L"module_card_workaround", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Module Selection Workaround", L"Allows module selection without card and tries to improve menu performance.\n(BETA)", true, true),
|
||||
new BooleanOption(L"use_pv_module_equip ", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Song Specific Modules", L"Allows song-specific module selection.", false, true),
|
||||
new BooleanOption(L"use_pv_skin_equip ", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Song Specific Skins", L"Allows song-specific skin settings.\nValues stored in skins.ini", false, true),
|
||||
new BooleanOption(L"use_pv_sfx_equip ", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Song Specific Sound Effects", L"Allows song-specific sound effect settings.\nValues stored in sfx.ini", false, true),
|
||||
new BooleanOption(L"use_card", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Use Card", L"Enables IC card. This allows module selection.", true, true),
|
||||
new BooleanOption(L"module_card_workaround", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Fast Module Selection (buggy)", L"Allows module selection without card and tries to improve menu performance.\nKnown to cause issues, especially with song-specific modules.", false, true),
|
||||
new BooleanOption(L"use_pv_module_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Song Specific Modules", L"Allows song-specific module selection.", true, true),
|
||||
new BooleanOption(L"use_pv_skin_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Song Specific Skins", L"Allows song-specific skin settings.\nValues stored in skins.ini", true, true),
|
||||
new BooleanOption(L"use_pv_sfx_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Song Specific Sound Effects", L"Allows song-specific sound effect settings.\nValues stored in sfx.ini", true, true),
|
||||
|
||||
new BooleanOption(L"gamemode_options", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Game Modifiers", L"Allows use of game mode modifiers (hi-speed, hidden, and sudden).", true, true),
|
||||
};
|
||||
@@ -399,6 +414,8 @@ std::vector<PluginInfo> LoadPlugins()
|
||||
do {
|
||||
if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
if (ffd.cFileName[0] == '.' && ffd.cFileName[1] == '_') continue; // exclude macOS metadata
|
||||
|
||||
auto pos = wcslen(ffd.cFileName);
|
||||
|
||||
if (ffd.cFileName[pos - 4] == '.' &&
|
||||
@@ -459,7 +476,7 @@ std::vector<PluginOption*> GetPluginOptions(std::vector<PluginInfo>* 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);
|
||||
}
|
||||
|
||||
@@ -475,11 +492,13 @@ std::vector<PluginInfo> LoadCustom()
|
||||
HANDLE hFind;
|
||||
WIN32_FIND_DATAW ffd;
|
||||
|
||||
hFind = FindFirstFileW((PATCHES_DIR + L"\\*.p?").c_str(), &ffd);
|
||||
hFind = FindFirstFileW((PATCHES_DIR + L"\\*.p*").c_str(), &ffd);
|
||||
if (hFind != INVALID_HANDLE_VALUE) {
|
||||
do {
|
||||
if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||
{
|
||||
if (ffd.cFileName[0] == '.' && ffd.cFileName[1] == '_') continue; // exclude macOS metadata
|
||||
|
||||
auto pos = wcslen(ffd.cFileName);
|
||||
|
||||
if ((ffd.cFileName[pos - 2] == '.' && (ffd.cFileName[pos - 1] == 'p' || ffd.cFileName[pos - 1] == 'P')) ||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 9.4 KiB |
@@ -10,6 +10,7 @@
|
||||
#include "GPUModel.h"
|
||||
#include "WineVer.h"
|
||||
#include "composition.h"
|
||||
#include <filesystem>
|
||||
|
||||
namespace Launcher {
|
||||
|
||||
@@ -189,6 +190,7 @@ namespace Launcher {
|
||||
|
||||
updateStyle();
|
||||
|
||||
checkHasInvalidGLUT();
|
||||
|
||||
glutInit(&argc, argv);
|
||||
int window = glutCreateWindow("glut"); // a context must be created to use glGetString
|
||||
@@ -197,18 +199,37 @@ namespace Launcher {
|
||||
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
|
||||
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));
|
||||
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^ wineVersion = gcnew String(WineVer::getWineVer().c_str());
|
||||
|
||||
int driver_version_major = 1;
|
||||
int driver_version_minor = 0;
|
||||
auto version_split = version->Split(' ');
|
||||
if (version_split->Length > 1) // make sure we don't use the OpenGL version instead of the driver version
|
||||
{
|
||||
String^ driver_version = gcnew String(version_split[version_split->Length - 1]);
|
||||
auto driver_version_split_major_minor = driver_version->Split('.');
|
||||
if (driver_version_split_major_minor->Length >= 2)
|
||||
{
|
||||
driver_version_major = int::Parse(driver_version_split_major_minor[0]);
|
||||
driver_version_minor = int::Parse(driver_version_split_major_minor[1]);
|
||||
}
|
||||
}
|
||||
|
||||
glutDestroyWindow(window); // destroy the window so it doesn't remain on screen
|
||||
if (glutMainLoopEventDynamic != NULL) glutMainLoopEventDynamic(); // freeglut needs this
|
||||
|
||||
if (wineVersion != "")
|
||||
{
|
||||
this->labelGPU->Text = "Wine " + wineVersion + " (at least 4.12.1 is required)\n";
|
||||
this->labelGPU->Text = "Wine " + wineVersion + " (remember to disable movies!)\n";
|
||||
}
|
||||
else this->labelGPU->Text = "GPU Info:\n";
|
||||
this->labelGPU->Text += vendor + " " + renderer + "\n";
|
||||
@@ -216,103 +237,220 @@ namespace Launcher {
|
||||
|
||||
int linkStart = this->labelGPU->Text->Length;
|
||||
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)
|
||||
{
|
||||
if (i.name == L"Novidia")
|
||||
{
|
||||
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 && 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 (hasNovidia)
|
||||
{
|
||||
if (novidiaEnabled)
|
||||
{
|
||||
if (wineVersion == "" && (driver_version_major < 21 || (driver_version_major == 21 && driver_version_minor < 6)))
|
||||
{
|
||||
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
|
||||
{
|
||||
this->labelGPU->Text += "Issues: Mods needed for AMD compatibility!";
|
||||
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.";
|
||||
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;
|
||||
}
|
||||
}
|
||||
else if (!vendor->Contains("NVIDIA"))
|
||||
else if (hasDivaGL)
|
||||
{
|
||||
this->labelGPU->Text += "Issues: UNSUPPORTED GPU!";
|
||||
GPUIssueText = "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->Text += "Issues: Mods needed for AMD compatibility!";
|
||||
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;
|
||||
showGpuDialog = true;
|
||||
}
|
||||
else if (gpuModel->StartsWith("GA")) // unconfirmed??
|
||||
else
|
||||
{
|
||||
this->labelGPU->Text += "Issues: Ampere GPU detected! Unknown issues.\n(Click for more information)";
|
||||
GPUIssueText = "Ampere GPUs have not been tested yet. On the previous generation Turing GPUs (GTX 16xx/RTX 20xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled and report any further issues to the developers.";
|
||||
this->labelGPU->Text += "Issues: Mods needed for AMD compatibility!";
|
||||
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::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("GB")) // unconfirmed??
|
||||
{
|
||||
this->labelGPU->Text += L"Issues: Blackwell GPU detected! Possible noise.\n(Click for more information)";
|
||||
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 += "Issues: Turing GPU detected! Possible noise.\n(Click for more information)";
|
||||
GPUIssueText = "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->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") || gpuModel->StartsWith("GV"))
|
||||
else if (gpuModel->StartsWith("GV"))
|
||||
{
|
||||
this->labelGPU->Text += "Issues: May have minor noise on some stages.\n(Click for more information)";
|
||||
GPUIssueText = "On Maxwell GPUs (~GTX 900) or newer, some minor stage shaders create noise.\nPlease make sure the ShaderPatch plugin is enabled.";
|
||||
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;
|
||||
}
|
||||
else if (gpuModel->StartsWith("GK"))
|
||||
{
|
||||
this->labelGPU->Text += "Issues: None.";
|
||||
GPUIssueText = "Your GPU should have no issues running the game.";
|
||||
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 += "Issues: Driver too old.";
|
||||
GPUIssueText = "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->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 += "Issues: No known issues.";
|
||||
GPUIssueText = "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->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 (version[0] >= '4' && gpuModel->Length > 0 && !gpuModel->StartsWith("Unk") && !gpuModel->StartsWith("Oth"))
|
||||
{
|
||||
this->labelGPU->Text += "Issues: GPU may be too new.\n(Click for more information)";
|
||||
GPUIssueText = "It looks like your GPU may be too new. Only up to Turing (GTX 16xx/RTX 20xx) 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.";
|
||||
this->labelGPU->LinkColor = System::Drawing::Color::Orange;
|
||||
}
|
||||
else if (gpuModel->StartsWith("G") || gpuModel->StartsWith("NV") || gpuModel->StartsWith("NB") || gpuModel->StartsWith("N10") || gpuModel->StartsWith("MCP"))
|
||||
{
|
||||
this->labelGPU->Text += "Issues: GPU too old! 3D rendering might be broken.\n(Click for more information)";
|
||||
GPUIssueText = "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->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->Length == 0 || gpuModel->StartsWith("Unk") || gpuModel->StartsWith("Oth"))
|
||||
{
|
||||
this->labelGPU->Text += "Issues: Unable to detect GPU architecture.\n(Click for more information)";
|
||||
GPUIssueText = "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;
|
||||
this->labelGPU->Text += L"Issues: UNSUPPORTED 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::Red;
|
||||
showGpuDialog = true;
|
||||
}
|
||||
}
|
||||
int linkEnd = this->labelGPU->Text->Length - linkStart;
|
||||
|
||||
this->labelGPU->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::LinkLabelLinkClickedGPUIssueHandler);
|
||||
this->labelGPU->LinkArea = System::Windows::Forms::LinkArea(linkStart, linkEnd);
|
||||
|
||||
if (showGpuDialog && !nNoGPUDialog)
|
||||
SkinnedMessageBox::Show(this, GPUIssueText + "\n\nYou can disable this message from the options tab.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning);
|
||||
if (!nNoGPUDialog)
|
||||
{
|
||||
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:
|
||||
@@ -344,15 +482,12 @@ namespace Launcher {
|
||||
|
||||
void updateLagCompMsec()
|
||||
{
|
||||
this->groupBox_Lag->Text = "Lag Compensation (" + this->trackBar_LagCompensation->Value * 10 + " msec)";
|
||||
this->groupBox_Lag->Text = "Lag Compensation (" + this->trackBar_LagCompensation->Value + " msec)";
|
||||
}
|
||||
|
||||
void updateStyle()
|
||||
{
|
||||
int nDarkLauncher = GetPrivateProfileIntW(LAUNCHER_SECTION, L"dark_launcher", FALSE, CONFIG_FILE);
|
||||
int nAcrylicLauncher = GetPrivateProfileIntW(LAUNCHER_SECTION, L"acrylic_blur", FALSE, CONFIG_FILE);
|
||||
|
||||
bool useAcrylic = nAcrylicLauncher && setBlur(hWnd, AccentState::ACCENT_ENABLE_ACRYLICBLURBEHIND);
|
||||
|
||||
Color colourBg, colourBg2, colourFg;
|
||||
|
||||
@@ -371,22 +506,10 @@ namespace Launcher {
|
||||
colourBg2 = Color::FromArgb(242, 242, 242);
|
||||
}
|
||||
|
||||
if (useAcrylic)
|
||||
{
|
||||
this->button_Discord->BackColor = colourBg2;
|
||||
this->button_github->BackColor = colourBg2;
|
||||
this->button_Wiki->BackColor = colourBg2;
|
||||
|
||||
colourBg2 = Color::FromArgb(255, 0, 255);
|
||||
}
|
||||
else
|
||||
{
|
||||
setBlur(hWnd, AccentState::ACCENT_DISABLED);
|
||||
|
||||
this->button_Discord->BackColor = Color::Transparent;
|
||||
this->button_github->BackColor = Color::Transparent;
|
||||
this->button_Wiki->BackColor = Color::Transparent;
|
||||
}
|
||||
|
||||
this->tabPage_Resolution->BackColor = colourBg;
|
||||
this->tabPage_Resolution->ForeColor = colourFg;
|
||||
@@ -532,29 +655,45 @@ private: System::Windows::Forms::Button^ button_Wiki;
|
||||
this->tabPage_Plugins->SuspendLayout();
|
||||
this->tabPage_Credits->SuspendLayout();
|
||||
this->SuspendLayout();
|
||||
//
|
||||
// button_Launch
|
||||
//
|
||||
this->button_Launch->BackColor = System::Drawing::Color::White;
|
||||
this->button_Launch->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control;
|
||||
this->button_Launch->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_Launch->Location = System::Drawing::Point(172, 389);
|
||||
this->button_Launch->Location = System::Drawing::Point(344, 778);
|
||||
this->button_Launch->Margin = System::Windows::Forms::Padding(6);
|
||||
this->button_Launch->Name = L"button_Launch";
|
||||
this->button_Launch->Size = System::Drawing::Size(217, 23);
|
||||
this->button_Launch->Size = System::Drawing::Size(434, 46);
|
||||
this->button_Launch->TabIndex = 20;
|
||||
this->button_Launch->Text = L"Launch";
|
||||
this->button_Launch->UseVisualStyleBackColor = false;
|
||||
this->button_Launch->Click += gcnew System::EventHandler(this, &ui::Button_Launch_Click);
|
||||
//
|
||||
// groupBox_ScreenRes
|
||||
//
|
||||
this->groupBox_ScreenRes->Controls->Add(this->panel_ScreenRes);
|
||||
this->groupBox_ScreenRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->groupBox_ScreenRes->Location = System::Drawing::Point(5, 6);
|
||||
this->groupBox_ScreenRes->Location = System::Drawing::Point(10, 12);
|
||||
this->groupBox_ScreenRes->Margin = System::Windows::Forms::Padding(6);
|
||||
this->groupBox_ScreenRes->Name = L"groupBox_ScreenRes";
|
||||
this->groupBox_ScreenRes->Size = System::Drawing::Size(263, 113);
|
||||
this->groupBox_ScreenRes->Padding = System::Windows::Forms::Padding(6);
|
||||
this->groupBox_ScreenRes->Size = System::Drawing::Size(526, 226);
|
||||
this->groupBox_ScreenRes->TabIndex = 10;
|
||||
this->groupBox_ScreenRes->TabStop = false;
|
||||
this->groupBox_ScreenRes->Text = L"Screen Resolution";
|
||||
//
|
||||
// panel_ScreenRes
|
||||
//
|
||||
this->panel_ScreenRes->AutoScroll = true;
|
||||
this->panel_ScreenRes->Location = System::Drawing::Point(5, 19);
|
||||
this->panel_ScreenRes->Location = System::Drawing::Point(10, 38);
|
||||
this->panel_ScreenRes->Margin = System::Windows::Forms::Padding(6);
|
||||
this->panel_ScreenRes->Name = L"panel_ScreenRes";
|
||||
this->panel_ScreenRes->Size = System::Drawing::Size(253, 89);
|
||||
this->panel_ScreenRes->Size = System::Drawing::Size(506, 178);
|
||||
this->panel_ScreenRes->TabIndex = 0;
|
||||
//
|
||||
// tabControl
|
||||
//
|
||||
this->tabControl->Controls->Add(this->tabPage_Resolution);
|
||||
this->tabControl->Controls->Add(this->tabPage_Patches);
|
||||
this->tabControl->Controls->Add(this->tabPage_Playerdata);
|
||||
@@ -562,10 +701,14 @@ private: System::Windows::Forms::Button^ button_Wiki;
|
||||
this->tabControl->Controls->Add(this->tabPage_Plugins);
|
||||
this->tabControl->Controls->Add(this->tabPage_Credits);
|
||||
this->tabControl->Location = System::Drawing::Point(0, 0);
|
||||
this->tabControl->Margin = System::Windows::Forms::Padding(6);
|
||||
this->tabControl->Name = L"tabControl";
|
||||
this->tabControl->SelectedIndex = 0;
|
||||
this->tabControl->Size = System::Drawing::Size(560, 384);
|
||||
this->tabControl->Size = System::Drawing::Size(1120, 768);
|
||||
this->tabControl->TabIndex = 10;
|
||||
//
|
||||
// tabPage_Resolution
|
||||
//
|
||||
this->tabPage_Resolution->BackColor = System::Drawing::Color::White;
|
||||
this->tabPage_Resolution->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch;
|
||||
this->tabPage_Resolution->Controls->Add(this->groupBox_Lag);
|
||||
@@ -575,181 +718,271 @@ private: System::Windows::Forms::Button^ button_Wiki;
|
||||
this->tabPage_Resolution->Controls->Add(this->groupBox_ScreenRes);
|
||||
this->tabPage_Resolution->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)),
|
||||
static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)));
|
||||
this->tabPage_Resolution->Location = System::Drawing::Point(4, 22);
|
||||
this->tabPage_Resolution->Location = System::Drawing::Point(8, 39);
|
||||
this->tabPage_Resolution->Margin = System::Windows::Forms::Padding(6);
|
||||
this->tabPage_Resolution->Name = L"tabPage_Resolution";
|
||||
this->tabPage_Resolution->Padding = System::Windows::Forms::Padding(3);
|
||||
this->tabPage_Resolution->Size = System::Drawing::Size(552, 358);
|
||||
this->tabPage_Resolution->Padding = System::Windows::Forms::Padding(6);
|
||||
this->tabPage_Resolution->Size = System::Drawing::Size(1104, 721);
|
||||
this->tabPage_Resolution->TabIndex = 0;
|
||||
this->tabPage_Resolution->Text = L"Graphics";
|
||||
//
|
||||
// groupBox_Lag
|
||||
//
|
||||
this->groupBox_Lag->Controls->Add(this->trackBar_LagCompensation);
|
||||
this->groupBox_Lag->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->groupBox_Lag->Location = System::Drawing::Point(5, 282);
|
||||
this->groupBox_Lag->Location = System::Drawing::Point(10, 564);
|
||||
this->groupBox_Lag->Margin = System::Windows::Forms::Padding(6);
|
||||
this->groupBox_Lag->Name = L"groupBox_Lag";
|
||||
this->groupBox_Lag->Size = System::Drawing::Size(263, 70);
|
||||
this->groupBox_Lag->Padding = System::Windows::Forms::Padding(6);
|
||||
this->groupBox_Lag->Size = System::Drawing::Size(526, 146);
|
||||
this->groupBox_Lag->TabIndex = 21;
|
||||
this->groupBox_Lag->TabStop = false;
|
||||
this->groupBox_Lag->Text = L"Lag Compensation";
|
||||
this->trackBar_LagCompensation->Location = System::Drawing::Point(7, 20);
|
||||
this->trackBar_LagCompensation->Maximum = 50;
|
||||
//
|
||||
// trackBar_LagCompensation
|
||||
//
|
||||
this->trackBar_LagCompensation->LargeChange = 1;
|
||||
this->trackBar_LagCompensation->Location = System::Drawing::Point(14, 40);
|
||||
this->trackBar_LagCompensation->Margin = System::Windows::Forms::Padding(6);
|
||||
this->trackBar_LagCompensation->Maximum = 500;
|
||||
this->trackBar_LagCompensation->Name = L"trackBar_LagCompensation";
|
||||
this->trackBar_LagCompensation->Size = System::Drawing::Size(250, 45);
|
||||
this->trackBar_LagCompensation->Size = System::Drawing::Size(500, 90);
|
||||
this->trackBar_LagCompensation->TabIndex = 0;
|
||||
this->trackBar_LagCompensation->ValueChanged += gcnew System::EventHandler(this, &ui::trackBar_LagCompensation_ValueChanged);
|
||||
this->trackBar_LagCompensation->TickStyle = System::Windows::Forms::TickStyle::None;
|
||||
this->trackBar_LagCompensation->Scroll += gcnew System::EventHandler(this, &ui::trackBar_LagCompensation_Scroll);
|
||||
//
|
||||
// groupBox_Details
|
||||
//
|
||||
this->groupBox_Details->Controls->Add(this->panel_Details);
|
||||
this->groupBox_Details->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->groupBox_Details->Location = System::Drawing::Point(274, 6);
|
||||
this->groupBox_Details->Location = System::Drawing::Point(548, 12);
|
||||
this->groupBox_Details->Margin = System::Windows::Forms::Padding(6);
|
||||
this->groupBox_Details->Name = L"groupBox_Details";
|
||||
this->groupBox_Details->Size = System::Drawing::Size(272, 346);
|
||||
this->groupBox_Details->Padding = System::Windows::Forms::Padding(6);
|
||||
this->groupBox_Details->Size = System::Drawing::Size(544, 698);
|
||||
this->groupBox_Details->TabIndex = 11;
|
||||
this->groupBox_Details->TabStop = false;
|
||||
this->groupBox_Details->Text = L"Details";
|
||||
//
|
||||
// panel_Details
|
||||
//
|
||||
this->panel_Details->AutoScroll = true;
|
||||
this->panel_Details->Location = System::Drawing::Point(5, 19);
|
||||
this->panel_Details->Location = System::Drawing::Point(10, 23);
|
||||
this->panel_Details->Margin = System::Windows::Forms::Padding(6);
|
||||
this->panel_Details->Name = L"panel_Details";
|
||||
this->panel_Details->Size = System::Drawing::Size(261, 321);
|
||||
this->panel_Details->Size = System::Drawing::Size(522, 667);
|
||||
this->panel_Details->TabIndex = 0;
|
||||
//
|
||||
// labelGPU
|
||||
//
|
||||
this->labelGPU->AutoSize = true;
|
||||
this->labelGPU->BackColor = System::Drawing::Color::Transparent;
|
||||
this->labelGPU->ForeColor = System::Drawing::Color::Black;
|
||||
this->labelGPU->Location = System::Drawing::Point(5, 209);
|
||||
this->labelGPU->Margin = System::Windows::Forms::Padding(2, 0, 2, 0);
|
||||
this->labelGPU->MinimumSize = System::Drawing::Size(263, 13);
|
||||
this->labelGPU->Location = System::Drawing::Point(10, 418);
|
||||
this->labelGPU->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
|
||||
this->labelGPU->MinimumSize = System::Drawing::Size(526, 26);
|
||||
this->labelGPU->Name = L"labelGPU";
|
||||
this->labelGPU->Size = System::Drawing::Size(263, 13);
|
||||
this->labelGPU->Size = System::Drawing::Size(526, 26);
|
||||
this->labelGPU->TabIndex = 21;
|
||||
this->labelGPU->TextAlign = System::Drawing::ContentAlignment::MiddleLeft;
|
||||
//
|
||||
// groupBox_InternalRes
|
||||
//
|
||||
this->groupBox_InternalRes->Controls->Add(this->panel_IntRes);
|
||||
this->groupBox_InternalRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->groupBox_InternalRes->Location = System::Drawing::Point(5, 124);
|
||||
this->groupBox_InternalRes->Location = System::Drawing::Point(10, 248);
|
||||
this->groupBox_InternalRes->Margin = System::Windows::Forms::Padding(6);
|
||||
this->groupBox_InternalRes->Name = L"groupBox_InternalRes";
|
||||
this->groupBox_InternalRes->Size = System::Drawing::Size(263, 83);
|
||||
this->groupBox_InternalRes->Padding = System::Windows::Forms::Padding(6);
|
||||
this->groupBox_InternalRes->Size = System::Drawing::Size(526, 166);
|
||||
this->groupBox_InternalRes->TabIndex = 20;
|
||||
this->groupBox_InternalRes->TabStop = false;
|
||||
this->groupBox_InternalRes->Text = L"Internal Resolution (Quality)";
|
||||
//
|
||||
// panel_IntRes
|
||||
//
|
||||
this->panel_IntRes->AutoScroll = true;
|
||||
this->panel_IntRes->Location = System::Drawing::Point(5, 19);
|
||||
this->panel_IntRes->Location = System::Drawing::Point(10, 38);
|
||||
this->panel_IntRes->Margin = System::Windows::Forms::Padding(6);
|
||||
this->panel_IntRes->Name = L"panel_IntRes";
|
||||
this->panel_IntRes->Size = System::Drawing::Size(253, 59);
|
||||
this->panel_IntRes->Size = System::Drawing::Size(506, 118);
|
||||
this->panel_IntRes->TabIndex = 1;
|
||||
//
|
||||
// tabPage_Patches
|
||||
//
|
||||
this->tabPage_Patches->BackColor = System::Drawing::Color::White;
|
||||
this->tabPage_Patches->Controls->Add(this->panel_Patches);
|
||||
this->tabPage_Patches->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),
|
||||
static_cast<System::Int32>(static_cast<System::Byte>(64)));
|
||||
this->tabPage_Patches->Location = System::Drawing::Point(4, 22);
|
||||
this->tabPage_Patches->Location = System::Drawing::Point(8, 39);
|
||||
this->tabPage_Patches->Margin = System::Windows::Forms::Padding(6);
|
||||
this->tabPage_Patches->Name = L"tabPage_Patches";
|
||||
this->tabPage_Patches->Size = System::Drawing::Size(552, 358);
|
||||
this->tabPage_Patches->Size = System::Drawing::Size(1104, 721);
|
||||
this->tabPage_Patches->TabIndex = 1;
|
||||
this->tabPage_Patches->Text = L"Options";
|
||||
//
|
||||
// panel_Patches
|
||||
//
|
||||
this->panel_Patches->AutoScroll = true;
|
||||
this->panel_Patches->Location = System::Drawing::Point(0, 0);
|
||||
this->panel_Patches->Margin = System::Windows::Forms::Padding(6);
|
||||
this->panel_Patches->Name = L"panel_Patches";
|
||||
this->panel_Patches->Size = System::Drawing::Size(552, 358);
|
||||
this->panel_Patches->Size = System::Drawing::Size(1104, 716);
|
||||
this->panel_Patches->TabIndex = 9;
|
||||
//
|
||||
// tabPage_Playerdata
|
||||
//
|
||||
this->tabPage_Playerdata->BackColor = System::Drawing::Color::White;
|
||||
this->tabPage_Playerdata->Controls->Add(this->panel_Playerdata);
|
||||
this->tabPage_Playerdata->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)),
|
||||
static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)));
|
||||
this->tabPage_Playerdata->Location = System::Drawing::Point(4, 22);
|
||||
this->tabPage_Playerdata->Location = System::Drawing::Point(8, 39);
|
||||
this->tabPage_Playerdata->Margin = System::Windows::Forms::Padding(6);
|
||||
this->tabPage_Playerdata->Name = L"tabPage_Playerdata";
|
||||
this->tabPage_Playerdata->Size = System::Drawing::Size(552, 358);
|
||||
this->tabPage_Playerdata->Size = System::Drawing::Size(1104, 721);
|
||||
this->tabPage_Playerdata->TabIndex = 3;
|
||||
this->tabPage_Playerdata->Text = L"Player";
|
||||
//
|
||||
// panel_Playerdata
|
||||
//
|
||||
this->panel_Playerdata->AutoScroll = true;
|
||||
this->panel_Playerdata->Location = System::Drawing::Point(0, 0);
|
||||
this->panel_Playerdata->Margin = System::Windows::Forms::Padding(6);
|
||||
this->panel_Playerdata->Name = L"panel_Playerdata";
|
||||
this->panel_Playerdata->Size = System::Drawing::Size(552, 358);
|
||||
this->panel_Playerdata->Size = System::Drawing::Size(1104, 716);
|
||||
this->panel_Playerdata->TabIndex = 1;
|
||||
//
|
||||
// tabPage_Components
|
||||
//
|
||||
this->tabPage_Components->BackColor = System::Drawing::Color::White;
|
||||
this->tabPage_Components->Controls->Add(this->panel_Components);
|
||||
this->tabPage_Components->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)),
|
||||
static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)));
|
||||
this->tabPage_Components->Location = System::Drawing::Point(4, 22);
|
||||
this->tabPage_Components->Location = System::Drawing::Point(8, 39);
|
||||
this->tabPage_Components->Margin = System::Windows::Forms::Padding(6);
|
||||
this->tabPage_Components->Name = L"tabPage_Components";
|
||||
this->tabPage_Components->Padding = System::Windows::Forms::Padding(3);
|
||||
this->tabPage_Components->Size = System::Drawing::Size(552, 358);
|
||||
this->tabPage_Components->Padding = System::Windows::Forms::Padding(6);
|
||||
this->tabPage_Components->Size = System::Drawing::Size(1104, 721);
|
||||
this->tabPage_Components->TabIndex = 2;
|
||||
this->tabPage_Components->Text = L"Components";
|
||||
//
|
||||
// panel_Components
|
||||
//
|
||||
this->panel_Components->AutoScroll = true;
|
||||
this->panel_Components->Location = System::Drawing::Point(0, 0);
|
||||
this->panel_Components->Margin = System::Windows::Forms::Padding(6);
|
||||
this->panel_Components->Name = L"panel_Components";
|
||||
this->panel_Components->Size = System::Drawing::Size(552, 358);
|
||||
this->panel_Components->Size = System::Drawing::Size(1104, 716);
|
||||
this->panel_Components->TabIndex = 0;
|
||||
//
|
||||
// tabPage_Plugins
|
||||
//
|
||||
this->tabPage_Plugins->BackColor = System::Drawing::Color::White;
|
||||
this->tabPage_Plugins->Controls->Add(this->panel_Custom);
|
||||
this->tabPage_Plugins->Controls->Add(this->panel_Plugins);
|
||||
this->tabPage_Plugins->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),
|
||||
static_cast<System::Int32>(static_cast<System::Byte>(64)));
|
||||
this->tabPage_Plugins->Location = System::Drawing::Point(4, 22);
|
||||
this->tabPage_Plugins->Location = System::Drawing::Point(8, 39);
|
||||
this->tabPage_Plugins->Margin = System::Windows::Forms::Padding(6);
|
||||
this->tabPage_Plugins->Name = L"tabPage_Plugins";
|
||||
this->tabPage_Plugins->Padding = System::Windows::Forms::Padding(3);
|
||||
this->tabPage_Plugins->Size = System::Drawing::Size(552, 358);
|
||||
this->tabPage_Plugins->Padding = System::Windows::Forms::Padding(6);
|
||||
this->tabPage_Plugins->Size = System::Drawing::Size(1104, 721);
|
||||
this->tabPage_Plugins->TabIndex = 3;
|
||||
this->tabPage_Plugins->Text = L"Plugins and Patches";
|
||||
//
|
||||
// panel_Custom
|
||||
//
|
||||
this->panel_Custom->AutoScroll = true;
|
||||
this->panel_Custom->Location = System::Drawing::Point(276, 0);
|
||||
this->panel_Custom->Location = System::Drawing::Point(552, 0);
|
||||
this->panel_Custom->Margin = System::Windows::Forms::Padding(6);
|
||||
this->panel_Custom->Name = L"panel_Custom";
|
||||
this->panel_Custom->Size = System::Drawing::Size(276, 358);
|
||||
this->panel_Custom->Size = System::Drawing::Size(552, 716);
|
||||
this->panel_Custom->TabIndex = 3;
|
||||
//
|
||||
// panel_Plugins
|
||||
//
|
||||
this->panel_Plugins->AutoScroll = true;
|
||||
this->panel_Plugins->Location = System::Drawing::Point(0, 0);
|
||||
this->panel_Plugins->Margin = System::Windows::Forms::Padding(6);
|
||||
this->panel_Plugins->Name = L"panel_Plugins";
|
||||
this->panel_Plugins->Size = System::Drawing::Size(276, 358);
|
||||
this->panel_Plugins->Size = System::Drawing::Size(552, 716);
|
||||
this->panel_Plugins->TabIndex = 0;
|
||||
//
|
||||
// tabPage_Credits
|
||||
//
|
||||
this->tabPage_Credits->Controls->Add(this->creditsTextBox);
|
||||
this->tabPage_Credits->Location = System::Drawing::Point(4, 22);
|
||||
this->tabPage_Credits->Margin = System::Windows::Forms::Padding(2);
|
||||
this->tabPage_Credits->Location = System::Drawing::Point(8, 39);
|
||||
this->tabPage_Credits->Margin = System::Windows::Forms::Padding(4);
|
||||
this->tabPage_Credits->Name = L"tabPage_Credits";
|
||||
this->tabPage_Credits->Padding = System::Windows::Forms::Padding(2);
|
||||
this->tabPage_Credits->Size = System::Drawing::Size(552, 358);
|
||||
this->tabPage_Credits->Padding = System::Windows::Forms::Padding(4);
|
||||
this->tabPage_Credits->Size = System::Drawing::Size(1104, 721);
|
||||
this->tabPage_Credits->TabIndex = 5;
|
||||
this->tabPage_Credits->Text = L"Credits";
|
||||
this->tabPage_Credits->UseVisualStyleBackColor = true;
|
||||
//
|
||||
// creditsTextBox
|
||||
//
|
||||
this->creditsTextBox->BackColor = System::Drawing::Color::White;
|
||||
this->creditsTextBox->ForeColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)),
|
||||
static_cast<System::Int32>(static_cast<System::Byte>(64)));
|
||||
this->creditsTextBox->Location = System::Drawing::Point(0, 0);
|
||||
this->creditsTextBox->Margin = System::Windows::Forms::Padding(2);
|
||||
this->creditsTextBox->Margin = System::Windows::Forms::Padding(4);
|
||||
this->creditsTextBox->Multiline = true;
|
||||
this->creditsTextBox->Name = L"creditsTextBox";
|
||||
this->creditsTextBox->ReadOnly = true;
|
||||
this->creditsTextBox->ScrollBars = System::Windows::Forms::ScrollBars::Both;
|
||||
this->creditsTextBox->Size = System::Drawing::Size(552, 358);
|
||||
this->creditsTextBox->Size = System::Drawing::Size(1100, 712);
|
||||
this->creditsTextBox->TabIndex = 0;
|
||||
this->creditsTextBox->Text = resources->GetString(L"creditsTextBox.Text");
|
||||
//
|
||||
// button_Discord
|
||||
//
|
||||
this->button_Discord->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(242)), static_cast<System::Int32>(static_cast<System::Byte>(242)),
|
||||
static_cast<System::Int32>(static_cast<System::Byte>(242)));
|
||||
this->button_Discord->Cursor = System::Windows::Forms::Cursors::Hand;
|
||||
this->button_Discord->FlatAppearance->BorderSize = 0;
|
||||
this->button_Discord->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_Discord->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"button_Discord.Image")));
|
||||
this->button_Discord->Location = System::Drawing::Point(496, 384);
|
||||
this->button_Discord->Location = System::Drawing::Point(992, 768);
|
||||
this->button_Discord->Margin = System::Windows::Forms::Padding(6);
|
||||
this->button_Discord->Name = L"button_Discord";
|
||||
this->button_Discord->Size = System::Drawing::Size(32, 32);
|
||||
this->button_Discord->Size = System::Drawing::Size(64, 64);
|
||||
this->button_Discord->TabIndex = 31;
|
||||
this->button_Discord->UseVisualStyleBackColor = false;
|
||||
this->button_Discord->Click += gcnew System::EventHandler(this, &ui::button_Discord_Click);
|
||||
//
|
||||
// button_github
|
||||
//
|
||||
this->button_github->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(242)), static_cast<System::Int32>(static_cast<System::Byte>(242)),
|
||||
static_cast<System::Int32>(static_cast<System::Byte>(242)));
|
||||
this->button_github->Cursor = System::Windows::Forms::Cursors::Hand;
|
||||
this->button_github->FlatAppearance->BorderSize = 0;
|
||||
this->button_github->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_github->Image = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"button_github.Image")));
|
||||
this->button_github->Location = System::Drawing::Point(528, 384);
|
||||
this->button_github->Location = System::Drawing::Point(1056, 768);
|
||||
this->button_github->Margin = System::Windows::Forms::Padding(6);
|
||||
this->button_github->Name = L"button_github";
|
||||
this->button_github->Size = System::Drawing::Size(32, 32);
|
||||
this->button_github->Size = System::Drawing::Size(64, 64);
|
||||
this->button_github->TabIndex = 32;
|
||||
this->button_github->UseVisualStyleBackColor = false;
|
||||
this->button_github->Click += gcnew System::EventHandler(this, &ui::button_github_Click);
|
||||
//
|
||||
// button_Apply
|
||||
//
|
||||
this->button_Apply->BackColor = System::Drawing::Color::White;
|
||||
this->button_Apply->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control;
|
||||
this->button_Apply->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_Apply->Location = System::Drawing::Point(4, 389);
|
||||
this->button_Apply->Location = System::Drawing::Point(8, 778);
|
||||
this->button_Apply->Margin = System::Windows::Forms::Padding(6);
|
||||
this->button_Apply->Name = L"button_Apply";
|
||||
this->button_Apply->Size = System::Drawing::Size(69, 23);
|
||||
this->button_Apply->Size = System::Drawing::Size(138, 46);
|
||||
this->button_Apply->TabIndex = 33;
|
||||
this->button_Apply->Text = L"Apply";
|
||||
this->button_Apply->UseVisualStyleBackColor = false;
|
||||
this->button_Apply->Click += gcnew System::EventHandler(this, &ui::button_Apply_Click);
|
||||
//
|
||||
// button_Wiki
|
||||
//
|
||||
this->button_Wiki->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(242)), static_cast<System::Int32>(static_cast<System::Byte>(242)),
|
||||
static_cast<System::Int32>(static_cast<System::Byte>(242)));
|
||||
this->button_Wiki->BackgroundImage = (cli::safe_cast<System::Drawing::Image^>(resources->GetObject(L"button_Wiki.BackgroundImage")));
|
||||
@@ -757,20 +990,24 @@ private: System::Windows::Forms::Button^ button_Wiki;
|
||||
this->button_Wiki->Cursor = System::Windows::Forms::Cursors::Hand;
|
||||
this->button_Wiki->FlatAppearance->BorderSize = 0;
|
||||
this->button_Wiki->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
|
||||
this->button_Wiki->Location = System::Drawing::Point(464, 384);
|
||||
this->button_Wiki->Location = System::Drawing::Point(928, 768);
|
||||
this->button_Wiki->Margin = System::Windows::Forms::Padding(6);
|
||||
this->button_Wiki->Name = L"button_Wiki";
|
||||
this->button_Wiki->Size = System::Drawing::Size(32, 32);
|
||||
this->button_Wiki->Size = System::Drawing::Size(64, 64);
|
||||
this->button_Wiki->TabIndex = 34;
|
||||
this->button_Wiki->UseVisualStyleBackColor = false;
|
||||
this->button_Wiki->Click += gcnew System::EventHandler(this, &ui::button_Wiki_Click);
|
||||
//
|
||||
// ui
|
||||
//
|
||||
this->AcceptButton = this->button_Launch;
|
||||
this->AutoScaleDimensions = System::Drawing::SizeF(96, 96);
|
||||
this->AutoScaleDimensions = System::Drawing::SizeF(192, 192);
|
||||
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Dpi;
|
||||
this->AutoSize = true;
|
||||
this->AutoSizeMode = System::Windows::Forms::AutoSizeMode::GrowAndShrink;
|
||||
this->BackColor = System::Drawing::Color::Magenta;
|
||||
this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch;
|
||||
this->ClientSize = System::Drawing::Size(560, 417);
|
||||
this->ClientSize = System::Drawing::Size(1120, 834);
|
||||
this->Controls->Add(this->button_Wiki);
|
||||
this->Controls->Add(this->button_Apply);
|
||||
this->Controls->Add(this->tabControl);
|
||||
@@ -784,10 +1021,11 @@ private: System::Windows::Forms::Button^ button_Wiki;
|
||||
this->HelpButton = true;
|
||||
this->Icon = (cli::safe_cast<System::Drawing::Icon^>(resources->GetObject(L"$this.Icon")));
|
||||
this->KeyPreview = true;
|
||||
this->Margin = System::Windows::Forms::Padding(6);
|
||||
this->MaximizeBox = false;
|
||||
this->Name = L"ui";
|
||||
this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
|
||||
this->Text = L"PD Launcher";
|
||||
this->Text = L"PD Launcher -- TEST VERSION --";
|
||||
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);
|
||||
@@ -888,21 +1126,140 @@ private: System::Void SaveSettings() {
|
||||
}
|
||||
}
|
||||
private: System::Void Button_Help_Click(System::Object^ sender, System::EventArgs^ e) {
|
||||
System::Diagnostics::Process::Start("https://notabug.org/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) {
|
||||
|
||||
//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();
|
||||
|
||||
if (GetPrivateProfileIntW(LAUNCHER_SECTION, L"use_divahook_bat", FALSE, CONFIG_FILE))
|
||||
{
|
||||
if (GetPrivateProfileIntW(L"patches", L"quick_start", 1, CONFIG_FILE) > 0)
|
||||
{
|
||||
SkinnedMessageBox::Show(this, L"\"Quick Start\" and \"Use divahook.bat / start.bat\" cannot be enabled at the same time.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Error);
|
||||
return;
|
||||
}
|
||||
|
||||
DIVA_EXECUTABLE = NULL;
|
||||
wstring DIVA_EXECUTABLE_LAUNCH_STRING = L"cmd.exe /C \"";
|
||||
DIVA_EXECUTABLE_LAUNCH_STRING.append(DIVA_DIRPATH);
|
||||
DIVA_EXECUTABLE_LAUNCH_STRING.append(L"\\divahook.bat\"");
|
||||
DIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING.c_str());
|
||||
wstring DIVA_EXECUTABLE_LAUNCH_STRING_cmd = L"cmd.exe /C \"";
|
||||
const wstring DIVA_EXECUTABLE_LAUNCH_STRING_path = DIVA_DIRPATH;
|
||||
|
||||
wstring DIVAHOOK_BAT_PATH = DIVA_EXECUTABLE_LAUNCH_STRING_path;
|
||||
DIVAHOOK_BAT_PATH.append(L"\\divahook.bat");
|
||||
if (std::filesystem::exists(DIVAHOOK_BAT_PATH))
|
||||
{
|
||||
DIVA_EXECUTABLE_LAUNCH_STRING_cmd.append(DIVAHOOK_BAT_PATH);
|
||||
DIVA_EXECUTABLE_LAUNCH_STRING_cmd.append(L"\"");
|
||||
DIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING_cmd.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
wstring START_BAT_PATH = DIVA_EXECUTABLE_LAUNCH_STRING_path;
|
||||
START_BAT_PATH.append(L"\\start.bat");
|
||||
if (std::filesystem::exists(START_BAT_PATH))
|
||||
{
|
||||
DIVA_EXECUTABLE_LAUNCH_STRING_cmd.append(START_BAT_PATH);
|
||||
DIVA_EXECUTABLE_LAUNCH_STRING_cmd.append(L"\"");
|
||||
DIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING_cmd.c_str());
|
||||
}
|
||||
else if (SkinnedMessageBox::Show(this, L"divahook.bat/start.bat not found.\nThe game will start normally/offline.\n\nNOTE: Disable \"Use divahook.bat / start.bat\" to avoid this warning.", "PD Launcher", MessageBoxButtons::OKCancel, MessageBoxIcon::Warning) != System::Windows::Forms::DialogResult::OK) return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -942,7 +1299,7 @@ private: System::Void DisplayTypeChangedHandler(System::Object^ sender, System::
|
||||
{
|
||||
for (ConfigOptionBase* option : screenResolutionArray)
|
||||
{
|
||||
if (option != DisplayModeDropdown && option != DisplayResolutionOption)
|
||||
if (option == RefreshRateOption)
|
||||
{
|
||||
((Control^)Control::FromHandle(option->mainControlHandle))->Enabled = true;
|
||||
}
|
||||
@@ -952,7 +1309,7 @@ private: System::Void DisplayTypeChangedHandler(System::Object^ sender, System::
|
||||
{
|
||||
for (ConfigOptionBase* option : screenResolutionArray)
|
||||
{
|
||||
if (option != DisplayModeDropdown && option != DisplayResolutionOption)
|
||||
if (option == RefreshRateOption)
|
||||
{
|
||||
((Control^)Control::FromHandle(option->mainControlHandle))->Enabled = false;
|
||||
}
|
||||
@@ -985,7 +1342,7 @@ private: System::Void button_Discord_Click(System::Object^ sender, System::Event
|
||||
switch (SkinnedMessageBox::Show(this, "Would you like to read the user guide for troubleshooting?", "PD Launcher", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Information))
|
||||
{
|
||||
case System::Windows::Forms::DialogResult::Yes:
|
||||
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki");
|
||||
System::Diagnostics::Process::Start("https://github.com/PDModdingCommunity/PD-Loader/wiki");
|
||||
break;
|
||||
|
||||
case System::Windows::Forms::DialogResult::No:
|
||||
@@ -994,7 +1351,7 @@ private: System::Void button_Discord_Click(System::Object^ sender, System::Event
|
||||
}
|
||||
}
|
||||
private: System::Void button_github_Click(System::Object^ sender, System::EventArgs^ e) {
|
||||
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader");
|
||||
System::Diagnostics::Process::Start("https://github.com/PDModdingCommunity/PD-Loader");
|
||||
}
|
||||
private: System::Void button_Apply_Click(System::Object^ sender, System::EventArgs^ e) {
|
||||
SaveSettings();
|
||||
@@ -1026,9 +1383,9 @@ private: bool AnyConfigChanged() {
|
||||
|
||||
private: String^ GPUIssueText;
|
||||
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;
|
||||
|
||||
updateLagCompMsec();
|
||||
@@ -1036,9 +1393,7 @@ private: System::Void trackBar_LagCompensation_ValueChanged(System::Object^ send
|
||||
private: System::Void tabPage_Resolution_Click(System::Object^ sender, System::EventArgs^ e) {
|
||||
}
|
||||
private: System::Void button_Wiki_Click(System::Object^ sender, System::EventArgs^ e) {
|
||||
System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki");
|
||||
}
|
||||
private: System::Void trackBar_LagCompensation_Scroll(System::Object^ sender, System::EventArgs^ e) {
|
||||
System::Diagnostics::Process::Start("https://github.com/PDModdingCommunity/PD-Loader/wiki");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -120,11 +120,11 @@
|
||||
<data name="creditsTextBox.Text" xml:space="preserve">
|
||||
<value>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:
|
||||
***REMOVED***, Brolijah, crash5b, ona, korenkonder, Kyberal, lybxlpsv, nastys,
|
||||
ano, Brolijah, crash5b, ona, korenkonder, Kyberal, lybxlpsv, nastys,
|
||||
Nezarn, samyuu, Skyth, somewhatlurker, Stewie1.0, SwigS-27, zsccat
|
||||
|
||||
|
||||
@@ -237,61 +237,62 @@ AMD compatibilty pack dependencies have additional licenses, detailed in the AMD
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="button_Discord.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAACoAAAApCAYAAABDV7v1AAAABGdBTUEAALGPC/xhBQAAA7dJREFUWEft
|
||||
mElME2EUxwdDgh6NVw8e9OzZGwcv3ryZePKmUQodREAN1Ah0BmQTVJZgQFABE1kEl7iAEQWjAiIEOtMW
|
||||
aJGyFWgpbWG6PL+vnSmFDrL0KyHaf/LPtPNm3vtN37dMSkUVlYwuqMYOJmRz52g1n0UzfF4knKTmmERG
|
||||
p1CotEfFsjsTTU8colmuKTmXh70wzfL6S6qxY2L57SsxZ0SBEng2JoyklSzXp1Bo40SE7Qm1xSaXLOJm
|
||||
uZMiwtaKj++MlU2yB1aqtadEjK0VBd2G/2/QtAItFFSPQ2HNOKQX+s9dzeMh5Y7/c2o+D8W141BWb4Rb
|
||||
93Xr7t3MxEFLHxugd8gCtS2T0PJhBj73LsCwfhkMJicYp5y+Y9+wFd53m6Gh3QSD/BJ0fJ2HG0Va2XyS
|
||||
iYLWtZpgbn4FBjkrCIIHtpLb7QXNKH4IB3oYm2xOyURBdQY7rKxuDbhRHo8XvF4vlKBuyOXFJgaaXa4X
|
||||
y+5eliXBN5bl8hMDHUDtDleCywO5VWOy+YmAXkcTYWPLcSttdhcsLbt8rQ2W3ekCq83lA8PXScKf2z7O
|
||||
huTHJgJaXGsAFyoqCRcc0FjRcBiFzFIdfPqxIEYA5i0C5FePwc1iLTS8nl53H1YXWiXkahABbe+cC/ll
|
||||
1BVrLax89luMANQ0TwbOq+7pYcEqiBG/8CogxYNNBPTtF7NYxi8MipcqKf7w+RpoT/9i4PztB6Ngd7jE
|
||||
iF+rgjsQDzYR0K6g1mJhUDz+Wjtm4enLKVhddYsRf6y7f9Fb0zLpnTE713VCUlpBaA0ioD0DFrEEoEnl
|
||||
BtOMM2QCbSbHitu34OPFX1JGSei2SgT0TdfaGPWg4y/eCnUvTGgDWN4UGK8SPT8XoR5to0vLQuB+86IA
|
||||
19C7wMYaREBTUas6vy2AxeYviD1jXoHiR+OQiSZMeeMENL6agqZ30/CkzQR364yQjl5c8Nh2OP3DwuX2
|
||||
gH7CDiV18rsTEVDJORWj0IpeREbQvv0dvZjgtyi56yQX1RhAb7T7JlhZg9G3ZMldh00UNJKOgpL2vwlK
|
||||
UaoDNMs75RKFYzqX96K8NnyUi2PvEJSiaDVXKJcoXCsZTaWS5Zo3g90x6Pl0w2Ga5Yb+9vS7Mc1q6uNV
|
||||
nbFKhm+Qy71jUKyLWboTKGFGMstXo6S1RMxyVTj3FfXIkSRGU4bOCWGDBimGooCgA4pRMhyLAAN/xoUL
|
||||
GjGdUWjj0JhNQZNsfl+DSkpQc2fpXM6x70GxFAx3+jIzdFz8GlVUFEVRfwDiv42+8CmffAAAAABJRU5E
|
||||
rkJggg==
|
||||
iVBORw0KGgoAAAANSUhEUgAAACoAAAApCAYAAABDV7v1AAAABGdBTUEAALGPC/xhBQAAA7hJREFUWEft
|
||||
mEtME0EYgIshUY/GqwcPevbsjYMXb95MPHnTKAUWEVADNQLdFnlUUHkEA4IKmMhD8BEf1IiCUQERIt3t
|
||||
g7ZIodBCS+mDbbu/MyUtLaVAYbYa7CSTbbrT///+50xHJEqOpAeiPXBeMnkgvZg5S0nZIopmS4WYmVKG
|
||||
zqA1YrFEfWRHMaCoqYOUjOnIlrOQiEnJWO1FyeTRuGEzSibECNCfCMigjiwZMywWq/fHBYvC7EgkZEiX
|
||||
jDmxbdC0NGXqX4FEaZYlVZ9MgpL0/v/t0bxyNZQ36qGiSQ/5Fatt7EopCzm3Vz/nlrGgaNZDTasRbt7T
|
||||
bKvNEfdo9SMDDI3boLlrGrrem+HT0AL80i6DweQG44w78Bz+ZYd3AxZo6zXBGLsEfV+scL1SvSkwUdCW
|
||||
bhPMWz0wxtiB4/yw1fD5eFDpsBEuZIwjcaAagxM8K1sDrjfA7+eB53moQtGIVYDEPFpcq93KgVu+ty1x
|
||||
gVzeCJYY6CgK924H5/WDvGFSONBrqBDWhxyH0uH0wtKyF3Bow4fT7QW7wwsYDK8LDvy558OccKCKZgN4
|
||||
kdJwhaMqOxTX6qCwWgMfvy+E3lltHJQ1TsINhRraXs1G/A4v6kddQrDQ9yrnozwjrVsLYf3T3yHQps7p
|
||||
EIjkrhYW7FyEt3EXEAz0zWdLhDIcQtyqggofPFsDHRxZDH1/674OnC5vxG9XOJ9woP1hocVaMSjOv+6+
|
||||
OXjyYgZWVnwRaTEwssg3dU3zZos7IhLBRXnl0ZVPpOoHR20hEA+CMpndUQUUqyO4PL5Aw8fNPzgKqqK3
|
||||
VSKgr/vXctSPvPmTtUPLcxNoDMsxgXGXGPyxCK1oG11a5kKetSxycBWdBdbnKRHQXBQq5dcFsDlWFeJp
|
||||
tnhA8VAPhahgatunoP3lDHS8nYXHPSa402KEfHRwwbntcq+mhdfnB+2UE6paNt6diIAGrS+p00E3OohM
|
||||
oH37GzqY4FPUZmfSyiYDaI1OwAVW02YMtCzBt1CSh2TB2pPQkFg+0dALCbw3QUUiyT50c+Em7TlKzvJI
|
||||
rgM/iRQT/l9NSZkK0qCBHKRV9ehGpDMWbFyhx6Dn8g2H0N3T+GbW78QQSqZqTZMoU7Notm0j2XGDYtgL
|
||||
RZrjSGBBtoxtREKbiUwZ04BlX5ZOHM6kVTVIJhdu8I5Aw65WUkQiIDhDklOyaEYWfhm3W9BtXwfFu/A0
|
||||
ur1DOZuDiswadx+NVxmJ9elS5gwlZ1z/rEfDjRTTzKlL9PgxEoYnZewZD/wB4r+Nvne+oTwAAAAASUVO
|
||||
RK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="button_github.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
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
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
@@ -299,215 +300,318 @@ AMD compatibilty pack dependencies have additional licenses, detailed in the AMD
|
||||
</metadata>
|
||||
<data name="button_Wiki.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
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
|
||||
</value>
|
||||
</data>
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include "glStuff.h"
|
||||
//#define WIN32_LEAN_AND_MEAN
|
||||
//#include <windows.h>
|
||||
//#include <psapi.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "glStuff.h"
|
||||
|
||||
// use this as a hook to perform initialisation
|
||||
void(__cdecl* glutSetCursor)(int cursor) = *(void(__cdecl**)(int))0x140966068;
|
||||
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);
|
||||
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;
|
||||
//}
|
||||
|
||||
@@ -149,7 +149,7 @@ class PatchApplier600 : public PatchApplier {
|
||||
|
||||
if (nPDLoaderText && !nHideFreeplay)
|
||||
{
|
||||
InjectCode((void*)0x00000001409BC188, { 0x50, 0x44, 0x20, 0x4C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x20, 0x00 });
|
||||
InjectCode((void*)0x00000001409BC188, { 'U', 'N', 'S', 'U', 'P', 'P', 'O', 'R', 'T', 'E', 'D', '\0' });
|
||||
printf("[Patches] Show PD Loader text\n");
|
||||
}
|
||||
}
|
||||
@@ -161,12 +161,18 @@ class PatchApplier600 : public PatchApplier {
|
||||
printf("[Patches] Cursor enabled\n");*/
|
||||
}
|
||||
// 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> 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 };
|
||||
networkIcon = { 0x9F, 0x1E };
|
||||
@@ -184,12 +190,6 @@ class PatchApplier600 : public PatchApplier {
|
||||
networkIcon = { 0xA1, 0x1E };
|
||||
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
|
||||
InjectCode((void*)0x00000001403A0C9E, cardIcon); // error state
|
||||
@@ -308,16 +308,16 @@ class PatchApplier600 : public PatchApplier {
|
||||
printf("[Patches] Enhanced Stage Manager enabled\n");
|
||||
}
|
||||
// OpenGL Patches
|
||||
if (nOGLPatchA)
|
||||
{
|
||||
// (call cs:glGetError) -> (xor eax, eax); (nop); (nop); (nop); (nop);
|
||||
InjectCode((void*)0x000000014067842D, { 0x31, 0xC0, 0x90, 0x90, 0x90, 0x90 });
|
||||
}
|
||||
if (nOGLPatchB)
|
||||
{
|
||||
// (js loc_14069BC32) -> (nop)...
|
||||
InjectCode((void*)0x0000000140676D04, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
}
|
||||
//if (nOGLPatchA)
|
||||
//{
|
||||
// // (call cs:glGetError) -> (xor eax, eax); (nop); (nop); (nop); (nop);
|
||||
// InjectCode((void*)0x000000014067842D, { 0x31, 0xC0, 0x90, 0x90, 0x90, 0x90 });
|
||||
//}
|
||||
//if (nOGLPatchB)
|
||||
//{
|
||||
// // (js loc_14069BC32) -> (nop)...
|
||||
// InjectCode((void*)0x0000000140676D04, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
//}
|
||||
// Unlock PSEUDO modules (which will all default to Miku, unless we also patch them to match the first performer)
|
||||
if (nUnlockPseudo)
|
||||
{
|
||||
|
||||
@@ -129,6 +129,15 @@ class PatchApplier710 : public PatchApplier {
|
||||
printf("[Patches] MLAA disabled\n");
|
||||
}
|
||||
|
||||
// gamma
|
||||
if (nGamma != 100 && nGamma != 0)
|
||||
{
|
||||
float gamma_float = (float)nGamma / 100.0f;
|
||||
InjectCode((void*)(0x1404a863b), { *((uint8_t*)(&gamma_float)), *((uint8_t*)(&gamma_float) + 1), *((uint8_t*)(&gamma_float) + 2), *((uint8_t*)(&gamma_float) + 3) });
|
||||
|
||||
printf("[Patches] Gamma: %f\n", gamma_float);
|
||||
}
|
||||
|
||||
// Replace the hardcoded videos with MP4s, if they exist
|
||||
if (nMP4Movies)
|
||||
{
|
||||
@@ -157,7 +166,9 @@ 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, 't', 'e', 's', 't',
|
||||
0x00});
|
||||
printf("[Patches] Show PD Loader text\n");
|
||||
}
|
||||
}
|
||||
@@ -169,12 +180,18 @@ class PatchApplier710 : public PatchApplier {
|
||||
printf("[Patches] Cursor enabled\n");
|
||||
}
|
||||
// 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> 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 };
|
||||
networkIcon = { 0x9F, 0x1E };
|
||||
@@ -192,12 +209,6 @@ class PatchApplier710 : public PatchApplier {
|
||||
networkIcon = { 0xA1, 0x1E };
|
||||
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
|
||||
InjectCode((void*)0x00000001403B9D6E, cardIcon); // error state
|
||||
@@ -314,18 +325,20 @@ class PatchApplier710 : public PatchApplier {
|
||||
ESM[2] = nEStageManagerEncore;
|
||||
|
||||
printf("[Patches] Enhanced Stage Manager enabled\n");
|
||||
|
||||
}
|
||||
// OpenGL Patches
|
||||
if (nOGLPatchA)
|
||||
{
|
||||
// (call cs:glGetError) -> (xor eax, eax); (nop); (nop); (nop); (nop);
|
||||
InjectCode((void*)0x000000014069D21D, { 0x31, 0xC0, 0x90, 0x90, 0x90, 0x90 });
|
||||
}
|
||||
if (nOGLPatchB)
|
||||
{
|
||||
// (js loc_14069BC32) -> (nop)...
|
||||
InjectCode((void*)0x000000014069BAF4, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
}
|
||||
//// OpenGL Patches
|
||||
//if (nOGLPatchA)
|
||||
//{
|
||||
// // (call cs:glGetError) -> (xor eax, eax); (nop); (nop); (nop); (nop);
|
||||
// InjectCode((void*)0x000000014069D21D, { 0x31, 0xC0, 0x90, 0x90, 0x90, 0x90 });
|
||||
//}
|
||||
//if (nOGLPatchB)
|
||||
//{
|
||||
// // (js loc_14069BC32) -> (nop)...
|
||||
// InjectCode((void*)0x000000014069BAF4, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
//}
|
||||
//
|
||||
// Unlock PSEUDO modules (which will all default to Miku, unless we also patch them to match the first performer)
|
||||
if (nUnlockPseudo)
|
||||
{
|
||||
@@ -347,6 +360,7 @@ class PatchApplier710 : public PatchApplier {
|
||||
InjectCode((void*)0x000000014061579B, { 0x90, 0x90, 0x90, 0x8B, 0x42, 0xE0, 0x90, 0x90, 0x90 });
|
||||
}
|
||||
// Quick start
|
||||
if (!nUseDivahookBat)
|
||||
{
|
||||
if (nQuickStart == 1) // skip the card/guest screen
|
||||
{
|
||||
@@ -363,13 +377,15 @@ class PatchApplier710 : public PatchApplier {
|
||||
{
|
||||
InjectCode((void*)0x00000001405C84B3, { 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
}
|
||||
if (nEnablePvCustomization)
|
||||
{
|
||||
// Disable hand scaling
|
||||
if (nNoHandScaling)
|
||||
{
|
||||
InjectCode((void*)0x0000000140120709, { 0xE9, 0x82, 0x0A, 0x00 });
|
||||
}
|
||||
// Default hand size
|
||||
if (nDefaultHandSize != -1)
|
||||
if (nDefaultHandSize >= 10000 && nDefaultHandSize <= 1000000)
|
||||
{
|
||||
printf("[Patches] Changing default hand size...\n");
|
||||
const float num = (float)nDefaultHandSize / 10000.0;
|
||||
@@ -389,13 +405,6 @@ class PatchApplier710 : public PatchApplier {
|
||||
VirtualProtect(addr4, 4, oldProtect, nullptr);*/
|
||||
printf("[Patches] New default hand size: %f\n", num);
|
||||
}
|
||||
// Sing missed notes
|
||||
if (nSingMissed)
|
||||
{
|
||||
InjectCode((void*)0x140109044, { 0xEB });
|
||||
// Breaks border:
|
||||
// InjectCode((void*)0x140109096, { 0xEB });
|
||||
}
|
||||
// Force mouth animations
|
||||
{
|
||||
if (nForceMouth == 1) // PDA
|
||||
@@ -483,6 +492,14 @@ class PatchApplier710 : public PatchApplier {
|
||||
printf("[Patches] FT look forced\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
// Sing missed notes
|
||||
if (nSingMissed)
|
||||
{
|
||||
InjectCode((void*)0x140109044, { 0xEB });
|
||||
// Breaks border:
|
||||
// InjectCode((void*)0x140109096, { 0xEB });
|
||||
}
|
||||
// NPR1
|
||||
{
|
||||
if (nNpr1 == 1) // force on
|
||||
@@ -538,7 +555,7 @@ class PatchApplier710 : public PatchApplier {
|
||||
// Reflections
|
||||
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 });
|
||||
}
|
||||
// Shadows
|
||||
@@ -581,63 +598,70 @@ class PatchApplier710 : public PatchApplier {
|
||||
|
||||
InjectCode((void*)0x140A07920, { 0x00 }); // ignore objset
|
||||
}
|
||||
// Prevent data deletion
|
||||
if (nNoDelete)
|
||||
{
|
||||
InjectCode((void*)(0x1406FEF80 + 0x1DB), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407113F0 + 0x13C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140712270 + 0x6C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140712580 + 0x4C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140712580 + 0x7C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140713470 + 0x104), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407135B0 + 0x102), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407135B0 + 0x135), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407135B0 + 0x232), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140713810 + 0x3E8), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140713D00 + 0x677), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407168A0 + 0x9C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407168A0 + 0x1D2), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407168A0 + 0x218), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407168A0 + 0x22A), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140720910 + 0x25C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140723EE0 + 0xEC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140870DE0 + 0x4), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1406FEF80 + 0x1DB), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407113F0 + 0x13C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140712270 + 0x6E), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140712580 + 0x4C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140712580 + 0x7C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140713470 + 0x104), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407135B0 + 0x102), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407135B0 + 0x135), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407135B0 + 0x232), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140713810 + 0x3E8), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140713D00 + 0x677), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407168A0 + 0x9C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407168A0 + 0x1D2), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407168A0 + 0x218), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407168A0 + 0x22A), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140720910 + 0x25C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140723EE0 + 0xEC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407168A0 + 0x9C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140870DE0 + 0x4), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x14081B6A4), { 0xC3 });
|
||||
|
||||
InjectCode((void*)(0x1406E1090 + 0x43C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140718250 + 0x176), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140718750 + 0xC9), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407193E0 + 0xFC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1406E1090 + 0x43C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140718250 + 0x176), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x140718750 + 0xC9), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x1407193E0 + 0xFC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
InjectCode((void*)(0x14081B67A), { 0xC3 });
|
||||
}
|
||||
//// Prevent data deletion
|
||||
//if (nNoDelete)
|
||||
//{
|
||||
// InjectCode((void*)(0x1406FEF80 + 0x1DB), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407113F0 + 0x13C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140712270 + 0x6C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140712580 + 0x4C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140712580 + 0x7C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140713470 + 0x104), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407135B0 + 0x102), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407135B0 + 0x135), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407135B0 + 0x232), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140713810 + 0x3E8), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140713D00 + 0x677), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407168A0 + 0x9C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407168A0 + 0x1D2), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407168A0 + 0x218), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407168A0 + 0x22A), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140720910 + 0x25C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140723EE0 + 0xEC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140870DE0 + 0x4), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1406FEF80 + 0x1DB), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407113F0 + 0x13C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140712270 + 0x6E), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140712580 + 0x4C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140712580 + 0x7C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140713470 + 0x104), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407135B0 + 0x102), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407135B0 + 0x135), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407135B0 + 0x232), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140713810 + 0x3E8), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140713D00 + 0x677), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407168A0 + 0x9C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407168A0 + 0x1D2), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407168A0 + 0x218), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407168A0 + 0x22A), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140720910 + 0x25C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140723EE0 + 0xEC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407168A0 + 0x9C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140870DE0 + 0x4), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x14081B6A4), { 0xC3 });
|
||||
|
||||
// InjectCode((void*)(0x1406E1090 + 0x43C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140718250 + 0x176), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140718750 + 0xC9), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407193E0 + 0xFC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1406E1090 + 0x43C), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140718250 + 0x176), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x140718750 + 0xC9), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x1407193E0 + 0xFC), { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
// InjectCode((void*)(0x14081B67A), { 0xC3 });
|
||||
//}
|
||||
|
||||
// patch refract and reflect buffer sizes
|
||||
// no need to really check anything before injecting, because reinjecting defaults is fine
|
||||
if (nRefractResWidth != 512 || nRefractResHeight != 256)
|
||||
{
|
||||
InjectCode((void*)(0x140a24424), std::vector<uint8_t>((uint8_t*)&nRefractResWidth, (uint8_t*)((int64_t)&nRefractResWidth + 4)));
|
||||
InjectCode((void*)(0x140a24428), std::vector<uint8_t>((uint8_t*)&nRefractResHeight, (uint8_t*)((int64_t)&nRefractResHeight + 4)));
|
||||
|
||||
printf("[Patches] Refraction resolution patched.\n");
|
||||
}
|
||||
if (nReflectResWidth != 512 || nReflectResHeight != 256)
|
||||
{
|
||||
InjectCode((void*)(0x140a2443c), std::vector<uint8_t>((uint8_t*)&nReflectResWidth, (uint8_t*)((int64_t)&nReflectResWidth + 4)));
|
||||
InjectCode((void*)(0x140a24440), std::vector<uint8_t>((uint8_t*)&nReflectResHeight, (uint8_t*)((int64_t)&nReflectResHeight + 4)));
|
||||
// for large reflect resolutions, adjust blur effect amount to not lose the effect
|
||||
@@ -679,12 +703,22 @@ class PatchApplier710 : public PatchApplier {
|
||||
InjectCode((void*)(0x14050294f), { 0xc3 }); // RET
|
||||
}
|
||||
|
||||
printf("[Patches] Reflection resolution patched.\n");
|
||||
}
|
||||
if (nShadowResWidth != 2048 || nShadowResHeight != 2048)
|
||||
{
|
||||
InjectUint((void*)(0x140A81E04), nShadowResHeight);
|
||||
InjectUint((void*)(0x140A81E08), nShadowResWidth);
|
||||
|
||||
printf("[Patches] Shadow resolution patched.\n");
|
||||
}
|
||||
|
||||
// lag compensation
|
||||
if (nLagCompensation>0 && nLagCompensation<=50)
|
||||
if (nLagCompensation > 0 && nLagCompensation <= 500)
|
||||
{
|
||||
InjectCode((void*)(0x14011e44e), { 0xf3, 0x0f, 0x10, 0x05, 0x8a, 0xcf, 0x9c, 0x00 }); // hijack xmm0
|
||||
InjectCode((void*)(0x14011e46b), { 0xf3, 0x0f, 0x11, 0x44, 0x24, 0x20 }); // get value from xmm0 instead of xmm1
|
||||
float startPos = (float)nLagCompensation / 100.0;
|
||||
float startPos = (float)nLagCompensation / 1000.0f;
|
||||
InjectCode((void*)(0x140aeB3e0), { *((uint8_t*)(&startPos)), *((uint8_t*)(&startPos) + 1), *((uint8_t*)(&startPos) + 2), *((uint8_t*)(&startPos) + 3) });
|
||||
|
||||
printf("[Patches] Lag Compensation: %f\n", startPos);
|
||||
|
||||
@@ -100,13 +100,17 @@
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="databank.cpp" />
|
||||
<ClCompile Include="dllmain.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="databank.h" />
|
||||
<ClInclude Include="framework.h" />
|
||||
<ClInclude Include="PatchApplier.h" />
|
||||
<ClInclude Include="PatchApplier600.h" />
|
||||
<ClInclude Include="PatchApplier710.h" />
|
||||
<ClInclude Include="storage.h" />
|
||||
<ClInclude Include="urlutil.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
<ClCompile Include="dllmain.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="databank.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="framework.h">
|
||||
@@ -32,5 +35,14 @@
|
||||
<ClInclude Include="PatchApplier710.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</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>
|
||||
</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();
|
||||
};
|
||||
}
|
||||
@@ -7,13 +7,16 @@
|
||||
#include <filesystem>
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
#include <regex>
|
||||
#include <detours.h>
|
||||
|
||||
#include "PluginConfigApi.h"
|
||||
#include "PatchApplier.h"
|
||||
#include "PatchApplier600.h"
|
||||
#include "PatchApplier710.h"
|
||||
|
||||
#include <detours.h>
|
||||
#include "framework.h"
|
||||
#include "storage.h"
|
||||
#include "databank.h"
|
||||
#pragma comment(lib, "detours.lib")
|
||||
|
||||
unsigned short game_version = 710;
|
||||
@@ -22,7 +25,9 @@ void InjectCode(void* address, const std::vector<uint8_t> data);
|
||||
void ApplyPatches();
|
||||
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;
|
||||
|
||||
@@ -46,6 +51,16 @@ BOOL APIENTRY DllMain(HMODULE hModule,
|
||||
}
|
||||
|
||||
void ApplyPatches() {
|
||||
if (game_version == 710)
|
||||
{
|
||||
const char* exe_ver_string = (const char*)0x140A92CB8;
|
||||
if (strcmp(exe_ver_string, "7.10.00") != 0)
|
||||
{
|
||||
MessageBoxW(nullptr, L"Game version not 7.10. Please verify your files.", L"Patches", MB_ICONERROR);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
std::string version_string = std::to_string(game_version);
|
||||
version_string.insert(version_string.begin()+1, '.');
|
||||
std::cout << "[Patches] Game version " + version_string << std::endl;
|
||||
@@ -70,6 +85,8 @@ void ApplyPatches() {
|
||||
try {
|
||||
for (std::filesystem::path p : std::filesystem::directory_iterator("../patches"))
|
||||
{
|
||||
if (std::filesystem::path(p).filename().string()._Starts_with("._")) continue; // exclude macOS metadata
|
||||
|
||||
std::string extension = std::filesystem::path(p).extension().string();
|
||||
if ((extension == ".p" || extension == ".P" || extension == ".p2" || extension == ".P2") &&
|
||||
GetPrivateProfileIntW(L"plugins", std::filesystem::path(p).filename().c_str(), TRUE, CONFIG_FILE))
|
||||
@@ -77,6 +94,7 @@ void ApplyPatches() {
|
||||
std::cout << "[Patches] Reading custom patch file: " << std::filesystem::path(p).filename().string() << std::endl;
|
||||
ApplyCustomPatches(std::filesystem::path(p).wstring());
|
||||
}
|
||||
else std::cout << "[Patches] Skipping disabled patch file: " << std::filesystem::path(p).filename().string() << std::endl;
|
||||
}
|
||||
}
|
||||
catch (const std::filesystem::filesystem_error &e) {
|
||||
@@ -85,6 +103,11 @@ void ApplyPatches() {
|
||||
|
||||
std::cout << "[Patches] All custom patches applied\n";
|
||||
}
|
||||
|
||||
if (nAutoDatabank)
|
||||
{
|
||||
initPvListContainerHook();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -231,7 +254,7 @@ void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING)
|
||||
if (echo) std::cout << std::endl;
|
||||
else if (comment_string.length() > 0)
|
||||
{
|
||||
std::cout << "[Patches]";;
|
||||
std::cout << "[Patches]";
|
||||
if (comment_string.at(0) != ' ') std::cout << ' ';
|
||||
std::cout << comment_string << std::endl;
|
||||
}
|
||||
@@ -241,6 +264,52 @@ void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING)
|
||||
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;
|
||||
|
||||
|
||||
@@ -3,6 +3,14 @@
|
||||
#include <string>
|
||||
#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)
|
||||
{
|
||||
const size_t strBegin = str.find_first_not_of(whitespace);
|
||||
@@ -47,6 +55,14 @@ void InjectCode(void* address, const std::vector<uint8_t> data)
|
||||
VirtualProtect(address, byteCount, oldProtect, nullptr);
|
||||
}
|
||||
|
||||
void InjectUint(void* address, const uint32_t data)
|
||||
{
|
||||
DWORD oldProtect;
|
||||
VirtualProtect(address, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
memcpy(address, &data, 4);
|
||||
VirtualProtect(address, 4, oldProtect, nullptr);
|
||||
}
|
||||
|
||||
// patchMovieExt will modify an extension to mp4 only if the file exists on disk as an mp4
|
||||
void patchMovieExt(std::string moviefile, void* address)
|
||||
{
|
||||
@@ -83,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 nFreeplay = GetPrivateProfileIntW(L"patches", L"freeplay", 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 nHidePVWatermark = GetPrivateProfileIntW(L"patches", L"hide_pv_watermark", FALSE, CONFIG_FILE);
|
||||
auto nNoPVUi = GetPrivateProfileIntW(L"patches", L"no_pv_ui", FALSE, CONFIG_FILE);
|
||||
@@ -93,23 +110,24 @@ auto nMP4Movies = GetPrivateProfileIntW(L"patches", L"mp4_movies", FALSE, CONFIG
|
||||
auto nNoError = GetPrivateProfileIntW(L"patches", L"no_error", FALSE, 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 nAutoDatabank = GetPrivateProfileIntW(L"patches", L"auto_databank", TRUE, 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 nUnlockPseudo = GetPrivateProfileIntW(L"patches", L"unlock_pseudo", FALSE, CONFIG_FILE);
|
||||
auto nCard = GetPrivateProfileIntW(L"patches", L"card", TRUE, CONFIG_FILE);
|
||||
auto nHardwareSlider = GetPrivateProfileIntW(L"patches", L"hardware_slider", FALSE, CONFIG_FILE);
|
||||
auto nOGLPatchA = GetPrivateProfileIntW(L"patches", L"opengl_patch_a", FALSE, CONFIG_FILE);
|
||||
auto nOGLPatchB = GetPrivateProfileIntW(L"patches", L"opengl_patch_b", FALSE, CONFIG_FILE);
|
||||
auto nTAA = GetPrivateProfileIntW(L"graphics", L"taa", TRUE, CONFIG_FILE);
|
||||
auto nMLAA = GetPrivateProfileIntW(L"graphics", L"mlaa", TRUE, CONFIG_FILE);
|
||||
auto nDoF = GetPrivateProfileIntW(L"graphics", L"dof", TRUE, CONFIG_FILE);
|
||||
auto nMAG = GetPrivateProfileIntW(L"graphics", L"mag", 0, CONFIG_FILE);
|
||||
auto nGamma = GetPrivateProfileIntW(L"graphics", L"gamma", 100, CONFIG_FILE);
|
||||
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 nQuickStart = GetPrivateProfileIntW(L"patches", L"quick_start", 0, 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", -1, 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);
|
||||
auto nForceMouth = GetPrivateProfileIntW(L"patches", L"force_mouth", 0, CONFIG_FILE);
|
||||
auto nForceExpressions = GetPrivateProfileIntW(L"patches", L"force_expressions", 0, CONFIG_FILE);
|
||||
@@ -121,9 +139,11 @@ auto nPunchthrough = GetPrivateProfileIntW(L"graphics", L"punchthrough", TRUE, C
|
||||
auto nGlare = GetPrivateProfileIntW(L"graphics", L"glare", TRUE, CONFIG_FILE);
|
||||
auto nShader = GetPrivateProfileIntW(L"graphics", L"shader", TRUE, CONFIG_FILE);
|
||||
auto n2D = GetPrivateProfileIntW(L"graphics", L"2D", FALSE, CONFIG_FILE);
|
||||
auto nNoDelete = GetPrivateProfileIntW(L"patches", L"prevent_data_deletion", FALSE, CONFIG_FILE);
|
||||
auto nReflectResWidth = GetPrivateProfileIntW(L"graphics", L"reflect_res_width", 512, CONFIG_FILE);
|
||||
auto nReflectResHeight = GetPrivateProfileIntW(L"graphics", L"reflect_res_height", 256, CONFIG_FILE);
|
||||
auto nRefractResWidth = GetPrivateProfileIntW(L"graphics", L"refract_res_width", 512, CONFIG_FILE);
|
||||
auto nRefractResHeight = GetPrivateProfileIntW(L"graphics", L"refract_res_height", 256, CONFIG_FILE);
|
||||
auto nShadowResWidth = GetPrivateProfileIntW(L"graphics", L"shadow_res_width", 2048, CONFIG_FILE);
|
||||
auto nShadowResHeight = GetPrivateProfileIntW(L"graphics", L"shadow_res_height", 2048, CONFIG_FILE);
|
||||
auto nLagCompensation = GetPrivateProfileIntW(L"graphics", L"lag_compensation", 0, CONFIG_FILE);
|
||||
auto nUseDivahookBat = GetPrivateProfileIntW(L"launcher", L"use_divahook_bat", 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();
|
||||
}
|
||||
@@ -135,8 +135,8 @@ __int64 hookedParseParameters(int a1, __int64* a2)
|
||||
case 600:
|
||||
*resolutionType_600 = 15;
|
||||
break;
|
||||
default:
|
||||
*resolutionType_710 = 15;
|
||||
//default:
|
||||
// *resolutionType_710 = 15;
|
||||
}
|
||||
// Return to the original function
|
||||
switch (game_version)
|
||||
@@ -144,8 +144,8 @@ __int64 hookedParseParameters(int a1, __int64* a2)
|
||||
case 600:
|
||||
return divaParseParameters_600(a1, a2);
|
||||
break;
|
||||
default:
|
||||
return divaParseParameters_710(a1, a2);
|
||||
//default:
|
||||
// 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)
|
||||
{
|
||||
if (nFpsLimit < 1)
|
||||
@@ -284,17 +318,17 @@ BOOL APIENTRY DllMain(HMODULE hModule,
|
||||
}
|
||||
DetourTransactionCommit();
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
switch (game_version)
|
||||
{
|
||||
case 600:
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach(&(PVOID&)divaParseParameters_600, hookedParseParameters);
|
||||
break;
|
||||
default:
|
||||
DetourAttach(&(PVOID&)divaParseParameters_710, hookedParseParameters);
|
||||
}
|
||||
DetourTransactionCommit();
|
||||
break;
|
||||
//default:
|
||||
// DetourAttach(&(PVOID&)divaParseParameters_710, hookedParseParameters);
|
||||
}
|
||||
|
||||
|
||||
// set sleep time resolution to 2ms or device minimum (whichever's lower)
|
||||
@@ -340,39 +374,14 @@ BOOL APIENTRY DllMain(HMODULE hModule,
|
||||
switch (game_version)
|
||||
{
|
||||
case 600:
|
||||
{
|
||||
DWORD oldProtect, bck;
|
||||
VirtualProtect((BYTE*)0x0000000140980954, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
*((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);
|
||||
}
|
||||
WRITE_MEMORY_INT(0x0000000140980954, nIntResWidth);
|
||||
WRITE_MEMORY_INT(0x0000000140980958, nIntResWidth);
|
||||
break;
|
||||
default:
|
||||
{
|
||||
DWORD oldProtect, bck;
|
||||
VirtualProtect((BYTE*)0x00000001409B8B68, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
|
||||
*((int*)0x00000001409B8B68) = nIntResWidth;
|
||||
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?
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach(&(PVOID&)divaInitRender_710, hookedInitRender);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,11 +6,12 @@
|
||||
#include <string>
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
#include <windows.h>
|
||||
//#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
//#include <windows.h>
|
||||
//#include <psapi.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
@@ -127,3 +128,36 @@ LPCWSTR DATA_FILE = DATA_FILE_STRING.c_str();
|
||||
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\ShaderPatchConfig.ini";
|
||||
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;
|
||||
//}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "../../Input/Bindings/XinputBinding.h"
|
||||
#include "../../Input/Bindings/MouseBinding.h"
|
||||
#include "../../Input/Bindings/Ds4Binding.h"
|
||||
#include "../../Input/Bindings/DVLBinding.h"
|
||||
#include "../../Input/KeyConfig/Config.h"
|
||||
#include "../../Utilities/Operations.h"
|
||||
#include "../../Utilities/EnumBitwiseOperations.h"
|
||||
@@ -82,6 +83,8 @@ namespace TLAC::Components
|
||||
MenuCircleBinding = new Binding();
|
||||
|
||||
CoinBinding = new Binding();
|
||||
ToonBinding = new Binding();
|
||||
WireframeBinding = new Binding();
|
||||
|
||||
FileSystem::ConfigFile configFile(framework::GetModuleDirectory(), KEY_CONFIG_FILE_NAME);
|
||||
configFile.OpenRead();
|
||||
@@ -100,9 +103,20 @@ namespace TLAC::Components
|
||||
Config::BindConfigKeys(configFile.ConfigMap, "MENU_L", *MenuLBinding, { "Left", "Up" });
|
||||
Config::BindConfigKeys(configFile.ConfigMap, "MENU_R", *MenuRBinding, { "Down", "Right" });
|
||||
Config::BindConfigKeys(configFile.ConfigMap, "MENU_CIRCLE", *MenuCircleBinding, { "D", "L", "Spacebar" });
|
||||
Config::BindConfigKeys(configFile.ConfigMap, "TOON", *ToonBinding, { "F9" });
|
||||
Config::BindConfigKeys(configFile.ConfigMap, "COIN", *CoinBinding, { "F10" });
|
||||
Config::BindConfigKeys(configFile.ConfigMap, "WIREFRAME", *WireframeBinding, { "Backspace" });
|
||||
|
||||
mouseScrollPvSelection = configFile.GetBooleanValue("mouse_scroll_pv_selection");
|
||||
|
||||
TestBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_L3));
|
||||
ServiceBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_L2));
|
||||
CoinBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_L1));
|
||||
StartBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_FN));
|
||||
SankakuBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_TRIANGLE));
|
||||
ShikakuBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_SQUARE));
|
||||
BatsuBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_CROSS));
|
||||
MaruBinding->AddBinding(new DivallerBinding(DivallerButton::DVL_CIRCLE));
|
||||
}
|
||||
|
||||
void InputEmulator::Update()
|
||||
@@ -168,6 +182,15 @@ namespace TLAC::Components
|
||||
|
||||
// repress held down buttons to not block input
|
||||
//inputState->Down.Buttons ^= inputState->Tapped.Buttons;
|
||||
|
||||
if (CoinBinding->AnyTapped())
|
||||
addCoin();
|
||||
|
||||
if (ToonBinding->AnyTapped())
|
||||
toggleNpr1();
|
||||
|
||||
if (WireframeBinding->AnyTapped())
|
||||
toggleWireframe();
|
||||
}
|
||||
|
||||
HoldState InputEmulator::GetHoldState()
|
||||
@@ -299,9 +322,6 @@ namespace TLAC::Components
|
||||
if (buttonTestFunc(RightBinding))
|
||||
buttons |= JVS_R;
|
||||
|
||||
if (buttonTestFunc(CoinBinding))
|
||||
addCoin();
|
||||
|
||||
return buttons;
|
||||
}
|
||||
|
||||
@@ -345,9 +365,6 @@ namespace TLAC::Components
|
||||
if (keyboard->IsIntervalTapped(VK_SPACE))
|
||||
inputKey = 0x20;
|
||||
|
||||
if (keyboard->IsIntervalTapped(VK_F9))
|
||||
toggleNpr1();
|
||||
|
||||
if (keyboard->IsDoubleTapped(VK_ESCAPE))
|
||||
*(bool*)SHOULD_EXIT_BOOL_ADDRESS = true;
|
||||
|
||||
@@ -465,4 +482,28 @@ namespace TLAC::Components
|
||||
printf("[TLAC] NPR1 restored\n");
|
||||
}
|
||||
}
|
||||
|
||||
void InputEmulator::toggleWireframe()
|
||||
{
|
||||
static bool wireframeEnabled = false;
|
||||
|
||||
if (!wireframeEnabled)
|
||||
{
|
||||
// inject samyuu's wireframe code
|
||||
InjectCode((void*)0x00000000140500BE6, { 0xBA, 0x01, 0x1B, 0x00, 0x00, // mov edx,00001B01
|
||||
0xB9, 0x08, 0x04, 0x00, 0x00, // mov ecx,00000408
|
||||
0xE8, 0xE1, 0x5A, 0x3B, 0x00, // call 1408B66D6
|
||||
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
|
||||
|
||||
wireframeEnabled = true;
|
||||
printf("[TLAC] Wireframe enabled\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
InjectCode((void*)0x00000000140500BE6, { 0xB9, 0x1C, 0x00, 0x00, 0x00, 0xE8, 0x30, 0x7C, 0xF3, 0xFF, 0xB9, 0x1B, 0x00, 0x00, 0x00, 0x8B, 0xD8, 0xE8, 0x24, 0x7C, 0xF3, 0xFF, 0xB9, 0x1A, 0x00, 0x00, 0x00 });
|
||||
|
||||
wireframeEnabled = false;
|
||||
printf("[TLAC] Wireframe disabled\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -39,6 +39,8 @@ namespace TLAC::Components
|
||||
Input::Binding* MenuCircleBinding;
|
||||
|
||||
Input::Binding* CoinBinding;
|
||||
Input::Binding* ToonBinding;
|
||||
Input::Binding* WireframeBinding;
|
||||
|
||||
InputEmulator();
|
||||
~InputEmulator();
|
||||
@@ -111,5 +113,6 @@ namespace TLAC::Components
|
||||
|
||||
void addCoin();
|
||||
void toggleNpr1();
|
||||
void toggleWireframe();
|
||||
};
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "../../Input/Bindings/KeyboardBinding.h"
|
||||
#include "../../Input/KeyConfig/Config.h"
|
||||
#include "../../Input/DirectInput/Ds4/DualShock4.h"
|
||||
#include "../../Input/Divaller/Divaller.h"
|
||||
#include "../../FileSystem/ConfigFile.h"
|
||||
#include "../../Utilities/Math.h"
|
||||
#include <algorithm>
|
||||
@@ -100,7 +101,11 @@ namespace TLAC::Components
|
||||
if (!componentsManager->GetUpdateGameInput() || componentsManager->IsDwGuiActive() || (!enableInMenus && !(*(GameState*)CURRENT_GAME_STATE_ADDRESS == GS_GAME && *(SubGameState*)CURRENT_GAME_SUB_STATE_ADDRESS == SUB_GAME_MAIN)))
|
||||
return;
|
||||
|
||||
if (usePs4OfficialSlider)
|
||||
if (Input::Divaller::GetInstance() != nullptr)
|
||||
{
|
||||
ApplyBitfieldState(Input::Divaller::GetInstance()->GetSlider());
|
||||
}
|
||||
else if (usePs4OfficialSlider)
|
||||
{
|
||||
DualShock4* ds4 = DualShock4::GetInstance();
|
||||
if (ds4 == nullptr)
|
||||
@@ -140,7 +145,7 @@ namespace TLAC::Components
|
||||
|
||||
void TouchSliderEmulator::OnFocusLost()
|
||||
{
|
||||
if (usePs4OfficialSlider)
|
||||
if (usePs4OfficialSlider || Input::Divaller::GetInstance() != nullptr)
|
||||
sliderState->ResetSensors(TouchSliderState::SENSOR_SET_MODE_RAW);
|
||||
else
|
||||
sliderState->ResetSensors(TouchSliderState::SENSOR_SET_MODE_SECTIONS);
|
||||
|
||||
@@ -32,9 +32,13 @@ namespace TLAC::Components
|
||||
Pause::menusets Pause::curMenuSet = MENUSET_MAIN;
|
||||
std::chrono::time_point<std::chrono::high_resolution_clock> Pause::menuItemMoveTime;
|
||||
std::vector<uint8_t> Pause::origAetMovOp;
|
||||
float_t Pause::origDeltaFrameHistory = 0.0f;
|
||||
int32_t Pause::origDeltaFrameHistoryInt = 0;
|
||||
uint8_t* Pause::aetMovPatchAddress = (uint8_t*)0x1401703b3;
|
||||
std::vector<uint8_t> Pause::origFramespeedOp;
|
||||
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;
|
||||
uint8_t* Pause::ageageHairPatchAddress = (uint8_t*)0x14054352c;
|
||||
std::vector<bool> Pause::streamPlayStates;
|
||||
@@ -136,6 +140,12 @@ namespace TLAC::Components
|
||||
InjectCode(framespeedPatchAddress, { 0x0f, 0x57, 0xc0, 0xc3 }); // XORPS XMM0,XMM0; RET
|
||||
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 audioStreamsAddress = *(uint64_t*)(audioMixerAddr + 0x18);
|
||||
int nAudioStreams = *(uint64_t*)(audioMixerAddr + 0x20);
|
||||
@@ -279,6 +289,9 @@ namespace TLAC::Components
|
||||
InjectCode(framespeedPatchAddress, origFramespeedOp);
|
||||
InjectCode(ageageHairPatchAddress, origAgeageHairOp);
|
||||
|
||||
*deltaFrameHistoryAddress = origDeltaFrameHistory;
|
||||
*deltaFrameHistoryIntAddress = origDeltaFrameHistoryInt;
|
||||
|
||||
uint64_t audioMixerAddr = *(uint64_t*)(AUDIO_MAIN_CLASS_ADDRESS + 0x70);
|
||||
uint64_t audioStreamsAddress = *(uint64_t*)(audioMixerAddr + 0x18);
|
||||
int nAudioStreams = *(uint64_t*)(audioMixerAddr + 0x20);
|
||||
|
||||
@@ -47,6 +47,10 @@ namespace TLAC::Components
|
||||
|
||||
static std::vector<uint8_t> origFramespeedOp;
|
||||
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 uint8_t* ageageHairPatchAddress;
|
||||
|
||||
@@ -8,7 +8,7 @@ constexpr uint8_t JNE_OPCODE = 0x85;
|
||||
|
||||
//constexpr uint64_t ENGINE_UPDATE_HOOK_TARGET_ADDRESS = 0x000000014018CC40;
|
||||
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 CURRENT_GAME_STATE_ADDRESS = 0x0000000140EDA810;
|
||||
|
||||
@@ -23,12 +23,12 @@ namespace TLAC::FileSystem
|
||||
return found;
|
||||
}
|
||||
|
||||
int ConfigFile::GetIntegerValue(const std::string& key)
|
||||
int ConfigFile::GetIntegerValue(const std::string& key, int defaultval)
|
||||
{
|
||||
auto pair = ConfigMap.find(key);
|
||||
bool found = pair != ConfigMap.end();
|
||||
|
||||
return found ? atoi(pair->second.c_str()) : 0;
|
||||
return found ? atoi(pair->second.c_str()) : defaultval;
|
||||
}
|
||||
|
||||
bool ConfigFile::GetBooleanValue(const std::string& key)
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace TLAC::FileSystem
|
||||
std::unordered_map<std::string, std::string> ConfigMap;
|
||||
|
||||
bool TryGetValue(const std::string &key, std::string **value);
|
||||
int GetIntegerValue(const std::string& key);
|
||||
int GetIntegerValue(const std::string& key, int defaultval = 0);
|
||||
bool GetBooleanValue(const std::string& key);
|
||||
float GetFloatValue(const std::string& key);
|
||||
std::string GetStringValue(const std::string& key);
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
#include "DVLBinding.h"
|
||||
|
||||
namespace TLAC::Input
|
||||
{
|
||||
#define DivallerInstanceCheckDefault(checkFunc) (Divaller::InstanceInitialized() ? Divaller::GetInstance()->checkFunc : false)
|
||||
|
||||
DivallerBinding::DivallerBinding(DivallerButton button) : Button(button)
|
||||
{
|
||||
}
|
||||
|
||||
DivallerBinding::~DivallerBinding()
|
||||
{
|
||||
}
|
||||
|
||||
bool DivallerBinding::IsDown()
|
||||
{
|
||||
return DivallerInstanceCheckDefault(IsDown(Button));
|
||||
}
|
||||
|
||||
bool DivallerBinding::IsTapped()
|
||||
{
|
||||
return DivallerInstanceCheckDefault(IsTapped(Button));
|
||||
}
|
||||
|
||||
bool DivallerBinding::IsReleased()
|
||||
{
|
||||
return DivallerInstanceCheckDefault(IsReleased(Button));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
#include "IInputBinding.h"
|
||||
#include "../Divaller/Divaller.h"
|
||||
|
||||
namespace TLAC::Input
|
||||
{
|
||||
class DivallerBinding : public IInputBinding
|
||||
{
|
||||
public:
|
||||
DivallerButton Button;
|
||||
|
||||
DivallerBinding(DivallerButton button);
|
||||
~DivallerBinding();
|
||||
|
||||
bool IsDown() override;
|
||||
bool IsTapped() override;
|
||||
bool IsReleased() override;
|
||||
};
|
||||
}
|
||||
@@ -21,7 +21,9 @@ namespace TLAC::Input
|
||||
// Hori F2nd Miniboard (Hatsune Miku Sho): {00490F0D-0000-0000-0000-504944564944}
|
||||
{ 0x00490F0D, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } },
|
||||
// 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
|
||||
|
||||
@@ -0,0 +1,272 @@
|
||||
#include "Divaller.h"
|
||||
#include "../../framework.h"
|
||||
#include "DivallerButton.h"
|
||||
#include "DivallerState.h"
|
||||
#include <stdio.h>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
|
||||
namespace TLAC::Input
|
||||
{
|
||||
Divaller *Divaller::instance;
|
||||
|
||||
Divaller::Divaller()
|
||||
{
|
||||
memset(outputBuffer, 0, sizeof(outputBuffer));
|
||||
outputBuffer[0] = 0x44;
|
||||
outputBuffer[1] = 0x4c;
|
||||
outputBuffer[2] = 0x61;
|
||||
}
|
||||
|
||||
Divaller::~Divaller()
|
||||
{
|
||||
CloseHandle(hDeviceHandle);
|
||||
}
|
||||
|
||||
bool Divaller::TryInitializeInstance()
|
||||
{
|
||||
if (InstanceInitialized())
|
||||
return true;
|
||||
|
||||
Divaller *divaller = new Divaller();
|
||||
|
||||
BOOL success = divaller->Initialize();
|
||||
instance = success ? divaller : nullptr;
|
||||
|
||||
if (!success)
|
||||
delete divaller;
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
bool Divaller::Initialize()
|
||||
{
|
||||
HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
||||
if (hDevInfo == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
printf("[TLAC] Divaller::Initialize(): SetupDiGetClassDevs returned INVALID_HANDLE_VALUE\n");
|
||||
return false;
|
||||
}
|
||||
LPCWSTR devPath = NULL;
|
||||
for (size_t i = 0;; i++)
|
||||
{
|
||||
SP_DEVICE_INTERFACE_DATA device_interface_data = {0};
|
||||
device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
||||
BOOL success = SetupDiEnumDeviceInterfaces(
|
||||
hDevInfo,
|
||||
NULL,
|
||||
&GUID_DEVINTERFACE_USB_DEVICE,
|
||||
(DWORD)i,
|
||||
&device_interface_data);
|
||||
if (!success)
|
||||
{
|
||||
break;
|
||||
}
|
||||
ULONG required_length = 0;
|
||||
success = SetupDiGetDeviceInterfaceDetail(
|
||||
hDevInfo,
|
||||
&device_interface_data,
|
||||
NULL,
|
||||
0,
|
||||
&required_length,
|
||||
NULL);
|
||||
|
||||
UINT8 *interface_data = (UINT8 *)calloc(required_length, sizeof(UINT8));
|
||||
|
||||
PSP_DEVICE_INTERFACE_DETAIL_DATA device_interface_detail_data = (PSP_DEVICE_INTERFACE_DETAIL_DATA)interface_data;
|
||||
device_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
|
||||
|
||||
ULONG actual_length = required_length;
|
||||
success = SetupDiGetDeviceInterfaceDetail(
|
||||
hDevInfo,
|
||||
&device_interface_data,
|
||||
device_interface_detail_data,
|
||||
actual_length,
|
||||
&required_length,
|
||||
NULL);
|
||||
|
||||
if (!success)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (
|
||||
wcsstr(device_interface_detail_data->DevicePath, L"vid_0e8f") == 0 ||
|
||||
wcsstr(device_interface_detail_data->DevicePath, L"pid_2213") == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
devPath = device_interface_detail_data->DevicePath;
|
||||
break;
|
||||
}
|
||||
if (devPath == NULL)
|
||||
{
|
||||
SetupDiDestroyDeviceInfoList(hDevInfo);
|
||||
return false;
|
||||
}
|
||||
hDeviceHandle = CreateFile(
|
||||
devPath,
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
NULL,
|
||||
OPEN_EXISTING,
|
||||
FILE_FLAG_OVERLAPPED,
|
||||
NULL);
|
||||
if (hDeviceHandle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
printf("[TLAC] Divaller::Initialize(): Open device failed.\n");
|
||||
SetupDiDestroyDeviceInfoList(hDevInfo);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!WinUsb_Initialize(hDeviceHandle, &hInterfaceHandle))
|
||||
{
|
||||
printf("[TLAC] Divaller::Initialize(): WinUsb_Initialize failed.\n");
|
||||
std::cout << GetLastError() << std::endl;
|
||||
SetupDiDestroyDeviceInfoList(hDevInfo);
|
||||
CloseHandle(hDeviceHandle);
|
||||
return false;
|
||||
}
|
||||
|
||||
USB_INTERFACE_DESCRIPTOR USBInterfaceDescriptor;
|
||||
if (!WinUsb_QueryInterfaceSettings(hInterfaceHandle, 0, &USBInterfaceDescriptor))
|
||||
{
|
||||
std::cout << GetLastError() << std::endl;
|
||||
SetupDiDestroyDeviceInfoList(hDevInfo);
|
||||
CloseHandle(hDeviceHandle);
|
||||
return false;
|
||||
}
|
||||
SetupDiDestroyDeviceInfoList(hDevInfo);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Divaller::PollInput()
|
||||
{
|
||||
lastState = currentState;
|
||||
ULONG len = 0;
|
||||
memset(currentState.state, 0, sizeof(currentState.state));
|
||||
BOOL bResult = WinUsb_ReadPipe(hInterfaceHandle, (UCHAR)132, currentState.state, _countof(currentState.state), &len, nullptr);
|
||||
if (!bResult || currentState.state[0] != 0x42 || currentState.state[1] != 0x56 || currentState.state[2] != 0x5a)
|
||||
{
|
||||
printf("[TLAC] Divaller::PollInput(): WinUsb_ReadPipe failed.\n");
|
||||
std::cout << GetLastError() << std::endl;
|
||||
}
|
||||
SetLED();
|
||||
return bResult;
|
||||
}
|
||||
|
||||
bool Divaller::SetLED()
|
||||
{
|
||||
outputBuffer[3] &= 0x0F; // Reset Button LED
|
||||
outputBuffer[3] |= (!(*buttonLed >> 1 & 0x0001)) << 4; // SQUARE
|
||||
outputBuffer[3] |= (!(*buttonLed >> 3 & 0x0001)) << 5; // CIRCLE
|
||||
outputBuffer[3] |= (!(*buttonLed & 0x0001)) << 6; // TRIANGLE
|
||||
outputBuffer[3] |= (!(*buttonLed >> 2 & 0x0001)) << 7; // CROSS
|
||||
if (*sliderLedInit && !sliderLedData)
|
||||
{
|
||||
sliderLedData = reinterpret_cast<UCHAR *>(*(uint64_t *)(0x14cc5de40 + 0x68) + 0x189c);
|
||||
}
|
||||
if (sliderLedData)
|
||||
{
|
||||
for (int n = 0; n < 32; n++)
|
||||
{
|
||||
// LED number + 3 bytes header + color offset
|
||||
outputBuffer[(31 - n) * 3 + 3 + 3] = sliderLedData[n * 3 + 1]; // BLUE
|
||||
outputBuffer[(31 - n) * 3 + 3 + 2] = sliderLedData[n * 3 + 2]; // RED
|
||||
outputBuffer[(31 - n) * 3 + 3 + 1] = sliderLedData[n * 3 + 3]; // GREEN
|
||||
}
|
||||
}
|
||||
|
||||
ULONG len = 0;
|
||||
BOOL bResult = WinUsb_WritePipe(hInterfaceHandle, (UCHAR)0x03, outputBuffer, 100, &len, NULL);
|
||||
if (!bResult)
|
||||
{
|
||||
printf("[TLAC] Divaller::SetLED(): WinUsb_WritePipe failed.\n");
|
||||
std::cout << GetLastError() << std::endl;
|
||||
}
|
||||
return bResult;
|
||||
}
|
||||
|
||||
bool Divaller::IsDown(DivallerButton button)
|
||||
{
|
||||
switch (button)
|
||||
{
|
||||
case DivallerButton::DVL_L1:
|
||||
return (currentState.state[5] >> 0) & 1;
|
||||
case DivallerButton::DVL_L2:
|
||||
return (currentState.state[4] >> 7) & 1;
|
||||
case DivallerButton::DVL_L3:
|
||||
return (currentState.state[4] >> 6) & 1;
|
||||
case DivallerButton::DVL_FN:
|
||||
return (currentState.state[3] >> 1) & 1;
|
||||
case DivallerButton::DVL_TRIANGLE:
|
||||
return (currentState.state[3] >> 4) & 1;
|
||||
case DivallerButton::DVL_SQUARE:
|
||||
return (currentState.state[3] >> 2) & 1;
|
||||
case DivallerButton::DVL_CROSS:
|
||||
return (currentState.state[3] >> 5) & 1;
|
||||
case DivallerButton::DVL_CIRCLE:
|
||||
return (currentState.state[3] >> 3) & 1;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Divaller::IsUp(DivallerButton button)
|
||||
{
|
||||
return !IsDown(button);
|
||||
}
|
||||
|
||||
bool Divaller::IsTapped(DivallerButton button)
|
||||
{
|
||||
return IsDown(button) && WasUp(button);
|
||||
}
|
||||
|
||||
bool Divaller::IsReleased(DivallerButton button)
|
||||
{
|
||||
return IsUp(button) && WasDown(button);
|
||||
}
|
||||
|
||||
bool Divaller::WasDown(DivallerButton button)
|
||||
{
|
||||
switch (button)
|
||||
{
|
||||
case DivallerButton::DVL_L1:
|
||||
return (lastState.state[5] >> 0) & 1;
|
||||
case DivallerButton::DVL_L2:
|
||||
return (lastState.state[4] >> 7) & 1;
|
||||
case DivallerButton::DVL_L3:
|
||||
return (lastState.state[4] >> 6) & 1;
|
||||
case DivallerButton::DVL_FN:
|
||||
return (lastState.state[3] >> 1) & 1;
|
||||
case DivallerButton::DVL_TRIANGLE:
|
||||
return (lastState.state[3] >> 4) & 1;
|
||||
case DivallerButton::DVL_SQUARE:
|
||||
return (lastState.state[3] >> 2) & 1;
|
||||
case DivallerButton::DVL_CROSS:
|
||||
return (lastState.state[3] >> 5) & 1;
|
||||
case DivallerButton::DVL_CIRCLE:
|
||||
return (lastState.state[3] >> 3) & 1;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Divaller::WasUp(DivallerButton button)
|
||||
{
|
||||
return !WasDown(button);
|
||||
}
|
||||
|
||||
uint32_t Divaller::GetSlider()
|
||||
{
|
||||
uint32_t i = 0;
|
||||
i |= currentState.state[5] >> 4;
|
||||
i |= currentState.state[6] << 4;
|
||||
i |= currentState.state[7] << 12;
|
||||
i |= currentState.state[8] << 20;
|
||||
i |= currentState.state[9] << 28;
|
||||
// Reverse the bit order of uint32
|
||||
i = (i & 0xaaaaaaaa) >> 1 | (i & 0x55555555) << 1;
|
||||
i = (i & 0xcccccccc) >> 2 | (i & 0x33333333) << 2;
|
||||
i = (i & 0xf0f0f0f0) >> 4 | (i & 0x0f0f0f0f) << 4;
|
||||
i = (i & 0xff00ff00) >> 8 | (i & 0x00ff00ff) << 8;
|
||||
return i >> 16 | i << 16;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
#pragma once
|
||||
#include "../IInputDevice.h"
|
||||
#include "DivallerState.h"
|
||||
#include "DivallerButton.h"
|
||||
#include <SetupAPI.h>
|
||||
#include <initguid.h>
|
||||
#include <usbiodef.h>
|
||||
#include <winusb.h>
|
||||
|
||||
namespace TLAC::Input
|
||||
{
|
||||
|
||||
class Divaller : public IInputDevice
|
||||
{
|
||||
public:
|
||||
Divaller();
|
||||
~Divaller();
|
||||
|
||||
static bool TryInitializeInstance();
|
||||
|
||||
bool Initialize();
|
||||
bool PollInput() override;
|
||||
bool SetLED();
|
||||
bool IsDown(DivallerButton button);
|
||||
bool IsUp(DivallerButton button);
|
||||
bool IsTapped(DivallerButton button);
|
||||
bool IsReleased(DivallerButton button);
|
||||
|
||||
bool WasDown(DivallerButton button);
|
||||
bool WasUp(DivallerButton button);
|
||||
uint32_t GetSlider();
|
||||
static inline bool InstanceInitialized() { return instance != nullptr; };
|
||||
static inline Divaller *GetInstance() { return instance; };
|
||||
static inline void DeleteInstance()
|
||||
{
|
||||
delete instance;
|
||||
instance = nullptr;
|
||||
};
|
||||
|
||||
private:
|
||||
static Divaller *instance;
|
||||
DivallerState lastState;
|
||||
DivallerState currentState;
|
||||
WINUSB_INTERFACE_HANDLE hInterfaceHandle;
|
||||
HANDLE hDeviceHandle;
|
||||
UCHAR outputBuffer[100];
|
||||
int *buttonLed = reinterpret_cast<int *>(0x14119b950);
|
||||
uint64_t *partionLed = reinterpret_cast<uint64_t *>(*(uint64_t *)0x140eda330 + 0xc9);
|
||||
uint64_t *sliderLedInit = reinterpret_cast<uint64_t *>((uint64_t *)0x14cc5dea8);
|
||||
UCHAR *sliderLedData = nullptr;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
namespace TLAC::Input
|
||||
{
|
||||
enum DivallerButton : int
|
||||
{
|
||||
DVL_SQUARE = 0,
|
||||
DVL_CROSS = 1,
|
||||
DVL_CIRCLE = 2,
|
||||
DVL_TRIANGLE = 3,
|
||||
|
||||
DVL_FN = 4,
|
||||
|
||||
DVL_L1 = 5,
|
||||
DVL_L2 = 6,
|
||||
DVL_L3 = 7,
|
||||
|
||||
DVL_R1 = 8,
|
||||
DVL_R2 = 9,
|
||||
DVL_R3 = 10,
|
||||
|
||||
DVL_UP = 11,
|
||||
DVL_LEFT = 12,
|
||||
DVL_DOWN = 13,
|
||||
DVL_RIGHT = 14,
|
||||
|
||||
DVL_PAD = 11,
|
||||
DVL_SHARE = 12,
|
||||
DVL_HOME = 13,
|
||||
DVL_OPTION = 14
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
#include "../../framework.h"
|
||||
namespace TLAC::Input
|
||||
{
|
||||
|
||||
struct DivallerState
|
||||
{
|
||||
uint8_t state[24];
|
||||
};
|
||||
}
|
||||
@@ -26,9 +26,6 @@ namespace TLAC::Input::KeyConfig
|
||||
{ "Minus", VK_SUBTRACT },
|
||||
{ "Divide", VK_DIVIDE },
|
||||
{ "Multiply", VK_MULTIPLY },
|
||||
{ "Comma", VK_OEM_COMMA },
|
||||
{ "Period", VK_OEM_PERIOD },
|
||||
{ "Slash", VK_OEM_2 },
|
||||
// F-Keys
|
||||
{ "F1", VK_F1 },
|
||||
{ "F2", VK_F2 },
|
||||
@@ -91,7 +88,14 @@ namespace TLAC::Input::KeyConfig
|
||||
{ "Escape", VK_ESCAPE },
|
||||
{ "Comma", VK_OEM_COMMA },
|
||||
{ "Period", VK_OEM_PERIOD },
|
||||
{ "Colon", VK_OEM_1 },
|
||||
{ "Slash", VK_OEM_2 },
|
||||
{ "Tilde", VK_OEM_3 },
|
||||
{ "LeftBracket", VK_OEM_4 },
|
||||
{ "Backslash", VK_OEM_5 },
|
||||
{ "RightBracket", VK_OEM_6 },
|
||||
{ "SingleDoubleQuote", VK_OEM_7 },
|
||||
{ "OEM_8", VK_OEM_8 },
|
||||
// Mouse buttons
|
||||
{ "MouseLeft", VK_LBUTTON },
|
||||
{ "MouseMiddle", VK_MBUTTON },
|
||||
|
||||
@@ -16,6 +16,8 @@ namespace TLAC::Input
|
||||
config.OpenRead();
|
||||
xinput_num = config.GetIntegerValue("xinput_preferred");
|
||||
rumble = config.GetBooleanValue("rumble");
|
||||
rumble_left = config.GetIntegerValue("xinput_rumble_intensity_left", 8000);
|
||||
rumble_right = config.GetIntegerValue("xinput_rumble_intensity_right", 4000);
|
||||
}
|
||||
|
||||
Xinput* Xinput::GetInstance()
|
||||
@@ -256,8 +258,8 @@ namespace TLAC::Input
|
||||
{
|
||||
XINPUT_VIBRATION vibration;
|
||||
ZeroMemory(&vibration, sizeof(XINPUT_VIBRATION));
|
||||
vibration.wLeftMotorSpeed = 8000; // use any value between 0-65535 here
|
||||
vibration.wRightMotorSpeed = 4000; // use any value between 0-65535 here
|
||||
vibration.wLeftMotorSpeed = rumble_left; // use any value between 0-65535 here
|
||||
vibration.wRightMotorSpeed = rumble_right; // use any value between 0-65535 here
|
||||
XInputSetState(xc_pref, &vibration);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace TLAC::Input
|
||||
|
||||
void SetTapStates(BYTE keycode, float elapsed);
|
||||
|
||||
int xinput_num;
|
||||
int xinput_num, rumble_left, rumble_right;
|
||||
bool rumble;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableUAC>false</EnableUAC>
|
||||
<AdditionalDependencies>XINPUT9_1_0.LIB;dinput8.lib;dxguid.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>XINPUT9_1_0.LIB;dinput8.lib;dxguid.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;Winusb.lib;Setupapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<IgnoreSpecificDefaultLibraries>Xinput.h</IgnoreSpecificDefaultLibraries>
|
||||
<AdditionalLibraryDirectories>..\..\..\dependencies\detours\lib;..\..\..\dependencies\freeglut\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>
|
||||
@@ -139,6 +139,7 @@
|
||||
<ClInclude Include="framework.h" />
|
||||
<ClInclude Include="Input\Bindings\Binding.h" />
|
||||
<ClInclude Include="Input\Bindings\Ds4Binding.h" />
|
||||
<ClInclude Include="Input\Bindings\DVLBinding.h" />
|
||||
<ClInclude Include="Input\Bindings\GuBinding.h" />
|
||||
<ClInclude Include="Input\Bindings\IInputBinding.h" />
|
||||
<ClInclude Include="Input\Bindings\KeyboardBinding.h" />
|
||||
@@ -154,6 +155,9 @@
|
||||
<ClInclude Include="Input\DirectInput\GenericUsb\GenericUsbInput.h" />
|
||||
<ClInclude Include="Input\DirectInput\GenericUsb\GuButton.h" />
|
||||
<ClInclude Include="Input\DirectInput\GenericUsb\GuState.h" />
|
||||
<ClInclude Include="Input\Divaller\Divaller.h" />
|
||||
<ClInclude Include="Input\Divaller\DivallerButton.h" />
|
||||
<ClInclude Include="Input\Divaller\DivallerState.h" />
|
||||
<ClInclude Include="Input\IInputDevice.h" />
|
||||
<ClInclude Include="Input\Keyboard\Keyboard.h" />
|
||||
<ClInclude Include="Input\Keyboard\KeyboardState.h" />
|
||||
@@ -197,6 +201,7 @@
|
||||
<ClCompile Include="framework.cpp" />
|
||||
<ClCompile Include="Input\Bindings\Binding.cpp" />
|
||||
<ClCompile Include="Input\Bindings\Ds4Binding.cpp" />
|
||||
<ClCompile Include="Input\Bindings\DVLBinding.cpp" />
|
||||
<ClCompile Include="Input\Bindings\GuBinding.cpp" />
|
||||
<ClCompile Include="Input\Bindings\KeyboardBinding.cpp" />
|
||||
<ClCompile Include="Input\Bindings\MouseBinding.cpp" />
|
||||
@@ -209,6 +214,7 @@
|
||||
<ClCompile Include="Input\DirectInput\Ds4\DualShock4.cpp" />
|
||||
<ClCompile Include="Input\DirectInput\GenericUsb\GenericUsbInput.cpp" />
|
||||
<ClCompile Include="Input\DirectInput\GenericUsb\GuState.cpp" />
|
||||
<ClCompile Include="Input\Divaller\Divaller.cpp" />
|
||||
<ClCompile Include="Input\Keyboard\Keyboard.cpp" />
|
||||
<ClCompile Include="Input\Keyboard\KeyboardState.cpp" />
|
||||
<ClCompile Include="Input\KeyConfig\Config.cpp" />
|
||||
|
||||
@@ -213,6 +213,18 @@
|
||||
<ClInclude Include="Utils.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Input\Divaller\Divaller.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Input\Divaller\DivallerButton.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Input\Divaller\DivallerState.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Input\Bindings\DVLBinding.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.cpp">
|
||||
@@ -362,5 +374,11 @@
|
||||
<ClCompile Include="Utils.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Input\Divaller\Divaller.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Input\Bindings\DVLBinding.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "Input/DirectInput/DirectInput.h"
|
||||
#include "Input/DirectInput/Ds4/DualShock4.h"
|
||||
#include "Input/DirectInput/GenericUsb/GenericUsbInput.h"
|
||||
#include "Input/Divaller/Divaller.h"
|
||||
#include "Components/ComponentsManager.h"
|
||||
#include <tchar.h>
|
||||
#include <GL/freeglut.h>
|
||||
@@ -21,7 +22,7 @@
|
||||
#pragma comment(lib, "detours.lib")
|
||||
|
||||
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);
|
||||
DWORD WINAPI WindowMessageDispatcher(LPVOID);
|
||||
@@ -81,6 +82,12 @@ namespace TLAC
|
||||
if (Input::GenericUsbInput::TryInitializeInstance())
|
||||
printf("[TLAC] UpdateTick(): GenericUsbInput connected and initialized\n");
|
||||
}
|
||||
|
||||
if (!Input::Divaller::InstanceInitialized())
|
||||
{
|
||||
if (Input::Divaller::TryInitializeInstance())
|
||||
printf("[TLAC] UpdateTick(): Divaller connected and initialized\n");
|
||||
}
|
||||
}
|
||||
|
||||
ComponentsManager.Update();
|
||||
@@ -112,6 +119,15 @@ namespace TLAC
|
||||
}
|
||||
}
|
||||
|
||||
if (Input::Divaller::GetInstance() != nullptr)
|
||||
{
|
||||
if (!Input::Divaller::GetInstance()->PollInput())
|
||||
{
|
||||
Input::Divaller::DeleteInstance();
|
||||
printf("[TLAC] UpdateTick(): Divaller connection lost\n");
|
||||
}
|
||||
}
|
||||
|
||||
ComponentsManager.UpdateInput();
|
||||
}
|
||||
|
||||
@@ -140,6 +156,15 @@ namespace TLAC
|
||||
printf("[TLAC] UpdateTick(): GenericUsbInput connection lost\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (Input::Divaller::GetInstance() != nullptr)
|
||||
{
|
||||
if (!Input::Divaller::GetInstance()->PollInput())
|
||||
{
|
||||
Input::Divaller::DeleteInstance();
|
||||
printf("[TLAC] UpdateTick(): Divaller connection lost\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (HasWindowFocus && !HadWindowFocus)
|
||||
@@ -371,10 +396,10 @@ void hookedEngineUpdate()
|
||||
//divaEngineUpdate();
|
||||
}
|
||||
|
||||
void hookedEngineDraw2D(void* addr)
|
||||
void hookedEngineStageDispShadow()
|
||||
{
|
||||
divaEngineStageDispShadow();
|
||||
TLAC::UpdateDraw2D();
|
||||
divaEngineDraw2D(addr);
|
||||
}
|
||||
|
||||
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||||
@@ -400,7 +425,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReser
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach(&(PVOID&)divaEngineDraw2D, hookedEngineDraw2D);
|
||||
DetourAttach(&(PVOID&)divaEngineStageDispShadow, hookedEngineStageDispShadow);
|
||||
DetourTransactionCommit();
|
||||
|
||||
//TLAC::InitializeExtraSettings();
|
||||
|
||||
Reference in New Issue
Block a user