<!-- RUBY-BACKUP · part 411 -->
ts.forEach(function(pt){
                    var d = Math.sqrt((pt[0]-wx)*(pt[0]-wx) + (pt[1]-wz)*(pt[1]-wz));
                    if(d < bestD){ bestD = d; best = pt; }
                  });
                }
                if(best){ wx = best[0]; wz = best[1]; }
              }
            }catch(e){}
            /* teleport player */
            if(typeof mePos!=='undefined'){
              mePos.x = wx; mePos.z = wz;
              if(typeof fortifiedGroundY==='function') mePos.y = fortifiedGroundY(wx, wz) + 5;
            }
            try{ codeStatus('teleported to map point'); }catch(e2){}
            toggleHolomapExpand();
          }else{
            toggleHolomapExpand();
          }
        });
      }
    }catch(e){}
  }, 5000);
}
function drawHolomap(){
  try{
    if(!HOLOMAP_ON || !holomapCanvas) return;
    var ctx = holomapCanvas.getContext('2d');
    var S = holomapCanvas.width;
    ctx.clearRect(0,0,S,S);
    /* background */
    ctx.fillStyle = 'rgba(0,20,30,0.85)';
    ctx.fillRect(0,0,S,S);
    /* map world -1300..1300 to 0..S */
    function mx(x){ return (x+1300)/2600*S; }
    function mz(z){ return (z+1300)/2600*S; }
    /* highways in gold */
    try{
      if(typeof _highwayPts!=='undefined'){
        ctx.strokeStyle = '#ffd700';
        ctx.lineWidth = Math.max(1, S/150);
        _highwayPts.forEach(function(pts){
          ctx.beginPath();
          for(var i=0; i<pts.length; i++){
            var hx = mx(pts[i][0]), hz = mz(pts[i][1]);
            if(i===0) ctx.moveTo(hx, hz); else ctx.lineTo(hx, hz);
          }
          ctx.stroke();
        });
        ctx.lineWidth = 1;
      }
    }catch(e){}
    /* player as cyan dot */
    try{
      if(typeof mePos!=='undefined'){
        ctx.fillStyle = '#00ffff';
        ctx.beginPath();
        ctx.arc(mx(mePos.x), mz(mePos.z), Math.max(3, S/60), 0, 7);
        ctx.fill();
      }
    }catch(e){}
    /* title */
    ctx.fillStyle = '#00ffff';
    ctx.font = 'bold ' + Math.floor(S/16) + 'px sans-serif';
    ctx.fillText('MAP', 8, Math.floor(S/14));
  }catch(e){}
}

setInterval(function(){ if(HOLOMAP_ON) drawHolomap(); }, 2000);

/* SPAWN POINT + MOVE + DIMENSIONALITY + LOCK — future builder system */
var SPAWN_PT = null; /* {x, z} — where new objects appear */
var MOVE_MODE = false;
var MOVE_HELD = null; /* stone being moved */
var BUILD_DIM = 3; /* 2-6, dimensionality for new objects */

function setSpawnPoint(){
  if(typeof mePos!=='undefined'){
    SPAWN_PT = {x: Math.round(mePos.x), z: Math.round(mePos.z)};
    try{ localStorage.setItem('ruby-spawnpt', JSON.stringify(SPAWN_PT)); }catch(e){}
    codeStatus('spawn point set at '+SPAWN_PT.x+', '+SPAWN_PT.z+' — new objects appear here');
  }
}

/* spawn point visual marker + coordinate move */
var spawnMarker = null;
function showSpawnMarker(){
  var sp = getSpawnPoint();
  if(typeof THREE==='undefined') return;
  if(spawnMarker && spawnMarker.parent) spawnMarker.parent.remove(spawnMarker);
  /* glowing cyan ring at spawn point */
  var geo = new THREE.RingGeometry(0.8, 1.0, 32);
  var mat = new THREE.MeshBasicMaterial({color: 0x00ffff, transparent: true, opacity: 0.8, side: THREE.DoubleSide});
  spawnMarker = new THREE.Mesh(geo, mat);
  spawnMarker.rotation.x = -Math.PI/2;
  var gy = 0;
  if(typeof fortifiedGroundY==='function') gy = fortifiedGroundY(sp.x, sp.z);
  spawnMarker.position.set(sp.x*0.13, gy+0.05, sp.z*0.13);
  if(typeof scene!=='undefined') scene.add(spawnMarker);
  /* pulse */
  var s = 1;
  setInterval(function(){
    if(spawnMarker){
      s = 1 + Math.sin(Date.now()/300)*0.1;
      spawnMarker.scale.set(s,s,1);
    }
  }, 50);
}
function moveSpawnTo(x, z){
  SPAWN_PT = {x: Math.round(x), z: Math.round(z)};
  try{ localStorage.setItem('ruby-spawnpt', JSON.stringify(SPAWN_PT)); }catch(e){}
  showSpawnMarker();
  codeStatus('spawn point moved to '+SPAWN_PT.x+', '+SPAWN_PT.z);
}
/* show marker on load */
setTimeout(function(){ showSpawnMarker(); }, 5000);
function getSpawnPoint(){
  if(SPAWN_PT) return SPAWN_PT;
  try{
    var s = JSON.parse(localStorage.getItem('ruby-spawnpt')||'null');
    if(s){ SPAWN_PT = s; return s; }
  }catch(e){}
  return {x: 8, z: 8}; /* default near spawn */
}
function toggleMoveMode(){
  MOVE_MODE = !MOVE_MODE;
  if(!MOVE_MODE && MOVE_HELD){
    /* drop held */
    MOVE_HELD = null;
  }
  codeStatus(MOVE_MODE ? 'MOVE MODE — tap an object to pick up, tap destination to place' : 'move mode off');
  updateMoveToggle();
}
function updateMoveToggle(){
  var btn = document.getElementById('movetogglebtn');
  if(btn){
    btn.textContent = '\u2725';
    btn.style.background = MOVE_MODE ? '#fff2aa' : '#d8a920';
    btn.style.boxShadow = MOVE_MODE ? '0 0 12px #d8a920' : 'none';
  }
}
/* move toggle button */
setTimeout(function(){
  if(!document.getElementById('movetogglebtn')){
    var b = document.createElement('button');
    b.id = 'movetogglebtn';
    b.textContent = '\u2725';
    b.title = 'MOVE';
    b.style.cssTe