using System.Linq; using Content.Shared.Random.Helpers; using Robust.Shared.Prototypes; namespace Content.Shared.EntityTable.EntitySelectors; /// /// Gets the spawns from one of the child selectors, based on the weight of the children /// public sealed partial class GroupSelector : EntityTableSelector { [DataField(required: true)] public List Children = new(); protected override IEnumerable GetSpawnsImplementation(System.Random rand, IEntityManager entMan, IPrototypeManager proto, EntityTableContext ctx) { var children = new Dictionary(Children.Count); foreach (var child in Children) { // Don't include invalid groups if (!child.CheckConditions(entMan, proto, ctx)) continue; children.Add(child, child.Weight); } if (children.Count == 0) return Array.Empty(); var pick = SharedRandomExtensions.Pick(children, rand); return pick.GetSpawns(rand, entMan, proto, ctx); } protected override IEnumerable<(EntProtoId spawn, double)> ListSpawnsImplementation(IEntityManager entMan, IPrototypeManager proto, EntityTableContext ctx) { var totalWeight = Children.Sum(x => x.Weight); foreach (var child in Children) { var weightMod = child.Weight / totalWeight; foreach (var (ent, prob) in child.ListSpawns(entMan, proto, ctx, weightMod)) { yield return (ent, prob); } } } protected override IEnumerable<(EntProtoId spawn, double)> AverageSpawnsImplementation(IEntityManager entMan, IPrototypeManager proto, EntityTableContext ctx) { var totalWeight = Children.Sum(x => x.Weight); foreach (var child in Children) { var weightMod = child.Weight / totalWeight; foreach (var (ent, prob) in child.AverageSpawns(entMan, proto, ctx, weightMod)) { yield return (ent, prob); } } } }