using System.Diagnostics.CodeAnalysis; using Content.Shared.Localizations; using Content.Shared.Preferences; using JetBrains.Annotations; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Utility; namespace Content.Shared.Roles; [UsedImplicitly] [Serializable, NetSerializable] public sealed partial class DepartmentTimeRequirement : JobRequirement { /// /// Which department needs the required amount of time. /// [DataField(required: true)] public ProtoId Department; /// /// How long (in seconds) this requirement is. /// [DataField(required: true)] public TimeSpan Time; public override bool Check(IEntityManager entManager, IPrototypeManager protoManager, HumanoidCharacterProfile? profile, IReadOnlyDictionary playTimes, [NotNullWhen(false)] out FormattedMessage? reason) { reason = new FormattedMessage(); var playtime = TimeSpan.Zero; // Check all jobs' departments var department = protoManager.Index(Department); var jobs = department.Roles; string proto; // Check all jobs' playtime foreach (var other in jobs) { // The schema is stored on the Job role but we want to explode if the timer isn't found anyway. proto = protoManager.Index(other).PlayTimeTracker; playTimes.TryGetValue(proto, out var otherTime); playtime += otherTime; } var deptDiffSpan = Time - playtime; var deptDiff = deptDiffSpan.TotalMinutes; var formattedDeptDiff = ContentLocalizationManager.FormatPlaytime(deptDiffSpan); var nameDepartment = "role-timer-department-unknown"; if (protoManager.TryIndex(Department, out var departmentIndexed)) { nameDepartment = departmentIndexed.Name; } if (!Inverted) { if (deptDiff <= 0) return true; reason = FormattedMessage.FromMarkupPermissive(Loc.GetString( "role-timer-department-insufficient", ("time", formattedDeptDiff), ("department", Loc.GetString(nameDepartment)), ("departmentColor", department.Color.ToHex()))); return false; } if (deptDiff <= 0) { reason = FormattedMessage.FromMarkupPermissive(Loc.GetString( "role-timer-department-too-high", ("time", formattedDeptDiff), ("department", Loc.GetString(nameDepartment)), ("departmentColor", department.Color.ToHex()))); return false; } return true; } }