Speech noise fixies (#8023)

Co-authored-by: metalgearsloth <metalgearsloth@gmail.com>
This commit is contained in:
metalgearsloth
2022-05-08 23:39:51 +10:00
committed by GitHub
parent dc503f3f3f
commit 145c5fdd5b
7 changed files with 36 additions and 70 deletions

View File

@@ -12,69 +12,46 @@ namespace Content.Server.Speech
{ {
public sealed class SpeechSoundSystem : EntitySystem public sealed class SpeechSoundSystem : EntitySystem
{ {
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly IPrototypeManager _protoManager = default!;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<SharedSpeechComponent, EntitySpokeEvent>(OnEntitySpoke); SubscribeLocalEvent<SharedSpeechComponent, EntitySpokeEvent>(OnEntitySpoke);
SubscribeLocalEvent<SharedSpeechComponent, ComponentStartup>(OnStartup);
} }
private void OnStartup(EntityUid uid, SharedSpeechComponent component, ComponentStartup args)
{
//Cache prototype on component startup.
if (_proto.TryIndex(component.SpeechSoundsId, out SpeechSoundsPrototype? speechsnds))
{
if (speechsnds != null)
{
component.SpeechSoundsCache = speechsnds;
}
}
}
private void OnEntitySpoke(EntityUid uid, SharedSpeechComponent component, EntitySpokeEvent args) private void OnEntitySpoke(EntityUid uid, SharedSpeechComponent component, EntitySpokeEvent args)
{ {
if (!component.PlaySpeechSound) return; if (component.SpeechSounds == null) return;
var currentTime = _gameTiming.CurTime;
var cooldown = TimeSpan.FromSeconds(component.SoundCooldownTime); var cooldown = TimeSpan.FromSeconds(component.SoundCooldownTime);
// Ensure more than the cooldown time has passed since last speaking // Ensure more than the cooldown time has passed since last speaking
if ((_gameTiming.CurTime - component.LastTimeSoundPlayed) < cooldown) return; if (currentTime - component.LastTimeSoundPlayed < cooldown) return;
// Play speech sound // Play speech sound
string contextSound;
var prototype = _protoManager.Index<SpeechSoundsPrototype>(component.SpeechSounds);
if (component.SpeechSoundsCache != null)
{
//Re-Index sounds prototype if cached proto ID is outdated, allows VV and changing the voice.
if (component.SpeechSoundsCache.ID != component.SpeechSoundsId)
{
if (_proto.TryIndex(component.SpeechSoundsId, out SpeechSoundsPrototype? speechsnds))
{
if (speechsnds != null)
{
component.SpeechSoundsCache = speechsnds;
}
}
}
var contextSound = component.SpeechSoundsCache.SaySound;
// Different sounds for ask/exclaim based on last character // Different sounds for ask/exclaim based on last character
switch (args.Message[args.Message.Length-1]) switch (args.Message[^1])
{ {
case '?': case '?':
contextSound = component.SpeechSoundsCache.AskSound; contextSound = prototype.AskSound.GetSound();
break; break;
case '!': case '!':
contextSound = component.SpeechSoundsCache.ExclaimSound; contextSound = prototype.ExclaimSound.GetSound();
break;
default:
contextSound = prototype.SaySound.GetSound();
break; break;
}
component.LastTimeSoundPlayed = _gameTiming.CurTime;
SoundSystem.Play(Filter.Pvs(uid), contextSound.GetSound(), uid, component.AudioParams);
}
} }
component.LastTimeSoundPlayed = currentTime;
SoundSystem.Play(Filter.Pvs(uid, entityManager: EntityManager), contextSound, uid, component.AudioParams);
}
} }
} }

View File

@@ -21,12 +21,8 @@ namespace Content.Shared.Speech
private bool _enabled = true; private bool _enabled = true;
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
[DataField("playSpeechSound")] [DataField("speechSounds", customTypeSerializer:typeof(PrototypeIdSerializer<SpeechSoundsPrototype>))]
public bool PlaySpeechSound = false; public string? SpeechSounds;
[ViewVariables(VVAccess.ReadWrite)]
[DataField("speechSoundsId", customTypeSerializer:typeof(PrototypeIdSerializer<SpeechSoundsPrototype>))]
public string SpeechSoundsId { get; set; } = "Alto";
[DataField("audioParams")] [DataField("audioParams")]
public AudioParams AudioParams = AudioParams.Default.WithVolume(5f); public AudioParams AudioParams = AudioParams.Default.WithVolume(5f);
@@ -37,12 +33,6 @@ namespace Content.Shared.Speech
public TimeSpan LastTimeSoundPlayed = TimeSpan.Zero; public TimeSpan LastTimeSoundPlayed = TimeSpan.Zero;
//Don't use this.
//Cache for SpeechSoundsPrototype to avoid Indexing every single time someone talks.
public SpeechSoundsPrototype? SpeechSoundsCache = null;
public bool Enabled public bool Enabled
{ {
get => _enabled; get => _enabled;

View File

@@ -1,7 +1,9 @@
diagnoser_printing.ogg taken from https://freesound.org/people/RobSp1derp1g/sounds/615419/ and edited circuitprinter.ogg taken from https://freesound.org/people/OroborosNZ/sounds/273649/ and https://freesound.org/people/170048@virtualwindow.co.za/sounds/408041/ and edited
vaccinator_running.ogg taken from https://freesound.org/people/RutgerMuller/sounds/365413/ and edited diagnoser_printing.ogg taken from https://freesound.org/people/RobSp1derp1g/sounds/615419/ and edited
uniformprinter.ogg taken from https://freesound.org/people/sukaton/sounds/60640/ and edited uniformprinter.ogg taken from https://freesound.org/people/sukaton/sounds/60640/ and edited
circuitprinter.ogg taken from https://freesound.org/people/OroborosNZ/sounds/273649/ and https://freesound.org/people/170048@virtualwindow.co.za/sounds/408041/ and edited vaccinator_running.ogg taken from https://freesound.org/people/RutgerMuller/sounds/365413/ and edited
vending_jingle.ogg made by github.com/hubismal licensed under CC-BY-3.0

View File

@@ -11,5 +11,5 @@ speak_4_ask.ogg
speak_4_exclaim.ogg speak_4_exclaim.ogg
speak_4.ogg speak_4.ogg
all taken from all taken from
https://github.com/goonstation/goonstation/tree/master/sound/misc/talk https://github.com/goonstation/goonstation/tree/eb3e7df6292d23f6af2f18b4372d3a8ba4b0fda7/sound/misc/talk
licensed under CC BY-NC-SA 3.0 licensed under CC BY-NC-SA 3.0

View File

@@ -18,7 +18,7 @@
sprite: Mobs/Animals/bat.rsi sprite: Mobs/Animals/bat.rsi
- type: Physics - type: Physics
- type: Speech - type: Speech
speechSoundsId: Squeak speechSounds: Squeak
- type: Fixtures - type: Fixtures
fixtures: fixtures:
- shape: - shape:
@@ -666,8 +666,7 @@
name: mouse name: mouse
description: A hungry and mischievous mouse. description: A hungry and mischievous mouse.
- type: Speech - type: Speech
playSpeechSound: true speechSounds: Squeak
speechSoundsId: Squeak
- type: Sprite - type: Sprite
drawdepth: FloorObjects drawdepth: FloorObjects
layers: layers:

View File

@@ -309,7 +309,6 @@
# - type: Recyclable Turns out turning off recycler safeties without considering the instagib is a bad idea # - type: Recyclable Turns out turning off recycler safeties without considering the instagib is a bad idea
# safe: false # safe: false
- type: Speech - type: Speech
playSpeechSound: true
- type: Vocal - type: Vocal
- type: Emoting - type: Emoting
- type: Grammar - type: Grammar

View File

@@ -53,8 +53,7 @@
LayoutId: Vending LayoutId: Vending
- type: Anchorable - type: Anchorable
- type: Speech - type: Speech
playSpeechSound: true speechSounds: Vending
speechSoundsId: Vending
- type: DoAfter - type: DoAfter
- type: Electrified - type: Electrified
enabled: false enabled: false