using System.Collections.Specialized; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; namespace Content.Shared.Speech { /// /// Component required for entities to be able to speak. (TODO: Entities can speak fine without this, this only forbids them speak if they have it and enabled is false.) /// Contains the option to let entities make noise when speaking, change speech verbs, datafields for the sounds in question, and relevant AudioParams. /// [RegisterComponent, NetworkedComponent] public sealed partial class SpeechComponent : Component { [DataField("enabled"), Access(typeof(SpeechSystem), Friend = AccessPermissions.ReadWrite, Other = AccessPermissions.Read)] public bool Enabled = true; [ViewVariables(VVAccess.ReadWrite)] [DataField("speechSounds", customTypeSerializer:typeof(PrototypeIdSerializer))] public string? SpeechSounds; /// /// What speech verb prototype should be used by default for displaying this entity's messages? /// [ViewVariables(VVAccess.ReadWrite)] [DataField("speechVerb", customTypeSerializer:typeof(PrototypeIdSerializer))] public string SpeechVerb = "Default"; /// /// A mapping from chat suffixes loc strings to speech verb prototypes that should be conditionally used. /// For things like '?' changing to 'asks' or '!!' making text bold and changing to 'yells'. Can be overridden if necessary. /// [DataField("suffixSpeechVerbs", customTypeSerializer:typeof(PrototypeIdValueDictionarySerializer))] public Dictionary SuffixSpeechVerbs = new() { { "chat-speech-verb-suffix-exclamation-strong", "DefaultExclamationStrong" }, { "chat-speech-verb-suffix-exclamation", "DefaultExclamation" }, { "chat-speech-verb-suffix-question", "DefaultQuestion" }, }; [DataField("audioParams")] public AudioParams AudioParams = AudioParams.Default.WithVolume(6f).WithRolloffFactor(4.5f); [ViewVariables(VVAccess.ReadWrite)] [DataField("soundCooldownTime")] public float SoundCooldownTime { get; set; } = 0.5f; public TimeSpan LastTimeSoundPlayed = TimeSpan.Zero; } }