diff --git a/Content.Server/Chemistry/ReagentEffectConditions/JobCondition.cs b/Content.Server/Chemistry/ReagentEffectConditions/JobCondition.cs new file mode 100644 index 0000000000..0ede690049 --- /dev/null +++ b/Content.Server/Chemistry/ReagentEffectConditions/JobCondition.cs @@ -0,0 +1,49 @@ +using System.Linq; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Localizations; +using Robust.Shared.Prototypes; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; +using Content.Shared.Roles; +using Content.Shared.Roles.Jobs; +using Content.Shared.Station; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.IoC; + +namespace Content.Server.Chemistry.ReagentEffectConditions +{ + public sealed partial class JobCondition : ReagentEffectCondition + { + [DataField(required: true)] public List> Job; + + public override bool Condition(ReagentEffectArgs args) + { + args.EntityManager.TryGetComponent(args.SolutionEntity, out var mindContainer); + if (mindContainer != null && mindContainer.Mind != null) + { + var prototypeManager = IoCManager.Resolve(); + if (args.EntityManager.TryGetComponent(mindContainer?.Mind, out var comp) && prototypeManager.TryIndex(comp.Prototype, out var prototype)) + { + foreach (var jobId in Job) + { + if (prototype.ID == jobId) + { + return true; + } + } + } + } + + return false; + } + + public override string GuidebookExplanation(IPrototypeManager prototype) + { + var localizedNames = Job.Select(jobId => prototype.Index(jobId).LocalizedName).ToList(); + return Loc.GetString("reagent-effect-condition-guidebook-job-condition", ("job", ContentLocalizationManager.FormatListToOr(localizedNames))); + } + } +} + diff --git a/Content.Shared/Localizations/ContentLocalizationManager.cs b/Content.Shared/Localizations/ContentLocalizationManager.cs index 7d40182f6c..ad8890ae0f 100644 --- a/Content.Shared/Localizations/ContentLocalizationManager.cs +++ b/Content.Shared/Localizations/ContentLocalizationManager.cs @@ -1,4 +1,4 @@ -using System.Globalization; +using System.Globalization; using System.Linq; using System.Text.RegularExpressions; using Robust.Shared.Utility; @@ -119,6 +119,20 @@ namespace Content.Shared.Localizations }; } + /// + /// Formats a list as per english grammar rules, but uses or instead of and. + /// + public static string FormatListToOr(List list) + { + return list.Count switch + { + <= 0 => string.Empty, + 1 => list[0], + 2 => $"{list[0]} or {list[1]}", + _ => $"{string.Join(" or ", list)}" + }; + } + /// /// Formats a direction struct as a human-readable string. /// diff --git a/Resources/Locale/en-US/guidebook/chemistry/conditions.ftl b/Resources/Locale/en-US/guidebook/chemistry/conditions.ftl index 6cbfc13a79..95aaf9126d 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/conditions.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/conditions.ftl @@ -28,6 +28,9 @@ reagent-effect-condition-guidebook-reagent-threshold = reagent-effect-condition-guidebook-mob-state-condition = the mob is { $state } +reagent-effect-condition-guidebook-job-condition = + the target's job is { $job } + reagent-effect-condition-guidebook-solution-temperature = the solution's temperature is { $max -> [2147483648] at least {NATURALFIXED($min, 2)}k