ScrambledAccentSystem.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using System.Linq;
  2. using System.Text.RegularExpressions;
  3. using Content.Server.Speech.Components;
  4. using Robust.Shared.Random;
  5. namespace Content.Server.Speech.EntitySystems
  6. {
  7. public sealed class ScrambledAccentSystem : EntitySystem
  8. {
  9. private static readonly Regex RegexLoneI = new(@"(?<=\ )i(?=[\ \.\?]|$)");
  10. [Dependency] private readonly IRobustRandom _random = default!;
  11. public override void Initialize()
  12. {
  13. SubscribeLocalEvent<ScrambledAccentComponent, AccentGetEvent>(OnAccent);
  14. }
  15. public string Accentuate(string message)
  16. {
  17. var words = message.ToLower().Split();
  18. if (words.Length < 2)
  19. {
  20. var pick = _random.Next(1, 8);
  21. // If they try to weasel out of it by saying one word at a time we give them this.
  22. return Loc.GetString($"accent-scrambled-words-{pick}");
  23. }
  24. // Scramble the words
  25. var scrambled = words.OrderBy(x => _random.Next()).ToArray();
  26. var msg = string.Join(" ", scrambled);
  27. // First letter should be capital
  28. msg = msg[0].ToString().ToUpper() + msg.Remove(0, 1);
  29. // Capitalize lone i's
  30. msg = RegexLoneI.Replace(msg, "I");
  31. return msg;
  32. }
  33. private void OnAccent(EntityUid uid, ScrambledAccentComponent component, AccentGetEvent args)
  34. {
  35. args.Message = Accentuate(args.Message);
  36. }
  37. }
  38. }