<!-- LIVE · part 58 -->
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=0.35; camDist=12; }},
  'vright': {cat:'Camera', desc:'Right view', fn:function(){ camYaw=-Math.PI/2; camPitch=0.35; camDist=12; }},
  'vtop':   {cat:'Camera', desc:'Top down', fn:function(){ camPitch=1.45; camDist=30; }},
  'vbelow': {cat:'Camera', desc:'From below', fn:function(){ camPitch=-0.5; camDist=20; }},
  'vclose': {cat:'Camera', desc:'Close up', fn:function(){ camDist=6; }},
  'vfar':   {cat:'Camera', desc:'Far away', fn:function(){ camDist=80; camPitch=0.7; }},
  'vzoomout':{cat:'Camera', desc:'Zoom out', fn:function(){ camDist=Math.min(200, camDist*1.5); }},
  'vreset': {cat:'Camera', desc:'Reset camera', fn:function(){ camYaw=0; camPitch=0.5; camDist=20; }},
  'look':   {cat:'Camera', desc:'Look at x z — look 600 600', fn:function(a){
    if(a.length>=2){ kingPos.x=parseFloat(a[0])||0; kingPos.z=parseFloat(a[1])||0; }
  }},
  'skyview':{cat:'Camera', desc:'Sky view', fn:function(){
    camera.position.set(0,900,900); camera.lookAt(0,0,0);
  }},
  'vtoggle':{cat:'Camera', desc:'Toggle view mode', fn:function(){
    camDist = camDist > 30 ? 12 : 80;
  }},
  'angle':  {cat:'Camera', desc:'Set angle — angle 45', fn:function(a){
    if(a[0]) camYaw = (parseFloat(a[0])||0) * Math.PI/180;
  }},
  'glide':  {cat:'Camera', desc:'Smooth glide', fn:function(){ say('gliding'); }},
};

/* Code runner */
var codeInput = document.getElementById('codeinput');
function runCode(text){
  text = (text||'').trim().toLowerCase();
  if(!text) return;
  var parts = text.split(/\s+/);
  var cmd = parts[0], args = parts.slice(1);
  var c = CODES[cmd];
  if(c){ try{ c.fn(args); }catch(e){ say('stumbled'); } }
  else say('unknown — '+cmd);
}
document.getElementById('codesend').onclick = function(){
  runCode(codeInput.value); codeInput.value=''; codeInput.blur();
};
codeInput.addEventListener('keydown', function(e){
  if(e.key==='Enter'){ runCode(codeInput.value); codeInput.value=''; codeInput.blur(); }
});
/* Os never blocks keyboard — close Os when typing */
codeInput.addEventListener('focus', function(){
  osOpen = false;
  osEl.classList.remove('open');;
});

/* ===== CAMERA TOGGLE — cycle through modes ===== */
var camModes = [
  {n:'Orbit', yaw:0, pitch:0.5, dist:20},
  {n:'Top', yaw:0, pitch:1.45, dist:30},
  {n:'Front', yaw:0, pitch:0.35, dist:12},
  {n:'Back', yaw:Math.PI, pitch:0.35, dist:12},
  {n:'Left', yaw:Math.PI/2, pitch:0.35, dist:12},
  {n:'Right', yaw:-Math.PI/2, pitch:0.35, dist:12},
  {n:'Far', yaw:0, pitch:0.7, dist:80},
  {n:'Close', yaw:0, pitch:0.4, dist:6}
];
var camModeIdx = 0;
function toggleCamera(){
  camModeIdx = (camModeIdx + 1) % camModes.length;
  var m = camModes[camModeIdx];
  camYaw = m.yaw; camPitch = m.pitch; camDist = m.dist;
  say('camera: ' + m.n);
}

/* ===== BODY MOVEMENT TOGGLE — walk / fly / still ===== */
var moveModes = ['still', 'walk', 'fly', 'swim'];
var moveModeIdx = 0;
var moveMode = 'still';
/* ===== HYPER MOVEMENT CONTROLLER — v200 ===== */
var hyperMove = { grounded:false, verticalVelocity:0, lastGroundedAt:0, jumpQueuedAt:0, lastSafe:new THREE.Vector3(), lastTime:performance.now(), enabled:false };
function hyperDelta(){ var now=performance.now(); var dt=Math.min((now-hyperMove.lastTime)/1000,0.05); hyperMove.lastTime=now; return Math.max(dt,0); }
hyperMove