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; + } }