]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add text highlighting (#31442)
authorvitopigno <103512727+VitusVeit@users.noreply.github.com>
Wed, 4 Jun 2025 10:12:37 +0000 (12:12 +0200)
committerGitHub <noreply@github.com>
Wed, 4 Jun 2025 10:12:37 +0000 (12:12 +0200)
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
Co-authored-by: Hans Larsson <hanandlia@gmail.com>
Co-authored-by: Tobias Berger <toby@tobot.dev>
14 files changed:
Content.Client/Options/UI/OptionColorSlider.xaml [new file with mode: 0644]
Content.Client/Options/UI/OptionColorSlider.xaml.cs [new file with mode: 0644]
Content.Client/Options/UI/OptionsTabControlRow.xaml.cs
Content.Client/Options/UI/Tabs/AccessibilityTab.xaml
Content.Client/Options/UI/Tabs/AccessibilityTab.xaml.cs
Content.Client/UserInterface/Systems/Chat/ChatUIController.Highlighting.cs [new file with mode: 0644]
Content.Client/UserInterface/Systems/Chat/ChatUIController.cs
Content.Client/UserInterface/Systems/Chat/Controls/ChannelFilterPopup.xaml
Content.Client/UserInterface/Systems/Chat/Controls/ChannelFilterPopup.xaml.cs
Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs
Content.Shared/CCVar/CCVars.Chat.cs
Resources/Locale/en-US/chat/highlights.ftl [new file with mode: 0644]
Resources/Locale/en-US/chat/ui/chat-box.ftl
Resources/Locale/en-US/escape-menu/ui/options-menu.ftl

diff --git a/Content.Client/Options/UI/OptionColorSlider.xaml b/Content.Client/Options/UI/OptionColorSlider.xaml
new file mode 100644 (file)
index 0000000..4f5f082
--- /dev/null
@@ -0,0 +1,7 @@
+<Control xmlns="https://spacestation14.io">
+    <BoxContainer Orientation="Vertical">
+        <Label Name="TitleLabel" Access="Public" />
+        <Label Name="ExampleLabel" Access="Public" />
+        <ColorSelectorSliders Name="Slider" Access="Public" HorizontalExpand="True" />
+    </BoxContainer>
+</Control>
diff --git a/Content.Client/Options/UI/OptionColorSlider.xaml.cs b/Content.Client/Options/UI/OptionColorSlider.xaml.cs
new file mode 100644 (file)
index 0000000..6f8f46a
--- /dev/null
@@ -0,0 +1,31 @@
+using Content.Client.Options.UI;
+using Robust.Client.AutoGenerated;
+using Robust.Client.UserInterface;
+
+namespace Content.Client.Options.UI;
+
+/// <summary>
+/// Standard UI control used for color sliders in the options menu. Intended for use with <see cref="OptionsTabControlRow"/>.
+/// </summary>
+/// <seealso cref="OptionsTabControlRow.AddOptionColorSlider"/>
+[GenerateTypedNameReferences]
+public sealed partial class OptionColorSlider : Control
+{
+    /// <summary>
+    /// The text describing what this slider affects.
+    /// </summary>
+    public string? Title
+    {
+        get => TitleLabel.Text;
+        set => TitleLabel.Text = value;
+    }
+
+    /// <summary>
+    /// The example text showing the current color of the slider.
+    /// </summary>
+    public string? Example
+    {
+        get => ExampleLabel.Text;
+        set => ExampleLabel.Text = value;
+    }
+}
index 31dd9897f4e479b7d2f5b031dd06840476603b13..ad262f94a26754d3819a22ad11901aa968744e6a 100644 (file)
@@ -121,6 +121,19 @@ public sealed partial class OptionsTabControlRow : Control
         return AddOption(new OptionSliderFloatCVar(this, _cfg, cVar, slider, min, max, scale, FormatPercent));
     }
 
+    /// <summary>
+    /// Add a color slider option, backed by a simple string CVar.
+    /// </summary>
+    /// <param name="cVar">The CVar represented by the slider.</param>
+    /// <param name="slider">The UI control for the option.</param>
+    /// <returns>The option instance backing the added option.</returns>
+    public OptionColorSliderCVar AddOptionColorSlider(
+        CVarDef<string> cVar,
+        OptionColorSlider slider)
+    {
+        return AddOption(new OptionColorSliderCVar(this, _cfg, cVar, slider));
+    }
+
     /// <summary>
     /// Add a slider option, backed by a simple integer CVar.
     /// </summary>
@@ -518,6 +531,58 @@ public sealed class OptionSliderFloatCVar : BaseOptionCVar<float>
     }
 }
 
+/// <summary>
+/// Implementation of a CVar option that simply corresponds with a string <see cref="OptionColorSlider"/>.
+/// </summary>
+/// <seealso cref="OptionsTabControlRow"/>
+public sealed class OptionColorSliderCVar : BaseOptionCVar<string>
+{
+    private readonly OptionColorSlider _slider;
+
+    protected override string Value
+    {
+        get => _slider.Slider.Color.ToHex();
+        set
+        {
+            _slider.Slider.Color = Color.FromHex(value);
+            UpdateLabelColor();
+        }
+    }
+
+    /// <summary>
+    /// Creates a new instance of this type.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// It is generally more convenient to call overloads on <see cref="OptionsTabControlRow"/>
+    /// such as <see cref="OptionsTabControlRow.AddOptionPercentSlider"/> instead of instantiating this type directly.
+    /// </para>
+    /// </remarks>
+    /// <param name="controller">The control row that owns this option.</param>
+    /// <param name="cfg">The configuration manager to get and set values from.</param>
+    /// <param name="cVar">The CVar that is being controlled by this option.</param>
+    /// <param name="slider">The UI control for the option.</param>
+    public OptionColorSliderCVar(
+        OptionsTabControlRow controller,
+        IConfigurationManager cfg,
+        CVarDef<string> cVar,
+        OptionColorSlider slider) : base(controller, cfg, cVar)
+    {
+        _slider = slider;
+
+        slider.Slider.OnColorChanged += _ =>
+        {
+            ValueChanged();
+            UpdateLabelColor();
+        };
+    }
+
+    private void UpdateLabelColor()
+    {
+        _slider.ExampleLabel.FontColorOverride = Color.FromHex(Value);
+    }
+}
+
 /// <summary>
 /// Implementation of a CVar option that simply corresponds with an integer <see cref="OptionSlider"/>.
 /// </summary>
index 5041b498a0bcb8277907e6a019fa55a541085c7d..41fac83c5980d0c8713986ed1e289515b37bfc76 100644 (file)
                 <ui:OptionSlider Name="SpeechBubbleTextOpacitySlider" Title="{Loc 'ui-options-speech-bubble-text-opacity'}" />
                 <ui:OptionSlider Name="SpeechBubbleSpeakerOpacitySlider" Title="{Loc 'ui-options-speech-bubble-speaker-opacity'}" />
                 <ui:OptionSlider Name="SpeechBubbleBackgroundOpacitySlider" Title="{Loc 'ui-options-speech-bubble-background-opacity'}" />
+                <CheckBox Name="AutoFillHighlightsCheckBox" Text="{Loc 'ui-options-auto-fill-highlights'}" />
+                <ui:OptionColorSlider Name="HighlightsColorSlider" 
+                    Title="{Loc 'ui-options-highlights-color'}" 
+                    Example="{Loc 'ui-options-highlights-color-example'}"/>
                 <Label Text="{Loc 'ui-options-accessability-header-content'}"
                        StyleClasses="LabelKeyText"/>
                 <CheckBox Name="CensorNudityCheckBox" Text="{Loc 'ui-options-censor-nudity'}" />
index f87cda746c1eac3b68096faf3dc632138315d6b6..0c88eae50d384af11d1c0a5e6872ed945646a831 100644 (file)
@@ -20,6 +20,8 @@ public sealed partial class AccessibilityTab : Control
         Control.AddOptionPercentSlider(CCVars.SpeechBubbleTextOpacity, SpeechBubbleTextOpacitySlider);
         Control.AddOptionPercentSlider(CCVars.SpeechBubbleSpeakerOpacity, SpeechBubbleSpeakerOpacitySlider);
         Control.AddOptionPercentSlider(CCVars.SpeechBubbleBackgroundOpacity, SpeechBubbleBackgroundOpacitySlider);
+        Control.AddOptionCheckBox(CCVars.ChatAutoFillHighlights, AutoFillHighlightsCheckBox);
+        Control.AddOptionColorSlider(CCVars.ChatHighlightsColor, HighlightsColorSlider);
 
         Control.AddOptionCheckBox(CCVars.AccessibilityClientCensorNudity, CensorNudityCheckBox);
 
diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.Highlighting.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.Highlighting.cs
new file mode 100644 (file)
index 0000000..e413999
--- /dev/null
@@ -0,0 +1,156 @@
+using System.Linq;
+using System.Text.RegularExpressions;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controllers;
+using Content.Shared.CCVar;
+using Content.Client.CharacterInfo;
+using static Content.Client.CharacterInfo.CharacterInfoSystem;
+
+namespace Content.Client.UserInterface.Systems.Chat;
+
+/// <summary>
+/// A partial class of ChatUIController that handles the saving and loading of highlights for the chatbox.
+/// It also makes use of the CharacterInfoSystem to optionally generate highlights based on the character's info.
+/// </summary>
+public sealed partial class ChatUIController : IOnSystemChanged<CharacterInfoSystem>
+{
+    [UISystemDependency] private readonly CharacterInfoSystem _characterInfo = default!;
+
+    /// <summary>
+    ///     The list of words to be highlighted in the chatbox.
+    /// </summary>
+    private List<string> _highlights = new();
+
+    /// <summary>
+    ///     The string holding the hex color used to highlight words.
+    /// </summary>
+    private string? _highlightsColor;
+
+    private bool _autoFillHighlightsEnabled;
+
+    /// <summary>
+    ///     The boolean that keeps track of the 'OnCharacterUpdated' event, whenever it's a player attaching or opening the character info panel.
+    /// </summary>
+    private bool _charInfoIsAttach = false;
+
+    public event Action<string>? HighlightsUpdated;
+
+    private void InitializeHighlights()
+    {
+        _config.OnValueChanged(CCVars.ChatAutoFillHighlights, (value) => { _autoFillHighlightsEnabled = value; }, true);
+
+        _config.OnValueChanged(CCVars.ChatHighlightsColor, (value) => { _highlightsColor = value; }, true);
+
+        // Load highlights if any were saved.
+        string highlights = _config.GetCVar(CCVars.ChatHighlights);
+
+        if (!string.IsNullOrEmpty(highlights))
+        {
+            UpdateHighlights(highlights, true);
+        }
+    }
+
+    public void OnSystemLoaded(CharacterInfoSystem system)
+    {
+        system.OnCharacterUpdate += OnCharacterUpdated;
+    }
+
+    public void OnSystemUnloaded(CharacterInfoSystem system)
+    {
+        system.OnCharacterUpdate -= OnCharacterUpdated;
+    }
+
+    private void UpdateAutoFillHighlights()
+    {
+        if (!_autoFillHighlightsEnabled)
+            return;
+
+        // If auto highlights are enabled generate a request for new character info
+        // that will be used to determine the highlights.
+        _charInfoIsAttach = true;
+        _characterInfo.RequestCharacterInfo();
+    }
+
+    public void UpdateHighlights(string newHighlights, bool firstLoad = false)
+    {
+        // Do nothing if the provided highlights are the same as the old ones and it is not the first time.
+        if (!firstLoad && _config.GetCVar(CCVars.ChatHighlights).Equals(newHighlights, StringComparison.CurrentCultureIgnoreCase))
+            return;
+
+        _config.SetCVar(CCVars.ChatHighlights, newHighlights);
+        _config.SaveToFile();
+
+        _highlights.Clear();
+
+        // We first subdivide the highlights based on newlines to prevent replacing
+        // a valid "\n" tag and adding it to the final regex.
+        string[] splittedHighlights = newHighlights.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
+
+        for (int i = 0; i < splittedHighlights.Length; i++)
+        {
+            // Replace every "\" character with a "\\" to prevent "\n", "\0", etc...
+            string keyword = splittedHighlights[i].Replace(@"\", @"\\");
+
+            // Escape the keyword to prevent special characters like "(" and ")" to be considered valid regex.
+            keyword = Regex.Escape(keyword);
+
+            // 1. Since the "["s in WrappedMessage are already sanitized, add 2 extra "\"s
+            // to make sure it matches the literal "\" before the square bracket.
+            keyword = keyword.Replace(@"\[", @"\\\[");
+
+            // If present, replace the double quotes at the edges with tags
+            // that make sure the words to match are separated by spaces or punctuation.
+            // NOTE: The reason why we don't use \b tags is that \b doesn't match reverse slash characters "\" so
+            // a pre-sanitized (see 1.) string like "\[test]" wouldn't get picked up by the \b.
+            if (keyword.Count(c => (c == '"')) > 0)
+            {
+                // Matches the last double quote character.
+                keyword = Regex.Replace(keyword, "\"$", "(?!\\w)");
+                // When matching for the first double quote character we also consider the possibility
+                // of the double quote being preceded by a @ character.
+                keyword = Regex.Replace(keyword, "^\"|(?<=^@)\"", "(?<!\\w)");
+            }
+
+            // Make sure any name tagged as ours gets highlighted only when others say it.
+            keyword = Regex.Replace(keyword, "^@", "(?<=(?<=/name.*)|(?<=,.*\"\".*))");
+
+            _highlights.Add(keyword);
+        }
+
+        // Arrange the list of highlights in descending order so that when highlighting,
+        // the full word (eg. "Security") gets picked before the abbreviation (eg. "Sec").
+        _highlights.Sort((x, y) => y.Length.CompareTo(x.Length));
+    }
+
+    private void OnCharacterUpdated(CharacterData data)
+    {
+        // If _charInfoIsAttach is false then the opening of the character panel was the one
+        // to generate the event, dismiss it.
+        if (!_charInfoIsAttach)
+            return;
+
+        var (_, job, _, _, entityName) = data;
+
+        // Mark this entity's name as our character name for the "UpdateHighlights" function.
+        string newHighlights = "@" + entityName;
+
+        // Subdivide the character's name based on spaces or hyphens so that every word gets highlighted.
+        if (newHighlights.Count(c => (c == ' ' || c == '-')) == 1)
+            newHighlights = newHighlights.Replace("-", "\n@").Replace(" ", "\n@");
+
+        // If the character has a name with more than one hyphen assume it is a lizard name and extract the first and
+        // last name eg. "Eats-The-Food" -> "@Eats" "@Food"
+        if (newHighlights.Count(c => c == '-') > 1)
+            newHighlights = newHighlights.Split('-')[0] + "\n@" + newHighlights.Split('-')[^1];
+
+        // Convert the job title to kebab-case and use it as a key for the loc file.
+        string jobKey = job.Replace(' ', '-').ToLower();
+
+        if (Loc.TryGetString($"highlights-{jobKey}", out var jobMatches))
+            newHighlights += '\n' + jobMatches.Replace(", ", "\n");
+
+        UpdateHighlights(newHighlights);
+        HighlightsUpdated?.Invoke(newHighlights);
+        _charInfoIsAttach = false;
+    }
+}
index 1ccba1ae202c7bb3a3397a11a99537cae1148745..13c6ff4a2ab9a279a4178ce804a6e637185364fb 100644 (file)
@@ -41,9 +41,10 @@ using Robust.Shared.Replays;
 using Robust.Shared.Timing;
 using Robust.Shared.Utility;
 
+
 namespace Content.Client.UserInterface.Systems.Chat;
 
-public sealed class ChatUIController : UIController
+public sealed partial class ChatUIController : UIController
 {
     [Dependency] private readonly IClientAdminManager _admin = default!;
     [Dependency] private readonly IChatManager _manager = default!;
@@ -240,6 +241,7 @@ public sealed class ChatUIController : UIController
 
         _config.OnValueChanged(CCVars.ChatWindowOpacity, OnChatWindowOpacityChanged);
 
+        InitializeHighlights();
     }
 
     public void OnScreenLoad()
@@ -426,6 +428,8 @@ public sealed class ChatUIController : UIController
     private void OnAttachedChanged(EntityUid uid)
     {
         UpdateChannelPermissions();
+
+        UpdateAutoFillHighlights();
     }
 
     private void AddSpeechBubble(ChatMessage msg, SpeechBubble.SpeechType speechType)
@@ -825,6 +829,12 @@ public sealed class ChatUIController : UIController
                 msg.WrappedMessage = SharedChatSystem.InjectTagInsideTag(msg, "Name", "color", GetNameColor(SharedChatSystem.GetStringInsideTag(msg, "Name")));
         }
 
+        // Color any words chosen by the client.
+        foreach (var highlight in _highlights)
+        {
+            msg.WrappedMessage = SharedChatSystem.InjectTagAroundString(msg, highlight, "color", _highlightsColor);
+        }
+
         // Color any codewords for minds that have roles that use them
         if (_player.LocalUser != null && _mindSystem != null && _roleCodewordSystem != null)
         {
index 459c44eee26a1f81beb5afa99890de0b3769faaa..2e4a057a0509449521c6eec8b6e53f35c7a9fdef 100644 (file)
@@ -1,10 +1,22 @@
 <controls:ChannelFilterPopup
     xmlns="https://spacestation14.io"
+    xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
     xmlns:controls="clr-namespace:Content.Client.UserInterface.Systems.Chat.Controls">
     <PanelContainer Name="FilterPopupPanel" StyleClasses="BorderedWindowPanel">
-        <BoxContainer Orientation="Horizontal">
-            <Control MinSize="4 0"/>
-            <BoxContainer Name="FilterVBox" MinWidth="110" Margin="0 10" Orientation="Vertical" SeparationOverride="4"/>
+        <BoxContainer Orientation="Horizontal" SeparationOverride="8" Margin="10 0">
+            <BoxContainer Name="FilterVBox" MinWidth="105" Margin="0 10" Orientation="Vertical" SeparationOverride="4"/>
+            <BoxContainer Name="HighlightsVBox" MinWidth="120" Margin="0 10" Orientation="Vertical" SeparationOverride="4">
+                <Label Text="{Loc 'hud-chatbox-highlights'}"/>
+                <PanelContainer>
+                    <!-- Begin custom background for TextEdit -->
+                    <PanelContainer.PanelOverride>
+                        <gfx:StyleBoxFlat BackgroundColor="#323446"/>
+                    </PanelContainer.PanelOverride>
+                    <!-- End custom background -->
+                    <TextEdit Name="HighlightEdit" MinHeight="150" Margin="5 5"/>
+                </PanelContainer>
+                <Button Name="HighlightButton" Text="{Loc 'hud-chatbox-highlights-button'}" ToolTip="{Loc 'hud-chatbox-highlights-tooltip'}"/>
+            </BoxContainer>
         </BoxContainer>
     </PanelContainer>
 </controls:ChannelFilterPopup>
index 33a82db335a0b72df15b44f994252892cffa4eb0..100607d36eb6977ffa2ce5e016ee4afe0a0b5e01 100644 (file)
@@ -1,4 +1,7 @@
 using Content.Shared.Chat;
+using Content.Shared.CCVar;
+using Robust.Shared.Utility;
+using Robust.Shared.Configuration;
 using Robust.Client.AutoGenerated;
 using Robust.Client.UserInterface.Controls;
 using Robust.Client.UserInterface.XAML;
@@ -29,10 +32,24 @@ public sealed partial class ChannelFilterPopup : Popup
     private readonly Dictionary<ChatChannel, ChannelFilterCheckbox> _filterStates = new();
 
     public event Action<ChatChannel, bool>? OnChannelFilter;
+    public event Action<string>? OnNewHighlights;
 
     public ChannelFilterPopup()
     {
         RobustXamlLoader.Load(this);
+
+        HighlightButton.OnPressed += HighlightsEntered;
+        // Add a placeholder text to the highlights TextEdit.
+        HighlightEdit.Placeholder = new Rope.Leaf(Loc.GetString("hud-chatbox-highlights-placeholder"));
+
+        // Load highlights if any were saved.
+        var cfg = IoCManager.Resolve<IConfigurationManager>();
+        string highlights = cfg.GetCVar(CCVars.ChatHighlights);
+
+        if (!string.IsNullOrEmpty(highlights))
+        {
+            UpdateHighlights(highlights);
+        }
     }
 
     public bool IsActive(ChatChannel channel)
@@ -92,12 +109,22 @@ public sealed partial class ChannelFilterPopup : Popup
         }
     }
 
+    public void UpdateHighlights(string highlights)
+    {
+        HighlightEdit.TextRope = new Rope.Leaf(highlights);
+    }
+
     private void CheckboxPressed(ButtonEventArgs args)
     {
         var checkbox = (ChannelFilterCheckbox) args.Button;
         OnChannelFilter?.Invoke(checkbox.Channel, checkbox.Pressed);
     }
 
+    private void HighlightsEntered(ButtonEventArgs _args)
+    {
+        OnNewHighlights?.Invoke(Rope.Collapse(HighlightEdit.TextRope));
+    }
+
     public void UpdateUnread(ChatChannel channel, int? unread)
     {
         if (_filterStates.TryGetValue(channel, out var checkbox))
index 068cf4e87eeb26754eaafc23af8d014bb1cc204a..289c9fa1642240a8eb020627cb02b6f0b854f42a 100644 (file)
@@ -38,9 +38,10 @@ public partial class ChatBox : UIWidget
         ChatInput.Input.OnFocusExit += OnFocusExit;
         ChatInput.ChannelSelector.OnChannelSelect += OnChannelSelect;
         ChatInput.FilterButton.Popup.OnChannelFilter += OnChannelFilter;
-
+        ChatInput.FilterButton.Popup.OnNewHighlights += OnNewHighlights;
         _controller = UserInterfaceManager.GetUIController<ChatUIController>();
         _controller.MessageAdded += OnMessageAdded;
+        _controller.HighlightsUpdated += OnHighlightsUpdated;
         _controller.RegisterChat(this);
     }
 
@@ -67,6 +68,11 @@ public partial class ChatBox : UIWidget
         AddLine(msg.WrappedMessage, color);
     }
 
+    private void OnHighlightsUpdated(string highlights)
+    {
+        ChatInput.FilterButton.Popup.UpdateHighlights(highlights);
+    }
+
     private void OnChannelSelect(ChatSelectChannel channel)
     {
         _controller.UpdateSelectedChannel(this);
@@ -97,6 +103,11 @@ public partial class ChatBox : UIWidget
         }
     }
 
+    private void OnNewHighlights(string highlighs)
+    {
+        _controller.UpdateHighlights(highlighs);
+    }
+
     public void AddLine(string message, Color color)
     {
         var formatted = new FormattedMessage(3);
index 139a82372a266e10591e5197f306a467d1044cc0..9f31e0527e63bd47438c708c898d901d87e077ec 100644 (file)
@@ -65,4 +65,22 @@ public sealed partial class CCVars
             "",
             CVar.SERVER | CVar.SERVERONLY | CVar.ARCHIVE,
             "A message broadcast to each player that joins the lobby.");
+
+    /// <summary>
+    /// A string containing a list of newline-separated words to be highlighted in the chat.
+    /// </summary>
+    public static readonly CVarDef<string> ChatHighlights =
+        CVarDef.Create("chat.highlights", "", CVar.CLIENTONLY | CVar.ARCHIVE, "A list of newline-separated words to be highlighted in the chat.");
+
+    /// <summary>
+    /// An option to toggle the automatic filling of the highlights with the character's info, if available.
+    /// </summary>
+    public static readonly CVarDef<bool> ChatAutoFillHighlights =
+        CVarDef.Create("chat.auto_fill_highlights", false, CVar.CLIENTONLY | CVar.ARCHIVE, "Toggles automatically filling the highlights with the character's information.");
+
+    /// <summary>
+    /// The color in which the highlights will be displayed.
+    /// </summary>
+    public static readonly CVarDef<string> ChatHighlightsColor =
+        CVarDef.Create("chat.highlights_color", "#17FFC1FF", CVar.CLIENTONLY | CVar.ARCHIVE, "The color in which the highlights will be displayed.");
 }
diff --git a/Resources/Locale/en-US/chat/highlights.ftl b/Resources/Locale/en-US/chat/highlights.ftl
new file mode 100644 (file)
index 0000000..6d3610e
--- /dev/null
@@ -0,0 +1,57 @@
+# Command
+highlights-captain = Captain, "Cap", Bridge, Command
+highlights-head-of-personnel = Head Of Personnel, "HoP", Service, Bridge, Command
+highlights-chief-engineer = Chief Engineer, "CE", Engineering, Engineer, "Engi", Bridge, Command
+highlights-chief-medical-officer = Chief Medical Officer, "CMO", MedBay, "Med", Bridge, Command
+highlights-head-of-security = Head of Security, "HoS", Security, "Sec", Bridge, Command
+highlights-quartermaster = Quartermaster, "QM", Cargo, Bridge, Command
+highlights-research-director = Research Director, "RD", Science, "Sci", Bridge, Command
+
+# Security
+highlights-detective = Detective, "Det", Security, "Sec"
+highlights-security-cadet = Security Cadet, Secoff, Cadet, Security, "Sec"
+highlights-security-officer = Security Officer, Secoff, Officer, Security, "Sec"
+highlights-warden = Warden, "Ward", Security, "Sec"
+
+# Cargo
+highlights-cargo-technician = Cargo Technician, Cargo Tech, "Cargo"
+highlights-salvage-specialist = Salvage Specialist, Salvager, Salvage, "Salv", "Cargo", Miner
+
+# Engineering
+highlights-atmospheric-technician = Atmospheric Technician, Atmos tech, Atmospheric, Engineering, "Atmos", "Engi"
+highlights-station-engineer = Station Engineer, Engineering, Engineer, "Engi"
+highlights-technical-assistant = Technical Assistant, Tech Assistant, Engineering, Engineer, "Engi"
+
+# Medical
+highlights-chemist = Chemist, Chemistry, "Chem", MedBay, "Med"
+highlights-medical-doctor = Medical Doctor, Doctor, "Doc", MedBay, "Med"
+highlights-medical-intern = Medical Intern, "Doc", Intern, MedBay, "Med"
+highlights-paramedic = Paramedic, "Para", MedBay, "Med"
+
+# Science
+highlights-scientist = Scientist, Science, "Sci"
+highlights-research-assistant = Research Assistant, Science, "Sci"
+
+# Civilian
+highlights-bartender = Bartender, Barkeeper, Barkeep, "Bar"
+highlights-botanist = Botanist, Botany, Hydroponics
+highlights-chaplain = Chaplain, "Chap", Chapel
+highlights-chef = Chef, "Cook", Kitchen
+highlights-clown = Clown, Jester
+highlights-janitor = Janitor, "Jani"
+highlights-lawyer = Lawyer, Attorney
+highlights-librarian = Librarian, Library
+highlights-mime = Mime
+highlights-passenger = Passenger, Greytider, "Tider"
+highlights-service-worker = Service Worker
+
+# Station-specific
+highlights-boxer = Boxer
+highlights-reporter = Reporter, Journalist
+highlights-zookeeper = Zookeeper
+highlights-psychologist = Psychologist, Psychology
+
+# Silicon
+highlights-personal-ai = Personal AI, "pAI"
+highlights-cyborg = Cyborg, Silicon, Borg
+highlights-station-ai = Station AI, Silicon, "AI", "sAI"
index 720f0d15ab45a14d34d8e8dd77f6d6e530d672f3..7a3c33ad4380a2797b253b288fedd17c01ee882b 100644 (file)
@@ -31,3 +31,12 @@ hud-chatbox-channel-Server = Server
 hud-chatbox-channel-Visual = Actions
 hud-chatbox-channel-Damage = Damage
 hud-chatbox-channel-Unspecified = Unspecified
+
+hud-chatbox-highlights = Highlights:
+hud-chatbox-highlights-button = Submit
+hud-chatbox-highlights-tooltip = The words need to be separated by a newline,
+                                 if wrapped around " they will be highlighted
+                                 only if separated by spaces or punctuation.
+hud-chatbox-highlights-placeholder = McHands
+                                     "Judge"
+                                     Medical
index 779f23ed939b73879f7b14d3be14ca2f681707b4..027b65667b2ca861c3849eb600362959d3c597a2 100644 (file)
@@ -49,6 +49,9 @@ ui-options-misc-label = Misc
 ui-options-interface-label = Interface
 
 
+ui-options-auto-fill-highlights = Auto-fill the highlights with the character's information
+ui-options-highlights-color = Highlighs color:
+ui-options-highlights-color-example = This is an highlighted text!
 ui-options-show-held-item = Show held item next to cursor
 ui-options-show-combat-mode-indicators = Show combat mode indicators with cursor
 ui-options-opaque-storage-window = Opaque storage window