using Content.Shared._DV.CosmicCult.Components; using Content.Shared.Popups; using Robust.Shared.Random; namespace Content.Server._DV.CosmicCult.Abilities; public sealed class CosmicTransmuteSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; private readonly HashSet _entities = []; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnTransmuteGlyph); SubscribeLocalEvent(OnCheckGlyphConditions); } private void OnCheckGlyphConditions(Entity uid, ref CheckGlyphConditionsEvent args) { var possibleTargets = GatherEntities(uid); if (possibleTargets.Count == 0) { _popup.PopupEntity(Loc.GetString("cult-glyph-conditions-not-met"), uid, args.User); args.Cancel(); return; } } private void OnTransmuteGlyph(Entity uid, ref TryActivateGlyphEvent args) { var ev = new CheckGlyphConditionsEvent(args.User, args.Cultists); RaiseLocalEvent(uid, ref ev); if (ev.Cancelled) { args.Cancel(); return; } var tgtpos = Transform(uid).Coordinates; var possibleTargets = GatherEntities(uid); var target = _random.Pick(possibleTargets); if (!TryComp(target, out var comp)) return; Spawn(comp.TransmutesTo, tgtpos); QueueDel(target); } /// /// Gets all whitelisted entities near a glyph. /// private HashSet GatherEntities(Entity ent) { _entities.Clear(); _lookup.GetEntitiesInRange(Transform(ent).Coordinates, ent.Comp.TransmuteRange, _entities); _entities.RemoveWhere(item => !TryComp(item, out var comp) || comp.RequiredGlyphType != MetaData(ent).EntityPrototype!.ID || HasComp(item)); return _entities; } }