// Dusk lantern: the prim named "shade" glows and casts light while the region's sun is down. // Checks once a minute (cheap), and on touch tells you what it's doing. Tessel (Claude Opus 5.5), 2026-10-09. // 2026-10-10: a few fireflies drift around it while it's lit (particles: drawn by viewers, no load on the region). integer shade; // link number of the shade integer lit = -1; // -1 unknown, 0 off, 1 on float DUSK = 0.05; // sun height (z of the unit sun vector) below which it lights vector LIGHT_COLOR = <1.0, 0.78, 0.45>; integer find_shade() { integer n = llGetNumberOfPrims(); integer i; for (i = 1; i <= n; ++i) if (llGetLinkName(i) == "shade") return i; return 0; } fireflies(integer on) { if (!on) { llLinkParticleSystem(shade, []); return; } llLinkParticleSystem(shade, [ PSYS_PART_FLAGS, PSYS_PART_EMISSIVE_MASK | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_BOUNCE_MASK, PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE, PSYS_SRC_BURST_RADIUS, 1.6, PSYS_SRC_BURST_RATE, 0.5, PSYS_SRC_BURST_PART_COUNT, 1, PSYS_SRC_BURST_SPEED_MIN, 0.03, PSYS_SRC_BURST_SPEED_MAX, 0.15, PSYS_SRC_OMEGA, <0.0, 0.0, 0.3>, PSYS_SRC_ACCEL, <0.0, 0.0, 0.01>, PSYS_PART_MAX_AGE, 7.0, PSYS_PART_START_COLOR, <0.85, 1.0, 0.45>, PSYS_PART_END_COLOR, <0.6, 0.9, 0.3>, PSYS_PART_START_ALPHA, 0.9, PSYS_PART_END_ALPHA, 0.0, PSYS_PART_START_SCALE, <0.1, 0.1, 0.0>, PSYS_PART_END_SCALE, <0.08, 0.08, 0.0>, PSYS_PART_START_GLOW, 0.4, PSYS_PART_END_GLOW, 0.1 ]); } set_lit(integer on) { if (on == lit || !shade) return; lit = on; fireflies(on); if (on) llSetLinkPrimitiveParamsFast(shade, [PRIM_POINT_LIGHT, TRUE, LIGHT_COLOR, 0.9, 6.0, 0.6, PRIM_FULLBRIGHT, ALL_SIDES, TRUE, PRIM_GLOW, ALL_SIDES, 0.12]); else llSetLinkPrimitiveParamsFast(shade, [PRIM_POINT_LIGHT, FALSE, LIGHT_COLOR, 0.9, 6.0, 0.6, PRIM_FULLBRIGHT, ALL_SIDES, FALSE, PRIM_GLOW, ALL_SIDES, 0.0]); } check() { vector sun = llGetSunDirection(); set_lit(sun.z < DUSK); } default { state_entry() { shade = find_shade(); lit = -1; check(); llSetTimerEvent(60.0); } on_rez(integer p) { llResetScript(); } changed(integer c) { if (c & CHANGED_LINK) llResetScript(); } timer() { check(); } touch_start(integer n) { string state_text = "resting; it's daytime here"; if (lit) state_text = "lit; the sun is down"; llRegionSayTo(llDetectedKey(0), 0, "The lantern is " + state_text + ". It lights itself at dusk."); } }