-
Notifications
You must be signed in to change notification settings - Fork 4
/
RockstarGameFactory.cs
95 lines (81 loc) · 3.11 KB
/
RockstarGameFactory.cs
1
2
3
4
5
6
7
8
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
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
using Gamelib.Core.Util;
using GameLib.Core;
using GameLib.Plugin.Rockstar.Model;
using Microsoft.Win32;
namespace GameLib.Plugin.Rockstar;
internal static class RockstarGameFactory
{
/// <summary>
/// Get games installed for the GoG launcher
/// </summary>
public static IEnumerable<RockstarGame> GetGames(ILauncher launcher, CancellationToken cancellationToken = default)
{
using var regKey = RegistryUtil.GetKey(RegistryHive.LocalMachine, @"SOFTWARE\Rockstar Games", true);
if (regKey is null)
{
return Enumerable.Empty<RockstarGame>();
}
return regKey.GetSubKeyNames()
.AsParallel()
.WithCancellation(cancellationToken)
.Select(gameId => LoadFromRegistry(launcher, gameId))
.Where(game => game is not null)
.Select(game => AddLauncherId(launcher, game!))
.Select(game => AddExecutables(launcher, game!))
.ToList()!;
}
/// <summary>
/// Add launcher ID to Game
/// </summary>
private static RockstarGame AddLauncherId(ILauncher launcher, RockstarGame game)
{
game.LauncherId = launcher.Id;
return game;
}
/// <summary>
/// Find executables within the install directory
/// </summary>
private static RockstarGame AddExecutables(ILauncher launcher, RockstarGame game)
{
if (launcher.LauncherOptions.SearchExecutables)
{
var executables = PathUtil.GetExecutables(game.InstallDir);
executables.AddRange(game.Executables);
game.Executables = executables.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
}
return game;
}
/// <summary>
/// Load the GoG game registry entry into a <see cref="GogGame"/> object
/// </summary>
private static RockstarGame? LoadFromRegistry(ILauncher launcher, string gameId)
{
using var regKey = RegistryUtil.GetKey(RegistryHive.LocalMachine, $@"SOFTWARE\Rockstar Games\{gameId}");
if (regKey is null ||
gameId.Equals("Launcher", StringComparison.OrdinalIgnoreCase) ||
gameId.Equals("Rockstar Games Social Club", StringComparison.OrdinalIgnoreCase) ||
string.IsNullOrEmpty(regKey.GetValue("InstallFolder", string.Empty) as string))
{
return null;
}
var game = new RockstarGame()
{
Id = gameId,
Name = gameId,
InstallDir = (string)regKey.GetValue("InstallFolder", string.Empty)!,
Version = (string)regKey.GetValue("Version", string.Empty)!,
};
if (string.IsNullOrEmpty(game.Id))
{
return null;
}
if (launcher.LauncherOptions.SearchGameConfigStore)
{
game.Executable = RegistryUtil.SearchGameConfigStore(game.InstallDir) ?? string.Empty;
}
game.WorkingDir = game.InstallDir;
game.InstallDate = PathUtil.GetCreationTime(game.InstallDir) ?? DateTime.MinValue;
game.LaunchString = $"\"{launcher.Executable}\" -launchTitleInFolder \"{game.InstallDir}\"";
return game;
}
}