Sensor: the pinger's swept set decides each crossing once; allies credit a published ping return inside the bistatic oval

Deletes the stateless interval crossing (_previousRadius, PreviousRadius, Crossing) and the allied-pinger scan over
other ships' Sensors. The pinging Sensor remembers the subjects its wavefront has reached (_reached), in the beam
or not, and a subject's first sweeping tick inside the radius is its one crossing. On it the pinger paints, credits
itself and posts a PingReturn to each ally; Entity publishes returns with paints (PublishPaints is now
PublishInbox) and the ally's own sensors credit them for one tick at the geometric mean range, inside
Rt x Rr < PingRange^2, through the geometric mean of both legs' obscuration (ruling ally-echo-bistatic-oval).
This commit builds and replaces the sensor the previous commit's tests were written against.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-11 15:22:29 +02:00
commit dd896528cc
4 changed files with 71 additions and 36 deletions

View file

@ -40,6 +40,24 @@ public enum PaintMode
Track
}
// An ally's ping crossed `Subject` at `IlluminatedRange` through `IlluminatedObscuration`; `MaxRange` is that
// sensor's PingRange. Posted on the crossing tick and read for one tick by the receiving ship's own sensors.
public readonly struct PingReturn
{
public readonly Entity Subject;
public readonly float IlluminatedRange;
public readonly float IlluminatedObscuration;
public readonly float MaxRange;
public PingReturn(Entity subject, float illuminatedRange, float illuminatedObscuration, float maxRange)
{
Subject = subject;
IlluminatedRange = illuminatedRange;
IlluminatedObscuration = illuminatedObscuration;
MaxRange = maxRange;
}
}
public readonly struct PaintWarning
{
public readonly float2 Bearing;