SkeletonAccentSystem.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using System.Text.RegularExpressions;
  2. using Content.Server.Speech.Components;
  3. using Robust.Shared.Random;
  4. namespace Content.Server.Speech.EntitySystems;
  5. public sealed partial class SkeletonAccentSystem : EntitySystem
  6. {
  7. [Dependency] private readonly IRobustRandom _random = default!;
  8. [Dependency] private readonly ReplacementAccentSystem _replacement = default!;
  9. [GeneratedRegex(@"(?<!\w)[^aeiou]one", RegexOptions.IgnoreCase, "en-US")]
  10. private static partial Regex BoneRegex();
  11. public override void Initialize()
  12. {
  13. base.Initialize();
  14. SubscribeLocalEvent<SkeletonAccentComponent, AccentGetEvent>(OnAccentGet);
  15. }
  16. public string Accentuate(string message, SkeletonAccentComponent component)
  17. {
  18. // Order:
  19. // Do character manipulations first
  20. // Then direct word/phrase replacements
  21. // Then prefix/suffix
  22. var msg = message;
  23. // Character manipulations:
  24. // At the start of words, any non-vowel + "one" becomes "bone", e.g. tone -> bone ; lonely -> bonely; clone -> clone (remains unchanged).
  25. msg = BoneRegex().Replace(msg, "bone");
  26. // apply word replacements
  27. msg = _replacement.ApplyReplacements(msg, "skeleton");
  28. // Suffix:
  29. if (_random.Prob(component.ackChance))
  30. {
  31. msg += (" " + Loc.GetString("skeleton-suffix")); // e.g. "We only want to socialize. ACK ACK!"
  32. }
  33. return msg;
  34. }
  35. private void OnAccentGet(EntityUid uid, SkeletonAccentComponent component, AccentGetEvent args)
  36. {
  37. args.Message = Accentuate(args.Message, component);
  38. }
  39. }