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>
75 lines
2.4 KiB
C#
75 lines
2.4 KiB
C#
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
using CultMath;
|
|
|
|
// Light signatures split by channel (ruling visibility-per-capability-reveal): an observer learns what a ship
|
|
// is by which channel carries the light. Append-only: values are serialized in VisibilityData.
|
|
public enum SignatureChannel
|
|
{
|
|
Thermal,
|
|
Reflection,
|
|
DrivePlume,
|
|
LaunchFlash,
|
|
Emission
|
|
}
|
|
|
|
public readonly struct Signature
|
|
{
|
|
public readonly SignatureChannel Channel;
|
|
public readonly float Strength;
|
|
public readonly EquippedItem Item;
|
|
|
|
public Signature(SignatureChannel channel, float strength, EquippedItem item)
|
|
{
|
|
Channel = channel;
|
|
Strength = strength;
|
|
Item = item;
|
|
}
|
|
|
|
public Signature WithStrength(float strength) => new Signature(Channel, strength, Item);
|
|
}
|
|
|
|
// What a painted ship learns of a beam on it (ruling sensor-stat-set item 4): a Search paint is a ping sweeping
|
|
// it (Strength 0); a Track paint is a lock (Strength is the emitter's own lock progress, 0..1, ruling
|
|
// lock-warning-strength). Never summed.
|
|
public enum PaintMode
|
|
{
|
|
Search,
|
|
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;
|
|
public readonly EquippableItemData EmitterClass;
|
|
public readonly PaintMode Mode;
|
|
public readonly float Strength;
|
|
|
|
public PaintWarning(float2 bearing, EquippableItemData emitterClass, PaintMode mode, float strength)
|
|
{
|
|
Bearing = bearing;
|
|
EmitterClass = emitterClass;
|
|
Mode = mode;
|
|
Strength = strength;
|
|
}
|
|
}
|