├── Kingdom Hearts 2 Launcher
├── Assets
│ ├── khlauncherlogo.ico
│ └── khlauncherlogo.png
├── App.config
├── packages.config
├── Properties
│ ├── Settings.settings
│ ├── Settings.Designer.cs
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ └── Resources.resx
├── App.xaml
├── App.xaml.cs
├── LauncherConfig.xaml
├── MainWindow.xaml
├── LauncherConfig.xaml.cs
├── Kingdom Hearts 2 Launcher.csproj
└── MainWindow.xaml.cs
├── Kingdom Hearts 4 Launcher
├── Assets
│ ├── khlauncherlogo.ico
│ └── khlauncherlogo.png
├── App.config
├── packages.config
├── Properties
│ ├── Settings.settings
│ ├── Settings.Designer.cs
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ └── Resources.resx
├── App.xaml
├── App.xaml.cs
├── MainWindow.xaml
├── LauncherConfig.xaml
├── Kingdom Hearts 4 Launcher.csproj
├── LauncherConfig.xaml.cs
└── MainWindow.xaml.cs
├── LICENSE.txt
├── Kingdom-Hearts-Launchers.sln
├── .gitattributes
├── README.md
└── .gitignore
/Kingdom Hearts 2 Launcher/Assets/khlauncherlogo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SandeMC/Kingdom-Hearts-Launchers/HEAD/Kingdom Hearts 2 Launcher/Assets/khlauncherlogo.ico
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/Assets/khlauncherlogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SandeMC/Kingdom-Hearts-Launchers/HEAD/Kingdom Hearts 2 Launcher/Assets/khlauncherlogo.png
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/Assets/khlauncherlogo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SandeMC/Kingdom-Hearts-Launchers/HEAD/Kingdom Hearts 4 Launcher/Assets/khlauncherlogo.ico
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/Assets/khlauncherlogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SandeMC/Kingdom-Hearts-Launchers/HEAD/Kingdom Hearts 4 Launcher/Assets/khlauncherlogo.png
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/App.xaml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/App.xaml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Configuration;
4 | using System.Data;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 | using System.Windows;
8 |
9 | namespace Kingdom_Hearts_2_Launcher
10 | {
11 | public partial class App : Application
12 | {
13 | [STAThread]
14 | public static void Main(string[] args)
15 | {
16 | Kingdom_Hearts_2_Launcher.App app = new Kingdom_Hearts_2_Launcher.App();
17 | app.InitializeComponent();
18 | MainWindow mainWindow = new MainWindow(args);
19 | app.Run(mainWindow);
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Configuration;
4 | using System.Data;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 | using System.Windows;
8 |
9 | namespace Kingdom_Hearts_4_Launcher
10 | {
11 | public partial class App : Application
12 | {
13 | [STAThread]
14 | public static void Main(string[] args)
15 | {
16 | Kingdom_Hearts_4_Launcher.App app = new Kingdom_Hearts_4_Launcher.App();
17 | app.InitializeComponent();
18 | MainWindow mainWindow = new MainWindow(args);
19 | app.Run(mainWindow);
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) [year] [fullname]
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace Kingdom_Hearts_4_Launcher.Properties {
12 |
13 |
14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")]
16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
17 |
18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
19 |
20 | public static Settings Default {
21 | get {
22 | return defaultInstance;
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace Kingdom_Hearts_2_Launcher.Properties
12 | {
13 |
14 |
15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
18 | {
19 |
20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
21 |
22 | public static Settings Default
23 | {
24 | get
25 | {
26 | return defaultInstance;
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/LauncherConfig.xaml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Kingdom-Hearts-Launchers.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.10.35013.160
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kingdom Hearts 4 Launcher", "Kingdom Hearts 4 Launcher\Kingdom Hearts 4 Launcher.csproj", "{30D3FC74-FAA0-4916-99C5-D5389652C294}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kingdom Hearts 2 Launcher", "Kingdom Hearts 2 Launcher\Kingdom Hearts 2 Launcher.csproj", "{F12C1FFE-8FCA-495C-BEC9-AE63926F744A}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {30D3FC74-FAA0-4916-99C5-D5389652C294}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {30D3FC74-FAA0-4916-99C5-D5389652C294}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {30D3FC74-FAA0-4916-99C5-D5389652C294}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {30D3FC74-FAA0-4916-99C5-D5389652C294}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {F12C1FFE-8FCA-495C-BEC9-AE63926F744A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {F12C1FFE-8FCA-495C-BEC9-AE63926F744A}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {F12C1FFE-8FCA-495C-BEC9-AE63926F744A}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {F12C1FFE-8FCA-495C-BEC9-AE63926F744A}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {F4834CAE-8BCB-4E6F-AD3A-78F65A2036C1}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Resources;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 | using System.Windows;
6 |
7 | // General Information about an assembly is controlled through the following
8 | // set of attributes. Change these attribute values to modify the information
9 | // associated with an assembly.
10 | [assembly: AssemblyTitle("Kingdom Hearts 2.8 Launcher")]
11 | [assembly: AssemblyDescription("Simple and Clean launcher for Kingdom Hearts 2.8")]
12 | [assembly: AssemblyConfiguration("")]
13 | [assembly: AssemblyCompany("")]
14 | [assembly: AssemblyProduct("Kingdom Hearts 2.8 Launcher")]
15 | [assembly: AssemblyCopyright("Gillian, 2024")]
16 | [assembly: AssemblyTrademark("")]
17 | [assembly: AssemblyCulture("")]
18 |
19 | // Setting ComVisible to false makes the types in this assembly not visible
20 | // to COM components. If you need to access a type in this assembly from
21 | // COM, set the ComVisible attribute to true on that type.
22 | [assembly: ComVisible(false)]
23 |
24 | //In order to begin building localizable applications, set
25 | //CultureYouAreCodingWith in your .csproj file
26 | //inside a . For example, if you are using US english
27 | //in your source files, set the to en-US. Then uncomment
28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in
29 | //the line below to match the UICulture setting in the project file.
30 |
31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32 |
33 |
34 | [assembly: ThemeInfo(
35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
36 | //(used if a resource is not found in the page,
37 | // or application resource dictionaries)
38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
39 | //(used if a resource is not found in the page,
40 | // app, or any theme specific resource dictionaries)
41 | )]
42 |
43 |
44 | // Version information for an assembly consists of the following four values:
45 | //
46 | // Major Version
47 | // Minor Version
48 | // Build Number
49 | // Revision
50 | //
51 | // You can specify all the values or you can default the Build and Revision Numbers
52 | // by using the '*' as shown below:
53 | // [assembly: AssemblyVersion("1.0.*")]
54 | [assembly: AssemblyVersion("1.4.0.0")]
55 | [assembly: AssemblyFileVersion("1.4.0.0")]
56 | [assembly: NeutralResourcesLanguage("en")]
57 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Resources;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
5 | using System.Windows;
6 |
7 | // Общие сведения об этой сборке предоставляются следующим набором
8 | // набор атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
9 | // связанные со сборкой.
10 | [assembly: AssemblyTitle("Kingdom Hearts 1.5+2.5 Launcher")]
11 | [assembly: AssemblyDescription("Simple and Clean launcher for Kingdom Hearts 1.5+2.5")]
12 | [assembly: AssemblyConfiguration("")]
13 | [assembly: AssemblyCompany("")]
14 | [assembly: AssemblyProduct("Kingdom Hearts 1.5+2.5 Launcher")]
15 | [assembly: AssemblyCopyright("Gillian, 2024")]
16 | [assembly: AssemblyTrademark("")]
17 | [assembly: AssemblyCulture("")]
18 |
19 | // Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
20 | // для компонентов COM. Если необходимо обратиться к типу в этой сборке через
21 | // из модели COM, установите атрибут ComVisible для этого типа в значение true.
22 | [assembly: ComVisible(false)]
23 |
24 | //Чтобы начать создание локализуемых приложений, задайте
25 | //CultureYouAreCodingWith в файле .csproj
26 | //в . Например, при использовании английского (США)
27 | //в своих исходных файлах установите в en-US. Затем отмените преобразование в комментарий
28 | //атрибута NeutralResourceLanguage ниже. Обновите "en-US" в
29 | //строка внизу для обеспечения соответствия настройки UICulture в файле проекта.
30 |
31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
32 |
33 |
34 | [assembly: ThemeInfo(
35 | ResourceDictionaryLocation.None, //где расположены словари ресурсов по конкретным тематикам
36 | //(используется, если ресурс не найден на странице,
37 | // или в словарях ресурсов приложения)
38 | ResourceDictionaryLocation.SourceAssembly //где расположен словарь универсальных ресурсов
39 | //(используется, если ресурс не найден на странице,
40 | // в приложении или в каких-либо словарях ресурсов для конкретной темы)
41 | )]
42 |
43 |
44 | // Сведения о версии для сборки включают четыре следующих значения:
45 | //
46 | // Основной номер версии
47 | // Дополнительный номер версии
48 | // Номер сборки
49 | // Номер редакции
50 | //
51 | // Можно задать все значения или принять номера сборки и редакции по умолчанию
52 | // используя "*", как показано ниже:
53 | // [assembly: AssemblyVersion("1.0.*")]
54 | [assembly: AssemblyVersion("1.4.0.0")]
55 | [assembly: AssemblyFileVersion("1.4.0.0")]
56 | [assembly: NeutralResourcesLanguage("en")]
57 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace Kingdom_Hearts_4_Launcher.Properties {
12 | using System;
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources {
26 |
27 | private static global::System.Resources.ResourceManager resourceMan;
28 |
29 | private static global::System.Globalization.CultureInfo resourceCulture;
30 |
31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
32 | internal Resources() {
33 | }
34 |
35 | ///
36 | /// Returns the cached ResourceManager instance used by this class.
37 | ///
38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
39 | internal static global::System.Resources.ResourceManager ResourceManager {
40 | get {
41 | if (object.ReferenceEquals(resourceMan, null)) {
42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Kingdom_Hearts_4_Launcher.Properties.Resources", typeof(Resources).Assembly);
43 | resourceMan = temp;
44 | }
45 | return resourceMan;
46 | }
47 | }
48 |
49 | ///
50 | /// Overrides the current thread's CurrentUICulture property for all
51 | /// resource lookups using this strongly typed resource class.
52 | ///
53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
54 | internal static global::System.Globalization.CultureInfo Culture {
55 | get {
56 | return resourceCulture;
57 | }
58 | set {
59 | resourceCulture = value;
60 | }
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace Kingdom_Hearts_2_Launcher.Properties
12 | {
13 |
14 |
15 | ///
16 | /// A strongly-typed resource class, for looking up localized strings, etc.
17 | ///
18 | // This class was auto-generated by the StronglyTypedResourceBuilder
19 | // class via a tool like ResGen or Visual Studio.
20 | // To add or remove a member, edit your .ResX file then rerun ResGen
21 | // with the /str option, or rebuild your VS project.
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources
26 | {
27 |
28 | private static global::System.Resources.ResourceManager resourceMan;
29 |
30 | private static global::System.Globalization.CultureInfo resourceCulture;
31 |
32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
33 | internal Resources()
34 | {
35 | }
36 |
37 | ///
38 | /// Returns the cached ResourceManager instance used by this class.
39 | ///
40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
41 | internal static global::System.Resources.ResourceManager ResourceManager
42 | {
43 | get
44 | {
45 | if ((resourceMan == null))
46 | {
47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Kingdom_Hearts_2_Launcher.Properties.Resources", typeof(Resources).Assembly);
48 | resourceMan = temp;
49 | }
50 | return resourceMan;
51 | }
52 | }
53 |
54 | ///
55 | /// Overrides the current thread's CurrentUICulture property for all
56 | /// resource lookups using this strongly typed resource class.
57 | ///
58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
59 | internal static global::System.Globalization.CultureInfo Culture
60 | {
61 | get
62 | {
63 | return resourceCulture;
64 | }
65 | set
66 | {
67 | resourceCulture = value;
68 | }
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Kingdom Hearts Launchers
2 | Simple and Clean launchers for Kingdom Hearts 1.5+2.5 and Kingdom Hearts 2.8.
3 | 
4 | 
5 |
6 | > [!CAUTION]
7 | > This is only compatible with the Steam releases. Due to the nature of how Epic Games version works, these launchers cannot be made compatible with it.
8 |
9 | ## Features
10 | - Launching games (holy shit)
11 | - Not having Disney and Square Enix copyright screens on launch
12 | - Launching Melon Mix instead of game's movie implementations of 358/2 Days and Re:coded
13 | - Launching GBA Chain of Memories instead of Re:Chain of Memories
14 | - Best game orders available, such as alphabetical and reverse chronological (i want to see a marathon with alphabetical 2 reverse)
15 | - UI-less launching via launch options (see below)
16 |
17 | ## Installation
18 | You can either replace the original launcher in entirety and use launch options below if desired, or you can use Steam's native launch options for better compatibility with the Big Picture mode (Steam Deck etc).
19 | ### Replacing the original launcher
20 | Unpack and replace `KINGDOM HEARTS HD 1.5+2.5 ReMIX.exe` (or `KINGDOM HEARTS HD 2.8 Final Chapter Prologue.exe` for 2.8) in the game folder.
21 | ### Steam's native launch options
22 | In the archive, open the `Launch Options` folder and unpack `LauncherConfig.exe` (or `LauncherConfig2.exe` for 2.8) into the game folder, then follow [this guide](https://gist.github.com/TheConfuZzledDude/9f98dcd0fc723ffaf04fea1af95c08ca) using the provided `modifications.json` file.
23 |
24 | ## Launch options
25 | This launcher features several optional launch options to launch the games without a UI (can help to avoid interrupting gamepad usage in Big Picture mode, for example). Add them to Steam's game launch options or shortcut's properties.
26 |
27 | You still need the launcher to configure how the games are launched, however.
28 |
29 | ### 1.5+2.5 Launcher
30 | * -skipLauncher - launches the last game you launched via the launcher
31 | * -kh1 - launches KH1
32 | * -recom - launches Re: Chain of Memories
33 | * -days - launches 358/2 Days
34 | * -kh2 - launches KH2
35 | * -bbs - launches Birth by Sleep
36 | * -recoded - launches Re:coded
37 |
38 | ### 2.8 Launcher
39 | * -skipLauncher - launches the last game you launched via the launcher
40 | * -ddd - launches Dream Drop Distance
41 | * -bbs02 - launches Birth by Sleep 0.2
42 | * -backcover - Launches X Back Cover
43 |
44 | ## Demo
45 | ### Official Launcher
46 | https://github.com/SandeMC/Kingdom-Hearts-Launchers/assets/70141395/444215c5-6e5a-4552-b71e-418acfa878dd
47 | ### This launcher
48 | Game copyright screens can be further slimmed down with [mods](https://www.pcgamingwiki.com/wiki/Kingdom_Hearts_HD_1.5_%2B_2.5_ReMIX#Skip_intro_videos). This launcher can also skip the copyright screen for KH1 without any other mods.
49 |
50 | https://github.com/SandeMC/Kingdom-Hearts-Launchers/assets/70141395/8b67c65c-9381-4b63-af88-289ecb001d27
51 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/LauncherConfig.xaml.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Win32;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.IO;
5 | using System.Linq;
6 | using System.Windows;
7 | using System.Windows.Controls;
8 |
9 | namespace Kingdom_Hearts_2_Launcher
10 | {
11 | public partial class LauncherConfig : Window
12 | {
13 | public List GameOrder { get; private set; }
14 | public string SelectedOrder { get; private set; }
15 | public bool SkipCopyrightScreenOnMovie { get; private set; }
16 |
17 | public LauncherConfig(string selectedOrder, bool skipCopyrightScreenOnMovie)
18 | {
19 | InitializeComponent();
20 | SelectedOrder = selectedOrder;
21 |
22 | foreach (ComboBoxItem item in PresetsComboBox.Items)
23 | {
24 | if (item.Content.ToString() == SelectedOrder)
25 | {
26 | PresetsComboBox.SelectedItem = item;
27 | break;
28 | }
29 | }
30 |
31 | SkipCopyrightScreenOnMovieCheckBox.IsChecked = skipCopyrightScreenOnMovie;
32 | }
33 |
34 | private void SaveButton_Click(object sender, RoutedEventArgs e)
35 | {
36 | SelectedOrder = (PresetsComboBox.SelectedItem as ComboBoxItem)?.Content.ToString();
37 | SkipCopyrightScreenOnMovie = SkipCopyrightScreenOnMovieCheckBox.IsChecked ?? false;
38 |
39 | DialogResult = true;
40 | Close();
41 | }
42 |
43 | private void CancelButton_Click(object sender, RoutedEventArgs e)
44 | {
45 | DialogResult = false;
46 | Close();
47 | }
48 |
49 | private void PresetsComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
50 | {
51 | if (PresetsComboBox.SelectedItem is ComboBoxItem selectedItem)
52 | {
53 | string selectedPreset = selectedItem.Content.ToString();
54 | switch (selectedPreset)
55 | {
56 | case "Official":
57 | GameOrder = new List { "khddd", "bbs02", "xbackcover" };
58 | break;
59 | case "Chronological":
60 | GameOrder = new List { "xbackcover", "bbs02", "khddd" };
61 | break;
62 | case "Alphabetical":
63 | GameOrder = new List { "xbackcover", "khddd", "bbs02" };
64 | break;
65 | case "Alphabetical reverse":
66 | GameOrder = new List { "bbs02", "khddd", "xbackcover" };
67 | break;
68 | case "Random":
69 | List defaultOrder = new List { "khddd", "bbs02", "xbackcover" };
70 | GameOrder = ShuffleList(defaultOrder);
71 | break;
72 | }
73 | }
74 | }
75 |
76 | private List ShuffleList(List list)
77 | {
78 | Random rng = new Random();
79 | return list.OrderBy(item => rng.Next()).ToList();
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/LauncherConfig.xaml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/Kingdom Hearts 2 Launcher.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Debug
7 | AnyCPU
8 | {F12C1FFE-8FCA-495C-BEC9-AE63926F744A}
9 | WinExe
10 | Kingdom_Hearts_2_Launcher
11 | KINGDOM HEARTS HD 2.8 Final Chapter Prologue
12 | v4.7.2
13 | 512
14 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
15 | 4
16 | true
17 | true
18 |
19 |
20 |
21 |
22 | AnyCPU
23 | true
24 | full
25 | false
26 | bin\Debug\
27 | DEBUG;TRACE
28 | prompt
29 | 4
30 |
31 |
32 | AnyCPU
33 | pdbonly
34 | true
35 | bin\Release\
36 | TRACE
37 | prompt
38 | 4
39 | false
40 |
41 |
42 | false
43 |
44 |
45 | true
46 |
47 |
48 | Assets\khlauncherlogo.ico
49 |
50 |
51 | Kingdom_Hearts_2_Launcher.App
52 |
53 |
54 | true
55 |
56 |
57 | 754503C04FE3AF1C7BC6FEC4D23E0FA2BA7B3B10
58 |
59 |
60 |
61 | ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 | 4.0
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 | MSBuild:Compile
81 | Designer
82 |
83 |
84 | Designer
85 | MSBuild:Compile
86 |
87 |
88 | MSBuild:Compile
89 | Designer
90 |
91 |
92 | App.xaml
93 | Code
94 |
95 |
96 | LauncherConfig.xaml
97 |
98 |
99 | MainWindow.xaml
100 | Code
101 |
102 |
103 |
104 |
105 | Code
106 |
107 |
108 | True
109 | True
110 | Resources.resx
111 |
112 |
113 | True
114 | Settings.settings
115 | True
116 |
117 |
118 | ResXFileCodeGenerator
119 | Resources.Designer.cs
120 |
121 |
122 |
123 | SettingsSingleFileGenerator
124 | Settings.Designer.cs
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 | {0}
140 |
141 |
142 |
143 |
144 |
145 | "$(SolutionDir)packages\ILMerge.3.0.41\tools\net452\ILMerge.exe" /out:"$(TargetDir)KINGDOM HEARTS HD 2.8 Final Chapter Prologue.exe" "$(TargetPath)" "$(TargetDir)Newtonsoft.Json.dll"
146 | del "$(TargetDir)Newtonsoft.Json.dll"
147 | del "$(TargetDir)Newtonsoft.Json.xml"
148 | del "$(TargetDir)KINGDOM HEARTS HD 2.8 Final Chapter Prologue.exe.config"
149 |
150 |
151 | del "$(TargetDir)launcher_config.json"
152 | del "$(TargetDir)steam_appid.txt"
153 |
154 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Ww][Ii][Nn]32/
27 | [Aa][Rr][Mm]/
28 | [Aa][Rr][Mm]64/
29 | bld/
30 | [Bb]in/
31 | [Oo]bj/
32 | [Oo]ut/
33 | [Ll]og/
34 | [Ll]ogs/
35 |
36 | # Visual Studio 2015/2017 cache/options directory
37 | .vs/
38 | # Uncomment if you have tasks that create the project's static files in wwwroot
39 | #wwwroot/
40 |
41 | # Visual Studio 2017 auto generated files
42 | Generated\ Files/
43 |
44 | # MSTest test Results
45 | [Tt]est[Rr]esult*/
46 | [Bb]uild[Ll]og.*
47 |
48 | # NUnit
49 | *.VisualState.xml
50 | TestResult.xml
51 | nunit-*.xml
52 |
53 | # Build Results of an ATL Project
54 | [Dd]ebugPS/
55 | [Rr]eleasePS/
56 | dlldata.c
57 |
58 | # Benchmark Results
59 | BenchmarkDotNet.Artifacts/
60 |
61 | # .NET Core
62 | project.lock.json
63 | project.fragment.lock.json
64 | artifacts/
65 |
66 | # ASP.NET Scaffolding
67 | ScaffoldingReadMe.txt
68 |
69 | # StyleCop
70 | StyleCopReport.xml
71 |
72 | # Files built by Visual Studio
73 | *_i.c
74 | *_p.c
75 | *_h.h
76 | *.ilk
77 | *.meta
78 | *.obj
79 | *.iobj
80 | *.pch
81 | *.pdb
82 | *.ipdb
83 | *.pgc
84 | *.pgd
85 | *.rsp
86 | *.sbr
87 | *.tlb
88 | *.tli
89 | *.tlh
90 | *.tmp
91 | *.tmp_proj
92 | *_wpftmp.csproj
93 | *.log
94 | *.vspscc
95 | *.vssscc
96 | .builds
97 | *.pidb
98 | *.svclog
99 | *.scc
100 |
101 | # Chutzpah Test files
102 | _Chutzpah*
103 |
104 | # Visual C++ cache files
105 | ipch/
106 | *.aps
107 | *.ncb
108 | *.opendb
109 | *.opensdf
110 | *.sdf
111 | *.cachefile
112 | *.VC.db
113 | *.VC.VC.opendb
114 |
115 | # Visual Studio profiler
116 | *.psess
117 | *.vsp
118 | *.vspx
119 | *.sap
120 |
121 | # Visual Studio Trace Files
122 | *.e2e
123 |
124 | # TFS 2012 Local Workspace
125 | $tf/
126 |
127 | # Guidance Automation Toolkit
128 | *.gpState
129 |
130 | # ReSharper is a .NET coding add-in
131 | _ReSharper*/
132 | *.[Rr]e[Ss]harper
133 | *.DotSettings.user
134 |
135 | # TeamCity is a build add-in
136 | _TeamCity*
137 |
138 | # DotCover is a Code Coverage Tool
139 | *.dotCover
140 |
141 | # AxoCover is a Code Coverage Tool
142 | .axoCover/*
143 | !.axoCover/settings.json
144 |
145 | # Coverlet is a free, cross platform Code Coverage Tool
146 | coverage*.json
147 | coverage*.xml
148 | coverage*.info
149 |
150 | # Visual Studio code coverage results
151 | *.coverage
152 | *.coveragexml
153 |
154 | # NCrunch
155 | _NCrunch_*
156 | .*crunch*.local.xml
157 | nCrunchTemp_*
158 |
159 | # MightyMoose
160 | *.mm.*
161 | AutoTest.Net/
162 |
163 | # Web workbench (sass)
164 | .sass-cache/
165 |
166 | # Installshield output folder
167 | [Ee]xpress/
168 |
169 | # DocProject is a documentation generator add-in
170 | DocProject/buildhelp/
171 | DocProject/Help/*.HxT
172 | DocProject/Help/*.HxC
173 | DocProject/Help/*.hhc
174 | DocProject/Help/*.hhk
175 | DocProject/Help/*.hhp
176 | DocProject/Help/Html2
177 | DocProject/Help/html
178 |
179 | # Click-Once directory
180 | publish/
181 |
182 | # Publish Web Output
183 | *.[Pp]ublish.xml
184 | *.azurePubxml
185 | # Note: Comment the next line if you want to checkin your web deploy settings,
186 | # but database connection strings (with potential passwords) will be unencrypted
187 | *.pubxml
188 | *.publishproj
189 |
190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
191 | # checkin your Azure Web App publish settings, but sensitive information contained
192 | # in these scripts will be unencrypted
193 | PublishScripts/
194 |
195 | # NuGet Packages
196 | *.nupkg
197 | # NuGet Symbol Packages
198 | *.snupkg
199 | # The packages folder can be ignored because of Package Restore
200 | **/[Pp]ackages/*
201 | # except build/, which is used as an MSBuild target.
202 | !**/[Pp]ackages/build/
203 | # Uncomment if necessary however generally it will be regenerated when needed
204 | #!**/[Pp]ackages/repositories.config
205 | # NuGet v3's project.json files produces more ignorable files
206 | *.nuget.props
207 | *.nuget.targets
208 |
209 | # Microsoft Azure Build Output
210 | csx/
211 | *.build.csdef
212 |
213 | # Microsoft Azure Emulator
214 | ecf/
215 | rcf/
216 |
217 | # Windows Store app package directories and files
218 | AppPackages/
219 | BundleArtifacts/
220 | Package.StoreAssociation.xml
221 | _pkginfo.txt
222 | *.appx
223 | *.appxbundle
224 | *.appxupload
225 |
226 | # Visual Studio cache files
227 | # files ending in .cache can be ignored
228 | *.[Cc]ache
229 | # but keep track of directories ending in .cache
230 | !?*.[Cc]ache/
231 |
232 | # Others
233 | ClientBin/
234 | ~$*
235 | *~
236 | *.dbmdl
237 | *.dbproj.schemaview
238 | *.jfm
239 | *.pfx
240 | *.publishsettings
241 | orleans.codegen.cs
242 |
243 | # Including strong name files can present a security risk
244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
245 | #*.snk
246 |
247 | # Since there are multiple workflows, uncomment next line to ignore bower_components
248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
249 | #bower_components/
250 |
251 | # RIA/Silverlight projects
252 | Generated_Code/
253 |
254 | # Backup & report files from converting an old project file
255 | # to a newer Visual Studio version. Backup files are not needed,
256 | # because we have git ;-)
257 | _UpgradeReport_Files/
258 | Backup*/
259 | UpgradeLog*.XML
260 | UpgradeLog*.htm
261 | ServiceFabricBackup/
262 | *.rptproj.bak
263 |
264 | # SQL Server files
265 | *.mdf
266 | *.ldf
267 | *.ndf
268 |
269 | # Business Intelligence projects
270 | *.rdl.data
271 | *.bim.layout
272 | *.bim_*.settings
273 | *.rptproj.rsuser
274 | *- [Bb]ackup.rdl
275 | *- [Bb]ackup ([0-9]).rdl
276 | *- [Bb]ackup ([0-9][0-9]).rdl
277 |
278 | # Microsoft Fakes
279 | FakesAssemblies/
280 |
281 | # GhostDoc plugin setting file
282 | *.GhostDoc.xml
283 |
284 | # Node.js Tools for Visual Studio
285 | .ntvs_analysis.dat
286 | node_modules/
287 |
288 | # Visual Studio 6 build log
289 | *.plg
290 |
291 | # Visual Studio 6 workspace options file
292 | *.opt
293 |
294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
295 | *.vbw
296 |
297 | # Visual Studio LightSwitch build output
298 | **/*.HTMLClient/GeneratedArtifacts
299 | **/*.DesktopClient/GeneratedArtifacts
300 | **/*.DesktopClient/ModelManifest.xml
301 | **/*.Server/GeneratedArtifacts
302 | **/*.Server/ModelManifest.xml
303 | _Pvt_Extensions
304 |
305 | # Paket dependency manager
306 | .paket/paket.exe
307 | paket-files/
308 |
309 | # FAKE - F# Make
310 | .fake/
311 |
312 | # CodeRush personal settings
313 | .cr/personal
314 |
315 | # Python Tools for Visual Studio (PTVS)
316 | __pycache__/
317 | *.pyc
318 |
319 | # Cake - Uncomment if you are using it
320 | # tools/**
321 | # !tools/packages.config
322 |
323 | # Tabs Studio
324 | *.tss
325 |
326 | # Telerik's JustMock configuration file
327 | *.jmconfig
328 |
329 | # BizTalk build output
330 | *.btp.cs
331 | *.btm.cs
332 | *.odx.cs
333 | *.xsd.cs
334 |
335 | # OpenCover UI analysis results
336 | OpenCover/
337 |
338 | # Azure Stream Analytics local run output
339 | ASALocalRun/
340 |
341 | # MSBuild Binary and Structured Log
342 | *.binlog
343 |
344 | # NVidia Nsight GPU debugger configuration file
345 | *.nvuser
346 |
347 | # MFractors (Xamarin productivity tool) working folder
348 | .mfractor/
349 |
350 | # Local History for Visual Studio
351 | .localhistory/
352 |
353 | # BeatPulse healthcheck temp database
354 | healthchecksdb
355 |
356 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
357 | MigrationBackup/
358 |
359 | # Ionide (cross platform F# VS Code tools) working folder
360 | .ionide/
361 |
362 | # Fody - auto-generated XML schema
363 | FodyWeavers.xsd
--------------------------------------------------------------------------------
/Kingdom Hearts 2 Launcher/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Linq;
5 | using Newtonsoft.Json;
6 | using System.Windows;
7 | using System.Windows.Controls;
8 | using System.Diagnostics;
9 |
10 | namespace Kingdom_Hearts_2_Launcher
11 | {
12 | public partial class MainWindow : Window
13 | {
14 | private readonly string ConfigFilePath = "launcher_config.json";
15 | public string SelectedOrder { get; private set; }
16 | public bool SkipCopyrightScreenOnMovie { get; private set; }
17 |
18 | public MainWindow() : this(new string[0])
19 | {
20 | }
21 |
22 | public MainWindow(string[] args)
23 | {
24 | InitializeComponent();
25 | LoadGameOrder();
26 | if (!File.Exists("steam_appid.txt"))
27 | {
28 | File.WriteAllText("steam_appid.txt", "2552440");
29 | }
30 | if (!File.Exists("KINGDOM HEARTS 0.2 Birth by Sleep/Binaries/Win64/steam_appid.txt") && Directory.Exists("KINGDOM HEARTS 0.2 Birth by Sleep/Binaries/Win64/"))
31 | {
32 | File.WriteAllText("KINGDOM HEARTS 0.2 Birth by Sleep/Binaries/Win64/steam_appid.txt", "2552440");
33 | }
34 |
35 | if (args != null && args.Length > 0)
36 | {
37 | foreach (var arg in args)
38 | {
39 | if (arg.Equals("-ddd", StringComparison.OrdinalIgnoreCase))
40 | {
41 | khddd.IsChecked = true;
42 | LaunchFun();
43 | }
44 | else if (arg.Equals("-bbs02", StringComparison.OrdinalIgnoreCase))
45 | {
46 | bbs02.IsChecked = true;
47 | LaunchFun();
48 | }
49 | else if (arg.Equals("-backcover", StringComparison.OrdinalIgnoreCase))
50 | {
51 | xbackcover.IsChecked = true;
52 | LaunchFun();
53 | }
54 | else if (arg.Equals("-skipLauncher", StringComparison.OrdinalIgnoreCase))
55 | {
56 | LaunchFun();
57 | }
58 | }
59 | }
60 | }
61 |
62 | private void ReorderGames(string[] newOrder)
63 | {
64 | var radioButtons = new Dictionary
65 | {
66 | { khddd.Name, khddd },
67 | { bbs02.Name, bbs02 },
68 | { xbackcover.Name, xbackcover }
69 | };
70 |
71 | Games.Children.Clear();
72 | foreach (var name in newOrder)
73 | {
74 | if (radioButtons.ContainsKey(name))
75 | {
76 | Games.Children.Add(radioButtons[name]);
77 | }
78 | }
79 | }
80 |
81 | private void SaveGameOrder()
82 | {
83 | var order = Games.Children.OfType().Select(rb => rb.Name).ToList();
84 | var CheckedGame = Games.Children.OfType().FirstOrDefault(rb => rb.IsChecked == true)?.Name;
85 |
86 | var config = new GameOrderConfig
87 | {
88 | Order = order,
89 | SelectedOrder = SelectedOrder,
90 | CheckedGame = CheckedGame,
91 | SkipCopyrightScreenOnMovie = SkipCopyrightScreenOnMovie
92 | };
93 |
94 | var json = JsonConvert.SerializeObject(config, Formatting.Indented);
95 | File.WriteAllText(ConfigFilePath, json);
96 | }
97 |
98 | private void LoadGameOrder()
99 | {
100 | if (File.Exists(ConfigFilePath))
101 | {
102 | var json = File.ReadAllText(ConfigFilePath);
103 | GameOrderConfig config;
104 | try
105 | {
106 | config = JsonConvert.DeserializeObject(json);
107 | }
108 | catch
109 | {
110 | MessageBox.Show("Unable to read config file, settings will be reset.");
111 | SaveGameOrder();
112 | return;
113 | }
114 |
115 | if (config.Order != null && config.Order.Count > 0)
116 | {
117 | ReorderGames(config.Order.ToArray());
118 |
119 | if (!string.IsNullOrEmpty(config.CheckedGame))
120 | {
121 | var checkedRadioButton = Games.Children.OfType().FirstOrDefault(rb => rb.Name == config.CheckedGame);
122 | if (checkedRadioButton != null)
123 | {
124 | checkedRadioButton.IsChecked = true;
125 | }
126 | }
127 | }
128 | SelectedOrder = config.SelectedOrder;
129 | }
130 | else
131 | {
132 | SkipCopyrightScreenOnMovie = true;
133 | SaveGameOrder();
134 | }
135 | }
136 |
137 | private class GameOrderConfig
138 | {
139 | public List Order { get; set; }
140 | public string SelectedOrder { get; set; }
141 | public string CheckedGame { get; set; }
142 | public bool SkipCopyrightScreenOnMovie { get; set; }
143 | }
144 |
145 | private void LauncherConfigButton_Click(object sender, RoutedEventArgs e)
146 | {
147 | var configWindow = new LauncherConfig(SelectedOrder, SkipCopyrightScreenOnMovie);
148 | if (configWindow.ShowDialog() == true)
149 | {
150 | SelectedOrder = configWindow.SelectedOrder;
151 | SkipCopyrightScreenOnMovie = configWindow.SkipCopyrightScreenOnMovie;
152 |
153 | if (configWindow.GameOrder != null && configWindow.GameOrder.Count > 0)
154 | {
155 | ReorderGames(configWindow.GameOrder.ToArray());
156 | }
157 |
158 | SaveGameOrder();
159 | }
160 | }
161 |
162 | private void Launch_Click(object sender, RoutedEventArgs e)
163 | {
164 | LaunchFun();
165 | }
166 | private void LaunchFun()
167 | {
168 | if (khddd.IsChecked == true)
169 | {
170 | LaunchGame("KINGDOM HEARTS Dream Drop Distance.exe");
171 | }
172 | else if (bbs02.IsChecked == true)
173 | {
174 | LaunchGame("KINGDOM HEARTS 0.2 Birth by Sleep/Binaries/Win64/KINGDOM HEARTS 0.2 Birth by Sleep.exe");
175 | }
176 | else if (xbackcover.IsChecked == true)
177 | {
178 | string arg = "";
179 | if (SkipCopyrightScreenOnMovie)
180 | {
181 | arg = "-reboot=true";
182 | }
183 | LaunchGame("KINGDOM HEARTS HD 2.8 Launcher.exe", arg);
184 | }
185 | }
186 |
187 | private void LaunchGame(string exeName, string arguments = "")
188 | {
189 | if (File.Exists(exeName))
190 | {
191 | ProcessStartInfo startInfo = new ProcessStartInfo
192 | {
193 | FileName = exeName,
194 | WorkingDirectory = Path.GetDirectoryName(exeName),
195 | Arguments = arguments
196 | };
197 | Process process = new Process
198 | {
199 | StartInfo = startInfo
200 | };
201 | process.Start();
202 | SaveGameOrder();
203 | Close();
204 | }
205 | else
206 | {
207 | MessageBox.Show("Selected game's executable not found");
208 | }
209 | }
210 | }
211 | }
212 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/Kingdom Hearts 4 Launcher.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Debug
7 | AnyCPU
8 | {30D3FC74-FAA0-4916-99C5-D5389652C294}
9 | WinExe
10 | Kingdom_Hearts_4_Launcher
11 | KINGDOM HEARTS HD 1.5+2.5 ReMIX
12 | v4.7.2
13 | 512
14 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
15 | 4
16 | true
17 | true
18 | publish\
19 | true
20 | Disk
21 | false
22 | Foreground
23 | 7
24 | Days
25 | false
26 | false
27 | true
28 | 0
29 | 1.0.0.%2a
30 | false
31 | false
32 | true
33 |
34 |
35 |
36 | AnyCPU
37 | true
38 | full
39 | false
40 | bin\Debug\
41 | DEBUG;TRACE
42 | prompt
43 | 4
44 |
45 |
46 | AnyCPU
47 | pdbonly
48 | true
49 | bin\Release\
50 | TRACE
51 | prompt
52 | 4
53 | false
54 |
55 |
56 | false
57 |
58 |
59 | true
60 |
61 |
62 | Assets\khlauncherlogo.ico
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 | true
72 |
73 |
74 | 754503C04FE3AF1C7BC6FEC4D23E0FA2BA7B3B10
75 |
76 |
77 |
78 | ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 | 4.0
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 | MSBuild:Compile
98 | Designer
99 |
100 |
101 | Designer
102 | MSBuild:Compile
103 |
104 |
105 | MSBuild:Compile
106 | Designer
107 |
108 |
109 | App.xaml
110 | Code
111 |
112 |
113 | LauncherConfig.xaml
114 |
115 |
116 | MainWindow.xaml
117 | Code
118 |
119 |
120 |
121 |
122 | Code
123 |
124 |
125 | True
126 | True
127 | Resources.resx
128 |
129 |
130 | True
131 | Settings.settings
132 | True
133 |
134 |
135 | ResXFileCodeGenerator
136 | Resources.Designer.cs
137 |
138 |
139 |
140 | SettingsSingleFileGenerator
141 | Settings.Designer.cs
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 | False
156 | Microsoft .NET Framework 4.7.2 %28x86 and x64%29
157 | true
158 |
159 |
160 | False
161 | .NET Framework 3.5 SP1
162 | false
163 |
164 |
165 |
166 |
167 |
168 | {0}
169 |
170 |
171 |
172 |
173 | "$(SolutionDir)packages\ILMerge.3.0.41\tools\net452\ILMerge.exe" /out:"$(TargetDir)KINGDOM HEARTS HD 1.5+2.5 ReMIX.exe" "$(TargetPath)" "$(TargetDir)Newtonsoft.Json.dll"
174 | del "$(TargetDir)Newtonsoft.Json.dll"
175 | del "$(TargetDir)Newtonsoft.Json.xml"
176 | del "$(TargetDir)KINGDOM HEARTS HD 1.5+2.5 ReMIX.exe.config"
177 |
178 |
179 | del "$(TargetDir)launcher_config.json"
180 | del "$(TargetDir)steam_appid.txt"
181 |
182 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/LauncherConfig.xaml.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Win32;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.IO;
5 | using System.Linq;
6 | using System.Windows;
7 | using System.Windows.Controls;
8 |
9 | namespace Kingdom_Hearts_4_Launcher
10 | {
11 | public partial class LauncherConfig : Window
12 | {
13 | public List GameOrder { get; private set; }
14 | public string SelectedOrder { get; private set; }
15 | public bool SkipCopyrightScreenOnMovies { get; private set; }
16 | public bool SkipCopyrightScreenOnKH1 { get; private set; }
17 | public string MelonMixPath { get; private set; }
18 | public bool UseMelonMixOnDays { get; private set; }
19 | public bool UseMelonMixOnRecoded { get; private set; }
20 | public string EmulatorPath { get; private set; }
21 | public string RomPath { get; private set; }
22 | public bool ComInsteadOfRecom { get; private set; }
23 |
24 | private bool romexists = false;
25 | private bool emuexists = false;
26 |
27 | public LauncherConfig(string selectedOrder, bool skipCopyrightScreenOnMovies, bool skipCopyrightScreenOnKH1, string melonMixPath, bool useMelonMixOnDays, bool useMelonMixOnRecoded, string emulatorPath, string romPath, bool comInsteadOfRecom)
28 | {
29 | InitializeComponent();
30 |
31 | if (!string.IsNullOrEmpty(melonMixPath) && File.Exists(melonMixPath))
32 | {
33 | melonmixdirectory.Text = melonMixPath;
34 | UseMelonMixOnDaysCheckBox.IsEnabled = true;
35 | UseMelonMixOnRecodedCheckBox.IsEnabled = true;
36 | }
37 | else
38 | {
39 | melonmixdirectory.Text = null;
40 | UseMelonMixOnDaysCheckBox.IsEnabled = false;
41 | UseMelonMixOnRecodedCheckBox.IsEnabled = false;
42 | useMelonMixOnDays = false;
43 | useMelonMixOnRecoded = false;
44 | }
45 |
46 | if (!string.IsNullOrEmpty(emulatorPath) && File.Exists(emulatorPath))
47 | {
48 | emulatordirectory.Text = emulatorPath;
49 | emuexists = true;
50 | }
51 | else
52 | {
53 | emulatordirectory.Text = null;
54 | }
55 |
56 | if (!string.IsNullOrEmpty(romPath) && File.Exists(romPath))
57 | {
58 | romdirectory.Text = romPath;
59 | romexists = true;
60 | }
61 | else
62 | {
63 | romdirectory.Text = null;
64 | }
65 |
66 | if (emuexists && romexists)
67 | {
68 | ComInsteadOfRecomCheckBox.IsEnabled = true;
69 | }
70 | else
71 | {
72 | comInsteadOfRecom = false;
73 | }
74 |
75 | SelectedOrder = selectedOrder;
76 | SkipCopyrightScreenOnMoviesCheckBox.IsChecked = skipCopyrightScreenOnMovies;
77 | SkipCopyrightScreenOnKH1CheckBox.IsChecked = skipCopyrightScreenOnKH1;
78 | UseMelonMixOnDaysCheckBox.IsChecked = useMelonMixOnDays;
79 | UseMelonMixOnRecodedCheckBox.IsChecked = useMelonMixOnRecoded;
80 | ComInsteadOfRecomCheckBox.IsChecked = comInsteadOfRecom;
81 |
82 | foreach (ComboBoxItem item in PresetsComboBox.Items)
83 | {
84 | if (item.Content.ToString() == SelectedOrder)
85 | {
86 | PresetsComboBox.SelectedItem = item;
87 | break;
88 | }
89 | }
90 | }
91 |
92 | private void Browse_Click(object sender, RoutedEventArgs e)
93 | {
94 | while (true)
95 | {
96 | OpenFileDialog openFileDialog = new OpenFileDialog
97 | {
98 | Filter = "All files (*.*)|*.*"
99 | };
100 |
101 | if (openFileDialog.ShowDialog() == true)
102 | {
103 | if (Path.GetFileName(openFileDialog.FileName).Contains("khDaysMM") || Path.GetFileName(openFileDialog.FileName).Contains("MelonMix"))
104 | {
105 | melonmixdirectory.Text = openFileDialog.FileName;
106 | UseMelonMixOnDaysCheckBox.IsEnabled = true;
107 | UseMelonMixOnRecodedCheckBox.IsEnabled = true;
108 | break;
109 | }
110 | else
111 | {
112 | MessageBox.Show("Please select the khDaysMM or MelonMix executable.", "Invalid File", MessageBoxButton.OK, MessageBoxImage.Error);
113 | }
114 | }
115 | else
116 | {
117 | break;
118 | }
119 | }
120 | }
121 |
122 | private void Browseemu_Click(object sender, RoutedEventArgs e)
123 | {
124 | OpenFileDialog openFileDialog = new OpenFileDialog
125 | {
126 | Filter = "All files (*.*)|*.*"
127 | };
128 |
129 | if (openFileDialog.ShowDialog() == true)
130 | {
131 | MessageBox.Show("Keep in mind this application does not verify whether what you selected is a valid GBA emulator.", "Information", MessageBoxButton.OK, MessageBoxImage.Information);
132 | emulatordirectory.Text = openFileDialog.FileName;
133 | emuexists = true;
134 | if (emuexists && romexists)
135 | {
136 | ComInsteadOfRecomCheckBox.IsEnabled = true;
137 | }
138 | }
139 | }
140 |
141 | private void Browserom_Click(object sender, RoutedEventArgs e)
142 | {
143 | OpenFileDialog openFileDialog = new OpenFileDialog
144 | {
145 | Filter = "All files (*.*)|*.*"
146 | };
147 |
148 | if (openFileDialog.ShowDialog() == true)
149 | {
150 | MessageBox.Show("Keep in mind this application does not verify whether what you selected is a valid Chain of Memories ROM.", "Information", MessageBoxButton.OK, MessageBoxImage.Information);
151 | romdirectory.Text = openFileDialog.FileName;
152 | romexists = true;
153 | if (emuexists && romexists)
154 | {
155 | ComInsteadOfRecomCheckBox.IsEnabled = true;
156 | }
157 | }
158 | }
159 |
160 | private void SaveButton_Click(object sender, RoutedEventArgs e)
161 | {
162 | SelectedOrder = (PresetsComboBox.SelectedItem as ComboBoxItem)?.Content.ToString();
163 | SkipCopyrightScreenOnMovies = SkipCopyrightScreenOnMoviesCheckBox.IsChecked ?? false;
164 | SkipCopyrightScreenOnKH1 = SkipCopyrightScreenOnKH1CheckBox.IsChecked ?? false;
165 | MelonMixPath = melonmixdirectory.Text;
166 | UseMelonMixOnDays = UseMelonMixOnDaysCheckBox.IsChecked ?? false;
167 | UseMelonMixOnRecoded = UseMelonMixOnRecodedCheckBox.IsChecked ?? false;
168 | EmulatorPath = emulatordirectory.Text;
169 | RomPath = romdirectory.Text;
170 | ComInsteadOfRecom = ComInsteadOfRecomCheckBox.IsChecked ?? false;
171 |
172 | DialogResult = true;
173 | Close();
174 | }
175 |
176 | private void CancelButton_Click(object sender, RoutedEventArgs e)
177 | {
178 | DialogResult = false;
179 | Close();
180 | }
181 |
182 | private void PresetsComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
183 | {
184 | if (PresetsComboBox.SelectedItem is ComboBoxItem selectedItem)
185 | {
186 | string selectedPreset = selectedItem.Content.ToString();
187 | switch (selectedPreset)
188 | {
189 | case "Official":
190 | GameOrder = new List { "kh1", "recom", "days", "kh2", "bbs", "recoded" };
191 | break;
192 | case "Release":
193 | GameOrder = new List { "kh1", "recom", "kh2", "days", "bbs", "recoded" };
194 | break;
195 | case "Chronological":
196 | GameOrder = new List { "bbs", "kh1", "recom", "days", "kh2", "recoded" };
197 | break;
198 | case "Alphabetical":
199 | GameOrder = new List { "bbs", "kh1", "recom", "recoded", "days", "kh2" };
200 | break;
201 | case "Alphabetical 2":
202 | GameOrder = new List { "bbs", "kh1", "kh2", "recom", "recoded", "days" };
203 | break;
204 | case "Official reverse":
205 | GameOrder = new List { "recoded", "bbs", "kh2", "days", "recom", "kh1" };
206 | break;
207 | case "Release reverse":
208 | GameOrder = new List { "recoded", "bbs", "days", "kh2", "recom", "kh1" };
209 | break;
210 | case "Chronological reverse":
211 | GameOrder = new List { "recoded", "kh2", "days", "recom", "kh1", "bbs" };
212 | break;
213 | case "Alphabetical reverse":
214 | GameOrder = new List { "kh2", "days", "recoded", "recom", "kh1", "bbs" };
215 | break;
216 | case "Alphabetical 2 reverse":
217 | GameOrder = new List { "days", "recoded", "recom", "kh2", "kh1", "bbs" };
218 | break;
219 | case "Random":
220 | List defaultOrder = new List { "kh1", "recom", "days", "kh2", "bbs", "recoded" };
221 | GameOrder = ShuffleList(defaultOrder);
222 | break;
223 | }
224 | }
225 | }
226 |
227 | private List ShuffleList(List list)
228 | {
229 | Random rng = new Random();
230 | return list.OrderBy(item => rng.Next()).ToList();
231 | }
232 | }
233 | }
234 |
--------------------------------------------------------------------------------
/Kingdom Hearts 4 Launcher/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.IO;
3 | using System.Linq;
4 | using Newtonsoft.Json;
5 | using System.Windows;
6 | using System.Windows.Controls;
7 | using System.Diagnostics;
8 | using System;
9 |
10 | namespace Kingdom_Hearts_4_Launcher
11 | {
12 | public partial class MainWindow : Window
13 | {
14 | private readonly string ConfigFilePath = "launcher_config.json";
15 | public string SelectedOrder { get; private set; }
16 | public bool SkipCopyrightScreenOnMovies { get; private set; }
17 | public bool SkipCopyrightScreenOnKH1 { get; private set; }
18 | public string MelonMixPath { get; private set; }
19 | public bool UseMelonMixOnDays { get; private set; }
20 | public bool UseMelonMixOnRecoded { get; private set; }
21 | public string EmulatorPath { get; private set; }
22 | public string RomPath { get; private set; }
23 | public bool ComInsteadOfRecom { get; private set; }
24 |
25 | public MainWindow() : this(new string[0])
26 | {
27 | }
28 | public MainWindow(string[] args)
29 | {
30 | InitializeComponent();
31 | LoadConfig();
32 | if (!File.Exists("steam_appid.txt"))
33 | {
34 | File.WriteAllText("steam_appid.txt", "2552430");
35 | }
36 |
37 | if (args != null && args.Length > 0)
38 | {
39 | foreach (var arg in args)
40 | {
41 | if (arg.Equals("-kh1", StringComparison.OrdinalIgnoreCase))
42 | {
43 | kh1.IsChecked = true;
44 | LaunchFun();
45 | }
46 | else if (arg.Equals("-recom", StringComparison.OrdinalIgnoreCase))
47 | {
48 | recom.IsChecked = true;
49 | LaunchFun();
50 | }
51 | else if (arg.Equals("-days", StringComparison.OrdinalIgnoreCase))
52 | {
53 | days.IsChecked = true;
54 | LaunchFun();
55 | }
56 | else if (arg.Equals("-kh2", StringComparison.OrdinalIgnoreCase))
57 | {
58 | kh2.IsChecked = true;
59 | LaunchFun();
60 | }
61 | else if (arg.Equals("-bbs", StringComparison.OrdinalIgnoreCase))
62 | {
63 | bbs.IsChecked = true;
64 | LaunchFun();
65 | }
66 | else if (arg.Equals("-recoded", StringComparison.OrdinalIgnoreCase))
67 | {
68 | recoded.IsChecked = true;
69 | LaunchFun();
70 | }
71 | else if (arg.Equals("-skipLauncher", StringComparison.OrdinalIgnoreCase))
72 | {
73 | LaunchFun();
74 | }
75 | }
76 | }
77 | }
78 |
79 | private void ReorderGames(string[] newOrder)
80 | {
81 | var radioButtons = new Dictionary
82 | {
83 | { kh1.Name, kh1 },
84 | { recom.Name, recom },
85 | { days.Name, days },
86 | { kh2.Name, kh2 },
87 | { bbs.Name, bbs },
88 | { recoded.Name, recoded }
89 | };
90 |
91 | Games.Children.Clear();
92 | foreach (var name in newOrder)
93 | {
94 | if (radioButtons.ContainsKey(name))
95 | {
96 | Games.Children.Add(radioButtons[name]);
97 | }
98 | }
99 | }
100 |
101 | private void SaveConfig()
102 | {
103 | var order = Games.Children.OfType().Select(rb => rb.Name).ToList();
104 | var CheckedGame = Games.Children.OfType().FirstOrDefault(rb => rb.IsChecked == true)?.Name;
105 |
106 | var config = new GameOrderConfig
107 | {
108 | Order = order,
109 | SelectedOrder = SelectedOrder,
110 | CheckedGame = CheckedGame,
111 | SkipCopyrightScreenOnMovies = SkipCopyrightScreenOnMovies,
112 | SkipCopyrightScreenOnKH1 = SkipCopyrightScreenOnKH1,
113 | MelonMixPath = MelonMixPath,
114 | UseMelonMixOnDays = UseMelonMixOnDays,
115 | UseMelonMixOnRecoded = UseMelonMixOnRecoded,
116 | EmulatorPath = EmulatorPath,
117 | RomPath = RomPath,
118 | ComInsteadOfRecom = ComInsteadOfRecom
119 | };
120 |
121 | var json = JsonConvert.SerializeObject(config, Formatting.Indented);
122 | File.WriteAllText(ConfigFilePath, json);
123 | }
124 |
125 | private void LoadConfig()
126 | {
127 | if (File.Exists(ConfigFilePath))
128 | {
129 | var json = File.ReadAllText(ConfigFilePath);
130 | GameOrderConfig config;
131 | try
132 | {
133 | config = JsonConvert.DeserializeObject(json);
134 | }
135 | catch
136 | {
137 | MessageBox.Show("Unable to read config file, settings will be reset.");
138 | SaveConfig();
139 | return;
140 | }
141 |
142 | if (config.Order != null && config.Order.Count > 0)
143 | {
144 | ReorderGames(config.Order.ToArray());
145 |
146 | if (!string.IsNullOrEmpty(config.CheckedGame))
147 | {
148 | var checkedRadioButton = Games.Children.OfType().FirstOrDefault(rb => rb.Name == config.CheckedGame);
149 | if (checkedRadioButton != null)
150 | {
151 | checkedRadioButton.IsChecked = true;
152 | }
153 | }
154 | }
155 | SelectedOrder = config.SelectedOrder;
156 | SkipCopyrightScreenOnMovies = config.SkipCopyrightScreenOnMovies;
157 | SkipCopyrightScreenOnKH1 = config.SkipCopyrightScreenOnKH1;
158 |
159 | bool emuexists = !string.IsNullOrEmpty(config.EmulatorPath) && File.Exists(config.EmulatorPath);
160 | bool romexists = !string.IsNullOrEmpty(config.RomPath) && File.Exists(config.RomPath);
161 |
162 | MelonMixPath = !string.IsNullOrEmpty(config.MelonMixPath) && File.Exists(config.MelonMixPath)
163 | ? config.MelonMixPath
164 | : null;
165 | UseMelonMixOnDays = MelonMixPath != null && config.UseMelonMixOnDays;
166 | UseMelonMixOnRecoded = MelonMixPath != null && config.UseMelonMixOnRecoded;
167 |
168 | EmulatorPath = emuexists ? config.EmulatorPath : null;
169 | RomPath = romexists ? config.RomPath : null;
170 |
171 | ComInsteadOfRecom = emuexists && romexists && config.ComInsteadOfRecom;
172 |
173 | days.Content = UseMelonMixOnDays
174 | ? "Kingdom Hearts 358/2 Days (Melon Mix)"
175 | : "Kingdom Hearts 358/2 Days (Movie)";
176 | recoded.Content = UseMelonMixOnRecoded
177 | ? "Kingdom Hearts Re:coded (Melon Mix)"
178 | : "Kingdom Hearts Re:coded (Movie)";
179 | recom.Content = ComInsteadOfRecom
180 | ? "Kingdom Hearts: Chain of Memories (GBA)"
181 | : "Kingdom Hearts Re:Chain of Memories";
182 | }
183 | else
184 | {
185 | SkipCopyrightScreenOnMovies = true;
186 | SkipCopyrightScreenOnKH1 = true;
187 | SaveConfig();
188 | }
189 | }
190 |
191 | private class GameOrderConfig
192 | {
193 | public List Order { get; set; }
194 | public string SelectedOrder { get; set; }
195 | public string CheckedGame { get; set; }
196 | public bool SkipCopyrightScreenOnMovies { get; set; }
197 | public bool SkipCopyrightScreenOnKH1 { get; set; }
198 | public string MelonMixPath { get; set; }
199 | public bool UseMelonMixOnDays { get; set; }
200 | public bool UseMelonMixOnRecoded { get; set; }
201 | public string EmulatorPath { get; set; }
202 | public string RomPath { get; set; }
203 | public bool ComInsteadOfRecom { get; set; }
204 | }
205 |
206 | private void LauncherConfigButton_Click(object sender, RoutedEventArgs e)
207 | {
208 | var configWindow = new LauncherConfig(SelectedOrder, SkipCopyrightScreenOnMovies, SkipCopyrightScreenOnKH1, MelonMixPath, UseMelonMixOnDays, UseMelonMixOnRecoded, EmulatorPath, RomPath, ComInsteadOfRecom);
209 | if (configWindow.ShowDialog() == true)
210 | {
211 | SelectedOrder = configWindow.SelectedOrder;
212 | SkipCopyrightScreenOnMovies = configWindow.SkipCopyrightScreenOnMovies;
213 | SkipCopyrightScreenOnKH1 = configWindow.SkipCopyrightScreenOnKH1;
214 | MelonMixPath = configWindow.MelonMixPath;
215 | UseMelonMixOnDays = configWindow.UseMelonMixOnDays;
216 | UseMelonMixOnRecoded = configWindow.UseMelonMixOnRecoded;
217 | EmulatorPath = configWindow.EmulatorPath;
218 | RomPath = configWindow.RomPath;
219 | ComInsteadOfRecom = configWindow.ComInsteadOfRecom;
220 |
221 | if (configWindow.GameOrder != null && configWindow.GameOrder.Count > 0)
222 | {
223 | ReorderGames(configWindow.GameOrder.ToArray());
224 | }
225 |
226 | if (UseMelonMixOnDays)
227 | {
228 | days.Content = "Kingdom Hearts 358/2 Days (Melon Mix)";
229 | }
230 | else
231 | {
232 | days.Content = "Kingdom Hearts 358/2 Days (Movie)";
233 | }
234 |
235 | if (UseMelonMixOnRecoded)
236 | {
237 | recoded.Content = "Kingdom Hearts Re:coded (Melon Mix)";
238 | }
239 | else
240 | {
241 | recoded.Content = "Kingdom Hearts Re:coded (Movie)";
242 | }
243 |
244 | if (ComInsteadOfRecom)
245 | {
246 | recom.Content = "Kingdom Hearts: Chain of Memories (GBA)";
247 | }
248 | else
249 | {
250 | recom.Content = "Kingdom Hearts Re:Chain of Memories";
251 | }
252 |
253 | SaveConfig();
254 | }
255 | }
256 |
257 | private void Launch_Click(object sender, RoutedEventArgs e)
258 | {
259 | LaunchFun();
260 | }
261 | private void LaunchFun()
262 | {
263 | if (kh1.IsChecked == true)
264 | {
265 | string arg = "";
266 | if (SkipCopyrightScreenOnKH1)
267 | {
268 | arg = "-reboot=true";
269 | }
270 | LaunchGame("KINGDOM HEARTS FINAL MIX.exe", arg);
271 | }
272 | else if (recom.IsChecked == true)
273 | {
274 | if (ComInsteadOfRecom)
275 | {
276 | LaunchGame(EmulatorPath, $"\"{RomPath}\"");
277 | }
278 | else
279 | {
280 | LaunchGame("KINGDOM HEARTS Re_Chain of Memories.exe");
281 | }
282 | }
283 | else if (days.IsChecked == true)
284 | {
285 | if (UseMelonMixOnDays)
286 | {
287 | if (File.Exists($"{Path.GetDirectoryName(MelonMixPath)}\\roms\\days.nds"))
288 | {
289 | LaunchGame(MelonMixPath, "roms/days.nds");
290 | }
291 | else if (File.Exists($"{Path.GetDirectoryName(MelonMixPath)}\\roms\\game.nds"))
292 | {
293 | LaunchGame(MelonMixPath);
294 | }
295 | else
296 | {
297 | MessageBox.Show("You don't have a 358/2 Days ROM in the 'roms' folder of Melon Mix.");
298 | }
299 | }
300 | else
301 | {
302 | string arg = "";
303 | if (SkipCopyrightScreenOnMovies)
304 | {
305 | arg = "-reboot=true";
306 | }
307 | LaunchGame("KINGDOM HEARTS HD 1.5+2.5 Launcher.exe", arg);
308 | }
309 | }
310 | else if (kh2.IsChecked == true)
311 | {
312 | LaunchGame("KINGDOM HEARTS II FINAL MIX.exe");
313 | }
314 | else if (bbs.IsChecked == true)
315 | {
316 | LaunchGame("KINGDOM HEARTS Birth by Sleep FINAL MIX.exe");
317 | }
318 | else if (recoded.IsChecked == true)
319 | {
320 | if (UseMelonMixOnRecoded)
321 | {
322 | if (File.Exists($"{Path.GetDirectoryName(MelonMixPath)}\\roms\\recoded.nds"))
323 | {
324 | LaunchGame(MelonMixPath, "roms/recoded.nds");
325 | }
326 | else
327 | {
328 | MessageBox.Show("You don't have a Re:coded ROM in the 'roms' folder of Melon Mix.");
329 | }
330 | }
331 | else
332 | {
333 | string arg = "";
334 | if (SkipCopyrightScreenOnMovies)
335 | {
336 | arg = "-reboot=true";
337 | }
338 | LaunchGame("KINGDOM HEARTS HD 1.5+2.5 Launcher.exe", arg);
339 | }
340 | }
341 | }
342 |
343 | private void LaunchGame(string exeName, string arguments = "")
344 | {
345 | if (File.Exists(exeName))
346 | {
347 | ProcessStartInfo startInfo = new ProcessStartInfo
348 | {
349 | FileName = exeName,
350 | WorkingDirectory = Path.GetDirectoryName(exeName),
351 | Arguments = arguments
352 | };
353 | Process process = new Process
354 | {
355 | StartInfo = startInfo
356 | };
357 | process.Start();
358 | SaveConfig();
359 | Close();
360 | }
361 | else
362 | {
363 | MessageBox.Show("Selected game's executable not found");
364 | }
365 | }
366 | }
367 | }
368 |
--------------------------------------------------------------------------------