diff --git a/NewHorizons/Builder/Props/Audio/SignalBuilder.cs b/NewHorizons/Builder/Props/Audio/SignalBuilder.cs index 2fb84fd5..a5e74626 100644 --- a/NewHorizons/Builder/Props/Audio/SignalBuilder.cs +++ b/NewHorizons/Builder/Props/Audio/SignalBuilder.cs @@ -1,14 +1,13 @@ -using NewHorizons.External.Modules; +using HarmonyLib; +using NewHorizons.External.Modules.Props.Audio; using NewHorizons.Utility; -using NewHorizons.Utility.Files; using NewHorizons.Utility.OWML; -using NewHorizons.Utility.OuterWilds; using OWML.Common; using OWML.Utils; using System.Collections.Generic; -using UnityEngine; -using NewHorizons.External.Modules.Props.Audio; using System.Linq; +using UnityEngine; +using UnityEngine.SceneManagement; namespace NewHorizons.Builder.Props.Audio { @@ -20,8 +19,8 @@ namespace NewHorizons.Builder.Props.Audio public static int NumberOfFrequencies; - private static List _qmSignals; - private static List _cloakedSignals; + private static HashSet _qmSignals; + private static HashSet _cloakedSignals; public static bool Initialized; @@ -36,22 +35,46 @@ namespace NewHorizons.Builder.Props.Audio }; NumberOfFrequencies = EnumUtils.GetValues().Length; - _qmSignals = new List() { SearchUtilities.Find("QuantumMoon_Body/Signal_Quantum").GetComponent() }; - _cloakedSignals = new List(); + _qmSignals = new (){ SearchUtilities.Find("QuantumMoon_Body/Signal_Quantum").GetComponent() }; + _cloakedSignals = new(); Initialized = true; + + SceneManager.sceneUnloaded += OnSceneUnloaded; + Main.Instance.OnStarSystemLoaded.AddListener(OnStarSystemLoaded); } - public static bool IsCloaked(this AudioSignal signal) + private static HashSet _frequenciesInUse = new(); + + private static void OnSceneUnloaded(Scene _) { - return _cloakedSignals.Contains(signal); + _frequenciesInUse.Clear(); } - public static bool IsOnQuantumMoon(this AudioSignal signal) + private static void OnStarSystemLoaded(string starSystem) { - return _qmSignals.Contains(signal); + // If its the base game solar system or eye we get all the main frequencies + if (starSystem == "SolarSystem" || starSystem == "EyeOfTheUniverse") + { + _frequenciesInUse.Add(SignalFrequency.Quantum); + _frequenciesInUse.Add(SignalFrequency.EscapePod); + _frequenciesInUse.Add(SignalFrequency.Radio); + _frequenciesInUse.Add(SignalFrequency.HideAndSeek); + } + + // Always show the traveler frequency. The signalscope defaults to this on spawn, and is the only frequency known by default + // We don't want a scenario where the player knows no frequencies + _frequenciesInUse.Add(SignalFrequency.Traveler); + + NHLogger.LogVerbose($"Frequencies in use in {starSystem}: {_frequenciesInUse.Join(x => x.ToString())}"); } + public static bool IsFrequencyInUse(SignalFrequency freq) => _frequenciesInUse.Contains(freq); + + public static bool IsCloaked(this AudioSignal signal) => _cloakedSignals.Contains(signal); + + public static bool IsOnQuantumMoon(this AudioSignal signal) => _qmSignals.Contains(signal); + public static SignalFrequency AddFrequency(string str) { if (_customFrequencyNames == null) Init(); @@ -153,6 +176,8 @@ namespace NewHorizons.Builder.Props.Audio if (planetGO.GetComponent()?.GetAstroObjectName() == AstroObject.Name.QuantumMoon) _qmSignals.Add(audioSignal); if (info.insideCloak) _cloakedSignals.Add(audioSignal); + _frequenciesInUse.Add(frequency); + return signalGO; } diff --git a/NewHorizons/Patches/SignalPatches/SignalscopePatches.cs b/NewHorizons/Patches/SignalPatches/SignalscopePatches.cs index a348152e..12c54db5 100644 --- a/NewHorizons/Patches/SignalPatches/SignalscopePatches.cs +++ b/NewHorizons/Patches/SignalPatches/SignalscopePatches.cs @@ -21,9 +21,11 @@ namespace NewHorizons.Patches.SignalPatches __instance._frequencyFilterIndex += increment; __instance._frequencyFilterIndex = __instance._frequencyFilterIndex >= count ? 0 : __instance._frequencyFilterIndex; __instance._frequencyFilterIndex = __instance._frequencyFilterIndex < 0 ? count - 1 : __instance._frequencyFilterIndex; - SignalFrequency signalFrequency = AudioSignal.IndexToFrequency(__instance._frequencyFilterIndex); + var signalFrequency = AudioSignal.IndexToFrequency(__instance._frequencyFilterIndex); - if (!PlayerData.KnowsFrequency(signalFrequency) && (!__instance._isUnknownFreqNearby || __instance._unknownFrequency != signalFrequency)) + // Skip over this frequency + var isUnknown = !PlayerData.KnowsFrequency(signalFrequency) && !(__instance._isUnknownFreqNearby && __instance._unknownFrequency == signalFrequency); + if (isUnknown || !SignalBuilder.IsFrequencyInUse(signalFrequency)) { __instance.SwitchFrequencyFilter(increment); }