diff --git a/NewHorizons/Builder/General/SectorBuilder.cs b/NewHorizons/Builder/General/SectorBuilder.cs index a1853415..467ed91f 100644 --- a/NewHorizons/Builder/General/SectorBuilder.cs +++ b/NewHorizons/Builder/General/SectorBuilder.cs @@ -1,17 +1,20 @@ +using OWML.Utils; using System.Collections.Generic; using UnityEngine; namespace NewHorizons.Builder.General { public static class SectorBuilder { + private static readonly Sector.Name Name = EnumUtils.Create("NewHorizons"); + public static Sector Make(GameObject planetBody, OWRigidbody owRigidBody, float sphereOfInfluence) { - GameObject sectorGO = new GameObject("Sector"); + var sectorGO = new GameObject("Sector"); sectorGO.SetActive(false); sectorGO.transform.parent = planetBody.transform; sectorGO.transform.localPosition = Vector3.zero; - SphereShape SS = sectorGO.AddComponent(); + var SS = sectorGO.AddComponent(); SS.SetCollisionMode(Shape.CollisionMode.Volume); SS.SetLayer(Shape.Layer.Sector); SS.layerMask = -1; @@ -21,8 +24,8 @@ namespace NewHorizons.Builder.General sectorGO.AddComponent(); - Sector S = sectorGO.AddComponent(); - S._name = (Sector.Name)24; + var S = sectorGO.AddComponent(); + S._name = Name; S._attachedOWRigidbody = owRigidBody; S._subsectors = new List(); @@ -36,12 +39,12 @@ namespace NewHorizons.Builder.General { if (parent == null) return null; - GameObject sectorGO = new GameObject("Sector"); + var sectorGO = new GameObject("Sector"); sectorGO.SetActive(false); sectorGO.transform.parent = planetBody.transform; sectorGO.transform.localPosition = Vector3.zero; - Sector S = sectorGO.AddComponent(); + var S = sectorGO.AddComponent(); S._idString = parent._idString; S._name = parent._name; S._attachedOWRigidbody = owRigidBody; diff --git a/NewHorizons/Builder/Props/NomaiTextBuilder.cs b/NewHorizons/Builder/Props/NomaiTextBuilder.cs index 84f15073..6851e2b3 100644 --- a/NewHorizons/Builder/Props/NomaiTextBuilder.cs +++ b/NewHorizons/Builder/Props/NomaiTextBuilder.cs @@ -10,6 +10,8 @@ using UnityEngine; using Enum = System.Enum; using Logger = NewHorizons.Utility.Logger; using Random = UnityEngine.Random; +using OWML.Utils; + namespace NewHorizons.Builder.Props { public static class NomaiTextBuilder @@ -281,7 +283,7 @@ namespace NewHorizons.Builder.Props var computer = computerObject.GetComponent(); computer.SetSector(sector); - computer._location = (NomaiText.Location)Enum.Parse(typeof(NomaiText.Location), Enum.GetName(typeof(PropModule.NomaiTextInfo.NomaiTextLocation), info.location)); + computer._location = EnumUtils.Parse(info.location.ToString()); computer._dictNomaiTextData = MakeNomaiTextDict(xmlPath); computer._nomaiTextAsset = new TextAsset(xmlPath); computer._nomaiTextAsset.name = Path.GetFileNameWithoutExtension(info.xmlFile); @@ -329,7 +331,7 @@ namespace NewHorizons.Builder.Props var computer = computerObject.GetComponent(); computer.SetSector(sector); - computer._location = (NomaiText.Location)Enum.Parse(typeof(NomaiText.Location), Enum.GetName(typeof(PropModule.NomaiTextInfo.NomaiTextLocation), info.location)); + computer._location = EnumUtils.Parse(info.location.ToString()); computer._dictNomaiTextData = MakeNomaiTextDict(xmlPath); computer._nomaiTextAsset = new TextAsset(xmlPath); computer._nomaiTextAsset.name = Path.GetFileNameWithoutExtension(info.xmlFile); @@ -418,7 +420,7 @@ namespace NewHorizons.Builder.Props var nomaiWallText = cairnObject.transform.Find("Props_TH_ClutterSmall/Arc_Short").GetComponent(); nomaiWallText.SetSector(sector); - nomaiWallText._location = (NomaiText.Location)Enum.Parse(typeof(NomaiText.Location), Enum.GetName(typeof(PropModule.NomaiTextInfo.NomaiTextLocation), info.location)); + nomaiWallText._location = EnumUtils.Parse(info.location.ToString()); nomaiWallText._dictNomaiTextData = MakeNomaiTextDict(xmlPath); nomaiWallText._nomaiTextAsset = new TextAsset(xmlPath); nomaiWallText._nomaiTextAsset.name = Path.GetFileNameWithoutExtension(info.xmlFile); @@ -458,7 +460,7 @@ namespace NewHorizons.Builder.Props var nomaiText = recorderObject.GetComponentInChildren(); nomaiText.SetSector(sector); - nomaiText._location = (NomaiText.Location)Enum.Parse(typeof(NomaiText.Location), Enum.GetName(typeof(PropModule.NomaiTextInfo.NomaiTextLocation), info.location)); + nomaiText._location = EnumUtils.Parse(info.location.ToString()); nomaiText._dictNomaiTextData = MakeNomaiTextDict(xmlPath); nomaiText._nomaiTextAsset = new TextAsset(xmlPath); nomaiText._nomaiTextAsset.name = Path.GetFileNameWithoutExtension(info.xmlFile); @@ -520,7 +522,7 @@ namespace NewHorizons.Builder.Props var nomaiWallText = trailmarkerObject.transform.Find("Arc_Short").GetComponent(); nomaiWallText.SetSector(sector); - nomaiWallText._location = (NomaiText.Location)Enum.Parse(typeof(NomaiText.Location), Enum.GetName(typeof(PropModule.NomaiTextInfo.NomaiTextLocation), info.location)); + nomaiWallText._location = EnumUtils.Parse(info.location.ToString()); nomaiWallText._dictNomaiTextData = MakeNomaiTextDict(xmlPath); nomaiWallText._nomaiTextAsset = new TextAsset(xmlPath); nomaiWallText._nomaiTextAsset.name = Path.GetFileNameWithoutExtension(info.xmlFile); @@ -553,7 +555,7 @@ namespace NewHorizons.Builder.Props var nomaiWallText = nomaiWallTextObj.AddComponent(); - nomaiWallText._location = (NomaiText.Location)Enum.Parse(typeof(NomaiText.Location), Enum.GetName(typeof(PropModule.NomaiTextInfo.NomaiTextLocation), info.location)); + nomaiWallText._location = EnumUtils.Parse(info.location.ToString()); var text = new TextAsset(xmlPath); diff --git a/NewHorizons/Builder/Props/SignalBuilder.cs b/NewHorizons/Builder/Props/SignalBuilder.cs index 86d0e391..03f0774e 100644 --- a/NewHorizons/Builder/Props/SignalBuilder.cs +++ b/NewHorizons/Builder/Props/SignalBuilder.cs @@ -7,6 +7,8 @@ using System; using System.Collections.Generic; using UnityEngine; using Logger = NewHorizons.Utility.Logger; +using OWML.Utils; + namespace NewHorizons.Builder.Props { public static class SignalBuilder @@ -14,11 +16,8 @@ namespace NewHorizons.Builder.Props private static AnimationCurve _customCurve = null; private static Dictionary _customSignalNames; - private static Stack _availableSignalNames; - private static int _nextCustomSignalName; private static Dictionary _customFrequencyNames; - private static int _nextCustomFrequencyName; public static int NumberOfFrequencies; @@ -31,51 +30,12 @@ namespace NewHorizons.Builder.Props { Logger.LogVerbose($"Initializing SignalBuilder"); _customSignalNames = new Dictionary(); - _availableSignalNames = new Stack(new SignalName[] - { - (SignalName)17, - (SignalName)18, - (SignalName)19, - (SignalName)26, - (SignalName)27, - (SignalName)28, - (SignalName)29, - (SignalName)33, - (SignalName)34, - (SignalName)35, - (SignalName)36, - (SignalName)37, - (SignalName)38, - (SignalName)39, - (SignalName)50, - (SignalName)51, - (SignalName)52, - (SignalName)53, - (SignalName)54, - (SignalName)55, - (SignalName)56, - (SignalName)57, - (SignalName)58, - (SignalName)59, - SignalName.WhiteHole_WH, - SignalName.WhiteHole_SS_Receiver, - SignalName.WhiteHole_CT_Receiver, - SignalName.WhiteHole_CT_Experiment, - SignalName.WhiteHole_TT_Receiver, - SignalName.WhiteHole_TT_TimeLoopCore, - SignalName.WhiteHole_TH_Receiver, - SignalName.WhiteHole_BH_NorthPoleReceiver, - SignalName.WhiteHole_BH_ForgeReceiver, - SignalName.WhiteHole_GD_Receiver, - }); _customFrequencyNames = new Dictionary() { { SignalFrequency.Statue, "FREQ_STATUE" }, { SignalFrequency.Default, "FREQ_UNKNOWN" }, { SignalFrequency.WarpCore, "FREQ_WARP_CORE" } }; - _nextCustomSignalName = 200; - _nextCustomFrequencyName = 256; - NumberOfFrequencies = 8; + NumberOfFrequencies = EnumUtils.GetValues().Length; _qmSignals = new List() { SignalName.Quantum_QM }; _cloakedSignals = new List(); @@ -95,6 +55,9 @@ namespace NewHorizons.Builder.Props public static SignalFrequency AddFrequency(string str) { + var freq = CollectionUtilities.KeyByValue(_customFrequencyNames, str); + if (freq != default) return freq; + Logger.Log($"Registering new frequency name [{str}]"); if (NumberOfFrequencies == 31) @@ -103,17 +66,10 @@ namespace NewHorizons.Builder.Props return SignalFrequency.Default; } - var freq = CollectionUtilities.KeyByValue(_customFrequencyNames, str); - if (freq != default) - { - return freq; - } - - freq = (SignalFrequency)_nextCustomFrequencyName; - _nextCustomFrequencyName *= 2; + freq = EnumUtilities.Create(str); _customFrequencyNames.Add(freq, str); - NumberOfFrequencies++; + NumberOfFrequencies = EnumUtils.GetValues().Length; // This stuff happens after the signalscope is Awake so we have to change the number of frequencies now GameObject.FindObjectOfType()._strongestSignals = new AudioSignal[NumberOfFrequencies + 1]; @@ -129,14 +85,15 @@ namespace NewHorizons.Builder.Props public static SignalName AddSignalName(string str) { + var name = CollectionUtilities.KeyByValue(_customSignalNames, str); + if (name != default) return name; + Logger.Log($"Registering new signal name [{str}]"); - SignalName newName; - if (_availableSignalNames.Count == 0) newName = (SignalName)_nextCustomSignalName++; - else newName = _availableSignalNames.Pop(); + name = EnumUtilities.Create(str); + _customSignalNames.Add(name, str); - _customSignalNames.Add(newName, str); - return newName; + return name; } public static string GetCustomSignalName(SignalName signalName) @@ -238,27 +195,12 @@ namespace NewHorizons.Builder.Props private static SignalFrequency StringToFrequency(string str) { - foreach (SignalFrequency freq in Enum.GetValues(typeof(SignalFrequency))) - { - if (str.Equals(freq.ToString())) return freq; - } - var customName = CollectionUtilities.KeyByValue(_customFrequencyNames, str); - - if (customName == default) customName = AddFrequency(str); - - return customName; + return EnumUtils.TryParse(str, out SignalFrequency frequency) ? frequency : AddFrequency(str); } public static SignalName StringToSignalName(string str) { - foreach (SignalName name in Enum.GetValues(typeof(SignalName))) - { - if (str.Equals(name.ToString())) return name; - } - var customName = CollectionUtilities.KeyByValue(_customSignalNames, str); - if (customName == default) customName = AddSignalName(str); - - return customName; + return EnumUtils.TryParse(str, out SignalName name) ? name : AddSignalName(str); } } } diff --git a/NewHorizons/Builder/ShipLog/RumorModeBuilder.cs b/NewHorizons/Builder/ShipLog/RumorModeBuilder.cs index 740731ec..0543b0ae 100644 --- a/NewHorizons/Builder/ShipLog/RumorModeBuilder.cs +++ b/NewHorizons/Builder/ShipLog/RumorModeBuilder.cs @@ -2,6 +2,7 @@ using NewHorizons.External.Configs; using NewHorizons.External.Modules; using NewHorizons.Handlers; using NewHorizons.Utility; +using OWML.Utils; using System; using System.Collections.Generic; using System.IO; @@ -14,14 +15,12 @@ namespace NewHorizons.Builder.ShipLog { private static Dictionary _curiosityColors; private static Dictionary _curiosityHighlightColors; - private static Dictionary _rawNameToCuriosityName; private static Dictionary _entryIdToRawName; public static void Init() { _curiosityColors = new Dictionary(); _curiosityHighlightColors = new Dictionary(); - _rawNameToCuriosityName = new Dictionary(); _entryIdToRawName = new Dictionary(); } @@ -29,10 +28,9 @@ namespace NewHorizons.Builder.ShipLog { foreach (ShipLogModule.CuriosityColorInfo newColor in newColors) { - if (_rawNameToCuriosityName.ContainsKey(newColor.id) == false) + if (!EnumUtils.IsDefined(newColor.id)) { - CuriosityName newName = (CuriosityName)8 + _rawNameToCuriosityName.Count; - _rawNameToCuriosityName.Add(newColor.id, newName); + CuriosityName newName = EnumUtilities.Create(newColor.id); _curiosityColors.Add(newName, newColor.color.ToColor()); _curiosityHighlightColors.Add(newName, newColor.highlightColor.ToColor()); } @@ -193,9 +191,9 @@ namespace NewHorizons.Builder.ShipLog if (_entryIdToRawName.ContainsKey(entry._id)) { var raw = _entryIdToRawName[entry._id]; - if (_rawNameToCuriosityName.ContainsKey(raw)) + if (EnumUtils.TryParse(raw, out CuriosityName name)) { - entry._curiosity = _rawNameToCuriosityName[raw]; + entry._curiosity = name; } else { diff --git a/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs b/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs index c85f2e74..94af4dfa 100644 --- a/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs @@ -1,6 +1,7 @@ using NewHorizons.External.Modules; using NewHorizons.Utility; using OWML.Common; +using OWML.Utils; using System; using System.Collections.Generic; using System.Linq; @@ -47,7 +48,7 @@ namespace NewHorizons.Builder.Volumes owAudioSource._audioSource = audioSource; owAudioSource.loop = info.loop; owAudioSource.SetMaxVolume(info.volume); - owAudioSource.SetTrack((OWAudioMixer.TrackName)Enum.Parse(typeof(OWAudioMixer.TrackName), Enum.GetName(typeof(AudioMixerTrackName), info.track))); + owAudioSource.SetTrack(EnumUtils.Parse(info.track.ToString())); AudioUtilities.SetAudioClip(owAudioSource, info.audio, mod); var audioVolume = go.AddComponent(); diff --git a/NewHorizons/Handlers/AudioTypeHandler.cs b/NewHorizons/Handlers/AudioTypeHandler.cs index 70878ae3..ee12465a 100644 --- a/NewHorizons/Handlers/AudioTypeHandler.cs +++ b/NewHorizons/Handlers/AudioTypeHandler.cs @@ -1,5 +1,6 @@ using NewHorizons.Utility; using OWML.Common; +using OWML.Utils; using System; using System.Collections.Generic; using System.IO; @@ -13,7 +14,6 @@ namespace NewHorizons.Handlers { private static Dictionary _customAudioTypes; private static List _audioEntries; - private static int _startingInt = 4000; public static void Init() { @@ -48,7 +48,7 @@ namespace NewHorizons.Handlers } else { - return (AudioType)Enum.Parse(typeof(AudioType), audio); + return EnumUtils.Parse(audio); } } catch (Exception e) @@ -80,9 +80,9 @@ namespace NewHorizons.Handlers // Create a custom audio type from a set of audio clips. Needs a unique ID public static AudioType AddCustomAudioType(string id, AudioClip[] audioClips) { - var audioType = (AudioType)_startingInt + _customAudioTypes.Count(); + Logger.LogVerbose($"Registering new audio type [{id}]"); - Logger.LogVerbose($"Registering custom audio type {id} as {audioType}"); + var audioType = EnumUtilities.Create(id); _audioEntries.Add(new AudioLibrary.AudioEntry(audioType, audioClips)); _customAudioTypes.Add(id, audioType); diff --git a/NewHorizons/Handlers/RemoteHandler.cs b/NewHorizons/Handlers/RemoteHandler.cs index 1d7a647a..a012074f 100644 --- a/NewHorizons/Handlers/RemoteHandler.cs +++ b/NewHorizons/Handlers/RemoteHandler.cs @@ -1,5 +1,6 @@ using NewHorizons.Utility; using OWML.Common; +using OWML.Utils; using System; using System.Collections.Generic; using System.Linq; @@ -11,7 +12,6 @@ namespace NewHorizons.Handlers public static class RemoteHandler { private static Dictionary _customPlatformIDs; - private static readonly int _startingInt = 19; public static void Init() { @@ -41,7 +41,7 @@ namespace NewHorizons.Handlers try { NomaiRemoteCameraPlatform.ID platformID; - if (_customPlatformIDs.TryGetValue(id, out platformID) || Enum.TryParse(id, true, out platformID)) + if (_customPlatformIDs.TryGetValue(id, out platformID) || EnumUtils.TryParse(id, out platformID)) { return platformID; } @@ -52,16 +52,16 @@ namespace NewHorizons.Handlers } catch (Exception e) { - Logger.LogError($"Couldn't load platform id:\n{e}"); + Logger.LogError($"Couldn't load platform id [{id}]:\n{e}"); return NomaiRemoteCameraPlatform.ID.None; } } public static NomaiRemoteCameraPlatform.ID AddCustomPlatformID(string id) { - var platformID = (NomaiRemoteCameraPlatform.ID)_startingInt + _customPlatformIDs.Count(); + Logger.LogVerbose($"Registering new platform id [{id}]"); - Logger.LogVerbose($"Registering custom platform id {id} as {platformID}"); + var platformID = EnumUtilities.Create(id); _customPlatformIDs.Add(id, platformID); diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index afa0b702..6d1c9562 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -17,6 +17,7 @@ using NewHorizons.Utility.DebugMenu; using NewHorizons.Utility.DebugUtilities; using OWML.Common; using OWML.ModHelper; +using OWML.Utils; using System; using System.Collections.Generic; using System.IO; @@ -241,6 +242,7 @@ namespace NewHorizons ImageUtilities.ClearCache(); AudioUtilities.ClearCache(); AssetBundleUtilities.ClearCache(); + EnumUtilities.ClearCache(); IsSystemReady = false; } @@ -611,7 +613,7 @@ namespace NewHorizons private void LoadTranslations(string folder, IModBehaviour mod) { var foundFile = false; - foreach (TextTranslation.Language language in Enum.GetValues(typeof(TextTranslation.Language))) + foreach (TextTranslation.Language language in EnumUtils.GetValues()) { if (language is TextTranslation.Language.UNKNOWN or TextTranslation.Language.TOTAL) continue; diff --git a/NewHorizons/NewHorizons.csproj b/NewHorizons/NewHorizons.csproj index d231d709..95916ac6 100644 --- a/NewHorizons/NewHorizons.csproj +++ b/NewHorizons/NewHorizons.csproj @@ -1,4 +1,4 @@ - + net48 default diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index 75424b21..ddfb16c5 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -34,12 +34,6 @@ "description": "Add bramble nodes to this planet and/or make this planet a bramble dimension", "$ref": "#/definitions/BrambleModule" }, - "buildPriority": { - "type": "integer", - "description": "Set to a higher number if you wish for this body to be built sooner", - "format": "int32", - "default": -1 - }, "canShowOnTitle": { "type": "boolean", "description": "Should this planet ever be shown on the title screen?", diff --git a/NewHorizons/Utility/AudioUtilities.cs b/NewHorizons/Utility/AudioUtilities.cs index 4a6801b7..5db65386 100644 --- a/NewHorizons/Utility/AudioUtilities.cs +++ b/NewHorizons/Utility/AudioUtilities.cs @@ -1,4 +1,5 @@ using OWML.Common; +using OWML.Utils; using System; using System.Collections.Generic; using System.IO; @@ -34,12 +35,11 @@ namespace NewHorizons.Utility } } - try + if (EnumUtils.TryParse(audio, out AudioType type)) { - var audioType = (AudioType)Enum.Parse(typeof(AudioType), audio); - source._audioLibraryClip = audioType; + source._audioLibraryClip = type; } - catch + else { var audioClip = SearchUtilities.FindResourceOfTypeAndName(audio); if (audioClip == null) Logger.Log($"Couldn't find audio clip {audio}"); diff --git a/NewHorizons/Utility/EnumUtilities.cs b/NewHorizons/Utility/EnumUtilities.cs new file mode 100644 index 00000000..fa202c19 --- /dev/null +++ b/NewHorizons/Utility/EnumUtilities.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using OWML.Utils; + +namespace NewHorizons.Utility +{ + public static class EnumUtilities + { + private static List Enums = new List(); + + public static void ClearCache() + { + foreach (var @enum in Enums) + { + if (@enum == null) continue; + EnumUtils.Remove(@enum.GetType(), @enum); + } + Enums.Clear(); + } + + public static T Create(string name) where T : Enum + { + T @enum = EnumUtils.Create(name); + Enums.SafeAdd(@enum); + return @enum; + } + + public static void Create(string name, T value) where T : Enum + { + EnumUtils.Create(name, value); + Enums.SafeAdd(value); + } + + public static void Remove(string name) where T : Enum + { + T @enum = EnumUtils.Parse(name); + Enums.Remove(@enum); + EnumUtils.Remove(name); + } + + public static void Remove(T value) where T : Enum + { + Enums.Remove(value); + EnumUtils.Remove(value); + } + } +} diff --git a/NewHorizons/Utility/NewHorizonExtensions.cs b/NewHorizons/Utility/NewHorizonExtensions.cs index 389975be..5817bdd6 100644 --- a/NewHorizons/Utility/NewHorizonExtensions.cs +++ b/NewHorizons/Utility/NewHorizonExtensions.cs @@ -1,6 +1,7 @@ using NewHorizons.External.Configs; using NewHorizons.External.Modules; using Newtonsoft.Json; +using OWML.Utils; using System; using System.Collections.Generic; using System.IO; @@ -217,17 +218,6 @@ namespace NewHorizons.Utility return xCorrect && yCorrect && zCorrect; } - public static FluidVolume.Type ConvertToOW(this FluidType fluidType, FluidVolume.Type @default = FluidVolume.Type.NONE) - { - try - { - return (FluidVolume.Type)Enum.Parse(typeof(FluidVolume.Type), Enum.GetName(typeof(FluidType), fluidType).ToUpper()); - } - catch (Exception ex) - { - Logger.LogError($"Couldn't parse fluid volume type [{fluidType}]:\n{ex}"); - return @default; - } - } + public static FluidVolume.Type ConvertToOW(this FluidType fluidType, FluidVolume.Type @default = FluidVolume.Type.NONE) => EnumUtils.Parse(fluidType.ToString().ToUpper(), @default); } }