Only show relevant frequencies (#585)

<!-- A new module or something else important -->
## Major features
-

<!-- A new parameter added to a module, or API feature -->
## Minor features
-

<!-- Some improvement that requires no action on the part of add-on
creators i.e., improved star graphics -->
## Improvements
- Only signal frequencies in use by the current system will be shown.
(resolves #572)

<!-- Be sure to reference the existing issue if it exists -->
## Bug fixes
-
This commit is contained in:
Nick 2023-07-03 11:18:36 -04:00 committed by GitHub
commit 286a8a3a4b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 15 deletions

View File

@ -1,14 +1,13 @@
using NewHorizons.External.Modules; using HarmonyLib;
using NewHorizons.External.Modules.Props.Audio;
using NewHorizons.Utility; using NewHorizons.Utility;
using NewHorizons.Utility.Files;
using NewHorizons.Utility.OWML; using NewHorizons.Utility.OWML;
using NewHorizons.Utility.OuterWilds;
using OWML.Common; using OWML.Common;
using OWML.Utils; using OWML.Utils;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine;
using NewHorizons.External.Modules.Props.Audio;
using System.Linq; using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace NewHorizons.Builder.Props.Audio namespace NewHorizons.Builder.Props.Audio
{ {
@ -20,8 +19,8 @@ namespace NewHorizons.Builder.Props.Audio
public static int NumberOfFrequencies; public static int NumberOfFrequencies;
private static List<AudioSignal> _qmSignals; private static HashSet<AudioSignal> _qmSignals;
private static List<AudioSignal> _cloakedSignals; private static HashSet<AudioSignal> _cloakedSignals;
public static bool Initialized; public static bool Initialized;
@ -36,22 +35,46 @@ namespace NewHorizons.Builder.Props.Audio
}; };
NumberOfFrequencies = EnumUtils.GetValues<SignalFrequency>().Length; NumberOfFrequencies = EnumUtils.GetValues<SignalFrequency>().Length;
_qmSignals = new List<AudioSignal>() { SearchUtilities.Find("QuantumMoon_Body/Signal_Quantum").GetComponent<AudioSignal>() }; _qmSignals = new (){ SearchUtilities.Find("QuantumMoon_Body/Signal_Quantum").GetComponent<AudioSignal>() };
_cloakedSignals = new List<AudioSignal>(); _cloakedSignals = new();
Initialized = true; Initialized = true;
SceneManager.sceneUnloaded += OnSceneUnloaded;
Main.Instance.OnStarSystemLoaded.AddListener(OnStarSystemLoaded);
} }
public static bool IsCloaked(this AudioSignal signal) private static HashSet<SignalFrequency> _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) public static SignalFrequency AddFrequency(string str)
{ {
if (_customFrequencyNames == null) Init(); if (_customFrequencyNames == null) Init();
@ -153,6 +176,8 @@ namespace NewHorizons.Builder.Props.Audio
if (planetGO.GetComponent<AstroObject>()?.GetAstroObjectName() == AstroObject.Name.QuantumMoon) _qmSignals.Add(audioSignal); if (planetGO.GetComponent<AstroObject>()?.GetAstroObjectName() == AstroObject.Name.QuantumMoon) _qmSignals.Add(audioSignal);
if (info.insideCloak) _cloakedSignals.Add(audioSignal); if (info.insideCloak) _cloakedSignals.Add(audioSignal);
_frequenciesInUse.Add(frequency);
return signalGO; return signalGO;
} }

View File

@ -21,9 +21,11 @@ namespace NewHorizons.Patches.SignalPatches
__instance._frequencyFilterIndex += increment; __instance._frequencyFilterIndex += increment;
__instance._frequencyFilterIndex = __instance._frequencyFilterIndex >= count ? 0 : __instance._frequencyFilterIndex; __instance._frequencyFilterIndex = __instance._frequencyFilterIndex >= count ? 0 : __instance._frequencyFilterIndex;
__instance._frequencyFilterIndex = __instance._frequencyFilterIndex < 0 ? count - 1 : __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); __instance.SwitchFrequencyFilter(increment);
} }