diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 856a4b4b79..1c545bc24c 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -376,8 +376,13 @@ public sealed partial class ChatSystem : SharedChatSystem } name = FormattedMessage.EscapeText(name); - var wrappedMessage = Loc.GetString("chat-manager-entity-say-wrap-message", - ("entityName", name), ("message", FormattedMessage.EscapeText(message))); + var speech = GetSpeechVerb(source, message); + var wrappedMessage = Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message", + ("entityName", name), + ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), + ("fontType", speech.FontId), + ("fontSize", speech.FontSize), + ("message", FormattedMessage.EscapeText(message))); SendInVoiceRange(ChatChannel.Local, message, wrappedMessage, source, range); diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index 123a8c57c9..0f0282ea7e 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -14,6 +14,7 @@ using Content.Shared.Popups; using Robust.Shared.Map; using Content.Shared.Radio.Components; using Content.Server.Power.Components; +using Robust.Shared.Random; namespace Content.Server.Radio.EntitySystems; @@ -25,7 +26,9 @@ public sealed class RadioSystem : EntitySystem [Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly IReplayRecordingManager _replay = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly ChatSystem _chat = default!; // set used to prevent radio feedback loops. private readonly HashSet _messages = new(); @@ -69,11 +72,22 @@ public sealed class RadioSystem : EntitySystem name = FormattedMessage.EscapeText(name); + var speech = _chat.GetSpeechVerb(messageSource, message); + + var wrappedMessage = Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", + ("color", channel.Color), + ("fontType", speech.FontId), + ("fontSize", speech.FontSize), + ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), + ("channel", $"\\[{channel.LocalizedName}\\]"), + ("name", name), + ("message", FormattedMessage.EscapeText(message))); + // most radios are relayed to chat, so lets parse the chat message beforehand var chat = new ChatMessage( ChatChannel.Radio, message, - Loc.GetString("chat-radio-message-wrap", ("color", channel.Color), ("channel", $"\\[{channel.LocalizedName}\\]"), ("name", name), ("message", FormattedMessage.EscapeText(message))), + wrappedMessage, EntityUid.Invalid); var chatMsg = new MsgChatMessage { Message = chat }; var ev = new RadioReceiveEvent(message, messageSource, channel, chatMsg); diff --git a/Content.Shared/Chat/SharedChatSystem.cs b/Content.Shared/Chat/SharedChatSystem.cs index 6f5d0f049b..0517cfd2b9 100644 --- a/Content.Shared/Chat/SharedChatSystem.cs +++ b/Content.Shared/Chat/SharedChatSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Popups; using Content.Shared.Radio; +using Content.Shared.Speech; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -26,6 +27,9 @@ public abstract class SharedChatSystem : EntitySystem public static string DefaultChannelPrefix = $"{RadioChannelPrefix}{DefaultChannelKey}"; + [ValidatePrototypeId] + public const string DefaultSpeechVerb = "Default"; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; @@ -63,6 +67,30 @@ public abstract class SharedChatSystem : EntitySystem _prototypeManager.PrototypesReloaded -= OnPrototypeReload; } + /// + /// Attempts to find an applicable for a speaking entity's message. + /// If one is not found, returns . + /// + public SpeechVerbPrototype GetSpeechVerb(EntityUid source, string message, SpeechComponent? speech = null) + { + if (!Resolve(source, ref speech, false)) + return _prototypeManager.Index(DefaultSpeechVerb); + + // check for a suffix-applicable speech verb + SpeechVerbPrototype? current = null; + foreach (var (str, id) in speech.SuffixSpeechVerbs) + { + var proto = _prototypeManager.Index(id); + if (message.EndsWith(Loc.GetString(str)) && proto.Priority >= (current?.Priority ?? 0)) + { + current = proto; + } + } + + // if no applicable suffix verb return the normal one used by the entity + return current ?? _prototypeManager.Index(speech.SpeechVerb); + } + /// /// Attempts to resolve radio prefixes in chat messages (e.g., remove a leading ":e" and resolve the requested /// channel. Returns true if a radio message was attempted, even if the channel is invalid. diff --git a/Content.Shared/Speech/SpeechComponent.cs b/Content.Shared/Speech/SpeechComponent.cs index 52f32fef37..bb5b13f66c 100644 --- a/Content.Shared/Speech/SpeechComponent.cs +++ b/Content.Shared/Speech/SpeechComponent.cs @@ -1,12 +1,14 @@ +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, datafields for the sounds in question, and relevant AudioParams. + /// 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 class SpeechComponent : Component @@ -20,6 +22,25 @@ namespace Content.Shared.Speech [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); diff --git a/Content.Shared/Speech/SpeechVerbPrototype.cs b/Content.Shared/Speech/SpeechVerbPrototype.cs new file mode 100644 index 0000000000..cf468c44bc --- /dev/null +++ b/Content.Shared/Speech/SpeechVerbPrototype.cs @@ -0,0 +1,47 @@ +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.Speech; + +/// +/// Handles replacing speech verbs and other conditional chat modifications like bolding or font type depending +/// on punctuation or by directly overriding the prototype. +/// +[Prototype("speechVerb")] +public sealed class SpeechVerbPrototype : IPrototype +{ + [IdDataField] public string ID { get; } = default!; + + /// + /// Loc strings to be passed to the chat wrapper. 'says', 'states', etc. + /// Picks one at random if there are multiple. + /// + [DataField("speechVerbStrings", required: true)] + public List SpeechVerbStrings = default!; + + /// + /// Should use of this speech verb bold the corresponding message? + /// + [DataField("bold")] + public bool Bold = false; + + /// + /// What font size should be used for the message contents? + /// + [DataField("fontSize")] + public int FontSize = 12; + + /// + /// What font prototype ID should be used for the message contents? + /// + /// font proto is client only so cant lint this lol sorry + [DataField("fontId")] + public string FontId = "Default"; + + /// + /// If multiple applicable speech verb protos are found (i.e. through speech suffixes) this will determine + /// which one is picked. Higher = more priority. + /// + [DataField("priority")] + public int Priority = 0; +} diff --git a/Resources/Locale/en-US/chat/managers/chat-manager.ftl b/Resources/Locale/en-US/chat/managers/chat-manager.ftl index 7c917ae939..c7eb2eb867 100644 --- a/Resources/Locale/en-US/chat/managers/chat-manager.ftl +++ b/Resources/Locale/en-US/chat/managers/chat-manager.ftl @@ -21,7 +21,8 @@ chat-manager-whisper-headset-on-message = You can't whisper on the radio! chat-manager-server-wrap-message = [bold]{$message}[/bold] chat-manager-sender-announcement-wrap-message = [font size=14][bold]{$sender} Announcement:[/font][font size=12] {$message}[/bold][/font] -chat-manager-entity-say-wrap-message = [bold]{$entityName}[/bold] says, "{$message}" +chat-manager-entity-say-wrap-message = [bold]{$entityName}[/bold] {$verb}, [font={$fontType} size={$fontSize}]"{$message}"[/font] +chat-manager-entity-say-bold-wrap-message = [bold]{$entityName}[/bold] {$verb}, [font={$fontType} size={$fontSize}][bold]"{$message}"[/bold][/font] chat-manager-entity-whisper-wrap-message = [font size=11][italic]{$entityName} whispers, "{$message}"[/italic][/font] chat-manager-entity-whisper-unknown-wrap-message = [font size=11][italic]Someone whispers, "{$message}"[/italic][/font] @@ -45,3 +46,34 @@ chat-manager-send-hook-ooc-wrap-message = OOC: [bold](D){$senderName}:[/bold] {$ chat-manager-dead-channel-name = DEAD chat-manager-admin-channel-name = ADMIN + +## Speech verbs for chat + +chat-speech-verb-suffix-exclamation = ! +chat-speech-verb-suffix-exclamation-strong = !! +chat-speech-verb-suffix-question = ? + +chat-speech-verb-default = says +chat-speech-verb-exclamation = shouts +chat-speech-verb-exclamation-strong = yells +chat-speech-verb-question = asks + +chat-speech-verb-insect-1 = chitters +chat-speech-verb-insect-2 = flutters + +chat-speech-verb-slime = chirps + +chat-speech-verb-robotic = states +chat-speech-verb-reptilian = hisses + +chat-speech-verb-skeleton = rattles + +chat-speech-verb-small-mob = squeaks + +chat-speech-verb-large-mob = roars + +chat-speech-verb-monkey = chimpers + +chat-speech-verb-cluwne-1 = giggles +chat-speech-verb-cluwne-2 = guffaws +chat-speech-verb-cluwne-3 = laughs diff --git a/Resources/Locale/en-US/headset/headset-component.ftl b/Resources/Locale/en-US/headset/headset-component.ftl index f2232e2ab2..70b83c1e66 100644 --- a/Resources/Locale/en-US/headset/headset-component.ftl +++ b/Resources/Locale/en-US/headset/headset-component.ftl @@ -1,5 +1,6 @@ # Chat window radio wrap (prefix and postfix) -chat-radio-message-wrap = [color={$color}]{$channel} [bold]{$name}[/bold] says, "{$message}"[/color] +chat-radio-message-wrap = [color={$color}]{$channel} [bold]{$name}[/bold] {$verb}, [font={$fontType} size={$fontSize}]"{$message}"[/font][/color] +chat-radio-message-wrap-bold = [color={$color}]{$channel} [bold]{$name}[/bold] {$verb}, [font={$fontType} size={$fontSize}][bold]"{$message}"[/bold][/font][/color] examine-headset-default-channel = Use {$prefix} for the default channel ([color={$color}]{$channel}[/color]). diff --git a/Resources/Prototypes/Body/Parts/skeleton.yml b/Resources/Prototypes/Body/Parts/skeleton.yml index 963a8b4409..3f41f88ee5 100644 --- a/Resources/Prototypes/Body/Parts/skeleton.yml +++ b/Resources/Prototypes/Body/Parts/skeleton.yml @@ -49,6 +49,7 @@ - type: Input context: "human" - type: Speech + speechVerb: Skeleton - type: SkeletonAccent - type: Actions - type: Vocal diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 1047aa230e..ce2f9c0d2a 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -16,6 +16,7 @@ - type: Physics - type: Speech speechSounds: Squeak + speechVerb: SmallMob - type: Fixtures fixtures: fix1: @@ -844,6 +845,7 @@ False: {visible: false} - type: Speech speechSounds: Monkey + speechVerb: Monkey - type: Body prototype: Primate requiredLegs: 1 # TODO: More than 1 leg @@ -903,6 +905,7 @@ - type: GhostTakeoverAvailable - type: Speech speechSounds: Squeak + speechVerb: SmallMob - type: Sprite drawdepth: SmallMobs sprite: Mobs/Animals/mouse.rsi @@ -1462,6 +1465,7 @@ False: {visible: false} - type: Speech speechSounds: Monkey + speechVerb: Monkey - type: Body prototype: Primate requiredLegs: 1 # TODO: More than 1 leg @@ -2240,6 +2244,7 @@ description: ghost-role-information-hamster-description - type: GhostTakeoverAvailable - type: Speech + speechVerb: SmallMob speechSounds: Squeak - type: Sprite drawdepth: SmallMobs diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml index 0845c53168..a613c7c4ad 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml @@ -18,6 +18,7 @@ factions: - SimpleHostile - type: Speech + speechVerb: Cluwne - type: CombatMode - type: MobMover - type: InputMover diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml index 4d16276346..c50074bc31 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml @@ -74,3 +74,5 @@ description: A polymorphed unfortunate. components: - type: Cluwne + - type: Speech + speechVerb: Cluwne diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 2f6698563f..b920958f1e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -311,6 +311,7 @@ sprite: Mobs/Silicon/Bots/medibot.rsi state: medibot - type: Speech + speechVerb: Robotic - type: HTN rootTask: task: MedibotCompound diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index 60b23942f4..befa2cfa3b 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -27,6 +27,7 @@ factions: - Dragon - type: Speech + speechVerb: LargeMob - type: CombatMode - type: MobMover - type: InputMover diff --git a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml index 74ceea1cac..0e07bb4acf 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml @@ -77,6 +77,7 @@ - type: Internals - type: Examiner - type: Speech + speechVerb: Robotic - type: TypingIndicator proto: guardian - type: Pullable diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index 32bf10ba5d..8e75ccaebe 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -41,6 +41,7 @@ sprite: Mobs/Effects/brute_damage.rsi color: "#162581" - type: Speech + speechVerb: Insect speechSounds: Arachnid - type: Vocal sounds: diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index cc54a61173..71363b8964 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -22,6 +22,10 @@ - type: Damageable damageContainer: Biological damageModifierSet: Moth + - type: Speech + speechVerb: Insect + - type: TypingIndicator + proto: moth - type: Butcherable butcheringType: Spike spawned: @@ -117,4 +121,4 @@ description: A dummy moth meant to be used in character setup. components: - type: HumanoidAppearance - species: Moth \ No newline at end of file + species: Moth diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index f26f8d7311..e5aac97a26 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -26,6 +26,7 @@ - type: LizardAccent - type: Speech speechSounds: Lizard + speechVerb: Reptilian - type: Vocal sounds: Male: UnisexReptilian diff --git a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml index 35fc9fa4b6..e2a4257bef 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml @@ -49,6 +49,7 @@ 60: 0.9 80: 0.7 - type: Speech + speechVerb: Skeleton - type: Vocal sounds: Male: Skeleton diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index 02bca55fe8..bdd5adf3bf 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -18,6 +18,7 @@ - type: HumanoidAppearance species: SlimePerson - type: Speech + speechVerb: Slime speechSounds: Slime - type: Vocal sounds: diff --git a/Resources/Prototypes/Entities/Objects/Devices/radio.yml b/Resources/Prototypes/Entities/Objects/Devices/radio.yml index 6c2f2c0722..74c2865d07 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/radio.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/radio.yml @@ -10,6 +10,7 @@ channels: - Handheld - type: Speech + speechVerb: Robotic - type: Sprite sprite: Objects/Devices/communication.rsi layers: diff --git a/Resources/Prototypes/Entities/Objects/Fun/pai.yml b/Resources/Prototypes/Entities/Objects/Fun/pai.yml index 29a18529b3..f757896b2e 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/pai.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/pai.yml @@ -58,6 +58,7 @@ - type: TypingIndicator proto: robot - type: Speech + speechVerb: Robotic speechSounds: Pai # This has to be installed because otherwise they're not "alive", # so they can ghost and come back. diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml index 6a974da765..a69147b610 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml @@ -31,6 +31,7 @@ size: 50 - type: ItemCooldown - type: Speech + speechVerb: Robotic - type: Defibrillator zapHeal: types: diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 090f1e6c07..e49924aae2 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -788,6 +788,7 @@ - key: enum.CloningConsoleUiKey.Key type: CloningConsoleBoundUserInterface - type: Speech + speechVerb: Robotic speechSounds: Pai - type: Damageable damageContainer: Inorganic @@ -900,6 +901,7 @@ range: 200 - type: DeviceNetworkRequiresPower - type: Speech + speechVerb: Robotic - type: SurveillanceCameraSpeaker - type: SurveillanceCameraMonitor speechEnabled: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/fatextractor.yml b/Resources/Prototypes/Entities/Structures/Machines/fatextractor.yml index 5d4a63eb4f..d9a1eb2943 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/fatextractor.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/fatextractor.yml @@ -100,6 +100,7 @@ LayoutId: FatExtractor - type: Appearance - type: Speech + speechVerb: Robotic - type: Advertise pack: FatExtractorFacts - type: StaticPrice diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 707af8e1f2..1f736239f2 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -70,6 +70,7 @@ - type: TypingIndicator proto: robot - type: Speech + speechVerb: Robotic speechSounds: Vending - type: DoAfter - type: Electrified diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml index d92dd24844..57530c166c 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml @@ -18,6 +18,7 @@ toggleOnInteract: false - type: Intercom - type: Speech + speechVerb: Robotic - type: ExtensionCableReceiver - type: Clickable - type: InteractionOutline diff --git a/Resources/Prototypes/Voice/speech_verbs.yml b/Resources/Prototypes/Voice/speech_verbs.yml new file mode 100644 index 0000000000..b785ed560c --- /dev/null +++ b/Resources/Prototypes/Voice/speech_verbs.yml @@ -0,0 +1,69 @@ +- type: speechVerb + id: Default + speechVerbStrings: + - chat-speech-verb-default + +- type: speechVerb + id: DefaultQuestion + speechVerbStrings: + - chat-speech-verb-question + +- type: speechVerb + id: DefaultExclamation + speechVerbStrings: + - chat-speech-verb-exclamation + +- type: speechVerb + id: DefaultExclamationStrong + bold: true + speechVerbStrings: + - chat-speech-verb-exclamation-strong + priority: 10 + +- type: speechVerb + id: Insect + speechVerbStrings: + - chat-speech-verb-insect-1 + - chat-speech-verb-insect-2 + +- type: speechVerb + id: Robotic + speechVerbStrings: + - chat-speech-verb-robotic + +- type: speechVerb + id: Reptilian + speechVerbStrings: + - chat-speech-verb-reptilian + +- type: speechVerb + id: Skeleton + speechVerbStrings: + - chat-speech-verb-skeleton + +- type: speechVerb + id: Slime + speechVerbStrings: + - chat-speech-verb-slime + +- type: speechVerb + id: LargeMob + speechVerbStrings: + - chat-speech-verb-large-mob + +- type: speechVerb + id: SmallMob + speechVerbStrings: + - chat-speech-verb-small-mob + +- type: speechVerb + id: Monkey + speechVerbStrings: + - chat-speech-verb-monkey + +- type: speechVerb + id: Cluwne + speechVerbStrings: + - chat-speech-verb-cluwne-1 + - chat-speech-verb-cluwne-2 + - chat-speech-verb-cluwne-3