Files
tbd-station-14/Content.Server/Speech/EntitySystems/StutteringSystem.cs
Vasilis 9ea8e03c23 Social a-anxiety/st-st-stuttering t-trait. (#20500)
* This was supposed to be a challenge

* Component magik

* Add documentation
2023-10-21 13:09:54 -07:00

75 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!;
// 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, component);
}
public string Accentuate(string message, StutteringAccentComponent component)
{
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(component.MatchRandomProb))
{
if (_random.Prob(component.FourRandomProb))
{
newLetter = $"{newLetter}-{newLetter}-{newLetter}-{newLetter}";
}
else if (_random.Prob(component.ThreeRandomProb))
{
newLetter = $"{newLetter}-{newLetter}-{newLetter}";
}
else if (_random.Prob(component.CutRandomProb))
{
newLetter = "";
}
else
{
newLetter = $"{newLetter}-{newLetter}";
}
}
finalMessage.Append(newLetter);
}
return finalMessage.ToString();
}
}
}