CarmenSandiego/Assets/UdonSharp/AudioManager.cs
Jamie Greunbaum 6cb81308f7 - Added functional map points, and a mostly-functional map marker.
- Added the missing Top Grunge portrait and intro theme.
- Added In Jail and Video Music Clue sound effects.
2025-06-21 23:39:32 -04:00

205 lines
6.7 KiB
C#

using System.Net.NetworkInformation;
using UdonSharp;
using UnityEngine;
using VRC.SDK3.UdonNetworkCalling;
using VRC.SDKBase;
using VRC.Udon;
public enum MusicEventType
{
None,
TheChase,
ThinkAboutIt,
RecoverTheLoot,
WhereInTheWorld,
RockapellaIdent
}
public enum SFXEventType
{
None,
Ding,
Buzzer,
TheLoot,
TheWarrant,
InJail
}
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class AudioManager : UdonSharpBehaviour
{
[SerializeField] private AudioSource _MusicPlayer = null;
[SerializeField] private AudioSource _SFXPlayer = null;
[Header("Music")]
[SerializeField] private AudioClip _TheChase = null;
[SerializeField] private AudioClip _ThinkAboutIt = null;
[SerializeField] private AudioClip _RecoverTheLoot = null;
[SerializeField] private AudioClip _WhereInTheWorld = null;
[SerializeField] private AudioClip _RockapellaIdent = null;
[Header("SFX")]
[SerializeField] private AudioClip _Ding = null;
[SerializeField] private AudioClip _Buzzer = null;
[SerializeField] private AudioClip _TheLoot = null;
[SerializeField] private AudioClip _TheWarrant = null;
[SerializeField] private AudioClip _InJail = null;
[Header("Crook Themes")]
[SerializeField] private AudioClip _CrookTheme_Contessa = null;
[SerializeField] private AudioClip _CrookTheme_DoubleTrouble = null;
[SerializeField] private AudioClip _CrookTheme_EarthaBrute = null;
[SerializeField] private AudioClip _CrookTheme_Kneemoi = null;
[SerializeField] private AudioClip _CrookTheme_PattyLarceny = null;
[SerializeField] private AudioClip _CrookTheme_Robocrook = null;
[SerializeField] private AudioClip _CrookTheme_SarahNade = null;
[SerializeField] private AudioClip _CrookTheme_TopGrunge = null;
[SerializeField] private AudioClip _CrookTheme_VicTheSlick = null;
[SerializeField] private AudioClip _CrookTheme_WonderRat = null;
[NetworkCallable]
public void PlayMusic(MusicEventType MusicEvent)
{
_PlayMusic_Internal(MusicEvent, false);
}
[NetworkCallable]
public void PlayMusicLoop(MusicEventType MusicEvent)
{
_PlayMusic_Internal(MusicEvent, true);
}
[NetworkCallable]
public void StopMusic()
{
_PlayMusic_Internal(MusicEventType.None, false);
}
private void _PlayMusic_Internal(MusicEventType MusicEvent, bool Loop)
{
_MusicPlayer.Stop();
switch (MusicEvent)
{
case MusicEventType.TheChase: _MusicPlayer.clip = _TheChase; break;
case MusicEventType.ThinkAboutIt: _MusicPlayer.clip = _ThinkAboutIt; break;
case MusicEventType.RecoverTheLoot: _MusicPlayer.clip = _RecoverTheLoot; break;
case MusicEventType.WhereInTheWorld: _MusicPlayer.clip = _WhereInTheWorld; break;
case MusicEventType.RockapellaIdent: _MusicPlayer.clip = _RockapellaIdent; break;
default: _MusicPlayer.clip = null; break;
}
_MusicPlayer.loop = Loop;
if (_MusicPlayer.clip != null)
_MusicPlayer.Play();
}
[NetworkCallable]
public void PlaySFX(SFXEventType SFXEvent)
{
_PlaySFX_Internal(SFXEvent);
}
[NetworkCallable]
public void PlaySFXAtPitch(SFXEventType SFXEvent, float Pitch)
{
_PlaySFX_Internal(SFXEvent, Pitch);
}
private void _PlaySFX_Internal(SFXEventType SFXEvent, float Pitch = 1.0f)
{
_SFXPlayer.Stop();
switch (SFXEvent)
{
case SFXEventType.Ding: _SFXPlayer.clip = _Ding; break;
case SFXEventType.Buzzer: _SFXPlayer.clip = _Buzzer; break;
case SFXEventType.TheLoot: _SFXPlayer.clip = _TheLoot; break;
case SFXEventType.TheWarrant: _SFXPlayer.clip = _TheWarrant; break;
case SFXEventType.InJail: _SFXPlayer.clip = _InJail; break;
default: _SFXPlayer.clip = null; break;
}
if (_SFXPlayer.clip != null)
{
_SFXPlayer.pitch = Pitch;
_SFXPlayer.Play();
}
}
[NetworkCallable]
public void PlayCrookTheme(AccusedCrook Crook)
{
_PlayCrookTheme_Internal(Crook);
}
private void _PlayCrookTheme_Internal(AccusedCrook Crook)
{
_SFXPlayer.Stop();
switch (Crook)
{
case AccusedCrook.Contessa: _SFXPlayer.clip = _CrookTheme_Contessa; break;
case AccusedCrook.DoubleTrouble: _SFXPlayer.clip = _CrookTheme_DoubleTrouble; break;
case AccusedCrook.EarthaBrute: _SFXPlayer.clip = _CrookTheme_EarthaBrute; break;
case AccusedCrook.Kneemoi: _SFXPlayer.clip = _CrookTheme_Kneemoi; break;
case AccusedCrook.PattyLarceny: _SFXPlayer.clip = _CrookTheme_PattyLarceny; break;
case AccusedCrook.Robocrook: _SFXPlayer.clip = _CrookTheme_Robocrook; break;
case AccusedCrook.SarahNade: _SFXPlayer.clip = _CrookTheme_SarahNade; break;
case AccusedCrook.TopGrunge: _SFXPlayer.clip = _CrookTheme_TopGrunge; break;
case AccusedCrook.VicTheSlick: _SFXPlayer.clip = _CrookTheme_VicTheSlick; break;
case AccusedCrook.WonderRat: _SFXPlayer.clip = _CrookTheme_WonderRat; break;
default: _SFXPlayer.clip = null; break;
}
_SFXPlayer.pitch = 1.0f;
if (_SFXPlayer.clip != null)
{
_SFXPlayer.Play();
}
}
// A messy group of variables that are used for pitch correction of sound effects
// Since Udon doesn't support accessing public static values in structs, we're doing it here
// As5 = 932.33 Hz, PitchShift = TargetNoteFreq / As5Freq
public const float As4 = 0.49999463709201677517617152724894f;
public const float B4 = 0.52972659895101519848122445915073f;
public const float C5 = 0.56122832044447781364967339890382f;
public const float Cs5 = 0.5946070597320691171580878015295f;
public const float D5 = 0.62995934915748715583538017654693f;
public const float Ds5 = 0.66741389851232932545343386998166f;
public const float E5 = 0.70709941758819302178413222785923f;
public const float F5 = 0.74915534199264209024701554170734f;
public const float Fs5 = 0.79369965570130747696631021204938f;
public const float G5 = 0.84089324595368592665687042141731f;
public const float Gs5 = 0.89089699998927418403355035234305f;
public const float A5 = 0.94387180504756899381120418735855f;
public const float As5 = 1.0f;
public const float B5 = 1.0594639237179968466101058638036f;
public const float C6 = 1.1224566408889556272993467978076f;
public const float Cs6 = 1.1892033936481717846685186575569f;
public const float D6 = 1.2599186983149743116707603530939f;
public const float Ds6 = 1.3348385228406251005545246854654f;
public const float E6 = 1.4142095609923524932159214012206f;
public const float F6 = 1.4982999581693177308463741379125f;
public const float Fs6 = 1.5873993114026149539326204240988f;
public const float G6 = 1.6817864919073718533137408428346f;
public const float Gs6 = 1.7817939999785483680671007046861f;
public const float A6 = 1.8877436100951379876224083747171f;
public const float As6 = 2.0f;
public const float B6 = 2.1183486533738054122467366704922f;
public const float C7 = 2.2449132817779112545986935956153f;
public const float Cs7 = 2.3784067872963435693370373151137f;
}