v4.5.0.0-rc01

- Minor code refactoring & optimization
- Added support for log removal during uninstallation
- Upgraded to SmokeAPI v2.0.0-rc01
This commit is contained in:
pointfeev 2023-01-14 18:58:49 -05:00
parent 64b0235155
commit d4838cd812
13 changed files with 266 additions and 163 deletions

View file

@ -4,7 +4,7 @@
<TargetFramework>net7.0-windows</TargetFramework> <TargetFramework>net7.0-windows</TargetFramework>
<UseWindowsForms>True</UseWindowsForms> <UseWindowsForms>True</UseWindowsForms>
<ApplicationIcon>Resources\ini.ico</ApplicationIcon> <ApplicationIcon>Resources\ini.ico</ApplicationIcon>
<Version>4.4.0.2</Version> <Version>4.5.0.0</Version>
<Copyright>2021, pointfeev (https://github.com/pointfeev)</Copyright> <Copyright>2021, pointfeev (https://github.com/pointfeev)</Copyright>
<Company>CreamInstaller</Company> <Company>CreamInstaller</Company>
<Product>Automatic DLC Unlocker Installer &amp; Configuration Generator</Product> <Product>Automatic DLC Unlocker Installer &amp; Configuration Generator</Product>

View file

@ -80,8 +80,8 @@ internal sealed partial class InstallForm : CustomForm
{ {
if (Program.Canceled) if (Program.Canceled)
throw new CustomMessageException("The operation was canceled."); throw new CustomMessageException("The operation was canceled.");
directory.GetKoaloaderComponents(out List<string> proxies, out string old_config, out string config); directory.GetKoaloaderComponents(out string old_config, out string config);
if (proxies.Any(proxy => File.Exists(proxy) && proxy.IsResourceFile(ResourceIdentifier.Koaloader)) if (directory.GetKoaloaderProxies().Any(proxy => File.Exists(proxy) && proxy.IsResourceFile(ResourceIdentifier.Koaloader))
|| directory != selection.RootDirectory && Koaloader.AutoLoadDLLs.Any(pair => File.Exists(directory + @"\" + pair.dll)) || directory != selection.RootDirectory && Koaloader.AutoLoadDLLs.Any(pair => File.Exists(directory + @"\" + pair.dll))
|| File.Exists(old_config) || File.Exists(config)) || File.Exists(old_config) || File.Exists(config))
{ {
@ -95,8 +95,8 @@ internal sealed partial class InstallForm : CustomForm
{ {
if (Program.Canceled) if (Program.Canceled)
throw new CustomMessageException("The operation was canceled."); throw new CustomMessageException("The operation was canceled.");
directory.GetKoaloaderComponents(out List<string> proxies, out string old_config, out string config); directory.GetKoaloaderComponents(out string old_config, out string config);
if (proxies.Any(proxy => File.Exists(proxy) && proxy.IsResourceFile(ResourceIdentifier.Koaloader)) if (directory.GetKoaloaderProxies().Any(proxy => File.Exists(proxy) && proxy.IsResourceFile(ResourceIdentifier.Koaloader))
|| Koaloader.AutoLoadDLLs.Any(pair => File.Exists(directory + @"\" + pair.dll)) || File.Exists(old_config) || File.Exists(config)) || Koaloader.AutoLoadDLLs.Any(pair => File.Exists(directory + @"\" + pair.dll)) || File.Exists(old_config) || File.Exists(config))
{ {
UpdateUser("Uninstalling Koaloader from " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation); UpdateUser("Uninstalling Koaloader from " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
@ -113,9 +113,10 @@ internal sealed partial class InstallForm : CustomForm
if (selection.Platform is Platform.Steam or Platform.Paradox) if (selection.Platform is Platform.Steam or Platform.Paradox)
{ {
directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string old_config, directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string old_config,
out string config, out string cache); out string config, out string old_log, out string log, out string cache);
if (uninstallProxy if (uninstallProxy
? File.Exists(api32_o) || File.Exists(api64_o) || File.Exists(old_config) || File.Exists(config) || File.Exists(cache) ? File.Exists(api32_o) || File.Exists(api64_o) || File.Exists(old_config) || File.Exists(config) || File.Exists(old_log)
|| File.Exists(log) || File.Exists(cache)
: File.Exists(api32) || File.Exists(api64)) : File.Exists(api32) || File.Exists(api64))
{ {
UpdateUser( UpdateUser(
@ -129,8 +130,10 @@ internal sealed partial class InstallForm : CustomForm
} }
if (selection.Platform is Platform.Epic or Platform.Paradox) if (selection.Platform is Platform.Epic or Platform.Paradox)
{ {
directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config); directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config, out string log);
if (uninstallProxy ? File.Exists(api32_o) || File.Exists(api64_o) || File.Exists(config) : File.Exists(api32) || File.Exists(api64)) if (uninstallProxy
? File.Exists(api32_o) || File.Exists(api64_o) || File.Exists(config) || File.Exists(log)
: File.Exists(api32) || File.Exists(api64))
{ {
UpdateUser( UpdateUser(
$"{(uninstallProxy ? "Uninstalling" : "Installing")} ScreamAPI" + $" {(uninstallProxy ? "from" : "for")} " + selection.Name $"{(uninstallProxy ? "Uninstalling" : "Installing")} ScreamAPI" + $" {(uninstallProxy ? "from" : "for")} " + selection.Name
@ -143,8 +146,10 @@ internal sealed partial class InstallForm : CustomForm
} }
if (selection.Platform is Platform.Ubisoft) if (selection.Platform is Platform.Ubisoft)
{ {
directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config); directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config, out string log);
if (uninstallProxy ? File.Exists(api32_o) || File.Exists(api64_o) || File.Exists(config) : File.Exists(api32) || File.Exists(api64)) if (uninstallProxy
? File.Exists(api32_o) || File.Exists(api64_o) || File.Exists(config) || File.Exists(log)
: File.Exists(api32) || File.Exists(api64))
{ {
UpdateUser( UpdateUser(
$"{(uninstallProxy ? "Uninstalling" : "Installing")} Uplay R1 Unlocker" + $" {(uninstallProxy ? "from" : "for")} " + selection.Name $"{(uninstallProxy ? "Uninstalling" : "Installing")} Uplay R1 Unlocker" + $" {(uninstallProxy ? "from" : "for")} " + selection.Name
@ -154,9 +159,9 @@ internal sealed partial class InstallForm : CustomForm
else else
await UplayR1.Install(directory, selection, this); await UplayR1.Install(directory, selection, this);
} }
directory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config); directory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config, out log);
if (uninstallProxy if (uninstallProxy
? File.Exists(api32_o) || File.Exists(api64_o) || File.Exists(config) ? File.Exists(api32_o) || File.Exists(api64_o) || File.Exists(config) || File.Exists(log)
: File.Exists(old_api32) || File.Exists(old_api64) || File.Exists(api32) || File.Exists(api64)) : File.Exists(old_api32) || File.Exists(old_api64) || File.Exists(api32) || File.Exists(api64))
{ {
UpdateUser( UpdateUser(

View file

@ -818,30 +818,33 @@ internal sealed partial class SelectForm : CustomForm
foreach (string directory in directories) foreach (string directory in directories)
{ {
directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string old_config, directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string old_config,
out string config, out string cache); out string config, out string old_log, out string log, out string cache);
if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o) || File.Exists(old_config) if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o) || File.Exists(old_config)
|| File.Exists(config) || File.Exists(cache)) || File.Exists(config) || File.Exists(old_log) || File.Exists(log) || File.Exists(cache))
items.Add(new ContextMenuItem($"Open Steamworks Directory #{++steam}", "File Explorer", items.Add(new ContextMenuItem($"Open Steamworks Directory #{++steam}", "File Explorer",
(_, _) => Diagnostics.OpenDirectoryInFileExplorer(directory))); (_, _) => Diagnostics.OpenDirectoryInFileExplorer(directory)));
} }
if (selection.Platform is Platform.Epic or Platform.Paradox) if (selection.Platform is Platform.Epic or Platform.Paradox)
foreach (string directory in directories) foreach (string directory in directories)
{ {
directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config); directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config,
if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o) || File.Exists(config)) out string log);
if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o) || File.Exists(config) || File.Exists(log))
items.Add(new ContextMenuItem($"Open EOS Directory #{++epic}", "File Explorer", items.Add(new ContextMenuItem($"Open EOS Directory #{++epic}", "File Explorer",
(_, _) => Diagnostics.OpenDirectoryInFileExplorer(directory))); (_, _) => Diagnostics.OpenDirectoryInFileExplorer(directory)));
} }
if (selection.Platform is Platform.Ubisoft) if (selection.Platform is Platform.Ubisoft)
foreach (string directory in directories) foreach (string directory in directories)
{ {
directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config); directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config,
if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o) || File.Exists(config)) out string log);
if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o) || File.Exists(config) || File.Exists(log))
items.Add(new ContextMenuItem($"Open Uplay R1 Directory #{++r1}", "File Explorer", items.Add(new ContextMenuItem($"Open Uplay R1 Directory #{++r1}", "File Explorer",
(_, _) => Diagnostics.OpenDirectoryInFileExplorer(directory))); (_, _) => Diagnostics.OpenDirectoryInFileExplorer(directory)));
directory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config); directory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config,
out log);
if (File.Exists(old_api32) || File.Exists(old_api64) || File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) if (File.Exists(old_api32) || File.Exists(old_api64) || File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64)
|| File.Exists(api64_o) || File.Exists(config)) || File.Exists(api64_o) || File.Exists(config) || File.Exists(log))
items.Add(new ContextMenuItem($"Open Uplay R2 Directory #{++r2}", "File Explorer", items.Add(new ContextMenuItem($"Open Uplay R2 Directory #{++r2}", "File Explorer",
(_, _) => Diagnostics.OpenDirectoryInFileExplorer(directory))); (_, _) => Diagnostics.OpenDirectoryInFileExplorer(directory)));
} }

View file

@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -47,22 +46,14 @@ internal static class ParadoxLauncher
paradoxLauncher.ExtraSelectedDlc.Clear(); paradoxLauncher.ExtraSelectedDlc.Clear();
foreach (ProgramSelection selection in ProgramSelection.AllEnabled.Where(s => s != paradoxLauncher && s.Publisher == "Paradox Interactive")) foreach (ProgramSelection selection in ProgramSelection.AllEnabled.Where(s => s != paradoxLauncher && s.Publisher == "Paradox Interactive"))
{ {
paradoxLauncher.ExtraDlc.Add( paradoxLauncher.ExtraDlc.Add(selection.Id, (selection.Name, selection.AllDlc));
new ValueTuple<string, string, SortedList<string, (DlcType type, string name, string icon)>>(selection.Id, selection.Name, paradoxLauncher.ExtraSelectedDlc.Add(selection.Id, (selection.Name, selection.SelectedDlc));
selection.AllDlc));
paradoxLauncher.ExtraSelectedDlc.Add(
new ValueTuple<string, string, SortedList<string, (DlcType type, string name, string icon)>>(selection.Id, selection.Name,
selection.SelectedDlc));
} }
if (!paradoxLauncher.ExtraDlc.Any()) if (!paradoxLauncher.ExtraDlc.Any())
foreach (ProgramSelection selection in ProgramSelection.AllSafe.Where(s => s != paradoxLauncher && s.Publisher == "Paradox Interactive")) foreach (ProgramSelection selection in ProgramSelection.AllSafe.Where(s => s != paradoxLauncher && s.Publisher == "Paradox Interactive"))
{ {
paradoxLauncher.ExtraDlc.Add( paradoxLauncher.ExtraDlc.Add(selection.Id, (selection.Name, selection.AllDlc));
new ValueTuple<string, string, SortedList<string, (DlcType type, string name, string icon)>>(selection.Id, selection.Name, paradoxLauncher.ExtraSelectedDlc.Add(selection.Id, (selection.Name, selection.AllDlc));
selection.AllDlc));
paradoxLauncher.ExtraSelectedDlc.Add(
new ValueTuple<string, string, SortedList<string, (DlcType type, string name, string icon)>>(selection.Id, selection.Name,
selection.AllDlc));
} }
} }
} }
@ -100,21 +91,23 @@ internal static class ParadoxLauncher
{ {
bool koaloaderInstalled = Koaloader.AutoLoadDLLs.Select(pair => (pair.unlocker, path: directory + @"\" + pair.dll)) bool koaloaderInstalled = Koaloader.AutoLoadDLLs.Select(pair => (pair.unlocker, path: directory + @"\" + pair.dll))
.Any(pair => File.Exists(pair.path) && pair.path.IsResourceFile()); .Any(pair => File.Exists(pair.path) && pair.path.IsResourceFile());
directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string _, out string config, out _); directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string old_config,
out string config, out _, out _, out _);
smokeInstalled = smokeInstalled || File.Exists(api32_o) || File.Exists(api64_o) smokeInstalled = smokeInstalled || File.Exists(api32_o) || File.Exists(api64_o)
|| (File.Exists(config) || File.Exists(config)) && !koaloaderInstalled || (File.Exists(old_config) || File.Exists(config)) && !koaloaderInstalled
|| File.Exists(api32) && api32.IsResourceFile(ResourceIdentifier.Steamworks32) || File.Exists(api32) && api32.IsResourceFile(ResourceIdentifier.Steamworks32)
|| File.Exists(api64) && api64.IsResourceFile(ResourceIdentifier.Steamworks64); || File.Exists(api64) && api64.IsResourceFile(ResourceIdentifier.Steamworks64);
await SmokeAPI.Uninstall(directory, deleteConfig: false); await SmokeAPI.Uninstall(directory, deleteOthers: false);
if (steamOriginalSdk32 is null && File.Exists(api32) && !api32.IsResourceFile(ResourceIdentifier.Steamworks32)) if (steamOriginalSdk32 is null && File.Exists(api32) && !api32.IsResourceFile(ResourceIdentifier.Steamworks32))
steamOriginalSdk32 = await File.ReadAllBytesAsync(api32); steamOriginalSdk32 = await File.ReadAllBytesAsync(api32);
if (steamOriginalSdk64 is null && File.Exists(api64) && !api64.IsResourceFile(ResourceIdentifier.Steamworks64)) if (steamOriginalSdk64 is null && File.Exists(api64) && !api64.IsResourceFile(ResourceIdentifier.Steamworks64))
steamOriginalSdk64 = await File.ReadAllBytesAsync(api64); steamOriginalSdk64 = await File.ReadAllBytesAsync(api64);
directory.GetScreamApiComponents(out api32, out api32_o, out api64, out api64_o, out config); directory.GetScreamApiComponents(out api32, out api32_o, out api64, out api64_o, out config, out string log);
screamInstalled = screamInstalled || File.Exists(api32_o) || File.Exists(api64_o) || File.Exists(config) && !koaloaderInstalled screamInstalled = screamInstalled || File.Exists(api32_o) || File.Exists(api64_o)
|| (File.Exists(config) || File.Exists(log)) && !koaloaderInstalled
|| File.Exists(api32) && api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32) || File.Exists(api32) && api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32)
|| File.Exists(api64) && api64.IsResourceFile(ResourceIdentifier.EpicOnlineServices64); || File.Exists(api64) && api64.IsResourceFile(ResourceIdentifier.EpicOnlineServices64);
await ScreamAPI.Uninstall(directory, deleteConfig: false); await ScreamAPI.Uninstall(directory, deleteOthers: false);
if (epicOriginalSdk32 is null && File.Exists(api32) && !api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32)) if (epicOriginalSdk32 is null && File.Exists(api32) && !api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32))
epicOriginalSdk32 = await File.ReadAllBytesAsync(api32); epicOriginalSdk32 = await File.ReadAllBytesAsync(api32);
if (epicOriginalSdk64 is null && File.Exists(api64) && !api64.IsResourceFile(ResourceIdentifier.EpicOnlineServices64)) if (epicOriginalSdk64 is null && File.Exists(api64) && !api64.IsResourceFile(ResourceIdentifier.EpicOnlineServices64))
@ -126,7 +119,7 @@ internal static class ParadoxLauncher
bool neededRepair = false; bool neededRepair = false;
foreach (string directory in selection.DllDirectories) foreach (string directory in selection.DllDirectories)
{ {
directory.GetSmokeApiComponents(out string api32, out _, out string api64, out _, out _, out _, out _); directory.GetSmokeApiComponents(out string api32, out _, out string api64, out _, out _, out _, out _, out _, out _);
if (steamOriginalSdk32 is not null && api32.IsResourceFile(ResourceIdentifier.Steamworks32)) if (steamOriginalSdk32 is not null && api32.IsResourceFile(ResourceIdentifier.Steamworks32))
{ {
steamOriginalSdk32.Write(api32); steamOriginalSdk32.Write(api32);
@ -141,7 +134,7 @@ internal static class ParadoxLauncher
} }
if (smokeInstalled) if (smokeInstalled)
await SmokeAPI.Install(directory, selection, generateConfig: false); await SmokeAPI.Install(directory, selection, generateConfig: false);
directory.GetScreamApiComponents(out api32, out _, out api64, out _, out _); directory.GetScreamApiComponents(out api32, out _, out api64, out _, out _, out _);
if (epicOriginalSdk32 is not null && api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32)) if (epicOriginalSdk32 is not null && api32.IsResourceFile(ResourceIdentifier.EpicOnlineServices32))
{ {
epicOriginalSdk32.Write(api32); epicOriginalSdk32.Write(api32);

View file

@ -27,10 +27,9 @@ internal sealed class ProgramSelection
internal readonly SortedList<string, (DlcType type, string name, string icon)> AllDlc = new(PlatformIdComparer.String); internal readonly SortedList<string, (DlcType type, string name, string icon)> AllDlc = new(PlatformIdComparer.String);
internal readonly List<(string id, string name, SortedList<string, (DlcType type, string name, string icon)> dlc)> ExtraDlc = new(); // for Paradox Launcher internal readonly SortedList<string, (string name, SortedList<string, (DlcType type, string name, string icon)> dlc)> ExtraDlc = new();
internal readonly List<(string id, string name, SortedList<string, (DlcType type, string name, string icon)> dlc)> internal readonly SortedList<string, (string name, SortedList<string, (DlcType type, string name, string icon)> dlc)> ExtraSelectedDlc = new();
ExtraSelectedDlc = new(); // for Paradox Launcher
internal readonly SortedList<string, (DlcType type, string name, string icon)> SelectedDlc = new(PlatformIdComparer.String); internal readonly SortedList<string, (DlcType type, string name, string icon)> SelectedDlc = new(PlatformIdComparer.String);
@ -68,27 +67,32 @@ internal sealed class ProgramSelection
if (api32.IsFilePathLocked() || api32_o.IsFilePathLocked() || api64.IsFilePathLocked() || api64_o.IsFilePathLocked() if (api32.IsFilePathLocked() || api32_o.IsFilePathLocked() || api64.IsFilePathLocked() || api64_o.IsFilePathLocked()
|| config.IsFilePathLocked()) || config.IsFilePathLocked())
return true; return true;
directory.GetSmokeApiComponents(out api32, out api32_o, out api64, out api64_o, out string old_config, out config, out string cache); directory.GetSmokeApiComponents(out api32, out api32_o, out api64, out api64_o, out string old_config, out config, out string old_log,
out string log, out string cache);
if (api32.IsFilePathLocked() || api32_o.IsFilePathLocked() || api64.IsFilePathLocked() || api64_o.IsFilePathLocked() if (api32.IsFilePathLocked() || api32_o.IsFilePathLocked() || api64.IsFilePathLocked() || api64_o.IsFilePathLocked()
|| old_config.IsFilePathLocked() || config.IsFilePathLocked() || cache.IsFilePathLocked()) || old_config.IsFilePathLocked() || config.IsFilePathLocked() || old_log.IsFilePathLocked() || log.IsFilePathLocked()
|| cache.IsFilePathLocked())
return true; return true;
} }
if (Platform is Platform.Epic or Platform.Paradox) if (Platform is Platform.Epic or Platform.Paradox)
{ {
directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config); directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config,
out string log);
if (api32.IsFilePathLocked() || api32_o.IsFilePathLocked() || api64.IsFilePathLocked() || api64_o.IsFilePathLocked() if (api32.IsFilePathLocked() || api32_o.IsFilePathLocked() || api64.IsFilePathLocked() || api64_o.IsFilePathLocked()
|| config.IsFilePathLocked()) || config.IsFilePathLocked() || log.IsFilePathLocked())
return true; return true;
} }
if (Platform is Platform.Ubisoft) if (Platform is Platform.Ubisoft)
{ {
directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config); directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config,
out string log);
if (api32.IsFilePathLocked() || api32_o.IsFilePathLocked() || api64.IsFilePathLocked() || api64_o.IsFilePathLocked() if (api32.IsFilePathLocked() || api32_o.IsFilePathLocked() || api64.IsFilePathLocked() || api64_o.IsFilePathLocked()
|| config.IsFilePathLocked()) || config.IsFilePathLocked() || log.IsFilePathLocked())
return true; return true;
directory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config); directory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config,
out log);
if (old_api32.IsFilePathLocked() || old_api64.IsFilePathLocked() || api32.IsFilePathLocked() || api32_o.IsFilePathLocked() if (old_api32.IsFilePathLocked() || old_api64.IsFilePathLocked() || api32.IsFilePathLocked() || api32_o.IsFilePathLocked()
|| api64.IsFilePathLocked() || api64_o.IsFilePathLocked() || config.IsFilePathLocked()) || api64.IsFilePathLocked() || api64_o.IsFilePathLocked() || config.IsFilePathLocked() || log.IsFilePathLocked())
return true; return true;
} }
} }

View file

@ -21,13 +21,16 @@ internal static class Koaloader
("Uplay R2 Unlocker", "UplayR2Unlocker.dll"), ("Uplay R2 Unlocker", "UplayR2Unlocker32.dll"), ("Uplay R2 Unlocker", "UplayR2Unlocker64.dll") ("Uplay R2 Unlocker", "UplayR2Unlocker.dll"), ("Uplay R2 Unlocker", "UplayR2Unlocker32.dll"), ("Uplay R2 Unlocker", "UplayR2Unlocker64.dll")
}; };
internal static void GetKoaloaderComponents(this string directory, out List<string> proxies, out string old_config, out string config) internal static IEnumerable<string> GetKoaloaderProxies(this string directory)
=> from resource in EmbeddedResources
select resource[(resource.IndexOf('.') + 1)..]
into resource
select resource[(resource.IndexOf('.') + 1)..]
into resource
select directory + @"\" + resource;
internal static void GetKoaloaderComponents(this string directory, out string old_config, out string config)
{ {
proxies = EmbeddedResources.Select(proxy =>
{
proxy = proxy[(proxy.IndexOf('.') + 1)..];
return proxy[(proxy.IndexOf('.') + 1)..];
}).Select(proxy => directory + @"\" + proxy).ToList();
old_config = directory + @"\Koaloader.json"; old_config = directory + @"\Koaloader.json";
config = directory + @"\Koaloader.config.json"; config = directory + @"\Koaloader.config.json";
} }
@ -55,11 +58,19 @@ internal static class Koaloader
private static void CheckConfig(string directory, InstallForm installForm = null) private static void CheckConfig(string directory, InstallForm installForm = null)
{ {
directory.GetKoaloaderComponents(out _, out string old_config, out string config); directory.GetKoaloaderComponents(out string old_config, out string config);
if (File.Exists(old_config)) if (File.Exists(old_config))
{ {
File.Delete(old_config); if (!File.Exists(config))
installForm?.UpdateUser($"Deleted old configuration: {Path.GetFileName(old_config)}", LogTextBox.Action, false); {
File.Move(old_config, config!);
installForm?.UpdateUser($"Converted old configuration: {Path.GetFileName(old_config)} -> {Path.GetFileName(config)}", LogTextBox.Action, false);
}
else
{
File.Delete(old_config);
installForm?.UpdateUser($"Deleted old configuration: {Path.GetFileName(old_config)}", LogTextBox.Action, false);
}
} }
SortedList<string, string> targets = new(PlatformIdComparer.String); SortedList<string, string> targets = new(PlatformIdComparer.String);
SortedList<string, string> modules = new(PlatformIdComparer.String); SortedList<string, string> modules = new(PlatformIdComparer.String);
@ -123,8 +134,9 @@ internal static class Koaloader
internal static async Task Uninstall(string directory, string rootDirectory = null, InstallForm installForm = null, bool deleteConfig = true) internal static async Task Uninstall(string directory, string rootDirectory = null, InstallForm installForm = null, bool deleteConfig = true)
=> await Task.Run(async () => => await Task.Run(async () =>
{ {
directory.GetKoaloaderComponents(out List<string> proxies, out string old_config, out string config); directory.GetKoaloaderComponents(out string old_config, out string config);
foreach (string proxyPath in proxies.Where(proxyPath => File.Exists(proxyPath) && proxyPath.IsResourceFile(ResourceIdentifier.Koaloader))) foreach (string proxyPath in directory.GetKoaloaderProxies()
.Where(proxyPath => File.Exists(proxyPath) && proxyPath.IsResourceFile(ResourceIdentifier.Koaloader)))
{ {
File.Delete(proxyPath); File.Delete(proxyPath);
installForm?.UpdateUser($"Deleted Koaloader: {Path.GetFileName(proxyPath)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted Koaloader: {Path.GetFileName(proxyPath)}", LogTextBox.Action, false);
@ -157,10 +169,9 @@ internal static class Koaloader
InstallForm installForm = null, bool generateConfig = true) InstallForm installForm = null, bool generateConfig = true)
=> await Task.Run(() => => await Task.Run(() =>
{ {
directory.GetKoaloaderComponents(out List<string> proxies, out _, out _);
string proxy = selection.KoaloaderProxy ?? ProgramSelection.DefaultKoaloaderProxy; string proxy = selection.KoaloaderProxy ?? ProgramSelection.DefaultKoaloaderProxy;
string path = directory + @"\" + proxy + ".dll"; string path = directory + @"\" + proxy + ".dll";
foreach (string _path in proxies.Where(p => p != path && File.Exists(p) && p.IsResourceFile(ResourceIdentifier.Koaloader))) foreach (string _path in directory.GetKoaloaderProxies().Where(p => p != path && File.Exists(p) && p.IsResourceFile(ResourceIdentifier.Koaloader)))
{ {
File.Delete(_path); File.Delete(_path);
installForm?.UpdateUser($"Deleted Koaloader: {Path.GetFileName(_path)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted Koaloader: {Path.GetFileName(_path)}", LogTextBox.Action, false);

View file

@ -537,25 +537,31 @@ internal static class Resources
if (platform is Platform.Steam or Platform.Paradox) if (platform is Platform.Steam or Platform.Paradox)
{ {
subDirectory.GetSmokeApiComponents(out string api, out string api_o, out string api64, out string api64_o, out string old_config, subDirectory.GetSmokeApiComponents(out string api, out string api_o, out string api64, out string api64_o, out string old_config,
out string config, out string cache); out string config, out string old_log, out string log, out string cache);
if (File.Exists(api) || File.Exists(api_o) || File.Exists(api64) || File.Exists(api64_o) if (File.Exists(api) || File.Exists(api_o) || File.Exists(api64) || File.Exists(api64_o)
|| (File.Exists(old_config) || File.Exists(config)) && !koaloaderInstalled || File.Exists(cache) && !koaloaderInstalled) || (File.Exists(old_config) || File.Exists(config) || File.Exists(old_log) || File.Exists(log) || File.Exists(cache))
&& !koaloaderInstalled)
dllDirectories.Add(subDirectory); dllDirectories.Add(subDirectory);
} }
if (platform is Platform.Epic or Platform.Paradox) if (platform is Platform.Epic or Platform.Paradox)
{ {
subDirectory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config); subDirectory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config,
if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o) || File.Exists(config) && !koaloaderInstalled) out string log);
if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o)
|| (File.Exists(config) || File.Exists(log)) && !koaloaderInstalled)
dllDirectories.Add(subDirectory); dllDirectories.Add(subDirectory);
} }
if (platform is Platform.Ubisoft) if (platform is Platform.Ubisoft)
{ {
subDirectory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config); subDirectory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config,
if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o) || File.Exists(config) && !koaloaderInstalled) out string log);
if (File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) || File.Exists(api64_o)
|| (File.Exists(config) || File.Exists(log)) && !koaloaderInstalled)
dllDirectories.Add(subDirectory); dllDirectories.Add(subDirectory);
subDirectory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config); subDirectory.GetUplayR2Components(out string old_api32, out string old_api64, out api32, out api32_o, out api64, out api64_o, out config,
out log);
if (File.Exists(old_api32) || File.Exists(old_api64) || File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64) if (File.Exists(old_api32) || File.Exists(old_api64) || File.Exists(api32) || File.Exists(api32_o) || File.Exists(api64)
|| File.Exists(api64_o) || File.Exists(config) && !koaloaderInstalled) || File.Exists(api64_o) || (File.Exists(config) || File.Exists(log)) && !koaloaderInstalled)
dllDirectories.Add(subDirectory); dllDirectories.Add(subDirectory);
} }
} }
@ -576,9 +582,9 @@ internal static class Resources
{ {
if (!File.Exists(filePath)) if (!File.Exists(filePath))
return null; return null;
#pragma warning disable CA5351 // Do Not Use Broken Cryptographic Algorithms #pragma warning disable CA5351
using MD5 md5 = MD5.Create(); using MD5 md5 = MD5.Create();
#pragma warning restore CA5351 // Do Not Use Broken Cryptographic Algorithms #pragma warning restore CA5351
using FileStream stream = File.OpenRead(filePath); using FileStream stream = File.OpenRead(filePath);
byte[] hash = md5.ComputeHash(stream); byte[] hash = md5.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToUpperInvariant(); return BitConverter.ToString(hash).Replace("-", "").ToUpperInvariant();
@ -589,12 +595,7 @@ internal static class Resources
internal static bool IsResourceFile(this string filePath) => filePath.ComputeMD5() is { } hash && ResourceMD5s.Values.Any(hashes => hashes.Contains(hash)); internal static bool IsResourceFile(this string filePath) => filePath.ComputeMD5() is { } hash && ResourceMD5s.Values.Any(hashes => hashes.Contains(hash));
internal enum BinaryType internal enum BinaryType { Unknown = -1, BIT32 = 0, BIT64 = 6 }
{
Unknown = -1, BIT32 = 0, DOS = 1,
WOW = 2, PIF = 3, POSIX = 4,
OS216 = 5, BIT64 = 6
}
internal enum ResourceIdentifier internal enum ResourceIdentifier
{ {

View file

@ -12,26 +12,27 @@ namespace CreamInstaller.Resources;
internal static class ScreamAPI internal static class ScreamAPI
{ {
internal static void GetScreamApiComponents(this string directory, out string api32, out string api32_o, out string api64, out string api64_o, internal static void GetScreamApiComponents(this string directory, out string api32, out string api32_o, out string api64, out string api64_o,
out string config) out string config, out string log)
{ {
api32 = directory + @"\EOSSDK-Win32-Shipping.dll"; api32 = directory + @"\EOSSDK-Win32-Shipping.dll";
api32_o = directory + @"\EOSSDK-Win32-Shipping_o.dll"; api32_o = directory + @"\EOSSDK-Win32-Shipping_o.dll";
api64 = directory + @"\EOSSDK-Win64-Shipping.dll"; api64 = directory + @"\EOSSDK-Win64-Shipping.dll";
api64_o = directory + @"\EOSSDK-Win64-Shipping_o.dll"; api64_o = directory + @"\EOSSDK-Win64-Shipping_o.dll";
config = directory + @"\ScreamAPI.json"; config = directory + @"\ScreamAPI.json";
log = directory + @"\ScreamAPI.log";
} }
internal static void CheckConfig(string directory, ProgramSelection selection, InstallForm installForm = null) internal static void CheckConfig(string directory, ProgramSelection selection, InstallForm installForm = null)
{ {
directory.GetScreamApiComponents(out _, out _, out _, out _, out string config); directory.GetScreamApiComponents(out _, out _, out _, out _, out string config, out _);
IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> overrideCatalogItems IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> overrideCatalogItems
= selection.AllDlc.Where(pair => pair.Value.type is DlcType.EpicCatalogItem).Except(selection.SelectedDlc); = selection.AllDlc.Where(pair => pair.Value.type is DlcType.EpicCatalogItem).Except(selection.SelectedDlc);
foreach ((string _, string _, SortedList<string, (DlcType type, string name, string icon)> extraDlc) in selection.ExtraSelectedDlc) foreach (KeyValuePair<string, (string _, SortedList<string, (DlcType type, string name, string icon)> extraDlc)> pair in selection.ExtraSelectedDlc)
overrideCatalogItems = overrideCatalogItems.Except(extraDlc); overrideCatalogItems = overrideCatalogItems.Except(pair.Value.extraDlc);
IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> entitlements IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> entitlements
= selection.SelectedDlc.Where(pair => pair.Value.type == DlcType.EpicEntitlement); = selection.SelectedDlc.Where(pair => pair.Value.type == DlcType.EpicEntitlement);
foreach ((string _, string _, SortedList<string, (DlcType type, string name, string icon)> _dlc) in selection.ExtraSelectedDlc) foreach (KeyValuePair<string, (string _, SortedList<string, (DlcType type, string name, string icon)> dlc)> pair in selection.ExtraSelectedDlc)
entitlements = entitlements.Concat(_dlc.Where(pair => pair.Value.type == DlcType.EpicEntitlement)); entitlements = entitlements.Concat(pair.Value.dlc.Where(pair => pair.Value.type == DlcType.EpicEntitlement));
overrideCatalogItems = overrideCatalogItems.ToList(); overrideCatalogItems = overrideCatalogItems.ToList();
entitlements = entitlements.ToList(); entitlements = entitlements.ToList();
if (overrideCatalogItems.Any() || entitlements.Any()) if (overrideCatalogItems.Any() || entitlements.Any())
@ -100,10 +101,10 @@ internal static class ScreamAPI
writer.WriteLine("}"); writer.WriteLine("}");
} }
internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteConfig = true) internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteOthers = true)
=> await Task.Run(() => => await Task.Run(() =>
{ {
directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config); directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string config, out string log);
if (File.Exists(api32_o)) if (File.Exists(api32_o))
{ {
if (File.Exists(api32)) if (File.Exists(api32))
@ -124,17 +125,24 @@ internal static class ScreamAPI
File.Move(api64_o, api64!); File.Move(api64_o, api64!);
installForm?.UpdateUser($"Restored EOS: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", LogTextBox.Action, false); installForm?.UpdateUser($"Restored EOS: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", LogTextBox.Action, false);
} }
if (deleteConfig && File.Exists(config)) if (!deleteOthers)
return;
if (File.Exists(config))
{ {
File.Delete(config); File.Delete(config);
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
} }
if (File.Exists(log))
{
File.Delete(log);
installForm?.UpdateUser($"Deleted log: {Path.GetFileName(log)}", LogTextBox.Action, false);
}
}); });
internal static async Task Install(string directory, ProgramSelection selection, InstallForm installForm = null, bool generateConfig = true) internal static async Task Install(string directory, ProgramSelection selection, InstallForm installForm = null, bool generateConfig = true)
=> await Task.Run(() => => await Task.Run(() =>
{ {
directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string _); directory.GetScreamApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out _, out _);
if (File.Exists(api32) && !File.Exists(api32_o)) if (File.Exists(api32) && !File.Exists(api32_o))
{ {
File.Move(api32, api32_o!); File.Move(api32, api32_o!);

View file

@ -12,7 +12,7 @@ namespace CreamInstaller.Resources;
internal static class SmokeAPI internal static class SmokeAPI
{ {
internal static void GetSmokeApiComponents(this string directory, out string api32, out string api32_o, out string api64, out string api64_o, internal static void GetSmokeApiComponents(this string directory, out string api32, out string api32_o, out string api64, out string api64_o,
out string old_config, out string config, out string cache) out string old_config, out string config, out string old_log, out string log, out string cache)
{ {
api32 = directory + @"\steam_api.dll"; api32 = directory + @"\steam_api.dll";
api32_o = directory + @"\steam_api_o.dll"; api32_o = directory + @"\steam_api_o.dll";
@ -20,88 +20,138 @@ internal static class SmokeAPI
api64_o = directory + @"\steam_api64_o.dll"; api64_o = directory + @"\steam_api64_o.dll";
old_config = directory + @"\SmokeAPI.json"; old_config = directory + @"\SmokeAPI.json";
config = directory + @"\SmokeAPI.config.json"; config = directory + @"\SmokeAPI.config.json";
old_log = directory + @"\SmokeAPI.log";
log = directory + @"\SmokeAPI.log.log";
cache = directory + @"\SmokeAPI.cache.json"; cache = directory + @"\SmokeAPI.cache.json";
} }
internal static void CheckConfig(string directory, ProgramSelection selection, InstallForm installForm = null) internal static void CheckConfig(string directory, ProgramSelection selection, InstallForm installForm = null)
{ {
directory.GetSmokeApiComponents(out _, out _, out _, out _, out string old_config, out _, out _); directory.GetSmokeApiComponents(out _, out _, out _, out _, out string old_config, out string config, out _, out _, out _);
IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> overrideDlc = selection.AllDlc.Except(selection.SelectedDlc); List<KeyValuePair<string, (DlcType type, string name, string icon)>> overrideDlc = selection.AllDlc.Except(selection.SelectedDlc).ToList();
foreach ((string _, string _, SortedList<string, (DlcType type, string name, string icon)> extraDlc) in selection.ExtraSelectedDlc) foreach (KeyValuePair<string, (string name, SortedList<string, (DlcType type, string name, string icon)> dlc)> pair in selection.ExtraDlc)
overrideDlc = overrideDlc.Except(extraDlc); if (selection.ExtraSelectedDlc.TryGetValue(pair.Key,
IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> injectDlc out (string name, SortedList<string, (DlcType type, string name, string icon)> dlc) selectedPair))
= new List<KeyValuePair<string, (DlcType type, string name, string icon)>>(); overrideDlc.AddRange(pair.Value.dlc.Except(selectedPair.dlc));
if (selection.AllDlc.Count > 64 || selection.ExtraDlc.Any(e => e.dlc.Count > 64)) List<KeyValuePair<string, (DlcType type, string name, string icon)>> injectDlc = new();
{ if (selection.AllDlc.Count > 64)
injectDlc = injectDlc.Concat(selection.SelectedDlc.Where(pair => pair.Value.type is DlcType.SteamHidden)); injectDlc.AddRange(selection.SelectedDlc.Where(pair => pair.Value.type is DlcType.SteamHidden));
foreach ((string id, string _, SortedList<string, (DlcType type, string name, string icon)> extraDlc) in selection.ExtraSelectedDlc) List<KeyValuePair<string, (string name, SortedList<string, (DlcType type, string name, string icon)> injectDlc)>> extraApps = new();
if (selection.ExtraDlc.Single(e => e.id == id).dlc.Count > 64) if (selection.ExtraDlc.Any(e => e.Value.dlc.Count > 64))
injectDlc = injectDlc.Concat(extraDlc.Where(pair => pair.Value.type is DlcType.SteamHidden)); foreach (KeyValuePair<string, (string name, SortedList<string, (DlcType type, string name, string icon)> injectDlc)> pair in selection
} .ExtraSelectedDlc)
overrideDlc = overrideDlc.ToList(); if (selection.ExtraDlc.First(e => e.Key == pair.Key).Value.dlc.Count > 64)
{
SortedList<string, (DlcType type, string name, string icon)> extraInjectDlc = new(PlatformIdComparer.String);
foreach (KeyValuePair<string, (DlcType type, string name, string icon)> extraPair in pair.Value.injectDlc.Where(extraPair
=> extraPair.Value.type is DlcType.SteamHidden))
extraInjectDlc.Add(extraPair.Key, extraPair.Value);
KeyValuePair<string, (string name, SortedList<string, (DlcType type, string name, string icon)> injectDlc)> newExtraPair = new(pair.Key,
(pair.Value.name, extraInjectDlc));
extraApps.Add(newExtraPair);
}
injectDlc = injectDlc.ToList(); injectDlc = injectDlc.ToList();
if (overrideDlc.Any() || injectDlc.Any()) if (File.Exists(old_config))
{
File.Delete(old_config);
installForm?.UpdateUser($"Deleted old configuration: {Path.GetFileName(old_config)}", LogTextBox.Action, false);
}
if (selection.ExtraSelectedDlc.Any(p => p.Value.dlc.Any()) || overrideDlc.Any() || injectDlc.Any())
{ {
/*if (installForm is not null) /*if (installForm is not null)
installForm.UpdateUser("Generating SmokeAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);*/ installForm.UpdateUser("Generating SmokeAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);*/
File.Create(old_config).Close(); File.Create(config).Close();
StreamWriter writer = new(old_config, true, Encoding.UTF8); StreamWriter writer = new(config, true, Encoding.UTF8);
WriteConfig(writer, new(overrideDlc.ToDictionary(pair => pair.Key, pair => pair.Value), PlatformIdComparer.String), WriteConfig(writer, selection.Id, new(extraApps.ToDictionary(pair => pair.Key, pair => pair.Value), PlatformIdComparer.String),
new(overrideDlc.ToDictionary(pair => pair.Key, pair => pair.Value), PlatformIdComparer.String),
new(injectDlc.ToDictionary(pair => pair.Key, pair => pair.Value), PlatformIdComparer.String), installForm); new(injectDlc.ToDictionary(pair => pair.Key, pair => pair.Value), PlatformIdComparer.String), installForm);
writer.Flush(); writer.Flush();
writer.Close(); writer.Close();
} }
else if (File.Exists(old_config)) else if (File.Exists(config))
{ {
File.Delete(old_config); File.Delete(config);
installForm?.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(old_config)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted unnecessary configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
} }
} }
private static void WriteConfig(StreamWriter writer, SortedList<string, (DlcType type, string name, string icon)> overrideDlc, private static void WriteConfig(StreamWriter writer, string appId,
SortedList<string, (DlcType type, string name, string icon)> injectDlc, InstallForm installForm = null) SortedList<string, (string name, SortedList<string, (DlcType type, string name, string icon)> injectDlc)> extraApps,
SortedList<string, (DlcType type, string name, string icon)> overrideDlc, SortedList<string, (DlcType type, string name, string icon)> injectDlc,
InstallForm installForm = null)
{ {
writer.WriteLine("{"); writer.WriteLine("{");
writer.WriteLine(" \"$version\": 1,"); writer.WriteLine(" \"$version\": 2,");
writer.WriteLine(" \"logging\": false,"); writer.WriteLine(" \"logging\": false,");
writer.WriteLine(" \"hook_steamclient\": true,"); writer.WriteLine(" \"unlock_family_sharing\": true,");
writer.WriteLine(" \"unlock_all\": true,"); writer.WriteLine(" \"default_app_status\": \"unlocked\",");
writer.WriteLine(" \"override_app_status\": {},");
if (overrideDlc.Count > 0) if (overrideDlc.Count > 0)
{ {
writer.WriteLine(" \"override\": ["); writer.WriteLine(" \"override_dlc_status\": {");
KeyValuePair<string, (DlcType type, string name, string icon)> lastOverrideDlc = overrideDlc.Last(); KeyValuePair<string, (DlcType type, string name, string icon)> lastOverrideDlc = overrideDlc.Last();
foreach (KeyValuePair<string, (DlcType type, string name, string icon)> pair in overrideDlc) foreach (KeyValuePair<string, (DlcType type, string name, string icon)> pair in overrideDlc)
{ {
string dlcId = pair.Key; string dlcId = pair.Key;
(_, string dlcName, _) = pair.Value; (_, string dlcName, _) = pair.Value;
writer.WriteLine($" {dlcId}{(pair.Equals(lastOverrideDlc) ? "" : ",")}"); writer.WriteLine($" \"{dlcId}\": \"locked\"{(pair.Equals(lastOverrideDlc) ? "" : ",")}");
installForm?.UpdateUser($"Added override DLC to SmokeAPI.json with appid {dlcId} ({dlcName})", LogTextBox.Action, false); installForm?.UpdateUser($"Added locked DLC to SmokeAPI.config.json with appid {dlcId} ({dlcName})", LogTextBox.Action, false);
} }
writer.WriteLine(" ],"); writer.WriteLine(" },");
} }
else else
writer.WriteLine(" \"override\": [],"); writer.WriteLine(" \"override_dlc_status\": {},");
if (injectDlc.Count > 0)
{
writer.WriteLine(" \"dlc_ids\": [");
KeyValuePair<string, (DlcType type, string name, string icon)> lastInjectDlc = injectDlc.Last();
foreach (KeyValuePair<string, (DlcType type, string name, string icon)> pair in injectDlc)
{
string dlcId = pair.Key;
(_, string dlcName, _) = pair.Value;
writer.WriteLine($" {dlcId}{(pair.Equals(lastInjectDlc) ? "" : ",")}");
installForm?.UpdateUser($"Added inject DLC to SmokeAPI.json with appid {dlcId} ({dlcName})", LogTextBox.Action, false);
}
writer.WriteLine(" ],");
}
else
writer.WriteLine(" \"dlc_ids\": [],");
writer.WriteLine(" \"auto_inject_inventory\": true,"); writer.WriteLine(" \"auto_inject_inventory\": true,");
writer.WriteLine(" \"inventory_items\": []"); writer.WriteLine(" \"extra_inventory_items\": {},");
if (injectDlc.Count > 0 || extraApps.Count > 0)
{
writer.WriteLine(" \"extra_dlcs\": {");
if (injectDlc.Count > 0)
{
writer.WriteLine(" \"" + appId + "\": {");
writer.WriteLine(" \"dlcs\": {");
KeyValuePair<string, (DlcType type, string name, string icon)> lastInjectDlc = injectDlc.Last();
foreach (KeyValuePair<string, (DlcType type, string name, string icon)> pair in injectDlc)
{
string dlcId = pair.Key;
(_, string dlcName, _) = pair.Value;
writer.WriteLine($" \"{dlcId}\": \"{dlcName}\"{(pair.Equals(lastInjectDlc) ? "" : ",")}");
installForm?.UpdateUser($"Added extra DLC to SmokeAPI.config.json with appid {dlcId} ({dlcName})", LogTextBox.Action, false);
}
writer.WriteLine(" }");
writer.WriteLine(extraApps.Count > 0 ? " }," : " }");
}
if (extraApps.Count > 0)
{
KeyValuePair<string, (string name, SortedList<string, (DlcType type, string name, string icon)> injectDlc)> lastExtraApp = extraApps.Last();
foreach (KeyValuePair<string, (string name, SortedList<string, (DlcType type, string name, string icon)> injectDlc)> pair in extraApps)
{
string extraAppId = pair.Key;
(string _ /*extraAppName*/, SortedList<string, (DlcType type, string name, string icon)> extraInjectDlc) = pair.Value;
writer.WriteLine(" \"" + extraAppId + "\": {");
writer.WriteLine(" \"dlcs\": {");
//installForm?.UpdateUser($"Added extra app to SmokeAPI.config.json with appid {extraAppId} ({extraAppName})", LogTextBox.Action, false);
KeyValuePair<string, (DlcType type, string name, string icon)> lastExtraAppDlc = extraInjectDlc.Last();
foreach (KeyValuePair<string, (DlcType type, string name, string icon)> extraPair in extraInjectDlc)
{
string dlcId = extraPair.Key;
(_, string dlcName, _) = extraPair.Value;
writer.WriteLine($" \"{dlcId}\": \"{dlcName}\"{(extraPair.Equals(lastExtraAppDlc) ? "" : ",")}");
installForm?.UpdateUser($"Added extra DLC to SmokeAPI.config.json with appid {dlcId} ({dlcName})", LogTextBox.Action, false);
}
writer.WriteLine(" }");
writer.WriteLine(pair.Equals(lastExtraApp) ? " }" : " },");
}
}
writer.WriteLine(" },");
}
else
writer.WriteLine(" \"extra_dlcs\": {},");
writer.WriteLine(" \"store_config\": null");
writer.WriteLine("}"); writer.WriteLine("}");
} }
internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteConfig = true) internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteOthers = true)
=> await Task.Run(() => => await Task.Run(() =>
{ {
directory.GetCreamApiComponents(out _, out _, out _, out _, out string oldConfig); directory.GetCreamApiComponents(out _, out _, out _, out _, out string oldConfig);
@ -111,7 +161,7 @@ internal static class SmokeAPI
installForm?.UpdateUser($"Deleted old CreamAPI configuration: {Path.GetFileName(oldConfig)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted old CreamAPI configuration: {Path.GetFileName(oldConfig)}", LogTextBox.Action, false);
} }
directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string old_config, directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out string old_config,
out string config, out string cache); out string config, out string old_log, out string log, out string cache);
if (File.Exists(api32_o)) if (File.Exists(api32_o))
{ {
if (File.Exists(api32)) if (File.Exists(api32))
@ -132,21 +182,33 @@ internal static class SmokeAPI
File.Move(api64_o, api64!); File.Move(api64_o, api64!);
installForm?.UpdateUser($"Restored Steamworks: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", LogTextBox.Action, false); installForm?.UpdateUser($"Restored Steamworks: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", LogTextBox.Action, false);
} }
if (deleteConfig && File.Exists(old_config)) if (!deleteOthers)
return;
if (File.Exists(old_config))
{ {
File.Delete(old_config); File.Delete(old_config);
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(old_config)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(old_config)}", LogTextBox.Action, false);
} }
if (deleteConfig && File.Exists(config)) if (File.Exists(config))
{ {
File.Delete(config); File.Delete(config);
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
} }
if (deleteConfig && File.Exists(cache)) if (File.Exists(cache))
{ {
File.Delete(cache); File.Delete(cache);
installForm?.UpdateUser($"Deleted cache: {Path.GetFileName(cache)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted cache: {Path.GetFileName(cache)}", LogTextBox.Action, false);
} }
if (File.Exists(old_log))
{
File.Delete(old_log);
installForm?.UpdateUser($"Deleted log: {Path.GetFileName(old_log)}", LogTextBox.Action, false);
}
if (File.Exists(log))
{
File.Delete(log);
installForm?.UpdateUser($"Deleted log: {Path.GetFileName(log)}", LogTextBox.Action, false);
}
}); });
internal static async Task Install(string directory, ProgramSelection selection, InstallForm installForm = null, bool generateConfig = true) internal static async Task Install(string directory, ProgramSelection selection, InstallForm installForm = null, bool generateConfig = true)
@ -158,7 +220,7 @@ internal static class SmokeAPI
File.Delete(oldConfig); File.Delete(oldConfig);
installForm?.UpdateUser($"Deleted old CreamAPI configuration: {Path.GetFileName(oldConfig)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted old CreamAPI configuration: {Path.GetFileName(oldConfig)}", LogTextBox.Action, false);
} }
directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out _, out _, out _); directory.GetSmokeApiComponents(out string api32, out string api32_o, out string api64, out string api64_o, out _, out _, out _, out _, out _);
if (File.Exists(api32) && !File.Exists(api32_o)) if (File.Exists(api32) && !File.Exists(api32_o))
{ {
File.Move(api32, api32_o!); File.Move(api32, api32_o!);

View file

@ -12,21 +12,22 @@ namespace CreamInstaller.Resources;
internal static class UplayR1 internal static class UplayR1
{ {
internal static void GetUplayR1Components(this string directory, out string api32, out string api32_o, out string api64, out string api64_o, internal static void GetUplayR1Components(this string directory, out string api32, out string api32_o, out string api64, out string api64_o,
out string config) out string config, out string log)
{ {
api32 = directory + @"\uplay_r1_loader.dll"; api32 = directory + @"\uplay_r1_loader.dll";
api32_o = directory + @"\uplay_r1_loader_o.dll"; api32_o = directory + @"\uplay_r1_loader_o.dll";
api64 = directory + @"\uplay_r1_loader64.dll"; api64 = directory + @"\uplay_r1_loader64.dll";
api64_o = directory + @"\uplay_r1_loader64_o.dll"; api64_o = directory + @"\uplay_r1_loader64_o.dll";
config = directory + @"\UplayR1Unlocker.jsonc"; config = directory + @"\UplayR1Unlocker.jsonc";
log = directory + @"\UplayR1Unlocker.log";
} }
internal static void CheckConfig(string directory, ProgramSelection selection, InstallForm installForm = null) internal static void CheckConfig(string directory, ProgramSelection selection, InstallForm installForm = null)
{ {
directory.GetUplayR1Components(out _, out _, out _, out _, out string config); directory.GetUplayR1Components(out _, out _, out _, out _, out string config, out _);
IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> blacklistDlc = selection.AllDlc.Except(selection.SelectedDlc); IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> blacklistDlc = selection.AllDlc.Except(selection.SelectedDlc);
foreach ((string _, string _, SortedList<string, (DlcType type, string name, string icon)> extraDlc) in selection.ExtraSelectedDlc) foreach (KeyValuePair<string, (string _, SortedList<string, (DlcType type, string name, string icon)> extraDlc)> pair in selection.ExtraSelectedDlc)
blacklistDlc = blacklistDlc.Except(extraDlc); blacklistDlc = blacklistDlc.Except(pair.Value.extraDlc);
blacklistDlc = blacklistDlc.ToList(); blacklistDlc = blacklistDlc.ToList();
if (blacklistDlc.Any()) if (blacklistDlc.Any())
{ {
@ -70,10 +71,10 @@ internal static class UplayR1
writer.WriteLine("}"); writer.WriteLine("}");
} }
internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteConfig = true) internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteOthers = true)
=> await Task.Run(() => => await Task.Run(() =>
{ {
directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config); directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string config, out string log);
if (File.Exists(api32_o)) if (File.Exists(api32_o))
{ {
if (File.Exists(api32)) if (File.Exists(api32))
@ -94,17 +95,24 @@ internal static class UplayR1
File.Move(api64_o, api64!); File.Move(api64_o, api64!);
installForm?.UpdateUser($"Restored Uplay R1: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", LogTextBox.Action, false); installForm?.UpdateUser($"Restored Uplay R1: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api64)}", LogTextBox.Action, false);
} }
if (deleteConfig && File.Exists(config)) if (!deleteOthers)
return;
if (File.Exists(config))
{ {
File.Delete(config); File.Delete(config);
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
} }
if (File.Exists(log))
{
File.Delete(log);
installForm?.UpdateUser($"Deleted log: {Path.GetFileName(log)}", LogTextBox.Action, false);
}
}); });
internal static async Task Install(string directory, ProgramSelection selection, InstallForm installForm = null, bool generateConfig = true) internal static async Task Install(string directory, ProgramSelection selection, InstallForm installForm = null, bool generateConfig = true)
=> await Task.Run(() => => await Task.Run(() =>
{ {
directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out string _); directory.GetUplayR1Components(out string api32, out string api32_o, out string api64, out string api64_o, out _, out _);
if (File.Exists(api32) && !File.Exists(api32_o)) if (File.Exists(api32) && !File.Exists(api32_o))
{ {
File.Move(api32, api32_o!); File.Move(api32, api32_o!);

View file

@ -12,7 +12,7 @@ namespace CreamInstaller.Resources;
internal static class UplayR2 internal static class UplayR2
{ {
internal static void GetUplayR2Components(this string directory, out string old_api32, out string old_api64, out string api32, out string api32_o, internal static void GetUplayR2Components(this string directory, out string old_api32, out string old_api64, out string api32, out string api32_o,
out string api64, out string api64_o, out string config) out string api64, out string api64_o, out string config, out string log)
{ {
old_api32 = directory + @"\uplay_r2_loader.dll"; old_api32 = directory + @"\uplay_r2_loader.dll";
old_api64 = directory + @"\uplay_r2_loader64.dll"; old_api64 = directory + @"\uplay_r2_loader64.dll";
@ -21,14 +21,15 @@ internal static class UplayR2
api64 = directory + @"\upc_r2_loader64.dll"; api64 = directory + @"\upc_r2_loader64.dll";
api64_o = directory + @"\upc_r2_loader64_o.dll"; api64_o = directory + @"\upc_r2_loader64_o.dll";
config = directory + @"\UplayR2Unlocker.jsonc"; config = directory + @"\UplayR2Unlocker.jsonc";
log = directory + @"\UplayR2Unlocker.log";
} }
internal static void CheckConfig(string directory, ProgramSelection selection, InstallForm installForm = null) internal static void CheckConfig(string directory, ProgramSelection selection, InstallForm installForm = null)
{ {
directory.GetUplayR2Components(out _, out _, out _, out _, out _, out _, out string config); directory.GetUplayR2Components(out _, out _, out _, out _, out _, out _, out string config, out _);
IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> blacklistDlc = selection.AllDlc.Except(selection.SelectedDlc); IEnumerable<KeyValuePair<string, (DlcType type, string name, string icon)>> blacklistDlc = selection.AllDlc.Except(selection.SelectedDlc);
foreach ((string _, string _, SortedList<string, (DlcType type, string name, string icon)> extraDlc) in selection.ExtraSelectedDlc) foreach (KeyValuePair<string, (string _, SortedList<string, (DlcType type, string name, string icon)> extraDlc)> pair in selection.ExtraSelectedDlc)
blacklistDlc = blacklistDlc.Except(extraDlc); blacklistDlc = blacklistDlc.Except(pair.Value.extraDlc);
blacklistDlc = blacklistDlc.ToList(); blacklistDlc = blacklistDlc.ToList();
if (blacklistDlc.Any()) if (blacklistDlc.Any())
{ {
@ -74,11 +75,11 @@ internal static class UplayR2
writer.WriteLine("}"); writer.WriteLine("}");
} }
internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteConfig = true) internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteOthers = true)
=> await Task.Run(() => => await Task.Run(() =>
{ {
directory.GetUplayR2Components(out string old_api32, out string old_api64, out string api32, out string api32_o, out string api64, directory.GetUplayR2Components(out string old_api32, out string old_api64, out string api32, out string api32_o, out string api64,
out string api64_o, out string config); out string api64_o, out string config, out string log);
if (File.Exists(api32_o)) if (File.Exists(api32_o))
{ {
string api = File.Exists(old_api32) ? old_api32 : api32; string api = File.Exists(old_api32) ? old_api32 : api32;
@ -101,18 +102,25 @@ internal static class UplayR2
File.Move(api64_o, api!); File.Move(api64_o, api!);
installForm?.UpdateUser($"Restored Uplay R2: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api)}", LogTextBox.Action, false); installForm?.UpdateUser($"Restored Uplay R2: {Path.GetFileName(api64_o)} -> {Path.GetFileName(api)}", LogTextBox.Action, false);
} }
if (deleteConfig && File.Exists(config)) if (!deleteOthers)
return;
if (File.Exists(config))
{ {
File.Delete(config); File.Delete(config);
installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false); installForm?.UpdateUser($"Deleted configuration: {Path.GetFileName(config)}", LogTextBox.Action, false);
} }
if (File.Exists(log))
{
File.Delete(log);
installForm?.UpdateUser($"Deleted log: {Path.GetFileName(log)}", LogTextBox.Action, false);
}
}); });
internal static async Task Install(string directory, ProgramSelection selection, InstallForm installForm = null, bool generateConfig = true) internal static async Task Install(string directory, ProgramSelection selection, InstallForm installForm = null, bool generateConfig = true)
=> await Task.Run(() => => await Task.Run(() =>
{ {
directory.GetUplayR2Components(out string old_api32, out string old_api64, out string api32, out string api32_o, out string api64, directory.GetUplayR2Components(out string old_api32, out string old_api64, out string api32, out string api32_o, out string api64,
out string api64_o, out string _); out string api64_o, out _, out _);
string api = File.Exists(old_api32) ? old_api32 : api32; string api = File.Exists(old_api32) ? old_api32 : api32;
if (File.Exists(api) && !File.Exists(api32_o)) if (File.Exists(api) && !File.Exists(api32_o))
{ {