<!-- RUBY-BACKUP · part 481 -->
ters — blue glow */
  [-1, 1].forEach(function(side){
    var thruster = new THREE.Mesh(new THREE.CylinderGeometry(0.06, 0.08, 0.2, 12), darkGlow);
    thruster.position.set(side*0.2, 1.1, -0.25);
    thruster.rotation.x = Math.PI/2;
    group.add(thruster);
  });
  /* carbon fiber lattice detail — thin glowing lines on torso */
  for(var i=0; i<3; i++){
    var line = new THREE.Mesh(new THREE.BoxGeometry(0.62, 0.02, 0.37), darkGlow);
    line.position.y = 1.0 + i*0.2;
    group.add(line);
  }
  return group;
}

/* YOUNG KING — kingly demeanor, childlike attitudes */
var YK_MESH = null, YK_ANIM = null;
function buildYoungKing(){
  if(typeof THREE==='undefined') return null;
  var group = new THREE.Group();
  var gold = new THREE.MeshStandardMaterial({color: 0xffcc00, roughness: 0.3, metalness: 0.8});
  var royal = new THREE.MeshStandardMaterial({color: 0x660000, roughness: 0.7});
  var skin = new THREE.MeshStandardMaterial({color: 0xffccaa, roughness: 0.5});
  /* body — regal robe, dignified proportions (not chibi) */
  var robe = new THREE.Mesh(new THREE.CylinderGeometry(0.25, 0.4, 1.0, 16), royal);
  robe.position.y = 0.7;
  group.add(robe);
  /* gold trim */
  var trim = new THREE.Mesh(new THREE.TorusGeometry(0.32, 0.03, 8, 24), gold);
  trim.rotation.x = Math.PI/2;
  trim.position.y = 1.15;
  group.add(trim);
  /* head — normal proportions */
  var head = new THREE.Mesh(new THREE.SphereGeometry(0.18, 20, 20), skin);
  head.position.y = 1.45;
  group.add(head);
  /* crown — small, regal (not funny) */
  var band = new THREE.Mesh(new THREE.CylinderGeometry(0.19, 0.19, 0.08, 16), gold);
  band.position.y = 1.58;
  group.add(band);
  for(var i=0; i<5; i++){
    var spike = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.1, 8), gold);
    var ang = (i/5)*Math.PI*2;
    spike.position.set(Math.cos(ang)*0.16, 1.66, Math.sin(ang)*0.16);
    group.add(spike);
  }
  /* eyes — bright, curious (childlike) */
  var eyeMat = new THREE.MeshStandardMaterial({color: 0x000000, roughness: 0.2});
  [-1,1].forEach(function(s){
    var eye = new THREE.Mesh(new THREE.SphereGeometry(0.03, 10, 10), eyeMat);
    eye.position.set(s*0.07, 1.48, 0.15);
    group.add(eye);
  });
  /* smile — gentle, childlike */
  var smile = new THREE.Mesh(new THREE.TorusGeometry(0.06, 0.015, 8, 16, Math.PI), eyeMat);
  smile.position.set(0, 1.4, 0.15);
  smile.rotation.z = Math.PI;
  group.add(smile);
  /* arms — at sides, regal */
  [-1,1].forEach(function(s){
    var arm = new THREE.Mesh(new THREE.CylinderGeometry(0.06, 0.06, 0.5, 10), royal);
    arm.position.set(s*0.32, 0.9, 0);
    group.add(arm);
  });
  return group;
}

/* UNIMPRESSED — the persona of "I am not impressed" */
var UI_MESH = null, UI_ANIM = null;
function buildUnimpressed(){
  if(typeof THREE==='undefined') return null;
  var group = new THREE.Group();
  var gray = new THREE.MeshStandardMaterial({color: 0x888888, roughness: 0.8});
  var dark = new THREE.MeshStandardMaterial({color: 0x333333, roughness: 0.9});
  /* body — slouched */
  var body = new THREE.Mesh(new THREE.CylinderGeometry(0.25, 0.3, 0.9, 12), gray);
  body.position.y = 0.65;
  body.rotation.x = 0.1; /* slight slouch */
  group.add(body);
  /* head — tilted, bored */
  var head = new THREE.Mesh(new THREE.SphereGeometry(0.2, 18, 18), gray);
  head.position.set(0.05, 1.3, 0);
  head.rotation.z = 0.15; /* head tilt of disdain */
  group.add(head);
  /* half-lidded eyes — the look of "really?" */
  [-1,1].forEach(function(s){
    var eye = new THREE.Mesh(new THREE.SphereGeometry(0.035, 10, 10), dark);
    eye.position.set(s*0.07+0.05, 1.32, 0.16);
    eye.scale.y = 0.5; /* half-closed */
    group.add(eye);
    /* heavy lid */
    var lid = new THREE.Mesh(new THREE.BoxGeometry(0.08, 0.03, 0.02), gray);
    lid.position.set(s*0.07+0.05, 1.36, 0.17);
    group.add(lid);
  });
  /* flat mouth — unimpressed line */
  var mouth = new THREE.Mesh(new THREE.BoxGeometry(0.12, 0.015, 0.01), dark);
  mouth.position.set(0.05, 1.22, 0.18);
  group.add(mouth);
  /* arms crossed */
  var armMat = gray;
  var armL = new THREE.Mesh(new THREE.CylinderGeometry(0.06, 0.06, 0.45, 8), armMat);
  armL.position.set(-0.05, 0.85, 0.2);
  armL.rotation.z = 1.2; armL.rotation.x = 0.3;
  group.add(armL);
  var armR = new THREE.Mesh(new THREE.CylinderGeometry(0.06, 0.06, 0.45, 8), armMat);
  armR.position.set(0.15, 0.85, 0.2);
  armR.rotation.z = -1.2; armR.rotation.x = 0.3;
  group.add(armR);
  return group;
}

/* SMUGBUG — smug funny look, fearful when confronted */
var SB_MESH = null, SB_ANIM = null, SB_SCARED = false;
function buildSmugbug(){
  if(typeof THREE==='undefined') return null;
  var group = new THREE.Group();
  var skin = new THREE.MeshStandardMaterial({color: 0xffccaa, roughness: 0.5});
  var dark = new THREE.MeshStandardMaterial({color: 0x222222, roughness: 0.8});
  /* body */
  var body = new THREE.Mesh(new THREE.CylinderGeometry(0.28, 0.32, 0.9, 12), skin);
  body.position.y = 0.65;
  group.add(b