<!-- SAGA · part 55 -->
ry(0.5, 4, 2.5), goldm, 0, 18, 0);
      var px = 0, pz = 0;
      if(typeof kingPos !== 'undefined'){ px = kingPos.x || 0; pz = kingPos.z || 0; }
      g.position.set(px + 40, 0, pz + 40);
      g.userData.creatorBlock = true;
      g.userData.castle = true;
      scene.add(g);
      placedBlocks.push(g);
      undoStack.push({action:'add', obj:g});
      tagLayers(g);
      cascadeIn(g);
      if(window.logBuild) window.logBuild('castle raised');
      if(typeof say === 'function') say('Castle rising — large to small');
    }catch(e){ if(typeof say === 'function') say('The castle stumbled'); }
  };
  function ringTarget(){
    if(selected && selected.userData.selLayer >= 0 && selected.userData.layers && selected.userData.layers[selected.userData.selLayer])
      return selected.userData.layers[selected.userData.selLayer];
    return selected;
  }
  function refreshLayerBtn(){
    var lb = ringEl.querySelector('[aria-label="layer"]');
    if(!lb) return;
    if(selected && selected.userData.layers && selected.userData.layers.length > 1 && selected.userData.selLayer >= 0)
      lb.textContent = 'L' + (selected.userData.selLayer + 1);
    else lb.textContent = '\u25c8';
  }
  // AUTO-ALIGN 60-300+: start at 60, 10 units apart, extends past 300 if needed
  function autoAlign(){
    placedBlocks.forEach(function(b, i){
      var x = 60 + (i * 10);
      b.position.x = x;
      b.position.z = 0;
    });
    var endX = 60 + ((placedBlocks.length - 1) * 10);
    status('Aligned 60-' + endX + ': ' + placedBlocks.length + ' blocks in a straight line');
  }
  window._unfoldAll = autoAlign; // exposed for gold wall button
  function spawnBlock(type){
    var b = makeBlock(type);
    var px = 0, pz = 0;
    if(window._sagaCamera){ px = window._sagaCamera.position.x; pz = window._sagaCamera.position.z; }
    // Try to place without overlap (spiral out if needed)
    b.position.set(px + 20, 10, pz + 20);
    b.userData.creatorBlock = true;
    b.userData.blockType = type;
    var attempts = 0;
    while(wouldOverlap(b) && attempts < 20){
      attempts++;
      b.position.x += 8;
      b.position.z += 8;
    }
    if(wouldOverlap(b)){
      status('Cannot place — no space (overlap prevented)');
      return;
    }
    scene.add(b);
    placedBlocks.push(b);
    undoStack.push({action:'add', obj:b});
    selected = b;
    status('Spawned ' + type + ' (' + placedBlocks.length + ' total)');
  }
  // Toggle switches
  function setToggle(el, on){
    if(on) el.classList.add('on');
    else el.classList.remove('on');
  }
  // Block toggles (flip ON to spawn)
  panel.querySelectorAll('[data-block]').forEach(function(toggle){
    toggle.addEventListener('click', function(){
      var isOn = toggle.classList.contains('on');
      // Turn off all block toggles (mutual exclusion)
      panel.querySelectorAll('[data-block]').forEach(function(t){ setToggle(t, false); });
      if(!isOn){
        setToggle(toggle, true);
        spawnBlock(toggle.getAttribute('data-block'));
        // Auto-reset after spawn (panel stays open)
        setTimeout(function(){ setToggle(toggle, false); }, 500);
      }
      // Panel stays open — close with ✕ when done
    });
  });
  // Tool toggles
  panel.querySelectorAll('[data-tool]').forEach(function(toggle){
    toggle.addEventListener('click', function(){
      var tool = toggle.getAttribute('data-tool');
      var isOn = toggle.classList.contains('on');
      panel.querySelectorAll('[data-tool]').forEach(function(t){ setToggle(t, false); });
      if(tool === 'align'){
        autoAlign();
        // Panel stays open
        return;
      }
      if(tool === 'undo' && undoStack.length > 0){
        var last = undoStack.pop();
        if(last.action === 'add'){
          scene.remove(last.obj);
          var idx = placedBlocks.indexOf(last.obj);
          if(idx > -1) placedBlocks.splice(idx, 1);
        } else if(last.action === 'remove'){
          scene.add(last.obj);
          placedBlocks.push(last.obj);
        }
        status('Undone');
        return;
      }
      if(!isOn){
        setToggle(toggle, true);
        activeTool = tool;
        if(tool === 'duplicate' && selected){
          var copy = makeBlock(selected.userData.blockType);
          copy.position.copy(selected.position);
          copy.position.x += 10;
          copy.userData.creatorBlock = true;
          copy.userData.blockType = selected.userData.blockType;
          if(!wouldOverlap(copy)){
            scene.add(copy);
            placedBlocks.push(copy);
            undoStack.push({action:'add', obj:copy});
            status('Duplicated');
          } else {
            status('Cannot duplicate — would overlap');
          }
          // Panel stays open
        } else if(tool === 'delete' && selected){
          scene.remove(selected);
          var di = placedBlocks.indexOf(selected);
          if(di > -1) placedBlocks.splice(di, 1);
          undoStack.push({action:'remove', obj:sele