#nullable enable using System.Collections.Generic; using System.Linq; using Content.Server.Mobs; using Content.Server.Objectives.Interfaces; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; namespace Content.Server.Objectives { [Prototype("objective")] public class ObjectivePrototype : IPrototype { [ViewVariables] [field: DataField("id", required: true)] public string ID { get; } = default!; [ViewVariables] [field: DataField("parent")] public string? Parent { get; } [ViewVariables] [DataField("issuer")] public string Issuer { get; private set; } = "Unknown"; [ViewVariables] [DataField("prob")] public float Probability { get; private set; } = 0.3f; [ViewVariables] public float Difficulty => _difficultyOverride ?? _conditions.Sum(c => c.Difficulty); [DataField("conditions")] private List _conditions = new(); [DataField("requirements")] private List _requirements = new(); [ViewVariables] public IReadOnlyList Conditions => _conditions; [ViewVariables] [DataField("canBeDuplicate")] public bool CanBeDuplicateAssignment { get; private set; } [ViewVariables(VVAccess.ReadWrite)] [DataField("difficultyOverride")] private float? _difficultyOverride = null; public bool CanBeAssigned(Mind mind) { foreach (var requirement in _requirements) { if (!requirement.CanBeAssigned(mind)) return false; } if (!CanBeDuplicateAssignment) { foreach (var objective in mind.AllObjectives) { if (objective.Prototype.ID == ID) return false; } } return true; } public Objective GetObjective(Mind mind) { return new(this, mind); } } }