From 704d301b3af9225631003bb4d503a7fc6d82022e Mon Sep 17 00:00:00 2001 From: ChsBuffer <33744752+chsbuffer@users.noreply.github.com> Date: Fri, 23 Jul 2021 22:45:23 +0800 Subject: [PATCH] [Launcher] Globalization --- .../source/plugins/Launcher/ConfigOption.h | 48 +- .../source/plugins/Launcher/Launcher.vcxproj | 2 + .../source/plugins/Launcher/Resources.restext | 258 ++ .../source/plugins/Launcher/dllmain.cpp | 2 + .../source/plugins/Launcher/framework.h | 200 +- source-code/source/plugins/Launcher/i18n.h | 18 + source-code/source/plugins/Launcher/ui.h | 433 +--- source-code/source/plugins/Launcher/ui.resx | 2303 ++++++++++++++--- 8 files changed, 2455 insertions(+), 809 deletions(-) create mode 100644 source-code/source/plugins/Launcher/Resources.restext create mode 100644 source-code/source/plugins/Launcher/i18n.h diff --git a/source-code/source/plugins/Launcher/ConfigOption.h b/source-code/source/plugins/Launcher/ConfigOption.h index 0518631..1cc2f9e 100644 --- a/source-code/source/plugins/Launcher/ConfigOption.h +++ b/source-code/source/plugins/Launcher/ConfigOption.h @@ -13,6 +13,7 @@ #include "PluginConfigApi.h" #include "IniReader.h" +#include "i18n.h" using namespace System; using namespace System::Windows::Forms; @@ -358,7 +359,7 @@ 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; @@ -379,7 +380,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,7 +425,7 @@ 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; @@ -453,8 +454,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,7 +501,7 @@ 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; @@ -532,8 +533,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,7 +590,7 @@ 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; @@ -597,7 +598,8 @@ public: //label->FlatStyle = System::Windows::Forms::FlatStyle::Flat; for (LPCWSTR& choice : _valueStrings) { - combobox->Items->Add(msclr::interop::marshal_as(choice)); + String^ displayString = i18n::GetStringFallback(msclr::interop::marshal_as(choice)); + combobox->Items->Add(displayString); } combobox->SelectedIndex = GetIniInt(_iniSectionName, _iniVarName, _defaultVal, _iniFilePath)-_indexOffset; combobox->Left = left + Col2Left; @@ -619,8 +621,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,7 +672,7 @@ 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; @@ -713,8 +715,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,7 +777,7 @@ 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; @@ -812,8 +814,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,7 +885,7 @@ 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; @@ -945,8 +947,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); @@ -1026,7 +1028,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); @@ -1089,7 +1091,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); diff --git a/source-code/source/plugins/Launcher/Launcher.vcxproj b/source-code/source/plugins/Launcher/Launcher.vcxproj index b38168f..d070bd2 100644 --- a/source-code/source/plugins/Launcher/Launcher.vcxproj +++ b/source-code/source/plugins/Launcher/Launcher.vcxproj @@ -99,6 +99,7 @@ + @@ -123,6 +124,7 @@ + ui.h diff --git a/source-code/source/plugins/Launcher/Resources.restext b/source-code/source/plugins/Launcher/Resources.restext new file mode 100644 index 0000000..7e85d54 --- /dev/null +++ b/source-code/source/plugins/Launcher/Resources.restext @@ -0,0 +1,258 @@ +############################################### +# framework + +# 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). + +# 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. +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 +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). +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 +BUILTIN_PATCHES_NAME=Enable Built-In Patches +BUILTIN_PATCHES_HINT=Enables the built-in patches, including the options below. +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. + +ENHANCED_STAGE_MANAGER_NAME=Number of Stages: +ENHANCED_STAGE_MANAGER_HINT=Set the number of stages (0 = default). +ENHANCED_STAGE_MANAGER_ENCORE_NAME=Encore +ENHANCED_STAGE_MANAGER_ENCORE_HINT=Enable encore stages. + +FORCE_MOUTH_NAME=Mouth Type: +FORCE_MOUTH_HINT=Change the mouth animations. +FORCE_EXPRESSIONS_NAME=Expression Type: +FORCE_EXPRESSIONS_HINT=Change the expressions. +FORCE_LOOK_NAME=Look Type: +FORCE_LOOK_HINT=Change the look animations. +NO_HAND_SCALING_NAME=No Hand Scaling +NO_HAND_SCALING_HINT=Disable hand scaling. +DEFAULT_HAND_SIZE_NAME=Default Hand Size: +DEFAULT_HAND_SIZE_HINT=-1: default\n12200: PDA +SING_MISSED_NAME=Sing Missed +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 Corner 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". +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_PREFERRED_NAME=XInput Controller Num: +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) + +OPENGL_PATCH_A_NAME=OpenGL Patch A +OPENGL_PATCH_A_HINT=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_NAME=OpenGL Patch B +OPENGL_PATCH_B_HINT=Ignores some OpenGL-related errors. Don't use both patches at the same time unless you're know what you're doing. + +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 parameters for the game when using the launcher.\nDisabling the launcher will bypass this. +USE_DIVAHOOK_BAT_NAME=Use divahook.bat +USE_DIVAHOOK_BAT_HINT=Launches divahook.bat intead of diva.exe. +DARK_LAUNCHER_NAME=Dark Launcher +DARK_LAUNCHER_HINT=Sets the dark colour scheme in the launcher. +NO_GPU_DIALOG_NAME=Disable GPU Warning +NO_GPU_DIALOG_HINT=Disables the warning dialog for unsupported GPUs. + + +# 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-1 = song default +SLIDE_SE_EQUIP_NAME=Slide Sound: +SLIDE_SE_EQUIP_HINT=Sets the sound effect for slides.\n-1 = song default +CHAINSLIDE_SE_EQUIP_NAME=Chainslide Sound: +CHAINSLIDE_SE_EQUIP_HINT=Sets the sound effect for chain slides.\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-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/scores.ini. +PAUSE_NAME=Pause +PAUSE_HINT=Adds a pause menu. + +############################################### +# 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\nRestore:\n- glut32.dll\n\nThen install PD Loader from the official repository. + +# gpu +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.\nThe PD Loader AMDPack 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.\nThe PD Loader AMDPack can be used to make 3D rendering work. Please download it and follow the included instructions.\n\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel. +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! Unknown issues.\n(Click for more information) +GPU_GA_HINT=Ampere GPUs have not been tested yet. On the previous generation Turing GPUs (GTX 16xx/RTX 20xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled and report any further issues to the developers. +GPU_TU_NAME=Issues: Turing 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) or 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 Turing (GTX 16xx/RTX 20xx) is currently supported.\nGood news: the game should be capable of running, but shader patches (probably needed) may not support it yet.\nYou will likely see lines/noise on important character shaders and some minor stage shaders.\nPlease report any issues so that ShaderPatch can be updated. +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) +SHOW_GPU_DIALOG_HINT=You can disable this message from the options tab. \ No newline at end of file diff --git a/source-code/source/plugins/Launcher/dllmain.cpp b/source-code/source/plugins/Launcher/dllmain.cpp index 60bd1e1..a77e128 100644 --- a/source-code/source/plugins/Launcher/dllmain.cpp +++ b/source-code/source/plugins/Launcher/dllmain.cpp @@ -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); diff --git a/source-code/source/plugins/Launcher/framework.h b/source-code/source/plugins/Launcher/framework.h index 683b1bc..5dd2ecc 100644 --- a/source-code/source/plugins/Launcher/framework.h +++ b/source-code/source/plugins/Launcher/framework.h @@ -159,18 +159,18 @@ static std::vector getScreenRatesVec(std::vector &screenModes) { std::vector screenModes = getScreenModes(); -DropdownOption* DisplayModeDropdown = new DropdownOption(L"display", RESOLUTION_SECTION, CONFIG_FILE, L"Display:", L"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.", 1, std::vector({ 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({ 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(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(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, @@ -178,165 +178,165 @@ 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({ 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({ L"Bilinear", L"Nearest-neighbour", L"Sharpen", L"Cone" })), - new BooleanOption(L"DOF", GRAPHICS_SECTION, CONFIG_FILE, L"Depth of Field", L"Blurs the background. Disable for better performance.", true, false), - new BooleanOption(L"reflections", GRAPHICS_SECTION, CONFIG_FILE, L"Reflections", L"Enable or disable reflections.", true, false), - new ResolutionOption(L"reflect_res_width", L"reflect_res_height", GRAPHICS_SECTION, CONFIG_FILE, L"Reflection Res:", L"Sets the reflection buffer resolution (instead of 512x256).", resolution(512, 256), std::vector({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, (ResolutionOptionOpts)0), - new ResolutionOption(L"refract_res_width", L"refract_res_height", GRAPHICS_SECTION, CONFIG_FILE, L"Refraction Res:", L"Sets the refraction buffer resolution (instead of 512x256).", resolution(512, 256), std::vector({resolution(256,256), resolution(512,256), resolution(512,512), resolution(1024,1024), resolution(2048,2048), resolution(4096,4096)}), true, (ResolutionOptionOpts)0), - new 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({ 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. Don't enable on Intel GPUs, enable \"Disable Extended Data\" instead.", false, false), + new DropdownOption(L"model", L"GPU", CONFIG_FILE, L"MODEL_NAME", L"MODEL_HINT", -1, std::vector({ L"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({ L"Bilinear", L"Nearest-neighbour", L"Sharpen", L"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(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(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_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({ 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"builtin_patches", GLOBAL_SECTION, CONFIG_FILE, L"Enable Built-In Patches", L"Enables the built-in patches, including the options below.", true, false), - new BooleanOption(L"custom_patches", GLOBAL_SECTION, CONFIG_FILE, L"Enable Custom Patches", L"Enables all custom patches.", true, false), - new BooleanOption(L"builtin_render", GLOBAL_SECTION, CONFIG_FILE, L"Enable Built-In Render", L"Enables the built-in render patches.", true, false), + 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 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"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 BooleanOption(L"no_movies", PATCHES_SECTION, CONFIG_FILE, L"NO_MOVIES_NAME", L"NO_MOVIES_HINT", false, false), + new BooleanOption(L"cursor", PATCHES_SECTION, CONFIG_FILE, L"CURSOR_NAME", L"CURSOR_HINT", true, false), + new BooleanOption(L"stereo", PATCHES_SECTION, CONFIG_FILE, L"STEREO_NAME", L"STEREO_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({ 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 DropdownOption(L"quick_start", PATCHES_SECTION, CONFIG_FILE, L"QUICK_START_NAME", L"QUICK_START_HINT", 1, std::vector({ 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 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 NumericOption(L"Enhanced_Stage_Manager", PATCHES_SECTION, CONFIG_FILE, L"ENHANCED_STAGE_MANAGER_NAME", L"ENHANCED_STAGE_MANAGER_HINT", 0, 0, INT_MAX), + new BooleanOption(L"Enhanced_Stage_Manager_Encore", PATCHES_SECTION, CONFIG_FILE, L"ENHANCED_STAGE_MANAGER_ENCORE_NAME", L"ENHANCED_STAGE_MANAGER_ENCORE_HINT", true, false), 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({ L"Default", L"Force PDA", L"Force FT" })), - new DropdownOption(L"force_expressions", PATCHES_SECTION, CONFIG_FILE, L"Expression Type:", L"Change the expressions.", 0, std::vector({ L"Default", L"Force PDA", L"Force FT" })), - new DropdownOption(L"force_look", PATCHES_SECTION, CONFIG_FILE, L"Look Type:", L"Change the look animations.", 0, std::vector({ L"Default", L"Force PDA", L"Force FT" })), - new BooleanOption(L"no_hand_scaling", PATCHES_SECTION, CONFIG_FILE, L"No Hand Scaling", L"Disable hand scaling.", false, false), - new NumericOption(L"default_hand_size", 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 DropdownOption(L"force_mouth", PATCHES_SECTION, CONFIG_FILE, L"FORCE_MOUTH_NAME", L"FORCE_MOUTH_HINT", 0, std::vector({ L"Default", L"Force PDA", L"Force FT" })), + new DropdownOption(L"force_expressions", PATCHES_SECTION, CONFIG_FILE, L"FORCE_EXPRESSIONS_NAME", L"FORCE_EXPRESSIONS_HINT", 0, std::vector({ L"Default", L"Force PDA", L"Force FT" })), + new DropdownOption(L"force_look", PATCHES_SECTION, CONFIG_FILE, L"FORCE_LOOK_NAME", L"FORCE_LOOK_HINT", 0, std::vector({ L"Default", L"Force PDA", L"Force FT" })), + new BooleanOption(L"no_hand_scaling", PATCHES_SECTION, CONFIG_FILE, L"NO_HAND_SCALING_NAME", L"NO_HAND_SCALING_HINT", false, false), + new NumericOption(L"default_hand_size", PATCHES_SECTION, CONFIG_FILE, L"DEFAULT_HAND_SIZE_NAME", L"DEFAULT_HAND_SIZE_HINT", -1, -1, INT_MAX), + new BooleanOption(L"sing_missed", PATCHES_SECTION, CONFIG_FILE, L"SING_MISSED_NAME", L"SING_MISSED_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({ 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"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 BooleanOption(L"no_message_bar", PATCHES_SECTION, CONFIG_FILE, L"Hide Message Bar", L"Hide the top message bar.", false, false), - new BooleanOption(L"no_stage_text", PATCHES_SECTION, CONFIG_FILE, L"Disable Stage Text", L"Disable Stage 1/2/Final.", false, 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({ 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"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 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 BooleanOption(L"no_opd", PATCHES_SECTION, CONFIG_FILE, L"Disable Extended Data", L"AKA Skyth's \"No Osage Play Data\" patch.\n\nDisables baked physics in edits to save space.\nMay break physics in some edits.", false, false), - new BooleanOption(L"dwgui_scaling", PATCHES_SECTION, CONFIG_FILE, L"Scale Debug Windows", L"AKA somewhatlurker's dwgui patch.\n\nMakes debug windows bigger above HD internal resolution.", 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"unlock_pseudo", PATCHES_SECTION, CONFIG_FILE, L"UNLOCK_PSEUDO_NAME", L"UNLOCK_PSEUDO_HINT", false, false), + new BooleanOption(L"card", PATCHES_SECTION, CONFIG_FILE, L"CARD_NAME", L"CARD_HINT", false, false), + new BooleanOption(L"no_opd", PATCHES_SECTION, CONFIG_FILE, L"NO_OPD_NAME", L"NO_OPD_HINT", false, false), + new BooleanOption(L"dwgui_scaling", PATCHES_SECTION, CONFIG_FILE, L"DWGUI_SCALING_NAME", L"DWGUI_SCALING_HINT", false, false), + new BooleanOption(L"freeplay", PATCHES_SECTION, CONFIG_FILE, L"FREEPLAY_NAME", L"FREEPLAY_HINT", true, false), 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 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 BooleanOption(L"autopause", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"Pause Automatically", L"Pause when focus is lost.", true, true), + new BooleanOption(L"autopause", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"AUTOPAUSE_NAME", L"AUTOPAUSE_HINT", 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 BooleanOption(L"rumble", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"RUMBLE_NAME", L"RUMBLE_HINT", true, true), + new NumericOption(L"xinput_preferred", KEYCONFIG_SECTION, KEYCONFIG_FILE, L"XINPUT_PREFERRED_NAME", L"XINPUT_PREFERRED_HINT", 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 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"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 BooleanOption(L"opengl_patch_a", LAUNCHER_SECTION, CONFIG_FILE, L"OPENGL_PATCH_A_NAME", L"OPENGL_PATCH_A_HINT", false, false), + new BooleanOption(L"opengl_patch_b", LAUNCHER_SECTION, CONFIG_FILE, L"OPENGL_PATCH_B_NAME", L"OPENGL_PATCH_B_HINT", false, false), new OptionMetaSeparator(), new OptionMetaSpacer(8), - //new BooleanOption(L"ignore_exe_checksum", PATCHES_SECTION, CONFIG_FILE, L"Ignore exe checksum", L"Use at your own risk.", false, false), - new BooleanOption(L"prevent_data_deletion", PATCHES_SECTION, CONFIG_FILE, L"Prevent Data Deletion", L"Prevents the game from deleting files.", false, false), - new StringOption(L"command_line", LAUNCHER_SECTION, CONFIG_FILE, L"Command Line:", L"Allows setting command line parameters for the game when using the launcher.\nDisabling the launcher will bypass this.", L"", false), - new BooleanOption(L"use_divahook_bat", LAUNCHER_SECTION, CONFIG_FILE, L"Use divahook.bat", L"Launches divahook.bat intead of diva.exe.", false, false), + //new BooleanOption(L"ignore_exe_checksum", PATCHES_SECTION, CONFIG_FILE, L"IGNORE_EXE_CHECKSUM_NAME", L"IGNORE_EXE_CHECKSUM_HINT", false, false), + new BooleanOption(L"prevent_data_deletion", PATCHES_SECTION, CONFIG_FILE, L"PREVENT_DATA_DELETION_NAME", L"PREVENT_DATA_DELETION_HINT", false, false), + new StringOption(L"command_line", LAUNCHER_SECTION, CONFIG_FILE, L"COMMAND_LINE_NAME", L"COMMAND_LINE_HINT", L"", false), + new BooleanOption(L"use_divahook_bat", LAUNCHER_SECTION, CONFIG_FILE, L"USE_DIVAHOOK_BAT_NAME", L"USE_DIVAHOOK_BAT_HINT", 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 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), }; 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", false, 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) diff --git a/source-code/source/plugins/Launcher/i18n.h b/source-code/source/plugins/Launcher/i18n.h new file mode 100644 index 0000000..392588f --- /dev/null +++ b/source-code/source/plugins/Launcher/i18n.h @@ -0,0 +1,18 @@ +#include + +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; + } +}; + diff --git a/source-code/source/plugins/Launcher/ui.h b/source-code/source/plugins/Launcher/ui.h index 7298250..1b708c6 100644 --- a/source-code/source/plugins/Launcher/ui.h +++ b/source-code/source/plugins/Launcher/ui.h @@ -236,9 +236,9 @@ namespace Launcher { { this->labelGPU->Text = "Wine " + wineVersion + " (remember to disable movies!)\n"; } - else this->labelGPU->Text = "GPU Info:\n"; - this->labelGPU->Text += vendor + " " + renderer + "\n"; - this->labelGPU->Text += "OpenGL: " + version + "\n"; + else this->labelGPU->Text = i18n::GetStringFallback("GPU_INFO_NAME") + "\n"; + this->labelGPU->Text += i18n::GetStringFallback(vendor + " " + renderer + "\n"); + this->labelGPU->Text += i18n::GetStringFallback("OpenGL: " + version + "\n"); int linkStart = this->labelGPU->Text->Length; bool showGpuDialog = false; @@ -253,82 +253,82 @@ namespace Launcher { if (hasNovidia) { - this->labelGPU->Text += "Issues: AMD GPU support is unofficial."; - GPUIssueText = "AMD GPUs are not supported without mods.\nThe PD Loader AMDPack seems to be installed, but please keep in mind that it may have issues."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_AMD_NOVIDIA_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_AMD_NOVIDIA_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Yellow; } else { - this->labelGPU->Text += "Issues: Mods needed for AMD compatibility!"; - GPUIssueText = "AMD GPUs are not supported without mods.\nThe PD Loader AMDPack can be used to make 3D rendering work. Please download it and follow the included instructions.\n\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_AMD_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_AMD_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Red; showGpuDialog = true; } } else if (!vendor->Contains("NVIDIA")) { - this->labelGPU->Text += "Issues: UNSUPPORTED GPU!"; - GPUIssueText = "Your graphics card is not supported. Only NVIDIA GPUs are recommended. (though AMD ones can be used with mods)\nPlease use a GTX 600 series or later NVIDIA GPU.\n\nIf you have a laptop with an NVIDIA GPU and wish to use it instead of the detected GPU, you may need to set diva.exe to use it in Windows settings or NVIDIA Control Panel.\n\nOwners of other GPUs may be able to run the game using plugins or mods, but 3D graphics will probably not work."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_UNSUPPORTED_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_UNSUPPORTED_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Red; showGpuDialog = true; } else if (gpuModel->StartsWith("GA")) // unconfirmed?? { - this->labelGPU->Text += "Issues: Ampere GPU detected! Unknown issues.\n(Click for more information)"; - GPUIssueText = "Ampere GPUs have not been tested yet. On the previous generation Turing GPUs (GTX 16xx/RTX 20xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled and report any further issues to the developers."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_GA_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_GA_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Yellow; } else if (gpuModel->StartsWith("TU")) { - this->labelGPU->Text += "Issues: Turing GPU detected! Possible noise.\n(Click for more information)"; - GPUIssueText = "On Turing GPUs (GTX 16xx/RTX 20xx), some important character shaders have issues resulting in lines/noise.\nPlease make sure the ShaderPatch plugin is enabled."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_TU_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_TU_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Yellow; } else if (gpuModel->StartsWith("GM") || gpuModel->StartsWith("GP") || gpuModel->StartsWith("GV")) { - this->labelGPU->Text += "Issues: May have minor noise on some stages.\n(Click for more information)"; - GPUIssueText = "On Maxwell GPUs (~GTX 900) or newer, some minor stage shaders create noise.\nPlease make sure the ShaderPatch plugin is enabled."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_GM_NEWER_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_GM_NEWER_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Teal; } else if (gpuModel->StartsWith("GK")) { - this->labelGPU->Text += "Issues: None."; - GPUIssueText = "Your GPU should have no issues running the game."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_GK_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_GK_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::LightBlue; } else if (gpuModel->StartsWith("GF")) { if (version[0] < '4') { - this->labelGPU->Text += "Issues: Driver too old."; - GPUIssueText = "Your GPU should be able to run the game, but it looks like your OpenGL version is too old.\nA driver update should fix this."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_GF_DRIVER_OLD_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_GF_DRIVER_OLD_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Orange; showGpuDialog = true; } else { - this->labelGPU->Text += "Issues: No known issues."; - GPUIssueText = "Your GPU should have no issues running the game, but it is older than the GPU the game was originally designed for (GTX 650 Ti).\nThere may be some issues with graphics.\nPlease report any issues so that they can be analysed and potentially fixed."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_GF_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_GF_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Teal; } } else if (version[0] >= '4' && gpuModel->Length > 0 && !gpuModel->StartsWith("Unk") && !gpuModel->StartsWith("Oth")) { - this->labelGPU->Text += "Issues: GPU may be too new.\n(Click for more information)"; - GPUIssueText = "It looks like your GPU may be too new. Only up to Turing (GTX 16xx/RTX 20xx) is currently supported.\nGood news: the game should be capable of running, but shader patches (probably needed) may not support it yet.\nYou will likely see lines/noise on important character shaders and some minor stage shaders.\nPlease report any issues so that ShaderPatch can be updated."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_TOO_NEW_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_TOO_NEW_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Orange; } else if (gpuModel->StartsWith("G") || gpuModel->StartsWith("NV") || gpuModel->StartsWith("NB") || gpuModel->StartsWith("N10") || gpuModel->StartsWith("MCP")) { - this->labelGPU->Text += "Issues: GPU too old! 3D rendering might be broken.\n(Click for more information)"; - GPUIssueText = "Your GPU is very old and does not support rendering techniques used by the game.\nYou may be able to play, but graphics will likely have major issues.\nPlease upgrade to a GTX 600 series or later GPU."; + this->labelGPU->Text += i18n::GetStringFallback("GPU_OLD_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_OLD_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Orange; showGpuDialog = true; } else //if (gpuModel->Length == 0 || gpuModel->StartsWith("Unk") || gpuModel->StartsWith("Oth")) { - this->labelGPU->Text += "Issues: Unable to detect GPU architecture.\n(Click for more information)"; - GPUIssueText = "It looks like you have an NVIDIA GPU, but something went wrong while trying to determine your GPU's architecture (type).\nThis may be a caused by a bug, but it probably indicates potential issues.\nPlease make sure you have a GTX 600 series or later GPU. (GTX 400 series or later should also work)"; + this->labelGPU->Text += i18n::GetStringFallback("GPU_UNKNOWN_NAME"); + GPUIssueText = i18n::GetStringFallback("GPU_UNKNOWN_HINT"); this->labelGPU->LinkColor = System::Drawing::Color::Orange; showGpuDialog = true; } @@ -338,7 +338,7 @@ namespace Launcher { this->labelGPU->LinkArea = System::Windows::Forms::LinkArea(linkStart, linkEnd); if (showGpuDialog && !nNoGPUDialog) - SkinnedMessageBox::Show(this, GPUIssueText + "\n\nYou can disable this message from the options tab.", "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning); + SkinnedMessageBox::Show(this, GPUIssueText + "\n\n"+ i18n::GetStringFallback("SHOW_GPU_DIALOG_HINT"), "PD Launcher", MessageBoxButtons::OK, MessageBoxIcon::Warning); } protected: @@ -370,7 +370,10 @@ namespace Launcher { void updateLagCompMsec() { - this->groupBox_Lag->Text = "Lag Compensation (" + this->trackBar_LagCompensation->Value + " msec)"; + if (this->groupBox_Lag->Tag == nullptr) { + this->groupBox_Lag->Tag = this->groupBox_Lag->Text; + } + this->groupBox_Lag->Text = this->groupBox_Lag->Tag + "(" + this->trackBar_LagCompensation->Value + " msec)"; } void updateStyle() @@ -639,52 +642,40 @@ private: System::Windows::Forms::LinkLabel^ linkLabel_Console; // // button_Launch // + resources->ApplyResources(this->button_Launch, L"button_Launch"); this->button_Launch->BackColor = System::Drawing::Color::White; this->button_Launch->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control; - this->button_Launch->FlatStyle = System::Windows::Forms::FlatStyle::Flat; - this->button_Launch->Location = System::Drawing::Point(172, 409); this->button_Launch->Name = L"button_Launch"; - this->button_Launch->Size = System::Drawing::Size(217, 23); - this->button_Launch->TabIndex = 20; - this->button_Launch->Text = L"Launch"; + this->toolTip1->SetToolTip(this->button_Launch, resources->GetString(L"button_Launch.ToolTip")); this->button_Launch->UseVisualStyleBackColor = false; this->button_Launch->Click += gcnew System::EventHandler(this, &ui::Button_Launch_Click); // // groupBox_ScreenRes // + resources->ApplyResources(this->groupBox_ScreenRes, L"groupBox_ScreenRes"); this->groupBox_ScreenRes->Controls->Add(this->panel_ScreenRes); this->groupBox_ScreenRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat; - this->groupBox_ScreenRes->Location = System::Drawing::Point(5, 6); this->groupBox_ScreenRes->Name = L"groupBox_ScreenRes"; - this->groupBox_ScreenRes->Size = System::Drawing::Size(263, 120); - this->groupBox_ScreenRes->TabIndex = 10; this->groupBox_ScreenRes->TabStop = false; - this->groupBox_ScreenRes->Text = L"Screen Resolution"; + this->toolTip1->SetToolTip(this->groupBox_ScreenRes, resources->GetString(L"groupBox_ScreenRes.ToolTip")); // // panel_ScreenRes // - this->panel_ScreenRes->AutoScroll = true; + resources->ApplyResources(this->panel_ScreenRes, L"panel_ScreenRes"); this->panel_ScreenRes->Controls->Add(this->checkBox_nofsopt); - this->panel_ScreenRes->Location = System::Drawing::Point(5, 19); this->panel_ScreenRes->Name = L"panel_ScreenRes"; - this->panel_ScreenRes->Size = System::Drawing::Size(253, 99); - this->panel_ScreenRes->TabIndex = 0; + this->toolTip1->SetToolTip(this->panel_ScreenRes, resources->GetString(L"panel_ScreenRes.ToolTip")); // // checkBox_nofsopt // - this->checkBox_nofsopt->AutoSize = true; - this->checkBox_nofsopt->Location = System::Drawing::Point(14, 77); - this->checkBox_nofsopt->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->checkBox_nofsopt, L"checkBox_nofsopt"); this->checkBox_nofsopt->Name = L"checkBox_nofsopt"; - this->checkBox_nofsopt->Size = System::Drawing::Size(177, 17); - this->checkBox_nofsopt->TabIndex = 0; - this->checkBox_nofsopt->Text = L"Disable Fullscreen Optimizations"; - this->toolTip1->SetToolTip(this->checkBox_nofsopt, L"Disables Windows 10/11 fullscreen optimizations, which can cause issues with scre" - L"enshots and/or framerate."); + this->toolTip1->SetToolTip(this->checkBox_nofsopt, resources->GetString(L"checkBox_nofsopt.ToolTip")); this->checkBox_nofsopt->UseVisualStyleBackColor = true; // // tabControl // + resources->ApplyResources(this->tabControl, L"tabControl"); this->tabControl->Controls->Add(this->tabPage_Resolution); this->tabControl->Controls->Add(this->tabPage_Patches); this->tabControl->Controls->Add(this->tabPage_Playerdata); @@ -693,16 +684,14 @@ private: System::Windows::Forms::LinkLabel^ linkLabel_Console; this->tabControl->Controls->Add(this->tabPage_Modpacks); this->tabControl->Controls->Add(this->tabPage_Credits); this->tabControl->Controls->Add(this->tabPage_Update); - this->tabControl->Location = System::Drawing::Point(0, 0); this->tabControl->Name = L"tabControl"; this->tabControl->SelectedIndex = 0; - this->tabControl->Size = System::Drawing::Size(560, 404); - this->tabControl->TabIndex = 10; + this->toolTip1->SetToolTip(this->tabControl, resources->GetString(L"tabControl.ToolTip")); // // tabPage_Resolution // + resources->ApplyResources(this->tabPage_Resolution, L"tabPage_Resolution"); this->tabPage_Resolution->BackColor = System::Drawing::Color::White; - this->tabPage_Resolution->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch; this->tabPage_Resolution->Controls->Add(this->groupBox_Lag); this->tabPage_Resolution->Controls->Add(this->groupBox_Details); this->tabPage_Resolution->Controls->Add(this->labelGPU); @@ -710,192 +699,149 @@ private: System::Windows::Forms::LinkLabel^ linkLabel_Console; this->tabPage_Resolution->Controls->Add(this->groupBox_ScreenRes); this->tabPage_Resolution->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(64)), static_cast(static_cast(64)), static_cast(static_cast(64))); - this->tabPage_Resolution->Location = System::Drawing::Point(4, 22); this->tabPage_Resolution->Name = L"tabPage_Resolution"; - this->tabPage_Resolution->Padding = System::Windows::Forms::Padding(3); - this->tabPage_Resolution->Size = System::Drawing::Size(552, 378); - this->tabPage_Resolution->TabIndex = 0; - this->tabPage_Resolution->Text = L"Graphics"; + this->toolTip1->SetToolTip(this->tabPage_Resolution, resources->GetString(L"tabPage_Resolution.ToolTip")); // // groupBox_Lag // + resources->ApplyResources(this->groupBox_Lag, L"groupBox_Lag"); this->groupBox_Lag->Controls->Add(this->trackBar_LagCompensation); this->groupBox_Lag->FlatStyle = System::Windows::Forms::FlatStyle::Flat; - this->groupBox_Lag->Location = System::Drawing::Point(5, 303); this->groupBox_Lag->Name = L"groupBox_Lag"; - this->groupBox_Lag->Size = System::Drawing::Size(263, 69); - this->groupBox_Lag->TabIndex = 21; this->groupBox_Lag->TabStop = false; - this->groupBox_Lag->Text = L"Lag Compensation"; + this->toolTip1->SetToolTip(this->groupBox_Lag, resources->GetString(L"groupBox_Lag.ToolTip")); // // trackBar_LagCompensation // + resources->ApplyResources(this->trackBar_LagCompensation, L"trackBar_LagCompensation"); this->trackBar_LagCompensation->LargeChange = 1; - this->trackBar_LagCompensation->Location = System::Drawing::Point(7, 20); this->trackBar_LagCompensation->Maximum = 500; this->trackBar_LagCompensation->Name = L"trackBar_LagCompensation"; - this->trackBar_LagCompensation->Size = System::Drawing::Size(250, 45); - this->trackBar_LagCompensation->TabIndex = 0; this->trackBar_LagCompensation->TickStyle = System::Windows::Forms::TickStyle::None; + this->toolTip1->SetToolTip(this->trackBar_LagCompensation, resources->GetString(L"trackBar_LagCompensation.ToolTip")); this->trackBar_LagCompensation->ValueChanged += gcnew System::EventHandler(this, &ui::trackBar_LagCompensation_ValueChanged); // // groupBox_Details // + resources->ApplyResources(this->groupBox_Details, L"groupBox_Details"); this->groupBox_Details->Controls->Add(this->panel_Details); this->groupBox_Details->FlatStyle = System::Windows::Forms::FlatStyle::Flat; - this->groupBox_Details->Location = System::Drawing::Point(274, 6); this->groupBox_Details->Name = L"groupBox_Details"; - this->groupBox_Details->Size = System::Drawing::Size(272, 366); - this->groupBox_Details->TabIndex = 11; this->groupBox_Details->TabStop = false; - this->groupBox_Details->Text = L"Details"; + this->toolTip1->SetToolTip(this->groupBox_Details, resources->GetString(L"groupBox_Details.ToolTip")); // // panel_Details // - this->panel_Details->AutoScroll = true; - this->panel_Details->Location = System::Drawing::Point(5, 19); + resources->ApplyResources(this->panel_Details, L"panel_Details"); this->panel_Details->Name = L"panel_Details"; - this->panel_Details->Size = System::Drawing::Size(261, 341); - this->panel_Details->TabIndex = 0; + this->toolTip1->SetToolTip(this->panel_Details, resources->GetString(L"panel_Details.ToolTip")); // // labelGPU // - this->labelGPU->AutoSize = true; + resources->ApplyResources(this->labelGPU, L"labelGPU"); this->labelGPU->BackColor = System::Drawing::Color::Transparent; this->labelGPU->ForeColor = System::Drawing::Color::Black; - this->labelGPU->Location = System::Drawing::Point(5, 213); - this->labelGPU->Margin = System::Windows::Forms::Padding(2, 0, 2, 0); - this->labelGPU->MinimumSize = System::Drawing::Size(263, 13); this->labelGPU->Name = L"labelGPU"; - this->labelGPU->Size = System::Drawing::Size(263, 13); - this->labelGPU->TabIndex = 21; - this->labelGPU->TextAlign = System::Drawing::ContentAlignment::MiddleLeft; + this->toolTip1->SetToolTip(this->labelGPU, resources->GetString(L"labelGPU.ToolTip")); // // groupBox_InternalRes // + resources->ApplyResources(this->groupBox_InternalRes, L"groupBox_InternalRes"); this->groupBox_InternalRes->Controls->Add(this->panel_IntRes); this->groupBox_InternalRes->FlatStyle = System::Windows::Forms::FlatStyle::Flat; - this->groupBox_InternalRes->Location = System::Drawing::Point(5, 127); this->groupBox_InternalRes->Name = L"groupBox_InternalRes"; - this->groupBox_InternalRes->Size = System::Drawing::Size(263, 83); - this->groupBox_InternalRes->TabIndex = 20; this->groupBox_InternalRes->TabStop = false; - this->groupBox_InternalRes->Text = L"Internal Resolution (Quality)"; + this->toolTip1->SetToolTip(this->groupBox_InternalRes, resources->GetString(L"groupBox_InternalRes.ToolTip")); // // panel_IntRes // - this->panel_IntRes->AutoScroll = true; - this->panel_IntRes->Location = System::Drawing::Point(5, 19); + resources->ApplyResources(this->panel_IntRes, L"panel_IntRes"); this->panel_IntRes->Name = L"panel_IntRes"; - this->panel_IntRes->Size = System::Drawing::Size(253, 59); - this->panel_IntRes->TabIndex = 1; + this->toolTip1->SetToolTip(this->panel_IntRes, resources->GetString(L"panel_IntRes.ToolTip")); // // tabPage_Patches // + resources->ApplyResources(this->tabPage_Patches, L"tabPage_Patches"); this->tabPage_Patches->BackColor = System::Drawing::Color::White; this->tabPage_Patches->Controls->Add(this->panel_Patches); this->tabPage_Patches->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(64)), static_cast(static_cast(64)), static_cast(static_cast(64))); - this->tabPage_Patches->Location = System::Drawing::Point(4, 22); this->tabPage_Patches->Name = L"tabPage_Patches"; - this->tabPage_Patches->Size = System::Drawing::Size(552, 378); - this->tabPage_Patches->TabIndex = 1; - this->tabPage_Patches->Text = L"Options"; + this->toolTip1->SetToolTip(this->tabPage_Patches, resources->GetString(L"tabPage_Patches.ToolTip")); // // panel_Patches // - this->panel_Patches->AutoScroll = true; - this->panel_Patches->Location = System::Drawing::Point(0, 0); + resources->ApplyResources(this->panel_Patches, L"panel_Patches"); this->panel_Patches->Name = L"panel_Patches"; - this->panel_Patches->Size = System::Drawing::Size(552, 378); - this->panel_Patches->TabIndex = 9; + this->toolTip1->SetToolTip(this->panel_Patches, resources->GetString(L"panel_Patches.ToolTip")); // // tabPage_Playerdata // + resources->ApplyResources(this->tabPage_Playerdata, L"tabPage_Playerdata"); this->tabPage_Playerdata->BackColor = System::Drawing::Color::White; this->tabPage_Playerdata->Controls->Add(this->panel_Playerdata); this->tabPage_Playerdata->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(64)), static_cast(static_cast(64)), static_cast(static_cast(64))); - this->tabPage_Playerdata->Location = System::Drawing::Point(4, 22); this->tabPage_Playerdata->Name = L"tabPage_Playerdata"; - this->tabPage_Playerdata->Size = System::Drawing::Size(552, 378); - this->tabPage_Playerdata->TabIndex = 3; - this->tabPage_Playerdata->Text = L"Player"; + this->toolTip1->SetToolTip(this->tabPage_Playerdata, resources->GetString(L"tabPage_Playerdata.ToolTip")); // // panel_Playerdata // - this->panel_Playerdata->AutoScroll = true; - this->panel_Playerdata->Location = System::Drawing::Point(0, 0); + resources->ApplyResources(this->panel_Playerdata, L"panel_Playerdata"); this->panel_Playerdata->Name = L"panel_Playerdata"; - this->panel_Playerdata->Size = System::Drawing::Size(552, 378); - this->panel_Playerdata->TabIndex = 1; + this->toolTip1->SetToolTip(this->panel_Playerdata, resources->GetString(L"panel_Playerdata.ToolTip")); // // tabPage_Components // + resources->ApplyResources(this->tabPage_Components, L"tabPage_Components"); this->tabPage_Components->BackColor = System::Drawing::Color::White; this->tabPage_Components->Controls->Add(this->linkLabel_Console); this->tabPage_Components->Controls->Add(this->panel_Components); this->tabPage_Components->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(64)), static_cast(static_cast(64)), static_cast(static_cast(64))); - this->tabPage_Components->Location = System::Drawing::Point(4, 22); this->tabPage_Components->Name = L"tabPage_Components"; - this->tabPage_Components->Padding = System::Windows::Forms::Padding(3); - this->tabPage_Components->Size = System::Drawing::Size(552, 378); - this->tabPage_Components->TabIndex = 2; - this->tabPage_Components->Text = L"Components"; + this->toolTip1->SetToolTip(this->tabPage_Components, resources->GetString(L"tabPage_Components.ToolTip")); // // linkLabel_Console // - this->linkLabel_Console->AutoSize = true; - this->linkLabel_Console->Location = System::Drawing::Point(504, 362); + resources->ApplyResources(this->linkLabel_Console, L"linkLabel_Console"); this->linkLabel_Console->Name = L"linkLabel_Console"; - this->linkLabel_Console->Size = System::Drawing::Size(45, 13); - this->linkLabel_Console->TabIndex = 1; this->linkLabel_Console->TabStop = true; - this->linkLabel_Console->Text = L"Console"; - this->linkLabel_Console->TextAlign = System::Drawing::ContentAlignment::BottomRight; + this->toolTip1->SetToolTip(this->linkLabel_Console, resources->GetString(L"linkLabel_Console.ToolTip")); this->linkLabel_Console->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Console_LinkClicked); // // panel_Components // - this->panel_Components->AutoScroll = true; - this->panel_Components->Location = System::Drawing::Point(0, 0); + resources->ApplyResources(this->panel_Components, L"panel_Components"); this->panel_Components->Name = L"panel_Components"; - this->panel_Components->Size = System::Drawing::Size(276, 378); - this->panel_Components->TabIndex = 0; + this->toolTip1->SetToolTip(this->panel_Components, resources->GetString(L"panel_Components.ToolTip")); // // tabPage_Plugins // + resources->ApplyResources(this->tabPage_Plugins, L"tabPage_Plugins"); this->tabPage_Plugins->BackColor = System::Drawing::Color::White; this->tabPage_Plugins->Controls->Add(this->panel_Custom); this->tabPage_Plugins->Controls->Add(this->panel_Plugins); this->tabPage_Plugins->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(64)), static_cast(static_cast(64)), static_cast(static_cast(64))); - this->tabPage_Plugins->Location = System::Drawing::Point(4, 22); this->tabPage_Plugins->Name = L"tabPage_Plugins"; - this->tabPage_Plugins->Padding = System::Windows::Forms::Padding(3); - this->tabPage_Plugins->Size = System::Drawing::Size(552, 378); - this->tabPage_Plugins->TabIndex = 3; - this->tabPage_Plugins->Text = L"Plugins and Patches"; + this->toolTip1->SetToolTip(this->tabPage_Plugins, resources->GetString(L"tabPage_Plugins.ToolTip")); // // panel_Custom // - this->panel_Custom->AutoScroll = true; - this->panel_Custom->Location = System::Drawing::Point(276, 0); + resources->ApplyResources(this->panel_Custom, L"panel_Custom"); this->panel_Custom->Name = L"panel_Custom"; - this->panel_Custom->Size = System::Drawing::Size(276, 378); - this->panel_Custom->TabIndex = 3; + this->toolTip1->SetToolTip(this->panel_Custom, resources->GetString(L"panel_Custom.ToolTip")); // // panel_Plugins // - this->panel_Plugins->AutoScroll = true; - this->panel_Plugins->Location = System::Drawing::Point(0, 0); + resources->ApplyResources(this->panel_Plugins, L"panel_Plugins"); this->panel_Plugins->Name = L"panel_Plugins"; - this->panel_Plugins->Size = System::Drawing::Size(276, 378); - this->panel_Plugins->TabIndex = 0; + this->toolTip1->SetToolTip(this->panel_Plugins, resources->GetString(L"panel_Plugins.ToolTip")); // // tabPage_Modpacks // + resources->ApplyResources(this->tabPage_Modpacks, L"tabPage_Modpacks"); this->tabPage_Modpacks->Controls->Add(this->button_ModRename); this->tabPage_Modpacks->Controls->Add(this->button_ModRescan); this->tabPage_Modpacks->Controls->Add(this->button_ModFiles); @@ -904,140 +850,97 @@ private: System::Windows::Forms::LinkLabel^ linkLabel_Console; this->tabPage_Modpacks->Controls->Add(this->button_ModClone); this->tabPage_Modpacks->Controls->Add(this->button_ModSetActive); this->tabPage_Modpacks->Controls->Add(this->listBox_Mods); - this->tabPage_Modpacks->Location = System::Drawing::Point(4, 22); - this->tabPage_Modpacks->Margin = System::Windows::Forms::Padding(2); this->tabPage_Modpacks->Name = L"tabPage_Modpacks"; - this->tabPage_Modpacks->Padding = System::Windows::Forms::Padding(2); - this->tabPage_Modpacks->Size = System::Drawing::Size(552, 378); - this->tabPage_Modpacks->TabIndex = 7; - this->tabPage_Modpacks->Text = L"Modpacks"; + this->toolTip1->SetToolTip(this->tabPage_Modpacks, resources->GetString(L"tabPage_Modpacks.ToolTip")); this->tabPage_Modpacks->UseVisualStyleBackColor = true; this->tabPage_Modpacks->Enter += gcnew System::EventHandler(this, &ui::tabPage_Modpacks_Enter); // // button_ModRename // - this->button_ModRename->Enabled = false; - this->button_ModRename->Location = System::Drawing::Point(279, 357); - this->button_ModRename->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_ModRename, L"button_ModRename"); this->button_ModRename->Name = L"button_ModRename"; - this->button_ModRename->Size = System::Drawing::Size(65, 21); - this->button_ModRename->TabIndex = 8; - this->button_ModRename->Text = L"Rename"; + this->toolTip1->SetToolTip(this->button_ModRename, resources->GetString(L"button_ModRename.ToolTip")); this->button_ModRename->UseVisualStyleBackColor = true; this->button_ModRename->Click += gcnew System::EventHandler(this, &ui::button_ModRename_Click); // // button_ModRescan // - this->button_ModRescan->Location = System::Drawing::Point(348, 357); - this->button_ModRescan->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_ModRescan, L"button_ModRescan"); this->button_ModRescan->Name = L"button_ModRescan"; - this->button_ModRescan->Size = System::Drawing::Size(65, 21); - this->button_ModRescan->TabIndex = 7; - this->button_ModRescan->Text = L"Rescan"; + this->toolTip1->SetToolTip(this->button_ModRescan, resources->GetString(L"button_ModRescan.ToolTip")); this->button_ModRescan->UseVisualStyleBackColor = true; this->button_ModRescan->Click += gcnew System::EventHandler(this, &ui::button_ModRescan_Click); // // button_ModFiles // - this->button_ModFiles->Enabled = false; - this->button_ModFiles->Location = System::Drawing::Point(73, 357); - this->button_ModFiles->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_ModFiles, L"button_ModFiles"); this->button_ModFiles->Name = L"button_ModFiles"; - this->button_ModFiles->Size = System::Drawing::Size(65, 21); - this->button_ModFiles->TabIndex = 6; - this->button_ModFiles->Text = L"Files..."; + this->toolTip1->SetToolTip(this->button_ModFiles, resources->GetString(L"button_ModFiles.ToolTip")); this->button_ModFiles->UseVisualStyleBackColor = true; this->button_ModFiles->Click += gcnew System::EventHandler(this, &ui::button_ModFiles_Click); // // checkBox_ModPatches // - this->checkBox_ModPatches->AutoSize = true; + resources->ApplyResources(this->checkBox_ModPatches, L"checkBox_ModPatches"); this->checkBox_ModPatches->Checked = true; this->checkBox_ModPatches->CheckState = System::Windows::Forms::CheckState::Checked; - this->checkBox_ModPatches->Enabled = false; - this->checkBox_ModPatches->Location = System::Drawing::Point(430, 358); - this->checkBox_ModPatches->Margin = System::Windows::Forms::Padding(2); this->checkBox_ModPatches->Name = L"checkBox_ModPatches"; - this->checkBox_ModPatches->Size = System::Drawing::Size(123, 17); - this->checkBox_ModPatches->TabIndex = 5; - this->checkBox_ModPatches->Text = L"Plugins and Patches"; + this->toolTip1->SetToolTip(this->checkBox_ModPatches, resources->GetString(L"checkBox_ModPatches.ToolTip")); this->checkBox_ModPatches->UseVisualStyleBackColor = true; // // button_ModDelete // - this->button_ModDelete->Enabled = false; - this->button_ModDelete->Location = System::Drawing::Point(211, 357); - this->button_ModDelete->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_ModDelete, L"button_ModDelete"); this->button_ModDelete->Name = L"button_ModDelete"; - this->button_ModDelete->Size = System::Drawing::Size(65, 21); - this->button_ModDelete->TabIndex = 4; - this->button_ModDelete->Text = L"Delete"; + this->toolTip1->SetToolTip(this->button_ModDelete, resources->GetString(L"button_ModDelete.ToolTip")); this->button_ModDelete->UseVisualStyleBackColor = true; this->button_ModDelete->Click += gcnew System::EventHandler(this, &ui::button_ModDelete_Click); // // button_ModClone // - this->button_ModClone->Enabled = false; - this->button_ModClone->Location = System::Drawing::Point(142, 357); - this->button_ModClone->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_ModClone, L"button_ModClone"); this->button_ModClone->Name = L"button_ModClone"; - this->button_ModClone->Size = System::Drawing::Size(65, 21); - this->button_ModClone->TabIndex = 3; - this->button_ModClone->Text = L"New/Clone"; + this->toolTip1->SetToolTip(this->button_ModClone, resources->GetString(L"button_ModClone.ToolTip")); this->button_ModClone->UseVisualStyleBackColor = true; this->button_ModClone->Click += gcnew System::EventHandler(this, &ui::button_ModClone_Click); // // button_ModSetActive // - this->button_ModSetActive->Enabled = false; - this->button_ModSetActive->Location = System::Drawing::Point(5, 357); - this->button_ModSetActive->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_ModSetActive, L"button_ModSetActive"); this->button_ModSetActive->Name = L"button_ModSetActive"; - this->button_ModSetActive->Size = System::Drawing::Size(65, 21); - this->button_ModSetActive->TabIndex = 2; - this->button_ModSetActive->Text = L"Set Active"; + this->toolTip1->SetToolTip(this->button_ModSetActive, resources->GetString(L"button_ModSetActive.ToolTip")); this->button_ModSetActive->UseVisualStyleBackColor = true; this->button_ModSetActive->Click += gcnew System::EventHandler(this, &ui::button_ModSetActive_Click); // // listBox_Mods // + resources->ApplyResources(this->listBox_Mods, L"listBox_Mods"); this->listBox_Mods->FormattingEnabled = true; - this->listBox_Mods->Location = System::Drawing::Point(5, 5); - this->listBox_Mods->Margin = System::Windows::Forms::Padding(2); this->listBox_Mods->Name = L"listBox_Mods"; - this->listBox_Mods->Size = System::Drawing::Size(546, 342); - this->listBox_Mods->TabIndex = 0; + this->toolTip1->SetToolTip(this->listBox_Mods, resources->GetString(L"listBox_Mods.ToolTip")); this->listBox_Mods->SelectedValueChanged += gcnew System::EventHandler(this, &ui::listBox_Mods_SelectedValueChanged); // // tabPage_Credits // + resources->ApplyResources(this->tabPage_Credits, L"tabPage_Credits"); this->tabPage_Credits->Controls->Add(this->creditsTextBox); - this->tabPage_Credits->Location = System::Drawing::Point(4, 22); - this->tabPage_Credits->Margin = System::Windows::Forms::Padding(2); this->tabPage_Credits->Name = L"tabPage_Credits"; - this->tabPage_Credits->Padding = System::Windows::Forms::Padding(2); - this->tabPage_Credits->Size = System::Drawing::Size(552, 378); - this->tabPage_Credits->TabIndex = 5; - this->tabPage_Credits->Text = L"Credits"; + this->toolTip1->SetToolTip(this->tabPage_Credits, resources->GetString(L"tabPage_Credits.ToolTip")); this->tabPage_Credits->UseVisualStyleBackColor = true; // // creditsTextBox // + resources->ApplyResources(this->creditsTextBox, L"creditsTextBox"); this->creditsTextBox->BackColor = System::Drawing::Color::White; this->creditsTextBox->ForeColor = System::Drawing::Color::FromArgb(static_cast(static_cast(64)), static_cast(static_cast(64)), static_cast(static_cast(64))); - this->creditsTextBox->Location = System::Drawing::Point(0, 0); - this->creditsTextBox->Margin = System::Windows::Forms::Padding(2); - this->creditsTextBox->Multiline = true; this->creditsTextBox->Name = L"creditsTextBox"; this->creditsTextBox->ReadOnly = true; - this->creditsTextBox->ScrollBars = System::Windows::Forms::ScrollBars::Both; - this->creditsTextBox->Size = System::Drawing::Size(552, 378); - this->creditsTextBox->TabIndex = 0; - this->creditsTextBox->Text = resources->GetString(L"creditsTextBox.Text"); + this->toolTip1->SetToolTip(this->creditsTextBox, resources->GetString(L"creditsTextBox.ToolTip")); // // tabPage_Update // + resources->ApplyResources(this->tabPage_Update, L"tabPage_Update"); this->tabPage_Update->Controls->Add(this->linkLabel_Repo); this->tabPage_Update->Controls->Add(this->linkLabel_Help); this->tabPage_Update->Controls->Add(this->linkLabel_Official_Discord); @@ -1048,202 +951,138 @@ private: System::Windows::Forms::LinkLabel^ linkLabel_Console; this->tabPage_Update->Controls->Add(this->button_Releases_page); this->tabPage_Update->Controls->Add(this->label_Update_2); this->tabPage_Update->Controls->Add(this->label_Update_1); - this->tabPage_Update->Location = System::Drawing::Point(4, 22); - this->tabPage_Update->Margin = System::Windows::Forms::Padding(2); this->tabPage_Update->Name = L"tabPage_Update"; - this->tabPage_Update->Padding = System::Windows::Forms::Padding(2); - this->tabPage_Update->Size = System::Drawing::Size(552, 378); - this->tabPage_Update->TabIndex = 6; - this->tabPage_Update->Text = L"UPDATE"; + this->toolTip1->SetToolTip(this->tabPage_Update, resources->GetString(L"tabPage_Update.ToolTip")); this->tabPage_Update->UseVisualStyleBackColor = true; // // linkLabel_Repo // - this->linkLabel_Repo->AutoSize = true; - this->linkLabel_Repo->Location = System::Drawing::Point(169, 297); - this->linkLabel_Repo->Margin = System::Windows::Forms::Padding(2, 0, 2, 0); + resources->ApplyResources(this->linkLabel_Repo, L"linkLabel_Repo"); this->linkLabel_Repo->Name = L"linkLabel_Repo"; - this->linkLabel_Repo->Size = System::Drawing::Size(87, 13); - this->linkLabel_Repo->TabIndex = 9; this->linkLabel_Repo->TabStop = true; - this->linkLabel_Repo->Text = L"Official repository"; + this->toolTip1->SetToolTip(this->linkLabel_Repo, resources->GetString(L"linkLabel_Repo.ToolTip")); this->linkLabel_Repo->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Repo_LinkClicked); // // linkLabel_Help // - this->linkLabel_Help->AutoSize = true; - this->linkLabel_Help->Location = System::Drawing::Point(169, 257); - this->linkLabel_Help->Margin = System::Windows::Forms::Padding(2, 0, 2, 0); + resources->ApplyResources(this->linkLabel_Help, L"linkLabel_Help"); this->linkLabel_Help->Name = L"linkLabel_Help"; - this->linkLabel_Help->Size = System::Drawing::Size(29, 13); - this->linkLabel_Help->TabIndex = 8; this->linkLabel_Help->TabStop = true; - this->linkLabel_Help->Text = L"Help"; + this->toolTip1->SetToolTip(this->linkLabel_Help, resources->GetString(L"linkLabel_Help.ToolTip")); this->linkLabel_Help->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Help_LinkClicked); // // linkLabel_Official_Discord // - this->linkLabel_Official_Discord->AutoSize = true; - this->linkLabel_Official_Discord->Location = System::Drawing::Point(169, 277); - this->linkLabel_Official_Discord->Margin = System::Windows::Forms::Padding(2, 0, 2, 0); + resources->ApplyResources(this->linkLabel_Official_Discord, L"linkLabel_Official_Discord"); this->linkLabel_Official_Discord->Name = L"linkLabel_Official_Discord"; - this->linkLabel_Official_Discord->Size = System::Drawing::Size(78, 13); - this->linkLabel_Official_Discord->TabIndex = 7; this->linkLabel_Official_Discord->TabStop = true; - this->linkLabel_Official_Discord->Text = L"Official Discord"; + this->toolTip1->SetToolTip(this->linkLabel_Official_Discord, resources->GetString(L"linkLabel_Official_Discord.ToolTip")); this->linkLabel_Official_Discord->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Official_Discord_LinkClicked); // // linkLabel_Changelog // - this->linkLabel_Changelog->AutoSize = true; - this->linkLabel_Changelog->Location = System::Drawing::Point(169, 238); - this->linkLabel_Changelog->Margin = System::Windows::Forms::Padding(2, 0, 2, 0); + resources->ApplyResources(this->linkLabel_Changelog, L"linkLabel_Changelog"); this->linkLabel_Changelog->Name = L"linkLabel_Changelog"; - this->linkLabel_Changelog->Size = System::Drawing::Size(58, 13); - this->linkLabel_Changelog->TabIndex = 6; this->linkLabel_Changelog->TabStop = true; - this->linkLabel_Changelog->Text = L"Changelog"; + this->toolTip1->SetToolTip(this->linkLabel_Changelog, resources->GetString(L"linkLabel_Changelog.ToolTip")); this->linkLabel_Changelog->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &ui::linkLabel_Changelog_LinkClicked); // // button_Clean_installation // - this->button_Clean_installation->Location = System::Drawing::Point(295, 207); - this->button_Clean_installation->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_Clean_installation, L"button_Clean_installation"); this->button_Clean_installation->Name = L"button_Clean_installation"; - this->button_Clean_installation->Size = System::Drawing::Size(92, 26); - this->button_Clean_installation->TabIndex = 5; - this->button_Clean_installation->Text = L"Clean installation"; + this->toolTip1->SetToolTip(this->button_Clean_installation, resources->GetString(L"button_Clean_installation.ToolTip")); this->button_Clean_installation->UseVisualStyleBackColor = true; this->button_Clean_installation->Click += gcnew System::EventHandler(this, &ui::button_Clean_installation_Click); // // button_Instructions // - this->button_Instructions->Location = System::Drawing::Point(295, 177); - this->button_Instructions->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_Instructions, L"button_Instructions"); this->button_Instructions->Name = L"button_Instructions"; - this->button_Instructions->Size = System::Drawing::Size(92, 26); - this->button_Instructions->TabIndex = 4; - this->button_Instructions->Text = L"Instructions"; + this->toolTip1->SetToolTip(this->button_Instructions, resources->GetString(L"button_Instructions.ToolTip")); this->button_Instructions->UseVisualStyleBackColor = true; this->button_Instructions->Click += gcnew System::EventHandler(this, &ui::button_Instructions_Click); // // button_Unstable_builds // - this->button_Unstable_builds->Location = System::Drawing::Point(169, 207); - this->button_Unstable_builds->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_Unstable_builds, L"button_Unstable_builds"); this->button_Unstable_builds->Name = L"button_Unstable_builds"; - this->button_Unstable_builds->Size = System::Drawing::Size(92, 26); - this->button_Unstable_builds->TabIndex = 3; - this->button_Unstable_builds->Text = L"Unstable builds"; + this->toolTip1->SetToolTip(this->button_Unstable_builds, resources->GetString(L"button_Unstable_builds.ToolTip")); this->button_Unstable_builds->UseVisualStyleBackColor = true; this->button_Unstable_builds->Click += gcnew System::EventHandler(this, &ui::button_Unstable_builds_Click); // // button_Releases_page // - this->button_Releases_page->Location = System::Drawing::Point(169, 177); - this->button_Releases_page->Margin = System::Windows::Forms::Padding(2); + resources->ApplyResources(this->button_Releases_page, L"button_Releases_page"); this->button_Releases_page->Name = L"button_Releases_page"; - this->button_Releases_page->Size = System::Drawing::Size(92, 26); - this->button_Releases_page->TabIndex = 2; - this->button_Releases_page->Text = L"Releases page"; + this->toolTip1->SetToolTip(this->button_Releases_page, resources->GetString(L"button_Releases_page.ToolTip")); this->button_Releases_page->UseVisualStyleBackColor = true; this->button_Releases_page->Click += gcnew System::EventHandler(this, &ui::button_Releases_page_Click); // // label_Update_2 // - this->label_Update_2->AutoSize = true; - this->label_Update_2->Location = System::Drawing::Point(48, 73); - this->label_Update_2->Margin = System::Windows::Forms::Padding(2, 0, 2, 0); + resources->ApplyResources(this->label_Update_2, L"label_Update_2"); this->label_Update_2->Name = L"label_Update_2"; - this->label_Update_2->Size = System::Drawing::Size(467, 26); - this->label_Update_2->TabIndex = 1; - this->label_Update_2->Text = L"It is highly recommended to download updates directly from the official repositor" - L"y.\r\nIf you have downloaded PD Loader from a third-party, it is recommended to do" - L" a clean installation."; - this->label_Update_2->TextAlign = System::Drawing::ContentAlignment::MiddleCenter; + this->toolTip1->SetToolTip(this->label_Update_2, resources->GetString(L"label_Update_2.ToolTip")); // // label_Update_1 // - this->label_Update_1->AutoSize = true; - this->label_Update_1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, - static_cast(0))); - this->label_Update_1->Location = System::Drawing::Point(11, 30); - this->label_Update_1->Margin = System::Windows::Forms::Padding(2, 0, 2, 0); + resources->ApplyResources(this->label_Update_1, L"label_Update_1"); this->label_Update_1->Name = L"label_Update_1"; - this->label_Update_1->Size = System::Drawing::Size(555, 20); - this->label_Update_1->TabIndex = 0; - this->label_Update_1->Text = L"Update PD Loader regularly to get the latest fixes and new features!"; - this->label_Update_1->TextAlign = System::Drawing::ContentAlignment::MiddleCenter; + this->toolTip1->SetToolTip(this->label_Update_1, resources->GetString(L"label_Update_1.ToolTip")); // // button_Discord // + resources->ApplyResources(this->button_Discord, L"button_Discord"); this->button_Discord->BackColor = System::Drawing::Color::FromArgb(static_cast(static_cast(242)), static_cast(static_cast(242)), static_cast(static_cast(242))); this->button_Discord->Cursor = System::Windows::Forms::Cursors::Hand; this->button_Discord->FlatAppearance->BorderSize = 0; - this->button_Discord->FlatStyle = System::Windows::Forms::FlatStyle::Flat; - this->button_Discord->Image = (cli::safe_cast(resources->GetObject(L"button_Discord.Image"))); - this->button_Discord->Location = System::Drawing::Point(496, 404); this->button_Discord->Name = L"button_Discord"; - this->button_Discord->Size = System::Drawing::Size(32, 32); - this->button_Discord->TabIndex = 31; + this->toolTip1->SetToolTip(this->button_Discord, resources->GetString(L"button_Discord.ToolTip")); this->button_Discord->UseVisualStyleBackColor = false; this->button_Discord->Click += gcnew System::EventHandler(this, &ui::button_Discord_Click); // // button_github // + resources->ApplyResources(this->button_github, L"button_github"); this->button_github->BackColor = System::Drawing::Color::FromArgb(static_cast(static_cast(242)), static_cast(static_cast(242)), static_cast(static_cast(242))); this->button_github->Cursor = System::Windows::Forms::Cursors::Hand; this->button_github->FlatAppearance->BorderSize = 0; - this->button_github->FlatStyle = System::Windows::Forms::FlatStyle::Flat; - this->button_github->Image = (cli::safe_cast(resources->GetObject(L"button_github.Image"))); - this->button_github->Location = System::Drawing::Point(528, 404); this->button_github->Name = L"button_github"; - this->button_github->Size = System::Drawing::Size(32, 32); - this->button_github->TabIndex = 32; + this->toolTip1->SetToolTip(this->button_github, resources->GetString(L"button_github.ToolTip")); this->button_github->UseVisualStyleBackColor = false; this->button_github->Click += gcnew System::EventHandler(this, &ui::button_github_Click); // // button_Apply // + resources->ApplyResources(this->button_Apply, L"button_Apply"); this->button_Apply->BackColor = System::Drawing::Color::White; this->button_Apply->FlatAppearance->BorderColor = System::Drawing::SystemColors::Control; - this->button_Apply->FlatStyle = System::Windows::Forms::FlatStyle::Flat; - this->button_Apply->Location = System::Drawing::Point(4, 409); this->button_Apply->Name = L"button_Apply"; - this->button_Apply->Size = System::Drawing::Size(69, 23); - this->button_Apply->TabIndex = 33; - this->button_Apply->Text = L"Apply"; + this->toolTip1->SetToolTip(this->button_Apply, resources->GetString(L"button_Apply.ToolTip")); this->button_Apply->UseVisualStyleBackColor = false; this->button_Apply->Click += gcnew System::EventHandler(this, &ui::button_Apply_Click); // // button_Wiki // + resources->ApplyResources(this->button_Wiki, L"button_Wiki"); this->button_Wiki->BackColor = System::Drawing::Color::FromArgb(static_cast(static_cast(242)), static_cast(static_cast(242)), static_cast(static_cast(242))); - this->button_Wiki->BackgroundImage = (cli::safe_cast(resources->GetObject(L"button_Wiki.BackgroundImage"))); - this->button_Wiki->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch; this->button_Wiki->Cursor = System::Windows::Forms::Cursors::Hand; this->button_Wiki->FlatAppearance->BorderSize = 0; - this->button_Wiki->FlatStyle = System::Windows::Forms::FlatStyle::Flat; - this->button_Wiki->Location = System::Drawing::Point(464, 404); this->button_Wiki->Name = L"button_Wiki"; - this->button_Wiki->Size = System::Drawing::Size(32, 32); - this->button_Wiki->TabIndex = 34; + this->toolTip1->SetToolTip(this->button_Wiki, resources->GetString(L"button_Wiki.ToolTip")); this->button_Wiki->UseVisualStyleBackColor = false; this->button_Wiki->Click += gcnew System::EventHandler(this, &ui::button_Wiki_Click); // // ui // this->AcceptButton = this->button_Launch; - this->AutoScaleDimensions = System::Drawing::SizeF(96, 96); + resources->ApplyResources(this, L"$this"); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Dpi; - this->AutoSize = true; - this->AutoSizeMode = System::Windows::Forms::AutoSizeMode::GrowAndShrink; this->BackColor = System::Drawing::Color::Magenta; - this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch; - this->ClientSize = System::Drawing::Size(560, 437); this->Controls->Add(this->button_Wiki); this->Controls->Add(this->button_Apply); this->Controls->Add(this->tabControl); @@ -1255,12 +1094,10 @@ private: System::Windows::Forms::LinkLabel^ linkLabel_Console; static_cast(static_cast(64))); this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::Fixed3D; this->HelpButton = true; - this->Icon = (cli::safe_cast(resources->GetObject(L"$this.Icon"))); this->KeyPreview = true; this->MaximizeBox = false; this->Name = L"ui"; - this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen; - this->Text = L"PD Loader 3 - Launcher"; + this->toolTip1->SetToolTip(this, resources->GetString(L"$this.ToolTip")); this->TransparencyKey = System::Drawing::Color::Magenta; this->FormClosing += gcnew System::Windows::Forms::FormClosingEventHandler(this, &ui::Ui_FormClosing); this->FormClosed += gcnew System::Windows::Forms::FormClosedEventHandler(this, &ui::Ui_FormClosed); @@ -1468,7 +1305,7 @@ private: System::Void Ui_FormClosing(System::Object^ sender, System::Windows::Fo if (!AnyConfigChanged()) return; - switch (SkinnedMessageBox::Show(this, "Do you want to save your settings?", "PD Launcher", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Question)) + switch (SkinnedMessageBox::Show(this, i18n::GetStringFallback("CONFIRM_SAVE_SETTINGS"), "PD Launcher", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Question)) { case System::Windows::Forms::DialogResult::Yes: SaveSettings(); @@ -1487,7 +1324,7 @@ private: System::Void Ui_FormClosed(System::Object^ sender, System::Windows::For TerminateProcess(GetCurrentProcess(), EXIT_SUCCESS); } private: System::Void button_Discord_Click(System::Object^ sender, System::EventArgs^ e) { - switch (SkinnedMessageBox::Show(this, "Would you like to read the user guide for troubleshooting?", "PD Launcher", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Information)) + switch (SkinnedMessageBox::Show(this, i18n::GetStringFallback("CONFIRM_DISCORD_OR_GUIDE"), "PD Launcher", MessageBoxButtons::YesNoCancel, MessageBoxIcon::Information)) { case System::Windows::Forms::DialogResult::Yes: System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki"); @@ -1555,7 +1392,7 @@ private: System::Void button_Unstable_builds_Click(System::Object^ sender, Syste System::Diagnostics::Process::Start("https://ci.appveyor.com/project/nastys/pd-loader/build/artifacts"); } private: System::Void button_Clean_installation_Click(System::Object^ sender, System::EventArgs^ e) { - SkinnedMessageBox::Show(this, "Delete:\n- dnsapi.dll or dinput8.dll\n- patches/\n- plugins/\n\nRestore:\n- glut32.dll\n\nThen install PD Loader from the official repository.", "How to do a clean installation", MessageBoxButtons::OK, MessageBoxIcon::Information); + SkinnedMessageBox::Show(this, i18n::GetStringFallback("HOWTO_CLEAN_INSTALL_HINT"), i18n::GetStringFallback("HOWTO_CLEAN_INSTALL"), MessageBoxButtons::OK, MessageBoxIcon::Information); } private: System::Void linkLabel_Changelog_LinkClicked(System::Object^ sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^ e) { System::Diagnostics::Process::Start("https://notabug.org/PDModdingCommunity/PD-Loader/wiki/Changelog"); diff --git a/source-code/source/plugins/Launcher/ui.resx b/source-code/source/plugins/Launcher/ui.resx index 72f6f09..b77b484 100644 --- a/source-code/source/plugins/Launcher/ui.resx +++ b/source-code/source/plugins/Launcher/ui.resx @@ -117,398 +117,261 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 - - - 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 - - -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) - - 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 + + + 2, 2, 2, 2 - - - iVBORw0KGgoAAAANSUhEUgAAACoAAAApCAYAAABDV7v1AAAABGdBTUEAALGPC/xhBQAAA7dJREFUWEft - mElME2EUxwdDgh6NVw8e9OzZGwcv3ryZePKmUQodREAN1Ah0BmQTVJZgQFABE1kEl7iAEQWjAiIEOtMW - aJGyFWgpbWG6PL+vnSmFDrL0KyHaf/LPtPNm3vtN37dMSkUVlYwuqMYOJmRz52g1n0UzfF4knKTmmERG - p1CotEfFsjsTTU8colmuKTmXh70wzfL6S6qxY2L57SsxZ0SBEng2JoyklSzXp1Bo40SE7Qm1xSaXLOJm - uZMiwtaKj++MlU2yB1aqtadEjK0VBd2G/2/QtAItFFSPQ2HNOKQX+s9dzeMh5Y7/c2o+D8W141BWb4Rb - 93Xr7t3MxEFLHxugd8gCtS2T0PJhBj73LsCwfhkMJicYp5y+Y9+wFd53m6Gh3QSD/BJ0fJ2HG0Va2XyS - iYLWtZpgbn4FBjkrCIIHtpLb7QXNKH4IB3oYm2xOyURBdQY7rKxuDbhRHo8XvF4vlKBuyOXFJgaaXa4X - y+5eliXBN5bl8hMDHUDtDleCywO5VWOy+YmAXkcTYWPLcSttdhcsLbt8rQ2W3ekCq83lA8PXScKf2z7O - huTHJgJaXGsAFyoqCRcc0FjRcBiFzFIdfPqxIEYA5i0C5FePwc1iLTS8nl53H1YXWiXkahABbe+cC/ll - 1BVrLax89luMANQ0TwbOq+7pYcEqiBG/8CogxYNNBPTtF7NYxi8MipcqKf7w+RpoT/9i4PztB6Ngd7jE - iF+rgjsQDzYR0K6g1mJhUDz+Wjtm4enLKVhddYsRf6y7f9Fb0zLpnTE713VCUlpBaA0ioD0DFrEEoEnl - BtOMM2QCbSbHitu34OPFX1JGSei2SgT0TdfaGPWg4y/eCnUvTGgDWN4UGK8SPT8XoR5to0vLQuB+86IA - 19C7wMYaREBTUas6vy2AxeYviD1jXoHiR+OQiSZMeeMENL6agqZ30/CkzQR364yQjl5c8Nh2OP3DwuX2 - gH7CDiV18rsTEVDJORWj0IpeREbQvv0dvZjgtyi56yQX1RhAb7T7JlhZg9G3ZMldh00UNJKOgpL2vwlK - UaoDNMs75RKFYzqX96K8NnyUi2PvEJSiaDVXKJcoXCsZTaWS5Zo3g90x6Pl0w2Ga5Yb+9vS7Mc1q6uNV - nbFKhm+Qy71jUKyLWboTKGFGMstXo6S1RMxyVTj3FfXIkSRGU4bOCWGDBimGooCgA4pRMhyLAAN/xoUL - GjGdUWjj0JhNQZNsfl+DSkpQc2fpXM6x70GxFAx3+jIzdFz8GlVUFEVRfwDiv42+8CmffAAAAABJRU5E - rkJggg== - + + 5, 6 - - - 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 - + + + True - - - iVBORw0KGgoAAAANSUhEUgAAAikAAAIrCAYAAAAqWwkVAAABgmlDQ1BJQ0MgcHJvZmlsZQAAKM+VkUso - RFEcxn/uEIksjDyyuAusKCFZaogUpTHKa+HeO2aouXeme0c2lspWWXhsDBY21mwtbJVSHiU7OytiI13/ - c0fNpEY5dTq/vnO+r3O+A1ouZdleeTfYTtaNjkb0mdk5vfIZjWYaaKTRsLzMxNRIjJLj45Yytd50qSz+ - N2rjS54FZbrwoJVxs8KLwv1r2YziXeGwtWzEhU+FO125oPC90s08vyhOBqypzLAbiw4Jh4X1ZBGbRWwt - u7Zwn3Bb3HYkX5vJc1zxumI7tWr93FO9sGbJmZ5SusxWRhljgkl0TFZZIUWWLlkdUTyish8p4W8J/JPi - MsW1giWOYdLYGIEf9Qe/u/USvT35pJoIVDz5/ls7VG7D15bvfx76/tcRhB7hwin40zkYeBd9q6C1HUDd - BpxdFjRzB843oekhY7hGIIVkaokEvJ7IN81C/TVUz+d7+9nn+A5i0tX4FeztQ0dSshdKvLuquLc/zwT9 - EfkGd8VyqcjB1fkAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQflAhkVFx2h5OIwAAAu70lEQVR4 - Xu3d/8+9913QcRL/gf7gD8aI/qA/aGJi/EGIJuoPhphFgtGEkZiYqCHGBONPg0iMUjUkxs0VRGAIhQ4D - 6CKBNNgIlBXY1q3r2rVl30q2ABW6sTG20vXTzzq22/M67WnPfe7Xfd/XOed9Xdf7y+OVPK7t824/n8/5 - fj17Xec+5+suLi4AZnP3hTv3hP/3/k/97UOxnv0egJAuApwqwuORex+8L/yXr//Oi6ni3xcuwL50EeAY - uzDJ4uMUu2DJ/i5gHOkiwBSl4yQjVmBc6SLATZaIk0NiBcaTLgJcJ2Ihi4gleM8KjCVdBMisGSj7HFWB - MaSLAIeWPr0zhViBvqWLAPtqDJQdPwkE/UoXAXZqDpR9QgX6ky4ChFYCZZ9YgX6kiwCxs88ioAVOAUEf - 0kVgbC0Hyj6hAm1LF4Fx9RIo+8QKtCldBMbUY6DsEyvQlnQRGE/vgbIjVKAd6SIwllECZZ9Ygfqli8A4 - RgyUfWIF6pUuAmMYPVB2hArUKV0E+idQrhIrUJd0EeibQLmZWIE6pItAvwTKNEIF1pcuAn0SKMcTK7Ce - dBHoz90X7tyT7YSZRqzA8tJFoC8CpQyhAstKF4F+CJTyxAosI10E+iBQ5iVWYF7pItA+gbKMCJW4rbP7 - ADhPugi0L9uhMh9HVaC8dBFo2yP3PnhftiNlfmIFykkXgXYJlPU5BQRlpItAmwRKXRxVgfOki0B7BEq9 - xAqcJl0E2iJQ6hf3kViB46SLQDsESluECkyXLgJtiB1etiOkfmIFbpcuAvUTKO1zCghuli4CdRMofREq - kEsXgXoJlH6JFbgsXQTqJFDGIFbgVekiUB+BMhahAiIFmiBQxiVWGFm6CNRDoBDECiNKF4E6CBT2CRVG - ky4C6xMoXEesMIp0EViXQGEKsULv0kVgPQKFYwgVepYuAuu4+8Kde7IdEdxGrNCjdBFYnkChBLFCT9JF - YFkChZKECr1IF4HlCBTmIlZoXboILEOgsASxQqvSRWAZ2Q4F5hChElGcPQ6hVukiML9H7n3wvmxnAnNy - VIWWpIvAvAQKaxMrtCBdBOYjUKiFU0DULl0E5iFQqJGjKtQqXQTKEyjUTqxQm3QRKCte/LOdAtQmYlqs - UIt0EShHoNAioUIN0kWgDIFC68QKa0oXgfMJFHrhFBBrSReB8wgUeiRUWFq6CJxOoNA7scJS0kXgNAKF - kYgV5pYuAscTKIxIqDCndBE4jkBhdGKFOaSLwHQCBd4gVigpXQSmEShwlVChlHQRuJ1AgZuJFc6VLgI3 - i6+3z16UgavECqdKF4HrCRQ4nlDhFOkikBMocB6xwjHSReAqgQLliBWmSBeBywQKlCdUuE26CFyWvcAC - ZYgVrpMuAm+Ir6nPXliBssQKh9JF4FUCBZYVoRKnV7PnI+NJFwGBAmtyVIWQLsLoBArUQayMLV2EkQkU - qItTQONKF2FU8WKYvUgC63NUZTzpIoxIoEAbxMo40kUYjUCBtsRpWbHSv3QRRiJQoF1CpW/pIoxCoEAf - xEqf0kUYgUCp27ve/I7Jst/PeJwC6k+6CL0TKOvaxcWjb/+li+ce/eTrSszuz4o/O4iY8QiVfqSL0DOB - sqz9GFl79uMlu6z0Ray0L12EXgmU+UWU7I5mtDCipX9ipV3pIvRIoMxjd+qmlSi5aXZHWrLrSduESpvS - ReiNQCmvlzC5bgRLn8RKW9JF6IlAKaf3MLluBEt/xEob0kXoRXwpWfYCxXFGjZNsvIelH0Klfuki9ECg - nE+cXD+OrvRDrNQrXYTWCZTziJPjRqz0QazUJ12ElgmU04mT80astE+o1CVdhFYJlNOIk7IjVtonVuqQ - LkKLBMppYodq5hmx0j6xsq50EVoUXy6WvciQc/RkuRErbRMq60kXoTUC5TiOnqwzYqVtYmV56SK0RKBM - 5+jJ+iNU2idWlpMuQisEynSOntQ1YqVtESrxPrjNXZm+NlFGuggtECjTOXpS74iVtjmqMq90EWonUKaJ - 0zum/hEq7RMr80gXoWbxYpC9SHCZ0zvtjVhpm1NA5aWLUCuBMo1AaXeESvscVSknXYQaCZRpBEofI1ba - J1bOly5CbQTKNN4g29cIlfbF++fEyunSRaiJQJlGoPQ5cb9m9zdtESqnSRehFgJlGoHS/ziq0gexcpx0 - EWogUKYRKOOMUOmDU0DTpYuwNoEyjUAZb4RKP4TK7dJFWJNAmUagjDvep9IXsXK9dBHWIlCmif+aNiY+ - UTh7fNAmsXJVughrECjTCBSzP07/9EWoXJYuwtIEyjQCxWQjVPojVl6VLsKS4rsusicplwkUc9MIlT6N - HivpIixFoExnzG0jVPo0cqiki7AEgTKdn+QxU0eo9GvEWEkXYW4CZTqnecyxI1T6NlKspIswJ4EynUAx - p45Q6dsooZIuwpyyJxw5Y84ZodK/3mMlXYS5xHdWZE80rhr5KEq8ByfEbRAfWLaT3U5h98/j39/xPp5X - J26L7DajL73GSroIcxAo08WOZaSJoLgtRE61Hy+jzhy3K/XpMVTSRShNoBxnhKMAuzDJrv+cdtEy2giV - cfQUK+kilCRQjtfrrBUm1xkpWOK2z24D+tVDrKSLUIpAOV7sOHub2uIkM8IpIaEyngiV+InKzd2fvkbX - Ll2EEuLJkT1puFlPkdJCnBzq/ehKXLfsetO3Vo+qpItwLoFyuh4ipcU4yfQaKz3cN5ymtVhJF+EcAuV8 - LU+P/6XeY6wIlXHFa3Qrp4DSRTiVQCkjjkS0Nr0cPblOhEpPseL9KbRwVCVdhFMIlHJaO+XT49GT6/QU - KiPdb1yv5lhJF+FYAqW8Fo6m9H705Ca9xIrTPoT4ScwaYyVdhGMIlPnUPP4rvI9QcdqHfbWFSroIUwmU - ecV/5dZ4REWgXNZ6rLg/OVRLrKSLMIVAWU5NO0GnB3Kth4r7lUM1nAJKF+E2AmUda+8I7chu18J7ibJx - 2ofrrBkq6SLcRKCsa41QGfkNsqdo9ahKXO7s+kBYI1bSRbiOQKnHUjtC/4V9mlZDRYxymyVjJV2ETHxC - YfaAZV1z7gwFynlih9/auM+ZYqlQSRfhkECp2xyhYmdVRouh4mgKU80dK+ki7BMo7SgZK9mfz+ki+loZ - gcqx5oqVdBF2BEqbzo0V/yU9j5ZCxWOAY80RKukiBIHStlNCJXaidk7zaiVUHE3hVCVjJV2EkD34aM/U - WIl/L/v9lNdKqAhWzlEiVtJFiE8azB50tCsiJMQOcid+bUe0vLjNWxhHUzjXuaGSLjI2gQLzayVURCwl - nBor6SLjEiiwnKmn4tYcR1Mo6dhYSRcZk0CB5bUQKo6mUNIxoZIuMh6BAuuJoxU1j6MplDY1VNJFxhIP - luxBBCyn9skuM5wj/uN489BK90s76SLjEChQh9rfSOuUD3O4LVTSRcYgUKAuNZ/2ccqHudx06iddpH8C - BepU8ziawlyuC5UrC/RPoEC9aj7tI1KYU3wVy+Zhdml/dekX9E+gQP1qPe3jlA9zyt6fcukX9E2gQBsc - TWFUh6d9Lu3E6JdAgbbUejRFpDC3zby+77q0I6NPAgXaU+vRFKd8mNv+0ZQrOzT6IlCgXbUeTckuK5Sy - /96UKzs1+iFQoG21Hk1xyoe57X7SJ9250T6BAn2o8WiKUz7MbXc0Jd3B0bYo0OxOB9pT49EUkcISNiNS - eiNQoD81Hk3JLieUFPuzdEdHmwQK9KnGoynel8LcREpHBAr0S6QwonhfSrrDoy0CBfpX2ykf70thbiKl - AwIFxlDb0RSRwtxESgfiTszuXKAvNZ7yyS4nlJTu+GiDQIGx1DbZZYSS0p0f9RMoMJ7a3pfizbPMLd0B - UjeBAmN69O2/tHkJqGdECnPynpQGCRQYV23vS4loyi4nlCBSGiNQYGwihZHEd9ClO0Pq4wsDAZHCSERK - IwQKsFPT+KwU5uRj8RsgUIB9NY1IYU6b8S3INRMowKGaRqQwl3gP5uYhJlJqJVCATE0jUphL7AM3DzGR - UiOBAlynphEpzGUz2/3hlR0k6xIowE1qGpHCHHZHUcKVnSTrESjAbWoakcIcNvP6fvHSTpL1CBTgNrV9 - TopIobT9oyjh0o6SdQgUYIravrtHpFDaZi7tHy/9guUJFGAqkULPDo+ihEu/YFkCBThGREFN42PxKSUL - lHBlgWXEx/1mdxTAdWobkUIpm0n3leki8xIowLFqe9NsjEihhNgnbh5O6f4yXWQ+AgU4RW3vR4kRKZzr - pkAJ6SLzECjAqWqcOLqTXVaY4rr3oexLFylPoACnqvFUT0x2WWGKX3nbg+/ZPITS/eW+dJHysjsJYIoa - T/XEZJcVbvO/3/LAxXPPPbf9luPbpIuUFV85nd1RAFPUOD4jhVNEoHzoQx8SKbUQKMA5aj2K4k2zHGsX - KCKlEgIFOFetI1I4xn6giJQKCBTgXLUeRYnxkz1MdRgoImVlAgUooebJLi8cygJFpKzI9/EAJdR8FMWb - ZpniukAJImUFAgUopebxfhRuc1OgBJGyMIEClFLzUZQY70fhJrcFShApCxIoQCm1B0pMdrkhTAmUIFIW - IlCAkmofp3q4zv1vemsaJBmRsgCBApQUb0itfUQKmWMCJYiUmQkUoKQWTvPEZJedsR0bKEGkzEigACW1 - EiiOonDolEAJImUmAgUoKX5SppURKew7NVCCSJmBQAFKailQYrLrwJjOCZQgUgoTKEBJrQWKoyjsy8Lj - GCKlIIEClNRaoMRk14MxPfzAQ2l4HEOkFHL3hTv3ZHcSwClaDBRHUdgpEShBpBQgUICSWvkpnsPJrgvj - KRUoQaScSaAAJbUaKI6iEEoGShApZxAoQClxeqeFT5K9brLrxFhKB0oQKScSKEAprR492Y2jKEz9wsBj - iZQTZXcSwDFafHNsNtl1YxxzBUoQKSd45N4H78vuKIApWj+1sz+OooxtzkAJIuVIAgU4RYRJ66d1ssmu - K2OYO1CCSDmCQAGO1dNRk8NxFGVcSwRKECkTCRRgql2Y9BonMXHdsutO/5YKlCBSJhAowG1GCJP9cRRl - TEsGShApt/B9PMB1RguT3QiUMS0dKEGk3ECgAPsiSnp+j8nUyW4b+rZGoASRcg2BAoRRj5ZcN46ijGet - QAkiJSFQYEz7R0pEydURKONZM1CCSDkgUGAcomT6xO2T3Yb0a+1ACSJlj0CBfgmS8yZuu+x2pU/3v+mt - aTQsTaS8RqBAXwRJuXGaZyy1BEoQKRsCBdrmKMl8I1DGUlOghOEjRaBAe/ajxMw3AmUstQVKGDpSBAq0 - QZQsP3FbZ/cFfaoxUMKwkSJQoG5O36w3AmU8WSDUYMhIEShQn4iSOL0gStafuC+y+4g+PfzAQ2kg1GC4 - SLn7wp17sjsJWJ5TOPWNQBlLzYEShooUgQLrEyb1jkAZS+2BEoaJFIEC6xEmdU/cNwJlLC0EShgiUgQK - rEOc1D9x/2T3Hf1qJVBC95EiUGB58QZYU//4HJTxtBQooetIESiwLHHSzgiU8dTwhYHH+sAvvOe3Y1++ - ecim+/mddLF22Z0ElCdO2hrvPxlPi4ES4shPXP7bQiVdrNkj9z543+GdBJTlPSdtjfefjKnVQAm7SAmb - Sff3IV2slUCBeYmT9sbpnTG1HChhP1Ji3755KKf7/XSxRgIF5uXUTlsTMen0zphaD5SwHykhPjF+87C+ - su+/slAjgQLzcfSkvREn4+ohUMJhpITs/SmXflEjgQLzcfSkrXFqZ2y9BErIIiVs5lIDXPpFbXxhIMzD - 0ZO2xqkdegqUcF2kHJ72uRQFNREoMA9HT9oZcULoLVDCdZES9k/7XImDGggUmIdAaWPECTs9Bkq4KVL2 - f9rnSiCsTaDAPJzeqX/ECft6DZRwU6SEzWyb4EokrEmgwDwESt0jTjjUc6CE2yJld8onjYU1CBSYh0Cp - c4QJ17n/TW9Nd+w9uS1Sdqd80mBYmkCB8mIHKFDqGmHCbUYIlPCz3/nO9Prv28z6kSJQYB4CZf2J+0CY - MNUogRLiuma3wb445ZOGw1IECsxDoKwz+1EiTDjGSIEy5ShKiEZI42EJAgXmIVCWG1FCCQIlF+9LSQNi - bgIF5uFzUOYdUcIcsp15j44JlLBKpAgUmIdAKTuChCXET7lkO/TeHBsoYfFIiTfBZBcEOI9AOW8ECWsQ - KLdLY2IOAgXmY6aPIKEGAmWaNChKEygwn9jhmusnbp840iRIqIVAmS6NipIECszHaZ6r4ygJNRMo083+ - nhSBAvMRKK+OKKEVvX8fz06JQAmzR0r2lwJljDoRJbswyW4XqNEogRJHirLrf4pZP8wtCij7S4HzjXYU - RZjQMoFymtkiRaDAfEYJFGFCDwTK6eItI2lknEOgwLxix93zCBN6IVDOs5my34IsUGBevR5FESb0RqCc - J071bF4aykWKQIH59TbihB6NEighvhwxuw3OVTRSfB8PzK+noyjihF4JlDI2s+2LK8FxLIECy+hhxAk9 - Eyhl7I6ihCvRcQyBAsto/SiKOKF3AqWczbzeGZei4xgCBZbReqDE5c+uF/RCoJSzfxQlXAqPqQQKLKfl - SHH0hN6NFCilPu7+Jpu51BuXfjGFQIHltBoocXonuz7QkziqkO3Me7REoBweRQmXfnEbgQLLanGc3mEE - AqWsLFDClYXrCBRYVotHUQQKIxAoZcXnrG1ePtL2SBcPCRRYXmsjUBiBQCnrpkAJ6eI+gQLLa+0oikBh - BAKlrNsCJaSLOwIF1hFvPG1lBAojECjlxbccb15C0v7YSRdD/ObsDwXm18oIFEYRX6SX7dB7U1OghHQx - ZH8osIxWJrvs0BuBUtbUQAnpotM8sK4Wxge1MYJRAiWuZ3b9SzsmUMKVBYEC66t9nOZhBAKlrGMDJVxZ - yP5gYFk1v3FWoDACgVLWKYESLv3CURSoQ82Rkl1e6IlAKSvaYvPScak3prr0i+wPB5YX7/eocRxFoXcj - fWFgdv1LOydQwuv/x1EUqEttR1MECr0bKVDic1+y26CkcwMlvP5/4pPfsr8EWEdtR1Oyywi9EChllQiU - 8Pr/2f/D37b937e8/uvL3vLaPwfmFkcvahhHUeiZQCmrVKCE7capHqhXDaGSXS7ogUApq2SghO1GpEDd - 1gwVR1Ho1UiBssSnyZYOlLDdZH8ZUJ+lY0Wg0CuBUtYcgRK2m+wvBOoU4bDUT/746Ht6JFDKmitQgm87 - hkbNfVTFURR6JFDKmjNQwquR8mfyv3yyc38/cLK5YiX7u6BlAqWsuQMlOJICHSh9CshRFHojUMpaIlCC - SIGOlDiqIlDojUApKz78dfNSkUZFaSIFOnRqrAgUehOfDZLtzHvUW6AEkQKdiuCYGitxqshP8tAbgVLW - 0oESRAp07qZYESf0SqCUtUaghO0mu0AA0KKRAuXhBx5Kb4OS1gqUsN1kFwoAWiNQytuPhqVtNz/yDd/7 - XHbBAKAl2c68R0sFSrwl5DAclrTd/Py3v/PnsgsHAK2IHXe2Q+/NKIESthuRAkDLRgmUkF3/0moIlLDd - /PJ3/+wPZxcSAGo3UqDEe26y26CkWgIlbDciBYAWCZSyagqUsN2IFABaI1DKWur7eI6x3YgUAFoy0vfx - jBooYbsRKXCe+NTW+PTW7JuId5/4mv0+4Hi+MLCsWgMlbDciBU6zi5MpE6HiI+jhPAKlrJoDJWw3IgWO - d9334dw2jqrAaQRKWbUHSthuRAoc59RA2R+xAtMJlLJaCJSw3YgUmK5EoOwmThWJFbiZQCmrlUAJ241I - genmGKECOYFSVkuBErYbkQLTlDyKko1YgTcIlLJaC5Sw3YgUmGaJcQoIBEppLQZK2G5ECtxu7qMohyNU - GJVAKavVQAnbjUiBmy0dKPsjVhiJQCmr5UAJ241IgZutGSm7ESv0bqRAie8dym6Dkh6598H7Ni8dV3b8 - LdluRApcr4ZA2Y1QoVfx/TTZzrxHAmW67UakwPVqHLFCTwRKWb0ESthuzo2Un/kHP+hFky7VdBQlG887 - WidQyuopUMJ2UyJSduNFk560MJ5ztGqkQAnZbVBSb4EStpuSkRLjRZMe1H4UZX8852jNaIES1ze7HUrp - MVDCdlM6UnbjhZOWtTbvevM70usBtREo5W3myg6+B9vNXJGyG7FCa1o6irKb+KTa7LpAbbIdea+WCJS7 - L9y5Z/MScGUH34PtZu5IiREqtKLFQNmNoynULt48mu3MeyRQzrfdLBEpuxEr1K7lSHE0hZqNFChLfJps - 74EStpslI2U3YoUatRwoMSKFWgmUskYIlLDdrBEpMUKF2vQw2fWCNQmUskYJlLDdrBUpuxEr1KD1oyi7 - ya4brEWglNX6FwYea7tZO1J2I1ZYUy+TXTdYg280Lmu0QAnbTS2REhOh4icUWFovR1FisusHSxMoZY0Y - KGG7qSlSduOoCkvqZbxxlhoIlLJGDZSw3dQYKbsRK8ytp6Moni+sTaCUNXKghO2m5kiJiRdep4CYS0+T - XT9YikApa/RACdtN7ZGyG/+VSGmOokAZIwVK/MRSdhuUJFBetd20Eim78WJMKT1FSnb9YAkCpSyB8obt - prVIiYk3CIoVzhWPox7Gc4G1CJSyBMpl202LkbIbL86co5dIya4bzE2glCVQrtpuWo6U3YgVTtFDpHjs - swaBUpZAyW03PURKjFNAHKv1SInLn10vmNNIgRLuf9Nb09uhFIFyve2ml0jZjVBhqvjR9pbHY52lCZSy - Hrn3wfs2T+UrO2detd30Fim78QLObVqOFI9vlhY77GxH3iuBsr7tptdI2Y0Xc27S6imf7LrAXARKWQJl - mu2m90iJESpcp8WjKR7PLEmglCVQpttuRoiU3XhxJxOPi5Ymuw4wh9ECZe6Puxcox9luRoqU3YgVDrUS - Kh67LEWglLeZKztirrfdjBgpMV7sOdRCqGSXG+aQ7ch7tUSg3H3hzj2bp/CVHTHX225GjZTdiBX2xXtU - ao0Vj1WWEh9glu3MeyRQ6rXdjB4pu7EDYF9toeLxyVIESlkC5XTbjUh5Y+wIOFRLrHhssgSBUpZAOc92 - I1Kujh0C+9Y+BeTxyBIESlkC5XzbjUi5fuwc2LdWqGSXBUoSKGUJlDK2G5Fy8wgVDi0ZKx5/zE2glOUL - A8vZbkTKtLGz4NASsZL9vVDKSF8YGDGW3QYlCZSythuRctyIFfbNGSoea8xJoJQlUMrbbkTK8RM7j3gz - ZXZ7MKbSsRJffJj9PVCCQClLoMxjuxEpp4//0uVQqVgRwcxFoJQlUOaz3YiU80essO/cUBEozGWkQAnZ - bVCSQJnXdiNSykzsmOxc2HdsrMQpHo8h5jJaoMQXJGa3QykCZX7bjUgpO46qcOi2WBEnzE2glCVQlrHd - iJR5RqxwKEIkHhc78WtxwtwESlkCZTnbjUiZb+K/kMUKsBaBUpZAWdZ2I1LmH6ECLG20QJn702QFyvK2 - G5Gy3IgVYAkCpSyBso7tRqQsO04BAXMSKGU9cu+D921euq/sQJnfdiNS1hmhApQW78nIduS9Eih9225E - yrojVoASBEpZAmV9241IWX+cAgLOIVDKEih12G5ESj0jVIBjCZSyBEo9thuRUt+IFWAKgVLeZq7sLFnH - diNS6h2xAtwk25H3aolAufvCnXs2L71XdpasY7sRKXWPUAEyDz/wULoz75FAGdN2I1LaGLEC7IwUKHFd - s9ugJIFSp+3m57/9nT+X3WlTiZRlR6zA2ARKWQKlXtvNT3/LD7w/u+OmEinLj1CBMQmUsgRK3babH/mG - 730uu/OmEinrjViBcQiUsnwfT/22m+zOO4ZIWX/ECvRttO/jyW6DkgRKG7ab7A48xtKR8txzz1189rOf - fe1XZjdCBfo0WqDEZ79kt0MpAqUdXxfn47I78RhLRspv/dZvXTz11FPbB/KHP/zhi8997nOv/ROzG7EC - /RAoZQmUtjQVKb/zO7/zeqDsxK+ffvrpiz/4gz947d8yuxEr0DaBUpZAaU8zkRKneOLISfbAfuKJJy5+ - 4zd+Yxsrf/iHf/ja7zAxQgXaJFDKEihtaiJSfvd3f/faQDn0zDPPbH3hC1947XebGLEC7RgtUOb+NFmB - 0q7qI+X3fu/3rpzimSJCJY6ufPGLX3ztTzIxYgXqJlDKEihtqzpSnn/++clHUK4Tp4B+8zd/8+KP/uiP - XvtTTYTKu978jvS+BNYjUMoSKO0rEikhdnwl59Of/vTZgbLz+OOPb4/GfPKTn7x48cUXX/sbjKMqUA+B - UpZA6cN2k93BpygVKr//+79/8eSTT6YP7HNF+HzqU5+6eOmll17724xYgXUJlLIESj+2m3M/Fv/QObES - H9J2yntQjhFHViKC4jNX7ty589rfPPbEfeYUECxPoJQlUPqy3fz3bywbKTvHxkp8MFvEQ/xIcfbgnkP8 - ffH5Ky+//PJrl2LscVQFliNQynrk3gfv27yMXdnR0a7t5lf/w4Nvz+7wEqaGSnwYW6n3oJwqPovly1/+ - 8muXaOwRKzCv+FyQ7HWoVwKFU2w3z/7C09+a3ekl3RQrn//852d7D8ox4jRQ/G98Lssrr7zy2qUbd557 - 9JNiBWYgUMoSKP3abr721a/9ieyOLy0LlfjQtSVP79xmFyohPqPlK1/5ymuXdNwRKlCOQClLoPTt9f/z - 5E+8719mD4Bb/dnvytdvsIuV+KC17EFdkzjCE5/X8rWvfW17mUcesQLnGS1QHn7gofR2KEWg9O/SL96W - PAhucuy/v+/H/97btg/i/SMXNYtY+cxnPrO5mcYep4DgNAKlLIEyhku/+O1fe/absgdDaT/2d//zxeOP - tREnh+InkIyjKnAMgVJefBDp5qXo0j6M/lxZiDv/bV//lvRBsXPbP7/Jj/6d/3TxwUcfq+p9KFN97GMf - 29xEZn/ECtwudtrZa0qPBAolXVko9TH5mXf8re+9eOy9H0gf2DWLU1IC5eYRK5AbKVBCdhuUJFDGki7G - ub7swXGOH/7r//HiA7/+/vRBXbsIlK9+9aubm8bcNEIFLhstUOK0VnY7lCJQxpMuhuwBcqof+mv//uL9 - v/po+qCu3Uc/+tGLP/7jP97cJGbqiBUQKKUJlDGli6HUaZ//9le/5+L9735f+qCu3Uc+8hGBcsaIFUYl - UMoSKONKF3fii5qyB8xUP/CX/+3Fo7/83vRBXbtnnnnGB7kVGKHCaARKWb4wcGzp4r5TQ+X7/+K/uXjf - L/56+qCu3dNPP+1j8QuPWGEEvjCwLIFCunjo2FD5vr/w3RfvfejX0gd17SJQfMngfCNW6JVAKUugENLF - zOT3qPy577p47/9pL1Dic1sEyjIjVOiNQClLoLCTLt7ktqMq7/6pX0wf1LX78Ic/fHH37t3NVTRLjVih - BwKlLIHCvnTxNteFyq/85P9NH9S1i0B5+eWXN1fNrDFihVYJlLIECofSxan2Y+Xhn2jzHe3xxYF37tzZ - XB2z5ggVWiNQyhIoZNLFYz31niffnT2oaxYfdR9HUARKXSNWaIFAKUugcJ108RjPP//8v8se1LWLIygv - vfTS5iqYGkesUCuBUpZA4Sbp4lSf/vSn/3X2oK5d/CTPiy++uLkKpuaJUHnXm9+RvrDBGgRKWQKF26SL - Uz355JMvZQ/smgmU9sZRFWowWqDEJ+dmt0MpAoUp0sWpsgd21R7/0MUnP/CJzUU3LY5YYS0CpSyBwlTp - 4lTZg7tam0D58W9+2/YJEjs70+Y4BcTSBEpZj9z74H2bp3K6T4FD6eJU2QO8Vj/x999+5ckiVtodR1VY - Qnx5XvZ60iuBQm3SxamyB3lN4v0nj3/w8YsH/uH3pU+YIFTaHrHCXARKWQKFU6SLU2UP9Jo8/tjjF+/8 - 1u9PnzCHxEq789yjnxQrFDVaoIS4ztltUYJA4VTp4lTZA70Wj3/ggxc/+W3/NX3CXCd2dLHDM22OUKEE - gVKWQOEc6eJU2YO9Ch98/OJ//KMfSJ8wUziq0vaIFU4lUMrbTLr/gCnSxamyB/ya4qPuP/iBD1781D/+ - wfTJciyx0u44BcQpsteVns0dKHdfuHPP5umY7j9ginRxquxBv6ZtoPyTH0qfLKcSKm2PUGGqeONo9rrS - K4FCC9LFqbIH/lo++P4PXvz0P/vh9MlSglhpe8QKNxktUOb+uHuBQinp4lTZg38Njz362MXP/PMfSZ8s - JcWOzhtr2x2ngMgIlLIECiWli1NlT4ClPfa+D1z8z3/xo+mTZS6OqrQ9QoUdgVKWQKG0dHGq7EmwpAiU - //UdP5Y+WZYgVtoesTI2gVKW7+NhDuniVNkTYSmPvfcDF+/6V/enT5YlCZX2R6yMZ7Tv4xEotCpdnCp7 - MiwhftT4S1/60t+IJ0b2hFmDWGl7hMo4BEpZAoU5pYtTZU+IpexfjlpiJXZ03ljb9oiVvgmUsgQKc0sX - p8qeFEs5vCyOqpiSI1b6I1DKEigsIV2cKntiLOXwsuyIFVNqhEo/BEpZAoWlpItTZU+OpRxelkO1xIpQ - aX/ESttGC5T4qaXsdihFoLCkdHGq7AmylMPLknFUxZQcsdIegVKWQGFp6eJU2ZNkKYeX5SY1HVXxxtq2 - R6i0Q6CUJVBYQ7o4VfZEWcrhZZmiplgxbY9YqZtAKUugsJZ0carsybKUw8syVS2hEsRK+yNW6jNaoITs - dihFoLCmdHGq7MmylMPLcixHVUypESr1GDFQ7n/TW9PbogSBwtrSxamyJ8xSDi/LqcSKKTViZV0CpaxH - 7n3wvs3DOn3dhKWki1NlT5qlHF6Wc9QUKt5Y2/6IleXFzjp7neiZQGEE6eJU2RNnKYeXpQRHVUypifvw - XW9+R3r/UpZAKUugUJN0carsybOUw8tSklgxpcZRlXmNGChzfpqsQKE26eJU2RNoKYeXpbQIlXjCZk/k - JQmVPkaslCdQyhIo1ChdnCp7Ei3l8LLMxVEVU2riPnQKqAyBUpZAoVbp4lSf+MQn3pM9mabY/N73PfHE - E+k/m+LwssythliJnZw31rY/jqqcR6CUt5n0dQ/Wli4u4Stf+cqf3Dz5vvr444+nT8rbHP55S3AKyJQc - sXKa7PWgZ3MHyt0X7tyzeTimr3mwtnRxKa+88sqfeuKJJ17Onpi3OfyzluQUkCk1cWRMrEwXH/+evR70 - SqAwunRxSV/+8pe//qmnnvpC9gS9yeGfs4ZaTgGZ9keo3E6glCVQaEG6uLS7d+/++aeffvoz2RP1Ood/ - xlriiS5WTKkRKzmBUpZAoRXp4hpefvnlv/TMM8/8dvaEzRz+/rV5Y60pNU4BXSZQyhIotCRdXMtLL730 - Vz7ykY88mz1xDx3+3lo4qmJKjVARKKXF69PmoZW+dkGN0sU1felLX/rGj370o09nT+B9h7+vJk4BmZIz - aqyM9oWBEWTZ7VCKQKFF6eLaXnzxxb/5sY99bPO8zZ/M4fD31EiomJIzUqwIlLIECq1KF2vwwgsvfNPH - P/7x92VP6HD479dMrJhSM0KoCJSyBAotSxdr8cUvfvFbnn322XdnH/h2+O+2YO1YiR2cN9b2Mb3GikAp - S6DQunSxJp///Oe/LXsz7eG/1wpHVUzJ6SlWRguUkN0OpQgUepAu1uZzn/vcP92Eykf3n9yH/05rxIop - NT2EyoiBEt9BlN0WJQgUepEu1uizn/3sd+z/1M/hP2/V2rEiVPqZVmNFoJQlUOhJulirz3zmM2/5+Mc/ - /mQ8yQ//WcscVTElp6VYEShlCRR6ky7W7Pnnn/+eeKIfrveghqMq3ljbx7QQKgKlLIFCj9LF2r3yyit/ - OlvvRQ2xYvqYWmNlxECZ89NkBQq9ShdZ39qhEsRKP1NTrAiUsgQKPUsXqYejKqbU1BAqo30XT5gzUB65 - 98H7Nndt+toBPUgXqY9YMaVmjViJ92JkO/DeCRQ4T7pIndYOlXe9+R3eWNvRLBErEScjHj0JAgXOly5S - N0dVTMmZI1ZGjpMgUKCMdJE2iBVTcuL+PCdYdmEycpwEgQLlpIu0I0IlXriyF7QlCJU+J07r7aLlgW9+ - +zZAMvGTOqNHyb45AyVsJn0dgF6li7THURUz1zz77LPpDpnL5g6Uuy/cuWdzd6TPf+hVuki71owVb6zt - c0TK7QQKzCNdpG1OAZmSI1JuFqe7sudBKQKFkaWL9MEpIFNiRMr1BArMK12kL2vGilBpf0RKTqDA/NJF - +uMUkDl1RMpVAgWWkS7SL2+sNceOSLkqe3yXEs/Rzc2ePn9hNOki/XMKyEwdkXJZfD5M9rguQaDAZeki - Y4hDymLF3DYi5Q0CBZaVLjIWoWJuGpHyKoECy0sXGZNYMdmIFIECa0kXGdeap4C8sbbOGT1S5vw0WYEC - N0sXwVEVs5uRI0WgwLrSRdgRK2bUSBEosL50EQ6tFStCZf0ZMVIECtQhXYSMoypjzmiRIlCgHuki3GSt - WPHG2nVmpEgRKFCXdBGmWCtWHFVZdkaJFIEC9UkXYaq1QiWIlWVmhEiZM1Diiz03N2P6/AFuli7CsRxV - 6Xd6jxSBAvVKF+FUYqW/6TlSBArULV2Ec6wVKt5YO8/0GikPP/BQ+jgqQaBAGekilOCoSh/TY6QIFGhD - uggliZW2p7dImTNQwmbS5wFwvHQRShMq7U5PkTJ3oMQXdG5usvQ5ABwvXYS5iJX2pqdIuf9Nb00fHyUI - FCgvXYS5rREr3lh72vQSKQIF2pMuwhIiVOJNhtmL/pwcVTlueogUgQJtShdhSU4B1T2tR4pAgXali7CG - NWJFqNw+LUfKnIESj9fNzZM+loEy0kVYi1NA9U2rkeILA6F96SKsbY2jKt5Ym0+LkSJQoA/pItRijVhx - VOXytBYpAgX6kS5CTeLNiWJlvWkpUgQK9CVdhBoJlXWmlUgRKNCfdBFqJlaWnRYiRaBAn9JFqN0ap4BG - fWNt7ZEiUKBf6SK0wlGV+afmSBEo0Ld0EVojVuabWiNFoED/0kVo1dKxMkKo1BgpDz/wUHp/lCBQoB7p - IrTMUZWyU1ukCBQYR7oIPVg6Vnp9Y21NkTJnoMTXMWyubvpYAtaRLkJPnAI6b2qJFIEC40kXoTdOAZ0+ - NUSKQIExpYvQK0dVjp8aIuX+N701vX3PJVCgbuki9E6sTJ+1I0WgwLjSRRiBN9ZOmzUjRaDA2NJFGImj - KjfPWpEyV6CE+FqFzVVLHw9APdJFGJFYyWeNSJnz02QFCrQjXYRRCZWrs3SkCBRgJ12E0YmVN2bJSBEo - wL50EXjVkrFS6xtrl4oUgQIcSheBN0SoxE+DZDu/OdR2VGWJSBEoQCZdBK4a9RTQ3JEyZ6DEfba5Cun9 - CdQvXQSut2Ss1BAqc0aKQAFuki4CNxvpFNBckSJQgNuki8A0Sx5ViTfWrhErc0SKQAGmSBeB4ywZK0uH - SulIESjAVOkicLzYQfZ4CqhkpDz8wEPpdSlBoEB/0kXgdL0dVSkVKQIFOFa6CJyvl1gpESkCBThFugiU - ER8ktlSszPXG2nMjRaAAp0oXgbJaPqpybqRkl7EEgQL9SxeBebQYK+dEyv1vemt62c4lUGAM6SIwnyVP - AZUIlVMjRaAA50oXgfm1clTllEiZK1DiR7w3Fym9PYH+pIvAcpaKlVPfWHtspAgUoJR0EVheraeAjomU - uT5NVqDAmNJFYB01ngKaGikCBSgtXQTWVdNRlSmRIlCAOaSLQB1qiJXbImXOLwzcTHq7AGNIF4F6rP3G - 2psiZc5AiR/V3vz16W0CjCFdBOqz1lGV6yJFoABzSxeBei0dK1mkCBRgCekiULclQ+X555+/FCiP/ex7 - 0n+3BIEC7EsXgTYsFSsRJs88/pRAARaVLgJtWSpW5hKXP7tewNjSRaA9rYaKQAGuky4C7WopVgQKcJN0 - EWhf7bEiUIDbpItAHyIE4qPls0hYk0ABpkgXgb7UdFTFT/EAU6WLQJ/WjJU4oiNQgGOki0C/1jgF5PQO - cIp0EejfEkdVIoayvxtginQRGEfESslgiTCJP8+pHeBc6SIwpoiLU04Fxe8JwgQoKV0EiOAIuyMth3b/ - PPu9AOe7+Lr/Dx9K5BSknwTlAAAAAElFTkSuQmCC - + + CenterScreen + + + 0 + + + tabPage_Modpacks + + + True + + + True + + + 12 + + + panel_Playerdata + + + 3 + + + $this + + + 6 + + + 4, 22 + + + 276, 378 + + + 263, 83 + + + Graphics + + + Flat + + + True + + + checkBox_nofsopt + + + label_Update_2 + + + 2, 2, 2, 2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 69, 23 + + + 211, 357 + + + 0, 0 + + + 20 + + + False + + + + + + True + + + Official repository + + + label_Update_1 + + + 4 + + + 2, 0, 2, 0 + + + labelGPU + + + + + + 5 + + + 2 + + + groupBox_ScreenRes + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + Plugins and Patches + + + True + + + 279, 357 + + + 65, 21 + + + 21 + + + + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + button_Discord + + + 65, 21 + + + 5, 19 + + + 552, 378 + + + + + + tabPage_Modpacks + + + + + + 6 + + + Clean installation + + + 3 + + + 2 + + + 552, 378 + + + button_ModFiles + + + 2, 2, 2, 2 + + + 5 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + groupBox_ScreenRes + + + + + + 2, 2, 2, 2 + + + 3 + + + 1 + + + 0 + + + 0 + + + True + + + 20 + + + Stretch + + + It is highly recommended to download updates directly from the official repository. +If you have downloaded PD Loader from a third-party, it is recommended to do a clean installation. + + + 0 + + + 2, 2, 2, 2 + + + 250, 45 + + + button_ModDelete + + + 1 @@ -1642,4 +1505,1668 @@ AMD compatibilty pack dependencies have additional licenses, detailed in the AMD +AAAAAAAAAAAAP/+AAf///8AAAAAAAAAAAA= + + button_github + + + 119, 12 + + + 1 + + + 0 + + + + + + 2, 2, 2, 2 + + + True + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + + + + 3 + + + 217, 23 + + + 169, 297 + + + 7 + + + 0 + + + 6 + + + tabControl + + + 552, 378 + + + button_Releases_page + + + 9 + + + + + + 4, 22 + + + Details + + + 552, 378 + + + 47, 12 + + + 1 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2, 2, 2, 2 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + button_Unstable_builds + + + 5 + + + Disables Windows 10/11 fullscreen optimizations, which can cause issues with screenshots and/or framerate. + + + MiddleCenter + + + 552, 378 + + + False + + + 276, 378 + + + + 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 + + + + toolTip1 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 22 + + + + + + tabPage_Update + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 169, 238 + + + 5, 127 + + + + + + 560, 404 + + + button_Launch + + + 2, 2, 2, 2 + + + 2, 0, 2, 0 + + + Disable Fullscreen Optimizations + + + Lag Compensation + + + 7 + + + 0, 0 + + + + + + False + + + checkBox_ModPatches + + + Modpacks + + + button_Apply + + + 5 + + + True + + + 295, 177 + + + $this + + + 0 + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox_Lag + + + linkLabel_Changelog + + + + + + 0 + + + 1 + + + 29, 12 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel_Details + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MiddleCenter + + + 2, 2, 2, 2 + + + + + + + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + + + + Unstable builds + + + 92, 26 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2, 2, 2, 2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + 295, 207 + + + 0, 0 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox_InternalRes + + + Flat + + + 2 + + + 2 + + + 8 + + + 560, 437 + + + + + + 253, 99 + + + groupBox_Details + + + tabPage_Plugins + + + 5, 303 + + + tabPage_Modpacks + + + 0 + + + Both + + + panel_Patches + + + 552, 378 + + + tabPage_Update + + + Console + + + 261, 341 + + + 2, 2, 2, 2 + + + + + + 73, 357 + + + tabPage_Update + + + 3, 3, 3, 3 + + + Set Active + + + GrowAndShrink + + + panel_ScreenRes + + + 0 + + + + + + Components + + + Player + + + 4, 22 + + + tabPage_Update + + + 0 + + + 4 + + + 4 + + + tabPage_Resolution + + + tabPage_Components + + + 4, 22 + + + 8 + + + 10 + + + 21 + + + 11, 30 + + + 172, 409 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 10 + + + True + + + + + + 9 + + + 216, 16 + + + 552, 378 + + + + + + 2, 2, 2, 2 + + + 2, 0, 2, 0 + + + BottomRight + + + 464, 404 + + + 552, 378 + + + tabPage_Resolution + + + 4, 22 + + + 2, 0, 2, 0 + + + tabPage_Update + + + Flat + + + tabPage_Update + + + + + + 2, 2, 2, 2 + + + tabPage_Update + + + tabPage_Update + + + 1 + + + 5, 19 + + + 2, 0, 2, 0 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3, 3, 3 + + + 5 + + + 0 + + + 14, 77 + + + panel_Custom + + + 5, 5 + + + tabControl + + + tabPage_Playerdata + + + + + + 528, 404 + + + 348, 357 + + + + + + + + + + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage_Components + + + tabPage_Resolution + + + 4 + + + 4, 22 + + + True + + + + + + 0 + + + 263, 13 + + + 11 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 2, 2, 2, 2 + + + tabPage_Plugins + + + 552, 378 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + listBox_Mods + + + tabPage_Credits + + + 169, 177 + + + + + + trackBar_LagCompensation + + + tabPage_Resolution + + + + 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 + + + + 5 + + + tabPage_Resolution + + + New/Clone + + + 65, 21 + + + + + + 2, 2, 2, 2 + + + tabPage_Modpacks + + + 92, 26 + + + 4 + + + tabPage_Patches + + + 430, 358 + + + 169, 257 + + + System.Windows.Forms.TrackBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4, 409 + + + False + + + 31 + + + groupBox_Details + + + Plugins and Patches + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2, 0, 2, 0 + + + 6 + + + tabControl + + + 5, 19 + + + tabPage_Update + + + + + + Flat + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 65, 21 + + + tabControl + + + 34 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Help + + + 0 + + + tabPage_Modpacks + + + 7 + + + 546, 340 + + + True + + + 3 + + + 65, 21 + + + 32 + + + 2, 2, 2, 2 + + + 92, 26 + + + tabPage_Update + + + 0 + + + 1 + + + tabPage_Modpacks + + + 7 + + + 552, 378 + + + Rescan + + + groupBox_Lag + + + MiddleLeft + + + button_ModClone + + + 2, 2, 2, 2 + + + 504, 362 + + + + + + tabPage_Update + + + 2, 2, 2, 2 + + + True + + + 253, 59 + + + 3 + + + 3 + + + 4 + + + 2 + + + 0 + + + Launch + + + 3 + + + + + + 593, 24 + + + tabPage_Credits + + + True + + + 3, 3, 3, 3 + + + Screen Resolution + + + + + + tabPage_Playerdata + + + + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel_Plugins + + + tabPage_Plugins + + + 0 + + + 169, 277 + + + 2, 2, 2, 2 + + + + + + + + + Rename + + + 0 + + + Apply + + + 276, 378 + + + + + + True + + + $this + + + tabControl + + + 263, 120 + + + 9 + + + True + + + False + + + Stretch + + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + button_ModSetActive + + + 33 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + 1 + + + 5 + + + 552, 378 + + + + + + System.Windows.Forms.ToolTip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + linkLabel_Help + + + 2 + + + 92, 26 + + + 496, 404 + + + + + + + + + 0 + + + 65, 21 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Update PD Loader regularly to get the latest fixes and new features! + + + 7 + + + 169, 207 + + + tabPage_Modpacks + + + + + + Changelog + + + 96, 96 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + Internal Resolution (Quality) + + + tabPage_Modpacks + + + Official Discord + + + 138, 16 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 7 + + + + + + panel_IntRes + + + + + + + + + UPDATE + + + Flat + + + 4, 22 + + + 32, 32 + + + 7, 20 + + + Credits + + + 2, 2, 2, 2 + + + tabControl + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Files... + + + 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 + + +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) + + 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 + + + 274, 6 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 1 + + + panel_ScreenRes + + + panel_Components + + + button_ModRescan + + + True + + + creditsTextBox + + + 4 + + + tabPage_Resolution + + + 5, 357 + + + PD Loader 3 - Launcher + + + True + + + + iVBORw0KGgoAAAANSUhEUgAAACoAAAApCAYAAABDV7v1AAAABGdBTUEAALGPC/xhBQAAA7dJREFUWEft + mElME2EUxwdDgh6NVw8e9OzZGwcv3ryZePKmUQodREAN1Ah0BmQTVJZgQFABE1kEl7iAEQWjAiIEOtMW + aJGyFWgpbWG6PL+vnSmFDrL0KyHaf/LPtPNm3vtN37dMSkUVlYwuqMYOJmRz52g1n0UzfF4knKTmmERG + p1CotEfFsjsTTU8colmuKTmXh70wzfL6S6qxY2L57SsxZ0SBEng2JoyklSzXp1Bo40SE7Qm1xSaXLOJm + uZMiwtaKj++MlU2yB1aqtadEjK0VBd2G/2/QtAItFFSPQ2HNOKQX+s9dzeMh5Y7/c2o+D8W141BWb4Rb + 93Xr7t3MxEFLHxugd8gCtS2T0PJhBj73LsCwfhkMJicYp5y+Y9+wFd53m6Gh3QSD/BJ0fJ2HG0Va2XyS + iYLWtZpgbn4FBjkrCIIHtpLb7QXNKH4IB3oYm2xOyURBdQY7rKxuDbhRHo8XvF4vlKBuyOXFJgaaXa4X + y+5eliXBN5bl8hMDHUDtDleCywO5VWOy+YmAXkcTYWPLcSttdhcsLbt8rQ2W3ekCq83lA8PXScKf2z7O + huTHJgJaXGsAFyoqCRcc0FjRcBiFzFIdfPqxIEYA5i0C5FePwc1iLTS8nl53H1YXWiXkahABbe+cC/ll + 1BVrLax89luMANQ0TwbOq+7pYcEqiBG/8CogxYNNBPTtF7NYxi8MipcqKf7w+RpoT/9i4PztB6Ngd7jE + iF+rgjsQDzYR0K6g1mJhUDz+Wjtm4enLKVhddYsRf6y7f9Fb0zLpnTE713VCUlpBaA0ioD0DFrEEoEnl + BtOMM2QCbSbHitu34OPFX1JGSei2SgT0TdfaGPWg4y/eCnUvTGgDWN4UGK8SPT8XoR5to0vLQuB+86IA + 19C7wMYaREBTUas6vy2AxeYviD1jXoHiR+OQiSZMeeMENL6agqZ30/CkzQR364yQjl5c8Nh2OP3DwuX2 + gH7CDiV18rsTEVDJORWj0IpeREbQvv0dvZjgtyi56yQX1RhAb7T7JlhZg9G3ZMldh00UNJKOgpL2vwlK + UaoDNMs75RKFYzqX96K8NnyUi2PvEJSiaDVXKJcoXCsZTaWS5Zo3g90x6Pl0w2Ga5Yb+9vS7Mc1q6uNV + nbFKhm+Qy71jUKyLWboTKGFGMstXo6S1RMxyVTj3FfXIkSRGU4bOCWGDBimGooCgA4pRMhyLAAN/xoUL + GjGdUWjj0JhNQZNsfl+DSkpQc2fpXM6x70GxFAx3+jIzdFz8GlVUFEVRfwDiv42+8CmffAAAAABJRU5E + rkJggg== + + + + Delete + + + 1 + + + linkLabel_Official_Discord + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + button_Clean_installation + + + 0, 0 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Microsoft Sans Serif, 12pt, style=Bold + + + 32, 32 + + + True + + + tabPage_Patches + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + 48, 73 + + + 276, 0 + + + linkLabel_Console + + + 1 + + + 142, 357 + + + $this + + + 0 + + + 101, 12 + + + 0 + + + button_Instructions + + + $this + + + 8 + + + ui + + + 0, 0 + + + 32, 32 + + + + + + 6 + + + $this + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 0 + + + tabControl + + + 272, 366 + + + 0 + + + tabPage_Components + + + groupBox_InternalRes + + + button_Wiki + + + Options + + + 2, 0, 2, 0 + + + 59, 12 + + + Releases page + + + 555, 20 + + + tabPage_Modpacks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Stretch + + + 5, 213 + + + Instructions + + + linkLabel_Repo + + + 3 + + + button_ModRename + + + + + + 263, 13 + + + 263, 69 + + + 2 + + + True + + + 17, 17 + \ No newline at end of file