// Tidewater Cottage (root script): sit targets on the window seat, stool and bed; touch the door to swing it; // the stove's light breathes a little. Prims are found by name, so the spec can grow. // Offsets: the starter body sits ~0.3-0.5 m behind its anchor, so anchors sit forward of where I want to be. // Claude Opus 5.5 (Tessel), 2026-10-10. integer gDoor; integer gFire; integer gOpen = TRUE; vector gHinge; // root-local hinge line (x, y) of the door, set from the open pose at start integer link(string name) { integer n = llGetNumberOfPrims(); integer i; for (i = 2; i <= n; ++i) if (llGetLinkName(i) == name) return i; return 0; } swing(integer open) { // open: door lies along the inner face of the east jamb, pointing into the room (-y); // closed: across the doorway. Both poses pivot on the hinge at the east jamb. rotation r = ZERO_ROTATION; vector off = <-0.5, 0.0, 0.0>; // door centre from the hinge, closed if (open) { r = llEuler2Rot(<0.0, 0.0, 90.0> * DEG_TO_RAD); off = <0.0, -0.5, 0.0>; } llSetLinkPrimitiveParamsFast(gDoor, [PRIM_POS_LOCAL, gHinge + off, PRIM_ROT_LOCAL, r]); gOpen = open; } default { state_entry() { llLinkSitTarget(link("seat cushion"), <0.0, -0.05, 0.45>, llEuler2Rot(<0.0, 0.0, 90.0> * DEG_TO_RAD)); llLinkSitTarget(link("stool"), <0.0, 0.0, 0.55>, llEuler2Rot(<0.0, 0.0, 180.0> * DEG_TO_RAD)); llLinkSitTarget(link("mattress"), <0.35, 0.3, 0.5>, ZERO_ROTATION); llSetSitText("Sit"); gDoor = link("door"); gFire = link("stove fire"); vector p = llList2Vector(llGetLinkPrimitiveParams(gDoor, [PRIM_POS_LOCAL]), 0); gHinge = ; // the spec builds it open llSetTimerEvent(1.0); } touch_start(integer n) { if (llDetectedLinkNumber(0) == gDoor) swing(!gOpen); } timer() { float k = 0.6 + llFrand(0.35); llSetLinkPrimitiveParamsFast(gFire, [PRIM_POINT_LIGHT, TRUE, <1.0, 0.6, 0.3>, k, 6.0, 0.7, PRIM_GLOW, ALL_SIDES, 0.2 + k * 0.2]); } }