<!-- RUBY-BACKUP · part 413 -->
 onclick="recolorConnections()">APPLY</button><br>'+
        'FILL: <button onclick="fillGaps()">GAPS</button><br>'+
        '<button onclick="sc()" style="margin-top:5px">CLOSE</button>';
      document.body.appendChild(p);
    }
    p.style.display='block';
    syncSC();
  }else if(p){ p.style.display='none'; }
  codeStatus(SC_ON?'Soliditronium online':'Soliditronium offline');
}
function setDim(d){ BUILD_DIM=d; codeStatus('dimensionality '+d+'D'); syncSC(); }
function scWpSet(){ var n=prompt('waypoint name:'); if(n) setWaypoint(n); }
function scWpGo(){ var n=prompt('go to waypoint:'); if(n) goWaypoint(n); }
function scConnColor(){ var col=prompt('connection color:', getConnColor()); if(col) setConnColor(col); }
function scConnTex(){ var tx=prompt('connection texture:', getConnTex()); if(tx) setConnTex(tx); }
function spawnMoveHelp(){ codeStatus('use: spawnpt <x> <z> to move spawn point'); }
function syncSC(){
  var b=document.getElementById('sc-move');
  if(b){ b.textContent=MOVE_MODE?'ON':'OFF'; b.style.background=MOVE_MODE?'#0ff':'#333'; }
}
/* faster rendering — batch DOM updates */
var scBatch=null;
function scFast(fn){
  if(scBatch) cancelAnimationFrame(scBatch);
  scBatch=requestAnimationFrame(fn);
}

/* SOLIDITRONIUM DOME — physical futuristic dome with door */
var DOME_CX = 25, DOME_CZ = 25, DOME_R = 5;
var DOME_BUILT = false;

/* CONTROL DESK — categorized code browser, 25 per page */
var DESK_CATS = {
  'Building': ['b','spawnpt','spawnat','dim','fillgaps','builddome','s1','g','u','f','w'],
  'Moving': ['movemode','sgo','spiral','walk','fly','attach'],
  'Camera': ['vmefar','vmehalf','vmequarter','vmeclose','vmeyes','vtoggle','vfront','vback','vleft','vright','vtop','look','lookme','seeme'],
  'Map': ['holomap','wp','gowp','wps','newmap','mirror','kingdom','myhome'],
  'Objects': ['conncolor','conntex','recolor','lock','unlock','wear'],
  'System': ['soliditronium','continuum','creator','help','views','saveme','loadme']
};
var DESK_CAT = 'Building', DESK_PAGE = 0, DESK_PAD = [];
function showDesk(){
  var d = document.getElementById('controldesk');
  if(!d){
    d = document.createElement('div');
    d.id = 'controldesk';
    d.style.cssText = 'position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:10000;background:rgba(0,10,20,0.95);border:2px solid #00ffff;border-radius:12px;padding:15px;color:#fff;font:12px monospace;max-width:400px;max-height:80vh;overflow:auto;';
    document.body.appendChild(d);
  }
  d.style.display = 'block';
  renderDesk();
}
function renderDesk(){
  var d = document.getElementById('controldesk');
  if(!d) return;
  var codes = DESK_CATS[DESK_CAT] || [];
  var perPage = 25;
  var pages = Math.ceil(codes.length/perPage);
  var start = DESK_PAGE*perPage;
  var pageCodes = codes.slice(start, start+perPage);
  var html = '<b style="color:#0ff">CONTROL DESK — '+DESK_CAT+'</b> ';
  html += '<button onclick="hideDesk()">EXIT</button><br><br>';
  /* categories */
  html += 'CAT: ';
  for(var cat in DESK_CATS){
    html += '<button onclick="deskCat(\''+cat+'\')"'+(cat===DESK_CAT?' style="background:#0ff"':'')+'>'+cat+'</button> ';
  }
  html += '<br><br>';
  /* codes */
  pageCodes.forEach(function(code){
    var inPad = DESK_PAD.indexOf(code)>=0;
    html += '<div style="padding:3px;border-bottom:1px solid #033">';
    html += '<span style="color:#0ff">'+code+'</span> ';
    html += '<button onclick="deskInfo(\''+code+'\')">INFO</button> ';
    html += '<button onclick="deskAdd(\''+code+'\')"'+(inPad?' disabled':'')+'>'+(inPad?'IN PAD':'+ PAD')+'</button>';
    html += '</div>';
  });
  /* pagination */
  html += '<br>';
  if(DESK_PAGE>0) html += '<button onclick="deskPage(-1)">PREV</button> ';
  html += 'Page '+(DESK_PAGE+1)+'/'+Math.max(1,pages)+' ';
  if(DESK_PAGE<pages-1) html += '<button onclick="deskPage(1)">NEXT</button>';
  html += '<br><br><b>Chart Pad ('+DESK_PAD.length+'):</b> '+DESK_PAD.join(', ');
  d.innerHTML = html;
}
function deskCat(cat){ DESK_CAT=cat; DESK_PAGE=0; renderDesk(); }
function deskPage(d){ DESK_PAGE+=d; renderDesk(); }
function deskInfo(code){ codeStatus(code+' — use the code directly, or add to pad'); }

/* TUTORIAL — simple steps for new users */
var TUT_STEP = 0;
function tutorial(){
  var steps = [
    'Step 1: Type "soliditronium" — the dome rises.',
    'Step 2: Type "enter" — you go inside, crown camera.',
    'Step 3: The desk opens. Pick a category (Building, Moving...).',
    'Step 4: Tap + PAD on codes you like. They gather.',
    'Step 5: Tap EXIT — you carry the Continuum.',
    'Step 6: Type "continuum" anywhere — your pad opens.',
    'Done! You know the Soliditronium. Now play.'
  ];
  codeStatus(steps[TUT_STEP % steps.length] + ' (tutorial '+(TUT_STEP%steps.length+1)+'/'+steps.length+')');
  TUT_STEP++;
}
/* KID FUN — the ancestors' gifts */
function kidPlay(){
  /* random colorful creation at spawn */
  var sp = getSpawnPoint();
  var colors = ['#ff0000','#ff8800','#ffff00','#00f