diff --git a/.github/workflows/docs_build.yml b/.github/workflows/docs_build.yml index 17303ec7..3a3ce87a 100644 --- a/.github/workflows/docs_build.yml +++ b/.github/workflows/docs_build.yml @@ -12,7 +12,7 @@ on: branches: [main] paths: - docs/** - - NewHorizons/Schemas/*.xsd + - NewHorizons/Schemas/* env: URL_PREFIX: '/' diff --git a/.github/workflows/release_build.yml b/.github/workflows/release_build.yml index f59e71b4..e657fbd5 100644 --- a/.github/workflows/release_build.yml +++ b/.github/workflows/release_build.yml @@ -35,13 +35,6 @@ jobs: with: artifact_name: NewHorizons-Schemas-Release secrets: inherit - Update_Docs: - name: 'Update Docs' - needs: Build - if: ${{ needs.Build.outputs.schemas_changed == 'true' && github.ref == 'refs/heads/main' }} # Same thing with docs - uses: './.github/workflows/docs_build.yml' - with: - schemas_artifact: NewHorizons-Schemas-Debug Update_Release: name: 'Create/Update Release Asset' needs: Build diff --git a/NewHorizons/Builder/Props/Audio/AudioSourceBuilder.cs b/NewHorizons/Builder/Props/Audio/AudioSourceBuilder.cs new file mode 100644 index 00000000..da71a269 --- /dev/null +++ b/NewHorizons/Builder/Props/Audio/AudioSourceBuilder.cs @@ -0,0 +1,21 @@ +using NewHorizons.External.Modules.Props.Audio; +using NewHorizons.Utility; +using OWML.Common; +using UnityEngine; + +namespace NewHorizons.Builder.Props.Audio +{ + public static class AudioSourceBuilder + { + public static GameObject Make(GameObject planetGO, Sector sector, AudioSourceInfo info, IModBehaviour mod) + { + var owAudioSource = GeneralAudioBuilder.Make(planetGO, sector, info, mod); + + owAudioSource.SetTrack(info.track.ConvertToOW()); + + owAudioSource.gameObject.SetActive(true); + + return owAudioSource.gameObject; + } + } +} diff --git a/NewHorizons/Builder/Props/Audio/GeneralAudioBuilder.cs b/NewHorizons/Builder/Props/Audio/GeneralAudioBuilder.cs new file mode 100644 index 00000000..88eeb206 --- /dev/null +++ b/NewHorizons/Builder/Props/Audio/GeneralAudioBuilder.cs @@ -0,0 +1,44 @@ +using NewHorizons.External.Modules.Props.Audio; +using NewHorizons.Utility.Files; +using NewHorizons.Utility.OuterWilds; +using OWML.Common; +using UnityEngine; + +namespace NewHorizons.Builder.Props.Audio +{ + public static class GeneralAudioBuilder + { + public static AnimationCurve CustomCurve => new( + new Keyframe(0.0333f, 1f, -30.012f, -30.012f, 0.3333f, 0.3333f), + new Keyframe(0.0667f, 0.5f, -7.503f, -7.503f, 0.3333f, 0.3333f), + new Keyframe(0.1333f, 0.25f, -1.8758f, -1.8758f, 0.3333f, 0.3333f), + new Keyframe(0.2667f, 0.125f, -0.4689f, -0.4689f, 0.3333f, 0.3333f), + new Keyframe(0.5333f, 0.0625f, -0.1172f, -0.1172f, 0.3333f, 0.3333f), + new Keyframe(1f, 0f, -0.0333f, -0.0333f, 0.3333f, 0.3333f) + ); + + public static OWAudioSource Make(GameObject planetGO, Sector sector, BaseAudioInfo info, IModBehaviour mod) + { + var signalGO = GeneralPropBuilder.MakeNew($"{(string.IsNullOrEmpty(info.rename) ? "AudioSource" : info.rename)}", planetGO, sector, info); + signalGO.layer = Layer.AdvancedEffectVolume; + + var source = signalGO.AddComponent(); + var owAudioSource = signalGO.AddComponent(); + owAudioSource._audioSource = source; + + source.loop = true; + source.minDistance = info.minDistance; + source.maxDistance = info.maxDistance; + source.velocityUpdateMode = AudioVelocityUpdateMode.Fixed; + source.rolloffMode = AudioRolloffMode.Custom; + source.spatialBlend = 1f; + source.volume = info.volume; + source.dopplerLevel = 0; + + source.SetCustomCurve(AudioSourceCurveType.CustomRolloff, CustomCurve); + AudioUtilities.SetAudioClip(owAudioSource, info.audio, mod); + + return owAudioSource; + } + } +} diff --git a/NewHorizons/Builder/Props/SignalBuilder.cs b/NewHorizons/Builder/Props/Audio/SignalBuilder.cs similarity index 73% rename from NewHorizons/Builder/Props/SignalBuilder.cs rename to NewHorizons/Builder/Props/Audio/SignalBuilder.cs index 4e220d3f..2c366fd0 100644 --- a/NewHorizons/Builder/Props/SignalBuilder.cs +++ b/NewHorizons/Builder/Props/Audio/SignalBuilder.cs @@ -7,14 +7,12 @@ using OWML.Common; using OWML.Utils; using System.Collections.Generic; using UnityEngine; +using NewHorizons.External.Modules.Props.Audio; - -namespace NewHorizons.Builder.Props +namespace NewHorizons.Builder.Props.Audio { public static class SignalBuilder { - private static AnimationCurve _customCurve = null; - private static Dictionary _customSignalNames; private static Dictionary _customFrequencyNames; @@ -56,7 +54,7 @@ namespace NewHorizons.Builder.Props public static SignalFrequency AddFrequency(string str) { if (_customFrequencyNames == null) Init(); - + var freq = CollectionUtilities.KeyByValue(_customFrequencyNames, str); if (freq != default) return freq; @@ -74,7 +72,7 @@ namespace NewHorizons.Builder.Props 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]; + Object.FindObjectOfType()._strongestSignals = new AudioSignal[NumberOfFrequencies + 1]; return freq; } @@ -90,7 +88,7 @@ namespace NewHorizons.Builder.Props public static SignalName AddSignalName(string str) { if (_customSignalNames == null) Init(); - + var name = CollectionUtilities.KeyByValue(_customSignalNames, str); if (name != default) return name; @@ -110,14 +108,10 @@ namespace NewHorizons.Builder.Props return name; } - public static GameObject Make(GameObject planetGO, Sector sector, SignalModule.SignalInfo info, IModBehaviour mod) + public static GameObject Make(GameObject planetGO, Sector sector, SignalInfo info, IModBehaviour mod) { - var signalGO = GeneralPropBuilder.MakeNew($"Signal_{info.name}", planetGO, sector, info); - signalGO.layer = Layer.AdvancedEffectVolume; - - var source = signalGO.AddComponent(); - var owAudioSource = signalGO.AddComponent(); - owAudioSource._audioSource = source; + var owAudioSource = GeneralAudioBuilder.Make(planetGO, sector, info, mod); + var signalGO = owAudioSource.gameObject; var audioSignal = signalGO.AddComponent(); audioSignal._owAudioSource = owAudioSource; @@ -137,36 +131,11 @@ namespace NewHorizons.Builder.Props audioSignal._identificationDistance = info.identificationRadius; audioSignal._canBePickedUpByScope = true; audioSignal._outerFogWarpVolume = planetGO.GetComponentInChildren(); // shouldn't break non-bramble signals - - source.loop = true; - source.minDistance = 0; - source.maxDistance = 30; - source.velocityUpdateMode = AudioVelocityUpdateMode.Fixed; - source.rolloffMode = AudioRolloffMode.Custom; - if (_customCurve == null) - { - _customCurve = new AnimationCurve( - new Keyframe(0.0333f, 1f, -30.012f, -30.012f, 0.3333f, 0.3333f), - new Keyframe(0.0667f, 0.5f, -7.503f, -7.503f, 0.3333f, 0.3333f), - new Keyframe(0.1333f, 0.25f, -1.8758f, -1.8758f, 0.3333f, 0.3333f), - new Keyframe(0.2667f, 0.125f, -0.4689f, -0.4689f, 0.3333f, 0.3333f), - new Keyframe(0.5333f, 0.0625f, -0.1172f, -0.1172f, 0.3333f, 0.3333f), - new Keyframe(1f, 0f, -0.0333f, -0.0333f, 0.3333f, 0.3333f)); - } - - source.SetCustomCurve(AudioSourceCurveType.CustomRolloff, _customCurve); // If it can be heard regularly then we play it immediately - source.playOnAwake = !info.onlyAudibleToScope; - source.spatialBlend = 1f; - source.volume = 0.5f; - source.dopplerLevel = 0; - - owAudioSource.SetTrack(OWAudioMixer.TrackName.Signal); - AudioUtilities.SetAudioClip(owAudioSource, info.audio, mod); + owAudioSource.playOnAwake = !info.onlyAudibleToScope; // Frequency detection trigger volume - var sphereShape = signalGO.AddComponent(); var owTriggerVolume = signalGO.AddComponent(); var audioSignalDetectionTrigger = signalGO.AddComponent(); @@ -175,6 +144,8 @@ namespace NewHorizons.Builder.Props audioSignalDetectionTrigger._signal = audioSignal; audioSignalDetectionTrigger._trigger = owTriggerVolume; + owAudioSource.SetTrack(OWAudioMixer.TrackName.Signal); + signalGO.SetActive(true); // Track certain special signal things @@ -186,12 +157,12 @@ namespace NewHorizons.Builder.Props private static SignalFrequency StringToFrequency(string str) { - return EnumUtils.TryParse(str, out SignalFrequency frequency) ? frequency : AddFrequency(str); + return EnumUtils.TryParse(str, out SignalFrequency frequency) ? frequency : AddFrequency(str); } public static SignalName StringToSignalName(string str) { - return EnumUtils.TryParse(str, out SignalName name) ? name : AddSignalName(str); + return EnumUtils.TryParse(str, out SignalName name) ? name : AddSignalName(str); } } } diff --git a/NewHorizons/Builder/Props/BrambleNodeBuilder.cs b/NewHorizons/Builder/Props/BrambleNodeBuilder.cs index 4962cc46..fc958b6c 100644 --- a/NewHorizons/Builder/Props/BrambleNodeBuilder.cs +++ b/NewHorizons/Builder/Props/BrambleNodeBuilder.cs @@ -1,5 +1,7 @@ using NewHorizons.Builder.Body; +using NewHorizons.Builder.Props.Audio; using NewHorizons.External.Configs; +using NewHorizons.External.Modules.Props.Audio; using NewHorizons.Handlers; using NewHorizons.Utility; using NewHorizons.Utility.OuterWilds; diff --git a/NewHorizons/Builder/Props/DetailBuilder.cs b/NewHorizons/Builder/Props/DetailBuilder.cs index 7192715e..59f6bf08 100644 --- a/NewHorizons/Builder/Props/DetailBuilder.cs +++ b/NewHorizons/Builder/Props/DetailBuilder.cs @@ -170,8 +170,11 @@ namespace NewHorizons.Builder.Props if (detail.removeComponents) { + NHLogger.LogVerbose($"Removing all components from [{prop.name}]"); + // Just swap all the children to a new game object var newDetailGO = new GameObject(prop.name); + newDetailGO.SetActive(false); newDetailGO.transform.position = prop.transform.position; newDetailGO.transform.parent = prop.transform.parent; @@ -185,7 +188,8 @@ namespace NewHorizons.Builder.Props { child.parent = newDetailGO.transform; } - GameObject.Destroy(prop); + // Have to destroy it right away, else parented props might get attached to the old one + GameObject.DestroyImmediate(prop); prop = newDetailGO; } diff --git a/NewHorizons/Builder/Props/DialogueBuilder.cs b/NewHorizons/Builder/Props/DialogueBuilder.cs index d4e849a6..9e2da10c 100644 --- a/NewHorizons/Builder/Props/DialogueBuilder.cs +++ b/NewHorizons/Builder/Props/DialogueBuilder.cs @@ -16,9 +16,15 @@ namespace NewHorizons.Builder.Props // Returns the character dialogue tree and remote dialogue trigger, if applicable. public static (CharacterDialogueTree, RemoteDialogueTrigger) Make(GameObject go, Sector sector, DialogueInfo info, IModBehaviour mod) { + NHLogger.LogVerbose($"[DIALOGUE] Created a new character dialogue [{info.rename}] on [{info.parentPath}]"); + // In stock I think they disable dialogue stuff with conditions // Here we just don't make it at all - if (info.blockAfterPersistentCondition != null && PlayerData.GetPersistentCondition(info.blockAfterPersistentCondition)) return (null, null); + if (!string.IsNullOrEmpty(info.blockAfterPersistentCondition) && PlayerData.GetPersistentCondition(info.blockAfterPersistentCondition)) + { + NHLogger.LogVerbose($"[DIALOGUE] Persistent condition [{info.blockAfterPersistentCondition}] was met for [{info.rename}], aborting"); + return (null, null); + } var dialogue = MakeConversationZone(go, sector, info, mod.ModHelper); diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 5c00d553..ddd96c13 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -1,4 +1,5 @@ using NewHorizons.Builder.Body; +using NewHorizons.Builder.Props.Audio; using NewHorizons.Builder.Props.TranslatorText; using NewHorizons.Builder.ShipLog; using NewHorizons.External; @@ -106,11 +107,15 @@ namespace NewHorizons.Builder.Props { try { - DialogueBuilder.Make(go, sector, dialogueInfo, mod); + var (dialogue, trigger) = DialogueBuilder.Make(go, sector, dialogueInfo, mod); + if (dialogue == null) + { + NHLogger.LogVerbose($"[DIALOGUE] Failed to create dialogue [{dialogueInfo.xmlFile}]"); + } } catch (Exception ex) { - NHLogger.LogError($"Couldn't make dialogue [{dialogueInfo.xmlFile}] for [{go.name}]:\n{ex}"); + NHLogger.LogError($"[DIALOGUE] Couldn't make dialogue [{dialogueInfo.xmlFile}] for [{go.name}]:\n{ex}"); } } } @@ -265,6 +270,20 @@ namespace NewHorizons.Builder.Props } } } + if (config.Props.audioSources != null) + { + foreach (var audioSource in config.Props.audioSources) + { + try + { + AudioSourceBuilder.Make(go, sector, audioSource, mod); + } + catch (Exception ex) + { + NHLogger.LogError($"Couldn't make audio source [{audioSource.audio}] for [{go.name}]:\n{ex}"); + } + } + } } } } diff --git a/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs b/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs index 59a7b10c..6b961a79 100644 --- a/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs +++ b/NewHorizons/Builder/Volumes/AudioVolumeBuilder.cs @@ -1,9 +1,9 @@ using NewHorizons.Builder.Props; using NewHorizons.External.Modules.Volumes.VolumeInfos; +using NewHorizons.Utility; using NewHorizons.Utility.Files; using NewHorizons.Utility.OuterWilds; using OWML.Common; -using OWML.Utils; using UnityEngine; namespace NewHorizons.Builder.Volumes @@ -21,8 +21,8 @@ namespace NewHorizons.Builder.Volumes owAudioSource._audioSource = audioSource; owAudioSource.loop = info.loop; owAudioSource.SetMaxVolume(info.volume); - owAudioSource.SetClipSelectionType(EnumUtils.Parse(info.clipSelection.ToString())); - owAudioSource.SetTrack(EnumUtils.Parse(info.track.ToString())); + owAudioSource.SetClipSelectionType(info.clipSelection.ConvertToOW()); + owAudioSource.SetTrack(info.track.ConvertToOW()); AudioUtilities.SetAudioClip(owAudioSource, info.audio, mod); var audioVolume = go.AddComponent(); diff --git a/NewHorizons/Components/AddPhysics.cs b/NewHorizons/Components/AddPhysics.cs index 42f8342d..d4c0b2e0 100644 --- a/NewHorizons/Components/AddPhysics.cs +++ b/NewHorizons/Components/AddPhysics.cs @@ -33,6 +33,7 @@ public class AddPhysics : MonoBehaviour var bodyGo = new GameObject($"{name}_Body"); bodyGo.SetActive(false); + bodyGo.transform.parent = transform.parent; bodyGo.transform.position = transform.position; bodyGo.transform.rotation = transform.rotation; diff --git a/NewHorizons/External/Configs/PlanetConfig.cs b/NewHorizons/External/Configs/PlanetConfig.cs index d0176289..4d76aede 100644 --- a/NewHorizons/External/Configs/PlanetConfig.cs +++ b/NewHorizons/External/Configs/PlanetConfig.cs @@ -1,5 +1,6 @@ using NewHorizons.External.Modules; using NewHorizons.External.Modules.Props; +using NewHorizons.External.Modules.Props.Audio; using NewHorizons.External.Modules.Props.Dialogue; using NewHorizons.External.Modules.Props.Quantum; using NewHorizons.External.Modules.VariableSize; @@ -420,7 +421,7 @@ namespace NewHorizons.External.Configs if (Signal?.signals != null) { if (Props == null) Props = new PropModule(); - if (Props.signals == null) Props.signals = new SignalModule.SignalInfo[0]; + if (Props.signals == null) Props.signals = new SignalInfo[0]; Props.signals = Props.signals.Concat(Signal.signals).ToArray(); } diff --git a/NewHorizons/External/Modules/PropModule.cs b/NewHorizons/External/Modules/PropModule.cs index dd6860c6..e6bc7d5e 100644 --- a/NewHorizons/External/Modules/PropModule.cs +++ b/NewHorizons/External/Modules/PropModule.cs @@ -1,4 +1,5 @@ using NewHorizons.External.Modules.Props; +using NewHorizons.External.Modules.Props.Audio; using NewHorizons.External.Modules.Props.Dialogue; using NewHorizons.External.Modules.Props.EchoesOfTheEye; using NewHorizons.External.Modules.Props.Quantum; @@ -89,7 +90,7 @@ namespace NewHorizons.External.Modules /// /// Add signalscope signals to this planet /// - public SignalModule.SignalInfo[] signals; + public SignalInfo[] signals; /// /// Add projection pools/platforms, whiteboards, and stones to this planet @@ -106,6 +107,11 @@ namespace NewHorizons.External.Modules /// public NomaiWarpTransmitterInfo[] warpTransmitters; + /// + /// Add audio point sources to this planet. For audio across an entire area, look for AudioVolumes under the Volumes module. + /// + public AudioSourceInfo[] audioSources; + [Obsolete("reveal is deprecated. Use Volumes->revealVolumes instead.")] public RevealVolumeInfo[] reveal; [Obsolete("audioVolumes is deprecated. Use Volumes->audioVolumes instead.")] public AudioVolumeInfo[] audioVolumes; diff --git a/NewHorizons/External/Modules/Props/Audio/AudioSourceInfo.cs b/NewHorizons/External/Modules/Props/Audio/AudioSourceInfo.cs new file mode 100644 index 00000000..d2579780 --- /dev/null +++ b/NewHorizons/External/Modules/Props/Audio/AudioSourceInfo.cs @@ -0,0 +1,15 @@ +using NewHorizons.External.SerializableEnums; +using Newtonsoft.Json; +using System.ComponentModel; + +namespace NewHorizons.External.Modules.Props.Audio +{ + [JsonObject] + public class AudioSourceInfo : BaseAudioInfo + { + /// + /// The audio track of this audio source + /// + [DefaultValue("environment")] public NHAudioMixerTrackName track = NHAudioMixerTrackName.Environment; + } +} diff --git a/NewHorizons/External/Modules/Props/Audio/BaseAudioInfo.cs b/NewHorizons/External/Modules/Props/Audio/BaseAudioInfo.cs new file mode 100644 index 00000000..5f4f615c --- /dev/null +++ b/NewHorizons/External/Modules/Props/Audio/BaseAudioInfo.cs @@ -0,0 +1,29 @@ +using Newtonsoft.Json; +using System.ComponentModel; + +namespace NewHorizons.External.Modules.Props.Audio +{ + [JsonObject] + public abstract class BaseAudioInfo : GeneralPointPropInfo + { + /// + /// The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list. + /// + public string audio; + + /// + /// At this distance the sound is at its loudest. + /// + public float minDistance; + + /// + /// The sound will drop off by this distance (Note: for signals, this only effects when it is heard aloud and not via the signalscope). + /// + [DefaultValue(5f)] public float maxDistance = 30f; + + /// + /// How loud the sound will play + /// + [DefaultValue(0.5f)] public float volume = 0.5f; + } +} diff --git a/NewHorizons/External/Modules/Props/Audio/SignalInfo.cs b/NewHorizons/External/Modules/Props/Audio/SignalInfo.cs new file mode 100644 index 00000000..c41740c7 --- /dev/null +++ b/NewHorizons/External/Modules/Props/Audio/SignalInfo.cs @@ -0,0 +1,61 @@ +using Newtonsoft.Json; +using System; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace NewHorizons.External.Modules.Props.Audio +{ + [JsonObject] + public class SignalInfo : BaseAudioInfo + { + [Obsolete("audioClip is deprecated, please use audio instead")] + public string audioClip; + + [Obsolete("audioFilePath is deprecated, please use audio instead")] + public string audioFilePath; + + /// + /// How close the player must get to the signal to detect it. This is when you get the "Unknown Signal Detected" + /// notification. + /// + [Range(0f, double.MaxValue)] public float detectionRadius; + + /// + /// The frequency ID of the signal. The built-in game values are `Default`, `Traveler`, `Quantum`, `EscapePod`, + /// `Statue`, `WarpCore`, `HideAndSeek`, and `Radio`. You can also put a custom value. + /// + public string frequency; + + /// + /// How close the player must get to the signal to identify it. This is when you learn its name. + /// + [DefaultValue(10f)] + [Range(0f, double.MaxValue)] + public float identificationRadius = 10f; + + /// + /// Only set to `true` if you are putting this signal inside a cloaking field. + /// + public bool insideCloak; + + /// + /// The unique ID of the signal. + /// + public string name; + + /// + /// `false` if the player can hear the signal without equipping the signal-scope. + /// + [DefaultValue(true)] public bool onlyAudibleToScope = true; + + /// + /// A ship log fact to reveal when the signal is identified. + /// + [DefaultValue("")] public string reveals = ""; + + /// + /// Radius of the sphere giving off the signal. + /// + [DefaultValue(1f)] public float sourceRadius = 1f; + } +} diff --git a/NewHorizons/External/Modules/SignalModule.cs b/NewHorizons/External/Modules/SignalModule.cs index ee54f9ad..855c3f96 100644 --- a/NewHorizons/External/Modules/SignalModule.cs +++ b/NewHorizons/External/Modules/SignalModule.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; +using NewHorizons.External.Modules.Props.Audio; using Newtonsoft.Json; namespace NewHorizons.External.Modules @@ -8,67 +9,7 @@ namespace NewHorizons.External.Modules [JsonObject] public class SignalModule { - /// - /// List of signals to add (Why did xen do it like this) - /// + [Obsolete("signals is deprecated, please use Props->signals instead")] public SignalInfo[] signals; - - [JsonObject] - public class SignalInfo : GeneralPointPropInfo - { - [Obsolete("audioClip is deprecated, please use audio instead")] - public string audioClip; - - [Obsolete("audioFilePath is deprecated, please use audio instead")] - public string audioFilePath; - - /// - /// The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list. - /// - public string audio; - - /// - /// How close the player must get to the signal to detect it. This is when you get the "Unknown Signal Detected" - /// notification. - /// - [Range(0f, double.MaxValue)] public float detectionRadius; - - /// - /// The frequency ID of the signal. The built-in game values are `Default`, `Traveler`, `Quantum`, `EscapePod`, - /// `Statue`, `WarpCore`, `HideAndSeek`, and `Radio`. You can also put a custom value. - /// - public string frequency; - - /// - /// How close the player must get to the signal to identify it. This is when you learn its name. - /// - [DefaultValue(10f)] [Range(0f, double.MaxValue)] - public float identificationRadius = 10f; - - /// - /// Only set to `true` if you are putting this signal inside a cloaking field. - /// - public bool insideCloak; - - /// - /// The unique ID of the signal. - /// - public string name; - - /// - /// `false` if the player can hear the signal without equipping the signal-scope. - /// - [DefaultValue(true)] public bool onlyAudibleToScope = true; - - /// - /// A ship log fact to reveal when the signal is identified. - /// - [DefaultValue("")] public string reveals = ""; - - /// - /// Radius of the sphere giving off the signal. - /// - [DefaultValue(1f)] public float sourceRadius = 1f; - } } } \ No newline at end of file diff --git a/NewHorizons/External/Modules/WarpPad/NomaiWarpPadInfo.cs b/NewHorizons/External/Modules/WarpPad/NomaiWarpPadInfo.cs index f4cd7515..94a9218d 100644 --- a/NewHorizons/External/Modules/WarpPad/NomaiWarpPadInfo.cs +++ b/NewHorizons/External/Modules/WarpPad/NomaiWarpPadInfo.cs @@ -5,6 +5,11 @@ namespace NewHorizons.External.Modules.WarpPad [JsonObject] public abstract class NomaiWarpPadInfo : GeneralPropInfo { + /// + /// This can be anything. To have a warp pad transmitter send you to a receiver you must give them the same frequency. + /// Try to make it something unique so it does not overlap with other warp pad pairs. + /// Futhermore, multiple transmitters can send you to the same receiver if they all have the same frequency. + /// public string frequency; } } diff --git a/NewHorizons/External/NewHorizonsData.cs b/NewHorizons/External/NewHorizonsData.cs index 60fdcd01..b691b622 100644 --- a/NewHorizons/External/NewHorizonsData.cs +++ b/NewHorizons/External/NewHorizonsData.cs @@ -128,6 +128,16 @@ namespace NewHorizons.External } } + public static void ForgetFrequency(string frequency) + { + if (_activeProfile == null) return; + if (KnowsFrequency(frequency)) + { + _activeProfile.KnownFrequencies.Remove(frequency); + Save(); + } + } + public static bool KnowsMultipleFrequencies() { return _activeProfile != null && _activeProfile.KnownFrequencies.Count > 0; diff --git a/NewHorizons/Handlers/VesselWarpHandler.cs b/NewHorizons/Handlers/VesselWarpHandler.cs index 4066b711..ce17e778 100644 --- a/NewHorizons/Handlers/VesselWarpHandler.cs +++ b/NewHorizons/Handlers/VesselWarpHandler.cs @@ -146,6 +146,7 @@ namespace NewHorizons.Handlers var hasParentBody = !string.IsNullOrEmpty(system.Config.Vessel?.vesselSpawn?.parentBody); var hasPhysics = system.Config.Vessel?.hasPhysics ?? !hasParentBody; + var planetGO = hasParentBody ? vesselObject.transform.parent.gameObject : null; if (hasPhysics) { @@ -168,8 +169,6 @@ namespace NewHorizons.Handlers var attachWarpExitToVessel = system.Config.Vessel?.warpExit?.attachToVessel ?? false; var warpExitParent = vesselWarpController._targetWarpPlatform.transform.parent; - var planetGO = hasPhysics ? vesselObject.transform.parent.gameObject : null; - var warpExit = GeneralPropBuilder.MakeFromExisting(vesselWarpController._targetWarpPlatform.gameObject, planetGO, null, system.Config.Vessel?.warpExit, parentOverride: attachWarpExitToVessel ? warpExitParent : null); if (attachWarpExitToVessel) { diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index 122abee8..dfc37056 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -32,6 +32,7 @@ using UnityEngine.SceneManagement; using NewHorizons.Utility.DebugTools; using NewHorizons.Utility.DebugTools.Menu; using NewHorizons.Components.Ship; +using NewHorizons.Builder.Props.Audio; namespace NewHorizons { diff --git a/NewHorizons/NewHorizonsApi.cs b/NewHorizons/NewHorizonsApi.cs index 5e627fcb..ee3ea62f 100644 --- a/NewHorizons/NewHorizonsApi.cs +++ b/NewHorizons/NewHorizonsApi.cs @@ -1,7 +1,9 @@ using NewHorizons.Builder.Props; +using NewHorizons.Builder.Props.Audio; using NewHorizons.External; using NewHorizons.External.Modules; using NewHorizons.External.Modules.Props; +using NewHorizons.External.Modules.Props.Audio; using NewHorizons.External.Modules.Props.Dialogue; using NewHorizons.Utility; using NewHorizons.Utility.OWML; @@ -174,7 +176,7 @@ namespace NewHorizons float sourceRadius = 1f, float detectionRadius = 20f, float identificationRadius = 10f, bool insideCloak = false, bool onlyAudibleToScope = true, string reveals = "") { - var info = new SignalModule.SignalInfo() + var info = new SignalInfo() { audio = audio, detectionRadius = detectionRadius, @@ -204,11 +206,11 @@ namespace NewHorizons radius = radius, range = range, xmlFile = xmlFile, - remoteTrigger = new RemoteTriggerInfo() + remoteTrigger = remoteTriggerRadius > 0f ? new RemoteTriggerInfo() { position = null, radius = remoteTriggerRadius, - }, + } : null, }; return DialogueBuilder.Make(root, null, info, mod); diff --git a/NewHorizons/OtherMods/AchievementsPlus/AchievementInfo.cs b/NewHorizons/OtherMods/AchievementsPlus/AchievementInfo.cs index 79629c77..2c0c0cbf 100644 --- a/NewHorizons/OtherMods/AchievementsPlus/AchievementInfo.cs +++ b/NewHorizons/OtherMods/AchievementsPlus/AchievementInfo.cs @@ -1,4 +1,4 @@ -using NewHorizons.Builder.Props; +using NewHorizons.Builder.Props.Audio; using NewHorizons.Handlers; using Newtonsoft.Json; using System.Linq; diff --git a/NewHorizons/Patches/PlayerPatches/PlayerDataPatches.cs b/NewHorizons/Patches/PlayerPatches/PlayerDataPatches.cs index 3811cfee..16056c7b 100644 --- a/NewHorizons/Patches/PlayerPatches/PlayerDataPatches.cs +++ b/NewHorizons/Patches/PlayerPatches/PlayerDataPatches.cs @@ -1,5 +1,5 @@ using HarmonyLib; -using NewHorizons.Builder.Props; +using NewHorizons.Builder.Props.Audio; using NewHorizons.External; using NewHorizons.Handlers; using NewHorizons.OtherMods.AchievementsPlus; @@ -40,6 +40,19 @@ namespace NewHorizons.Patches.PlayerPatches return true; } + [HarmonyPrefix] + [HarmonyPatch(nameof(PlayerData.ForgetFrequency))] + public static bool PlayerData_ForgetFrequency(SignalFrequency frequency) + { + var freqString = SignalBuilder.GetCustomFrequencyName(frequency); + if (!string.IsNullOrEmpty(freqString)) + { + NewHorizonsData.ForgetFrequency(freqString); + return false; + } + return true; + } + [HarmonyPrefix] [HarmonyPatch(nameof(PlayerData.KnowsSignal))] public static bool PlayerData_KnowsSignal(SignalName signalName, ref bool __result) @@ -60,11 +73,7 @@ namespace NewHorizons.Patches.PlayerPatches var customSignalName = SignalBuilder.GetCustomSignalName(signalName); if (!string.IsNullOrEmpty(customSignalName)) { - if (!NewHorizonsData.KnowsSignal(customSignalName)) - { - NewHorizonsData.LearnSignal(customSignalName); - } - + NewHorizonsData.LearnSignal(customSignalName); AchievementHandler.OnLearnSignal(); return false; diff --git a/NewHorizons/Patches/ShipLogPatches/ShipLogManagerPatches.cs b/NewHorizons/Patches/ShipLogPatches/ShipLogManagerPatches.cs index 831bb888..536bf9c8 100644 --- a/NewHorizons/Patches/ShipLogPatches/ShipLogManagerPatches.cs +++ b/NewHorizons/Patches/ShipLogPatches/ShipLogManagerPatches.cs @@ -91,8 +91,12 @@ namespace NewHorizons.Patches.ShipLogPatches [HarmonyPatch(nameof(ShipLogManager.CheckForCompletionAchievement))] public static bool ShipLogManager_CheckForCompletionAchievement(ShipLogManager __instance) { + // In other star systems they won't have the base game ship log facts, so they'll instantly get the achievement. + if (Main.Instance.CurrentStarSystem != "SolarSystem") return false; + foreach (KeyValuePair keyValuePair in __instance._factDict) { + // Don't want to include modded facts, otherwise this is the same as the vanilla method if (!ShipLogHandler.IsModdedFact(keyValuePair.Key) && !keyValuePair.Value.IsRumor() && !keyValuePair.Value.IsRevealed() && !keyValuePair.Key.Equals("TH_VILLAGE_X3") && !keyValuePair.Key.Equals("GD_GABBRO_ISLAND_X1") && __instance.GetEntry(keyValuePair.Value.GetEntryID()).GetCuriosityName() != CuriosityName.InvisiblePlanet) { return false; diff --git a/NewHorizons/Patches/SignalPatches/AudioSignalPatches.cs b/NewHorizons/Patches/SignalPatches/AudioSignalPatches.cs index 32318a5c..068b1e1f 100644 --- a/NewHorizons/Patches/SignalPatches/AudioSignalPatches.cs +++ b/NewHorizons/Patches/SignalPatches/AudioSignalPatches.cs @@ -1,5 +1,5 @@ using HarmonyLib; -using NewHorizons.Builder.Props; +using NewHorizons.Builder.Props.Audio; using NewHorizons.External; using NewHorizons.Handlers; using System; diff --git a/NewHorizons/Patches/SignalPatches/SignalscopePatches.cs b/NewHorizons/Patches/SignalPatches/SignalscopePatches.cs index 6b401d45..a348152e 100644 --- a/NewHorizons/Patches/SignalPatches/SignalscopePatches.cs +++ b/NewHorizons/Patches/SignalPatches/SignalscopePatches.cs @@ -1,5 +1,5 @@ using HarmonyLib; -using NewHorizons.Builder.Props; +using NewHorizons.Builder.Props.Audio; namespace NewHorizons.Patches.SignalPatches { diff --git a/NewHorizons/Schemas/body_schema.json b/NewHorizons/Schemas/body_schema.json index 39452dfe..3d0626ef 100644 --- a/NewHorizons/Schemas/body_schema.json +++ b/NewHorizons/Schemas/body_schema.json @@ -1098,6 +1098,13 @@ "items": { "$ref": "#/definitions/NomaiWarpTransmitterInfo" } + }, + "audioSources": { + "type": "array", + "description": "Add audio point sources to this planet. For audio across an entire area, look for AudioVolumes under the Volumes module.", + "items": { + "$ref": "#/definitions/AudioSourceInfo" + } } } }, @@ -2157,6 +2164,27 @@ "type": "object", "additionalProperties": false, "properties": { + "audio": { + "type": "string", + "description": "The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list." + }, + "minDistance": { + "type": "number", + "description": "At this distance the sound is at its loudest.", + "format": "float" + }, + "maxDistance": { + "type": "number", + "description": "The sound will drop off by this distance (Note: for signals, this only effects when it is heard aloud and not via the signalscope).", + "format": "float", + "default": 5.0 + }, + "volume": { + "type": "number", + "description": "How loud the sound will play", + "format": "float", + "default": 0.5 + }, "position": { "description": "Position of the object", "$ref": "#/definitions/MVector3" @@ -2173,10 +2201,6 @@ "type": "string", "description": "An optional rename of this object" }, - "audio": { - "type": "string", - "description": "The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list." - }, "detectionRadius": { "type": "number", "description": "How close the player must get to the signal to detect it. This is when you get the \"Unknown Signal Detected\"\nnotification.", @@ -2412,7 +2436,8 @@ "additionalProperties": false, "properties": { "frequency": { - "type": "string" + "type": "string", + "description": "This can be anything. To have a warp pad transmitter send you to a receiver you must give them the same frequency. \nTry to make it something unique so it does not overlap with other warp pad pairs.\nFuthermore, multiple transmitters can send you to the same receiver if they all have the same frequency." }, "rotation": { "description": "Rotation of the object", @@ -2493,7 +2518,8 @@ "additionalProperties": false, "properties": { "frequency": { - "type": "string" + "type": "string", + "description": "This can be anything. To have a warp pad transmitter send you to a receiver you must give them the same frequency. \nTry to make it something unique so it does not overlap with other warp pad pairs.\nFuthermore, multiple transmitters can send you to the same receiver if they all have the same frequency." }, "rotation": { "description": "Rotation of the object", @@ -2534,6 +2560,94 @@ } } }, + "AudioSourceInfo": { + "type": "object", + "additionalProperties": false, + "properties": { + "audio": { + "type": "string", + "description": "The audio to use. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list." + }, + "minDistance": { + "type": "number", + "description": "At this distance the sound is at its loudest.", + "format": "float" + }, + "maxDistance": { + "type": "number", + "description": "The sound will drop off by this distance (Note: for signals, this only effects when it is heard aloud and not via the signalscope).", + "format": "float", + "default": 5.0 + }, + "volume": { + "type": "number", + "description": "How loud the sound will play", + "format": "float", + "default": 0.5 + }, + "position": { + "description": "Position of the object", + "$ref": "#/definitions/MVector3" + }, + "parentPath": { + "type": "string", + "description": "The relative path from the planet to the parent of this object. Optional (will default to the root sector)." + }, + "isRelativeToParent": { + "type": "boolean", + "description": "Whether the positional and rotational coordinates are relative to parent instead of the root planet object." + }, + "rename": { + "type": "string", + "description": "An optional rename of this object" + }, + "track": { + "description": "The audio track of this audio source", + "default": "environment", + "$ref": "#/definitions/NHAudioMixerTrackName" + } + } + }, + "NHAudioMixerTrackName": { + "type": "string", + "description": "", + "x-enumNames": [ + "Undefined", + "Menu", + "Music", + "Environment", + "Environment_Unfiltered", + "EndTimes_SFX", + "Signal", + "Death", + "Player", + "Player_External", + "Ship", + "Map", + "EndTimes_Music", + "MuffleWhileRafting", + "MuffleIndoors", + "SlideReelMusic" + ], + "enum": [ + "undefined", + "menu", + "music", + "environment", + "environmentUnfiltered", + "endTimesSfx", + "signal", + "death", + "player", + "playerExternal", + "ship", + "map", + "endTimesMusic", + "muffleWhileRafting", + "muffleIndoors", + "slideReelMusic" + ] + }, "ReferenceFrameModule": { "type": "object", "additionalProperties": false, @@ -3273,46 +3387,6 @@ "manual" ] }, - "NHAudioMixerTrackName": { - "type": "string", - "description": "", - "x-enumNames": [ - "Undefined", - "Menu", - "Music", - "Environment", - "Environment_Unfiltered", - "EndTimes_SFX", - "Signal", - "Death", - "Player", - "Player_External", - "Ship", - "Map", - "EndTimes_Music", - "MuffleWhileRafting", - "MuffleIndoors", - "SlideReelMusic" - ], - "enum": [ - "undefined", - "menu", - "music", - "environment", - "environmentUnfiltered", - "endTimesSfx", - "signal", - "death", - "player", - "playerExternal", - "ship", - "map", - "endTimesMusic", - "muffleWhileRafting", - "muffleIndoors", - "slideReelMusic" - ] - }, "DestructionVolumeInfo": { "type": "object", "additionalProperties": false, diff --git a/NewHorizons/Utility/NewHorizonExtensions.cs b/NewHorizons/Utility/NewHorizonExtensions.cs index 275e6f52..6b0edbd9 100644 --- a/NewHorizons/Utility/NewHorizonExtensions.cs +++ b/NewHorizons/Utility/NewHorizonExtensions.cs @@ -253,9 +253,16 @@ namespace NewHorizons.Utility OWML.NHLogger.LogVerbose($"Coordinate Check for {system}: {xCorrect}, {yCorrect}, {zCorrect} [{string.Join("-", coordinates.x)}, {string.Join("-", coordinates.y)}, {string.Join("-", coordinates.z)}]"); return xCorrect && yCorrect && zCorrect; } - - public static FluidVolume.Type ConvertToOW(this NHFluidType fluidType, FluidVolume.Type @default = FluidVolume.Type.NONE) => EnumUtils.Parse(fluidType.ToString().ToUpper(), @default); + public static FluidVolume.Type ConvertToOW(this NHFluidType fluidType, FluidVolume.Type @default = FluidVolume.Type.NONE) + => EnumUtils.Parse(fluidType.ToString().ToUpper(), @default); + + public static OWAudioMixer.TrackName ConvertToOW(this NHAudioMixerTrackName trackName, OWAudioMixer.TrackName @default = OWAudioMixer.TrackName.Environment) + => EnumUtils.Parse(trackName.ToString().ToUpper(), @default); + + public static OWAudioSource.ClipSelectionOnPlay ConvertToOW(this NHClipSelectionType clipSelection, OWAudioSource.ClipSelectionOnPlay @default = OWAudioSource.ClipSelectionOnPlay.RANDOM) + => EnumUtils.Parse(clipSelection.ToString().ToUpper(), @default); + public static void SmoothLookDir(this GameObject go, Vector3 direction, float dt, float angularVelocity) { var start = go.transform.rotation; diff --git a/NewHorizons/manifest.json b/NewHorizons/manifest.json index 5236f06a..cfffbfb1 100644 --- a/NewHorizons/manifest.json +++ b/NewHorizons/manifest.json @@ -4,7 +4,7 @@ "author": "xen, Bwc9876, clay, MegaPiggy, John, Trifid, Hawkbar, Book", "name": "New Horizons", "uniqueName": "xen.NewHorizons", - "version": "1.10.0", + "version": "1.10.2", "owmlVersion": "2.9.0", "dependencies": [ "JohnCorby.VanillaFix", "_nebula.MenuFramework", "xen.CommonCameraUtility", "dgarro.CustomShipLogModes" ], "conflicts": [ "Raicuparta.QuantumSpaceBuddies", "PacificEngine.OW_CommonResources" ], diff --git a/docs/Pipfile.lock b/docs/Pipfile.lock index 57e6d3dd..4bb7eed8 100644 --- a/docs/Pipfile.lock +++ b/docs/Pipfile.lock @@ -27,11 +27,11 @@ }, "beautifulsoup4": { "hashes": [ - "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30", - "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693" + "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591", + "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234" ], "markers": "python_full_version >= '3.6.0'", - "version": "==4.11.1" + "version": "==4.12.0" }, "certifi": { "hashes": [ @@ -43,97 +43,84 @@ }, "charset-normalizer": { "hashes": [ - "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b", - "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42", - "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d", - "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b", - "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a", - "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59", - "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154", - "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1", - "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c", - "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a", - "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d", - "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6", - "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b", - "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b", - "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783", - "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5", - "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918", - "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555", - "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639", - "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786", - "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e", - "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed", - "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820", - "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8", - "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3", - "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541", - "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14", - "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be", - "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e", - "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76", - "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", - "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c", - "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b", - "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3", - "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc", - "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6", - "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59", - "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4", - "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d", - "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d", - "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3", - "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a", - "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea", - "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6", - "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e", - "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", - "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24", - "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a", - "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58", - "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678", - "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a", - "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c", - "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6", - "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18", - "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174", - "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", - "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f", - "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc", - "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837", - "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41", - "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c", - "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579", - "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753", - "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8", - "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291", - "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087", - "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866", - "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3", - "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d", - "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1", - "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca", - "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e", - "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db", - "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72", - "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d", - "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc", - "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539", - "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d", - "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af", - "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b", - "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602", - "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", - "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478", - "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c", - "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e", - "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479", - "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7", - "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8" + "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", + "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", + "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", + "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", + "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", + "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", + "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", + "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", + "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", + "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", + "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", + "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", + "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", + "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", + "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", + "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", + "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", + "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", + "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", + "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", + "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", + "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", + "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", + "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", + "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", + "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", + "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", + "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", + "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", + "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", + "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", + "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", + "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", + "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", + "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", + "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", + "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", + "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", + "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", + "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", + "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", + "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", + "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", + "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", + "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", + "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", + "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", + "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", + "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", + "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", + "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", + "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", + "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", + "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", + "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", + "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", + "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", + "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", + "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", + "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", + "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", + "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", + "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", + "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", + "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", + "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", + "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", + "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", + "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", + "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", + "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", + "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", + "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", + "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", + "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_full_version >= '3.7.0'", + "version": "==3.1.0" }, "click": { "hashes": [ @@ -153,11 +140,11 @@ }, "elementpath": { "hashes": [ - "sha256:6122419481a4c73101918714274b2cec907feecd04a44b623b4bae4292853328", - "sha256:cca18742dc0f354f79874c41a906e6ce4cc15230b7858d22a861e1ec5946940f" + "sha256:2b1b524223d70fd6dd63a36b9bc32e4919c96a272c2d1454094c4d85086bc6f8", + "sha256:dbd7eba3cf0b3b4934f627ba24851a3e0798ef2bc9104555a4cd831f2e6e8e14" ], "markers": "python_version >= '3.7'", - "version": "==3.0.2" + "version": "==4.1.0" }, "htmlmin": { "hashes": [ @@ -190,11 +177,11 @@ }, "json-schema-for-humans": { "hashes": [ - "sha256:1d4359e25717418e06cd673aec9c5cea2c89466d077ba118884dffa058fe05a6", - "sha256:6c8f470f645ae4d89d0aac7d4fcd1c123e00a0570f90fe2e5200058465c551c2" + "sha256:1e34f1ae053c0884a52bcfc415f8de10a9dc918554523912f53015d202549f37", + "sha256:62a72dd2edb064fb6f2cb6939670185b80a79317b1e7cdb2132634287b142493" ], "markers": "python_version >= '3.7' and python_version < '4.0'", - "version": "==0.44" + "version": "==0.44.4" }, "jsonschema": { "hashes": [ @@ -225,11 +212,11 @@ }, "markdown2": { "hashes": [ - "sha256:528f978beb3dbcf529a139b6c76f6ac6ecf8bb96c131beab751bb095b3873b58", - "sha256:f65b4dbe1e16591b14fd40bc659b8b58d285eab70c1da21f390294fcdec42bb0" + "sha256:7d49ca871d3e0e412c65d7d21fcbc13ae897f7876f3e5f14dd4db3b7fbf27f10", + "sha256:90475aca3d9c8e7df6d70c51de5bbbe9edf7fcf6a380bd1044d321500f5445da" ], "markers": "python_version >= '3.5' and python_version < '4'", - "version": "==2.4.6" + "version": "==2.4.8" }, "markupsafe": { "hashes": [ @@ -304,26 +291,27 @@ }, "menagerie-docs": { "hashes": [ - "sha256:214fb87bf94ce1b814c718ae98e319ef470fe3ea0b01f215ab43e46623289e92", - "sha256:b20d0f099edd3316f00e72ef754d885982a3f80c80c70ca8a01d43721388813b" + "sha256:ad6ff178b3edc493b7e031d932616e4aaef788c2e796494e729fb2fb96c334eb", + "sha256:bfd5b78c8a2931983a1941ee2e96204b93e5ff90f5bbc0e0178c763de42b844f" ], "index": "pypi", - "version": "==0.1.13" + "version": "==0.1.14" }, "more-itertools": { "hashes": [ - "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41", - "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab" + "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d", + "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3" ], "markers": "python_version >= '3.7'", - "version": "==9.0.0" + "version": "==9.1.0" }, "mypy-extensions": { "hashes": [ - "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", - "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" ], - "version": "==0.4.3" + "markers": "python_version >= '3.5'", + "version": "==1.0.0" }, "ndicts": { "hashes": [ @@ -467,10 +455,10 @@ }, "pytz": { "hashes": [ - "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c", - "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326" + "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", + "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" ], - "version": "==2021.3" + "version": "==2023.3" }, "pyyaml": { "hashes": [ @@ -584,19 +572,19 @@ }, "soupsieve": { "hashes": [ - "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759", - "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d" + "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955", + "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a" ], - "markers": "python_version >= '3.6'", - "version": "==2.3.2.post1" + "markers": "python_version >= '3.7'", + "version": "==2.4" }, "typing-extensions": { "hashes": [ - "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", - "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e" + "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", + "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" ], "markers": "python_version >= '3.7'", - "version": "==4.4.0" + "version": "==4.5.0" }, "typing-inspect": { "hashes": [ @@ -607,19 +595,19 @@ }, "urllib3": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305", + "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.14" + "version": "==1.26.15" }, "xmlschema": { "hashes": [ - "sha256:5717a8a239637a9ad7d7563ce676dddf0a8989644c833f96bfc6d157c3cb3750", - "sha256:5ca34ff15dd3276cfb2e3e7b4c8dde4b7d4d27080f333a93b6c3f817e90abddf" + "sha256:0caa96668807b4b51c42a0fe2b6610752bc59f069615df3e34dcfffb962973fd", + "sha256:557f3632b54b6ff10576736bba62e43db84eb60f6465a83818576cd9ffcc1799" ], "markers": "python_version >= '3.7'", - "version": "==2.1.1" + "version": "==2.2.2" } } } diff --git a/docs/content/pages/secret.md b/docs/content/pages/secret.md index 335f5f3b..9e54ecdf 100644 --- a/docs/content/pages/secret.md +++ b/docs/content/pages/secret.md @@ -21,3 +21,5 @@ aaaaaaaaaaaaaaaaaaaaaaaaa ## 9/2/22 Where were you when new horizons docs died, im going gorbo mode + +