voicemask can select speech verb (#25768)

* add Name field to SpeechVerbPrototype

* extra locale for voice mask ui

* SpeechVerb ui and handling

* raaaaaaaaa

* reeeeeeeeal

Co-authored-by: Tayrtahn <tayrtahn@gmail.com>

* fix sort

* did you hear john syndicate died of ligma

* Update Content.Client/VoiceMask/VoiceMaskNameChangeWindow.xaml

---------

Co-authored-by: deltanedas <@deltanedas:kde.org>
Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
This commit is contained in:
deltanedas
2024-03-28 06:36:43 +00:00
committed by GitHub
parent df7f2a1276
commit d13da2837d
11 changed files with 200 additions and 31 deletions

View File

@@ -1,10 +1,13 @@
using Content.Shared.VoiceMask; using Content.Shared.VoiceMask;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
using Robust.Shared.Prototypes;
namespace Content.Client.VoiceMask; namespace Content.Client.VoiceMask;
public sealed class VoiceMaskBoundUserInterface : BoundUserInterface public sealed class VoiceMaskBoundUserInterface : BoundUserInterface
{ {
[Dependency] private readonly IPrototypeManager _proto = default!;
[ViewVariables] [ViewVariables]
private VoiceMaskNameChangeWindow? _window; private VoiceMaskNameChangeWindow? _window;
@@ -16,10 +19,11 @@ public sealed class VoiceMaskBoundUserInterface : BoundUserInterface
{ {
base.Open(); base.Open();
_window = new(); _window = new(_proto);
_window.OpenCentered(); _window.OpenCentered();
_window.OnNameChange += OnNameSelected; _window.OnNameChange += OnNameSelected;
_window.OnVerbChange += verb => SendMessage(new VoiceMaskChangeVerbMessage(verb));
_window.OnClose += Close; _window.OnClose += Close;
} }
@@ -35,7 +39,7 @@ public sealed class VoiceMaskBoundUserInterface : BoundUserInterface
return; return;
} }
_window.UpdateState(cast.Name); _window.UpdateState(cast.Name, cast.Verb);
} }
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)

View File

@@ -1,11 +1,16 @@
<DefaultWindow xmlns="https://spacestation14.io" <controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'voice-mask-name-change-window'}" Title="{Loc 'voice-mask-name-change-window'}"
MinSize="5 20"> MinSize="5 30">
<BoxContainer Orientation="Vertical"> <BoxContainer Orientation="Vertical" Margin="5">
<Label Text="{Loc 'voice-mask-name-change-info'}" /> <Label Text="{Loc 'voice-mask-name-change-info'}" />
<BoxContainer Orientation="Horizontal"> <BoxContainer Orientation="Horizontal" Margin="5">
<LineEdit Name="NameSelector" HorizontalExpand="True" /> <LineEdit Name="NameSelector" HorizontalExpand="True" />
<Button Name="NameSelectorSet" Text="{Loc 'voice-mask-name-change-set'}" /> <Button Name="NameSelectorSet" Text="{Loc 'voice-mask-name-change-set'}" />
</BoxContainer> </BoxContainer>
<BoxContainer Orientation="Horizontal" Margin="5">
<Label Text="{Loc 'voice-mask-name-change-speech-style'}" />
<OptionButton Name="SpeechVerbSelector" /> <!-- Populated in LoadVerbs -->
</BoxContainer>
</BoxContainer> </BoxContainer>
</DefaultWindow> </controls:FancyWindow>

View File

@@ -1,26 +1,85 @@
using Content.Client.UserInterface.Controls;
using Content.Shared.Speech;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML; using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client.VoiceMask; namespace Content.Client.VoiceMask;
[GenerateTypedNameReferences] [GenerateTypedNameReferences]
public sealed partial class VoiceMaskNameChangeWindow : DefaultWindow public sealed partial class VoiceMaskNameChangeWindow : FancyWindow
{ {
public Action<string>? OnNameChange; public Action<string>? OnNameChange;
public Action<string?>? OnVerbChange;
public VoiceMaskNameChangeWindow() private List<(string, string)> _verbs = new();
private string? _verb;
public VoiceMaskNameChangeWindow(IPrototypeManager proto)
{ {
RobustXamlLoader.Load(this); RobustXamlLoader.Load(this);
NameSelectorSet.OnPressed += _ => NameSelectorSet.OnPressed += _ =>
{ {
OnNameChange!(NameSelector.Text); OnNameChange?.Invoke(NameSelector.Text);
}; };
SpeechVerbSelector.OnItemSelected += args =>
{
OnVerbChange?.Invoke((string?) args.Button.GetItemMetadata(args.Id));
SpeechVerbSelector.SelectId(args.Id);
};
ReloadVerbs(proto);
AddVerbs();
} }
public void UpdateState(string name) private void ReloadVerbs(IPrototypeManager proto)
{
foreach (var verb in proto.EnumeratePrototypes<SpeechVerbPrototype>())
{
_verbs.Add((Loc.GetString(verb.Name), verb.ID));
}
_verbs.Sort((a, b) => a.Item1.CompareTo(b.Item1));
}
private void AddVerbs()
{
SpeechVerbSelector.Clear();
AddVerb(Loc.GetString("chat-speech-verb-name-none"), null);
foreach (var (name, id) in _verbs)
{
AddVerb(name, id);
}
}
private void AddVerb(string name, string? verb)
{
var id = SpeechVerbSelector.ItemCount;
SpeechVerbSelector.AddItem(name);
if (verb is {} metadata)
SpeechVerbSelector.SetItemMetadata(id, metadata);
if (verb == _verb)
SpeechVerbSelector.SelectId(id);
}
public void UpdateState(string name, string? verb)
{ {
NameSelector.Text = name; NameSelector.Text = name;
_verb = verb;
for (int id = 0; id < SpeechVerbSelector.ItemCount; id++)
{
if (string.Equals(verb, SpeechVerbSelector.GetItemMetadata(id)))
{
SpeechVerbSelector.SelectId(id);
break;
}
}
} }
} }

View File

@@ -21,6 +21,7 @@ public sealed partial class VoiceMaskSystem
var comp = EnsureComp<VoiceMaskComponent>(user); var comp = EnsureComp<VoiceMaskComponent>(user);
comp.VoiceName = component.LastSetName; comp.VoiceName = component.LastSetName;
comp.SpeechVerb = component.LastSpeechVerb;
_actions.AddAction(user, ref component.ActionEntity, component.Action, uid); _actions.AddAction(user, ref component.ActionEntity, component.Action, uid);
} }
@@ -30,15 +31,23 @@ public sealed partial class VoiceMaskSystem
RemComp<VoiceMaskComponent>(args.Equipee); RemComp<VoiceMaskComponent>(args.Equipee);
} }
private void TrySetLastKnownName(EntityUid maskWearer, string lastName) private VoiceMaskerComponent? TryGetMask(EntityUid user)
{ {
if (!HasComp<VoiceMaskComponent>(maskWearer) if (!HasComp<VoiceMaskComponent>(user) || !_inventory.TryGetSlotEntity(user, MaskSlot, out var maskEntity))
|| !_inventory.TryGetSlotEntity(maskWearer, MaskSlot, out var maskEntity) return null;
|| !TryComp<VoiceMaskerComponent>(maskEntity, out var maskComp))
{
return;
}
maskComp.LastSetName = lastName; return CompOrNull<VoiceMaskerComponent>(maskEntity);
}
private void TrySetLastKnownName(EntityUid user, string name)
{
if (TryGetMask(user) is {} comp)
comp.LastSetName = name;
}
private void TrySetLastSpeechVerb(EntityUid user, string? verb)
{
if (TryGetMask(user) is {} comp)
comp.LastSpeechVerb = verb;
} }
} }

View File

@@ -6,9 +6,11 @@ using Content.Shared.Database;
using Content.Shared.Inventory.Events; using Content.Shared.Inventory.Events;
using Content.Shared.Popups; using Content.Shared.Popups;
using Content.Shared.Preferences; using Content.Shared.Preferences;
using Content.Shared.Speech;
using Content.Shared.VoiceMask; using Content.Shared.VoiceMask;
using Robust.Server.GameObjects; using Robust.Server.GameObjects;
using Robust.Shared.Player; using Robust.Shared.Player;
using Robust.Shared.Prototypes;
namespace Content.Server.VoiceMask; namespace Content.Server.VoiceMask;
@@ -17,11 +19,13 @@ public sealed partial class VoiceMaskSystem : EntitySystem
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
public override void Initialize() public override void Initialize()
{ {
SubscribeLocalEvent<VoiceMaskComponent, TransformSpeakerNameEvent>(OnSpeakerNameTransform); SubscribeLocalEvent<VoiceMaskComponent, TransformSpeakerNameEvent>(OnSpeakerNameTransform);
SubscribeLocalEvent<VoiceMaskComponent, VoiceMaskChangeNameMessage>(OnChangeName); SubscribeLocalEvent<VoiceMaskComponent, VoiceMaskChangeNameMessage>(OnChangeName);
SubscribeLocalEvent<VoiceMaskComponent, VoiceMaskChangeVerbMessage>(OnChangeVerb);
SubscribeLocalEvent<VoiceMaskComponent, WearerMaskToggledEvent>(OnMaskToggled); SubscribeLocalEvent<VoiceMaskComponent, WearerMaskToggledEvent>(OnMaskToggled);
SubscribeLocalEvent<VoiceMaskerComponent, GotEquippedEvent>(OnEquip); SubscribeLocalEvent<VoiceMaskerComponent, GotEquippedEvent>(OnEquip);
SubscribeLocalEvent<VoiceMaskerComponent, GotUnequippedEvent>(OnUnequip); SubscribeLocalEvent<VoiceMaskerComponent, GotUnequippedEvent>(OnUnequip);
@@ -55,6 +59,21 @@ public sealed partial class VoiceMaskSystem : EntitySystem
UpdateUI(uid, component); UpdateUI(uid, component);
} }
private void OnChangeVerb(Entity<VoiceMaskComponent> ent, ref VoiceMaskChangeVerbMessage msg)
{
if (msg.Verb is {} id && !_proto.HasIndex<SpeechVerbPrototype>(id))
return;
ent.Comp.SpeechVerb = msg.Verb;
// verb is only important to metagamers so no need to log as opposed to name
_popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), ent, msg.Session);
TrySetLastSpeechVerb(ent, msg.Verb);
UpdateUI(ent, ent.Comp);
}
private void OnSpeakerNameTransform(EntityUid uid, VoiceMaskComponent component, TransformSpeakerNameEvent args) private void OnSpeakerNameTransform(EntityUid uid, VoiceMaskComponent component, TransformSpeakerNameEvent args)
{ {
if (component.Enabled) if (component.Enabled)
@@ -95,6 +114,6 @@ public sealed partial class VoiceMaskSystem : EntitySystem
} }
if (_uiSystem.TryGetUi(owner, VoiceMaskUIKey.Key, out var bui)) if (_uiSystem.TryGetUi(owner, VoiceMaskUIKey.Key, out var bui))
_uiSystem.SetUiState(bui, new VoiceMaskBuiState(component.VoiceName)); _uiSystem.SetUiState(bui, new VoiceMaskBuiState(component.VoiceName, component.SpeechVerb));
} }
} }

View File

@@ -1,15 +1,20 @@
using Content.Shared.Speech;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.VoiceMask; namespace Content.Server.VoiceMask;
[RegisterComponent] [RegisterComponent]
public sealed partial class VoiceMaskerComponent : Component public sealed partial class VoiceMaskerComponent : Component
{ {
[ViewVariables(VVAccess.ReadWrite)] public string LastSetName = "Unknown"; [DataField]
public string LastSetName = "Unknown";
[DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))] [DataField]
public string Action = "ActionChangeVoiceMask"; public ProtoId<SpeechVerbPrototype>? LastSpeechVerb;
[DataField("actionEntity")] public EntityUid? ActionEntity; [DataField]
public EntProtoId Action = "ActionChangeVoiceMask";
[DataField]
public EntityUid? ActionEntity;
} }

View File

@@ -43,4 +43,10 @@ public sealed partial class SpeechVerbPrototype : IPrototype
/// </summary> /// </summary>
[DataField("priority")] [DataField("priority")]
public int Priority = 0; public int Priority = 0;
/// <summary>
/// Name shown in the voicemask UI for this verb.
/// </summary>
[DataField(required: true)]
public LocId Name = string.Empty;
} }

View File

@@ -11,21 +11,37 @@ public enum VoiceMaskUIKey : byte
[Serializable, NetSerializable] [Serializable, NetSerializable]
public sealed class VoiceMaskBuiState : BoundUserInterfaceState public sealed class VoiceMaskBuiState : BoundUserInterfaceState
{ {
public string Name { get; } public readonly string Name;
public readonly string? Verb;
public VoiceMaskBuiState(string name) public VoiceMaskBuiState(string name, string? verb)
{ {
Name = name; Name = name;
Verb = verb;
} }
} }
[Serializable, NetSerializable] [Serializable, NetSerializable]
public sealed class VoiceMaskChangeNameMessage : BoundUserInterfaceMessage public sealed class VoiceMaskChangeNameMessage : BoundUserInterfaceMessage
{ {
public string Name { get; } public readonly string Name;
public VoiceMaskChangeNameMessage(string name) public VoiceMaskChangeNameMessage(string name)
{ {
Name = name; Name = name;
} }
} }
/// <summary>
/// Change the speech verb prototype to override, or null to use the user's verb.
/// </summary>
[Serializable, NetSerializable]
public sealed class VoiceMaskChangeVerbMessage : BoundUserInterfaceMessage
{
public readonly string? Verb;
public VoiceMaskChangeVerbMessage(string? verb)
{
Verb = verb;
}
}

View File

@@ -58,57 +58,79 @@ chat-speech-verb-suffix-question = ?
chat-speech-verb-suffix-stutter = - chat-speech-verb-suffix-stutter = -
chat-speech-verb-suffix-mumble = .. chat-speech-verb-suffix-mumble = ..
chat-speech-verb-name-none = None
chat-speech-verb-name-default = Default
chat-speech-verb-default = says chat-speech-verb-default = says
chat-speech-verb-name-exclamation = Exclaiming
chat-speech-verb-exclamation = exclaims chat-speech-verb-exclamation = exclaims
chat-speech-verb-name-exclamation-strong = Yelling
chat-speech-verb-exclamation-strong = yells chat-speech-verb-exclamation-strong = yells
chat-speech-verb-name-question = Asking
chat-speech-verb-question = asks chat-speech-verb-question = asks
chat-speech-verb-name-stutter = Stuttering
chat-speech-verb-stutter = stutters chat-speech-verb-stutter = stutters
chat-speech-verb-name-mumble = Mumbling
chat-speech-verb-mumble = mumbles chat-speech-verb-mumble = mumbles
chat-speech-verb-name-arachnid = Arachnid
chat-speech-verb-insect-1 = chitters chat-speech-verb-insect-1 = chitters
chat-speech-verb-insect-2 = chirps chat-speech-verb-insect-2 = chirps
chat-speech-verb-insect-3 = clicks chat-speech-verb-insect-3 = clicks
chat-speech-verb-name-moth = Moth
chat-speech-verb-winged-1 = flutters chat-speech-verb-winged-1 = flutters
chat-speech-verb-winged-2 = flaps chat-speech-verb-winged-2 = flaps
chat-speech-verb-winged-3 = buzzes chat-speech-verb-winged-3 = buzzes
chat-speech-verb-name-slime = Slime
chat-speech-verb-slime-1 = sloshes chat-speech-verb-slime-1 = sloshes
chat-speech-verb-slime-2 = burbles chat-speech-verb-slime-2 = burbles
chat-speech-verb-slime-3 = oozes chat-speech-verb-slime-3 = oozes
chat-speech-verb-name-plant = Diona
chat-speech-verb-plant-1 = rustles chat-speech-verb-plant-1 = rustles
chat-speech-verb-plant-2 = sways chat-speech-verb-plant-2 = sways
chat-speech-verb-plant-3 = creaks chat-speech-verb-plant-3 = creaks
chat-speech-verb-name-robotic = Robotic
chat-speech-verb-robotic-1 = states chat-speech-verb-robotic-1 = states
chat-speech-verb-robotic-2 = beeps chat-speech-verb-robotic-2 = beeps
chat-speech-verb-robotic-3 = boops
chat-speech-verb-name-reptilian = Reptilian
chat-speech-verb-reptilian-1 = hisses chat-speech-verb-reptilian-1 = hisses
chat-speech-verb-reptilian-2 = snorts chat-speech-verb-reptilian-2 = snorts
chat-speech-verb-reptilian-3 = huffs chat-speech-verb-reptilian-3 = huffs
chat-speech-verb-name-skeleton = Skeleton
chat-speech-verb-skeleton-1 = rattles chat-speech-verb-skeleton-1 = rattles
chat-speech-verb-skeleton-2 = clacks chat-speech-verb-skeleton-2 = clacks
chat-speech-verb-skeleton-3 = gnashes chat-speech-verb-skeleton-3 = gnashes
chat-speech-verb-name-vox = Vox
chat-speech-verb-vox-1 = screeches chat-speech-verb-vox-1 = screeches
chat-speech-verb-vox-2 = shrieks chat-speech-verb-vox-2 = shrieks
chat-speech-verb-vox-3 = croaks chat-speech-verb-vox-3 = croaks
chat-speech-verb-name-canine = Canine
chat-speech-verb-canine-1 = barks chat-speech-verb-canine-1 = barks
chat-speech-verb-canine-2 = woofs chat-speech-verb-canine-2 = woofs
chat-speech-verb-canine-3 = howls chat-speech-verb-canine-3 = howls
chat-speech-verb-name-small-mob = Mouse
chat-speech-verb-small-mob-1 = squeaks chat-speech-verb-small-mob-1 = squeaks
chat-speech-verb-small-mob-2 = pieps chat-speech-verb-small-mob-2 = pieps
chat-speech-verb-name-large-mob = Carp
chat-speech-verb-large-mob-1 = roars chat-speech-verb-large-mob-1 = roars
chat-speech-verb-large-mob-2 = growls chat-speech-verb-large-mob-2 = growls
chat-speech-verb-name-monkey = Monkey
chat-speech-verb-monkey-1 = chimpers chat-speech-verb-monkey-1 = chimpers
chat-speech-verb-monkey-2 = screeches chat-speech-verb-monkey-2 = screeches
chat-speech-verb-name-cluwne = Cluwne
chat-speech-verb-parrot-1 = squawks chat-speech-verb-parrot-1 = squawks
chat-speech-verb-parrot-2 = tweets chat-speech-verb-parrot-2 = tweets
chat-speech-verb-parrot-3 = chirps chat-speech-verb-parrot-3 = chirps
@@ -117,11 +139,13 @@ chat-speech-verb-cluwne-1 = giggles
chat-speech-verb-cluwne-2 = guffaws chat-speech-verb-cluwne-2 = guffaws
chat-speech-verb-cluwne-3 = laughs chat-speech-verb-cluwne-3 = laughs
chat-speech-verb-name-ghost = Ghost
chat-speech-verb-ghost-1 = complains chat-speech-verb-ghost-1 = complains
chat-speech-verb-ghost-2 = breathes chat-speech-verb-ghost-2 = breathes
chat-speech-verb-ghost-3 = hums chat-speech-verb-ghost-3 = hums
chat-speech-verb-ghost-4 = mutters chat-speech-verb-ghost-4 = mutters
chat-speech-verb-name-electricity = Electricity
chat-speech-verb-electricity-1 = crackles chat-speech-verb-electricity-1 = crackles
chat-speech-verb-electricity-2 = buzzes chat-speech-verb-electricity-2 = buzzes
chat-speech-verb-electricity-3 = screeches chat-speech-verb-electricity-3 = screeches

View File

@@ -1,5 +1,6 @@
voice-mask-name-change-window = Voice Mask Name Change voice-mask-name-change-window = Voice Mask Name Change
voice-mask-name-change-info = Type in the name you want to mimic. voice-mask-name-change-info = Type in the name you want to mimic.
voice-mask-name-change-speech-style = Speech style
voice-mask-name-change-set = Set name voice-mask-name-change-set = Set name
voice-mask-name-change-set-description = Change the name others hear to something else. voice-mask-name-change-set-description = Change the name others hear to something else.

View File

@@ -1,30 +1,36 @@
- type: speechVerb - type: speechVerb
id: Default id: Default
name: chat-speech-verb-name-default
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-default - chat-speech-verb-default
- type: speechVerb - type: speechVerb
id: DefaultQuestion id: DefaultQuestion
name: chat-speech-verb-name-question
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-question - chat-speech-verb-question
- type: speechVerb - type: speechVerb
id: DefaultStutter id: DefaultStutter
name: chat-speech-verb-name-stutter
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-stutter - chat-speech-verb-stutter
- type: speechVerb - type: speechVerb
id: DefaultMumble id: DefaultMumble
name: chat-speech-verb-name-mumble
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-mumble - chat-speech-verb-mumble
- type: speechVerb - type: speechVerb
id: DefaultExclamation id: DefaultExclamation
name: chat-speech-verb-name-exclamation
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-exclamation - chat-speech-verb-exclamation
- type: speechVerb - type: speechVerb
id: DefaultExclamationStrong id: DefaultExclamationStrong
name: chat-speech-verb-name-exclamation-strong
bold: true bold: true
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-exclamation-strong - chat-speech-verb-exclamation-strong
@@ -32,6 +38,7 @@
- type: speechVerb - type: speechVerb
id: Arachnid id: Arachnid
name: chat-speech-verb-name-arachnid
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-insect-1 - chat-speech-verb-insect-1
- chat-speech-verb-insect-2 - chat-speech-verb-insect-2
@@ -40,6 +47,7 @@
- type: speechVerb - type: speechVerb
id: Moth id: Moth
name: chat-speech-verb-name-moth
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-winged-1 - chat-speech-verb-winged-1
- chat-speech-verb-winged-2 - chat-speech-verb-winged-2
@@ -48,12 +56,14 @@
- type: speechVerb - type: speechVerb
id: Robotic id: Robotic
name: chat-speech-verb-name-robotic
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-robotic-1 - chat-speech-verb-robotic-1
- chat-speech-verb-robotic-2 - chat-speech-verb-robotic-2
- type: speechVerb - type: speechVerb
id: Reptilian id: Reptilian
name: chat-speech-verb-name-reptilian
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-reptilian-1 - chat-speech-verb-reptilian-1
- chat-speech-verb-reptilian-2 - chat-speech-verb-reptilian-2
@@ -62,6 +72,7 @@
- type: speechVerb - type: speechVerb
id: Skeleton id: Skeleton
name: chat-speech-verb-name-skeleton
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-skeleton-1 - chat-speech-verb-skeleton-1
- chat-speech-verb-skeleton-2 - chat-speech-verb-skeleton-2
@@ -69,6 +80,7 @@
- type: speechVerb - type: speechVerb
id: Slime id: Slime
name: chat-speech-verb-name-slime
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-slime-1 - chat-speech-verb-slime-1
- chat-speech-verb-slime-2 - chat-speech-verb-slime-2
@@ -76,13 +88,15 @@
- type: speechVerb - type: speechVerb
id: Vox id: Vox
name: chat-speech-verb-name-vox
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-vox-1 - chat-speech-verb-vox-1
- chat-speech-verb-vox-2 - chat-speech-verb-vox-2
- chat-speech-verb-vox-3 - chat-speech-verb-vox-3
- type: speechVerb - type: speechVerb
id: Plant id: Plant
name: chat-speech-verb-name-plant
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-plant-1 - chat-speech-verb-plant-1
- chat-speech-verb-plant-2 - chat-speech-verb-plant-2
@@ -90,6 +104,7 @@
- type: speechVerb - type: speechVerb
id: Canine id: Canine
name: chat-speech-verb-name-canine
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-canine-1 - chat-speech-verb-canine-1
- chat-speech-verb-canine-2 - chat-speech-verb-canine-2
@@ -97,18 +112,21 @@
- type: speechVerb - type: speechVerb
id: LargeMob id: LargeMob
name: chat-speech-verb-name-large-mob
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-large-mob-1 - chat-speech-verb-large-mob-1
- chat-speech-verb-large-mob-2 - chat-speech-verb-large-mob-2
- type: speechVerb - type: speechVerb
id: SmallMob id: SmallMob
name: chat-speech-verb-name-small-mob
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-small-mob-1 - chat-speech-verb-small-mob-1
- chat-speech-verb-small-mob-2 - chat-speech-verb-small-mob-2
- type: speechVerb - type: speechVerb
id: Monkey id: Monkey
name: chat-speech-verb-name-monkey
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-monkey-1 - chat-speech-verb-monkey-1
- chat-speech-verb-monkey-2 - chat-speech-verb-monkey-2
@@ -122,6 +140,7 @@
- type: speechVerb - type: speechVerb
id: Cluwne id: Cluwne
name: chat-speech-verb-name-cluwne
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-cluwne-1 - chat-speech-verb-cluwne-1
- chat-speech-verb-cluwne-2 - chat-speech-verb-cluwne-2
@@ -129,6 +148,7 @@
- type: speechVerb - type: speechVerb
id: Ghost id: Ghost
name: chat-speech-verb-name-ghost
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-ghost-1 - chat-speech-verb-ghost-1
- chat-speech-verb-ghost-2 - chat-speech-verb-ghost-2
@@ -138,6 +158,7 @@
- type: speechVerb - type: speechVerb
id: Electricity id: Electricity
name: chat-speech-verb-name-electricity
speechVerbStrings: speechVerbStrings:
- chat-speech-verb-electricity-1 - chat-speech-verb-electricity-1
- chat-speech-verb-electricity-2 - chat-speech-verb-electricity-2