diff --git a/NewHorizons/Components/EOTE/DreamWorldEndTimes.cs b/NewHorizons/Components/EOTE/DreamWorldEndTimes.cs
new file mode 100644
index 00000000..efe845d0
--- /dev/null
+++ b/NewHorizons/Components/EOTE/DreamWorldEndTimes.cs
@@ -0,0 +1,41 @@
+using NewHorizons.Utility.Files;
+using OWML.Common;
+using UnityEngine;
+
+namespace NewHorizons.Components.EOTE
+{
+ public class DreamWorldEndTimes : MonoBehaviour
+ {
+ private IModBehaviour _mod;
+ private string _endTimesAudio;
+ private IModBehaviour _dreamMod;
+ private string _endTimesDreamAudio;
+
+ public void SetEndTimesAudio(string audio, IModBehaviour mod)
+ {
+ _mod = mod;
+ _endTimesAudio = audio;
+ }
+
+ public void AssignEndTimes(OWAudioSource endTimesSource) => Assign(endTimesSource, _endTimesAudio, _mod, AudioType.EndOfTime);
+
+ public void SetEndTimesDreamAudio(string audio, IModBehaviour mod)
+ {
+ _dreamMod = mod;
+ _endTimesDreamAudio = audio;
+ }
+
+ public void AssignEndTimesDream(OWAudioSource endTimesSource) => Assign(endTimesSource, _endTimesDreamAudio, _dreamMod, AudioType.EndOfTime_Dream);
+
+ public static void Assign(OWAudioSource endTimesSource, string endTimesClip, IModBehaviour mod, AudioType defaultClip)
+ {
+ endTimesSource.Stop();
+ if (!string.IsNullOrWhiteSpace(endTimesClip))
+ {
+ AudioUtilities.SetAudioClip(endTimesSource, endTimesClip, mod);
+ }
+ else
+ endTimesSource.AssignAudioLibraryClip(defaultClip);
+ }
+ }
+}
\ No newline at end of file
diff --git a/NewHorizons/External/Configs/StarSystemConfig.cs b/NewHorizons/External/Configs/StarSystemConfig.cs
index 28ecc4dd..a5fcb088 100644
--- a/NewHorizons/External/Configs/StarSystemConfig.cs
+++ b/NewHorizons/External/Configs/StarSystemConfig.cs
@@ -82,11 +82,14 @@ namespace NewHorizons.External.Configs
[Obsolete("travelAudioFilePath is deprecated, please use travelAudio instead")]
public string travelAudioFilePath;
- ///
- /// The audio that will play when travelling in space. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list.
- ///
+ [Obsolete("travelAudio is deprecated, please use travelAudio instead")]
public string travelAudio;
+ ///
+ /// Replace music that plays globally
+ ///
+ public GlobalMusicModule GlobalMusic;
+
///
/// Configure warping to this system with the vessel
///
@@ -192,6 +195,45 @@ namespace NewHorizons.External.Configs
public string backPath;
}
+ [JsonObject]
+ public class GlobalMusicModule
+ {
+ ///
+ /// The audio that will play when travelling in space. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list.
+ ///
+ public string travelAudio;
+
+ ///
+ /// The audio that will play right before the loop ends. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list.
+ ///
+ public string endTimesAudio;
+
+ ///
+ /// The audio that will play right before the loop ends while inside the dreamworld. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list.
+ ///
+ public string endTimesDreamAudio;
+
+ ///
+ /// The audio that will play when travelling through a bramble dimension. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list.
+ ///
+ public string brambleDimensionAudio;
+
+ ///
+ /// The audio that will play when you leave the ash twin project after taking out the advanced warp core. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list.
+ ///
+ public string finalEndTimesIntroAudio;
+
+ ///
+ /// The audio that will loop after the final end times intro. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list.
+ ///
+ public string finalEndTimesLoopAudio;
+
+ ///
+ /// The audio that will loop after the final end times intro while inside a bramble dimension. Can be a path to a .wav/.ogg/.mp3 file, or taken from the AudioClip list.
+ ///
+ public string finalEndTimesBrambleDimensionAudio;
+ }
+
[JsonObject]
public class VesselModule
{
@@ -283,7 +325,6 @@ namespace NewHorizons.External.Configs
// If current one is null take the other
factRequiredForWarp = string.IsNullOrEmpty(factRequiredForWarp) ? otherConfig.factRequiredForWarp : factRequiredForWarp;
Skybox = Skybox == null ? otherConfig.Skybox : Skybox;
- travelAudio = string.IsNullOrEmpty(travelAudio) ? otherConfig.travelAudio : travelAudio;
// False by default so if one is true go true
mapRestricted = mapRestricted || otherConfig.mapRestricted;
@@ -302,6 +343,21 @@ namespace NewHorizons.External.Configs
Vessel ??= otherConfig.Vessel;
}
+ if (GlobalMusic != null && otherConfig.GlobalMusic != null)
+ {
+ GlobalMusic.travelAudio = string.IsNullOrEmpty(GlobalMusic.travelAudio) ? otherConfig.GlobalMusic.travelAudio : GlobalMusic.travelAudio;
+ GlobalMusic.endTimesAudio = string.IsNullOrEmpty(GlobalMusic.endTimesAudio) ? otherConfig.GlobalMusic.endTimesAudio : GlobalMusic.endTimesAudio;
+ GlobalMusic.endTimesDreamAudio = string.IsNullOrEmpty(GlobalMusic.endTimesDreamAudio) ? otherConfig.GlobalMusic.endTimesDreamAudio : GlobalMusic.endTimesDreamAudio;
+ GlobalMusic.brambleDimensionAudio = string.IsNullOrEmpty(GlobalMusic.brambleDimensionAudio) ? otherConfig.GlobalMusic.brambleDimensionAudio : GlobalMusic.brambleDimensionAudio;
+ GlobalMusic.finalEndTimesIntroAudio = string.IsNullOrEmpty(GlobalMusic.finalEndTimesIntroAudio) ? otherConfig.GlobalMusic.finalEndTimesIntroAudio : GlobalMusic.finalEndTimesIntroAudio;
+ GlobalMusic.finalEndTimesLoopAudio = string.IsNullOrEmpty(GlobalMusic.finalEndTimesLoopAudio) ? otherConfig.GlobalMusic.finalEndTimesLoopAudio : GlobalMusic.finalEndTimesLoopAudio;
+ GlobalMusic.finalEndTimesBrambleDimensionAudio = string.IsNullOrEmpty(GlobalMusic.finalEndTimesBrambleDimensionAudio) ? otherConfig.GlobalMusic.finalEndTimesBrambleDimensionAudio : GlobalMusic.finalEndTimesBrambleDimensionAudio;
+ }
+ else
+ {
+ GlobalMusic ??= otherConfig.GlobalMusic;
+ }
+
entryPositions = Concatenate(entryPositions, otherConfig.entryPositions);
curiosities = Concatenate(curiosities, otherConfig.curiosities);
initialReveal = Concatenate(initialReveal, otherConfig.initialReveal);
@@ -319,6 +375,11 @@ namespace NewHorizons.External.Configs
#pragma warning disable 612, 618
if (!string.IsNullOrEmpty(travelAudioClip)) travelAudio = travelAudioClip;
if (!string.IsNullOrEmpty(travelAudioFilePath)) travelAudio = travelAudioFilePath;
+ if (!string.IsNullOrEmpty(travelAudio))
+ {
+ if (GlobalMusic == null) GlobalMusic = new GlobalMusicModule();
+ if (string.IsNullOrEmpty(GlobalMusic.travelAudio)) GlobalMusic.travelAudio = travelAudio;
+ }
if (coords != null || vesselPosition != null || vesselRotation != null || warpExitPosition != null || warpExitRotation != null)
{
if (Vessel == null)
diff --git a/NewHorizons/Handlers/SystemCreationHandler.cs b/NewHorizons/Handlers/SystemCreationHandler.cs
index 5936434a..4832c50c 100644
--- a/NewHorizons/Handlers/SystemCreationHandler.cs
+++ b/NewHorizons/Handlers/SystemCreationHandler.cs
@@ -8,6 +8,7 @@ using NewHorizons.Utility.OuterWilds;
using UnityEngine;
using Object = UnityEngine.Object;
using NewHorizons.OtherMods;
+using NewHorizons.Components.EOTE;
namespace NewHorizons.Handlers
{
@@ -46,9 +47,42 @@ namespace NewHorizons.Handlers
TimeLoopUtilities.SetLoopDuration(system.Config.loopDuration);
}
- if (!string.IsNullOrEmpty(system.Config.travelAudio))
+ if (!string.IsNullOrEmpty(system.Config.GlobalMusic.travelAudio))
{
- Delay.FireOnNextUpdate(() => AudioUtilities.SetAudioClip(Locator.GetGlobalMusicController()._travelSource, system.Config.travelAudio, system.Mod));
+ Delay.FireOnNextUpdate(() => AudioUtilities.SetAudioClip(Locator.GetGlobalMusicController()._travelSource, system.Config.GlobalMusic.travelAudio, system.Mod));
+ }
+
+ if (!string.IsNullOrEmpty(system.Config.GlobalMusic.endTimesAudio))
+ {
+ Delay.FireOnNextUpdate(() => {
+ Locator.GetGlobalMusicController().gameObject.GetAddComponent().SetEndTimesAudio(system.Config.GlobalMusic.endTimesAudio, system.Mod);
+ AudioUtilities.SetAudioClip(Locator.GetGlobalMusicController()._endTimesSource, system.Config.GlobalMusic.endTimesAudio, system.Mod);
+ });
+ }
+
+ if (!string.IsNullOrEmpty(system.Config.GlobalMusic.endTimesDreamAudio))
+ {
+ Delay.FireOnNextUpdate(() => Locator.GetGlobalMusicController().gameObject.GetAddComponent().SetEndTimesDreamAudio(system.Config.GlobalMusic.endTimesDreamAudio, system.Mod));
+ }
+
+ if (!string.IsNullOrEmpty(system.Config.GlobalMusic.brambleDimensionAudio))
+ {
+ Delay.FireOnNextUpdate(() => AudioUtilities.SetAudioClip(Locator.GetGlobalMusicController()._darkBrambleSource, system.Config.GlobalMusic.brambleDimensionAudio, system.Mod));
+ }
+
+ if (!string.IsNullOrEmpty(system.Config.GlobalMusic.finalEndTimesIntroAudio))
+ {
+ Delay.FireOnNextUpdate(() => AudioUtilities.SetAudioClip(Locator.GetGlobalMusicController()._finalEndTimesIntroSource, system.Config.GlobalMusic.finalEndTimesIntroAudio, system.Mod));
+ }
+
+ if (!string.IsNullOrEmpty(system.Config.GlobalMusic.finalEndTimesLoopAudio))
+ {
+ Delay.FireOnNextUpdate(() => AudioUtilities.SetAudioClip(Locator.GetGlobalMusicController()._finalEndTimesLoopSource, system.Config.GlobalMusic.finalEndTimesLoopAudio, system.Mod));
+ }
+
+ if (!string.IsNullOrEmpty(system.Config.GlobalMusic.finalEndTimesBrambleDimensionAudio))
+ {
+ Delay.FireOnNextUpdate(() => AudioUtilities.SetAudioClip(Locator.GetGlobalMusicController()._finalEndTimesDarkBrambleSource, system.Config.GlobalMusic.finalEndTimesBrambleDimensionAudio, system.Mod));
}
}
}
diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs
index 7aac5449..3b38bd35 100644
--- a/NewHorizons/Main.cs
+++ b/NewHorizons/Main.cs
@@ -690,7 +690,7 @@ namespace NewHorizons
if (SystemDict.ContainsKey(starSystemName))
{
- if (string.IsNullOrEmpty(SystemDict[starSystemName].Config.travelAudio) && SystemDict[starSystemName].Config.Skybox == null)
+ if (SystemDict[starSystemName].Config.GlobalMusic == null && SystemDict[starSystemName].Config.Skybox == null)
SystemDict[starSystemName].Mod = mod;
SystemDict[starSystemName].Config.Merge(starSystemConfig);
}
diff --git a/NewHorizons/Patches/GlobalMusicControllerPatches.cs b/NewHorizons/Patches/GlobalMusicControllerPatches.cs
index e182e093..d1ec723d 100644
--- a/NewHorizons/Patches/GlobalMusicControllerPatches.cs
+++ b/NewHorizons/Patches/GlobalMusicControllerPatches.cs
@@ -1,4 +1,5 @@
-using HarmonyLib;
+using HarmonyLib;
+using NewHorizons.Components.EOTE;
using UnityEngine;
namespace NewHorizons.Patches;
@@ -35,4 +36,59 @@ public class GlobalMusicControllerPatches
return false;
}
+
+
+ [HarmonyPrefix]
+ [HarmonyPatch(nameof(GlobalMusicController.OnEnterDreamWorld))]
+ public static bool GlobalMusicController_OnEnterDreamWorld(GlobalMusicController __instance)
+ {
+ if (__instance._playingFinalEndTimes)
+ {
+ __instance._finalEndTimesIntroSource.Stop();
+ __instance._finalEndTimesLoopSource.Stop();
+ __instance._finalEndTimesDarkBrambleSource.FadeIn(1f);
+ }
+ else
+ {
+ if (__instance.TryGetComponent(out DreamWorldEndTimes dreamWorldEndTimes))
+ {
+ dreamWorldEndTimes.AssignEndTimesDream(__instance._endTimesSource);
+ }
+ else
+ {
+ __instance._endTimesSource.Stop();
+ __instance._endTimesSource.AssignAudioLibraryClip(AudioType.EndOfTime_Dream);
+ }
+ __instance._playingEndTimes = false;
+ }
+
+ return false;
+ }
+
+
+ [HarmonyPrefix]
+ [HarmonyPatch(nameof(GlobalMusicController.OnExitDreamWorld))]
+ public static bool GlobalMusicController_OnExitDreamWorld(GlobalMusicController __instance)
+ {
+ if (__instance._playingFinalEndTimes)
+ {
+ __instance._finalEndTimesLoopSource.FadeIn(1f);
+ __instance._finalEndTimesDarkBrambleSource.Stop();
+ }
+ else
+ {
+ if (__instance.TryGetComponent(out DreamWorldEndTimes dreamWorldEndTimes))
+ {
+ dreamWorldEndTimes.AssignEndTimesDream(__instance._endTimesSource);
+ }
+ else
+ {
+ __instance._endTimesSource.Stop();
+ __instance._endTimesSource.AssignAudioLibraryClip(AudioType.EndOfTime);
+ }
+ __instance._playingEndTimes = false;
+ }
+
+ return false;
+ }
}