Files
ichni_Official/Assets/Scripts/Game/GameElements/Notes/AudioSubmodule/NoteAudioSubmodule.cs

174 lines
5.9 KiB
C#
Raw Normal View History

2025-06-03 02:42:28 -04:00
using System;
using System.Collections.Generic;
2026-03-14 03:13:10 -04:00
using System.Reflection;
2025-06-03 02:42:28 -04:00
using Ichni.RhythmGame.Beatmap;
2026-03-14 03:13:10 -04:00
using SLSUtilities.WwiseAssistance;
2025-06-03 02:42:28 -04:00
namespace Ichni.RhythmGame
{
public partial class NoteAudioSubmodule : SubmoduleBase
{
2026-07-17 17:34:36 -04:00
#region Audio Settings
2025-06-03 02:42:28 -04:00
public List<string> generalJudgeAudioList;
public List<string> perfectAudioList;
public List<string> goodAudioList;
public List<string> badAudioList;
public List<string> missAudioList;
public List<string> holdStartAudioList;
2026-07-17 17:34:36 -04:00
public List<string> holdLoopAudioList;
public List<string> holdEndAudioList;
2026-03-14 03:13:10 -04:00
#endregion
2026-07-17 17:34:36 -04:00
#region GC-Free Wwise IDs
2026-03-14 03:13:10 -04:00
private uint[] _generalJudgeAudioIds;
private uint[] _perfectAudioIds;
private uint[] _goodAudioIds;
private uint[] _badAudioIds;
private uint[] _missAudioIds;
private uint[] _holdStartAudioIds;
2026-07-17 17:34:36 -04:00
private uint[] _holdEndAudioIds;
2025-06-03 02:42:28 -04:00
private NoteBase note => attachedGameElement as NoteBase;
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-07-17 17:34:36 -04:00
#region Initialization
2025-06-03 02:42:28 -04:00
public NoteAudioSubmodule(NoteBase attachedGameElement, string defaultAudio) : base(attachedGameElement)
{
2026-07-17 17:34:36 -04:00
generalJudgeAudioList = new List<string> { defaultAudio };
2025-06-03 02:42:28 -04:00
perfectAudioList = new List<string>();
goodAudioList = new List<string>();
badAudioList = new List<string>();
missAudioList = new List<string>();
holdStartAudioList = new List<string>();
2026-07-17 17:34:36 -04:00
holdLoopAudioList = new List<string>();
holdEndAudioList = new List<string>();
2025-06-03 02:42:28 -04:00
if (!HaveSameSubmodule)
{
2026-07-17 17:34:36 -04:00
note.NoteAudioSubmodule = this;
2025-06-03 02:42:28 -04:00
}
2026-07-17 17:34:36 -04:00
2025-07-08 14:28:40 -04:00
InitializeAudio();
2025-06-03 02:42:28 -04:00
}
public NoteAudioSubmodule(NoteBase attachedGameElement, List<string> generalJudgeAudioList,
List<string> perfectAudioList, List<string> goodAudioList, List<string> badAudioList,
2026-07-17 17:34:36 -04:00
List<string> missAudioList, List<string> holdStartAudioList,
List<string> holdLoopAudioList = null, List<string> holdEndAudioList = null) : base(attachedGameElement)
2025-06-03 02:42:28 -04:00
{
2026-03-14 03:13:10 -04:00
this.generalJudgeAudioList = generalJudgeAudioList ?? new List<string>();
this.perfectAudioList = perfectAudioList ?? new List<string>();
this.goodAudioList = goodAudioList ?? new List<string>();
this.badAudioList = badAudioList ?? new List<string>();
this.missAudioList = missAudioList ?? new List<string>();
2025-06-03 02:42:28 -04:00
this.holdStartAudioList = holdStartAudioList ?? new List<string>();
2026-07-17 17:34:36 -04:00
this.holdLoopAudioList = holdLoopAudioList ?? new List<string>();
this.holdEndAudioList = holdEndAudioList ?? new List<string>();
2025-06-03 02:42:28 -04:00
if (!HaveSameSubmodule)
{
2026-07-17 17:34:36 -04:00
note.NoteAudioSubmodule = this;
2025-06-03 02:42:28 -04:00
}
2025-07-08 14:28:40 -04:00
InitializeAudio();
}
public void InitializeAudio()
{
2026-03-14 03:13:10 -04:00
_generalJudgeAudioIds = ParseWwiseEventIDs(generalJudgeAudioList);
_perfectAudioIds = ParseWwiseEventIDs(perfectAudioList);
_goodAudioIds = ParseWwiseEventIDs(goodAudioList);
_badAudioIds = ParseWwiseEventIDs(badAudioList);
_missAudioIds = ParseWwiseEventIDs(missAudioList);
_holdStartAudioIds = ParseWwiseEventIDs(holdStartAudioList);
2026-07-17 17:34:36 -04:00
_holdEndAudioIds = ParseWwiseEventIDs(holdEndAudioList);
2026-03-14 03:13:10 -04:00
}
2026-07-17 17:34:36 -04:00
2026-03-14 03:13:10 -04:00
private uint[] ParseWwiseEventIDs(List<string> audioNames)
{
2026-07-17 17:34:36 -04:00
if (audioNames == null || audioNames.Count == 0) return Array.Empty<uint>();
2026-03-14 03:13:10 -04:00
List<uint> ids = new List<uint>(audioNames.Count);
Type eventsType = typeof(AK.EVENTS);
2026-07-17 17:34:36 -04:00
2026-03-14 03:13:10 -04:00
for (int i = 0; i < audioNames.Count; i++)
2025-07-08 14:28:40 -04:00
{
2026-03-14 03:13:10 -04:00
if (string.IsNullOrEmpty(audioNames[i])) continue;
2026-07-17 17:34:36 -04:00
2026-03-14 03:13:10 -04:00
string upperName = audioNames[i].ToUpper();
FieldInfo field = eventsType.GetField(upperName, BindingFlags.Public | BindingFlags.Static);
2026-07-17 17:34:36 -04:00
2026-03-14 03:13:10 -04:00
if (field != null)
{
ids.Add((uint)field.GetValue(null));
}
else
{
2026-07-17 17:34:36 -04:00
UnityEngine.Debug.LogWarning($"[Wwise] AK.EVENTS does not contain event name: {upperName}");
2026-03-14 03:13:10 -04:00
}
2025-07-08 14:28:40 -04:00
}
2026-07-17 17:34:36 -04:00
2026-03-14 03:13:10 -04:00
return ids.ToArray();
2025-06-03 02:42:28 -04:00
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
}
2026-07-17 17:34:36 -04:00
#region Audio Playback Methods
2025-06-03 02:42:28 -04:00
public partial class NoteAudioSubmodule
{
public void PlayHoldStartAudio()
{
2026-03-14 03:13:10 -04:00
PlayAudioInternal(_holdStartAudioIds);
2025-06-03 02:42:28 -04:00
}
2025-07-08 14:28:40 -04:00
2026-07-17 17:34:36 -04:00
public void PlayHoldEndAudio()
{
if (_holdEndAudioIds != null && _holdEndAudioIds.Length > 0)
{
PlayAudioInternal(_holdEndAudioIds);
return;
}
PlayGeneralJudgeAudios();
}
2025-07-08 14:28:40 -04:00
public void PlayGeneralJudgeAudios()
{
2026-03-14 03:13:10 -04:00
PlayAudioInternal(_generalJudgeAudioIds);
2025-07-08 14:28:40 -04:00
}
2026-07-17 17:34:36 -04:00
2025-06-03 02:42:28 -04:00
public void PlayNoteJudgeAudios(NoteBase.NoteJudgeType judgeType)
{
switch (judgeType)
{
2026-07-17 17:34:36 -04:00
case NoteBase.NoteJudgeType.Perfect:
PlayAudioInternal(_perfectAudioIds);
break;
case NoteBase.NoteJudgeType.Good:
PlayAudioInternal(_goodAudioIds);
break;
case NoteBase.NoteJudgeType.Bad:
PlayAudioInternal(_badAudioIds);
break;
case NoteBase.NoteJudgeType.Miss:
PlayAudioInternal(_missAudioIds);
break;
2025-06-03 02:42:28 -04:00
}
}
2026-03-14 03:13:10 -04:00
private void PlayAudioInternal(uint[] audioIds)
2025-06-03 02:42:28 -04:00
{
2026-03-14 03:13:10 -04:00
if (audioIds == null) return;
for (int i = 0; i < audioIds.Length; i++)
2025-06-03 02:42:28 -04:00
{
2026-03-14 03:13:10 -04:00
AkSoundEngine.PostEvent(audioIds[i], AudioManager.Instance.gameObject);
2025-06-03 02:42:28 -04:00
}
}
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-07-17 17:34:36 -04:00
#region Beatmap
2025-06-03 02:42:28 -04:00
2026-07-17 17:34:36 -04:00
#endregion
}