diff --git a/MuzikaGromche/Plugin.cs b/MuzikaGromche/Plugin.cs index 4442245..05246d3 100644 --- a/MuzikaGromche/Plugin.cs +++ b/MuzikaGromche/Plugin.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Collections.Generic; +using System.Linq; using BepInEx; using HarmonyLib; using UnityEngine; @@ -10,58 +11,68 @@ namespace MuzikaGromche [BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)] public class Plugin : BaseUnityPlugin { - public static AudioClip AudioStart; - public static AudioClip AudioLoop; + public static Track[] Tracks = [ + new Track + { + Name = "MuzikaGromche", + WindUpTimer = 46.3f, + Bpm = 120f, + }, + new Track + { + Name = "VseVZale", + WindUpTimer = 39f, + Bpm = 138f, + } + ]; public static Coroutine JesterLightSwitching; + public static Track CurrentTrack; private void Awake() { string text = Info.Location.TrimEnd((PluginInfo.PLUGIN_NAME + ".dll").ToCharArray()); - UnityWebRequest audioClipStart = UnityWebRequestMultimedia.GetAudioClip("File://" + text + "MuzikaGromcheStart.mp3", AudioType.MPEG); - UnityWebRequest audioClipLoop = UnityWebRequestMultimedia.GetAudioClip("File://" + text + "MuzikaGromcheLoop.mp3", AudioType.MPEG); - audioClipStart.SendWebRequest(); - audioClipLoop.SendWebRequest(); - while (!audioClipStart.isDone || !audioClipLoop.isDone) { } - if (audioClipStart.result == UnityWebRequest.Result.Success && audioClipLoop.result == UnityWebRequest.Result.Success) { - AudioStart = DownloadHandlerAudioClip.GetContent(audioClipStart); - AudioLoop = DownloadHandlerAudioClip.GetContent(audioClipLoop); + UnityWebRequest[] requests = new UnityWebRequest[Tracks.Length * 2]; + for (int i = 0; i < Tracks.Length; i++) { + Track track = Tracks[i]; + requests[i * 2] = UnityWebRequestMultimedia.GetAudioClip($"File://{text}{track.Name}Start.mp3", AudioType.MPEG); + requests[i * 2 + 1] = UnityWebRequestMultimedia.GetAudioClip($"File://{text}{track.Name}Loop.mp3", AudioType.MPEG); + requests[i * 2].SendWebRequest(); + requests[i * 2 + 1].SendWebRequest(); + } + + while (!requests.All(request => request.isDone)) { } + + if (requests.All(request => request.result == UnityWebRequest.Result.Success)) { + for (int i = 0; i < Tracks.Length; i++) { + Tracks[i].LoadedStart = DownloadHandlerAudioClip.GetContent(requests[i * 2]); + Tracks[i].LoadedLoop = DownloadHandlerAudioClip.GetContent(requests[i * 2 + 1]); + } new Harmony(PluginInfo.PLUGIN_NAME).PatchAll(typeof(JesterPatch)); - Logger.LogInfo("Muzika gromche, glaza zakryvaj! " + PluginInfo.PLUGIN_VERSION); } else { Logger.LogError("Could not load audio file"); } } } + public class Track + { + public string Name; + public float WindUpTimer; + public float Bpm; + public AudioClip LoadedStart; + public AudioClip LoadedLoop; + } + [HarmonyPatch(typeof(JesterAI))] internal class JesterPatch { - [HarmonyPatch("Start")] - [HarmonyPostfix] - public static void AudioPatch(JesterAI __instance) - { - __instance.popGoesTheWeaselTheme = Plugin.AudioStart; - __instance.screamingSFX = Plugin.AudioLoop; - } - - [HarmonyPatch("SetJesterInitialValues")] - [HarmonyPostfix] - public static void ForceTime(JesterAI __instance) - { - __instance.popUpTimer = 46.3f; - } - [HarmonyPatch("Update")] [HarmonyPrefix] public static void DoNotStopTheMusicPrefix(JesterAI __instance, out State __state) { __state = new State(); __state.prevStateindex = __instance.previousState; - if (__instance.currentBehaviourStateIndex is 1 or 2) { - __state.farAudio = __instance.farAudio; - __instance.farAudio = __instance.creatureSFX; - } } static List colors = [Color.magenta, Color.cyan, Color.green, Color.yellow]; @@ -81,7 +92,7 @@ namespace MuzikaGromche i += 1; if (i >= colors.Count) i = 0; - yield return new WaitForSeconds(0.5f); + yield return new WaitForSeconds(60f / Plugin.CurrentTrack.Bpm); } } @@ -89,16 +100,22 @@ namespace MuzikaGromche [HarmonyPostfix] public static void DoNotStopTheMusic(JesterAI __instance, State __state) { - if (__state.farAudio != null) + if (__instance.currentBehaviourStateIndex is 1 && __state.prevStateindex != 1) { - __instance.farAudio = __state.farAudio; + __instance.farAudio.Stop(); + __instance.farAudio.Pause(); } if (__instance.currentBehaviourStateIndex is 1 && !__instance.farAudio.isPlaying) { + var seed = RoundManager.Instance.dungeonGenerator.Generator.ChosenSeed; + var trackId = seed % Plugin.Tracks.Length; + Debug.Log($"Seed is {seed}, chosen track is {trackId} out of {Plugin.Tracks.Length} tracks"); + Plugin.CurrentTrack = Plugin.Tracks[trackId]; + __instance.popUpTimer = Plugin.CurrentTrack.WindUpTimer; Debug.Log($"Playing start music: maxDistance: {__instance.farAudio.maxDistance}, minDistance: {__instance.farAudio.minDistance}, volume: {__instance.farAudio.volume}, spread: {__instance.farAudio.spread}"); __instance.farAudio.maxDistance = 150; - __instance.farAudio.PlayOneShot(Plugin.AudioStart); + __instance.farAudio.PlayOneShot(Plugin.CurrentTrack.LoadedStart); } if (__instance.currentBehaviourStateIndex is 2 && __state.prevStateindex != 2) @@ -130,7 +147,7 @@ namespace MuzikaGromche { Debug.Log($"Playing loop music: maxDistance: {__instance.creatureVoice.maxDistance}, minDistance: {__instance.creatureVoice.minDistance}, volume: {__instance.creatureVoice.volume}, spread: {__instance.creatureVoice.spread}"); __instance.creatureVoice.maxDistance = 150; - __instance.creatureVoice.clip = Plugin.AudioLoop; + __instance.creatureVoice.clip = Plugin.CurrentTrack.LoadedLoop; __instance.creatureVoice.Play(); } } @@ -138,7 +155,6 @@ namespace MuzikaGromche internal class State { - public AudioSource farAudio; public int prevStateindex; } }