SubscribeLocalEvent<SpeechComponent, EntitySpokeEvent>(OnEntitySpoke);
}
- private void OnEntitySpoke(EntityUid uid, SpeechComponent component, EntitySpokeEvent args)
+ public SoundSpecifier? GetSpeechSound(Entity<SpeechComponent> ent, string message)
{
- if (component.SpeechSounds == null) return;
-
- var currentTime = _gameTiming.CurTime;
- var cooldown = TimeSpan.FromSeconds(component.SoundCooldownTime);
-
- // Ensure more than the cooldown time has passed since last speaking
- if (currentTime - component.LastTimeSoundPlayed < cooldown) return;
+ if (ent.Comp.SpeechSounds == null)
+ return null;
// Play speech sound
- string contextSound;
- var prototype = _protoManager.Index<SpeechSoundsPrototype>(component.SpeechSounds);
- var message = args.Message;
+ SoundSpecifier? contextSound;
+ var prototype = _protoManager.Index<SpeechSoundsPrototype>(ent.Comp.SpeechSounds);
// Different sounds for ask/exclaim based on last character
- switch (args.Message[^1])
+ contextSound = message[^1] switch
{
- case '?':
- contextSound = prototype.AskSound.GetSound();
- break;
- case '!':
- contextSound = prototype.ExclaimSound.GetSound();
- break;
- default:
- contextSound = prototype.SaySound.GetSound();
- break;
- }
+ '?' => prototype.AskSound,
+ '!' => prototype.ExclaimSound,
+ _ => prototype.SaySound
+ };
// Use exclaim sound if most characters are uppercase.
int uppercaseCount = 0;
for (int i = 0; i < message.Length; i++)
{
- if (char.IsUpper(message[i])) uppercaseCount++;
+ if (char.IsUpper(message[i]))
+ uppercaseCount++;
}
if (uppercaseCount > (message.Length / 2))
{
- contextSound = contextSound = prototype.ExclaimSound.GetSound();
+ contextSound = prototype.ExclaimSound;
}
var scale = (float) _random.NextGaussian(1, prototype.Variation);
- var pitchedAudioParams = component.AudioParams.WithPitchScale(scale);
+ contextSound.Params = ent.Comp.AudioParams.WithPitchScale(scale);
+ return contextSound;
+ }
+
+ private void OnEntitySpoke(EntityUid uid, SpeechComponent component, EntitySpokeEvent args)
+ {
+ if (component.SpeechSounds == null)
+ return;
+
+ var currentTime = _gameTiming.CurTime;
+ var cooldown = TimeSpan.FromSeconds(component.SoundCooldownTime);
+
+ // Ensure more than the cooldown time has passed since last speaking
+ if (currentTime - component.LastTimeSoundPlayed < cooldown)
+ return;
+ var sound = GetSpeechSound((uid, component), args.Message);
component.LastTimeSoundPlayed = currentTime;
- _audio.PlayPvs(contextSound, uid, pitchedAudioParams);
+ _audio.PlayPvs(sound, uid);
}
}
}
using Content.Server.Chat.Systems;
+using Content.Server.Speech;
using Content.Shared.Speech;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
public sealed class SurveillanceCameraSpeakerSystem : EntitySystem
{
[Dependency] private readonly SharedAudioSystem _audioSystem = default!;
+ [Dependency] private readonly SpeechSoundSystem _speechSound = default!;
[Dependency] private readonly ChatSystem _chatSystem = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
var cd = TimeSpan.FromSeconds(component.SpeechSoundCooldown);
// this part's mostly copied from speech
+ // what is wrong with you?
if (time - component.LastSoundPlayed < cd
- && TryComp<SpeechComponent>(args.Speaker, out var speech)
- && speech.SpeechSounds != null
- && _prototypeManager.TryIndex(speech.SpeechSounds, out SpeechSoundsPrototype? speechProto))
+ && TryComp<SpeechComponent>(args.Speaker, out var speech))
{
- var sound = args.Message[^1] switch
- {
- '?' => speechProto.AskSound,
- '!' => speechProto.ExclaimSound,
- _ => speechProto.SaySound
- };
-
- var uppercase = 0;
- for (var i = 0; i < args.Message.Length; i++)
- {
- if (char.IsUpper(args.Message[i]))
- {
- uppercase++;
- }
- }
-
- if (uppercase > args.Message.Length / 2)
- {
- sound = speechProto.ExclaimSound;
- }
-
- var scale = (float) _random.NextGaussian(1, speechProto.Variation);
- var param = speech.AudioParams.WithPitchScale(scale);
- _audioSystem.PlayPvs(sound, uid, param);
+ var sound = _speechSound.GetSpeechSound((args.Speaker, speech), args.Message);
+ _audioSystem.PlayPvs(sound, uid);
component.LastSoundPlayed = time;
}