using Content.Shared.Localizations; using Robust.Shared.Prototypes; namespace Content.Shared.EntityEffects.Effects; /// /// Applies the effect of an . /// public sealed partial class NestedEffect : EntityEffectBase { /// /// The effect prototype to use. /// [DataField(required: true)] public ProtoId Proto; private List _conditions = new(); private List _effects = new(); public override string? EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) { var proto = prototype.Index(Proto); if (proto.GuidebookText is {} key) return Loc.GetString(key, ("chance", Probability)); _effects.Clear(); foreach (var effect in proto.Effects) { if (effect.EntityEffectGuidebookText(prototype, entSys) is not {} text) continue; // basically GuidebookReagentEffectDescription but independent of reagents and no linq _conditions.Clear(); if (effect.Conditions is {} conditions) { foreach (var condition in conditions) { _conditions.Add(condition.EntityConditionGuidebookText(prototype)); } } var desc = Loc.GetString("guidebook-nested-effect-description", ("effect", text), ("chance", effect.Probability), ("conditionCount", _conditions.Count), ("conditions", ContentLocalizationManager.FormatList(_conditions))); _effects.Add(desc); } return _effects.Count == 0 ? null : string.Join("\n", _effects); } } /// /// Handles . /// public sealed class NestedEffectSystem : EntityEffectSystem { [Dependency] private readonly SharedEntityEffectsSystem _effects = default!; protected override void Effect(Entity ent, ref EntityEffectEvent args) { _effects.TryApplyEffect(ent, args.Effect.Proto, args.Scale, args.User); } }