Gravity: laned belts, a belt on a copy of a light body's rail filling its slot less a visual lane

Place records every child's slot; GenerateEntities marks belt candidates. After the swarm pass, a lane pass on its own
stream gives a candidate that kept its body, has a band at least the lane's half-width on both sides, carries no swarm and
whose parent has no other belt shape, an annulus on a copy of its rail: rocks over [slot inner, D - E] and [D + E, slot
outer], E = LaneBodyRadii body radii. ZoneGenerationSettings gains LaneProbability (0 in code, 0.5 authored) and
LaneBodyRadii (5). LanedBeltTests pins it; EveryBeltIsKindedAtGeneration moves there and asserts lanes; BeltShapes.Lanes
lands with it; both TrojanSwarmTests fixtures draw no lane.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
soul 2026-10-21 22:42:49 +02:00
commit f102b082fd
7 changed files with 266 additions and 26 deletions

View file

@ -134,6 +134,12 @@ public class ZoneGenerationSettings
public float TrojanHalfWidth = .06f;
public ExponentialCurve TrojanCount = new ExponentialCurve { Exponent = 1f, Multiplier = .04f, Constant = 8f };
// Laned belts (ruling lanes-two-sided-visual-margin): the chance a belt candidate that kept its body and has room on both
// sides carries a laned belt, and the lane's half-width in the host's body radii. 0 here: a settings object built in code
// draws none.
public float LaneProbability = 0f;
public float LaneBodyRadii = 5f;
public float ResourceDensityMinimum = .1f;
public float ResourceDensityMaximum = 1.5f;