From 1ed06fb79dd0a27ac52076f478383a70c90fa2db Mon Sep 17 00:00:00 2001 From: Timothy Baldridge <tbaldridge@gmail.com> Date: Fri, 8 Jan 2021 06:42:58 -0700 Subject: [PATCH] DA2/DAI support --- CHANGELOG.md | 2 +- Wabbajack.Common/GameMetaData.cs | 36 ++++++++++++- .../StoreHandlers/OriginHandler.cs | 53 +++++++++++++++---- 3 files changed, 78 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e525548e..986b7509 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ #### Version - 2.4.0.0 - ??? * Wabbajack is now based on .NET 5.0 (does not require a runtime download by users) * Origin is now supported as a game source -* Basic (mostly untested) support for Dragon Age : Origins +* Basic (mostly untested) support for Dragon Age : Origins, Dragon Age 2, and Dragon Age: Inquisition * Replace RocksDB with SQLite should result in less process contention when running the UI and the CLI at the same time * Fixed Regression with CloudFront IPS4 sites not requesting logins before installation * Fixed regression that caused us to spam the Nexus with verify calls diff --git a/Wabbajack.Common/GameMetaData.cs b/Wabbajack.Common/GameMetaData.cs index 5e81f98f..0b16bef7 100644 --- a/Wabbajack.Common/GameMetaData.cs +++ b/Wabbajack.Common/GameMetaData.cs @@ -42,7 +42,9 @@ namespace Wabbajack.Common KingdomComeDeliverance, MechWarrior5Mercenaries, NoMansSky, - DragonAgeOrigins + DragonAgeOrigins, + DragonAge2, + DragonAgeInquisition } public static class GameExtensions @@ -579,6 +581,38 @@ namespace Wabbajack.Common }, MainExecutable = @"bin_ship\daorigins.exe" } + }, + { + Game.DragonAge2, new GameMetaData + { + Game = Game.DragonAge2, + NexusName = "dragonage2", + NexusGameId = 141, + MO2Name = "Dragon Age 2", // Probably wrong + SteamIDs = new List<int>{1238040}, + OriginIDs = new List<string>{"OFB-EAST:59474"}, + RequiredFiles = new List<string> + { + @"bin_ship\DragonAge2.exe" + }, + MainExecutable = @"bin_ship\DragonAge2.exe" + } + }, + { + Game.DragonAgeInquisition, new GameMetaData + { + Game = Game.DragonAgeInquisition, + NexusName = "dragonageinquisition", + NexusGameId = 728, + MO2Name = "Dragon Age: Inquisition", // Probably wrong + SteamIDs = new List<int>{1222690}, + OriginIDs = new List<string>{"OFB-EAST:51937"}, + RequiredFiles = new List<string> + { + @"DragonAgeInquisition.exe" + }, + MainExecutable = @"DragonAgeInquisition.exe" + } } }; diff --git a/Wabbajack.Common/StoreHandlers/OriginHandler.cs b/Wabbajack.Common/StoreHandlers/OriginHandler.cs index e5ebc3f7..9620818c 100644 --- a/Wabbajack.Common/StoreHandlers/OriginHandler.cs +++ b/Wabbajack.Common/StoreHandlers/OriginHandler.cs @@ -14,6 +14,8 @@ namespace Wabbajack.Common.StoreHandlers private HashSet<string> KnownMFSTs = new(); public override StoreType Type { get; internal set; } = StoreType.Origin; + + private static Regex SplitRegex = new Regex("[0-9]+"); public override bool Init() { try @@ -24,8 +26,35 @@ namespace Wabbajack.Common.StoreHandlers KnownMFSTs = OriginDataPath.EnumerateFiles() .Where(f => f.Extension == MFSTExtension) .Select(f => f.FileNameWithoutExtension.ToString()) + .Select(f => + { + var result = SplitRegex.Match(f); + if (result == null) return default; + var a = f.Substring(0, result.Index); + var b = f.Substring(result.Index); + return a + ":" + b; + }) + .Where(t => t != default) + .Select(t => t!) + .Where(t => !t.Contains(".")) .ToHashSet(); + foreach (var known in KnownMFSTs) + { + try + { + var resp = OriginGame.GetAndCacheManifestResponse(known) + .FromJsonString<OriginGame.GameLocalDataResponse>(); + Utils.Log($"Found Origin Content {resp.localizableAttributes!.displayName} ({known})"); + } + catch (Exception ex) + { + Utils.Log($"Origin got {ex.Message} when loading info for {known}"); + continue; + } + + } + Utils.Log($"Found MFSTs from Origin: {string.Join(", ", KnownMFSTs)}"); return true; @@ -41,6 +70,8 @@ namespace Wabbajack.Common.StoreHandlers { try { + + foreach (var game in GameRegistry.Games) { var mfst = game.Value.OriginIDs.FirstOrDefault(g => KnownMFSTs.Contains(g.Replace(":", ""))); @@ -48,7 +79,6 @@ namespace Wabbajack.Common.StoreHandlers continue; var ogame = new OriginGame(mfst, game.Key, game.Value); - ogame.GetAndCacheManifestResponse(); Games.Add(ogame); } @@ -91,7 +121,7 @@ namespace Wabbajack.Common.StoreHandlers private AbsolutePath GetGamePath() { - var manifestData = GetAndCacheManifestResponse().FromJsonString<GameLocalDataResponse>(); + var manifestData = GetAndCacheManifestResponse(this._mfst).FromJsonString<GameLocalDataResponse>(); var platform = manifestData!.publishing!.softwareList!.software!.FirstOrDefault(a => a.softwarePlatform == "PCWIN"); var installPath = GetPathFromPlatformPath(platform!.fulfillmentAttributes!.installCheckOverride!); @@ -151,21 +181,22 @@ namespace Wabbajack.Common.StoreHandlers return resultPath; } - private AbsolutePath ManifestCacheLocation => - Consts.LocalAppDataPath.Combine("OriginManifestCache", _mfst.Replace(":", "")); + private static AbsolutePath ManifestCacheLocation(string mfst) => + Consts.LocalAppDataPath.Combine("OriginManifestCache", mfst.Replace(":", "")); - internal string GetAndCacheManifestResponse() + internal static string GetAndCacheManifestResponse(string mfst) { - if (ManifestCacheLocation.Exists) + var location = ManifestCacheLocation(mfst); + if (location.Exists) { - return ManifestCacheLocation.ReadAllText(); + return location.ReadAllText(); } - Utils.Log($"Getting Origin Manifest info for {_mfst}"); + Utils.Log($"Getting Origin Manifest info for {mfst}"); var client = new HttpClient(); - var data = client.GetStringAsync($"https://api1.origin.com/ecommerce2/public/{_mfst}/en_US").Result; - ManifestCacheLocation.Parent.CreateDirectory(); - ManifestCacheLocation.WriteAllTextAsync(data).Wait(); + var data = client.GetStringAsync($"https://api1.origin.com/ecommerce2/public/{mfst}/en_US").Result; + location.Parent.CreateDirectory(); + location.WriteAllTextAsync(data).Wait(); return data; }