Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Assets/Scripts/Gameplay/Audio/AudioService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,9 @@ public AudioClip AudioClip

public Dictionary<string, AudioClip> SfxAudioClips => Services.Hitsound.SfxAudioClips;

private int FullOffset => Values.ChartAudioOffset + Mathf.RoundToInt(Settings.GlobalAudioOffset.Value * playbackSpeed);
public int FullOffset => Values.ChartAudioOffset + Mathf.RoundToInt(Settings.GlobalAudioOffset.Value * playbackSpeed);

private int GlobalOffset => Mathf.RoundToInt(Settings.GlobalAudioOffset.Value * playbackSpeed);
public int GlobalOffset => Mathf.RoundToInt(Settings.GlobalAudioOffset.Value * playbackSpeed);

public void SetAudioTimingSilent(int timing)
{
Expand Down
16 changes: 8 additions & 8 deletions Assets/Scripts/Gameplay/Data/Events/ArcTap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ public class ArcTap : Note, INote, IArcTapJudgementReceiver
private bool judgementRequestSent = false;
private bool isHit = false;
private bool isSfx;
private bool sfxPlayed = false;
private Texture texture;

public HashSet<Tap> ConnectedTaps { get; } = new HashSet<Tap>();
Expand All @@ -25,6 +24,7 @@ public class ArcTap : Note, INote, IArcTapJudgementReceiver
public float WorldY => Arc.WorldYAt(Timing);

public string Sfx => Arc.Sfx;
public bool SfxPlayed { get; private set; } = false;

public override ArcEvent Clone()
{
Expand All @@ -49,7 +49,7 @@ public void ResetJudgeTo(int timing)
{
judgementRequestSent = timing > Timing;
isHit = timing > Timing;
sfxPlayed = timing > Timing;
SfxPlayed = timing > Timing - Services.Audio.FullOffset;
}

public void Rebuild()
Expand Down Expand Up @@ -94,12 +94,12 @@ public void UpdateJudgement(int currentTiming, GroupProperties groupProperties)
RequestJudgement(groupProperties);
judgementRequestSent = true;
}

if (currentTiming >= Timing && !sfxPlayed)
{
Services.Hitsound.PlayArcTapHitsound(Timing, Sfx, isFromJudgement: false);
sfxPlayed = true;
}
}

public void PlayMutedSfx()
{
Services.Hitsound.PlayArcTapHitsound(Timing, Sfx, isFromJudgement: false);
SfxPlayed = true;
}

public void UpdateRender(int currentTiming, double currentFloorPosition, GroupProperties groupProperties)
Expand Down
2 changes: 1 addition & 1 deletion Assets/Scripts/Gameplay/GameplayManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ private void Update()
Services.Camera.UpdateCamera(currentTiming);
Services.Chart.UpdateChartRender(currentTiming);
Services.Score.UpdateDisplay();
Services.Hitsound.UpdateHitsoundHistory(currentTiming);
Services.Hitsound.UpdateHitsounds(currentTiming);
Services.Render.UpdateRenderers();

gameplayData.NotifyUpdate(currentTiming);
Expand Down
43 changes: 41 additions & 2 deletions Assets/Scripts/Gameplay/Hitsound/HitsoundService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class HitsoundService : MonoBehaviour, IHitsoundService
private IHitsoundPlayer hitsoundPlayer;

private readonly Dictionary<string, AudioClip> sfxClips = new Dictionary<string, AudioClip>();
private readonly Dictionary<string, List<ArcTap>> sfxTimings = new Dictionary<string, List<ArcTap>>();
private readonly UnorderedList<int> playedTapHitsoundTimings = new UnorderedList<int>(30);
private readonly UnorderedList<int> playedArcHitsoundTimings = new UnorderedList<int>(30);

Expand Down Expand Up @@ -88,6 +89,7 @@ public async UniTask LoadCustomSfxs(string parentFolder, IFileAccessWrapper file
}

sfxClips.Clear();
sfxTimings.Clear();

List<UniTask> loadTasks = new List<UniTask>();
HashSet<string> sfxs = new HashSet<string>();
Expand All @@ -97,7 +99,16 @@ public async UniTask LoadCustomSfxs(string parentFolder, IFileAccessWrapper file
{
if (!string.IsNullOrEmpty(at.Sfx) && at.Sfx != "none")
{
sfxs.Add(at.Sfx);
string sfx = at.Sfx;
sfxs.Add(sfx);
if (sfxTimings.ContainsKey(sfx))
{
sfxTimings[sfx].Add(at);
}
else
{
sfxTimings.Add(sfx, new List<ArcTap>() { at });
}
}
}

Expand Down Expand Up @@ -125,7 +136,35 @@ public async UniTask LoadCustomSfxs(string parentFolder, IFileAccessWrapper file
IsLoaded = true;
}

public void UpdateHitsoundHistory(int currentTiming)
public void UpdateHitsounds(int currentTiming)
{
PlayMutedSfx(currentTiming);
UpdateHitsoundHistory(currentTiming);
}

private void PlayMutedSfx(int currentTiming)
{
if (IsMuted)
{
foreach (string sfx in sfxTimings.Keys)
{
int noteIndex = 0;
while (noteIndex < sfxTimings[sfx].Count)
{
ArcTap at = sfxTimings[sfx][noteIndex];

int timing = at.Timing - Services.Audio.FullOffset;
if (!at.SfxPlayed && currentTiming >= timing)
{
at.PlayMutedSfx();
}
noteIndex++;
}
}
}
}

private void UpdateHitsoundHistory(int currentTiming)
{
PurgeOldSoundPlayedTimings(currentTiming, playedArcHitsoundTimings, Values.HoldMissLateJudgeWindow);
PurgeOldSoundPlayedTimings(currentTiming, playedTapHitsoundTimings, Values.HoldMissLateJudgeWindow);
Expand Down
2 changes: 1 addition & 1 deletion Assets/Scripts/Gameplay/Hitsound/IHitsoundService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public interface IHitsoundService
/// <returns>Unitask instance.</returns>
UniTask LoadCustomSfxs(string parentFolder, IFileAccessWrapper fileAccess);

void UpdateHitsoundHistory(int currentTiming);
void UpdateHitsounds(int currentTiming);

void ResetHitsoundHistory();
}
Expand Down
4 changes: 4 additions & 0 deletions Assets/Scripts/Gameplay/IAudioControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ namespace ArcCreate.Gameplay
{
public interface IAudioControl
{
int FullOffset { get; }

int GlobalOffset { get; }

/// <summary>
/// Gets or sets the audio's actual timing.
/// Setting this value will cause score to reset to 0.
Expand Down