HorizontalExpand="True"
VerticalExpand="True"
Margin="5 5 5 5">
- <Label Name="LawNumberLabel" StyleClasses="StatusFieldTitle"/>
+ <RichTextLabel Name="LawNumberLabel" StyleClasses="LabelKeyText"/>
<customControls:HSeparator Margin="0 5 0 5"/>
<RichTextLabel Name="LawLabel"/>
<BoxContainer Name="LawAnnouncementButtons" Orientation="Horizontal" HorizontalExpand="True" Margin="0 5 0 0">
using Content.Client.Chat.Managers;
+using Content.Client.Message;
using Content.Shared.Chat;
using Content.Shared.Radio;
using Content.Shared.Silicons.Laws;
var lawIdentifier = Loc.GetString("laws-ui-law-header", ("id", identifier));
var lawDescription = Loc.GetString(law.LawString);
- LawNumberLabel.Text = lawIdentifier;
+ LawNumberLabel.SetMarkup(lawIdentifier);
LawLabel.SetMessage(lawDescription);
// If you can't talk, you can't state your laws...
new StyleProperty("font", notoSansItalic12),
}),
+ new StyleRule(new SelectorElement(typeof(RichTextLabel), new[] {StyleClassLabelKeyText}, null, null), new[]
+ {
+ new StyleProperty(Label.StylePropertyFont, notoSansBold12),
+ new StyleProperty( Control.StylePropertyModulateSelf, NanoGold)
+ }),
+
// alert tooltip
new StyleRule(new SelectorElement(typeof(RichTextLabel), new[] {StyleClassTooltipAlertTitle}, null, null), new[]
{
--- /dev/null
+using System.Text;
+using JetBrains.Annotations;
+using Robust.Client.UserInterface.RichText;
+using Robust.Shared.Timing;
+using Robust.Shared.Utility;
+
+namespace Content.Client.UserInterface.RichText;
+
+/// <summary>
+/// Adds a specified length of random characters that scramble at a set rate.
+/// </summary>
+[UsedImplicitly]
+public sealed class ScrambleTag : IMarkupTag
+{
+ [Dependency] private readonly IGameTiming _timing = default!;
+
+ public string Name => "scramble";
+
+ public string TextBefore(MarkupNode node)
+ {
+ if (!node.Attributes.TryGetValue("rate", out var rateParam) ||
+ !rateParam.TryGetLong(out var rate) ||
+ !node.Attributes.TryGetValue("length", out var lengthParam) ||
+ !lengthParam.TryGetLong(out var length) ||
+ !node.Attributes.TryGetValue("chars", out var charsParam) ||
+ !charsParam.TryGetString(out var chars))
+ return string.Empty;
+
+ var seed = (int) (_timing.CurTime.TotalMilliseconds / rate);
+ var rand = new Random(seed + node.GetHashCode());
+ var charOptions = chars.ToCharArray();
+ var sb = new StringBuilder();
+ for (var i = 0; i < length; i++)
+ {
+ var index = rand.Next() % charOptions.Length;
+ sb.Append(charOptions[index]);
+ }
+
+ return sb.ToString();
+ }
+}
}
else
{
- laws.Laws.Insert(0, new SiliconLaw()
+ laws.Laws.Insert(0, new SiliconLaw
{
LawString = newLaw,
Order = -1,
- LawIdentifierOverride = "#"
+ LawIdentifierOverride = Loc.GetString("ion-storm-law-scrambled-number", ("length", RobustRandom.Next(5, 10)))
});
}
station-event-ion-storm-start-announcement = Ion storm detected near the station. Please check all AI-controlled equipment for errors.
+ion-storm-law-scrambled-number = [font="Monospace"][scramble rate=250 length={$length} chars="@@###$$&%!01"/][/font]
+
ion-storm-you = YOU
ion-storm-the-station = THE STATION
ion-storm-the-crew = THE CREW
- type: font
id: AnimalSilence
path: /Fonts/Animal Silence.otf
+
+- type: font
+ id: Monospace
+ path: /EngineFonts/NotoSans/NotoSansMono-Regular.ttf