73 Commits
Author SHA1 Message Date
nastys 32717a5ac6 Merge pull request #4 from Magicial-Studio/master
[TLAC] Support ipega's hardware controller
2022-01-02 16:00:48 +01:00
Raspberry Kan 25e718314e Merge branch 'PDModdingCommunity:master' into master 2022-01-02 22:54:34 +08:00
Raspberry-Monster c12b17ef69 Merge branch 'master' of https://github.com/Magicial-Studio/PD-Loader 2022-01-02 22:38:44 +08:00
Raspberry-Monster 89a6a9559e [TLAC] Support ipega's hardware controller 2022-01-02 22:36:10 +08:00
nastys 2752f74cb4 Merge pull request #3 from Magicial-Studio/master
Minor Changes for Simplified Chinese Translation for Credits Page And Components Page
2022-01-02 12:10:48 +01:00
Raspberry Kan 4238c9d4dc Merge branch 'PDModdingCommunity:master' into master 2022-01-02 11:27:21 +08:00
Raspberry-Monster d60820d0ea [i18n] Minor Changes for Translation For Credits Page 2022-01-02 11:27:00 +08:00
Raspberry-Monster 83e66488a4 [i18n] Minor Changes for Translation For Credits Page 2022-01-01 21:45:47 +08:00
Raspberry-Monster e896598da4 Merge branch 'master' of https://github.com/Magicial-Studio/PD-Loader 2022-01-01 21:32:28 +08:00
Raspberry-Monster 7eb77e15b4 [i18n] Update Translation of Credits Page and Components Page 2022-01-01 21:31:29 +08:00
nastys 5bb7ac18f0 Merge pull request #2 from Magicial-Studio/master
[i18n] Update Translation Of Simplified Chinese, Make Keyboard/Controller Configuration Translatable
2021-12-24 13:15:01 +01:00
Raspberry Kan 06d55f323e [i18n] [Untested] Rename Keyboard/Controller Configuration to KEYBOARD_CONTROLLER_CONFIGURATION 2021-12-24 12:41:11 +08:00
Raspberry Kan 42071e5054 [i18n] Update it-IT Translation
Rename Keyboard/Controller Configuration to KEYBOARD_CONTROLLER_CONFIGURATION
2021-12-24 12:31:07 +08:00
Raspberry-Monster d6118e335b [i18n] Update Translation Of Simplified Chinese, Make Keyboard/controller Configuration Translatable 2021-12-18 14:39:31 +08:00
nastys d17c2fa4b0 Update databank (from koren) 2021-11-15 12:00:33 +01:00
nastys 37c1d2340b Update appveyor.yml 2021-11-10 23:00:59 +01:00
nastys 332a5324ae (semi-tested) ManMan JA translation, config inis replacing templates, downgrade DivaSound and upgrade DivaMovie, fixes 2021-11-10 22:44:23 +01:00
nastys ab1b2f88c7 Update mdata SFV 2021-10-27 18:08:54 +02:00
nastys 5919ab6ff6 (still untested) More splitting and cleanup 2021-09-19 19:42:47 +02:00
nastys bb9301978b Remove modpacks tab and MINIMALIST config 2021-09-19 17:14:28 +02:00
nastys 650296c8ac [Launcher] Remove unsupported directives 2021-09-19 08:29:08 +02:00
nastys def9581d75 Initial refactoring (WARNING: largely untested) 2021-09-18 19:45:08 +02:00
nastys e37d2833b4 Update appveyor.yml for PS, Minimalist, and fix it-IT 2021-09-18 10:08:26 +02:00
nastys 860302a119 Minimalist build configuration; move toon to keyconfig 2021-09-18 00:54:54 +02:00
nastys db08f988e9 Launcher and translation fixes 2021-09-17 21:20:33 +02:00
nastys 42c289a1d4 [TLAC] Fix? coin&wireframe input 2021-09-14 16:18:44 +02:00
nastys 6b2849eb9a Fix Italian files in appveyor.yml 2021-09-07 18:36:15 +02:00
nastys 20189d85f6 [Launcher] Fix SKIN in pt 2021-09-05 21:19:59 +02:00
nastys c389c16c5c [Launcher] Actually, Encore (bis) is less weird 2021-09-05 21:18:20 +02:00
nastys a3358ebaf2 [Launcher] Bis
= Encore
2021-09-05 21:14:31 +02:00
nastys 81555a2d88 [Launcher] Italian translation + pt&zh tweaks 2021-09-05 20:32:33 +02:00
nastys c438e54c77 It's Brazilian, not European 2021-09-05 18:19:43 +02:00
nastys 991c9affbe Add pt-PT to appveyor.yml 2021-09-05 17:06:44 +02:00
nastys b3aed5b04f Add _ScarletNeko's Portuguese translation 2021-09-05 13:17:08 +02:00
nastys e5bdc8c98f Fix Ampere option 2021-09-02 19:41:17 +02:00
nastys f5edeee6b7 [Launcher] Minor layout changes] 2021-09-02 00:31:56 +02:00
nastys 1120101750 [DivaSound] Fix console output 2021-09-01 22:27:14 +02:00
nastys 1ebf904ad0 [DivaSound] Multiply period size by periods 2021-09-01 21:59:06 +02:00
nastys cfc49e723a Fix GPU detection 2021-09-01 16:08:28 +02:00
nastys eb7f5a9dd9 Gamma control 2021-09-01 02:35:30 +02:00
nastys f8f98f888f [DivaSound] part 2 2021-09-01 01:53:43 +02:00
nastys c5818a6aa1 [Launcher] Detect known bad GPU drivers 2021-09-01 00:41:34 +02:00
nastys 76e11cb465 [DivaSound] Expose period size instead of buffer size (not backwards-compatible) 2021-09-01 00:00:56 +02:00
nastys e55c47abe4 Update DivaSound 2021-08-31 23:44:13 +02:00
nastys 40523ae6d5 Update miniaudio 2021-08-31 23:32:56 +02:00
nastys 27314f8569 Yeet OpenGL A/B 2021-08-12 22:58:29 +02:00
nastys 5cb3482a75 [Patches] Warn if hand size is 0 or 1 2021-08-11 20:16:05 +02:00
nastys 98005b9cec Exclude macOS metadata 2021-08-11 20:07:24 +02:00
nastys 978619e21e Drop 6.00; Check game version properly 2021-08-11 19:58:26 +02:00
nastys 937ca721e9 [Launcher] Fix patches detection 2021-08-11 19:30:39 +02:00
nastys c055ac91d5 Options redesign; Rumble intensity; Dark fix; Remove OGL patches 2021-08-11 18:25:15 +02:00
nastys d97f86e833 Merge branch 'master' of Magicial-Studio/PD-Loader-Official-Chinese-Translate into master 2021-08-10 12:55:19 +00:00
nastys f4cc42611c Revert CI script 2021-08-10 11:32:33 +02:00
Raspberry-Monster da35d2ac39 Revert "Update appveyor.yml"
This reverts commit 916b588438.
2021-08-10 16:19:48 +08:00
Raspberry-Monster 7bb9c4ab13 [Launcher] Update ConfigOption to support i18n framework for "Match Window","Match Screen" and "Config"
[i18n] Update Translation of zh-Hans
[Readme] Upload Simplified Chinese-Translated Version of Readme
2021-08-10 15:20:38 +08:00
Raspberry Kan 01a05f04c7 更新 'README.txt' 2021-08-10 03:42:22 +00:00
nastys 32ac7ed826 Merge branch 'master' of chsbuffer/PD-Loader into master 2021-08-10 00:03:54 +00:00
Raspberry-Monster 9cdab284df [Launcher] Update Simplified Chinese Translation of new-strings which are new in PD-Loader 3 2021-08-01 15:07:30 +08:00
Raspberry Kan 35428ba352 Update README.txt 2021-08-01 11:43:02 +08:00
Raspberry Kan a2050c66cf Update Simplified Chinese Translated Version of Readme 2021-08-01 11:42:40 +08:00
Raspberry-Monster f94001a04d Merge branch 'tmp' 2021-08-01 11:27:00 +08:00
Raspberry Kan 916b588438 Update appveyor.yml 2021-08-01 11:24:31 +08:00
ChsBuffer 469bdad982 [CI] Create package.ps1
Update appveyor.yml
2021-07-31 01:28:25 +08:00
ChsBuffer df410d3666 [Launcher] Add Launcher Language setting 2021-07-26 00:02:51 +08:00
ChsBuffer 8168c89cf1 [Launcher] Add Chinese Simplified translation translated by Magical Studio 2021-07-25 04:46:06 +08:00
ChsBuffer 704d301b3a [Launcher] Globalization 2021-07-25 04:46:01 +08:00
nastys 18ce722fce PDL3 part 3 2021-07-22 19:57:02 +02:00
nastys 362b28da6e PDL3 part 2 2021-07-22 04:35:52 +02:00
nastys adb5c02256 PDL3: Simpler, easier, safer... but still in alpha. 2021-07-22 03:51:07 +02:00
nastys 3a1c6d7413 [TLAC] Add more VK_OEM keys 2021-05-10 03:29:58 +02:00
nastys 5ab07cde0e Implement samyuu's wireframe injection; Pro Lag Compensation 2021-03-29 01:22:27 +02:00
nastys fb3e735c1f Merge branch 'master' of Raspberry-Monster/PD-Loader into master 2021-03-07 04:12:04 +00:00
Raspberry-Monster 251637311c [Plugins] Fix MSVC Multiple Language Support by Adding /utf-8 in vcxproj file 2021-03-07 10:31:25 +08:00
102 changed files with 34160 additions and 36119 deletions
+4 -1
View File
@@ -1,3 +1,6 @@
._*
.DS_Store
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
@@ -341,4 +344,4 @@ healthchecksdb
# Exclude data folder
!data/*
!data/debug/*
!data/debug/*
+24580 -15011
View File
File diff suppressed because it is too large Load Diff
+14 -2
View File
@@ -1,9 +1,21 @@
================English================
This is the source code! It can NOT be used to play PDAFT!
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/PDModdingCommunity/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.
You should also read the wiki if you have any issues, before asking questions.
================简体中文(Simplified Chinese)================
如果你看到这行字,就证明你可能下错东西了
这里储存的仅仅只是PD-Loader的源代码,他并不能拿来玩PDAFT!
请不要点击Git链接旁边的“下载”按钮,它只会下载源代码至您的计算机
请访问 https://github.com/PDModdingCommunity/PD-Loader/wiki 以阅读关于安装PD-Loader的教程
教程中包含了如何下载PD-Loader可执行文件的链接
PS:由于Wiki中已包含部分在运行PDAFT时的常见问题,所以在Discord询问问题前,请确保您已经阅读Wiki
注: 现Wiki中的数据暂时还未进行翻译,请配合翻译软件查看,我们很快会更新简体中文的翻译文档
+36 -41
View File
@@ -7,50 +7,45 @@ build:
project: source-code/PD-Loader.sln
verbosity: minimal
after_build:
- cmd: >-
md %TMP%\full\
- ps: |
mkdir "$env:TMP/full/patches"
mkdir "$env:TMP/full/plugins"
mkdir "$env:TMP/full/plugins_config"
mkdir "$env:TMP/full/plugins/Novidia Shaders"
mkdir "$env:TMP/full/ram/databank_template"
md %TMP%\full\patches\
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/x64/$env:CONFIGURATION/dnsapi.dll" "$env:TMP/full"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/x64/$env:CONFIGURATION/*.dva" "$env:TMP/full/plugins"
md %TMP%\full\plugins\
if ( "$env:CONFIGURATION" -imatch "Release" )
{
mkdir "$env:TMP/full/plugins/zh-Hans"
mkdir "$env:TMP/full/plugins/pt-BR"
mkdir "$env:TMP/full/plugins/it-IT"
mkdir "$env:TMP/full/plugins/ja-JP"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/data/patches/custom_freeplay_text_example.p" "$env:TMP/full/patches"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/x64/$env:CONFIGURATION/zh-Hans/*.dll" "$env:TMP/full/plugins/zh-Hans"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/x64/$env:CONFIGURATION/pt-BR/*.dll" "$env:TMP/full/plugins/pt-BR"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/x64/$env:CONFIGURATION/it-IT/*.dll" "$env:TMP/full/plugins/it-IT"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/x64/$env:CONFIGURATION/ja-Jp/*.dll" "$env:TMP/full/plugins/ja-JP"
}
md "%TMP%\full\plugins\Novidia Shaders"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/data/README - PD Loader.url" "$env:TMP/full"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/data/*.sfv" "$env:TMP/full"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/data/plugins/*.*" "$env:TMP/full/plugins"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/data/plugins_config/*.*" "$env:TMP/full/plugins_config"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/data/plugins/Novidia Shaders/*.*" "$env:TMP/full/plugins/Novidia Shaders"
cp "$env:APPVEYOR_BUILD_FOLDER/source-code/data/ram/databank_template/*.dat" "$env:TMP/full/ram/databank_template"
cd "$env:TMP/full"
7z a "$env:APPVEYOR_BUILD_FOLDER/PD-Loader-$env:CONFIGURATION-AppVeyor-$env:APPVEYOR_REPO_COMMIT.zip" *
md %TMP%\full\ram\
md %TMP%\full\ram\databank_template\
copy %APPVEYOR_BUILD_FOLDER%\source-code\x64\%CONFIGURATION%\dnsapi.dll %TMP%\full\
copy %APPVEYOR_BUILD_FOLDER%\source-code\x64\%CONFIGURATION%\*.dva %TMP%\full\plugins\
copy "%APPVEYOR_BUILD_FOLDER%\source-code\data\README - PD Loader.url" %TMP%\full\
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\patches\custom_freeplay_text_example.p %TMP%\full\patches\
cd %TMP%\full\
7z a %APPVEYOR_BUILD_FOLDER%\PD-Loader-%CONFIGURATION%-AppVeyor.zip *
rm "$env:TMP/full/plugins/Launcher.dva"
rm "$env:TMP/full/plugins/CustoMixer.dva"
rm "$env:TMP/full/plugins/DivaWig.dva"
rm "$env:TMP/full/plugins/DSCRemote.dva"
rm "$env:TMP/full/plugins/modpacks" -r -fo
7z a "$env:APPVEYOR_BUILD_FOLDER/PD-Loader-$env:CONFIGURATION-HardMode-AppVeyor-$env:APPVEYOR_REPO_COMMIT.zip" *
artifacts:
- path: PD-Loader-*.zip
+17 -17
View File
@@ -7,21 +7,21 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PD-Loader", "source\PD-Load
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TLAC", "source\plugins\TLAC\TLAC.vcxproj", "{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Patches", "source\plugins\Patches\Patches.vcxproj", "{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Launcher", "source\plugins\Launcher\Launcher.vcxproj", "{60D5E9F4-335F-402B-9A07-D78674DFFC9B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Render", "source\plugins\Render\Render.vcxproj", "{89F87459-768F-4638-9267-0F90CD74452D}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fakedll", "source\fakedll\fakedll.vcxproj", "{B49C6ABE-931C-4F91-9A94-21A41A305FEE}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DivaSound", "source\plugins\DivaSound\DivaSound.vcxproj", "{EE1A551A-49A0-40F2-8C2E-862D0AE55B43}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DivaMovie", "source\plugins\DivaMovie\DivaMovie.vcxproj", "{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DivaWig", "source\plugins\DivaWig\DivaWig.vcxproj", "{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShaderPatch", "source\plugins\ShaderPatch\ShaderPatch.vcxproj", "{C07E495E-A16F-48FA-80E4-0296B5234F0B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DivaWig", "source\plugins\DivaWig\DivaWig.vcxproj", "{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EnhancedStageManager", "source\plugins\EnhancedStageManager\EnhancedStageManager.vcxproj", "{3C8071F4-22C8-DA6E-A075-C5EC646DAB7E}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CustoMixer", "source\plugins\CustoMixer\CustoMixer.vcxproj", "{84DBD504-6220-1BCE-A7E4-6799DAF7C5BF}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DSCRemote", "source\plugins\DSCRemote\DSCRemote.vcxproj", "{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}"
EndProject
@@ -41,18 +41,10 @@ Global
{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}.Debug|x64.Build.0 = Debug|x64
{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}.Release|x64.ActiveCfg = Release|x64
{2B5533BB-04A1-424F-9BCA-1CA963B46B7F}.Release|x64.Build.0 = Release|x64
{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}.Debug|x64.ActiveCfg = Debug|x64
{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}.Debug|x64.Build.0 = Debug|x64
{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}.Release|x64.ActiveCfg = Release|x64
{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}.Release|x64.Build.0 = Release|x64
{60D5E9F4-335F-402B-9A07-D78674DFFC9B}.Debug|x64.ActiveCfg = Debug|x64
{60D5E9F4-335F-402B-9A07-D78674DFFC9B}.Debug|x64.Build.0 = Debug|x64
{60D5E9F4-335F-402B-9A07-D78674DFFC9B}.Release|x64.ActiveCfg = Release|x64
{60D5E9F4-335F-402B-9A07-D78674DFFC9B}.Release|x64.Build.0 = Release|x64
{89F87459-768F-4638-9267-0F90CD74452D}.Debug|x64.ActiveCfg = Debug|x64
{89F87459-768F-4638-9267-0F90CD74452D}.Debug|x64.Build.0 = Debug|x64
{89F87459-768F-4638-9267-0F90CD74452D}.Release|x64.ActiveCfg = Release|x64
{89F87459-768F-4638-9267-0F90CD74452D}.Release|x64.Build.0 = Release|x64
{B49C6ABE-931C-4F91-9A94-21A41A305FEE}.Debug|x64.ActiveCfg = Debug|x64
{B49C6ABE-931C-4F91-9A94-21A41A305FEE}.Debug|x64.Build.0 = Debug|x64
{B49C6ABE-931C-4F91-9A94-21A41A305FEE}.Release|x64.ActiveCfg = Release|x64
@@ -65,14 +57,22 @@ Global
{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.Build.0 = Debug|x64
{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.ActiveCfg = Release|x64
{1994C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.Build.0 = Release|x64
{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Debug|x64.ActiveCfg = Debug|x64
{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Debug|x64.Build.0 = Debug|x64
{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Release|x64.ActiveCfg = Release|x64
{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Release|x64.Build.0 = Release|x64
{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.ActiveCfg = Debug|x64
{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.Build.0 = Debug|x64
{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.ActiveCfg = Release|x64
{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.Build.0 = Release|x64
{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Debug|x64.ActiveCfg = Debug|x64
{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Debug|x64.Build.0 = Debug|x64
{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Release|x64.ActiveCfg = Release|x64
{C07E495E-A16F-48FA-80E4-0296B5234F0B}.Release|x64.Build.0 = Release|x64
{3C8071F4-22C8-DA6E-A075-C5EC646DAB7E}.Debug|x64.ActiveCfg = Debug|x64
{3C8071F4-22C8-DA6E-A075-C5EC646DAB7E}.Debug|x64.Build.0 = Debug|x64
{3C8071F4-22C8-DA6E-A075-C5EC646DAB7E}.Release|x64.ActiveCfg = Release|x64
{3C8071F4-22C8-DA6E-A075-C5EC646DAB7E}.Release|x64.Build.0 = Release|x64
{84DBD504-6220-1BCE-A7E4-6799DAF7C5BF}.Debug|x64.ActiveCfg = Debug|x64
{84DBD504-6220-1BCE-A7E4-6799DAF7C5BF}.Debug|x64.Build.0 = Debug|x64
{84DBD504-6220-1BCE-A7E4-6799DAF7C5BF}.Release|x64.ActiveCfg = Release|x64
{84DBD504-6220-1BCE-A7E4-6799DAF7C5BF}.Release|x64.Build.0 = Release|x64
{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.ActiveCfg = Debug|x64
{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}.Debug|x64.Build.0 = Debug|x64
{8544C599-F73B-4EF2-BA3E-2A0FC3034B1A}.Release|x64.ActiveCfg = Release|x64
+2 -1
View File
@@ -16,7 +16,7 @@ Code is licensed under the MIT License.
* Decompress everything into the **root folder** of the game.
* Install the official **"mdata"**.
**M215** to **M270** are supported, custom ones are also supported.
**M215** to **M271** are supported, custom ones are also supported.
To install them you have to drop each **"mdata"** update decompressed into the **"mdata\"** folder in the root folder of the game (create it if it doesn't exists).
@@ -28,6 +28,7 @@ To install them you have to drop each **"mdata"** update decompressed into the *
* M250
* M260
* M270
* M271
Files required to make **"mdata"** available in the game are included (**"ram\databank\PvList*"** files).
Binary file not shown.
@@ -0,0 +1,2 @@
# Sing Missed Notes
140109044:EB
@@ -1,3 +1,5 @@
// Requires Allow_Custom_Freeplay=1
# Enable FREE PLAY
// Just in case it's disabled...
@1403BABEA:75 // ...enable it.
@@ -1,154 +0,0 @@
#########################################
# /!\ WARNING: DO NOT EDIT WITH NOTEPAD!#
#########################################
[Global]
# Load plugins including below options
Enable=1
[GPU]
# Force GPU model -- -1=auto, 0=Kepler, 1=Maxwell, 2=Turing, 3=Ampere
Model=-1
[Launcher]
# Forces the launcher to be skipped, you can use the --launch parameter instead of this.
Skip=0
# Disables unsupported GPU warning dialogs.
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.
Use_divahook_bat=0
[Patches]
#Disable movies (enable this if the game hangs when loading certain PVs)
No_Movies=0
#Enable custom MP4 adv movies (experimental)
MP4_Movies=1
#Enable or disable mouse cursor
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
#Disable the scrolling sound effect
No_Scrolling_SFX=0
#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
#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
Force_Expressions=0
#Change the look animations -- 0=default, 1=force PDA, 2=force FT
Force_Look=0
#Disable hand scaling
No_Hand_Scaling=0
#Default hand size -- -1=default, 12200=PDA
Default_Hand_Size=-1
#Sing missed notes
Sing_Missed=0
#Hide the volume and SE control buttons
Hide_Volume=0
#Remove the photo controls during PV playback
No_PV_UI=0
#Hide the watermark that's usually shown in PV viewing mode
Hide_PV_Watermark=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
No_Lyrics=0
#Disable the error banner
No_Error=1
#Hide "CREDIT(S)"/"FREE PLAY"
Hide_Freeplay=0
#Show "FREE PLAY" instead of "CREDIT(S)" and don't require credits
Freeplay=1
#Show "PD Loader" instead of "FREE PLAY"
PDLoaderText=1
#Freeze the timer
No_Timer=1
#Disable the timer sprite
No_Timer_Sprite=1
#Unlock PSEUDO modules (incomplete, will default to Miku)
Unlock_Pseudo=0
#Enable the card menu (incomplete, it doesn't bypass the card prompt)
Card=0
#Allow using a real arcade slider attached to COM11 (or PS4 official FT controller)
Hardware_Slider=0
#Enable custom patches
Custom_Patches=1
#Prevent data deletion
Prevent_Data_Deletion=0
[Graphics]
# Lag Compensation
Lag_Compensation = 0
# Set to -1 to unlock the frame rate.
FPS.Limit=60
# Reduces FPS Limiter CPU usage
# (may have less consistent performance)
FPS.Limit.LightMode=1
# Enable debug warnings for lightweight limiter
FPS.Limit.Verbose=0
# Temporal Anti-Aliasing
TAA=1
# Morphological Anti-Aliasing
MLAA=1
# MAG Filter -- 0=default (bilinear), 1=nearest-neighbour, 2=sharpen, 3=cone (smooth)
MAG=0
# Depth of Field
DOF=1
# Reflections
Reflections=1
# Shadows
Shadows=1
# Transparent Meshes
Punchthrough=1
# Glare
Glare=1
# Shader
Shader=1
# Toon shader (press F9 to toggle) -- 0=default, 1=force on, 2=force off
NPR1=0
# Disable all 3D passes. WARNING: The extended data will be deleted unless Prevent Data Deletion is enabled.
2D=0
# FrameRateManager motion rate (fps)
FRM.Motion.Rate=400
[Resolution]
# 0 = Windowed, 1 = Fast, 2 = Exclusive, 3 = Safe
# For same as screen res: -1x-1
Display=1
Width=-1
Height=-1
# Fullscreen only options
BitDepth=32
RefreshRate=60
# Set a custom internal render resolution
# Same as window: -1x-1
# HD : 1280x720
# FHD : 1920x1080
# WQHD : 2560x1440
# 4K UHD: 3840x2160
# 5K UHD: 5120x2880
# 8K UHD: 7680x4320
r.Enable=0
r.Width=1920
r.Height=1080
[plugins]
DivaWig.dva=0
DSCRemote.dva=0
custom_freeplay_text_example.p=0
@@ -28,7 +28,7 @@ frame_rate_manager = false
fast_loader = true
# allows for a user controllable camera which can be toggled using F3,
# can be controlled using W/A/S/D to move, SPACE/CTRL to ascend/descend, Q/E to rotate, R/F to zoom in/out
# can be controlled using W/A/S/D to move, SPACE/CTRL to ascend/descend, Q/E to rotate, R/F to zoom in/out
# and holding SHIFT/ALT to speed up or slow down these controls.
camera_controller = false
@@ -48,4 +48,4 @@ target_inspector = true
score_saver = true
# adds a pause menu
pause = true
pause = true
+157
View File
@@ -0,0 +1,157 @@
#########################################
# /!\ WARNING: DO NOT EDIT WITH NOTEPAD!#
#########################################
[Global]
# Load plugins including below options
Enable=1
# Enable built-in patches
Builtin_Patches=1
# Enable custom patches
Custom_Patches=1
# Enable built-in render
Builtin_Render=1
# PC
pc=
[GPU]
# Force GPU model -- -1=auto, 0=Kepler, 1=Maxwell, 2=Turing, 3=Ampere
Model=-1
[Launcher]
# Forces the launcher to be skipped, you can use the --launch parameter instead of this.
Skip=0
# Disables unsupported GPU warning dialogs.
No_GPU_Dialog=0
# Sets the dark colour scheme in the launcher.
Dark_Launcher=0
# Command line arguments
Command_Line=
# Launches divahook.bat intead of diva.exe.
Use_divahook_bat=0
# Language -- 0=auto, 1=en, 2=zh-Hans, 3=pt-BR, 4=it-IT, 5=ja-JP
Launcher_Language=0
[Patches]
# Disable movies (enable this if the game hangs when loading certain PVs)
No_Movies=0
# Enable or disable mouse cursor
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
# Disable the scrolling sound effect
No_Scrolling_SFX=0
# Show "FREE PLAY" instead of "CREDIT(S)" and don't require credits
Freeplay=1
# Sing missed notes
Sing_Missed=0
# Hide the volume and SE control buttons
Hide_Volume=0
# Remove the photo controls during PV playback
No_PV_UI=0
# Hide the watermark that's usually shown in PV viewing mode
Hide_PV_Watermark=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
No_Lyrics=0
# Disable the error banner
No_Error=1
# Hide "CREDIT(S)"/"FREE PLAY"
Hide_Freeplay=0
# Show "PD Loader" instead of "FREE PLAY"
PDLoaderText=1
# Allow plugins and patches to change "FREE PLAY"/"CREDIT(S)"
Allow_Custom_Freeplay=0
# Freeze the timer
No_Timer=1
# Disable the timer sprite
No_Timer_Sprite=1
# Disable Message Bar
No_Message_Bar=0
# Disable Stage Text
No_Stage_Text=0
# Unlock PSEUDO modules (incomplete, will default to Miku)
Unlock_Pseudo=0
# Enable the card menu (incomplete, it doesn't bypass the card prompt)
Card=0
# Disable Extended Data (may break physics in some edits) AKA Skyth's no-opd patch
No_Opd=0
# Scale Debug Windows above HD internal resolution AKA somewhatlurker's dwgui patch
Dwgui_Scaling=0
# Allow using a real arcade slider attached to COM11 (or PS4 official FT controller)
Hardware_Slider=0
# Prevent data deletion
Prevent_Data_Deletion=0
[Graphics]
# Lag Compensation
Lag_Compensation = 0
# Set to -1 to unlock the frame rate.
FPS.Limit=60
# Reduces FPS Limiter CPU usage
# (may have less consistent performance)
FPS.Limit.LightMode=1
# Enable debug warnings for lightweight limiter
FPS.Limit.Verbose=0
# Temporal Anti-Aliasing
TAA=1
# Morphological Anti-Aliasing
MLAA=1
# MAG Filter -- 0=default (bilinear), 1=nearest-neighbour, 2=sharpen, 3=cone (smooth)
MAG=0
# Depth of Field
DOF=1
# Reflections
Reflections=1
Reflect_Res_Width = 512
Reflect_Res_Height = 256
Refract_Res_Width = 512
Refract_Res_Height = 256
# Gamma -- 100=default, 125=console-like
Gamma = 100
# Shadows
Shadows=1
# Transparent Meshes
Punchthrough=1
# Glare
Glare=1
# Shader
Shader=1
# Toon shader (press F9 to toggle) -- 0=default, 1=force on, 2=force off
NPR1=0
# Disable all 3D passes. WARNING: The extended data will be deleted unless Prevent Data Deletion is enabled. Don't enable on Intel GPUs, enable no_opd instead.
2D=0
# FrameRateManager motion rate (fps)
FRM.Motion.Rate=400
[Resolution]
# 0 = Windowed, 1 = Fast, 2 = Exclusive, 3 = Safe
# For same as screen res: -1x-1
Display=1
Width=-1
Height=-1
# Fullscreen only options
BitDepth=32
RefreshRate=60
# Set a custom internal render resolution
# Same as window: -1x-1
# HD : 1280x720
# FHD : 1920x1080
# WQHD : 2560x1440
# 4K UHD: 3840x2160
# 5K UHD: 5120x2880
# 8K UHD: 7680x4320
r.Enable=0
r.Width=-1
r.Height=-1
[Plugins]
Launcher.dva=1
TLAC.dva=1
DivaSound.dva=1
Novidia.dva=1
ShaderPatch.dva=1
@@ -1,8 +1,7 @@
[keyconfig]
#########################################
# /!\ WARNING: DO NOT EDIT WITH NOTEPAD!#
#########################################
[keyconfig]
# keyconfig.ini
# defines the input_emulator key bindings
# multiple keys are to be specified comma separated
@@ -24,21 +23,25 @@ VID = 046D
PID = C216
# Rumble (Xinput)
rumble =true
rumble = true
# Rumble intensity (Xinput)
xinput_rumble_intensity_left = 8000
xinput_rumble_intensity_right = 4000
# Pause when focus is lost
autopause =true
autopause = true
# Allow using slider in menus
# Recommended to enable this and remove MENU_L/R bindings if you have a real slider.
# Also needed to see slider in input test
slider_in_menus =false
slider_in_menus = false
# Use the hardware slider from HORI FT official controller (PS4 version)
# Requires enabling hardware slider support.
# Warning: alpha feature, may not work properly
# Recommended to remove Ds4_L_Stick_* and Ds4_R_Stick_* from button bindings (JVS_LEFT, JVS_RIGHT, MENU_L, MENU_R).
ps4_official_slider =false
ps4_official_slider = false
# JVS Buttons:
JVS_TEST = F1
@@ -59,8 +62,12 @@ 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 = F12
# Touch Slider:
LEFT_SIDE_SLIDE_LEFT = Q, Ds4_L_Stick_Left, XINPUT_LLEFT
LEFT_SIDE_SLIDE_RIGHT = E, Ds4_L_Stick_Right, XINPUT_LRIGHT
@@ -89,8 +96,9 @@ RIGHT_SIDE_SLIDE_RIGHT = O, Ds4_R_Stick_Right, XINPUT_RRIGHT
# - Arrow Keys
# "Up", "Down", "Left", "Right"
# - Special Keys
# - Special Keys (may vary depending on the layout)
# "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"
@@ -147,4 +155,4 @@ RIGHT_SIDE_SLIDE_RIGHT = O, Ds4_R_Stick_Right, XINPUT_RRIGHT
# "GU_L_STICK_UP", "GU_L_STICK_RIGHT", "GU_L_STICK_DOWN", "GU_L_STICK_LEFT"
# - Right Joystick
# "GU_R_STICK_UP", "GU_R_STICK_RIGHT", "GU_R_STICK_DOWN", "GU_R_STICK_LEFT"
# "GU_R_STICK_UP", "GU_R_STICK_RIGHT", "GU_R_STICK_DOWN", "GU_R_STICK_LEFT"
@@ -61,4 +61,4 @@ gamemode_options =true
mylist_A=
mylist_B=
mylist_C=
mylist_C=
@@ -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
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -36,7 +36,7 @@ namespace GPUModel
{
// detected model can be overridden -- 0: Kepler, 1: Maxwell, 2: Turing, 3: Ampere
int nGPUModel = GetPrivateProfileIntW(L"gpu", L"model", -1, CONFIG_FILE);
if (nGPUModel >= 0 && nGPUModel <= 2)
if (nGPUModel >= 0 && nGPUModel <= 3)
{
std::string arch;
switch (nGPUModel)
+15 -4
View File
@@ -63,9 +63,9 @@
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_DEBUG;PDLOADER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>..\dependencies\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\dependencies\freeglut\include;..\..\dependencies\PluginConfigApi;..\..\dependencies\detours\include;..\..\dependencies\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -73,6 +73,7 @@
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>x64.def</ModuleDefinitionFile>
<AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalLibraryDirectories>..\..\dependencies\freeglut\lib;..\..\dependencies\detours\lib</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -86,10 +87,10 @@
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;NDEBUG;PDLOADER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>..\dependencies\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\dependencies\freeglut\include;..\..\dependencies\PluginConfigApi;..\..\dependencies\detours\include;..\..\dependencies\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -99,6 +100,7 @@
<EnableUAC>false</EnableUAC>
<ModuleDefinitionFile>x64.def</ModuleDefinitionFile>
<AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalLibraryDirectories>..\..\dependencies\freeglut\lib;..\..\dependencies\detours\lib</AdditionalLibraryDirectories>
</Link>
<Manifest>
<EnableDpiAwareness>
@@ -109,9 +111,18 @@
<ClInclude Include="exception.hpp" />
<ClInclude Include="framework.h" />
<ClInclude Include="ModuleList.h" />
<ClInclude Include="Patches\PatchApplier.h" />
<ClInclude Include="Patches\PatchApplier710.h" />
<ClInclude Include="Patches\PatchApplier710EX.h" />
<ClInclude Include="Patches\patches-framework.h" />
<ClInclude Include="Patches\patches.h" />
<ClInclude Include="Render\render-framework.h" />
<ClInclude Include="Render\render.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="Patches\patches.cpp" />
<ClCompile Include="Render\render.cpp" />
</ItemGroup>
<ItemGroup>
<None Include="x64.def" />
@@ -24,11 +24,38 @@
<ClInclude Include="exception.hpp">
<Filter>Source Files</Filter>
</ClInclude>
<ClInclude Include="Patches\PatchApplier.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Patches\PatchApplier710.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Patches\patches-framework.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Patches\patches.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Render\render-framework.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Render\render.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Patches\PatchApplier710EX.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Render\render.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Patches\patches.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="x64.def">
@@ -3,5 +3,6 @@
// PatchApplier provides the stuff for implementing patches for the specific game version
class PatchApplier {
public:
virtual void ApplyPatches() {};
virtual void ApplyPatches() = 0;
void ApplyExPatches() {};
};
@@ -0,0 +1,360 @@
#pragma once
#include <vector>
#include "PatchApplier.h"
#include "patches-framework.h"
class PatchApplier710 : public PatchApplier {
virtual void ApplyPatches() {
const struct { void* Address; std::vector<uint8_t> Data; } patches_710[] =
{
// Just completely ignore all SYSTEM_STARTUP errors
{ (void*)0x00000001403F5080, { 0xC3 } },
// Always exit TASK_MODE_APP_ERROR on the first frame
{ (void*)0x00000001403F73A7, { 0x90, 0x90 } },
{ (void*)0x00000001403F73C3, { 0x89, 0xD1, 0x90 } },
// Ignore the EngineClear variable to clear the framebuffer at all resolutions
{ (void*)0x0000000140501480, { 0x90, 0x90 } },
{ (void*)0x0000000140501515, { 0x90, 0x90 } },
// Write ram files to the current directory instead of Y : / SBZV / ram
{ (void*)0x000000014066CF09, { 0xE9, 0xD8, 0x00 } },
// Change mdata path from "C:/Mount/Option" to "mdata/"
{ (void*)0x0000000140A8CA18, { 0x6D, 0x64, 0x61, 0x74, 0x61, 0x2F, 0x00 } },
{ (void*)0x000000014066CEAE, { 0x06 } },
// Skip parts of the network check state
{ (void*)0x00000001406717B1, { 0xE9, 0x22, 0x03, 0x00 } },
// Set the initial DHCP WAIT timer value to 0
{ (void*)0x00000001406724E7, { 0x00, 0x00 } },
// Ignore SYSTEM_STARTUP Location Server checks
{ (void*)0x00000001406732A2, { 0x90, 0x90 } },
// Toon Shader Fix by lybxlpsv
{ (void*)0x000000014050214F, { 0x90 } },
{ (void*)0x0000000140502150, { 0x90 } },
// Toon Shader Outline Fix by lybxlpsv
{ (void*)0x0000000140641102, { 0x01 } },
// Skip unnecessary checks
{ (void*)0x0000000140210820, { 0xB8, 0x00, 0x00, 0x00, 0x00, 0xC3 } },
{ (void*)0x000000014066E820, { 0xB8, 0x01, 0x00, 0x00, 0x00, 0xC3 } },
// Disables call to glutFitWindowSizeToDesktop, prevents window automatic resize
{ (void*)0x0000000140194E06, { 0x90, 0x90, 0x90, 0x90, 0x90 } },
// Allow modifier mode selection (by Team Shimapan)
{ (void*)0x00000001405CB1B3, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },
{ (void*)0x00000001405CA0F5, { 0x90, 0x90 } },
// allow modifier modes to work without use_card
{ (void*)0x00000001405CB14A,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },
{ (void*)0x0000000140136CFA,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },
// enable module selector without use_card
{ (void*)0x00000001405C513B,{ 0x01 } },
// fix back button
{ (void*)0x0000000140578FB8, { 0xE9, 0x73, 0xFF, 0xFF, 0xFF } },
// Force Hide IDs
{ (void*)0x00000001409A5918, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
{ (void*)0x00000001409A5928, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
// fix TouchReaction
// get some more space by optimizing this code for size
{ (void*)0x00000001406A1FE2,{ 0x7E } }, // MOVQ XMM0,qword ptr [0x168 + RSP] (change to MOVQ)
{ (void*)0x00000001406A1FE9,{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x6C } }, // MOVQ qword ptr [RSP + 0x6c],XMM0
{ (void*)0x00000001406A1FEF,{ 0xC7, 0x44, 0x24, 0x74, 0x00, 0x00, 0x00, 0x00 } }, // MOV dword ptr [RSP + 0x74],0x0
{ (void*)0x00000001406A1FF7,{ 0xEB, 0x0E } }, // JMP 0x1406a2007 (to rest of function as usual)
// add new code
{ (void*)0x00000001406A1FF9,{ 0x66, 0x48, 0x0F, 0x6E, 0xC2 } }, // MOVQ XMM0,RDX (load touch pos)
{ (void*)0x00000001406A1FFE,{ 0xEB, 0x5D } }, // JMP 0x1406a205d
{ (void*)0x00000001406A205D,{ 0x0F, 0x2A, 0x0D, 0xB8, 0x6A, 0x31, 0x00 } }, // CVTPI2PS XMM1,qword ptr [0x1409b8b1c] (load 1280x720)
{ (void*)0x00000001406A2064,{ 0x0F, 0x12, 0x51, 0x1C } }, // MOVLPS XMM2,qword ptr [RCX + 0x1c] (load actual res)
{ (void*)0x00000001406A2068,{ 0xE9, 0x14, 0xFF, 0xFF, 0xFF } }, // JMP 0x1406a1f81
{ (void*)0x00000001406A1F81,{ 0x0F, 0x59, 0xC1 } }, // MULPS XMM0,XMM1
{ (void*)0x00000001406A1F84,{ 0x0F, 0x5E, 0xC2 } }, // DIVPS XMM0,XMM2
{ (void*)0x00000001406A1F87,{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x10 } }, // MOVQ qword ptr [RSP+0x10],XMM0
{ (void*)0x00000001406A1F8D,{ 0xEB, 0x06 } }, // JMP 0x1406a1f95 (back to original function)
// jmp to new code
{ (void*)0x00000001406A1F90,{ 0xEB, 0x67 } }, // JMP 0x1406a1ff9
};
for (size_t i = 0; i < _countof(patches_710); i++)
InjectCode(patches_710[i].Address, patches_710[i].Data);
/////////////////////
////// Options //////
/////////////////////
//// Graphics
// Disable AA
if (!nTAA)
{
// set TAA var (shouldn't be needed but whatever)
*(byte*)0x00000001411AB67C = 0;
// make constructor/init not set TAA
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x00000001404AB11D, 3, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x00000001404AB11D + 0) = 0x90;
*((byte*)0x00000001404AB11D + 1) = 0x90;
*((byte*)0x00000001404AB11D + 2) = 0x90;
VirtualProtect((BYTE*)0x00000001404AB11D, 3, oldProtect, &bck); }
// not sure, but it's somewhere in TaskPvGame init
// just make it set TAA to 0 instead of 1 to avoid possible issues
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x00000001401063CE, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x00000001401063CE + 0) = 0x00;
VirtualProtect((BYTE*)0x00000001401063CE, 1, oldProtect, &bck); }
// prevent re-enabling after taking photos
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x000000014048FBA9, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x000000014048FBA9 + 0) = 0x00;
VirtualProtect((BYTE*)0x000000014048FBA9, 1, oldProtect, &bck); }
printf("[Patches] TAA disabled\n");
}
if (!nMLAA)
{
// set MLAA var (shouldn't be needed but whatever)
*(byte*)0x00000001411AB680 = 0;
// make constructor/init not set MLAA
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x00000001404AB11A, 3, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x00000001404AB11A + 0) = 0x90;
*((byte*)0x00000001404AB11A + 1) = 0x90;
*((byte*)0x00000001404AB11A + 2) = 0x90;
VirtualProtect((BYTE*)0x00000001404AB11A, 3, oldProtect, &bck); }
printf("[Patches] MLAA disabled\n");
}
// lag compensation
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 / 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);
}
//// Compatibility
// Skip loading (and therefore displaying) song movies
if (nNoMovies)
{
InjectCode((void*)0x00000001404EB584, { 0x48, 0xE9 });
InjectCode((void*)0x00000001404EB471, { 0x48, 0xE9 });
printf("[Patches] Movies disabled\n");
}
// The old stereo patch...
// Use 2 channels instead of 4
if (nStereo)
{
InjectCode((void*)0x0000000140A860C0, { 0x02 });
printf("[Patches] Stereo patch 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 });
}*/
//// PV Selector
// Enable "FREE PLAY" mode
if (nFreeplay || nHideFreeplay)
{
// Always return true for the SelCredit enter SelPv check
InjectCode((void*)0x0000000140393610, { 0xB0, 0x01, 0xC3, 0x90, 0x90, 0x90 });
InjectCode((void*)0x00000001403BABEA, { 0x75 });
printf("[Patches] Show FREE PLAY instead of CREDIT(S)\n");
}
//// UI Elements
// Use GLUT_CURSOR_RIGHT_ARROW instead of GLUT_CURSOR_NONE
if (nCursor)
{
InjectCode((void*)0x000000014019341B, { 0x00 });
InjectCode((void*)0x00000001403012b5, { 0xeb }); // Disable debug cursor
printf("[Patches] Cursor enabled\n");
}
// Don't show volume control
if (nHideVolCtrl)
{
// skip SE button
InjectCode((void*)0x00000001409A4D60, { 0xC0, 0xD3 });
// skip volume sliders button
InjectCode((void*)0x0000000140A85F10, { 0xE0, 0x50 });
printf("[Patches] Volume control hidden\n");
}
// Disable the PV screen photo UI
if (nNoPVUi)
{
InjectCode((void*)0x000000014048FA91, { 0xEB, 0x6F }); // skip button panel image (JMP 0x14048FB02)
// patch minimum PV UI state to 1 instead of 0
// hook check for lyrics enabled (UI state < 2) to change UI state 0 into 1
// dump new code in the skipped button panel condition
InjectCode((void*)0x000000014048FA93, { 0xC7, 0x83, 0x58, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }); // MOV dword ptr [0x158 + RBX],0x1
InjectCode((void*)0x000000014048FA9D, { 0xC6, 0x80, 0x3A, 0xD1, 0x02, 0x00, 0x01 }); // MOV byte ptr [0x2d13a + RAX],0x1
InjectCode((void*)0x000000014048FAA4, { 0xE9, 0x8B, 0xFB, 0xFF, 0xFF }); // JMP 0x14048F634
InjectCode((void*)0x000000014048F62D, { 0xE9, 0x61, 0x04, 0x00, 0x00 }); // JMP 0x14048FA93
printf("[Patches] PV UI disabled\n");
}
// Removes PV watermark
if (nHidePVWatermark)
{
InjectCode((void*)0x0000000140A13A88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
printf("[Patches] PV watermark hidden\n");
}
// Override status icon states to be invalid (hides them)
if (nStatusIcons > 0)
{
std::vector<uint8_t> cardIcon = { 0xFD, 0x0A };
std::vector<uint8_t> networkIcon = { 0x9E, 0x1E };
if (nStatusIcons == 2) // 2 for error icons
{
cardIcon = { 0xFA, 0x0A };
networkIcon = { 0x9F, 0x1E };
printf("[Patches] Status icons set to error state\n");
}
else if (nStatusIcons == 3) // 3 for OK icons
{
cardIcon = { 0xFC, 0x0A };
networkIcon = { 0xA0, 0x1E };
printf("[Patches] Status icons set to OK state\n");
}
else if (nStatusIcons == 4) // 4 for partial OK icons
{
cardIcon = { 0xFB, 0x0A };
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
InjectCode((void*)0x00000001403B9D73, cardIcon); // OK state
// network icon
InjectCode((void*)0x00000001403BA14B, networkIcon); // error state
InjectCode((void*)0x00000001403BA155, networkIcon); // OK state
InjectCode((void*)0x00000001403BA16B, networkIcon); // partial state
InjectCode((void*)0x00000001403BA1A5, { 0x48, 0xE9 }); // never show the error code for partial connection
// I was going to use this with a string, but the assignment wasn't behaving well and making separate prints was easier than figuring it out
// printf("[Patches] Status icons %s\n", iconType);
}
// Hide "FREE PLAY"
if (nHideFreeplay)
{
InjectCode((void*)0x00000001403BABEF, { 0x06, 0xB6 });
printf("[Patches] Hide FREE PLAY/CREDIT(S) enabled\n");
}
// Skip loading (and therefore displaying) song lyrics
if (nNoLyrics)
{
InjectCode((void*)0x00000001404E7A25, { 0x00, 0x00 });
InjectCode((void*)0x00000001404E7950, { 0x48, 0xE9 }); // ensure first iteration doesn't run
printf("[Patches] Lyrics disabled\n");
}
// Disable error banner
if (nNoError)
{
// Disable Errors Banner
InjectCode((void*)0x00000001403B9E9B, { 0x90, 0x90 });
printf("[Patches] Errors Banner disabled\n");
}
// Disable timer
if (nNoTimer)
{
// Freeze mode selection timer
InjectCode((void*)0x0000000140566B9E, { 0x90, 0x90, 0x90 });
// Freeze PV selection timer
InjectCode((void*)0x00000001405BDFBF, { 0x90, 0x90, 0x90, 0x90 });
}
// The original slider update needs to run for hardware sliders to work -- only patch it when using emulation
if (!nHardwareSlider)
{
// Don't update the touch slider state so we can write our own
InjectCode((void*)0x000000014061579B, { 0x90, 0x90, 0x90, 0x8B, 0x42, 0xE0, 0x90, 0x90, 0x90 });
}
// debug scaling by somewhatlurker
if (nDwguiScaling)
{
InjectCode((void*)(0x1402ffccf), { 0x0d, 0x00, 0x00, 0x00 }); // 720p res index
InjectCode((void*)(0x1403025f2), { 0x48, 0x8d, 0x05, 0x17, 0x65, 0x6b, 0x00 }); // LEA RAX, [0x1409b8b10] (720p res info at +0xc, +-x10)
InjectCode((void*)(0x1403025f9), { 0xeb, 0xb3 }); // JMP 0x1403025ae
InjectCode((void*)(0x1403025a9), { 0xeb, 0x47 }); // JMP 0x1403025f2
// hacky fix for mouse input scaling
// someone please fix this properly if possible
// directly load mouse coordinates to xmm0 to save code space
InjectCode((void*)(0x140300a62), { 0x0f, 0x2a, 0x86, 0xa0, 0x00, 0x00, 0x00 }); // CVTPI2PS XMM0, qword ptr[RSI + 0xa0]
// load 720p
InjectCode((void*)(0x140300a69), { 0x0f, 0x2a, 0x0d, 0xac, 0x80, 0x6b, 0x00 }); // CVTPI2PS XMM1, qword ptr [0x1409b8b1c]
// load native res (140eda8b0 is the native res version of the above 720p res info)
InjectCode((void*)(0x140300a70), { 0x0f, 0x2a, 0x15, 0x45, 0x9e, 0xbd, 0x00 }); // CVTPI2PS XMM2, qword ptr [0x140eda8bc]
// math
InjectCode((void*)(0x140300a77), { 0x0f, 0x59, 0xc1 }); // MULPS XMM0, XMM1
InjectCode((void*)(0x140300a7a), { 0x0f, 0x5e, 0xc2 }); // DIVPS XMM0, XMM2
// used this space, go elsewhere
InjectCode((void*)(0x140300a7d), { 0xe9, 0x83, 0x06, 0x00, 0x00 }); // JMP 0x140301105
// need to restore this instruction
InjectCode((void*)(0x140301105), { 0x0f, 0x57, 0xe4 }); // XORPS XMM4, XMM4
// need to unpack XMM0 into XMM1 and XMM0
InjectCode((void*)(0x140301108), { 0xf3, 0x0f, 0x10, 0xc8 }); // MOVSS XMM1, XMM0
// move to new space
InjectCode((void*)(0x14030110c), { 0xeb, 0x07 }); // JMP 0x140301115
// copy high float of xmm0 to low float of xmm0
InjectCode((void*)(0x140301115), { 0x0f, 0xc6, 0xc0, 0x55 }); // SHUFPS XMM0, XMM0, 0x55
// finally back to original code
InjectCode((void*)(0x140301119), { 0xe9, 0x64, 0xf9, 0xff, 0xff }); // JMP 0x140300a82
// don't need these anymore
InjectCode((void*)(0x140300a82), { 0x90, 0x90, 0x90 }); // NOPs
InjectCode((void*)(0x140300a88), { 0x90, 0x90, 0x90 }); // NOPs
}
ApplyExPatches();
}
#include "PatchApplier710EX.h"
};
@@ -0,0 +1,303 @@
#pragma once
void ApplyExPatches() {
//// Graphics
// MAG filter
if (nMAG > 0)
{
//InjectCode((void*)0x00000001404AB142, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
unsigned char filter;
switch (nMAG)
{
case 1: // nearest
filter = 0;
InjectCode((void*)0x00000001404ACE56, { 0x90, 0x90 });
break;
case 2: // sharpen
filter = 3; // sharpen(4tap)
break;
case 3: // cone
filter = 5; // cone(2tap)
break;
default:
filter = 1;
}
//InjectCode((void*)0x00000001404A864F, { filter });
//InjectCode((void*)0x00000001411AC518, { filter });
InjectCode((void*)0x00000001404ACE8E, { 0xB9, filter, 0x00, 0x00 });
InjectCode((void*)0x00000001404ACE93, { 0x90 });
}
// Depth of Field
if (!nDoF)
{
InjectCode((void*)0x00000001409476AB, { 0x90, 0x90, 0x90, 0x90, 0x90 });
InjectCode((void*)0x00000001411AB650, { 0b00000001 });
}
// Reflections
if (!nReflections)
{
InjectCode((void*)0x1406477C0, { 0xE9, 0xF3, 0x00, 0x00, 0x00, 0x90 });
InjectCode((void*)0x1411ADAFC, { 0x00 });
}
// patch refract and reflect buffer sizes
{
// no need to really check anything before injecting, because reinjecting defaults is fine
InjectCode((void*)(0x140a24424), std::vector<uint8_t>((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)));
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
// scaling is based on a 1024 width instead of the original 512px
// because we don't wanna make it too blurry when just being used to smooth jaggies
if (nReflectResWidth >= 2048)
{
int blurAmount = nReflectResWidth / 1024;
// multiply blur setting
// ECX has blur amount, EDX has blur type
InjectCode((void*)(0x140503000), { 0x89, 0x15, 0x3a, 0xa3, 0xca, 0x00 }); // MOV dword ptr [0x1411ad340], EDX
InjectCode((void*)(0x140503006), { 0xb8 }); // MOV EAX, blurAmount
InjectCode((void*)(0x140503007), std::vector<uint8_t>((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4)));
InjectCode((void*)(0x14050300b), { 0xf7, 0xe1 }); // MUL (EDX:EAX,)ECX
InjectCode((void*)(0x14050300d), { 0xeb, 0x09 }); // JMP 0x140503018
InjectCode((void*)(0x140503018), { 0x89, 0x05, 0x1e, 0xa3, 0xca, 0x00 }); // MOV dword ptr [0x1411ad33c], EAX
InjectCode((void*)(0x14050301e), { 0xc3 }); // RET
// divide dwgui blur amount getting
// RDX gets type, RCX gets amount
InjectCode((void*)(0x140502910), { 0x48, 0x85, 0xd2 }); // TEST RDX, RDX
InjectCode((void*)(0x140502913), { 0x74, 0x08 }); // JZ 0x14050291d
InjectCode((void*)(0x140502915), { 0x8b, 0x05, 0x25, 0xaa, 0xca, 0x00 }); // MOV EAX, dword ptr [0x1411ad340]
InjectCode((void*)(0x14050291b), { 0x89, 0x02 }); // MOV dword ptr [RDX], EAX
InjectCode((void*)(0x14050291d), { 0x48, 0x85, 0xc9 }); // TEST RCX, RCX
InjectCode((void*)(0x140502920), { 0x74, 0x2d }); // JZ 0x14050294f
InjectCode((void*)(0x140502922), { 0x8b, 0x05, 0x14, 0xaa, 0xca, 0x00 }); // MOV EAX, dword ptr [0x1411ad33c]
InjectCode((void*)(0x140502928), { 0xeb, 0x0d }); // JMP 0x140502937
InjectCode((void*)(0x140502937), { 0x49, 0xc7, 0xc0 }); // MOV R8, blurAmount
InjectCode((void*)(0x14050293a), std::vector<uint8_t>((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4)));
InjectCode((void*)(0x14050293e), { 0xeb, 0x08 }); // JMP 0x140502948
InjectCode((void*)(0x140502948), { 0x31, 0xd2 }); // XOR EDX,EDX
InjectCode((void*)(0x14050294a), { 0x49, 0xf7, 0xf0 }); // DIV (EDX:EAX,)R8
InjectCode((void*)(0x14050294d), { 0x89, 0x01 }); // MOV dword ptr [RCX], EAX
InjectCode((void*)(0x14050294f), { 0xc3 }); // RET
}
}
// gamma
if (nGamma != 100)
{
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);
}
// Shadows
if (!nShadows)
{
//InjectCode((void*)0x140502B44, { 0x90, 0x90, 0x90 });
//InjectCode((void*)0x140502BB2, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
InjectCode((void*)0x140502766, { 0x00 });
InjectCode((void*)0x1411AD438, { 0x00 });
InjectCode((void*)0x1411AD320, { 0x00 });
}
// Punch-through transparency
if (!nPunchthrough)
{
InjectCode((void*)0x1411AD43D, { 0x00 });
}
// Glare
if (!nGlare)
{
InjectCode((void*)0x1404B2168, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
}
// Shader
if (!nShader)
{
InjectCode((void*)0x140C9C48E, { 0x00 });
}
// NPR1
{
if (nNpr1 == 1) // force on
{
InjectCode((void*)0x0000000140502FC0, { 0xC7, 0x05, 0x6E });
InjectCode((void*)0x0000000140502FC6, { 0x01, 0x00, 0x00, 0x00, 0xC3 });
printf("[Patches] NPR1 forced\n");
}
else if (nNpr1 == 2) // force off
{
InjectCode((void*)0x0000000140502FC0, { 0xC7, 0x05, 0x6E });
InjectCode((void*)0x0000000140502FC6, { 0x00, 0x00, 0x00, 0x00, 0xC3 });
printf("[Patches] NPR1 disabled\n");
}
}
// 2D
if (n2D)
{
//InjectCode((void*)0x140502B44, { 0x90, 0x90, 0x90 });
InjectCode((void*)0x140502BB2, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
InjectCode((void*)0x140502A3C, { 0x90, 0x90, 0x90, 0x90, 0x90 });
/*InjectCode((void*)0x1411AD320, { 0x00 }); // shadow
InjectCode((void*)0x1411AD323, { 0x00 }); // reflect
InjectCode((void*)0x1411AD321, { 0x00 }); // SS_SSS
InjectCode((void*)0x1411AD325, { 0x00 }); // preprocess
InjectCode((void*)0x1411AD328, { 0x00 }); // 3D*/
InjectCode((void*)0x1411AD32A, { 0x01 }); // post process
InjectCode((void*)0x1411AD32B, { 0x01 }); // sprite
InjectCode((void*)0x140A07920, { 0x00 }); // ignore objset
}
//// Compatibility
// 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 });
}
// no osage play data by Skyth
if (nNoOpd)
{
InjectCode((void*)(0x1404728C0), { 0xC3 });
InjectCode((void*)(0x1404789C3), { 0x0D });
}
//// PV Selector
// Unlock PSEUDO modules (which will all default to Miku, unless we also patch them to match the first performer)
if (nUnlockPseudo)
{
InjectCode((void*)0x0000000140A21770, { 0x00 });
InjectCode((void*)0x0000000140A21780, { 0x00 });
InjectCode((void*)0x0000000140A21790, { 0x00 });
InjectCode((void*)0x0000000140A217A0, { 0x00 });
InjectCode((void*)0x0000000140A217B0, { 0x00 });
}
// Disable scrolling sound effect
if (nNoScrollingSfx)
{
InjectCode((void*)0x00000001405C84B3, { 0x90, 0x90, 0x90, 0x90, 0x90 });
}
//// UI Elements
// Disable timer sprite
if (nNoTimerSprite)
{
InjectCode((void*)0x00000001409C0758, { 0x00 }); // time_loop
InjectCode((void*)0x0000000140A3D3F0, { 0x00 }); // time_in
InjectCode((void*)0x0000000140A3D3F8, { 0x00 }); // time_out
}
// no message bar
if (nNoMessageBar)
{
InjectCode((void*)(0x1409F6470), { 0x00 });
// no scrolling message by snakemi
InjectCode((void*)(0x1403B98FD), { 0x00, 0x00, 0x00, 0x00 });
InjectCode((void*)(0x1403B9904), { 0x00, 0x00, 0x00, 0x00 });
InjectCode((void*)(0x1403B990B), { 0x00, 0x00, 0x00, 0x00 });
}
// no stage text
if (nNoStageText)
{
InjectCode((void*)(0x140A3D4C8), { 0x00 });
InjectCode((void*)(0x140A3D4D8), { 0x00 });
InjectCode((void*)(0x140A3D4E8), { 0x00 });
InjectCode((void*)(0x140A3D4F8), { 0x00 });
InjectCode((void*)(0x140A3D508), { 0x00 });
InjectCode((void*)(0x140A3D518), { 0x00 });
InjectCode((void*)(0x140A3D530), { 0x00 });
InjectCode((void*)(0x140A3D540), { 0x00 });
InjectCode((void*)(0x140A3D550), { 0x00 });
}
// Enable card button by somewhatlurker (pretty much just eye candy for now)
if (nCard)
{
InjectCode((void*)0x0000000140565E6B, { 0x90, 0x90 });
}
// Quick start
{
if (nQuickStart == 1) // skip the card/guest screen
{
InjectCode((void*)0x0000000140578EA9, { 0xE9, 0x8E, 0x00, 0x00, 0x00 });
}
else if (nQuickStart == 2) // skip everything; normal mode
{
InjectCode((void*)0x0000000140578EA9, { 0xE9, 0xF1, 0x00, 0x00, 0x00 });
InjectCode((void*)0x0000000140578E9D, { 0xC7, 0x47, 0x68, 0x28, 0x00, 0x00, 0x00 }); // skip back button error
}
}
}
@@ -47,75 +47,75 @@ void InjectCode(void* address, const std::vector<uint8_t> data)
VirtualProtect(address, byteCount, 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)
void InjectInt(void* address, const int data)
{
bool isinmdata = 0;
try {
for (std::filesystem::path p : std::filesystem::directory_iterator("../mdata"))
{
if (std::filesystem::path(p).filename().string().at(0) != 'M' || std::filesystem::path(p).filename().string().length() > 4) continue;
if (std::filesystem::exists(p.string() + "/rom/movie/" + moviefile + ".mp4"))
{
isinmdata = 1;
//std::cout << "[Patches] Movie " << moviefile << ".mp4 found in M" << ss.str() << std::endl;
break;
}
}
}
catch (const std::filesystem::filesystem_error& e) {
std::cout << "[Patches] File system error " << e.what() << " " << e.path1() << " " << e.path2() << " " << e.code() << std::endl;
}
const size_t byteCount = sizeof(int);
if (isinmdata || std::filesystem::exists("../rom/movie/" + moviefile + ".mp4"))
{
InjectCode(address, { 0x6D, 0x70, 0x34 });
std::cout << "[Patches] Movie " << moviefile << " patched to mp4\n";
return;
}
//std::cout << "[Patches] Movie " << moviefile << " NOT patched to mp4\n";
return;
DWORD oldProtect;
VirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);
*(int*)address = data;
VirtualProtect(address, byteCount, oldProtect, nullptr);
}
const LPCWSTR CONFIG_FILE = L".\\config.ini";
void InjectLong(void* address, const long data)
{
const size_t byteCount = sizeof(long);
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 nStatusIcons = GetPrivateProfileIntW(L"patches", L"status_icons", 0, CONFIG_FILE);
auto nHidePVWatermark = GetPrivateProfileIntW(L"patches", L"hide_pv_watermark", FALSE, CONFIG_FILE);
auto nNoPVUi = GetPrivateProfileIntW(L"patches", L"no_pv_ui", FALSE, CONFIG_FILE);
auto nHideVolCtrl = GetPrivateProfileIntW(L"patches", L"hide_volume", FALSE, CONFIG_FILE);
auto nNoLyrics = GetPrivateProfileIntW(L"patches", L"no_lyrics", FALSE, CONFIG_FILE);
auto nNoMovies = GetPrivateProfileIntW(L"patches", L"no_movies", FALSE, CONFIG_FILE);
auto nMP4Movies = GetPrivateProfileIntW(L"patches", L"mp4_movies", FALSE, CONFIG_FILE);
auto nNoError = GetPrivateProfileIntW(L"patches", L"no_error", FALSE, CONFIG_FILE);
auto nNoTimer = GetPrivateProfileIntW(L"patches", L"no_timer", TRUE, CONFIG_FILE);
auto nNoTimerSprite = GetPrivateProfileIntW(L"patches", L"no_timer_sprite", 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);
DWORD oldProtect;
VirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);
*(long*)address = data;
VirtualProtect(address, byteCount, oldProtect, nullptr);
}
const LPCWSTR CONFIG_FILE = L"plugins_config\\config.ini";
const LPCWSTR CONFIG_FILE_NAME = L".\\config.ini";
/////////////////////
////// Options //////
/////////////////////
// Graphics
auto nTAA = GetPrivateProfileIntW(L"graphics", L"taa", TRUE, CONFIG_FILE);
auto nMLAA = GetPrivateProfileIntW(L"graphics", L"mlaa", TRUE, CONFIG_FILE);
auto nLagCompensation = GetPrivateProfileIntW(L"graphics", L"lag_compensation", 0, CONFIG_FILE);
// Loader
auto nBuiltinPatches = GetPrivateProfileIntW(L"global", L"builtin_patches", TRUE, CONFIG_FILE);
auto nCustomPatches = GetPrivateProfileIntW(L"global", L"custom_patches", TRUE, CONFIG_FILE);
// Compatibility
auto nNoMovies = GetPrivateProfileIntW(L"patches", L"no_movies", FALSE, CONFIG_FILE);
auto nStereo = GetPrivateProfileIntW(L"patches", L"stereo", TRUE, CONFIG_FILE);
// PV Selector
auto nFreeplay = GetPrivateProfileIntW(L"patches", L"freeplay", TRUE, CONFIG_FILE);
// UI Elements
auto nCursor = GetPrivateProfileIntW(L"patches", L"cursor", TRUE, CONFIG_FILE);
auto nHideVolCtrl = GetPrivateProfileIntW(L"patches", L"hide_volume", FALSE, CONFIG_FILE);
auto nNoPVUi = GetPrivateProfileIntW(L"patches", L"no_pv_ui", FALSE, CONFIG_FILE);
auto nHidePVWatermark = GetPrivateProfileIntW(L"patches", L"hide_pv_watermark", FALSE, CONFIG_FILE);
auto nStatusIcons = GetPrivateProfileIntW(L"patches", L"status_icons", 0, CONFIG_FILE);
auto nHideFreeplay = GetPrivateProfileIntW(L"patches", L"hide_freeplay", FALSE, CONFIG_FILE);
auto nNoLyrics = GetPrivateProfileIntW(L"patches", L"no_lyrics", FALSE, CONFIG_FILE);
auto nNoError = GetPrivateProfileIntW(L"patches", L"no_error", FALSE, CONFIG_FILE);
auto nPDLoaderText = GetPrivateProfileIntW(L"patches", L"pdloadertext", TRUE, CONFIG_FILE);
auto nNoTimer = GetPrivateProfileIntW(L"patches", L"no_timer", TRUE, CONFIG_FILE);
auto nHardwareSlider = GetPrivateProfileIntW(L"patches", L"hardware_slider", FALSE, CONFIG_FILE);
auto nDwguiScaling = GetPrivateProfileIntW(L"patches", L"dwgui_scaling", FALSE, CONFIG_FILE);
// Non-essential
auto nNoTimerSprite = GetPrivateProfileIntW(L"patches", L"no_timer_sprite", 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 nDoF = GetPrivateProfileIntW(L"graphics", L"dof", TRUE, CONFIG_FILE);
auto nMAG = GetPrivateProfileIntW(L"graphics", L"mag", 0, 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 nNoScrollingSfx = GetPrivateProfileIntW(L"patches", L"no_scrolling_sfx", 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 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);
auto nForceLook = GetPrivateProfileIntW(L"patches", L"force_look", 0, CONFIG_FILE);
auto nNpr1 = GetPrivateProfileIntW(L"graphics", L"npr1", 0, CONFIG_FILE);
auto nReflections = GetPrivateProfileIntW(L"graphics", L"reflections", TRUE, CONFIG_FILE);
auto nGamma = GetPrivateProfileIntW(L"graphics", L"gamma", 100, CONFIG_FILE);
auto nShadows = GetPrivateProfileIntW(L"graphics", L"shadows", TRUE, CONFIG_FILE);
auto nPunchthrough = GetPrivateProfileIntW(L"graphics", L"punchthrough", TRUE, CONFIG_FILE);
auto nGlare = GetPrivateProfileIntW(L"graphics", L"glare", TRUE, CONFIG_FILE);
@@ -126,4 +126,6 @@ auto nReflectResWidth = GetPrivateProfileIntW(L"graphics", L"reflect_res_width",
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 nLagCompensation = GetPrivateProfileIntW(L"graphics", L"lag_compensation", 0, CONFIG_FILE);
auto nNoMessageBar = GetPrivateProfileIntW(L"patches", L"no_message_bar", FALSE, CONFIG_FILE);
auto nNoStageText = GetPrivateProfileIntW(L"patches", L"no_stage_text", FALSE, CONFIG_FILE);
auto nNoOpd = GetPrivateProfileIntW(L"patches", L"no_opd", FALSE, CONFIG_FILE);
@@ -7,24 +7,18 @@
#include <filesystem>
#include <sstream>
#include <iomanip>
#include "PluginConfigApi.h"
#include "patches.h"
//#include "PluginConfigApi.h"
#include "PatchApplier.h"
#include "PatchApplier600.h"
#include "PatchApplier710.h"
#include <detours.h>
#include "framework.h"
#include "patches-framework.h"
#pragma comment(lib, "detours.lib")
unsigned short game_version = 710;
extern unsigned short game_version;
void InjectCode(void* address, const std::vector<uint8_t> data);
void ApplyPatches();
void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING);
HMODULE *hModulePtr;
/*HMODULE* hModulePtr;
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
@@ -35,7 +29,6 @@ BOOL APIENTRY DllMain(HMODULE hModule,
{
case DLL_PROCESS_ATTACH:
hModulePtr = &hModule;
if (*(char*)0x140A570F0 == '6') game_version = 600;
ApplyPatches();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
@@ -43,43 +36,49 @@ BOOL APIENTRY DllMain(HMODULE hModule,
break;
}
return TRUE;
}
}*/
void ApplyPatches() {
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;
PatchApplier* pa;
switch (game_version)
if (nBuiltinPatches)
{
case 600:
pa = new PatchApplier600;
break;
default:
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);
}
PatchApplier* pa;
pa = new PatchApplier710;
pa->ApplyPatches();
printf("[Patches] Patches applied\n");
}
}
pa->ApplyPatches();
printf("[Patches] Patches applied\n");
void ApplyAllCustomPatches()
{
if (nCustomPatches)
{
std::cout << "[Patches] Reading custom patches...\n";
std::cout << "[Patches] Reading custom patches in " << std::filesystem::current_path().string() << "\\patches" << std::endl;
try {
for (std::filesystem::path p : std::filesystem::directory_iterator("../patches"))
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))
if ((extension == ".p" || extension == ".P" || extension == ".p2" || extension == ".P2"))
{
std::cout << "[Patches] Reading custom patch file: " << std::filesystem::path(p).filename().string() << std::endl;
ApplyCustomPatches(std::filesystem::path(p).wstring());
if (GetPrivateProfileIntW(L"plugins", std::filesystem::path(p).filename().c_str(), FALSE, CONFIG_FILE))
{
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) {
catch (const std::filesystem::filesystem_error& e) {
std::cout << "[Patches] File system error " << e.what() << " " << e.path1() << " " << e.path2() << " " << e.code() << std::endl;
}
@@ -87,8 +86,6 @@ void ApplyPatches() {
}
}
void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING)
{
LPCWSTR CPATCH_FILE = CPATCH_FILE_STRING.c_str();
@@ -241,8 +238,19 @@ void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING)
fileStream.close();
}
void ApplyVerText()
{
if (nFreeplay && !nHideFreeplay && nPDLoaderText)
{
InjectCode((void*)0x00000001409F61F0, { 0x50, 0x44, 0x20 });
InjectCode((void*)0x00000001409F61F3, { 0x4C, 0x6F, 0x61 });
InjectCode((void*)0x00000001409F61F6, { 0x64, 0x65, 0x72 });
InjectCode((void*)0x00000001409F61F9, { 0x20, 0x00 });
printf("[Patches] Show PD Loader text\n");
}
}
using namespace PluginConfig;
/*using namespace PluginConfig;
extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
{
@@ -252,4 +260,4 @@ extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
extern "C" __declspec(dllexport) LPCWSTR GetPluginDescription(void)
{
return L"Applies patches/tweaks to the game before it starts.\nThis plugin is required.";
}
}*/
@@ -0,0 +1,6 @@
#pragma once
void InjectCode(void* address, const std::vector<uint8_t> data);
void ApplyPatches();
void ApplyAllCustomPatches();
void ApplyCustomPatches(std::wstring CPATCH_FILE_STRING);
void ApplyVerText();
@@ -29,7 +29,7 @@ wstring DirPath() {
return wstring(buffer).substr(0, pos);
}
wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\config.ini";
wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\config.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
int nDisplay = GetPrivateProfileIntW(L"resolution", L"display", 0, CONFIG_FILE);
@@ -47,6 +47,8 @@ int nFpsLimit = GetPrivateProfileIntW(L"graphics", L"fps.limit", 60, CONFIG_FILE
int nUseLightLimiter = GetPrivateProfileIntW(L"graphics", L"fps.limit.lightmode", TRUE, CONFIG_FILE);
int nVerboseLimiter = GetPrivateProfileIntW(L"graphics", L"fps.limit.verbose", FALSE, CONFIG_FILE);
int nBuiltinRender = GetPrivateProfileIntW(L"global", L"builtin_render", TRUE, CONFIG_FILE);
// used to trick Optimus into switching to the NVIDIA GPU
HMODULE nvcudaModule = LoadLibraryW(L"nvcuda.dll");
// cuInit actually returns a CUresult, but we don't really care about it
@@ -1,4 +1,5 @@
#include "framework.h"
#include "render-framework.h"
#include "render.h"
#include <detours.h>
#pragma comment(lib, "detours.lib")
#include <GL\freeglut.h>
@@ -11,22 +12,13 @@
#include <chrono>
#include "PluginConfigApi.h"
//#include "PluginConfigApi.h"
using namespace std::chrono;
unsigned short game_version = 710;
void exitGameClean(int)
{
switch (game_version)
{
case 600:
*(bool*)0x0000000140E8DF20 = true; // 6.00
break;
default:
*(bool*)0x0000000140EDA6B0 = true; // 7.10
}
*(bool*)0x0000000140EDA6B0 = true; // 7.10
}
int hookedCreateWindow(const char* title, void(__cdecl* exit_function)(int))
@@ -52,27 +44,13 @@ int hookedCreateWindow(const char* title, void(__cdecl* exit_function)(int))
printf("[Render Manager] Requested display mode not supported. Using non-exclusive fullscreen instead.\n");
printf(GameModeString);
printf("\n");
switch (game_version)
{
case 600:
*fullScreenFlag_600 = 1;
break;
default:
*fullScreenFlag_710 = 1;
}
*fullScreenFlag_710 = 1;
__glutCreateWindowWithExit(title, exitGameClean);
}
}
else // windowed or borderless
{
switch (game_version)
{
case 600:
*fullScreenFlag_600 = 0;
break;
default:
*fullScreenFlag_710 = 0;
}
*fullScreenFlag_710 = 0;
RECT xy;
SystemParametersInfo(SPI_GETWORKAREA, 0, &xy, 0);
@@ -130,23 +108,9 @@ __int64 hookedParseParameters(int a1, __int64* a2)
{
// Force -wqhd if Custom Internal Resolution is enabled
if (nIntRes)
switch (game_version)
{
case 600:
*resolutionType_600 = 15;
break;
default:
*resolutionType_710 = 15;
}
*resolutionType_710 = 15;
// Return to the original function
switch (game_version)
{
case 600:
return divaParseParameters_600(a1, a2);
break;
default:
return divaParseParameters_710(a1, a2);
}
return divaParseParameters_710(a1, a2);
}
time_point<high_resolution_clock> sleepUntil = high_resolution_clock::now();
@@ -173,13 +137,7 @@ __int64 __fastcall limiterFuncNormal(__int64 a1)
if (nextUpdate < timeNow)
nextUpdate = timeNow;
switch (game_version)
{
case 600:
return divaEngineUpdate_600(a1);
default:
return divaEngineUpdate_710(a1);
}
return divaEngineUpdate_710(a1);
}
__int64 __fastcall limiterFuncLight(__int64 a1)
@@ -222,25 +180,13 @@ __int64 __fastcall limiterFuncLight(__int64 a1)
sleepUntil = nextUpdate - sleepWindow;
switch (game_version)
{
case 600:
return divaEngineUpdate_600(a1);
default:
return divaEngineUpdate_710(a1);
}
return divaEngineUpdate_710(a1);
}
__int64 __fastcall hookedEngineUpdate(__int64 a1)
{
if (nFpsLimit < 1)
switch (game_version)
{
case 600:
return divaEngineUpdate_600(a1);
default:
return divaEngineUpdate_710(a1);
}
return divaEngineUpdate_710(a1);
else if (nUseLightLimiter)
return limiterFuncLight(a1);
else
@@ -262,38 +208,19 @@ extern "C" __declspec(dllexport) void setFramerateLimit(int framerate)
return;
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
void ApplyRender(HMODULE hModule)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
if (nBuiltinRender)
{
if (*(char*)0x140A570F0 == '6') game_version = 600;
DisableThreadLibraryCalls(hModule);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
switch (game_version)
{
case 600:
DetourAttach(&(PVOID&)divaCreateWindow_600, hookedCreateWindow);
break;
default:
DetourAttach(&(PVOID&)divaCreateWindow_710, hookedCreateWindow);
}
DetourAttach(&(PVOID&)divaCreateWindow_710, hookedCreateWindow);
DetourTransactionCommit();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
switch (game_version)
{
case 600:
DetourAttach(&(PVOID&)divaParseParameters_600, hookedParseParameters);
break;
default:
DetourAttach(&(PVOID&)divaParseParameters_710, hookedParseParameters);
}
DetourAttach(&(PVOID&)divaParseParameters_710, hookedParseParameters);
DetourTransactionCommit();
@@ -309,14 +236,7 @@ BOOL APIENTRY DllMain(HMODULE hModule,
setFramerateLimit(nFpsLimit);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
switch (game_version)
{
case 600:
DetourAttach(&(PVOID&)divaEngineUpdate_600, hookedEngineUpdate);
break;
default:
DetourAttach(&(PVOID&)divaEngineUpdate_710, hookedEngineUpdate);
}
DetourAttach(&(PVOID&)divaEngineUpdate_710, hookedEngineUpdate);
DetourTransactionCommit();
// if window is set to screen res, process that now so it can be used for auto internal res
@@ -337,50 +257,43 @@ BOOL APIENTRY DllMain(HMODULE hModule,
printf("[Render] Custom internal resolution enabled\n");
printf("[Render] X: %d Y: %d\n", nIntResWidth, nIntResHeight);
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);
VirtualProtect((BYTE*)0x00000001409B8B68, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
*((int*)0x00000001409B8B68) = nIntResWidth;
VirtualProtect((BYTE*)0x00000001409B8B68, 6, oldProtect, &bck);
}
{
DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x0000000140980958, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
*((int*)0x0000000140980958) = nIntResHeight;
VirtualProtect((BYTE*)0x0000000140980958, 6, oldProtect, &bck);
VirtualProtect((BYTE*)0x00000001409B8B6C, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
*((int*)0x00000001409B8B6C) = nIntResHeight;
VirtualProtect((BYTE*)0x00000001409B8B6C, 6, oldProtect, &bck);
}
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*)0x00000001409B8B6C) = maxHeight;
//*((int*)0x00000001409B8B14) = maxWidth;
//*((int*)0x00000001409B8B18) = maxHeight;
//*((int*)0x00000001409B8B1C) = maxWidth; // No parameters width?
//*((int*)0x00000001409B8B20) = maxHeight; // No parameters height?
}
//*((int*)0x00000001409B8B1C) = maxWidth; // No parameters width?
//*((int*)0x00000001409B8B20) = maxHeight; // No parameters height?
}
}
return TRUE;
}
/*BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
ApplyRender(hModule);
}
return TRUE;
}*/
using namespace PluginConfig;
/*using namespace PluginConfig;
extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
{
@@ -390,4 +303,4 @@ extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
extern "C" __declspec(dllexport) LPCWSTR GetPluginDescription(void)
{
return L"Applies window mode/size and FPS limiting.";
}
}*/
@@ -0,0 +1,8 @@
#pragma once
void exitGameClean(int);
int hookedCreateWindow(const char* title, void(__cdecl* exit_function)(int));
__int64 hookedParseParameters(int a1, __int64* a2);
__int64 __fastcall limiterFuncNormal(__int64 a1);
__int64 __fastcall limiterFuncLight(__int64 a1);
__int64 __fastcall hookedEngineUpdate(__int64 a1);
void ApplyRender(HMODULE hModule);
+90 -39
View File
@@ -1,5 +1,7 @@
#include "framework.h"
#include "exception.hpp"
#include "Patches\patches.h"
#include "Render\render.h"
#include <VersionHelpers.h>
#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")
@@ -13,6 +15,9 @@ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
HMODULE hm;
std::vector<std::wstring> iniPaths;
unsigned short game_version = 710;
bool allowcustomfreeplay = false;
bool iequals(std::wstring_view s1, std::wstring_view s2)
{
std::wstring str1(std::move(s1));
@@ -215,13 +220,21 @@ void FindFiles(WIN32_FIND_DATAW* fd)
do {
if (!(fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
if (fd->cFileName[0] == '.' && fd->cFileName[1] == '_') continue; // exclude macOS metadata
if (!_wcsicmp(fd->cFileName, L"Patches.dva") || !_wcsicmp(fd->cFileName, L"Render.dva"))
{
DeleteFileW(fd->cFileName);
continue;
}
auto pos = wcslen(fd->cFileName);
if (fd->cFileName[pos - 4] == '.' &&
(fd->cFileName[pos - 3] == 'd' || fd->cFileName[pos - 3] == 'D') &&
(fd->cFileName[pos - 2] == 'v' || fd->cFileName[pos - 2] == 'V') &&
(fd->cFileName[pos - 1] == 'a' || fd->cFileName[pos - 1] == 'A') &&
GetPrivateProfileIntW(L"plugins", fd->cFileName, TRUE, iniPaths))
GetPrivateProfileIntW(L"plugins", fd->cFileName, FALSE, iniPaths))
{
auto path = dir + L'\\' + fd->cFileName;
@@ -246,20 +259,31 @@ void LoadPlugins()
{
if (SetCurrentDirectoryW(szSelfPath.c_str()))
{
WIN32_FIND_DATAW dh;
/*WIN32_FIND_DATAW dh;
HANDLE divaHook = FindFirstFileW(L"divahook.dll", &dh);
if (divaHook != INVALID_HANDLE_VALUE && !(dh.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
printf("[PD Loader] Loading divahook.dll\n");
auto path = szSelfPath + L'\\' + dh.cFileName;
LoadDVA(path, szSelfPath.c_str(), dh.cFileName);
}
}*/
if (SetCurrentDirectoryW(L"plugins\\"))
{
WIN32_FIND_DATAW fd;
FindFiles(&fd);
}
}
ApplyPatches();
if (allowcustomfreeplay) ApplyVerText();
if (SetCurrentDirectoryW(szSelfPath.c_str())) ApplyAllCustomPatches();
if (!allowcustomfreeplay)
{
// we want to prevent both patches and plugins from changing it, not just patches
InjectCode((void*)0x1409F61F0, { 0x46, 0x52, 0x45, 0x45, 0x20, 0x50, 0x4C, 0x41, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x43, 0x52, 0x45, 0x44, 0x49, 0x54, 0x28, 0x53, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
ApplyVerText();
}
ApplyRender(hm);
}
SetCurrentDirectoryW(oldDir.c_str()); // Reset the current directory
@@ -737,58 +761,85 @@ void Init()
moduleName.resize(moduleName.find_last_of(L'.'));
modulePath.resize(modulePath.find_last_of(L"/\\") + 1);
iniPaths.emplace_back(modulePath + moduleName + L".ini");
const auto CONFIG_FILE = L"plugins\\config.ini";
const auto CONFIG_FILE_TEMPLATE = L"plugins\\config_template.bin";
const auto CONFIG_FILE = L"plugins_config\\config.ini";
iniPaths.emplace_back(modulePath + CONFIG_FILE);
// move old configuration files
// should probably be handled by the yet-to-be unified config manager
MoveFileW(L"plugins\\config.ini", CONFIG_FILE);
MoveFileW(L"plugins\\components.ini", L"plugins_config\\components.ini");
MoveFileW(L"plugins\\keyconfig.ini", L"plugins_config\\keyconfig.ini");
MoveFileW(L"plugins\\playerdata.ini", L"plugins_config\\playerdata.ini");
MoveFileW(L"plugins\\CustoMixer.ini", L"plugins_config\\CustoMixer.ini");
MoveFileW(L"plugins\\DivaWig.ini", L"plugins_config\\DivaWig.ini");
MoveFileW(L"plugins\\DSCRemote.ini", L"plugins_config\\DSCRemote.ini");
MoveFileW(L"plugins\\DivaMovie.ini", L"plugins_config\\DivaMovie.ini");
MoveFileW(L"plugins\\EnhancedStageManager.ini", L"plugins_config\\EnhancedStageManager.ini");
MoveFileW(L"plugins\\DivaSound.ini", L"plugins_config\\DivaSound.ini");
MoveFileW(L"plugins\\Novidia.ini", L"plugins_config\\Novidia.ini");
MoveFileW(L"plugins\\ShaderPatchConfig.ini", L"plugins_config\\ShaderPatchConfig.ini");
MoveFileW(L"plugins\\pv_equip\\", L"plugins_config\\pv_equip\\");
// initialize configuration files.
CopyFileW(CONFIG_FILE_TEMPLATE, CONFIG_FILE, true);
const auto COMPONENTS_TEMPLATE = L"plugins\\components_template.bin";
const auto COMPONENTS = L"plugins\\components.ini";
CopyFileW(COMPONENTS_TEMPLATE, COMPONENTS, true);
const auto KEYCONFIG_TEMPLATE = L"plugins\\keyconfig_template.bin";
const auto KEYCONFIG = L"plugins\\keyconfig.ini";
CopyFileW(KEYCONFIG_TEMPLATE, KEYCONFIG, true);
const auto PLAYERDATA_TEMPLATE = L"plugins\\playerdata_template.bin";
const auto PLAYERDATA = L"plugins\\playerdata.ini";
CopyFileW(PLAYERDATA_TEMPLATE, PLAYERDATA, true);
const auto DIVASOUND_TEMPLATE = L"plugins\\DivaSound_template.bin";
const auto DIVASOUND = L"plugins\\DivaSound.ini";
CopyFileW(DIVASOUND_TEMPLATE, DIVASOUND, true);
const auto SHADERPATCH_TEMPLATE = L"plugins\\ShaderPatch_template.bin";
const auto SHADERPATCH = L"plugins\\ShaderPatch.ini";
CopyFileW(SHADERPATCH_TEMPLATE, SHADERPATCH, true);
const auto SHADERPATCHCONFIG_TEMPLATE = L"plugins\\ShaderPatchConfig_template.bin";
const auto SHADERPATCHCONFIG = L"plugins\\ShaderPatchConfig.ini";
CopyFileW(SHADERPATCHCONFIG_TEMPLATE, SHADERPATCHCONFIG, true);
DeleteFileW(L"plugins\\config_template.bin");
DeleteFileW(L"plugins\\components_template.bin");
DeleteFileW(L"plugins\\DivaSound_template.bin");
DeleteFileW(L"plugins\\keyconfig_template.bin");
DeleteFileW(L"plugins\\playerdata_template.bin");
DeleteFileW(L"plugins\\ShaderPatchConfig_template.bin");
if ((PathFileExistsW(CONFIG_FILE_TEMPLATE) && !PathFileExistsW(CONFIG_FILE)) ||
(PathFileExistsW(COMPONENTS_TEMPLATE) && !PathFileExistsW(COMPONENTS)) ||
(PathFileExistsW(KEYCONFIG_TEMPLATE) && !PathFileExistsW(KEYCONFIG)) ||
(PathFileExistsW(PLAYERDATA_TEMPLATE) && !PathFileExistsW(PLAYERDATA)) ||
(PathFileExistsW(DIVASOUND_TEMPLATE) && !PathFileExistsW(DIVASOUND)) ||
(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);
// initialize configuration files
WCHAR config_pcname[MAX_COMPUTERNAME_LENGTH + 1];
GetPrivateProfileStringW(L"global", L"pc", L"", config_pcname, MAX_COMPUTERNAME_LENGTH + 1, CONFIG_FILE);
WCHAR this_pcname[MAX_COMPUTERNAME_LENGTH + 1];
DWORD count = MAX_COMPUTERNAME_LENGTH + 1;
CreateDirectoryW(L"plugins\\pv_equip", NULL);
const auto eq_modules = L"plugins\\pv_equip\\modules.ini";
if (!PathFileExistsW(CONFIG_FILE))
{
if (!(
CreateDirectoryW(L"plugins_config", NULL) &&
WritePrivateProfileStringW(L"global", L"pc", this_pcname, CONFIG_FILE) &&
WritePrivateProfileStringW(L"patches", L"allow_custom_freeplay", L"0", CONFIG_FILE) &&
WritePrivateProfileStringW(L"plugins", L"Launcher.dva", L"1", CONFIG_FILE) &&
WritePrivateProfileStringW(L"plugins", L"TLAC.dva", L"1", CONFIG_FILE) &&
WritePrivateProfileStringW(L"plugins", L"DivaSound.dva", L"1", CONFIG_FILE) &&
WritePrivateProfileStringW(L"plugins", L"Novidia.dva", L"1", CONFIG_FILE) &&
WritePrivateProfileStringW(L"plugins", L"ShaderPatch.dva", L"1", CONFIG_FILE)
))
{
MessageBoxW(0, L"Could not install configuration files. Is the game in a read-only folder?", L"PD Loader", MB_ICONERROR);
exit(1);
}
}
else if(GetComputerNameW(this_pcname, &count) && wcscmp(config_pcname, this_pcname)!=0)
{
if (!(
WritePrivateProfileStringW(L"global", L"pc", this_pcname, CONFIG_FILE) &&
WritePrivateProfileStringW(L"patches", L"allow_custom_freeplay", L"0", CONFIG_FILE)
))
{
MessageBoxW(0, L"Could not update configuration files. Is the game in a read-only folder?", L"PD Loader", MB_ICONERROR);
exit(1);
}
}
else allowcustomfreeplay = GetPrivateProfileIntW(L"patches", L"allow_custom_freeplay", FALSE, CONFIG_FILE) == 1;
CreateDirectoryW(L"plugins_config\\pv_equip", NULL);
const auto eq_modules = L"plugins_config\\pv_equip\\modules.ini";
if (!PathFileExistsW(eq_modules))
{
std::ofstream stream(eq_modules);
stream << "[modules]\n# Manual editing is NOT recommended as the game will save here during gameplay";
stream.close();
}
const auto eq_sfx = L"plugins\\pv_equip\\sfx.ini";
const auto eq_sfx = L"plugins_config\\pv_equip\\sfx.ini";
if (!PathFileExistsW(eq_sfx))
{
std::ofstream stream(eq_sfx);
stream << "[SFX]\n# INI Format = ' pv.xxx.btn = sfx id (ex. 5) '\n# pv.001.btn=2 for example\n# pv.xxx.btn, pv.xxx.chain, pv.xxx.slide & pv.xxx.touch can all be assigned using the format";
stream.close();
}
const auto eq_skins = L"plugins\\pv_equip\\skins.ini";
const auto eq_skins = L"plugins_config\\pv_equip\\skins.ini";
if (!PathFileExistsW(eq_skins))
{
std::ofstream stream(eq_skins);
@@ -858,7 +909,7 @@ void Init()
}
else if (!MoveFileExW(L"dinput8.dll", L"~dinput8.dll", MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH))
{
MessageBoxW(0, L"PD Loader was loaded from \"dnsapi.dll\", but \"dinput8.dll\" was found and PD Loader could not delete it automatically\nIs it read-only?", L"PD Loader", MB_ICONERROR);
MessageBoxW(0, L"PD Loader was loaded from \"dnsapi.dll\", but \"dinput8.dll\" was found and PD Loader could not delete it automatically\nIs the file read-only? Or is the game still running?", L"PD Loader", MB_ICONERROR);
exit(1);
}
}
+2 -2
View File
@@ -65,7 +65,7 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>..\dependencies\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -89,7 +89,7 @@
<AdditionalIncludeDirectories>..\dependencies\MemoryModule;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -12,24 +12,24 @@
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<ProjectGuid>{89F87459-768F-4638-9267-0F90CD74452D}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>Render</RootNamespace>
<ProjectGuid>{84DBD504-6220-1BCE-A7E4-6799DAF7C5BF}</ProjectGuid>
<RootNamespace>CustoMixer</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>CustoMixer</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -43,69 +43,56 @@
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.dva</TargetExt>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<TargetExt>.dva</TargetExt>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<TargetExt>.dva</TargetExt>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<AdditionalLibraryDirectories>..\..\..\dependencies\detours\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>evr.lib;mfplat.lib;mfuuid.lib;strmiids.lib;syelog.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;RENDER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>
</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\freeglut\include;..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<AdditionalLibraryDirectories>..\..\..\dependencies\detours\lib;..\..\..\dependencies\freeglut\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>evr.lib;mfplat.lib;mfuuid.lib;syelog.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>..\..\..\dependencies\detours\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;RENDER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>
</PrecompiledHeaderFile>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalIncludeDirectories>..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\freeglut\include;..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<AdditionalLibraryDirectories>..\..\..\dependencies\detours\lib;..\..\..\dependencies\freeglut\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="framework.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h" />
<ClInclude Include="PluginConfigApi.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="dllmain.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h" />
<ClInclude Include="PluginConfigApi.h" />
</ItemGroup>
</Project>
@@ -0,0 +1,168 @@
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <vector>
// resolution class to store and sort the width and height easily
class resolution
{
public:
unsigned int width;
unsigned int height;
resolution()
{
width = 0;
height = 0;
}
resolution(unsigned int width, unsigned int height)
{
resolution::width = width;
resolution::height = height;
}
bool operator ==(const resolution &res2)
{
return width == res2.width && height == res2.height;
}
// in comparisons width takes priority because it's usually displayed first
bool operator <(const resolution &res2)
{
if (width == res2.width)
return height < res2.height;
else
return width < res2.width;
}
bool operator >(const resolution &res2)
{
if (width == res2.width)
return height > res2.height;
else
return width > res2.width;
}
};
namespace PluginConfig
{
#pragma pack(push, 1)
enum ConfigType {
CONFIG_BOOLEAN,
CONFIG_NUMERIC,
CONFIG_STRING,
CONFIG_DROPDOWN_INDEX,
CONFIG_DROPDOWN_TEXT,
CONFIG_DROPDOWN_NUMBER,
CONFIG_RESOLUTION,
CONFIG_GROUP_START,
CONFIG_GROUP_END,
CONFIG_BUTTON,
CONFIG_SPACER
};
struct PluginConfigBooleanData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
bool defaultVal;
bool saveAsString;
};
struct PluginConfigNumericData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
int defaultVal;
int minVal;
int maxVal;
};
struct PluginConfigStringData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
LPCWSTR defaultVal;
bool useUtf8;
};
struct PluginConfigDropdownIndexData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
int defaultVal;
std::vector<LPCWSTR> valueStrings;
};
struct PluginConfigDropdownTextData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
LPCWSTR defaultVal;
std::vector<LPCWSTR> valueStrings;
bool editable;
bool useUtf8;
};
struct PluginConfigDropdownNumberData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
int defaultVal;
std::vector<int> valueInts;
bool editable;
};
struct PluginConfigResolutionData {
LPCWSTR iniVarName;
LPCWSTR iniVarName2;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
resolution defaultVal;
std::vector<resolution> valueResolutions;
bool editable;
};
struct PluginConfigGroupData
{
LPCWSTR name;
int height;
};
struct PluginConfigButtonData {
LPCWSTR friendlyName;
LPCWSTR description;
void(*func)();
};
struct PluginConfigSpacerData {
int height;
};
struct PluginConfigOption
{
ConfigType cfgType;
void* data;
};
struct PluginConfigArray
{
int len;
PluginConfigOption* options;
};
#pragma pack(pop)
}
@@ -0,0 +1,180 @@
#include "PluginConfigApi.h"
#include "framework.h"
using namespace std;
int nNoHandScaling, nDefaultHandSize, nForceMouth, nForceExpressions, nForceLook;
void loadConfig()
{
nNoHandScaling = GetPrivateProfileIntW(L"patches", L"no_hand_scaling", FALSE, CONFIG_FILE) > 0 ? true : false;
nDefaultHandSize = GetPrivateProfileIntW(L"patches", L"default_hand_size", -1, CONFIG_FILE);
nForceMouth = GetPrivateProfileIntW(L"patches", L"force_mouth", 0, CONFIG_FILE);
nForceExpressions = GetPrivateProfileIntW(L"patches", L"force_expressions", 0, CONFIG_FILE);
nForceLook = GetPrivateProfileIntW(L"patches", L"force_look", 0, CONFIG_FILE);
return;
}
void pvPatches()
{
puts("[CustoMixer] Applying PV patches...");
// Force mouth animations
{
if (nForceMouth == 1) // PDA
{
printf("[CustoMixer] Forcing PDA mouth...\n");
int* mouth_table = (int*)(0x1409A1DC0);
DWORD oldProtect;
VirtualProtect(mouth_table, 44, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 11; i++)
{
mouth_table[i]++;
}
VirtualProtect(mouth_table, 44, oldProtect, nullptr);
printf("[CustoMixer] PDA mouth forced\n");
}
else if (nForceMouth == 2) // FT
{
printf("[CustoMixer] Forcing FT mouth...\n");
int* mouth_table_oldid = (int*)(0x1409A1E1C);
DWORD oldProtect;
VirtualProtect(mouth_table_oldid, 44, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 11; i++)
{
mouth_table_oldid[i]--;
}
VirtualProtect(mouth_table_oldid, 44, oldProtect, nullptr);
printf("[CustoMixer] FT mouth forced\n");
}
}
// Force expressions
{
if (nForceExpressions == 1) // PDA
{
printf("[CustoMixer] Forcing PDA expressions...\n");
int* exp_table = (int*)(0x140A21900);
DWORD oldProtect;
VirtualProtect(exp_table, 104, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 26; i++)
{
exp_table[i] += 2;
}
VirtualProtect(exp_table, 104, oldProtect, nullptr);
printf("[CustoMixer] PDA expressions forced\n");
}
else if (nForceExpressions == 2) // FT
{
printf("[CustoMixer] Forcing FT expressions...\n");
int* exp_table_oldid = (int*)(0x140A219D0);
DWORD oldProtect;
VirtualProtect(exp_table_oldid, 104, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 26; i++)
{
exp_table_oldid[i] -= 2;
}
VirtualProtect(exp_table_oldid, 104, oldProtect, nullptr);
printf("[CustoMixer] FT expressions forced\n");
}
}
// Force look animations
{
if (nForceLook == 1) // PDA
{
printf("[CustoMixer] Forcing PDA look...\n");
int* look_table = (int*)(0x1409A1D70);
DWORD oldProtect;
VirtualProtect(look_table, 36, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 9; i++)
{
look_table[i]++;
}
VirtualProtect(look_table, 36, oldProtect, nullptr);
printf("[CustoMixer] PDA look forced\n");
}
else if (nForceLook == 2) // FT
{
printf("[CustoMixer] Forcing FT look...\n");
int* look_table_oldid = (int*)(0x1409A1D9C);
DWORD oldProtect;
VirtualProtect(look_table_oldid, 36, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 9; i++)
{
look_table_oldid[i]--;
}
VirtualProtect(look_table_oldid, 36, oldProtect, nullptr);
printf("[CustoMixer] FT look forced\n");
}
}
// Disable hand scaling
if (nNoHandScaling)
{
InjectCode((void*)0x0000000140120709, { 0xE9, 0x82, 0x0A, 0x00 });
}
// Default hand size
if (nDefaultHandSize != -1 && nDefaultHandSize < 1)
{
MessageBoxW(nullptr, L"The default hand size is lower than 1 and higher than -1 (default). Hands may disappear.\n\nIf this is not intentional, set it back to -1.", L"DivaWig", MB_ICONWARNING);
printf("[CustoMixer] Changing default hand size...\n");
const float num = (float)nDefaultHandSize / 10000.0;
DWORD oldProtect;
float* addr1 = (float*)(0x140506B59);
float* addr2 = (float*)(0x140506B60);
/*float* addr3 = (float*)(0x140506B67);
float* addr4 = (float*)(0x140506B71);*/
VirtualProtect(addr1, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
VirtualProtect(addr2, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
/*VirtualProtect(addr3, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
VirtualProtect(addr4, 4, PAGE_EXECUTE_READWRITE, &oldProtect);*/
*addr1 = *addr2 /*= *addr3 = *addr4*/ = num;
VirtualProtect(addr1, 4, oldProtect, nullptr);
VirtualProtect(addr2, 4, oldProtect, nullptr);
/*VirtualProtect(addr3, 4, oldProtect, nullptr);
VirtualProtect(addr4, 4, oldProtect, nullptr);*/
printf("[CustoMixer] New default hand size: %f\n", num);
}
puts("[CustoMixer] PV patches applied.");
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
loadConfig();
pvPatches();
}
return TRUE;
}
const std::vector<LPCWSTR> typeList = { L"Default", L"PDA", L"PDAFT/PDFT/PDM39" };
PluginConfig::PluginConfigOption config[] = {
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"no_hand_scaling", L"patches", CONFIG_FILE, L"No Hand Scaling", L"Disable scripted hand scaling.", false } },
{ PluginConfig::CONFIG_NUMERIC, new PluginConfig::PluginConfigNumericData{ L"default_hand_size", L"patches", CONFIG_FILE, L"Default Hand Size:", L"-1: default\n12200: PDA", -1, -1, INT_MAX } },
{ PluginConfig::CONFIG_DROPDOWN_INDEX, new PluginConfig::PluginConfigDropdownIndexData{ L"force_mouth", L"patches", CONFIG_FILE, L"Mouth Animations:", L"Change the mouth animations.", 0, typeList}},
{ PluginConfig::CONFIG_DROPDOWN_INDEX, new PluginConfig::PluginConfigDropdownIndexData{ L"force_expressions", L"patches", CONFIG_FILE, L"Expr. Animations:", L"Change the expressions.", 0, typeList}},
{ PluginConfig::CONFIG_DROPDOWN_INDEX, new PluginConfig::PluginConfigDropdownIndexData{ L"force_look", L"patches", CONFIG_FILE, L"Look Animations:", L"Change the look animations.", 0, typeList}},
};
extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
{
return L"CustoMixer";
}
extern "C" __declspec(dllexport) LPCWSTR GetPluginDescription(void)
{
return L"CustoMixer Plugin by nas\n\DivaWig lets you change some PV settings.";
}
extern "C" __declspec(dllexport) PluginConfig::PluginConfigArray GetPluginOptions(void)
{
return PluginConfig::PluginConfigArray{ _countof(config), config };
}
@@ -0,0 +1,27 @@
#include <windows.h>
#include <string>
void InjectCode(void* address, const std::vector<uint8_t> data)
{
const size_t byteCount = data.size() * sizeof(uint8_t);
DWORD oldProtect;
VirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(address, data.data(), byteCount);
VirtualProtect(address, byteCount, oldProtect, nullptr);
}
std::wstring ExePath() {
WCHAR buffer[MAX_PATH];
GetModuleFileNameW(NULL, buffer, MAX_PATH);
return std::wstring(buffer);
}
std::wstring DirPath() {
std::wstring exepath = ExePath();
std::wstring::size_type pos = exepath.find_last_of(L"\\/");
return exepath.substr(0, pos);
}
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\CustoMixer.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
@@ -55,7 +55,7 @@
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -74,7 +74,7 @@
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
<LanguageStandard>
</LanguageStandard>
</ClCompile>
@@ -13,5 +13,5 @@ std::wstring DirPath() {
return exepath.substr(0, pos);
}
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\DSCRemote.ini";
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\DSCRemote.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
@@ -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.\nDivaMovie will be disabled.\n\nIt is highly recommended to restart the game now.", L"DivaMovie", MB_ICONWARNING);
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)
@@ -19,9 +19,12 @@ std::wstring DirPath() {
return exepath.substr(0, pos);
}
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\DivaMovie.ini";
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\DivaMovie.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
std::wstring MASTER_CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\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) \
@@ -228,5 +228,5 @@ std::wstring DirPath() {
return exepath.substr(0, pos);
}
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\DivaSound.ini";
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\DivaSound.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
@@ -15,6 +15,7 @@
<ProjectGuid>{2394C586-F73B-4EF2-BA3E-2A0FC3034B1A}</ProjectGuid>
<RootNamespace>DivaWig</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>DivaWig</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
@@ -55,7 +56,7 @@
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -74,7 +75,7 @@
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
+38 -58
View File
@@ -1,5 +1,5 @@
#include "framework.h"
#include "PluginConfigApi.h"
#include "framework.h"
#include <detours.h>
#include <string>
#include <iostream>
@@ -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;
@@ -47,16 +50,12 @@ void(__cdecl* loadFunc)(uint64_t* classp, unsigned int unk, __int64 performer) =
const string Strings[25] = { "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" };
char part_to_update = -1;
/*uint64_t *last_unload_a1 = 0, *last_reload_a1 = 0;
unsigned int last_unload_a2 = 0, last_reload_a2 = 0;
__int64 last_unload_a3 = 0, last_reload_a3 = 0;*/
bool dobeep = true, allowReloading = true, debug = false;
void loadConfig()
{
dobeep = GetPrivateProfileIntW(L"general", L"beep", 1, CONFIG_FILE) > 0 ? true : false;
allowReloading = GetPrivateProfileIntW(L"general", L"reloading", 0, CONFIG_FILE) > 0 ? true : false;
{
dobeep = GetPrivateProfileIntW(L"wig", L"beep", 1, CONFIG_FILE) > 0 ? true : false;
allowReloading = GetPrivateProfileIntW(L"wig", L"reloading", 0, CONFIG_FILE) > 0 ? true : false;
debug = GetPrivateProfileIntW(L"general", L"debug", 0, CONFIG_FILE) > 0 ? true : false;
return;
@@ -107,24 +106,6 @@ void load(__int64 performer_address)
this_thread::sleep_for(chrono::seconds(1));
}
/*void hookedUnload(uint64_t* a1, unsigned int a2, __int64 a3)
{
cout << "[DivaWig] hookedUnload a1: " << a1 << "; a2: " << a2 << "; a3: " << a3 << endl;
last_unload_a1 = a1;
last_unload_a2 = a2;
last_unload_a3 = a3;
unloadFunc(a1, a2, a3);
}
void hookedLoad(uint64_t* a1, unsigned int a2, __int64 a3)
{
cout << "[DivaWig] hookedReload a1: " << a1 << "; a2: " << a2 << "; a3: " << a3 << endl;
last_reload_a1 = a1;
last_reload_a2 = a2;
last_reload_a3 = a3;
loadFunc(a1, a2, a3);
}*/
void inputLoop(__int64 a1)
{
//if (GetKeyState(VK_CONTROL) < 0)
@@ -185,7 +166,6 @@ void hookedThi(unsigned int* a1, unsigned int module_part)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
loadConfig();
@@ -222,9 +202,9 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
}
PluginConfig::PluginConfigOption config[] = {
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"beep", L"general", CONFIG_FILE, L"Beep", L"Beep when selecting the part that should be updated.", true } },
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"reloading", L"general", CONFIG_FILE, L"Unloading and loading (experimental)", L"Allow unloading (CTRL+U or U+number) and loading (CTRL+L or L+number).", false } },
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"debug", L"general", CONFIG_FILE, L"Debug", L"Print extra information.", false } },
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"beep", L"wig", CONFIG_FILE, L"Beep", L"Beep when selecting the part that should be updated.", true } },
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"reloading", L"wig", CONFIG_FILE, L"Unloading and loading (experimental)", L"Allow unloading (CTRL+U or U+number) and loading (CTRL+L or L+number).", false } },
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"sing_missed", L"patches", CONFIG_FILE, L"Sing Missed Notes", L"Sing Missed Notes.", false } },
};
extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
@@ -234,7 +214,7 @@ extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
extern "C" __declspec(dllexport) LPCWSTR GetPluginDescription(void)
{
return L"DivaWig Plugin by nas\n\nDivaWig lets you mix some module parts by pressing CTRL+0~9.";
return L"DivaWig Plugin by nas\n\DivaWig lets you mix module parts by pressing CTRL+0~9.";
}
extern "C" __declspec(dllexport) PluginConfig::PluginConfigArray GetPluginOptions(void)
@@ -13,5 +13,5 @@ std::wstring DirPath() {
return exepath.substr(0, pos);
}
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\DivaWig.ini";
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\DivaWig.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="dllmain.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h" />
<ClInclude Include="PluginConfigApi.h" />
</ItemGroup>
</Project>
@@ -12,9 +12,8 @@
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<ProjectGuid>{3FD6ACA9-E613-4FD6-BDA2-55A91C2CF65C}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>Patches</RootNamespace>
<ProjectGuid>{3C8071F4-22C8-DA6E-A075-C5EC646DAB7E}</ProjectGuid>
<RootNamespace>EnhancedStageManager</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
@@ -22,14 +21,14 @@
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
@@ -43,59 +42,46 @@
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetExt>.dva</TargetExt>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<TargetExt>.dva</TargetExt>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<TargetExt>.dva</TargetExt>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;PATCHES_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalIncludeDirectories>..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\freeglut\include;..\..\..\dependencies\freeglut\include;..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<AdditionalLibraryDirectories>..\..\..\dependencies\detours\lib;..\..\..\dependencies\freeglut\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;PATCHES_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeaderFile>
</PrecompiledHeaderFile>
<AdditionalIncludeDirectories>..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\freeglut\include;..\..\..\dependencies\freeglut\include;..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<AdditionalLibraryDirectories>..\..\..\dependencies\detours\lib;..\..\..\dependencies\freeglut\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions>-d2:-FH4- %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
@@ -104,9 +90,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h" />
<ClInclude Include="PatchApplier.h" />
<ClInclude Include="PatchApplier600.h" />
<ClInclude Include="PatchApplier710.h" />
<ClInclude Include="PluginConfigApi.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
@@ -0,0 +1,168 @@
#pragma once
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <vector>
// resolution class to store and sort the width and height easily
class resolution
{
public:
unsigned int width;
unsigned int height;
resolution()
{
width = 0;
height = 0;
}
resolution(unsigned int width, unsigned int height)
{
resolution::width = width;
resolution::height = height;
}
bool operator ==(const resolution &res2)
{
return width == res2.width && height == res2.height;
}
// in comparisons width takes priority because it's usually displayed first
bool operator <(const resolution &res2)
{
if (width == res2.width)
return height < res2.height;
else
return width < res2.width;
}
bool operator >(const resolution &res2)
{
if (width == res2.width)
return height > res2.height;
else
return width > res2.width;
}
};
namespace PluginConfig
{
#pragma pack(push, 1)
enum ConfigType {
CONFIG_BOOLEAN,
CONFIG_NUMERIC,
CONFIG_STRING,
CONFIG_DROPDOWN_INDEX,
CONFIG_DROPDOWN_TEXT,
CONFIG_DROPDOWN_NUMBER,
CONFIG_RESOLUTION,
CONFIG_GROUP_START,
CONFIG_GROUP_END,
CONFIG_BUTTON,
CONFIG_SPACER
};
struct PluginConfigBooleanData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
bool defaultVal;
bool saveAsString;
};
struct PluginConfigNumericData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
int defaultVal;
int minVal;
int maxVal;
};
struct PluginConfigStringData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
LPCWSTR defaultVal;
bool useUtf8;
};
struct PluginConfigDropdownIndexData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
int defaultVal;
std::vector<LPCWSTR> valueStrings;
};
struct PluginConfigDropdownTextData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
LPCWSTR defaultVal;
std::vector<LPCWSTR> valueStrings;
bool editable;
bool useUtf8;
};
struct PluginConfigDropdownNumberData {
LPCWSTR iniVarName;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
int defaultVal;
std::vector<int> valueInts;
bool editable;
};
struct PluginConfigResolutionData {
LPCWSTR iniVarName;
LPCWSTR iniVarName2;
LPCWSTR iniSectionName;
LPCWSTR iniFilePath;
LPCWSTR friendlyName;
LPCWSTR description;
resolution defaultVal;
std::vector<resolution> valueResolutions;
bool editable;
};
struct PluginConfigGroupData
{
LPCWSTR name;
int height;
};
struct PluginConfigButtonData {
LPCWSTR friendlyName;
LPCWSTR description;
void(*func)();
};
struct PluginConfigSpacerData {
int height;
};
struct PluginConfigOption
{
ConfigType cfgType;
void* data;
};
struct PluginConfigArray
{
int len;
PluginConfigOption* options;
};
#pragma pack(pop)
}
@@ -0,0 +1,76 @@
#include "PluginConfigApi.h"
#include "framework.h"
int nEStageManager, nEStageManagerEncore;
void loadConfig()
{
nEStageManager = GetPrivateProfileIntW(L"patches", L"enhanced_stage_manager", 0, CONFIG_FILE);
nEStageManagerEncore = GetPrivateProfileIntW(L"patches", L"enhanced_stage_manager_encore", FALSE, CONFIG_FILE) > 0 ? true : false;
if (nEStageManager < 1) nEStageManager = INT_MAX;
return;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
loadConfig();
//// TODO: rewrite without injecting assembly
// Replace the function that provides the number of stages and compact some of it
InjectCode((void*)0x000000014038AEF0, { 0x48, 0x8B, 0x88, 0x40, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x20, 0x48, 0x8B, 0xD0, 0x48, 0x8B, 0x88, 0x48, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x28, 0x8B, 0x88, 0x50, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x30, 0x8B, 0x88, 0x54, 0x01, 0x00, 0x00, 0x8B, 0x80, 0x58, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x38, 0x8B, 0x82, 0x5C, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x34, 0x89, 0x44, 0x24, 0x3C, 0x48, 0x8B, 0x82, 0x60, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 0x82, 0x68, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x82, 0x70, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x50, 0x8B, 0x82, 0x78, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x58, 0x84, 0xC0, 0x74, 0x2A, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x48, 0xC1, 0xE8, 0x20, 0x85, 0xC0, 0x75, 0x1D, 0xE8, 0xD9, 0xD9, 0xE5, 0xFF, 0x48, 0x85, 0xC0, 0x74, 0x13, 0x48, 0x8D, 0x48, 0x10, 0xE8, 0xFB, 0xD3, 0xE5, 0xFF, 0xB9, 0x03, 0x00, 0x00, 0x00, 0x85, 0xC0, 0x0F, 0x45, 0xD9, 0x8B, 0x1D, 0x1B, 0x0C, 0x00, 0x00, 0x83, 0x3D, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x74, 0x06, 0x8B, 0x1D, 0x10, 0x0C, 0x00, 0x00, 0x8B, 0xC3, 0x48, 0x83, 0xC4, 0x60, 0x5B, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC });
// Jump to another section by addding some code to replace the values (Jump 1)
InjectCode((void*)0x000000014038AFF4, { 0xE9, 0x87, 0x0B, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC });
// Jump to another section by addding some code to replace the values (Replace 1/2) while some reserving space for values
InjectCode((void*)0x000000014038BB40, { 0xFF, 0x05, 0x76, 0x00, 0x00, 0x00, 0x8B, 0x0D, 0x70, 0x00, 0x00, 0x00, 0xBA, 0x02, 0x00, 0x00, 0x00, 0x83, 0x3D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0xFF, 0xC2, 0x39, 0xD1, 0x0F, 0x4D, 0xCA, 0x89, 0x48, 0x08, 0xB9, 0x0E, 0x00, 0x00, 0x00, 0xE8, 0x92, 0x98, 0xE0, 0xFF, 0xB0, 0x01, 0x48, 0x83, 0xC4, 0x28, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x44, 0x89, 0x61, 0x08, 0x44, 0x88, 0x61, 0x0C, 0x4C, 0x89, 0x61, 0x10, 0x44, 0x89, 0x25, 0x29, 0x00, 0x00, 0x00, 0xE9, 0x68, 0xF4, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
// Use the value from our own address instead of the original one
InjectCode((void*)0x00000001403F65AF, { 0x48, 0x8D, 0x05, 0x4A, 0x18, 0xDA, 0x00, 0x8B, 0x1D, 0x00, 0x56 });
// Jump to another section by addding some code to replace the values (Jump 2)
InjectCode((void*)0x00000001403F6638, { 0xE9, 0x03, 0x55, 0xF9, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC });
DWORD StageCountProtect;
VirtualProtect((int32_t*)0x14038BBB0, 0x10, PAGE_EXECUTE_READWRITE, &StageCountProtect);
int* ESM = (int*)0x000000014038BBB0;
if (nEStageManagerEncore)
ESM[1] = nEStageManager;
else
ESM[0] = nEStageManager;
ESM[2] = nEStageManagerEncore;
printf("[Patches] Enhanced Stage Manager enabled\n");
}
return TRUE;
}
PluginConfig::PluginConfigOption config[] = {
{ PluginConfig::CONFIG_NUMERIC, new PluginConfig::PluginConfigNumericData{ L"enhanced_stage_manager", L"patches", CONFIG_FILE, L"Stages:", L"Number of stages to play.\n\n0 = maximum", 0, 0, INT_MAX } },
{ PluginConfig::CONFIG_BOOLEAN, new PluginConfig::PluginConfigBooleanData{ L"enhanced_stage_manager_encore", L"patches", CONFIG_FILE, L"Encore", L"Enable Encore stages.", false } },
};
extern "C" __declspec(dllexport) LPCWSTR GetPluginName(void)
{
return L"Enhanced Stages";
}
extern "C" __declspec(dllexport) LPCWSTR GetPluginDescription(void)
{
return L"Allows you to play as many times in a row as you want.\n\nOriginal implementation by korenkonder.";
}
extern "C" __declspec(dllexport) PluginConfig::PluginConfigArray GetPluginOptions(void)
{
return PluginConfig::PluginConfigArray{ _countof(config), config };
}
@@ -0,0 +1,28 @@
#include <windows.h>
#include <string>
#include <vector>
void InjectCode(void* address, const std::vector<uint8_t> data)
{
const size_t byteCount = data.size() * sizeof(uint8_t);
DWORD oldProtect;
VirtualProtect(address, byteCount, PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(address, data.data(), byteCount);
VirtualProtect(address, byteCount, oldProtect, nullptr);
}
std::wstring ExePath() {
WCHAR buffer[MAX_PATH];
GetModuleFileNameW(NULL, buffer, MAX_PATH);
return std::wstring(buffer);
}
std::wstring DirPath() {
std::wstring exepath = ExePath();
std::wstring::size_type pos = exepath.find_last_of(L"\\/");
return exepath.substr(0, pos);
}
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\EnhancedStageManager.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
@@ -13,6 +13,7 @@
#include "PluginConfigApi.h"
#include "IniReader.h"
#include "i18n.h"
using namespace System;
using namespace System::Windows::Forms;
@@ -31,9 +32,9 @@ class ConfigOptionBase;
Panel^ MakePanel(int width, int height, std::vector<ConfigOptionBase*> &cfg, ToolTip^ tooltip, bool* hasChanged);
#define RESOPT_MATCH_WINDOW_TEXT "Match Window"
#define RESOPT_MATCH_SCREEN_TEXT "Match Screen"
#define RESOPT_MATCH_WINDOW_TEXT i18n::GetStringFallback("MATCH_WINDOW")
#define RESOPT_MATCH_SCREEN_TEXT i18n::GetStringFallback("MATCH_SCREEN")
#define CONFIG_TEXT i18n::GetStringFallback("CONFIG")
ref class ComboboxValidation
{
public:
@@ -167,7 +168,7 @@ public:
OkBtn->Left = 4;
OkBtn->Top = optspanel->Bottom + 4;
OkBtn->AutoSize = true;
OkBtn->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//OkBtn->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
form->ClientSize = Drawing::Size(optspanel->Width, OkBtn->Bottom + 4);
@@ -337,6 +338,44 @@ 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 = i18n::GetStringFallback(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 BooleanOption : public ConfigOptionBase
{
public:
@@ -358,12 +397,12 @@ public:
{
CheckBox^ cb = gcnew CheckBox();
cb->Text = gcnew String(_friendlyName);
cb->Text = i18n::GetStringFallback(gcnew String(_friendlyName));
cb->Checked = GetIniBool(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath);
cb->Left = left + 2;
cb->Top = top;
cb->AutoSize = true;
cb->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//cb->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
// hack to ensure high contrast
cb->BackColor = System::Drawing::Color::FromArgb(0, 127, 127, 127);
@@ -379,7 +418,7 @@ public:
}
cb->Scale(ScaleWidth, ScaleHeight);
tooltip->SetToolTip(cb, gcnew String(_description));
tooltip->SetToolTip(cb, i18n::GetStringFallback(gcnew String(_description)));
if (hasChanged == nullptr)
hasChanged = new bool(false);
@@ -424,12 +463,12 @@ public:
Label^ label = gcnew Label();
NumericUpDown^ numberbox = gcnew NumericUpDown();
label->Text = gcnew String(_friendlyName);
label->Text = i18n::GetStringFallback(gcnew String(_friendlyName));
label->Left = left;
label->Top = top + 3;
label->Width = Col1Width;
label->AutoSize = true;
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
numberbox->Minimum = _minVal;
numberbox->Maximum = _maxVal;
@@ -453,8 +492,8 @@ public:
label->Scale(ScaleWidth, ScaleHeight);
numberbox->Scale(ScaleWidth, ScaleHeight);
tooltip->SetToolTip(label, gcnew String(_description));
tooltip->SetToolTip(numberbox, gcnew String(_description));
tooltip->SetToolTip(label, i18n::GetStringFallback(gcnew String(_description)));
tooltip->SetToolTip(numberbox, i18n::GetStringFallback(gcnew String(_description)));
if (hasChanged == nullptr)
hasChanged = new bool(false);
@@ -500,12 +539,12 @@ public:
const wchar_t* stringBuf;
label->Text = gcnew String(_friendlyName);
label->Text = i18n::GetStringFallback(gcnew String(_friendlyName));
label->Left = left;
label->Top = top + 3;
label->Width = Col1Width;
label->AutoSize = true;
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
stringBuf = GetIniString(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath, _useUtf8);
@@ -532,8 +571,8 @@ public:
// textbox->Enabled = false;
//}
tooltip->SetToolTip(label, gcnew String(_description));
tooltip->SetToolTip(textbox, gcnew String(_description));
tooltip->SetToolTip(label, i18n::GetStringFallback(gcnew String(_description)));
tooltip->SetToolTip(textbox, i18n::GetStringFallback(gcnew String(_description)));
if (hasChanged == nullptr)
hasChanged = new bool(false);
@@ -589,22 +628,23 @@ public:
Label^ label = gcnew Label();
ComboBox^ combobox = gcnew ComboBox();
label->Text = gcnew String(_friendlyName);
label->Text = i18n::GetStringFallback(gcnew String(_friendlyName));
label->Left = left;
label->Top = top + 3;
label->Width = Col1Width;
label->AutoSize = true;
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
for (LPCWSTR& choice : _valueStrings) {
combobox->Items->Add(msclr::interop::marshal_as<System::String^>(choice));
String^ displayString = i18n::GetStringFallback(msclr::interop::marshal_as<System::String^>(choice));
combobox->Items->Add(displayString);
}
combobox->SelectedIndex = GetIniInt(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath)-_indexOffset;
combobox->Left = left + Col2Left;
combobox->Top = top;
combobox->Width = Col2Width;
combobox->AutoSize = true;
combobox->FlatStyle = System::Windows::Forms::FlatStyle::System;
//combobox->FlatStyle = System::Windows::Forms::FlatStyle::System;
combobox->DropDownStyle = ComboBoxStyle::DropDownList;
Form^ RootForm = panel->FindForm();
@@ -619,8 +659,8 @@ public:
label->Scale(ScaleWidth, ScaleHeight);
combobox->Scale(ScaleWidth, ScaleHeight);
tooltip->SetToolTip(label, gcnew String(_description));
tooltip->SetToolTip(combobox, gcnew String(_description));
tooltip->SetToolTip(label, i18n::GetStringFallback(gcnew String(_description)));
tooltip->SetToolTip(combobox, i18n::GetStringFallback(gcnew String(_description)));
if (hasChanged == nullptr)
hasChanged = new bool(false);
@@ -670,12 +710,12 @@ public:
const wchar_t* stringBuf;
label->Text = gcnew String(_friendlyName);
label->Text = i18n::GetStringFallback(gcnew String(_friendlyName));
label->Left = left;
label->Top = top + 3;
label->Width = Col1Width;
label->AutoSize = true;
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
for (LPCWSTR& choice : _valueStrings) {
combobox->Items->Add(msclr::interop::marshal_as<System::String^>(choice));
@@ -688,7 +728,7 @@ public:
combobox->Top = top;
combobox->Width = Col2Width;
combobox->AutoSize = true;
combobox->FlatStyle = System::Windows::Forms::FlatStyle::System;
//combobox->FlatStyle = System::Windows::Forms::FlatStyle::System;
if (_editable)
combobox->DropDownStyle = ComboBoxStyle::DropDown;
@@ -713,8 +753,8 @@ public:
// combobox->Enabled = false;
//}
tooltip->SetToolTip(label, gcnew String(_description));
tooltip->SetToolTip(combobox, gcnew String(_description));
tooltip->SetToolTip(label, i18n::GetStringFallback(gcnew String(_description)));
tooltip->SetToolTip(combobox, i18n::GetStringFallback(gcnew String(_description)));
if (hasChanged == nullptr)
hasChanged = new bool(false);
@@ -775,12 +815,12 @@ public:
System::String^ tempSysStr;
label->Text = gcnew String(_friendlyName);
label->Text = i18n::GetStringFallback(gcnew String(_friendlyName));
label->Left = left;
label->Top = top + 3;
label->Width = Col1Width;
label->AutoSize = true;
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
for (int& choice : _valueInts) {
combobox->Items->Add(Convert::ToInt32(choice).ToString());
@@ -793,7 +833,7 @@ public:
combobox->Top = top;
combobox->Width = Col2Width;
combobox->AutoSize = true;
combobox->FlatStyle = System::Windows::Forms::FlatStyle::System;
//combobox->FlatStyle = System::Windows::Forms::FlatStyle::System;
if (_editable)
combobox->DropDownStyle = ComboBoxStyle::DropDown;
@@ -812,8 +852,8 @@ public:
label->Scale(ScaleWidth, ScaleHeight);
combobox->Scale(ScaleWidth, ScaleHeight);
tooltip->SetToolTip(label, gcnew String(_description));
tooltip->SetToolTip(combobox, gcnew String(_description));
tooltip->SetToolTip(label, i18n::GetStringFallback(gcnew String(_description)));
tooltip->SetToolTip(combobox, i18n::GetStringFallback(gcnew String(_description)));
ComboboxValidation^ validation = gcnew ComboboxValidation(combobox);
combobox->Leave += gcnew System::EventHandler(validation, &ComboboxValidation::CheckNumberLeave);
@@ -883,12 +923,12 @@ public:
System::String^ tempSysStr;
label->Text = gcnew String(_friendlyName);
label->Text = i18n::GetStringFallback(gcnew String(_friendlyName));
label->Left = left;
label->Top = top + 3;
label->Width = Col1Width;
label->AutoSize = true;
label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//label->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
if (_opts & RESOPT_INCLUDE_MATCH_WINDOW)
combobox->Items->Add(RESOPT_MATCH_WINDOW_TEXT);
@@ -926,7 +966,7 @@ public:
combobox->Top = top;
combobox->Width = Col2Width;
combobox->AutoSize = true;
combobox->FlatStyle = System::Windows::Forms::FlatStyle::System;
//combobox->FlatStyle = System::Windows::Forms::FlatStyle::System;
if (_editable)
combobox->DropDownStyle = ComboBoxStyle::DropDown;
@@ -945,8 +985,8 @@ public:
label->Scale(ScaleWidth, ScaleHeight);
combobox->Scale(ScaleWidth, ScaleHeight);
tooltip->SetToolTip(label, gcnew String(_description));
tooltip->SetToolTip(combobox, gcnew String(_description));
tooltip->SetToolTip(label, i18n::GetStringFallback(gcnew String(_description)));
tooltip->SetToolTip(combobox, i18n::GetStringFallback(gcnew String(_description)));
if (hasChanged == nullptr)
hasChanged = new bool(false);
@@ -1013,7 +1053,7 @@ public:
button->Left = left;
button->Top = top;
button->AutoSize = true;
button->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//button->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
Form^ RootForm = panel->FindForm();
float ScaleWidth = 1.0f;
@@ -1026,7 +1066,7 @@ public:
}
button->Scale(ScaleWidth, ScaleHeight);
tooltip->SetToolTip(button, gcnew String(_description));
tooltip->SetToolTip(button, i18n::GetStringFallback(gcnew String(_description)));
CustomFuncHandler^ funchandler = gcnew CustomFuncHandler(_func);
button->Click += gcnew System::EventHandler(funchandler, &CustomFuncHandler::RunFunc);
@@ -1066,16 +1106,16 @@ public:
cb->Left = left + 2;
cb->Top = top + 3;
cb->AutoSize = true;
cb->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//cb->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
// hack to ensure high contrast
cb->BackColor = System::Drawing::Color::FromArgb(0, 127, 127, 127);
button->Text = L"Config";
button->Text = CONFIG_TEXT;
button->Left = left + ConfigBtnLeft;
button->Top = top;
button->AutoSize = true;
button->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
//button->FlatStyle = System::Windows::Forms::FlatStyle::Flat;
Form^ RootForm = panel->FindForm();
float ScaleWidth = 1.0f;
@@ -1089,7 +1129,7 @@ public:
cb->Scale(ScaleWidth, ScaleHeight);
button->Scale(ScaleWidth, ScaleHeight);
tooltip->SetToolTip(cb, gcnew String(_description));
tooltip->SetToolTip(cb, i18n::GetStringFallback(gcnew String(_description)));
if (hasChanged == nullptr)
hasChanged = new bool(false);
@@ -65,7 +65,7 @@
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\..\dependencies\simpleini;..\..\..\dependencies\WineVer;..\..\..\dependencies\GPUModel;..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\freeglut\include;..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>User32.lib</AdditionalDependencies>
@@ -86,7 +86,7 @@
<AdditionalIncludeDirectories>..\..\..\dependencies\simpleini;..\..\..\dependencies\WineVer;..\..\..\dependencies\GPUModel;..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\freeglut\include;..\..\..\dependencies\detours\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp17</LanguageStandard>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>User32.lib</AdditionalDependencies>
@@ -99,6 +99,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp" />
<ClCompile Include="i18n.h" />
<ClCompile Include="TabPadding.cpp" />
</ItemGroup>
<ItemGroup>
@@ -114,6 +115,7 @@
<ClInclude Include="framework.h" />
<ClInclude Include="IniReader.h" />
<ClInclude Include="PluginConfig.h" />
<ClInclude Include="registry.h" />
<ClInclude Include="SkinnedMessageBox.h" />
<ClInclude Include="TabPadding.h" />
<ClInclude Include="ui.h">
@@ -122,8 +124,26 @@
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="SkinnedMessageBox.resx" />
<EmbeddedResource Include="Resources.restext" />
<EmbeddedResource Include="Resources.zh-Hans.restext" />
<EmbeddedResource Include="Resources.pt-BR.restext" />
<EmbeddedResource Include="Resources.it-IT.restext" />
<EmbeddedResource Include="Resources.ja-JP.restext" />
<EmbeddedResource Include="ui.resx">
<DependentUpon>ui.h</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="ui.zh-Hans.resx">
<DependentUpon>ui.h</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ui.pt-BR.resx">
<DependentUpon>ui.h</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ui.it-IT.resx">
<DependentUpon>ui.h</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ui.ja-JP.resx">
<DependentUpon>ui.h</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
@@ -0,0 +1,295 @@
###############################################
# framework
LANG_AUTO=Automatica
en=Inglese
zh-Hans=Cinese semplificato
pt-BR=Portoghese
it-IT=Italiano
ja-JP=Giapponese
# display
DISPLAY_NAME=Visualizza:
DISPLAY_HINT=Imposta la modalità di visualizzazione dello schermo/finestra.\n\nVeloce: Finestra popup senza bordi (può causare problemi con gli screenshot su Windows 10/11 se le ottimizzazioni a schermo intero sono abilitate).\n\nEsclusiva: Prende il controllo dello schermo e permette di cambiare la risoluzione e la frequenza di aggiornamento. Rende difficile passare da un'applicazione all'altro.\n\nSicura: Finestra senza bordi semplice. Leggermente più lag rispetto a Veloce, ma con meno problemi.
Windowed=Finestra
Fast=Veloce
Exclusive=Esclusiva
Safe=Sicura
RESOLUTION_NAME=Risoluzione:
RESOLUTION_HINT=Imposta la risoluzione di visualizzazione.
REFRESHRATE_NAME=Frequenza di aggiornam.:
REFRESHRATE_HINT=Imposta la frequenza di aggiornamento dello schermo.
R.ENABLE_NAME=Abilita
R.ENABLE_HINT=Abilita o disabilita la risoluzione interna personalizzata.
R.RESOLUTION_NAME=Risoluzione:
R.RESOLUTION_HINT=Imposta la risoluzione interna (al posto di 1280x720).
MATCH_WINDOW=Stessa della finestra
MATCH_SCREEN=Stessa dello schermo
# graphics
MODEL_NAME=GPU NVIDIA:
MODEL_HINT=Selezionare l'architettura della tua GPU NVIDIA per applicare le modifiche necessarie.\n\nNOTA: Il rilevamento automatico attualmente non funziona su GNU/Linux.
MODEL_AUTOMATIC=Automatica
TAA_NAME=TAA
TAA_HINT=Antialiasing temporale
MLAA_NAME=MLAA
MLAA_HINT=Antialiasing morfologico
MAG_NAME=Filtro:
MAG_HINT=Filtro immagine.\n\nBilineare: filtro predefinito\nVicino più vicino: il più nitido, ma squadrato\nNitidezza: filtro nitido\nCono: filtro morbido
MAG_BILINEAR=Bilineare
MAG_NEAREST=Vicino più vicino
MAG_SHARPEN=Nitidezza
MAG_CONE=Cono
DOF_NAME=Profondità di campo
DOF_HINT=Sfoca lo sfondo. Disabilitare per migliorare le prestazioni.
REFLECTIONS_NAME=Riflessi
REFLECTIONS_HINT=Abilita o disabilita i riflessi.
REFLECT_RES_WIDTH_NAME=Risoluzione riflessi:
REFLECT_RES_WIDTH_HINT=Imposta la risoluzione dei riflessi (al posto di 512x256).
REFRACT_RES_WIDTH_NAME=Risoluzione rifrazione:
REFRACT_RES_WIDTH_HINT=Imposta la risoluzione della rifrazione (al posto di 512x256).
GAMMA_NAME=Gamma:
GAMMA_HINT=Aumentare per scurire le ombre.\nUsare 125 per un'esperienza da console.\n\nPredefinito: 100
SHADOWS_NAME=Ombre
SHADOWS_HINT=Abilita o disabilita le ombre.
PUNCHTHROUGH_NAME=Mesh trasparenti
PUNCHTHROUGH_HINT=Mostra le mesh trasparenti.
GLARE_NAME=Bagliore
GLARE_HINT=Abilita o disabilita il bagliore.
SHADER_NAME=Shader
SHADER_HINT=Abilita o disabilita gli shader ad alta qualità.
NPR1_NAME=Cartone (F9):
NPR1_HINT=Shader NPR1 (non fotorealistico)\n\nPremere F9 per attivare o disattivare.
2D_NAME=Disabilita rendering 3D
2D_HINT=Disabilita tutti i passaggi 3D.\n\nAVVISO: I dati estesi verranno cancellati se "Impedisci cancellazione dati" non è abilitato. Non abilitare con GPU Intel, al suo posto abilitare "Disattiva dati estesi".
# options
KEYBOARD_CONTROLLER_CONFIGURATION=Configurazione tastiera/controller
Default=Predefinito
Force on=Forza attivazione
Force off=Forza disattivazione
SECTION_LOADER=Loader
SECTION_COMPATIBILITY=Compatibilità
SECTION_PV_SELECTOR=Selettore video musicali
SECTION_ESM=Stage (canzoni)
SECTION_UI_ELM=Elementi interfaccia
SECTION_PV_PATCHES=Patch video musicali
SECTION_FRAMERATE=Frequenza dei fotogrammi
SECTION_CONTROLLER_OPTIONS=Opzioni controller
SECTION_LAUNCHER=Launcher
BUILTIN_PATCHES_NAME=Abilita patch integrate
BUILTIN_PATCHES_HINT=Abilita le patch integrate, comprese le opzioni in questa scheda.
CUSTOM_PATCHES_NAME=Abilita patch esterne
CUSTOM_PATCHES_HINT=Abilita tutte le patch esterne.
BUILTIN_RENDER_NAME=Abilita Render integrato
BUILTIN_RENDER_HINT=Abilita le patch di visualizzazione integrate.
NO_MOVIES_NAME=Disabilita video
NO_MOVIES_HINT=Disabilita i video (selezionare se il gioco si blocca durante il caricamento di certi video musicali).
CURSOR_NAME=Cursore
CURSOR_HINT=Abilita o disabilita il cursore del mouse.
STEREO_NAME=Stereo
STEREO_HINT=Usa 2 canali audio invece di 4 (quando non si usa DivaSound).
QUICK_START_NAME=Avvio rapido:
QUICK_START_HINT=Salta uno o più menu.
Disabled=Disabilita
Guest=Ospite
Guest + Normal=Ospite + Normale
NO_SCROLLING_SFX_NAME=Disabilita suono di scorrimento
NO_SCROLLING_SFX_HINT=Disabilita l'effetto sonoro di scorrimento.
SING_MISSED_NAME=Canta note mancate
SING_MISSED_HINT=Canta le note mancate.
HIDE_VOLUME_NAME=Nascondi controllo volume
HIDE_VOLUME_HINT=Nasconde i pulsanti per controllare il volume e gli effetti sonori.
NO_PV_UI_NAME=Disabilita interfaccia modalità video
NO_PV_UI_HINT=Rimuove i suggerimenti dei pulsanti nella modalità video.
HIDE_PV_WATERMARK_NAME=Nascondi filigrana
HIDE_PV_WATERMARK_HINT=Nasconde la filigrana nella modalità video.
STATUS_ICONS_NAME=Icone di rete in alto a destra:
STATUS_ICONS_HINT=Imposta lo stato del lettore di schede e della rete.
Hidden=Nascoste
Error=Errore
OK=Funzionante
Partial OK=Parzialmente funzionante
NO_LYRICS_NAME=Disabilita testi
NO_LYRICS_HINT=Disabilita i testi delle canzoni.
NO_ERROR_NAME=Disabilita banner di errore
NO_ERROR_HINT=Disabilita il banner di errore nella schermata dimostrativa.
HIDE_FREEPLAY_NAME=Nascondi "FREE PLAY"/"CREDIT(S)"
HIDE_FREEPLAY_HINT=Nasconde la scritta "FREE PLAY"/"CREDIT(S)".
PDLOADERTEXT_NAME=FREE PLAY di PD Loader
PDLOADERTEXT_HINT=Mostra "PD Loader" invece di "FREE PLAY".
ALLOWCUSTOMFREEPLAY_NAME=Abilita scritte personalizzate
ALLOWCUSTOMFREEPLAY_HINT=Permette ai plugin e alle patch di cambiare "FREE PLAY"/"CREDIT(S)".
NO_TIMER_NAME=Tempo illimitato
NO_TIMER_HINT=Ferma il timer.
NO_TIMER_SPRITE_NAME=Nascondi timer
NO_TIMER_SPRITE_HINT=Disabilita le immagini del timer.
NO_MESSAGE_BAR_NAME=Nascondi barra dei messaggi
NO_MESSAGE_BAR_HINT=Nasconde la barra dei messaggi in alto.
NO_STAGE_TEXT_NAME=Disabilita indicatore dello stage
NO_STAGE_TEXT_HINT=Disabilita l'indicatore Stage 1/2/Final.
UNLOCK_PSEUDO_NAME=Sblocca moduli "PSEUDO" (patch incompleta)
UNLOCK_PSEUDO_HINT=Permette di selezionare qualsiasi personaggio in tutti i video.\n(patch incompleta, i moduli consigliati sono sempre di Miku)
CARD_NAME=Sblocca menu scheda (patch incompleta)
CARD_HINT=Abilita il menu della scheda di gioco.\n(patch incompleta, non bypassa la schermata di controllo)
NO_OPD_NAME=Disabilita dati estesi
NO_OPD_HINT=Alias patch No Osage Play Data di Skyth.\n\nDisabilita la fisica precalcolata negli edit per risparmiare spazio.\nPuò corrompere la fisica in alcuni edit.
DWGUI_SCALING_NAME=Scala finestre di debug
DWGUI_SCALING_HINT=Alias patch dwgui di somewhatlurker.\n\nIngrandisce le finestre di debug al di sopra della risoluzione HD.
FREEPLAY_NAME=FREE PLAY
FREEPLAY_HINT=Mostra "FREE PLAY" invece di "CREDIT(S)" e non richiede crediti.
FPS.LIMIT.LIGHTMODE_NAME=Usa limitatore leggero
FPS.LIMIT.LIGHTMODE_HINT=Fa usare meno CPU al limitatore di fotogrammi.\nLe prestazioni potrebbero essere meno consistenti.
FPS.LIMIT_NAME=Limite di fotogrammi:
FPS.LIMIT_HINT=Permette di limitare il numero di fotogrammi. Usare -1 per non limitare.
FRM.MOTION.RATE_NAME=Frequenza movimenti GFF:
FRM.MOTION.RATE_HINT=Imposta la frequenza in fotogrammi dei movimenti per il componente "Gestore frequenza fotogrammi".\nValori alti aumentano la fluidità, ma richiedono più risorse della CPU e potrebbero causare problemi.
AUTOPAUSE_NAME=Pausa automatica
AUTOPAUSE_HINT=Mette in pausa il gioco quando non è in primo piano.
RUMBLE_NAME=Vibrazione XInput
RUMBLE_HINT=Abilita la vibrazione durante una nota a scorrimento a catena.
XINPUT_RUMBLE_INTENSITY_LEFT_NAME=Intensità motore sinistro:
XINPUT_RUMBLE_INTENSITY_LEFT_HINT=Predefinita: 8000\nMassima: 65535.
XINPUT_RUMBLE_INTENSITY_RIGHT_NAME=Intensità motore destro:
XINPUT_RUMBLE_INTENSITY_RIGHT_HINT=Predefinita: 4000\nMassima:65535.
XINPUT_PREFERRED_NAME=Controller XInput pref.:
XINPUT_PREFERRED_HINT=Imposta il controller XInput preferito.\nSe non è disponibile, verrà utilizzato il prossimo controller collegato.
HARDWARE_SLIDER_NAME=Usa slider hardware
HARDWARE_SLIDER_HINT=Abilitare se si utilizza uno slider arcade fisico.\n(impostare lo slider sulla porta COM11)
PREVENT_DATA_DELETION_NAME=Impedisci cancellazione dati
PREVENT_DATA_DELETION_HINT=Impedisce al gioco di cancellare file.
COMMAND_LINE_NAME=Linea di comando:
COMMAND_LINE_HINT=Permette di passare argomenti della riga di comando al gioco quando si usa il launcher.\nNon ha effetto se il launcher è disabilitato.
USE_DIVAHOOK_BAT_NAME=Usa divahook.bat/start.bat
USE_DIVAHOOK_BAT_HINT=Avvia "divahook.bat" o "start.bat" invece di "diva.exe".
DARK_LAUNCHER_NAME=Tema scuro
DARK_LAUNCHER_HINT=Imposta il tema scuro nel launcher.
LAUNCHER_LANGUAGE_NAME=Lingua del launcher:
LAUNCHER_LANGUAGE_HINT=Imposta la lingua del launcher.
NO_GPU_DIALOG_NAME=Disabilita avviso GPU
NO_GPU_DIALOG_HINT=Disabilita i messaggi di avviso per le GPU non supportate.
QUICK_START_DIVAHOOK_SAME_TIME="Avvio rapido" e "Usa divahook.bat/start.bat" non possono essere abilitati contemporaneamente.
NO_DIVAHOOK_BAT=divahook.bat/start.bat non trovato.\nIl gioco si avvierà normalmente/non in linea.\n\nNOTA: Disabilitare "Usa divahook.bat/start.bat" per rimuovere questo avviso.
# player data
PLAYER_NAME_NAME=Nome giocatore:
PLAYER_NAME_HINT=Nome del giocatore all'interno del gioco.
LEVEL_NAME_NAME=Nome livello:
LEVEL_NAME_HINT=Nome del livello (targhetta) nel gioco.
LEVEL_PLATE_ID_NAME=Targhetta:
LEVEL_PLATE_ID_HINT=Imposta l'immagine del livello (targhetta) del giocatore.
LEVEL_PLATE_EFFECT_NAME=Effetto targhetta:
LEVEL_PLATE_EFFECT_HINT=Imposta l'effetto sulla targhetta del giocatore.
SKIN_EQUIP_NAME=Skin:
SKIN_EQUIP_HINT=Imposta la skin (stile dell'interfaccia) del gioco.
BTN_SE_EQUIP_NAME=Suono pulsanti:
BTN_SE_EQUIP_HINT=Imposta l'effetto sonoro per i pulsanti.\n\n-1 = predefinito della canzone
SLIDE_SE_EQUIP_NAME=Suono scorrimento:
SLIDE_SE_EQUIP_HINT=Imposta l'effetto sonoro per le note a scorrimento.\n\n-1 = predefinito della canzone
CHAINSLIDE_SE_EQUIP_NAME=Suono catena:
CHAINSLIDE_SE_EQUIP_HINT=Imposta l'effetto sonoro per le note a scorrimento a catena.\n\n-1 = predefinito della canzone
SLIDERTOUCH_SE_EQUIP_NAME=Suono tocco slider:
SLIDERTOUCH_SE_EQUIP_HINT=Imposta l'effetto sonoro riprodotto quando si tocca lo slider senza note.\n\n-1 = predefinito della canzone
ACT_TOGGLE_NAME=Suoni dei pulsanti
ACT_TOGGLE_HINT=Abilita gli effetti sonori dei pulsanti e dello slider.
BORDER_GREAT_NAME=Soglia Great
BORDER_GREAT_HINT=Mostra quanto manca per ottenere la classifica Great (Ottimo) nella barra del progresso.
BORDER_EXCELLENT_NAME=Soglia Excellent
BORDER_EXCELLENT_HINT=Mostra quanto manca per ottenere la classifica Excellent (Eccellente) nella barra del progresso.
BORDER_RIVAL_NAME=Soglia Rival
BORDER_RIVAL_HINT=Mostra quanto manca per battere il rivale nella barra del progresso.
USE_CARD_NAME=Usa scheda
USE_CARD_HINT=Abilita le funzioni della scheda elettronica. Permette di selezionare i moduli.
MODULE_CARD_WORKAROUND_NAME=Workaround selezione moduli
MODULE_CARD_WORKAROUND_HINT=Permette di selezionare i moduli senza scheda e tenta di migliorare le prestazioni nel menu.\n(BETA)
USE_PV_MODULE_EQUIP_NAME=Moduli specifici per canzone
USE_PV_MODULE_EQUIP_HINT=Permette di salvare le preferenze dei moduli separatemente per ogni canzone.
USE_PV_SKIN_EQUIP_NAME=Skin specifiche per canzone
USE_PV_SKIN_EQUIP_HINT=Permette di salvare le preferenze delle skin separatemente per ogni canzone.\nValori memorizzati in skins.ini
USE_PV_SFX_EQUIP_NAME=Effetti sonori specifici per canzone
USE_PV_SFX_EQUIP_HINT=Permette di salvare le preferenze degli effetti sonori separatemente per ogni canzone.\nValori memorizzati in sfx.ini
GAMEMODE_OPTIONS_NAME=Modificatori di gioco
GAMEMODE_OPTIONS_HINT=Permette di usare i modificatori di gioco (note rapide, note nascoste, e note improvvise).
# components
INPUT_EMULATOR_NAME=Emulatore input
INPUT_EMULATOR_HINT=Emula l'input utilizzando tastiera e/o mouse.
TOUCH_SLIDER_EMULATOR_NAME=Emulatore slider
TOUCH_SLIDER_EMULATOR_HINT=Emula gli slider utilizzando tastiera e/o mouse.
TOUCH_PANEL_EMULATOR_NAME=Emulatore schermo tattile
TOUCH_PANEL_EMULATOR_HINT=Emula i tocchi sullo schermo con il mouse.
PLAYER_DATA_MANAGER_NAME=Gestore dati giocatore
PLAYER_DATA_MANAGER_HINT=Carica valori definiti dall'utente nella struttura PlayerData.\nNecessario per i moduli e i modificatori di gioco.
FRAME_RATE_MANAGER_NAME=Gestore frequenza fotogrammi
FRAME_RATE_MANAGER_HINT=Regola la velocità delle animazioni al variare della frequenza dei fotogrammi.\nNecessario solo se la frequenza dei fotogrammi non è fissa a 60.
FAST_LOADER_NAME=Velocizzatore avvio
FAST_LOADER_HINT=Salta o velocizza alcuni passaggi all'avvio non necessari.
FAST_LOADER_SPEED_NAME=Velocità di avvio
FAST_LOADER_SPEED_HINT=Usare 4 o inferiore quando si gioca online.\nPredefinita: 39
CAMERA_CONTROLLER_NAME=Controller telecamera
CAMERA_CONTROLLER_HINT=Abilita la telecamera libera (premendo F3).\nWASD per spostarsi, Barra spaziatrice/CTRL per salire/scendere, Q/R per ruotare la visuale, R/F per l'ingrandimento.\nTenere premuto SHIFT/ALT per cambiare la velocità.
SCALE_COMPONENT_NAME=Scalatura
SCALE_COMPONENT_HINT=Aumenta o riduce le dimensioni del framebuffer di uscita della grafica per riempire lo schermo o la finestra.
DEBUG_COMPONENT_NAME=Componente di debug
DEBUG_COMPONENT_HINT=Permette di cambiare lo stato del gioco (tasti F4-F8), usare l'interfaccia e i test per sviluppatori, e velocizzare animazioni e menu 2D (tenendo premuti SHIFT+TAB).
TARGET_INSPECTOR_NAME=Analizzatore bersagli
TARGET_INSPECTOR_HINT=Permette di trasferire le note mantenute.
SCORE_SAVER_NAME=Salvapunti
SCORE_SAVER_HINT=Salva i record in plugins_config/scores.ini.
PAUSE_NAME=Pausa
PAUSE_HINT=Aggiunge un menu di pausa.
#plugins
CONFIG=Configura
###############################################
# ui
# dialog
CONFIRM_SAVE_SETTINGS=Salvare le impostazioni?
CONFIRM_DISCORD_OR_GUIDE=Aprire il manuale per la risoluzione di problemi?
HOWTO_CLEAN_INSTALL=Come fare un'installazione pulita
HOWTO_CLEAN_INSTALL_HINT=Cancellare:\n- dnsapi.dll o dinput8.dll\n- patches/\n- plugins/\n- plugins_config/\n\nRipristinare:\n- glut32.dll\n\nDopodiché installare PD Loader dal repository ufficiale.
# gpu
GPU_WINE_DISABLE_MOVIES=(disattivare i video!)
GPU_INFO_NAME=Informazioni GPU:
GPU_AMD_NOVIDIA_NAME=Problemi: Supporto GPU AMD non ufficiale.
GPU_AMD_NOVIDIA_HINT=Le GPU AMD non sono supportate senza mod.\nNovidia sembra essere installato, ma si ricorda che potrebbe avere dei problemi.
GPU_AMD_NAME=Problemi: Mod compatibilità AMD richiesta!
GPU_AMD_HINT=Le GPU AMD non sono supportate senza mod.\nNovidia può essere usato per far funzionare il rendering 3D.\n\nSe si sta utilizzando un portatile con una GPU NVIDIA e si desidera utilizzarla invece della GPU rilevata, potrebbe essere necessario impostare diva.exe in modo che venga utilizzata nelle impostazioni di Windows o nel Pannello di controllo NVIDIA.
GPU_UNSUPPORTED_NAME=Problemi: GPU NON SUPPORTATA!
GPU_UNSUPPORTED_HINT=La GPU in uso non è supportata. Sono consigliate solo le GPU NVIDIA (tuttavia, le GPU AMD possono essere utilizzate con le mod).\nSi prega di usare una GPU NVIDIA serie GTX 600 o più recente.\n\nSe si sta utilizzando un portatile con una GPU NVIDIA e si desidera utilizzarla invece della GPU rilevata, potrebbe essere necessario impostare diva.exe in modo che venga utilizzata nelle impostazioni di Windows o nel Pannello di controllo NVIDIA.
GPU_GA_NAME=Problemi: GPU Ampere rilevata! Possibile rummore.\n(Fare clic per maggiori informazioni)
GPU_GA_HINT=Su GPU Ampere (GTX RTX 30xx), alcuni shader importanti dei personaggi hanno problemi che causano rumori e linee.\nAssicurarsi che il plugin ShaderPatch sia abilitato.
GPU_TU_NAME=Problemi: GPU Turing rilevata! Possibile rummore.\n(Fare clic per maggiori informazioni)
GPU_TU_HINT=Su GPU Turing (GTX 16xx/RTX 20xx), alcuni shader importanti dei personaggi hanno problemi che causano rumori e linee.\nAssicurarsi che il plugin ShaderPatch sia abilitato.
GPU_GM_NEWER_NAME=Problemi: Possibile rumore in alcuni scenari.\n(Fare clic per maggiori informazioni)
GPU_GM_NEWER_HINT=Su GPU Maxwell (~GTX 900) e più recenti, alcuni shader degli scenari creano rumore.\nAssicurarsi che il plugin ShaderPatch sia abilitato.
GPU_GK_NAME=Problemi: Nessuno.
GPU_GK_HINT=La GPU in uso non dovrebbe avere problemi ad eseguire il gioco.
GPU_GF_DRIVER_OLD_NAME=Problemi: Driver troppo vecchio.
GPU_GF_DRIVER_OLD_HINT=La GPU in uso dovrebbe poter eseguire correttamente il gioco, ma sembra che la versione di OpenGL sia troppo vecchia.\nUn aggiornamento del driver dovrebbe risolvere questo problema.
GPU_GF_NAME=Problemi: Nessun problema conosciuto.
GPU_GF_HINT=La GPU dovrebbe poter eseguire corretamente il gioco, ma è meno recente della GPU per la quale il gioco è stato progettato (GTX 650 Ti).\nPotrebbero esserci dei problemi con la grafica.\nSi prega di segnalare qualsiasi problema riscontrato in modo che possa essere analizzato e possibilmente risolto.
GPU_TOO_NEW_NAME=Problemi: GPU troppo recente!\n(Fare clic per maggiori informazioni)
GPU_TOO_NEW_HINT=Sembra che la GPU in uso sia troppo recente. Solo le GPU fino a Turing (RTX 30xx) sono attualmente supportate.\nBuone notizie: il gioco dovrebbe funzionare, ma le patch degli shader (probabilmente necessarie) potrebbero non essere ancora in grado di supportarla.\nProbabilmente saranno visibili rumori e linee su shader importanti dei personaggi e del rumore minimo in alcuni shader degli scenari.\nSi prega di segnalare qualsiasi problema riscontrato affinché ShaderPatch venga aggiornato.\nÈ inoltre possibile specificare manualmente il tipo della GPU.
GPU_OLD_NAME=Problemi: GPU troppo vecchia! Possibili problemi di rendering 3D.\n(Fare clic per maggiori informazioni)
GPU_OLD_HINT=La GPU in uso è troppo vecchia e non supporta le tecniche di rendering utilizzate dal gioco.\nPotrebbe essere possibile giocare, ma la grafica potrebbe avere problemi considerevoli.\nSi prega di aggiornare a una GPU serie GTX 600 o più recente.
GPU_UNKNOWN_NAME=Problemi: Impossibile rilevare tipo GPU.\n(Fare clic per maggiori informazioni)
GPU_UNKNOWN_HINT=Sembra che la GPU in uso sia NVIDIA, ma non è stato possibile determinarne l'architettura (tipo).\nPotrebbe trattarsi di un bug, ma è probabile che ci siano dei problemi.\nAssicurarsi di avere una GPU serie GTX 600 o più recente (anche le serie GTX 400 e più recenti dovrebbero funzionare).
GPU_DRIVER_ISSUES_NAME=Il driver presenta problemi conosciuti.
GPU_DRIVER_ISSUES_HINT=Il driver in uso presenta dei problemi conosciuti. Si prega di installare l'ultima versione del driver dal sito web del produttore della GPU in uso.
SHOW_GPU_DIALOG_HINT=È possibile disattivare questo messaggio dalla scheda Opzioni.
@@ -0,0 +1,290 @@
###############################################
# framework
LANG_AUTO=自動
en=英語
zh-Hans=中国語(簡体字)
pt-BR=ポルトガル語
it-IT=イタリア語
ja-JP=日本語
# display
DISPLAY_NAME=ディスプレイ:
DISPLAY_HINT=画面のモードを設定する。\n\n\nFast: ポップアップボーダーレスのウィンドウ (Windows 10/11のフルスクリーン最適機能が有効になっている場合、スクリーンショットに問題が生じる可能性があります)\n\nExclusive: 画面を制御して、解像度やリフレッシュレートを変更することができます。アプリケーションの切り替えが難しくなります\n\nSafe: ボーダーレスのシンプルなウィンドウです。「速い」に比べると少しラグがありますが、問題が少ない
RESOLUTION_NAME=画面解像度:
RESOLUTION_HINT=ディスプレイの解像度を設定する
REFRESHRATE_NAME=リフレッシュレート:
REFRESHRATE_HINT=ディスプレイのリフレッシュレートの設定
R.ENABLE_NAME=イネーブル
R.ENABLE_HINT=カスタム内部解像度を有効または無効にする
R.RESOLUTION_NAME=解像度:
R.RESOLUTION_HINT=内部の解像度を設定する(1280x720代わりに)
MATCH_WINDOW=ウィンドウをマッチ
MATCH_SCREEN=画面をマッチ
# graphics
MODEL_NAME=NVIDIA GPU:
MODEL_HINT=お使いのNVIDIA GPUのアーキテクチャを選択して、必要な回避策を適用して。\n\n注:自動検出は現在GNU/Linuxでは動作しません
MODEL_AUTOMATIC=自動
TAA_NAME=TAA
TAA_HINT=Temporal Anti-Aliasing
MLAA_NAME=MLAA
MLAA_HINT=Morphological Anti-Aliasing
MAG_NAME=フィルター:
MAG_HINT=イメージフィルターです。\n\nBilinear: デフォルトフィルタ\nNearest-neighbor: 最もシャープだが、ブロッキー\nSharpen: シャープフィルター\nCone: スムーズフィルター
MAG_BILINEAR=バイリニア (Bilinear)
MAG_NEAREST=ニアレストネイバー (Nearest-neighbor)
MAG_SHARPEN=シャープ (Sharpen)
MAG_CONE=コーン (Cone)
DOF_NAME=Depth of Field
DOF_HINT=背景をぼかする。パフォーマンスを向上させるためには無効にして
REFLECTIONS_NAME=反射
REFLECTIONS_HINT=反射を有効にするか無効にする
REFLECT_RES_WIDTH_NAME=反射の解像度:
REFLECT_RES_WIDTH_HINT=リフレクションバッファの解像度を設定する(512x256代わりに)
REFRACT_RES_WIDTH_NAME=屈折の解像度:
REFRACT_RES_WIDTH_HINT=屈折バッファの解像度を設定する(512x256代わりに)
GAMMA_NAME=Gamma:
GAMMA_HINT=影を濃くしたい場合は、この値を大きくする。\n125に設定すると、コンソールのようなゲーム体験ができます。\n\nデフォルト値: 100
SHADOWS_NAME=影
SHADOWS_HINT=影の有効、無効にする
PUNCHTHROUGH_NAME=透過メッシュ
PUNCHTHROUGH_HINT=透過メッシュを表示する
GLARE_NAME=グレア (Glare)
GLARE_HINT=グレアを有効または無効にする
SHADER_NAME=シェーダー (Shader)
SHADER_HINT=高品質なシェーダーを有効または無効にする
NPR1_NAME=Toon (F9):
NPR1_HINT=NPR1シェーダー\n\nF9を押してオン/オフを切り替え
2D_NAME=3Dレンダリングを無効にする
2D_HINT=全ての3Dパスを無効にする。\n\n警告:「データ消去を防止」が有効になっていないと、Extended Dataが削除されます。インテル製GPUの場合はこのオプション有効にせず、代わりに「Extended Dataを無効」を有効にしてください
# options
KEYBOARD_CONTROLLER_CONFIGURATION=キーボードとコントローラーの設定
Default=デフォルト
Force on=強制的に「有効」にする
Force off=強制的に「無効」にする
SECTION_LOADER=ローダー
SECTION_COMPATIBILITY=互換性
SECTION_PV_SELECTOR=PVセレクター
SECTION_ESM=ステージ (曲)
SECTION_UI_ELM=UI要素
SECTION_PV_PATCHES=PVパッチ
SECTION_FRAMERATE=Framerate
SECTION_CONTROLLER_OPTIONS=コントローラーの設定
SECTION_LAUNCHER=Launcher
BUILTIN_PATCHES_NAME=内蔵パッチを有効にする
BUILTIN_PATCHES_HINT=このタブのオプションを含む、内蔵パッチを有効にします
CUSTOM_PATCHES_NAME=カスタムパッチを有効にする
CUSTOM_PATCHES_HINT=すべてのカスタムパッチを有効にします
BUILTIN_RENDER_NAME=内蔵のレンダーパッチを有効にする
BUILTIN_RENDER_HINT=これにより、内蔵のレンダリングパッチが有効になります
NO_MOVIES_NAME=動画を無効にする
NO_MOVIES_HINT=ムービーを無効にする (特定のPVをロードする際にゲームがフリーズする場合は、このオプションを有効にしてください)
CURSOR_NAME=カーソル
CURSOR_HINT=マウスカーソルの有効、無効を行います
STEREO_NAME=Stereo
STEREO_HINT=オーディオチャンネル数を4から2に変更 (Diva Soundを使用しない場合)
QUICK_START_NAME=Quick Start:
Disabled=無効
Guest=ゲスト
Guest + Normal=ゲスト+ノーマル
QUICK_START_HINT=一つまたは複数のメニューをスキップします
NO_SCROLLING_SFX_NAME=スクロールSFXを無効にする
NO_SCROLLING_SFX_HINT=「スクロール」の効果音を無効にします
SING_MISSED_NAME=ミスした音を歌う
SING_MISSED_HINT=ミスした音を歌う
HIDE_VOLUME_NAME=ボリュームボタンを隠す
HIDE_VOLUME_HINT=ボリュームとSEボタンを隠す
NO_PV_UI_NAME=PV UIを無効にする
NO_PV_UI_HINT=PV再生時のフォトコントロールを解除します
HIDE_PV_WATERMARK_NAME=PVウォーターマークを隠す
HIDE_PV_WATERMARK_HINT=PV再生モードで通常表示されるウォーターマークを隠すことができます
STATUS_ICONS_NAME=右上のネットワークアイコン:
STATUS_ICONS_HINT=カードリーダーとネットワークのステータスアイコンの状態を設定します
Hidden=隠し
Error=エラー
Partial OK=部分的にOK
NO_LYRICS_NAME=歌詞を無効にする
NO_LYRICS_HINT=歌詞の表示を無効にします
NO_ERROR_NAME=エラーバナーを無効にする
NO_ERROR_HINT=アトラクット画面のエラーバナーを無効にします
ALLOWCUSTOMFREEPLAY_NAME=カスタムテキストを有効にする
ALLOWCUSTOMFREEPLAY_HINT=プラグインやパッチで「FREE PLAY」や「CREDIT(S)」を変更することができます
HIDE_FREEPLAY_NAME=「FREE PLAY」/「CREDIT(S)」を隠す
HIDE_FREEPLAY_HINT=「FREE PLAY」/「CREDIT(S)」テキストを隠す
PDLOADERTEXT_NAME=PD Loader FREE PLAY
PDLOADERTEXT_HINT=「FREE PLAY」の代わりに「PD Loader」と表示する
NO_TIMER_NAME=タイマーを一時停止する
NO_TIMER_HINT=タイマーを無効にします
NO_TIMER_SPRITE_NAME=タイマースプライトを無効にする
NO_TIMER_SPRITE_HINT=タイマースプライトを無効にします
NO_MESSAGE_BAR_NAME=メッセージバーを隠す
NO_MESSAGE_BAR_HINT=上部のメッセージバーを隠す
NO_STAGE_TEXT_NAME=ステージテキストを無効にする
NO_STAGE_TEXT_HINT=Stage 1/2/Finalを無効にする
UNLOCK_PSEUDO_NAME=「PSEUDO」モジュールをアンロックする(未完了)
UNLOCK_PSEUDO_HINT=どのようなPVでも、どのようなパフォーマーででも演奏できるようになります。\n(不完全なので、おすすめのモジュールはミクになります)
CARD_NAME=アンロックカードメニュー (未完了)
CARD_HINT=カードメニューを有効にします。\n(不完全なので、カードプロンプトを回避することはできません)
NO_OPD_NAME=Extended Dataを無効
NO_OPD_HINT=別名Skythの 「No Osage Play Data」 パッチ。\n\nスペースを節約するために、エディットで定義済みのフィジックスを無効にします。\n一部のエディットのフィジクスが乱れる場合があります
DWGUI_SCALING_NAME=デバッグウィンドウを拡大
DWGUI_SCALING_HINT=別名somewhatlurkerの 「dwgui」 パッチ。\n\nHDの内部解像度以上にデバッグウィンドウを大きくする
FREEPLAY_NAME=FREE PLAY
FREEPLAY_HINT=「CREDIT(S)」の代わりに「FREE PLAY」と表示され、クレジットを要求しなくなります
FPS.LIMIT.LIGHTMODE_NAME=軽量のリミッターを使用
FPS.LIMIT.LIGHTMODE_HINT=FPSリミッターのCPU使用量を少なくします。\nパフォーマンスが安定しない場合があります
FPS.LIMIT_NAME=FPSの制限:
FPS.LIMIT_HINT=フレームレートの制限を設定できます。1に設定すると、フレームレートの制限が解除されます
FRM.MOTION.RATE_NAME=FRM モーションのレート:
FRM.MOTION.RATE_HINT=フレーム・レート・マニジャーのコンポーネントのモーションレート(FPS)を設定します。\nより大きな値を設定すると、よりスムーズになりますが、CPUからより多くのエネルギーを必要とするため、不安定になる可能性があります
AUTOPAUSE_NAME=自動的に一時停止する
AUTOPAUSE_HINT=ゲームのウィンドウのフォーカスが失われたときに一時停止します
RUMBLE_NAME=XInputのランブル
RUMBLE_HINT=チェンスライド時のランブルを有効にします
XINPUT_RUMBLE_INTENSITY_LEFT_NAME=左モーターの強さ
XINPUT_RUMBLE_INTENSITY_LEFT_HINT=デフォルト: 8000
XINPUT_RUMBLE_INTENSITY_RIGHT_NAME=右モーターの強さ
XINPUT_RUMBLE_INTENSITY_RIGHT_HINT=デフォルト: 4000
XINPUT_PREFERRED_NAME=優先的なXInputコントローラ:
XINPUT_PREFERRED_HINT=優先的なXInputのコントローラを設定します。\n利用できない場合は、次に接続されたコントローラが使用されます
HARDWARE_SLIDER_NAME=ハードウェアスライドを使う
HARDWARE_SLIDER_HINT=リアルのアーケードスライドーを使用する場合は有効にしてください。\n(スライドをCOM11ポートに設定した場合)
PREVENT_DATA_DELETION_NAME=データ消去を防止
PREVENT_DATA_DELETION_HINT=ゲームのファイルを削除することを防ぎます
COMMAND_LINE_NAME=コマンド・ライン:
COMMAND_LINE_HINT=ランチャーを使用する際に、ゲームのコマンド・ライン引数を設定できます。\nランチャーを無効にすると、この問題は回避されます
USE_DIVAHOOK_BAT_NAME=divahook.bat/start.bat
USE_DIVAHOOK_BAT_HINT=diva.exeではなく、divahook.batまたはstart.batを起動します
DARK_LAUNCHER_NAME=ダーク・ランチャー
DARK_LAUNCHER_HINT=ランチャーのカラースキームを「ダーク」に設定します
LAUNCHER_LANGUAGE_NAME=言語:
LAUNCHER_LANGUAGE_HINT=ランチャーの言語を設定します
NO_GPU_DIALOG_NAME=GPU警告を無効にする
NO_GPU_DIALOG_HINT=サポートされていないGPUの警告ダイアログを無効にします
QUICK_START_DIVAHOOK_SAME_TIME=「Quick Start」と「divahook.bat/start.batを使う」を同時に有効にすることはできません
NO_DIVAHOOK_BAT=divahook.bat/start.batが見つかりません。\nゲームは通常/オフラインで開始されます。\n\n注:この警告を避けるために、「divahook.bat/start.batを使う」を無効にしてください
# player data
PLAYER_NAME_NAME=プレーヤー名:
PLAYER_NAME_HINT=ゲーム中に表示されるプレイヤー名
LEVEL_NAME_NAME=レベル名:
LEVEL_NAME_HINT=ゲーム中に表示されるレベル(プレート)名
LEVEL_PLATE_ID_NAME=レベルプレート:
LEVEL_PLATE_ID_HINT=レベルの背景画像(プレート)を設定します
LEVEL_PLATE_EFFECT_NAME=レベルプレートの効果:
LEVEL_PLATE_EFFECT_HINT=レベルの背景画像(プレート)に対する効果を設定します
SKIN_EQUIP_NAME=スキン:
SKIN_EQUIP_HINT=ゲームプレイのUIスキンを設定します。
BTN_SE_EQUIP_NAME=ボタンの音:
BTN_SE_EQUIP_HINT=ボタンの効果音を設定します。\n\n-1 = 曲のデフォルト
SLIDE_SE_EQUIP_NAME=スライドの音:
SLIDE_SE_EQUIP_HINT=スライドの効果音を設定します。\n\n-1 = 曲のデフォルト
CHAINSLIDE_SE_EQUIP_NAME=チェーンスライドの音:
CHAINSLIDE_SE_EQUIP_HINT=チェーンスライドの効果音を設定します。\n\n-1 = 曲のデフォルト
SLIDERTOUCH_SE_EQUIP_NAME=スライダー・タッチの音:
SLIDERTOUCH_SE_EQUIP_HINT=音符がない状態でスライドをタッチしたときの効果音を設定します。\n\n-1 = 曲のデフォルト
ACT_TOGGLE_NAME=ボタンの効果音
ACT_TOGGLE_HINT=ボタン/スライドの音を有効にします
BORDER_GREAT_NAME=Great (クリアボーダー)
BORDER_GREAT_HINT=プログレスバーに「Great」評価のクリアボーダーを表示します
BORDER_EXCELLENT_NAME=Excellent (クリアボーダー)
BORDER_EXCELLENT_HINT=プログレスバーに「Excellent」の評価を示す透明な枠を表示します
BORDER_RIVAL_NAME=Rival (クリアボーダー)
BORDER_RIVAL_HINT=プログレスバーでライバルに勝つための明確なボーダーを表示します
USE_CARD_NAME=カードを使う
USE_CARD_HINT=ICカードを有効にします。これにより、モジュールの選択が可能になります
MODULE_CARD_WORKAROUND_NAME=モジュール選択の回避策
MODULE_CARD_WORKAROUND_HINT=カードなしでのモジュール選択を可能にし、メニューのパフォーマンスを向上させようとしています。\n(BETA)
USE_PV_MODULE_EQUIP_NAME=曲に特化したモジュール
USE_PV_MODULE_EQUIP_HINT=曲ごとにモジュールを選択できます
USE_PV_SKIN_EQUIP_NAME=曲別のスキン
USE_PV_SKIN_EQUIP_HINT=曲ごとのスキン設定を可能にします。\n値はskins.iniに格納されています
USE_PV_SFX_EQUIP_NAME=曲別の効果音
USE_PV_SFX_EQUIP_HINT=曲ごとの効果音を設定できます。\n値はsfx.iniに格納されています
GAMEMODE_OPTIONS_NAME=リズム・ゲーム・オプション
GAMEMODE_OPTIONS_HINT=リズム・ゲーム・オプションの使用が可能になります (hi-speed、 hidden、 とsudden
# components
INPUT_EMULATOR_NAME=入力のエミュレータ
INPUT_EMULATOR_HINT=キーボードやマウスによる入力をエミュレートします
TOUCH_SLIDER_EMULATOR_NAME=スライドエミュレータ
TOUCH_SLIDER_EMULATOR_HINT=キーボードやマウスでスライドをエミュレートします
TOUCH_PANEL_EMULATOR_NAME=タッチパネルのエミュレータ
TOUCH_PANEL_EMULATOR_HINT=タッチパネルをマウスでエミュレートします
PLAYER_DATA_MANAGER_NAME=プレーヤー・データ・マネージャー
PLAYER_DATA_MANAGER_HINT=ユーザーに定義の値をPlayerData構造体にロードします。\nモジュールとリズム・ゲーム・オプションに必要
FRAME_RATE_MANAGER_NAME=フレーム・レート・マニジャー
FRAME_RATE_MANAGER_HINT=異なるフレームレートでのアニメーションを正しい速度に調整します。\nFPSが60に固定されていない場合のみ必要
FAST_LOADER_NAME=速いローダー
FAST_LOADER_HINT=不要な読み込みステップをスキップまたは高速化します
FAST_LOADER_SPEED_NAME=速いローダーのスピード:
FAST_LOADER_SPEED_HINT=オンライン対戦では4以下に設定してください。\nデフォルト: 39
CAMERA_CONTROLLER_NAME=カメラの制御
CAMERA_CONTROLLER_HINT=フリーキャムを有効にする (F3でトグル).\nWASDで移動、SPACE/CTRLで上下、Q/Rでカメラの回転、R/Fでズーム。\nSHIFT/ALTを押しながらだと、移動速度が変わります
SCALE_COMPONENT_NAME=スケール・コンポーネント
SCALE_COMPONENT_HINT=グラフィックス出力のフレームバッファを、画面/ウィンドウいっぱいになるようにスケーリングします
DEBUG_COMPONENT_NAME=ディーバグ・コンポーネント
DEBUG_COMPONENT_HINT=ゲームの状態を変えることができますになる (F4-F8キー)、 devのGUIとテストを使用し、2Dアニメーション/メニューを高速化(SHIFT+TABを押しながら)
TARGET_INSPECTOR_NAME=ターゲットインスペクター
TARGET_INSPECTOR_HINT=HOLD転送を有効にします
SCORE_SAVER_NAME=スコー・セーバー
SCORE_SAVER_HINT=ハイスコアをplugins_config/scores.iniに保存します
PAUSE_NAME=ポーズ
PAUSE_HINT=ポーズメニューを追加
#plugins
CONFIG=設定
###############################################
# ui
# dialog
CONFIRM_SAVE_SETTINGS=設定を保存しておきますか?
CONFIRM_DISCORD_OR_GUIDE=トラブルシューティングのためのユーザーガイドを読んでみませんか?
HOWTO_CLEAN_INSTALL=新規インストールの方法
HOWTO_CLEAN_INSTALL_HINT=- dnsapi.dllやdinput8.dll\n- patches/\n- plugins/\n- plugins_config/\n\nを削除\n\n- glut32.dll\nを復元\n\nその後、公式リポジトリからPD Loaderをインストールします
# gpu
GPU_WINE_DISABLE_MOVIES=(動画を無効にすることを忘れずに!)
GPU_INFO_NAME=GPU情報:
GPU_AMD_NOVIDIA_NAME=問題点: AMD GPUのサポートは非公式です
GPU_AMD_NOVIDIA_HINT=AMD製のGPUはモッドなしではサポートされません。\nNovidiaはインストールされているようですが、問題があるかもしれないので注意してください
GPU_AMD_NAME=問題点: AMDとの互換性を保つためにはモッドが必要です!
GPU_AMD_HINT=AMD製のGPUはモッドなしではサポートされません。\nNovidiaは、3Dレンダリング機能を持たせることができます。\n\nNVIDIA GPUを搭載したノートパソコンをお持ちで、検出されたGPUの代わりにNVIDIA GPUを使用したい場合は、Windowsの設定またはNVIDIA Control Panelでdiva.exeがそのGPUを使用するように設定する必要があります
GPU_UNSUPPORTED_NAME=問題点: サポートされていないGPU!
GPU_UNSUPPORTED_HINT=お使いのグラフィックカードはサポートされていません。NVIDIA社製のGPUのみを推奨します(ただし、モッドではAMD社製のGPUも使用可能です)。\nGPUはGTX600シリーズ以上のNVIDIA社製をご使用ください。\n\nNVIDIA GPUを搭載したノートパソコンをお持ちで、検出されたGPUの代わりにNVIDIA GPUを使用したい場合は、Windowsの設定またはNVIDIA Control Panelでdiva.exeがそのGPUを使用するように設定する必要があります
GPU_GA_NAME=問題点: AmpereのGPUを検出しました!騒音が入る場合があります\n(クリックすると詳細が表示されます)
GPU_GA_HINT=AmpereのGPURTX 30xx)において、一部の重要なキャラクターシェーダーに問題があり、線や騒音が発生しました。\nShaderPatchプラグインが有効になっていることを確認してください
GPU_TU_NAME=問題点: AmpereのGPUを検出しました!騒音が入る場合があります\n(クリックすると詳細が表示されます)
GPU_TU_HINT=TuringのGPUs(GTX 16xx/RTX 20xx)において、一部の重要なキャラクターシェーダーに問題があり、線や騒音が発生しました。\nShaderPatchプラグインが有効になっていることを確認してください
GPU_GM_NEWER_NAME=問題点: 一部のステージで軽微な騒音が発生する場合があります\n(クリックすると詳細が表示されます)
GPU_GM_NEWER_HINT=MaxwellのGPUGTX900前後)以降では、一部のマイナーなステージシェーダーで騒音が発生します。\nShaderPatchプラグインが有効になっていることを確認してください
GPU_GK_NAME=問題点: なし
GPU_GK_HINT=お使いのGPUで問題なく動作するはずです
GPU_GF_DRIVER_OLD_NAME=問題点: ドライバーが古すぎる
GPU_GF_DRIVER_OLD_HINT=お使いのGPUはゲームを実行できるはずですが、OpenGLのバージョンが古すぎるようです。\nドライバのアップデートで解決するはずです
GPU_GF_NAME=問題点: 既知の問題はありません
GPU_GF_HINT=お使いのGPUで問題なく動作するはずですが、このゲームが本来想定していたGPU(GTX 650 Ti)よりも古いものです。\nグラフィックスに問題がある場合があります。\n問題があれば報告していただければ、分析して修正することができます
GPU_TOO_NEW_NAME=問題点: お使いGPUは新しすぎるかもしれません\n(クリックすると詳細が表示されます)
GPU_TOO_NEW_HINT=お使いのGPUが新しすぎるのではないかと思われます。現在はAmpere(RTX 30xx)までしか対応していません。\n朗報:ゲームは実行可能なはずですが、シェーダーパッチ(おそらく必要)がまだサポートされていないかもしれません。\n重要なキャラクターシェーダーや、いくつかのマイナーなステージシェーダーに線や騒音が出ることがあります。\nShaderPatchが更新されるように、問題があれば報告してください。\nまた、特定のGPUワークアラウンドタイプを強制的に使用することもできます
GPU_OLD_NAME=問題点: GPUが古すぎる。3Dレンダリングが機能していない可能性があります\n(クリックすると詳細が表示されます)
GPU_OLD_HINT=お使いのGPUが非常に古く、ゲームで使用されているレンダリング技術に対応していません。\nプレイはできるかもしれませんが、グラフィックには大きな問題があると思われます。\nGTX 600シリーズ以降のGPUにアップグレードしてください
GPU_UNKNOWN_NAME=問題点: GPUアーキテクチャを検出ができません。\n(クリックすると詳細が表示されます)
GPU_UNKNOWN_HINT=あなたはNVIDIA GPUをお持ちのようですが、GPUのアーキテクチャ(種類)を確認する際に何か問題が発生しました。\nバグによるものかもしれませんが、おそらく潜在的な問題を示しているものと思われます。\nGTX 600シリーズ以降のGPUをお持ちの方に限ります。(GTX 400シリーズ以降のGPUでも動作します。)
GPU_DRIVER_ISSUES_NAME=ドライバには既知の問題があります。
GPU_DRIVER_ISSUES_HINT=使用しているグラフィックドライバには既知の問題があります。GPUベンダーのWebサイトから最新のドライバをインストールしてください
SHOW_GPU_DIALOG_HINT=このメッセージは、 「Options」 タブで無効にすることができます
@@ -0,0 +1,291 @@
###############################################
# framework
LANG_AUTO=Auto
en=Inglês
zh-Hans=Chinês Simplificado
pt-BR=Português
it-IT=Italiano
ja-JP=Japonês
# display
DISPLAY_NAME=Modo de Exibição:
DISPLAY_HINT=Configura o modo de exibição da janela.\n\n\nRápido: Janela sem Bordas "pop-up" (pode causar problemas com capturas de tela se as Otimizações de Tela Cheia do Windows 10/11 estiverem ativadas).\n\nExclusivo: Toma o controle da tela e te permite alterar a resolução de exibição e a taxa de atualização. É mais difícil trocar de programas (minimizar, alt+tab...) nesse modo.\n\nSeguro: Janela sem bordas simples. Tem um pouco mais de latência do que o modo Rápido, mas também pode ter menos problemas.
Windowed=Modo Janela
Fast=Rápido
Exclusive=Exclusivo
Safe=Seguro
RESOLUTION_NAME=Resolução:
RESOLUTION_HINT=Configura a resolução de exibição.
REFRESHRATE_NAME=Taxa de Quadros:
REFRESHRATE_HINT=Configura a taxa de atualização.
R.ENABLE_NAME=Habilitar
R.ENABLE_HINT=Habilita ou desabilita a opção de Resolução Interna.
R.RESOLUTION_NAME=Resolução:
R.RESOLUTION_HINT=Configura a resolução interna (ao invés de 1280x720).
MATCH_WINDOW=Da Janela
MATCH_SCREEN=Da Tela
# graphics
MODEL_NAME=Arquitetura da GPU NVIDIA:
MODEL_HINT=Selecione a arquitetura da sua placa de vídeo NVIDIA para aplicar as correções necessárias.\n\nNota: "Detectar Automaticamente" não funciona em GNU/Linux.\n\nKepler: GT/X600, 700, 800M / Maxwell: GT/X700, 800m, 900 / Turing: RTX2000, GTX1600 / Ampere: RTX3000
MODEL_AUTOMATIC=Auto
TAA_NAME=TAA
TAA_HINT=Anti-Aliasing Temporal
MLAA_NAME=MLAA
MLAA_HINT=Anti-Aliasing Morfológico
MAG_NAME=Filtro:
MAG_HINT=Filtros de Imagem.\n\nBilinear: filtro padrão\nNearest-neighbour: mais nítido, mas com artefatos\nSharpen: nítido\nCone: suave
DOF_NAME=Profundidade de Campo
DOF_HINT=Aplica um efeito de Blur no cenário mais distante. Desative para melhorar a performance.
REFLECTIONS_NAME=Reflexos
REFLECTIONS_HINT=Habilita ou desabilita os reflexos.
REFLECT_RES_WIDTH_NAME=Res. dos Reflexos:
REFLECT_RES_WIDTH_HINT=Seleciona a resolução de buffer dos reflexos (ao invés de 512x256).
REFRACT_RES_WIDTH_NAME=Res. da Refração:
REFRACT_RES_WIDTH_HINT=Seleciona a resolução de buffer da Refração (ao invés de 512x256).
GAMMA_NAME=Gamma:
GAMMA_HINT=Aumente para deixar as sombras mais escuras.\nColoque em 125 para uma experiência parecida com a de consoles.\n\nPadrão: 100
SHADOWS_NAME=Sombras
SHADOWS_HINT=Habilita ou desabilita as sombras.
PUNCHTHROUGH_NAME=Malhas Transparentes
PUNCHTHROUGH_HINT=Mostrar as malhas transparentes.
GLARE_NAME=Glare
GLARE_HINT=Habilita ou desabilita o efeito de glare.
SHADER_NAME=Shader
SHADER_HINT=Habilita ou desabilita os shader de alta qualidade.
NPR1_NAME=Toon (F9):
NPR1_HINT=Shader NPR1\n\nPressione a tecla F9 para habilitar ou desabilitar.
2D_NAME=Desabilitar renderização 3D
2D_HINT=Desativa todas as passagens 3D.\n\nAviso: A menos que "Impedir Apagamento de Arquivos" esteja ligado, isso irá apagar os dados extendidos. Não ative em placas gráficas Intel, nesse caso, habilite "Desativar Dados Extendidos".
# options
KEYBOARD_CONTROLLER_CONFIGURATION=Configuração de Teclado/Controle
Default=Padrão
Force on=Forçar "Habilitado"
Force off=Forçar "Desabilitado"
SECTION_LOADER=Carregador
SECTION_COMPATIBILITY=Compatibilidade
SECTION_PV_SELECTOR=Seletor de PV
SECTION_ESM=Estágios (Músicas)
SECTION_UI_ELM=Elementos de IU
SECTION_PV_PATCHES=Patches para PV
SECTION_FRAMERATE=Taxa de Quadros
SECTION_CONTROLLER_OPTIONS=Opções de Controle/Joystick
SECTION_LAUNCHER=Lançador (Launcher)
BUILTIN_PATCHES_NAME=Habilitar Patches Nativos
BUILTIN_PATCHES_HINT=Habilita os patches nativos, incluindo as opções nesta aba.
CUSTOM_PATCHES_NAME=Habilitar Patches Externos
CUSTOM_PATCHES_HINT=Habilita todos os patches externos.
BUILTIN_RENDER_NAME=Habilitar o Renderizador Nativo
BUILTIN_RENDER_HINT=Habilita os patches para o renderizador nativo.
NO_MOVIES_NAME=Desabilitar Vídeos
NO_MOVIES_HINT=Desabilita os vídeos (ative essa opção caso seu jogo "carrega infinitamente" ao tentar jogar certas músicas).
CURSOR_NAME=Cursor do Mouse
CURSOR_HINT=Ativa ou desativa o cursor do mouse.
STEREO_NAME=Estéreo
STEREO_HINT=Use 2 canais de áudio ao invés de 4 (quando não estiver usando o DivaSound).
QUICK_START_NAME=Início Rápido:
QUICK_START_HINT=Pula um ou mais menus.
Disabled=Desativado
Guest=Hóspede
Guest + Normal=Hóspede + Normal
NO_SCROLLING_SFX_NAME=Desativar Som de Navegação
NO_SCROLLING_SFX_HINT=Desativa o som de navegação da lista de músicas.
SING_MISSED_NAME=Cantar Notas Perdidas
SING_MISSED_HINT=Os vocais não vão parar ao perder notas.
HIDE_VOLUME_NAME=Esconder Botões de Volume
HIDE_VOLUME_HINT=Esconde os botões de volume e volume dos efeitos de som.
NO_PV_UI_NAME=Desativar a interface de PV
NO_PV_UI_HINT=Esconde os botões de foto nos PVs.
HIDE_PV_WATERMARK_NAME=Esconder Marca D'Água
HIDE_PV_WATERMARK_HINT=Esconde a marca d'água que normalmente aparece ao assistir PVs.
STATUS_ICONS_NAME=Ícones de Rede:
STATUS_ICONS_HINT=Configura o estado dos ícones de rede e cartão (canto superior direito).
Hidden=Desabilitado
Error=Erro
OK=Funcionando
Partial OK=Funcionando com Erros
NO_LYRICS_NAME=Desativar Letras
NO_LYRICS_HINT=Desativa as letras das músicas (lyrics).
NO_ERROR_NAME=Desativar o Banner de Erro
NO_ERROR_HINT=Desativa o banner de erro na tela de "attract".
HIDE_FREEPLAY_NAME=Hide "FREE PLAY"/"CREDIT(S)"
HIDE_FREEPLAY_HINT=Esconde a linha "FREE PLAY"/"CREDIT(S)".
PDLOADERTEXT_NAME=PD Loader FREE PLAY
PDLOADERTEXT_HINT=Mostra "PD Loader" ao invés de "FREE PLAY".
ALLOWCUSTOMFREEPLAY_NAME=Permitir texto customizado
ALLOWCUSTOMFREEPLAY_HINT=Permite plugins e patches a mudar "FREE PLAY"/"CREDIT (S)".
NO_TIMER_NAME=Congelar o Temporizador
NO_TIMER_HINT=Congela/para o temporizador.
NO_TIMER_SPRITE_NAME=Desabilitar o Ícone do Temporizador
NO_TIMER_SPRITE_HINT=Desabilita o ícone do temporizador.
NO_MESSAGE_BAR_NAME=Esconder a Barra de Mensagens
NO_MESSAGE_BAR_HINT=Esconde a barra de mensagens superior.
NO_STAGE_TEXT_NAME=Desabilitar o Texto "Stage"
NO_STAGE_TEXT_HINT=Desabilita o texto "Stage 1/2/Final".
UNLOCK_PSEUDO_NAME=Desbloquear "PSEUDO" Módulos (incompleto)
UNLOCK_PSEUDO_HINT=Te permite jogar qualquer música com qualquer personagem.\n(Incompleto, os módulos recomendados serão padronizados para Hatsune Miku)
CARD_NAME=Desbloquear o Menu de Cartões (Incompleto)
CARD_HINT=Habilita o menu de cartões.\n(Incompleto, não ignora o jogo pedindo pelo cartão)
NO_OPD_NAME=Desativar Dados Extendidos
NO_OPD_HINT=Também conhecido como "Skyth's "No Osage Play Data" patch".\n\nDesabilita a física embutida nos estágios para salvar espaço de armazenamento.\nPode quebrar a física em alguns estágios.
DWGUI_SCALING_NAME=Escalar Janelas de Depuração
DWGUI_SCALING_HINT=Também conhecido como "somewhatlurker's dwgui patch".\n\nEscala as janelas de depuração (as deixa maiores) em resoluções maiores.
FREEPLAY_NAME=FREE PLAY
FREEPLAY_HINT=Mostra "FREE PLAY" ao invés de "CREDIT(S)" e faz com que o jogo não requira créditos.
FPS.LIMIT.LIGHTMODE_NAME=Usar o Limitador Leve
FPS.LIMIT.LIGHTMODE_HINT=Faz com que o limitador de taxa de quadros use menos CPU.\nPode deixar a performance inconsistente.
FPS.LIMIT_NAME=Limite de Taxa de Quadros
FPS.LIMIT_HINT=Te permite selecionar um limite para a taxa de quadros. Coloque em -1 para desligar o limitador.
FRM.MOTION.RATE_NAME=Taxa de Movimento do LTQ
FRM.MOTION.RATE_HINT=Seleciona a taxa dos movimentos para o componente "Limite de Taxa de Quadros".\nValores maiores os deixarão mais suaves, mas usam mais CPU e podem causar problemas (Padrão: 400).
AUTOPAUSE_NAME=Pausar Automaticamente
AUTOPAUSE_HINT=Pausar o jogo quando o foco da janela é perdido.
RUMBLE_NAME=Vibração do Controle (XInput)
RUMBLE_HINT=Liga ou desliga a vibração do controle em sliders (Apenas funciona em XInput).
XINPUT_RUMBLE_INTENSITY_LEFT_NAME=Força do Motor Esquerdo:
XINPUT_RUMBLE_INTENSITY_LEFT_HINT=Padrão: 8000\nMáximo: 65535.
XINPUT_RUMBLE_INTENSITY_RIGHT_NAME=Força do Motor Direito:
XINPUT_RUMBLE_INTENSITY_RIGHT_HINT=Padrão: 4000\nMáximo:65535.
XINPUT_PREFERRED_NAME=Controle XInput Preferido:
XINPUT_PREFERRED_HINT=Seleciona um controle específico (Apenas XInput).\nSe disponível, o próximo controle encontrado será usado.
HARDWARE_SLIDER_NAME=Usar Hardware para Sliders
HARDWARE_SLIDER_HINT=Ative esta opção caso esteja usando um slider de arcade.\n(configure o slider para se comunicar com a porta COM11)
PREVENT_DATA_DELETION_NAME=Impedir Apagamento de Arquivos
PREVENT_DATA_DELETION_HINT=Impede o jogo de apagar arquivos.
COMMAND_LINE_NAME=Terminal:
COMMAND_LINE_HINT=Permite enviar argumentos de terminal para a inicialização do jogo quando usando o lançador (launcher).\nDesativar o lançador (launcher) irá fazer com que essa linha seja ignorada.
USE_DIVAHOOK_BAT_NAME=Usar divahook.bat/start.bat
USE_DIVAHOOK_BAT_HINT=Inicia o "divahook.bat" ou o "start.bat" ao invés do "diva.exe".
DARK_LAUNCHER_NAME=Tema Escuro
DARK_LAUNCHER_HINT=Ativa o tema escuro do PD Loader.
LAUNCHER_LANGUAGE_NAME=Idioma do Lançador:
LAUNCHER_LANGUAGE_HINT=Seleciona o idioma do PD Loader.
NO_GPU_DIALOG_NAME=Desativar Avisos de GPU
NO_GPU_DIALOG_HINT=Desativa os avisos para placas de vídeo não suportadas.
QUICK_START_DIVAHOOK_SAME_TIME=Você não pode habilitar "Quick Start" e "Use divahook.bat/start.bat" ao mesmo tempo.
NO_DIVAHOOK_BAT=divahook.bat/start.bat não encontrado.\nO jogo vai começar normalmente/offline.\n\nAviso: Desligue "Usar divahook.bat/start.bat" para evitar esta mensagem.
# player data
PLAYER_NAME_NAME=Nome do Jogador:
PLAYER_NAME_HINT=Nome do jogador mostrado dentro do jogo.
LEVEL_NAME_NAME=Frase do jogador:
LEVEL_NAME_HINT=Frase mostrada no level plate dentro do jogo (mantenha essa linha pequena).
LEVEL_PLATE_ID_NAME=Level Plate:
LEVEL_PLATE_ID_HINT=Seleciona a imagem de fundo da frase do jogador (level plate).
LEVEL_PLATE_EFFECT_NAME=Efeitos para o Level Plate:
LEVEL_PLATE_EFFECT_HINT=Seleciona o efeito que aparecerá na imagem de fundo da frase do jogador (level plate).
SKIN_EQUIP_NAME=Skin:
SKIN_EQUIP_HINT=Seleciona a skin da área de jogo.
BTN_SE_EQUIP_NAME=Som dos Botões:
BTN_SE_EQUIP_HINT=Seleciona o efeito de som dos botões.\nDeixe em -1 para usar o som padrão de cada estágio.
SLIDE_SE_EQUIP_NAME=Som dos Slides:
SLIDE_SE_EQUIP_HINT=Seleciona o efeito de som dos sliders.\nDeixe em -1 para usar o som padrão de cada estágio.
CHAINSLIDE_SE_EQUIP_NAME=Som dos Slides Longos:
CHAINSLIDE_SE_EQUIP_HINT=Seleciona o efeito de som dos sliders longos (chain sliders).\nDeixe em -1 para usar o som padrão de cada estágio.
SLIDERTOUCH_SE_EQUIP_NAME=Som do Slide Touch:
SLIDERTOUCH_SE_EQUIP_HINT=Seleciona o efeito de som de quando se usa os sliders sem ter uma nota de slide na tela.\nDeixe em -1 para usar o som padrão de cada estágio.
ACT_TOGGLE_NAME=Sons dos Botões e Sliders
ACT_TOGGLE_HINT=Ativa ou desativa os sons dos botões e dos sliders.
BORDER_GREAT_NAME=Margem "Great"
BORDER_GREAT_HINT=Mostra uma margem na barra de progresso para uma classificação "Great".
BORDER_EXCELLENT_NAME=Margem "Excellent"
BORDER_EXCELLENT_HINT=Mostra uma margem na barra de progresso para uma classificação "Excellent".
BORDER_RIVAL_NAME=Margem "Rival"
BORDER_RIVAL_HINT=Mostra uma margem na barra de progresso para quando você derrota seu rival.
USE_CARD_NAME=Usar Cartão
USE_CARD_HINT=Ativa o "IC card". Isso permite a escolha de módulos (personagens).
MODULE_CARD_WORKAROUND_NAME=Otimizações do Seletor de Módulos
MODULE_CARD_WORKAROUND_HINT=Permite selecionar módulos (personagens) sem um cartão e tenta melhorar a performance\ndo menu de seleção de personagens.\n(BETA)
USE_PV_MODULE_EQUIP_NAME=Módulos Específicos para Músicas
USE_PV_MODULE_EQUIP_HINT=Permite selecionar módulos para cada música individualmente.
USE_PV_SKIN_EQUIP_NAME=Skins Específicos para Músicas
USE_PV_SKIN_EQUIP_HINT=Permite selecionar skins para cada música individualmente.\nValores acessados e armazenados em "skins.ini"
USE_PV_SFX_EQUIP_NAME=Efeitos de Som Espeíficos para Músicas
USE_PV_SFX_EQUIP_HINT=Permite selecionar efeitos de som para cada música individualmente.\nValores acessados e armazenados em "sfx.ini"
GAMEMODE_OPTIONS_NAME=Modificadores
GAMEMODE_OPTIONS_HINT=Permite usar os modificadores de jogo (hi-speed, hidden, and sudden).
# components
INPUT_EMULATOR_NAME=Emulador de Entrada
INPUT_EMULATOR_HINT=Emula comandos através de teclado e mouse.
TOUCH_SLIDER_EMULATOR_NAME=Emulador de Slider
TOUCH_SLIDER_EMULATOR_HINT=Emula sliders através de teclado e mouse.
TOUCH_PANEL_EMULATOR_NAME=Emulador de Painel Sensível a Toque
TOUCH_PANEL_EMULATOR_HINT=Emula o painel sensível a toque (touch panel) através do mouse.
PLAYER_DATA_MANAGER_NAME=Gerenciador de Dados do Jogador
PLAYER_DATA_MANAGER_HINT=Carrega valores definidos pelo jogador para o PlayerData struct.\nNecessário para módulos de modificadores.
FRAME_RATE_MANAGER_NAME=Limite de Taxa de Quadros
FRAME_RATE_MANAGER_HINT=Ajusta as animações para a velocidade correta em differentes taxas de quadros.\nApenas necessário quando a taxa de atualização não é 60.
FAST_LOADER_NAME=Carregador Rápido
FAST_LOADER_HINT=Pula ou acelera etapas de carregamentos desnecessários.
FAST_LOADER_SPEED_NAME=Velocidade do Carregador:
FAST_LOADER_SPEED_HINT=Configure isso para 4 ou menos quando for jogar online.\nPadrão: 39
CAMERA_CONTROLLER_NAME=Controle de Câmera
CAMERA_CONTROLLER_HINT=Habilita a câmera livre (ativado com a tecla "F3").\nUse WASD para mover, ESPAÇO/CTRL para cima/baixo, Q/R para rotação, R/F para aplicar zoom.\nSegurar SHIFT/ALT muda a velocidade.
SCALE_COMPONENT_NAME=Componente de Escala
SCALE_COMPONENT_HINT=Escala a imagem para preencher corretamente toda a janela/tela.
DEBUG_COMPONENT_NAME=Componente Depurador
DEBUG_COMPONENT_HINT=Permite mudar o estado do jogo (teclas "F4~F8"), usando interfaces e testes de desenvolvedor, e aumentar a velocidade de menus e elementos 2D (segurando SHIFT+TAB).
TARGET_INSPECTOR_NAME=Inspetor de Objetos
TARGET_INSPECTOR_HINT=Permite transferências de botões para objetos "HOLD".
SCORE_SAVER_NAME=Gerenciador de Pontuação
SCORE_SAVER_HINT=Salva as pontuações mais altas em "plugins_config/scores.ini".
PAUSE_NAME=Pausa
PAUSE_HINT=Adiciona um menu de pausa.
#plugins
CONFIG=Configurações
###############################################
# ui
# dialog
CONFIRM_SAVE_SETTINGS=Gostaria de salvar suas configurações?
CONFIRM_DISCORD_OR_GUIDE=Gostaria de ler o guia de usuário para resolução de problemas?
HOWTO_CLEAN_INSTALL=Como fazer uma instalação limpa
HOWTO_CLEAN_INSTALL_HINT=Apague:\n- dnsapi.dll ou dinput8.dll\n- patches/\n- plugins/\n- plugins_config/\n\nRestaure:\n- glut32.dll\n\nE então instale o PD Loader baixado do repositório oficial.
# gpu
GPU_WINE_DISABLE_MOVIES=(lembre-se de desativar os vídeos!)
GPU_INFO_NAME=Informações da Placa de Vídeo:
GPU_AMD_NOVIDIA_NAME=Aviso: Suporte para GPUs AMD não é oficial.
GPU_AMD_NOVIDIA_HINT=GPUs AMD não são suportadas sem mods.\nO Novidia parece estar instalado, mas tenha em mente que isso pode causar problemas.
GPU_AMD_NAME=Aviso: Mods necessários para compatibilidade com GPUs AMD!
GPU_AMD_HINT=GPUs AMD não são suportadas sem mods.\nO Novidia pode ser usado para fazer a renderização 3D funcionar. \n\nSe você tem um laptop com uma GPU NVIDIA e deseja usar ela ao invés da GPU detectada, você pode precisar configurar o "diva.exe" para poder usa-la nas configurações do Windows ou no Painel de Controle da NVIDIA.
GPU_UNSUPPORTED_NAME=Aviso: GPU NÃO SUPORTADA!
GPU_UNSUPPORTED_HINT=Sua placa de vídeo não é suportada. Apenas GPUs NVIDIA são recomendadas (porém placas de vídeo AMD podem ser usadas com a adição de mods).\nPor favor use uma placa de vídeo NVIDIA da série GTX 600 ou mais recente.\n\nSe você tem um laptop com uma GPU NVIDIA e deseja usar ela ao invés da GPU detectada, você pode precisar configurar o "diva.exe" para poder usa-la nas configurações do Windows ou no Painel de Controle da NVIDIA.\n\nJogadores com outras GPUs podem conseguir rodar o jogo com a adição de mods ou plugins, mas os elementos 3D provavelmente não irão funcionar.
GPU_GA_NAME=Aviso: Arquitetura Ampere detectada! Possível aparecimento de ruído.\n(Clique aqui para mais informações)
GPU_GA_HINT=Em GPUs Ampere (GTX RTX 30xx), alguns shaders importantes dos personagens tem problemas, resultando em aparecimento de linhas/ruído.\nPor favor tenha certeza que o plugin "ShaderPatch" está habilitado.
GPU_TU_NAME=Aviso: Arquitetura Turing detectada! Possível aparecimento de ruído.\n(Clique aqui para mais informações)
GPU_TU_HINT=Em GPUs Turing (GTX 16xx/RTX 20xx), alguns shaders importantes dos personagens tem problemas, resultando em aparecimento de linhas/ruído.\nPor favor tenha certeza que o plugin "ShaderPatch" está habilitado.
GPU_GM_NEWER_NAME=Aviso: Pode haver um pouco de ruído em certos estágios.\n(Clique aqui para mais informações)
GPU_GM_NEWER_HINT=Em GPUs Maxwell (~GTX 900) ou mais recentes, alguns shaders de estágio podem criar ruído.\nPor favor tenha certeza que o plugin "ShaderPatch" está habilitado.
GPU_GK_NAME=Avisos: Nenhum.
GPU_GK_HINT=Sua GPU não deve ter problemas em nenhum estágio.
GPU_GF_DRIVER_OLD_NAME=Aviso: Os drivers são muito antigos.
GPU_GF_DRIVER_OLD_HINT=Sua GPU deve ser capaz de rodar o jogo, mas parece que sua versão do OpenGL é muito antiga.\nUma atualização de drivers deve resolver esse problema.
GPU_GF_NAME=Avisos: Sem problemas conhecidos.
GPU_GF_HINT=Sua GPU deve ser capaz de rodar o jogo, mas é mais antiga do que a GPU que esse jogo foi feito para rodar (GTX 650 Ti).\nPode haver problemas com alguns elementos gráficos.\nPor favor reporte qualquer problema para que ele seja analisado e muito possívelmente, resolvido.
GPU_TOO_NEW_NAME=Aviso: Sua GPU pode ser muito nova.\n(Clique aqui para mais informações)
GPU_TOO_NEW_HINT=Parece que sua GPU é muito nova/recente. Apenas até a arquitetura Ampere (RTX 30xx) é atualmente suportada.\nBoas notícias: o jogo deve ser capaz de funcionar, mas patches para os shaders (provavelmente necessários) podem não funcionar ainda.\nVocê provavelmente verá linhas/ruídos em alguns shaders de personagens e de estágios.\nPor favor reporte qualquer problema para que o "ShaderPatch" possa ser atualizado.
GPU_OLD_NAME=Aviso: Sua GPU é muito antiga! Pode ter problemas na renderização 3D.\n(Clique aqui para mais informações)
GPU_OLD_HINT=Sua GPU é muito antiga e não suporta as técnicas de renderização usadas pelo jogo.\nVocê pode conseguir jogar, mas os gráficos poderão ter vários problemas.\nPor favor faça um upgrade para uma GPU da série GTX 600 or mais recente.
GPU_UNKNOWN_NAME=Aviso: Não foi possível detectar a arquitetura de sua GPU.\n(Clique aqui para mais informações)
GPU_UNKNOWN_HINT=Parece que você tem uma GPU NVIDIA, mas algo deu errado na tentativa de detectar sua arquitetura.\nIsso pode ter sido causado por um bug, mas provavelmente indica algum problema maior.\nPor favor tenha certeza de ter uma GPU da série GTX 600 ou mais recente (A série GTX 400 ou mais recente também deve funcionar).
GPU_DRIVER_ISSUES_NAME=Os drivers da GPU apresentam problemas conhecidos.
GPU_DRIVER_ISSUES_HINT=Os drivers da GPU que estão instalados tem problemas que já são conhecidos.\nPor favor instale os drivers mais recentes de sua GPU diretamente do site da fabricante.
SHOW_GPU_DIALOG_HINT=Você pode desativar essa mensagem na aba "Opções".
@@ -0,0 +1,282 @@
###############################################
# framework
LANG_AUTO=Automatic
en=English
zh-Hans=Simplified Chinese
pt-BR=Portuguese
it-IT=Italian
ja-JP=Japanese
# display
DISPLAY_NAME=Display:
DISPLAY_HINT=Sets the window/screen mode.\n\n\nFast: Popup borderless window (can cause issues with screenshots if Windows 10/11 fullscreen optimizations are enabled).\n\nExclusive: Takes control of the screen and allows you to change the resolution and refresh rate. Makes switching between applications harder.\n\nSafe: Simple borderless window. A little bit laggier than Fast, but with less issues.
RESOLUTION_NAME=Resolution:
RESOLUTION_HINT=Sets the display resolution.
REFRESHRATE_NAME=Refresh Rate:
REFRESHRATE_HINT=Sets the display refresh rate.
R.ENABLE_NAME=Enable
R.ENABLE_HINT=Enable or disable custom internal resolution.
R.RESOLUTION_NAME=Resolution:
R.RESOLUTION_HINT=Sets the internal resolution (instead of 1280x720).
MATCH_WINDOW=Match Window
MATCH_SCREEN=Match Screen
# graphics
MODEL_NAME=NVIDIA GPU:
MODEL_HINT=Select your NVIDIA GPU's architecture to apply the necessary workarounds.\n\nNOTE: Automatic detection does not currently work on GNU/Linux.
MODEL_AUTOMATIC=Automatic
TAA_NAME=TAA
TAA_HINT=Temporal Anti-Aliasing
MLAA_NAME=MLAA
MLAA_HINT=Morphological Anti-Aliasing
MAG_NAME=Filter:
MAG_HINT=Image filter.\n\nBilinear: default filter\nNearest-neighbour: sharpest, but blocky\nSharpen: sharp filter\nCone: smooth filter
MAG_BILINEAR=Bilinear
MAG_NEAREST=Nearest-neighbour
MAG_SHARPEN=Sharpen
MAG_CONE=Cone
DOF_NAME=Depth of Field
DOF_HINT=Blurs the background. Disable for better performance.
REFLECTIONS_NAME=Reflections
REFLECTIONS_HINT=Enable or disable reflections.
REFLECT_RES_WIDTH_NAME=Reflection Res:
REFLECT_RES_WIDTH_HINT=Sets the reflection buffer resolution (instead of 512x256).
REFRACT_RES_WIDTH_NAME=Refraction Res:
REFRACT_RES_WIDTH_HINT=Sets the refraction buffer resolution (instead of 512x256).
GAMMA_NAME=Gamma:
GAMMA_HINT=Increase to darken shadows.\nSet to 125 for a console-like experience.\n\nDefault: 100
SHADOWS_NAME=Shadows
SHADOWS_HINT=Enable or disable shadows.
PUNCHTHROUGH_NAME=Transparent Meshes
PUNCHTHROUGH_HINT=Show transparent meshes.
GLARE_NAME=Glare
GLARE_HINT=Enable or disable glare.
SHADER_NAME=Shader
SHADER_HINT=Enable or disable high-quality shaders.
NPR1_NAME=Toon (F9):
NPR1_HINT=NPR1 shader\n\nPress F9 to toggle.
2D_NAME=Disable 3D rendering
2D_HINT=Disable all 3D passes.\n\nWARNING: The extended data will be deleted unless Prevent Data Deletion is enabled. Don't enable on Intel GPUs, enable "Disable Extended Data" instead.
# options
SECTION_LOADER=Loader
SECTION_COMPATIBILITY=Compatibility
SECTION_PV_SELECTOR=PV Selector
SECTION_ESM=Stages (Songs)
SECTION_UI_ELM=UI Elements
SECTION_PV_PATCHES=PV Patches
SECTION_FRAMERATE=Framerate
SECTION_CONTROLLER_OPTIONS=Controller Options
SECTION_LAUNCHER=Launcher
KEYBOARD_CONTROLLER_CONFIGURATION=Keyboard/Controller Configuration
BUILTIN_PATCHES_NAME=Enable Built-In Patches
BUILTIN_PATCHES_HINT=Enables the built-in patches, including the options in this tab.
CUSTOM_PATCHES_NAME=Enable Custom Patches
CUSTOM_PATCHES_HINT=Enables all custom patches.
BUILTIN_RENDER_NAME=Enable Built-In Render
BUILTIN_RENDER_HINT=Enables the built-in render patches.
NO_MOVIES_NAME=Disable Movies
NO_MOVIES_HINT=Disable movies (enable this if the game hangs when loading certain PVs).
CURSOR_NAME=Cursor
CURSOR_HINT=Enable or disable the mouse cursor.
STEREO_NAME=Stereo
STEREO_HINT=Use 2 channels instead of 4 (when not using DivaSound).
QUICK_START_NAME=Quick Start:
QUICK_START_HINT=Skip one or more menus.
NO_SCROLLING_SFX_NAME=Disable Scrolling SFX
NO_SCROLLING_SFX_HINT=Disable the scrolling sound effect.
SING_MISSED_NAME=Sing Missed Notes
SING_MISSED_HINT=Sing missed notes.
HIDE_VOLUME_NAME=Hide Volume Buttons
HIDE_VOLUME_HINT=Hide the volume and SE control buttons.
NO_PV_UI_NAME=Disable PV UI
NO_PV_UI_HINT=Remove the photo controls during PV playback.
HIDE_PV_WATERMARK_NAME=Hide PV Watermark
HIDE_PV_WATERMARK_HINT=Hide the watermark that's usually shown in PV viewing mode.
STATUS_ICONS_NAME=Top-Right Network Icons:
STATUS_ICONS_HINT=Set the state of card reader and network status icons.
NO_LYRICS_NAME=Disable Lyrics
NO_LYRICS_HINT=Disable showing lyrics.
NO_ERROR_NAME=Disable Error Banner
NO_ERROR_HINT=Disable the error banner on the attract screen.
HIDE_FREEPLAY_NAME=Hide "FREE PLAY"/"CREDIT(S)"
HIDE_FREEPLAY_HINT=Hide the "FREE PLAY"/"CREDIT(S)" text.
PDLOADERTEXT_NAME=PD Loader FREE PLAY
PDLOADERTEXT_HINT=Show "PD Loader" instead of "FREE PLAY".
ALLOWCUSTOMFREEPLAY_NAME=Allow Custom Text
ALLOWCUSTOMFREEPLAY_HINT=Allow plugins and patches to change "FREE PLAY"/"CREDIT(S)".
NO_TIMER_NAME=Freeze Timer
NO_TIMER_HINT=Disable the timer.
NO_TIMER_SPRITE_NAME=Disable Timer Sprite
NO_TIMER_SPRITE_HINT=Disable the timer sprite.
NO_MESSAGE_BAR_NAME=Hide Message Bar
NO_MESSAGE_BAR_HINT=Hide the top message bar.
NO_STAGE_TEXT_NAME=Disable Stage Text
NO_STAGE_TEXT_HINT=Disable Stage 1/2/Final.
UNLOCK_PSEUDO_NAME=Unlock "PSEUDO" Modules (incomplete)
UNLOCK_PSEUDO_HINT=Lets you play any PV with any performer.\n(incomplete, recommended modules will default to Miku)
CARD_NAME=Unlock Card Menu (incomplete)
CARD_HINT=Enables the card menu.\n(incomplete, it doesn't bypass the card prompt)
NO_OPD_NAME=Disable Extended Data
NO_OPD_HINT=AKA Skyth's "No Osage Play Data" patch.\n\nDisables baked physics in edits to save space.\nMay break physics in some edits.
DWGUI_SCALING_NAME=Scale Debug Windows
DWGUI_SCALING_HINT=AKA somewhatlurker's dwgui patch.\n\nMakes debug windows bigger above HD internal resolution.
FREEPLAY_NAME=FREE PLAY
FREEPLAY_HINT=Show "FREE PLAY" instead of "CREDIT(S)" and don't require credits.
FPS.LIMIT.LIGHTMODE_NAME=Use Lightweight Limiter
FPS.LIMIT.LIGHTMODE_HINT=Makes the FPS limiter use less CPU.\nMay have less consistent performance.
FPS.LIMIT_NAME=FPS Limit:
FPS.LIMIT_HINT=Allows you to set a frame rate cap. Set to -1 to unlock the frame rate.
FRM.MOTION.RATE_NAME=FRM Motion Rate:
FRM.MOTION.RATE_HINT=Sets the motion rate (fps) for the Frame Rate Manager component.\nLarger values should be smoother, but more CPU intensive and possibly buggier.
AUTOPAUSE_NAME=Pause Automatically
AUTOPAUSE_HINT=Pause when focus is lost.
RUMBLE_NAME=XInput Rumble
RUMBLE_HINT=Enables rumble during chainslides.
XINPUT_RUMBLE_INTENSITY_LEFT_NAME=Left Motor Intensity
XINPUT_RUMBLE_INTENSITY_LEFT_HINT=Default: 8000.
XINPUT_RUMBLE_INTENSITY_RIGHT_NAME=Right Motor Intensity
XINPUT_RUMBLE_INTENSITY_RIGHT_HINT=Default: 4000.
XINPUT_PREFERRED_NAME=Pref. XInput Controller:
XINPUT_PREFERRED_HINT=Sets the preferred XInput controller.\nIf unavailable, the next connected controller is used.
HARDWARE_SLIDER_NAME=Use Hardware Slider
HARDWARE_SLIDER_HINT=Enable this if using a real arcade slider.\n(set the slider to port COM11)
PREVENT_DATA_DELETION_NAME=Prevent Data Deletion
PREVENT_DATA_DELETION_HINT=Prevents the game from deleting files.
COMMAND_LINE_NAME=Command Line:
COMMAND_LINE_HINT=Allows setting command line arguments for the game when using the launcher.\nDisabling the launcher will bypass this.
USE_DIVAHOOK_BAT_NAME=Use divahook.bat/start.bat
USE_DIVAHOOK_BAT_HINT=Launches divahook.bat or start.bat intead of diva.exe.
DARK_LAUNCHER_NAME=Dark Launcher
DARK_LAUNCHER_HINT=Sets the dark colour scheme in the launcher.
LAUNCHER_LANGUAGE_NAME=Launcher Language:
LAUNCHER_LANGUAGE_HINT=Sets the Language of the launcher.
NO_GPU_DIALOG_NAME=Disable GPU Warning
NO_GPU_DIALOG_HINT=Disables the warning dialog for unsupported GPUs.
QUICK_START_DIVAHOOK_SAME_TIME="Quick Start" and "Use divahook.bat/start.bat" cannot be enabled at the same time.
NO_DIVAHOOK_BAT=divahook.bat/start.bat not found.\nThe game will start normally/offline.\n\nNOTE: Disable "Use divahook.bat/start.bat" to avoid this warning.
# player data
PLAYER_NAME_NAME=Player Name:
PLAYER_NAME_HINT=Player name shown in game.
LEVEL_NAME_NAME=Level Name:
LEVEL_NAME_HINT=Level (plate) name shown in game.
LEVEL_PLATE_ID_NAME=Level Plate:
LEVEL_PLATE_ID_HINT=Sets the level background image (plate).
LEVEL_PLATE_EFFECT_NAME=Level Plate Effect:
LEVEL_PLATE_EFFECT_HINT=Sets the effect on the level background image (plate).
SKIN_EQUIP _NAME=Skin:
SKIN_EQUIP _HINT=Sets the gameplay UI skin.
BTN_SE_EQUIP_NAME=Button Sound:
BTN_SE_EQUIP_HINT=Sets the sound effect for buttons.\n\n-1 = song default
SLIDE_SE_EQUIP_NAME=Slide Sound:
SLIDE_SE_EQUIP_HINT=Sets the sound effect for slides.\n\n-1 = song default
CHAINSLIDE_SE_EQUIP_NAME=Chainslide Sound:
CHAINSLIDE_SE_EQUIP_HINT=Sets the sound effect for chain slides.\n\n-1 = song default
SLIDERTOUCH_SE_EQUIP_NAME=Slider Touch Sound:
SLIDERTOUCH_SE_EQUIP_HINT=Sets the sound effect for touching the slider with no note.\n\n-1 = song default
ACT_TOGGLE_NAME=Button SE
ACT_TOGGLE_HINT=Enables button/slider sounds.
BORDER_GREAT_NAME=Clear Border (Great)
BORDER_GREAT_HINT=Shows the clear border for a great rating on the progress bar.
BORDER_EXCELLENT_NAME=Clear Border (Excellent)
BORDER_EXCELLENT_HINT=Shows the clear border for an excellent rating on the progress bar.
BORDER_RIVAL_NAME=Clear Border (Rival)
BORDER_RIVAL_HINT=Shows the clear border for beating your rival on the progress bar.
USE_CARD_NAME=Use Card
USE_CARD_HINT=Enables IC card. This allows module selection.
MODULE_CARD_WORKAROUND_NAME=Module Selection Workaround
MODULE_CARD_WORKAROUND_HINT=Allows module selection without card and tries to improve menu performance.\n(BETA)
USE_PV_MODULE_EQUIP_NAME=Song Specific Modules
USE_PV_MODULE_EQUIP_HINT=Allows song-specific module selection.
USE_PV_SKIN_EQUIP_NAME=Song Specific Skins
USE_PV_SKIN_EQUIP_HINT=Allows song-specific skin settings.\nValues stored in skins.ini
USE_PV_SFX_EQUIP_NAME=Song Specific Sound Effects
USE_PV_SFX_EQUIP_HINT=Allows song-specific sound effect settings.\nValues stored in sfx.ini
GAMEMODE_OPTIONS_NAME=Game Modifiers
GAMEMODE_OPTIONS_HINT=Allows use of game mode modifiers (hi-speed, hidden, and sudden).
# components
INPUT_EMULATOR_NAME=Input Emulator
INPUT_EMULATOR_HINT=Emulates input through keyboard and/or mouse.
TOUCH_SLIDER_EMULATOR_NAME=Slider Emulator
TOUCH_SLIDER_EMULATOR_HINT=Emulates slider through keyboard and/or mouse.
TOUCH_PANEL_EMULATOR_NAME=Touch Panel Emulator
TOUCH_PANEL_EMULATOR_HINT=Emulates touch panel through mouse.
PLAYER_DATA_MANAGER_NAME=Player Data Manager
PLAYER_DATA_MANAGER_HINT=Loads user-defined values into the PlayerData struct.\nRequired for modules and game mode modifiers.
FRAME_RATE_MANAGER_NAME=Frame Rate Manager
FRAME_RATE_MANAGER_HINT=Adjusts animations to the correct speed at different frame rates.\nOnly needed when FPS isn't locked at 60.
FAST_LOADER_NAME=Fast Loader
FAST_LOADER_HINT=Skip or speed up unnecessary loading steps.
FAST_LOADER_SPEED_NAME=Fast Loader Speed:
FAST_LOADER_SPEED_HINT=Set this to 4 or less when playing online.\nDefault: 39
CAMERA_CONTROLLER_NAME=Camera Controller
CAMERA_CONTROLLER_HINT=Enables freecam (toggled using F3).\nWASD to move, SPACE/CTRL for up/down, Q/R to rotate, R/F for zoom.\nHolding SHIFT/ALT changes control speed.
SCALE_COMPONENT_NAME=Scale Component
SCALE_COMPONENT_HINT=Scales the graphics output framebuffer to fill the screen/window.
DEBUG_COMPONENT_NAME=Debug Component
DEBUG_COMPONENT_HINT=Allows for changing game state (F4-F8 keys), using dev GUI and tests, and speeding up 2d animations/menus (hold SHIFT+TAB).
TARGET_INSPECTOR_NAME=Target Inspector
TARGET_INSPECTOR_HINT=Enables hold transfers.
SCORE_SAVER_NAME=Score Saver
SCORE_SAVER_HINT=Saves high scores to plugins_config/scores.ini.
PAUSE_NAME=Pause
PAUSE_HINT=Adds a pause menu.
#plugins
CONFIG=Config
###############################################
# ui
# dialog
CONFIRM_SAVE_SETTINGS=Do you want to save your settings?
CONFIRM_DISCORD_OR_GUIDE=Would you like to read the user guide for troubleshooting?
HOWTO_CLEAN_INSTALL=How to do a clean installation
HOWTO_CLEAN_INSTALL_HINT=Delete:\n- dnsapi.dll or dinput8.dll\n- patches/\n- plugins/\n- plugins_config/\n\nRestore:\n- glut32.dll\n\nThen install PD Loader from the official repository.
# gpu
GPU_WINE_DISABLE_MOVIES=(remember to disable movies!)
GPU_INFO_NAME=GPU Info:
GPU_AMD_NOVIDIA_NAME=Issues: AMD GPU support is unofficial.
GPU_AMD_NOVIDIA_HINT=AMD GPUs are not supported without mods.\nNovidia seems to be installed, but please keep in mind that it may have issues.
GPU_AMD_NAME=Issues: Mods needed for AMD compatibility!
GPU_AMD_HINT=AMD GPUs are not supported without mods.\nNovidia can be used to make 3D rendering work.\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.
GPU_UNSUPPORTED_NAME=Issues: UNSUPPORTED GPU!
GPU_UNSUPPORTED_HINT=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.
GPU_GA_NAME=Issues: Ampere GPU detected! Possible noise.\n(Click for more information)
GPU_GA_HINT=On Ampere GPUs (RTX 30xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled.
GPU_TU_NAME=Issues: Ampere GPU detected! Possible noise.\n(Click for more information)
GPU_TU_HINT=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.
GPU_GM_NEWER_NAME=Issues: May have minor noise on some stages.\n(Click for more information)
GPU_GM_NEWER_HINT=On Maxwell GPUs (~GTX 900) and newer, some minor stage shaders create noise.\nPlease make sure the ShaderPatch plugin is enabled.
GPU_GK_NAME=Issues: None.
GPU_GK_HINT=Your GPU should have no issues running the game.
GPU_GF_DRIVER_OLD_NAME=Issues: Driver too old.
GPU_GF_DRIVER_OLD_HINT=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.
GPU_GF_NAME=Issues: No known issues.
GPU_GF_HINT=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.
GPU_TOO_NEW_NAME=Issues: GPU may be too new.\n(Click for more information)
GPU_TOO_NEW_HINT=It looks like your GPU may be too new. Only up to Ampere (RTX 30xx) is currently supported.\nGood news: the game should be capable of running, but shader patches (probably needed) may not support it yet.\nYou will likely see lines/noise on important character shaders and some minor stage shaders.\nPlease report any issues so that ShaderPatch can be updated.\nYou can also try forcing a specific GPU workaround type.
GPU_OLD_NAME=Issues: GPU too old! 3D rendering might be broken.\n(Click for more information)
GPU_OLD_HINT=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.
GPU_UNKNOWN_NAME=Issues: Unable to detect GPU architecture.\n(Click for more information)
GPU_UNKNOWN_HINT=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)
GPU_DRIVER_ISSUES_NAME=Driver has known issues.
GPU_DRIVER_ISSUES_HINT=The graphics driver you're using has known issues. Please install the latest driver from your GPU vendor's website.
SHOW_GPU_DIALOG_HINT=You can disable this message from the Options tab.
@@ -0,0 +1,289 @@
###############################################
# framework
LANG_AUTO=自动检测
en=英语
zh-Hans=简体中文
pt-BR=葡萄牙语
it-IT=意大利语
ja-JP=日语
# display
DISPLAY_NAME=显示模式:
DISPLAY_HINT=设置窗口显示模式
Windowed=窗口化
Fast=无边框窗口
Exclusive=独占全屏
MATCH_WINDOW=匹配窗口分辨率
MATCH_SCREEN=匹配显示分辨率
#Safe=
RESOLUTION_NAME=游戏分辨率:
RESOLUTION_HINT=设置游戏的显示分辨率
REFRESHRATE_NAME=刷新率:
REFRESHRATE_HINT=设置显示的刷新率.
R.ENABLE_NAME=启用
R.ENABLE_HINT=启用或禁用自定义内部渲染分辨率.
R.RESOLUTION_NAME=分辨率:
R.RESOLUTION_HINT=设置内部渲染分辨率(除 1280x720 外)
# graphics
MODEL_NAME=NVIDIA GPU 架构:
MODEL_AUTOMATIC=自动设定
MODEL_HINT=请选择你的 NVIDIA GPU 架构以便于应用必要的设定\n\n请注意:自动检测 GPU 架构功能无法在 GNU/Linux 上工作\n\n架构类型:\nKeplerGTX10 系\nMaxwellGTX900 系\nTuringRTX20/GTX16 系\nAmpereRTX30 系
TAA_NAME=TAA
TAA_HINT=时间抗锯齿
MLAA_NAME=MLAA
MLAA_HINT=形态抗锯齿
MAG_NAME=图像滤镜:
MAG_HINT=图像滤镜\n\n双线性插值:默认滤镜\n最近邻插值:最锐利,但是容易产生色块\nSharpen:锐化滤镜\nCone:平滑滤镜
Bilinear=双线性插值
Nearest-neighbour=最近邻插值
DOF_NAME=景深
DOF_HINT=模糊背景,停用后可以在低配机器上获得更好性能
REFLECTIONS_NAME=反射
REFLECTIONS_HINT=启用或者停用游戏内中的反射效果.
GAMMA_NAME=伽马设定:
GAMMA_HINT=调整此数值以设置阴影部分的亮度\n将其设定为125可获得接近于主机版本游戏的体验\n\n默认值: 100
REFLECT_RES_WIDTH_NAME=反射分辨率:
REFLECT_RES_WIDTH_HINT=设置反射缓冲区的分辨率(除 512x256 外)
REFRACT_RES_WIDTH_NAME=折射分辨率:
REFRACT_RES_WIDTH_HINT=设置折射缓冲区的分辨率(除 512x256 外)
SHADOWS_NAME=阴影
SHADOWS_HINT=启用或者停用游戏内的阴影效果
PUNCHTHROUGH_NAME=透明网格物体
PUNCHTHROUGH_HINT=显示透明网格物体
GLARE_NAME=光晕
GLARE_HINT=启用或者停用游戏内的光晕效果
SHADER_NAME=高清着色器
SHADER_HINT=启用或者停用高清着色器
NPR1_NAME=Toon (F9):
NPR1_HINT=启用 NPR1 着色器\n\n按 F9 以进行切换
2D_NAME=停用 3D 渲染
2D_HINT=停用游戏内所有的 3D 渲染\n\n警告:在 “游戏数据保护” 未启用前,停用 3D 渲染将会导致所有扩展数据被删除
# options
SECTION_LOADER=启动器设定
SECTION_COMPATIBILITY=兼容性设定
SECTION_PV_SELECTOR=PV选择界面设定
SECTION_ESM=游玩设定
SECTION_UI_ELM=UI元素设定
SECTION_PV_PATCHES=PV补丁设定
SECTION_FRAMERATE=帧率设定
SECTION_CONTROLLER_OPTIONS=控制器设定
SECTION_LAUNCHER=启动器设定
KEYBOARD_CONTROLLER_CONFIGURATION=键位设定
Default=默认
Force on=强制开启
Force off=强制关闭
BUILTIN_PATCHES_NAME=启用内部补丁
BUILTIN_PATCHES_HINT=启用包括此选项下的内部补丁文件
CUSTOM_PATCHES_NAME=启用自定义补丁
CUSTOM_PATCHES_HINT=启用全部自定义补丁文件
BUILTIN_RENDER_NAME=启用内部渲染补丁
BUILTIN_RENDER_HINT=启用内部渲染补丁文件
NO_MOVIES_NAME=停用视频
NO_MOVIES_HINT=停用包含视频文件的 PV (如 Catch The Wave 背景,砂之行星等)(如果在游戏加载包含视频文件的 PV 时卡死,请启用此选项)
CURSOR_NAME=显示光标
CURSOR_HINT=在游戏内显示或者隐藏鼠标指针
STEREO_NAME=声道设定
STEREO_HINT=当禁用 DivaSound 时,强制将 4 声道转为 2 声道
QUICK_START_NAME=快速启动:
QUICK_START_HINT=跳过一个或者更多菜单 (如刷卡菜单)
Disabled=禁用
Guest=访客模式
Guest + Normal=访客模式+正常模式
NO_SCROLLING_SFX_NAME=停用滑动音效
NO_SCROLLING_SFX_HINT=停用在选歌界面的滑动音效
SING_MISSED_NAME=停用停止歌唱
SING_MISSED_HINT=停用当 Note 判定为 Miss 时,歌姬暂停歌唱的功能
HIDE_VOLUME_NAME=隐藏音量设定
HIDE_VOLUME_HINT=隐藏游戏内音量控制和案件音效控制按钮
NO_PV_UI_NAME=隐藏 PV UI
NO_PV_UI_HINT=隐藏欣赏模式下的摄像按钮
HIDE_PV_WATERMARK_NAME=隐藏 PV 水印
HIDE_PV_WATERMARK_HINT=隐藏 PV 水印
STATUS_ICONS_NAME=状态栏图标设定:
STATUS_ICONS_HINT=设定网络功能以及读卡器的状态图标
Hidden=隐藏
Error=错误
OK=正常
Partial OK=部分正常
NO_LYRICS_NAME=隐藏歌词
NO_LYRICS_HINT=隐藏歌词
NO_ERROR_NAME=隐藏错误横幅
NO_ERROR_HINT=隐藏在待机模式下显示的错误横幅
HIDE_FREEPLAY_NAME=隐藏 "FREE PLAY"/"CREDIT (S)"
HIDE_FREEPLAY_HINT=隐藏游戏右上角的 "FREE PLAY"/"CREDIT (S)" 文字
PDLOADERTEXT_NAME=替换 "FREE PLAY" 文字
PDLOADERTEXT_HINT=替换游戏右上角的 "FREE PLAY" 为 "PD Loader"
NO_TIMER_NAME=停用计时器
NO_TIMER_HINT=停用选歌界面的计时器
NO_TIMER_SPRITE_NAME=隐藏计时器图标
NO_TIMER_SPRITE_HINT=隐藏选歌界面的计时器图标
NO_MESSAGE_BAR_NAME=隐藏信息栏
NO_MESSAGE_BAR_HINT=隐藏游戏窗口顶部的信息栏
NO_STAGE_TEXT_NAME=隐藏游玩次数
NO_STAGE_TEXT_HINT=隐藏游戏窗口左下角的1/2/Final文字
ALLOWCUSTOMFREEPLAY_NAME=允许替换 "FREE PLAY" 文字
ALLOWCUSTOMFREEPLAY_HINT=允许插件/补丁替换右上角的 "FREE PLAY" 文字
UNLOCK_PSEUDO_NAME=解锁 PSEUDO 模块 (未完成)
UNLOCK_PSEUDO_HINT=允许您使用所有模型游玩游戏\n(未完成,推荐的默认模型为 Miku)
CARD_NAME=解锁刷卡菜单 (未完成)
CARD_HINT=启用刷卡菜单\n(未完成,且此功能不会绕过刷卡提示)
NO_OPD_NAME=停用物理烘焙
NO_OPD_HINT=即由Skyth制作的 "No Osage Play Data"补丁\n\n此功能将禁用游戏默认的物理烘焙以节省磁盘空间\n但可能会破坏游戏内的物理效果
DWGUI_SCALING_NAME=缩放调试窗口
DWGUI_SCALING_HINT=即由somewhatlurker制作的"dwgui"补丁\n\n此功能将允许对调试窗口进行缩放
FREEPLAY_NAME=免费游玩
FREEPLAY_HINT=替换游戏右上角的 "CREDIT (S)" 文字为 "FREE PLAY" 且在此模式下无需投币
FPS.LIMIT.LIGHTMODE_NAME=启用轻量 FPS 限制器
FPS.LIMIT.LIGHTMODE_HINT=限制 FPS 限制器的 CPU 使用量\n此功能可能会造成轻微的性能损失
FPS.LIMIT_NAME=FPS 限制器:
FPS.LIMIT_HINT=允许您设定 FPS 上限,将其设置为 -1 可解锁帧率限制
FRM.MOTION.RATE_NAME=FRM 运动速率:
FRM.MOTION.RATE_HINT=设置设置帧速率管理器的运动速率(fps)\n更大的数字理论上会更加流畅,但可能会极大的增加 CPU 占用且更容易发生错误
AUTOPAUSE_NAME=自动暂停
AUTOPAUSE_HINT=在窗口为未激活状态时自动暂停游戏
RUMBLE_NAME=启用 XInput 震动
RUMBLE_HINT=启用在滑条滑动时的 XInput 震动功能
XINPUT_PREFERRED_NAME=XInput 控制器设定:
XINPUT_RUMBLE_INTENSITY_LEFT_NAME=左马达震动强度
XINPUT_RUMBLE_INTENSITY_LEFT_HINT=默认值: 8000
XINPUT_RUMBLE_INTENSITY_RIGHT_NAME=右马达震动强度
XINPUT_RUMBLE_INTENSITY_RIGHT_HINT=默认值: 4000
XINPUT_PREFERRED_HINT=设置 XInput 控制器偏好\n如果此控制器暂时无法使用,将使用下一个已连接的 XInput 控制器
HARDWARE_SLIDER_NAME=启用硬件手台
HARDWARE_SLIDER_HINT=如果你准备使用硬件手台,请将其启用\n(请将硬件手台的连接端口设置为 COM11)
PREVENT_DATA_DELETION_NAME=游戏数据保护
PREVENT_DATA_DELETION_HINT=避免游戏自动删除数据
COMMAND_LINE_NAME=启动设定:
COMMAND_LINE_HINT=允许在使用启动器时为游戏设置命令行参数\n如果启动器被停用则会跳过此步骤
USE_DIVAHOOK_BAT_NAME=使用 divahook.bat/start.bat
USE_DIVAHOOK_BAT_HINT=启动 divahook.bat/start.bat 而非 diva.exe
DARK_LAUNCHER_NAME=暗黑模式
DARK_LAUNCHER_HINT=启用启动器自带的暗黑主题
LAUNCHER_LANGUAGE_NAME=启动器语言
LAUNCHER_LANGUAGE_HINT=设置启动器语言。
NO_GPU_DIALOG_NAME=停用 GPU 警告信息
NO_GPU_DIALOG_HINT=停用对于不支持的 GPU 的警告信息
# player data
PLAYER_NAME_NAME=玩家昵称:
PLAYER_NAME_HINT=设置游戏中显示的玩家昵称
LEVEL_NAME_NAME=玩家签名:
LEVEL_NAME_HINT=设置游戏中显示玩家签名
LEVEL_PLATE_ID_NAME=签名栏背景:
LEVEL_PLATE_ID_HINT=设置签名栏背景图片
LEVEL_PLATE_EFFECT_NAME=签名栏效果:
LEVEL_PLATE_EFFECT_HINT=设置签名栏所显示的效果
SKIN_EQUIP_NAME=打歌界面:
SKIN_EQUIP_HINT=设置打歌界面皮肤
BTN_SE_EQUIP_NAME=按键音效:
BTN_SE_EQUIP_HINT=设置按键音效.\n-1 = 默认音效
SLIDE_SE_EQUIP_NAME=连续拖拽音效:
SLIDE_SE_EQUIP_HINT=设置滑条连续拖拽音效\n-1 = 默认音效
CHAINSLIDE_SE_EQUIP_NAME=拖拽音效:
CHAINSLIDE_SE_EQUIP_HINT=设置滑条拖拽音效.\n-1 = 默认音效
SLIDERTOUCH_SE_EQUIP_NAME=拖拽条操作音效:
SLIDERTOUCH_SE_EQUIP_HINT=设置不带音符触摸滑块的音效.\n-1 = 默认音效
ACT_TOGGLE_NAME=按键声
ACT_TOGGLE_HINT=启用 按键 / 滑条的声音.
BORDER_GREAT_NAME=评分刻度线 (Great)
BORDER_GREAT_HINT=在进度条上显示一条线来提示您是否到达 Great 评分.
BORDER_EXCELLENT_NAME=评分刻度线 (Excellent)
BORDER_EXCELLENT_HINT=在进度条上显示一条线来提示您是否到达 Excellent 评分.
BORDER_RIVAL_NAME=评分刻度线 (对手)
BORDER_RIVAL_HINT=在进度条上显示一条线来提示您是否超过了您的对手.
USE_CARD_NAME=启用刷卡功能
USE_CARD_HINT=启用 IC 卡检测功能以解锁模型选择功能
MODULE_CARD_WORKAROUND_NAME=解锁模型选择功能
MODULE_CARD_WORKAROUND_HINT=在未使用 IC 卡的情况下解锁模型选择功能,且尝试提高菜单流畅度\n(Beta 功能)
USE_PV_MODULE_EQUIP_NAME=解锁特定模型选择功能
USE_PV_MODULE_EQUIP_HINT=允许选择特定歌曲的模型
USE_PV_SKIN_EQUIP_NAME=解锁特定游戏界面选择功能
USE_PV_SKIN_EQUIP_HINT=允许歌曲使用特定的游戏界面\n且将此数值储存在 skin.ini
USE_PV_SFX_EQUIP_NAME=解锁特定音效选择功能
USE_PV_SFX_EQUIP_HINT=允许歌曲使用特定打击音效.\n且将此数值储存在 sfx.ini
GAMEMODE_OPTIONS_NAME=解锁游戏玩法修改器
GAMEMODE_OPTIONS_HINT=解锁游戏玩法修改器 (hi-speedhidden,sudden).
# components
INPUT_EMULATOR_NAME=启用输入映射组件
INPUT_EMULATOR_HINT=通过启用输入模拟组件将键盘 / 鼠标映射为游戏控制器输入
TOUCH_SLIDER_EMULATOR_NAME=启用滑条映射组件
TOUCH_SLIDER_EMULATOR_HINT=通过滑条模拟组件将键盘 / 鼠标映射为滑条输入
TOUCH_PANEL_EMULATOR_NAME=启用触摸映射组件
TOUCH_PANEL_EMULATOR_HINT=通过触摸映射组件将鼠标点击映射为游戏内触摸操作
PLAYER_DATA_MANAGER_NAME=启用玩家资料管理组件
PLAYER_DATA_MANAGER_HINT=通过玩家资料管理组件将玩家自定义的玩家资料加载到游戏默认的玩家资料中\n如果在游戏内需要解锁模型选择功能或游戏玩法修改 器,请启用此模块
FRAME_RATE_MANAGER_NAME=启用帧数管理组件
FRAME_RATE_MANAGER_HINT=通过帧数管理组件将不同的帧速率的动画修正到正确的速度\n如果游戏 FPS 未锁定在 60 帧,请启用此模块
FAST_LOADER_NAME=启用快速加载组件
FAST_LOADER_HINT=通过快速加载组件跳过或加速游戏启动时不必要的加载步骤
FAST_LOADER_SPEED_NAME=快速加载速度
FAST_LOADER_SPEED_HINT=设置快速加载组件的加速程度\n请注意:联机游玩时请将该值设置为 4 及以下,否则将会无法连接服务器\n默认值:39
CAMERA_CONTROLLER_NAME=启用相机控制组件
CAMERA_CONTROLLER_HINT=通过相机控制组件,您可以控制游戏内的摄像机方向位置等参数 (通过按 F3 键切换启动状态)\n使用方法\nWASD 移动摄像机,SPACE/CTRL 控制摄像机向上 / 向下,Q/R 控制摄像机旋转角度,R/F 控制摄像机缩放\n通过按 SHIFT(加速)/ALT(减速) 控制摄像机移动速度
SCALE_COMPONENT_NAME=启用缩放组件
SCALE_COMPONENT_HINT=通过缩放组件缩放图形输出帧缓冲区以填充屏幕 / 窗口
DEBUG_COMPONENT_NAME=启用调试组件
DEBUG_COMPONENT_HINT=通过调试组件,您可以通过按 F4-F8 键更改游戏状态,使用开发人员 GUI 和测试,并加速 2D 动画 / 菜单 (按住 SHIFT+TAB 键).
TARGET_INSPECTOR_NAME=Hold 系统切替
TARGET_INSPECTOR_HINT=启用此项以启用 Hold 系统切替
SCORE_SAVER_NAME=自动保存最佳记录
SCORE_SAVER_HINT=启用此项以将游戏内的最佳纪录保存在游戏 plugins 目录下的 scores.ini 中
PAUSE_NAME=启用暂停菜单
PAUSE_HINT=启用游戏内的暂停菜单
#plugins
CONFIG=设定
###############################################
# ui
# dialog
CONFIRM_SAVE_SETTINGS=是否保存设置?
CONFIRM_DISCORD_OR_GUIDE=您是否想阅读用户指南,以排除故障?
HOWTO_CLEAN_INSTALL=如何清洁安装
HOWTO_CLEAN_INSTALL_HINT=删除:\n- dnsapi.dll 或 dinput8.dll\n- patches/\n- plugins/\n- plugins_config/\n\n恢复:\n- glut32.dll\n\n然后从官方仓库下载安装 PD Loader。
#gpu
GPU_INFO_NAME=显卡信息:
GPU_AMD_NOVIDIA_NAME=信息:AMD GPU 为非官方支持
GPU_AMD_NOVIDIA_HINT=在没有插件的情况下并不支持 AMD GPU\nPD Loader AMDPack 应该已经正确安装,但是还请持续留意游戏中可能出现的错误
GPU_AMD_NAME=警告:需要插件以支持 AMD GPU
GPU_AMD_HINT=在没有插件的情况下并不支持 AMD GPU\nPD Loader AMDPack 可以使 3D 渲染工作 请下载它并且根据内置的帮助文件进行安装\n\n如果您的笔记本电脑带有 NVIDIA GPU 并且您希望使用它,您可能需要在 Windows 设置或者 NVIDIA 显卡控制面版中设置 diva.exe 使用 NVIDIA 显卡运行
GPU_UNSUPPORTED_NAME=警告:不受支持的显卡
GPU_UNSUPPORTED_HINT=您所使用的显卡不受支持。我们仅建议您使用 NVIDIA GPU。(尽管 AMD 显卡可以配合插件使用)\n请使用 GTX600 系列或更高版本的 NVIDIA GPU\n\n如果您的笔记本电脑带有 NVIDIA GPU 并且您希望使用它,则可能需要在 Windows 设置或 NVIDIA 控制面板中设置 diva.exe 使用 NVIDIA 显卡运行。\n\n其他 GPU 用户在使用了插件或 MOD 后能正常运行游戏,但是 3D 图形可能不会工作
GPU_GA_NAME=信息:检测到安培系列显卡!错误未知\n(点击以获取更多信息)
GPU_GA_HINT=安培系列显卡暂时还没有被测试 在上一代图灵系列显卡中(GTX 16 系/RTX 20 系),部分重要的角色着色器在渲染中可能会出现水波纹或者是噪点问题\n请确保 ShaderPatch 插件已经被启用并且将其他问题反馈给开发团队
GPU_TU_NAME=信息:检测到图灵系列显卡!渲染可能会出现噪点\n(点击以获取更多信息)
GPU_TU_HINT=在图灵系列显卡中(GTX16 系/RTX20 系),部分重要的角色着色器在渲染中可能会出现水波纹或者是噪点问题\n请确保 ShaderPatch 插件已经被启用
GPU_GM_NEWER_NAME=信息:某些场景可能会出现噪点\n(点击以获取更多信息)
GPU_GM_NEWER_HINT=在麦克斯韦系列(GTX900 系),更新的显卡上,某些次要的场景着色器会出现噪点问题\n请确保 ShaderPatch 插件已经被启用
GPU_GK_NAME=信息:无错误
GPU_GK_HINT=你的 GPU 应该可以正常游玩这个游戏
GPU_GF_DRIVER_OLD_NAME=信息:驱动版本太旧
GPU_GF_DRIVER_OLD_HINT=你的 GPU 应该可以运行游戏,但是看起来你的 OpenGL 版本太旧了\n更新驱动程序应该会解决此问题。
GPU_GF_NAME=信息:无已知错误
GPU_GF_HINT=你的 GPU 应该可以正常运行此游戏,但是他比此游戏所适配的 GPU (GTX 650 Ti) 要旧\n游戏中可能会存在一些图形方面的问题\n请向开发团队反应这些问题以便于定位和修复
GPU_TOO_NEW_NAME=信息:GPU 可能太新了\n(点击以获取更多信息)
GPU_TOO_NEW_HINT=你的 GPU 看来太新了。目前只支持图灵架构 (GTX16 系 / RTX20 系)。\n好消息是:游戏应该可以运行,但是 ShaderPatch 可能还不支持它\n你可能会在部分角色或场景上看到水波纹或者是噪点\n请将这些问题反馈给开发团队以帮助我们更新 ShaderPatch 插件
GPU_OLD_NAME=信息:GPU 过旧!3D 渲染可能会出现错误\n(点击以获取更多信息)
GPU_OLD_HINT=您的 GPU 非常旧,它不支持游戏使用的渲染技术\n您可能可以运行游戏 但是图形可能会出现严重错误\n请升级到 GTX600 系列以后的 GPU。
GPU_UNKNOWN_NAME=信息:无法检测 GPU 架构。\n(点击以获取更多信息)
GPU_UNKNOWN_HINT=看起来您有一个 NVIDIA GPU,但在尝试确定 GPU 的架构时出错。\n这可能是由一个 bug 引起的,但它也可能表明潜在的问题。\n请确保您有 GTX600 系列或更高版本的 GPU。(GTX 400 系列或更高版本也支持)
SHOW_GPU_DIALOG_HINT=你可以在选项中停用这个警告信息
@@ -43,10 +43,15 @@ bool setBlur(HWND hWnd, AccentState accentState)
if (queryBuild)
{
int BuildNum = _wtoi(DataPtr);
free(DataPtr);
//MessageBox::Show(BuildNum.ToString());
if (BuildNum < 19042) return 0;
}
else return 0;
else
{
free(DataPtr);
return 0;
}
}
else return 0;
@@ -8,6 +8,8 @@ using namespace System::Windows::Forms;
[STAThread]
int showUI() {
AppDomain::CurrentDomain->AppendPrivatePath(Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location)); // directory of Launcher.dva, "...\plugins"
SetProcessDPIAware();
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
+145 -122
View File
@@ -40,20 +40,22 @@ wstring DIVA_EXECUTABLE_LAUNCH_STRING = DIVA_EXECUTABLE_STRING + L" --launch";
LPWSTR DIVA_EXECUTABLE_LAUNCH = const_cast<WCHAR*>(DIVA_EXECUTABLE_LAUNCH_STRING.c_str());
wstring PLUGINS_DIR = DirPath() + L"\\plugins";
wstring PLUGINS_CONFIG_DIR = DirPath() + L"\\plugins_config";
wstring PATCHES_DIR = DirPath() + L"\\patches";
wstring CONFIG_FILE_STRING = PLUGINS_DIR + L"\\config.ini";
wstring CONFIG_FILE_STRING = PLUGINS_CONFIG_DIR + L"\\config.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
wstring COMPONENTS_FILE_STRING = PLUGINS_DIR + L"\\components.ini";
wstring COMPONENTS_FILE_STRING = PLUGINS_CONFIG_DIR + L"\\components.ini";
LPCWSTR COMPONENTS_FILE = COMPONENTS_FILE_STRING.c_str();
wstring PLAYERDATA_FILE_STRING = PLUGINS_DIR + L"\\playerdata.ini";
wstring PLAYERDATA_FILE_STRING = PLUGINS_CONFIG_DIR + L"\\playerdata.ini";
LPCWSTR PLAYERDATA_FILE = PLAYERDATA_FILE_STRING.c_str();
wstring KEYCONFIG_FILE_STRING = PLUGINS_DIR + L"\\keyconfig.ini";
wstring KEYCONFIG_FILE_STRING = PLUGINS_CONFIG_DIR + L"\\keyconfig.ini";
LPCWSTR KEYCONFIG_FILE = KEYCONFIG_FILE_STRING.c_str();
LPCWSTR GLOBAL_SECTION = L"global";
LPCWSTR PATCHES_SECTION = L"patches";
LPCWSTR GRAPHICS_SECTION = L"graphics";
LPCWSTR RESOLUTION_SECTION = L"resolution";
@@ -64,7 +66,28 @@ LPCWSTR KEYCONFIG_SECTION = L"keyconfig";
int nSkipLauncher = GetPrivateProfileIntW(LAUNCHER_SECTION, L"skip", FALSE, CONFIG_FILE);
int nNoGPUDialog = GetPrivateProfileIntW(LAUNCHER_SECTION, L"no_gpu_dialog", FALSE, CONFIG_FILE);
int nLanguage = GetPrivateProfileIntW(LAUNCHER_SECTION, L"launcher_language", FALSE, CONFIG_FILE);
std::vector<LPCWSTR> languages = std::vector<LPCWSTR>({ L"LANG_AUTO", L"en", L"zh-Hans", L"pt-BR", L"it-IT", L"ja-JP"});
void SetBackCol(Control^ elem, System::Drawing::Color color, System::Windows::Forms::FlatStyle cbxStyle)
{
Type^ elemType = elem->GetType();
if (elem->HasChildren)
{
for (int i = 0; i < elem->Controls->Count; i++)
{
SetBackCol(elem->Controls[i], color, cbxStyle);
}
}
else if (elemType == ComboBox::typeid)
{
((ComboBox^)elem)->FlatStyle = cbxStyle;
elem->BackColor = System::Drawing::Color::White;
}
else if (elemType == CheckBox::typeid || elemType == Button::typeid) elem->BackColor = color;
}
resolution getCurrentScreenResolution() {
return resolution(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
@@ -140,18 +163,18 @@ static std::vector<int> getScreenRatesVec(std::vector<DEVMODEW> &screenModes) {
std::vector<DEVMODEW> screenModes = getScreenModes();
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);
DropdownOption* DisplayModeDropdown = new DropdownOption(L"display", RESOLUTION_SECTION, CONFIG_FILE, L"DISPLAY_NAME", L"DISPLAY_HINT", 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_NAME", L"RESOLUTION_HINT", resolution(-1, -1), getScreenResolutionsVec(screenModes), true, RESOPT_INCLUDE_MATCH_SCREEN);
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),
new DropdownNumberOption(L"refreshrate", RESOLUTION_SECTION, CONFIG_FILE, L"REFRESHRATE_NAME", L"REFRESHRATE_HINT", 60, getScreenRatesVec(screenModes), true),
};
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);
BooleanOption* InternalResolutionCheckbox = new BooleanOption(L"r.enable", RESOLUTION_SECTION, CONFIG_FILE, L"R.ENABLE_NAME", L"R.ENABLE_HINT", false, false);
ResolutionOption* InternalResolutionOption = new ResolutionOption(L"r.width", L"r.height", RESOLUTION_SECTION, CONFIG_FILE, L"R.RESOLUTION_NAME", L"R.RESOLUTION_HINT", 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);
ConfigOptionBase* internalResolutionArray[] = {
InternalResolutionCheckbox,
@@ -159,158 +182,149 @@ 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 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 BooleanOption(L"shadows", GRAPHICS_SECTION, CONFIG_FILE, L"Shadows", L"Enable or disable shadows.", true, false),
new BooleanOption(L"punchthrough", GRAPHICS_SECTION, CONFIG_FILE, L"Transparent Meshes", L"Show transparent meshes.", true, false),
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),
new DropdownOption(L"NPR1", GRAPHICS_SECTION, CONFIG_FILE, L"Toon (F9):", L"NPR1 shader\n\nPress F9 to toggle.", 0, std::vector<LPCWSTR>({ L"Default", L"Force on", L"Force off" })),
new BooleanOption(L"2D", GRAPHICS_SECTION, CONFIG_FILE, L"Disable 3D rendering", L"Disable all 3D passes.\n\nWARNING: The extended data will be deleted unless Prevent Data Deletion is enabled.", false, false),
new DropdownOption(L"model", L"GPU", CONFIG_FILE, L"MODEL_NAME", L"MODEL_HINT", -1, std::vector<LPCWSTR>({ L"MODEL_AUTOMATIC", L"Kepler", L"Maxwell", L"Turing", L"Ampere" }), -1),
new BooleanOption(L"TAA", GRAPHICS_SECTION, CONFIG_FILE, L"TAA_NAME", L"TAA_HINT", true, false),
new BooleanOption(L"MLAA", GRAPHICS_SECTION, CONFIG_FILE, L"MLAA_NAME", L"MLAA_HINT", true, false),
new DropdownOption(L"MAG", GRAPHICS_SECTION, CONFIG_FILE, L"MAG_NAME", L"MAG_HINT", 0, std::vector<LPCWSTR>({ L"MAG_BILINEAR", L"MAG_NEAREST", L"MAG_SHARPEN", L"MAG_CONE" })),
new BooleanOption(L"DOF", GRAPHICS_SECTION, CONFIG_FILE, L"DOF_NAME", L"DOF_HINT", true, false),
new BooleanOption(L"reflections", GRAPHICS_SECTION, CONFIG_FILE, L"REFLECTIONS_NAME", L"REFLECTIONS_HINT", true, false),
new ResolutionOption(L"reflect_res_width", L"reflect_res_height", GRAPHICS_SECTION, CONFIG_FILE, L"REFLECT_RES_WIDTH_NAME", L"REFLECT_RES_WIDTH_HINT", 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"REFRACT_RES_WIDTH_NAME", L"REFRACT_RES_WIDTH_HINT", 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 NumericOption(L"gamma", GRAPHICS_SECTION, CONFIG_FILE, L"GAMMA_NAME", L"GAMMA_HINT", 100, 0, 200),
new BooleanOption(L"shadows", GRAPHICS_SECTION, CONFIG_FILE, L"SHADOWS_NAME", L"SHADOWS_HINT", true, false),
new BooleanOption(L"punchthrough", GRAPHICS_SECTION, CONFIG_FILE, L"PUNCHTHROUGH_NAME", L"PUNCHTHROUGH_HINT", true, false),
new BooleanOption(L"glare", GRAPHICS_SECTION, CONFIG_FILE, L"GLARE_NAME", L"GLARE_HINT", true, false),
new BooleanOption(L"shader", GRAPHICS_SECTION, CONFIG_FILE, L"SHADER_NAME", L"SHADER_HINT", true, false),
new DropdownOption(L"NPR1", GRAPHICS_SECTION, CONFIG_FILE, L"NPR1_NAME", L"NPR1_HINT", 0, std::vector<LPCWSTR>({ L"Default", L"Force on", L"Force off" })),
new BooleanOption(L"2D", GRAPHICS_SECTION, CONFIG_FILE, L"2D_NAME", L"2D_HINT", false, false),
};
ConfigOptionBase* optionsArray[] = {
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),
new BooleanOption(L"stereo", PATCHES_SECTION, CONFIG_FILE, L"Stereo", L"Use 2 channels instead of 4 (when not using DivaSound).", true, false),
new OptionMetaSectionLabel(L"SECTION_LOADER"),
new BooleanOption(L"builtin_patches", GLOBAL_SECTION, CONFIG_FILE, L"BUILTIN_PATCHES_NAME", L"BUILTIN_PATCHES_HINT", true, false),
new BooleanOption(L"custom_patches", GLOBAL_SECTION, CONFIG_FILE, L"CUSTOM_PATCHES_NAME", L"CUSTOM_PATCHES_HINT", true, false),
new BooleanOption(L"builtin_render", GLOBAL_SECTION, CONFIG_FILE, L"BUILTIN_RENDER_NAME", L"BUILTIN_RENDER_HINT", true, false),
new OptionMetaSeparator(),
new OptionMetaSpacer(8),
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 OptionMetaSectionLabel(L"SECTION_COMPATIBILITY"),
new BooleanOption(L"no_movies", PATCHES_SECTION, CONFIG_FILE, L"NO_MOVIES_NAME", L"NO_MOVIES_HINT", false, false),
new BooleanOption(L"stereo", PATCHES_SECTION, CONFIG_FILE, L"STEREO_NAME", L"STEREO_HINT", true, false),
new BooleanOption(L"prevent_data_deletion", PATCHES_SECTION, CONFIG_FILE, L"PREVENT_DATA_DELETION_NAME", L"PREVENT_DATA_DELETION_HINT", false, false),
new BooleanOption(L"no_opd", PATCHES_SECTION, CONFIG_FILE, L"NO_OPD_NAME", L"NO_OPD_HINT", false, false),
new OptionMetaSeparator(),
new OptionMetaSpacer(8),
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 OptionMetaSectionLabel(L"SECTION_FRAMERATE"),
new BooleanOption(L"FPS.Limit.LightMode", GRAPHICS_SECTION, CONFIG_FILE, L"FPS.LIMIT.LIGHTMODE_NAME", L"FPS.LIMIT.LIGHTMODE_HINT", true, false),
new NumericOption(L"FPS.Limit", GRAPHICS_SECTION, CONFIG_FILE, L"FPS.LIMIT_NAME", L"FPS.LIMIT_HINT", 60, -1, INT_MAX),
new NumericOption(L"frm.motion.rate", GRAPHICS_SECTION, CONFIG_FILE, L"FRM.MOTION.RATE_NAME", L"FRM.MOTION.RATE_HINT", 300, 1, INT_MAX),
new OptionMetaSeparator(),
new OptionMetaSpacer(8),
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 OptionMetaSectionLabel(L"SECTION_CONTROLLER_OPTIONS"),
new BooleanOption(L"rumble", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"RUMBLE_NAME", L"RUMBLE_HINT", true, true),
new NumericOption(L"xinput_rumble_intensity_left", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"XINPUT_RUMBLE_INTENSITY_LEFT_NAME", L"XINPUT_RUMBLE_INTENSITY_LEFT_HINT", 8000, 0, USHRT_MAX),
new NumericOption(L"xinput_rumble_intensity_right", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"XINPUT_RUMBLE_INTENSITY_RIGHT_NAME", L"XINPUT_RUMBLE_INTENSITY_RIGHT_HINT", 4000, 0, USHRT_MAX),
new NumericOption(L"xinput_preferred", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"XINPUT_PREFERRED_NAME", L"XINPUT_PREFERRED_HINT", 0, 0, 3),
new BooleanOption(L"hardware_slider", PATCHES_SECTION, CONFIG_FILE, L"HARDWARE_SLIDER_NAME", L"HARDWARE_SLIDER_HINT", false, false),
new OptionMetaSeparator(),
new OptionMetaSpacer(8),
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"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),
new BooleanOption(L"freeplay", PATCHES_SECTION, CONFIG_FILE, L"FREE PLAY", L"Show \"FREE PLAY\" instead of \"CREDIT(S)\" and don't require credits.", true, false),
new BooleanOption(L"pdloadertext", PATCHES_SECTION, CONFIG_FILE, L"PD Loader FREE PLAY", L"Show \"PD Loader\" instead of \"FREE PLAY\".", true, false),
new BooleanOption(L"no_timer", PATCHES_SECTION, CONFIG_FILE, L"Freeze Timer", L"Disable the timer.", true, false),
new BooleanOption(L"no_timer_sprite", PATCHES_SECTION, CONFIG_FILE, L"Disable Timer Sprite", L"Disable the timer sprite.", true, false),
new OptionMetaSectionLabel(L"SECTION_LAUNCHER"),
new DropdownOption(L"launcher_language",LAUNCHER_SECTION,CONFIG_FILE, L"LAUNCHER_LANGUAGE_NAME",L"LAUNCHER_LANGUAGE_HINT", 0, languages),
new BooleanOption(L"dark_launcher", LAUNCHER_SECTION, CONFIG_FILE, L"DARK_LAUNCHER_NAME", L"DARK_LAUNCHER_HINT", false, false),
//new BooleanOption(L"acrylic_blur", LAUNCHER_SECTION, CONFIG_FILE, L"ACRYLIC_BLUR_NAME", L"ACRYLIC_BLUR_HINT", false, false),
new BooleanOption(L"no_gpu_dialog", LAUNCHER_SECTION, CONFIG_FILE, L"NO_GPU_DIALOG_NAME", L"NO_GPU_DIALOG_HINT", false, false),
new BooleanOption(L"use_divahook_bat", LAUNCHER_SECTION, CONFIG_FILE, L"USE_DIVAHOOK_BAT_NAME", L"USE_DIVAHOOK_BAT_HINT", false, false),
new StringOption(L"command_line", LAUNCHER_SECTION, CONFIG_FILE, L"COMMAND_LINE_NAME", L"COMMAND_LINE_HINT", L"", false),
};
ConfigOptionBase* options2Array[] = {
new OptionMetaSectionLabel(L"SECTION_PV_SELECTOR"),
new BooleanOption(L"freeplay", PATCHES_SECTION, CONFIG_FILE, L"FREEPLAY_NAME", L"FREEPLAY_HINT", true, false),
new DropdownOption(L"quick_start", PATCHES_SECTION, CONFIG_FILE, L"QUICK_START_NAME", L"QUICK_START_HINT", 1, std::vector<LPCWSTR>({ L"Disabled", L"Guest", L"Guest + Normal" })),
new BooleanOption(L"no_scrolling_sfx", PATCHES_SECTION, CONFIG_FILE, L"NO_SCROLLING_SFX_NAME", L"NO_SCROLLING_SFX_HINT", false, false),
new BooleanOption(L"unlock_pseudo", PATCHES_SECTION, CONFIG_FILE, L"UNLOCK_PSEUDO_NAME", L"UNLOCK_PSEUDO_HINT", false, false),
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 OptionMetaSectionLabel(L"SECTION_ESM"),
new BooleanOption(L"autopause", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"AUTOPAUSE_NAME", L"AUTOPAUSE_HINT", true, true),
new OptionMetaSeparator(),
new OptionMetaSpacer(8),
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 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 OptionMetaSeparator(),
new OptionMetaSpacer(8),
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"no_gpu_dialog", LAUNCHER_SECTION, CONFIG_FILE, L"Disable GPU Warning", L"Disables the warning dialog for unsupported GPUs.", false, false),
new OptionMetaSectionLabel(L"SECTION_UI_ELM"),
new BooleanOption(L"cursor", PATCHES_SECTION, CONFIG_FILE, L"CURSOR_NAME", L"CURSOR_HINT", true, false),
new BooleanOption(L"hide_volume", PATCHES_SECTION, CONFIG_FILE, L"HIDE_VOLUME_NAME", L"HIDE_VOLUME_HINT", false, false),
new BooleanOption(L"no_pv_ui", PATCHES_SECTION, CONFIG_FILE, L"NO_PV_UI_NAME", L"NO_PV_UI_HINT", false, false),
new BooleanOption(L"hide_pv_watermark", PATCHES_SECTION, CONFIG_FILE, L"HIDE_PV_WATERMARK_NAME", L"HIDE_PV_WATERMARK_HINT", false, false),
new DropdownOption(L"status_icons", PATCHES_SECTION, CONFIG_FILE, L"STATUS_ICONS_NAME", L"STATUS_ICONS_HINT", 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"NO_LYRICS_NAME", L"NO_LYRICS_HINT", false, false),
new BooleanOption(L"no_error", PATCHES_SECTION, CONFIG_FILE, L"NO_ERROR_NAME", L"NO_ERROR_HINT", true, false),
new BooleanOption(L"hide_freeplay", PATCHES_SECTION, CONFIG_FILE, L"HIDE_FREEPLAY_NAME", L"HIDE_FREEPLAY_HINT", false, false),
new BooleanOption(L"pdloadertext", PATCHES_SECTION, CONFIG_FILE, L"PDLOADERTEXT_NAME", L"PDLOADERTEXT_HINT", true, false),
new BooleanOption(L"allow_custom_freeplay", PATCHES_SECTION, CONFIG_FILE, L"ALLOWCUSTOMFREEPLAY_NAME", L"ALLOWCUSTOMFREEPLAY_HINT", false, false),
new BooleanOption(L"no_timer", PATCHES_SECTION, CONFIG_FILE, L"NO_TIMER_NAME", L"NO_TIMER_HINT", true, false),
new BooleanOption(L"no_timer_sprite", PATCHES_SECTION, CONFIG_FILE, L"NO_TIMER_SPRITE_NAME", L"NO_TIMER_SPRITE_HINT", true, false),
new BooleanOption(L"no_message_bar", PATCHES_SECTION, CONFIG_FILE, L"NO_MESSAGE_BAR_NAME", L"NO_MESSAGE_BAR_HINT", false, false),
new BooleanOption(L"no_stage_text", PATCHES_SECTION, CONFIG_FILE, L"NO_STAGE_TEXT_NAME", L"NO_STAGE_TEXT_HINT", false, false),
new BooleanOption(L"card", PATCHES_SECTION, CONFIG_FILE, L"CARD_NAME", L"CARD_HINT", false, false),
new BooleanOption(L"dwgui_scaling", PATCHES_SECTION, CONFIG_FILE, L"DWGUI_SCALING_NAME", L"DWGUI_SCALING_HINT", false, false),
};
ConfigOptionBase* playerdataArray[] = {
new StringOption(L"player_name", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Player Name:", L"Player name shown in game.", L"NO-NAME", true),
new StringOption(L"level_name", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Level Name:", L"Level (plate) name shown in game.", L"忘れないでね私の声を", true),
new StringOption(L"player_name", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"PLAYER_NAME_NAME", L"PLAYER_NAME_HINT", L"NO-NAME", true),
new StringOption(L"level_name", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"LEVEL_NAME_NAME", L"LEVEL_NAME_HINT", L"忘れないでね私の声を", true),
new NumericOption(L"level_plate_id", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Level Plate:", L"Sets the level background image (plate).", 0, 0, INT_MAX),
new NumericOption(L"level_plate_effect", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Level Plate Effect:", L"Sets the effect on the level background image (plate).", -1, -1, 2),
new NumericOption(L"skin_equip ", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Skin:", L"Sets the gameplay UI skin.", 0, 0, INT_MAX),
new NumericOption(L"level_plate_id", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"LEVEL_PLATE_ID_NAME", L"LEVEL_PLATE_ID_HINT", 0, 0, INT_MAX),
new NumericOption(L"level_plate_effect", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"LEVEL_PLATE_EFFECT_NAME", L"LEVEL_PLATE_EFFECT_HINT", -1, -1, 2),
new NumericOption(L"skin_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"SKIN_EQUIP_NAME", L"SKIN_EQUIP_HINT", 0, 0, INT_MAX),
new NumericOption(L"btn_se_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Button Sound:", L"Sets the sound effect for buttons.\n-1 = song default", -1, -1, INT_MAX),
new NumericOption(L"slide_se_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Slide Sound:", L"Sets the sound effect for slides.\n-1 = song default", -1, -1, INT_MAX),
new NumericOption(L"chainslide_se_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Chainslide Sound:", L"Sets the sound effect for chain slides.\n-1 = song default", -1, -1, INT_MAX),
new NumericOption(L"slidertouch_se_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Slider Touch Sound:", L"Sets the sound effect for touching the slider with no note.\n-1 = song default", -1, -1, INT_MAX),
new BooleanOption(L"act_toggle", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Button SE", L"Enables button/slider sounds.", true, true),
new NumericOption(L"btn_se_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"BTN_SE_EQUIP_NAME", L"BTN_SE_EQUIP_HINT", -1, -1, INT_MAX),
new NumericOption(L"slide_se_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"SLIDE_SE_EQUIP_NAME", L"SLIDE_SE_EQUIP_HINT", -1, -1, INT_MAX),
new NumericOption(L"chainslide_se_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"CHAINSLIDE_SE_EQUIP_NAME", L"CHAINSLIDE_SE_EQUIP_HINT", -1, -1, INT_MAX),
new NumericOption(L"slidertouch_se_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"SLIDERTOUCH_SE_EQUIP_NAME", L"SLIDERTOUCH_SE_EQUIP_HINT", -1, -1, INT_MAX),
new BooleanOption(L"act_toggle", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"ACT_TOGGLE_NAME", L"ACT_TOGGLE_HINT", true, true),
new BooleanOption(L"border_great", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"Clear Border (Great)", L"Shows the clear border for a great rating on the progress bar.", true, true),
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"border_great", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"BORDER_GREAT_NAME", L"BORDER_GREAT_HINT", true, true),
new BooleanOption(L"border_excellent", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"BORDER_EXCELLENT_NAME", L"BORDER_EXCELLENT_HINT", true, true),
new BooleanOption(L"border_rival", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"BORDER_RIVAL_NAME", L"BORDER_RIVAL_HINT", 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_NAME", L"USE_CARD_HINT", false, true),
new BooleanOption(L"module_card_workaround", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"MODULE_CARD_WORKAROUND_NAME", L"MODULE_CARD_WORKAROUND_HINT", true, true),
new BooleanOption(L"use_pv_module_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"USE_PV_MODULE_EQUIP_NAME", L"USE_PV_MODULE_EQUIP_HINT", false, true),
new BooleanOption(L"use_pv_skin_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"USE_PV_SKIN_EQUIP_NAME", L"USE_PV_SKIN_EQUIP_HINT", false, true),
new BooleanOption(L"use_pv_sfx_equip", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"USE_PV_SFX_EQUIP_NAME", L"USE_PV_SFX_EQUIP_HINT", false, 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),
new BooleanOption(L"gamemode_options", PLAYERDATA_SECTION, PLAYERDATA_FILE, L"GAMEMODE_OPTIONS_NAME", L"GAMEMODE_OPTIONS_HINT", true, true),
};
ConfigOptionBase* componentsArray[] = {
new BooleanOption(L"input_emulator", COMPONENTS_SECTION, COMPONENTS_FILE, L"Input Emulator", L"Emulates input through keyboard and/or mouse.", false, true),
new BooleanOption(L"touch_slider_emulator", COMPONENTS_SECTION, COMPONENTS_FILE, L"Slider Emulator", L"Emulates slider through keyboard and/or mouse.", false, true),
new BooleanOption(L"touch_panel_emulator", COMPONENTS_SECTION, COMPONENTS_FILE, L"Touch Panel Emulator", L"Emulates touch panel through mouse.", false, true),
new BooleanOption(L"input_emulator", COMPONENTS_SECTION, COMPONENTS_FILE, L"INPUT_EMULATOR_NAME", L"INPUT_EMULATOR_HINT", false, true),
new BooleanOption(L"touch_slider_emulator", COMPONENTS_SECTION, COMPONENTS_FILE, L"TOUCH_SLIDER_EMULATOR_NAME", L"TOUCH_SLIDER_EMULATOR_HINT", false, true),
new BooleanOption(L"touch_panel_emulator", COMPONENTS_SECTION, COMPONENTS_FILE, L"TOUCH_PANEL_EMULATOR_NAME", L"TOUCH_PANEL_EMULATOR_HINT", false, true),
new BooleanOption(L"player_data_manager", COMPONENTS_SECTION, COMPONENTS_FILE, L"Player Data Manager", L"Loads user-defined values into the PlayerData struct.\nRequired for modules and game mode modifiers.", false, true),
new BooleanOption(L"player_data_manager", COMPONENTS_SECTION, COMPONENTS_FILE, L"PLAYER_DATA_MANAGER_NAME", L"PLAYER_DATA_MANAGER_HINT", false, true),
new BooleanOption(L"frame_rate_manager", COMPONENTS_SECTION, COMPONENTS_FILE, L"Frame Rate Manager", L"Adjusts animations to the correct speed at different frame rates.\nOnly needed when FPS isn't locked at 60.", false, true),
new BooleanOption(L"frame_rate_manager", COMPONENTS_SECTION, COMPONENTS_FILE, L"FRAME_RATE_MANAGER_NAME", L"FRAME_RATE_MANAGER_HINT", false, true),
new BooleanOption(L"fast_loader", COMPONENTS_SECTION, COMPONENTS_FILE, L"Fast Loader", L"Skip or speed up unnecessary loading steps.", false, true),
new BooleanOption(L"fast_loader", COMPONENTS_SECTION, COMPONENTS_FILE, L"FAST_LOADER_NAME", L"FAST_LOADER_HINT", false, true),
new NumericOption(L"fast_loader_speed", COMPONENTS_SECTION, COMPONENTS_FILE, L"Fast Loader Speed", L"Set this to 4 or less when playing online.\nDefault: 39", 39, 2, 1024),
new NumericOption(L"fast_loader_speed", COMPONENTS_SECTION, COMPONENTS_FILE, L"FAST_LOADER_SPEED_NAME", L"FAST_LOADER_SPEED_HINT", 39, 2, 1024),
new BooleanOption(L"camera_controller", COMPONENTS_SECTION, COMPONENTS_FILE, L"Camera Controller", L"Enables freecam (toggled using F3).\nWASD to move, SPACE/CTRL for up/down, Q/R to rotate, R/F for zoom.\nHolding SHIFT/ALT changes control speed.", false, true),
new BooleanOption(L"camera_controller", COMPONENTS_SECTION, COMPONENTS_FILE, L"CAMERA_CONTROLLER_NAME", L"CAMERA_CONTROLLER_HINT", false, true),
new BooleanOption(L"scale_component", COMPONENTS_SECTION, COMPONENTS_FILE, L"Scale Component", L"Scales the graphics output framebuffer to fill the screen/window.", false, true),
new BooleanOption(L"scale_component", COMPONENTS_SECTION, COMPONENTS_FILE, L"SCALE_COMPONENT_NAME", L"SCALE_COMPONENT_HINT", false, true),
new BooleanOption(L"debug_component", COMPONENTS_SECTION, COMPONENTS_FILE, L"Debug Component", L"Allows for changing game state (F4-F8 keys), using dev GUI and tests, and speeding up 2d animations/menus (hold SHIFT+TAB).", false, true),
new BooleanOption(L"debug_component", COMPONENTS_SECTION, COMPONENTS_FILE, L"DEBUG_COMPONENT_NAME", L"DEBUG_COMPONENT_HINT", false, true),
new BooleanOption(L"target_inspector", COMPONENTS_SECTION, COMPONENTS_FILE, L"Target Inspector", L"Enables hold transfers.", false, true),
new BooleanOption(L"target_inspector", COMPONENTS_SECTION, COMPONENTS_FILE, L"TARGET_INSPECTOR_NAME", L"TARGET_INSPECTOR_HINT", false, true),
new BooleanOption(L"score_saver", COMPONENTS_SECTION, COMPONENTS_FILE, L"Score Saver", L"Saves high scores to plugins/scores.ini.", false, true),
new BooleanOption(L"score_saver", COMPONENTS_SECTION, COMPONENTS_FILE, L"SCORE_SAVER_NAME", L"SCORE_SAVER_HINT", true, true),
new BooleanOption(L"pause", COMPONENTS_SECTION, COMPONENTS_FILE, L"Pause", L"Adds a pause menu.", false, true),
new BooleanOption(L"pause", COMPONENTS_SECTION, COMPONENTS_FILE, L"PAUSE_NAME", L"PAUSE_HINT", false, true),
};
bool IsLineInFile(LPCSTR searchLine, LPCWSTR fileName)
@@ -378,7 +392,6 @@ void PrependFile(LPCSTR newStr, LPCWSTR fileName)
fileStream.close();
}
struct PluginInfo {
HMODULE handle;
std::wstring filename;
@@ -394,11 +407,15 @@ std::vector<PluginInfo> LoadPlugins()
HANDLE hFind;
WIN32_FIND_DATAW ffd;
//LPCWSTR dir = (PLUGINS_DIR + L"\\*.dva").c_str();
//wprintf(L"[Launcher] Searching for plugins in %s\n", dir);
hFind = FindFirstFileW((PLUGINS_DIR + L"\\*.dva").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 - 4] == '.' &&
@@ -441,6 +458,7 @@ std::vector<PluginInfo> LoadPlugins()
// sometimes this might screw with custom button config, so let's just not free stuff
// FreeLibrary(thisplugin.handle);
//wprintf(L"[Launcher] Found %s\n", ffd.cFileName);
outvec.push_back(thisplugin);
}
}
@@ -459,7 +477,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(), false, pi.configopts);
outvec.push_back(opt);
}
@@ -475,11 +493,15 @@ std::vector<PluginInfo> LoadCustom()
HANDLE hFind;
WIN32_FIND_DATAW ffd;
hFind = FindFirstFileW((PATCHES_DIR + L"\\*.p?").c_str(), &ffd);
//LPCWSTR dir = (PATCHES_DIR + L"\\*.p*").c_str();
//wprintf(L"[Launcher] Searching for patches in %s\n", dir);
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')) ||
@@ -496,6 +518,7 @@ std::vector<PluginInfo> LoadCustom()
thisplugin.description = L"Custom patch";
//wprintf(L"[Launcher] Found %s\n", ffd.cFileName);
outvec.push_back(thisplugin);
}
}
@@ -513,7 +536,7 @@ std::vector<PluginOption*> GetCustomOptions(std::vector<PluginInfo>* patches)
for (PluginInfo& pi : *patches)
{
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(), false, pi.configopts);
outvec.push_back(opt);
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,18 @@
#include <iostream>
using namespace System::Resources;
using namespace System::Reflection;
using namespace System;
using namespace System::IO;
ref class i18n
{
public:
static ResourceManager^ ResMgr = gcnew ResourceManager("Launcher.Resources", i18n::typeid->Assembly);
static String^ GetStringFallback(String^ name) {
String^ result = ResMgr->GetString(name);
return result != nullptr ? result : name;
}
};
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

@@ -0,0 +1,61 @@
#pragma once
#include <windows.h>
#include <string>
void setFullscreenOptimizations(bool enable)
{
HKEY Layers;
LONG result = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers", 0, KEY_ALL_ACCESS, &Layers);
if (!result == ERROR_SUCCESS) return;
WCHAR value[MAX_PATH];
GetModuleFileNameW(NULL, value, MAX_PATH);
if (!enable)
{
const LPCTSTR data = L"~ DISABLEDXMAXIMIZEDWINDOWEDMODE\0\0";
result = RegSetValueExW(Layers, value, 0, REG_SZ, (LPBYTE)data, 2*(wcslen(data) + 1));
}
else result = RegDeleteValueW(Layers, value);
if (!result == ERROR_SUCCESS) return;
result = RegCloseKey(Layers);
if (!result == ERROR_SUCCESS) return;
}
bool getFullscreenOptimizations()
{
HKEY Layers;
LONG result = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers", 0, KEY_ALL_ACCESS, &Layers);
if (!result == ERROR_SUCCESS) return 0;
WCHAR value[MAX_PATH];
GetModuleFileNameW(NULL, value, MAX_PATH);
//const LPCTSTR data = L"~ DISABLEDXMAXIMIZEDWINDOWEDMODE";
DWORD DataSize = 2048;
WCHAR* DataPtr = (WCHAR*)malloc(DataSize);
memset(DataPtr, 0, DataSize);
result = RegQueryValueExW(Layers, value, NULL, NULL, (LPBYTE)DataPtr, &DataSize);
if (!result == ERROR_SUCCESS) return 1;
result = RegCloseKey(Layers);
if (!result == ERROR_SUCCESS) return 1;
std::wstring regstr(DataPtr);
bool val = regstr.find(L"DISABLEDXMAXIMIZEDWINDOWEDMODE") == -1;
//bool val = wcscmp(data, DataPtr);
free(DataPtr);
return val;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,321 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="button_Launch.Text" xml:space="preserve">
<value>Avvia</value>
</data>
<data name="checkBox_nofsopt.Text" xml:space="preserve">
<value>Disabilita ottimizazioni schermo intero</value>
</data>
<data name="checkBox_nofsopt.ToolTip" xml:space="preserve">
<value>Disattiva ottimizzazioni schermo intero, che possono causare problemi con screenshot e/o la frequenza dei fotogrammi</value>
</data>
<data name="groupBox_ScreenRes.Text" xml:space="preserve">
<value>Risoluzione dello schermo</value>
</data>
<data name="groupBox_Lag.Text" xml:space="preserve">
<value>Compensazione lag</value>
</data>
<data name="groupBox_Details.Text" xml:space="preserve">
<value>Dettagli</value>
</data>
<data name="groupBox_InternalRes.Text" xml:space="preserve">
<value>Risoluzione interna (qualità)</value>
</data>
<data name="tabPage_Resolution.Text" xml:space="preserve">
<value>Grafica</value>
</data>
<data name="tabPage_Patches.Text" xml:space="preserve">
<value>Opzioni</value>
</data>
<data name="tabPage_Playerdata.Text" xml:space="preserve">
<value>Giocatore</value>
</data>
<data name="linkLabel_Console.Text" xml:space="preserve">
<value>Console</value>
</data>
<data name="tabPage_Components.Text" xml:space="preserve">
<value>Componenti</value>
</data>
<data name="tabPage_Plugins.Text" xml:space="preserve">
<value>Plugin e patch</value>
</data>
<data name="creditsTextBox.Text" xml:space="preserve">
<value>PD Loader è inteso a scopi didattici; non per pirateria.
Gli utenti devono possedere una copia del gioco ottenuta legalmente per usare questo software. Si prega di controllare le leggi/regolamenti locali per verificare la legalità del manipolare ed estrarre dati da macchine arcade protette.
Hanno contribuito al progetto:
***REMOVED***, Brolijah, crash5b, ona, korenkonder, Kyberal, lybxlpsv, nastys,
Nezarn, samyuu, Skyth, somewhatlurker, Stewie1.0, SwigS-27, zsccat
PD Loader e i plugin inclusi sono distribuiti secondo le condizioni della licenza MIT:
Project Contributors:
***REMOVED***, Brolijah, crash5b, ona, korenkonder, Kyberal, lybxlpsv, nastys,
Nezarn, samyuu, Skyth, somewhatlurker, Stewie1.0, SwigS-27, zsccat
PD Loader and the included plugins are distributed under MIT License:
Copyright (c) Project DIVA Modding 2nd Community
Copyright (c) samyuu (nop) (original TLAC code)
Copyright (c) ThirteenAG (original Ultimate ASI Loader code)
Copyright (c) Magicial Studio
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Microsoft Detours, utilized by many plugins, is licensed under MIT License:
# Copyright (c) Microsoft Corporation
All rights reserved.
# MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Launcher, Patches, Render and TLAC plugins utilize files from FreeGLUT:
Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Pawel W. Olszta shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Pawel W. Olszta.
Launcher uses SimpleIni, licensed under MIT License:
The MIT License (MIT)
Copyright (c) 2006-2013 Brodie Thiesfield
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
DivaSound uses miniaudio (public domain or MIT-0) and BASSASIO (free for
non-commercial use only)
AMD compatibilty pack dependencies have additional licenses, detailed in the AMD</value>
</data>
<data name="tabPage_Credits.Text" xml:space="preserve">
<value>Crediti</value>
</data>
<data name="linkLabel_Repo.Text" xml:space="preserve">
<value>Repository ufficiale</value>
</data>
<data name="linkLabel_Help.Text" xml:space="preserve">
<value>Aiuto</value>
</data>
<data name="linkLabel_Official_Discord.Text" xml:space="preserve">
<value>Server Discord ufficiale</value>
</data>
<data name="linkLabel_Changelog.Text" xml:space="preserve">
<value>Novità</value>
</data>
<data name="button_Clean_installation.Text" xml:space="preserve">
<value>Installazione pulita</value>
</data>
<data name="button_Instructions.Text" xml:space="preserve">
<value>Istruzioni</value>
</data>
<data name="button_Unstable_builds.Text" xml:space="preserve">
<value>Build instabili</value>
</data>
<data name="button_Releases_page.Text" xml:space="preserve">
<value>Pagina rilasci</value>
</data>
<data name="label_Update_2.Text" xml:space="preserve">
<value>Si consiglia caldamente di scaricare gli aggiornamenti direttamente dal repository ufficiale.
Se PD Loader è stato scaricato altrove, si consiglia di fare un'installazione pulita.</value>
</data>
<data name="label_Update_1.Text" xml:space="preserve">
<value>Aggiorna PD Loader con regolarità per ottenere le ultime funzionalità
e correzioni di bug!</value>
</data>
<data name="tabPage_Update.Text" xml:space="preserve">
<value>AGGIORNA</value>
</data>
<data name="button_Apply.Text" xml:space="preserve">
<value>Applica</value>
</data>
</root>
@@ -0,0 +1,344 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="button_Launch.Text" xml:space="preserve">
<value>開始</value>
</data>
<data name="checkBox_nofsopt.Text" xml:space="preserve">
<value>フルスクリーンの最適化を無効にする</value>
</data>
<data name="checkBox_nofsopt.ToolTip" xml:space="preserve">
<value>Windows 10/11のフルスクリーン最適化を無効にします。
は、スクリーンショットやフレームレートの問題を引き起こす可能性があります</value>
</data>
<data name="groupBox_ScreenRes.Text" xml:space="preserve">
<value>画面解像度</value>
</data>
<data name="groupBox_Lag.Text" xml:space="preserve">
<value>レイテンシー補正</value>
</data>
<data name="groupBox_Details.Text" xml:space="preserve">
<value>グラフィックス</value>
</data>
<data name="groupBox_InternalRes.Text" xml:space="preserve">
<value>内部解像度(品質)</value>
</data>
<data name="tabPage_Resolution.Text" xml:space="preserve">
<value>画像</value>
</data>
<data name="tabPage_Patches.Text" xml:space="preserve">
<value>設定</value>
</data>
<data name="tabPage_Playerdata.Text" xml:space="preserve">
<value>プレーヤー</value>
</data>
<data name="linkLabel_Console.Text" xml:space="preserve">
<value>ターミナル</value>
</data>
<data name="tabPage_Components.Text" xml:space="preserve">
<value>コンポーネンテズ</value>
</data>
<data name="tabPage_Plugins.Text" xml:space="preserve">
<value>プラグインとパッチ</value>
</data>
<data name="button_ModRename.Text" xml:space="preserve">
<value>名前の変更</value>
</data>
<data name="button_ModRescan.Text" xml:space="preserve">
<value>再スキャン</value>
</data>
<data name="button_ModFiles.Text" xml:space="preserve">
<value>ファイル...</value>
</data>
<data name="checkBox_ModPatches.Text" xml:space="preserve">
<value>プラグインとパッチ</value>
</data>
<data name="button_ModDelete.Text" xml:space="preserve">
<value>削除</value>
</data>
<data name="button_ModClone.Text" xml:space="preserve">
<value>新規/クローン</value>
</data>
<data name="button_ModSetActive.Text" xml:space="preserve">
<value>起動</value>
</data>
<data name="tabPage_Modpacks.Text" xml:space="preserve">
<value>Modpacks</value>
</data>
<data name="creditsTextBox.Text" xml:space="preserve">
<value>PD Loaderは教育目的のみであり、海賊行為を目的としたものではありません。
本ソフトウェアを使用するには、合法的に入手したゲームのダンプを所有している必要があります。
業務用ゲーム機のデータを改ざんしたり、ダンプしたりすることの合法性については
データを改ざんしたり、保護されたアーケードマシンのハードウェアからデータをダンプすることの合法性を確認してください。
プロジェクト貢献者:
***REMOVED***, Brolijah, crash5b, ona, korenkonder, Kyberal, lybxlpsv, nastys,
Nezarn, samyuu, Skyth, somewhatlurker, Stewie1.0, SwigS-27, zsccat
Japanese Translation (日本語訳) by ManMan
PD Loader and the included plugins are distributed under MIT License:
Copyright (c) Project DIVA Modding 2nd Community
Copyright (c) samyuu (nop) (original TLAC code)
Copyright (c) ThirteenAG (original Ultimate ASI Loader code)
Copyright (c) Magicial Studio
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Microsoft Detours, utilized by many plugins, is licensed under MIT License:
# Copyright (c) Microsoft Corporation
All rights reserved.
# MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Launcher, Patches, Render and TLAC plugins utilize files from FreeGLUT:
Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Pawel W. Olszta shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Pawel W. Olszta.
Launcher uses SimpleIni, licensed under MIT License:
The MIT License (MIT)
Copyright (c) 2006-2013 Brodie Thiesfield
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
DivaSound uses miniaudio (public domain or MIT-0) and BASSASIO (free for
non-commercial use only)
AMD compatibilty pack dependencies have additional licenses, detailed in the AMD</value>
</data>
<data name="tabPage_Credits.Text" xml:space="preserve">
<value>クレディット</value>
</data>
<data name="linkLabel_Repo.Text" xml:space="preserve">
<value>公式リポジトリ</value>
</data>
<data name="linkLabel_Help.Text" xml:space="preserve">
<value>ヘルプ</value>
</data>
<data name="linkLabel_Official_Discord.Text" xml:space="preserve">
<value>公式Discordサーバー</value>
</data>
<data name="linkLabel_Changelog.Text" xml:space="preserve">
<value>変更履歴</value>
</data>
<data name="button_Clean_installation.Text" xml:space="preserve">
<value>新規インストール</value>
</data>
<data name="button_Instructions.Text" xml:space="preserve">
<value>説明書</value>
</data>
<data name="button_Unstable_builds.Text" xml:space="preserve">
<value>不安定なバージョン</value>
</data>
<data name="button_Releases_page.Text" xml:space="preserve">
<value>アップデートページ</value>
</data>
<data name="label_Update_2.Text" xml:space="preserve">
<value>アップデートは公式リポジトリから直接ダウンロードすることを強くお勧めします。
他の場所からPD Loaderをダウンロードした場合は、クリーンインストールをお勧めします</value>
</data>
<data name="label_Update_1.Text" xml:space="preserve">
<value>PD Loaderを定期的にアップデートする
をクリックすると、最新の修正や新機能が表示されます</value>
</data>
<data name="tabPage_Update.Text" xml:space="preserve">
<value>アップデイト</value>
</data>
<data name="button_Apply.Text" xml:space="preserve">
<value>適用</value>
</data>
</root>
@@ -0,0 +1,321 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="button_Launch.Text" xml:space="preserve">
<value>Iniciar</value>
</data>
<data name="checkBox_nofsopt.Text" xml:space="preserve">
<value>Desativar Otimizações de Tela Cheia</value>
</data>
<data name="checkBox_nofsopt.ToolTip" xml:space="preserve">
<value>Desabilita as Otimizações de Tela Cheia do Windows 10/11, já que estas
podem causar problemas com capturas de tela e/ou taxa de quadros.</value>
</data>
<data name="groupBox_ScreenRes.Text" xml:space="preserve">
<value>Resolução da Tela</value>
</data>
<data name="groupBox_Lag.Text" xml:space="preserve">
<value>Compensação de Latência de Áudio</value>
</data>
<data name="groupBox_Details.Text" xml:space="preserve">
<value>Gráficos</value>
</data>
<data name="groupBox_InternalRes.Text" xml:space="preserve">
<value>Resolução Interna (Qualidade)</value>
</data>
<data name="tabPage_Resolution.Text" xml:space="preserve">
<value>Imagem</value>
</data>
<data name="tabPage_Patches.Text" xml:space="preserve">
<value>Opções</value>
</data>
<data name="tabPage_Playerdata.Text" xml:space="preserve">
<value>Jogador</value>
</data>
<data name="linkLabel_Console.Text" xml:space="preserve">
<value>Terminal</value>
</data>
<data name="tabPage_Components.Text" xml:space="preserve">
<value>Componentes</value>
</data>
<data name="tabPage_Plugins.Text" xml:space="preserve">
<value>Plugins e Patches</value>
</data>
<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
with and dumping data from protected arcade machine hardware.
Project Contributors:
***REMOVED***, Brolijah, crash5b, ona, korenkonder, Kyberal, lybxlpsv, nastys,
Nezarn, samyuu, Skyth, somewhatlurker, Stewie1.0, SwigS-27, zsccat
Brazilian Portuguese Translation (Tradução para o Português Brasileiro): _ScarletNeko
(revised by nastys and ManMan)
PD Loader and the included plugins are distributed under MIT License:
Copyright (c) Project DIVA Modding 2nd Community
Copyright (c) samyuu (nop) (original TLAC code)
Copyright (c) ThirteenAG (original Ultimate ASI Loader code)
Copyright (c) Magicial Studio
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Microsoft Detours, utilized by many plugins, is licensed under MIT License:
# Copyright (c) Microsoft Corporation
All rights reserved.
# MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Launcher, Patches, Render and TLAC plugins utilize files from FreeGLUT:
Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Pawel W. Olszta shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Pawel W. Olszta.
Launcher uses SimpleIni, licensed under MIT License:
The MIT License (MIT)
Copyright (c) 2006-2013 Brodie Thiesfield
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
DivaSound uses miniaudio (public domain or MIT-0) and BASSASIO (free for
non-commercial use only)
AMD compatibilty pack dependencies have additional licenses, detailed in the AMD</value>
</data>
<data name="tabPage_Credits.Text" xml:space="preserve">
<value>Créditos</value>
</data>
<data name="linkLabel_Repo.Text" xml:space="preserve">
<value>Repositório Oficial</value>
</data>
<data name="linkLabel_Help.Text" xml:space="preserve">
<value>Ajuda</value>
</data>
<data name="linkLabel_Official_Discord.Text" xml:space="preserve">
<value>Servidor do Discord Oficial</value>
</data>
<data name="linkLabel_Changelog.Text" xml:space="preserve">
<value>Histórico de Mudanças</value>
</data>
<data name="button_Clean_installation.Text" xml:space="preserve">
<value>Instalação Limpa</value>
</data>
<data name="button_Instructions.Text" xml:space="preserve">
<value>Instruções</value>
</data>
<data name="button_Unstable_builds.Text" xml:space="preserve">
<value>Versões Instáveis</value>
</data>
<data name="button_Releases_page.Text" xml:space="preserve">
<value>Página de Atualizações</value>
</data>
<data name="label_Update_2.Text" xml:space="preserve">
<value>É altamente recomendado baixar as atualizações diretamente do repositório oficial.
Se você baixou o PD Loader de algum outro lugar, é recomendado fazer uma instalação limpa.</value>
</data>
<data name="label_Update_1.Text" xml:space="preserve">
<value>Atualize o PD Loader regularmente
para obter as últimas correções e novas funções!</value>
</data>
<data name="tabPage_Update.Text" xml:space="preserve">
<value>ATUALIZAR</value>
</data>
<data name="button_Apply.Text" xml:space="preserve">
<value>Aplicar</value>
</data>
</root>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,313 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="button_Launch.Text" xml:space="preserve">
<value>启动</value>
</data>
<data name="groupBox_ScreenRes.Text" xml:space="preserve">
<value>显示分辨率</value>
</data>
<data name="checkBox_nofsopt.Text" xml:space="preserve">
<value>禁用全屏优化</value>
</data>
<data name="checkBox_nofsopt.ToolTip" xml:space="preserve">
<value>禁用 Windows 10/11 全屏优化,该特性可能会导致截图或帧率问题。</value>
</data>
<data name="tabPage_Resolution.Text" xml:space="preserve">
<value>显示设定</value>
</data>
<data name="groupBox_Lag.Text" xml:space="preserve">
<value>延迟调整 </value>
</data>
<data name="groupBox_Details.Text" xml:space="preserve">
<value>特效设定</value>
</data>
<data name="groupBox_InternalRes.Text" xml:space="preserve">
<value>内部渲染分辨率(渲染倍率)</value>
</data>
<data name="tabPage_Patches.Text" xml:space="preserve">
<value>游戏设定</value>
</data>
<data name="tabPage_Playerdata.Text" xml:space="preserve">
<value>玩家资料设定</value>
</data>
<data name="tabPage_Components.Text" xml:space="preserve">
<value>TLAC 模块设定</value>
</data>
<data name="tabPage_Plugins.Text" xml:space="preserve">
<value>插件设定</value>
</data>
<data name="tabPage_Credits.Text" xml:space="preserve">
<value>关于</value>
</data>
<data name="tabPage_Update.Text" xml:space="preserve">
<value>更新</value>
</data>
<data name="button_Apply.Text" xml:space="preserve">
<value>应用</value>
</data>
<data name="button_Clean_installation.Text" xml:space="preserve">
<value>清洁安装</value>
</data>
<data name="button_Instructions.Text" xml:space="preserve">
<value>安装教程</value>
</data>
<data name="button_Releases_page.Text" xml:space="preserve">
<value>获取稳定版本</value>
</data>
<data name="button_Unstable_builds.Text" xml:space="preserve">
<value>获取开发版本</value>
</data>
<data name="label_Update_1.Text" xml:space="preserve">
<value>请经常更新PD Loader以获取最新的补丁以及功能!</value>
</data>
<data name="label_Update_2.Text" xml:space="preserve">
<value>PD Loader开发团队强烈建议您从官方渠道获取PD Loader构建
如果您的PD Loader是由非官方渠道获取的,我们建议您进行一次清洁安装</value>
</data>
<data name="linkLabel_Changelog.Text" xml:space="preserve">
<value>更新日志</value>
</data>
<data name="linkLabel_Console.Text" xml:space="preserve">
<value>调试窗口</value>
</data>
<data name="linkLabel_Help.Text" xml:space="preserve">
<value>帮助</value>
</data>
<data name="linkLabel_Official_Discord.Text" xml:space="preserve">
<value>官方Discord群聊</value>
</data>
<data name="linkLabel_Repo.Text" xml:space="preserve">
<value>官方代码仓库</value>
</data>
<data name="creditsTextBox.Text" xml:space="preserve">
<value>PD Loader仅为学习而非盗版目的而构建
此软件的使用者应当使用合法的Project DIVA Arcade Future Tone 软件拷贝以运行此软件
此软件的使用者应当检查当地的法律/法规以确认从被保护的街机上获取/修改数据的合法性
项目贡献者:
***REMOVED***, Brolijah, crash5b, ona, korenkonder, Kyberal, lybxlpsv, nastys,
Nezarn, samyuu, Skyth, somewhatlurker, Stewie1.0, SwigS-27, zsccat
PD Loader 以及其包含的组件基于MIT协议进行分发
版权所有 (c) Project DIVA Modding 2nd Community
版权所有 (c) samyuu (nop) (TLAC原作者)
版权所有 (c) ThirteenAG (Ultimate ASI Loader原作者)
版权所有 (c) Magicial Studio
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
大部分插件所使用的Microsoft Detours函数库基于 MIT 协议进行分发:
# 版权所有 (c) Microsoft Corporation
保留所有权利
# MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Launcher, Patches, Render and TLAC 插件使用了来自FreeGLUT的项目文件
版权所有(c) 1999-2000 Pawel W. Olszta. 保留所有权利
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Pawel W. Olszta shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Pawel W. Olszta.
Launcher所使用的SimpleIni函数库, 基于MIT协议进行分发
The MIT License (MIT)
版权所有 (c) 2006-2013 Brodie Thiesfield
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
DivaSound 所使用的miniaudio函数库基于 MIT-0协议进行分发;所使用的BASSASIO 函数库具有非商用免费许可
AMD 兼容组件(Novidia组件)所使用的函数库具有附加条款,具体事宜请参考AMD文档</value>
</data>
</root>
@@ -58,6 +58,7 @@
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\..\..\dependencies\GPUModel;..\..\..\dependencies\xdelta3;..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\detours\include;</AdditionalIncludeDirectories>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -75,6 +76,7 @@
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>..\..\..\dependencies\GPUModel;..\..\..\dependencies\xdelta3;..\..\..\dependencies\PluginConfigApi;..\..\..\dependencies\detours\include;</AdditionalIncludeDirectories>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@@ -84,7 +84,7 @@ std::wstring DirPath() {
return exepath.substr(0, pos);
}
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\Novidia.ini";
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\Novidia.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
@@ -1,342 +0,0 @@
#pragma once
#include <vector>
#include "PatchApplier.h"
#include "framework.h"
class PatchApplier600 : public PatchApplier {
virtual void ApplyPatches() {
const struct { void* Address; std::vector<uint8_t> Data; } patches_600[] =
{
// Always return true for the SelCredit enter SelPv check
{ (void*)0x000000014037A560, { 0xB0, 0x01, 0xC3, 0x90, 0x90, 0x90 } },
// Just completely ignore all SYSTEM_STARTUP errors
{ (void*)0x00000001403DC590, { 0xC3 } },
// Always exit TASK_MODE_APP_ERROR on the first frame
{ (void*)0x00000001403DE8B7, { 0x90, 0x90 } },
{ (void*)0x00000001403DE8D3, { 0x89, 0xD1, 0x90 } },
// Ignore the EngineClear variable to clear the framebuffer at all resolutions
{ (void*)0x00000001404E7470, { 0x90, 0x90 } },
{ (void*)0x00000001404E7505, { 0x90, 0x90 } },
// Write ram files to the current directory instead of Y : / SBZV / ram
{ (void*)0x0000000140648AE9, { 0xE9, 0xD8, 0x00 } },
// Change mdata path from "C:/Mount/Option" to "mdata/"
{ (void*)0x0000000140A51058, { 0x6D, 0x64, 0x61, 0x74, 0x61, 0x2F, 0x00 } },
{ (void*)0x0000000140648A8E, { 0x06 } },
// Skip parts of the network check state
{ (void*)0x000000014064D391, { 0xE9, 0x22, 0x03, 0x00 } },
// Set the initial DHCP WAIT timer value to 0
{ (void*)0x000000014064E0C7, { 0x00, 0x00 } },
// Ignore SYSTEM_STARTUP Location Server checks
{ (void*)0x000000014064EE82, { 0x90, 0x90 } },
// Toon Shader Fix by lybxlpsv
{ (void*)0x00000001404E813F, { 0x90 } },
{ (void*)0x00000001404E8140, { 0x90 } },
// Toon Shader Outline Fix by lybxlpsv
{ (void*)0x000000014061C6B2, { 0x01 } },
// Skip unnecessary checks
{ (void*)0x0000000140207FB0, { 0xB8, 0x00, 0x00, 0x00, 0x00, 0xC3 } },
{ (void*)0x000000014064A400, { 0xB8, 0x01, 0x00, 0x00, 0x00, 0xC3 } },
// Disables call to glutFitWindowSizeToDesktop, prevents window automatic resize
{ (void*)0x000000014018CE06, { 0x90, 0x90, 0x90, 0x90, 0x90 } },
// Allow modifier mode selection (by Team Shimapan)
{ (void*)0x00000001405A7C03, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },
{ (void*)0x00000001405A6B45, { 0x90, 0x90 } },
// allow modifier modes to work without use_card
{ (void*)0x00000001405A7B9A,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },
{ (void*)0x000000014012F2CA,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },
// enable module selector without use_card
// { (void*)0x00000001405C513B,{ 0x01 } }, // no
// Force Hide IDs
{ (void*)0x000000014096D840, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
{ (void*)0x000000014096D850, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
// fix TouchReaction
// get some more space by optimizing this code for size
/*{ (void*)0x000000014067D1F2,{ 0x7E } }, // MOVQ XMM0,qword ptr [0x168 + RSP] (change to MOVQ)
{ (void*)(0x000000014067D1F2 + 0x7),{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x6C } }, // MOVQ qword ptr [RSP + 0x6c],XMM0
{ (void*)(0x000000014067D1F2 + 0xD),{ 0xC7, 0x44, 0x24, 0x74, 0x00, 0x00, 0x00, 0x00 } }, // MOV dword ptr [RSP + 0x74],0x0
{ (void*)(0x000000014067D1F2 + 0x15),{ 0xEB, 0x0E } }, // JMP 0x1406a2007 (to rest of function as usual) // unsure
// add new code
{ (void*)(0x000000014067D1F2 + 0x17),{ 0x66, 0x48, 0x0F, 0x6E, 0xC2 } }, // MOVQ XMM0,RDX (load touch pos)
{ (void*)(0x000000014067D1F2 + 0x1C),{ 0xEB, 0x5D } }, // JMP 0x1406a205d // unsure
{ (void*)(0x000000014067D1F2 + 0x7B),{ 0x0F, 0x2A, 0x0D, 0xB8, 0x6A, 0x31, 0x00 } }, // CVTPI2PS XMM1,qword ptr [0x1409b8b1c] (load 1280x720) // unsuew
{ (void*)(0x000000014067D1F2 + 0x82),{ 0x0F, 0x12, 0x51, 0x1C } }, // MOVLPS XMM2,qword ptr [RCX + 0x1c] (load actual res)
{ (void*)(0x000000014067D1F2 + 0x86),{ 0xE9, 0x14, 0xFF, 0xFF, 0xFF } }, // JMP 0x1406a1f81 // unsure
{ (void*)(0x000000014067D1F2 - 0x61),{ 0x0F, 0x59, 0xC1 } }, // MULPS XMM0,XMM1
{ (void*)(0x000000014067D1F2 - 0x61),{ 0x0F, 0x5E, 0xC2 } }, // DIVPS XMM0,XMM2
{ (void*)(0x000000014067D1F2 - 0x5B),{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x10 } }, // MOVQ qword ptr [RSP+0x10],XMM0
{ (void*)(0x000000014067D1F2 - 0x55),{ 0xEB, 0x06 } }, // JMP 0x1406a1f95 (back to original function) // unsure
// jmp to new code
{ (void*)(0x000000014067D1F2 - 0x52),{ 0xEB, 0x67 } },*/ // JMP 0x1406a1ff9 // unsure
};
for (size_t i = 0; i < _countof(patches_600); i++)
InjectCode(patches_600[i].Address, patches_600[i].Data);
// The old stereo patch...
// Use 2 channels instead of 4
if (nStereo)
{
InjectCode((void*)0x0000000140A4A588, { 0x02 });
printf("[Patches] Stereo patch enabled\n");
}
// Disable AA
if (!nTAA)
{
// set TAA var (shouldn't be needed but whatever)
//*(byte*)0x00000001411AB67C = 0; // no
// make constructor/init not set TAA
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x000000014049258D, 3, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x000000014049258D + 0) = 0x90;
*((byte*)0x000000014049258D + 1) = 0x90;
*((byte*)0x000000014049258D + 2) = 0x90;
VirtualProtect((BYTE*)0x000000014049258D, 3, oldProtect, &bck); }
// not sure, but it's somewhere in TaskPvGame init
// just make it set TAA to 0 instead of 1 to avoid possible issues
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x00000001400FF48D, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x00000001400FF48D + 0) = 0x00;
VirtualProtect((BYTE*)0x00000001400FF48D, 1, oldProtect, &bck); }
// prevent re-enabling after taking photos
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x0000000140476EC8, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x0000000140476EC8 + 0) = 0x00;
VirtualProtect((BYTE*)0x0000000140476EC8, 1, oldProtect, &bck); }
printf("[Patches] TAA disabled\n");
}
if (!nMLAA)
{
// set MLAA var (shouldn't be needed but whatever)
//*(byte*)0x00000001411AB680 = 0; // no
// make constructor/init not set MLAA
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x000000014049258A, 3, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x000000014049258A + 0) = 0x90;
*((byte*)0x000000014049258A + 1) = 0x90;
*((byte*)0x000000014049258A + 2) = 0x90;
VirtualProtect((BYTE*)0x000000014049258A, 3, oldProtect, &bck); }
printf("[Patches] MLAA disabled\n");
}
// Replace the hardcoded videos with MP4s, if they exist
if (nMP4Movies)
{
patchMovieExt("adv_cfm_cm", (void*)0x0000000140989ED5);
patchMovieExt("adv_sega_cm", (void*)0x0000000140989EF6);
patchMovieExt("diva_adv02", (void*)0x00000001409C537D);
patchMovieExt("diva_adv", (void*)0x00000001409C53AB);
}
// Hide "FREE PLAY"
if (nHideFreeplay)
{
InjectCode((void*)0x0000000140388A5B, { 0x06, 0xB6 });
printf("[Patches] Hide FREE PLAY/CREDIT(S) enabled\n");
}
// Enable "FREE PLAY" mode
if (nFreeplay || nHideFreeplay)
{
InjectCode((void*)0x00000001403A1B1A, { 0x75 });
printf("[Patches] Show FREE PLAY instead of CREDIT(S)\n");
if (nPDLoaderText && !nHideFreeplay)
{
InjectCode((void*)0x00000001409BC188, { 0x50, 0x44, 0x20, 0x4C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x20, 0x00 });
printf("[Patches] Show PD Loader text\n");
}
}
// Use GLUT_CURSOR_RIGHT_ARROW instead of GLUT_CURSOR_NONE
if (nCursor)
{
/*InjectCode((void*)0x000000014018B44A, { 0x00 });
InjectCode((void*)0x00000001402E7FE5, { 0xeb }); // Disable debug cursor // unsure
printf("[Patches] Cursor enabled\n");*/
}
// Override status icon states to be invalid (hides them)
if (nStatusIcons > 0)
{
std::vector<uint8_t> cardIcon = { 0xFD, 0x0A };
std::vector<uint8_t> networkIcon = { 0x9E, 0x1E };
if (nStatusIcons == 2) // 2 for error icons
{
cardIcon = { 0xFA, 0x0A };
networkIcon = { 0x9F, 0x1E };
printf("[Patches] Status icons set to error state\n");
}
else if (nStatusIcons == 3) // 3 for OK icons
{
cardIcon = { 0xFC, 0x0A };
networkIcon = { 0xA0, 0x1E };
printf("[Patches] Status icons set to OK state\n");
}
else if (nStatusIcons == 4) // 4 for partial OK icons
{
cardIcon = { 0xFB, 0x0A };
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
InjectCode((void*)0x00000001403A0CA3, cardIcon); // OK state
// network icon
InjectCode((void*)0x00000001403A107B, networkIcon); // error state
InjectCode((void*)0x00000001403A1085, networkIcon); // OK state
InjectCode((void*)0x00000001403A109B, networkIcon); // partial state
InjectCode((void*)0x00000001403A10D5, { 0x48, 0xE9 }); // never show the error code for partial connection
// I was going to use this with a string, but the assignment wasn't behaving well and making separate prints was easier than figuring it out
// printf("[Patches] Status icons %s\n", iconType);
}
// Removes PV watermark
if (nHidePVWatermark)
{
InjectCode((void*)0x00000001409D9798, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
printf("[Patches] PV watermark hidden\n");
}
// Disable the PV screen photo UI
if (nNoPVUi)
{
InjectCode((void*)0x0000000140476DB1, { 0xEB, 0x6F }); // skip button panel image (JMP 0x14048FB02) // unsure
// patch minimum PV UI state to 1 instead of 0
// hook check for lyrics enabled (UI state < 2) to change UI state 0 into 1
// dump new code in the skipped button panel condition
InjectCode((void*)0x0000000140476DB3, { 0xC7, 0x83, 0x58, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }); // MOV dword ptr [0x158 + RBX],0x1
InjectCode((void*)0x0000000140476DBD, { 0xC6, 0x80, 0x3A, 0xD1, 0x02, 0x00, 0x01 }); // MOV byte ptr [0x2d13a + RAX],0x1
InjectCode((void*)0x0000000140476DC4, { 0xE9, 0x8B, 0xFB, 0xFF, 0xFF }); // JMP 0x14048F634 // unsure
InjectCode((void*)0x000000014047694D, { 0xE9, 0x61, 0x04, 0x00, 0x00 }); // JMP 0x14048FA93 // unsure
printf("[Patches] PV UI disabled\n");
}
// Don't show volume control
if (nHideVolCtrl)
{
// skip SE button
InjectCode((void*)0x000000014096CD28, { 0xC0, 0xD3 });
// skip volume sliders button
InjectCode((void*)0x0000000140A4A3D8, { 0xE0, 0x50 });
printf("[Patches] Volume control hidden\n");
}
// Skip loading (and therefore displaying) song lyrics
if (nNoLyrics)
{
InjectCode((void*)0x00000001404CE362, { 0x00, 0x00 });
InjectCode((void*)0x00000001404CE29E, { 0x48, 0xE9 }); // ensure first iteration doesn't run // unsure
printf("[Patches] Lyrics disabled\n");
}
// Skip loading (and therefore displaying) song movies
if (nNoMovies)
{
InjectCode((void*)0x00000001404D1C6B, { 0x48, 0xE9 }); // unsure
InjectCode((void*)0x00000001404D1B61, { 0x48, 0xE9 }); // unsure
printf("[Patches] Movies disabled\n");
}
// Disable error banner
if (nNoError)
{
// Disable Errors Banner
InjectCode((void*)0x00000001403A0DCB, { 0x90, 0x90 });
printf("[Patches] Errors Banner disabled\n");
}
// Disable timer
if (nNoTimer)
{
// Freeze mode selection timer
InjectCode((void*)0x00000001405456DE, { 0x90, 0x90, 0x90 });
// Freeze PV selection timer
InjectCode((void*)0x000000014059B21F, { 0x90, 0x90, 0x90, 0x90 });
}
// Disable timer sprite
if (nNoTimerSprite)
{
InjectCode((void*)0x00000001409883A8, { 0x00 }); // time_loop
InjectCode((void*)0x0000000140A01E20, { 0x00 }); // time_in
InjectCode((void*)0x0000000140A01E28, { 0x00 }); // time_out
}
// Enhanced Stage Manager
if (nEStageManager > 0)
{
// Replace the function that provides the number of stages and compact some of it
InjectCode((void*)0x0000000140371E50, { 0x48, 0x8B, 0x88, 0x40, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x20, 0x48, 0x8B, 0xD0, 0x48, 0x8B, 0x88, 0x48, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x28, 0x8B, 0x88, 0x50, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x30, 0x8B, 0x88, 0x54, 0x01, 0x00, 0x00, 0x8B, 0x80, 0x58, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x38, 0x8B, 0x82, 0x5C, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x34, 0x89, 0x44, 0x24, 0x3C, 0x48, 0x8B, 0x82, 0x60, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 0x82, 0x68, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x82, 0x70, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x50, 0x8B, 0x82, 0x78, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x58, 0x84, 0xC0, 0x74, 0x2A, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x48, 0xC1, 0xE8, 0x20, 0x85, 0xC0, 0x75, 0x1D, 0xE8, 0xD9, 0xD9, 0xE5, 0xFF, 0x48, 0x85, 0xC0, 0x74, 0x13, 0x48, 0x8D, 0x48, 0x10, 0xE8, 0xFB, 0xD3, 0xE5, 0xFF, 0xB9, 0x03, 0x00, 0x00, 0x00, 0x85, 0xC0, 0x0F, 0x45, 0xD9, 0x8B, 0x1D, 0x1B, 0x0C, 0x00, 0x00, 0x83, 0x3D, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x74, 0x06, 0x8B, 0x1D, 0x10, 0x0C, 0x00, 0x00, 0x8B, 0xC3, 0x48, 0x83, 0xC4, 0x60, 0x5B, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC }); // unsure
// Jump to another section by addding some code to replace the values (Jump 1)
InjectCode((void*)(0x0000000140371E50 + 0x104), { 0xE9, 0x87, 0x0B, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC }); // unsure
// Jump to another section by addding some code to replace the values (Replace 1/2) while some reserving space for values
InjectCode((void*)(0x0000000140371E50 + 0xC50), { 0xFF, 0x05, 0x76, 0x00, 0x00, 0x00, 0x8B, 0x0D, 0x70, 0x00, 0x00, 0x00, 0xBA, 0x02, 0x00, 0x00, 0x00, 0x83, 0x3D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0xFF, 0xC2, 0x39, 0xD1, 0x0F, 0x4D, 0xCA, 0x89, 0x48, 0x08, 0xB9, 0x0E, 0x00, 0x00, 0x00, 0xE8, 0x92, 0x98, 0xE0, 0xFF, 0xB0, 0x01, 0x48, 0x83, 0xC4, 0x28, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x44, 0x89, 0x61, 0x08, 0x44, 0x88, 0x61, 0x0C, 0x4C, 0x89, 0x61, 0x10, 0x44, 0x89, 0x25, 0x29, 0x00, 0x00, 0x00, 0xE9, 0x68, 0xF4, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }); // unsure
// Use the value from our own address instead of the original one
InjectCode((void*)0x00000001403DDABF, { 0x48, 0x8D, 0x05, 0x4A, 0x18, 0xDA, 0x00, 0x8B, 0x1D, 0x00, 0x56 }); // unsure
// Jump to another section by addding some code to replace the values (Jump 2)
InjectCode((void*)(0x00000001403F65AF + 0x89), { 0xE9, 0x03, 0x55, 0xF9, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC }); // unsure
DWORD StageCountProtect;
VirtualProtect((int32_t*)0x140372B10, 0x10, PAGE_EXECUTE_READWRITE, &StageCountProtect); // unsure
int* ESM = (int*)0x0000000140372B10; // unsure
if (nEStageManagerEncore)
ESM[1] = nEStageManager;
else
ESM[0] = nEStageManager;
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*)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)
{
InjectCode((void*)0x00000001409E71C0, { 0x00 });
InjectCode((void*)0x00000001409E71D0, { 0x00 });
InjectCode((void*)0x00000001409E71E0, { 0x00 });
InjectCode((void*)0x00000001409E71F0, { 0x00 });
InjectCode((void*)0x00000001409E7200, { 0x00 });
}
// Enable card button by somewhatlurker (pretty much just eye candy for now)
if (nCard)
{
InjectCode((void*)0x00000001405449EB, { 0x90, 0x90 });
}
// The original slider update needs to run for hardware sliders to work -- only patch it when using emulation
if (!nHardwareSlider)
{
// Don't update the touch slider state so we can write our own
InjectCode((void*)0x00000001405F0C5B, { 0x90, 0x90, 0x90, 0x8B, 0x42, 0xE0, 0x90, 0x90, 0x90 });
}
}
};
@@ -1,693 +0,0 @@
#pragma once
#pragma once
#include <vector>
#include "PatchApplier.h"
#include "framework.h"
class PatchApplier710 : public PatchApplier {
virtual void ApplyPatches() {
const struct { void* Address; std::vector<uint8_t> Data; } patches_710[] =
{
// Just completely ignore all SYSTEM_STARTUP errors
{ (void*)0x00000001403F5080, { 0xC3 } },
// Always exit TASK_MODE_APP_ERROR on the first frame
{ (void*)0x00000001403F73A7, { 0x90, 0x90 } },
{ (void*)0x00000001403F73C3, { 0x89, 0xD1, 0x90 } },
// Ignore the EngineClear variable to clear the framebuffer at all resolutions
{ (void*)0x0000000140501480, { 0x90, 0x90 } },
{ (void*)0x0000000140501515, { 0x90, 0x90 } },
// Write ram files to the current directory instead of Y : / SBZV / ram
{ (void*)0x000000014066CF09, { 0xE9, 0xD8, 0x00 } },
// Change mdata path from "C:/Mount/Option" to "mdata/"
{ (void*)0x0000000140A8CA18, { 0x6D, 0x64, 0x61, 0x74, 0x61, 0x2F, 0x00 } },
{ (void*)0x000000014066CEAE, { 0x06 } },
// Skip parts of the network check state
{ (void*)0x00000001406717B1, { 0xE9, 0x22, 0x03, 0x00 } },
// Set the initial DHCP WAIT timer value to 0
{ (void*)0x00000001406724E7, { 0x00, 0x00 } },
// Ignore SYSTEM_STARTUP Location Server checks
{ (void*)0x00000001406732A2, { 0x90, 0x90 } },
// Toon Shader Fix by lybxlpsv
{ (void*)0x000000014050214F, { 0x90 } },
{ (void*)0x0000000140502150, { 0x90 } },
// Toon Shader Outline Fix by lybxlpsv
{ (void*)0x0000000140641102, { 0x01 } },
// Skip unnecessary checks
{ (void*)0x0000000140210820, { 0xB8, 0x00, 0x00, 0x00, 0x00, 0xC3 } },
{ (void*)0x000000014066E820, { 0xB8, 0x01, 0x00, 0x00, 0x00, 0xC3 } },
// Disables call to glutFitWindowSizeToDesktop, prevents window automatic resize
{ (void*)0x0000000140194E06, { 0x90, 0x90, 0x90, 0x90, 0x90 } },
// Allow modifier mode selection (by Team Shimapan)
{ (void*)0x00000001405CB1B3, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },
{ (void*)0x00000001405CA0F5, { 0x90, 0x90 } },
// allow modifier modes to work without use_card
{ (void*)0x00000001405CB14A,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },
{ (void*)0x0000000140136CFA,{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } },
// enable module selector without use_card
{ (void*)0x00000001405C513B,{ 0x01 } },
// fix back button
{ (void*)0x0000000140578FB8, { 0xE9, 0x73, 0xFF, 0xFF, 0xFF } },
// Force Hide IDs
{ (void*)0x00000001409A5918, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
{ (void*)0x00000001409A5928, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
// fix TouchReaction
// get some more space by optimizing this code for size
{ (void*)0x00000001406A1FE2,{ 0x7E } }, // MOVQ XMM0,qword ptr [0x168 + RSP] (change to MOVQ)
{ (void*)0x00000001406A1FE9,{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x6C } }, // MOVQ qword ptr [RSP + 0x6c],XMM0
{ (void*)0x00000001406A1FEF,{ 0xC7, 0x44, 0x24, 0x74, 0x00, 0x00, 0x00, 0x00 } }, // MOV dword ptr [RSP + 0x74],0x0
{ (void*)0x00000001406A1FF7,{ 0xEB, 0x0E } }, // JMP 0x1406a2007 (to rest of function as usual)
// add new code
{ (void*)0x00000001406A1FF9,{ 0x66, 0x48, 0x0F, 0x6E, 0xC2 } }, // MOVQ XMM0,RDX (load touch pos)
{ (void*)0x00000001406A1FFE,{ 0xEB, 0x5D } }, // JMP 0x1406a205d
{ (void*)0x00000001406A205D,{ 0x0F, 0x2A, 0x0D, 0xB8, 0x6A, 0x31, 0x00 } }, // CVTPI2PS XMM1,qword ptr [0x1409b8b1c] (load 1280x720)
{ (void*)0x00000001406A2064,{ 0x0F, 0x12, 0x51, 0x1C } }, // MOVLPS XMM2,qword ptr [RCX + 0x1c] (load actual res)
{ (void*)0x00000001406A2068,{ 0xE9, 0x14, 0xFF, 0xFF, 0xFF } }, // JMP 0x1406a1f81
{ (void*)0x00000001406A1F81,{ 0x0F, 0x59, 0xC1 } }, // MULPS XMM0,XMM1
{ (void*)0x00000001406A1F84,{ 0x0F, 0x5E, 0xC2 } }, // DIVPS XMM0,XMM2
{ (void*)0x00000001406A1F87,{ 0x66, 0x0F, 0xD6, 0x44, 0x24, 0x10 } }, // MOVQ qword ptr [RSP+0x10],XMM0
{ (void*)0x00000001406A1F8D,{ 0xEB, 0x06 } }, // JMP 0x1406a1f95 (back to original function)
// jmp to new code
{ (void*)0x00000001406A1F90,{ 0xEB, 0x67 } }, // JMP 0x1406a1ff9
};
for (size_t i = 0; i < _countof(patches_710); i++)
InjectCode(patches_710[i].Address, patches_710[i].Data);
// The old stereo patch...
// Use 2 channels instead of 4
if (nStereo)
{
InjectCode((void*)0x0000000140A860C0, { 0x02 });
printf("[Patches] Stereo patch enabled\n");
}
// Disable AA
if (!nTAA)
{
// set TAA var (shouldn't be needed but whatever)
*(byte*)0x00000001411AB67C = 0;
// make constructor/init not set TAA
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x00000001404AB11D, 3, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x00000001404AB11D + 0) = 0x90;
*((byte*)0x00000001404AB11D + 1) = 0x90;
*((byte*)0x00000001404AB11D + 2) = 0x90;
VirtualProtect((BYTE*)0x00000001404AB11D, 3, oldProtect, &bck); }
// not sure, but it's somewhere in TaskPvGame init
// just make it set TAA to 0 instead of 1 to avoid possible issues
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x00000001401063CE, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x00000001401063CE + 0) = 0x00;
VirtualProtect((BYTE*)0x00000001401063CE, 1, oldProtect, &bck); }
// prevent re-enabling after taking photos
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x000000014048FBA9, 1, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x000000014048FBA9 + 0) = 0x00;
VirtualProtect((BYTE*)0x000000014048FBA9, 1, oldProtect, &bck); }
printf("[Patches] TAA disabled\n");
}
if (!nMLAA)
{
// set MLAA var (shouldn't be needed but whatever)
*(byte*)0x00000001411AB680 = 0;
// make constructor/init not set MLAA
{DWORD oldProtect, bck;
VirtualProtect((BYTE*)0x00000001404AB11A, 3, PAGE_EXECUTE_READWRITE, &oldProtect);
*((byte*)0x00000001404AB11A + 0) = 0x90;
*((byte*)0x00000001404AB11A + 1) = 0x90;
*((byte*)0x00000001404AB11A + 2) = 0x90;
VirtualProtect((BYTE*)0x00000001404AB11A, 3, oldProtect, &bck); }
printf("[Patches] MLAA disabled\n");
}
// Replace the hardcoded videos with MP4s, if they exist
if (nMP4Movies)
{
patchMovieExt("adv_cm_01", (void*)0x00000001409A53CC);
patchMovieExt("adv_cm_02", (void*)0x00000001409A53E4);
patchMovieExt("adv_cm_03", (void*)0x00000001409A53FC);
patchMovieExt("adv_cfm_cm", (void*)0x00000001409C22CD);
patchMovieExt("adv_sega_cm", (void*)0x00000001409C22EE);
patchMovieExt("diva_adv02", (void*)0x00000001409FF455);
patchMovieExt("diva_adv", (void*)0x00000001409FF483);
}
// Hide "FREE PLAY"
if (nHideFreeplay)
{
InjectCode((void*)0x00000001403BABEF, { 0x06, 0xB6 });
printf("[Patches] Hide FREE PLAY/CREDIT(S) enabled\n");
}
// Enable "FREE PLAY" mode
if (nFreeplay || nHideFreeplay)
{
// Always return true for the SelCredit enter SelPv check
InjectCode((void*)0x0000000140393610, { 0xB0, 0x01, 0xC3, 0x90, 0x90, 0x90 });
InjectCode((void*)0x00000001403BABEA, { 0x75 });
printf("[Patches] Show FREE PLAY instead of CREDIT(S)\n");
if (nPDLoaderText && !nHideFreeplay)
{
InjectCode((void*)0x00000001409F61F0, { 0x50, 0x44, 0x20, 0x4C, 0x6F, 0x61, 0x64, 0x65, 0x72, 0x20, 0x00 });
printf("[Patches] Show PD Loader text\n");
}
}
// Use GLUT_CURSOR_RIGHT_ARROW instead of GLUT_CURSOR_NONE
if (nCursor)
{
InjectCode((void*)0x000000014019341B, { 0x00 });
InjectCode((void*)0x00000001403012b5, { 0xeb }); // Disable debug cursor
printf("[Patches] Cursor enabled\n");
}
// Override status icon states to be invalid (hides them)
if (nStatusIcons > 0)
{
std::vector<uint8_t> cardIcon = { 0xFD, 0x0A };
std::vector<uint8_t> networkIcon = { 0x9E, 0x1E };
if (nStatusIcons == 2) // 2 for error icons
{
cardIcon = { 0xFA, 0x0A };
networkIcon = { 0x9F, 0x1E };
printf("[Patches] Status icons set to error state\n");
}
else if (nStatusIcons == 3) // 3 for OK icons
{
cardIcon = { 0xFC, 0x0A };
networkIcon = { 0xA0, 0x1E };
printf("[Patches] Status icons set to OK state\n");
}
else if (nStatusIcons == 4) // 4 for partial OK icons
{
cardIcon = { 0xFB, 0x0A };
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
InjectCode((void*)0x00000001403B9D73, cardIcon); // OK state
// network icon
InjectCode((void*)0x00000001403BA14B, networkIcon); // error state
InjectCode((void*)0x00000001403BA155, networkIcon); // OK state
InjectCode((void*)0x00000001403BA16B, networkIcon); // partial state
InjectCode((void*)0x00000001403BA1A5, { 0x48, 0xE9 }); // never show the error code for partial connection
// I was going to use this with a string, but the assignment wasn't behaving well and making separate prints was easier than figuring it out
// printf("[Patches] Status icons %s\n", iconType);
}
// Removes PV watermark
if (nHidePVWatermark)
{
InjectCode((void*)0x0000000140A13A88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
printf("[Patches] PV watermark hidden\n");
}
// Disable the PV screen photo UI
if (nNoPVUi)
{
InjectCode((void*)0x000000014048FA91, { 0xEB, 0x6F }); // skip button panel image (JMP 0x14048FB02)
// patch minimum PV UI state to 1 instead of 0
// hook check for lyrics enabled (UI state < 2) to change UI state 0 into 1
// dump new code in the skipped button panel condition
InjectCode((void*)0x000000014048FA93, { 0xC7, 0x83, 0x58, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 }); // MOV dword ptr [0x158 + RBX],0x1
InjectCode((void*)0x000000014048FA9D, { 0xC6, 0x80, 0x3A, 0xD1, 0x02, 0x00, 0x01 }); // MOV byte ptr [0x2d13a + RAX],0x1
InjectCode((void*)0x000000014048FAA4, { 0xE9, 0x8B, 0xFB, 0xFF, 0xFF }); // JMP 0x14048F634
InjectCode((void*)0x000000014048F62D, { 0xE9, 0x61, 0x04, 0x00, 0x00 }); // JMP 0x14048FA93
printf("[Patches] PV UI disabled\n");
}
// Don't show volume control
if (nHideVolCtrl)
{
// skip SE button
InjectCode((void*)0x00000001409A4D60, { 0xC0, 0xD3 });
// skip volume sliders button
InjectCode((void*)0x0000000140A85F10, { 0xE0, 0x50 });
printf("[Patches] Volume control hidden\n");
}
// Skip loading (and therefore displaying) song lyrics
if (nNoLyrics)
{
InjectCode((void*)0x00000001404E7A25, { 0x00, 0x00 });
InjectCode((void*)0x00000001404E7950, { 0x48, 0xE9 }); // ensure first iteration doesn't run
printf("[Patches] Lyrics disabled\n");
}
// Skip loading (and therefore displaying) song movies
if (nNoMovies)
{
InjectCode((void*)0x00000001404EB584, { 0x48, 0xE9 });
InjectCode((void*)0x00000001404EB471, { 0x48, 0xE9 });
printf("[Patches] Movies disabled\n");
}
// Disable error banner
if (nNoError)
{
// Disable Errors Banner
InjectCode((void*)0x00000001403B9E9B, { 0x90, 0x90 });
printf("[Patches] Errors Banner disabled\n");
}
// Disable timer
if (nNoTimer)
{
// Freeze mode selection timer
InjectCode((void*)0x0000000140566B9E, { 0x90, 0x90, 0x90 });
// Freeze PV selection timer
InjectCode((void*)0x00000001405BDFBF, { 0x90, 0x90, 0x90, 0x90 });
}
// Disable timer sprite
if (nNoTimerSprite)
{
InjectCode((void*)0x00000001409C0758, { 0x00 }); // time_loop
InjectCode((void*)0x0000000140A3D3F0, { 0x00 }); // time_in
InjectCode((void*)0x0000000140A3D3F8, { 0x00 }); // time_out
}
// Enhanced Stage Manager
if (nEStageManager > 0)
{
// Replace the function that provides the number of stages and compact some of it
InjectCode((void*)0x000000014038AEF0, { 0x48, 0x8B, 0x88, 0x40, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x20, 0x48, 0x8B, 0xD0, 0x48, 0x8B, 0x88, 0x48, 0x01, 0x00, 0x00, 0x48, 0x89, 0x4C, 0x24, 0x28, 0x8B, 0x88, 0x50, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x30, 0x8B, 0x88, 0x54, 0x01, 0x00, 0x00, 0x8B, 0x80, 0x58, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x38, 0x8B, 0x82, 0x5C, 0x01, 0x00, 0x00, 0x89, 0x4C, 0x24, 0x34, 0x89, 0x44, 0x24, 0x3C, 0x48, 0x8B, 0x82, 0x60, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x40, 0x48, 0x8B, 0x82, 0x68, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x48, 0x48, 0x8B, 0x82, 0x70, 0x01, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, 0x50, 0x8B, 0x82, 0x78, 0x01, 0x00, 0x00, 0x89, 0x44, 0x24, 0x58, 0x84, 0xC0, 0x74, 0x2A, 0x48, 0x8B, 0x44, 0x24, 0x38, 0x48, 0xC1, 0xE8, 0x20, 0x85, 0xC0, 0x75, 0x1D, 0xE8, 0xD9, 0xD9, 0xE5, 0xFF, 0x48, 0x85, 0xC0, 0x74, 0x13, 0x48, 0x8D, 0x48, 0x10, 0xE8, 0xFB, 0xD3, 0xE5, 0xFF, 0xB9, 0x03, 0x00, 0x00, 0x00, 0x85, 0xC0, 0x0F, 0x45, 0xD9, 0x8B, 0x1D, 0x1B, 0x0C, 0x00, 0x00, 0x83, 0x3D, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x74, 0x06, 0x8B, 0x1D, 0x10, 0x0C, 0x00, 0x00, 0x8B, 0xC3, 0x48, 0x83, 0xC4, 0x60, 0x5B, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC });
// Jump to another section by addding some code to replace the values (Jump 1)
InjectCode((void*)0x000000014038AFF4, { 0xE9, 0x87, 0x0B, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC });
// Jump to another section by addding some code to replace the values (Replace 1/2) while some reserving space for values
InjectCode((void*)0x000000014038BB40, { 0xFF, 0x05, 0x76, 0x00, 0x00, 0x00, 0x8B, 0x0D, 0x70, 0x00, 0x00, 0x00, 0xBA, 0x02, 0x00, 0x00, 0x00, 0x83, 0x3D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0xFF, 0xC2, 0x39, 0xD1, 0x0F, 0x4D, 0xCA, 0x89, 0x48, 0x08, 0xB9, 0x0E, 0x00, 0x00, 0x00, 0xE8, 0x92, 0x98, 0xE0, 0xFF, 0xB0, 0x01, 0x48, 0x83, 0xC4, 0x28, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x44, 0x89, 0x61, 0x08, 0x44, 0x88, 0x61, 0x0C, 0x4C, 0x89, 0x61, 0x10, 0x44, 0x89, 0x25, 0x29, 0x00, 0x00, 0x00, 0xE9, 0x68, 0xF4, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
// Use the value from our own address instead of the original one
InjectCode((void*)0x00000001403F65AF, { 0x48, 0x8D, 0x05, 0x4A, 0x18, 0xDA, 0x00, 0x8B, 0x1D, 0x00, 0x56 });
// Jump to another section by addding some code to replace the values (Jump 2)
InjectCode((void*)0x00000001403F6638, { 0xE9, 0x03, 0x55, 0xF9, 0xFF, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC });
DWORD StageCountProtect;
VirtualProtect((int32_t*)0x14038BBB0, 0x10, PAGE_EXECUTE_READWRITE, &StageCountProtect);
int* ESM = (int*)0x000000014038BBB0;
if (nEStageManagerEncore)
ESM[1] = nEStageManager;
else
ESM[0] = nEStageManager;
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 });
}
// Unlock PSEUDO modules (which will all default to Miku, unless we also patch them to match the first performer)
if (nUnlockPseudo)
{
InjectCode((void*)0x0000000140A21770, { 0x00 });
InjectCode((void*)0x0000000140A21780, { 0x00 });
InjectCode((void*)0x0000000140A21790, { 0x00 });
InjectCode((void*)0x0000000140A217A0, { 0x00 });
InjectCode((void*)0x0000000140A217B0, { 0x00 });
}
// Enable card button by somewhatlurker (pretty much just eye candy for now)
if (nCard)
{
InjectCode((void*)0x0000000140565E6B, { 0x90, 0x90 });
}
// The original slider update needs to run for hardware sliders to work -- only patch it when using emulation
if (!nHardwareSlider)
{
// Don't update the touch slider state so we can write our own
InjectCode((void*)0x000000014061579B, { 0x90, 0x90, 0x90, 0x8B, 0x42, 0xE0, 0x90, 0x90, 0x90 });
}
// Quick start
{
if (nQuickStart == 1) // skip the card/guest screen
{
InjectCode((void*)0x0000000140578EA9, { 0xE9, 0x8E, 0x00, 0x00, 0x00 });
}
else if (nQuickStart == 2) // skip everything; normal mode
{
InjectCode((void*)0x0000000140578EA9, { 0xE9, 0xF1, 0x00, 0x00, 0x00 });
InjectCode((void*)0x0000000140578E9D, { 0xC7, 0x47, 0x68, 0x28, 0x00, 0x00, 0x00 }); // skip back button error
}
}
// Disable scrolling sound effect
if (nNoScrollingSfx)
{
InjectCode((void*)0x00000001405C84B3, { 0x90, 0x90, 0x90, 0x90, 0x90 });
}
// Disable hand scaling
if (nNoHandScaling)
{
InjectCode((void*)0x0000000140120709, { 0xE9, 0x82, 0x0A, 0x00 });
}
// Default hand size
if (nDefaultHandSize != -1)
{
printf("[Patches] Changing default hand size...\n");
const float num = (float)nDefaultHandSize / 10000.0;
DWORD oldProtect;
float* addr1 = (float*)(0x140506B59);
float* addr2 = (float*)(0x140506B60);
/*float* addr3 = (float*)(0x140506B67);
float* addr4 = (float*)(0x140506B71);*/
VirtualProtect(addr1, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
VirtualProtect(addr2, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
/*VirtualProtect(addr3, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
VirtualProtect(addr4, 4, PAGE_EXECUTE_READWRITE, &oldProtect);*/
*addr1 = *addr2 /*= *addr3 = *addr4*/ = num;
VirtualProtect(addr1, 4, oldProtect, nullptr);
VirtualProtect(addr2, 4, oldProtect, nullptr);
/*VirtualProtect(addr3, 4, oldProtect, nullptr);
VirtualProtect(addr4, 4, oldProtect, nullptr);*/
printf("[Patches] New default hand size: %f\n", num);
}
// Sing missed notes
if (nSingMissed)
{
InjectCode((void*)0x140109044, { 0xEB });
// Breaks border:
// InjectCode((void*)0x140109096, { 0xEB });
}
// Force mouth animations
{
if (nForceMouth == 1) // PDA
{
printf("[Patches] Forcing PDA mouth...\n");
int* mouth_table = (int*)(0x1409A1DC0);
DWORD oldProtect;
VirtualProtect(mouth_table, 44, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 11; i++)
{
mouth_table[i]++;
}
VirtualProtect(mouth_table, 44, oldProtect, nullptr);
printf("[Patches] PDA mouth forced\n");
}
else if (nForceMouth == 2) // FT
{
printf("[Patches] Forcing FT mouth...\n");
int* mouth_table_oldid = (int*)(0x1409A1E1C);
DWORD oldProtect;
VirtualProtect(mouth_table_oldid, 44, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 11; i++)
{
mouth_table_oldid[i]--;
}
VirtualProtect(mouth_table_oldid, 44, oldProtect, nullptr);
printf("[Patches] FT mouth forced\n");
}
}
// Force expressions
{
if (nForceExpressions == 1) // PDA
{
printf("[Patches] Forcing PDA expressions...\n");
int* exp_table = (int*)(0x140A21900);
DWORD oldProtect;
VirtualProtect(exp_table, 104, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 26; i++)
{
exp_table[i] += 2;
}
VirtualProtect(exp_table, 104, oldProtect, nullptr);
printf("[Patches] PDA expressions forced\n");
}
else if (nForceExpressions == 2) // FT
{
printf("[Patches] Forcing FT expressions...\n");
int* exp_table_oldid = (int*)(0x140A219D0);
DWORD oldProtect;
VirtualProtect(exp_table_oldid, 104, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 26; i++)
{
exp_table_oldid[i] -= 2;
}
VirtualProtect(exp_table_oldid, 104, oldProtect, nullptr);
printf("[Patches] FT expressions forced\n");
}
}
// Force look animations
{
if (nForceLook == 1) // PDA
{
printf("[Patches] Forcing PDA look...\n");
int* look_table = (int*)(0x1409A1D70);
DWORD oldProtect;
VirtualProtect(look_table, 36, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 9; i++)
{
look_table[i]++;
}
VirtualProtect(look_table, 36, oldProtect, nullptr);
printf("[Patches] PDA look forced\n");
}
else if (nForceLook == 2) // FT
{
printf("[Patches] Forcing FT look...\n");
int* look_table_oldid = (int*)(0x1409A1D9C);
DWORD oldProtect;
VirtualProtect(look_table_oldid, 36, PAGE_EXECUTE_READWRITE, &oldProtect);
for (int i = 0; i < 9; i++)
{
look_table_oldid[i]--;
}
VirtualProtect(look_table_oldid, 36, oldProtect, nullptr);
printf("[Patches] FT look forced\n");
}
}
// NPR1
{
if (nNpr1 == 1) // force on
{
InjectCode((void*)0x0000000140502FC0, { 0xC7, 0x05, 0x6E });
InjectCode((void*)0x0000000140502FC6, { 0x01, 0x00, 0x00, 0x00, 0xC3 });
printf("[Patches] NPR1 forced\n");
}
else if (nNpr1 == 2) // force off
{
InjectCode((void*)0x0000000140502FC0, { 0xC7, 0x05, 0x6E });
InjectCode((void*)0x0000000140502FC6, { 0x00, 0x00, 0x00, 0x00, 0xC3 });
printf("[Patches] NPR1 disabled\n");
}
}
// Depth of Field
if (!nDoF)
{
InjectCode((void*)0x00000001409476AB, { 0x90, 0x90, 0x90, 0x90, 0x90 });
InjectCode((void*)0x00000001411AB650, { 0b00000001 });
}
// MAG filter
if (nMAG > 0)
{
//InjectCode((void*)0x00000001404AB142, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
unsigned char filter;
switch (nMAG)
{
case 1: // nearest
filter = 0;
InjectCode((void*)0x00000001404ACE56, { 0x90, 0x90 });
break;
case 2: // sharpen
filter = 3; // sharpen(4tap)
break;
case 3: // cone
filter = 5; // cone(2tap)
break;
default:
filter = 1;
}
//InjectCode((void*)0x00000001404A864F, { filter });
//InjectCode((void*)0x00000001411AC518, { filter });
InjectCode((void*)0x00000001404ACE8E, { 0xB9, filter, 0x00, 0x00 });
InjectCode((void*)0x00000001404ACE93, { 0x90 });
}
// Reflections
if (!nReflections)
{
InjectCode((void*)0x1406477C0, { 0xE9, 0xF3, 0x00, 0x00, 0x00, 0x90 });
InjectCode((void*)0x1411ADAFC, { 0x00 });
}
// Shadows
if (!nShadows)
{
//InjectCode((void*)0x140502B44, { 0x90, 0x90, 0x90 });
//InjectCode((void*)0x140502BB2, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
InjectCode((void*)0x140502766, { 0x00 });
InjectCode((void*)0x1411AD438, { 0x00 });
InjectCode((void*)0x1411AD320, { 0x00 });
}
// Punch-through transparency
if (!nPunchthrough)
{
InjectCode((void*)0x1411AD43D, { 0x00 });
}
// Glare
if (!nGlare)
{
InjectCode((void*)0x1404B2168, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
}
// Shader
if (!nShader)
{
InjectCode((void*)0x140C9C48E, { 0x00 });
}
// 2D
if (n2D)
{
//InjectCode((void*)0x140502B44, { 0x90, 0x90, 0x90 });
InjectCode((void*)0x140502BB2, { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
InjectCode((void*)0x140502A3C, { 0x90, 0x90, 0x90, 0x90, 0x90 });
/*InjectCode((void*)0x1411AD320, { 0x00 }); // shadow
InjectCode((void*)0x1411AD323, { 0x00 }); // reflect
InjectCode((void*)0x1411AD321, { 0x00 }); // SS_SSS
InjectCode((void*)0x1411AD325, { 0x00 }); // preprocess
InjectCode((void*)0x1411AD328, { 0x00 }); // 3D*/
InjectCode((void*)0x1411AD32A, { 0x01 }); // post process
InjectCode((void*)0x1411AD32B, { 0x01 }); // sprite
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 });
}
// patch refract and reflect buffer sizes
// no need to really check anything before injecting, because reinjecting defaults is fine
InjectCode((void*)(0x140a24424), std::vector<uint8_t>((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)));
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
// scaling is based on a 1024 width instead of the original 512px
// because we don't wanna make it too blurry when just being used to smooth jaggies
if (nReflectResWidth >= 2048)
{
int blurAmount = nReflectResWidth / 1024;
// multiply blur setting
// ECX has blur amount, EDX has blur type
InjectCode((void*)(0x140503000), { 0x89, 0x15, 0x3a, 0xa3, 0xca, 0x00 }); // MOV dword ptr [0x1411ad340], EDX
InjectCode((void*)(0x140503006), { 0xb8 }); // MOV EAX, blurAmount
InjectCode((void*)(0x140503007), std::vector<uint8_t>((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4)));
InjectCode((void*)(0x14050300b), { 0xf7, 0xe1 }); // MUL (EDX:EAX,)ECX
InjectCode((void*)(0x14050300d), { 0xeb, 0x09 }); // JMP 0x140503018
InjectCode((void*)(0x140503018), { 0x89, 0x05, 0x1e, 0xa3, 0xca, 0x00 }); // MOV dword ptr [0x1411ad33c], EAX
InjectCode((void*)(0x14050301e), { 0xc3 }); // RET
// divide dwgui blur amount getting
// RDX gets type, RCX gets amount
InjectCode((void*)(0x140502910), { 0x48, 0x85, 0xd2 }); // TEST RDX, RDX
InjectCode((void*)(0x140502913), { 0x74, 0x08 }); // JZ 0x14050291d
InjectCode((void*)(0x140502915), { 0x8b, 0x05, 0x25, 0xaa, 0xca, 0x00 }); // MOV EAX, dword ptr [0x1411ad340]
InjectCode((void*)(0x14050291b), { 0x89, 0x02 }); // MOV dword ptr [RDX], EAX
InjectCode((void*)(0x14050291d), { 0x48, 0x85, 0xc9 }); // TEST RCX, RCX
InjectCode((void*)(0x140502920), { 0x74, 0x2d }); // JZ 0x14050294f
InjectCode((void*)(0x140502922), { 0x8b, 0x05, 0x14, 0xaa, 0xca, 0x00 }); // MOV EAX, dword ptr [0x1411ad33c]
InjectCode((void*)(0x140502928), { 0xeb, 0x0d }); // JMP 0x140502937
InjectCode((void*)(0x140502937), { 0x49, 0xc7, 0xc0 }); // MOV R8, blurAmount
InjectCode((void*)(0x14050293a), std::vector<uint8_t>((uint8_t*)&blurAmount, (uint8_t*)((int64_t)&blurAmount + 4)));
InjectCode((void*)(0x14050293e), { 0xeb, 0x08 }); // JMP 0x140502948
InjectCode((void*)(0x140502948), { 0x31, 0xd2 }); // XOR EDX,EDX
InjectCode((void*)(0x14050294a), { 0x49, 0xf7, 0xf0 }); // DIV (EDX:EAX,)R8
InjectCode((void*)(0x14050294d), { 0x89, 0x01 }); // MOV dword ptr [RCX], EAX
InjectCode((void*)(0x14050294f), { 0xc3 }); // RET
}
// lag compensation
if (nLagCompensation>0 && nLagCompensation<=50)
{
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;
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);
}
}
};
@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="PatchApplier.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="PatchApplier600.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="PatchApplier710.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="framework.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
@@ -53,7 +53,7 @@
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>..\..\..\dependencies\GPUModel;..\..\..\dependencies\detours\include;..\..\..\dependencies\PluginConfigApi</AdditionalIncludeDirectories>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>..\..\..\dependencies\detours\lib</AdditionalLibraryDirectories>
@@ -69,7 +69,7 @@
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>..\..\..\dependencies\GPUModel;..\..\..\dependencies\detours\include;..\..\..\dependencies\PluginConfigApi</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<AdditionalOptions>-d2FH4- %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>-d2FH4- /utf-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -124,6 +124,6 @@ std::wstring DirPath() {
std::wstring DATA_FILE_STRING = DirPath() + L"\\plugins\\ShaderPatch.ini";
LPCWSTR DATA_FILE = DATA_FILE_STRING.c_str();
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins\\ShaderPatchConfig.ini";
std::wstring CONFIG_FILE_STRING = DirPath() + L"\\plugins_config\\ShaderPatchConfig.ini";
LPCWSTR CONFIG_FILE = CONFIG_FILE_STRING.c_str();
@@ -6,7 +6,7 @@
namespace TLAC::Components
{
const std::string COMPONENTS_CONFIG_FILE_NAME = "components.ini";
const std::string COMPONENTS_CONFIG_FILE_NAME = "..\\plugins_config\\components.ini";
// Incomplete type
struct DwGuiDisplay
@@ -18,7 +18,7 @@ namespace TLAC::Components
virtual void UpdateInput() override;
private:
const std::string COMPONENTS_CONFIG_FILE_NAME = "components.ini";
const std::string COMPONENTS_CONFIG_FILE_NAME = "..\\plugins_config\\components.ini";
int updatesPerFrame = 39;
GameState currentGameState;
@@ -16,7 +16,7 @@
#include "../Pause.h"
#include "../../Utils.h"
const std::string KEY_CONFIG_FILE_NAME = "keyconfig.ini";
const std::string KEY_CONFIG_FILE_NAME = "..\\plugins_config\\keyconfig.ini";
using namespace TLAC::Input;
using namespace TLAC::Input::KeyConfig;
@@ -47,6 +47,12 @@ namespace TLAC::Components
delete MenuLBinding;
delete MenuRBinding;
delete MenuCircleBinding;
delete CoinBinding;
delete ToonBinding;
delete WireframeBinding;
}
const char* InputEmulator::GetDisplayName()
@@ -83,6 +89,10 @@ namespace TLAC::Components
CoinBinding = new Binding();
ToonBinding = new Binding();
WireframeBinding = new Binding();
FileSystem::ConfigFile configFile(framework::GetModuleDirectory(), KEY_CONFIG_FILE_NAME);
configFile.OpenRead();
@@ -100,7 +110,9 @@ 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, { "F12" });
mouseScrollPvSelection = configFile.GetBooleanValue("mouse_scroll_pv_selection");
}
@@ -168,6 +180,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 +320,6 @@ namespace TLAC::Components
if (buttonTestFunc(RightBinding))
buttons |= JVS_R;
if (buttonTestFunc(CoinBinding))
addCoin();
return buttons;
}
@@ -345,9 +363,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 +480,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");
}
}
}
@@ -40,6 +40,10 @@ namespace TLAC::Components
Input::Binding* CoinBinding;
Input::Binding* ToonBinding;
Input::Binding* WireframeBinding;
InputEmulator();
~InputEmulator();
@@ -111,5 +115,6 @@ namespace TLAC::Components
void addCoin();
void toggleNpr1();
void toggleWireframe();
};
}
@@ -19,7 +19,7 @@ using namespace TLAC::Utilities;
namespace TLAC::Components
{
const std::string KEY_CONFIG_FILE_NAME = "keyconfig.ini";
const std::string KEY_CONFIG_FILE_NAME = "..\\plugins_config\\keyconfig.ini";
TouchSliderEmulator* TouchSliderEmulator::LatestInstance;
@@ -99,7 +99,7 @@ namespace TLAC::Components
panelState = (TouchPanelState*)TASK_TOUCH_ADDRESS;
componentsManager = manager;
TLAC::FileSystem::ConfigFile config(TLAC::framework::GetModuleDirectory(), "keyconfig.ini");
TLAC::FileSystem::ConfigFile config(TLAC::framework::GetModuleDirectory(), "\\..\\plugins_config\\keyconfig.ini");
config.OpenRead();
autoPause = config.GetBooleanValue("autopause");
@@ -8,7 +8,7 @@
#include <windows.h>
#include "GameState.h"
const std::string PLAYER_DATA_FILE_NAME = "playerdata.ini";
const std::string PLAYER_DATA_FILE_NAME = "..\\plugins_config\\playerdata.ini";
static WCHAR configPath[256];
int* headitemequip = (int*)0x0000000141804CDC;
int customheaditemequip;
@@ -237,7 +237,7 @@ namespace TLAC::Components
config.TryGetValue("level_name", &customPlayerData->LevelName);
// ScoreSaver copies & declaring non-playerdata values
std::string utf8path = TLAC::framework::GetModuleDirectory() + "/playerdata.ini";
std::string utf8path = TLAC::framework::GetModuleDirectory() + "\\..\\plugins_config\\playerdata.ini";
MultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, configPath, 256);
customPlayerData->LevelNum = config.GetIntegerValue("level");
@@ -18,15 +18,15 @@ namespace TLAC::Components
WCHAR ScoreSaver::sfx_configPath[256];
ScoreSaver::ScoreSaver()
{
std::string utf8path = TLAC::framework::GetModuleDirectory() + "/scores.ini";
std::string utf8path = TLAC::framework::GetModuleDirectory() + "../plugins_config/scores.ini";
MultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, configPath, 256);
utf8path = TLAC::framework::GetModuleDirectory() + "/rivalscores.ini";
utf8path = TLAC::framework::GetModuleDirectory() + "../plugins_config/rivalscores.ini";
MultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, rival_configPath, 256);
utf8path = TLAC::framework::GetModuleDirectory() + "/pv_equip/modules.ini";
utf8path = TLAC::framework::GetModuleDirectory() + "../plugins_config/pv_equip/modules.ini";
MultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, modules_configPath, 256);
utf8path = TLAC::framework::GetModuleDirectory() + "/pv_equip/skins.ini";
utf8path = TLAC::framework::GetModuleDirectory() + "../plugins_config/pv_equip/skins.ini";
MultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, skins_configPath, 256);
utf8path = TLAC::framework::GetModuleDirectory() + "/pv_equip/sfx.ini";
utf8path = TLAC::framework::GetModuleDirectory() + "../plugins_config/pv_equip/sfx.ini";
MultiByteToWideChar(CP_UTF8, 0, utf8path.c_str(), -1, sfx_configPath, 256);
}
@@ -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);
@@ -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 } },
// ipega Controller: {01192563-0000-0000-0000-504944564944}
{ 0x01192563, 0x0000, 0x0000, { 0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44 } }
};
class DualShock4 : public Controller, public IInputDevice
@@ -5,7 +5,7 @@
#include "../../../FileSystem/ConfigFile.h"
#include <stdio.h>
const std::string GU_CONFIG_FILE_NAME = "keyconfig.ini";
const std::string GU_CONFIG_FILE_NAME = "..\\plugins_config\\keyconfig.ini";
namespace TLAC::Input
{
@@ -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 },
@@ -12,10 +12,12 @@ namespace TLAC::Input
Xinput::Xinput()
{
TLAC::FileSystem::ConfigFile config(TLAC::framework::GetModuleDirectory(), "keyconfig.ini");
TLAC::FileSystem::ConfigFile config(TLAC::framework::GetModuleDirectory(), "..\\plugins_config\\keyconfig.ini");
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

Some files were not shown because too many files have changed in this diff Show More