diff options
Diffstat (limited to 'ShiftOS_TheReturn/Shiftorium.cs')
| -rw-r--r-- | ShiftOS_TheReturn/Shiftorium.cs | 355 |
1 files changed, 224 insertions, 131 deletions
diff --git a/ShiftOS_TheReturn/Shiftorium.cs b/ShiftOS_TheReturn/Shiftorium.cs index ad60134..975939f 100644 --- a/ShiftOS_TheReturn/Shiftorium.cs +++ b/ShiftOS_TheReturn/Shiftorium.cs @@ -34,6 +34,9 @@ using System.Diagnostics; namespace ShiftOS.Engine { + /// <summary> + /// Backend class for the Shiftorium. + /// </summary> public static class Shiftorium { /// <summary> @@ -49,11 +52,11 @@ namespace ShiftOS.Engine public static string[] GetCategories(bool onlyAvailable = true) { List<string> cats = new List<string>(); - IEnumerable < ShiftoriumUpgrade > upgrades = GetDefaults(); + IEnumerable<ShiftoriumUpgrade> upgrades = GetDefaults(); if (onlyAvailable) upgrades = new List<ShiftoriumUpgrade>(GetAvailable()); - foreach(var upg in upgrades) + foreach (var upg in upgrades) { if (!cats.Contains(upg.Category)) cats.Add(upg.Category); @@ -62,11 +65,19 @@ namespace ShiftOS.Engine return cats.ToArray(); } + /// <summary> + /// Causes the engine to alert the frontend of a new Shiftorium upgrade install. + /// </summary> public static void InvokeUpgradeInstalled() { Installed?.Invoke(); } + /// <summary> + /// Gets the category of an upgrade. + /// </summary> + /// <param name="id">The upgrade ID to check</param> + /// <returns>"Other" if the upgrade is not found, else, the upgrade category.</returns> public static string GetCategory(string id) { var upg = GetDefaults().FirstOrDefault(x => x.ID == id); @@ -75,19 +86,35 @@ namespace ShiftOS.Engine return (upg.Category == null) ? "Other" : upg.Category; } + /// <summary> + /// Gets all upgrades in a given category. + /// </summary> + /// <param name="cat">The category name to search</param> + /// <returns>The upgrades in the category.</returns> public static IEnumerable<ShiftoriumUpgrade> GetAllInCategory(string cat) { return GetDefaults().Where(x => x.Category == cat); } + /// <summary> + /// Gets whether or not the user has installed all upgrades in a category. + /// </summary> + /// <param name="cat">The category to search.</param> + /// <returns>Boolean value representing whether the user has installed all upgrades in the category.</returns> public static bool IsCategoryEmptied(string cat) { return GetDefaults().Where(x => x.Category == cat).FirstOrDefault(x => x.Installed == false) == null; } - public static bool Buy(string id, long cost) + /// <summary> + /// Buy an upgrade, deducting the specified amount of Codepoints. + /// </summary> + /// <param name="id">The upgrade ID to buy</param> + /// <param name="cost">The amount of Codepoints to deduct</param> + /// <returns>True if the upgrade was installed successfully, false if the user didn't have enough Codepoints or the upgrade wasn' found.</returns> + public static bool Buy(string id, ulong cost) { - if(SaveSystem.CurrentSave.Codepoints >= cost) + if (SaveSystem.CurrentSave.Codepoints >= cost) { SaveSystem.CurrentSave.Upgrades[id] = true; TerminalBackend.InvokeCommand("sos.save"); @@ -99,17 +126,22 @@ namespace ShiftOS.Engine } else { - if(!Silent) + if (!Silent) Console.WriteLine($"{{SHIFTORIUM_NOTENOUGHCP}}: {cost} > {SaveSystem.CurrentSave.Codepoints}"); return false; } } + /// <summary> + /// Determines whether all Shiftorium upgrade attributes for this type have been installed. + /// </summary> + /// <param name="type">The type to scan</param> + /// <returns>Boolean value representing the result of this function.</returns> public static bool UpgradeAttributesUnlocked(Type type) { - foreach(var attr in type.GetCustomAttributes(true)) + foreach (var attr in type.GetCustomAttributes(true)) { - if(attr is RequiresUpgradeAttribute) + if (attr is RequiresUpgradeAttribute) { var rAttr = attr as RequiresUpgradeAttribute; return rAttr.Installed; @@ -119,6 +151,11 @@ namespace ShiftOS.Engine return true; } + /// <summary> + /// Determines whether all Shiftorium upgrade attributes for this method have been installed. + /// </summary> + /// <param name="type">The method to scan</param> + /// <returns>Boolean value representing the result of this function.</returns> public static bool UpgradeAttributesUnlocked(MethodInfo type) { foreach (var attr in type.GetCustomAttributes(true)) @@ -133,6 +170,11 @@ namespace ShiftOS.Engine return true; } + /// <summary> + /// Determines whether all Shiftorium upgrade attributes for this property have been installed. + /// </summary> + /// <param name="type">The property to scan</param> + /// <returns>Boolean value representing the result of this function.</returns> public static bool UpgradeAttributesUnlocked(PropertyInfo type) { foreach (var attr in type.GetCustomAttributes(true)) @@ -147,6 +189,11 @@ namespace ShiftOS.Engine return true; } + /// <summary> + /// Determines whether all Shiftorium upgrade attributes for this field have been installed. + /// </summary> + /// <param name="type">The field to scan</param> + /// <returns>Boolean value representing the result of this function.</returns> public static bool UpgradeAttributesUnlocked(FieldInfo type) { foreach (var attr in type.GetCustomAttributes(true)) @@ -161,15 +208,140 @@ namespace ShiftOS.Engine return true; } + private static List<ShiftoriumUpgrade> upgDb = null; + + public static void CreateUpgradeDatabase() + { + upgDb = new List<ShiftoriumUpgrade>(); + //Now we probe for ShiftoriumUpgradeAttributes for mods. + foreach (var file in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) + { + if (file.EndsWith(".exe") || file.EndsWith(".dll")) + { + try + { + var asm = Assembly.LoadFile(file); + foreach (var type in asm.GetTypes()) + { + if (type.GetInterfaces().Contains(typeof(IShiftoriumProvider))) + { + if (type.GetCustomAttributes().FirstOrDefault(x => x is ShiftoriumProviderAttribute) != null) + { + var _p = Activator.CreateInstance(type, null) as IShiftoriumProvider; + upgDb.AddRange(_p.GetDefaults()); + } + } + + + ShiftoriumUpgradeAttribute attrib = type.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftoriumUpgradeAttribute) as ShiftoriumUpgradeAttribute; + if (attrib != null) + { + if (upgDb.FirstOrDefault(x => x.ID == attrib.Upgrade) != null) + throw new ShiftoriumConflictException(attrib.Upgrade); + upgDb.Add(new ShiftoriumUpgrade + { + Id = attrib.Upgrade, + Name = attrib.Name, + Cost = attrib.Cost, + Description = attrib.Description, + Dependencies = attrib.Dependencies, + Category = attrib.Category + }); + } + + foreach (var mth in type.GetMethods()) + { + attrib = mth.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftoriumUpgradeAttribute) as ShiftoriumUpgradeAttribute; + if (attrib != null) + { + if (upgDb.FirstOrDefault(x => x.ID == attrib.Upgrade) != null) + throw new ShiftoriumConflictException(attrib.Upgrade); + upgDb.Add(new ShiftoriumUpgrade + { + Id = attrib.Upgrade, + Name = attrib.Name, + Cost = attrib.Cost, + Description = attrib.Description, + Dependencies = attrib.Dependencies, + Category = attrib.Category + }); + + } + } + + foreach (var mth in type.GetFields()) + { + attrib = mth.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftoriumUpgradeAttribute) as ShiftoriumUpgradeAttribute; + if (attrib != null) + { + if (upgDb.FirstOrDefault(x => x.ID == attrib.Upgrade) != null) + throw new ShiftoriumConflictException(attrib.Upgrade); + upgDb.Add(new ShiftoriumUpgrade + { + Id = attrib.Upgrade, + Name = attrib.Name, + Cost = attrib.Cost, + Description = attrib.Description, + Dependencies = attrib.Dependencies, + Category = attrib.Category + }); + + } + } + + foreach (var mth in type.GetProperties()) + { + attrib = mth.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftoriumUpgradeAttribute) as ShiftoriumUpgradeAttribute; + if (attrib != null) + { + if (upgDb.FirstOrDefault(x => x.ID == attrib.Upgrade) != null) + throw new ShiftoriumConflictException(attrib.Upgrade); + upgDb.Add(new ShiftoriumUpgrade + { + Id = attrib.Upgrade, + Name = attrib.Name, + Cost = attrib.Cost, + Description = attrib.Description, + Dependencies = attrib.Dependencies, + Category = attrib.Category + }); + + } + } + + } + } + catch { } + } + } + + + + foreach (var item in upgDb) + { + if (upgDb.Where(x => x.ID == item.ID).Count() > 1) + throw new ShiftoriumConflictException(item.Id); + } + } + + + /// <summary> + /// Gets or sets whether the Shiftorium has been initiated. + /// </summary> public static bool IsInitiated { get; private set; } + + /// <summary> + /// Initiates the Shiftorium. + /// </summary> public static void Init() { if (IsInitiated == false) { IsInitiated = true; //Let the crash handler deal with this one... - var dict = GetDefaults(); + CreateUpgradeDatabase(); + var dict = upgDb; foreach (var itm in dict) { if (!SaveSystem.CurrentSave.Upgrades.ContainsKey(itm.ID)) @@ -188,9 +360,14 @@ namespace ShiftOS.Engine } - public static long GetCPValue(string id) + /// <summary> + /// Get the codepoint value for an upgrade. + /// </summary> + /// <param name="id">The upgrade ID to search</param> + /// <returns>The codepoint value.</returns> + public static ulong GetCPValue(string id) { - foreach(var upg in GetDefaults()) + foreach (var upg in GetDefaults()) { if (upg.ID == id) return upg.Cost; @@ -198,10 +375,14 @@ namespace ShiftOS.Engine return 0; } + /// <summary> + /// Gets all available upgrades. + /// </summary> + /// <returns></returns> public static ShiftoriumUpgrade[] GetAvailable() { List<ShiftoriumUpgrade> available = new List<ShiftoriumUpgrade>(); - foreach(var defaultupg in GetDefaults()) + foreach (var defaultupg in GetDefaults()) { if (!UpgradeInstalled(defaultupg.ID) && DependenciesInstalled(defaultupg)) available.Add(defaultupg); @@ -209,6 +390,11 @@ namespace ShiftOS.Engine return available.ToArray(); } + /// <summary> + /// Determines whether all dependencies of a given upgrade have been installed. + /// </summary> + /// <param name="upg">The upgrade to scan</param> + /// <returns>Boolean representing the result of this function.</returns> public static bool DependenciesInstalled(ShiftoriumUpgrade upg) { if (string.IsNullOrEmpty(upg.Dependencies)) @@ -218,23 +404,33 @@ namespace ShiftOS.Engine else if (upg.Dependencies.Contains(";")) { string[] dependencies = upg.Dependencies.Split(';'); - foreach(var dependency in dependencies) + foreach (var dependency in dependencies) { if (!UpgradeInstalled(dependency)) return false; } return true; - } + } else { return UpgradeInstalled(upg.Dependencies); } } + /// <summary> + /// Fired when an upgrade is installed. + /// </summary> public static event EmptyEventHandler Installed; + /// <summary> + /// Determines if an upgrade is installed. + /// </summary> + /// <param name="id">The upgrade ID to scan.</param> + /// <returns>Whether the upgrade is installed.</returns> public static bool UpgradeInstalled(string id) { + if (string.IsNullOrWhiteSpace(id)) + return true; if (SaveSystem.CurrentSave != null) { if (!IsInitiated) @@ -250,7 +446,7 @@ namespace ShiftOS.Engine if (id.Contains(';')) { - foreach(var u in id.Split(';')) + foreach (var u in id.Split(';')) { if (UpgradeInstalled(u) == false) return false; @@ -259,10 +455,10 @@ namespace ShiftOS.Engine } bool upgInstalled = false; - if(SaveSystem.CurrentSave.Upgrades.ContainsKey(id)) + if (SaveSystem.CurrentSave.Upgrades.ContainsKey(id)) upgInstalled = SaveSystem.CurrentSave.Upgrades[id]; - if(upgInstalled == false) + if (upgInstalled == false) return SaveSystem.CurrentSave.StoriesExperienced.Contains(id); return true; } @@ -286,125 +482,22 @@ namespace ShiftOS.Engine _provider = p; } - //Bless the newer NEWER engine. + /// <summary> + /// Gets every upgrade inside the frontend and all mods. + /// </summary> + /// <returns>Every single found Shiftorium upgrade.</returns> public static List<ShiftoriumUpgrade> GetDefaults() { - List<ShiftoriumUpgrade> list = new List<ShiftoriumUpgrade>(); - //Now we probe for ShiftoriumUpgradeAttributes for mods. - foreach(var file in System.IO.Directory.GetFiles(Environment.CurrentDirectory)) - { - if(file.EndsWith(".exe") || file.EndsWith(".dll")) - { - try - { - var asm = Assembly.LoadFile(file); - foreach (var type in asm.GetTypes()) - { - if (type.GetInterfaces().Contains(typeof(IShiftoriumProvider))) - { - if(type.GetCustomAttributes().FirstOrDefault(x=> x is ShiftoriumProviderAttribute) != null) - { - var _p = Activator.CreateInstance(type, null) as IShiftoriumProvider; - list.AddRange(_p.GetDefaults()); - } - } - - - ShiftoriumUpgradeAttribute attrib = type.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftoriumUpgradeAttribute) as ShiftoriumUpgradeAttribute; - if (attrib != null) - { - if (list.FirstOrDefault(x => x.ID == attrib.Upgrade) != null) - throw new ShiftoriumConflictException(attrib.Upgrade); - list.Add(new ShiftoriumUpgrade - { - Id = attrib.Upgrade, - Name = attrib.Name, - Cost = attrib.Cost, - Description = attrib.Description, - Dependencies = attrib.Dependencies, - Category = attrib.Category - }); - } - - foreach (var mth in type.GetMethods()) - { - attrib = mth.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftoriumUpgradeAttribute) as ShiftoriumUpgradeAttribute; - if (attrib != null) - { - if (list.FirstOrDefault(x => x.ID == attrib.Upgrade) != null) - throw new ShiftoriumConflictException(attrib.Upgrade); - list.Add(new ShiftoriumUpgrade - { - Id = attrib.Upgrade, - Name = attrib.Name, - Cost = attrib.Cost, - Description = attrib.Description, - Dependencies = attrib.Dependencies, - Category = attrib.Category - }); - - } - } - - foreach (var mth in type.GetFields()) - { - attrib = mth.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftoriumUpgradeAttribute) as ShiftoriumUpgradeAttribute; - if (attrib != null) - { - if (list.FirstOrDefault(x => x.ID == attrib.Upgrade) != null) - throw new ShiftoriumConflictException(attrib.Upgrade); - list.Add(new ShiftoriumUpgrade - { - Id = attrib.Upgrade, - Name = attrib.Name, - Cost = attrib.Cost, - Description = attrib.Description, - Dependencies = attrib.Dependencies, - Category = attrib.Category - }); - - } - } - - foreach (var mth in type.GetProperties()) - { - attrib = mth.GetCustomAttributes(false).FirstOrDefault(x => x is ShiftoriumUpgradeAttribute) as ShiftoriumUpgradeAttribute; - if (attrib != null) - { - if (list.FirstOrDefault(x => x.ID == attrib.Upgrade) != null) - throw new ShiftoriumConflictException(attrib.Upgrade); - list.Add(new ShiftoriumUpgrade - { - Id = attrib.Upgrade, - Name = attrib.Name, - Cost = attrib.Cost, - Description = attrib.Description, - Dependencies = attrib.Dependencies, - Category = attrib.Category - }); - - } - } - - } - } - catch { } - } - } - - - - foreach(var item in list) - { - if (list.Where(x => x.ID == item.ID).Count() > 1) - throw new ShiftoriumConflictException(item.Id); - } - return list; + return upgDb; } } public interface IShiftoriumProvider { + /// <summary> + /// Retrieves all frontend upgrades. + /// </summary> + /// <returns></returns> List<ShiftoriumUpgrade> GetDefaults(); } @@ -427,7 +520,7 @@ namespace ShiftOS.Engine { public string Name { get; set; } public string Description { get; set; } - public long Cost { get; set; } + public ulong Cost { get; set; } public string ID { get { return (this.Id != null ? this.Id : (Name.ToLower().Replace(" ", "_"))); } } public string Id { get; set; } public string Category { get; set; } @@ -443,7 +536,7 @@ namespace ShiftOS.Engine public class ShiftoriumUpgradeAttribute : RequiresUpgradeAttribute { - public ShiftoriumUpgradeAttribute(string name, long cost, string desc, string dependencies, string category) : base(name.ToLower().Replace(" ", "_")) + public ShiftoriumUpgradeAttribute(string name, ulong cost, string desc, string dependencies, string category) : base(name.ToLower().Replace(" ", "_")) { Name = name; Description = desc; @@ -454,7 +547,7 @@ namespace ShiftOS.Engine public string Name { get; private set; } public string Description { get; private set; } - public long Cost { get; private set; } + public ulong Cost { get; private set; } public string Dependencies { get; private set; } public string Category { get; private set; } } |
