using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Reflection; using Artemis.Core.JsonConverters; using Artemis.Core.Services; using Artemis.Core.Services.Core; using Artemis.Core.SkiaSharp; using Newtonsoft.Json; namespace Artemis.Core; /// /// A few useful constant values /// public static class Constants { /// /// The Artemis.Core assembly /// public static readonly Assembly CoreAssembly = typeof(Constants).Assembly; /// /// The full path to the Artemis application folder /// public static readonly string ApplicationFolder = Path.GetDirectoryName(typeof(Constants).Assembly.Location)!; /// /// The full path to the Artemis executable /// public static readonly string ExecutablePath = Utilities.GetCurrentLocation(); /// /// The base path for Artemis application data folder /// public static readonly string BaseFolder = Environment.GetFolderPath(OperatingSystem.IsWindows() ? Environment.SpecialFolder.CommonApplicationData : Environment.SpecialFolder.LocalApplicationData); /// /// The full path to the Artemis data folder /// public static readonly string DataFolder = Path.Combine(BaseFolder, "Artemis"); /// /// The full path to the Artemis logs folder /// public static readonly string LogsFolder = Path.Combine(DataFolder, "Logs"); /// /// The full path to the Artemis logs folder /// public static readonly string UpdatingFolder = Path.Combine(DataFolder, "updating"); /// /// The full path to the Artemis plugins folder /// public static readonly string PluginsFolder = Path.Combine(DataFolder, "Plugins"); /// /// The full path to the Artemis user layouts folder /// public static readonly string LayoutsFolder = Path.Combine(DataFolder, "User Layouts"); /// /// The current API version for plugins /// public static readonly int PluginApiVersion = int.Parse(CoreAssembly.GetCustomAttributes().FirstOrDefault(a => a.Key == "PluginApiVersion")?.Value ?? throw new InvalidOperationException("Cannot find PluginApiVersion metadata in assembly")); /// /// The current version of the application /// public static readonly string CurrentVersion = CoreAssembly.GetCustomAttribute()!.InformationalVersion != "1.0.0" ? CoreAssembly.GetCustomAttribute()!.InformationalVersion : "local"; /// /// The plugin info used by core components of Artemis /// public static readonly PluginInfo CorePluginInfo = new() { Guid = Guid.Parse("ffffffff-ffff-ffff-ffff-ffffffffffff"), Name = "Artemis Core", Version = CurrentVersion }; /// /// The plugin used by core components of Artemis /// public static readonly Plugin CorePlugin = new(CorePluginInfo, new DirectoryInfo(ApplicationFolder), null); internal static readonly CorePluginFeature CorePluginFeature = new() {Plugin = CorePlugin, Profiler = CorePlugin.GetProfiler("Feature - Core")}; internal static readonly EffectPlaceholderPlugin EffectPlaceholderPlugin = new() {Plugin = CorePlugin, Profiler = CorePlugin.GetProfiler("Feature - Effect Placeholder")}; internal static JsonSerializerSettings JsonConvertSettings = new() { Converters = new List {new SKColorConverter(), new NumericJsonConverter(), new ForgivingIntConverter()} }; internal static JsonSerializerSettings JsonConvertTypedSettings = new() { TypeNameHandling = TypeNameHandling.All, Converters = new List {new SKColorConverter(), new NumericJsonConverter(), new ForgivingIntConverter()} }; /// /// A read-only collection containing all primitive numeric types /// public static IReadOnlyCollection NumberTypes = new List { typeof(sbyte), typeof(byte), typeof(short), typeof(ushort), typeof(int), typeof(uint), typeof(long), typeof(ulong), typeof(float), typeof(double), typeof(decimal) }; /// /// A read-only collection containing all primitive integral numeric types /// public static IReadOnlyCollection IntegralNumberTypes = new List { typeof(sbyte), typeof(byte), typeof(short), typeof(ushort), typeof(int), typeof(uint), typeof(long), typeof(ulong) }; /// /// A read-only collection containing all primitive floating-point numeric types /// public static IReadOnlyCollection FloatNumberTypes = new List { typeof(float), typeof(double), typeof(decimal) }; /// /// Gets the startup arguments provided to the application /// public static ReadOnlyCollection StartupArguments { get; set; } = null!; /// /// Gets the graphics context to be used for rendering by SkiaSharp. Can be set via /// . /// public static IManagedGraphicsContext? ManagedGraphicsContext { get; internal set; } }