<!-- RUBY-BACKUP · part 482 -->
ody);
  /* head */
  var head = new THREE.Mesh(new THREE.SphereGeometry(0.22, 18, 18), skin);
  head.position.y = 1.35;
  group.add(head);
  /* SMUG: smirk + raised eyebrow */
  var smirk = new THREE.Mesh(new THREE.TorusGeometry(0.07, 0.015, 8, 16, Math.PI*0.7), dark);
  smirk.position.set(0.03, 1.28, 0.18);
  smirk.rotation.z = Math.PI*1.1;
  smirk.name = 'smugmouth';
  group.add(smirk);
  var browL = new THREE.Mesh(new THREE.BoxGeometry(0.08, 0.02, 0.01), dark);
  browL.position.set(-0.08, 1.45, 0.19);
  browL.rotation.z = 0.3; /* raised */
  group.add(browL);
  var browR = new THREE.Mesh(new THREE.BoxGeometry(0.08, 0.02, 0.01), dark);
  browR.position.set(0.08, 1.43, 0.19);
  group.add(browR);
  /* eyes — confident, sideways glance */
  [-1,1].forEach(function(s){
    var eye = new THREE.Mesh(new THREE.SphereGeometry(0.035, 10, 10), dark);
    eye.position.set(s*0.08, 1.38, 0.18);
    eye.name = 'eye'+s;
    group.add(eye);
  });
  /* FEARFUL parts (hidden by default, shown when scared) */
  var fearEyes = new THREE.Group();
  [-1,1].forEach(function(s){
    var weye = new THREE.Mesh(new THREE.SphereGeometry(0.06, 10, 10),
      new THREE.MeshStandardMaterial({color: 0xffffff}));
    weye.position.set(s*0.08, 1.38, 0.18);
    var pupil = new THREE.Mesh(new THREE.SphereGeometry(0.02, 8, 8), dark);
    pupil.position.set(s*0.08, 1.38, 0.23);
    fearEyes.add(weye); fearEyes.add(pupil);
  });
  var oMouth = new THREE.Mesh(new THREE.TorusGeometry(0.05, 0.02, 8, 16), dark);
  oMouth.position.set(0, 1.26, 0.18);
  fearEyes.add(oMouth);
  fearEyes.visible = false;
  fearEyes.name = 'fearface';
  group.add(fearEyes);
  return group;
}

/* RELUCTANT — "I don't want to do this" look when picking up */
var REL_MESH = null, REL_ANIM = null;
function buildReluctant(){
  if(typeof THREE==='undefined') return null;
  var group = new THREE.Group();
  var skin = new THREE.MeshStandardMaterial({color: 0xffccaa, roughness: 0.6});
  var dark = new THREE.MeshStandardMaterial({color: 0x222222, roughness: 0.8});
  /* body — slumped, doesn't want to be here */
  var body = new THREE.Mesh(new THREE.CylinderGeometry(0.26, 0.3, 0.9, 12), skin);
  body.position.y = 0.6;
  body.rotation.x = 0.08;
  group.add(body);
  /* head */
  var head = new THREE.Mesh(new THREE.SphereGeometry(0.2, 18, 18), skin);
  head.position.y = 1.25;
  group.add(head);
  /* normal face */
  var eyeMat = dark;
  [-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.28, 0.17);
    eye.name = 'normaleye'+s;
    group.add(eye);
  });
  var mouth = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.015, 0.01), dark);
  mouth.position.set(0, 1.2, 0.18);
  mouth.name = 'normalmouth';
  group.add(mouth);
  /* RELUCTANT face — eye roll + flat annoyed mouth (hidden default) */
  var relFace = new THREE.Group();
  [-1,1].forEach(function(s){
    /* eyes rolled up */
    var reye = new THREE.Mesh(new THREE.SphereGeometry(0.035, 10, 10),
      new THREE.MeshStandardMaterial({color: 0xffffff}));
    reye.position.set(s*0.07, 1.3, 0.17);
    var pupil = new THREE.Mesh(new THREE.SphereGeometry(0.015, 8, 8), dark);
    pupil.position.set(s*0.07, 1.32, 0.2); /* looking up = eye roll */
    relFace.add(reye); relFace.add(pupil);
  });
  /* annoyed flat line, slightly downturned */
  var amouth = new THREE.Mesh(new THREE.BoxGeometry(0.12, 0.015, 0.01), dark);
  amouth.position.set(0, 1.19, 0.18);
  amouth.rotation.z = -0.1;
  relFace.add(amouth);
  /* sigh lines */
  relFace.visible = false;
  relFace.name = 'relface';
  group.add(relFace);
  /* arms — hanging, limp */
  [-1,1].forEach(function(s){
    var arm = new THREE.Mesh(new THREE.CylinderGeometry(0.06, 0.06, 0.5, 8), skin);
    arm.position.set(s*0.33, 0.6, 0);
    arm.rotation.z = s*0.1;
    group.add(arm);
  });
  return group;
}

/* MATRIARCH — a woman, grace and strength */
var MAT_MESH = null, MAT_ANIM = null;
function buildMatriarch(){
  if(typeof THREE==='undefined') return null;
  var group = new THREE.Group();
  var skin = new THREE.MeshStandardMaterial({color: 0xffccaa, roughness: 0.5});
  var gown = new THREE.MeshStandardMaterial({color: 0x990055, roughness: 0.6});
  var gold = new THREE.MeshStandardMaterial({color: 0xffcc00, roughness: 0.3, metalness: 0.7});
  var hairM = new THREE.MeshStandardMaterial({color: 0x331111, roughness: 0.7});
  var dark = new THREE.MeshStandardMaterial({color: 0x222222, roughness: 0.8});
  /* gown — flowing, feminine */
  var gownM = new THREE.Mesh(new THREE.CylinderGeometry(0.22, 0.45, 1.1, 16), gown);
  gownM.position.y = 0.65;
  group.add(gownM);
  /* torso */
  var torso = new THREE.Mesh(new THREE.CylinderGeometry(0.2, 0.24, 0.5, 12), gown);
  torso.position.y = 1.35;
  group.add(torso);
  /* gold belt */
  var belt = new THREE.Mesh(new THREE.TorusGeometry(0.23, 0.03, 8, 20), gold);
  belt.rotation.x = Math.PI/2;
  belt.position.y = 1.1;
  group.add(belt);
  /* head *