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;
}