diff --git a/CreamInstaller/Forms/SelectForm.cs b/CreamInstaller/Forms/SelectForm.cs index cf0ee38..6e5c3e6 100644 --- a/CreamInstaller/Forms/SelectForm.cs +++ b/CreamInstaller/Forms/SelectForm.cs @@ -121,7 +121,9 @@ internal partial class SelectForm : CustomForm selection.Id = "PL"; selection.Name = "Paradox Launcher"; selection.RootDirectory = ParadoxLauncher.InstallPath; - selection.ExecutableDirectories = await selection.RootDirectory.GetExecutableDirectories(d => !d.Contains("bootstrapper")); + selection.ExecutableDirectories = (await selection.RootDirectory + .GetExecutables(d => !Path.GetFileName(d).Contains("bootstrapper"))) + .Select(e => e = Path.GetDirectoryName(e)).Distinct().ToList(); selection.DllDirectories = dllDirectories; selection.Platform = Platform.Paradox; @@ -430,7 +432,17 @@ internal partial class SelectForm : CustomForm selection.Id = gameId; selection.Name = name; selection.RootDirectory = gameDirectory; - selection.ExecutableDirectories = new() { selection.RootDirectory }; + // need a better method for obtaining ubisoft game executables + // for now, I just get the largest (file size) single executable + string largestExecutableDirectory = null; + long largestExecutableDirectorySize = 0; + foreach (string path in await selection.RootDirectory.GetExecutables()) + if (new FileInfo(path).Length is long executableSize && executableSize > largestExecutableDirectorySize) + { + largestExecutableDirectory = Path.GetDirectoryName(path); + largestExecutableDirectorySize = executableSize; + } + selection.ExecutableDirectories = new() { largestExecutableDirectory ?? selection.RootDirectory }; selection.DllDirectories = dllDirectories; selection.Platform = Platform.Ubisoft; selection.IconUrl = IconGrabber.GetDomainFaviconUrl("store.ubi.com"); diff --git a/CreamInstaller/Resources/Resources.cs b/CreamInstaller/Resources/Resources.cs index 3f02fc0..c030019 100644 --- a/CreamInstaller/Resources/Resources.cs +++ b/CreamInstaller/Resources/Resources.cs @@ -56,25 +56,26 @@ internal static class Resources return false; } - internal static async Task> GetExecutableDirectories(this string rootDirectory, Func validFunc = null) => await Task.Run(async () => + internal static async Task> GetExecutables(this string rootDirectory, Func validFunc = null) => await Task.Run(async () => { - List executableDirectories = new(); + List executables = new(); if (Program.Canceled || !Directory.Exists(rootDirectory)) return null; - if (Directory.GetFiles(rootDirectory, "*.exe").Any(d => validFunc(d))) - executableDirectories.Add(rootDirectory); + foreach (string path in Directory.GetFiles(rootDirectory, "*.exe")) + if (validFunc is null || validFunc(path)) + executables.Add(path); string[] directories = Directory.GetDirectories(rootDirectory); - foreach (string _directory in directories) + foreach (string directory in directories) { if (Program.Canceled) return null; try { - List moreExecutableDirectories = await _directory.GetExecutableDirectories(validFunc); - if (moreExecutableDirectories is not null) - executableDirectories.AddRange(moreExecutableDirectories); + List moreExecutables = await directory.GetExecutables(validFunc); + if (moreExecutables is not null) + executables.AddRange(moreExecutables); } catch { } } - return !executableDirectories.Any() ? null : executableDirectories; + return !executables.Any() ? null : executables; }); internal static void GetCreamApiComponents(