]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add tooltips to the agent ID job icons and improve status icon prototypes (#28575)
authorslarticodefast <161409025+slarticodefast@users.noreply.github.com>
Fri, 9 Aug 2024 06:14:07 +0000 (08:14 +0200)
committerGitHub <noreply@github.com>
Fri, 9 Aug 2024 06:14:07 +0000 (16:14 +1000)
* add tooltips to agentid job icons

* forgot to stage this

* make StatusIconPrototype abstract

* minor visual improvements

* cleanup

* use currentculture to sort job names

* review

38 files changed:
Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs
Content.Client/Access/UI/AgentIDCardWindow.xaml
Content.Client/Access/UI/AgentIDCardWindow.xaml.cs
Content.Client/CrewManifest/UI/CrewManifestSection.cs
Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs
Content.Client/Overlays/EntityHealthBarOverlay.cs
Content.Client/Overlays/ShowHealthIconsSystem.cs
Content.Client/Overlays/ShowJobIconsSystem.cs
Content.Client/Overlays/ShowSyndicateIconsSystem.cs
Content.Server/Access/Components/AgentIDCardComponent.cs
Content.Server/Access/Systems/AgentIDCardSystem.cs
Content.Server/Medical/SuitSensors/SuitSensorSystem.cs
Content.Shared/Access/Components/IdCardComponent.cs
Content.Shared/Access/SharedAgentIDCardSystem.cs
Content.Shared/Access/Systems/SharedIdCardSystem.cs
Content.Shared/Damage/Components/DamageableComponent.cs
Content.Shared/Mindshield/Components/MindShieldComponent.cs
Content.Shared/NukeOps/NukeOperativeComponent.cs
Content.Shared/Nutrition/EntitySystems/HungerSystem.cs
Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs
Content.Shared/Overlays/ShowHealthBarsComponent.cs
Content.Shared/Revolutionary/Components/HeadRevolutionaryComponent.cs
Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs
Content.Shared/Roles/JobPrototype.cs
Content.Shared/SSDIndicator/SSDIndicatorComponent.cs
Content.Shared/Security/Components/CriminalRecordComponent.cs
Content.Shared/StatusIcon/StatusIconPrototype.cs
Content.Shared/Zombies/InitialInfectedComponent.cs
Content.Shared/Zombies/ZombieComponent.cs
Resources/Locale/en-US/job/job-names.ftl
Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml
Resources/Prototypes/StatusIcon/StatusEffects/health.yml
Resources/Prototypes/StatusIcon/StatusEffects/satiation.yml [moved from Resources/Prototypes/StatusIcon/StatusEffects/hunger.yml with 84% similarity]
Resources/Prototypes/StatusIcon/StatusEffects/ssd.yml
Resources/Prototypes/StatusIcon/debug.yml
Resources/Prototypes/StatusIcon/faction.yml [moved from Resources/Prototypes/StatusIcon/antag.yml with 77% similarity]
Resources/Prototypes/StatusIcon/job.yml
Resources/Prototypes/StatusIcon/security.yml

index 50add43dc91bf76729385327a826610343f67d15..050756fcd145f6d1e1af81af1fa4bd338fb46e48 100644 (file)
@@ -38,7 +38,7 @@ namespace Content.Client.Access.UI
             SendMessage(new AgentIDCardJobChangedMessage(newJob));
         }
 
-        public void OnJobIconChanged(ProtoId<StatusIconPrototype> newJobIconId)
+        public void OnJobIconChanged(ProtoId<JobIconPrototype> newJobIconId)
         {
             SendMessage(new AgentIDCardJobIconChangedMessage(newJobIconId));
         }
@@ -55,7 +55,7 @@ namespace Content.Client.Access.UI
 
             _window.SetCurrentName(cast.CurrentName);
             _window.SetCurrentJob(cast.CurrentJob);
-            _window.SetAllowedIcons(cast.Icons, cast.CurrentJobIconId);
+            _window.SetAllowedIcons(cast.CurrentJobIconId);
         }
     }
 }
index 89de793714d6156ceab39318975dc7d77a5652bc..7d091e4e165ca50f6c6d517297dcaa82a9d70b25 100644 (file)
@@ -6,12 +6,9 @@
         <LineEdit Name="NameLineEdit" />
         <Label Name="CurrentJob" Text="{Loc 'agent-id-card-current-job'}" />
         <LineEdit Name="JobLineEdit" />
-        <BoxContainer Orientation="Horizontal">
-            <Label Text="{Loc 'agent-id-card-job-icon-label'}"/>
-            <Control HorizontalExpand="True" MinSize="50 0"/>
-            <GridContainer Name="IconGrid" Columns="10">
-                <!-- Job icon buttons are generated in the code -->
-            </GridContainer>
-        </BoxContainer>
+        <Label Text="{Loc 'agent-id-card-job-icon-label'}"/>
+        <GridContainer Name="IconGrid" Columns="10">
+            <!-- Job icon buttons are generated in the code -->
+        </GridContainer>
     </BoxContainer>
 </DefaultWindow>
index 071ce41a069841a0e3fbf73bfabba3a5fae3050a..320bb88a67e6d6858b57070396e8a89f73974a57 100644 (file)
@@ -8,6 +8,7 @@ using Robust.Client.UserInterface.CustomControls;
 using Robust.Client.UserInterface.XAML;
 using Robust.Shared.Prototypes;
 using System.Numerics;
+using System.Linq;
 
 namespace Content.Client.Access.UI
 {
@@ -23,7 +24,7 @@ namespace Content.Client.Access.UI
         public event Action<string>? OnNameChanged;
         public event Action<string>? OnJobChanged;
 
-        public event Action<ProtoId<StatusIconPrototype>>? OnJobIconChanged;
+        public event Action<ProtoId<JobIconPrototype>>? OnJobIconChanged;
 
         public AgentIDCardWindow()
         {
@@ -38,17 +39,16 @@ namespace Content.Client.Access.UI
             JobLineEdit.OnFocusExit += e => OnJobChanged?.Invoke(e.Text);
         }
 
-        public void SetAllowedIcons(HashSet<ProtoId<StatusIconPrototype>> icons, string currentJobIconId)
+        public void SetAllowedIcons(string currentJobIconId)
         {
             IconGrid.DisposeAllChildren();
 
-            var jobIconGroup = new ButtonGroup();
+            var jobIconButtonGroup = new ButtonGroup();
             var i = 0;
-            foreach (var jobIconId in icons)
+            var icons = _prototypeManager.EnumeratePrototypes<JobIconPrototype>().Where(icon => icon.AllowSelection).ToList();
+            icons.Sort((x, y) => string.Compare(x.LocalizedJobName, y.LocalizedJobName, StringComparison.CurrentCulture));
+            foreach (var jobIcon in icons)
             {
-                if (!_prototypeManager.TryIndex(jobIconId, out var jobIcon))
-                    continue;
-
                 String styleBase = StyleBase.ButtonOpenBoth;
                 var modulo = i % JobIconColumnCount;
                 if (modulo == 0)
@@ -62,8 +62,9 @@ namespace Content.Client.Access.UI
                     Access = AccessLevel.Public,
                     StyleClasses = { styleBase },
                     MaxSize = new Vector2(42, 28),
-                    Group = jobIconGroup,
-                    Pressed = i == 0,
+                    Group = jobIconButtonGroup,
+                    Pressed = currentJobIconId == jobIcon.ID,
+                    ToolTip = jobIcon.LocalizedJobName
                 };
 
                 // Generate buttons textures
@@ -78,9 +79,6 @@ namespace Content.Client.Access.UI
                 jobIconButton.OnPressed += _ => OnJobIconChanged?.Invoke(jobIcon.ID);
                 IconGrid.AddChild(jobIconButton);
 
-                if (jobIconId.Equals(currentJobIconId))
-                    jobIconButton.Pressed = true;
-
                 i++;
             }
         }
index 4b1b02cb75594d2a821881b9e46cee183374d315..29cf850e2b9279b1c80d9a682dcb5b0efa61cf95 100644 (file)
@@ -51,7 +51,7 @@ public sealed class CrewManifestSection : BoxContainer
             title.SetMessage(entry.JobTitle);
 
 
-            if (prototypeManager.TryIndex<StatusIconPrototype>(entry.JobIcon, out var jobIcon))
+            if (prototypeManager.TryIndex<JobIconPrototype>(entry.JobIcon, out var jobIcon))
             {
                 var icon = new TextureRect()
                 {
index e861864c14479850ff176694effb24b436821694..0709921ae8b3fd1f9fceaabebad1245a3baa37e7 100644 (file)
@@ -257,7 +257,7 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
             mainContainer.AddChild(jobContainer);
 
             // Job icon
-            if (_prototypeManager.TryIndex<StatusIconPrototype>(sensor.JobIcon, out var proto))
+            if (_prototypeManager.TryIndex<JobIconPrototype>(sensor.JobIcon, out var proto))
             {
                 var jobIcon = new TextureRect()
                 {
index 4f928437395a97d88e28ef43341200cc62527f5e..193635bda7b6ba19be20f6e758565776ccd244fa 100644 (file)
@@ -33,7 +33,7 @@ public sealed class EntityHealthBarOverlay : Overlay
 
     public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
     public HashSet<string> DamageContainers = new();
-    public ProtoId<StatusIconPrototype>? StatusIcon;
+    public ProtoId<HealthIconPrototype>? StatusIcon;
 
     public EntityHealthBarOverlay(IEntityManager entManager, IPrototypeManager prototype)
     {
index d8af91482b3efad2aaaae13cef7840d8773add66..8c22c78f17cd2eefc1696756154f082979acbb36 100644 (file)
@@ -53,17 +53,17 @@ public sealed class ShowHealthIconsSystem : EquipmentHudSystem<ShowHealthIconsCo
         args.StatusIcons.AddRange(healthIcons);
     }
 
-    private IReadOnlyList<StatusIconPrototype> DecideHealthIcons(Entity<DamageableComponent> entity)
+    private IReadOnlyList<HealthIconPrototype> DecideHealthIcons(Entity<DamageableComponent> entity)
     {
         var damageableComponent = entity.Comp;
 
         if (damageableComponent.DamageContainerID == null ||
             !DamageContainers.Contains(damageableComponent.DamageContainerID))
         {
-            return Array.Empty<StatusIconPrototype>();
+            return Array.Empty<HealthIconPrototype>();
         }
 
-        var result = new List<StatusIconPrototype>();
+        var result = new List<HealthIconPrototype>();
 
         // Here you could check health status, diseases, mind status, etc. and pick a good icon, or multiple depending on whatever.
         if (damageableComponent?.DamageContainerID == "Biological")
index a6d4f70af6b4c7df14d260639f8137ef719f475a..e5ba9b813f02caa7153b851abdcc79591670c324 100644 (file)
@@ -13,7 +13,7 @@ public sealed class ShowJobIconsSystem : EquipmentHudSystem<ShowJobIconsComponen
     [Dependency] private readonly IPrototypeManager _prototype = default!;
     [Dependency] private readonly AccessReaderSystem _accessReader = default!;
 
-    [ValidatePrototypeId<StatusIconPrototype>]
+    [ValidatePrototypeId<JobIconPrototype>]
     private const string JobIconForNoId = "JobIconNoId";
 
     public override void Initialize()
@@ -52,7 +52,7 @@ public sealed class ShowJobIconsSystem : EquipmentHudSystem<ShowJobIconsComponen
             }
         }
 
-        if (_prototype.TryIndex<StatusIconPrototype>(iconId, out var iconPrototype))
+        if (_prototype.TryIndex<JobIconPrototype>(iconId, out var iconPrototype))
             ev.StatusIcons.Add(iconPrototype);
         else
             Log.Error($"Invalid job icon prototype: {iconPrototype}");
index 782178a29dbecc468669ab2c1796a5ee146238f6..9d4599b82335b1456ae4721c56ca8d92b5caf34f 100644 (file)
@@ -22,7 +22,7 @@ public sealed class ShowSyndicateIconsSystem : EquipmentHudSystem<ShowSyndicateI
         if (!IsActive)
             return;
 
-        if (_prototype.TryIndex<StatusIconPrototype>(component.SyndStatusIcon, out var iconPrototype))
+        if (_prototype.TryIndex<FactionIconPrototype>(component.SyndStatusIcon, out var iconPrototype))
             ev.StatusIcons.Add(iconPrototype);
     }
 }
index 7a97c5f5653f549d5027a69dbc32148de0ff544c..ab1a045ea9d8f01b77cf0e71176d72ceada8742f 100644 (file)
@@ -1,15 +1,7 @@
-using Content.Shared.StatusIcon;
-using Robust.Shared.Prototypes;
+namespace Content.Server.Access.Components;
 
-namespace Content.Server.Access.Components
-{
-    [RegisterComponent]
-    public sealed partial class AgentIDCardComponent : Component
-    {
-        /// <summary>
-        /// Set of job icons that the agent ID card can show.
-        /// </summary>
-        [DataField]
-        public HashSet<ProtoId<StatusIconPrototype>> Icons;
-    }
-}
+/// <summary>
+///     Allows an ID card to copy accesses from other IDs and to change the name, job title and job icon via an interface.
+/// </summary>
+[RegisterComponent]
+public sealed partial class AgentIDCardComponent : Component { }
index f0ce3acbdb886a0e06af18ae1f79f5f2f37e4d9e..8f1d0d4f820a2c98b88ec5d396601b3af104009b 100644 (file)
@@ -67,7 +67,7 @@ namespace Content.Server.Access.Systems
             if (!TryComp<IdCardComponent>(uid, out var idCard))
                 return;
 
-            var state = new AgentIDCardBoundUserInterfaceState(idCard.FullName ?? "", idCard.JobTitle ?? "", idCard.JobIcon ?? "", component.Icons);
+            var state = new AgentIDCardBoundUserInterfaceState(idCard.FullName ?? "", idCard.JobTitle ?? "", idCard.JobIcon);
             _uiSystem.SetUiState(uid, AgentIDCardUiKey.Key, state);
         }
 
@@ -101,7 +101,7 @@ namespace Content.Server.Access.Systems
                 _cardSystem.TryChangeJobDepartment(uid, job, idCard);
         }
 
-        private bool TryFindJobProtoFromIcon(StatusIconPrototype jobIcon, [NotNullWhen(true)] out JobPrototype? job)
+        private bool TryFindJobProtoFromIcon(JobIconPrototype jobIcon, [NotNullWhen(true)] out JobPrototype? job)
         {
             foreach (var jobPrototype in _prototypeManager.EnumeratePrototypes<JobPrototype>())
             {
index e0917f32a84426a4586525e7bfe59fdae5a685d9..dc1bb1124de29d6cda4d9fc91e3d254132aa2259 100644 (file)
@@ -323,8 +323,7 @@ public sealed class SuitSensorSystem : EntitySystem
                 userName = card.Comp.FullName;
             if (card.Comp.JobTitle != null)
                 userJob = card.Comp.JobTitle;
-            if (card.Comp.JobIcon != null)
-                userJobIcon = card.Comp.JobIcon;
+            userJobIcon = card.Comp.JobIcon;
 
             foreach (var department in card.Comp.JobDepartments)
                 userJobDepartments.Add(Loc.GetString(department));
index a099cd26d24553d5ea636748340c61586ceb5a88..9879a02dbcd5331b759ec74bcc323e67484cf486 100644 (file)
@@ -2,7 +2,7 @@ using Content.Shared.Access.Systems;
 using Content.Shared.PDA;
 using Content.Shared.StatusIcon;
 using Robust.Shared.GameStates;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+using Robust.Shared.Prototypes;
 
 namespace Content.Shared.Access.Components;
 
@@ -11,34 +11,34 @@ namespace Content.Shared.Access.Components;
 [Access(typeof(SharedIdCardSystem), typeof(SharedPdaSystem), typeof(SharedAgentIdCardSystem), Other = AccessPermissions.ReadWrite)]
 public sealed partial class IdCardComponent : Component
 {
-    [DataField("fullName"), ViewVariables(VVAccess.ReadWrite)]
+    [DataField]
     [AutoNetworkedField]
     // FIXME Friends
     public string? FullName;
 
-    [DataField("jobTitle")]
+    [DataField]
     [AutoNetworkedField]
-    [Access(typeof(SharedIdCardSystem), typeof(SharedPdaSystem), typeof(SharedAgentIdCardSystem), Other = AccessPermissions.ReadWrite), ViewVariables(VVAccess.ReadWrite)]
+    [Access(typeof(SharedIdCardSystem), typeof(SharedPdaSystem), typeof(SharedAgentIdCardSystem), Other = AccessPermissions.ReadWrite)]
     public string? JobTitle;
 
     /// <summary>
     /// The state of the job icon rsi.
     /// </summary>
-    [DataField("jobIcon", customTypeSerializer: typeof(PrototypeIdSerializer<StatusIconPrototype>))]
+    [DataField]
     [AutoNetworkedField]
-    public string JobIcon = "JobIconUnknown";
+    public ProtoId<JobIconPrototype> JobIcon = "JobIconUnknown";
 
     /// <summary>
     /// The unlocalized names of the departments associated with the job
     /// </summary>
-    [DataField("jobDepartments")]
+    [DataField]
     [AutoNetworkedField]
     public List<LocId> JobDepartments = new();
 
     /// <summary>
     /// Determines if accesses from this card should be logged by <see cref="AccessReaderComponent"/>
     /// </summary>
-    [DataField, ViewVariables(VVAccess.ReadWrite)]
+    [DataField]
     public bool BypassLogging;
 
     [DataField]
index 91aa626fe3986d5cae09d485f7f70686ce642b75..aefd413de8bd411689f38a944969b22d0e87ab7b 100644 (file)
@@ -25,14 +25,12 @@ namespace Content.Shared.Access.Systems
     [Serializable, NetSerializable]
     public sealed class AgentIDCardBoundUserInterfaceState : BoundUserInterfaceState
     {
-        public readonly HashSet<ProtoId<StatusIconPrototype>> Icons;
         public string CurrentName { get; }
         public string CurrentJob { get; }
         public string CurrentJobIconId { get; }
 
-        public AgentIDCardBoundUserInterfaceState(string currentName, string currentJob, string currentJobIconId, HashSet<ProtoId<StatusIconPrototype>> icons)
+        public AgentIDCardBoundUserInterfaceState(string currentName, string currentJob, string currentJobIconId)
         {
-            Icons = icons;
             CurrentName = currentName;
             CurrentJob = currentJob;
             CurrentJobIconId = currentJobIconId;
@@ -64,9 +62,9 @@ namespace Content.Shared.Access.Systems
     [Serializable, NetSerializable]
     public sealed class AgentIDCardJobIconChangedMessage : BoundUserInterfaceMessage
     {
-        public ProtoId<StatusIconPrototype> JobIconId { get; }
+        public ProtoId<JobIconPrototype> JobIconId { get; }
 
-        public AgentIDCardJobIconChangedMessage(ProtoId<StatusIconPrototype> jobIconId)
+        public AgentIDCardJobIconChangedMessage(ProtoId<JobIconPrototype> jobIconId)
         {
             JobIconId = jobIconId;
         }
index bfde70f5041cc5195899a410849be94f67dd11c5..762c146f36fa0345d570a4e0598f14b7228f4ded 100644 (file)
@@ -114,7 +114,7 @@ public abstract class SharedIdCardSystem : EntitySystem
         return true;
     }
 
-    public bool TryChangeJobIcon(EntityUid uid, StatusIconPrototype jobIcon, IdCardComponent? id = null, EntityUid? player = null)
+    public bool TryChangeJobIcon(EntityUid uid, JobIconPrototype jobIcon, IdCardComponent? id = null, EntityUid? player = null)
     {
         if (!Resolve(uid, ref id))
         {
index f8205568f10169b1f2722027e634c78eead28714..a99840e1ae6d33e26faa455310fc26b97919ba4d 100644 (file)
@@ -66,7 +66,7 @@ namespace Content.Shared.Damage
         public List<ProtoId<DamageTypePrototype>> RadiationDamageTypeIDs = new() { "Radiation" };
 
         [DataField]
-        public Dictionary<MobState, ProtoId<StatusIconPrototype>> HealthIcons = new()
+        public Dictionary<MobState, ProtoId<HealthIconPrototype>> HealthIcons = new()
         {
             { MobState.Alive, "HealthIconFine" },
             { MobState.Critical, "HealthIconCritical" },
@@ -74,7 +74,7 @@ namespace Content.Shared.Damage
         };
 
         [DataField]
-        public ProtoId<StatusIconPrototype> RottingIcon = "HealthIconRotting";
+        public ProtoId<HealthIconPrototype> RottingIcon = "HealthIconRotting";
 
         [DataField]
         public FixedPoint2? HealthBarThreshold;
index 235862ed02dc789ee451ffc36f9cc0376c6be919..77f5497973fa6c400def4ff196a9cf3dbf6dcf67 100644 (file)
@@ -12,5 +12,5 @@ namespace Content.Shared.Mindshield.Components;
 public sealed partial class MindShieldComponent : Component
 {
     [DataField, ViewVariables(VVAccess.ReadWrite)]
-    public ProtoId<StatusIconPrototype> MindShieldStatusIcon = "MindShieldIcon";
+    public ProtoId<SecurityIconPrototype> MindShieldStatusIcon = "MindShieldIcon";
 }
index d19f0ae3e9d670d4c3e2d4a16429a775f74e9521..80416b8f710484bf2e2d8a60ff28567309cbdd24 100644 (file)
@@ -17,6 +17,6 @@ public sealed partial class NukeOperativeComponent : Component
     /// <summary>
     ///
     /// </summary>
-    [DataField("syndStatusIcon", customTypeSerializer: typeof(PrototypeIdSerializer<StatusIconPrototype>))]
+    [DataField("syndStatusIcon", customTypeSerializer: typeof(PrototypeIdSerializer<FactionIconPrototype>))]
     public string SyndStatusIcon = "SyndicateFaction";
 }
index bff15f06ff9c7dd3d222938e129f36e3d9ebf291..6196669c19019ee9093354d7087e09001296da67 100644 (file)
@@ -24,18 +24,18 @@ public sealed class HungerSystem : EntitySystem
     [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!;
     [Dependency] private readonly SharedJetpackSystem _jetpack = default!;
 
-    [ValidatePrototypeId<StatusIconPrototype>]
+    [ValidatePrototypeId<SatiationIconPrototype>]
     private const string HungerIconOverfedId = "HungerIconOverfed";
 
-    [ValidatePrototypeId<StatusIconPrototype>]
+    [ValidatePrototypeId<SatiationIconPrototype>]
     private const string HungerIconPeckishId = "HungerIconPeckish";
 
-    [ValidatePrototypeId<StatusIconPrototype>]
+    [ValidatePrototypeId<SatiationIconPrototype>]
     private const string HungerIconStarvingId = "HungerIconStarving";
 
-    private StatusIconPrototype? _hungerIconOverfed;
-    private StatusIconPrototype? _hungerIconPeckish;
-    private StatusIconPrototype? _hungerIconStarving;
+    private SatiationIconPrototype? _hungerIconOverfed;
+    private SatiationIconPrototype? _hungerIconPeckish;
+    private SatiationIconPrototype? _hungerIconStarving;
 
     public override void Initialize()
     {
@@ -216,7 +216,7 @@ public sealed class HungerSystem : EntitySystem
         }
     }
 
-    public bool TryGetStatusIconPrototype(HungerComponent component, [NotNullWhen(true)] out StatusIconPrototype? prototype)
+    public bool TryGetStatusIconPrototype(HungerComponent component, [NotNullWhen(true)] out SatiationIconPrototype? prototype)
     {
         switch (component.CurrentThreshold)
         {
index 205d8d6cde323d52bb7e4959afd6182aba51e54d..aa704354ba982f53270f0d3b862b71ae7cbc546f 100644 (file)
@@ -22,18 +22,18 @@ public sealed class ThirstSystem : EntitySystem
     [Dependency] private readonly MovementSpeedModifierSystem _movement = default!;
     [Dependency] private readonly SharedJetpackSystem _jetpack = default!;
 
-    [ValidatePrototypeId<StatusIconPrototype>]
+    [ValidatePrototypeId<SatiationIconPrototype>]
     private const string ThirstIconOverhydratedId = "ThirstIconOverhydrated";
 
-    [ValidatePrototypeId<StatusIconPrototype>]
+    [ValidatePrototypeId<SatiationIconPrototype>]
     private const string ThirstIconThirstyId = "ThirstIconThirsty";
 
-    [ValidatePrototypeId<StatusIconPrototype>]
+    [ValidatePrototypeId<SatiationIconPrototype>]
     private const string ThirstIconParchedId = "ThirstIconParched";
 
-    private StatusIconPrototype? _thirstIconOverhydrated = null;
-    private StatusIconPrototype? _thirstIconThirsty = null;
-    private StatusIconPrototype? _thirstIconParched = null;
+    private SatiationIconPrototype? _thirstIconOverhydrated = null;
+    private SatiationIconPrototype? _thirstIconThirsty = null;
+    private SatiationIconPrototype? _thirstIconParched = null;
 
     public override void Initialize()
     {
@@ -128,7 +128,7 @@ public sealed class ThirstSystem : EntitySystem
         }
     }
 
-    public bool TryGetStatusIconPrototype(ThirstComponent component, out StatusIconPrototype? prototype)
+    public bool TryGetStatusIconPrototype(ThirstComponent component, out SatiationIconPrototype? prototype)
     {
         switch (component.CurrentThirstThreshold)
         {
index 4229e27af604baf5e1fddc497f97c1bdae112415..4642c5936a7dcd2b01f5909d37c83d6ca6022783 100644 (file)
@@ -19,5 +19,5 @@ public sealed partial class ShowHealthBarsComponent : Component
     public List<string> DamageContainers = new();
 
     [DataField]
-    public ProtoId<StatusIconPrototype>? HealthStatusIcon = "HealthIconFine";
+    public ProtoId<HealthIconPrototype>? HealthStatusIcon = "HealthIconFine";
 }
index ef2bad65e0dec2d3736b568d3fb3388f1a2bc6d3..12589850e660676a997f02214b55e8def50edbf3 100644 (file)
@@ -15,7 +15,7 @@ public sealed partial class HeadRevolutionaryComponent : Component
     /// The status icon corresponding to the head revolutionary.
     /// </summary>
     [DataField, ViewVariables(VVAccess.ReadWrite)]
-    public ProtoId<StatusIconPrototype> StatusIcon { get; set; } = "HeadRevolutionaryFaction";
+    public ProtoId<FactionIconPrototype> StatusIcon { get; set; } = "HeadRevolutionaryFaction";
 
     /// <summary>
     /// How long the stun will last after the user is converted.
index 1f6b45ddea19d2a2fe8c8f2b0e1e63c19aa4d7fe..513e8897bdcb872a3c2993df9bdd7483594e58f7 100644 (file)
@@ -16,7 +16,7 @@ public sealed partial class RevolutionaryComponent : Component
     /// The status icon prototype displayed for revolutionaries
     /// </summary>
     [DataField, ViewVariables(VVAccess.ReadWrite)]
-    public ProtoId<StatusIconPrototype> StatusIcon { get; set; } = "RevolutionaryFaction";
+    public ProtoId<FactionIconPrototype> StatusIcon { get; set; } = "RevolutionaryFaction";
 
     /// <summary>
     /// Sound that plays when you are chosen as Rev. (Placeholder until I find something cool I guess)
index 71dba7449d3e9a95a248b0cc464dc6035c2b3aa2..e7156b34c3bdcff1dd54c02d75bb278fd9efd9a5 100644 (file)
@@ -99,7 +99,7 @@ namespace Content.Shared.Roles
         public string? JobEntity = null;
 
         [DataField]
-        public ProtoId<StatusIconPrototype> Icon { get; private set; } = "JobIconUnknown";
+        public ProtoId<JobIconPrototype> Icon { get; private set; } = "JobIconUnknown";
 
         [DataField("special", serverOnly: true)]
         public JobSpecial[] Special { get; private set; } = Array.Empty<JobSpecial>();
index ee67e3296f68eea241a2a989f6cfd81609e4484d..634dfc397b3a13eaf42c15f9ebdc078323fe19fd 100644 (file)
@@ -18,5 +18,5 @@ public sealed partial class SSDIndicatorComponent : Component
 
     [ViewVariables(VVAccess.ReadWrite)]
     [DataField]
-    public ProtoId<StatusIconPrototype> Icon = "SSDIcon";
+    public ProtoId<SsdIconPrototype> Icon = "SSDIcon";
 }
index 25fab3f1350f053191d2f761c24e2c04d5cf5c44..aa6bd6ad5bd0617c35094b03b8d58c3dad17bbc2 100644 (file)
@@ -11,5 +11,5 @@ public sealed partial class CriminalRecordComponent : Component
     ///     The icon that should be displayed based on the criminal status of the entity.
     /// </summary>
     [DataField, AutoNetworkedField]
-    public ProtoId<StatusIconPrototype> StatusIcon = "SecurityIconWanted";
+    public ProtoId<SecurityIconPrototype> StatusIcon = "SecurityIconWanted";
 }
index 29a1b60114f2635e7bd22c0be2d64b2dab430872..af3cfb133b27d3653bfdf27f7ec0c58b6046f98f 100644 (file)
@@ -73,7 +73,6 @@ public partial class StatusIconData : IComparable<StatusIconData>
     /// </summary>
     [DataField]
     public bool IsShaded = false;
-
     public int CompareTo(StatusIconData? other)
     {
         return Priority.CompareTo(other?.Priority ?? int.MaxValue);
@@ -83,11 +82,21 @@ public partial class StatusIconData : IComparable<StatusIconData>
 /// <summary>
 /// <see cref="StatusIconData"/> but in new convenient prototype form!
 /// </summary>
-[Prototype("statusIcon")]
-public sealed partial class StatusIconPrototype : StatusIconData, IPrototype, IInheritingPrototype
+public abstract partial class StatusIconPrototype : StatusIconData, IPrototype
+{
+    /// <inheritdoc/>
+    [IdDataField]
+    public string ID { get; private set; } = default!;
+}
+
+/// <summary>
+/// StatusIcons for showing jobs on the sec HUD
+/// </summary>
+[Prototype]
+public sealed partial class JobIconPrototype : StatusIconPrototype, IInheritingPrototype
 {
     /// <inheritdoc />
-    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<StatusIconPrototype>))]
+    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<JobIconPrototype>))]
     public string[]? Parents { get; }
 
     /// <inheritdoc />
@@ -95,9 +104,116 @@ public sealed partial class StatusIconPrototype : StatusIconData, IPrototype, II
     [AbstractDataField]
     public bool Abstract { get; }
 
-    /// <inheritdoc/>
-    [IdDataField]
-    public string ID { get; private set; } = default!;
+    /// <summary>
+    /// Name of the icon used for menu tooltips.
+    /// </summary>
+    [DataField]
+    public string JobName { get; private set; } = string.Empty;
+
+    [ViewVariables(VVAccess.ReadOnly)]
+    public string LocalizedJobName => Loc.GetString(JobName);
+
+    /// <summary>
+    /// Should the agent ID or ID card console be able to use this job icon?
+    /// </summary>
+    [DataField]
+    public bool AllowSelection = true;
+}
+
+/// <summary>
+/// StatusIcons for the med HUD
+/// </summary>
+[Prototype]
+public sealed partial class HealthIconPrototype : StatusIconPrototype, IInheritingPrototype
+{
+    /// <inheritdoc />
+    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<HealthIconPrototype>))]
+    public string[]? Parents { get; }
+
+    /// <inheritdoc />
+    [NeverPushInheritance]
+    [AbstractDataField]
+    public bool Abstract { get; }
+}
+
+/// <summary>
+/// StatusIcons for the beer goggles and fried onion goggles
+/// </summary>
+[Prototype]
+public sealed partial class SatiationIconPrototype : StatusIconPrototype, IInheritingPrototype
+{
+    /// <inheritdoc />
+    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<SatiationIconPrototype>))]
+    public string[]? Parents { get; }
+
+    /// <inheritdoc />
+    [NeverPushInheritance]
+    [AbstractDataField]
+    public bool Abstract { get; }
+}
+
+/// <summary>
+/// StatusIcons for showing the wanted status on the sec HUD
+/// </summary>
+[Prototype]
+public sealed partial class SecurityIconPrototype : StatusIconPrototype, IInheritingPrototype
+{
+    /// <inheritdoc />
+    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<SecurityIconPrototype>))]
+    public string[]? Parents { get; }
+
+    /// <inheritdoc />
+    [NeverPushInheritance]
+    [AbstractDataField]
+    public bool Abstract { get; }
+}
+
+/// <summary>
+/// StatusIcons for faction membership
+/// </summary>
+[Prototype]
+public sealed partial class FactionIconPrototype : StatusIconPrototype, IInheritingPrototype
+{
+    /// <inheritdoc />
+    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<FactionIconPrototype>))]
+    public string[]? Parents { get; }
+
+    /// <inheritdoc />
+    [NeverPushInheritance]
+    [AbstractDataField]
+    public bool Abstract { get; }
+}
+
+/// <summary>
+/// StatusIcons for debugging purposes
+/// </summary>
+[Prototype]
+public sealed partial class DebugIconPrototype : StatusIconPrototype, IInheritingPrototype
+{
+    /// <inheritdoc />
+    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<DebugIconPrototype>))]
+    public string[]? Parents { get; }
+
+    /// <inheritdoc />
+    [NeverPushInheritance]
+    [AbstractDataField]
+    public bool Abstract { get; }
+}
+
+/// <summary>
+/// StatusIcons for the SSD indicator
+/// </summary>
+[Prototype]
+public sealed partial class SsdIconPrototype : StatusIconPrototype, IInheritingPrototype
+{
+    /// <inheritdoc />
+    [ParentDataField(typeof(AbstractPrototypeIdArraySerializer<SsdIconPrototype>))]
+    public string[]? Parents { get; }
+
+    /// <inheritdoc />
+    [NeverPushInheritance]
+    [AbstractDataField]
+    public bool Abstract { get; }
 }
 
 [Serializable, NetSerializable]
index 3149de63bddf4c4c821335bc2a893386245af65c..b69d1515f26d216fc76010eae7d7476759b5080d 100644 (file)
@@ -8,5 +8,5 @@ namespace Content.Shared.Zombies;
 public sealed partial class InitialInfectedComponent : Component
 {
     [DataField]
-    public ProtoId<StatusIconPrototype> StatusIcon = "InitialInfectedFaction";
+    public ProtoId<FactionIconPrototype> StatusIcon = "InitialInfectedFaction";
 }
index f510d65d6dcd4bb7cfd6c8bd7b3f4366a0e11fd2..94e1e5afec4425fc406e700cabc73630d2b17321 100644 (file)
@@ -89,7 +89,7 @@ public sealed partial class ZombieComponent : Component
     public TimeSpan NextTick;
 
     [DataField("zombieStatusIcon")]
-    public ProtoId<StatusIconPrototype> StatusIcon { get; set; } = "ZombieFaction";
+    public ProtoId<FactionIconPrototype> StatusIcon { get; set; } = "ZombieFaction";
 
     /// <summary>
     /// Healing each second
index 1b89be01330da4cb60383ffa0bddf2e8987a9fce..33e501cb69087522d50e532df472975cbb7e22e0 100644 (file)
@@ -47,6 +47,18 @@ job-name-boxer = Boxer
 job-name-zookeeper = Zookeeper
 job-name-visitor = Visitor
 
+# unused jobs
+# these are required for the agent ID job icon tooltips
+# I am keeping them for roleplaying opportunities
+job-name-geneticist = Geneticist
+job-name-no-id = No ID
+job-name-prisoner = Prisoner
+job-name-roboticist = Roboticist
+job-name-syndicate = Syndicate
+job-name-unknown = Unknown
+job-name-virologist = Virologist
+job-name-zombie = Zombie
+
 # Role timers - Make these alphabetical or I cut you
 JobAtmosphericTechnician = Atmospheric Technician
 JobBartender = Bartender
index ff207a5a2a12614e4aa0b67ce769467241e1673f..39a0a49113202c9c48026a2ecdf0a0b1e835b563 100644 (file)
     - state: default
     - state: idpassenger
   - type: AgentIDCard
-    icons:
-    # TODO figure out a better way of doing this.
-    # Probably by adding a bool or icon-category data-field to the icon prototype?
-    - JobIconDetective
-    - JobIconQuarterMaster
-    - JobIconBotanist
-    - JobIconBoxer
-    - JobIconAtmosphericTechnician
-    - JobIconNanotrasen
-    - JobIconPrisoner
-    - JobIconJanitor
-    - JobIconChemist
-    - JobIconStationEngineer
-    - JobIconSecurityOfficer
-    - JobIconChiefMedicalOfficer
-    - JobIconRoboticist
-    - JobIconChaplain
-    - JobIconLawyer
-    - JobIconUnknown
-    - JobIconLibrarian
-    - JobIconCargoTechnician
-    - JobIconScientist
-    - JobIconResearchAssistant
-    - JobIconGeneticist
-    - JobIconClown
-    - JobIconCaptain
-    - JobIconHeadOfPersonnel
-    - JobIconVirologist
-    - JobIconShaftMiner
-    - JobIconPassenger
-    - JobIconChiefEngineer
-    - JobIconBartender
-    - JobIconHeadOfSecurity
-    - JobIconMedicalDoctor
-    - JobIconParamedic
-    - JobIconChef
-    - JobIconWarden
-    - JobIconResearchDirector
-    - JobIconMime
-    - JobIconMusician
-    - JobIconReporter
-    - JobIconPsychologist
-    - JobIconMedicalIntern
-    - JobIconTechnicalAssistant
-    - JobIconServiceWorker
-    - JobIconSecurityCadet
-    - JobIconZookeeper
-    - JobIconVisitor
   - type: ActivatableUI
     key: enum.AgentIDCardUiKey.Key
     inHandsOnly: true
index 073b03a2aeb3ae10e53b784a9099a4b226460241..de1b6684809dec1286c97333bd0881bc3843ff9f 100644 (file)
@@ -1,32 +1,32 @@
-- type: statusIcon
+- type: healthIcon
   id: HealthIcon
   abstract: true
   priority: 3
   locationPreference: Left
   isShaded: true
 
-- type: statusIcon
+- type: healthIcon
   parent: HealthIcon
   id: HealthIconFine
   icon:
     sprite: /Textures/Interface/Misc/health_icons.rsi
     state: Fine
 
-- type: statusIcon
+- type: healthIcon
   id: HealthIconCritical
   parent: HealthIcon
   icon:
     sprite: /Textures/Interface/Misc/health_icons.rsi
     state: Critical
 
-- type: statusIcon
+- type: healthIcon
   id: HealthIconDead
   parent: HealthIcon
   icon:
     sprite: /Textures/Interface/Misc/health_icons.rsi
     state: Dead
 
-- type: statusIcon
+- type: healthIcon
   id: HealthIconRotting
   parent: HealthIcon
   icon:
similarity index 84%
rename from Resources/Prototypes/StatusIcon/StatusEffects/hunger.yml
rename to Resources/Prototypes/StatusIcon/StatusEffects/satiation.yml
index 9af246e06ee6eca7209be42db6c2d390eda2a303..749d1f88f187c6313b0608e851f877ad5e365aba 100644 (file)
@@ -1,26 +1,26 @@
 #Hunger
-- type: statusIcon
+- type: satiationIcon
   id: HungerIcon
   abstract: true
   priority: 5
   locationPreference: Right
   isShaded: true
 
-- type: statusIcon
+- type: satiationIcon
   id: HungerIconOverfed
   parent: HungerIcon
   icon:
     sprite: /Textures/Interface/Misc/food_icons.rsi
     state: overfed
 
-- type: statusIcon
+- type: satiationIcon
   id: HungerIconPeckish
   parent: HungerIcon
   icon:
     sprite: /Textures/Interface/Misc/food_icons.rsi
     state: peckish
 
-- type: statusIcon
+- type: satiationIcon
   id: HungerIconStarving
   parent: HungerIcon
   icon:
     state: starving
 
 #Thirst
-- type: statusIcon
+- type: satiationIcon
   id: ThirstIcon
   abstract: true
   priority: 5
   locationPreference: Left
   isShaded: true
 
-- type: statusIcon
+- type: satiationIcon
   id: ThirstIconOverhydrated
   parent: ThirstIcon
   icon:
     sprite: /Textures/Interface/Misc/food_icons.rsi
     state: overhydrated
 
-- type: statusIcon
+- type: satiationIcon
   id: ThirstIconThirsty
   parent: ThirstIcon
   icon:
     sprite: /Textures/Interface/Misc/food_icons.rsi
     state: thirsty
 
-- type: statusIcon
+- type: satiationIcon
   id: ThirstIconParched
   parent: ThirstIcon
   icon:
index 70253cc6b192cb0a22746916607b00f60865597f..1d04a5349ef87d9015a32274335a22818ae81c77 100644 (file)
@@ -1,4 +1,4 @@
-- type: statusIcon
+- type: ssdIcon
   id: SSDIcon
   icon:
     sprite: /Textures/Effects/ssd.rsi
index 2011c6ceeae33533f00fbbdc0065b6dad704deb9..24981746e7e2dc25332763488c5defbf32d16be1 100644 (file)
@@ -1,17 +1,17 @@
-- type: statusIcon
+- type: debugIcon
   id: DebugStatus
   icon:
     sprite: /Textures/Interface/Misc/research_disciplines.rsi
     state: civilianservices
 
-- type: statusIcon
+- type: debugIcon
   id: DebugStatus2
   priority: 1
   icon:
     sprite: /Textures/Interface/Misc/research_disciplines.rsi
     state: arsenal
 
-- type: statusIcon
+- type: debugIcon
   id: DebugStatus3
   priority: 5
   icon:
similarity index 77%
rename from Resources/Prototypes/StatusIcon/antag.yml
rename to Resources/Prototypes/StatusIcon/faction.yml
index c22a13a600b98a4f279b6e8b66a278943ffbf95a..0b3bbe491c7dc1a693545d8f9c0db4f4c8efa548 100644 (file)
@@ -1,4 +1,4 @@
-- type: statusIcon
+- type: factionIcon
   id: ZombieFaction
   priority: 11
   showTo:
@@ -10,7 +10,7 @@
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Zombie
 
-- type: statusIcon
+- type: factionIcon
   id: InitialInfectedFaction
   priority: 11
   showTo:
@@ -21,7 +21,7 @@
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: InitialInfected
 
-- type: statusIcon
+- type: factionIcon
   id: RevolutionaryFaction
   isShaded: true
   priority: 11
@@ -33,7 +33,7 @@
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Revolutionary
 
-- type: statusIcon
+- type: factionIcon
   id: HeadRevolutionaryFaction
   isShaded: true
   priority: 11
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: HeadRevolutionary
 
-- type: statusIcon
-  id: MindShieldIcon
-  priority: 2
-  locationPreference: Right
-  layer: Mod
-  isShaded: true
-  icon:
-    sprite: /Textures/Interface/Misc/job_icons.rsi
-    state: MindShield
-
-- type: statusIcon
+- type: factionIcon
   id: SyndicateFaction
   priority: 0
   locationPreference: Left
index 6275f0bc07ef7ac1f603a557e5dfc05b34b8c0bf..eb9896fc480613b15ff48e9dea5ca55b465b1be4 100644 (file)
-- type: statusIcon
+- type: jobIcon
   id: JobIcon
   abstract: true
   priority: 1
   locationPreference: Right
   isShaded: true
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconDetective
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Detective
+  jobName: job-name-detective
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconQuarterMaster
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: QuarterMaster
+  jobName: job-name-qm
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconBorg
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Borg
+  jobName: job-name-borg
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconBotanist
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Botanist
+  jobName: job-name-botanist
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconBoxer
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Boxer
+  jobName: job-name-boxer
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconAtmosphericTechnician
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: AtmosphericTechnician
+  jobName: job-name-atmostech
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconNanotrasen
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Nanotrasen
+  jobName: job-name-centcomoff
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconPrisoner
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Prisoner
+  jobName: job-name-prisoner
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconJanitor
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Janitor
+  jobName: job-name-janitor
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconChemist
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Chemist
+  jobName: job-name-chemist
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconStationEngineer
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: StationEngineer
+  jobName: job-name-engineer
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconSecurityOfficer
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: SecurityOfficer
+  jobName: job-name-security
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconNoId
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: NoId
+  jobName: job-name-no-id
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconChiefMedicalOfficer
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: ChiefMedicalOfficer
+  jobName: job-name-cmo
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconRoboticist
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Roboticist
+  jobName: job-name-roboticist
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconChaplain
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Chaplain
+  jobName: job-name-chaplain
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconLawyer
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Lawyer
+  jobName: job-name-lawyer
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconUnknown
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Unknown
+  jobName: job-name-unknown
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconLibrarian
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Librarian
+  jobName: job-name-librarian
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconCargoTechnician
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: CargoTechnician
+  jobName: job-name-cargotech
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconScientist
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Scientist
+  jobName: job-name-scientist
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconResearchAssistant
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: ResearchAssistant
+  jobName: job-name-research-assistant
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconGeneticist
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Geneticist
+  jobName: job-name-geneticist
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconClown
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Clown
+  jobName: job-name-clown
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconCaptain
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Captain
+  jobName: job-name-captain
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconHeadOfPersonnel
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: HeadOfPersonnel
+  jobName: job-name-hop
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconVirologist
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Virologist
+  jobName: job-name-virologist
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconShaftMiner
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: ShaftMiner
+  jobName: job-name-salvagespec
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconPassenger
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Passenger
+  jobName: job-name-passenger
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconChiefEngineer
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: ChiefEngineer
+  jobName: job-name-ce
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconBartender
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Bartender
+  jobName: job-name-bartender
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconHeadOfSecurity
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: HeadOfSecurity
+  jobName: job-name-hos
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconBrigmedic
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Brigmedic
+  jobName: job-name-brigmedic
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconMedicalDoctor
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: MedicalDoctor
+  jobName: job-name-doctor
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconParamedic
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Paramedic
+  jobName: job-name-paramedic
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconChef
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Chef
+  jobName: job-name-chef
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconWarden
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Warden
+  jobName: job-name-warden
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconResearchDirector
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: ResearchDirector
+  jobName: job-name-rd
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconMime
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Mime
+  jobName: job-name-mime
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconMusician
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Musician
+  jobName: job-name-musician
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconReporter
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Reporter
+  jobName: job-name-reporter
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconPsychologist
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Psychologist
+  jobName: job-name-psychologist
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconMedicalIntern
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: MedicalIntern
+  jobName: job-name-intern
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconTechnicalAssistant
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: TechnicalAssistant
+  jobName: job-name-technical-assistant
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconServiceWorker
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: ServiceWorker
+  jobName: job-name-serviceworker
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconSecurityCadet
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: SecurityCadet
+  jobName: job-name-cadet
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconZombie # This is a perfectly legitimate profession to pursue
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Zombie
+  jobName: job-name-zombie
 
-- type: statusIcon
+- type: jobIcon
+  parent: JobIcon
+  id: JobIconSyndicate # Just in case you want to make it official which side you are on
+  icon:
+    sprite: /Textures/Interface/Misc/job_icons.rsi
+    state: Syndicate
+  jobName: job-name-syndicate
+
+- type: jobIcon
   parent: JobIcon
   id: JobIconZookeeper
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Zookeeper
+  jobName: job-name-zookeeper
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconSeniorPhysician
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: SeniorPhysician
+  allowSelection: false
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconSeniorOfficer
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: SeniorOfficer
+  allowSelection: false
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconSeniorEngineer
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: SeniorEngineer
+  allowSelection: false
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconSeniorResearcher
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: SeniorResearcher
+  allowSelection: false
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconVisitor
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Visitor
+  jobName: job-name-visitor
 
-- type: statusIcon
+- type: jobIcon
   parent: JobIcon
   id: JobIconAdmin
   icon:
     sprite: /Textures/Interface/Misc/job_icons.rsi
     state: Admin
+  allowSelection: false
index 00119fb44d28a9d9d2a67404138da1b88c6257fb..430e9c4f98e91c98824e52ce235afa3abcbb0748 100644 (file)
@@ -1,4 +1,4 @@
-- type: statusIcon
+- type: securityIcon
   id: SecurityIcon
   abstract: true
   priority: 3
@@ -6,37 +6,47 @@
   locationPreference: Right
   isShaded: true
 
-- type: statusIcon
+- type: securityIcon
   parent: SecurityIcon
   id: SecurityIconDischarged
   icon:
     sprite: /Textures/Interface/Misc/security_icons.rsi
     state: hud_discharged
 
-- type: statusIcon
+- type: securityIcon
   parent: SecurityIcon
   id: SecurityIconIncarcerated
   icon:
     sprite: /Textures/Interface/Misc/security_icons.rsi
     state: hud_incarcerated
 
-- type: statusIcon
+- type: securityIcon
   parent: SecurityIcon
   id: SecurityIconParoled
   icon:
     sprite: /Textures/Interface/Misc/security_icons.rsi
     state: hud_paroled
 
-- type: statusIcon
+- type: securityIcon
   parent: SecurityIcon
   id: SecurityIconSuspected
   icon:
     sprite: /Textures/Interface/Misc/security_icons.rsi
     state: hud_suspected
 
-- type: statusIcon
+- type: securityIcon
   parent: SecurityIcon
   id: SecurityIconWanted
   icon:
     sprite: /Textures/Interface/Misc/security_icons.rsi
     state: hud_wanted
+
+- type: securityIcon
+  id: MindShieldIcon
+  priority: 2
+  locationPreference: Right
+  layer: Mod
+  isShaded: true
+  icon:
+    sprite: /Textures/Interface/Misc/job_icons.rsi
+    state: MindShield