using System.Numerics; using Content.Shared.Radiation.Components; using Robust.Shared.Map; using Robust.Shared.Serialization; namespace Content.Shared.Radiation.Systems; /// /// Ray emitted by radiation source towards radiation receiver. /// Contains all information about encountered radiation blockers. /// public struct RadiationRay( MapId mapId, EntityUid sourceUid, Vector2 source, EntityUid destinationUid, Vector2 destination, float rads) { /// /// Map on which source and receiver are placed. /// public MapId MapId = mapId; /// /// Uid of entity with . /// public EntityUid SourceUid = sourceUid; /// /// World coordinates of radiation source. /// public Vector2 Source = source; /// /// Uid of entity with radiation receiver component. /// public EntityUid DestinationUid = destinationUid; /// /// World coordinates of radiation receiver. /// public Vector2 Destination = destination; /// /// How many rads intensity reached radiation receiver. /// public float Rads = rads; /// /// Has rad ray reached destination or lost all intensity after blockers? /// public bool ReachedDestination => Rads > 0; /// /// All blockers visited by gridcast, used for debug overlays. Key is uid of grid. Values are pairs /// of tile indices and floats with updated radiation value. /// /// /// Last tile may have negative value if ray has lost all intensity. /// Grid traversal order isn't guaranteed. /// public Dictionary>? Blockers; } // Variant of RadiationRay that uses NetEntities. [Serializable, NetSerializable] public readonly record struct DebugRadiationRay( MapId MapId, NetEntity SourceUid, Vector2 Source, NetEntity DestinationUid, Vector2 Destination, float Rads, Dictionary> Blockers) { public bool ReachedDestination => Rads > 0; }