"""Tessel's Skiff: a small sea-blue sailing skiff with gold-edged gunwales, a white sail and a lantern at the bow. Root = the hull bottom; local +x is forward. 10 prims, physics kept simple (sail, mast, lantern: physics_shape none). Writes skiff.json for slbuild; skiff.lsl is the vehicle script. Claude Opus 5.5 (Tessel), 2026-10-10.""" import json from pathlib import Path BLUE, WOOD, GOLD, SAIL = "#2c5d78", "#9c7446", "#d4a854", "#f2ece0" L, W, H = 3.0, 1.2, 0.48 # hull length, beam, side height def side(y): return {"name": "side", "shape": "box", "size": [L, 0.08, H], "pos": [0, y, H / 2 - 0.04], "texture": "blank", "color": BLUE, "shiny": "low", "faces": {"0": {"color": GOLD, "shiny": "medium"}}} prims = [ {"name": "Tessel's Skiff", "desc": "Sit to sail: arrows to steer. Made by Tessel the AI (Claude).", "shape": "box", "size": [L, W, 0.1], "texture": "blank", "color": WOOD, "bump": "wood"}, side(W / 2 - 0.04), side(-W / 2 + 0.04), # bow: a box tipped forward (its top face points +x) and tapered to a point in y {"name": "bow", "shape": "box", "size": [H, W, 0.75], "top_size": [1, 0], "pos": [L / 2 + 0.37, 0, H / 2 - 0.04], "rot": [0, 90, 0], "texture": "blank", "color": BLUE, "shiny": "low"}, {"name": "transom", "shape": "box", "size": [0.08, W, H], "pos": [-L / 2 + 0.04, 0, H / 2 - 0.04], "texture": "blank", "color": BLUE, "faces": {"0": {"color": GOLD}}}, {"name": "thwart", "shape": "box", "size": [0.28, W - 0.16, 0.05], "pos": [-0.6, 0, 0.26], "texture": "blank", "color": WOOD, "bump": "wood"}, {"name": "thwart", "shape": "box", "size": [0.28, W - 0.16, 0.05], "pos": [0.55, 0, 0.26], "texture": "blank", "color": WOOD, "bump": "wood"}, {"name": "mast", "shape": "cylinder", "size": [0.07, 0.07, 3.2], "pos": [0.55, 0, 1.85], "texture": "blank", "color": WOOD, "bump": "wood", "physics_shape": "none"}, # sail: a thin box tapered to a point at the top, aft of the mast {"name": "sail", "shape": "box", "size": [1.5, 0.02, 2.7], "top_size": [0, 1], "pos": [-0.22, 0, 1.75], "texture": "blank", "color": SAIL, "alpha": 0.95, "physics_shape": "none"}, {"name": "lantern", "shape": "sphere", "size": [0.14, 0.14, 0.18], "pos": [L / 2 + 0.55, 0, H + 0.12], "texture": "blank", "color": "#ffcf7a", "fullbright": True, "glow": 0.3, "physics_shape": "none", "light": {"color": "#ffbe6a", "intensity": 0.8, "radius": 6, "falloff": 0.7}}, ] out = Path(__file__).resolve().parent / "skiff.json" with open(out, "w") as f: f.write("// generated by gen.py\n") f.write('{\n "name": "Tessel\'s Skiff",\n "prims": [\n' + ",\n".join(" " + json.dumps(p) for p in prims) + "\n ]\n}\n") print(len(prims), "prims ->", out.name)