{ "_comment": "ASTEROID CLUSTERS — loose groups of slowly tumbling rocks drifting in the system's void. texture = spritesheet of frameWidth×frameHeight asteroid frames (frameCount frames). cluster = how a group looks & moves: groupSize = rocks per cluster (minFullSize guarantees at least one full-size rock), sizes = per-rock diameter px, spread = how far a rock may sit from the cluster center, gapFactor = the small edge-gap between ANY two rocks, as a multiple of their combined radii (1.0 = touching, 1.12 = a subtle gap — the generator pushes apart just the overlapping pairs, each by half, so groups stay compact), spin = each rock's OWN very slow tumble (deg/s, direction per-rock random), groupSpin = the whole loose group drifts around its center (deg/s), tint = subtle warm/cool starlight per cluster (anchors blended toward white by strength), halo = soft glow behind the group, debris = a halo of fine dust motes orbiting just outside the rocks. distribution = how many clusters a system gets: targetObjects − planetCount, ±jitter, clamped to [minClusters, maxClusters] (more planets ⇒ fewer clusters); the starting system always gets at least startingSystemMinClusters, and those first ones are placed INSIDE the player's initial tether so they're reachable from the spawn. placement = where clusters may sit: minObjectSpacing = no cluster may be closer (center-to-center) than this to ANY other object (home world, planets, free-space stations, other clusters); minRadius/maxRadius = the annulus around the origin random clusters live in; tetherMargin = how far inside the tether rim a starting-system cluster must sit (whole group stays reachable). shipClearance = how close (edge-to-edge) the ship may get to a rock — clusters are solid, like worlds.", "enabled": true, "texture": "assets/images/asteroids.png", "frameWidth": 128, "frameHeight": 128, "frameCount": 10, "typeLabel": "Asteroid Cluster", "compassColor": "#c8d2e0", "shipClearance": 50, "cluster": { "groupSize": { "min": 4, "max": 8 }, "sizes": { "min": 64, "max": 128 }, "minFullSize": 1, "spread": 140, "gapFactor": 1.12, "spin": { "minDegPerSec": 0.3, "maxDegPerSec": 1.6 }, "groupSpin": { "minDegPerSec": 0.12, "maxDegPerSec": 0.4 }, "tint": { "enabled": true, "anchors": ["#dfe9ff", "#ffe9d6", "#e8e4f8"], "strength": 0.5 }, "halo": { "enabled": true, "scale": 2.8, "alpha": 0.26, "color": "#7fa8d8" }, "debris": { "enabled": true, "count": [18, 36], "inner": 0.9, "outer": 2.4, "size": [2.5, 6], "alpha": [0.4, 0.85] } }, "distribution": { "targetObjects": 9, "jitter": 1, "minClusters": 1, "maxClusters": 6, "startingSystemMinClusters": 2 }, "placement": { "minObjectSpacing": 1024, "minRadius": 2048, "maxRadius": 18432, "tetherMargin": 96, "maxPlacementAttempts": 400 } }