using Content.Shared.Physics; using Content.Shared.Tag; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Singularity.Components; [RegisterComponent, NetworkedComponent] public sealed partial class ContainmentFieldGeneratorComponent : Component { private int _powerBuffer; /// /// Store power with a cap. Decrease over time if not being powered from source. /// [DataField] public int PowerBuffer { get => _powerBuffer; set => _powerBuffer = Math.Clamp(value, 0, 25); //have this decrease over time if not hit by a bolt } /// /// The minimum the field generator needs to start generating a connection /// [DataField] public int PowerMinimum = 6; /// /// How much power should this field generator receive from a collision /// [DataField("power")] public int PowerReceived = 3; /// /// How much power should this field generator lose if not powered? /// [DataField] public int PowerLoss = 2; /// /// Used to check if it's received power recently. /// [DataField] public float Accumulator; /// /// How many seconds should the generators wait before losing power? /// [DataField] public float Threshold = 20f; /// /// How many tiles should this field check before giving up? /// [DataField] public float MaxLength = 8F; /// /// What collision should power this generator? /// It really shouldn't be anything but an emitter bolt but it's here for fun. /// [DataField("idTag")] public ProtoId IDTag = "EmitterBolt"; /// /// Which fixture ID should test collision with from the entity that powers the generator? /// Prevents the generator from being powered by fly-by fixtures. /// [DataField] public string SourceFixtureId = "projectile"; /// /// Is the generator toggled on? /// [DataField] public bool Enabled; /// /// Is this generator connected to fields? /// [DataField] public bool IsConnected; /// /// The masks the raycast should not go through /// [DataField] public int CollisionMask = (int) (CollisionGroup.MobMask | CollisionGroup.Impassable | CollisionGroup.MachineMask | CollisionGroup.Opaque); /// /// A collection of connections that the generator has based on direction. /// Stores a list of fields connected between generators in this direction. /// [ViewVariables] // TODO: remove the component and make this a DataField for persistence public Dictionary, List)> Connections = new(); /// /// What fields should this spawn? /// [DataField] public EntProtoId CreatedField = "ContainmentField"; } [Serializable, NetSerializable] public enum ContainmentFieldGeneratorVisuals : byte { PowerLight, FieldLight, OnLight, } [Serializable, NetSerializable] public enum PowerLevelVisuals : byte { NoPower, LowPower, MediumPower, HighPower, } [Serializable, NetSerializable] public enum FieldLevelVisuals : byte { NoLevel, On, OneField, MultipleFields, }