wabbajack/Wabbajack.Common/GameMetaData.cs

505 lines
19 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
2019-09-29 00:22:25 +00:00
using System.Linq;
using Alphaleonis.Win32.Filesystem;
2019-09-29 00:22:25 +00:00
using Microsoft.Win32;
using Wabbajack.Common.StoreHandlers;
2019-09-29 00:22:25 +00:00
namespace Wabbajack.Common
{
public enum Game
{
//MO2 GAMES
2019-11-18 19:31:55 +00:00
Morrowind,
2019-09-29 00:22:25 +00:00
Oblivion,
[Description("Fallout 3")]
2019-09-29 00:22:25 +00:00
Fallout3,
[Description("Fallout New Vegas")]
2019-09-29 00:22:25 +00:00
FalloutNewVegas,
[Description("Skyrim Legendary Edition")]
2019-09-29 00:22:25 +00:00
Skyrim,
[Description("Skyrim Special Edition")]
2019-09-29 00:22:25 +00:00
SkyrimSpecialEdition,
[Description("Fallout 4")]
Fallout4,
[Description("Skyrim VR")]
SkyrimVR,
//VORTEX GAMES
[Description("Darkest Dungeon")]
DarkestDungeon,
[Description("Divinity Original Sin 2")]
2019-11-14 22:58:29 +00:00
DivinityOriginalSin2,
[Description("Divinity Original Sin 2 Definitive Edition")]
2019-11-14 22:58:29 +00:00
DivinityOriginalSin2DE, //definitive edition has its own nexus page but same Steam/GOG ids
Starbound,
[Description("Star Wars: Knights of the Old Republic")]
SWKOTOR,
[Description("Star Wars: Knights of the Old Republic 2")]
2019-11-14 19:11:05 +00:00
SWKOTOR2,
Witcher,
[Description("Witcher 2")]
Witcher2,
[Description("Witcher 3")]
Witcher3,
[Description("Stardew Valley")]
StardewValley
2019-09-29 00:22:25 +00:00
}
public static class GameExtentions
{
public static GameMetaData MetaData(this Game game)
{
return GameRegistry.Games[game];
}
}
2019-09-29 00:22:25 +00:00
public class GameMetaData
{
public ModManager SupportedModManager { get; internal set; }
2019-09-29 00:22:25 +00:00
public string MO2ArchiveName { get; internal set; }
public Game Game { get; internal set; }
public string NexusName { get; internal set; }
2020-02-06 05:30:31 +00:00
// Nexus DB id for the game, used in some specific situations
public long NexusGameId { get; internal set; }
2019-09-29 00:22:25 +00:00
public string MO2Name { get; internal set; }
public string HumanFriendlyGameName => Game.GetDescription();
2019-09-29 00:22:25 +00:00
public string GameLocationRegistryKey { get; internal set; }
// to get steam ids: https://steamdb.info
2019-11-05 13:10:42 +00:00
public List<int> SteamIDs { get; internal set; }
// to get gog ids: https://www.gogdb.org
public List<int> GOGIDs { get; internal set; }
// these are additional folders when a game installs mods outside the game folder
2019-11-09 20:34:44 +00:00
public List<string> AdditionalFolders { get; internal set; }
// file to check if the game is present, useful when steamIds and gogIds dont help
public List<string> RequiredFiles { get; internal set; }
2019-11-18 19:31:55 +00:00
public bool Disabled { get; internal set; }
// Games that this game are commonly confused with, for example Skyrim SE vs Skyrim LE
public Game[] CommonlyConfusedWith { get; set; }
public string InstalledVersion
{
get
{
if (GameLocation() == null)
throw new GameNotInstalledException(this);
if (MainExecutable == null)
throw new NotImplementedException();
return FileVersionInfo.GetVersionInfo(Path.Combine(GameLocation(), MainExecutable)).ProductVersion;
}
}
public bool IsInstalled => GameLocation() != null;
public string MainExecutable { get; internal set; }
2019-09-29 00:22:25 +00:00
public string GameLocation()
{
return Consts.TestMode ? Directory.GetCurrentDirectory() : StoreHandler.Instance.GetGamePath(Game);
}
2019-09-29 00:22:25 +00:00
}
public class GameNotInstalledException : Exception
{
public GameNotInstalledException(GameMetaData gameMetaData) : base($"Game {gameMetaData.Game} does not appear to be installed.")
{
}
}
public static class EnumExtensions
{
public static string GetDescription<T>(this T enumerationValue)
where T : struct
{
var type = enumerationValue.GetType();
if(!type.IsEnum)
{
throw new ArgumentException($"{nameof(enumerationValue)} must be of Enum type", nameof(enumerationValue));
}
var memberInfo = type.GetMember(enumerationValue.ToString());
if(memberInfo.Length > 0)
{
var attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
if(attrs.Length > 0)
{
return ((DescriptionAttribute)attrs[0]).Description;
}
}
return enumerationValue.ToString();
}
}
2019-09-29 00:22:25 +00:00
public class GameRegistry
{
public static GameMetaData GetByMO2ArchiveName(string gameName)
{
var gamename = gameName.ToLower();
return Games.Values.FirstOrDefault(g => g.MO2ArchiveName?.ToLower() == gamename);
2019-09-29 00:22:25 +00:00
}
public static GameMetaData GetByNexusName(string gameName)
{
return Games.Values.FirstOrDefault(g => g.NexusName == gameName.ToLower());
}
public static GameMetaData GetBySteamID(int id)
{
return Games.Values
.FirstOrDefault(g => g.SteamIDs != null && g.SteamIDs.Count > 0 && g.SteamIDs.Any(i => i == id));
}
2020-02-11 00:30:38 +00:00
/// <summary>
/// Tries to parse game data from an arbitrary string. Tries first via parsing as a game Enum, then by Nexus name,
/// <param nambe="someName"></param>
/// <returns></returns>
public static GameMetaData GetByFuzzyName(string someName)
{
if (Enum.TryParse(typeof(Game), someName, true, out var metadata)) return ((Game)metadata).MetaData();
GameMetaData result = null;
result = GetByNexusName(someName);
if (result != null) return result;
result = GetByMO2ArchiveName(someName);
if (result != null) return result;
return int.TryParse(someName, out int id) ? GetBySteamID(id) : null;
}
public static IReadOnlyDictionary<Game, GameMetaData> Games = new Dictionary<Game, GameMetaData>
2019-09-29 00:22:25 +00:00
{
2019-11-18 19:31:55 +00:00
{
Game.Morrowind, new GameMetaData
{
SupportedModManager = ModManager.MO2,
Game = Game.Morrowind,
Disabled = false,
SteamIDs = new List<int>{22320},
2020-03-25 13:22:55 +00:00
GOGIDs = new List<int>{1440163901, 1435828767},
2019-11-18 19:31:55 +00:00
NexusName = "morrowind",
2020-02-06 21:43:30 +00:00
NexusGameId = 100,
2019-11-18 19:31:55 +00:00
MO2Name = "Morrowind",
MO2ArchiveName = "morrowind",
RequiredFiles = new List<string>
{
"Morrowind.exe"
},
MainExecutable = "Morrowind.exe"
2019-11-18 19:31:55 +00:00
}
},
2019-09-29 00:22:25 +00:00
{
Game.Oblivion, new GameMetaData
{
SupportedModManager = ModManager.MO2,
2019-09-29 00:22:25 +00:00
Game = Game.Oblivion,
NexusName = "oblivion",
2020-02-06 21:43:30 +00:00
NexusGameId = 101,
MO2Name = "Oblivion",
MO2ArchiveName = "oblivion",
2019-11-05 13:10:42 +00:00
GameLocationRegistryKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Bethesda Softworks\Oblivion",
SteamIDs = new List<int> {22330},
2020-01-08 16:25:19 +00:00
GOGIDs = new List<int>{1458058109},
RequiredFiles = new List<string>
{
"oblivion.exe"
},
MainExecutable = "Oblivion.exe"
2019-09-29 00:22:25 +00:00
}
},
{
Game.Fallout3, new GameMetaData
{
SupportedModManager = ModManager.MO2,
2019-09-29 00:22:25 +00:00
Game = Game.Fallout3,
NexusName = "fallout3",
2020-02-06 21:43:30 +00:00
NexusGameId = 120,
2019-09-29 00:22:25 +00:00
MO2Name = "fallout3",
MO2ArchiveName = "fallout3",
2019-11-05 13:10:42 +00:00
GameLocationRegistryKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Bethesda Softworks\Fallout3",
SteamIDs = new List<int> {22300, 22370}, // base game and GotY
RequiredFiles = new List<string>
{
"falloutlauncher.exe",
"data\\fallout3.esm"
},
MainExecutable = "Fallout3.exe"
2019-09-29 00:22:25 +00:00
}
},
{
Game.FalloutNewVegas, new GameMetaData
{
SupportedModManager = ModManager.MO2,
2019-09-29 00:22:25 +00:00
Game = Game.FalloutNewVegas,
NexusName = "newvegas",
2020-02-06 21:43:30 +00:00
NexusGameId = 130,
2019-09-29 00:22:25 +00:00
MO2Name = "New Vegas",
MO2ArchiveName = "falloutnv",
2019-11-05 13:10:42 +00:00
GameLocationRegistryKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Bethesda Softworks\falloutnv",
2020-01-07 10:20:34 +00:00
SteamIDs = new List<int> {22380, 22490}, // normal and RU version
2020-01-08 16:25:19 +00:00
GOGIDs = new List<int>{1454587428},
RequiredFiles = new List<string>
{
"FalloutNV.exe"
},
MainExecutable = "FalloutNV.exe"
2019-09-29 00:22:25 +00:00
}
},
{
Game.Skyrim, new GameMetaData
{
SupportedModManager = ModManager.MO2,
2019-09-29 00:22:25 +00:00
Game = Game.Skyrim,
NexusName = "skyrim",
2020-02-06 21:43:30 +00:00
NexusGameId = 110,
2019-09-29 00:22:25 +00:00
MO2Name = "Skyrim",
MO2ArchiveName = "skyrim",
2019-11-05 13:10:42 +00:00
GameLocationRegistryKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Bethesda Softworks\skyrim",
SteamIDs = new List<int> {72850},
RequiredFiles = new List<string>
{
"tesv.exe"
},
MainExecutable = "TESV.exe",
CommonlyConfusedWith = new [] {Game.SkyrimSpecialEdition, Game.SkyrimVR}
2019-09-29 00:22:25 +00:00
}
},
{
Game.SkyrimSpecialEdition, new GameMetaData
{
SupportedModManager = ModManager.MO2,
2019-09-29 00:22:25 +00:00
Game = Game.SkyrimSpecialEdition,
NexusName = "skyrimspecialedition",
2020-02-06 05:30:31 +00:00
NexusGameId = 1704,
2019-09-29 00:22:25 +00:00
MO2Name = "Skyrim Special Edition",
MO2ArchiveName = "skyrimse",
2019-11-05 13:10:42 +00:00
GameLocationRegistryKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Bethesda Softworks\Skyrim Special Edition",
SteamIDs = new List<int> {489830},
RequiredFiles = new List<string>
{
"SkyrimSE.exe"
},
MainExecutable = "SkyrimSE.exe",
CommonlyConfusedWith = new []{Game.Skyrim, Game.SkyrimVR}
2019-09-29 00:22:25 +00:00
}
},
{
Game.Fallout4, new GameMetaData
{
SupportedModManager = ModManager.MO2,
2019-09-29 00:22:25 +00:00
Game = Game.Fallout4,
NexusName = "fallout4",
2020-02-06 21:43:30 +00:00
NexusGameId = 1151,
2019-09-29 00:22:25 +00:00
MO2Name = "Fallout 4",
MO2ArchiveName = "fallout4",
2019-11-05 13:10:42 +00:00
GameLocationRegistryKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Bethesda Softworks\Fallout4",
SteamIDs = new List<int> {377160},
RequiredFiles = new List<string>
{
"Fallout4.exe"
},
MainExecutable = "Fallout4.exe"
2019-09-29 00:22:25 +00:00
}
},
2019-11-05 13:10:42 +00:00
/*{
Game.Fallout4VR, new GameMetaData
{
SupportedModManager = ModManager.MO2,
Game = Game.Fallout4VR,
NexusName = "fallout4",
MO2Name = "Fallout 4",
MO2ArchiveName = "fallout4",
SteamIDs = new List<int>{611660}
}
},*/
{
Game.SkyrimVR, new GameMetaData
{
SupportedModManager = ModManager.MO2,
Game = Game.SkyrimVR,
NexusName = "skyrimspecialedition",
2020-02-06 21:43:30 +00:00
NexusGameId = 1704,
MO2Name = "Skyrim VR",
MO2ArchiveName = "skyrimse",
2019-11-05 13:10:42 +00:00
GameLocationRegistryKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Bethesda Softworks\Skyrim VR",
SteamIDs = new List<int> {611670},
RequiredFiles = new List<string>
{
"SkyrimVR.exe"
},
MainExecutable = "SkyrimVR.exe",
CommonlyConfusedWith = new []{Game.Skyrim, Game.SkyrimSpecialEdition}
}
},
{
2019-11-05 14:51:52 +00:00
Game.DarkestDungeon, new GameMetaData
{
SupportedModManager = ModManager.Vortex,
Game = Game.DarkestDungeon,
2019-11-05 13:10:42 +00:00
NexusName = "darkestdungeon",
2020-02-06 21:43:30 +00:00
NexusGameId = 804,
SteamIDs = new List<int> {262060},
GOGIDs = new List<int>{1450711444},
RequiredFiles = new List<string>
{
"_windows\\Darkest.exe"
}
}
},
{
Game.DivinityOriginalSin2DE, new GameMetaData
{
SupportedModManager = ModManager.Vortex,
Game = Game.DivinityOriginalSin2DE,
NexusName = "divinityoriginalsin2definitiveedition",
2020-02-06 21:43:30 +00:00
NexusGameId = 2569,
SteamIDs = new List<int> {435150},
GOGIDs = new List<int>{1584823040},
2019-11-09 20:34:44 +00:00
AdditionalFolders = new List<string>
{
"%documents%\\Larian Studios\\Divinity Original Sin 2 Definitive Edition\\Mods\\"
},
RequiredFiles = new List<string>
{
2019-11-17 13:44:32 +00:00
"DefEd\\bin\\SupportTool.exe"
}
}
},
{
Game.DivinityOriginalSin2, new GameMetaData
{
SupportedModManager = ModManager.Vortex,
Game = Game.DivinityOriginalSin2,
NexusName = "divinityoriginalsin2",
2020-02-06 21:43:30 +00:00
NexusGameId = 1661,
SteamIDs = new List<int> {435150},
GOGIDs = new List<int>{1584823040},
AdditionalFolders = new List<string>
{
"%documents%\\Larian Studios\\Divinity Original Sin 2\\Mods\\",
},
RequiredFiles = new List<string>
{
2019-11-17 13:44:32 +00:00
"bin\\SupportTool.exe"
2019-11-09 20:34:44 +00:00
}
}
2019-11-14 18:57:45 +00:00
},
{
Game.Starbound, new GameMetaData
{
SupportedModManager = ModManager.Vortex,
Game = Game.Starbound,
NexusName = "starbound",
2020-02-06 21:43:30 +00:00
NexusGameId = 242,
2019-11-14 18:57:45 +00:00
SteamIDs = new List<int>{211820},
GOGIDs = new List<int>{1452598881},
RequiredFiles = new List<string>
{
"win64\\starbound.exe"
}
2019-11-14 18:57:45 +00:00
}
},
{
Game.SWKOTOR, new GameMetaData
{
SupportedModManager = ModManager.Vortex,
Game = Game.SWKOTOR,
NexusName = "kotor",
2020-02-06 21:43:30 +00:00
NexusGameId = 234,
SteamIDs = new List<int>{32370},
GOGIDs = new List<int>{1207666283},
RequiredFiles = new List<string>
{
"swkotor.exe"
}
}
},
{
Game.SWKOTOR2, new GameMetaData
{
SupportedModManager = ModManager.Vortex,
Game = Game.SWKOTOR2,
NexusName = "kotor2",
2020-02-06 21:43:30 +00:00
NexusGameId = 198,
SteamIDs = new List<int>{208580},
GOGIDs = new List<int>{1421404581},
RequiredFiles = new List<string>
{
"swkotor2.exe"
}
}
2019-11-14 19:11:05 +00:00
},
{
Game.Witcher, new GameMetaData
2019-11-14 19:11:05 +00:00
{
SupportedModManager = ModManager.Vortex,
Game = Game.Witcher,
2019-11-14 19:11:05 +00:00
NexusName = "witcher",
2020-02-06 21:43:30 +00:00
NexusGameId = 150,
2019-11-14 19:11:05 +00:00
SteamIDs = new List<int>{20900},
GOGIDs = new List<int>{1207658924},
RequiredFiles = new List<string>
{
"system\\witcher.exe"
}
2019-11-14 19:11:05 +00:00
}
},
{
Game.Witcher2, new GameMetaData
2019-11-14 19:11:05 +00:00
{
SupportedModManager = ModManager.Vortex,
Game = Game.Witcher2,
2019-11-14 19:11:05 +00:00
NexusName = "witcher2",
2020-02-06 21:43:30 +00:00
NexusGameId = 153,
2019-11-14 19:11:05 +00:00
SteamIDs = new List<int>{20920},
GOGIDs = new List<int>{1207658930},
RequiredFiles = new List<string>
{
"bin\\witcher2.exe",
"bin\\userContentManager.exe"
}
2019-11-14 19:11:05 +00:00
}
},
{
Game.Witcher3, new GameMetaData
2019-11-14 19:11:05 +00:00
{
SupportedModManager = ModManager.Vortex,
Game = Game.Witcher3,
2019-11-14 19:11:05 +00:00
NexusName = "witcher3",
2020-02-06 21:43:30 +00:00
NexusGameId = 952,
2019-11-14 19:11:05 +00:00
SteamIDs = new List<int>{292030, 499450}, // normal and GotY
GOGIDs = new List<int>{1207664643, 1495134320, 1207664663, 1640424747}, // normal, GotY and both in packages
RequiredFiles = new List<string>
{
"bin\\x64\\witcher2.exe"
}
2019-11-14 19:11:05 +00:00
}
},
{
Game.StardewValley, new GameMetaData
{
SupportedModManager = ModManager.Vortex,
Game = Game.StardewValley,
NexusName = "stardewvalley",
2020-02-06 21:43:30 +00:00
NexusGameId = 1303,
SteamIDs = new List<int>{413150},
GOGIDs = new List<int>{1453375253},
RequiredFiles = new List<string>
{
2020-01-04 20:27:28 +00:00
"Stardew Valley.exe"
}
}
2019-09-29 00:22:25 +00:00
}
};
2020-02-11 00:30:38 +00:00
2019-09-29 00:22:25 +00:00
}
}