<!-- LIVE · part 53 -->
aterial({color:0xd4a017, roughness:0.4, metalness:0.6});
  var darkMat = new THREE.MeshStandardMaterial({color:0x1a1a1a, roughness:0.7});
  var marbleMat = new THREE.MeshStandardMaterial({color:0xf5f5f5, roughness:0.3});
  var cyanMat = new THREE.MeshStandardMaterial({color:0x00ccff, roughness:0.3, metalness:0.5, emissive:0x0088aa, emissiveIntensity:0.5});
  var g = new THREE.Group();
  g.position.set(cx, 0, cz);
  // Foundation platform (large)
  var plat = new THREE.Mesh(new THREE.CylinderGeometry(30, 32, 2, 32), darkMat);
  plat.position.y = 1; plat.receiveShadow = true; g.add(plat);
  var trim = new THREE.Mesh(new THREE.TorusGeometry(30, 0.8, 12, 64), goldMat);
  trim.rotation.x = Math.PI/2; trim.position.y = 2; g.add(trim);
  // THE 4 SIGNATURE BLOCKS (from epistles.xyz/playa block picker)
  // 1. Hourglass V-Core (centerpiece)
  var hg = new THREE.Group();
  var top = new THREE.Mesh(new THREE.ConeGeometry(4, 6, 4), goldMat);
  top.position.y = 3; top.rotation.x = Math.PI; hg.add(top);
  var bot = new THREE.Mesh(new THREE.ConeGeometry(4, 6, 4), goldMat);
  bot.position.y = -3; hg.add(bot);
  hg.position.y = 12; g.add(hg);
  // 2. Refined Pylon
  var pylon = new THREE.Mesh(new THREE.CylinderGeometry(1.5, 2, 14, 8), marbleMat);
  pylon.position.set(18, 9, 0); pylon.castShadow = true; g.add(pylon);
  // 3. Hollow Tetra
  var tetra = new THREE.Mesh(new THREE.TetrahedronGeometry(5), cyanMat);
  tetra.position.set(-18, 9, 0); tetra.castShadow = true; g.add(tetra);
  // 4. Layered Pyramid
  var pyr1 = new THREE.Mesh(new THREE.ConeGeometry(6, 4, 4), goldMat);
  pyr1.position.set(0, 6, 18); g.add(pyr1);
  var pyr2 = new THREE.Mesh(new THREE.ConeGeometry(4, 3, 4), marbleMat);
  pyr2.position.set(0, 9.5, 18); g.add(pyr2);
  var pyr3 = new THREE.Mesh(new THREE.ConeGeometry(2, 2, 4), cyanMat);
  pyr3.position.set(0, 12, 18); g.add(pyr3);
  // Portal door (to epistles.xyz/playa)
  var doorFrame = new THREE.Mesh(new THREE.BoxGeometry(8, 12, 1), goldMat);
  doorFrame.position.set(0, 8, -20); g.add(doorFrame);
  var doorGlow = new THREE.Mesh(new THREE.PlaneGeometry(6, 10),
    new THREE.MeshStandardMaterial({color:0x00ccff, emissive:0x00aacc, emissiveIntensity:1.0}));
  doorGlow.position.set(0, 8, -19.4); g.add(doorGlow);
  // Rotating beacon (marks the location)
  var beacon = new THREE.Mesh(new THREE.CylinderGeometry(0.5, 0.5, 30, 8), cyanMat);
  beacon.position.y = 25; g.add(beacon);
  window._creatorStudioBeacon = beacon;
  scene.add(g);
  // Animate: hourglass spins, beacon pulses
  function animateStudio(){
    try{
      hg.rotation.y += 0.01;
      tetra.rotation.y += 0.02;
      var s = 1 + Math.sin(Date.now()*0.003)*0.1;
      beacon.scale.set(s, 1, s);
    }catch(e){ console.error(e); }
    requestAnimationFrame(animateStudio);
  }
  animateStudio();
  if(typeof trackNewThing === 'function') trackNewThing('creatorstudio', 'Playa Creator Studio at LAT 60.00, LON 00.00');
})();


/* THE COIN — LAT 100.0, LON 0.0 — the real coin from coin.html, flips forever, thieves burn */
(function(){
  var vx = 0, vz = 5556;
  var coinG = new THREE.Group();
  coinG.position.set(vx, 120, vz);
  scene.add(coinG);
  window._theCoin = coinG;
  // Load the real coin textures (SOLID front, Epistolary back)
  var loader = new THREE.TextureLoader();
  loader.load('/saga2/solid-coin.png', function(frontTex){
    loader.load('/saga2/epistolary-coin.png', function(backTex){
      var edgeMat = new THREE.MeshStandardMaterial({color:0xc9a54f, roughness:0.25, metalness:0.9});
      var frontMat = new THREE.MeshStandardMaterial({map:frontTex, roughness:0.35, metalness:0.6});
      var backMat = new THREE.MeshStandardMaterial({map:backTex, roughness:0.35, metalness:0.6});
      var coinGeo = new THREE.CylinderGeometry(40, 40, 8, 64);
      var coin = new THREE.Mesh(coinGeo, [edgeMat, frontMat, backMat]);
      coin.rotation.x = Math.PI/2;
      coinG.add(coin);
      // Gold ridges (both faces)
      var ridgeGeo = new THREE.TorusGeometry(39, 1, 12, 64);
      var ridgeF = new THREE.Mesh(ridgeGeo, edgeMat);
      ridgeF.position.z = 4; coinG.add(ridgeF);
      var ridgeB = new THREE.Mesh(ridgeGeo, edgeMat);
      ridgeB.position.z = -4; coinG.add(ridgeB);
    });
  });
  // Flip animation + burn trap
  var burnCooldown = 0;
  function animateCoin(){
    try{
      // Flip end-over-end forever
      coinG.rotation.x += 0.02;
      coinG.rotation.y += 0.01;
      // Burn trap: if player gets close, they burn
      if(typeof playerBody !== 'undefined' && playerBody && playerBody.position){
        var dx = playerBody.position.x - vx;
        var dz = playerBody.position.z - vz;
        var dist = Math.sqrt(dx*dx + dz*dz);
        var now = Date.now();
        if(dist < 80 && now > burnCooldown){
          burnCooldown = now + 2000;
          // Flash red
          var flash = document.createElement('div');
          flash.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;' +
            'background