<!-- SAGA3 · part 51 -->
lid Notes'},
      {x: -250, z: 110, look: [-250, 8, 150], msg: 'THE CODEX VAULT — sealed packs'},
      {x: -200, z: 260, look: [-200, 8, 250], msg: "THE GATE — Signet's threshold"},
      {x: 150, z: 130, look: [150, 2, 150], msg: 'THE SHOE — where we mastered intricacy'},
      {x: -150, z: 130, look: [-150, 10, 150], msg: '40 DAYS OF NIGHT — memorial'},
      {x: 45, z: 40, look: [45, 10, 60], msg: 'THE WORMHOLE — to Playa 2.0'},
      {x: 2000, z: 2000, look: [2000, 60, 1920], msg: "AHUPUA'A 1 — mountain to sea"},
      {x: -2000, z: 2000, look: [-2000, 60, 1920], msg: "AHUPUA'A 2 — cradling the earth"},
      {x: 0, z: -2500, look: [0, 60, -2580], msg: "AHUPUA'A 3 — the valley"},
      {x: 3000, z: 0, look: [3100, 5, 0], msg: 'SHORELINE 1 — beach'},
      {x: 3000, z: 500, look: [3100, 5, 500], msg: 'SHORELINE 2 — palms'},
      {x: 3000, z: 1000, look: [3100, 5, 1000], msg: 'SHORELINE 3 — the ocean'},
      {x: 0, z: 3000, look: [0, 310, 3000], msg: 'SKY 1 — ships hovering'},
      {x: 500, z: 3000, look: [500, 360, 3000], msg: 'SKY 2 — the fleet'},
      {x: -500, z: 3000, look: [-500, 410, 3000], msg: 'SKY 3 — spacescape'},
      {x: -3000, z: -2000, look: [-3000, 80, -2000], msg: 'PEAK 1 — snow'},
      {x: -2500, z: -2000, look: [-2500, 80, -2000], msg: 'PEAK 2 — rivers'},
      {x: -2000, z: -2000, look: [-2000, 80, -2000], msg: 'PEAK 3 — the bridge'}
    ];
    window._tourIdx = (window._tourIdx || 0) % stops.length;
    var st = stops[window._tourIdx];
    kingPos.set(st.x, 0, st.z);
    if(typeof camYaw !== 'undefined'){
      var dx = st.look[0] - st.x, dz = st.look[2] - st.z;
      camYaw = Math.atan2(dz, dx);
    }
    say(st.msg + ' (' + (window._tourIdx + 1) + '/' + stops.length + ')');
    window._tourIdx++;
  } },
  clearspawn: { cat: 'System', desc: 'Clear saved spawn', fn: function(){
    try{ localStorage.removeItem('saga-spawn'); }catch(e){}
    say('spawn cleared');
  } },
  freecam: { cat: 'Camera', desc: 'Free moving camera — detaches from player', fn: function(){
    window._freecam = !window._freecam;
    if(window._freecam){
      say('free camera — move with joystick');
    } else {
      say('camera follows you');
    }
  } },
  newbody: { cat: 'Build', desc: 'Spawn a new body', fn: function(){ spawnNewBody(); } },
  wall: { cat: 'Build', desc: 'Build the 56-button wall', fn: function(){ buildButtonWall(); } },
  'deletefreeze1': {cat:'Royal', hidden:true, desc:'The King\'s override — unfreeze the mastered mechanics', fn:function(){
    if(typeof window.deletefreeze1 === 'function'){
      var m = window.deletefreeze1();
      say('freeze lifted by the King');
    } else if(typeof MASTER_MECHANICS !== 'undefined'){
      /* Fallback: create mutable copy directly */
      try {
        window.MASTER_MECHANICS_LIVE = JSON.parse(JSON.stringify(MASTER_MECHANICS));
        say('freeze lifted by the King');
      } catch(e){ say('freeze holds'); }
    } else {
      say('no freeze found');
    }
  }},
  /* SPECIAL */
  'bam':      {cat:'Special', desc:'Direct build — bam box 10, bam box 10 x5, bam wall 10 line 5', fn:doBam},
  'mk':       {cat:'Special', desc:'Alias for bam', fn:doBam},
  'again':    {cat:'Special', desc:'Repeat last bam', fn:function(){
    if(lastBam) doBam([lastBam.shape, String(lastBam.size)]);
    else say('no bam yet');
  }},
  'bamtest':  {cat:'Special', desc:'Backup test build', fn:function(){
    try{ localStorage.setItem('coders100-test', 'ok'); say('backup works'); }
    catch(e){ say('backup failed'); }
  }},
  'solidfast':{cat:'Special', desc:'100% speed', fn:function(){ say('full speed'); }},
  'whereami': {cat:'Special', desc:'Exact coordinates', fn:function(){
    say(Math.round(kingPos.x)+', '+Math.round(kingPos.z));
  }},
  'listall':  {cat:'Special', desc:'Count objects', fn:function(){
    say(scene.children.length + ' things');
  }},
  'tp':       {cat:'Special', desc:'Teleport — tp 600 600', fn:function(a){
    if(a.length>=2){ kingPos.x=parseFloat(a[0])||0; kingPos.z=parseFloat(a[1])||0; say('at '+kingPos.x+', '+kingPos.z); }
    else say('tp x z');
  }},
  'intaglio': {cat:'Special', desc:'Ultra-dense linework mode', fn:function(){ say('intaglio on'); }},
  'nightcity':{cat:'Special', desc:'Night lighting', fn:function(){
    scene.background=new THREE.Color(0x0b0906); scene.fog.color=new THREE.Color(0x0b0906); say('night');
  }},
  'daycity':  {cat:'Special', desc:'Day lighting', fn:function(){
    scene.background=new THREE.Color(0x4a0e0e); scene.fog.color=new THREE.Color(0x4a0e0e); say('day');
  }},
  'exportfbx':{cat:'Special', desc:'Export scene as FBX', fn:function(){ say('fbx export — coming'); }},

  /* CAMERA */
  'vfront': {cat:'Camera', desc:'Front view', fn:function(){ camYaw=0; camPitch=0.35; camDist=12; }},
  'vback':  {cat:'Camera', desc:'Back view', fn:function(){ camYaw=Math.PI; camPitch=0.35; camDist=12; }},
  'vleft':  {cat:'Camera', desc:'Left view', fn:function(){ camYaw=Math.PI/2; camPitch=