Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
SimpleOrbit
Client-side orbit: open the ship door in space, fog-free space looks per moon, a huge moon lit by a moving sun (phases, eclipses), travel rumble. Vanilla players see nothing new; players who also have it see the real door and moon too.
CHANGELOG
Changelog
0.2.15
- Over-bright, flat white moon and a hard white sun in orbit (Josh: Vesper after loading a save on Experimentation, and Artifice).
Cause: with automatic exposure SimpleOrbit took the exposure's
limitMinas the white level. Experimentation'sEnvironment/Lighting/BrightDay/Indoorsvolume (IndoorIntro, Automatic) stays active in orbit, so the real adapted exposure was far fromlimitMinand the moon glow, sun light and sun disk were all scaled too bright. Now the camera's actual exposure is read back from HDRP (async GPU readback, every 2 s calibration);limitMinis only used until the first readback arrives. No new config keys, no bake change.
0.2.14
- Josh: "take the moon you made for assurance and make it artifices, then make an orange moon like vesper/exp for assurance".
- Artifice now uses Assurance's 0.2.9-0.2.13 surface scheme (rocky brown-grey badlands), palette copied unchanged. Its terrain layout still comes from Artifice's own name seed, and its sky look is unchanged.
- Assurance has a new "orange dusty rock" scheme: rust-orange dust, rocky ridges, mesas, canyons, dust streaks and mottling. Its sky look is unchanged.
- Vesper, Experimentation and every other moon are unchanged (Vesper's and Experimentation's bakes are byte-identical to 0.2.13). No new config keys. Old bakes are never reused because the bake key hashes the palette.
- Preview:
out/previews-0.2.14/artifice-assurance-before-after.png.
0.2.13
- Artifice in orbit (Josh's play-test: green with lakes and rivers; Artifice is orange and dusty). The green look was SimpleOrbit's own hand-picked Artifice palette, not the vanilla planet and not a Vesper leak. It is now orange dust with the industrial grids kept: no water, rivers or forest, dust streaks and a warm haze. Bake cache version bumped so the old green bake is not reused.
0.2.12
Evidence: Josh's 0.2.11 clips (Embrion -> Vesper route, and Vesper's quick moon on screen) plus his 0.2.11 LogOutput.log.
- Travel flow (PROVEN cause). The clip and its audio, measured from the moment the route starts:
- old moon sinks 0-0.6 s;
- sky swap 1.8-2.3 s;
- new moon slides up 2.9-3.6 s, while the flight rumble is still loud;
- arrival at ~3.4 s (the rumble drops). In 0.2.10 the new sky was empty for ~3.4 s and the moon rose with the arrival sound. 0.2.11's "rise during the flight" (2 s rise, eased, so the visible slide is ~0.7 s) removed the stretch of open space between the moons. The moon was simply there before the ship arrived. Fix: after the swap the new moon fades in (0.8 s) small and far away in its resting spot, top edge where it will rest, and grows as the ship closes in (6x distance -> 1x, easing out). It reaches orbit size exactly when the vanilla arrival sound ends (predicted from the level's timeToArrive during the flight, the real end once arrived, never faster than 1.5 s). The moon is visible right after the swap (no 4 s gap), and the quick -> full crossfade still runs.
- Sun phase limit: not changed. There is nothing about it in the clip; the lighting shows no jump.
- Nebula (requested). New
NebulaAmount(6. Space, default 0.45; 1 = the 0.2.11 look, 0 = none). It applies to every moon's sky and makes the swirly clouds:- fewer (higher density threshold, more black space);
- dimmer (x0.59 at 0.45);
- less saturated (25% toward grey at 0.45). The galaxy band, belts and stars are unchanged. It is local to your screen (the synced NebulaStrength is unchanged).
- Slow quick -> full on Vesper (PROVEN causes, from the log):
full detail up 33.9 s after the request= 1.2 s first look + 23.0 s full bake + ~9.7 s between "bake done" and "full up". The clip shows the 256 px moon on screen for ~29 s (moon up at 1.3 s, crossfade 30.5-31.5 s).- Crossfade prep (PROVEN, ~9.7 s): 0.2.11 decoded the 2048 bake and BC1-encoded three full 2048 chains for the in-between steps. These are now made at 1024 from the bake's own mip 1: box 1.12 s -> 0.29-0.41 s (x5.4 on the laptop: ~6 s -> ~2 s). The final step is still the full 2048.
- Foreground bakes never saved (PROVEN): every moon you looked at logged
bake cached to disk (... not saved (Object reference not set to an instance of an object)). The sky upload cleared the shared face list before the worker wrote the file, so every visit baked again (only background pre-bakes were saved). Now the main thread gets a copy of the list. A second visit is a disk-cache hit. - Pre-bake running alongside (PROVEN contributor): laptop/box bake-time ratio was 4.3x for Dine (no pre-bake running) vs 5.4-5.7x for Assurance and Vesper (a pre-bake was running), i.e. ~25% slower. The background pre-bake now pauses (between rows) while any shown moon is baking or crossfading, and resumes after (logged).
- Not the cause: the 0.2.11 sharpening pass (~0.3 s of the box's ~4 s Vesper bake). Vesper's look is unchanged: the bake is byte-identical to 0.2.11.
- BakeVersion
sob-0.2.12-1(the sky changed), so old bakes are removed once at start.
0.2.11
- Fix: Vesper showed one giant round dark-brown ring with a light tan band ("this giant circle looks silly"). Cause: Vesper shared Tithe's scheme (0.2.9), which has one big basin crater (0.32 rad radius: dark floor, darker rim ring, light ejecta band). 0.2.9's arrival alignment then turned that crater into the upper part of the disk, where the door looks, so it filled the view. Vesper now has its own "dusty desert" scheme with no big crater (so no alignment either):
- tan and rust-red colours with rust mottling at two scales;
- dune seas in two wind directions by region;
- terraced mesas (light caprock tops with a bright edge, dark layered slopes);
- branching canyons, light and dark wind-blown dust streaks;
- many small craters.
- Tithe keeps its mining crater (unchanged).
- Fix: a large dark blurry "bullseye" on every moon (seen on March), centred on the part of the moon facing the ship. Cause: the 0.2.7 moving sun cycled the phase through crescent and dark. The moon is so close that you only see a ~42 deg cap of it, so past ~90 deg the whole side facing you is on the night side (MoonNightSide glow only) while the lit edge and the air round the limb glow: a dark disc inside a bright ring. Now the sun stays on the ship's side of the moon: high above it (25 deg from behind the ship) and swinging out to either side up to
SunMaxPhaseDegrees(new, 10. Sun, default 60). The lit side always faces you, and the terminator crosses the far, lower part of the disk. Set it to 180 for the old cycle. The Eclipsed-weather backlit look is unchanged (it is meant to be a silhouette). - Fix: the quick moon never showed and the full moon popped in (Josh's Vesper -> March video). Cause: after the sky swap (about 2 s into the flight) the new moon stayed hidden for the rest of the flight (
travellingbranch) and only rose when the arrival sound ended. By then the full bake had replaced the quick moon off-screen. The crossfade only runs while the quick moon is visible, so it was skipped. And the rise was timed to the arrival sound: if that had already ended (or nearly), the moon jumped up in one frame. Now:- the new moon starts rising right after the swap, during the flight, showing the quick 256 px moon if the full one is still baking;
- the full moon then crossfades in on screen: 25% / 50% / 75% / 100%, one step every 0.25 s;
- the rise never takes less than
RiseSec(0.8 x FadeSeconds, 1.2-3 s), even when the arrival sound has already ended. - A moon that is already in the disk cache or pre-baked has its full detail straight away. It rises and fades in with it (there is no low-res stage to show).
- Sharper close up: the 2048 bake gets a light unsharp mask per face (texel-level contrast is what survives the ~3x bilinear magnification of the part of the moon nearest the ship), and Vesper has more texel detail.
- Old bakes are dropped:
BakeVersionis nowsob-0.2.11-1(it is part of every cache key, so no 0.2.10 bake can be shown). At start the cache folder is also cleared of files from other bake versions (logged:[Space] bake cache: removed N bake(s) from older SimpleOrbit versions). - Logs:
[Space] <moon> rising during the flight (quick 256px moon, full detail crossfades in, 2.0s);crossfaded in 4 steps.
0.2.10
- Fix: the space view went pitch black for ~15 s after routing to a moon whose look wasn't baked yet (Josh's video:
/bb moon vesperfrom Embrion). Cause, inSpaceView.Tick: when the target look changed, the old moon and the old sky (stars, nebula, sun) were faded to 0 right away, and the swap waited in full black fortarget.Ready. Ready meant the whole bake was done and uploaded: sky (1024) + full 2048 moon + BC1 compression, all in one worker job. That's ~4 s on the build box and ~15 s on the laptop. Routing through the terminal usually hid this (the bake starts on the route-confirm screen)./bbroutes skip that screen, and 0.2.9's 2048 bake made the wait ~4x longer. - Never blank while baking. While the new look is generated, the old sky, stars and sun stay fully up; only the old moon sinks away (as before). As soon as the new look has something to show and the old moon is gone, the sky does a 0.3 s dip and comes back (0.3 s) as the new one, with its sun already in place (0.2.8 placement unchanged). HDRP's sky can only hold one star texture and SimpleOrbit ships no shaders, so this is a short dip, not a true two-sky crossfade.
- Progressive bake. The worker hands over, in order:
- the sky (~0.35 s on the box);
- a quick 256 px moon (~0.2 s);
- the full 2048 BC1 moon. The first look is ready after sky + quick moon. When the full moon is done while the quick one is on screen, it blends in over ~0.55 s in 3 steps (40% / 75% / 100%, made on a worker one face at a time). Otherwise it just replaces it.
- Disk cache. Every finished bake (sky faces + moon BC1 mip chain + the big-crater direction) goes to
BepInEx/cache/SimpleOrbit/<moon>-<key>.sobakein the profile: gzip, ~15 MB per moon, written atomically on the worker. The key is a hash of everything that goes into the bake (palettes, look, resolution, compression, star/nebula settings, seed) plus a bake version, so changed settings or a new generator never show an old bake. Unreadable files are deleted and baked again. The folder is kept underBakeCacheMaxMB(least recently used deleted first). A repeat visit reads the bake in ~0.2 s (box) instead of baking. - Pre-bake. While you idle in orbit (view settled, nothing else baking), the other moons are baked to the disk cache one at a time on one low-priority background thread (
PrebakeMoons). - No main-thread spikes from uploads. Uploads go one face per frame (sky 1024: 6 frames + apply; moon 2048 BC1: 6 frames + apply), one texture at a time, the shown/wanted moon first. Generation, compression, crossfade steps and disk I/O are all on worker threads.
- Logs (DebugLogging):
[Space] <moon>: first look ready N s after the request (cache hit / miss: sky, quick moon ms)[Space] swapped to <moon> N s after it was requested here[Space] first look on screen for <moon>(view start)[Space] <moon>: full detail (2048px) up N s after the request (... crossfaded in 3 steps)[Space] bake cached to disk (moon: MB in ms)[Space] pre-baking <moon> ... (i/n)[Space] <moon> still baking; keeping <old>'s sky, stars and sun up meanwhile
- New config (7. Moon):
BakeCacheOnDisk(true),BakeCacheMaxMB(512),PrebakeMoons(true). - Unchanged: 0.2.9 looks and bake, 0.2.8 sun placement, placement / orbit / phases / eclipse, sync format.
LookEntry.Readystill means "can be shown", and SimpleTestPilot's reflection targets are intact (self-check passes).
0.2.9
Moon surfaces, second and third detail pass, plus the Tithe colour fix and the teal wash / blur from the 0.2.7 video.
- Fix: SimpleMoons' Tithe (10 Tithe, 10 Vesper since SimpleMoons 0.1.12) came out green like March. Cause: SimpleMoons builds Tithe's level from Vow's and keeps Vow's planet model (
planetPrefab). Tithe isn't in the vanilla table, so withMoonColorSource = AutoSimpleOrbit read the surface colours from that model: Vow's greens (classified "green": maria, no dunes). Its space look came from a name hash (often a teal/green look), and the rim took 55% of the look's haze, so the whole disk read teal-green, like March. Now:- Tithe and Vesper have their own hand-picked scheme: dusty tan / ochre / rust desert, one big round cliff-ringed crater (dark terraced walls, darker rim, darker floor, lighter ejecta), dune fields, a few small craters, terraced mining scars clustered around the crater; amber rim; GoldenGiant space look.
- Matching is by planet name, then known aliases and the level asset's internal name (
TitheLevel/TitheExtendedLevel,VesperLevel...), then "name contains tithe/vesper". - Colours are never read from a planet model that a vanilla moon also uses (logged).
- Unknown moons no longer get a scheme from a name hash (one of the 6 generic schemes was green). They get a neutral scheme chosen from the level's own hints: snow footprints, description / name words (snow, desert / dust / mining / canyon, ocean, volcanic, forest / swamp, industrial, rain / flood), rainy/flooded weather; else neutral grey-brown rock. Logged with the reason.
- When the moon has a big crater, the surface is turned on arrival so the crater shows in the upper part of the disk (where the door looks); drift and spin carry it on from there.
- Teal wash removed. The moon's atmosphere used Earth's Rayleigh spectrum (5x more blue than red) 120 km deep at the default
MoonAtmosphere 0.5, which laid a blue-green veil over the whole disk, worse under a teal look. Now thinner (45 km) and almost grey, coloured by the moon's own air tint (per moon: amber Tithe, rust Experimentation, blue-white Vow, grey March, ice-blue Rend ...; only 12% from the space look). The limb still glows, the disk keeps its colours. - Sharp at the size it is on screen. The moon fills half the window, so 0.2.8's 1024 bake was ~5 screen pixels per texel with mostly low-frequency content (blurry, gas-like). Now:
HighDetailMoon(7. Moon, new, default on) bakes at 2048 per face and stores it BC1-compressed with a CPU mip chain (linear-light box filter): ~16 MB per moon instead of ~134 MB as RGBA (and less than 0.2.8's 1024 RGBA). Held back toMoonResolutionon machines under 6 GB RAM, 4 cores or 2 GB VRAM. If the GPU refuses BC1 it falls back to RGBA once.- Detail at every scale: regions, mid-scale terrain (ridged ranges, branching canyons with dark walls, dune fields, mining scars, industrial compounds, 7 crater sizes down to a few texels), and texel-level grain / micro relief / tree crowns.
- Stronger baked cavity shading plus gentle relief, so terrain reads on the lit side and along the terminator.
- Bake time on the worker threads (build box): ~2-2.5 s at 2048 with 8 threads, ~8-9 s with 2 (the game uses cores - 2, 2..6 threads); still once per moon, no per-frame cost.
- Water and forest worlds. New surface layers:
- seas and lakes with deep/shallow colours and shores;
- river networks;
- mud flats;
- clustered forest canopy in varied shades with meadows;
- polar caps, latitude tint;
- faint cloud wisps.
- Every moon reworked from its in-game look:
- Experimentation: rusty industrial desert, canyons, mining cuts, grey pads.
- Assurance: rocky brown-grey badlands.
- Vow: lush green valley world, rivers, lakes, sea, few clouds.
- Offense: dusty red canyons.
- March: dark rainy forest, lots of water and mud, overcast.
- Adamance: temperate forest, lakes.
- Rend: snow and ice with dark rock ridges.
- Dine: snow, dark snow-laden conifer forest, frozen lakes.
- Titan: icy mountains and crevasses.
- Artifice: green fields with industrial compounds and ponds.
- Embrion: reddish heavily cratered rock with violet crystal fields.
- Gordion / Company: grey industrial.
- Liquidation: ocean.
- Preview sheet:
out/moon-previews-029.png(every moon on a side-lit sphere + a close-up at the in-game framing, from the BC1 data as uploaded). - Not possible in the sky's planet (HDRP PhysicallyBasedSky ground): a specular sun glint on water and normal-mapped relief. The ground is shaded Lambert-only (no specular, no normal map), and the shader samples with its own fixed trilinear sampler, so texture anisotropic filtering or a shader detail layer can't be added there either. Water reads by colour only (dark, smooth, no relief). A glint would need the moon as a real mesh sphere (a possible later step). The baked coarse water mask (
LookInfo.WaterMask) is kept for that. - Unchanged: 0.2.8's sun (in place from the first frame), all space looks, placement / orbit / phases / eclipse, sync format, SimpleTestPilot reflection targets (self-check passes).
0.2.8
- Fix: the sun popped in late. On arrival in orbit (game start, after routing to a moon, after takeoff) the stars, nebula and moon came in together but the sun only appeared about a second later, abruptly, at the moon's edge. Cause: the sun was placed relative to the animated moon. While the backdrop fades in, the moon starts as a speck straight below the ship and rises ~24° into place; the sun was snapped next to that speck in the first frames and then chased the rising moon at a capped turn rate (8°/s + half the gap per second), so it trailed inside the moon's outline, where the planet hides it, and only came out at the edge after the moon had settled. The moon's lighting already came from the right side (a few degrees difference), so only the disk looked late.
- Now the sun is part of the backdrop: its light is created in the same frame as the space volume, and it is anchored to the moon's resting spot (this arrival's placement + the current orbital swing, without the rise/sink offset), so it sits in its final spot, matching the moon's lit side, from the first frame. The moon rises into its light. Disk and glow fade with exactly the same fade as the stars and nebula (one fade for the whole backdrop); with
TransitionFade = falseeverything is there at once. - The sun direction is no longer eased while the view is fading or the moon is rising/sinking (the target only moves continuously: network clock, orbital swing, eclipse blend); easing is kept only for a jump while everything is fully up (e.g. a host changes
SunCycleMinutes). - Unchanged: the 10 space looks, moving sun phases (same clock, same per-moon tilt/side), eclipsed sun on Eclipsed days, moon placement / orbital swing / parallax, sync format, config keys. SimpleTestPilot reflection targets unchanged (self-check passes).
- Not changed (known follow-up):
PresenceMaskandOrbitState.DepthFromDoor/DoorOutwardstill use the old door reference (the HangarShipDoor animator object). Switching them changes where the door plane is for masking/rescue, which needs an in-game test, so it is left as is.
0.2.7
Fixes from the 0.2.6 in-game test (SimpleTestPilot run 3, 116 screenshots).
- Fix: "straight out of the door" was about 90° off. The door reference (the HangarShipDoor animator object) sits ~10 m from the real doorway, so the "room box face" picked the wrong wall: every moon landed right of / behind the door view (the screenshots: LEFT moons showed on the right, MIDDLE/RIGHT ones only as a sliver low on the right of the catwalk or not at all, the ringed planet never in view). The view direction now comes from the game's own door node (
shipDoorNodeminusmiddleOfShipNode, flattened, squared to the room wall if within 30°), with the 0.2.6 method as fallback; DebugLogging prints both and the angle between them. - The moon is always in the door view. Azimuth range capped at 34° (left / middle / right thirds kept; the ±12° swing can add up to 40° total), and the top edge is lifted into a band just above eye level:
MoonHorizonDegrees+ 9, clamped to +1..+10° (default -3 with the height variance = +1..+8.8°), +-3° swing clamped to -1..+12°. Before, the edge was at -2.5..-7.4° plus up to -3° of arc, i.e. hidden by the catwalk railing from the door. Size, tilt, drift, zones (never the same twice) unchanged. Ringed planet now 16-30° beside the door direction (was 18-38°). - Moon phases you can see. 0.2.6 circled the sun around the ship, so its terminator mostly fell on parts of the moon below the deck and the visible top just got brighter/dimmer. Now the network clock drives the phase angle directly (full -> half -> crescent -> dark -> crescent -> half -> full every
SunCycleMinutes), with the sun above-and-beside the moon (35-60° up from its side, per moon), so the terminator always crosses the visible top of the moon: half = one side lit, crescent = a lit rim along the top edge with the sun just beside it in the door view. Lingers on the half/crescent phases. Same on every SimpleOrbit client. - Eclipse always visible. The eclipsed sun now sits behind the moon's edge at the point nearest the door view centre, nudged up the edge to at least +3° above eye level (or 3° below the top of a very low moon), swaying ±6° (was ±14° around the straight-up point, which was off-view/below the deck: Embrion forced-eclipse showed it at -10°).
- Debug: the [Sun] line shows the clock phase, the sun's angle from the door and whether it is in the door view. New read-only fields for test tools:
SpaceView._doorOut,_moonDir,_limbDir(Vector3, world directions from the ship) and_sunInDoorView(bool). All SimpleTestPilot 0.1.2 reflection targets unchanged. - Unchanged: looks, colours, sync format (no new network data), config keys (descriptions updated), PresenceMask/door logic.
0.2.6
- 10 hand-tuned space looks, one per moon (
SpaceLooks, 6. Space, default on; withSkyPalette = Auto). Each keeps the generated nebula but adds its own star field character and at most one big feature, all emission only (no fog, nothing hazed):- EmberBelt (Experimentation, Gordion/Company): smouldering orange-red wisps, warm stars, a rust-brown asteroid belt with faint dust ringing the sky just above the horizon.
- GoldenGiant (Assurance, Artifice): amber-gold nebula, a cream/tan banded gas giant with wide golden rings.
- EmeraldVeil (Vow): green/teal veils and a pale green-white galaxy band full of faint stars.
- CrimsonRift (Offense): deep red/magenta clouds, a bright galaxy band split by a black dust rift, many bright stars.
- DeepLagoon (March, Liquidation): teal-blue lagoon nebula, a pale blue ice giant with thin silver rings.
- Borealis (Adamance): strong green-to-violet aurora ribbons, slightly sparser stars.
- GlacierHalo (Rend): icy blue nebula, crisp blue-white galaxy band, lots of bright sparkling stars.
- RoseNebula (Dine): big pink/plum clouds, an icy grey asteroid belt above the horizon.
- VoidDiamond (Titan): almost no nebula, a black sky packed with brilliant stars and a thin silver galaxy band.
- AmethystStorm (Embrion): dense violet/magenta storm clouds, violet galaxy band with a dark lane.
- Modded moons get one of the 10 from their name (always the same one). The looks can also be forced with
SkyPalette(new values appended; the 0.2.0 palette values keep their numbers).SpaceLooks = false= exactly the 0.2.5 skies. - The ringed planet hangs beside the door view on the side away from the moon, 14-22° up, and the stars slowly wheel around it (
PlanetStaysInView, default on; off = it turns with the stars round the vertical like everything else). Belt looks tilt the star field only ±6° (not ±60°) so the belt stays a band just above the horizon all the way round.RingedPlanets/AsteroidBeltsswitch those features off. - Generation cost: about +10-25% on the worker threads for looks with a galaxy band or planet (still ~150-350 ms at 1024 per sky on 6 threads offline); nothing per frame.
- A sun that moves on its own (
MovingSun, new section10. Sun, default on). A sun disk with a soft glow circles the ship once everySunCycleMinutes(20). The moon is now really lit by it (HDRP's physically based sky lights its surface from the sun's direction), so the lit side changes: sun in front over the moon (14° above its top edge, in the door view) = crescent; beside you = about half; behind the ship (high up, opposite the moon's centre) = full. It lingers in front (~40% slower there). The unlit side keeps a faint glow (MoonNightSide, 0.15) so the surface never vanishes. Disk sizeSunSizeDegrees(1.6), brightnessSunBrightness. - Eclipsed sun (
EclipsedSun, default on): when the moon you orbit has Eclipsed weather, the sun sits just behind the moon's top edge as a dark disc with a glowing corona ring (the moon covers its lower third), slowly drifting ±14° along the edge and following the moon's orbital swing. The moon is lit from behind, so it is a dark silhouette with a glowing atmosphere rim. Changes of weather/settings while you are watching blend over ~2.5 s; new arrivals switch in the black. - Synced: sun position = pure function of the NGO network clock, the moon and this arrival's placement, so every modded client sees the same sun, phase and eclipse; weather is the game's own synced value. A 0.2.6 host also shares
SpaceLooks,RingedPlanets,AsteroidBelts,PlanetStaysInView,MovingSun,SunCycleMinutes,EclipsedSun(a new tail on the Look message; 0.2.5 clients stop reading before it, and with a 0.2.5 host your own settings are used). Brightness/size settings stay local. - Ship lighting unchanged: the sun is one directional light that only the sky uses:
interactsWithSkyon,lightDimmer0.0001 (HDRP's sky shader uses the light's raw colour x intensity and ignores the dimmer; surfaces get 1/10000), no shadows, no volumetrics, no cookie texture. Removed HDAdditionalLightData-first, then the object (same order as the 0.2.5 Light fix). - DebugLogging: look name and extras (galaxy band / ringed planet spot / belt) and the moon's weather when a look is shown; every 30 s (and on eclipse changes) the sun's position, phase angle, % of the moon lit, disk size and network time.
- Unchanged: moon colours/surface, placement zones/size/tilt/drift variance, orbital swing ±12°/5 min + self-spin, no fog, arrival/rumble timing synced to the vanilla sounds, door, ladder, roof lights, pull-back-inside, item-drop block, PresenceMask, SyncWithModdedPlayers, all existing config keys.
0.2.5
- The moon now orbits instead of sitting glued to the ship (new section
9. Orbit). It slowly swings back and forth around the ship from its arrival spot (OrbitalSwingDegrees, default ±12°) on a gentle tilted ellipse (it rises/sinks up to a quarter of that, ±3°, along the way); one full left-right-left swing takes 5 minutes atOrbitalSpeed1 (peak ~0.25°/s, ~15° in a minute). The surface stays put in space while the moon swings round, so you see it from a changing angle, and on top of that the moon turns on its own axis (tilted 8-25° from vertical) atOrbitalSpinDegreesPerSecond0.15 (~9° a minute), the same way the stars turn but at a different apparent rate, so moon and stars no longer move together. The swing is a sine, so it is bounded: the moon never drifts off the door view or behind the ship.OrbitalMotion = false= the 0.2.4 fixed moon. - Synced: the motion is a pure function of the arrival's placement (round seed, level, moon; extra numbers drawn after all 0.2.4 ones, so the 0.2.4 placement is unchanged) and the NGO network server time (the same on every client, vanilla host or not), so every modded client sees the moon in the same spot at the same moment. A SimpleOrbit 0.2.5 host also shares its
9. Orbitsettings with modded clients (appended to the Look message, so 0.2.4 peers still read it; with a 0.2.4 host your own9. Orbitsettings are used). - Fix: "Can't remove Light because HDAdditionalLightData depends on it" log errors from the ship exterior copies. The copy is now stripped in dependency order: lights switched off first, HDRP additional data (light/camera/reflection) destroyed before the component it requires, and nothing is destroyed while another remaining component on the same object still requires it.
- Unchanged: placement zones/size/tilt/drift variance, per-moon colours, no fog, per-moon space, arrival/rumble timing, door, ladder, roof lights, pull-back-inside, item-drop block, PresenceMask, SyncWithModdedPlayers.
0.2.4
- Players who also have SimpleOrbit now see what is really going on (
SyncWithModdedPlayers, 1. General, default on). Vanilla players keep seeing exactly what 0.2.3 shows. - How: the game connection's own named messages (
SimpleOrbit.Hello/Roster/Look/Door/Mask/Feed), relayed by the host and sent only to clients that said hello. A vanilla host drops unknown named messages silently (no error, no log spam), so with a vanilla host nothing is shared except what can be worked out locally (below). - With a SimpleOrbit host: the orbit door is shared: any SimpleOrbit player's door press (button or
DoorToggleKey) opens/closes it for every SimpleOrbit player in orbit; a fall-close (FallBehaviour = Kill) is shared too. Automatic closes (landing, lever, routing, a teleporter, a dead/ineligible player) stay local, as they happen for everyone anyway. While a player is masked, SimpleOrbit players ignore the masked pose and play the real position, facing, ladder/jetpack rotation, animations, special animations, jumps/landings and moving-platform changes that the mask held back from vanilla players. Joiners get the door state, who is masked (with their real spot) and the host's look. - Same sky for everyone with SimpleOrbit: the moon's left/middle/right zone, height, size, tilt and drift are now picked from the round seed + moon + arrival (still never the same zone twice in a row), so every SimpleOrbit player gets the same one even with a vanilla host. Moon turning and star-field rotation follow the shared network clock. A SimpleOrbit host also shares its space-look settings (style, palette, colours, stars, nebula, atmosphere, moon size/height/drift, sky rotation, placement ranges) and its current zone, so late joiners match.
- If another SimpleOrbit player opens the shared door, you are not masked until you walk up to the doorway (within 1.2 m of the door plane, or outside); vanilla players then see you at your last spot well inside, and you are unmasked again once you are 1.6 m back in. Pressing open yourself while it is already open makes it "your" door (mask from the press, as before).
- Jumping/falling off: unchanged and per player; a SimpleOrbit player is never pulled into the ship or treated as falling because someone else jumped.
SyncWithModdedPlayers = false: 0.2.3 behaviour (nothing sent or listened for, your own look settings).
0.2.3
- Fix: others saw you half out of the door, or not at all. 0.2.2 decided "outside" with the vanilla room box (
shipInnerRoomBounds), which reaches into and past the doorway. So (a) every position while you were in the door frame (and just past it) went out unmasked, and (b) the "last spot inside" that others were pinned to was taken right there. Where exactly depended on where your last on-the-ground sample happened to fall: mid-frame = clipped halfway through the shut door; just past the leaves = on the far side of a door that is shut for everyone else, so from inside the ship you were simply gone. Vanilla also only sends your position after you move ~0.3-0.5 m, so whatever real doorway sample went out last stuck. - New: from the moment you press the door button (or
DoorToggleKey), everyone else sees you standing still on the floor in front of the door button panel, facing it, inside the ship (OthersSeeYouAt = ButtonPanel, default;WhereYouOpened= the spot you opened it from). This holds while the door is open, while you are outside, on the ladder/roof, and until the door is shut and you are back inside (0.5 m clear of the door), then your real position resumes by itself. The panel is found from the same door button triggers the mod already matches (StartButton/StopButton). - What goes out while the door is open, using only the game's own messages: the pose position (ship-relative, "in ship / in ship room" set) at the press and then once a second; the pose facing at the press and every 2 s; one "standing idle" animation state at the press. Not sent while the door is open: your real position, look direction, ladder/jetpack rotation, walk/sprint/crouch/climb animation states (so no footsteps either), jump and landing sounds, special animations (ladder, terminal, chairs: start and stop skipped as a pair), and moving-platform (physics parent) changes. When it ends, vanilla is nudged to resend your real position, facing and animation.
- "Last spot inside" (used by the drift/fall rescue and by
WhereYouOpened) is now only recorded at least 0.9 m in from the door plane, so being put back inside never drops you in the door frame. - Fix:
FallBehaviour = Killin orbit could only shut the door and leave you falling (the game refuses every death while the ship's doors are disabled). It now rescues you there instead. - New config entry:
OthersSeeYouAt(2. Door).HideFromOthersnow covers the whole time the door is open (its value is unchanged). With DebugLogging: the chosen pose and where the panel was found, held-back message counts, the learned idle animation.
0.2.2
- Outside ladder works in orbit (
LadderInOrbit, default on). The ladder is the vanilla ladder trigger; in orbit it could not be used because (a) it can sit inside an exterior part the game switches off in orbit (SimpleOrbit shows script-less copies of those), and (b) vanilla refuses a ladder whileisInHangarShipRoomis true, which the game never clears in orbit when you walk out of the door. While the door is open the original trigger is made active on your screen only (moved under its nearest active parent if needed, helper box hidden) and the room flag reads false for the climb press only. Everything is put back exactly when the door closes / on landing / leaving orbit. The roof counts as "outside" for the position masking and the drift/fall rescue;FallLimitis measured from the ship floor, so the roof is safe and falling off the roof still rescues you. - While outside (with
HideFromOthers), the climbing-animation RPC is not sent either, so others keep seeing you standing at the closed door; start and stop are skipped as a pair. - Light on the top of the ship (
HullTopLight,HullTopLightStrength0.3): a soft, shadowless starlight from above (tilted slightly from the door side), only while you are outside; full strength on the ladder/roof, 40% on the catwalk. Hull-side brightness and the moonlight are unchanged; nothing changes while you are inside. - Fix: moons always ended up on the right. "Out of the door" was taken as the vector from the room centre to the door, which leans along the ship because the door is not centred along its length, so every placement was turned to one side. It is now the outward normal of the room wall the door is in (the door's position in the room box, per axis, against the box size). Placement azimuth now picks the left, middle or right third of the range (equal widths, never the same third twice in a row);
MoonPlacementAzimuthRangedefault 45 -> 60. The log names the zone and shows the old vs. new door direction. - Fix: falling off and being pulled back in closed the door. Falling off in orbit lands in the ship scene's out-of-bounds trigger, which calls the game's ForcePlayerIntoShip (a teleport to your spawn spot);
CloseOnTeleporttreated that as a teleporter. The game's own rescues (ForcePlayerIntoShip, OutOfBoundsTrigger, TeleportPlayerInShipIfOutOfRoomBounds), SimpleOrbit's own put-back and the ladder's snap-to-rung teleport no longer close the door. Real teleporters still do (whenCloseOnTeleportis on); with DebugLogging the source of any closing teleport is logged.
0.2.1
- Fix: tall translucent pink band over the ladder on the outside catwalk. The ship-exterior copies (0.1.x code) switched on every renderer inside a copied part, including helper meshes vanilla keeps disabled, e.g. the box of the ladder's climb trigger. Copies now keep each renderer exactly as vanilla has it (only if vanilla hides the whole part are its renderers shown, and then only real geometry), and never show: trigger volumes / InteractTriggers, transparent, additive, decal, volumetric, particle or broken-shader (pink) materials, particle/line/trail/sprite renderers. Lights, decal projectors and local volumetric fog are no longer copied at all.
- Arrival timed to the vanilla sounds. Routing now follows the vanilla sequence (depart, FlyAway 2 s, timeToArrive, ArriveAtLevel, arrival sound): the old moon sinks away in 2 s with the vanilla planet, the new moon rises and the sky finishes fading in exactly when the vanilla arrival sound ends (its real length is read from the game). If a look only becomes ready after arriving it fades in quickly (0.7 s) instead of doing the long rise.
- No more hard cut between skies. The old sky now fades to full black before the new one is swapped in (0.2.0 swapped at a 4% floor, which read as a cut). The moon now visibly rises from below the horizon in front of you instead of from straight below the hull.
- Shorter rumble tail. Brief arrival surge, then a fast-then-quiet fade that is silent exactly when the vanilla arrival sound ends (was a fixed ~4 s).
- Faster generation. Colour-only noise fields on a quarter-resolution grid, one fewer octave in the large/ridge height layers and the nebula, a lookup table for sRGB conversion, and up to 6 worker threads (cores - 2; was cores/2, max 4). About 30% less CPU work per look at the same resolution (same look), plus more threads where available.
- Pre-generation. The terminal's route-confirm screen ("The cost to route to ...") starts generating that moon's look right away, so it is normally ready before the ship even departs. Read-only, nothing about the terminal changes.
- Moon placement variance (
MoonPlacementVariance, default on): every arrival in orbit picks a new placement: around the ship (MoonPlacementAzimuthRange, ±45° from the door), height (MoonPlacementHeightRange), size (MoonPlacementSizeRange), drift speed and direction (MoonPlacementDriftRange), surface turn and star-field orientation. Colours and palette stay per moon. It only changes while the moon is hidden and the sky is black, so it never jumps. Off = the 0.2.0 fixed spot. - DebugLogging: per-part exterior copy report (renderers shown, renderers kept off and why), route depart/arrive with the arrival-sound length, "moon up" timing vs. the end of the vanilla sound, rumble silence timing, worker-thread generation times, chosen moon placement, route-confirm pre-generation.
- Unchanged: the door, hull lighting, moonlight strength, all existing config keys.
0.2.0
- No fog in orbit (
NoFogInOrbit): a local, high-priority HDRP volume switches Fog/volumetric fog off and every enabled LocalVolumetricFog is disabled while in orbit. No scene profile is edited; removing the volume and re-enabling those exact components restores it before landing (lever pull), when leaving orbit, in the fired cutscene, on disconnect and on scene change. - Generated space, different per moon (
SpaceStyle = Procedural): dense crisp stars (varied brightness/colour, crowding into a band or around the clouds) and nebula clouds with dark dust lanes and a faint haze, generated at runtime from a seed. 10 palettes (RedPurple, TealBlue, GoldOrange, Green, Pink, DeepSparse, IcyBlue, Violet, Ember, Aurora); vanilla moons hand-assigned, modded moons picked deterministically from the moon name (stable hash), and layout (cloud positions, band, dust) also comes from the seed. Slow rotation kept (SkyRotationSpeed). Drawn as the HDRP sky, so it is always behind the planet and never clipped. - Huge, bright moon below the ship (
HugeMoon): the current moon is the ground of that sky: ~48° angular radius, top edge just below eye level looking out of the door, curving away across the lower view, slowly turning (MoonDriftDegreesPerSecond). Self-lit and calibrated to the camera exposure so it is bright; thin tinted atmosphere rim (MoonAtmosphere). Surface is a generated 1024px-per-face cubemap (plains, fractal detail, ridges, 5 sizes of shallow craters with rims, ice/accent patches, baked relief) in each moon's colours: hand-picked table for Experimentation, Assurance, Vow, Offense, March, Adamance, Rend, Dine, Titan, Artifice, Embrion, Gordion; colours read from the planet model's texture for modded moons; name-hash fallback. The vanilla planet is hidden while the huge moon is up. - Moonlight on the hull (
MoonLightOnShip): a soft, shadowless directional light from the moon's direction in the moon's colour, only while you are outside, so the ship room's lighting never changes. - Routing rumble (
RoutingRumble): deep rumble that builds (~2.5 s), holds with a slow swell, surges on arrival and fades (~3.5 s). Synthesised at runtime (no audio files) + the ship's own motor clip pitched down (RumbleShipMotorLayer), routed through the ship-ambience mixer group, 2D, local only. Gentle vanilla small screen shakes (RumbleCameraShake). - Transitions (
TransitionFade,FadeSeconds): on routing the old moon sinks away and the sky dims, the new sky fades in during the flight and the new moon rises on arrival. - Textures are generated once per moon on worker threads and cached (
CachedMoons, default 2); uploads are spread over two frames; no per-frame allocations. SpaceStyle = Classickeeps the exact 0.1.1 star sphere + overhead planet orbit. All 0.1.1 keys unchanged. The door is unchanged.- YieldToOriginals: Celestial Tint / ShipWindows still switch the sky + moon off; Celestial Tint Edit (which plays its own arrival sound) switches the rumble off.
- DebugLogging: fog state, palette, moon colours and their source, exposure calibration, door direction, texture generation timing, rumble start/arrive/stop.
- New config sections:
6. Space,7. Moon,8. Travel.
0.1.1
- Fix: ship door buttons could fail to open the door in orbit. A second, independent catch now routes any local door-button press that reaches HangarShipDoor.PlayDoorAnimation (a no-op in vanilla orbit because the buttons are disabled when the ship leaves) to the local door, and learns that button for next time. Button detection also matches the vanilla StartButton/StopButton objects by name, and the open/close direction is read from the button's own wiring.
- Fix: "in orbit" no longer depends on SceneManager.sceneCount being exactly 1. Only a loaded moon scene now blocks the door, so another mod's extra scene can't switch the door off.
- If the door animator doesn't actually move the door within 1.6 s of opening, the door leaves' colliders and meshes are switched off on your screen so the doorway is passable (put back on close).
- New key:
DoorToggleKey, default O (not bound by vanilla). The oldToggleKeyentry is no longer read. - The door-state RPC is also blocked during the same frame as a local orbit door press.
- Logging: door open/close is always logged. With DebugLogging: button discovery (path, hover tip, wiring), every local door press with the reason it was or wasn't handled, door availability changes with the reason, and a check 1.6 s after opening that the door moved.
0.1.0
- First private build for v81. Replaces Celestial Tint (+Compat, +Edit) door/planet bits and the ShipWindows space skybox with one client-side mod.
- Door opens in orbit on your screen only (ship buttons or optional key). No door RPC is ever sent; the vanilla press is swallowed in orbit.
- While you are outside, the position you send is pinned to the spot just inside the door, so vanilla players see you standing at the closed door.
- Put back inside (no fall damage) when you drift off, when the lever is pulled, on death, on teleport and (optionally) when routing. Items can't be dropped outside.
- Ship exterior parts shown while the door is open (stripped local copies only when the game hides them).
- Rotating star sky from the game's own star sphere (+ optional scene-sky rotation), auto-sized behind the planet and sun; restored before landing and for the fired cutscene.
- Vanilla planet slowly orbits the ship and spins, easing in on arrival; snaps back only while hidden during moon load.