77 lines
2.5 KiB
C#
77 lines
2.5 KiB
C#
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using Content.Server.Speech.Components;
|
|
using Content.Shared.Speech.EntitySystems;
|
|
using Content.Shared.StatusEffect;
|
|
using Robust.Shared.Random;
|
|
|
|
namespace Content.Server.Speech.EntitySystems
|
|
{
|
|
public sealed class StutteringSystem : SharedStutteringSystem
|
|
{
|
|
[Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!;
|
|
[Dependency] private readonly IRobustRandom _random = default!;
|
|
|
|
private const string StutterKey = "Stutter";
|
|
|
|
// Regex of characters to stutter.
|
|
private static readonly Regex Stutter = new(@"[b-df-hj-np-tv-wxyz]",
|
|
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
|
|
|
public override void Initialize()
|
|
{
|
|
SubscribeLocalEvent<StutteringAccentComponent, AccentGetEvent>(OnAccent);
|
|
}
|
|
|
|
public override void DoStutter(EntityUid uid, TimeSpan time, bool refresh, StatusEffectsComponent? status = null)
|
|
{
|
|
if (!Resolve(uid, ref status, false))
|
|
return;
|
|
|
|
_statusEffectsSystem.TryAddStatusEffect<StutteringAccentComponent>(uid, StutterKey, time, refresh, status);
|
|
}
|
|
|
|
private void OnAccent(EntityUid uid, StutteringAccentComponent component, AccentGetEvent args)
|
|
{
|
|
args.Message = Accentuate(args.Message);
|
|
}
|
|
|
|
public string Accentuate(string message)
|
|
{
|
|
var length = message.Length;
|
|
|
|
var finalMessage = new StringBuilder();
|
|
|
|
string newLetter;
|
|
|
|
for (var i = 0; i < length; i++)
|
|
{
|
|
newLetter = message[i].ToString();
|
|
if (Stutter.IsMatch(newLetter) && _random.Prob(0.8f))
|
|
{
|
|
if (_random.Prob(0.1f))
|
|
{
|
|
newLetter = $"{newLetter}-{newLetter}-{newLetter}-{newLetter}";
|
|
}
|
|
else if (_random.Prob(0.2f))
|
|
{
|
|
newLetter = $"{newLetter}-{newLetter}-{newLetter}";
|
|
}
|
|
else if (_random.Prob(0.05f))
|
|
{
|
|
newLetter = "";
|
|
}
|
|
else
|
|
{
|
|
newLetter = $"{newLetter}-{newLetter}";
|
|
}
|
|
}
|
|
|
|
finalMessage.Append(newLetter);
|
|
}
|
|
|
|
return finalMessage.ToString();
|
|
}
|
|
}
|
|
}
|