ScrambleTag.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using System.Text;
  2. using JetBrains.Annotations;
  3. using Robust.Client.UserInterface.RichText;
  4. using Robust.Shared.Timing;
  5. using Robust.Shared.Utility;
  6. namespace Content.Client.UserInterface.RichText;
  7. /// <summary>
  8. /// Adds a specified length of random characters that scramble at a set rate.
  9. /// </summary>
  10. [UsedImplicitly]
  11. public sealed class ScrambleTag : IMarkupTag
  12. {
  13. [Dependency] private readonly IGameTiming _timing = default!;
  14. private const int MaxScrambleLength = 32;
  15. public string Name => "scramble";
  16. public string TextBefore(MarkupNode node)
  17. {
  18. if (!node.Attributes.TryGetValue("rate", out var rateParam) ||
  19. !rateParam.TryGetLong(out var rate) ||
  20. !node.Attributes.TryGetValue("length", out var lengthParam) ||
  21. !lengthParam.TryGetLong(out var length) ||
  22. !node.Attributes.TryGetValue("chars", out var charsParam) ||
  23. !charsParam.TryGetString(out var chars))
  24. return string.Empty;
  25. var seed = (int) (_timing.CurTime.TotalMilliseconds / rate);
  26. var rand = new Random(seed + node.GetHashCode());
  27. var charOptions = chars.ToCharArray();
  28. var realLength = MathF.Min(length.Value, MaxScrambleLength);
  29. var sb = new StringBuilder();
  30. for (var i = 0; i < realLength; i++)
  31. {
  32. var index = rand.Next() % charOptions.Length;
  33. sb.Append(charOptions[index]);
  34. }
  35. return sb.ToString();
  36. }
  37. }