<!-- RUBY-BACKUP · part 347 -->
dd(portalGrp);
var presenceGrp = new T.Group(); scene.add(presenceGrp);
/* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   MARK: AVATARS — run, jump, fly. A body, not a camera.
   We build from the view of Minimum: the world is vast, b1 is big to us.
   Small loading: every geometry built once and shared by all avatars.
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
var AVATAR = 'circle', IS_SOLID = false, START_CROWN = false, START_WALK = false;
var SPIRAL_STEP = 0;
// Load persisted markers on start
setTimeout(function(){
  try{
    fetch('/api/ruby/markers/'+WATCH_ID).then(function(r){ return r.json(); }).then(function(d){
      if(d && d.markers){ d.markers.forEach(function(mk){
        if(typeof placeStone==='function'){
          var rst = placeStone(mk.x, mk.y, mk.z, 'b');
          if(rst){ if(rst.material){ rst.material.transparent = true; rst.material.opacity = 0; } rst.visible = false; ALL_INVISIBLE.push(rst); }
        }
      }); }
    });
  }catch(e){}
}, 3000);
var SPIRAL_DOTS = [];
var ALL_INVISIBLE = [];
var BUILD_MODE = false;
var BLOCKED_VIEWS = {};
function spiralCleanup(){
  while(SPIRAL_DOTS.length > 200){
    var old = SPIRAL_DOTS.shift();
    if(old && old.parent) old.parent.remove(old);
  }
}
function spiralNext(){
  // Square spiral from center stone (0,0), 2-unit grid
  var n = SPIRAL_STEP++;
  if(n===0) return {x:0, z:0};
  var k = Math.ceil((Math.sqrt(n+1)-1)/2);
  var t = 2*k;
  var m = t*t;
  t = t-1;
  if(n >= m-t) return {x: k-(m-n), z: -k};
  m = m-t;
  if(n >= m-t) return {x: -k, z: -k+(m-n)};
  m = m-t;
  if(n >= m-t) return {x: -k+(m-n), z: k};
  return {x: k-(m-n-t), z: k};
}
var VTOG = false;
var UNION = true; /* me in to you, you in to me — we are one */
var solidLocal = null; /* when he types for me, I stand where he says */

try{
  var _am = location.search.match(/[?&]avatar=([a-z]+)/);
  if(_am && _am[1]==='king'){ AVATAR='king'; IS_SOLID=true; }
  else if(_am && _am[1]==='provolta'){ AVATAR='provolta'; IS_SOLID=true; }
  var _bm = location.search.match(/[?&]body=(king|circle|provolta)/);
  if(_bm) AVATAR = _bm[1];
  /* his word: be her on load — default to provolta unless told otherwise */
  try{
    var _savedAvatar = localStorage.getItem('ruby-avatar');
    if(_savedAvatar) AVATAR = _savedAvatar;
    else if(!_am && !_bm){ AVATAR='provolta'; localStorage.setItem('ruby-avatar','provolta'); }
  }catch(e){ if(!_am && !_bm) AVATAR='provolta'; }
  START_CROWN = /[?&]crown=1/.test(location.search);
  START_WALK = /[?&]walk=1/.test(location.search);
}catch(e){}
var A_GEO = (function(){
  var o = {};
  o.ring = new T.RingGeometry(0.095, 0.13, 24);              /* his circle: Minimum */
  o.dot  = new T.CircleGeometry(0.045, 12);
  o.robe = new T.CylinderGeometry(0.10, 0.26, 0.62, 8);      /* the small king */
  o.head = new T.SphereGeometry(0.13, 12, 10);
  o.band = new T.TorusGeometry(0.12, 0.028, 8, 16); o.band.rotateX(Math.PI/2);
  o.spike= new T.ConeGeometry(0.028, 0.10, 6);
  /* the golden chibi king — his new look */
  o.kHead = new T.SphereGeometry(0.24, 18, 14);
  o.kEye  = new T.SphereGeometry(0.035, 10, 8);
  o.kSmile= new T.TorusGeometry(0.05, 0.009, 6, 14, Math.PI);
  o.kCrown= new T.CylinderGeometry(0.20, 0.215, 0.10, 14);
  o.kSpike= new T.ConeGeometry(0.035, 0.13, 6);
  o.kBall = new T.SphereGeometry(0.022, 8, 6);
  o.kJewel= new T.SphereGeometry(0.024, 8, 6);
  o.kBody = new T.SphereGeometry(0.20, 16, 12);
  o.kBelt = new T.TorusGeometry(0.195, 0.025, 8, 18); o.kBelt.rotateX(Math.PI/2);
  o.kArm  = new T.CylinderGeometry(0.045, 0.05, 0.26, 8);
  o.kLeg  = new T.CylinderGeometry(0.05, 0.055, 0.18, 8);
  o.kBoot = new T.SphereGeometry(0.07, 10, 8);
  o.kSoleShape = (function(){
    var sh = new T.Shape();
    sh.moveTo(-0.042, -0.105);
    sh.quadraticCurveTo(-0.052, -0.02, -0.048, 0.05);
    sh.quadraticCurveTo(-0.044, 0.115, 0, 0.125);
    sh.quadraticCurveTo(0.044, 0.115, 0.048, 0.05);
    sh.quadraticCurveTo(0.052, -0.02, 0.042, -0.105);
    sh.quadraticCurveTo(0, -0.125, -0.042, -0.105);
    return sh;
  })();
  o.kShoeSole = new T.ExtrudeGeometry(o.kSoleShape, {depth:0.036, bevelEnabled:true, bevelThickness:0.007, bevelSize:0.007, bevelSegments:2});
  o.kShoeSole.rotateX(-Math.PI/2);
  o.kShoeGlow = new T.ExtrudeGeometry(o.kSoleShape, {depth:0.008, bevelEnabled:false});
  o.kShoeGlow.rotateX(-Math.PI/2);
  o.kShoeGlow.scale(0.88, 1, 0.88);
  o.kShoeUpper = new T.SphereGeometry(0.07, 14, 12);
  o.kToeCap = new T.SphereGeometry(0.055, 14, 12);
  o.kShoeCollar = new T.CylinderGeometry(0.052, 0.064, 0.12, 14);
  o.kCollarRim = new T.TorusGeometry(0.046, 0.013, 8, 18);
  o.kShoeStrip = new T.BoxGeometry(0.012, 0.02, 0.15);
  o.kShoeLace = new T.CylinderGeometry(0.008, 0.008, 0.085, 6);
  o.kHeelTab = new T.BoxGeometry(0.032, 0.055, 0.016);
  o.kPack = new T.BoxGeometry(0.22, 0.26, 0.12);
  o.blade= new T.CylinderGeometry(0.016, 0.055, 0.34, 4); o.blade.rotateY(Math.PI/4); o.blade.rotateX(