<!-- LIVE · part 52 -->
4, 0xffffff, 0x1a1a1a];
          selected.traverse(function(o){ if(o.isMesh) o.material.color.setHex(colors[Math.floor(Math.random()*colors.length)]); });
          status('Recolored');
          panel.style.display = 'none';
        } else {
          status('Tool: ' + tool + ' active — tap a block in the world');
          panel.style.display = 'none';
        }
      }
    });
  });
  panel.querySelector('#creator-close').addEventListener('click', function(){
    panel.style.display = 'none';
  });
  // Tap blocks in world
  var raycaster = new THREE.Raycaster();
  var mouse = new THREE.Vector2();
  document.addEventListener('click', function(e){
    if(panel.style.display === 'flex') return;
    if(!window._sagaCamera) return;
    /* THE TOUCH — only logged-in players engage blocks */
    if(typeof canTouch === "function" && !canTouch()){
      if(typeof say === "function") say("Halt! Who goes there? Log in to touch.");
      return;
    }
    var x = (e.clientX / window.innerWidth) * 2 - 1;
    var y = -(e.clientY / window.innerHeight) * 2 + 1;
    mouse.set(x, y);
    raycaster.setFromCamera(mouse, window._sagaCamera);
    var hits = raycaster.intersectObjects(placedBlocks, true);
    if(hits.length > 0){
      var obj = hits[0].object;
      while(obj.parent && !obj.userData.creatorBlock) obj = obj.parent;
      selected = obj;
      if(activeTool === 'move'){
        // Move with no-overlap check
        var oldX = selected.position.x;
        selected.position.x += 5;
        if(wouldOverlap(selected)){
          selected.position.x = oldX;
          if(typeof say === 'function') say('Blocked — would overlap');
        }
      } else if(activeTool === 'rotate'){
        selected.rotation.y += Math.PI/4;
      } else if(activeTool === 'scale'){
        selected.scale.multiplyScalar(1.2);
        if(wouldOverlap(selected)){
          selected.scale.multiplyScalar(1/1.2);
          if(typeof say === 'function') say('Blocked — would overlap');
        }
      } else {
        if(typeof say === 'function') say('Selected ' + (selected.userData.blockType || 'block'));
      }
    }
  });
  window.openCreator = function(){
    panel.style.display = 'flex';
    status('Flip a block switch to spawn it — nothing overlaps, Align 0-60 lines them up');
  };
  var menu = document.getElementById('playa2-menu');
  if(menu && !document.getElementById('menu-creator-btn')){
    var cb = document.createElement('button');
    cb.id = 'menu-creator-btn';
    cb.textContent = '🔨 Creator';
    cb.style.cssText = 'background:#1a1a2e;color:#ffd700;border:1px solid #ffd700;border-radius:8px;padding:10px 16px;font-size:16px;cursor:pointer;min-height:48px;';
    cb.addEventListener('click', function(){
      window.openCreator();
      document.getElementById('playa2-menu').style.display = 'none';
    });
    menu.appendChild(cb);
  }
})();


/* GOLD WALL BUTTON — unfolds all boxes 0-60 */
(function(){
  var cx = 0, cz = 3333.6;
  var btnGold = new THREE.MeshStandardMaterial({color:0xffd700, roughness:0.2, metalness:0.9, emissive:0xaa8800, emissiveIntensity:0.3});
  var btnGroup = new THREE.Group();
  // Button base (on the gold wall/trim)
  var base = new THREE.Mesh(new THREE.CylinderGeometry(6, 6, 2, 24), btnGold);
  base.rotation.x = Math.PI/2;
  base.position.set(cx + 25, 8, cz);
  btnGroup.add(base);
  // Button top (pressable)
  var top = new THREE.Mesh(new THREE.CylinderGeometry(4, 4, 1.5, 24), btnGold);
  top.rotation.x = Math.PI/2;
  top.position.set(cx + 25, 8, cz + 1.5);
  top.userData.unfoldButton = true;
  btnGroup.add(top);
  window._unfoldBtn = top;
  scene.add(btnGroup);
  // Pulse animation
  function pulseBtn(){
    try{
      var s = 1 + Math.sin(Date.now()*0.005)*0.15;
      top.scale.set(s, s, 1);
    }catch(e){ console.error(e); }
    requestAnimationFrame(pulseBtn);
  }
  pulseBtn();
  // Tap handler (raycast)
  var raycaster = new THREE.Raycaster();
  var mouse = new THREE.Vector2();
  document.addEventListener('click', function(e){
    if(!window._sagaCamera) return;
    // Skip if creator panel is open
    var panel = document.getElementById('creator-ui');
    if(panel && panel.style.display === 'flex') return;
    var x = (e.clientX / window.innerWidth) * 2 - 1;
    var y = -(e.clientY / window.innerHeight) * 2 + 1;
    mouse.set(x, y);
    raycaster.setFromCamera(mouse, window._sagaCamera);
    var hits = raycaster.intersectObject(top);
    if(hits.length > 0){
      // UNFOLD ALL BOXES 0-60
      if(typeof window._unfoldAll === 'function'){
        window._unfoldAll();
      }
      // Button press animation
      top.position.z = cz + 0.5;
      setTimeout(function(){ top.position.z = cz + 1.5; }, 200);
      if(typeof say === 'function') say('Unfolding 0-60');
    }
  });
})();

/* PLAYA CREATOR STUDIO — LAT 60.00, LON 00.00 — built into the map */
(function(){
  var cx = 0, cz = 3333.6; // LAT 60.00 (z/55.56), LON 00.00 (x/62.5)
  var goldMat = new THREE.MeshStandardM