<!-- SAGA · part 57 -->
elected.traverse(function(o){ if(o.isMesh){ o.material = o.material.clone(); o.material.color.setHex(colors[Math.floor(Math.random()*colors.length)]); } });
      } else {
        tgt.material = tgt.material.clone();
        tgt.material.color.setHex(colors[Math.floor(Math.random()*colors.length)]);
        if(typeof say === 'function') say('Layer ' + (selected.userData.selLayer + 1) + ' recolored');
        return;
      }
      if(typeof say === 'function') say('Recolored');
    } else if(name === 'move'){
      var tgt = ringTarget();
      var oldX = tgt.position.x;
      tgt.position.x += 5;
      if(wouldOverlap(selected)){ tgt.position.x = oldX; if(typeof say === 'function') say('Blocked \u2014 would overlap'); }
    } else if(name === 'rotate'){
      ringTarget().rotation.y += Math.PI/4;
    } else if(name === 'layer'){
      var layers = selected.userData.layers;
      if(!layers || layers.length <= 1){ if(typeof say === 'function') say('One layer'); return; }
      var cur = selected.userData.selLayer + 1;
      if(cur >= layers.length) cur = -1;
      selected.userData.selLayer = cur;
      refreshLayerBtn();
      if(typeof say === 'function') say(cur < 0 ? 'Whole block' : 'Layer ' + (cur + 1) + ' of ' + layers.length + ' — largest first');
    } else if(name === 'delete'){
      var lt = ringTarget();
      if(lt !== selected && lt.parent){
        lt.parent.remove(lt);
        tagLayers(selected);
        selected.userData.selLayer = -1;
        refreshLayerBtn();
        if(typeof say === 'function') say('Layer removed');
        return;
      }
      scene.remove(selected);
      var di = placedBlocks.indexOf(selected);
      if(di > -1) placedBlocks.splice(di, 1);
      undoStack.push({action:'remove', obj:selected});
      selected = null;
      hideRing();
      if(typeof say === 'function') say('Deleted');
    }
  }
  window._updateBlockRing = function(){
    if(!ringBlock){ ringEl.style.display = 'none'; return; }
    if(!window._sagaCamera) return;
    if(!ringBlock.parent){ hideRing(); return; }
    var v = new THREE.Vector3();
    ringBlock.getWorldPosition(v);
    v.project(window._sagaCamera);
    if(v.z > 1){ ringEl.style.display = 'none'; return; }
    ringEl.style.display = 'block';
    var cx = (v.x * 0.5 + 0.5) * window.innerWidth;
    var cy = (-v.y * 0.5 + 0.5) * window.innerHeight;
    var btns = ringEl.children;
    var R = 86;
    for(var i = 0; i < btns.length; i++){
      var a = (i / btns.length) * Math.PI * 2 - Math.PI / 2;
      btns[i].style.left = (cx + Math.cos(a) * R - 26) + 'px';
      btns[i].style.top = (cy + Math.sin(a) * R - 26) + 'px';
    }
  };
  window.openCreator = function(){
    hideRing();
    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){}
    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){
      