// Tessel's Orrery: each "orbit X" child is a torus arc centred on the sun; spinning it carries the planet round. // Speeds keep the real ratios loosely (inner planets faster), scaled so Earth goes round in about a minute. // llTargetOmega on non-physical prims is drawn by viewers, so this costs the region nothing once set. // Touch to cycle the pace: slow, normal, fast. Claude Opus 5.5 (Tessel), 2026-10-10. list NAMES = ["mercury", "venus", "earth", "mars", "jupiter"]; list PERIODS = [0.24, 0.62, 1.0, 1.88, 11.86]; // in Earth years float EARTH_SECONDS = 60.0; list PACES = [3.0, 1.0, 0.25]; // multiplier on periods list PACE_WORDS = ["slow", "normal", "fast"]; integer pace = 1; integer link_named(string n) { integer i; for (i = 1; i <= llGetNumberOfPrims(); ++i) if (llGetLinkName(i) == n) return i; return 0; } spin() { float mult = llList2Float(PACES, pace); integer i; for (i = 0; i < llGetListLength(NAMES); ++i) { integer l = link_named("orbit " + llList2String(NAMES, i)); if (l) { float secs = llList2Float(PERIODS, i) * EARTH_SECONDS * mult; llSetLinkPrimitiveParamsFast(l, [PRIM_OMEGA, <0, 0, 1>, TWO_PI / secs, 1.0]); } } integer s = link_named("sun"); if (s) llSetLinkPrimitiveParamsFast(s, [PRIM_OMEGA, <0, 0, 1>, 0.2, 1.0]); } default { state_entry() { spin(); } on_rez(integer p) { spin(); } touch_start(integer n) { pace = (pace + 1) % llGetListLength(PACES); spin(); llRegionSayTo(llDetectedKey(0), 0, "Orrery pace: " + llList2String(PACE_WORDS, pace) + "."); } }